From 7a11196ccb1777ae4181a32456419dd88d38efba Mon Sep 17 00:00:00 2001 From: Rudi Cilibrasi Date: Fri, 20 Mar 2026 19:21:37 -0700 Subject: [PATCH] Fix header precedence: 3-way merge (dynamic < discovered < configured) --- src/agents/pi-embedded-runner/model.ts | 27 +++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/agents/pi-embedded-runner/model.ts b/src/agents/pi-embedded-runner/model.ts index cc08d5031f2..eac91d88a8a 100644 --- a/src/agents/pi-embedded-runner/model.ts +++ b/src/agents/pi-embedded-runner/model.ts @@ -297,6 +297,25 @@ function preserveDiscoveredTransportMetadata(params: { const dynamicHeaders = sanitizeModelHeaders(dynamicModel.headers, { stripSecretRefMarkers: true, }); + // Headers use a 3-way merge: dynamic template < discovered < configured. + // dynamicModel.headers already includes configured overrides from + // applyConfiguredProviderOverrides, so we extract configured headers separately + // and apply them last to ensure they win over stale discovered headers. + const providerHeaders = sanitizeModelHeaders(providerConfig?.headers, { + stripSecretRefMarkers: true, + }); + const configuredModelHeaders = sanitizeModelHeaders(configuredModel?.headers, { + stripSecretRefMarkers: true, + }); + const mergedHeaders = + dynamicHeaders || discoveredHeaders || providerHeaders || configuredModelHeaders + ? { + ...dynamicHeaders, + ...discoveredHeaders, + ...providerHeaders, + ...configuredModelHeaders, + } + : undefined; return { ...dynamicModel, api: configuredModel?.api ?? providerConfig?.api ?? discoveredModel.api ?? dynamicModel.api, @@ -306,13 +325,7 @@ function preserveDiscoveredTransportMetadata(params: { maxTokens: configuredModel?.maxTokens ?? discoveredModel.maxTokens ?? dynamicModel.maxTokens, reasoning: configuredModel?.reasoning ?? discoveredModel.reasoning ?? dynamicModel.reasoning, cost: discoveredModel.cost ?? dynamicModel.cost, - headers: - discoveredHeaders || dynamicHeaders - ? { - ...dynamicHeaders, - ...discoveredHeaders, - } - : undefined, + headers: mergedHeaders, }; }