1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# Tool Schema Analysis — Dispatch / AI SDK v6
## How Dispatch Defines Tools
Dispatch uses the **AI SDK v6** (`ai@^6.0.191`) with provider adapters (`@ai-sdk/anthropic@^3.0.79`, `@ai-sdk/openai-compatible@^2.0.48`).
### The conversion pipeline
```
Zod schema (z.object({...}))
→ zodToJsonSchema() → JSON Schema Draft 7
→ jsonSchema() → AI SDK v6 inputSchema wrapper
→ tool() → AI SDK v6 Tool object (no execute fn)
→ streamText({tools}) → SDK → provider adapter → wire format
```
**Critical file:** `packages/core/src/tools/registry.ts` — the `toAISDKTool()` function.
### What each tool's schema looks like after conversion
For a typical tool like `read_file`:
```json
{
"type": "object",
"properties": {
"path": { "type": "string", "description": "Path to the file..." },
"offset": { "type": "integer", "minimum": 1, "description": "..." },
"limit": { "type": "integer", "minimum": 1, "description": "..." }
},
"required": ["path"],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
```
### The Problem Surface
The `zodToJsonSchema()` library (v3.x) generates full Draft 7 JSON Schema including:
1. **`$schema` field** — `"http://json-schema.org/draft-07/schema#"` — Anthropic's API rejects this or silently ignores it depending on version
2. **`additionalProperties: false`** — Anthropic may not handle this correctly; Claude's `tool_use` blocks sometimes include extra fields
3. **`default` values** — Zod schemas with `.default()` produce JSON Schema `default` fields that Anthropic doesn't support
4. **`minimum`/`maximum`** — Numeric constraints may cause issues if Claude passes values slightly outside bounds
### What the oh-my-pi reference does differently
The `references/oh-my-pi/packages/ai/src/utils/schema/normalize.ts` shows a `normalizeSchemaForCCA()` function that strips all of the above. Dispatch does **no normalization** before passing schemas to the AI SDK.
### What the AI SDK's @ai-sdk/anthropic adapter does
The adapter should convert the AI SDK's internal format to Anthropic's wire format. However, the adapter may:
- Pass through JSON Schema fields that Anthropic doesn't support (like `$schema`, `additionalProperties`)
- Not add parameter `description` fields from the schema to the Anthropic format
- Not handle `default` values correctly
### Files to inspect
| File | What to check |
|------|---------------|
| `node_modules/@ai-sdk/anthropic/dist/index.mjs` | How tools are serialized for the wire |
| `node_modules/ai/dist/index.mjs` | How `tool()` and `jsonSchema()` work |
| `node_modules/zod-to-json-schema/dist/` | What `zodToJsonSchema` outputs for our schemas |
|