这是一个可复用的 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 放到各自真正的最前面喵~
注入到 messages[0]:
{
"role": "system",
"content": "<system_prompt.txt>"
}原来的 messages 会整体后移喵~
注入到顶层 instructions 最前面:
<system_prompt.txt>
<原 instructions>
如果原请求没有 instructions,则自动创建喵~
这对 Codex 客户端很关键,因为 Codex 原本会发送很长的顶层 instructions,必须在它前面注入才是最高优先级喵~
如果 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> 喵~
部分客户端会把 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.patchexport 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/serversystemctl --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/
查看:
v1-chat-completions-*.log
确认 API REQUEST 1 中:
messages[0].role == "system"
messages[0].content 以 system_prompt.txt 开头
查看:
v1-responses-*.log
确认:
API REQUEST 1.instructions 以 system_prompt.txt 开头
并且不再出现旧的 input[0] developer 注入喵~
查看:
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/*generateContent、POST /v1internal:method,需要单独处理system_instruction或contents。 POST /v1/messages/count_tokens:计 token,不建议注入,否则统计会变化。- 图片、视频、模型列表、管理 API:通常不属于 system prompt 注入范围。
- 不要把真实私有 prompt、token、key、账号凭据提交到仓库喵~
- 本仓库只提供示例
examples/system_prompt.example.txt,不会包含真实 prompt 喵~ - 调试结束后建议关闭
request-log,因为请求日志会记录完整 prompt 和用户输入喵~ - 修改
config.yaml时不要用会重排/重写整个 YAML 的工具,推荐最小文本修改喵~
本项目仅提供 CLIProxyAPI 的 system prompt 注入补丁与实现参考,用于学习、研究、二次开发和自有服务配置喵~
仓库不会包含任何作者本地使用的真实私有 system prompt、账号凭据、访问令牌、API key、OAuth token 或其它敏感配置喵~
使用者需要自行准备 system_prompt.txt,并自行确认其内容、用途、合规性和运行后果喵~
本补丁会改变请求进入上游模型前的提示词结构;部署到生产环境前,请先在测试环境验证不同客户端、不同模型和不同路由下的行为喵~
MIT
English documentation: README.en.md
- 同步本地后续修复:当 Responses-style 请求误发到
/v1/chat/completions并被 CPA 转换为 Chat Completions 后,会再次调用InjectSystemPrompt。 - 修复点:避免原始请求没有
messages时第一次注入跳过,转换后却没有补注入。 - 已在当前 upstream HEAD 上验证:
git apply --check、go test ./internal/config/ -run 'TestInject(SystemPrompt|ResponsesSystemPrompt|ClaudeSystemPrompt)' -v、go build -o /tmp/cpa-sp-test-build ./cmd/server。