From 99f645a5299069f211986d32ad6c7bf2a3d847aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B7=9D?= Date: Fri, 30 Jan 2026 00:10:57 +0800 Subject: [PATCH] fix: sanitize tool call IDs for Azure OpenAI Azure OpenAI enforces a 40-character limit on tool_calls[].id fields, which causes HTTP 400 errors when tool call IDs exceed this limit. Add Azure OpenAI detection (via provider name containing "azure") and enable tool call ID sanitization for Azure providers. --- src/agents/transcript-policy.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/agents/transcript-policy.ts b/src/agents/transcript-policy.ts index 9ae14d38f..f50b0bfc9 100644 --- a/src/agents/transcript-policy.ts +++ b/src/agents/transcript-policy.ts @@ -73,6 +73,9 @@ export function resolveTranscriptPolicy(params: { const isGoogle = isGoogleModelApi(params.modelApi); const isAnthropic = isAnthropicApi(params.modelApi, provider); const isOpenAi = isOpenAiProvider(provider) || (!provider && isOpenAiApi(params.modelApi)); + // Azure OpenAI uses OpenAI-compatible APIs but has stricter limits (40 char tool call IDs). + // Detect via provider name containing "azure". + const isAzureOpenAi = isOpenAiApi(params.modelApi) && provider.includes("azure"); const isMistral = isMistralModel({ provider, modelId }); const isOpenRouterGemini = (provider === "openrouter" || provider === "opencode") && @@ -83,9 +86,9 @@ export function resolveTranscriptPolicy(params: { modelId, }); - const needsNonImageSanitize = isGoogle || isAnthropic || isMistral || isOpenRouterGemini; + const needsNonImageSanitize = isGoogle || isAnthropic || isMistral || isOpenRouterGemini || isAzureOpenAi; - const sanitizeToolCallIds = isGoogle || isMistral; + const sanitizeToolCallIds = isGoogle || isMistral || isAzureOpenAi; const toolCallIdMode: ToolCallIdMode | undefined = isMistral ? "strict9" : sanitizeToolCallIds