fix: preserve reasoning on tool-only turns

This commit is contained in:
Peter Steinberger
2026-01-11 11:21:53 +00:00
parent 61b786b2b7
commit f328cd5246
2 changed files with 23 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
diff --git a/dist/providers/google-gemini-cli.js b/dist/providers/google-gemini-cli.js diff --git a/dist/providers/google-gemini-cli.js b/dist/providers/google-gemini-cli.js
index 93aa26c395e9bd0df64376408a13d15ee9e7cce7..41a439e5fc370038a5febef9e8f021ee279cf8aa 100644 index 93aa26c395e9bd0df64376408a13d15ee9e7cce7..beb585e2f2c13eec3bca98acade761101e4572ff 100644
--- a/dist/providers/google-gemini-cli.js --- a/dist/providers/google-gemini-cli.js
+++ b/dist/providers/google-gemini-cli.js +++ b/dist/providers/google-gemini-cli.js
@@ -248,6 +248,11 @@ export const streamGoogleGeminiCli = (model, context, options) => { @@ -248,6 +248,11 @@ export const streamGoogleGeminiCli = (model, context, options) => {
@@ -15,7 +15,7 @@ index 93aa26c395e9bd0df64376408a13d15ee9e7cce7..41a439e5fc370038a5febef9e8f021ee
if (attempt < MAX_RETRIES && isRetryableError(response.status, errorText)) { if (attempt < MAX_RETRIES && isRetryableError(response.status, errorText)) {
// Use server-provided delay or exponential backoff // Use server-provided delay or exponential backoff
diff --git a/dist/providers/openai-codex-responses.js b/dist/providers/openai-codex-responses.js diff --git a/dist/providers/openai-codex-responses.js b/dist/providers/openai-codex-responses.js
index 188a8294f26fe1bfe3fb298a7f58e4d8eaf2a529..2f543a3ee9ea7603519562ac52ee00b6a7d0432c 100644 index 188a8294f26fe1bfe3fb298a7f58e4d8eaf2a529..ccfe2e835918530ddf9d2ce17b44b0069b41648e 100644
--- a/dist/providers/openai-codex-responses.js --- a/dist/providers/openai-codex-responses.js
+++ b/dist/providers/openai-codex-responses.js +++ b/dist/providers/openai-codex-responses.js
@@ -515,7 +515,7 @@ function convertTools(tools) { @@ -515,7 +515,7 @@ function convertTools(tools) {
@@ -28,7 +28,7 @@ index 188a8294f26fe1bfe3fb298a7f58e4d8eaf2a529..2f543a3ee9ea7603519562ac52ee00b6
} }
function mapStopReason(status) { function mapStopReason(status) {
diff --git a/dist/providers/openai-responses.js b/dist/providers/openai-responses.js diff --git a/dist/providers/openai-responses.js b/dist/providers/openai-responses.js
index f07085c64390b211340d6a826b28ea9c2e77302f..71509b70c5aa762872eab3b5ffc7a42579aa881f 100644 index f07085c64390b211340d6a826b28ea9c2e77302f..7f758532246cc7b062df48e9cec4e6c904b76a99 100644
--- a/dist/providers/openai-responses.js --- a/dist/providers/openai-responses.js
+++ b/dist/providers/openai-responses.js +++ b/dist/providers/openai-responses.js
@@ -396,10 +396,16 @@ function convertMessages(model, context) { @@ -396,10 +396,16 @@ function convertMessages(model, context) {
@@ -48,14 +48,20 @@ index f07085c64390b211340d6a826b28ea9c2e77302f..71509b70c5aa762872eab3b5ffc7a425
const reasoningItem = JSON.parse(block.thinkingSignature); const reasoningItem = JSON.parse(block.thinkingSignature);
output.push(reasoningItem); output.push(reasoningItem);
} }
@@ -430,7 +431,7 @@ export const streamOpenAIResponses = (model, context, options) => { @@ -434,6 +440,16 @@ function convertMessages(model, context) {
const hasAssistantMessage = output.some((item) => item.type === "message"); });
const hasFunctionCall = output.some((item) => item.type === "function_call"); }
- if (!hasAssistantMessage && hasFunctionCall) { }
+ const hasAssistantMessage = output.some((item) => item.type === "message");
+ const hasFunctionCall = output.some((item) => item.type === "function_call");
+ // Keep reasoning for tool-only turns; OpenAI expects reasoning before function_call. + // Keep reasoning for tool-only turns; OpenAI expects reasoning before function_call.
+ if (!hasAssistantMessage && !hasFunctionCall) { + if (!hasAssistantMessage && !hasFunctionCall) {
for (let i = output.length - 1; i >= 0; i -= 1) { + for (let i = output.length - 1; i >= 0; i -= 1) {
if (output[i].type === "reasoning") { + if (output[i].type === "reasoning") {
output.splice(i, 1); + output.splice(i, 1);
} + }
} + }
+ }
if (output.length === 0)
continue;
messages.push(...output);

10
pnpm-lock.yaml generated
View File

@@ -9,7 +9,7 @@ overrides:
patchedDependencies: patchedDependencies:
'@mariozechner/pi-ai@0.42.2': '@mariozechner/pi-ai@0.42.2':
hash: ca50c90a03641eefa125b2b306ab4f2b5451002fc7964810917afa4c9ff66332 hash: 3fdce5d80680357fe70c0af04efd43c85cea49d59bf3563f502b24d647c058f2
path: patches/@mariozechner__pi-ai@0.42.2.patch path: patches/@mariozechner__pi-ai@0.42.2.patch
importers: importers:
@@ -36,7 +36,7 @@ importers:
version: 0.42.2(ws@8.19.0)(zod@4.3.5) version: 0.42.2(ws@8.19.0)(zod@4.3.5)
'@mariozechner/pi-ai': '@mariozechner/pi-ai':
specifier: ^0.42.2 specifier: ^0.42.2
version: 0.42.2(patch_hash=ca50c90a03641eefa125b2b306ab4f2b5451002fc7964810917afa4c9ff66332)(ws@8.19.0)(zod@4.3.5) version: 0.42.2(patch_hash=3fdce5d80680357fe70c0af04efd43c85cea49d59bf3563f502b24d647c058f2)(ws@8.19.0)(zod@4.3.5)
'@mariozechner/pi-coding-agent': '@mariozechner/pi-coding-agent':
specifier: ^0.42.2 specifier: ^0.42.2
version: 0.42.2(ws@8.19.0)(zod@4.3.5) version: 0.42.2(ws@8.19.0)(zod@4.3.5)
@@ -3777,7 +3777,7 @@ snapshots:
'@mariozechner/pi-agent-core@0.42.2(ws@8.19.0)(zod@4.3.5)': '@mariozechner/pi-agent-core@0.42.2(ws@8.19.0)(zod@4.3.5)':
dependencies: dependencies:
'@mariozechner/pi-ai': 0.42.2(patch_hash=ca50c90a03641eefa125b2b306ab4f2b5451002fc7964810917afa4c9ff66332)(ws@8.19.0)(zod@4.3.5) '@mariozechner/pi-ai': 0.42.2(patch_hash=3fdce5d80680357fe70c0af04efd43c85cea49d59bf3563f502b24d647c058f2)(ws@8.19.0)(zod@4.3.5)
'@mariozechner/pi-tui': 0.42.2 '@mariozechner/pi-tui': 0.42.2
transitivePeerDependencies: transitivePeerDependencies:
- '@modelcontextprotocol/sdk' - '@modelcontextprotocol/sdk'
@@ -3787,7 +3787,7 @@ snapshots:
- ws - ws
- zod - zod
'@mariozechner/pi-ai@0.42.2(patch_hash=ca50c90a03641eefa125b2b306ab4f2b5451002fc7964810917afa4c9ff66332)(ws@8.19.0)(zod@4.3.5)': '@mariozechner/pi-ai@0.42.2(patch_hash=3fdce5d80680357fe70c0af04efd43c85cea49d59bf3563f502b24d647c058f2)(ws@8.19.0)(zod@4.3.5)':
dependencies: dependencies:
'@anthropic-ai/sdk': 0.71.2(zod@4.3.5) '@anthropic-ai/sdk': 0.71.2(zod@4.3.5)
'@google/genai': 1.34.0 '@google/genai': 1.34.0
@@ -3811,7 +3811,7 @@ snapshots:
dependencies: dependencies:
'@mariozechner/clipboard': 0.3.0 '@mariozechner/clipboard': 0.3.0
'@mariozechner/pi-agent-core': 0.42.2(ws@8.19.0)(zod@4.3.5) '@mariozechner/pi-agent-core': 0.42.2(ws@8.19.0)(zod@4.3.5)
'@mariozechner/pi-ai': 0.42.2(patch_hash=ca50c90a03641eefa125b2b306ab4f2b5451002fc7964810917afa4c9ff66332)(ws@8.19.0)(zod@4.3.5) '@mariozechner/pi-ai': 0.42.2(patch_hash=3fdce5d80680357fe70c0af04efd43c85cea49d59bf3563f502b24d647c058f2)(ws@8.19.0)(zod@4.3.5)
'@mariozechner/pi-tui': 0.42.2 '@mariozechner/pi-tui': 0.42.2
chalk: 5.6.2 chalk: 5.6.2
cli-highlight: 2.1.11 cli-highlight: 2.1.11