Compare commits

...

3 Commits

Author SHA1 Message Date
Kit Langton e7357681bb refactor(core): narrow provider adapter fix 2026-07-07 22:01:10 -04:00
Kit Langton 552b710630 refactor(core): make adapter error mapping explicit 2026-07-07 22:01:09 -04:00
Kit Langton 5b1a34e4c7 fix(core): preserve provider adapter metadata 2026-07-07 22:01:09 -04:00
2 changed files with 59 additions and 4 deletions
+6 -3
View File
@@ -404,7 +404,8 @@ function text(part: ContentPart) {
}
function userPart(part: ContentPart): UserContent {
if (part.type === "text") return [{ type: "text", text: part.text }]
if (part.type === "text")
return [{ type: "text", text: part.text, providerOptions: providerOptions(part.providerMetadata) }]
if (part.type === "media")
return [{ type: "file", mediaType: part.mediaType, data: part.data, filename: part.filename }]
return []
@@ -413,11 +414,11 @@ function userPart(part: ContentPart): UserContent {
function assistantPart(part: ContentPart): AssistantContent {
switch (part.type) {
case "text":
return [{ type: "text", text: part.text }]
return [{ type: "text", text: part.text, providerOptions: providerOptions(part.providerMetadata) }]
case "media":
return [{ type: "file", mediaType: part.mediaType, data: part.data, filename: part.filename }]
case "reasoning":
return [{ type: "reasoning", text: part.text }]
return [{ type: "reasoning", text: part.text, providerOptions: providerOptions(part.providerMetadata) }]
case "tool-call":
return [
{
@@ -426,6 +427,7 @@ function assistantPart(part: ContentPart): AssistantContent {
toolName: part.name,
input: part.input,
providerExecuted: part.providerExecuted,
providerOptions: providerOptions(part.providerMetadata),
},
]
case "tool-result":
@@ -441,6 +443,7 @@ function toolResultPart(part: ContentPart): ToolResultContent[] {
toolCallId: part.id,
toolName: part.name,
output: toolOutput(part.result),
providerOptions: providerOptions(part.providerMetadata),
},
]
}
+53 -1
View File
@@ -2,7 +2,7 @@ import type { LanguageModelV3CallOptions } from "@ai-sdk/provider"
import { AISDK } from "@opencode-ai/core/aisdk"
import { ModelV2 } from "@opencode-ai/core/model"
import { ProviderV2 } from "@opencode-ai/core/provider"
import { LLM } from "@opencode-ai/llm"
import { LLM, Message } from "@opencode-ai/llm"
import { LLMClient } from "@opencode-ai/llm/route"
import { expect } from "bun:test"
import { Effect } from "effect"
@@ -67,3 +67,55 @@ it.effect("projects request settings, headers, and body overlays", () =>
expect(body).toEqual({ safety_setting: "strict" })
}),
)
it.effect("preserves content provider metadata when lowering requests", () =>
Effect.gen(function* () {
const aisdk = yield* AISDK.Service
yield* aisdk.hook.sdk((event) => {
event.sdk = { languageModel: () => ({ provider: event.model.providerID }) }
})
const resolved = yield* aisdk.model(model("@ai-sdk/google"))
const prepared = yield* LLMClient.prepare<LanguageModelV3CallOptions>(
LLM.request({
model: resolved,
messages: [
Message.assistant([
{
type: "reasoning",
text: "thinking",
providerMetadata: { google: { thoughtSignature: "signature" } },
},
{
type: "tool-call",
id: "call-1",
name: "bash",
input: { command: "pwd" },
providerMetadata: { google: { itemId: "item-1" } },
},
]),
],
}),
)
expect(prepared.body.prompt).toMatchObject([
{
role: "assistant",
content: [
{
type: "reasoning",
text: "thinking",
providerOptions: { google: { thoughtSignature: "signature" } },
},
{
type: "tool-call",
toolCallId: "call-1",
toolName: "bash",
input: { command: "pwd" },
providerOptions: { google: { itemId: "item-1" } },
},
],
},
])
}),
)