From 62cf334e2f793d33dc2e2a60bf439573175e5b03 Mon Sep 17 00:00:00 2001 From: Enrico Ros Date: Thu, 26 Feb 2026 18:51:10 -0800 Subject: [PATCH] AIX: Z.ai: handle their network errors --- .../chatGenerate/parsers/openai.parser.ts | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/modules/aix/server/dispatch/chatGenerate/parsers/openai.parser.ts b/src/modules/aix/server/dispatch/chatGenerate/parsers/openai.parser.ts index 32cdd4f0b..12a543c22 100644 --- a/src/modules/aix/server/dispatch/chatGenerate/parsers/openai.parser.ts +++ b/src/modules/aix/server/dispatch/chatGenerate/parsers/openai.parser.ts @@ -386,9 +386,14 @@ export function createOpenAIChatCompletionsChunkParser(): ChatGenerateParseFunct // Token Stop Reason - usually missing in all but the last chunk, but we don't rely on it if (finish_reason) { - const tokenStopReason = _fromOpenAIFinishReason(finish_reason); - if (tokenStopReason !== null) - pt.setTokenStopReason(tokenStopReason); + // [Z.ai, 2026-02-26] 'network_error' is an upstream error, not a normal stop reason + if (finish_reason === 'network_error') + pt.setDialectTerminatingIssue('Upstream network error.', IssueSymbols.Generic, 'srv-warn'); + else { + const tokenStopReason = _fromOpenAIFinishReason(finish_reason); + if (tokenStopReason !== null) + pt.setTokenStopReason(tokenStopReason); + } } // Note: not needed anymore - Workaround for implementations that don't send the [DONE] event @@ -522,9 +527,14 @@ export function createOpenAIChatCompletionsParserNS(): ChatGenerateParseFunction } // .choices.tool_calls[] // Token Stop Reason - expected to be set - const tokenStopReason = _fromOpenAIFinishReason(finish_reason); - if (tokenStopReason !== null) - pt.setTokenStopReason(tokenStopReason); + // [Z.ai, 2026-02-26] 'network_error' is an upstream error, not a normal stop reason + if (finish_reason === 'network_error') + pt.setDialectTerminatingIssue('Upstream network error.', IssueSymbols.Generic, 'srv-log'); + else { + const tokenStopReason = _fromOpenAIFinishReason(finish_reason); + if (tokenStopReason !== null) + pt.setTokenStopReason(tokenStopReason); + } // [OpenAI, 2025-03-11] message: Annotations[].url_citation if (message.annotations !== undefined) { @@ -631,7 +641,7 @@ function _fromOpenAIFinishReason(finish_reason: string | null | undefined) { } // Developers: show more finish reasons (not under flag for now, so we can add to the supported set) - console.log('AIX: OpenAI-dispatch unexpected finish_reason:', finish_reason); + console.warn('AIX: OpenAI-dispatch unexpected finish_reason:', finish_reason); return null; }