
























@@ -14,8 +14,14 @@ import {
1414encodePngRgba,
1515fillPixel,
1616getShellEnvAppliedKeys,
17+isAuthErrorMessage,
18+isBillingErrorMessage,
1719isLiveProfileKeyModeEnabled,
1820isLiveTestEnabled,
21+isModelNotFoundErrorMessage,
22+isOverloadedErrorMessage,
23+isServerErrorMessage,
24+isTimeoutErrorMessage,
1925isTruthyEnvValue,
2026parseCsvFilter,
2127parseProviderModelMap,
@@ -121,12 +127,30 @@ function resolveLiveLyrics(providerId: string): string | undefined {
121127].join("\n");
122128}
123129124-function isSkippableLiveMusicProviderError(providerId: string, error: unknown): boolean {
130+function resolveLiveMusicSkipReason(providerId: string, error: unknown): string | null {
125131const message = error instanceof Error ? error.message : String(error);
126-return (
132+if (
127133providerId === "google" &&
128134message.toLowerCase().includes("music generation response missing audio data")
129-);
135+) {
136+return "transient no-audio response";
137+}
138+if (isAuthErrorMessage(message)) {
139+return "auth drift";
140+}
141+if (isModelNotFoundErrorMessage(message)) {
142+return "model drift";
143+}
144+if (isBillingErrorMessage(message)) {
145+return "billing drift";
146+}
147+if (isTimeoutErrorMessage(message) || /operation was aborted/i.test(message)) {
148+return "provider timeout";
149+}
150+if (isOverloadedErrorMessage(message) || isServerErrorMessage(message)) {
151+return "provider outage";
152+}
153+return null;
130154}
131155132156describeLive("music generation provider live", () => {
@@ -204,8 +228,9 @@ describeLive("music generation provider live", () => {
204228expect(result.tracks[0]?.buffer.byteLength).toBeGreaterThan(1024);
205229attempted.push(`${testCase.providerId}:generate:${providerModel} (${authLabel})`);
206230} catch (error) {
207-if (isSkippableLiveMusicProviderError(testCase.providerId, error)) {
208-skipped.push(`${testCase.providerId}:generate transient no-audio response`);
231+const skipReason = resolveLiveMusicSkipReason(testCase.providerId, error);
232+if (skipReason) {
233+skipped.push(`${testCase.providerId}:generate ${skipReason}`);
209234continue;
210235}
211236failures.push(
@@ -242,8 +267,9 @@ describeLive("music generation provider live", () => {
242267expect(result.tracks[0]?.buffer.byteLength).toBeGreaterThan(1024);
243268attempted.push(`${testCase.providerId}:edit:${providerModel} (${authLabel})`);
244269} catch (error) {
245-if (isSkippableLiveMusicProviderError(testCase.providerId, error)) {
246-skipped.push(`${testCase.providerId}:edit transient no-audio response`);
270+const skipReason = resolveLiveMusicSkipReason(testCase.providerId, error);
271+if (skipReason) {
272+skipped.push(`${testCase.providerId}:edit ${skipReason}`);
247273continue;
248274}
249275failures.push(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。