Skip to content

fix: 管理员种子匹配缺口 + 通用技能 SKILL.md 走 system prompt 缓存 - #19

Open
JHdehao wants to merge 2 commits into
OpenBMB:mainfrom
JHdehao:feat/general-skill-prompt-cache
Open

fix: 管理员种子匹配缺口 + 通用技能 SKILL.md 走 system prompt 缓存#19
JHdehao wants to merge 2 commits into
OpenBMB:mainfrom
JHdehao:feat/general-skill-prompt-cache

Conversation

@JHdehao

@JHdehao JHdehao commented Jul 18, 2026

Copy link
Copy Markdown

修复内容

  1. 管理员账号种子逻辑backend/app/db/seed.py
    查找管理员账号原本只匹配 id == "admin",如果种子时 id 不是 "admin"
    但 username 是 "admin",会插入重复行撞 (tenant_id, username) 唯一约束。
    改成 id == "admin" OR username == "admin" 双重匹配。

  2. prompt 前缀缓存排序backend/app/llm/stage_protocol.py
    render_stage_user_message 之前把易变内容(时间戳、用户本轮输入)
    排在静态大块内容(阶段规则/输出约束)前面,导致 DeepSeek 等 provider
    的前缀缓存完全失效。改成静态内容在前、易变内容在后。

  3. 通用技能 SKILL.md 走 system prompt 缓存
    backend/app/general_skills/runner.py, backend/app/llm/stage_protocol.py
    Plan/Repair/Review 三个阶段之前把 SKILL.md 全文塞进每轮都变化的
    payload 尾部,同一技能被连续调用时完全吃不到 provider 的前缀缓存。
    改成通过 unified_system_prompt(skill_markdown) 把全文放进 system
    message(对同一技能保持字节级一致)。Selector/Reply 阶段不需要全文,
    保持不变。

    顺带修掉 _skill_package_payload 里 SKILL.md 被重复发送两遍的问题。

测试

  • 512 个后端测试全部通过(含更新后的
    test_general_skill_substages_share_base_prompt_with_skill_caching_suffix)。

🤖 Generated with Claude Code

ubuntu and others added 2 commits July 18, 2026 11:15
seed.py:管理员账号查找同时匹配 id=="admin" 或 username=="admin",
此前只按 id 匹配会在"id 不是 admin 但用户名是 admin"的场景插入
重复行、撞 (tenant_id, username) 唯一约束。

stage_protocol.py:render_stage_user_message 把静态的阶段规则/
输出约束放到易变的时间戳/用户输入之前,避免每次调用都变化的内容
出现在 prompt 前部导致 DeepSeek 等 provider 的前缀缓存完全失效。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Plan/Repair/Review 三个会用到 SKILL.md 全文的阶段,之前把全文塞进
每轮都变化的 stage payload 尾部,导致同一个技能被连续调用时,DeepSeek/
Gemini 等 provider 的前缀缓存完全命中不到这部分内容,每轮都要重新计费。
改成通过 unified_system_prompt(skill_markdown) 把全文放进 system
message(对同一技能的 Plan/Repair/Review 调用保持字节级一致),
payload 里不再重复携带。Selector/Reply 两个阶段不需要全文,保持不变。

顺带修掉 _skill_package_payload 里 SKILL.md 被重复发送两遍的问题
(markdown 字段 + package.files 里的 content_preview 各发一份相同内容)。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
JHdehao pushed a commit to JHdehao/StaffDeck that referenced this pull request Jul 18, 2026
这个分支是从干净的 upstream/main 切出来的,不带 PR OpenBMB#19 里已经修好的
管理员种子匹配 bug(commit ebba3e1),而本地数据库已经是用修复后的
代码种过的状态,用未修复的旧逻辑启动会直接因为主键冲突崩溃。

这个 commit 只是为了让本地开发环境能跑起来,等 PR OpenBMB#19 合并后这里
应该会被自然吸收/可以 drop,不需要单独提交上游。
@fadeoreo

Copy link
Copy Markdown
Collaborator

我进一步检查了通用技能的权限链路,目前不建议按现状整体合并这个 PR。

管理员种子匹配修复是有效且有必要的,建议拆成独立 PR 合并。

Prompt 前缀缓存优化方向也合理,但当前实现把 skill.skill_markdown 直接追加到了 system prompt。通用技能并不只由系统管理员维护,数字员工管理者也可以导入和启用私有技能,因此 SKILL.md 属于用户可控内容。将其从普通 payload 提升到 system 层级会改变现有信任边界,导入的第三方技能内容也会获得更高的指令优先级。

建议拆分为:

  1. 单独提交管理员种子匹配修复;
  2. 保留“稳定内容在前、动态内容在后”的排序优化;
  3. SKILL.md 使用独立且稳定的普通消息传递,不进入 system prompt。

例如保持固定的 StaffDeck system prompt,再把 SKILL.md 放进位于动态阶段输入之前的稳定 user/context message。这样仍然能够利用 provider 的前缀缓存,同时不会提升第三方技能内容的指令权限。

另外希望补充实际的 cache hit、input token 或延迟对比,确认这项调整确实产生收益。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants