@botbotgo/better-call 0.1.16 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,13 +4,17 @@
4
4
 
5
5
  # BetterCall
6
6
 
7
- **One-line wrapper. Eight full BFCL remote runs completed. Best: 73.4% → 83.8%.**
7
+ **A small runtime reliability layer for LangChain and LLM tool calls.**
8
+
9
+ BetterCall wraps existing LangChain-style tools, validates model-generated calls before execution, and can optionally ask a repair model to fix rejected calls. In full BFCL v4 remote Ollama runs, the best measured lift was `granite4.1:3b`: **73.4% raw -> 83.8% with BetterCall**.
8
10
 
9
11
  ```ts
12
+ import { betterTools } from "@botbotgo/better-call";
13
+
10
14
  const tools = betterTools([searchTool, calculatorTool]);
11
15
  ```
12
16
 
13
- No model means validate + block only. Add `repairModel` when you want automatic repair.
17
+ No model means validate and block only. Add `repairModel` when you want automatic repair.
14
18
 
15
19
  ## Install
16
20
 
@@ -18,89 +22,92 @@ No model means validate + block only. Add `repairModel` when you want automatic
18
22
  npm install @botbotgo/better-call
19
23
  ```
20
24
 
21
- ## LangGraph Quick Start
25
+ ## Quick Start
26
+
27
+ LangChain tools work directly:
22
28
 
23
29
  ```ts
30
+ import { tool } from "@langchain/core/tools";
24
31
  import { betterTools } from "@botbotgo/better-call";
32
+ import { z } from "zod";
25
33
 
