summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bun.lock6
-rw-r--r--packages/opencode/package.json2
-rw-r--r--packages/opencode/src/provider/transform.ts6
-rw-r--r--packages/opencode/test/session/message-v2.test.ts73
4 files changed, 83 insertions, 4 deletions
diff --git a/bun.lock b/bun.lock
index 1d2e4462f..6a146d9e8 100644
--- a/bun.lock
+++ b/bun.lock
@@ -393,7 +393,7 @@
"@opencode-ai/plugin": "workspace:*",
"@opencode-ai/script": "workspace:*",
"@opencode-ai/sdk": "workspace:*",
- "@openrouter/ai-sdk-provider": "2.5.1",
+ "@openrouter/ai-sdk-provider": "2.8.1",
"@opentelemetry/api": "1.9.0",
"@opentelemetry/context-async-hooks": "2.6.1",
"@opentelemetry/exporter-trace-otlp-http": "0.214.0",
@@ -1585,7 +1585,7 @@
"@opencode-ai/web": ["@opencode-ai/web@workspace:packages/web"],
- "@openrouter/ai-sdk-provider": ["@openrouter/[email protected]", "", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-r1fJL1Cb3gQDa2MpWH/sfx1BsEW0uzlRriJM6eihaKqbtKDmZoBisF32VcVaQYassighX7NGCkF68EsrZA43uQ=="],
+ "@openrouter/ai-sdk-provider": ["@openrouter/[email protected]", "", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Y6j3yivgoEUf/kutD/k5GX/mzZfioRFoSx0gbQ+mIOzMaH/vJv1rCkztiuvlLw5xRYQil7oxHUZvmSfXqOx1NQ=="],
"@opentelemetry/api": ["@opentelemetry/[email protected]", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],
@@ -5723,6 +5723,8 @@
"ai-gateway-provider/@ai-sdk/xai": ["@ai-sdk/[email protected]", "", { "dependencies": { "@ai-sdk/openai-compatible": "2.0.37", "@ai-sdk/provider": "3.0.8", "@ai-sdk/provider-utils": "4.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-V8UKK4fNpI9cnrtsZBvUp9O9J6Y9fTKBRoSLyEaNGPirACewixmLDbXsSgAeownPVWiWpK34bFysd+XouI5Ywg=="],
+ "ai-gateway-provider/@openrouter/ai-sdk-provider": ["@openrouter/[email protected]", "", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-r1fJL1Cb3gQDa2MpWH/sfx1BsEW0uzlRriJM6eihaKqbtKDmZoBisF32VcVaQYassighX7NGCkF68EsrZA43uQ=="],
+
"ajv-keywords/ajv": ["[email protected]", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw=="],
"ansi-align/string-width": ["[email protected]", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
diff --git a/packages/opencode/package.json b/packages/opencode/package.json
index 98a707f4b..df0043b06 100644
--- a/packages/opencode/package.json
+++ b/packages/opencode/package.json
@@ -115,7 +115,7 @@
"@opencode-ai/plugin": "workspace:*",
"@opencode-ai/script": "workspace:*",
"@opencode-ai/sdk": "workspace:*",
- "@openrouter/ai-sdk-provider": "2.5.1",
+ "@openrouter/ai-sdk-provider": "2.8.1",
"@opentelemetry/api": "1.9.0",
"@opentelemetry/context-async-hooks": "2.6.1",
"@opentelemetry/exporter-trace-otlp-http": "0.214.0",
diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts
index 67b02c089..b2e9b59a3 100644
--- a/packages/opencode/src/provider/transform.ts
+++ b/packages/opencode/src/provider/transform.ts
@@ -193,7 +193,11 @@ function normalizeMessages(
})
}
- if (typeof model.capabilities.interleaved === "object" && model.capabilities.interleaved.field) {
+ if (
+ typeof model.capabilities.interleaved === "object" &&
+ model.capabilities.interleaved.field &&
+ model.api.npm !== "@openrouter/ai-sdk-provider"
+ ) {
const field = model.capabilities.interleaved.field
return msgs.map((msg) => {
if (msg.role === "assistant" && Array.isArray(msg.content)) {
diff --git a/packages/opencode/test/session/message-v2.test.ts b/packages/opencode/test/session/message-v2.test.ts
index abada013d..9591a5d62 100644
--- a/packages/opencode/test/session/message-v2.test.ts
+++ b/packages/opencode/test/session/message-v2.test.ts
@@ -873,6 +873,79 @@ describe("session.message-v2.toModelMessage", () => {
])
})
+ test("preserves OpenRouter reasoning details through provider transform", async () => {
+ const assistantID = "m-assistant"
+ const openrouterModel: Provider.Model = {
+ ...model,
+ id: ModelID.make("deepseek/deepseek-v4-pro"),
+ providerID: ProviderID.make("openrouter"),
+ api: {
+ id: "deepseek/deepseek-v4-pro",
+ url: "https://openrouter.ai/api/v1",
+ npm: "@openrouter/ai-sdk-provider",
+ },
+ capabilities: {
+ ...model.capabilities,
+ reasoning: true,
+ interleaved: { field: "reasoning_details" },
+ },
+ }
+ const reasoningDetails = [
+ {
+ type: "reasoning.text",
+ text: "thinking",
+ format: "unknown",
+ index: 0,
+ },
+ ]
+ const input: MessageV2.WithParts[] = [
+ {
+ info: assistantInfo(assistantID, "m-parent", undefined, {
+ providerID: openrouterModel.providerID,
+ modelID: openrouterModel.id,
+ }),
+ parts: [
+ {
+ ...basePart(assistantID, "a1"),
+ type: "reasoning",
+ text: "thinking",
+ time: { start: 0 },
+ metadata: {
+ openrouter: {
+ reasoning_details: reasoningDetails,
+ },
+ },
+ },
+ {
+ ...basePart(assistantID, "a2"),
+ type: "text",
+ text: "answer",
+ },
+ ] as MessageV2.Part[],
+ },
+ ]
+
+ expect(
+ ProviderTransform.message(await MessageV2.toModelMessages(input, openrouterModel), openrouterModel, {}),
+ ).toStrictEqual([
+ {
+ role: "assistant",
+ content: [
+ {
+ type: "reasoning",
+ text: "thinking",
+ providerOptions: {
+ openrouter: {
+ reasoning_details: reasoningDetails,
+ },
+ },
+ },
+ { type: "text", text: "answer" },
+ ],
+ },
+ ])
+ })
+
test("splits assistant messages on step-start boundaries", async () => {
const assistantID = "m-assistant"