diff --git a/open-sse/executors/claude-web/stream.ts b/open-sse/executors/claude-web/stream.ts index 82281bb02b..264f8218e8 100644 --- a/open-sse/executors/claude-web/stream.ts +++ b/open-sse/executors/claude-web/stream.ts @@ -148,7 +148,8 @@ async function* decodeSseData( } function safeMetadataValue(value: unknown): string | number | boolean | null | undefined { - if (value === null || typeof value === "boolean") return value; + if (value === null) return null; + if (typeof value === "boolean") return value; if (typeof value === "number" && Number.isFinite(value)) return value; if (typeof value === "string" && value.length <= 128 && /^[A-Za-z0-9._:+/@-]+$/.test(value)) { return value; @@ -715,7 +716,7 @@ async function pullStreamingChunk( while (!state.terminal) { const next = await state.iterator.next(); if (state.control.cancelled) return; - if (next.done) { + if (next.done === true) { throw new ClaudeWebProtocolError("Claude Web stream ended without a terminal event"); } await queueSemanticEvent(state, next.value, options); diff --git a/open-sse/executors/inner-ai.ts b/open-sse/executors/inner-ai.ts index 27a535daef..261a75468e 100644 --- a/open-sse/executors/inner-ai.ts +++ b/open-sse/executors/inner-ai.ts @@ -23,6 +23,7 @@ interface InnerAiModel { unavailable_api?: boolean; pro_only?: boolean; ultra_only?: boolean; + ai_model_categories?: Array>; } interface CredentialCache { @@ -283,9 +284,7 @@ async function resolveModels( if (m.enable === false || m.unavailable_api) return false; if (m.ultra_only && !isUltra) return false; if (m.pro_only && !isPro) return false; - const cats = Array.isArray((m as Record).ai_model_categories) - ? ((m as Record).ai_model_categories as Array>) - : null; + const cats = Array.isArray(m.ai_model_categories) ? m.ai_model_categories : null; if (cats && cats.length > 0) { return cats.some((c) => String(c.unique_identifier ?? c.name ?? "").toLowerCase() === "text"); }