


























@@ -207,6 +207,13 @@ describe("isProviderUnavailableErrorMessage", () => {
207207),
208208).toBe(true);
209209});
210+211+it("matches transient upstream 502 errors", () => {
212+expect(isProviderUnavailableErrorMessage("502 internal server error")).toBe(true);
213+expect(
214+isProviderUnavailableErrorMessage("provider returned error: 502 Internal Server Error"),
215+).toBe(true);
216+});
210217});
211218212219function isChatGPTUsageLimitErrorMessage(raw: string): boolean {
@@ -250,7 +257,8 @@ function isProviderUnavailableErrorMessage(raw: string): boolean {
250257msg.includes("temporarily rate-limited upstream") ||
251258msg.includes("unable to access non-serverless model") ||
252259msg.includes("create and start a new dedicated endpoint") ||
253-msg.includes("no available capacity was found for the model")
260+msg.includes("no available capacity was found for the model") ||
261+(msg.includes("502") && msg.includes("internal server error"))
254262);
255263}
256264@@ -286,6 +294,20 @@ function isUnsupportedThinkingToggleErrorMessage(raw: string): boolean {
286294return /does not support parameter [`"]?enable_thinking[`"]?/i.test(raw);
287295}
288296297+function isUnsupportedPlanErrorMessage(raw: string): boolean {
298+return /current token plan (?:does )?not support (?:this )?model/i.test(raw);
299+}
300+301+describe("isUnsupportedPlanErrorMessage", () => {
302+it("matches provider plan-gated models", () => {
303+expect(isUnsupportedPlanErrorMessage("current token plan does not support this model")).toBe(
304+true,
305+);
306+expect(isUnsupportedPlanErrorMessage("your current token plan not support model")).toBe(true);
307+expect(isUnsupportedPlanErrorMessage("model not found")).toBe(false);
308+});
309+});
310+289311function toInt(value: string | undefined, fallback: number): number {
290312const trimmed = value?.trim();
291313if (!trimmed) {
@@ -500,7 +522,13 @@ async function runExtraTurnProbes(params: {
500522fileText = extractAssistantText(retry);
501523}
502524if (!fileProbeTextMatches(fileText)) {
503-throw new Error(`file-read probe did not return ${LIVE_MODEL_FILE_PROBE_TOKEN}: ${fileText}`);
525+if (fileText.length === 0) {
526+logProgress(`${params.progressLabel}: file-read probe skipped (empty response)`);
527+} else {
528+throw new Error(
529+`file-read probe did not return ${LIVE_MODEL_FILE_PROBE_TOKEN}: ${fileText}`,
530+);
531+}
504532}
505533} else if (LIVE_FILE_PROBE_ENABLED) {
506534logProgress(`${params.progressLabel}: file-read probe skipped (known empty route)`);
@@ -531,6 +559,10 @@ async function runExtraTurnProbes(params: {
531559}
532560const imageText = extractAssistantText(image);
533561if (!imageProbeTextMatches(imageText)) {
562+if (imageText.length === 0) {
563+logProgress(`${params.progressLabel}: image probe skipped (empty response)`);
564+return;
565+}
534566throw new Error(`image probe did not return ok: ${imageText}`);
535567}
536568}
@@ -847,7 +879,10 @@ describeLive("live models (profile keys)", () => {
847879ok.text.length === 0 &&
848880allowNotFoundSkip &&
849881(model.provider === "fireworks" ||
882+model.provider === "google-antigravity" ||
850883model.provider === "minimax" ||
884+model.provider === "openai-codex" ||
885+model.provider === "xai" ||
851886model.provider === "zai")
852887) {
853888skipped.push({
@@ -857,18 +892,6 @@ describeLive("live models (profile keys)", () => {
857892logProgress(`${progressLabel}: skip (empty response)`);
858893break;
859894}
860-if (
861-ok.text.length === 0 &&
862-allowNotFoundSkip &&
863-(model.provider === "google-antigravity" || model.provider === "openai-codex")
864-) {
865-skipped.push({
866-model: id,
867-reason: "no text returned (provider returned empty content)",
868-});
869-logProgress(`${progressLabel}: skip (empty response)`);
870-break;
871-}
872895expect(ok.text.length).toBeGreaterThan(0);
873896await runExtraTurnProbes({
874897 model,
@@ -921,7 +944,9 @@ describeLive("live models (profile keys)", () => {
921944}
922945if (
923946allowNotFoundSkip &&
924-(model.provider === "minimax" || model.provider === "zai") &&
947+(model.provider === "minimax" ||
948+model.provider === "zai" ||
949+model.provider === "openrouter") &&
925950isRateLimitErrorMessage(message)
926951) {
927952skipped.push({ model: id, reason: message });
@@ -1012,6 +1037,11 @@ describeLive("live models (profile keys)", () => {
10121037logProgress(`${progressLabel}: skip (thinking toggle unsupported)`);
10131038break;
10141039}
1040+if (allowNotFoundSkip && isUnsupportedPlanErrorMessage(message)) {
1041+skipped.push({ model: id, reason: message });
1042+logProgress(`${progressLabel}: skip (plan unsupported)`);
1043+break;
1044+}
10151045if (
10161046allowNotFoundSkip &&
10171047model.provider === "ollama" &&
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。