Skip to content

qiontoo/cliproxyapi-system-prompt-injection

Repository files navigation

CLIProxyAPI System Prompt 注入补丁

这是一个可复用的 router-for-me/CLIProxyAPI 补丁包,用来把本地 system_prompt.txt 注入到不同客户端请求里的最高优先级位置喵~

已覆盖三类主流对话入口:

  • OpenAI Chat Completions:POST /v1/chat/completions
  • OpenAI Responses / Codex:POST /v1/responses
  • Anthropic Messages / Claude Code:POST /v1/messages/v1/messages?beta=true

核心目标:按协议结构注入,而不是粗暴追加一条 user/developer message喵~


为什么需要这个补丁

CLIProxyAPI 会接收不同客户端的请求,再转发或转换到上游模型喵~

不同客户端的“最高优先级指令位置”并不一样:

  • Chat Completions 使用 messages,最强可见位置是 messages[0]role=system
  • Responses / Codex 使用顶层 instructions,如果只塞进 input[0],后续转换时可能降级成较低优先级内容。
  • Claude Code 使用 Anthropic 顶层 system,真实请求通常是 system: [{type:"text", text:"..."}] 列表。

所以这个补丁分别处理三种格式,把 prompt 放到各自真正的最前面喵~


最终注入效果

1. /v1/chat/completions

注入到 messages[0]

{
  "role": "system",
  "content": "<system_prompt.txt>"
}

原来的 messages 会整体后移喵~


2. /v1/responses

注入到顶层 instructions 最前面:

<system_prompt.txt>

<原 instructions>

如果原请求没有 instructions,则自动创建喵~

这对 Codex 客户端很关键,因为 Codex 原本会发送很长的顶层 instructions,必须在它前面注入才是最高优先级喵~


3. /v1/messages / Claude Code

如果 Anthropic system 是 list:

"system": [
  {"type": "text", "text": "<system_prompt.txt>"},
  {"type": "text", "text": "原 system[0]"},
  {"type": "text", "text": "原 system[1]"}
]

如果 system 是字符串:

<system_prompt.txt>

<原 system>

如果没有 system,则创建 system = <system_prompt.txt> 喵~

4. Responses 格式误发到 /v1/chat/completions

部分客户端会把 OpenAI Responses 形态的 payload(只有 input / instructions,没有 messages)发到 /v1/chat/completions

新版补丁会先按 CPA 原逻辑把这种 payload 转成 Chat Completions,再二次执行 system prompt 注入,避免第一次在原始 payload 上因为没有 messages 而跳过注入喵~


配置方法

在 CLIProxyAPI 的 config.yaml 里加入:

system-prompt:
  enabled: true
  mode: prepend
  file: "/path/to/system_prompt.txt"
  max-chars: 20000

字段说明:

  • enabled:是否启用注入。
  • mode:Chat Completions 使用,支持 prepend / replace-first-system / append-to-first-system
  • file:本地 prompt 文件路径。
  • max-chars:最大字符数,默认 20000,避免误注入超大文件。

system_prompt.txt 每次请求实时读取,所以改 prompt 文件通常不需要重新编译喵~


文件结构

本仓库包含:

  • README.md:中文主文档。
  • README.en.md:英文备用文档。
  • system-prompt-injection.patch:可直接应用到 CLIProxyAPI 的补丁。
  • scripts/apply-patch.sh:一键应用补丁脚本。
  • examples/system_prompt.example.txt:示例 prompt 文件。
  • docs/implementation-notes.zh-CN.txt:更详细的中文实现说明。

应用补丁

先克隆本仓库:

git clone https://github.com/h1679242037/cliproxyapi-system-prompt-injection.git

进入你的 CLIProxyAPI 源码目录:

cd /path/to/CLIProxyAPI

应用补丁:

bash /path/to/cliproxyapi-system-prompt-injection/scripts/apply-patch.sh   /path/to/cliproxyapi-system-prompt-injection/system-prompt-injection.patch

或者手动执行:

git apply /path/to/cliproxyapi-system-prompt-injection/system-prompt-injection.patch

