@code-yeongyu/senpi-ai 2026.9.21-2 → 2026.9.22-2
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 +1 -1
- package/dist/api/openai-codex-responses.js +14 -56
- package/dist/api/openai-codex-responses.js.map +1 -1
- package/dist/api/openai-responses.d.ts.map +1 -1
- package/dist/api/openai-responses.js +18 -27
- package/dist/api/openai-responses.js.map +1 -1
- package/dist/api/websocket-transport-failure.d.ts +40 -0
- package/dist/api/websocket-transport-failure.d.ts.map +1 -0
- package/dist/api/websocket-transport-failure.js +102 -0
- package/dist/api/websocket-transport-failure.js.map +1 -0
- package/dist/auth/oauth/kimi-coding.d.ts +4 -3
- package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
- package/dist/auth/oauth/kimi-coding.js +28 -14
- package/dist/auth/oauth/kimi-coding.js.map +1 -1
- package/dist/auth/oauth/kimi-region.d.ts +44 -0
- package/dist/auth/oauth/kimi-region.d.ts.map +1 -0
- package/dist/auth/oauth/kimi-region.js +120 -0
- package/dist/auth/oauth/kimi-region.js.map +1 -0
- package/dist/auth/pool/failover.d.ts +2 -2
- package/dist/auth/pool/failover.d.ts.map +1 -1
- package/dist/auth/pool/failover.js +2 -2
- package/dist/auth/pool/failover.js.map +1 -1
- package/dist/auth/pool/slots.d.ts +3 -0
- package/dist/auth/pool/slots.d.ts.map +1 -1
- package/dist/auth/pool/slots.js +21 -15
- package/dist/auth/pool/slots.js.map +1 -1
- package/dist/compat.d.ts +1 -0
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js +1 -0
- package/dist/compat.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/legacy-provider-ids.d.ts +8 -0
- package/dist/legacy-provider-ids.d.ts.map +1 -0
- package/dist/legacy-provider-ids.js +26 -0
- package/dist/legacy-provider-ids.js.map +1 -0
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/dist/providers/data/github-copilot.json +1 -1
- package/dist/providers/data/huggingface.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/venice.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/providers/data/xai.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
- package/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
- package/dist/providers/data/xiaomi.json +1 -1
- package/dist/providers/kimi-coding-auth.d.ts +9 -0
- package/dist/providers/kimi-coding-auth.d.ts.map +1 -0
- package/dist/providers/kimi-coding-auth.js +43 -0
- package/dist/providers/kimi-coding-auth.js.map +1 -0
- package/dist/providers/kimi-coding.d.ts.map +1 -1
- package/dist/providers/kimi-coding.js +3 -2
- package/dist/providers/kimi-coding.js.map +1 -1
- package/dist/utils/provider-failure-description.d.ts +19 -0
- package/dist/utils/provider-failure-description.d.ts.map +1 -0
- package/dist/utils/provider-failure-description.js +63 -0
- package/dist/utils/provider-failure-description.js.map +1 -0
- package/dist/utils/retry-profile/classifiers.d.ts.map +1 -1
- package/dist/utils/retry-profile/classifiers.js +5 -1
- package/dist/utils/retry-profile/classifiers.js.map +1 -1
- package/dist/utils/retry.d.ts +17 -0
- package/dist/utils/retry.d.ts.map +1 -1
- package/dist/utils/retry.js +22 -1
- package/dist/utils/retry.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -458,7 +458,7 @@ Built-in providers resolve these env vars (Node.js; in browsers pass `apiKey` ex
|
|
|
458
458
|
| Moonshot AI / Moonshot AI (China) | `MOONSHOT_API_KEY` |
|
|
459
459
|
| Hugging Face | `HF_TOKEN` |
|
|
460
460
|
| OpenCode Zen / OpenCode Go | `OPENCODE_API_KEY` |
|
|
461
|
-
| Kimi For Coding | `KIMI_API_KEY` |
|
|
461
|
+
| Kimi For Coding | `KIMI_API_KEY` (+ `KIMI_CODE_REGION`) |
|
|
462
462
|
| Qwen Token Plan (existing catalog) | `QWEN_TOKEN_PLAN_API_KEY` |
|
|
463
463
|
| Qwen Token Plan (Individual) | `QWEN_TOKEN_PLAN_API_KEY` |
|
|
464
464
|
| Qwen Token Plan (China) | `QWEN_TOKEN_PLAN_CN_API_KEY` |
|
|
@@ -26,6 +26,7 @@ import { applyOpenAICodexCacheAffinityHeaders, clampOpenAIPromptCacheKey } from
|
|
|
26
26
|
import { convertResponsesMessages, convertResponsesTools, processResponsesStream } from "./openai-responses-shared.js";
|
|
27
27
|
import { applyExtraBody, buildBaseOptions, clampMaxForOpenAI, OPENAI_RESPONSES_RESERVED_BODY_KEYS, } from "./simple-options.js";
|
|
28
28
|
import { startWebSocketLiveness } from "./websocket-liveness.js";
|
|
29
|
+
import { createWebSocketTransportFailure } from "./websocket-transport-failure.js";
|
|
29
30
|
// ============================================================================
|
|
30
31
|
// Configuration
|
|
31
32
|
// ============================================================================
|
|
@@ -38,7 +39,6 @@ const DEFAULT_WEBSOCKET_CONNECT_TIMEOUT_MS = 15_000;
|
|
|
38
39
|
// endpoint (the same endpoint the official Codex client compresses against).
|
|
39
40
|
const REQUEST_COMPRESSION_ZSTD_LEVEL = 3;
|
|
40
41
|
const CODEX_TOOL_CALL_PROVIDERS = new Set(["openai", "openai-codex", "opencode"]);
|
|
41
|
-
const WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE = 1009;
|
|
42
42
|
const CODEX_PREVIOUS_RESPONSE_STALE_CODES = new Set(["codex_previous_response_stale"]);
|
|
43
43
|
const WEBSOCKET_CONNECTION_LIMIT_REACHED_CODE = "websocket_connection_limit_reached";
|
|
44
44
|
const PREVIOUS_RESPONSE_NOT_FOUND_CODE = "previous_response_not_found";
|
|
@@ -756,15 +756,6 @@ async function getWebSocketConstructor(env) {
|
|
|
756
756
|
function isWebSocketConstructor(value) {
|
|
757
757
|
return typeof value === "function";
|
|
758
758
|
}
|
|
759
|
-
class WebSocketCloseError extends Error {
|
|
760
|
-
constructor(message, options) {
|
|
761
|
-
super(message);
|
|
762
|
-
this.name = "WebSocketCloseError";
|
|
763
|
-
this.code = options?.code;
|
|
764
|
-
this.reason = options?.reason;
|
|
765
|
-
this.wasClean = options?.wasClean;
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
759
|
function getWebSocketReadyState(socket) {
|
|
769
760
|
const readyState = socket.readyState;
|
|
770
761
|
return typeof readyState === "number" ? readyState : undefined;
|
|
@@ -849,6 +840,7 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
|
|
|
849
840
|
clearTimeout(timeout);
|
|
850
841
|
timeout = undefined;
|
|
851
842
|
}
|
|
843
|
+
transportFailure.dispose();
|
|
852
844
|
socket.removeEventListener("open", onOpen);
|
|
853
845
|
socket.removeEventListener("error", onError);
|
|
854
846
|
socket.removeEventListener("close", onClose);
|
|
@@ -864,6 +856,7 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
|
|
|
864
856
|
}
|
|
865
857
|
reject(error);
|
|
866
858
|
};
|
|
859
|
+
const transportFailure = createWebSocketTransportFailure((error) => fail(error));
|
|
867
860
|
const onOpen = () => {
|
|
868
861
|
if (settled)
|
|
869
862
|
return;
|
|
@@ -872,10 +865,10 @@ async function connectWebSocket(url, headers, signal, connectTimeoutMs = DEFAULT
|
|
|
872
865
|
resolve(socket);
|
|
873
866
|
};
|
|
874
867
|
const onError = (event) => {
|
|
875
|
-
|
|
868
|
+
transportFailure.onError(event);
|
|
876
869
|
};
|
|
877
870
|
const onClose = (event) => {
|
|
878
|
-
|
|
871
|
+
transportFailure.onClose(event);
|
|
879
872
|
};
|
|
880
873
|
const onAbort = () => {
|
|
881
874
|
fail(new Error("Request was aborted"), "aborted");
|
|
@@ -978,43 +971,6 @@ async function acquireWebSocket(url, headers, sessionId, accountId, signal, conn
|
|
|
978
971
|
},
|
|
979
972
|
};
|
|
980
973
|
}
|
|
981
|
-
function extractWebSocketError(event) {
|
|
982
|
-
if (event && typeof event === "object") {
|
|
983
|
-
const message = "message" in event ? event.message : undefined;
|
|
984
|
-
if (typeof message === "string" && message.length > 0) {
|
|
985
|
-
return new Error(message);
|
|
986
|
-
}
|
|
987
|
-
const nestedError = "error" in event ? event.error : undefined;
|
|
988
|
-
if (nestedError instanceof Error && nestedError.message.length > 0) {
|
|
989
|
-
return nestedError;
|
|
990
|
-
}
|
|
991
|
-
if (nestedError && typeof nestedError === "object" && "message" in nestedError) {
|
|
992
|
-
const nestedMessage = nestedError.message;
|
|
993
|
-
if (typeof nestedMessage === "string" && nestedMessage.length > 0) {
|
|
994
|
-
return new Error(nestedMessage);
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
}
|
|
998
|
-
return new Error("WebSocket error");
|
|
999
|
-
}
|
|
1000
|
-
function extractWebSocketCloseError(event) {
|
|
1001
|
-
if (event && typeof event === "object") {
|
|
1002
|
-
const code = "code" in event ? event.code : undefined;
|
|
1003
|
-
const reason = "reason" in event ? event.reason : undefined;
|
|
1004
|
-
const wasClean = "wasClean" in event ? event.wasClean : undefined;
|
|
1005
|
-
const codeText = typeof code === "number" ? ` ${code}` : "";
|
|
1006
|
-
let reasonText = typeof reason === "string" && reason.length > 0 ? ` ${reason}` : "";
|
|
1007
|
-
if (!reasonText && code === WEBSOCKET_MESSAGE_TOO_BIG_CLOSE_CODE) {
|
|
1008
|
-
reasonText = " message too big";
|
|
1009
|
-
}
|
|
1010
|
-
return new WebSocketCloseError(`WebSocket closed${codeText}${reasonText}`.trim(), {
|
|
1011
|
-
code: typeof code === "number" ? code : undefined,
|
|
1012
|
-
reason: typeof reason === "string" && reason.length > 0 ? reason : undefined,
|
|
1013
|
-
wasClean: typeof wasClean === "boolean" ? wasClean : undefined,
|
|
1014
|
-
});
|
|
1015
|
-
}
|
|
1016
|
-
return new Error("WebSocket closed");
|
|
1017
|
-
}
|
|
1018
974
|
async function decodeWebSocketData(data) {
|
|
1019
975
|
if (typeof data === "string")
|
|
1020
976
|
return data;
|
|
@@ -1080,22 +1036,23 @@ async function* parseWebSocket(socket, signal, idleTimeoutMs) {
|
|
|
1080
1036
|
}
|
|
1081
1037
|
})();
|
|
1082
1038
|
};
|
|
1083
|
-
const
|
|
1084
|
-
|
|
1039
|
+
const transportFailure = createWebSocketTransportFailure((error) => {
|
|
1040
|
+
if (!failed)
|
|
1041
|
+
failed = error;
|
|
1085
1042
|
done = true;
|
|
1086
1043
|
wake();
|
|
1044
|
+
});
|
|
1045
|
+
const onError = (event) => {
|
|
1046
|
+
transportFailure.onError(event);
|
|
1087
1047
|
};
|
|
1088
1048
|
const onClose = (event) => {
|
|
1089
1049
|
if (sawCompletion) {
|
|
1050
|
+
transportFailure.dispose();
|
|
1090
1051
|
done = true;
|
|
1091
1052
|
wake();
|
|
1092
1053
|
return;
|
|
1093
1054
|
}
|
|
1094
|
-
|
|
1095
|
-
failed = extractWebSocketCloseError(event);
|
|
1096
|
-
}
|
|
1097
|
-
done = true;
|
|
1098
|
-
wake();
|
|
1055
|
+
transportFailure.onClose(event);
|
|
1099
1056
|
};
|
|
1100
1057
|
const onAbort = () => {
|
|
1101
1058
|
failed = new Error("Request was aborted");
|
|
@@ -1145,6 +1102,7 @@ async function* parseWebSocket(socket, signal, idleTimeoutMs) {
|
|
|
1145
1102
|
}
|
|
1146
1103
|
finally {
|
|
1147
1104
|
liveness.stop();
|
|
1105
|
+
transportFailure.dispose();
|
|
1148
1106
|
socket.removeEventListener("message", onMessage);
|
|
1149
1107
|
socket.removeEventListener("error", onError);
|
|
1150
1108
|
socket.removeEventListener("close", onClose);
|