From c6b0e85b540122a1abc6be8ef229f4d4f113bef4 Mon Sep 17 00:00:00 2001 From: Luis Pater Date: Tue, 30 Dec 2025 20:44:13 +0800 Subject: [PATCH] Fixed: #790 fix(gemini): include full text in response output events --- .../openai/responses/gemini_openai-responses_response.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/internal/translator/gemini/openai/responses/gemini_openai-responses_response.go b/internal/translator/gemini/openai/responses/gemini_openai-responses_response.go index 27d2f9b6..5529d52a 100644 --- a/internal/translator/gemini/openai/responses/gemini_openai-responses_response.go +++ b/internal/translator/gemini/openai/responses/gemini_openai-responses_response.go @@ -23,6 +23,7 @@ type geminiToResponsesState struct { MsgIndex int CurrentMsgID string TextBuf strings.Builder + ItemTextBuf strings.Builder // reasoning aggregation ReasoningOpened bool @@ -189,6 +190,8 @@ func ConvertGeminiResponseToOpenAIResponses(_ context.Context, modelName string, partAdded, _ = sjson.Set(partAdded, "item_id", st.CurrentMsgID) partAdded, _ = sjson.Set(partAdded, "output_index", st.MsgIndex) out = append(out, emitEvent("response.content_part.added", partAdded)) + st.ItemTextBuf.Reset() + st.ItemTextBuf.WriteString(t.String()) } st.TextBuf.WriteString(t.String()) msg := `{"type":"response.output_text.delta","sequence_number":0,"item_id":"","output_index":0,"content_index":0,"delta":"","logprobs":[]}` @@ -250,20 +253,24 @@ func ConvertGeminiResponseToOpenAIResponses(_ context.Context, modelName string, finalizeReasoning() // Close message output if opened if st.MsgOpened { + fullText := st.ItemTextBuf.String() done := `{"type":"response.output_text.done","sequence_number":0,"item_id":"","output_index":0,"content_index":0,"text":"","logprobs":[]}` done, _ = sjson.Set(done, "sequence_number", nextSeq()) done, _ = sjson.Set(done, "item_id", st.CurrentMsgID) done, _ = sjson.Set(done, "output_index", st.MsgIndex) + done, _ = sjson.Set(done, "text", fullText) out = append(out, emitEvent("response.output_text.done", done)) partDone := `{"type":"response.content_part.done","sequence_number":0,"item_id":"","output_index":0,"content_index":0,"part":{"type":"output_text","annotations":[],"logprobs":[],"text":""}}` partDone, _ = sjson.Set(partDone, "sequence_number", nextSeq()) partDone, _ = sjson.Set(partDone, "item_id", st.CurrentMsgID) partDone, _ = sjson.Set(partDone, "output_index", st.MsgIndex) + partDone, _ = sjson.Set(partDone, "part.text", fullText) out = append(out, emitEvent("response.content_part.done", partDone)) final := `{"type":"response.output_item.done","sequence_number":0,"output_index":0,"item":{"id":"","type":"message","status":"completed","content":[{"type":"output_text","text":""}],"role":"assistant"}}` final, _ = sjson.Set(final, "sequence_number", nextSeq()) final, _ = sjson.Set(final, "output_index", st.MsgIndex) final, _ = sjson.Set(final, "item.id", st.CurrentMsgID) + final, _ = sjson.Set(final, "item.content.0.text", fullText) out = append(out, emitEvent("response.output_item.done", final)) }