@procedures/llm 0.7.0 → 0.8.0
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/CHANGELOG.md +29 -0
- package/README.md +52 -8
- package/dist/.tsbuildinfo +1 -1
- package/dist/events.d.ts +8 -3
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +100 -39
- package/dist/events.js.map +1 -1
- package/dist/loop.d.ts +72 -0
- package/dist/loop.d.ts.map +1 -0
- package/dist/loop.js +107 -0
- package/dist/loop.js.map +1 -0
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +31 -16
- package/dist/module.js.map +1 -1
- package/dist/procedures/llm/complete.d.ts +2 -1
- package/dist/procedures/llm/complete.d.ts.map +1 -1
- package/dist/procedures/llm/complete.js +28 -46
- package/dist/procedures/llm/complete.js.map +1 -1
- package/dist/procedures/llm/stream.d.ts +8 -2
- package/dist/procedures/llm/stream.d.ts.map +1 -1
- package/dist/procedures/llm/stream.js +22 -4
- package/dist/procedures/llm/stream.js.map +1 -1
- package/dist/tools.d.ts +11 -9
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +34 -10
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +50 -15
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/events.ts +114 -43
- package/src/loop.ts +159 -0
- package/src/module.ts +33 -16
- package/src/procedures/llm/complete.ts +30 -48
- package/src/procedures/llm/stream.ts +26 -7
- package/src/tools.ts +35 -10
- package/src/types.ts +53 -17
package/dist/events.d.ts
CHANGED
|
@@ -10,12 +10,17 @@
|
|
|
10
10
|
*
|
|
11
11
|
* A stream gets a new try only before its first item. After the first item, an error goes to the
|
|
12
12
|
* caller.
|
|
13
|
+
*
|
|
14
|
+
* The stream of one request gives the `start`, `text` and `tool_use` items. Its return value is
|
|
15
|
+
* the answer with its content blocks. `llm.stream` gives the `stop` item at the end of its tool loop.
|
|
13
16
|
*/
|
|
14
17
|
import { type CallLimits, type LlmSettings, type MessagesRequest } from "./anthropic.js";
|
|
18
|
+
import type { TurnAnswer } from "./loop.js";
|
|
15
19
|
import type { LlmStreamOutput } from "./types.js";
|
|
16
20
|
/**
|
|
17
|
-
* This function sends a request with `"stream": true` and gives each item of the answer
|
|
18
|
-
*
|
|
21
|
+
* This function sends a request with `"stream": true` and gives each item of the answer: the
|
|
22
|
+
* `start`, `text` and `tool_use` items. The return value is the answer. Before the first item, a
|
|
23
|
+
* retryable error gets a new try, at most `retries` times.
|
|
19
24
|
*/
|
|
20
|
-
export declare function streamMessages(request: MessagesRequest, settings: LlmSettings, limits: CallLimits, retries: number): AsyncGenerator<LlmStreamOutput,
|
|
25
|
+
export declare function streamMessages(request: MessagesRequest, settings: LlmSettings, limits: CallLimits, retries: number): AsyncGenerator<LlmStreamOutput, TurnAnswer, undefined>;
|
|
21
26
|
//# sourceMappingURL=events.d.ts.map
|
package/dist/events.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAA2D,KAAK,UAAU,EAAqB,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAErK,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,YAAY,CAAC;AA0PxE;;;;GAIG;AACH,wBAAuB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC,eAAe,EAAE,UAAU,EAAE,SAAS,CAAC,CAUlL"}
|
package/dist/events.js
CHANGED
|
@@ -10,6 +10,9 @@
|
|
|
10
10
|
*
|
|
11
11
|
* A stream gets a new try only before its first item. After the first item, an error goes to the
|
|
12
12
|
* caller.
|
|
13
|
+
*
|
|
14
|
+
* The stream of one request gives the `start`, `text` and `tool_use` items. Its return value is
|
|
15
|
+
* the answer with its content blocks. `llm.stream` gives the `stop` item at the end of its tool loop.
|
|
13
16
|
*/
|
|
14
17
|
import { HttpError, sseEvents } from "@procedures/http";
|
|
15
18
|
import { InvocationError } from "@procedures/client";
|
|
@@ -61,7 +64,29 @@ function streamError(data) {
|
|
|
61
64
|
const message = stringOf(error["message"]) ?? "no message";
|
|
62
65
|
return new LlmError("API_ERROR", `llm: the API sent an error event: ${type}: ${message}`, { retryable: RETRYABLE_ERROR_TYPES.has(type) });
|
|
63
66
|
}
|
|
64
|
-
/** The
|
|
67
|
+
/** The type of block that each delta changes. An `input_json_delta` changes each block with an input. */
|
|
68
|
+
const DELTA_TARGETS = new Map([
|
|
69
|
+
["text_delta", "text"],
|
|
70
|
+
["citations_delta", "text"],
|
|
71
|
+
["thinking_delta", "thinking"],
|
|
72
|
+
["signature_delta", "thinking"],
|
|
73
|
+
]);
|
|
74
|
+
/** The `input` of a block: the JSON of its deltas, parsed. A JSON that does not parse gives null and the text. */
|
|
75
|
+
function inputOf(block) {
|
|
76
|
+
if (block.json.trim() === "")
|
|
77
|
+
return { input: block.block["input"] ?? {} };
|
|
78
|
+
try {
|
|
79
|
+
return { input: JSON.parse(block.json) };
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return { input: null, partialJson: block.json };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The state of one stream. It turns each event into the items of the procedure. It also puts
|
|
87
|
+
* the content blocks of the answer together, as the JSON answer has them. The next request of the
|
|
88
|
+
* tool loop sends them back.
|
|
89
|
+
*/
|
|
65
90
|
class StreamState {
|
|
66
91
|
model;
|
|
67
92
|
id = "";
|
|
@@ -70,12 +95,55 @@ class StreamState {
|
|
|
70
95
|
category;
|
|
71
96
|
text = "";
|
|
72
97
|
blocks = new Map();
|
|
98
|
+
content = [];
|
|
73
99
|
toolUses = [];
|
|
74
100
|
/** True after the event `message_stop`. */
|
|
75
101
|
stopped = false;
|
|
76
102
|
constructor(model) {
|
|
77
103
|
this.model = model;
|
|
78
104
|
}
|
|
105
|
+
/** The answer, after the event `message_stop`. */
|
|
106
|
+
answer() {
|
|
107
|
+
return {
|
|
108
|
+
model: this.model,
|
|
109
|
+
content: [...this.content].sort((a, b) => a[0] - b[0]).map(([, block]) => block),
|
|
110
|
+
stopReason: this.stopReason,
|
|
111
|
+
usage: this.usage,
|
|
112
|
+
text: this.text,
|
|
113
|
+
toolUses: [...this.toolUses],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* This function adds a delta to its open block. A delta for a block of another type, and a
|
|
118
|
+
* delta of a type that the procedure does not know, change nothing.
|
|
119
|
+
*/
|
|
120
|
+
addDelta(index, delta) {
|
|
121
|
+
const open = this.blocks.get(index);
|
|
122
|
+
const type = stringOf(delta["type"]) ?? "";
|
|
123
|
+
const target = DELTA_TARGETS.get(type);
|
|
124
|
+
if (open === undefined || (target !== undefined && open.block["type"] !== target))
|
|
125
|
+
return;
|
|
126
|
+
const { block } = open;
|
|
127
|
+
switch (type) {
|
|
128
|
+
case "text_delta":
|
|
129
|
+
block["text"] = (stringOf(block["text"]) ?? "") + (stringOf(delta["text"]) ?? "");
|
|
130
|
+
return;
|
|
131
|
+
case "input_json_delta":
|
|
132
|
+
open.json += stringOf(delta["partial_json"]) ?? "";
|
|
133
|
+
return;
|
|
134
|
+
case "thinking_delta":
|
|
135
|
+
block["thinking"] = (stringOf(block["thinking"]) ?? "") + (stringOf(delta["thinking"]) ?? "");
|
|
136
|
+
return;
|
|
137
|
+
case "signature_delta":
|
|
138
|
+
block["signature"] = stringOf(delta["signature"]) ?? "";
|
|
139
|
+
return;
|
|
140
|
+
case "citations_delta":
|
|
141
|
+
block["citations"] = [...(Array.isArray(block["citations"]) ? block["citations"] : []), delta["citation"]];
|
|
142
|
+
return;
|
|
143
|
+
default:
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
79
147
|
/** The items of one event. The event `error` and a refusal at the end throw. */
|
|
80
148
|
apply(event) {
|
|
81
149
|
if (event.event === "ping")
|
|
@@ -91,13 +159,13 @@ class StreamState {
|
|
|
91
159
|
return [{ type: "start", id: this.id, model: this.model, usage: this.usage }];
|
|
92
160
|
}
|
|
93
161
|
case "content_block_start": {
|
|
94
|
-
const block = recordOf(data["content_block"]);
|
|
162
|
+
const block = { ...recordOf(data["content_block"]) };
|
|
95
163
|
const type = stringOf(block["type"]) ?? "";
|
|
96
164
|
// A server-side fallback puts a fallback block at the change of the model
|
|
97
165
|
const to = stringOf(recordOf(block["to"])["model"]);
|
|
98
166
|
if (type === "fallback" && to)
|
|
99
167
|
this.model = to;
|
|
100
|
-
this.blocks.set(index, {
|
|
168
|
+
this.blocks.set(index, { block, json: "" });
|
|
101
169
|
const text = stringOf(block["text"]);
|
|
102
170
|
if (type === "text" && text) {
|
|
103
171
|
this.text += text;
|
|
@@ -107,37 +175,31 @@ class StreamState {
|
|
|
107
175
|
}
|
|
108
176
|
case "content_block_delta": {
|
|
109
177
|
const delta = recordOf(data["delta"]);
|
|
110
|
-
|
|
111
|
-
if (
|
|
178
|
+
this.addDelta(index, delta);
|
|
179
|
+
if (stringOf(delta["type"]) === "text_delta") {
|
|
112
180
|
const text = stringOf(delta["text"]) ?? "";
|
|
113
181
|
this.text += text;
|
|
114
182
|
return text === "" ? [] : [{ type: "text", index, text }];
|
|
115
183
|
}
|
|
116
|
-
if (deltaType === "input_json_delta") {
|
|
117
|
-
const block = this.blocks.get(index);
|
|
118
|
-
if (block)
|
|
119
|
-
block.json += stringOf(delta["partial_json"]) ?? "";
|
|
120
|
-
}
|
|
121
184
|
return [];
|
|
122
185
|
}
|
|
123
186
|
case "content_block_stop": {
|
|
124
|
-
const
|
|
187
|
+
const open = this.blocks.get(index);
|
|
188
|
+
if (open === undefined)
|
|
189
|
+
return [];
|
|
125
190
|
this.blocks.delete(index);
|
|
126
|
-
|
|
191
|
+
const { block } = open;
|
|
192
|
+
const { input, partialJson } = inputOf(open);
|
|
193
|
+
// A tool_use block and a server_tool_use block get their input from the deltas
|
|
194
|
+
if (open.json !== "" || block["type"] === "tool_use")
|
|
195
|
+
block["input"] = input;
|
|
196
|
+
this.content.push([index, block]);
|
|
197
|
+
if (block["type"] !== "tool_use")
|
|
127
198
|
return [];
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
input = JSON.parse(block.json);
|
|
133
|
-
}
|
|
134
|
-
catch {
|
|
135
|
-
input = null;
|
|
136
|
-
partialJson = block.json;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
this.toolUses.push({ id: block.id, name: block.name, input });
|
|
140
|
-
return [{ type: "tool_use", index, id: block.id, name: block.name, input, ...(partialJson !== undefined ? { partialJson } : {}) }];
|
|
199
|
+
const id = stringOf(block["id"]) ?? "";
|
|
200
|
+
const name = stringOf(block["name"]) ?? "";
|
|
201
|
+
this.toolUses.push({ id, name, input });
|
|
202
|
+
return [{ type: "tool_use", index, id, name, input, ...(partialJson !== undefined ? { partialJson } : {}) }];
|
|
141
203
|
}
|
|
142
204
|
case "message_delta": {
|
|
143
205
|
const delta = recordOf(data["delta"]);
|
|
@@ -153,7 +215,7 @@ class StreamState {
|
|
|
153
215
|
throw new LlmError("REFUSAL", `llm: a safety classifier declined the request (category: ${this.category ?? "not given"})`);
|
|
154
216
|
}
|
|
155
217
|
this.stopped = true;
|
|
156
|
-
return [
|
|
218
|
+
return [];
|
|
157
219
|
}
|
|
158
220
|
case "error":
|
|
159
221
|
throw streamError(data);
|
|
@@ -162,8 +224,8 @@ class StreamState {
|
|
|
162
224
|
}
|
|
163
225
|
}
|
|
164
226
|
}
|
|
165
|
-
/** The items of one try of a stream, in one request scope. */
|
|
166
|
-
async function* streamOnce(request, settings, limits) {
|
|
227
|
+
/** The items of one try of a stream, in one request scope. The return value is the answer. */
|
|
228
|
+
async function* streamOnce(request, settings, limits, progress) {
|
|
167
229
|
const scope = openScope(settings, limits);
|
|
168
230
|
try {
|
|
169
231
|
const response = await postMessages(request, settings, scope);
|
|
@@ -172,10 +234,12 @@ async function* streamOnce(request, settings, limits) {
|
|
|
172
234
|
const state = new StreamState(request.model);
|
|
173
235
|
try {
|
|
174
236
|
for await (const event of sseEvents(chunksOf(response.body), MAX_EVENT_BYTES, limits.path.join("."))) {
|
|
175
|
-
for (const item of state.apply(event))
|
|
237
|
+
for (const item of state.apply(event)) {
|
|
238
|
+
progress.started = true;
|
|
176
239
|
yield item;
|
|
240
|
+
}
|
|
177
241
|
if (state.stopped)
|
|
178
|
-
return;
|
|
242
|
+
return state.answer();
|
|
179
243
|
}
|
|
180
244
|
}
|
|
181
245
|
catch (error) {
|
|
@@ -195,22 +259,19 @@ async function* streamOnce(request, settings, limits) {
|
|
|
195
259
|
}
|
|
196
260
|
}
|
|
197
261
|
/**
|
|
198
|
-
* This function sends a request with `"stream": true` and gives each item of the answer
|
|
199
|
-
*
|
|
262
|
+
* This function sends a request with `"stream": true` and gives each item of the answer: the
|
|
263
|
+
* `start`, `text` and `tool_use` items. The return value is the answer. Before the first item, a
|
|
264
|
+
* retryable error gets a new try, at most `retries` times.
|
|
200
265
|
*/
|
|
201
266
|
export async function* streamMessages(request, settings, limits, retries) {
|
|
202
267
|
const body = { ...request, stream: true };
|
|
203
268
|
for (let retry = 1;; retry++) {
|
|
204
|
-
|
|
269
|
+
const progress = { started: false };
|
|
205
270
|
try {
|
|
206
|
-
|
|
207
|
-
started = true;
|
|
208
|
-
yield item;
|
|
209
|
-
}
|
|
210
|
-
return;
|
|
271
|
+
return yield* streamOnce(body, settings, limits, progress);
|
|
211
272
|
}
|
|
212
273
|
catch (error) {
|
|
213
|
-
if (started || !(await waitToRetry(error, retry, { backoff: settings.backoff, retries }, limits)))
|
|
274
|
+
if (progress.started || !(await waitToRetry(error, retry, { backoff: settings.backoff, retries }, limits)))
|
|
214
275
|
throw error;
|
|
215
276
|
}
|
|
216
277
|
}
|
package/dist/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/loop.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tool loop of `llm.complete` and `llm.stream`.
|
|
3
|
+
*
|
|
4
|
+
* The loop sends a request and reads the answer. When the answer asks only for procedure tools,
|
|
5
|
+
* the loop starts them, sends the answer and the results back, and asks again. It stops when the
|
|
6
|
+
* model stops, or when `maxRounds` requests went out. The two procedures differ only in one
|
|
7
|
+
* step: `llm.complete` gets each answer as JSON, and `llm.stream` reads the event stream of each
|
|
8
|
+
* answer. A `SendTurn` function does that step.
|
|
9
|
+
*/
|
|
10
|
+
import type { ProcedurePath } from "@procedures/client";
|
|
11
|
+
import { type CallLimits, type ContentBlock, type LlmSettings, type MessagesRequest } from "./anthropic.js";
|
|
12
|
+
import { type ToolContext } from "./tools.js";
|
|
13
|
+
import type { LlmRequestInput, LlmStreamToolCall, LlmStreamToolResult, LlmToolCall, LlmToolInput, LlmToolUse, LlmUsage } from "./types.js";
|
|
14
|
+
/** One answer of the model, as the loop reads it. */
|
|
15
|
+
export interface TurnAnswer {
|
|
16
|
+
/** The model that answered. */
|
|
17
|
+
readonly model: string;
|
|
18
|
+
/** The content blocks of the answer. The next request sends them back, after `continuationOf()`. */
|
|
19
|
+
readonly content: readonly ContentBlock[];
|
|
20
|
+
/** Why the model stopped. */
|
|
21
|
+
readonly stopReason: string;
|
|
22
|
+
/** The tokens of the request. */
|
|
23
|
+
readonly usage: LlmUsage;
|
|
24
|
+
/** The text of the answer. */
|
|
25
|
+
readonly text: string;
|
|
26
|
+
/** The `tool_use` blocks of the answer. */
|
|
27
|
+
readonly toolUses: readonly LlmToolUse[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* One request of the loop. The function sends the request, with at most `retries` new tries.
|
|
31
|
+
* It gives the items of the answer. Its return value is the answer.
|
|
32
|
+
*/
|
|
33
|
+
export type SendTurn<T> = (request: MessagesRequest, settings: LlmSettings, limits: CallLimits, retries: number) => AsyncGenerator<T, TurnAnswer, undefined>;
|
|
34
|
+
/** An item of the loop: the start or the end of a procedure tool. */
|
|
35
|
+
export type ToolEvent = LlmStreamToolCall | LlmStreamToolResult;
|
|
36
|
+
/** The end of the loop. */
|
|
37
|
+
export interface LoopEnd {
|
|
38
|
+
/** The last answer. */
|
|
39
|
+
readonly answer: TurnAnswer;
|
|
40
|
+
/** The model of the last answer. Without one, it is the model of the request. */
|
|
41
|
+
readonly model: string;
|
|
42
|
+
/** The tokens of all the requests, added together. */
|
|
43
|
+
readonly usage: LlmUsage;
|
|
44
|
+
/** The text of all the answers, joined. */
|
|
45
|
+
readonly text: string;
|
|
46
|
+
/** The calls of procedure tools, in their sequence. */
|
|
47
|
+
readonly toolCalls: LlmToolCall[];
|
|
48
|
+
/** The number of requests to the model. */
|
|
49
|
+
readonly rounds: number;
|
|
50
|
+
/** True when `maxRounds` stopped the loop before the model stopped. */
|
|
51
|
+
readonly roundLimit: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The content of an answer as the next request sends it back. After a server-side fallback in
|
|
55
|
+
* the middle of an answer, the blocks before the final `fallback` block came from the model that
|
|
56
|
+
* declined. The next turn drops their thinking, their `connector_text` and their client
|
|
57
|
+
* `tool_use` blocks, and each server tool use without its result. The `fallback` block, the
|
|
58
|
+
* text and each block after the final `fallback` block stay where they are. Without a `fallback`
|
|
59
|
+
* block, the content stays as it came. The rules are in the API docs, "Refusals and fallback",
|
|
60
|
+
* section "Continuing the conversation". Before, the loop sent the content back unchanged, and
|
|
61
|
+
* the next request could fail (tracker O34).
|
|
62
|
+
*/
|
|
63
|
+
export declare function continuationOf(content: readonly ContentBlock[]): ContentBlock[];
|
|
64
|
+
/**
|
|
65
|
+
* This function does the tool loop of one call. It gives the items of each answer and an item at
|
|
66
|
+
* the start and at the end of each procedure tool. The return value is the end of the loop. It
|
|
67
|
+
* throws before the first request for a tool that the host refuses or that is not valid.
|
|
68
|
+
*/
|
|
69
|
+
export declare function toolLoop<T>(input: LlmRequestInput & LlmToolInput, ctx: ToolContext | undefined, settings: LlmSettings, path: ProcedurePath, send: SendTurn<T>): AsyncGenerator<T | ToolEvent, LoopEnd, undefined>;
|
|
70
|
+
/** This function reads a generator to its end and gives its return value. It ignores the items. */
|
|
71
|
+
export declare function returnOf<R>(generator: AsyncGenerator<unknown, R, undefined>): Promise<R>;
|
|
72
|
+
//# sourceMappingURL=loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../src/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAsB,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEhI,OAAO,EAAkD,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3I,qDAAqD;AACrD,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,oGAAoG;IACpG,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAE7J,qEAAqE;AACrE,MAAM,MAAM,SAAS,GAAG,iBAAiB,GAAG,mBAAmB,CAAC;AAEhE,2BAA2B;AAC3B,MAAM,WAAW,OAAO;IACtB,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC;IAClC,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAKD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,EAAE,CAiB/E;AAUD;;;;GAIG;AACH,wBAAuB,QAAQ,CAAC,CAAC,EAC/B,KAAK,EAAE,eAAe,GAAG,YAAY,EACrC,GAAG,EAAE,WAAW,GAAG,SAAS,EAC5B,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAChB,cAAc,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAwCnD;AAED,mGAAmG;AACnG,wBAAsB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAK9F"}
|
package/dist/loop.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tool loop of `llm.complete` and `llm.stream`.
|
|
3
|
+
*
|
|
4
|
+
* The loop sends a request and reads the answer. When the answer asks only for procedure tools,
|
|
5
|
+
* the loop starts them, sends the answer and the results back, and asks again. It stops when the
|
|
6
|
+
* model stops, or when `maxRounds` requests went out. The two procedures differ only in one
|
|
7
|
+
* step: `llm.complete` gets each answer as JSON, and `llm.stream` reads the event stream of each
|
|
8
|
+
* answer. A `SendTurn` function does that step.
|
|
9
|
+
*/
|
|
10
|
+
import { addUsage, NO_USAGE } from "./anthropic.js";
|
|
11
|
+
import { addTools, baseRequest, retriesOf, timeoutOf, toolParam } from "./request.js";
|
|
12
|
+
import { DEFAULT_MAX_ROUNDS, procedureTools, runToolUse } from "./tools.js";
|
|
13
|
+
/** The block types that the next turn drops before the final `fallback` block. */
|
|
14
|
+
const DROPPED_BEFORE_FALLBACK = new Set(["thinking", "redacted_thinking", "connector_text", "tool_use"]);
|
|
15
|
+
/**
|
|
16
|
+
* The content of an answer as the next request sends it back. After a server-side fallback in
|
|
17
|
+
* the middle of an answer, the blocks before the final `fallback` block came from the model that
|
|
18
|
+
* declined. The next turn drops their thinking, their `connector_text` and their client
|
|
19
|
+
* `tool_use` blocks, and each server tool use without its result. The `fallback` block, the
|
|
20
|
+
* text and each block after the final `fallback` block stay where they are. Without a `fallback`
|
|
21
|
+
* block, the content stays as it came. The rules are in the API docs, "Refusals and fallback",
|
|
22
|
+
* section "Continuing the conversation". Before, the loop sent the content back unchanged, and
|
|
23
|
+
* the next request could fail (tracker O34).
|
|
24
|
+
*/
|
|
25
|
+
export function continuationOf(content) {
|
|
26
|
+
let last = -1;
|
|
27
|
+
for (let index = content.length - 1; index >= 0; index--) {
|
|
28
|
+
if (content[index].type === "fallback") {
|
|
29
|
+
last = index;
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (last < 0)
|
|
34
|
+
return [...content];
|
|
35
|
+
// A server tool result names its tool use. The results can come after the fallback too.
|
|
36
|
+
const results = new Set(content.map((block) => block["tool_use_id"]).filter((id) => typeof id === "string"));
|
|
37
|
+
const kept = content.slice(0, last).filter((block) => {
|
|
38
|
+
if (DROPPED_BEFORE_FALLBACK.has(block.type))
|
|
39
|
+
return false;
|
|
40
|
+
if (block.type.endsWith("_tool_use"))
|
|
41
|
+
return typeof block["id"] === "string" && results.has(block["id"]);
|
|
42
|
+
return true;
|
|
43
|
+
});
|
|
44
|
+
return [...kept, ...content.slice(last)];
|
|
45
|
+
}
|
|
46
|
+
/** A forced `tool_choice` (`any` or `tool`) applies to the first request only. After it, the model can stop. */
|
|
47
|
+
function releaseToolChoice(request) {
|
|
48
|
+
const choice = request.tool_choice;
|
|
49
|
+
if (choice === undefined || (choice.type !== "any" && choice.type !== "tool"))
|
|
50
|
+
return;
|
|
51
|
+
const { disable_parallel_tool_use } = choice;
|
|
52
|
+
request.tool_choice = { type: "auto", ...(disable_parallel_tool_use !== undefined ? { disable_parallel_tool_use } : {}) };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* This function does the tool loop of one call. It gives the items of each answer and an item at
|
|
56
|
+
* the start and at the end of each procedure tool. The return value is the end of the loop. It
|
|
57
|
+
* throws before the first request for a tool that the host refuses or that is not valid.
|
|
58
|
+
*/
|
|
59
|
+
export async function* toolLoop(input, ctx, settings, path, send) {
|
|
60
|
+
const request = baseRequest(input, settings, input.system);
|
|
61
|
+
const procedures = procedureTools(input.procedures ?? [], ctx, path);
|
|
62
|
+
addTools(request, [...(input.tools ?? []).map(toolParam), ...procedures.map((tool) => tool.param)], input.toolChoice);
|
|
63
|
+
const byName = new Map(procedures.map((tool) => [tool.param.name, tool]));
|
|
64
|
+
const limits = { path, ctx, timeoutMs: timeoutOf(input) };
|
|
65
|
+
const retries = retriesOf(input.retries, settings);
|
|
66
|
+
const maxRounds = input.maxRounds ?? DEFAULT_MAX_ROUNDS;
|
|
67
|
+
let usage = NO_USAGE;
|
|
68
|
+
let text = "";
|
|
69
|
+
const toolCalls = [];
|
|
70
|
+
for (let round = 1;; round++) {
|
|
71
|
+
const answer = yield* send(request, settings, limits, retries);
|
|
72
|
+
usage = addUsage(usage, answer.usage);
|
|
73
|
+
text += answer.text;
|
|
74
|
+
// Only the tool uses that the next turn sends back can get a result: none before a fallback
|
|
75
|
+
const content = continuationOf(answer.content);
|
|
76
|
+
const sent = new Set(content.filter((block) => block.type === "tool_use").map((block) => block["id"]));
|
|
77
|
+
const uses = answer.toolUses.filter((use) => sent.has(use.id));
|
|
78
|
+
// The procedure runs the tools only when each tool of the answer is a procedure tool
|
|
79
|
+
const runnable = answer.stopReason === "tool_use" && uses.length > 0 && uses.every((use) => byName.has(use.name));
|
|
80
|
+
if (!runnable || round >= maxRounds) {
|
|
81
|
+
return { answer, model: answer.model || request.model, usage, text, toolCalls, rounds: round, roundLimit: runnable };
|
|
82
|
+
}
|
|
83
|
+
// One at a time, in the sequence of the answer: a procedure can change data that the next one reads
|
|
84
|
+
const results = [];
|
|
85
|
+
for (const use of uses) {
|
|
86
|
+
const tool = byName.get(use.name);
|
|
87
|
+
yield { type: "tool_call", round, id: use.id, name: use.name, procedure: tool.key, input: use.input };
|
|
88
|
+
const { call, result } = await runToolUse(use, tool, ctx);
|
|
89
|
+
toolCalls.push(call);
|
|
90
|
+
results.push(result);
|
|
91
|
+
yield { type: "tool_result", round, ...call };
|
|
92
|
+
}
|
|
93
|
+
// The next request continues the conversation: the answer (without the blocks that a fallback
|
|
94
|
+
// replaced), then the results
|
|
95
|
+
request.messages = [...request.messages, { role: "assistant", content }, { role: "user", content: results }];
|
|
96
|
+
releaseToolChoice(request);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** This function reads a generator to its end and gives its return value. It ignores the items. */
|
|
100
|
+
export async function returnOf(generator) {
|
|
101
|
+
for (;;) {
|
|
102
|
+
const step = await generator.next();
|
|
103
|
+
if (step.done)
|
|
104
|
+
return step.value;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=loop.js.map
|
package/dist/loop.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../src/loop.ts"],"names":[],"mappings":"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"}
|
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAWL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAwB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAoB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAWL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAwB,KAAK,SAAS,EAAE,KAAK,aAAa,EAAoB,MAAM,gBAAgB,CAAC;AAyO5G;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,eAAsF,CAAC;eAEhG,SAAS;AAExB,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,mFAAmF;IACnF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,iFAAiF;IACjF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,+FAA+F;IAC/F,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC3C,yGAAyG;IACzG,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,SAAS,CAAC;IACzD,0FAA0F;IAC1F,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,kGAAkG;IAClG,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,eAAe,CAyB/E;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,GAAE,iBAAsC,EAAE,OAAO,GAAE,gBAAqB,GAAG,IAAI,CAE5H"}
|
package/dist/module.js
CHANGED
|
@@ -84,16 +84,16 @@ const toolCall = z.object({
|
|
|
84
84
|
output: z.unknown().optional().describe("The output of the procedure"),
|
|
85
85
|
error: z.string().optional().describe("The error of the procedure"),
|
|
86
86
|
});
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
...toolFields,
|
|
87
|
+
/** The fields of procedures as tools, for `llm.complete` and `llm.stream`. */
|
|
88
|
+
const procedureFields = {
|
|
90
89
|
procedures: z
|
|
91
90
|
.array(z.string().regex(/^[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)*$/, "A procedure key, for example weather.current"))
|
|
92
91
|
.max(64)
|
|
93
92
|
.optional()
|
|
94
|
-
.describe("The procedures that the model can use as tools:
|
|
93
|
+
.describe("The procedures that the model can use as tools: the procedure calls them and sends the results back"),
|
|
95
94
|
maxRounds: z.number().int().min(1).max(64).optional().describe("The most requests to the model in one call, 1 to 64 (default 8)"),
|
|
96
|
-
}
|
|
95
|
+
};
|
|
96
|
+
const LlmCompleteInputSchema = z.object({ ...requestFields, ...toolFields, ...procedureFields });
|
|
97
97
|
const LlmCompleteOutputSchema = z.object({
|
|
98
98
|
text: z.string().describe("The text of the last answer"),
|
|
99
99
|
model: z.string().describe("The model that answered"),
|
|
@@ -118,8 +118,9 @@ const LlmStructuredOutputSchema = z.object({
|
|
|
118
118
|
usage,
|
|
119
119
|
unchecked: z.array(z.string()).describe("The keywords of the schema that the check does not examine fully"),
|
|
120
120
|
});
|
|
121
|
-
const LlmStreamInputSchema = z.object({ ...requestFields, ...toolFields });
|
|
121
|
+
const LlmStreamInputSchema = z.object({ ...requestFields, ...toolFields, ...procedureFields });
|
|
122
122
|
const index = z.number().int().describe("The index of the content block");
|
|
123
|
+
const round = z.number().int().describe("The number of the request whose answer asked for the tool");
|
|
123
124
|
const LlmStreamOutputSchema = z
|
|
124
125
|
.discriminatedUnion("type", [
|
|
125
126
|
z.object({ type: z.literal("start"), id: z.string().describe("The ID of the message"), model: z.string().describe("The model that answers"), usage }),
|
|
@@ -132,24 +133,36 @@ const LlmStreamOutputSchema = z
|
|
|
132
133
|
input: z.unknown().describe("The input of the call, or null when its JSON is not complete"),
|
|
133
134
|
partialJson: z.string().optional().describe("The JSON text of an input that does not parse"),
|
|
134
135
|
}),
|
|
136
|
+
z.object({
|
|
137
|
+
type: z.literal("tool_call"),
|
|
138
|
+
round,
|
|
139
|
+
id: z.string().describe("The ID of the tool_use block"),
|
|
140
|
+
name: z.string().describe("The name of the tool"),
|
|
141
|
+
procedure: z.string().describe("The key of the procedure"),
|
|
142
|
+
input: z.unknown().describe("The input that the model gave"),
|
|
143
|
+
}),
|
|
144
|
+
toolCall.extend({ type: z.literal("tool_result"), round }),
|
|
135
145
|
z.object({
|
|
136
146
|
type: z.literal("stop"),
|
|
137
|
-
model: z.string().describe("The model
|
|
138
|
-
stopReason: z.string().describe("Why the model stopped"),
|
|
139
|
-
usage,
|
|
140
|
-
text: z.string().describe("The text of the
|
|
141
|
-
toolUses: z.array(toolUse).describe("The tool_use blocks of the answer"),
|
|
147
|
+
model: z.string().describe("The model of the last answer"),
|
|
148
|
+
stopReason: z.string().describe("Why the model stopped in the last answer"),
|
|
149
|
+
usage: usage.describe("The tokens of all the requests, added together"),
|
|
150
|
+
text: z.string().describe("The text of all the answers: all the text deltas, joined"),
|
|
151
|
+
toolUses: z.array(toolUse).describe("The tool_use blocks of the last answer that no procedure ran"),
|
|
152
|
+
toolCalls: z.array(toolCall).optional().describe("The calls of the procedure tools, in their sequence. Only with procedures"),
|
|
153
|
+
rounds: z.number().int().optional().describe("The number of requests to the model. Only with procedures"),
|
|
154
|
+
roundLimit: z.boolean().optional().describe("True when maxRounds stopped the loop before the model stopped. Only with procedures"),
|
|
142
155
|
}),
|
|
143
156
|
])
|
|
144
|
-
.describe("One item of the stream: start, text, tool_use or stop");
|
|
157
|
+
.describe("One item of the stream: start, text, tool_use, tool_call, tool_result or stop");
|
|
145
158
|
// =============================================================================
|
|
146
159
|
// Procedures
|
|
147
160
|
// =============================================================================
|
|
148
161
|
/**
|
|
149
162
|
* The effects of each procedure: it sends data to a system outside the host and gets an answer.
|
|
150
163
|
* A call costs money and can change the state of an account, so it declares a write. It deletes
|
|
151
|
-
* nothing and a second call is a new call. The procedure tools of `llm.complete`
|
|
152
|
-
* the admission of the host examines each one.
|
|
164
|
+
* nothing and a second call is a new call. The procedure tools of `llm.complete` and `llm.stream`
|
|
165
|
+
* are nested calls: the admission of the host examines each one.
|
|
153
166
|
*/
|
|
154
167
|
const SENDS_TO_MODEL = Object.freeze({ reads: Object.freeze(["network"]), writes: Object.freeze(["network"]), destructive: false, idempotent: false });
|
|
155
168
|
/** The three procedures, with handlers that use the settings. */
|
|
@@ -191,8 +204,8 @@ function llmProcedures(settings) {
|
|
|
191
204
|
.input(zodAdapter(LlmStreamInputSchema))
|
|
192
205
|
.output(zodAdapter(LlmStreamOutputSchema))
|
|
193
206
|
.meta({
|
|
194
|
-
description: "Send a prompt to a language model and stream the events of the answer",
|
|
195
|
-
tags: ["llm", "anthropic", "stream"],
|
|
207
|
+
description: "Send a prompt to a language model and stream the events of the answer. The model can use tools and procedures",
|
|
208
|
+
tags: ["llm", "anthropic", "stream", "tools"],
|
|
196
209
|
args: ["prompt"],
|
|
197
210
|
shorts: { model: "m", system: "s" },
|
|
198
211
|
output: "json",
|
|
@@ -203,6 +216,8 @@ function llmProcedures(settings) {
|
|
|
203
216
|
})
|
|
204
217
|
.handler(((input, ctx) => llmStream(input, ctx, settings)))
|
|
205
218
|
.build();
|
|
219
|
+
// The same rule as for llm.complete: the input names the procedures that the model can call
|
|
220
|
+
markDataDriven(llmStreamProcedure);
|
|
206
221
|
return [llmCompleteProcedure, llmStructuredProcedure, llmStreamProcedure];
|
|
207
222
|
}
|
|
208
223
|
/**
|