@providerkit/core 0.22.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 (131) hide show
  1. package/README.md +29 -7
  2. package/dist/auth/flows.d.ts.map +1 -1
  3. package/dist/auth/flows.js +5 -5
  4. package/dist/auth/flows.js.map +1 -1
  5. package/dist/auth/index.d.ts +1 -0
  6. package/dist/auth/index.d.ts.map +1 -1
  7. package/dist/auth/index.js +1 -0
  8. package/dist/auth/index.js.map +1 -1
  9. package/dist/auth/oauth.d.ts +12 -0
  10. package/dist/auth/oauth.d.ts.map +1 -1
  11. package/dist/auth/oauth.js +19 -1
  12. package/dist/auth/oauth.js.map +1 -1
  13. package/dist/auth/token-source.d.ts +9 -3
  14. package/dist/auth/token-source.d.ts.map +1 -1
  15. package/dist/auth/token-source.js +24 -9
  16. package/dist/auth/token-source.js.map +1 -1
  17. package/dist/auth/with-token.d.ts +32 -0
  18. package/dist/auth/with-token.d.ts.map +1 -0
  19. package/dist/auth/with-token.js +88 -0
  20. package/dist/auth/with-token.js.map +1 -0
  21. package/dist/context.d.ts +39 -1
  22. package/dist/context.d.ts.map +1 -1
  23. package/dist/context.js +119 -0
  24. package/dist/context.js.map +1 -1
  25. package/dist/errors.d.ts +12 -3
  26. package/dist/errors.d.ts.map +1 -1
  27. package/dist/errors.js +44 -5
  28. package/dist/errors.js.map +1 -1
  29. package/dist/fallback.d.ts +45 -1
  30. package/dist/fallback.d.ts.map +1 -1
  31. package/dist/fallback.js +138 -75
  32. package/dist/fallback.js.map +1 -1
  33. package/dist/gate.d.ts +29 -0
  34. package/dist/gate.d.ts.map +1 -0
  35. package/dist/gate.js +96 -0
  36. package/dist/gate.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/key-pool.d.ts +21 -4
  42. package/dist/key-pool.d.ts.map +1 -1
  43. package/dist/key-pool.js +43 -12
  44. package/dist/key-pool.js.map +1 -1
  45. package/dist/presets.d.ts +7 -2
  46. package/dist/presets.d.ts.map +1 -1
  47. package/dist/presets.js +12 -2
  48. package/dist/presets.js.map +1 -1
  49. package/dist/providers/anthropic.d.ts +7 -0
  50. package/dist/providers/anthropic.d.ts.map +1 -1
  51. package/dist/providers/anthropic.js +83 -26
  52. package/dist/providers/anthropic.js.map +1 -1
  53. package/dist/providers/factory.d.ts +26 -0
  54. package/dist/providers/factory.d.ts.map +1 -1
  55. package/dist/providers/factory.js +41 -9
  56. package/dist/providers/factory.js.map +1 -1
  57. package/dist/providers/gemini.d.ts +6 -0
  58. package/dist/providers/gemini.d.ts.map +1 -1
  59. package/dist/providers/gemini.js +102 -27
  60. package/dist/providers/gemini.js.map +1 -1
  61. package/dist/providers/openai.d.ts +7 -0
  62. package/dist/providers/openai.d.ts.map +1 -1
  63. package/dist/providers/openai.js +66 -15
  64. package/dist/providers/openai.js.map +1 -1
  65. package/dist/providers/responses.d.ts +11 -0
  66. package/dist/providers/responses.d.ts.map +1 -1
  67. package/dist/providers/responses.js +101 -53
  68. package/dist/providers/responses.js.map +1 -1
  69. package/dist/rate-limit.d.ts +10 -0
  70. package/dist/rate-limit.d.ts.map +1 -1
  71. package/dist/rate-limit.js +7 -1
  72. package/dist/rate-limit.js.map +1 -1
  73. package/dist/registry.d.ts +105 -0
  74. package/dist/registry.d.ts.map +1 -0
  75. package/dist/registry.js +291 -0
  76. package/dist/registry.js.map +1 -0
  77. package/dist/retry.d.ts +11 -0
  78. package/dist/retry.d.ts.map +1 -1
  79. package/dist/retry.js +25 -12
  80. package/dist/retry.js.map +1 -1
  81. package/dist/tool-args.d.ts +22 -0
  82. package/dist/tool-args.d.ts.map +1 -1
  83. package/dist/tool-args.js +28 -0
  84. package/dist/tool-args.js.map +1 -1
  85. package/dist/tools.d.ts +8 -0
  86. package/dist/tools.d.ts.map +1 -1
  87. package/dist/tools.js +2 -2
  88. package/dist/tools.js.map +1 -1
  89. package/dist/transport.d.ts +34 -4
  90. package/dist/transport.d.ts.map +1 -1
  91. package/dist/transport.js +77 -16
  92. package/dist/transport.js.map +1 -1
  93. package/dist/turn.d.ts +55 -0
  94. package/dist/turn.d.ts.map +1 -0
  95. package/dist/turn.js +125 -0
  96. package/dist/turn.js.map +1 -0
  97. package/dist/types.d.ts +21 -22
  98. package/dist/types.d.ts.map +1 -1
  99. package/dist/types.js +0 -53
  100. package/dist/types.js.map +1 -1
  101. package/dist/watchdog.d.ts +2 -0
  102. package/dist/watchdog.d.ts.map +1 -1
  103. package/dist/watchdog.js +25 -6
  104. package/dist/watchdog.js.map +1 -1
  105. package/package.json +1 -1
  106. package/src/auth/flows.ts +5 -4
  107. package/src/auth/index.ts +1 -0
  108. package/src/auth/oauth.ts +23 -1
  109. package/src/auth/token-source.ts +30 -11
  110. package/src/auth/with-token.ts +100 -0
  111. package/src/context.ts +137 -2
  112. package/src/errors.ts +46 -6
  113. package/src/fallback.ts +173 -75
  114. package/src/gate.ts +152 -0
  115. package/src/index.ts +3 -0
  116. package/src/key-pool.ts +45 -13
  117. package/src/presets.ts +12 -2
  118. package/src/providers/anthropic.ts +93 -25
  119. package/src/providers/factory.ts +66 -21
  120. package/src/providers/gemini.ts +102 -28
  121. package/src/providers/openai.ts +71 -14
  122. package/src/providers/responses.ts +116 -51
  123. package/src/rate-limit.ts +31 -3
  124. package/src/registry.ts +420 -0
  125. package/src/retry.ts +41 -10
  126. package/src/tool-args.ts +44 -0
  127. package/src/tools.ts +10 -2
  128. package/src/transport.ts +97 -17
  129. package/src/turn.ts +166 -0
  130. package/src/types.ts +21 -62
  131. package/src/watchdog.ts +25 -6
