diff --git a/packages/opencode/src/provider/transform.ts b/packages/opencode/src/provider/transform.ts index f42e14139f1e..3a5562884d91 100644 --- a/packages/opencode/src/provider/transform.ts +++ b/packages/opencode/src/provider/transform.ts @@ -1432,6 +1432,15 @@ export function schema(model: Provider.Model, schema: JSONSchema7): JSONSchema7 } */ + // Ensure `required` is always an array when `properties` is present. + // Strict JSON Schema validators (e.g. ajv used by some API gateways/proxies) + // reject schemas where `additionalProperties: false` is set but `required` + // is missing or null. This normalizes all object schemas to include an + // explicit (possibly empty) `required` array. + if (schema.type === "object" && schema.properties && !Array.isArray(schema.required)) { + schema.required = [] + } + if (model.api.npm === "@ai-sdk/openai" || model.api.npm === "@ai-sdk/azure") { schema = sanitizeOpenAISchema(schema) as JSONSchema7 // Codex also applies lossy compaction above 4 KB; defer that until OpenCode needs the same schema budget. diff --git a/packages/opencode/src/session/tools.ts b/packages/opencode/src/session/tools.ts index 0f401c7562fa..59c7ad6cd020 100644 --- a/packages/opencode/src/session/tools.ts +++ b/packages/opencode/src/session/tools.ts @@ -150,6 +150,7 @@ export const resolve = Effect.fn("SessionTools.resolve")(function* (input: { }, }, additionalProperties: false, + required: [], }), ), execute(args, opts) { @@ -233,6 +234,7 @@ export const resolve = Effect.fn("SessionTools.resolve")(function* (input: { }, }, additionalProperties: false, + required: [], }), ), execute(args, opts) {