@botbotgo/better-call 0.1.48 → 0.1.50
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/dist/reliable.js +20 -2
- package/dist/reliable.js.map +1 -1
- package/package.json +1 -1
- package/scripts/demo.mjs +58 -12
package/dist/reliable.js
CHANGED
|
@@ -40,7 +40,23 @@ export async function reliableToolCalls(input) {
|
|
|
40
40
|
calls: repairBaseCalls,
|
|
41
41
|
issues: repairBaseIssues,
|
|
42
42
|
});
|
|
43
|
-
const
|
|
43
|
+
const normalizedRepairedCalls = normalizeCalls(repairedCalls);
|
|
44
|
+
if (repairBaseCalls.length > 0 &&
|
|
45
|
+
normalizedRepairedCalls.length === 0 &&
|
|
46
|
+
input.policy?.expected !== "none") {
|
|
47
|
+
const invalidRepairDiagnostics = createDiagnostics(repairSource, repairBaseCalls, normalizedRepairedCalls, repairBaseIssues, [{
|
|
48
|
+
kind: "parse",
|
|
49
|
+
path: "$.calls",
|
|
50
|
+
message: "repair returned no usable tool calls",
|
|
51
|
+
}]);
|
|
52
|
+
return {
|
|
53
|
+
...first,
|
|
54
|
+
repaired: false,
|
|
55
|
+
original: input.calls,
|
|
56
|
+
diagnostics: [...diagnostics, invalidRepairDiagnostics],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const second = await guardToolCalls({ ...input, tools, calls: normalizedRepairedCalls });
|
|
44
60
|
const modelDiagnostics = createDiagnostics(repairSource, repairBaseCalls, second.calls, repairBaseIssues, second.issues);
|
|
45
61
|
const modelProposal = {
|
|
46
62
|
source: modelDiagnostics.source,
|
|
@@ -131,7 +147,9 @@ function diffCallPaths(original, proposed) {
|
|
|
131
147
|
return paths;
|
|
132
148
|
}
|
|
133
149
|
function normalizeCalls(calls) {
|
|
134
|
-
|
|
150
|
+
if (!Array.isArray(calls))
|
|
151
|
+
return [];
|
|
152
|
+
return calls.filter((call) => isRecord(call) && typeof call.tool === "string" && isRecord(call.args));
|
|
135
153
|
}
|
|
136
154
|
function isRecord(value) {
|
|
137
155
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
package/dist/reliable.js.map
CHANGED
|
@@ -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,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAWzE,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,WAAW,GAAwB,EAAE,CAAC;IAC5C,IAAI,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC;IAClC,IAAI,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC;IACpC,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACrG,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACxE,IAAI,QAAQ,IAAI,YAAY,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE,YAAY,CAAC,QAAQ;oBAC5B,MAAM,EAAE,EAAE;oBACV,QAAQ,EAAE,IAAI;oBACd,QAAQ,EAAE,KAAK,CAAC,KAAK;oBACrB,WAAW,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC;iBACxC,CAAC;YACJ,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;gBAC3C,eAAe,GAAG,YAAY,CAAC,QAAQ,CAAC;gBACxC,gBAAgB,GAAG,YAAY,CAAC,WAAW,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,EAAE,gBAAgB,IAAI,IAAI,CAAC;IACtE,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,QAAQ,CAAC;IACpD,MAAM,aAAa,GAAG,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,YAAY,GAAG,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACvH,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAC5F,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,MAAO,CAAC;QACxC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK;QACL,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE,gBAAgB;KACzB,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"reliable.js","sourceRoot":"","sources":["../src/reliable.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/scripts/demo.mjs
CHANGED
|
@@ -3,11 +3,32 @@ import { betterTools, repairToolCall, reliableToolCalls } from "../dist/index.js
|
|
|
3
3
|
|
|
4
4
|
const json = process.argv.includes("--json");
|
|
5
5
|
const VALID_MARKETS = ["US", "HK", "CN"];
|
|
6
|
+
// Intentionally incorrect tool name used to demonstrate tool-call repair behavior.
|
|
7
|
+
const DEMO_INVALID_TOOL_NAME = "stock_price";
|
|
6
8
|
|
|
7
9
|
function errorMessage(error) {
|
|
8
10
|
return error instanceof Error ? error.message : String(error);
|
|
9
11
|
}
|
|
10
12
|
|
|
13
|
+
async function runReliableScenario(label, options) {
|
|
14
|
+
try {
|
|
15
|
+
const result = await reliableToolCalls(options);
|
|
16
|
+
return {
|
|
17
|
+
label,
|
|
18
|
+
status: result.ok ? "accepted" : "rejected",
|
|
19
|
+
repaired: result?.repaired ?? null,
|
|
20
|
+
callCount: Array.isArray(result?.calls) ? result.calls.length : null,
|
|
21
|
+
issueCount: Array.isArray(result?.issues) ? result.issues.length : null,
|
|
22
|
+
};
|
|
23
|
+
} catch (error) {
|
|
24
|
+
return {
|
|
25
|
+
label,
|
|
26
|
+
status: "expected-error",
|
|
27
|
+
message: errorMessage(error),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
11
32
|
function createGatewayErrorResult(originalToolName, reason, details = {}) {
|
|
12
33
|
return {
|
|
13
34
|
status: "error",
|
|
@@ -132,20 +153,22 @@ function repairDemoStockCall(repairInput = {}) {
|
|
|
132
153
|
? repairInput.calls[0].args
|
|
133
154
|
: createDemoMalformedInput();
|
|
134
155
|
|
|
135
|
-
const
|
|
156
|
+
const rawAttemptedTicker =
|
|
136
157
|
typeof attemptedArgs.ticker === "string"
|
|
137
158
|
? attemptedArgs.ticker
|
|
138
159
|
: typeof attemptedArgs.symbol === "string"
|
|
139
160
|
? attemptedArgs.symbol
|
|
140
161
|
: "AAPL";
|
|
141
|
-
const normalizedTicker =
|
|
162
|
+
const normalizedTicker = rawAttemptedTicker.trim().toLowerCase();
|
|
142
163
|
// This demo maps empty input and the "apple" alias to AAPL.
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
164
|
+
let ticker;
|
|
165
|
+
if (normalizedTicker === "") {
|
|
166
|
+
ticker = "AAPL";
|
|
167
|
+
} else if (normalizedTicker === "apple") {
|
|
168
|
+
ticker = "AAPL";
|
|
169
|
+
} else {
|
|
170
|
+
ticker = normalizedTicker.toUpperCase();
|
|
171
|
+
}
|
|
149
172
|
|
|
150
173
|
const attemptedMarket = typeof attemptedArgs.market === "string" ? attemptedArgs.market : null;
|
|
151
174
|
const market =
|
|
@@ -197,15 +220,37 @@ try {
|
|
|
197
220
|
userInput: "Get Apple stock in the US market.",
|
|
198
221
|
tools: [stockQuote],
|
|
199
222
|
// Both the tool name and args are intentionally wrong to demonstrate repair:
|
|
200
|
-
//
|
|
223
|
+
// DEMO_INVALID_TOOL_NAME should be "stock_quote"; demoMalformedInput uses
|
|
201
224
|
// "symbol"/"NASDAQ" instead of schema-valid stock_quote args.
|
|
202
|
-
calls: [{ tool:
|
|
225
|
+
calls: [{ tool: DEMO_INVALID_TOOL_NAME, args: demoMalformedInput }],
|
|
203
226
|
repair: repairDemoStockCall,
|
|
204
227
|
});
|
|
205
228
|
} catch (error) {
|
|
206
229
|
exitWithError("tool-call repair", error);
|
|
207
230
|
}
|
|
208
231
|
|
|
232
|
+
const reliableScenarioBase = {
|
|
233
|
+
userInput: "Get Apple stock in the US market.",
|
|
234
|
+
tools: [stockQuote],
|
|
235
|
+
};
|
|
236
|
+
const reliableFailureScenarios = [
|
|
237
|
+
await runReliableScenario("empty-calls-array", {
|
|
238
|
+
...reliableScenarioBase,
|
|
239
|
+
calls: [],
|
|
240
|
+
repair: repairDemoStockCall,
|
|
241
|
+
}),
|
|
242
|
+
await runReliableScenario("null-repair-result", {
|
|
243
|
+
...reliableScenarioBase,
|
|
244
|
+
calls: [{ tool: DEMO_INVALID_TOOL_NAME, args: demoMalformedInput }],
|
|
245
|
+
repair: async () => null,
|
|
246
|
+
}),
|
|
247
|
+
await runReliableScenario("invalid-repaired-tool-name", {
|
|
248
|
+
...reliableScenarioBase,
|
|
249
|
+
calls: [{ tool: DEMO_INVALID_TOOL_NAME, args: demoMalformedInput }],
|
|
250
|
+
repair: async () => [{ tool: "not_a_real_tool", args: demoMalformedInput }],
|
|
251
|
+
}),
|
|
252
|
+
];
|
|
253
|
+
|
|
209
254
|
let gatewayResult;
|
|
210
255
|
try {
|
|
211
256
|
gatewayResult = await repairToolCall({
|
|
@@ -239,7 +284,7 @@ try {
|
|
|
239
284
|
}
|
|
240
285
|
|
|
241
286
|
const gatewayRepairResult =
|
|
242
|
-
gatewayResult != null && typeof gatewayResult === "object"
|
|
287
|
+
gatewayResult != null && typeof gatewayResult === "object" && !Array.isArray(gatewayResult)
|
|
243
288
|
? gatewayResult
|
|
244
289
|
: createGatewayErrorResult(
|
|
245
290
|
"research",
|
|
@@ -260,10 +305,11 @@ const report = {
|
|
|
260
305
|
after: wrappedOutput,
|
|
261
306
|
},
|
|
262
307
|
reliableToolCalls: {
|
|
263
|
-
before: { tool:
|
|
308
|
+
before: { tool: DEMO_INVALID_TOOL_NAME, args: demoMalformedInput },
|
|
264
309
|
repaired: repairedCall,
|
|
265
310
|
// Optional validation/repair metadata; null means this run returned none.
|
|
266
311
|
diagnostics: reliableResult?.diagnostics ?? null,
|
|
312
|
+
failureScenarios: reliableFailureScenarios,
|
|
267
313
|
},
|
|
268
314
|
gatewayRepair: gatewayRepairResult,
|
|
269
315
|
};
|