fix(openai): infer previous response for item references

This commit is contained in:
shaw
2026-04-30 12:02:08 +08:00
parent 733627cf9d
commit 094e1171ef
4 changed files with 11 additions and 9 deletions

2
.gitignore vendored
View File

@@ -122,7 +122,7 @@ scripts
.code-review-state .code-review-state
#openspec/ #openspec/
code-reviews/ code-reviews/
#AGENTS.md AGENTS.md
backend/cmd/server/server backend/cmd/server/server
deploy/docker-compose.override.yml deploy/docker-compose.override.yml
.gocache/ .gocache/

View File

@@ -1379,10 +1379,12 @@ func shouldInferIngressFunctionCallOutputPreviousResponseID(
if signals.HasFunctionCallOutputMissingCallID { if signals.HasFunctionCallOutputMissingCallID {
return false return false
} }
// If the client already sent tool-call context or item_reference anchors, // If the client already sent the actual tool-call context, treat this as
// treat this as a full replay / self-contained continuation payload rather // a full replay / self-contained continuation payload rather than
// than downgrading it into an inferred delta continuation. // downgrading it into an inferred delta continuation. item_reference alone
if signals.HasToolCallContext || signals.HasItemReferenceForAllCallIDs { // is not enough on the store=false WS path: it still needs a valid prior
// response anchor so upstream can resolve the referenced function_call.
if signals.HasToolCallContext {
return false return false
} }
return strings.TrimSpace(expectedPreviousResponseID) != "" return strings.TrimSpace(expectedPreviousResponseID) != ""

View File

@@ -1488,7 +1488,7 @@ func TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_StoreDisabledFun
require.False(t, gjson.Get(requestToJSONString(captureConn.writes[1]), "previous_response_id").Exists(), "请求已包含 function_call 上下文时不应自动补齐 previous_response_id") require.False(t, gjson.Get(requestToJSONString(captureConn.writes[1]), "previous_response_id").Exists(), "请求已包含 function_call 上下文时不应自动补齐 previous_response_id")
} }
func TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_StoreDisabledFunctionCallOutputSkipsAutoAttachWhenItemReferencesPresent(t *testing.T) { func TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_StoreDisabledFunctionCallOutputAutoAttachWhenOnlyItemReferencesPresent(t *testing.T) {
gin.SetMode(gin.TestMode) gin.SetMode(gin.TestMode)
cfg := &config.Config{} cfg := &config.Config{}
@@ -1619,7 +1619,7 @@ func TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_StoreDisabledFun
require.Equal(t, 1, captureDialer.DialCount()) require.Equal(t, 1, captureDialer.DialCount())
require.Len(t, captureConn.writes, 2) require.Len(t, captureConn.writes, 2)
require.False(t, gjson.Get(requestToJSONString(captureConn.writes[1]), "previous_response_id").Exists(), "请求已包含 item_reference 锚点时不应自动补齐 previous_response_id") require.Equal(t, "resp_auto_prev_ref_1", gjson.Get(requestToJSONString(captureConn.writes[1]), "previous_response_id").String(), "仅有 item_reference 不足以自包含 function_call_output应回填上一轮响应 ID")
} }
func TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_PreflightPingFailReconnectsBeforeTurn(t *testing.T) { func TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_PreflightPingFailReconnectsBeforeTurn(t *testing.T) {

View File

@@ -303,12 +303,12 @@ func TestShouldInferIngressFunctionCallOutputPreviousResponseID(t *testing.T) {
want: false, want: false,
}, },
{ {
name: "skip_when_item_reference_already_covers_all_call_ids", name: "infer_when_only_item_reference_covers_call_ids",
storeDisabled: true, storeDisabled: true,
turn: 2, turn: 2,
signals: ToolContinuationSignals{HasFunctionCallOutput: true, HasItemReferenceForAllCallIDs: true}, signals: ToolContinuationSignals{HasFunctionCallOutput: true, HasItemReferenceForAllCallIDs: true},
expectedPrevious: "resp_2", expectedPrevious: "resp_2",
want: false, want: true,
}, },
{ {
name: "skip_when_function_call_output_missing_call_id", name: "skip_when_function_call_output_missing_call_id",