@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/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. Before
18
- * the first item, a retryable error gets a new try, at most `retries` times.
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, void, undefined>;
25
+ export declare function streamMessages(request: MessagesRequest, settings: LlmSettings, limits: CallLimits, retries: number): AsyncGenerator<LlmStreamOutput, TurnAnswer, undefined>;
21
26
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAA2D,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGlJ,OAAO,KAAK,EAAE,eAAe,EAAwB,MAAM,YAAY,CAAC;AAoLxE;;;GAGG;AACH,wBAAuB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC,eAAe,EAAE,IAAI,EAAE,SAAS,CAAC,CAc5K"}
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 state of one stream: it turns each event into the items of the procedure. */
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, { type, id: stringOf(block["id"]) ?? "", name: stringOf(block["name"]) ?? "", json: "" });
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
- const deltaType = stringOf(delta["type"]);
111
- if (deltaType === "text_delta") {
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 block = this.blocks.get(index);
187
+ const open = this.blocks.get(index);
188
+ if (open === undefined)
189
+ return [];
125
190
  this.blocks.delete(index);
126
- if (block?.type !== "tool_use")
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
- let input = {};
129
- let partialJson;
130
- if (block.json.trim() !== "") {
131
- try {
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 [{ type: "stop", model: this.model, stopReason: this.stopReason, usage: this.usage, text: this.text, toolUses: [...this.toolUses] }];
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. Before
199
- * the first item, a retryable error gets a new try, at most `retries` times.
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
- let started = false;
269
+ const progress = { started: false };
205
270
  try {
206
- for await (const item of streamOnce(body, settings, limits)) {
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
  }
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop.js","sourceRoot":"","sources":["../src/loop.ts"],"names":[],"mappings":"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"}
@@ -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;AAwN5G;;;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"}
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
- const LlmCompleteInputSchema = z.object({
88
- ...requestFields,
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: llm.complete calls them and sends the results back"),
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 that answered"),
138
- stopReason: z.string().describe("Why the model stopped"),
139
- usage,
140
- text: z.string().describe("The text of the answer: all the text deltas, joined"),
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` are nested calls:
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
  /**