@earendil-works/pi-ai 0.82.1 → 0.84.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 (202) hide show
  1. package/README.md +18 -8
  2. package/dist/api/anthropic-messages.d.ts.map +1 -1
  3. package/dist/api/anthropic-messages.js +14 -7
  4. package/dist/api/anthropic-messages.js.map +1 -1
  5. package/dist/api/azure-openai-responses.d.ts.map +1 -1
  6. package/dist/api/azure-openai-responses.js +10 -2
  7. package/dist/api/azure-openai-responses.js.map +1 -1
  8. package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  9. package/dist/api/bedrock-converse-stream.js +64 -4
  10. package/dist/api/bedrock-converse-stream.js.map +1 -1
  11. package/dist/api/google-generative-ai.d.ts.map +1 -1
  12. package/dist/api/google-generative-ai.js +14 -4
  13. package/dist/api/google-generative-ai.js.map +1 -1
  14. package/dist/api/google-shared.d.ts +11 -1
  15. package/dist/api/google-shared.d.ts.map +1 -1
  16. package/dist/api/google-shared.js +44 -7
  17. package/dist/api/google-shared.js.map +1 -1
  18. package/dist/api/google-vertex.d.ts.map +1 -1
  19. package/dist/api/google-vertex.js +14 -4
  20. package/dist/api/google-vertex.js.map +1 -1
  21. package/dist/api/lazy.d.ts +5 -1
  22. package/dist/api/lazy.d.ts.map +1 -1
  23. package/dist/api/lazy.js +19 -7
  24. package/dist/api/lazy.js.map +1 -1
  25. package/dist/api/mistral-conversations.d.ts.map +1 -1
  26. package/dist/api/mistral-conversations.js +19 -10
  27. package/dist/api/mistral-conversations.js.map +1 -1
  28. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  29. package/dist/api/openai-codex-responses.js +51 -21
  30. package/dist/api/openai-codex-responses.js.map +1 -1
  31. package/dist/api/openai-completions.d.ts +5 -2
  32. package/dist/api/openai-completions.d.ts.map +1 -1
  33. package/dist/api/openai-completions.js +77 -16
  34. package/dist/api/openai-completions.js.map +1 -1
  35. package/dist/api/openai-responses-shared.d.ts.map +1 -1
  36. package/dist/api/openai-responses-shared.js +31 -8
  37. package/dist/api/openai-responses-shared.js.map +1 -1
  38. package/dist/api/openai-responses.d.ts.map +1 -1
  39. package/dist/api/openai-responses.js +12 -4
  40. package/dist/api/openai-responses.js.map +1 -1
  41. package/dist/api/openrouter-images.d.ts.map +1 -1
  42. package/dist/api/openrouter-images.js +3 -2
  43. package/dist/api/openrouter-images.js.map +1 -1
  44. package/dist/api/pi-messages.d.ts.map +1 -1
  45. package/dist/api/pi-messages.js +2 -2
  46. package/dist/api/pi-messages.js.map +1 -1
  47. package/dist/api/simple-options.d.ts +2 -0
  48. package/dist/api/simple-options.d.ts.map +1 -1
  49. package/dist/api/simple-options.js +9 -2
  50. package/dist/api/simple-options.js.map +1 -1
  51. package/dist/auth/credential-store.d.ts +6 -6
  52. package/dist/auth/credential-store.d.ts.map +1 -1
  53. package/dist/auth/credential-store.js +22 -11
  54. package/dist/auth/credential-store.js.map +1 -1
  55. package/dist/auth/helpers.d.ts +1 -0
  56. package/dist/auth/helpers.d.ts.map +1 -1
  57. package/dist/auth/helpers.js +7 -2
  58. package/dist/auth/helpers.js.map +1 -1
  59. package/dist/auth/oauth/anthropic.d.ts.map +1 -1
  60. package/dist/auth/oauth/anthropic.js +14 -8
  61. package/dist/auth/oauth/anthropic.js.map +1 -1
  62. package/dist/auth/oauth/device-code.d.ts +1 -1
  63. package/dist/auth/oauth/device-code.d.ts.map +1 -1
  64. package/dist/auth/oauth/device-code.js +4 -4
  65. package/dist/auth/oauth/device-code.js.map +1 -1
  66. package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
  67. package/dist/auth/oauth/github-copilot.js +43 -30
  68. package/dist/auth/oauth/github-copilot.js.map +1 -1
  69. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  70. package/dist/auth/oauth/kimi-coding.js +17 -5
  71. package/dist/auth/oauth/kimi-coding.js.map +1 -1
  72. package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  73. package/dist/auth/oauth/openai-codex.js +12 -5
  74. package/dist/auth/oauth/openai-codex.js.map +1 -1
  75. package/dist/auth/oauth/openrouter.d.ts +3 -1
  76. package/dist/auth/oauth/openrouter.d.ts.map +1 -1
  77. package/dist/auth/oauth/openrouter.js +91 -36
  78. package/dist/auth/oauth/openrouter.js.map +1 -1
  79. package/dist/auth/oauth/radius.d.ts.map +1 -1
  80. package/dist/auth/oauth/radius.js +8 -7
  81. package/dist/auth/oauth/radius.js.map +1 -1
  82. package/dist/auth/oauth/xai.d.ts.map +1 -1
  83. package/dist/auth/oauth/xai.js +3 -2
  84. package/dist/auth/oauth/xai.js.map +1 -1
  85. package/dist/auth/resolve.d.ts +3 -0
  86. package/dist/auth/resolve.d.ts.map +1 -1
  87. package/dist/auth/resolve.js +38 -19
  88. package/dist/auth/resolve.js.map +1 -1
  89. package/dist/auth/types.d.ts +20 -8
  90. package/dist/auth/types.d.ts.map +1 -1
  91. package/dist/auth/types.js.map +1 -1
  92. package/dist/cli.d.ts.map +1 -1
  93. package/dist/cli.js +1 -0
  94. package/dist/cli.js.map +1 -1
  95. package/dist/env-api-keys.d.ts.map +1 -1
  96. package/dist/env-api-keys.js +1 -0
  97. package/dist/env-api-keys.js.map +1 -1
  98. package/dist/image-models.generated.d.ts +30 -0
  99. package/dist/image-models.generated.d.ts.map +1 -1
  100. package/dist/image-models.generated.js +32 -2
  101. package/dist/image-models.generated.js.map +1 -1
  102. package/dist/images-models.d.ts.map +1 -1
  103. package/dist/images-models.js +1 -0
  104. package/dist/images-models.js.map +1 -1
  105. package/dist/models-store.d.ts +9 -12
  106. package/dist/models-store.d.ts.map +1 -1
  107. package/dist/models-store.js +6 -3
  108. package/dist/models-store.js.map +1 -1
  109. package/dist/models.d.ts +40 -18
  110. package/dist/models.d.ts.map +1 -1
  111. package/dist/models.generated.d.ts +2 -0
  112. package/dist/models.generated.d.ts.map +1 -1
  113. package/dist/models.generated.js +2 -0
  114. package/dist/models.generated.js.map +1 -1
  115. package/dist/models.js +245 -89
  116. package/dist/models.js.map +1 -1
  117. package/dist/providers/all.d.ts.map +1 -1
  118. package/dist/providers/all.js +2 -0
  119. package/dist/providers/all.js.map +1 -1
  120. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  121. package/dist/providers/amazon-bedrock.js +15 -7
  122. package/dist/providers/amazon-bedrock.js.map +1 -1
  123. package/dist/providers/anthropic.d.ts.map +1 -1
  124. package/dist/providers/anthropic.js +15 -6
  125. package/dist/providers/anthropic.js.map +1 -1
  126. package/dist/providers/baseten.d.ts +3 -0
  127. package/dist/providers/baseten.d.ts.map +1 -0
  128. package/dist/providers/baseten.js +15 -0
  129. package/dist/providers/baseten.js.map +1 -0
  130. package/dist/providers/baseten.models.d.ts +4 -0
  131. package/dist/providers/baseten.models.d.ts.map +1 -0
  132. package/dist/providers/baseten.models.js +6 -0
  133. package/dist/providers/baseten.models.js.map +1 -0
  134. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  135. package/dist/providers/cloudflare-auth.js +15 -10
  136. package/dist/providers/cloudflare-auth.js.map +1 -1
  137. package/dist/providers/data/.manifest.json +1 -1
  138. package/dist/providers/data/amazon-bedrock.json +1 -1
  139. package/dist/providers/data/anthropic.json +1 -1
  140. package/dist/providers/data/azure-openai-responses.json +1 -1
  141. package/dist/providers/data/baseten.json +1 -0
  142. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  143. package/dist/providers/data/fireworks.json +1 -1
  144. package/dist/providers/data/github-copilot.json +1 -1
  145. package/dist/providers/data/groq.json +1 -1
  146. package/dist/providers/data/huggingface.json +1 -1
  147. package/dist/providers/data/mistral.json +1 -1
  148. package/dist/providers/data/nvidia.json +1 -1
  149. package/dist/providers/data/openai-codex.json +1 -1
  150. package/dist/providers/data/openai.json +1 -1
  151. package/dist/providers/data/opencode-go.json +1 -1
  152. package/dist/providers/data/opencode.json +1 -1
  153. package/dist/providers/data/openrouter.json +1 -1
  154. package/dist/providers/data/qwen-token-plan-cn.json +1 -1
  155. package/dist/providers/data/qwen-token-plan.json +1 -1
  156. package/dist/providers/data/together.json +1 -1
  157. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  158. package/dist/providers/data/zai-coding-cn.json +1 -1
  159. package/dist/providers/data/zai.json +1 -1
  160. package/dist/providers/faux.d.ts +18 -13
  161. package/dist/providers/faux.d.ts.map +1 -1
  162. package/dist/providers/faux.js +99 -6
  163. package/dist/providers/faux.js.map +1 -1
  164. package/dist/providers/github-copilot.d.ts.map +1 -1
  165. package/dist/providers/github-copilot.js +1 -1
  166. package/dist/providers/github-copilot.js.map +1 -1
  167. package/dist/providers/google-vertex.d.ts.map +1 -1
  168. package/dist/providers/google-vertex.js +15 -7
  169. package/dist/providers/google-vertex.js.map +1 -1
  170. package/dist/providers/kimi-coding.d.ts.map +1 -1
  171. package/dist/providers/kimi-coding.js +1 -0
  172. package/dist/providers/kimi-coding.js.map +1 -1
  173. package/dist/providers/openai-codex.d.ts.map +1 -1
  174. package/dist/providers/openai-codex.js +5 -1
  175. package/dist/providers/openai-codex.js.map +1 -1
  176. package/dist/providers/opencode-go.d.ts.map +1 -1
  177. package/dist/providers/opencode-go.js +1 -1
  178. package/dist/providers/opencode-go.js.map +1 -1
  179. package/dist/providers/radius.d.ts.map +1 -1
  180. package/dist/providers/radius.js +36 -26
  181. package/dist/providers/radius.js.map +1 -1
  182. package/dist/providers/xai.d.ts.map +1 -1
  183. package/dist/providers/xai.js +1 -0
  184. package/dist/providers/xai.js.map +1 -1
  185. package/dist/types.d.ts +102 -76
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.js.map +1 -1
  188. package/dist/utils/abort.d.ts +8 -0
  189. package/dist/utils/abort.d.ts.map +1 -0
  190. package/dist/utils/abort.js +49 -0
  191. package/dist/utils/abort.js.map +1 -0
  192. package/dist/utils/error-body.d.ts.map +1 -1
  193. package/dist/utils/error-body.js +23 -4
  194. package/dist/utils/error-body.js.map +1 -1
  195. package/dist/utils/overflow.d.ts +10 -1
  196. package/dist/utils/overflow.d.ts.map +1 -1
  197. package/dist/utils/overflow.js +12 -1
  198. package/dist/utils/overflow.js.map +1 -1
  199. package/dist/utils/validation.d.ts.map +1 -1
  200. package/dist/utils/validation.js +6 -0
  201. package/dist/utils/validation.js.map +1 -1
  202. package/package.json +3 -2