26
- // Validate + block: stop bad calls before execution.
27
- const tools = betterTools([searchTool, calculatorTool]);
28
- ```
29
-
30
- Pass a repair model to let BetterCall fix rejected calls automatically. This can be the same chat model your agent uses, or a separate cheaper/stronger model dedicated to repair:
31
-
32
- ```ts
33
- // Validate + repair: validate, repair with a model, validate again, then execute.
34
- const tools = betterTools([searchTool, calculatorTool], {
35
- repairModel: model,
34
+ const searchTool = tool(async ({ query }) => search(query), {
35
+ name: "search",
36
+ description: "Search the web.",
37
+ schema: z.object({ query: z.string() }),
36
38
  });
37
- ```
38
39
 
39
- ## Run The BFCL Benchmark
40
-
41
- ```bash
42
- npm run bench:bfcl
40
+ const tools = betterTools([searchTool]);
43
41
  ```
44
42
 
45
- This prints the BFCL v4 targeted weak-category table used above. It is a BetterCall wrapper benchmark, not an official leaderboard submission.
46
-
47
- For the full official BFCL v4 reproduction, use Berkeley's published checkpoint/package: commit `f7cf735` or `pip install bfcl-eval==2025.12.17`.
43
+ The same wrapper works for any tool with `name`, `schema`, and `invoke(input)`:
48
44
 
49
- To run the real-model benchmark against your own Ollama endpoint, install the BFCL package and point BetterCall at the package data:
50
-
51
- ```bash
52
- python3 -m venv /tmp/better-call-bfcl-venv
53
- /tmp/better-call-bfcl-venv/bin/pip install "bfcl-eval==2025.12.17" soundfile
45
+ ```ts
46
+ import { betterTools } from "@botbotgo/better-call";
54
47
 
55
- OLLAMA_BASE_URL=http://127.0.0.1:11434 \
56
- BENCH_MODELS=qwen3.5:0.8b \
57
- BENCH_CATEGORIES=all \
58
- BENCH_CASES_PER_CATEGORY=0 \
59
- npm run bench:bfcl:real
48
+ // Validate and block bad calls before execution.
49
+ const tools = betterTools([searchTool, calculatorTool]);
60
50
  ```
61
51
 
62
- For long categories, resume or shard a category with `BENCH_CASE_OFFSET` and `BENCH_CASES_PER_CATEGORY`; the benchmark still uses real model calls and counts request errors/timeouts as incorrect.
52
+ To repair rejected calls automatically, pass a LangChain chat model or any model with `invoke(input)`:
53
+
54
+ ```ts
55
+ import { ChatOpenAI } from "@langchain/openai";
63
56
 
64
- For a model/category matrix run, set `OLLAMA_BASE_URL` and run:
57
+ const repairModel = new ChatOpenAI({ model: "gpt-4.1-mini" });
65
58
 
66
- ```bash
67
- OLLAMA_BASE_URL=http://127.0.0.1:11434 npm run bench:bfcl:remote-small-all
59
+ const tools = betterTools([searchTool, calculatorTool], {
60
+ repairModel,
61
+ });
68
62
  ```
69
63
 
70
- The runner does real `/api/chat` tool-call requests. Benchmark JSON redacts the endpoint by default; set `BENCH_SHOW_ENDPOINT=1` only for private debugging.
64
+ BetterCall validates, repairs rejected calls, validates again, and only then invokes the original tool.
71
65
 
72
66
  ## What It Catches
73
67
 
74
- | Category | Failures | Example |
75
- | --- | --- | --- |
76
- | Tool selection | Unknown tool | `stock_price` instead of `stock_quote` |
77
- | Tool selection | Irrelevant call | Model calls a tool when no tool should be used |
78
- | Arguments | Missing required arg | Missing required `ticker` |
79
- | Arguments | Wrong arg name | `symbol` instead of `ticker` |
80
- | Arguments | Wrong type | `"3"` where an integer is required |
81
- | Schema | Invalid enum | `NASDAQ` where only `US`, `HK`, `CN` are allowed |
82
- | Schema | Extra arg | `currency` when `additionalProperties: false` |
83
- | Policy | Semantic validator rejection | Domain-specific validator rejects unsafe args |
84
-
85
- In validate + block mode, BetterCall rejects these calls before execution. With `repairModel`, it asks the model to fix rejected calls, validates again, and only then executes.
68
+ | Area | Examples |
69
+ | --- | --- |
70
+ | Tool selection | Unknown tools, irrelevant tool calls |
71
+ | Arguments | Missing required args, wrong arg names, extra args |
72
+ | Schema | Wrong types, invalid enums, `additionalProperties: false` violations |
73
+ | Policy | Expected no tool call, expected some tool call |
74
+ | Semantic validation | Domain-specific validator rejects unsafe args |
86
75
 
87
76
  ## API
88
77
 
89
- ### `betterTools`
78
+ ### `betterTools(tools, options?)`
90
79
 
91
- Wrap a LangGraph-style tools array.
80
+ Wraps an existing tool array. Each tool must expose `name` and `invoke(input)`. BetterCall preserves the original tool shape and wraps `invoke`.
92
81
 
93
82
  ```ts
94
- // Validate + block.
95
- const tools = betterTools([searchTool, calculatorTool]);
83
+ const guarded = betterTools([searchTool]);
96
84
 
97
- // Validate + repair.
98
- const toolsWithRepair = betterTools([searchTool, calculatorTool], { repairModel: model });
85
+ const repaired = betterTools([searchTool], {
86
+ repairModel: model,
87
+ });
99
88
  ```
100
89
 
101
- `options` is optional. Each tool must expose `name` and `invoke(input)`. BetterCall preserves each tool's shape and wraps `invoke`.
90
+ Options:
91
+
92
+ | Option | Purpose |
93
+ | --- | --- |
94
+ | `repairModel` | Model used by the default repair prompt/parser |
95
+ | `repair` | Custom repair function |
96
+ | `mode` | `"guard"`, `"repair"`, or `"review"` |
97
+ | `policy` | Expected call policy, such as `expected: "none"` |
98
+ | `validate` | Custom semantic validator |
99
+ | `schema` | Override the wrapped tool schema |
100
+ | `userInput` | Original user input or a function that derives it from tool args |
102
101
 
103
- Tool schemas can be plain JSON Schema, Zod object schemas, or Zod-shaped records:
102
+ Modes:
103
+
104
+ | Mode | Behavior |
105
+ | --- | --- |
106
+ | no model / `"guard"` | Validate and block unsafe calls |
107
+ | `"repair"` or `repairModel` | Repair rejected calls, then validate again |
108
+ | `"review"` | Ask for a full self-check even when calls pass schema |
109
+
110
+ Tool schemas can be JSON Schema, Zod object schemas, or Zod-shaped records:
104
111
 
105
112
  ```ts
106
113
  import { z } from "zod";
@@ -117,121 +124,61 @@ const tools = betterTools([
117
124
  ]);
118
125
  ```
119
126
 
120
- BetterCall converts Zod schemas to JSON Schema before validation and repair. If your runtime already converts schemas, passing JSON Schema directly remains the lowest-dependency path.
127
+ Lower-level exports are available for custom runtimes:
121
128
 
122
- The lower-level `guardToolCalls(...)` and `reliableToolCalls(...)` APIs accept the same schema shapes in `ToolDefinition.schema`. For custom runtime adapters, `normalizeToolSchema(schema)` is also exported so tool metadata can share BetterCall's exact conversion behavior.
129
+ - `guardToolCalls(...)`
130
+ - `reliableToolCalls(...)`
131
+ - `normalizeToolSchema(schema)`
132
+ - `defaultRepair(model)`
133
+ - `BetterToolValidationError`
123
134
 
124
- Without `repairModel` or `repair`, BetterCall validates and blocks unsafe calls instead of fixing them. `repairModel` only needs an `invoke(input)` method, such as a LangChain chat model. If it is provided, BetterCall supplies the repair prompt and JSON parser.
135
+ ## Benchmarks
125
136
 
126
- Modes:
127
-
128
- | Mode | Behavior |
129
- | --- | --- |
130
- | no model | Validate and block only |
131
- | `repairModel` | Validate, repair rejected calls, then validate again |
132
- | custom `repair` | Use your own repair function |
133
- | `review` | Ask for a full self-check even when calls pass schema |
137
+ Run the bundled targeted BFCL wrapper benchmark:
134
138
 
135
- Default recommendation: start with validate + block, then add `repairModel` for small models or unreliable tool callers. `review` is more expensive and model-dependent.
139
+ ```bash
140
+ npm run bench:bfcl
141
+ ```
136
142
 
137
- `irrelevance` is one validation failure type: the model called a tool when no tool should be called. BetterCall also validates tool names, argument names, JSON schema, types, enums, and semantic validators.
143
+ Run real-model BFCL v4 calls against your Ollama endpoint:
138
144
 
139
- ## Benchmark
145
+ ```bash
146
+ python3 -m venv /tmp/better-call-bfcl-venv
147
+ /tmp/better-call-bfcl-venv/bin/pip install "bfcl-eval==2025.12.17" soundfile
140
148
 
141
- Measured with real Ollama `/api/chat` calls over all supported BFCL v4 single-turn tool-call categories. Request errors and timeouts count as incorrect. This is **not an official BFCL leaderboard score**; it measures BetterCall as a runtime reliability layer.
149
+ OLLAMA_BASE_URL=http://127.0.0.1:11434 \
150
+ BENCH_MODELS=qwen3.5:0.8b \
151
+ BENCH_CATEGORIES=all \
152
+ BENCH_CASES_PER_CATEGORY=0 \
153
+ npm run bench:bfcl:real
154
+ ```
142
155
 
143
- Latest completed remote run artifact: `benchmarks/bfcl-real-remote-completed-summary.json`.
156
+ Run the small-model matrix:
144
157
 
145
- Performance after wrapping the same model outputs with BetterCall:
146
-
147
- ```text
148
- granite4.1:3b
149
- Raw 73.4% | #############################...........
150
- BetterCall 83.8% | ##################################......
151
- qwen2.5:7b-instruct
152
- Raw 72.2% | #############################...........
153
- BetterCall 78.2% | ###############################.........
154
- qwen3:0.6b
155
- Raw 55.5% | ######################..................
156
- BetterCall 63.6% | #########################...............
157
- qwen3.5:0.8b
158
- Raw 54.6% | ######################..................
159
- BetterCall 56.9% | #######################.................
160
- qwen3.5:2b
161
- Raw 53.9% | ######################..................
162
- BetterCall 54.9% | ######################..................
163
- lfm2.5-thinking:latest
164
- Raw 50.8% | ####################....................
165
- BetterCall 54.8% | ######################..................
166
- qwen3.5:4b
167
- Raw 43.6% | #################.......................
168
- BetterCall 43.4% | #################.......................
169
- gemma4:e2b
170
- Raw 24.3% | ##########..............................
171
- BetterCall 24.7% | ##########..............................
158
+ ```bash
159
+ OLLAMA_BASE_URL=http://127.0.0.1:11434 npm run bench:bfcl:remote-small-all
172
160
  ```
173
161
 
174
- | Rank | Model | Completed cases | Raw model | BetterCall | Lift | Request errors |
175
- | ---: | --- | ---: | ---: | ---: | ---: | ---: |
176
- | 1 | `granite4.1:3b` | 3,625 | 73.4% | 83.8% | +10.4pp | 25 |
177
- | 2 | `qwen2.5:7b-instruct` | 3,625 | 72.2% | 78.2% | +5.9pp | 80 |
178
- | 3 | `qwen3:0.6b` | 3,625 | 55.5% | 63.6% | +8.2pp | 217 |
179
- | 4 | `qwen3.5:0.8b` | 3,625 | 54.6% | 56.9% | +2.3pp | 901 |
180
- | 5 | `qwen3.5:2b` | 3,625 | 53.9% | 54.9% | +1.0pp | 1,308 |
181
- | 6 | `lfm2.5-thinking:latest` | 3,625 | 50.8% | 54.8% | +4.0pp | 1,142 |
182
- | 7 | `qwen3.5:4b` | 3,625 | 43.6% | 43.4% | -0.2pp | 1,847 |
183
- | 8 | `gemma4:e2b` | 3,625 | 24.3% | 24.7% | +0.4pp | 2,641 |
162
+ Notes:
184
163
 
185
- Latest completed model category detail: `qwen3.5:4b`.
164
+ - These are BetterCall wrapper benchmarks, not official BFCL leaderboard submissions.
165
+ - Full official BFCL v4 reproduction should use Berkeley's published checkpoint/package: commit `f7cf735` or `bfcl-eval==2025.12.17`.
166
+ - Real runs use Ollama `/api/chat` tool-call requests.
167
+ - Request errors and timeouts count as incorrect.
168
+ - Benchmark JSON redacts endpoints by default. Set `BENCH_SHOW_ENDPOINT=1` only for private debugging.
169
+
170
+ Latest completed remote run artifact: `benchmarks/bfcl-real-remote-completed-summary.json`.
186
171
 
187
- | Category | Cases | Raw | BetterCall repair | Lift | Request errors |
172
+ | Model | Cases | Raw | BetterCall | Lift | Request errors |
188
173
  | --- | ---: | ---: | ---: | ---: | ---: |
189
- | `simple_python` | 400 | 81.3% | 81.3% | +0.0pp | 54 |
190
- | `simple_java` | 100 | 56.0% | 56.0% | +0.0pp | 32 |
191
- | `simple_javascript` | 50 | 48.0% | 48.0% | +0.0pp | 18 |
192
- | `multiple` | 200 | 83.5% | 83.5% | +0.0pp | 20 |
193
- | `parallel` | 200 | 70.0% | 70.0% | +0.0pp | 45 |
194
- | `parallel_multiple` | 200 | 47.0% | 47.0% | +0.0pp | 96 |
195
- | `irrelevance` | 240 | 68.8% | 68.8% | +0.0pp | 75 |
196
- | `live_simple` | 258 | 66.7% | 66.3% | -0.4pp | 45 |
197
- | `live_multiple` | 1,053 | 41.6% | 41.0% | -0.6pp | 538 |
198
- | `live_parallel` | 16 | 0.0% | 0.0% | +0.0pp | 16 |
199
- | `live_parallel_multiple` | 24 | 0.0% | 0.0% | +0.0pp | 24 |
200
- | `live_irrelevance` | 884 | 0.0% | 0.0% | +0.0pp | 884 |
201
-
202
- This `qwen3.5:4b` run hit sustained remote request failures in the live categories; those failures are counted as incorrect by the benchmark.
203
-
204
- Historical targeted wrapper benchmark:
205
-
206
- | Model | Raw | BetterCall repair | Accuracy lift |
207
- | --- | ---: | ---: | ---: |
208
- | `gemma4:e2b` | 81.3% | 91.3% | +10.0pp |
209
- | `qwen3.5:2b` | 75.3% | 84.0% | +8.7pp |
210
- | `qwen3.5:9b` | 84.0% | 90.0% | +6.0pp |
211
- | `qwen3.5:4b` | 82.0% | 87.3% | +5.3pp |
212
- | `granite4.1:3b` | 66.0% | 69.3% | +3.3pp |
213
-
214
- Strongest result: BFCL `irrelevance`, where the model should not call any tool.
215
-
216
- | Model | Raw irrelevance | BetterCall repair |
217
- | --- | ---: | ---: |
218
- | `qwen3.5:2b` | 74% | 100% |
219
- | `qwen3.5:4b` | 84% | 100% |
220
- | `qwen3.5:9b` | 84% | 100% |
221
- | `granite4.1:3b` | 92% | 100% |
222
- | `gemma4:e2b` | 70% | 100% |
223
-
224
- ## Why It Exists
225
-
226
- Small models are useful because they are cheap and fast. They also make tool mistakes:
227
-
228
- - call a tool that does not exist
229
- - fill the wrong parameter names
230
- - pass the wrong types
231
- - call tools when no tool is relevant
232
- - produce a call that looks valid but is unsafe to execute
233
-
234
- BetterCall reduces those failures before they reach production tools.
174
+ | `granite4.1:3b` | 3,625 | 73.4% | 83.8% | +10.4pp | 25 |
175
+ | `qwen2.5:7b-instruct` | 3,625 | 72.2% | 78.2% | +5.9pp | 80 |
176
+ | `qwen3:0.6b` | 3,625 | 55.5% | 63.6% | +8.2pp | 217 |
177
+ | `qwen3.5:0.8b` | 3,625 | 54.6% | 56.9% | +2.3pp | 901 |
178
+ | `qwen3.5:2b` | 3,625 | 53.9% | 54.9% | +1.0pp | 1,308 |
179
+ | `lfm2.5-thinking:latest` | 3,625 | 50.8% | 54.8% | +4.0pp | 1,142 |
180
+ | `qwen3.5:4b` | 3,625 | 43.6% | 43.4% | -0.2pp | 1,847 |
181
+ | `gemma4:e2b` | 3,625 | 24.3% | 24.7% | +0.4pp | 2,641 |
235
182
 
236
183
  ## License
237
184
 
@@ -1,5 +1,5 @@
1
1
  import { type RepairModelLike } from "./default-repair.js";
2
- import type { GuardPolicy, RepairFunction, SemanticValidator, ToolCallIssue } from "./types.js";
2
+ import type { GuardPolicy, RepairFunction, RepairPolicy, SemanticValidator, ToolCallIssue } from "./types.js";
3
3
  export type BetterToolLike = {
4
4
  name: string;
5
5
  description?: string;
@@ -13,6 +13,7 @@ export type BetterToolsOptions = {
13
13
  repairModel?: RepairModelLike;
14
14
  repair?: RepairFunction;
15
15
  policy?: GuardPolicy;
16
+ repairPolicy?: RepairPolicy;
16
17
  mode?: "guard" | "repair" | "review";
17
18
  };
18
19
  export declare class BetterToolValidationError extends Error {
@@ -23,7 +23,9 @@ function wrapOneTool(tool, options) {
23
23
  tools: [toToolDefinition(tool, options)],
24
24
  calls: [{ tool: tool.name, args }],
25
25
  policy: options.policy,
26
+ repairPolicy: options.repairPolicy,
26
27
  repair: resolveRepair(options),
28
+ repairSource: options.repairModel && !options.repair ? "model" : "custom",
27
29
  mode: options.mode,
28
30
  });
29
31
  if (!result.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"better-tool.js","sourceRoot":"","sources":["../src/better-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"better-tool.js","sourceRoot":"","sources":["../src/better-tool.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,8 +2,8 @@ export { guardToolCalls } from "./guard.js";
2
2
  export { buildRepairPrompt, buildReviewPrompt } from "./prompts.js";
3
3
  export { defaultRepair } from "./default-repair.js";
4
4
  export type { RepairModelLike } from "./default-repair.js";
5
- export { normalizeToolSchema } from "./schema.js";
5
+ export { extractSchemaDescriptor, normalizeArgsBySchema, normalizeToolSchema } from "./schema.js";
6
6
  export { reliableToolCalls } from "./reliable.js";
7
7
  export { BetterToolValidationError, betterTools } from "./better-tool.js";
8
8
  export type { BetterToolLike, BetterToolsOptions } from "./better-tool.js";
9
- export type { GuardPolicy, GuardResult, IssueKind, JsonSchema, ReliableToolCallsInput, ReliableToolCallsResult, RepairFunction, RepairInput, SemanticValidator, ToolCall, ToolCallIssue, ToolDefinition, ToolSchema, } from "./types.js";
9
+ export type { GuardPolicy, GuardResult, IssueKind, JsonSchema, ArgsNormalizationOptions, ArgsNormalizationResult, ReliableToolCallsInput, ReliableToolCallsResult, RepairDiagnostics, RepairFunction, RepairInput, RepairPolicy, RepairProposal, SchemaDescriptor, SemanticValidator, ToolCall, ToolCallIssue, ToolDefinition, ToolSchema, } from "./types.js";
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { guardToolCalls } from "./guard.js";
2
2
  export { buildRepairPrompt, buildReviewPrompt } from "./prompts.js";
3
3
  export { defaultRepair } from "./default-repair.js";
4
- export { normalizeToolSchema } from "./schema.js";
4
+ export { extractSchemaDescriptor, normalizeArgsBySchema, normalizeToolSchema } from "./schema.js";
5
5
  export { reliableToolCalls } from "./reliable.js";
6
6
  export { BetterToolValidationError, betterTools } from "./better-tool.js";
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/reliable.js CHANGED
@@ -1,26 +1,131 @@
1
1
  import { guardToolCalls } from "./guard.js";
2
- import { normalizeToolSchema } from "./schema.js";
2
+ import { normalizeArgsBySchema, normalizeToolSchema } from "./schema.js";
3
3
  export async function reliableToolCalls(input) {
4
4
  const mode = input.mode ?? "repair";
5
5
  const tools = normalizeTools(input.tools);
6
6
  const first = await guardToolCalls({ ...input, tools });
7
- const shouldRepair = Boolean(input.repair) && (mode === "review" || (mode === "repair" && !first.ok));
7
+ const diagnostics = [];
8
+ let repairBaseCalls = input.calls;
9
+ let repairBaseIssues = first.issues;
10
+ if (mode === "repair" && !first.ok) {
11
+ const schemaRepair = await proposeSchemaRepair(input.calls, tools, first.issues, input.repairPolicy);
12
+ if (schemaRepair) {
13
+ const accepted = await acceptProposal(schemaRepair, input.repairPolicy);
14
+ if (accepted && schemaRepair.issuesAfter.length === 0) {
15
+ return {
16
+ ok: true,
17
+ calls: schemaRepair.proposed,
18
+ issues: [],
19
+ repaired: true,
20
+ original: input.calls,
21
+ diagnostics: [schemaRepair.diagnostics],
22
+ };
23
+ }
24
+ if (accepted) {
25
+ diagnostics.push(schemaRepair.diagnostics);
26
+ repairBaseCalls = schemaRepair.proposed;
27
+ repairBaseIssues = schemaRepair.issuesAfter;
28
+ }
29
+ }
30
+ }
31
+ const allowModelRepair = input.repairPolicy?.allowModelRepair ?? true;
32
+ const repairSource = input.repairSource ?? "custom";
33
+ const repairAllowed = repairSource === "model" ? allowModelRepair : true;
34
+ const shouldRepair = repairAllowed && Boolean(input.repair) && (mode === "review" || (mode === "repair" && !first.ok));
8
35
  if (!shouldRepair)
9
- return { ...first, repaired: false, original: input.calls };
36
+ return { ...first, repaired: false, original: input.calls, diagnostics };
10
37
  const repairedCalls = await input.repair({
11
38
  userInput: input.userInput,
12
39
  tools,
13
- calls: input.calls,
14
- issues: first.issues,
40
+ calls: repairBaseCalls,
41
+ issues: repairBaseIssues,
15
42
  });
16
43
  const second = await guardToolCalls({ ...input, tools, calls: normalizeCalls(repairedCalls) });
17
- return second.ok
18
- ? { ...second, repaired: true, original: input.calls }
19
- : { ...first, repaired: false, original: input.calls };
44
+ const modelDiagnostics = createDiagnostics(repairSource, repairBaseCalls, second.calls, repairBaseIssues, second.issues);
45
+ const modelProposal = {
46
+ source: modelDiagnostics.source,
47
+ original: repairBaseCalls,
48
+ proposed: second.calls,
49
+ diagnostics: modelDiagnostics,
50
+ issuesBefore: repairBaseIssues,
51
+ issuesAfter: second.issues,
52
+ };
53
+ if (second.ok && await acceptProposal(modelProposal, input.repairPolicy)) {
54
+ return { ...second, repaired: true, original: input.calls, diagnostics: [...diagnostics, modelDiagnostics] };
55
+ }
56
+ return { ...first, repaired: false, original: input.calls, diagnostics };
20
57
  }
21
58
  function normalizeTools(tools) {
22
59
  return tools.map((tool) => ({ ...tool, schema: normalizeToolSchema(tool.schema) }));
23
60
  }
61
+ async function proposeSchemaRepair(calls, tools, issuesBefore, policy) {
62
+ if (!hasSchemaRepairPolicy(policy))
63
+ return undefined;
64
+ const changedPaths = [];
65
+ const proposed = calls.map((call, index) => {
66
+ const tool = tools.find((item) => item.name === call.tool);
67
+ if (!tool)
68
+ return call;
69
+ const normalized = normalizeArgsBySchema(tool.schema, call.args, policy);
70
+ changedPaths.push(...normalized.changedPaths.map((path) => path.replace("$", `$.calls[${index}].args`)));
71
+ return normalized.changedPaths.length > 0 ? { ...call, args: normalized.args } : call;
72
+ });
73
+ if (changedPaths.length === 0)
74
+ return undefined;
75
+ const after = await guardToolCalls({ tools, calls: proposed });
76
+ const diagnostics = {
77
+ source: "schema",
78
+ changedPaths,
79
+ repairReason: "schema-derived argument normalization",
80
+ confidence: 1,
81
+ issuesBefore,
82
+ issuesAfter: after.issues,
83
+ };
84
+ return {
85
+ source: "schema",
86
+ original: calls,
87
+ proposed,
88
+ diagnostics,
89
+ issuesBefore: issuesBefore ?? [],
90
+ issuesAfter: after.issues,
91
+ };
92
+ }
93
+ function hasSchemaRepairPolicy(policy) {
94
+ return Boolean(policy?.allowCoercion ||
95
+ policy?.allowClamp ||
96
+ policy?.allowDropUnknownKeys ||
97
+ policy?.allowArrayStringSplit);
98
+ }
99
+ async function acceptProposal(proposal, policy) {
100
+ return policy?.onProposedRepair ? policy.onProposedRepair(proposal) : true;
101
+ }
102
+ function createDiagnostics(source, original, proposed, issuesBefore, issuesAfter) {
103
+ return {
104
+ source,
105
+ changedPaths: diffCallPaths(original, proposed),
106
+ repairReason: source === "schema" ? "schema-derived argument normalization" : "repair function proposal",
107
+ issuesBefore,
108
+ issuesAfter,
109
+ };
110
+ }
111
+ function diffCallPaths(original, proposed) {
112
+ const paths = [];
113
+ for (let index = 0; index < Math.max(original.length, proposed.length); index += 1) {
114
+ const before = original[index];
115
+ const after = proposed[index];
116
+ if (!before || !after) {
117
+ paths.push(`$.calls[${index}]`);
118
+ continue;
119
+ }
120
+ if (before.tool !== after.tool)
121
+ paths.push(`$.calls[${index}].tool`);
122
+ for (const key of new Set([...Object.keys(before.args), ...Object.keys(after.args)])) {
123
+ if (!Object.is(before.args[key], after.args[key]))
124
+ paths.push(`$.calls[${index}].args.${key}`);
125
+ }
126
+ }
127
+ return paths;
128
+ }
24
129
  function normalizeCalls(calls) {
25
130
  return calls.filter((call) => call && typeof call.tool === "string" && isRecord(call.args));
26
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reliable.js","sourceRoot":"","sources":["../src/reliable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA6B;IACnE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC;IACpC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACtG,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAC/E,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,MAAO,CAAC;QACxC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC/F,OAAO,MAAM,CAAC,EAAE;QACd,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE;QACtD,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,cAAc,CAAC,KAAuB;IAC7C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,cAAc,CAAC,KAAiB;IACvC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"reliable.js","sourceRoot":"","sources":["../src/reliable.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -1,3 +1,5 @@
1
- import type { JsonSchema, ToolCallIssue, ToolSchema } from "./types.js";
1
+ import type { ArgsNormalizationOptions, ArgsNormalizationResult, JsonSchema, SchemaDescriptor, ToolCallIssue, ToolSchema } from "./types.js";
2
2
  export declare function normalizeToolSchema(schema: ToolSchema | unknown): JsonSchema | undefined;
3
+ export declare function extractSchemaDescriptor(schema: ToolSchema | unknown): SchemaDescriptor | undefined;
4
+ export declare function normalizeArgsBySchema(schema: ToolSchema | unknown, args: Record<string, unknown>, options?: ArgsNormalizationOptions): ArgsNormalizationResult;
3
5
  export declare function validateSchema(schema: JsonSchema | undefined, value: unknown, path?: string): ToolCallIssue[];
package/dist/schema.js CHANGED
@@ -8,6 +8,18 @@ export function normalizeToolSchema(schema) {
8
8
  return schema;
9
9
  return undefined;
10
10
  }
11
+ export function extractSchemaDescriptor(schema) {
12
+ const normalized = normalizeToolSchema(schema);
13
+ return normalized ? describeJsonSchema(normalized) : undefined;
14
+ }
15
+ export function normalizeArgsBySchema(schema, args, options = {}) {
16
+ const normalized = normalizeToolSchema(schema);
17
+ if (!normalized || !isObjectSchema(normalized))
18
+ return { args, changedPaths: [] };
19
+ const changedPaths = [];
20
+ const next = normalizeObjectArgs(normalized, args, "$", options, changedPaths);
21
+ return { args: next, changedPaths };
22
+ }
11
23
  export function validateSchema(schema, value, path = "$") {
12
24
  if (!schema)
13
25
  return [];
@@ -52,6 +64,120 @@ function validateObject(schema, value, path) {
52
64
  }
53
65
  return issues;
54
66
  }
67
+ function describeJsonSchema(schema) {
68
+ const descriptor = {
69
+ type: schema.type,
70
+ enum: schema.enum,
71
+ additionalProperties: schema.additionalProperties,
72
+ };
73
+ if (includesType(schema.type, "integer"))
74
+ descriptor.integer = true;
75
+ if (schema.items)
76
+ descriptor.items = describeJsonSchema(schema.items);
77
+ if (isRecord(schema)) {
78
+ const maybeMinimum = schema.minimum;
79
+ const maybeMaximum = schema.maximum;
80
+ const maybeExclusiveMinimum = schema.exclusiveMinimum;
81
+ const maybeExclusiveMaximum = schema.exclusiveMaximum;
82
+ if (typeof maybeMinimum === "number")
83
+ descriptor.minimum = maybeMinimum;
84
+ if (typeof maybeMaximum === "number")
85
+ descriptor.maximum = maybeMaximum;
86
+ if (typeof maybeExclusiveMinimum === "number")
87
+ descriptor.minimum = maybeExclusiveMinimum;
88
+ if (typeof maybeExclusiveMaximum === "number")
89
+ descriptor.maximum = maybeExclusiveMaximum;
90
+ if (schema.format === "finite")
91
+ descriptor.finite = true;
92
+ if (Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf)) {
93
+ for (const item of [...(schema.anyOf ?? []), ...(schema.oneOf ?? [])]) {
94
+ if (isRecord(item) && item.type === "null")
95
+ descriptor.nullable = true;
96
+ }
97
+ }
98
+ }
99
+ if (isObjectSchema(schema)) {
100
+ descriptor.required = schema.required ?? [];
101
+ descriptor.properties = Object.fromEntries(Object.entries(schema.properties ?? {}).map(([key, property]) => [key, {
102
+ ...describeJsonSchema(property),
103
+ optional: !(schema.required ?? []).includes(key),
104
+ }]));
105
+ }
106
+ return descriptor;
107
+ }
108
+ function normalizeObjectArgs(schema, args, path, options, changedPaths) {
109
+ let next = { ...args };
110
+ const properties = schema.properties ?? {};
111
+ if (options.allowDropUnknownKeys && schema.additionalProperties === false) {
112
+ for (const key of Object.keys(next)) {
113
+ if (!(key in properties)) {
114
+ delete next[key];
115
+ addChangedPath(changedPaths, `${path}.${key}`);
116
+ }
117
+ }
118
+ }
119
+ for (const [key, property] of Object.entries(properties)) {
120
+ if (!(key in next))
121
+ continue;
122
+ const before = next[key];
123
+ const after = normalizeValueBySchema(property, before, `${path}.${key}`, options, changedPaths);
124
+ if (after !== before)
125
+ next = { ...next, [key]: after };
126
+ }
127
+ return next;
128
+ }
129
+ function normalizeValueBySchema(schema, value, path, options, changedPaths) {
130
+ let next = value;
131
+ if (options.allowArrayStringSplit && schema.type === "array" && schema.items?.type === "string" && typeof next === "string") {
132
+ next = splitShellLikeString(next);
133
+ addChangedPath(changedPaths, path);
134
+ }
135
+ if (options.allowCoercion && expectsNumber(schema) && typeof next === "string" && next.trim() !== "") {
136
+ const numeric = Number(next);
137
+ if (Number.isFinite(numeric)) {
138
+ next = numeric;
139
+ addChangedPath(changedPaths, path);
140
+ }
141
+ }
142
+ if (options.allowCoercion && expectsInteger(schema) && typeof next === "number" && Number.isFinite(next)) {
143
+ const integer = Math.trunc(next);
144
+ if (integer !== next && Math.abs(next - integer) < Number.EPSILON * 100) {
145
+ next = integer;
146
+ addChangedPath(changedPaths, path);
147
+ }
148
+ }
149
+ if (options.allowClamp && typeof next === "number" && Number.isFinite(next)) {
150
+ const minimum = readNumber(schema, "minimum");
151
+ const maximum = readNumber(schema, "maximum");
152
+ const clamped = Math.min(maximum ?? next, Math.max(minimum ?? next, next));
153
+ if (clamped !== next) {
154
+ next = clamped;
155
+ addChangedPath(changedPaths, path);
156
+ }
157
+ }
158
+ if (isObjectSchema(schema) && isRecord(next)) {
159
+ return normalizeObjectArgs(schema, next, path, options, changedPaths);
160
+ }
161
+ return next;
162
+ }
163
+ function expectsNumber(schema) {
164
+ return includesType(schema.type, "number") || includesType(schema.type, "integer");
165
+ }
166
+ function expectsInteger(schema) {
167
+ return includesType(schema.type, "integer");
168
+ }
169
+ function readNumber(schema, key) {
170
+ const value = schema[key];
171
+ return typeof value === "number" ? value : undefined;
172
+ }
173
+ function splitShellLikeString(value) {
174
+ const result = value.match(/"([^"]*)"|'([^']*)'|[^\s]+/gu) ?? [];
175
+ return result.map((item) => item.replace(/^["']|["']$/gu, ""));
176
+ }
177
+ function addChangedPath(paths, path) {
178
+ if (!paths.includes(path))
179
+ paths.push(path);
180
+ }
55
181
  function isObjectSchema(schema) {
56
182
  return includesType(schema.type, "object") || Boolean(schema.properties);
57
183
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAUzB,MAAM,UAAU,mBAAmB,CAAC,MAA4B;IAC9D,IAAI,WAAW,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC,YAAY,CAAC,MAAM,CAAe,CAAC;IACrE,IAAI,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAe,CAAC;IAC9E,IAAI,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAA4B;IAClE,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAA4B,EAC5B,IAA6B,EAC7B,UAAoC,EAAE;IAEtC,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAClF,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,mBAAmB,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC/E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAA8B,EAAE,KAAc,EAAE,IAAI,GAAG,GAAG;IACvF,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC;gBACN,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC;gBAChC,IAAI;gBACJ,OAAO,EAAE,cAAc;gBACvB,QAAQ,EAAE,MAAM,CAAC,IAAI;gBACrB,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAChF,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACpE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1G,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB,EAAE,KAAc,EAAE,IAAY;IACtE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACpH,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,IAAI,GAAG,IAAI,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,MAAM,CAAC,oBAAoB,KAAK,KAAK,EAAE,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAkB;IAC5C,MAAM,UAAU,GAAqB;QACnC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;KAClD,CAAC;IACF,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;QAAE,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;IACpE,IAAI,MAAM,CAAC,KAAK;QAAE,UAAU,CAAC,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;QACpC,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;QACpC,MAAM,qBAAqB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACtD,MAAM,qBAAqB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACtD,IAAI,OAAO,YAAY,KAAK,QAAQ;YAAE,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC;QACxE,IAAI,OAAO,YAAY,KAAK,QAAQ;YAAE,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC;QACxE,IAAI,OAAO,qBAAqB,KAAK,QAAQ;YAAE,UAAU,CAAC,OAAO,GAAG,qBAAqB,CAAC;QAC1F,IAAI,OAAO,qBAAqB,KAAK,QAAQ;YAAE,UAAU,CAAC,OAAO,GAAG,qBAAqB,CAAC;QAC1F,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;QACzD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACtE,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;oBAAE,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,UAAU,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5C,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CACxC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE;gBACrE,GAAG,kBAAkB,CAAC,QAAQ,CAAC;gBAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;aACjD,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAkB,EAClB,IAA6B,EAC7B,IAAY,EACZ,OAAiC,EACjC,YAAsB;IAEtB,IAAI,IAAI,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,oBAAoB,IAAI,MAAM,CAAC,oBAAoB,KAAK,KAAK,EAAE,CAAC;QAC1E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjB,cAAc,CAAC,YAAY,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC;YAAE,SAAS;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;QAChG,IAAI,KAAK,KAAK,MAAM;YAAE,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAAkB,EAClB,KAAc,EACd,IAAY,EACZ,OAAiC,EACjC,YAAsB;IAEtB,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,OAAO,CAAC,qBAAqB,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5H,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAClC,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrG,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,IAAI,GAAG,OAAO,CAAC;YACf,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,aAAa,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzG,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;YACxE,IAAI,GAAG,OAAO,CAAC;YACf,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3E,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,GAAG,OAAO,CAAC;YACf,cAAc,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,mBAAmB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,MAAkB;IACvC,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB;IACxC,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,MAAkB,EAAE,GAA0B;IAChE,MAAM,KAAK,GAAI,MAAkC,CAAC,GAAG,CAAC,CAAC;IACvD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,IAAI,EAAE,CAAC;IACjE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,KAAe,EAAE,IAAY;IACnD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,MAAkB;IACxC,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,WAAW,CAAC,IAAuB,EAAE,KAAc;IAC1D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,KAAc;IACrD,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACxD,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,KAAK,IAAI,CAAC;IAC3C,OAAO,OAAO,KAAK,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,IAAmC,EAAE,QAAgB;IACzE,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzD,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACnE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACxD,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,IAAuB;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AACxH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACrG,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
package/dist/types.d.ts CHANGED
@@ -6,8 +6,29 @@ export type JsonSchema = {
6
6
  enum?: unknown[];
7
7
  items?: JsonSchema;
8
8
  additionalProperties?: boolean;
9
+ minimum?: number;
10
+ maximum?: number;
11
+ exclusiveMinimum?: number;
12
+ exclusiveMaximum?: number;
13
+ format?: string;
14
+ anyOf?: JsonSchema[];
15
+ oneOf?: JsonSchema[];
9
16
  };
10
17
  export type ToolSchema = JsonSchema | z.ZodType | z.ZodRawShape;
18
+ export type SchemaDescriptor = {
19
+ type?: string | string[];
20
+ optional?: boolean;
21
+ nullable?: boolean;
22
+ enum?: unknown[];
23
+ minimum?: number;
24
+ maximum?: number;
25
+ integer?: boolean;
26
+ finite?: boolean;
27
+ items?: SchemaDescriptor;
28
+ properties?: Record<string, SchemaDescriptor>;
29
+ required?: string[];
30
+ additionalProperties?: boolean;
31
+ };
11
32
  export type ToolDefinition = {
12
33
  name: string;
13
34
  description?: string;
@@ -31,6 +52,36 @@ export type GuardPolicy = {
31
52
  expected?: "any" | "none" | "some";
32
53
  allowUnknownTools?: boolean;
33
54
  };
55
+ export type ArgsNormalizationOptions = {
56
+ allowCoercion?: boolean;
57
+ allowClamp?: boolean;
58
+ allowDropUnknownKeys?: boolean;
59
+ allowArrayStringSplit?: boolean;
60
+ };
61
+ export type ArgsNormalizationResult = {
62
+ args: Record<string, unknown>;
63
+ changedPaths: string[];
64
+ };
65
+ export type RepairDiagnostics = {
66
+ changedPaths: string[];
67
+ repairReason?: string;
68
+ source: "schema" | "model" | "custom";
69
+ confidence?: number;
70
+ issuesBefore?: ToolCallIssue[];
71
+ issuesAfter?: ToolCallIssue[];
72
+ };
73
+ export type RepairProposal = {
74
+ source: RepairDiagnostics["source"];
75
+ original: ToolCall[];
76
+ proposed: ToolCall[];
77
+ diagnostics: RepairDiagnostics;
78
+ issuesBefore: ToolCallIssue[];
79
+ issuesAfter: ToolCallIssue[];
80
+ };
81
+ export type RepairPolicy = ArgsNormalizationOptions & {
82
+ allowModelRepair?: boolean;
83
+ onProposedRepair?: (proposal: RepairProposal) => Promise<boolean> | boolean;
84
+ };
34
85
  export type GuardResult = {
35
86
  ok: boolean;
36
87
  calls: ToolCall[];
@@ -52,10 +103,13 @@ export type ReliableToolCallsInput = {
52
103
  tools: ToolDefinition[];
53
104
  calls: ToolCall[];
54
105
  policy?: GuardPolicy;
106
+ repairPolicy?: RepairPolicy;
55
107
  repair?: RepairFunction;
108
+ repairSource?: "model" | "custom";
56
109
  mode?: "guard" | "repair" | "review";
57
110
  };
58
111
  export type ReliableToolCallsResult = GuardResult & {
59
112
  repaired: boolean;
60
113
  original: ToolCall[];
114
+ diagnostics?: RepairDiagnostics[];
61
115
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botbotgo/better-call",
3
- "version": "0.1.16",
3
+ "version": "0.1.18",
4
4
  "description": "LLM tool-call reliability layer.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",