fix(providers): preserve all reasoning_details types for OpenRouter models
OpenRouter models like Kimi K2.5 return reasoning_details with type reasoning.text at message level. The pi-ai library only handled reasoning.encrypted type. This patch stores all reasoning_details and passes them back in subsequent requests. Fixes multi-turn tool calls with Kimi K2.5 and similar models. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
6aeb79e0db
commit
7b3d5739da
@ -246,6 +246,9 @@
|
|||||||
"@sinclair/typebox": "0.34.47",
|
"@sinclair/typebox": "0.34.47",
|
||||||
"hono": "4.11.4",
|
"hono": "4.11.4",
|
||||||
"tar": "7.5.4"
|
"tar": "7.5.4"
|
||||||
|
},
|
||||||
|
"patchedDependencies": {
|
||||||
|
"@mariozechner/pi-ai@0.49.3": "patches/@mariozechner__pi-ai@0.49.3.patch"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"vitest": {
|
"vitest": {
|
||||||
|
|||||||
58
patches/@mariozechner__pi-ai@0.49.3.patch
Normal file
58
patches/@mariozechner__pi-ai@0.49.3.patch
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
diff --git a/dist/providers/openai-completions.js b/dist/providers/openai-completions.js
|
||||||
|
index c4b291d86ce40b2df319c439263d16d67592d22e..449da02d0d2c85309979e392909df5d3fb2ad083 100644
|
||||||
|
--- a/dist/providers/openai-completions.js
|
||||||
|
+++ b/dist/providers/openai-completions.js
|
||||||
|
@@ -228,7 +228,13 @@ export const streamOpenAICompletions = (model, context, options) => {
|
||||||
|
}
|
||||||
|
const reasoningDetails = choice.delta.reasoning_details;
|
||||||
|
if (reasoningDetails && Array.isArray(reasoningDetails)) {
|
||||||
|
+ // Store ALL reasoning_details for OpenRouter compatibility (not just encrypted)
|
||||||
|
+ if (!output._rawReasoningDetails) {
|
||||||
|
+ output._rawReasoningDetails = [];
|
||||||
|
+ }
|
||||||
|
for (const detail of reasoningDetails) {
|
||||||
|
+ output._rawReasoningDetails.push(detail);
|
||||||
|
+ // Also handle encrypted type tied to tool calls (existing behavior)
|
||||||
|
if (detail.type === "reasoning.encrypted" && detail.id && detail.data) {
|
||||||
|
const matchingToolCall = output.content.find((b) => b.type === "toolCall" && b.id === detail.id);
|
||||||
|
if (matchingToolCall) {
|
||||||
|
@@ -500,19 +506,27 @@ function convertMessages(model, context, compat) {
|
||||||
|
arguments: JSON.stringify(tc.arguments),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
- const reasoningDetails = toolCalls
|
||||||
|
- .filter((tc) => tc.thoughtSignature)
|
||||||
|
- .map((tc) => {
|
||||||
|
- try {
|
||||||
|
- return JSON.parse(tc.thoughtSignature);
|
||||||
|
- }
|
||||||
|
- catch {
|
||||||
|
- return null;
|
||||||
|
+ // First check for raw reasoning_details stored on the message (OpenRouter models like Kimi)
|
||||||
|
+ const rawDetails = msg._rawReasoningDetails;
|
||||||
|
+ if (rawDetails && Array.isArray(rawDetails) && rawDetails.length > 0) {
|
||||||
|
+ assistantMsg.reasoning_details = rawDetails;
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ // Fall back to extracting from tool call thoughtSignatures (encrypted type)
|
||||||
|
+ const reasoningDetails = toolCalls
|
||||||
|
+ .filter((tc) => tc.thoughtSignature)
|
||||||
|
+ .map((tc) => {
|
||||||
|
+ try {
|
||||||
|
+ return JSON.parse(tc.thoughtSignature);
|
||||||
|
+ }
|
||||||
|
+ catch {
|
||||||
|
+ return null;
|
||||||
|
+ }
|
||||||
|
+ })
|
||||||
|
+ .filter(Boolean);
|
||||||
|
+ if (reasoningDetails.length > 0) {
|
||||||
|
+ assistantMsg.reasoning_details = reasoningDetails;
|
||||||
|
}
|
||||||
|
- })
|
||||||
|
- .filter(Boolean);
|
||||||
|
- if (reasoningDetails.length > 0) {
|
||||||
|
- assistantMsg.reasoning_details = reasoningDetails;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Skip assistant messages that have no content and no tool calls.
|
||||||
15
pnpm-lock.yaml
generated
15
pnpm-lock.yaml
generated
@ -9,6 +9,11 @@ overrides:
|
|||||||
hono: 4.11.4
|
hono: 4.11.4
|
||||||
tar: 7.5.4
|
tar: 7.5.4
|
||||||
|
|
||||||
|
patchedDependencies:
|
||||||
|
'@mariozechner/pi-ai@0.49.3':
|
||||||
|
hash: 8fada8af40beb6c2780b3adec72505288272a5df0ec6227b710caef6afb1dc32
|
||||||
|
path: patches/@mariozechner__pi-ai@0.49.3.patch
|
||||||
|
|
||||||
importers:
|
importers:
|
||||||
|
|
||||||
.:
|
.:
|
||||||
@ -45,7 +50,7 @@ importers:
|
|||||||
version: 0.49.3(ws@8.19.0)(zod@4.3.6)
|
version: 0.49.3(ws@8.19.0)(zod@4.3.6)
|
||||||
'@mariozechner/pi-ai':
|
'@mariozechner/pi-ai':
|
||||||
specifier: 0.49.3
|
specifier: 0.49.3
|
||||||
version: 0.49.3(ws@8.19.0)(zod@4.3.6)
|
version: 0.49.3(patch_hash=8fada8af40beb6c2780b3adec72505288272a5df0ec6227b710caef6afb1dc32)(ws@8.19.0)(zod@4.3.6)
|
||||||
'@mariozechner/pi-coding-agent':
|
'@mariozechner/pi-coding-agent':
|
||||||
specifier: 0.49.3
|
specifier: 0.49.3
|
||||||
version: 0.49.3(ws@8.19.0)(zod@4.3.6)
|
version: 0.49.3(ws@8.19.0)(zod@4.3.6)
|
||||||
@ -6989,7 +6994,7 @@ snapshots:
|
|||||||
|
|
||||||
'@mariozechner/pi-agent-core@0.49.3(ws@8.19.0)(zod@4.3.6)':
|
'@mariozechner/pi-agent-core@0.49.3(ws@8.19.0)(zod@4.3.6)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@mariozechner/pi-ai': 0.49.3(ws@8.19.0)(zod@4.3.6)
|
'@mariozechner/pi-ai': 0.49.3(patch_hash=8fada8af40beb6c2780b3adec72505288272a5df0ec6227b710caef6afb1dc32)(ws@8.19.0)(zod@4.3.6)
|
||||||
'@mariozechner/pi-tui': 0.49.3
|
'@mariozechner/pi-tui': 0.49.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@modelcontextprotocol/sdk'
|
- '@modelcontextprotocol/sdk'
|
||||||
@ -7000,7 +7005,7 @@ snapshots:
|
|||||||
- ws
|
- ws
|
||||||
- zod
|
- zod
|
||||||
|
|
||||||
'@mariozechner/pi-ai@0.49.3(ws@8.19.0)(zod@4.3.6)':
|
'@mariozechner/pi-ai@0.49.3(patch_hash=8fada8af40beb6c2780b3adec72505288272a5df0ec6227b710caef6afb1dc32)(ws@8.19.0)(zod@4.3.6)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@anthropic-ai/sdk': 0.71.2(zod@4.3.6)
|
'@anthropic-ai/sdk': 0.71.2(zod@4.3.6)
|
||||||
'@aws-sdk/client-bedrock-runtime': 3.972.0
|
'@aws-sdk/client-bedrock-runtime': 3.972.0
|
||||||
@ -7027,7 +7032,7 @@ snapshots:
|
|||||||
'@mariozechner/clipboard': 0.3.0
|
'@mariozechner/clipboard': 0.3.0
|
||||||
'@mariozechner/jiti': 2.6.5
|
'@mariozechner/jiti': 2.6.5
|
||||||
'@mariozechner/pi-agent-core': 0.49.3(ws@8.19.0)(zod@4.3.6)
|
'@mariozechner/pi-agent-core': 0.49.3(ws@8.19.0)(zod@4.3.6)
|
||||||
'@mariozechner/pi-ai': 0.49.3(ws@8.19.0)(zod@4.3.6)
|
'@mariozechner/pi-ai': 0.49.3(patch_hash=8fada8af40beb6c2780b3adec72505288272a5df0ec6227b710caef6afb1dc32)(ws@8.19.0)(zod@4.3.6)
|
||||||
'@mariozechner/pi-tui': 0.49.3
|
'@mariozechner/pi-tui': 0.49.3
|
||||||
'@silvia-odwyer/photon-node': 0.3.4
|
'@silvia-odwyer/photon-node': 0.3.4
|
||||||
chalk: 5.6.2
|
chalk: 5.6.2
|
||||||
@ -9104,7 +9109,7 @@ snapshots:
|
|||||||
'@line/bot-sdk': 10.6.0
|
'@line/bot-sdk': 10.6.0
|
||||||
'@lydell/node-pty': 1.2.0-beta.3
|
'@lydell/node-pty': 1.2.0-beta.3
|
||||||
'@mariozechner/pi-agent-core': 0.49.3(ws@8.19.0)(zod@4.3.6)
|
'@mariozechner/pi-agent-core': 0.49.3(ws@8.19.0)(zod@4.3.6)
|
||||||
'@mariozechner/pi-ai': 0.49.3(ws@8.19.0)(zod@4.3.6)
|
'@mariozechner/pi-ai': 0.49.3(patch_hash=8fada8af40beb6c2780b3adec72505288272a5df0ec6227b710caef6afb1dc32)(ws@8.19.0)(zod@4.3.6)
|
||||||
'@mariozechner/pi-coding-agent': 0.49.3(ws@8.19.0)(zod@4.3.6)
|
'@mariozechner/pi-coding-agent': 0.49.3(ws@8.19.0)(zod@4.3.6)
|
||||||
'@mariozechner/pi-tui': 0.49.3
|
'@mariozechner/pi-tui': 0.49.3
|
||||||
'@mozilla/readability': 0.6.0
|
'@mozilla/readability': 0.6.0
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user