summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlif <[email protected]>2025-12-21 01:41:52 +0800
committerGitHub <[email protected]>2025-12-20 11:41:52 -0600
commitd89b567b47ae2709f0fe3fd1e997860073829d72 (patch)
tree0f1312d6a681eeacf09718770b3a6cfb36932aec
parent34eb03f5b8d9103b456e004b4b529d7df0cbdd7b (diff)
downloadopencode-d89b567b47ae2709f0fe3fd1e997860073829d72.tar.gz
opencode-d89b567b47ae2709f0fe3fd1e997860073829d72.zip
fix: add transform case for gemini if mcp tool has missing array items (#5846)
-rw-r--r--packages/opencode/src/provider/transform.ts4
-rw-r--r--packages/opencode/test/provider/transform.test.ts24
2 files changed, 28 insertions, 0 deletions
diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts
index 320af4d39..0aacf0935 100644
--- a/packages/opencode/src/provider/transform.ts
+++ b/packages/opencode/src/provider/transform.ts
@@ -424,6 +424,10 @@ export namespace ProviderTransform {
result.required = result.required.filter((field: any) => field in result.properties)
}
+ if (result.type === "array" && result.items == null) {
+ result.items = {}
+ }
+
return result
}
diff --git a/packages/opencode/test/provider/transform.test.ts b/packages/opencode/test/provider/transform.test.ts
index 17ae7f558..78bd296c9 100644
--- a/packages/opencode/test/provider/transform.test.ts
+++ b/packages/opencode/test/provider/transform.test.ts
@@ -167,6 +167,30 @@ describe("ProviderTransform.maxOutputTokens", () => {
})
})
+describe("ProviderTransform.schema - gemini array items", () => {
+ test("adds missing items for array properties", () => {
+ const geminiModel = {
+ providerID: "google",
+ api: {
+ id: "gemini-3-pro",
+ },
+ } as any
+
+ const schema = {
+ type: "object",
+ properties: {
+ nodes: { type: "array" },
+ edges: { type: "array", items: { type: "string" } },
+ },
+ } as any
+
+ const result = ProviderTransform.schema(geminiModel, schema) as any
+
+ expect(result.properties.nodes.items).toBeDefined()
+ expect(result.properties.edges.items.type).toBe("string")
+ })
+})
+
describe("ProviderTransform.message - DeepSeek reasoning content", () => {
test("DeepSeek with tool calls includes reasoning_content in providerOptions", () => {
const msgs = [