@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.
- package/README.md +18 -8
- package/dist/api/anthropic-messages.d.ts.map +1 -1
- package/dist/api/anthropic-messages.js +14 -7
- package/dist/api/anthropic-messages.js.map +1 -1
- package/dist/api/azure-openai-responses.d.ts.map +1 -1
- package/dist/api/azure-openai-responses.js +10 -2
- package/dist/api/azure-openai-responses.js.map +1 -1
- package/dist/api/bedrock-converse-stream.d.ts.map +1 -1
- package/dist/api/bedrock-converse-stream.js +64 -4
- package/dist/api/bedrock-converse-stream.js.map +1 -1
- package/dist/api/google-generative-ai.d.ts.map +1 -1
- package/dist/api/google-generative-ai.js +14 -4
- package/dist/api/google-generative-ai.js.map +1 -1
- package/dist/api/google-shared.d.ts +11 -1
- package/dist/api/google-shared.d.ts.map +1 -1
- package/dist/api/google-shared.js +44 -7
- package/dist/api/google-shared.js.map +1 -1
- package/dist/api/google-vertex.d.ts.map +1 -1
- package/dist/api/google-vertex.js +14 -4
- package/dist/api/google-vertex.js.map +1 -1
- package/dist/api/lazy.d.ts +5 -1
- package/dist/api/lazy.d.ts.map +1 -1
- package/dist/api/lazy.js +19 -7
- package/dist/api/lazy.js.map +1 -1
- package/dist/api/mistral-conversations.d.ts.map +1 -1
- package/dist/api/mistral-conversations.js +19 -10
- package/dist/api/mistral-conversations.js.map +1 -1
- package/dist/api/openai-codex-responses.d.ts.map +1 -1
- package/dist/api/openai-codex-responses.js +51 -21
- package/dist/api/openai-codex-responses.js.map +1 -1
- package/dist/api/openai-completions.d.ts +5 -2
- package/dist/api/openai-completions.d.ts.map +1 -1
- package/dist/api/openai-completions.js +77 -16
- package/dist/api/openai-completions.js.map +1 -1
- package/dist/api/openai-responses-shared.d.ts.map +1 -1
- package/dist/api/openai-responses-shared.js +31 -8
- package/dist/api/openai-responses-shared.js.map +1 -1
- package/dist/api/openai-responses.d.ts.map +1 -1
- package/dist/api/openai-responses.js +12 -4
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/openrouter-images.d.ts.map +1 -1
- package/dist/api/openrouter-images.js +3 -2
- package/dist/api/openrouter-images.js.map +1 -1
- package/dist/api/pi-messages.d.ts.map +1 -1
- package/dist/api/pi-messages.js +2 -2
- package/dist/api/pi-messages.js.map +1 -1
- package/dist/api/simple-options.d.ts +2 -0
- package/dist/api/simple-options.d.ts.map +1 -1
- package/dist/api/simple-options.js +9 -2
- package/dist/api/simple-options.js.map +1 -1
- package/dist/auth/credential-store.d.ts +6 -6
- package/dist/auth/credential-store.d.ts.map +1 -1
- package/dist/auth/credential-store.js +22 -11
- package/dist/auth/credential-store.js.map +1 -1
- package/dist/auth/helpers.d.ts +1 -0
- package/dist/auth/helpers.d.ts.map +1 -1
- package/dist/auth/helpers.js +7 -2
- package/dist/auth/helpers.js.map +1 -1
- package/dist/auth/oauth/anthropic.d.ts.map +1 -1
- package/dist/auth/oauth/anthropic.js +14 -8
- package/dist/auth/oauth/anthropic.js.map +1 -1
- package/dist/auth/oauth/device-code.d.ts +1 -1
- package/dist/auth/oauth/device-code.d.ts.map +1 -1
- package/dist/auth/oauth/device-code.js +4 -4
- package/dist/auth/oauth/device-code.js.map +1 -1
- package/dist/auth/oauth/github-copilot.d.ts.map +1 -1
- package/dist/auth/oauth/github-copilot.js +43 -30
- package/dist/auth/oauth/github-copilot.js.map +1 -1
- package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
- package/dist/auth/oauth/kimi-coding.js +17 -5
- package/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/auth/oauth/openai-codex.d.ts.map +1 -1
- package/dist/auth/oauth/openai-codex.js +12 -5
- package/dist/auth/oauth/openai-codex.js.map +1 -1
- package/dist/auth/oauth/openrouter.d.ts +3 -1
- package/dist/auth/oauth/openrouter.d.ts.map +1 -1
- package/dist/auth/oauth/openrouter.js +91 -36
- package/dist/auth/oauth/openrouter.js.map +1 -1
- package/dist/auth/oauth/radius.d.ts.map +1 -1
- package/dist/auth/oauth/radius.js +8 -7
- package/dist/auth/oauth/radius.js.map +1 -1
- package/dist/auth/oauth/xai.d.ts.map +1 -1
- package/dist/auth/oauth/xai.js +3 -2
- package/dist/auth/oauth/xai.js.map +1 -1
- package/dist/auth/resolve.d.ts +3 -0
- package/dist/auth/resolve.d.ts.map +1 -1
- package/dist/auth/resolve.js +38 -19
- package/dist/auth/resolve.js.map +1 -1
- package/dist/auth/types.d.ts +20 -8
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/env-api-keys.d.ts.map +1 -1
- package/dist/env-api-keys.js +1 -0
- package/dist/env-api-keys.js.map +1 -1
- package/dist/image-models.generated.d.ts +30 -0
- package/dist/image-models.generated.d.ts.map +1 -1
- package/dist/image-models.generated.js +32 -2
- package/dist/image-models.generated.js.map +1 -1
- package/dist/images-models.d.ts.map +1 -1
- package/dist/images-models.js +1 -0
- package/dist/images-models.js.map +1 -1
- package/dist/models-store.d.ts +9 -12
- package/dist/models-store.d.ts.map +1 -1
- package/dist/models-store.js +6 -3
- package/dist/models-store.js.map +1 -1
- package/dist/models.d.ts +40 -18
- package/dist/models.d.ts.map +1 -1
- package/dist/models.generated.d.ts +2 -0
- package/dist/models.generated.d.ts.map +1 -1
- package/dist/models.generated.js +2 -0
- package/dist/models.generated.js.map +1 -1
- package/dist/models.js +245 -89
- package/dist/models.js.map +1 -1
- package/dist/providers/all.d.ts.map +1 -1
- package/dist/providers/all.js +2 -0
- package/dist/providers/all.js.map +1 -1
- package/dist/providers/amazon-bedrock.d.ts.map +1 -1
- package/dist/providers/amazon-bedrock.js +15 -7
- package/dist/providers/amazon-bedrock.js.map +1 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +15 -6
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/baseten.d.ts +3 -0
- package/dist/providers/baseten.d.ts.map +1 -0
- package/dist/providers/baseten.js +15 -0
- package/dist/providers/baseten.js.map +1 -0
- package/dist/providers/baseten.models.d.ts +4 -0
- package/dist/providers/baseten.models.d.ts.map +1 -0
- package/dist/providers/baseten.models.js +6 -0
- package/dist/providers/baseten.models.js.map +1 -0
- package/dist/providers/cloudflare-auth.d.ts.map +1 -1
- package/dist/providers/cloudflare-auth.js +15 -10
- package/dist/providers/cloudflare-auth.js.map +1 -1
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/amazon-bedrock.json +1 -1
- package/dist/providers/data/anthropic.json +1 -1
- package/dist/providers/data/azure-openai-responses.json +1 -1
- package/dist/providers/data/baseten.json +1 -0
- package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/dist/providers/data/fireworks.json +1 -1
- package/dist/providers/data/github-copilot.json +1 -1
- package/dist/providers/data/groq.json +1 -1
- package/dist/providers/data/huggingface.json +1 -1
- package/dist/providers/data/mistral.json +1 -1
- package/dist/providers/data/nvidia.json +1 -1
- package/dist/providers/data/openai-codex.json +1 -1
- package/dist/providers/data/openai.json +1 -1
- package/dist/providers/data/opencode-go.json +1 -1
- package/dist/providers/data/opencode.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/dist/providers/data/qwen-token-plan.json +1 -1
- package/dist/providers/data/together.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/data/zai-coding-cn.json +1 -1
- package/dist/providers/data/zai.json +1 -1
- package/dist/providers/faux.d.ts +18 -13
- package/dist/providers/faux.d.ts.map +1 -1
- package/dist/providers/faux.js +99 -6
- package/dist/providers/faux.js.map +1 -1
- package/dist/providers/github-copilot.d.ts.map +1 -1
- package/dist/providers/github-copilot.js +1 -1
- package/dist/providers/github-copilot.js.map +1 -1
- package/dist/providers/google-vertex.d.ts.map +1 -1
- package/dist/providers/google-vertex.js +15 -7
- package/dist/providers/google-vertex.js.map +1 -1
- package/dist/providers/kimi-coding.d.ts.map +1 -1
- package/dist/providers/kimi-coding.js +1 -0
- package/dist/providers/kimi-coding.js.map +1 -1
- package/dist/providers/openai-codex.d.ts.map +1 -1
- package/dist/providers/openai-codex.js +5 -1
- package/dist/providers/openai-codex.js.map +1 -1
- package/dist/providers/opencode-go.d.ts.map +1 -1
- package/dist/providers/opencode-go.js +1 -1
- package/dist/providers/opencode-go.js.map +1 -1
- package/dist/providers/radius.d.ts.map +1 -1
- package/dist/providers/radius.js +36 -26
- package/dist/providers/radius.js.map +1 -1
- package/dist/providers/xai.d.ts.map +1 -1
- package/dist/providers/xai.js +1 -0
- package/dist/providers/xai.js.map +1 -1
- package/dist/types.d.ts +102 -76
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/abort.d.ts +8 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +49 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/error-body.d.ts.map +1 -1
- package/dist/utils/error-body.js +23 -4
- package/dist/utils/error-body.js.map +1 -1
- package/dist/utils/overflow.d.ts +10 -1
- package/dist/utils/overflow.d.ts.map +1 -1
- package/dist/utils/overflow.js +12 -1
- package/dist/utils/overflow.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +6 -0
- package/dist/utils/validation.js.map +1 -1
- 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: "
|
|
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
|
|
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
|
|
663
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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").
|