From 8394b7f4e91f93afe6bdb7f404c2a3711d062506 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Mon, 13 Jul 2026 18:09:41 +0800 Subject: [PATCH 1/3] fix(agent-core-v2): skip deterministic provider validation retries --- .../agent-core-v2/src/app/llmProtocol/errors.ts | 16 +++++++++++++++- .../test/app/llmProtocol/errors.test.ts | 9 +++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/packages/agent-core-v2/src/app/llmProtocol/errors.ts b/packages/agent-core-v2/src/app/llmProtocol/errors.ts index 9657d66267..a5d8c812c6 100644 --- a/packages/agent-core-v2/src/app/llmProtocol/errors.ts +++ b/packages/agent-core-v2/src/app/llmProtocol/errors.ts @@ -136,6 +136,18 @@ export class APIEmptyResponseError extends ChatProviderError { } } +const DETERMINISTIC_PROVIDER_VALIDATION_MESSAGE_PATTERNS = [ + /unsupported media type for base64 image/, + /invalid data url for image/, +] as const; + +function isDeterministicProviderValidationError(error: ChatProviderError): boolean { + const lowerMessage = error.message.toLowerCase(); + return DETERMINISTIC_PROVIDER_VALIDATION_MESSAGE_PATTERNS.some((pattern) => + pattern.test(lowerMessage), + ); +} + export function isRetryableGenerateError(error: unknown): boolean { if (error instanceof APIConnectionError || error instanceof APITimeoutError) { return true; @@ -149,7 +161,9 @@ export function isRetryableGenerateError(error: unknown): boolean { if (error instanceof APIStatusError) { return [408, 409, 429, 500, 502, 503, 504, 529].includes(error.statusCode); } - return error instanceof ChatProviderError; + return ( + error instanceof ChatProviderError && !isDeterministicProviderValidationError(error) + ); } const NETWORK_RE = /network|connection|connect|disconnect|terminated/i; diff --git a/packages/agent-core-v2/test/app/llmProtocol/errors.test.ts b/packages/agent-core-v2/test/app/llmProtocol/errors.test.ts index 634880700d..5ffab3d6e8 100644 --- a/packages/agent-core-v2/test/app/llmProtocol/errors.test.ts +++ b/packages/agent-core-v2/test/app/llmProtocol/errors.test.ts @@ -193,6 +193,15 @@ describe('isRetryableGenerateError', () => { it('retries an unclassified provider error as a transient fallback', () => { expect(isRetryableGenerateError(new ChatProviderError('upstream failure'))).toBe(true); }); + + it.each([ + ['Invalid data URL for image: data:image/png;base64'], + [ + 'Unsupported media type for base64 image: image/avif, url: data:image/avif;base64,AAAA', + ], + ])('does not retry deterministic provider validation error: %s', (message) => { + expect(isRetryableGenerateError(new ChatProviderError(message))).toBe(false); + }); }); describe('error hierarchy instanceof checks', () => { From a7eab3ee5771626f75266a58141e159d31d4646b Mon Sep 17 00:00:00 2001 From: _Kerman Date: Mon, 13 Jul 2026 18:10:25 +0800 Subject: [PATCH 2/3] chore: add provider validation retry changeset --- .changeset/skip-deterministic-provider-retries.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/skip-deterministic-provider-retries.md diff --git a/.changeset/skip-deterministic-provider-retries.md b/.changeset/skip-deterministic-provider-retries.md new file mode 100644 index 0000000000..d82d60f6a4 --- /dev/null +++ b/.changeset/skip-deterministic-provider-retries.md @@ -0,0 +1,5 @@ +--- +"@moonshot-ai/kimi-code": patch +--- + +Avoid retry delays for malformed or unsupported base64 image data URLs. From 3eaa673a08586043ee77ad0bc578a2d87147e724 Mon Sep 17 00:00:00 2001 From: _Kerman Date: Mon, 13 Jul 2026 18:30:42 +0800 Subject: [PATCH 3/3] Delete .changeset/skip-deterministic-provider-retries.md Signed-off-by: _Kerman --- .changeset/skip-deterministic-provider-retries.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 .changeset/skip-deterministic-provider-retries.md diff --git a/.changeset/skip-deterministic-provider-retries.md b/.changeset/skip-deterministic-provider-retries.md deleted file mode 100644 index d82d60f6a4..0000000000 --- a/.changeset/skip-deterministic-provider-retries.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@moonshot-ai/kimi-code": patch ---- - -Avoid retry delays for malformed or unsupported base64 image data URLs.