## 问题描述 通过 `commandcode-proxy` 发送**不包含 `system` / `developer` 消息**的请求时,上游 API 会产生约 **7552 个 cached prompt tokens**。 即使请求中只有非常短的一条用户消息,也会产生约 7.5K 的输入 Token。 这可能导致不必要的上下文 Token 消耗以及对话污染。 ## 复现方法 通过本地代理发送最简单的请求: ```bash curl -s http://127.0.0.1:3050/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek/deepseek-v4-flash", "messages": [ { "role": "user", "content": "hi" } ], "stream": false }' | jq '.usage' ``` ### 修改前 返回: ```json { "prompt_tokens": 7653, "completion_tokens": 42, "total_tokens": 7695, "prompt_tokens_details": { "cached_tokens": 7552 } } ``` 请求实际上只有: ```text user: hi ``` 但却产生了约 7552 个 cached prompt tokens。 ## 问题定位 在 `proxy.mjs` 的 `buildCcRequest()` 中,目前只有在存在 `systemPrompt` 时才会设置 `params.system`: ```js if (systemPrompt) { body.params.system = systemPrompt; } ``` 当请求没有 `system` / `developer` 消息时,`params.system` 会被完全省略。 经过测试,发现上游在 `params.system` 被省略时似乎会进入一个默认的上下文/前缀路径,从而产生约 7552 个 cached tokens。 目前无法确定这 7552 tokens 是否属于上游设计的默认上下文,因此这里仅报告实际观察到的行为。 ## 临时解决方案 将代码修改为: ```js if (systemPrompt) { body.params.system = systemPrompt; } else { body.params.system = " "; } ``` 也就是在没有 system prompt 时发送一个单独的空格作为占位符。 修改后,相同请求返回: ```json { "prompt_tokens": 85, "completion_tokens": 22, "total_tokens": 107, "prompt_tokens_details": { "cached_tokens": 0 } } ``` 输入 Token 从: ```text 7653 → 85 ``` 减少了约 **7568 tokens**。 ## System Prompt 验证 同时测试了正常的 system prompt: ```json { "messages": [ { "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": "hi" } ] } ``` 返回: ```json { "prompt_tokens": 90, "completion_tokens": 37, "total_tokens": 127, "prompt_tokens_details": { "cached_tokens": 0 } } ``` 因此上述修改不会影响正常传入的 system prompt。 ## 预期行为 没有 `system` / `developer` prompt 的普通请求,不应该因为省略 `params.system` 而产生约 7552 个额外的 cached prompt tokens。 如果上游确实要求 `params.system` 必须存在,建议代理在没有 system prompt 时自动提供一个中性的占位值。 ## 测试环境 * 项目:`commandcode-proxy` * 接口:`/v1/chat/completions` * 模型:`deepseek/deepseek-v4-flash` * 本地代理端口:`3050` * 上游:Command Code API
Activity
ixiaoyui commentedon Sep 7, 2026
这7k多的大概是commandcode注入的提示词
ShuShengSeven commentedon Sep 7, 2026
当请求中存在 system prompt 时 Command Code 则不会注入,这对于不存在 prompt 的普通请求是关键性的, Command Code 的提示词会对对话造成污染,一个普通不过的问好也会出现极为严重的幻觉,由于system prompt的缘故,模型会错误的认为自己当前处在 Command Code 的一个可执行目录下。
fix(anthropic): align streaming behavior with OpenAI endpoint, fixes …
fix(anthropic): align streaming behavior with OpenAI endpoint, fixes …
MAXeaglet commentedon Sep 8, 2026
感谢报告,也感谢你在 issue 里自己做的真机验证(空格占位后 7653 → 85),这个 workaround 正是修复采用的方案。
已在
buildCcRequest层固化该行为(commit 487f219):params.system: " "占位,阻止 CC 上游注入默认提示词"emptySystemPlaceholder": false或环境变量CC_EMPTY_SYSTEM_PLACEHOLDER=false关闭已合入 master 并部署,Docker 镜像同步更新。如有问题欢迎继续反馈。
rewrite: migrate proxy from Node.js to Go