fix(gateway): 修复 OpenAI→Anthropic 转换路径 system prompt 被静默丢弃的 bug
injectClaudeCodePrompt 和 systemIncludesClaudeCodePrompt 的 type switch 无法匹配 json.RawMessage 类型(Go typed nil 陷阱),导致 ForwardAsResponses 和 ForwardAsChatCompletions 路径中用户 system prompt 被替换为仅 Claude Code banner。新增 normalizeSystemParam 将 json.RawMessage 转为标准 Go 类型。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -124,6 +124,27 @@ func TestSystemIncludesClaudeCodePrompt(t *testing.T) {
|
||||
},
|
||||
want: false,
|
||||
},
|
||||
// json.RawMessage cases (conversion path: ForwardAsResponses / ForwardAsChatCompletions)
|
||||
{
|
||||
name: "json.RawMessage string with Claude Code prompt",
|
||||
system: json.RawMessage(`"` + claudeCodeSystemPrompt + `"`),
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "json.RawMessage string without Claude Code prompt",
|
||||
system: json.RawMessage(`"You are a helpful assistant"`),
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "json.RawMessage nil (empty)",
|
||||
system: json.RawMessage(nil),
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "json.RawMessage empty string",
|
||||
system: json.RawMessage(`""`),
|
||||
want: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
@@ -202,6 +223,29 @@ func TestInjectClaudeCodePrompt(t *testing.T) {
|
||||
wantSystemLen: 1,
|
||||
wantFirstText: claudeCodeSystemPrompt,
|
||||
},
|
||||
// json.RawMessage cases (conversion path: ForwardAsResponses / ForwardAsChatCompletions)
|
||||
{
|
||||
name: "json.RawMessage string system",
|
||||
body: `{"model":"claude-3","system":"Custom prompt"}`,
|
||||
system: json.RawMessage(`"Custom prompt"`),
|
||||
wantSystemLen: 2,
|
||||
wantFirstText: claudeCodeSystemPrompt,
|
||||
wantSecondText: claudePrefix + "\n\nCustom prompt",
|
||||
},
|
||||
{
|
||||
name: "json.RawMessage nil system",
|
||||
body: `{"model":"claude-3"}`,
|
||||
system: json.RawMessage(nil),
|
||||
wantSystemLen: 1,
|
||||
wantFirstText: claudeCodeSystemPrompt,
|
||||
},
|
||||
{
|
||||
name: "json.RawMessage Claude Code prompt (should not duplicate)",
|
||||
body: `{"model":"claude-3","system":"` + claudeCodeSystemPrompt + `"}`,
|
||||
system: json.RawMessage(`"` + claudeCodeSystemPrompt + `"`),
|
||||
wantSystemLen: 1,
|
||||
wantFirstText: claudeCodeSystemPrompt,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
|
||||
Reference in New Issue
Block a user