@@ -44,6 +44,14 @@ const CODEX_RESPONSE_STATUSES = new Set([
44
44
  "queued",
45
45
  "in_progress",
46
46
  ]);
47
+ function assertSuccessfulOutput(output) {
48
+ if (output.stopReason === "pending") {
49
+ throw new Error("Codex stream ended without a stop reason");
50
+ }
51
+ if (output.stopReason === "error" || output.stopReason === "aborted") {
52
+ throw new Error(output.errorMessage || "An unknown error occurred");
53
+ }
54
+ }
47
55
  // ============================================================================
48
56
  // Retry Helpers
49
57
  // ============================================================================
@@ -155,7 +163,7 @@ export const stream = (model, context, options) => {
155
163
  totalTokens: 0,
156
164
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
157
165
  },
158
- stopReason: "stop",
166
+ stopReason: "pending",
159
167
  timestamp: Date.now(),
160
168
  };
161
169
  try {
@@ -197,10 +205,11 @@ export const stream = (model, context, options) => {
197
205
  startEmitted = true;
198
206
  stream.push({ type: "start", partial: output });
199
207
  }
200
- }, httpTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, grammarToolInputProperties, options);
208
+ }, httpTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, accountId, grammarToolInputProperties, options);
201
209
  if (options?.signal?.aborted) {
202
210
  throw new Error("Request was aborted");
203
211
  }
