@botbotgo/better-call 0.1.18 → 0.1.20
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 +73 -5
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/inventory-repair.d.ts +3 -0
- package/dist/inventory-repair.js +353 -0
- package/dist/inventory-repair.js.map +1 -0
- package/dist/prompts.js +4 -0
- package/dist/prompts.js.map +1 -1
- package/dist/types.d.ts +32 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -4,9 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
# BetterCall
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
[](https://www.npmjs.com/package/@botbotgo/better-call)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
[](https://github.com/botbotgo/better-call/actions/workflows/release.yml)
|
|
8
10
|
|
|
9
|
-
BetterCall
|
|
11
|
+
BetterCall is a small runtime reliability layer for LangChain and LLM tool calls.
|
|
12
|
+
|
|
13
|
+
Wrap your existing tools, validate model-generated calls before execution, and 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**.
|
|
10
14
|
|
|
11
15
|
```ts
|
|
12
16
|
import { betterTools } from "@botbotgo/better-call";
|
|
@@ -16,7 +20,17 @@ const tools = betterTools([searchTool, calculatorTool]);
|
|
|
16
20
|
|
|
17
21
|
No model means validate and block only. Add `repairModel` when you want automatic repair.
|
|
18
22
|
|
|
19
|
-
##
|
|
23
|
+
## Why BetterCall?
|
|
24
|
+
|
|
25
|
+
Small models often know that a tool is needed but still fail at the boundary: wrong tool names, malformed arguments, schema drift, extra fields, or raw tool-call-shaped text. BetterCall sits at that boundary and gives you a typed, auditable way to accept, repair, or reject the call before the real tool runs.
|
|
26
|
+
|
|
27
|
+
- Use your existing LangChain-style tools.
|
|
28
|
+
- Accept JSON Schema, Zod object schemas, or Zod-shaped records.
|
|
29
|
+
- Block invalid calls when no repair model is configured.
|
|
30
|
+
- Repair rejected calls with a LangChain chat model or custom callback.
|
|
31
|
+
- Keep lower-level primitives available for custom runtimes and gateways.
|
|
32
|
+
|
|
33
|
+
## Installation
|
|
20
34
|
|
|
21
35
|
```bash
|
|
22
36
|
npm install @botbotgo/better-call
|
|
@@ -45,7 +59,6 @@ The same wrapper works for any tool with `name`, `schema`, and `invoke(input)`:
|
|
|
45
59
|
```ts
|
|
46
60
|
import { betterTools } from "@botbotgo/better-call";
|
|
47
61
|
|
|
48
|
-
// Validate and block bad calls before execution.
|
|
49
62
|
const tools = betterTools([searchTool, calculatorTool]);
|
|
50
63
|
```
|
|
51
64
|
|
|
@@ -53,6 +66,7 @@ To repair rejected calls automatically, pass a LangChain chat model or any model
|
|
|
53
66
|
|
|
54
67
|
```ts
|
|
55
68
|
import { ChatOpenAI } from "@langchain/openai";
|
|
69
|
+
import { betterTools } from "@botbotgo/better-call";
|
|
56
70
|
|
|
57
71
|
const repairModel = new ChatOpenAI({ model: "gpt-4.1-mini" });
|
|
58
72
|
|
|
@@ -124,10 +138,46 @@ const tools = betterTools([
|
|
|
124
138
|
]);
|
|
125
139
|
```
|
|
126
140
|
|
|
127
|
-
|
|
141
|
+
### `repairToolCall(input)`
|
|
142
|
+
|
|
143
|
+
Use this at an upstream adapter or tool gateway boundary when the model emitted an invalid tool call, unavailable tool name, or raw tool-call-shaped text before execution:
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
import { repairToolCall } from "@botbotgo/better-call";
|
|
147
|
+
|
|
148
|
+
const repaired = await repairToolCall({
|
|
149
|
+
userInput: "Research this market.",
|
|
150
|
+
visibleTools: [taskTool],
|
|
151
|
+
hiddenTools: blockedTools,
|
|
152
|
+
invalidToolName: "ls",
|
|
153
|
+
args: { name: "research", query: "Research this market." },
|
|
154
|
+
repairModel,
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The result is structured for runtime traces and audit decisions:
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
{
|
|
162
|
+
status: "repaired", // "repaired" | "rejected" | "unchanged"
|
|
163
|
+
toolName: "task",
|
|
164
|
+
args: { subagent_type: "research", description: "Research this market." },
|
|
165
|
+
confidence: 0.8,
|
|
166
|
+
reason: "repair function selected a visible tool and schema-compatible arguments",
|
|
167
|
+
originalToolName: "ls",
|
|
168
|
+
originalArgs: { name: "research", query: "Research this market." },
|
|
169
|
+
violations: []
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
BetterCall only repairs an existing tool call or tool-call-shaped intent. It does not invent a tool call from an ordinary final answer.
|
|
174
|
+
|
|
175
|
+
### Lower-level exports
|
|
128
176
|
|
|
129
177
|
- `guardToolCalls(...)`
|
|
130
178
|
- `reliableToolCalls(...)`
|
|
179
|
+
- `repairToolCall(...)`
|
|
180
|
+
- `parseToolIntent(...)`
|
|
131
181
|
- `normalizeToolSchema(schema)`
|
|
132
182
|
- `defaultRepair(model)`
|
|
133
183
|
- `BetterToolValidationError`
|
|
@@ -180,6 +230,24 @@ Latest completed remote run artifact: `benchmarks/bfcl-real-remote-completed-sum
|
|
|
180
230
|
| `qwen3.5:4b` | 3,625 | 43.6% | 43.4% | -0.2pp | 1,847 |
|
|
181
231
|
| `gemma4:e2b` | 3,625 | 24.3% | 24.7% | +0.4pp | 2,641 |
|
|
182
232
|
|
|
233
|
+
## Requirements
|
|
234
|
+
|
|
235
|
+
BetterCall is an ESM package for modern Node.js runtimes. It has one runtime dependency: `zod`.
|
|
236
|
+
|
|
237
|
+
## Contributing
|
|
238
|
+
|
|
239
|
+
Install dependencies and run the local checks:
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
npm ci
|
|
243
|
+
npm test
|
|
244
|
+
npm run release:pack
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Security
|
|
248
|
+
|
|
249
|
+
If you believe you have found a security issue, please do not include sensitive details in a public issue. Open a minimal report first, or contact the maintainers through the repository owner.
|
|
250
|
+
|
|
183
251
|
## License
|
|
184
252
|
|
|
185
253
|
Apache-2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE).
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,9 @@ 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 { parseToolIntent, repairToolCall } from "./inventory-repair.js";
|
|
5
6
|
export { extractSchemaDescriptor, normalizeArgsBySchema, normalizeToolSchema } from "./schema.js";
|
|
6
7
|
export { reliableToolCalls } from "./reliable.js";
|
|
7
8
|
export { BetterToolValidationError, betterTools } from "./better-tool.js";
|
|
8
9
|
export type { BetterToolLike, BetterToolsOptions } from "./better-tool.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";
|
|
10
|
+
export type { GuardPolicy, GuardResult, InventoryRepairInput, InventoryRepairResult, InventoryRepairStatus, 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,6 +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 { parseToolIntent, repairToolCall } from "./inventory-repair.js";
|
|
4
5
|
export { extractSchemaDescriptor, normalizeArgsBySchema, normalizeToolSchema } from "./schema.js";
|
|
5
6
|
export { reliableToolCalls } from "./reliable.js";
|
|
6
7
|
export { BetterToolValidationError, betterTools } from "./better-tool.js";
|
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,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"}
|
|
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,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACxE,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"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { defaultRepair } from "./default-repair.js";
|
|
2
|
+
import { guardToolCalls } from "./guard.js";
|
|
3
|
+
import { normalizeArgsBySchema, normalizeToolSchema } from "./schema.js";
|
|
4
|
+
export async function repairToolCall(input) {
|
|
5
|
+
const visibleTools = normalizeTools(input.visibleTools);
|
|
6
|
+
const hiddenTools = normalizeTools(input.hiddenTools ?? []);
|
|
7
|
+
const original = extractOriginalCall(input);
|
|
8
|
+
if (!original) {
|
|
9
|
+
return rejected("no tool-call intent was provided", undefined, undefined, [{
|
|
10
|
+
kind: "parse",
|
|
11
|
+
path: "$.rawIntent",
|
|
12
|
+
message: "could not extract a tool call from the provided intent",
|
|
13
|
+
}]);
|
|
14
|
+
}
|
|
15
|
+
const originalToolName = original.tool;
|
|
16
|
+
const originalArgs = original.args;
|
|
17
|
+
const hiddenTool = hiddenTools.find((tool) => tool.name === original.tool);
|
|
18
|
+
if (hiddenTool) {
|
|
19
|
+
return rejected("model selected a hidden or blocked tool", originalToolName, originalArgs, [{
|
|
20
|
+
kind: "blocked_tool",
|
|
21
|
+
path: "$.tool",
|
|
22
|
+
message: `blocked tool ${original.tool}`,
|
|
23
|
+
tool: original.tool,
|
|
24
|
+
}]);
|
|
25
|
+
}
|
|
26
|
+
const visibleTool = visibleTools.find((tool) => tool.name === original.tool);
|
|
27
|
+
if (visibleTool) {
|
|
28
|
+
return repairKnownTool(input, visibleTools, visibleTool, original, originalToolName, originalArgs);
|
|
29
|
+
}
|
|
30
|
+
const inventoryProposal = await repairUnavailableToolFromInventory(input, visibleTools, original, originalToolName, originalArgs);
|
|
31
|
+
if (inventoryProposal)
|
|
32
|
+
return inventoryProposal;
|
|
33
|
+
const modelProposal = await repairWithModelOrCallback(input, visibleTools, original, [{
|
|
34
|
+
kind: "unknown_tool",
|
|
35
|
+
path: "$.tool",
|
|
36
|
+
message: `unknown tool ${original.tool}`,
|
|
37
|
+
tool: original.tool,
|
|
38
|
+
}]);
|
|
39
|
+
if (modelProposal) {
|
|
40
|
+
return {
|
|
41
|
+
status: "repaired",
|
|
42
|
+
toolName: modelProposal.tool,
|
|
43
|
+
args: modelProposal.args,
|
|
44
|
+
confidence: 0.8,
|
|
45
|
+
reason: "repair function selected a visible tool and schema-compatible arguments",
|
|
46
|
+
originalToolName,
|
|
47
|
+
originalArgs,
|
|
48
|
+
violations: [],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return rejected("no unambiguous visible tool repair was found", originalToolName, originalArgs, [{
|
|
52
|
+
kind: "unknown_tool",
|
|
53
|
+
path: "$.tool",
|
|
54
|
+
message: `unknown tool ${original.tool}`,
|
|
55
|
+
tool: original.tool,
|
|
56
|
+
}]);
|
|
57
|
+
}
|
|
58
|
+
export function parseToolIntent(value) {
|
|
59
|
+
if (isRecord(value))
|
|
60
|
+
return toolCallFromRecord(value);
|
|
61
|
+
if (typeof value !== "string")
|
|
62
|
+
return undefined;
|
|
63
|
+
const text = stripToolCode(value.trim());
|
|
64
|
+
const jsonCall = parseJsonToolCall(text);
|
|
65
|
+
if (jsonCall)
|
|
66
|
+
return jsonCall;
|
|
67
|
+
return parseFunctionStyleToolCall(text);
|
|
68
|
+
}
|
|
69
|
+
async function repairKnownTool(input, visibleTools, tool, original, originalToolName, originalArgs) {
|
|
70
|
+
const first = await guardToolCalls({ tools: visibleTools, calls: [original] });
|
|
71
|
+
if (first.ok) {
|
|
72
|
+
return {
|
|
73
|
+
status: "unchanged",
|
|
74
|
+
toolName: original.tool,
|
|
75
|
+
args: original.args,
|
|
76
|
+
confidence: 1,
|
|
77
|
+
reason: "tool call already matched the visible inventory and selected schema",
|
|
78
|
+
originalToolName,
|
|
79
|
+
originalArgs,
|
|
80
|
+
violations: [],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const aliasArgs = repairArgumentAliases(tool.schema, original.args);
|
|
84
|
+
const normalizedArgs = normalizeArgsBySchema(tool.schema, aliasArgs, input.repairPolicy).args;
|
|
85
|
+
const proposed = { tool: original.tool, args: normalizedArgs };
|
|
86
|
+
const second = await guardToolCalls({ tools: visibleTools, calls: [proposed] });
|
|
87
|
+
if (second.ok && !sameCall(original, proposed)) {
|
|
88
|
+
return {
|
|
89
|
+
status: "repaired",
|
|
90
|
+
toolName: proposed.tool,
|
|
91
|
+
args: proposed.args,
|
|
92
|
+
confidence: 0.85,
|
|
93
|
+
reason: "arguments were repaired using the selected tool schema",
|
|
94
|
+
originalToolName,
|
|
95
|
+
originalArgs,
|
|
96
|
+
violations: first.issues,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const modelProposal = await repairWithModelOrCallback(input, visibleTools, original, first.issues);
|
|
100
|
+
if (modelProposal) {
|
|
101
|
+
return {
|
|
102
|
+
status: "repaired",
|
|
103
|
+
toolName: modelProposal.tool,
|
|
104
|
+
args: modelProposal.args,
|
|
105
|
+
confidence: 0.8,
|
|
106
|
+
reason: "repair function returned a schema-compatible visible tool call",
|
|
107
|
+
originalToolName,
|
|
108
|
+
originalArgs,
|
|
109
|
+
violations: first.issues,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return rejected("selected tool arguments could not be repaired", originalToolName, originalArgs, first.issues);
|
|
113
|
+
}
|
|
114
|
+
async function repairUnavailableToolFromInventory(input, visibleTools, original, originalToolName, originalArgs) {
|
|
115
|
+
const candidates = [];
|
|
116
|
+
for (const tool of visibleTools) {
|
|
117
|
+
const aliasArgs = repairArgumentAliases(tool.schema, original.args);
|
|
118
|
+
const normalizedArgs = normalizeArgsBySchema(tool.schema, aliasArgs, input.repairPolicy).args;
|
|
119
|
+
const proposed = { tool: tool.name, args: normalizedArgs };
|
|
120
|
+
const result = await guardToolCalls({ tools: visibleTools, calls: [proposed] });
|
|
121
|
+
if (result.ok)
|
|
122
|
+
candidates.push(proposed);
|
|
123
|
+
}
|
|
124
|
+
if (candidates.length !== 1)
|
|
125
|
+
return undefined;
|
|
126
|
+
const [candidate] = candidates;
|
|
127
|
+
return {
|
|
128
|
+
status: "repaired",
|
|
129
|
+
toolName: candidate.tool,
|
|
130
|
+
args: candidate.args,
|
|
131
|
+
confidence: 0.75,
|
|
132
|
+
reason: "exactly one visible tool accepted the repaired argument shape",
|
|
133
|
+
originalToolName,
|
|
134
|
+
originalArgs,
|
|
135
|
+
violations: [{
|
|
136
|
+
kind: "unknown_tool",
|
|
137
|
+
path: "$.tool",
|
|
138
|
+
message: `unknown tool ${original.tool}`,
|
|
139
|
+
tool: original.tool,
|
|
140
|
+
}],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async function repairWithModelOrCallback(input, visibleTools, original, issues) {
|
|
144
|
+
const repair = input.repair ?? (input.repairModel ? defaultRepair(input.repairModel) : undefined);
|
|
145
|
+
if (!repair)
|
|
146
|
+
return undefined;
|
|
147
|
+
const repaired = await repair({
|
|
148
|
+
userInput: input.userInput,
|
|
149
|
+
tools: visibleTools,
|
|
150
|
+
hiddenTools: normalizeTools(input.hiddenTools ?? []),
|
|
151
|
+
calls: [original],
|
|
152
|
+
issues,
|
|
153
|
+
runtimePolicy: input.runtimePolicy,
|
|
154
|
+
});
|
|
155
|
+
for (const call of repaired) {
|
|
156
|
+
if (!visibleTools.some((tool) => tool.name === call.tool))
|
|
157
|
+
continue;
|
|
158
|
+
const result = await guardToolCalls({ tools: visibleTools, calls: [call] });
|
|
159
|
+
if (result.ok)
|
|
160
|
+
return call;
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
function extractOriginalCall(input) {
|
|
165
|
+
const fromCall = input.call ? toolCallFromRecord(input.call) : undefined;
|
|
166
|
+
if (fromCall)
|
|
167
|
+
return fromCall;
|
|
168
|
+
const fromRaw = parseToolIntent(input.rawIntent);
|
|
169
|
+
if (fromRaw)
|
|
170
|
+
return fromRaw;
|
|
171
|
+
const name = input.invalidToolName;
|
|
172
|
+
if (name)
|
|
173
|
+
return { tool: name, args: input.args ?? {} };
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
function repairArgumentAliases(schema, args) {
|
|
177
|
+
const normalized = normalizeToolSchema(schema);
|
|
178
|
+
if (!normalized?.properties)
|
|
179
|
+
return args;
|
|
180
|
+
let next = { ...args };
|
|
181
|
+
const properties = normalized.properties;
|
|
182
|
+
for (const key of Object.keys(args)) {
|
|
183
|
+
const canonical = findCanonicalKey(key, properties);
|
|
184
|
+
if (canonical && canonical !== key && !(canonical in next)) {
|
|
185
|
+
next[canonical] = next[key];
|
|
186
|
+
delete next[key];
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
next = repairSingleRequiredString(normalized, next);
|
|
190
|
+
if (normalized.additionalProperties === false) {
|
|
191
|
+
for (const key of Object.keys(next)) {
|
|
192
|
+
if (!(key in properties))
|
|
193
|
+
delete next[key];
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return next;
|
|
197
|
+
}
|
|
198
|
+
function repairSingleRequiredString(schema, args) {
|
|
199
|
+
const properties = schema.properties ?? {};
|
|
200
|
+
const missingRequired = (schema.required ?? []).filter((key) => !(key in args));
|
|
201
|
+
if (missingRequired.length !== 1)
|
|
202
|
+
return args;
|
|
203
|
+
const [missingKey] = missingRequired;
|
|
204
|
+
const missingSchema = properties[missingKey];
|
|
205
|
+
if (!missingSchema || !expectsString(missingSchema))
|
|
206
|
+
return args;
|
|
207
|
+
const extras = Object.entries(args).filter(([key, value]) => !(key in properties) && typeof value === "string");
|
|
208
|
+
if (extras.length !== 1)
|
|
209
|
+
return args;
|
|
210
|
+
const [[extraKey, extraValue]] = extras;
|
|
211
|
+
const next = { ...args, [missingKey]: extraValue };
|
|
212
|
+
delete next[extraKey];
|
|
213
|
+
return next;
|
|
214
|
+
}
|
|
215
|
+
function findCanonicalKey(key, properties) {
|
|
216
|
+
const normalizedKey = normalizeKey(key);
|
|
217
|
+
return Object.keys(properties).find((candidate) => normalizeKey(candidate) === normalizedKey);
|
|
218
|
+
}
|
|
219
|
+
function normalizeKey(value) {
|
|
220
|
+
return value.toLowerCase().replace(/[^a-z0-9]/gu, "");
|
|
221
|
+
}
|
|
222
|
+
function expectsString(schema) {
|
|
223
|
+
return schema.type === "string" || (Array.isArray(schema.type) && schema.type.includes("string")) || !schema.type;
|
|
224
|
+
}
|
|
225
|
+
function parseJsonToolCall(value) {
|
|
226
|
+
try {
|
|
227
|
+
return toolCallFromRecord(JSON.parse(stripCodeFence(value)));
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function parseFunctionStyleToolCall(value) {
|
|
234
|
+
const match = /^\s*([A-Za-z_$][\w$.-]*)\s*\(([\s\S]*)\)\s*;?\s*$/u.exec(value);
|
|
235
|
+
if (!match)
|
|
236
|
+
return undefined;
|
|
237
|
+
return { tool: match[1], args: parseFunctionArgs(match[2]) };
|
|
238
|
+
}
|
|
239
|
+
function parseFunctionArgs(value) {
|
|
240
|
+
const args = {};
|
|
241
|
+
for (const part of splitTopLevelCommas(value)) {
|
|
242
|
+
const match = /^\s*([A-Za-z_$][\w$.-]*)\s*=\s*([\s\S]*?)\s*$/u.exec(part);
|
|
243
|
+
if (match)
|
|
244
|
+
args[match[1]] = parseScalar(match[2]);
|
|
245
|
+
}
|
|
246
|
+
return args;
|
|
247
|
+
}
|
|
248
|
+
function splitTopLevelCommas(value) {
|
|
249
|
+
const parts = [];
|
|
250
|
+
let current = "";
|
|
251
|
+
let quote;
|
|
252
|
+
let escaped = false;
|
|
253
|
+
for (const char of value) {
|
|
254
|
+
if (escaped) {
|
|
255
|
+
current += char;
|
|
256
|
+
escaped = false;
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
if (char === "\\") {
|
|
260
|
+
current += char;
|
|
261
|
+
escaped = true;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
if (quote) {
|
|
265
|
+
current += char;
|
|
266
|
+
if (char === quote)
|
|
267
|
+
quote = undefined;
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
if (char === "\"" || char === "'") {
|
|
271
|
+
current += char;
|
|
272
|
+
quote = char;
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (char === ",") {
|
|
276
|
+
parts.push(current);
|
|
277
|
+
current = "";
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
current += char;
|
|
281
|
+
}
|
|
282
|
+
if (current.trim() !== "")
|
|
283
|
+
parts.push(current);
|
|
284
|
+
return parts;
|
|
285
|
+
}
|
|
286
|
+
function parseScalar(value) {
|
|
287
|
+
const trimmed = value.trim();
|
|
288
|
+
try {
|
|
289
|
+
return JSON.parse(trimmed);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
return trimmed.replace(/^["']|["']$/gu, "");
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
function stripToolCode(value) {
|
|
296
|
+
const match = /<tool_code>\s*([\s\S]*?)\s*<\/tool_code>/iu.exec(value);
|
|
297
|
+
return match ? match[1].trim() : value;
|
|
298
|
+
}
|
|
299
|
+
function stripCodeFence(value) {
|
|
300
|
+
const match = /^```(?:json)?\s*([\s\S]*?)\s*```$/u.exec(value.trim());
|
|
301
|
+
return match ? match[1] : value;
|
|
302
|
+
}
|
|
303
|
+
function toolCallFromRecord(value) {
|
|
304
|
+
if (!isRecord(value))
|
|
305
|
+
return undefined;
|
|
306
|
+
if (typeof value.tool === "string" && isRecord(value.args))
|
|
307
|
+
return { tool: value.tool, args: value.args };
|
|
308
|
+
if (typeof value.name === "string" && isRecord(value.args))
|
|
309
|
+
return { tool: value.name, args: value.args };
|
|
310
|
+
if (typeof value.name === "string" && isRecord(value.arguments))
|
|
311
|
+
return { tool: value.name, args: value.arguments };
|
|
312
|
+
if (typeof value.name === "string" && typeof value.arguments === "string") {
|
|
313
|
+
const parsed = parseJsonObject(value.arguments);
|
|
314
|
+
if (parsed)
|
|
315
|
+
return { tool: value.name, args: parsed };
|
|
316
|
+
}
|
|
317
|
+
if (isRecord(value.function))
|
|
318
|
+
return toolCallFromRecord(value.function);
|
|
319
|
+
if (Array.isArray(value.calls))
|
|
320
|
+
return value.calls.map(toolCallFromRecord).find(Boolean);
|
|
321
|
+
if (Array.isArray(value.tool_calls))
|
|
322
|
+
return value.tool_calls.map(toolCallFromRecord).find(Boolean);
|
|
323
|
+
return undefined;
|
|
324
|
+
}
|
|
325
|
+
function parseJsonObject(value) {
|
|
326
|
+
try {
|
|
327
|
+
const parsed = JSON.parse(value);
|
|
328
|
+
return isRecord(parsed) ? parsed : undefined;
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
return undefined;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function rejected(reason, originalToolName, originalArgs, violations) {
|
|
335
|
+
return {
|
|
336
|
+
status: "rejected",
|
|
337
|
+
confidence: 0,
|
|
338
|
+
reason,
|
|
339
|
+
originalToolName,
|
|
340
|
+
originalArgs,
|
|
341
|
+
violations,
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
function normalizeTools(tools) {
|
|
345
|
+
return tools.map((tool) => ({ ...tool, schema: normalizeToolSchema(tool.schema) }));
|
|
346
|
+
}
|
|
347
|
+
function sameCall(left, right) {
|
|
348
|
+
return left.tool === right.tool && JSON.stringify(left.args) === JSON.stringify(right.args);
|
|
349
|
+
}
|
|
350
|
+
function isRecord(value) {
|
|
351
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=inventory-repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory-repair.js","sourceRoot":"","sources":["../src/inventory-repair.ts"],"names":[],"mappings":"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"}
|
package/dist/prompts.js
CHANGED
|
@@ -6,6 +6,8 @@ export function buildRepairPrompt(input) {
|
|
|
6
6
|
"",
|
|
7
7
|
`User request: ${input.userInput}`,
|
|
8
8
|
`Tools: ${JSON.stringify(input.tools)}`,
|
|
9
|
+
`Hidden or blocked tools: ${JSON.stringify(input.hiddenTools ?? [])}`,
|
|
10
|
+
`Runtime policy: ${JSON.stringify(input.runtimePolicy ?? {})}`,
|
|
9
11
|
`Rejected calls: ${JSON.stringify(input.calls)}`,
|
|
10
12
|
`Issues: ${JSON.stringify(input.issues)}`,
|
|
11
13
|
].join("\n");
|
|
@@ -18,6 +20,8 @@ export function buildReviewPrompt(input) {
|
|
|
18
20
|
"",
|
|
19
21
|
`User request: ${input.userInput}`,
|
|
20
22
|
`Tools: ${JSON.stringify(input.tools)}`,
|
|
23
|
+
`Hidden or blocked tools: ${JSON.stringify(input.hiddenTools ?? [])}`,
|
|
24
|
+
`Runtime policy: ${JSON.stringify(input.runtimePolicy ?? {})}`,
|
|
21
25
|
`Previous calls: ${JSON.stringify(input.calls)}`,
|
|
22
26
|
`Validation issues, if any: ${JSON.stringify(input.issues)}`,
|
|
23
27
|
].join("\n");
|
package/dist/prompts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,OAAO;QACL,2DAA2D;QAC3D,8EAA8E;QAC9E,qDAAqD;QACrD,EAAE;QACF,iBAAiB,KAAK,CAAC,SAAS,EAAE;QAClC,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvC,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAChD,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,OAAO;QACL,sEAAsE;QACtE,8FAA8F;QAC9F,0EAA0E;QAC1E,EAAE;QACF,iBAAiB,KAAK,CAAC,SAAS,EAAE;QAClC,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvC,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAChD,8BAA8B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,OAAO;QACL,2DAA2D;QAC3D,8EAA8E;QAC9E,qDAAqD;QACrD,EAAE;QACF,iBAAiB,KAAK,CAAC,SAAS,EAAE;QAClC,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvC,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE;QACrE,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE;QAC9D,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAChD,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAkB;IAClD,OAAO;QACL,sEAAsE;QACtE,8FAA8F;QAC9F,0EAA0E;QAC1E,EAAE;QACF,iBAAiB,KAAK,CAAC,SAAS,EAAE;QAClC,UAAU,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QACvC,4BAA4B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE;QACrE,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE;QAC9D,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;QAChD,8BAA8B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;KAC7D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ export type ToolCall = {
|
|
|
39
39
|
tool: string;
|
|
40
40
|
args: Record<string, unknown>;
|
|
41
41
|
};
|
|
42
|
-
export type IssueKind = "unknown_tool" | "irrelevant_call" | "missing_call" | "schema" | "type" | "semantic";
|
|
42
|
+
export type IssueKind = "unknown_tool" | "blocked_tool" | "irrelevant_call" | "missing_call" | "parse" | "schema" | "type" | "semantic";
|
|
43
43
|
export type ToolCallIssue = {
|
|
44
44
|
kind: IssueKind;
|
|
45
45
|
path: string;
|
|
@@ -94,8 +94,10 @@ export type SemanticValidator = (input: {
|
|
|
94
94
|
export type RepairInput = {
|
|
95
95
|
userInput: string;
|
|
96
96
|
tools: ToolDefinition[];
|
|
97
|
+
hiddenTools?: ToolDefinition[];
|
|
97
98
|
calls: ToolCall[];
|
|
98
99
|
issues: ToolCallIssue[];
|
|
100
|
+
runtimePolicy?: Record<string, unknown>;
|
|
99
101
|
};
|
|
100
102
|
export type RepairFunction = (input: RepairInput) => Promise<ToolCall[]> | ToolCall[];
|
|
101
103
|
export type ReliableToolCallsInput = {
|
|
@@ -113,3 +115,32 @@ export type ReliableToolCallsResult = GuardResult & {
|
|
|
113
115
|
original: ToolCall[];
|
|
114
116
|
diagnostics?: RepairDiagnostics[];
|
|
115
117
|
};
|
|
118
|
+
export type InventoryRepairStatus = "repaired" | "rejected" | "unchanged";
|
|
119
|
+
export type InventoryRepairInput = {
|
|
120
|
+
userInput: string;
|
|
121
|
+
visibleTools: ToolDefinition[];
|
|
122
|
+
hiddenTools?: ToolDefinition[];
|
|
123
|
+
call?: Partial<ToolCall> & {
|
|
124
|
+
name?: string;
|
|
125
|
+
arguments?: unknown;
|
|
126
|
+
};
|
|
127
|
+
rawIntent?: string;
|
|
128
|
+
invalidToolName?: string;
|
|
129
|
+
args?: Record<string, unknown>;
|
|
130
|
+
runtimePolicy?: Record<string, unknown>;
|
|
131
|
+
repairPolicy?: RepairPolicy;
|
|
132
|
+
repair?: RepairFunction;
|
|
133
|
+
repairModel?: {
|
|
134
|
+
invoke(input: unknown): Promise<unknown> | unknown;
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
export type InventoryRepairResult = {
|
|
138
|
+
status: InventoryRepairStatus;
|
|
139
|
+
toolName?: string;
|
|
140
|
+
args?: Record<string, unknown>;
|
|
141
|
+
confidence: number;
|
|
142
|
+
reason: string;
|
|
143
|
+
originalToolName?: string;
|
|
144
|
+
originalArgs?: Record<string, unknown>;
|
|
145
|
+
violations: ToolCallIssue[];
|
|
146
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botbotgo/better-call",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.20",
|
|
4
4
|
"description": "LLM tool-call reliability layer.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"prepack": "npm run test"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@types/node": "^
|
|
49
|
+
"@types/node": "^25.6.2",
|
|
50
50
|
"typescript": "^5.9.3"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|