@providerkit/core 0.23.0 → 0.24.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.
Files changed (62) hide show
  1. package/README.md +29 -7
  2. package/dist/auth/with-token.d.ts +4 -1
  3. package/dist/auth/with-token.d.ts.map +1 -1
  4. package/dist/auth/with-token.js +4 -1
  5. package/dist/auth/with-token.js.map +1 -1
  6. package/dist/gate.d.ts +29 -0
  7. package/dist/gate.d.ts.map +1 -0
  8. package/dist/gate.js +96 -0
  9. package/dist/gate.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +3 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/key-pool.d.ts +11 -0
  15. package/dist/key-pool.d.ts.map +1 -1
  16. package/dist/key-pool.js +14 -0
  17. package/dist/key-pool.js.map +1 -1
  18. package/dist/providers/anthropic.d.ts +7 -0
  19. package/dist/providers/anthropic.d.ts.map +1 -1
  20. package/dist/providers/anthropic.js +3 -1
  21. package/dist/providers/anthropic.js.map +1 -1
  22. package/dist/providers/factory.d.ts +26 -0
  23. package/dist/providers/factory.d.ts.map +1 -1
  24. package/dist/providers/factory.js +41 -9
  25. package/dist/providers/factory.js.map +1 -1
  26. package/dist/providers/openai.d.ts +7 -0
  27. package/dist/providers/openai.d.ts.map +1 -1
  28. package/dist/providers/openai.js +3 -1
  29. package/dist/providers/openai.js.map +1 -1
  30. package/dist/providers/responses.d.ts +11 -0
  31. package/dist/providers/responses.d.ts.map +1 -1
  32. package/dist/providers/responses.js +3 -1
  33. package/dist/providers/responses.js.map +1 -1
  34. package/dist/registry.d.ts +105 -0
  35. package/dist/registry.d.ts.map +1 -0
  36. package/dist/registry.js +291 -0
  37. package/dist/registry.js.map +1 -0
  38. package/dist/tools.d.ts +8 -0
  39. package/dist/tools.d.ts.map +1 -1
  40. package/dist/tools.js +2 -2
  41. package/dist/tools.js.map +1 -1
  42. package/dist/turn.d.ts +55 -0
  43. package/dist/turn.d.ts.map +1 -0
  44. package/dist/turn.js +125 -0
  45. package/dist/turn.js.map +1 -0
  46. package/dist/types.d.ts +8 -22
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/types.js +0 -45
  49. package/dist/types.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/auth/with-token.ts +4 -1
  52. package/src/gate.ts +152 -0
  53. package/src/index.ts +3 -0
  54. package/src/key-pool.ts +15 -0
  55. package/src/providers/anthropic.ts +10 -1
  56. package/src/providers/factory.ts +66 -21
  57. package/src/providers/openai.ts +10 -1
  58. package/src/providers/responses.ts +14 -1
  59. package/src/registry.ts +420 -0
  60. package/src/tools.ts +10 -2
  61. package/src/turn.ts +166 -0
  62. package/src/types.ts +8 -62
@@ -0,0 +1,291 @@
1
+ // Providers and credentials, set up once per app.
2
+ //
3
+ // Every app on this package wrote the same block: build each provider from
4
+ // env, wrap it in a watchdog, chain a few into a fallback pool, keep that pool
5
+ // alive so its cooldowns survive, and cache it somewhere. The OpenCode Go
6
+ // chain alone was copied seven times. Where an app put the watchdog or the
7
+ // error envelope together by hand, it got it wrong (AGENTS.md, "A bump is an
8
+ // audit too"). A registry names each connection once, and `get` hands back
9
+ // the composition already assembled.
10
+ //
11
+ // The layers, outside in: the view (per-call effort and `maxTokens`), the
12
+ // fallback pool when there is more than one candidate, then per candidate the
13
+ // gate, the watchdog and the adapter.
14
+ //
15
+ // ponytail: one registry per process. Per-tenant keys would need one registry
16
+ // per tenant, and no app needs that yet.
17
+ import { ProviderError } from "./errors.js";
18
+ import { withFallbackProviders } from "./fallback.js";
19
+ import { createGate, withGate } from "./gate.js";
20
+ import { KeyPool, withKeyPool } from "./key-pool.js";
21
+ import { PROVIDER_PRESETS } from "./presets.js";
22
+ import { presetAdapter } from "./providers/factory.js";
23
+ import { withWatchdog } from "./watchdog.js";
24
+ // A value import from the `auth/` subpath, and a cheap one: with-token.ts
25
+ // imports only errors.ts at runtime and the sign-in flows as types, so the
26
+ // main entry gains these few lines and none of oauth, device or flows.
27
+ import { withToken } from "./auth/with-token.js";
28
+ export function createRegistry(options) {
29
+ const connections = new Map();
30
+ const chainRefs = new Map(Object.entries(options.chains ?? {}));
31
+ /** Built chains by ref, with the connections each one uses. */
32
+ const built = new Map();
33
+ // One store for every chain, so a candidate benched in one is benched in
34
+ // all. Weak, so a candidate dropped by `update` takes its bench with it.
35
+ const cooldowns = new WeakMap();
36
+ const refOf = new WeakMap();
37
+ const { onCooldown, ...fallback } = options.fallback ?? {};
38
+ const poolOptions = {
39
+ ...fallback,
40
+ cooldowns,
41
+ ...(onCooldown
42
+ ? {
43
+ onCooldown: (info) => onCooldown({ ...info, ref: refOf.get(info.candidate) ?? info.candidate.id }),
44
+ }
45
+ : {}),
46
+ };
47
+ for (const [name, refs] of chainRefs) {
48
+ if (!name || name.includes("/")) {
49
+ throw new Error(`[providerkit] Chain name "${name}" can't be empty or contain "/".`);
50
+ }
51
+ if (refs.length === 0)
52
+ throw new Error(`[providerkit] Chain "${name}" lists no refs.`);
53
+ }
54
+ // `open` refuses a connection named like a chain.
55
+ for (const [name, config] of Object.entries(options.connections)) {
56
+ connections.set(name, open(name, config));
57
+ }
58
+ // Checked once every connection exists, so a chain may name any of them.
59
+ for (const name of chainRefs.keys())
60
+ members(name);
61
+ function open(name, config, current) {
62
+ if (!name || name.includes("/")) {
63
+ throw new Error(`[providerkit] Connection name "${name}" can't be empty or contain "/".`);
64
+ }
65
+ if (chainRefs.has(name)) {
66
+ throw new Error(`[providerkit] "${name}" names both a chain and a connection. Rename one of them.`);
67
+ }
68
+ if (!(config.preset in PROVIDER_PRESETS)) {
69
+ throw new Error(`[providerkit] Connection "${name}" names an unknown preset "${config.preset}".`);
70
+ }
71
+ const credentials = [config.apiKey, config.keys, config.token].filter((c) => c !== undefined);
72
+ if (credentials.length !== 1) {
73
+ throw new Error(`[providerkit] Connection "${name}" needs exactly one of apiKey, keys or token. ` +
74
+ `It has ${credentials.length}.`);
75
+ }
76
+ return {
77
+ config,
78
+ gate: gateFor(config, current),
79
+ keyPool: config.keys ? new KeyPool(name, config.keys) : undefined,
80
+ candidates: new Map(),
81
+ };
82
+ }
83
+ /** The (connection, model) pairs a ref names, in order, duplicates dropped. */
84
+ function members(ref) {
85
+ const inChain = chainRefs.get(ref);
86
+ const out = new Map();
87
+ for (const member of inChain ?? [ref]) {
88
+ const slash = member.indexOf("/");
89
+ const name = slash < 0 ? member : member.slice(0, slash);
90
+ if (inChain && chainRefs.has(member)) {
91
+ throw new Error(`[providerkit] Chain "${ref}" names chain "${member}". List its refs instead.`);
92
+ }
93
+ const connection = connections.get(name);
94
+ if (!connection) {
95
+ throw new Error(inChain
96
+ ? `[providerkit] Chain "${ref}" names connection "${name}", which doesn't exist.`
97
+ : `[providerkit] "${ref}" is not a chain or a connection. ` +
98
+ `Known: ${[...chainRefs.keys(), ...connections.keys()].join(", ")}.`);
99
+ }
100
+ const models = slash < 0 ? modelsOf(name, connection.config) : [member.slice(slash + 1)];
101
+ for (const model of models) {
102
+ if (!model)
103
+ throw new Error(`[providerkit] "${member}" has an empty model after "/".`);
104
+ const key = `${name}/${model}`;
105
+ if (!out.has(key))
106
+ out.set(key, { name, model });
107
+ }
108
+ }
109
+ return [...out.values()];
110
+ }
111
+ /** Get the provider for a ref, building it on first use. */
112
+ function resolve(ref) {
113
+ const cached = built.get(ref);
114
+ if (cached)
115
+ return cached.provider;
116
+ const list = members(ref);
117
+ const candidates = list.map(({ name, model }) => candidate(name, model));
118
+ // A single candidate gets no pool. A pool of one benches the only option:
119
+ // a 503 a retry would absorb in a second becomes 30 s of instant
120
+ // NoAvailableProviderError, and the real kind hides behind `rate`. KeyPool
121
+ // refuses to bench its last key for the same reason.
122
+ const provider = candidates.length === 1 ? candidates[0] : withFallbackProviders(candidates, poolOptions);
123
+ built.set(ref, { provider, uses: new Set(list.map(({ name }) => name)) });
124
+ return provider;
125
+ }
126
+ function candidate(name, model) {
127
+ const connection = connections.get(name);
128
+ const cached = connection.candidates.get(model);
129
+ if (cached)
130
+ return cached;
131
+ const { config, keyPool } = connection;
132
+ const { preset, apiKey: _apiKey, keys: _keys, token: _token, models: _models, maxConcurrent: _maxConcurrent, watchdog: _watchdog, headers, ...rest } = config;
133
+ // One session id per candidate, kept by every adapter a key pool or a
134
+ // token builds for it. A new id per attempt made a sticky gateway treat
135
+ // every call as a new session and miss its prompt cache.
136
+ const base = { ...rest, model, instanceSessionId: crypto.randomUUID() };
137
+ let provider;
138
+ if (config.token) {
139
+ // The credential's host and headers win: Copilot gives each plan its
140
+ // own host, and the Codex backend refuses a call without its account id.
141
+ provider = withToken(config.token, (auth) => presetAdapter(preset, { ...base, ...auth, headers: { ...headers, ...auth.headers } }));
142
+ }
143
+ else if (config.keys) {
144
+ // `open` builds the pool whenever `keys` is set.
145
+ provider = withKeyPool(keyPool, (key) => presetAdapter(preset, { ...base, headers, apiKey: key }));
146
+ }
147
+ else {
148
+ provider = presetAdapter(preset, { ...base, headers, apiKey: config.apiKey });
149
+ }
150
+ // On unless turned off, where `createPresetProvider` adds one only when
151
+ // asked. Handing apps the whole composition is the point of a registry:
152
+ // two apps that wired the watchdog themselves left keep-alives uncounted,
153
+ // so the idle clock would cut a long tool call at 60 s (AGENTS.md, "A bump
154
+ // is an audit too").
155
+ const watchdog = config.watchdog === undefined ? options.watchdog : config.watchdog;
156
+ if (watchdog !== false)
157
+ provider = withWatchdog(provider, watchdog);
158
+ // Outside the watchdog, so a call waiting for a slot spends no deadline.
159
+ if (connection.gate)
160
+ provider = withGate(provider, connection.gate);
161
+ connection.candidates.set(model, provider);
162
+ refOf.set(provider, `${name}/${model}`);
163
+ return provider;
164
+ }
165
+ /** Drop every built chain that uses this connection. */
166
+ function forget(name) {
167
+ for (const [ref, entry] of built)
168
+ if (entry.uses.has(name))
169
+ built.delete(ref);
170
+ }
171
+ function view(ref, viewOpts) {
172
+ return {
173
+ get id() {
174
+ return resolve(ref).id;
175
+ },
176
+ get model() {
177
+ return resolve(ref).model;
178
+ },
179
+ createStream(messages, tools, opts = {}) {
180
+ async function* viewed() {
181
+ // A pool applies a per-call model to its primary only, and a single
182
+ // candidate would post it to a connection picked for another model.
183
+ if (opts.model) {
184
+ throw new ProviderError(ref, "invalid", `${ref}: a registry provider can't take a per-call model. ` +
185
+ `Ask the registry for it instead: get("conn/${opts.model}").`);
186
+ }
187
+ // Looked up per call, so `update` reaches a provider taken at boot.
188
+ const provider = resolve(ref);
189
+ for await (const chunk of provider.createStream(messages, tools, {
190
+ ...opts,
191
+ effort: opts.effort ?? viewOpts.effort,
192
+ maxTokens: opts.maxTokens ?? viewOpts.maxTokens,
193
+ })) {
194
+ // A pool names the endpoint that answered; a single candidate is
195
+ // the endpoint, so its chunks get the same field.
196
+ yield chunk.source
197
+ ? chunk
198
+ : { ...chunk, source: { provider: provider.id, model: provider.model } };
199
+ }
200
+ }
201
+ return viewed();
202
+ },
203
+ };
204
+ }
205
+ return {
206
+ get(ref, opts = {}) {
207
+ members(ref);
208
+ return view(ref, opts);
209
+ },
210
+ update(name, config) {
211
+ const current = connections.get(name);
212
+ if (current && sameValue(current.config, config))
213
+ return;
214
+ connections.set(name, open(name, config, current));
215
+ forget(name);
216
+ },
217
+ remove(name) {
218
+ connections.delete(name);
219
+ forget(name);
220
+ },
221
+ status() {
222
+ const out = {};
223
+ for (const [name, { gate, keyPool, candidates }] of connections) {
224
+ out[name] = {
225
+ ...(gate ? { gate: { max: gate.max, held: gate.held, waiting: gate.waiting } } : {}),
226
+ ...(keyPool ? { keys: keyPool.status() } : {}),
227
+ candidates: [...candidates].map(([model, provider]) => {
228
+ const { probe, ...bench } = cooldowns.get(provider) ?? { retryAtMs: 0 };
229
+ return { ref: `${name}/${model}`, ...bench, probing: probe !== undefined };
230
+ }),
231
+ };
232
+ }
233
+ return out;
234
+ },
235
+ };
236
+ }
237
+ function gateFor(config, current) {
238
+ if (config.maxConcurrent === undefined)
239
+ return undefined;
240
+ // Calls in flight hold slots on the current gate. A fresh one with the same
241
+ // limit would let `max` more through beside them.
242
+ if (current?.gate && current.config.maxConcurrent === config.maxConcurrent)
243
+ return current.gate;
244
+ return createGate(config.maxConcurrent);
245
+ }
246
+ /** A bare connection's models: `models`, then `model`, then the preset's
247
+ * rotation, then its default. The order `createPresetProvider` uses. */
248
+ function modelsOf(name, config) {
249
+ const preset = PROVIDER_PRESETS[config.preset];
250
+ if (config.models?.length)
251
+ return config.models;
252
+ if (config.model)
253
+ return [config.model];
254
+ if (preset.rotation?.length)
255
+ return preset.rotation;
256
+ if (preset.defaultModel)
257
+ return [preset.defaultModel];
258
+ throw new Error(`[providerkit] Connection "${name}" names no model, and preset "${config.preset}" has no ` +
259
+ "default. Set model or models.");
260
+ }
261
+ /**
262
+ * Equality for configs: plain objects and arrays by their contents, functions
263
+ * and every other object by identity. A key set to `undefined` equals a key
264
+ * left out. So an app that re-reads its config on every request rebuilds
265
+ * nothing, as long as it hands back the same `TokenSource`, `fetchImpl` and
266
+ * `onEvict` each time: a new one is a change, even when it does the same.
267
+ */
268
+ function sameValue(a, b) {
269
+ if (Object.is(a, b))
270
+ return true;
271
+ if (Array.isArray(a) || Array.isArray(b)) {
272
+ return (Array.isArray(a) &&
273
+ Array.isArray(b) &&
274
+ a.length === b.length &&
275
+ a.every((value, i) => sameValue(value, b[i])));
276
+ }
277
+ if (!isPlainObject(a) || !isPlainObject(b))
278
+ return false;
279
+ for (const key of new Set([...Object.keys(a), ...Object.keys(b)])) {
280
+ if (!sameValue(a[key], b[key]))
281
+ return false;
282
+ }
283
+ return true;
284
+ }
285
+ function isPlainObject(value) {
286
+ if (typeof value !== "object" || value === null)
287
+ return false;
288
+ const proto = Object.getPrototypeOf(value);
289
+ return proto === Object.prototype || proto === null;
290
+ }
291
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/dist/tools.d.ts CHANGED
@@ -39,8 +39,16 @@ export interface ToolSpec<I, O> {
39
39
  summarize?: (output: O) => string;
40
40
  /** Default 60s. A tool with no ceiling can hang a whole run. */
41
41
  timeoutMs?: number;
42
+ /**
43
+ * The tool changes nothing. Default false: a flag that promises safety is
44
+ * true only when the tool says so. `repairHistory` tells the model an
45
+ * interrupted read-only call "changed nothing, so it is safe to call again",
46
+ * and a write that left this out used to be told that too.
47
+ */
42
48
  isReadOnly?: boolean;
43
49
  needsApproval?: boolean;
50
+ /** The tool may run in parallel with others. Default false, for the same
51
+ * reason as `isReadOnly`: two writes run at once by omission can race. */
44
52
  isConcurrencySafe?: boolean;
45
53
  /** A terminal tool ends the run; its validated input is the run's output. */
46
54
  isTerminal?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/dist/tools.js CHANGED
@@ -67,9 +67,9 @@ export function defineTool(spec) {
67
67
  description: spec.description,
68
68
  inputSchema: spec.inputSchema,
69
69
  timeoutMs,
70
- isReadOnly: spec.isReadOnly ?? true,
70
+ isReadOnly: spec.isReadOnly ?? false,
71
71
  needsApproval: spec.needsApproval ?? false,
72
- isConcurrencySafe: spec.isConcurrencySafe ?? true,
72
+ isConcurrencySafe: spec.isConcurrencySafe ?? false,
73
73
  isTerminal: spec.isTerminal ?? false,
74
74
  definition() {
75
75
  cached ??= {
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/dist/turn.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ import { type ChatMessage, type FinishReason, type ProviderChunk, type ReasoningItems, type TokenUsage, type ToolCall } from "./types.ts";
2
+ /** One drained turn: the message a loop appends, whose `toolCalls` are the
3
+ * calls it runs, and what the turn cost. */
4
+ export interface Turn {
5
+ /** Ready to append to history as it is. `toolCalls` holds the calls to run,
6
+ * in the order the provider indexed them, and is absent when there are none. */
7
+ message: Extract<ChatMessage, {
8
+ role: "assistant";
9
+ }>;
10
+ /** The last usage the stream reported, or zeros when it reported none. */
11
+ usage: TokenUsage;
12
+ /** As the provider stated it, and null when it stated none. */
13
+ finishReason: FinishReason | null;
14
+ /** The endpoint and model that answered, when a fallback provider says. */
15
+ source?: {
16
+ provider: string;
17
+ model: string;
18
+ };
19
+ }
20
+ /**
21
+ * Drain one turn into the assistant message it produced, plus its usage,
22
+ * finish reason and source.
23
+ *
24
+ * ```ts
25
+ * const turn = await collectTurn(provider.createStream(history, tools));
26
+ * history.push(turn.message);
27
+ * for (const call of turn.message.toolCalls ?? []) history.push(await run(call));
28
+ * ```
29
+ *
30
+ * @throws {ProviderError} `overload` when a tool call ends the stream with no
31
+ * name. Whatever the stream itself throws passes through unchanged.
32
+ */
33
+ export declare function collectTurn(stream: AsyncIterable<ProviderChunk>): Promise<Turn>;
34
+ export interface Completion {
35
+ text: string;
36
+ /** Present when the stream identifies the endpoint that answered. */
37
+ provider?: string;
38
+ reasoning: string;
39
+ /** Present only where the provider sent one. See ChatMessage.reasoningDetails. */
40
+ reasoningDetails?: unknown[];
41
+ /** Present only where the provider sent them. See ChatMessage.reasoningItems. */
42
+ reasoningItems?: ReasoningItems;
43
+ /** The calls the model asked for, in index order, and empty when it asked
44
+ * for none. Before this field a drained turn that called a tool read as a
45
+ * turn that said nothing. */
46
+ toolCalls: ToolCall[];
47
+ usage: TokenUsage;
48
+ finishReason: FinishReason | null;
49
+ model: string;
50
+ }
51
+ /** Drain a stream into a Completion: `collectTurn`, flattened for a caller
52
+ * that wants the answer rather than a message to append. `model` names the
53
+ * model unless a fallback provider stamped the one that answered. */
54
+ export declare function drainStream(stream: AsyncIterable<ProviderChunk>, model: string): Promise<Completion>;
55
+ //# sourceMappingURL=turn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn.d.ts","sourceRoot":"","sources":["../src/turn.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,QAAQ,EACd,MAAM,YAAY,CAAC;AAEpB;6CAC6C;AAC7C,MAAM,WAAW,IAAI;IACnB;qFACiF;IACjF,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IACrD,0EAA0E;IAC1E,KAAK,EAAE,UAAU,CAAC;IAClB,+DAA+D;IAC/D,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,2EAA2E;IAC3E,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ErF;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC;IAC7B,iFAAiF;IACjF,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;kCAE8B;IAC9B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;sEAEsE;AACtE,wBAAsB,WAAW,CAC/B,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,EACpC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,CAAC,CAarB"}
package/dist/turn.js ADDED
@@ -0,0 +1,125 @@
1
+ // One turn, drained. Every agent loop reads a stream the same way: text and
2
+ // reasoning joined, tool-call fragments put back together by index, usage and
3
+ // finish taken from the last chunk that states them. The apps that use this
4
+ // package each wrote that by hand, a little differently each time, and the
5
+ // one in `drainStream` dropped the tool calls altogether.
6
+ //
7
+ // It assembles and nothing else. Arguments stay the raw string the seam
8
+ // promises, because tool-args.ts heals them and tools.ts validates them. And a
9
+ // turn that said nothing is not judged here: that is `requireContent`'s call
10
+ // (invariant 13), made where the retry that can fix it still can.
11
+ import { ProviderError } from "./errors.js";
12
+ import { EMPTY_USAGE, } from "./types.js";
13
+ /**
14
+ * Drain one turn into the assistant message it produced, plus its usage,
15
+ * finish reason and source.
16
+ *
17
+ * ```ts
18
+ * const turn = await collectTurn(provider.createStream(history, tools));
19
+ * history.push(turn.message);
20
+ * for (const call of turn.message.toolCalls ?? []) history.push(await run(call));
21
+ * ```
22
+ *
23
+ * @throws {ProviderError} `overload` when a tool call ends the stream with no
24
+ * name. Whatever the stream itself throws passes through unchanged.
25
+ */
26
+ export async function collectTurn(stream) {
27
+ let content = "";
28
+ let reasoning = "";
29
+ // Not concatenated: this half of the record is a payload the provider owns,
30
+ // and it arrives whole on one delta rather than in fragments. Dropped here,
31
+ // a drained turn replays only half its own reasoning on the next round,
32
+ // which is the failure `reasoningDetails` exists to prevent.
33
+ let reasoningDetails;
34
+ let reasoningItems;
35
+ const calls = new Map();
36
+ // Cumulative on some providers and final-only on others: the LAST one wins.
37
+ let usage = EMPTY_USAGE;
38
+ let finishReason = null;
39
+ let source;
40
+ // Read to the end, past the finish chunk: the OpenAI shape sends its usage
41
+ // after it, and a loop that stopped at the finish would bill every turn at zero.
42
+ for await (const chunk of stream) {
43
+ if (chunk.source)
44
+ source = chunk.source;
45
+ if (chunk.content)
46
+ content += chunk.content;
47
+ if (chunk.reasoning)
48
+ reasoning += chunk.reasoning;
49
+ if (chunk.reasoningDetails?.length)
50
+ reasoningDetails = chunk.reasoningDetails;
51
+ if (chunk.reasoningItems?.items.length)
52
+ reasoningItems = chunk.reasoningItems;
53
+ for (const delta of chunk.toolCalls ?? []) {
54
+ const call = calls.get(delta.index) ?? { id: "", name: "", arguments: "" };
55
+ // Identity is the last value STATED, so an empty one never erases a real
56
+ // one: Anthropic opens a call with `""` for what it lacks, and the
57
+ // ChatGPT backend states the real call_id and name only on the call's
58
+ // closing event. A call that never states an id keeps `""`. The four
59
+ // adapters here mint one before their finish (`settleToolCalls`); for any
60
+ // other Provider, one made up here would be ours and not the wire's
61
+ // (invariant 10), and `repairHistory` already names it the same way on
62
+ // every send. Arguments are fragments, joined in arrival order.
63
+ if (delta.id)
64
+ call.id = delta.id;
65
+ if (delta.name)
66
+ call.name = delta.name;
67
+ if (delta.thoughtSignature)
68
+ call.thoughtSignature = delta.thoughtSignature;
69
+ call.arguments += delta.arguments ?? "";
70
+ calls.set(delta.index, call);
71
+ }
72
+ if (chunk.usage)
73
+ usage = chunk.usage;
74
+ if (chunk.finishReason)
75
+ finishReason = chunk.finishReason;
76
+ }
77
+ // By index, not by arrival: parallel calls interleave their fragments.
78
+ const indexed = [...calls].sort(([a], [b]) => a - b);
79
+ const nameless = indexed.find(([, call]) => !call.name);
80
+ if (nameless) {
81
+ const [index, call] = nameless;
82
+ // `overload`, the kind for a provider's own anomaly inside a 200 (an empty
83
+ // body, a turn that completed with nothing): our request was fine, the
84
+ // vendor's frame was not. A retry may well get a whole call, and another
85
+ // model is a fair next try if this one keeps doing it. `invalid` would
86
+ // blame our request and stop the run over a fault that is not ours. The
87
+ // four adapters here fail such a call themselves, with the same kind
88
+ // (`settleToolCalls`); this gives any other Provider the same answer.
89
+ const provider = source?.provider ?? "turn";
90
+ const which = call.id || `at index ${index}`;
91
+ throw new ProviderError(provider, "overload", `${provider}: tool call ${which} ended with no name, so there is no tool to run`);
92
+ }
93
+ const toolCalls = indexed.map(([, call]) => call);
94
+ return {
95
+ message: {
96
+ role: "assistant",
97
+ content,
98
+ ...(reasoning ? { reasoning } : {}),
99
+ ...(reasoningDetails ? { reasoningDetails } : {}),
100
+ ...(reasoningItems ? { reasoningItems } : {}),
101
+ ...(toolCalls.length > 0 ? { toolCalls } : {}),
102
+ },
103
+ usage,
104
+ finishReason,
105
+ ...(source ? { source } : {}),
106
+ };
107
+ }
108
+ /** Drain a stream into a Completion: `collectTurn`, flattened for a caller
109
+ * that wants the answer rather than a message to append. `model` names the
110
+ * model unless a fallback provider stamped the one that answered. */
111
+ export async function drainStream(stream, model) {
112
+ const { message, usage, finishReason, source } = await collectTurn(stream);
113
+ return {
114
+ text: message.content,
115
+ reasoning: message.reasoning ?? "",
116
+ ...(message.reasoningDetails ? { reasoningDetails: message.reasoningDetails } : {}),
117
+ ...(message.reasoningItems ? { reasoningItems: message.reasoningItems } : {}),
118
+ toolCalls: message.toolCalls ?? [],
119
+ usage,
120
+ finishReason,
121
+ model: source?.model ?? model,
122
+ ...(source ? { provider: source.provider } : {}),
123
+ };
124
+ }
125
+ //# sourceMappingURL=turn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn.js","sourceRoot":"","sources":["../src/turn.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -51,8 +51,9 @@ export interface FilePart {
51
51
  export type ContentPart = TextPart | ImagePart | FilePart;
52
52
  /**
53
53
  * A tool the model asked to run. `arguments` is the RAW JSON string, not a
54
- * parsed object: it arrives in fragments and can be truncated mid-stream, so
55
- * assembly and validation are the consumer's job (see tools/define).
54
+ * parsed object: it arrives in fragments and can be truncated mid-stream.
55
+ * `collectTurn` joins the fragments; healing and validating them is the
56
+ * consumer's job (see tools/define).
56
57
  */
57
58
  export interface ToolCall {
58
59
  id: string;
@@ -127,7 +128,7 @@ export interface ToolDefinition {
127
128
  inputSchema: JsonObjectSchema;
128
129
  }
129
130
  export type FinishReason = "stop" | "length" | "tool_calls" | "content_filter";
130
- /** Incremental tool-call fragment, assembled by `index` by the consumer. */
131
+ /** Incremental tool-call fragment, assembled by `index`. `collectTurn` does it. */
131
132
  export interface ToolCallDelta {
132
133
  index: number;
133
134
  id?: string;
@@ -275,9 +276,10 @@ export interface StreamOptions {
275
276
  */
276
277
  jsonWithTools?: JsonWithTools;
277
278
  /**
278
- * Stable id for the conversation or job this call belongs to. Sent only to
279
- * endpoints whose preset names a `sessionHeader` (OpenCode Go routes and
280
- * caches by it); every other endpoint ignores it.
279
+ * Stable id for the conversation or job this call belongs to. Sent in the
280
+ * `sessionHeader` of endpoints that name one (OpenCode Go routes and caches
281
+ * by it), and as `prompt_cache_key` on the Responses shape. A call without
282
+ * one sends the provider's `instanceSessionId` in that header instead.
281
283
  */
282
284
  sessionId?: string;
283
285
  /**
@@ -322,22 +324,6 @@ export interface Provider {
322
324
  readonly model: string;
323
325
  createStream(messages: ChatMessage[], tools: ToolDefinition[], opts?: StreamOptions): AsyncIterable<ProviderChunk>;
324
326
  }
325
- export interface Completion {
326
- text: string;
327
- /** Present when the stream identifies the endpoint that answered. */
328
- provider?: string;
329
- reasoning: string;
330
- /** Present only where the provider sent one. See ChatMessage.reasoningDetails. */
331
- reasoningDetails?: unknown[];
332
- /** Present only where the provider sent them. See ChatMessage.reasoningItems. */
333
- reasoningItems?: ReasoningItems;
334
- usage: TokenUsage;
335
- finishReason: FinishReason | null;
336
- model: string;
337
- }
338
- /** Drain a no-tools stream into a Completion. Usage chunks are cumulative on
339
- * some providers and final-only on others: the LAST one wins. */
340
- export declare function drainStream(stream: AsyncIterable<ProviderChunk>, model: string): Promise<Completion>;
341
327
  /**
342
328
  * Prepare a history for a thinking-DISABLED turn: strip `reasoning` from every
343
329
  * assistant message.