212
+ assertSuccessfulOutput(output);
204
213
  stream.push({
205
214
  type: "done",
206
215
  reason: output.stopReason,
@@ -260,7 +269,7 @@ export const stream = (model, context, options) => {
260
269
  const headerTimeoutSignal = httpTimeoutMs !== undefined && httpTimeoutMs > 0 ? AbortSignal.timeout(httpTimeoutMs) : undefined;
261
270
  const combinedSignal = combineAbortSignals([options?.signal, headerTimeoutSignal]);
262
271
  try {
263
- response = await fetch(resolveCodexUrl(model.baseUrl), {
272
+ response = await (options?.fetch ?? globalThis.fetch)(resolveCodexUrl(model.baseUrl), {
264
273
  method: "POST",
265
274
  headers: sseHeaders,
266
275
  body: sseBody,
@@ -329,6 +338,7 @@ export const stream = (model, context, options) => {
329
338
  if (options?.signal?.aborted) {
330
339
  throw new Error("Request was aborted");
331
340
  }
341
+ assertSuccessfulOutput(output);
332
342
  stream.push({ type: "done", reason: output.stopReason, message: output });
333
343
  stream.end();
334
344
  }
@@ -653,14 +663,14 @@ export function closeOpenAICodexWebSocketSessions(sessionId) {
653
663
  closeWebSocketSilently(entry.socket, 1000, "debug_close");
654
664
  };
655
665
  if (sessionId) {
656
- const entry = websocketSessionCache.get(sessionId);
657
- if (entry)
666
+ for (const entry of websocketSessionCache.get(sessionId)?.values() ?? [])
658
667
  closeEntry(entry);
659
668
  websocketSessionCache.delete(sessionId);
660
669
  return;
661
670
  }
662
- for (const entry of websocketSessionCache.values()) {
663
- closeEntry(entry);
671
+ for (const accountEntries of websocketSessionCache.values()) {
672
+ for (const entry of accountEntries.values())
673
+ closeEntry(entry);
664
674
  }
665
675
  websocketSessionCache.clear();
666
676
  }
@@ -744,7 +754,7 @@ function closeWebSocketSilently(socket, code = 1000, reason = "done") {
744
754
  }
745
755
  catch { }
746
756
  }
747
- function scheduleSessionWebSocketExpiry(sessionId, entry) {
757
+ function scheduleSessionWebSocketExpiry(sessionId, accountId, entry) {
748
758
  if (entry.idleTimer) {
749
759
  clearTimeout(entry.idleTimer);
750
760
  }
@@ -752,7 +762,11 @@ function scheduleSessionWebSocketExpiry(sessionId, entry) {
752
762
  if (entry.busy)
753
763
  return;
754
764
  closeWebSocketSilently(entry.socket, 1000, "idle_timeout");
755
- websocketSessionCache.delete(sessionId);
765
+ const accountEntries = websocketSessionCache.get(sessionId);
766
+ if (accountEntries?.get(accountId) === entry)
767
+ accountEntries.delete(accountId);
768
+ if (accountEntries?.size === 0)
769
+ websocketSessionCache.delete(sessionId);
756
770
  }, SESSION_WEBSOCKET_CACHE_TTL_MS);
757
771
  }
758
772
  async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS, env) {
@@ -823,7 +837,7 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
823
837
  }
824
838
  });
825
839
  }
826
- async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutMs, env) {
840
+ async function acquireWebSocket(url, headers, sessionId, accountId, signal, connectTimeoutMs, env) {
827
841
  if (!sessionId) {
828
842
  const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);
829
843
  return {
@@ -832,7 +846,8 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
832
846
  release: () => closeWebSocketSilently(socket),
833
847
  };
834
848
  }
835
- const cached = websocketSessionCache.get(sessionId);
849
+ let accountEntries = websocketSessionCache.get(sessionId);
850
+ const cached = accountEntries?.get(accountId);
836
851
  if (cached) {
837
852
  if (cached.idleTimer) {
838
853
  clearTimeout(cached.idleTimer);
@@ -840,7 +855,9 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
840
855
  }
841
856
  if (!cached.busy && isWebSocketSessionExpired(cached)) {
842
857
  closeWebSocketSilently(cached.socket, 1000, "connection_age_limit");
843
- websocketSessionCache.delete(sessionId);
858
+ accountEntries?.delete(accountId);
859
+ if (accountEntries?.size === 0)
860
+ websocketSessionCache.delete(sessionId);
844
861
  }
845
862
  else if (!cached.busy && isWebSocketReusable(cached.socket)) {
846
863
  cached.busy = true;
@@ -851,11 +868,15 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
851
868
  release: ({ keep } = {}) => {
852
869
  if (!keep || !isWebSocketReusable(cached.socket)) {
853
870
  closeWebSocketSilently(cached.socket);
854
- websocketSessionCache.delete(sessionId);
871
+ const currentEntries = websocketSessionCache.get(sessionId);
872
+ if (currentEntries?.get(accountId) === cached)
873
+ currentEntries.delete(accountId);
874
+ if (currentEntries?.size === 0)
875
+ websocketSessionCache.delete(sessionId);
855
876
  return;
856
877
  }
857
878
  cached.busy = false;
858
- scheduleSessionWebSocketExpiry(sessionId, cached);
879
+ scheduleSessionWebSocketExpiry(sessionId, accountId, cached);
859
880
  },
860
881
  };
861
882
  }
@@ -871,12 +892,19 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
871
892
  }
872
893
  if (!isWebSocketReusable(cached.socket)) {
873
894
  closeWebSocketSilently(cached.socket);
874
- websocketSessionCache.delete(sessionId);
895
+ accountEntries?.delete(accountId);
896
+ if (accountEntries?.size === 0)
897
+ websocketSessionCache.delete(sessionId);
875
898
  }
876
899
  }
877
900
  const socket = await connectWebSocket(url, headers, signal, connectTimeoutMs, env);
878
901
  const entry = { socket, busy: true, createdAt: Date.now() };
879
- websocketSessionCache.set(sessionId, entry);
902
+ accountEntries = websocketSessionCache.get(sessionId);
903
+ if (!accountEntries) {
904
+ accountEntries = new Map();
905
+ websocketSessionCache.set(sessionId, accountEntries);
906
+ }
907
+ accountEntries.set(accountId, entry);
880
908
  return {
881
909
  socket,
882
910
  entry,
@@ -886,13 +914,15 @@ async function acquireWebSocket(url, headers, sessionId, signal, connectTimeoutM
886
914
  closeWebSocketSilently(entry.socket);
887
915
  if (entry.idleTimer)
888
916
  clearTimeout(entry.idleTimer);
889
- if (websocketSessionCache.get(sessionId) === entry) {
917
+ const currentEntries = websocketSessionCache.get(sessionId);
918
+ if (currentEntries?.get(accountId) === entry)
919
+ currentEntries.delete(accountId);
920
+ if (currentEntries?.size === 0)
890
921
  websocketSessionCache.delete(sessionId);
891
- }
892
922
  return;
893
923
  }
894
924
  entry.busy = false;
895
- scheduleSessionWebSocketExpiry(sessionId, entry);
925
+ scheduleSessionWebSocketExpiry(sessionId, accountId, entry);
896
926
  },
897
927
  };
898
928
  }
@@ -1112,8 +1142,8 @@ async function* startWebSocketOutputOnFirstEvent(events, onStart) {
1112
1142
  yield event;
1113
1143
  }
1114
1144
  }
1115
- async function processWebSocketStream(url, body, headers, output, stream, model, onStart, idleTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, grammarToolInputProperties, options) {
1116
- const { socket, entry, reused, release } = await acquireWebSocket(url, headers, cacheSessionId, options?.signal, websocketConnectTimeoutMs, options?.env);
1145
+ async function processWebSocketStream(url, body, headers, output, stream, model, onStart, idleTimeoutMs, websocketConnectTimeoutMs, cacheSessionId, accountId, grammarToolInputProperties, options) {
1146
+ const { socket, entry, reused, release } = await acquireWebSocket(url, headers, cacheSessionId, accountId, options?.signal, websocketConnectTimeoutMs, options?.env);
1117
1147
  let keepConnection = true;
1118
1148
  const useCachedContext = options?.transport === "websocket-cached" || options?.transport === "auto";
1119
1149
  // ChatGPT Codex Responses rejects `store: true` ("Store must be set to false").