@@ -18,12 +18,7 @@ import { createResponsesProvider } from "./responses.js";
18
18
  import { PRESET_IDS, PROVIDER_PRESETS, } from "../presets.js";
19
19
  import { withConfiguredFallbacks } from "../fallback.js";
20
20
  export function createPresetProvider(id, config) {
21
- // The table is closed (`satisfies`), but a caller may hold an id as a plain
22
- // string — validate rather than index into undefined.
23
- if (!(id in PROVIDER_PRESETS)) {
24
- throw new Error(`[providerkit] Unknown provider preset "${id}". Valid ids: ${PRESET_IDS.join(", ")}`);
25
- }
26
- const preset = PROVIDER_PRESETS[id];
21
+ const preset = presetFor(id);
27
22
  const chain = config.models?.length ? config.models : config.model ? undefined : preset.rotation;
28
23
  if (chain && chain.length > 1) {
29
24
  const { models: _models, fallbacks = [], ...single } = config;
@@ -36,7 +31,23 @@ export function createPresetProvider(id, config) {
36
31
  ],
37
32
  });
38
33
  }
39
- const model = chain?.[0] ?? config.model ?? preset.defaultModel;
34
+ const { models: _models, ...single } = config;
35
+ return withConfiguredFallbacks(presetAdapter(id, { ...single, model: chain?.[0] ?? config.model }), config);
36
+ }
37
+ /**
38
+ * The bare adapter for one preset and one model: the wire that serves the
39
+ * model, its auth style and the preset's quirks, and nothing around them. No
40
+ * fallbacks, no watchdog, no `models` chain. A registry builds one per
41
+ * (connection, model) and puts those layers around all of them once; calling
42
+ * `createPresetProvider` per model would nest a second pool and a second
43
+ * watchdog inside its own.
44
+ *
45
+ * The adapter's `id` is the preset id, because the OpenAI shape reads its
46
+ * effort dialect from it (`opencode-go`, `openrouter`, `deepseek`).
47
+ */
48
+ export function presetAdapter(id, config) {
49
+ const preset = presetFor(id);
50
+ const model = config.model ?? preset.defaultModel;
40
51
  if (!model) {
41
52
  throw new Error(`[providerkit] Preset "${id}" has no defaultModel. Pass a model.`);
42
53
  }
@@ -48,7 +59,16 @@ export function createPresetProvider(id, config) {
48
59
  const headers = { ...preset.headers, ...config.headers };
49
60
  const baseUrl = config.baseUrl ?? wire.baseUrl;
50
61
  const maxTokens = config.maxTokens ?? preset.maxTokens;
51
- const { fallbacks: _fallbacks, fallbackOptions: _fallbackOptions, watchdog: _watchdog, models: _models, ...baseConfig } = config;
62
+ // Every adapter builds its own pool and watchdog from these. The type leaves
63
+ // them out, but a wider object (a whole `PresetProviderConfig` in a variable)
64
+ // can still carry them, and the adapter would nest a second pool and a
65
+ // second watchdog inside the caller's. Cleared, it stays bare.
66
+ const baseConfig = {
67
+ ...config,
68
+ fallbacks: undefined,
69
+ fallbackOptions: undefined,
70
+ watchdog: undefined,
71
+ };
52
72
  let provider;
53
73
  switch (wire.shape) {
54
74
  case "anthropic":
@@ -119,7 +139,19 @@ export function createPresetProvider(id, config) {
119
139
  });
120
140
  break;
121
141
  }
122
- return withConfiguredFallbacks(preset.routes ? refuseOtherWires(provider, preset, wire) : provider, config);
142
+ // Here rather than in `createPresetProvider`: the wire is resolved here, and
143
+ // the bare adapter is exported, so it must refuse on its own a per-call model
144
+ // it would post to the wrong endpoint. That 404 reads as an unknown model,
145
+ // and a pool benches the model for an hour.
146
+ return preset.routes ? refuseOtherWires(provider, preset, wire) : provider;
147
+ }
148
+ /** The table is closed (`satisfies`), but a caller may hold an id as a plain
149
+ * string. Validate rather than index into undefined. */
150
+ function presetFor(id) {
151
+ if (!(id in PROVIDER_PRESETS)) {
152
+ throw new Error(`[providerkit] Unknown provider preset "${id}". Valid ids: ${PRESET_IDS.join(", ")}`);
153
+ }
154
+ return PROVIDER_PRESETS[id];
123
155
  }
