fix(translator): handle stop_reason and MAX_TOKENS for Claude responses

This commit is contained in:
Luis Pater
2026-01-31 04:03:01 +08:00
parent f887f9985d
commit f99cddf97f
3 changed files with 8 additions and 1 deletions

View File

@@ -112,7 +112,10 @@ func ConvertCodexResponseToClaude(_ context.Context, _ string, originalRequestRa
} else if typeStr == "response.completed" { } else if typeStr == "response.completed" {
template = `{"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}` template = `{"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}`
p := (*param).(*ConvertCodexResponseToClaudeParams).HasToolCall p := (*param).(*ConvertCodexResponseToClaudeParams).HasToolCall
if p { stopReason := rootResult.Get("response.stop_reason").String()
if stopReason != "" {
template, _ = sjson.Set(template, "delta.stop_reason", stopReason)
} else if p {
template, _ = sjson.Set(template, "delta.stop_reason", "tool_use") template, _ = sjson.Set(template, "delta.stop_reason", "tool_use")
} else { } else {
template, _ = sjson.Set(template, "delta.stop_reason", "end_turn") template, _ = sjson.Set(template, "delta.stop_reason", "end_turn")

View File

@@ -244,6 +244,8 @@ func ConvertGeminiCLIResponseToClaude(_ context.Context, _ string, originalReque
// Set tool_use stop reason if tools were used in this response // Set tool_use stop reason if tools were used in this response
if usedTool { if usedTool {
template = `{"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}` template = `{"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}`
} else if finish := gjson.GetBytes(rawJSON, "response.candidates.0.finishReason"); finish.Exists() && finish.String() == "MAX_TOKENS" {
template = `{"type":"message_delta","delta":{"stop_reason":"max_tokens","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}`
} }
// Include thinking tokens in output token count if present // Include thinking tokens in output token count if present

View File

@@ -251,6 +251,8 @@ func ConvertGeminiResponseToClaude(_ context.Context, _ string, originalRequestR
template := `{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}` template := `{"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}`
if usedTool { if usedTool {
template = `{"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}` template = `{"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}`
} else if finish := gjson.GetBytes(rawJSON, "candidates.0.finishReason"); finish.Exists() && finish.String() == "MAX_TOKENS" {
template = `{"type":"message_delta","delta":{"stop_reason":"max_tokens","stop_sequence":null},"usage":{"input_tokens":0,"output_tokens":0}}`
} }
thoughtsTokenCount := usageResult.Get("thoughtsTokenCount").Int() thoughtsTokenCount := usageResult.Get("thoughtsTokenCount").Int()