mirror of
https://github.com/router-for-me/CLIProxyAPIPlus.git
synced 2026-05-13 23:41:36 +00:00
fix: omit empty signature field from thinking blocks
Emit signature only when non-empty in both streaming content_block_start and non-streaming thinking blocks. Avoids turning 'missing signature' into 'empty/invalid signature' which Claude clients may reject.
This commit is contained in:
@@ -84,7 +84,7 @@ func ConvertCodexResponseToClaude(_ context.Context, _ string, originalRequestRa
|
|||||||
if params.ThinkingBlockOpen && params.ThinkingStopPending {
|
if params.ThinkingBlockOpen && params.ThinkingStopPending {
|
||||||
output = append(output, finalizeCodexThinkingBlock(params)...)
|
output = append(output, finalizeCodexThinkingBlock(params)...)
|
||||||
}
|
}
|
||||||
template = []byte(`{"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":"","signature":""}}`)
|
template = []byte(`{"type":"content_block_start","index":0,"content_block":{"type":"thinking","thinking":""}}`)
|
||||||
template, _ = sjson.SetBytes(template, "index", params.BlockIndex)
|
template, _ = sjson.SetBytes(template, "index", params.BlockIndex)
|
||||||
params.ThinkingBlockOpen = true
|
params.ThinkingBlockOpen = true
|
||||||
params.ThinkingStopPending = false
|
params.ThinkingStopPending = false
|
||||||
@@ -270,9 +270,11 @@ func ConvertCodexResponseToClaudeNonStream(_ context.Context, _ string, original
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if thinkingBuilder.Len() > 0 || signature != "" {
|
if thinkingBuilder.Len() > 0 || signature != "" {
|
||||||
block := []byte(`{"type":"thinking","thinking":"","signature":""}`)
|
block := []byte(`{"type":"thinking","thinking":""}`)
|
||||||
block, _ = sjson.SetBytes(block, "thinking", thinkingBuilder.String())
|
block, _ = sjson.SetBytes(block, "thinking", thinkingBuilder.String())
|
||||||
block, _ = sjson.SetBytes(block, "signature", signature)
|
if signature != "" {
|
||||||
|
block, _ = sjson.SetBytes(block, "signature", signature)
|
||||||
|
}
|
||||||
out, _ = sjson.SetRawBytes(out, "content.-1", block)
|
out, _ = sjson.SetRawBytes(out, "content.-1", block)
|
||||||
}
|
}
|
||||||
case "message":
|
case "message":
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ func TestConvertCodexResponseToClaude_StreamThinkingIncludesSignature(t *testing
|
|||||||
case "content_block_start":
|
case "content_block_start":
|
||||||
if data.Get("content_block.type").String() == "thinking" {
|
if data.Get("content_block.type").String() == "thinking" {
|
||||||
startFound = true
|
startFound = true
|
||||||
if !data.Get("content_block.signature").Exists() {
|
if data.Get("content_block.signature").Exists() {
|
||||||
t.Fatalf("thinking start block missing signature field: %s", line)
|
t.Fatalf("thinking start block should NOT have signature field when signature is unknown: %s", line)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case "content_block_delta":
|
case "content_block_delta":
|
||||||
@@ -97,8 +97,8 @@ func TestConvertCodexResponseToClaude_StreamThinkingWithoutReasoningItemStillInc
|
|||||||
data := gjson.Parse(strings.TrimPrefix(line, "data: "))
|
data := gjson.Parse(strings.TrimPrefix(line, "data: "))
|
||||||
if data.Get("type").String() == "content_block_start" && data.Get("content_block.type").String() == "thinking" {
|
if data.Get("type").String() == "content_block_start" && data.Get("content_block.type").String() == "thinking" {
|
||||||
thinkingStartFound = true
|
thinkingStartFound = true
|
||||||
if !data.Get("content_block.signature").Exists() {
|
if data.Get("content_block.signature").Exists() {
|
||||||
t.Fatalf("thinking start block missing signature field: %s", line)
|
t.Fatalf("thinking start block should NOT have signature field without encrypted_content: %s", line)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if data.Get("type").String() == "content_block_stop" && data.Get("index").Int() == 0 {
|
if data.Get("type").String() == "content_block_stop" && data.Get("index").Int() == 0 {
|
||||||
|
|||||||
Reference in New Issue
Block a user