124
156
  /** The endpoint a model is served from: its route when the preset has one for
125
157
  * it, else the preset's own. */
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,12 @@ export interface GeminiContent {
41
41
  * and carry tool calls as `functionCall` parts with the thought signature
42
42
  * beside them; tool results are role `user` with a `functionResponse` part
43
43
  * naming the FUNCTION, since Gemini pairs a result to its call by name.
44
+ *
45
+ * A run of results is ONE user turn: Gemini answers a model turn's parallel
46
+ * calls with every response together, and spread over several turns it 400s
47
+ * that the response count does not match the call count. The responses go
48
+ * first, in call order, and the run's images follow them all, the way the
49
+ * OpenAI dialect places them.
44
50
  */
45
51
  export declare function toGeminiContents(messages: readonly ChatMessage[]): {
46
52
  system?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AAWA,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EAEN,aAAa,EACb,QAAQ,EAMT,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,YAAa,SAAQ,sBAAsB;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd;;;;;oFAKgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAkCD,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAqCD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAiEA;AA4DD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CA0NnE"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AAYA,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACtF,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EAEN,aAAa,EACb,QAAQ,EAMT,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,YAAa,SAAQ,sBAAsB;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd;;;;;oFAKgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAkCD,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAqCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B,CAqEA;AA+GD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAsOnE"}
@@ -5,9 +5,10 @@
5
5
  // its own chain of thought on the next turn. Written straight against the REST
6
6
  // wire rather than @google/genai, because this package ships zero dependencies
7
7
  // and the SDK is a Node-shaped one.
8
+ import { repairHistory } from "../context.js";
8
9
  import { ProviderError, streamCut, streamError } from "../errors.js";
9
10
  import { schemaPrompt, toGeminiToolSchema } from "../schema.js";
10
- import { parseToolArgs } from "../tool-args.js";
11
+ import { parseToolArgs, settleToolCalls } from "../tool-args.js";
11
12
  import { streamSse, apiUrl } from "../transport.js";
12
13
  import { withConfiguredFallbacks } from "../fallback.js";
13
14
  const DEFAULT_BASE_URL = "https://generativelanguage.googleapis.com";
@@ -83,11 +84,21 @@ function toResponseObject(content) {
83
84
  * and carry tool calls as `functionCall` parts with the thought signature
84
85
  * beside them; tool results are role `user` with a `functionResponse` part
85
86
  * naming the FUNCTION, since Gemini pairs a result to its call by name.
87
+ *
88
+ * A run of results is ONE user turn: Gemini answers a model turn's parallel
89
+ * calls with every response together, and spread over several turns it 400s
90
+ * that the response count does not match the call count. The responses go
91
+ * first, in call order, and the run's images follow them all, the way the
92
+ * OpenAI dialect places them.
86
93
  */
87
94
  export function toGeminiContents(messages) {
88
95
  let system = "";
89
96
  const contents = [];
97
+ // The open run of tool results: its parts, and how many lead with a response.
98
+ let results;
90
99
  for (const message of messages) {
100
+ if (message.role === "user" || message.role === "assistant")
101
+ results = undefined;
91
102
  switch (message.role) {
92
103
  case "system":
93
104
  system = system ? `${system}\n\n${message.content}` : message.content;
@@ -123,23 +134,24 @@ export function toGeminiContents(messages) {
123
134
  contents.push({ role: "model", parts });
124
135
  break;
125
136
  }
126
- case "tool":
127
- contents.push({
128
- role: "user",
129
- parts: [
130
- {
131
- functionResponse: {
132
- id: message.toolCallId,
133
- name: message.name,
134
- response: toResponseObject(message.content),
135
- },
136
- },
137
- ...(message.images ?? []).map((image) => ({
138
- inlineData: { mimeType: image.mimeType, data: image.data },
139
- })),
140
- ],
137
+ case "tool": {
138
+ if (!results) {
139
+ results = { parts: [], responses: 0 };
140
+ contents.push({ role: "user", parts: results.parts });
141
+ }
142
+ results.parts.splice(results.responses, 0, {
143
+ functionResponse: {
144
+ id: message.toolCallId,
145
+ name: message.name,
146
+ response: toResponseObject(message.content),
147
+ },
141
148
  });
149
+ results.responses += 1;
150
+ for (const image of message.images ?? []) {
151
+ results.parts.push({ inlineData: { mimeType: image.mimeType, data: image.data } });
152
+ }
142
153
  break;
154
+ }
143
155
  }
144
156
  }
145
157
  return { ...(system ? { system } : {}), contents };
@@ -158,15 +170,66 @@ function toToolConfig(choice) {
158
170
  return { functionCallingConfig: { mode: "ANY" } };
159
171
  return { functionCallingConfig: { mode: "ANY", allowedFunctionNames: [choice.name] } };
160
172
  }
161
- function mapFinishReason(reason) {
173
+ /**
174
+ * Every finish reason Gemini documents (the generate-content reference, read
175
+ * 2026-10-19), decided one by one. Anything this switch did not name used to
176
+ * read as `stop`, so a call the model botched (`MALFORMED_FUNCTION_CALL`) or a
177
+ * turn that ended for no stated reason (`OTHER`) came back as a finished, empty
178
+ * answer. After a tool result, `requireContent` takes an empty `stop` as the
179
+ * model choosing to say nothing, so nothing retried it.
180
+ */
181
+ function mapFinishReason(provider, reason) {
182
+ const fail = (kind, why) => {
183
+ throw new ProviderError(provider, kind, `${provider} ended the turn on ${reason}: ${why}`, {
184
+ code: reason,
185
+ });
186
+ };
162
187
  switch (reason) {
188
+ case "STOP":
189
+ return "stop";
190
+ // The output cap. CONTINUATION is the same cap with a token to carry on,
191
+ // which this adapter never sends back.
163
192
  case "MAX_TOKENS":
193
+ case "CONTINUATION":
164
194
  return "length";
195
+ // A filter on what was said or drawn. The text so far stands and the
196
+ // finish says why it ended, as `content_filter` does on every wire. A
197
+ // retry would mostly meet the same filter.
165
198
  case "SAFETY":
166
199
  case "PROHIBITED_CONTENT":
200
+ case "BLOCKLIST":
201
+ case "SPII":
202
+ case "RECITATION":
203
+ case "LANGUAGE":
204
+ case "ESCALATION":
205
+ case "IMAGE_SAFETY":
206
+ case "IMAGE_PROHIBITED_CONTENT":
207
+ case "IMAGE_RECITATION":
167
208
  return "content_filter";
209
+ // The request lost a thought signature, and the same request loses it
210
+ // again. A bug in what was sent, so nothing retries it.
211
+ case "MISSING_THOUGHT_SIGNATURE":
212
+ return fail("invalid", "the request is missing a thought signature");
213
+ // The account was limited for a policy violation. Benched like a refused
214
+ // key, so a key pool moves to another project.
215
+ case "PUP_LIMITED_DISABLED":
216
+ return fail("auth", "the account is limited or disabled");
217
+ // The model broke its own turn: a call it could not form, one with no tool
218
+ // offered, too many in a row, a malformed reply, an image it never made.
219
+ // The same request usually works on the next try.
220
+ case "MALFORMED_FUNCTION_CALL":
221
+ case "UNEXPECTED_TOOL_CALL":
222
+ case "TOO_MANY_TOOL_CALLS":
223
+ case "MALFORMED_RESPONSE":
224
+ case "NO_IMAGE":
225
+ return fail("overload", "the model broke its own turn");
226
+ // These say nothing about why, and a reason added after this list says
227
+ // nothing we can read. Neither proves the answer is whole.
228
+ case "OTHER":
229
+ case "IMAGE_OTHER":
230
+ case "FINISH_REASON_UNSPECIFIED":
168
231
  default:
169
- return "stop";
232
+ return fail("overload", "it gave no reason that shows the answer is complete");
170
233
  }
171
234
  }
172
235
  export function createGeminiProvider(config) {
@@ -178,7 +241,9 @@ export function createGeminiProvider(config) {
178
241
  async *createStream(messages, tools, opts = {}) {
179
242
  const effort = opts.effort ?? config.effort;
180
243
  const maxTokens = opts.maxTokens ?? config.maxTokens;
181
- const { system, contents } = toGeminiContents(messages);
244
+ // Repaired first: a result with no call, or a call with no result, is a
245
+ // 400 that loses the turn. See repairHistory.
246
+ const { system, contents } = toGeminiContents(repairHistory(messages).messages);
182
247
  // A model id copied out of Gemini's docs is often already `models/…`, and
183
248
  // the doubled segment 404s as "model not found" — a confusing way to
184
249
  // learn about a prefix.
@@ -276,6 +341,11 @@ export function createGeminiProvider(config) {
276
341
  ...(opts.signal ? { signal: opts.signal } : {}),
277
342
  ...(config.fetchImpl ? { fetchImpl: config.fetchImpl } : {}),
278
343
  ...(opts.onActivity ? { onActivity: opts.onActivity } : {}),
344
+ ...(opts.onRateLimit ? { onRateLimit: opts.onRateLimit } : {}),
345
+ // This wire has no terminal event to stop at, so the finish reason is
346
+ // the end: a read that dies after it can cost a late usage record, never
347
+ // the answer.
348
+ finished: () => finished,
279
349
  })) {
280
350
  let chunk;
281
351
  try {
@@ -335,12 +405,14 @@ export function createGeminiProvider(config) {
335
405
  if (!call)
336
406
  continue;
337
407
  const index = callIndex++;
408
+ const identity = { index, id: call.id ?? "", name: call.name ?? "" };
409
+ // The part is the whole call, so it is settled here: one with no
410
+ // name can't run, and one with no id gets one the way the other
411
+ // three wires mint it. Gemini omits the id on a single-call turn, and
412
+ // the seam's consumers pair a result back to its call by id.
413
+ settleToolCalls(id, [identity]);
338
414
  toolCalls.push({
339
- index,
340
- // Gemini omits the id on a single-call turn, and the seam's
341
- // consumers pair a result back to its call by id.
342
- id: call.id ?? `call_${index}`,
343
- ...(call.name ? { name: call.name } : {}),
415
+ ...identity,
344
416
  // Whole and already assembled — unlike the OpenAI shape, Gemini
345
417
  // never fragments an argument object across chunks.
346
418
  arguments: JSON.stringify(call.args ?? {}),
@@ -356,13 +428,16 @@ export function createGeminiProvider(config) {
356
428
  yield { type: "delta", toolCalls };
357
429
  }
358
430
  if (candidate.finishReason) {
431
+ // Mapped first: a reason that throws must not be dressed as tool_calls.
432
+ const finishReason = mapFinishReason(id, candidate.finishReason);
359
433
  finished = true;
360
434
  yield {
361
435
  type: "finish",
362
- // A turn that called tools finishes as tool_calls whatever the
363
- // candidate says — Gemini routinely reports STOP there, and a
436
+ // Gemini routinely reports STOP on a turn that called tools, and a
364
437
  // caller reading that as "done" drops the tool round entirely.
365
- finishReason: sawFunctionCalls ? "tool_calls" : mapFinishReason(candidate.finishReason),
438
+ // Only STOP is promoted, as on the other three wires: a length cut
439
+ // or a filter may be what broke the call (invariant 10).
440
+ finishReason: sawFunctionCalls && finishReason === "stop" ? "tool_calls" : finishReason,
366
441
  };
367
442
  }
368
443
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -83,6 +83,13 @@ export interface OpenAIConfig extends ProviderFallbackConfig {
83
83
  * no sessionId, the provider's own per-instance id rides instead, so the
84
84
  * gateway never sees a call without one. */
85
85
  sessionHeader?: string;
86
+ /** The id `sessionHeader` carries when a call has no `sessionId`. Absent, the
87
+ * adapter mints one when it is built. Pass one when something rebuilds the
88
+ * adapter (`withKeyPool` and `withToken` build one per attempt): each build
89
+ * mints a new id, and a gateway that pins a session to one upstream host
90
+ * then treats every call as a new session, re-routes it and misses its
91
+ * prompt cache. Ignored without `sessionHeader`. */
92
+ instanceSessionId?: string;
86
93
  /** Send `X-Initiator`: `user` when the last message is the user's, else
87
94
  * `agent`. GitHub Copilot bills a premium request per `user` turn and lets
88
95
  * the agent's own follow-ups (tool results) ride free. */
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,WAAW,EAEX,MAAM,EAEN,aAAa,EACb,QAAQ,EAER,WAAW,EAGZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEtF,MAAM,WAAW,YAAa,SAAQ,sBAAsB;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;+CAE2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;iFAC6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;iDAE6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;+DAE2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;8EAC0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAuCD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMpF;AAED;4EAC4E;AAC5E,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,KAAK,CAAC;AA4CzF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsCzB;AAqED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,QAAQ,SAAW,GAAG,OAAO,EAAE,CAgEjG;AA8CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC7D,GAAG,MAAM,GAAG,SAAS,CAKrB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAiPnE"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,WAAW,EAEX,MAAM,EAEN,aAAa,EACb,QAAQ,EAER,WAAW,EAGZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEtF,MAAM,WAAW,YAAa,SAAQ,sBAAsB;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;+CAE2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;iFAC6E;IAC7E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;iDAE6C;IAC7C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;yDAKqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;+DAE2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;8EAC0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAuCD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMpF;AAED;4EAC4E;AAC5E,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,KAAK,CAAC;AA4CzF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsCzB;AA6FD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,QAAQ,SAAW,GAAG,OAAO,EAAE,CAgEjG;AA8CD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE;QAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC7D,GAAG,MAAM,GAAG,SAAS,CAKrB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,QAAQ,CAyQnE"}
@@ -3,8 +3,10 @@
3
3
  // This is the dialect most gateways speak, so one adapter serves OpenAI,
4
4
  // OpenRouter, DeepSeek, GLM, Kimi, Groq, Together, vLLM, Ollama and LM Studio.
5
5
  // Their divergences are small and named where they appear.
6
+ import { repairHistory } from "../context.js";
6
7
  import { fileRefused, ProviderError, streamCut, streamError } from "../errors.js";
7
- import { streamSse, apiUrl } from "../transport.js";
8
+ import { streamSse, apiUrl, parseFrame } from "../transport.js";
9
+ import { settleToolCalls } from "../tool-args.js";
8
10
  import { attributionHeaders } from "../attribution.js";
9
11
  import { toDataUri } from "../types.js";
10
12
  import { isStrictSchema, schemaPrompt } from "../schema.js";
@@ -211,19 +213,43 @@ function dialectFor(id) {
211
213
  return "opencode-go";
212
214
  return "openai";
213
215
  }
214
- function mapFinishReason(reason) {
216
+ /**
217
+ * A stated finish, or a throw for one this dialect does not document. An
218
+ * unknown reason used to end the stream as a clean success with no finish at
219
+ * all, so DeepSeek's `insufficient_system_resource`, Z.ai's `network_error` and
220
+ * OpenRouter's `error` each read as a finished answer. Nothing says the answer
221
+ * ended on purpose, so it is `overload`: theirs, and worth a retry (cc-proxy
222
+ * answers it the same way).
223
+ */
224
+ function mapFinishReason(provider, reason) {
215
225
  switch (reason) {
226
+ // A natural end under another name, from servers on this wire: Together's
227
+ // `eos`, Hugging Face TGI's `eos_token` and `stop_sequence`. Thrown as
228
+ // unknown, each would fail an answer that was already whole.
216
229
  case "stop":
230
+ case "eos":
231
+ case "eos_token":
232
+ case "stop_sequence":
217
233
  return "stop";
234
+ // Z.ai's `model_context_window_exceeded` and Mistral's `model_length`: the
235
+ // context window filled before the answer did. Cut short, and a retry fills
236
+ // it the same way.
218
237
  case "length":
238
+ case "model_context_window_exceeded":
239
+ case "model_length":
219
240
  return "length";
220
241
  case "tool_calls":
221
242
  case "function_call":
222
243
  return "tool_calls";
244
+ // `sensitive` is Z.ai's name for its safety stop. A retry meets the same
245
+ // filter.
223
246
  case "content_filter":
247
+ case "sensitive":
224
248
  return "content_filter";
225
249
  default:
226
- return undefined;
250
+ throw new ProviderError(provider, "overload", `${provider} ended the turn on "${reason}"`, {
251
+ code: reason,
252
+ });
227
253
  }
228
254
  }
229
255
  function partsToOpenAI(content, provider) {
@@ -346,14 +372,18 @@ export function createOpenAIProvider(config) {
346
372
  // `usage.cost` is its field in its unit. Another gateway that sends a
347
373
  // `cost` has not said what it means.
348
374
  const reportsCost = isOpenRouter(baseUrl);
349
- const instanceSessionId = config.sessionHeader ? crypto.randomUUID() : undefined;
375
+ const instanceSessionId = config.sessionHeader
376
+ ? (config.instanceSessionId ?? crypto.randomUUID())
377
+ : undefined;
350
378
  const provider = {
351
379
  id,
352
380
  model: config.model,
353
381
  async *createStream(messages, tools, opts = {}) {
354
382
  const effort = opts.effort ?? config.effort;
355
383
  const model = opts.model ?? config.model;
356
- const body = toOpenAIMessages(messages, id);
384
+ // Repaired first: a result with no call, or a call with no result, is a
385
+ // 400 that loses the turn. See repairHistory.
386
+ const body = toOpenAIMessages(repairHistory(messages).messages, id);
357
387
  const request = {
358
388
  model,
359
389
  messages: body,
@@ -459,6 +489,9 @@ export function createOpenAIProvider(config) {
459
489
  ? "/chat/completions"
460
490
  : "/v1/chat/completions";
461
491
  let ended = false;
492
+ // Each call as its deltas named it, by index. The finish checks them
493
+ // before it goes out, and they are what says the turn called a tool.
494
+ const calls = new Map();
462
495
  for await (const data of streamSse({
463
496
  url: apiUrl(baseUrl, config.path ?? defaultPath),
464
497
  headers: {
@@ -477,17 +510,16 @@ export function createOpenAIProvider(config) {
477
510
  ...(opts.signal ? { signal: opts.signal } : {}),
478
511
  ...(config.fetchImpl ? { fetchImpl: config.fetchImpl } : {}),
479
512
  ...(opts.onActivity ? { onActivity: opts.onActivity } : {}),
513
+ ...(opts.onRateLimit ? { onRateLimit: opts.onRateLimit } : {}),
480
514
  onDone: () => {
481
515
  ended = true;
482
516
  },
517
+ // Usage comes AFTER the finish on this shape, so the reader keeps going
518
+ // to `[DONE]` (invariant 5). But a read that dies in between costs only
519
+ // the usage frame: the answer is whole once its finish is stated.
520
+ finished: () => ended,
483
521
  })) {
484
- let chunk;
485
- try {
486
- chunk = JSON.parse(data);
487
- }
488
- catch {
489
- continue;
490
- }
522
+ const chunk = parseFrame(data, id);
491
523
  // A failure the backend reports after its headers went out. The
492
524
  // gateways speaking this dialect — OpenRouter above all — report a
493
525
  // throttle or an upstream outage this way rather than as a status
@@ -556,21 +588,40 @@ export function createOpenAIProvider(config) {
556
588
  ? { arguments: call.function.arguments }
557
589
  : {}),
558
590
  }));
591
+ for (const call of out.toolCalls) {
592
+ const seen = calls.get(call.index) ?? { index: call.index, id: "", name: "" };
593
+ if (call.id)
594
+ seen.id = call.id;
595
+ if (call.name)
596
+ seen.name = call.name;
597
+ calls.set(call.index, seen);
598
+ }
559
599
  has = true;
560
600
  }
561
601
  if (has)
562
602
  yield out;
563
603
  }
564
- if (choice.finish_reason)
604
+ if (choice.finish_reason) {
605
+ const stated = mapFinishReason(id, choice.finish_reason);
606
+ const minted = settleToolCalls(id, calls.values());
607
+ if (minted.length > 0)
608
+ yield { type: "delta", toolCalls: minted };
565
609
  ended = true;
566
- const finishReason = mapFinishReason(choice.finish_reason);
567
- if (finishReason)
610
+ // Several gateways end a turn that called a tool on `stop`, and a
611
+ // caller reading that as done never runs the tool. Only `stop` is
612
+ // promoted: a length cut or a filter may be what broke the call.
613
+ const finishReason = stated === "stop" && calls.size > 0 ? "tool_calls" : stated;
568
614
  yield { type: "finish", finishReason };
615
+ }
569
616
  }
570
617
  // Either proof will do: some gateways send `[DONE]` with no finish, and
571
618
  // some a finish with no `[DONE]`. Neither means the socket closed early.
572
619
  if (!ended)
573
620
  throw streamCut(id);
621
+ // A `[DONE]` with no finish stated still owes its calls the same check.
622
+ const minted = settleToolCalls(id, calls.values());
623
+ if (minted.length > 0)
624
+ yield { type: "delta", toolCalls: minted };
574
625
  },
575
626
  };
576
627
  return withConfiguredFallbacks(provider, config);