测试

export PATH=/usr/local/go/bin:$PATH
cd /path/to/CLIProxyAPI

go test ./internal/config/ -run 'TestInject(SystemPrompt|ResponsesSystemPrompt|ClaudeSystemPrompt)' -v
go build -o cli-proxy-api.patched ./cmd/server

部署示例

systemctl --user stop cliproxyapi.service
cp ~/cliproxyapi/cli-proxy-api ~/cliproxyapi/cli-proxy-api.bak.$(date +%Y%m%d%H%M%S)
cp ./cli-proxy-api.patched ~/cliproxyapi/cli-proxy-api
chmod +x ~/cliproxyapi/cli-proxy-api
systemctl --user start cliproxyapi.service
systemctl --user is-active cliproxyapi.service

期望输出:

active

验证方法

建议临时打开请求日志:

request-log: true
logging-to-file: true

日志目录:

~/.cli-proxy-api/logs/

验证 Chat Completions

查看:

v1-chat-completions-*.log

确认 API REQUEST 1 中:

messages[0].role == "system"
messages[0].content 以 system_prompt.txt 开头

验证 Responses / Codex

查看:

v1-responses-*.log

确认:

API REQUEST 1.instructions 以 system_prompt.txt 开头

并且不再出现旧的 input[0] developer 注入喵~

验证 Claude Code

查看:

v1-messages-*.log

根据路由转换情况,确认最前面的 system/developer 等价内容以 system_prompt.txt 开头喵~

可能表现为:

  • Anthropic 格式:system[0].text 开头是 prompt。
  • Responses 格式:input[0].role == developer,内容开头是 prompt。
  • Chat 格式:messages[0].role == system,内容开头是 prompt。

当前没有覆盖的入口

这个补丁主要覆盖主流对话客户端。以下入口暂未覆盖或通常不建议覆盖:

  • POST /v1/completions:老式文本补全,可另行把 prompt 前置到 prompt 字段。
  • Gemini:POST /v1beta/models/*generateContentPOST /v1internal:method,需要单独处理 system_instructioncontents
  • POST /v1/messages/count_tokens:计 token,不建议注入,否则统计会变化。
  • 图片、视频、模型列表、管理 API:通常不属于 system prompt 注入范围。

注意事项

  1. 不要把真实私有 prompt、token、key、账号凭据提交到仓库喵~
  2. 本仓库只提供示例 examples/system_prompt.example.txt,不会包含真实 prompt 喵~
  3. 调试结束后建议关闭 request-log,因为请求日志会记录完整 prompt 和用户输入喵~
  4. 修改 config.yaml 时不要用会重排/重写整个 YAML 的工具,推荐最小文本修改喵~

免责声明

本项目仅提供 CLIProxyAPI 的 system prompt 注入补丁与实现参考,用于学习、研究、二次开发和自有服务配置喵~

仓库不会包含任何作者本地使用的真实私有 system prompt、账号凭据、访问令牌、API key、OAuth token 或其它敏感配置喵~

使用者需要自行准备 system_prompt.txt,并自行确认其内容、用途、合规性和运行后果喵~

本补丁会改变请求进入上游模型前的提示词结构;部署到生产环境前,请先在测试环境验证不同客户端、不同模型和不同路由下的行为喵~


License

MIT


English documentation: README.en.md


2026-05-20 更新

  • 同步本地后续修复:当 Responses-style 请求误发到 /v1/chat/completions 并被 CPA 转换为 Chat Completions 后,会再次调用 InjectSystemPrompt
  • 修复点:避免原始请求没有 messages 时第一次注入跳过,转换后却没有补注入。
  • 已在当前 upstream HEAD 上验证:git apply --checkgo test ./internal/config/ -run 'TestInject(SystemPrompt|ResponsesSystemPrompt|ClaudeSystemPrompt)' -vgo build -o /tmp/cpa-sp-test-build ./cmd/server

About

Reusable system prompt injection patch for CLIProxyAPI: chat completions, responses/Codex, and Claude Code messages.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages