-
Notifications
You must be signed in to change notification settings - Fork 6.2k
Description
Description
Description
When using opencode with backends that perform strict JSON Schema validation (such as SGLang or other Pydantic-based LLM servers), tool calls for built-in tools with empty parameters (e.g., todoread) fail during the initial request.
The server returns a 400 Bad Request or a validation error similar to:
Tool function has invalid 'parameters' schema: None is not of type 'array' on schema['required']
Root Cause Analysis
The issue stems from how zod schemas are converted to JSON Schema for the LLM provider.
In packages/opencode/src/tool/todo.ts, the todoread tool defines its parameters as an empty object:
export const TodoReadTool = Tool.define("todoread", {
description: "Use this tool to read your todo list",
parameters: z.object({}), // This results in a schema without a 'required' field
// ...
})In packages/opencode/src/session/prompt.ts, the schema is generated using z.toJSONSchema(item.parameters). For an empty object, it produces:
"parameters": {
"type": "object",
"properties": {}
}Strict validators like SGLang's internal pydantic models fail because they expect "required": [] to be explicitly present if the schema is of type object.
Suggested Fix
The most robust place to fix this is in the provider transformation layer to ensure all object-based schemas satisfy strict requirements.
File: packages/opencode/src/provider/transform.ts
export function schema(model: Provider.Model, schema: any) {
// ... existing logic ...
// Ensure 'required' is always an array for object types to satisfy strict backends
if (schema.type === 'object' && !schema.required) {
schema.required = [];
}
return schema;
}Environment
- Opencode Version: 1.1.14
- LLM Backend: SGLang (v1/chat/completions)
- Platform: macOS / Linux
Plugins
No response
OpenCode version
1.1.14
Steps to reproduce
- Configure
opencodeto use an SGLang backend (or any backend using strict JSON Schema validation). - Start a session where built-in tools are enabled.
- Observe the
v1/chat/completionsrequest failing because the backend rejects thetodoreadtool definition.
Screenshot and/or share link
No response
Operating System
No response
Terminal
No response