Skip to content

[Bug] 未提供 System Prompt 时产生约 7.5K 额外 Cached Prompt Tokens #17

Closed

Description

@ShuShengSeven

问题描述

通过 commandcode-proxy 发送不包含 system / developer 消息的请求时,上游 API 会产生约 7552 个 cached prompt tokens。

即使请求中只有非常短的一条用户消息,也会产生约 7.5K 的输入 Token。

这可能导致不必要的上下文 Token 消耗以及对话污染。

复现方法

通过本地代理发送最简单的请求:

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'

修改前

返回:

{
  "prompt_tokens": 7653,
  "completion_tokens": 42,
  "total_tokens": 7695,
  "prompt_tokens_details": {
    "cached_tokens": 7552
  }
}

请求实际上只有:

user: hi

但却产生了约 7552 个 cached prompt tokens。

问题定位

在 proxy.mjs 的 buildCcRequest() 中,目前只有在存在 systemPrompt 时才会设置 params.system:

if (systemPrompt) {
  body.params.system = systemPrompt;
}

当请求没有 system / developer 消息时,params.system 会被完全省略。

经过测试,发现上游在 params.system 被省略时似乎会进入一个默认的上下文/前缀路径,从而产生约 7552 个 cached tokens。

目前无法确定这 7552 tokens 是否属于上游设计的默认上下文,因此这里仅报告实际观察到的行为。

临时解决方案

将代码修改为:

if (systemPrompt) {
  body.params.system = systemPrompt;
} else {
  body.params.system = " ";
}

也就是在没有 system prompt 时发送一个单独的空格作为占位符。

修改后,相同请求返回:

{
  "prompt_tokens": 85,
  "completion_tokens": 22,
  "total_tokens": 107,
  "prompt_tokens_details": {
    "cached_tokens": 0
  }
}

输入 Token 从:

7653 → 85

减少了约 7568 tokens。

System Prompt 验证

同时测试了正常的 system prompt:

{
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful assistant."
    },
    {
      "role": "user",
      "content": "hi"
    }
  ]
}

返回:

{
  "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

  1. ixiaoyui commented on Sep 7, 2026

    @ixiaoyui

    这7k多的大概是commandcode注入的提示词

  2. ShuShengSeven commented on Sep 7, 2026

    @ShuShengSeven
    Author

    这7k多的大概是commandcode注入的提示词

    当请求中存在 system prompt 时 Command Code 则不会注入,这对于不存在 prompt 的普通请求是关键性的, Command Code 的提示词会对对话造成污染,一个普通不过的问好也会出现极为严重的幻觉,由于system prompt的缘故,模型会错误的认为自己当前处在 Command Code 的一个可执行目录下。

  3. MAXeaglet commented on Sep 8, 2026

    @MAXeaglet
    Owner

    感谢报告,也感谢你在 issue 里自己做的真机验证(空格占位后 7653 → 85),这个 workaround 正是修复采用的方案。

    已在 buildCcRequest 层固化该行为(commit 487f219):

    • 请求不带 system prompt 时,proxy 自动发送单空格 params.system: " " 占位,阻止 CC 上游注入默认提示词
    • 默认开启,所有客户端无需改动即可受益;实测同样请求 input tokens 从 ~7653 降到 13
    • 如果有场景确实需要上游默认上下文,可在 config.json 设 "emptySystemPlaceholder": false 或环境变量 CC_EMPTY_SYSTEM_PLACEHOLDER=false 关闭
    • 启动日志会打印当前开关状态,方便确认

    已合入 master 并部署,Docker 镜像同步更新。如有问题欢迎继续反馈。

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions