@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
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -128,51 +128,6 @@ function bracketed(text) {
128
128
  }
129
129
  return text.slice(start);
130
130
  }
131
- /** Drain a no-tools stream into a Completion. Usage chunks are cumulative on
132
- * some providers and final-only on others: the LAST one wins. */
133
- export async function drainStream(stream, model) {
134
- let text = "";
135
- let reasoning = "";
136
- // Not concatenated: this half of the record is a payload the provider owns,
137
- // and it arrives whole on one delta rather than in fragments. Dropped here,
138
- // a drained turn replays only half its own reasoning on the next round —
139
- // which is the failure `reasoningDetails` exists to prevent.
140
- let reasoningDetails;
141
- let reasoningItems;
142
- let usage = EMPTY_USAGE;
143
- let finishReason = null;
144
- let source;
145
- for await (const chunk of stream) {
146
- if (chunk.source)
147
- source = chunk.source;
148
- if (chunk.type === "delta") {
149
- if (chunk.content)
150
- text += chunk.content;
151
- if (chunk.reasoning)
152
- reasoning += chunk.reasoning;
153
- if (chunk.reasoningDetails?.length)
154
- reasoningDetails = chunk.reasoningDetails;
155
- if (chunk.reasoningItems?.items.length)
156
- reasoningItems = chunk.reasoningItems;
157
- }
158
- else if (chunk.type === "usage" && chunk.usage) {
159
- usage = chunk.usage;
160
- }
161
- else if (chunk.type === "finish" && chunk.finishReason) {
162
- finishReason = chunk.finishReason;
163
- }
164
- }
165
- return {
166
- text,
167
- reasoning,
168
- ...(reasoningDetails ? { reasoningDetails } : {}),
169
- ...(reasoningItems ? { reasoningItems } : {}),
170
- usage,
171
- finishReason,
172
- model: source?.model ?? model,
173
- ...(source ? { provider: source.provider } : {}),
174
- };
175
- }
176
131
  /**
177
132
  * Prepare a history for a thinking-DISABLED turn: strip `reasoning` from every
178
133
  * assistant message.
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAU,CAAC;AAGzE,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC;AACpD,CAAC;AAoKD,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC,WAAW,EAAE,CAAC;IACd,iBAAiB,EAAE,CAAC;IACpB,YAAY,EAAE,CAAC;CAChB,CAAC;AAyCF;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,WAAW,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,yEAAyE;YACzE,sEAAsE;YACtE,0EAA0E;YAC1E,4EAA4E;YAC5E,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,SAAiB;IAClD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;iFACiF;AACjF,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,KAAc;QACtC,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,KAAK,CAAC,mCAAmC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;CACF;AAED;;;;;;;;kEAQkE;AAClE,MAAM,YAAY,GAAG,iEAAiE,CAAC;AAEvF,SAAS,WAAW,CAAC,IAAY;IAC/B,KAAK,MAAM,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,MAAM;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;uEAMuE;AACvE,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,IAAI,KAAK,IAAI;gBAAE,CAAC,EAAE,CAAC;iBAClB,IAAI,IAAI,KAAK,GAAG;gBAAE,QAAQ,GAAG,KAAK,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG;YAAE,QAAQ,GAAG,IAAI,CAAC;aACpC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aAC1C,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACtC,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAuHD;kEACkE;AAClE,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAoC,EACpC,KAAa;IAEb,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,4EAA4E;IAC5E,4EAA4E;IAC5E,yEAAyE;IACzE,6DAA6D;IAC7D,IAAI,gBAAuC,CAAC;IAC5C,IAAI,cAA0C,CAAC;IAC/C,IAAI,KAAK,GAAe,WAAW,CAAC;IACpC,IAAI,YAAY,GAAwB,IAAI,CAAC;IAC7C,IAAI,MAA+B,CAAC;IACpC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACxC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,OAAO;gBAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC;YACzC,IAAI,KAAK,CAAC,SAAS;gBAAE,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;YAClD,IAAI,KAAK,CAAC,gBAAgB,EAAE,MAAM;gBAAE,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC;YAC9E,IAAI,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM;gBAAE,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAChF,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACjD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QACtB,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACzD,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO;QACL,IAAI;QACJ,SAAS;QACT,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,KAAK;QACL,YAAY;QACZ,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK;QAC7B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgC;IAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,OAAO,CAAC;QACjD,IACE,OAAO,CAAC,SAAS,KAAK,SAAS;YAC/B,OAAO,CAAC,gBAAgB,KAAK,SAAS;YACtC,OAAO,CAAC,cAAc,KAAK,SAAS,EACpC,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,wEAAwE;QACxE,uEAAuE;QACvE,0EAA0E;QAC1E,qBAAqB;QACrB,MAAM,EACJ,SAAS,EAAE,KAAK,EAChB,gBAAgB,EAAE,QAAQ,EAC1B,cAAc,EAAE,MAAM,EACtB,GAAG,IAAI,EACR,GAAG,OAAO,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,IAAe;IACvC,OAAO,QAAQ,IAAI,CAAC,QAAQ,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@providerkit/core",
3
- "version": "0.23.0",
3
+ "version": "0.24.0",
4
4
  "description": "The layer under your agent loop: one seam for every LLM provider, plus the failure handling you only learn in production.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -24,7 +24,10 @@ export type TokenAuth = Pick<PresetProviderConfig, "apiKey" | "baseUrl" | "heade
24
24
  * factory. It gets the access token as `apiKey`, the credential's own host as
25
25
  * `baseUrl` (Copilot gives each plan its own) and its `ChatGPT-Account-Id`
26
26
  * header, which the Codex backend refuses the request without. To add headers
27
- * of your own, merge them with `auth.headers` rather than replacing them.
27
+ * of your own, merge them with `auth.headers` rather than replacing them. On
28
+ * a preset that sends a session id (`chatgpt`), pass `instanceSessionId` too:
29
+ * a provider built per call mints a new id per call, and the backend's prompt
30
+ * cache misses on every one.
28
31
  *
29
32
  * A 401 before any output renews the token and replays the call once: a token
30
33
  * can be refused before its expiry, and without this the caller sees an auth
package/src/gate.ts ADDED
@@ -0,0 +1,152 @@
1
+ // How many calls run at once on one connection.
2
+ //
3
+ // A flat-rate plan caps concurrent requests, and says so only by failing: six
4
+ // calls at once on one Z.ai Coding Plan key came back with some 429s (measured
5
+ // 2026-09-25, `capability.ts`). Behind a fallback chain the overflow is
6
+ // answered by the NEXT model, so the cap shows up as a quietly different
7
+ // answer, not as an error. The capability probe runs one call at a time for
8
+ // that reason, and one adopter runs its batches one item at a time on purpose.
9
+ // A gate holds the overflow in a queue instead, and lets each call in as a
10
+ // slot frees.
11
+ //
12
+ // The hard part is giving the slot back. A slot leaked by an abandoned stream
13
+ // is gone for the life of the process, with no error anywhere: the connection
14
+ // just serves one call fewer, until it serves none. So the slot is taken on the
15
+ // first read (a stream nobody reads holds nothing) and released exactly once,
16
+ // on whichever comes first: the stream ends, throws or is returned, or its
17
+ // signal aborts. That last one matters when the consumer holds a stream and
18
+ // stops reading it. Nothing else would ever free that slot.
19
+ //
20
+ // ponytail: three known ceilings.
21
+ // - It counts one process only. Two replicas each let `max` calls through. The
22
+ // upgrade path is a shared counter (one adopter already keeps one in Redis).
23
+ // - A full gate makes callers wait instead of moving on to the next candidate
24
+ // in a fallback chain. The upgrade is a bounded wait that fails as transient,
25
+ // so the pool tries the next one.
26
+ // - A fallback probe stuck waiting here has no first chunk, so once it goes
27
+ // stale (`probeStaleMs`) the pool can let one extra probe in beside it.
28
+ import type {
29
+ ChatMessage,
30
+ Provider,
31
+ ProviderChunk,
32
+ StreamOptions,
33
+ ToolDefinition,
34
+ } from "./types.ts";
35
+
36
+ export interface Gate {
37
+ /** How many calls may hold a slot at once. */
38
+ readonly max: number;
39
+ /** How many slots are held right now. */
40
+ readonly held: number;
41
+ /** How many calls are queued for a slot. */
42
+ readonly waiting: number;
43
+ /**
44
+ * Wait for a slot, first in, first out. Resolves to its release, which is
45
+ * safe to call more than once. The signal covers the whole life of the slot:
46
+ * an abort while waiting leaves the queue and rejects with `signal.reason`,
47
+ * and an abort while held releases it.
48
+ */
49
+ acquire(signal?: AbortSignal): Promise<() => void>;
50
+ }
51
+
52
+ /** A gate with `max` slots. Keep one alive per connection, so every call on
53
+ * it shares the count. */
54
+ export function createGate(max: number): Gate {
55
+ if (!Number.isInteger(max) || max < 1) {
56
+ throw new Error(`[providerkit] A gate needs a whole number of slots, 1 or more. Got ${max}.`);
57
+ }
58
+
59
+ let held = 0;
60
+ const queue: Array<() => void> = [];
61
+
62
+ function acquire(signal?: AbortSignal): Promise<() => void> {
63
+ // Rejected before it queues: a caller already gone must not take a place
64
+ // in line, or a slot, even for a moment.
65
+ if (signal?.aborted) return Promise.reject(signal.reason);
66
+
67
+ return new Promise((resolve, reject) => {
68
+ let state: "waiting" | "held" | "released" = "waiting";
69
+
70
+ const release = () => {
71
+ if (state !== "held") return;
72
+ state = "released";
73
+ signal?.removeEventListener("abort", onAbort);
74
+ // Handed straight to the next waiter, so `held` never dips and a
75
+ // newcomer arriving now finds the gate full and queues behind them.
76
+ const next = queue.shift();
77
+ if (next) next();
78
+ else held--;
79
+ };
80
+
81
+ const grant = () => {
82
+ state = "held";
83
+ resolve(release);
84
+ };
85
+
86
+ function onAbort() {
87
+ if (state === "held") {
88
+ release();
89
+ } else if (state === "waiting") {
90
+ state = "released";
91
+ queue.splice(queue.indexOf(grant), 1);
92
+ reject(signal?.reason);
93
+ }
94
+ }
95
+
96
+ if (held < max) {
97
+ held++;
98
+ grant();
99
+ } else {
100
+ queue.push(grant);
101
+ }
102
+ signal?.addEventListener("abort", onAbort, { once: true });
103
+ });
104
+ }
105
+
106
+ return {
107
+ max,
108
+ get held() {
109
+ return held;
110
+ },
111
+ get waiting() {
112
+ return queue.length;
113
+ },
114
+ acquire,
115
+ };
116
+ }
117
+
118
+ /**
119
+ * Let a provider run at most `gate.max` calls at once.
120
+ *
121
+ * Put it outside the watchdog. The watchdog arms on its first read, and this
122
+ * reads it only once a slot is held, so a call queued here never spends its
123
+ * deadlines waiting. Inside it, a call that stood in line for five minutes
124
+ * would time out as a silent provider before it ever sent a byte.
125
+ */
126
+ export function withGate(provider: Provider, gate: Gate): Provider {
127
+ return {
128
+ ...provider,
129
+ createStream(
130
+ messages: ChatMessage[],
131
+ tools: ToolDefinition[],
132
+ opts: StreamOptions = {},
133
+ ): AsyncIterable<ProviderChunk> {
134
+ // A generator, so nothing runs (the wait included) until the first read.
135
+ async function* gated(): AsyncGenerator<ProviderChunk> {
136
+ const release = await gate.acquire(opts.signal);
137
+ try {
138
+ // The slot can be granted and released by the same abort before this
139
+ // line runs (two calls sharing one signal). Such a call is over, and
140
+ // must not reach the wire without a slot.
141
+ opts.signal?.throwIfAborted();
142
+ yield* provider.createStream(messages, tools, opts);
143
+ } finally {
144
+ // Covers the end, a throw and a consumer's `break`. An abort may
145
+ // have released it already, and a second call is a no-op.
146
+ release();
147
+ }
148
+ }
149
+ return gated();
150
+ },
151
+ };
152
+ }
package/src/index.ts CHANGED
@@ -1,9 +1,11 @@
1
1
  export * from "./types.ts";
2
+ export * from "./turn.ts";
2
3
  export * from "./errors.ts";
3
4
  export * from "./retry.ts";
4
5
  export * from "./fallback.ts";
5
6
  export * from "./key-pool.ts";
6
7
  export * from "./watchdog.ts";
8
+ export * from "./gate.ts";
7
9
  export * from "./usage.ts";
8
10
  export * from "./transport.ts";
9
11
  export * from "./rate-limit.ts";
@@ -21,3 +23,4 @@ export * from "./providers/responses.ts";
21
23
  export * from "./providers/gemini.ts";
22
24
  export * from "./providers/zai.ts";
23
25
  export * from "./providers/factory.ts";
26
+ export * from "./registry.ts";
package/src/key-pool.ts CHANGED
@@ -101,6 +101,17 @@ export class KeyPool {
101
101
  return this.free.length + (this.paid ? 1 : 0);
102
102
  }
103
103
 
104
+ /** Each key's tier and when it is back (0 = serving now): free keys in
105
+ * config order, then the paid one. Never the key itself, so a status page
106
+ * can show it as is. */
107
+ status(): Array<{ tier: KeyTier; evictedUntil: number }> {
108
+ const now = this.now();
109
+ return [...this.free, ...(this.paid ? [this.paid] : [])].map(({ tier, evictedUntil }) => ({
110
+ tier,
111
+ evictedUntil: evictedUntil > now ? evictedUntil : 0,
112
+ }));
113
+ }
114
+
104
115
  /**
105
116
  * Run `fn` with the next available key, rotating on key-specific and
106
117
  * transient failures. Everything else (a bad request, a content block) throws
@@ -206,6 +217,10 @@ function cooldownFor(err: unknown, now: number): { kind: ErrorKind; forMs: numbe
206
217
  * committed to one key, exactly as a retry is committed past its first chunk
207
218
  * (retry.ts, rule 2): a mid-stream 429 evicts nothing and rotates nothing,
208
219
  * because there is no way to resume a half-rendered answer on another key.
220
+ *
221
+ * The factory runs once per attempt. An adapter with a session header mints
222
+ * its id when it is built, so give the factory an `instanceSessionId`, or each
223
+ * attempt opens a new session on a gateway that pins sessions to one host.
209
224
  */
210
225
  export function withKeyPool(pool: KeyPool, factory: (apiKey: string) => Provider): Provider {
211
226
  // The identity every key shares. Building an adapter performs no I/O — it
@@ -55,6 +55,13 @@ export interface AnthropicConfig extends ProviderFallbackConfig {
55
55
  /** Header that carries `StreamOptions.sessionId`. When set and a call has no
56
56
  * sessionId, one stable id for this provider instance rides instead. */
57
57
  sessionHeader?: string;
58
+ /** The id `sessionHeader` carries when a call has no `sessionId`. Absent, the
59
+ * adapter mints one when it is built. Pass one when something rebuilds the
60
+ * adapter (`withKeyPool` and `withToken` build one per attempt): each build
61
+ * mints a new id, and a gateway that pins a session to one upstream host
62
+ * then treats every call as a new session, re-routes it and misses its
63
+ * prompt cache. Ignored without `sessionHeader`. */
64
+ instanceSessionId?: string;
58
65
  /** Say "no thinking" with an explicit `thinking: { type: "disabled" }` when
59
66
  * effort resolves to none, instead of omitting the field. For endpoints
60
67
  * where an absent field means the model's default, not off. Z.ai's coding
@@ -402,7 +409,9 @@ interface AnthropicEvent {
402
409
  export function createAnthropicProvider(config: AnthropicConfig): Provider {
403
410
  const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
404
411
  const id = config.id ?? "anthropic";
405
- const instanceSessionId = config.sessionHeader ? crypto.randomUUID() : undefined;
412
+ const instanceSessionId = config.sessionHeader
413
+ ? (config.instanceSessionId ?? crypto.randomUUID())
414
+ : undefined;
406
415
 
407
416
  const provider: Provider = {
408
417
  id,
@@ -46,6 +46,17 @@ export interface PresetProviderConfig extends ProviderFallbackConfig {
46
46
  /** Per-request headers (request ids, `ChatGPT-Account-Id`) on top of the
47
47
  * preset's static protocol headers. */
48
48
  headers?: Record<string, string>;
49
+ /**
50
+ * The session id for a call without `StreamOptions.sessionId`, on a preset
51
+ * that sends one (`opencode-go`, `chatgpt`). Absent, the provider mints its
52
+ * own when it is built. Pass one when you build the provider per attempt
53
+ * (`withKeyPool`, `withToken`): each build would mint a new id, and a gateway
54
+ * that pins a session to one upstream host then treats every call as a new
55
+ * session, re-routes it and misses its prompt cache. Every model in a chain
56
+ * sends the same one. A preset without a session header has nowhere to put
57
+ * it and ignores it.
58
+ */
59
+ instanceSessionId?: string;
49
60
  /**
50
61
  * App attribution for OpenRouter's rankings. The site URL rides as
51
62
  * `HTTP-Referer`, the app name as `X-Title`. Public, not secret. Sent on
@@ -69,15 +80,15 @@ export interface PresetProviderConfig extends ProviderFallbackConfig {
69
80
  fetchImpl?: typeof fetch;
70
81
  }
71
82
 
83
+ /** What one adapter for one model takes: a `PresetProviderConfig` without the
84
+ * chain (`models`) and without the layers that go around an adapter. */
85
+ export type PresetAdapterConfig = Omit<
86
+ PresetProviderConfig,
87
+ "models" | keyof ProviderFallbackConfig
88
+ >;
89
+
72
90
  export function createPresetProvider(id: ProviderPresetId, config: PresetProviderConfig): Provider {
73
- // The table is closed (`satisfies`), but a caller may hold an id as a plain
74
- // string — validate rather than index into undefined.
75
- if (!(id in PROVIDER_PRESETS)) {
76
- throw new Error(
77
- `[providerkit] Unknown provider preset "${id}". Valid ids: ${PRESET_IDS.join(", ")}`,
78
- );
79
- }
80
- const preset: ProviderPreset = PROVIDER_PRESETS[id];
91
+ const preset = presetFor(id);
81
92
  const chain = config.models?.length ? config.models : config.model ? undefined : preset.rotation;
82
93
  if (chain && chain.length > 1) {
83
94
  const { models: _models, fallbacks = [], ...single } = config;
@@ -90,7 +101,27 @@ export function createPresetProvider(id: ProviderPresetId, config: PresetProvide
90
101
  ],
91
102
  });
92
103
  }
93
- const model = chain?.[0] ?? config.model ?? preset.defaultModel;
104
+ const { models: _models, ...single } = config;
105
+ return withConfiguredFallbacks(
106
+ presetAdapter(id, { ...single, model: chain?.[0] ?? config.model }),
107
+ config,
108
+ );
109
+ }
110
+
111
+ /**
112
+ * The bare adapter for one preset and one model: the wire that serves the
113
+ * model, its auth style and the preset's quirks, and nothing around them. No
114
+ * fallbacks, no watchdog, no `models` chain. A registry builds one per
115
+ * (connection, model) and puts those layers around all of them once; calling
116
+ * `createPresetProvider` per model would nest a second pool and a second
117
+ * watchdog inside its own.
118
+ *
119
+ * The adapter's `id` is the preset id, because the OpenAI shape reads its
120
+ * effort dialect from it (`opencode-go`, `openrouter`, `deepseek`).
121
+ */
122
+ export function presetAdapter(id: ProviderPresetId, config: PresetAdapterConfig): Provider {
123
+ const preset = presetFor(id);
124
+ const model = config.model ?? preset.defaultModel;
94
125
  if (!model) {
95
126
  throw new Error(`[providerkit] Preset "${id}" has no defaultModel. Pass a model.`);
96
127
  }
@@ -104,14 +135,16 @@ export function createPresetProvider(id: ProviderPresetId, config: PresetProvide
104
135
  const headers = { ...preset.headers, ...config.headers };
105
136
  const baseUrl = config.baseUrl ?? wire.baseUrl;
106
137
  const maxTokens = config.maxTokens ?? preset.maxTokens;
107
-
108
- const {
109
- fallbacks: _fallbacks,
110
- fallbackOptions: _fallbackOptions,
111
- watchdog: _watchdog,
112
- models: _models,
113
- ...baseConfig
114
- } = config;
138
+ // Every adapter builds its own pool and watchdog from these. The type leaves
139
+ // them out, but a wider object (a whole `PresetProviderConfig` in a variable)
140
+ // can still carry them, and the adapter would nest a second pool and a
141
+ // second watchdog inside the caller's. Cleared, it stays bare.
142
+ const baseConfig = {
143
+ ...config,
144
+ fallbacks: undefined,
145
+ fallbackOptions: undefined,
146
+ watchdog: undefined,
147
+ };
115
148
 
116
149
  let provider: Provider;
117
150
  switch (wire.shape) {
@@ -184,10 +217,22 @@ export function createPresetProvider(id: ProviderPresetId, config: PresetProvide
184
217
  break;
185
218
  }
186
219
 
187
- return withConfiguredFallbacks(
188
- preset.routes ? refuseOtherWires(provider, preset, wire) : provider,
189
- config,
190
- );
220
+ // Here rather than in `createPresetProvider`: the wire is resolved here, and
221
+ // the bare adapter is exported, so it must refuse on its own a per-call model
222
+ // it would post to the wrong endpoint. That 404 reads as an unknown model,
223
+ // and a pool benches the model for an hour.
224
+ return preset.routes ? refuseOtherWires(provider, preset, wire) : provider;
225
+ }
226
+
227
+ /** The table is closed (`satisfies`), but a caller may hold an id as a plain
228
+ * string. Validate rather than index into undefined. */
229
+ function presetFor(id: ProviderPresetId): ProviderPreset {
230
+ if (!(id in PROVIDER_PRESETS)) {
231
+ throw new Error(
232
+ `[providerkit] Unknown provider preset "${id}". Valid ids: ${PRESET_IDS.join(", ")}`,
233
+ );
234
+ }
235
+ return PROVIDER_PRESETS[id];
191
236
  }
192
237
 
193
238
  /** The endpoint a model is served from: its route when the preset has one for
@@ -107,6 +107,13 @@ export interface OpenAIConfig extends ProviderFallbackConfig {
107
107
  * no sessionId, the provider's own per-instance id rides instead, so the
108
108
  * gateway never sees a call without one. */
109
109
  sessionHeader?: string;
110
+ /** The id `sessionHeader` carries when a call has no `sessionId`. Absent, the
111
+ * adapter mints one when it is built. Pass one when something rebuilds the
112
+ * adapter (`withKeyPool` and `withToken` build one per attempt): each build
113
+ * mints a new id, and a gateway that pins a session to one upstream host
114
+ * then treats every call as a new session, re-routes it and misses its
115
+ * prompt cache. Ignored without `sessionHeader`. */
116
+ instanceSessionId?: string;
110
117
  /** Send `X-Initiator`: `user` when the last message is the user's, else
111
118
  * `agent`. GitHub Copilot bills a premium request per `user` turn and lets
112
119
  * the agent's own follow-ups (tool results) ride free. */
@@ -531,7 +538,9 @@ export function createOpenAIProvider(config: OpenAIConfig): Provider {
531
538
  // `usage.cost` is its field in its unit. Another gateway that sends a
532
539
  // `cost` has not said what it means.
533
540
  const reportsCost = isOpenRouter(baseUrl);
534
- const instanceSessionId = config.sessionHeader ? crypto.randomUUID() : undefined;
541
+ const instanceSessionId = config.sessionHeader
542
+ ? (config.instanceSessionId ?? crypto.randomUUID())
543
+ : undefined;
535
544
 
536
545
  const provider: Provider = {
537
546
  id,
@@ -48,6 +48,17 @@ export interface ResponsesConfig extends ProviderFallbackConfig {
48
48
  /** Header that carries `StreamOptions.sessionId`. When set and a call has no
49
49
  * sessionId, one stable id for this provider instance rides instead. */
50
50
  sessionHeader?: string;
51
+ /** The id `sessionHeader` carries when a call has no `sessionId`. Absent, the
52
+ * adapter mints one when it is built. Pass one when something rebuilds the
53
+ * adapter (`withKeyPool` and `withToken` build one per attempt): each build
54
+ * mints a new id, and a gateway that pins a session to one upstream host
55
+ * then treats every call as a new session, re-routes it and misses its
56
+ * prompt cache. Ignored without `sessionHeader`.
57
+ *
58
+ * It is not sent as `prompt_cache_key`, which stays the per-call
59
+ * `sessionId`'s: this id names the adapter, so it is shared by every
60
+ * conversation the adapter serves, and a minted one never was a cache key. */
61
+ instanceSessionId?: string;
51
62
  /**
52
63
  * Where this backend serves the endpoint, when it is not `/v1/responses`.
53
64
  * The ChatGPT subscription surface serves it at `/backend-api/codex/responses`
@@ -395,7 +406,9 @@ function unsentTail(snapshot: string, streamed: string): string {
395
406
  export function createResponsesProvider(config: ResponsesConfig): Provider {
396
407
  const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;
397
408
  const id = config.id ?? "openai-responses";
398
- const instanceSessionId = config.sessionHeader ? crypto.randomUUID() : undefined;
409
+ const instanceSessionId = config.sessionHeader
410
+ ? (config.instanceSessionId ?? crypto.randomUUID())
411
+ : undefined;
399
412
 
400
413
  const provider: Provider = {
401
414
  id,