From 51fee77f1e1f40a86aa67e050bf9d30964dbc3ad Mon Sep 17 00:00:00 2001 From: Josh Snyder Date: Thu, 7 May 2026 21:18:57 +0000 Subject: [PATCH 1/2] feat: enable Bedrock fallback via LLM gateway Inject the `x-posthog-use-bedrock-fallback: true` header on requests forwarded by the local auth proxy (which all Claude Agent SDK calls flow through) and on direct LlmGatewayService calls. The gateway falls back to Bedrock whenever Anthropic returns a 5xx. Generated-By: PostHog Code Task-Id: 95c00168-9e3e-4e16-b3d3-57118794df6b --- apps/code/src/main/services/auth-proxy/service.ts | 1 + apps/code/src/main/services/llm-gateway/service.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/code/src/main/services/auth-proxy/service.ts b/apps/code/src/main/services/auth-proxy/service.ts index 3896996cb..e7a7545c2 100644 --- a/apps/code/src/main/services/auth-proxy/service.ts +++ b/apps/code/src/main/services/auth-proxy/service.ts @@ -137,6 +137,7 @@ export class AuthProxyService { headers[key] = value; } } + headers["x-posthog-use-bedrock-fallback"] = "true"; const fetchOptions: RequestInit = { method: req.method ?? "GET", headers, diff --git a/apps/code/src/main/services/llm-gateway/service.ts b/apps/code/src/main/services/llm-gateway/service.ts index 94f22e19a..de479c18d 100644 --- a/apps/code/src/main/services/llm-gateway/service.ts +++ b/apps/code/src/main/services/llm-gateway/service.ts @@ -79,6 +79,7 @@ export class LlmGatewayService { method: "POST", headers: { "Content-Type": "application/json", + "x-posthog-use-bedrock-fallback": "true", }, body: JSON.stringify(requestBody), }, From a2051d8bb34f6cffb1b97a4fb1c17ff29251ef3c Mon Sep 17 00:00:00 2001 From: Josh Snyder Date: Thu, 7 May 2026 21:27:49 +0000 Subject: [PATCH 2/2] refactor: move Bedrock fallback header to agent package Set `x-posthog-use-bedrock-fallback: true` via ANTHROPIC_CUSTOM_HEADERS in the Claude SDK subprocess env, so it applies to cloud runs (which reuse @posthog/agent) instead of only the desktop app's auth proxy. Generated-By: PostHog Code Task-Id: 95c00168-9e3e-4e16-b3d3-57118794df6b --- apps/code/src/main/services/auth-proxy/service.ts | 1 - apps/code/src/main/services/llm-gateway/service.ts | 1 - packages/agent/src/adapters/claude/session/options.ts | 8 ++++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/code/src/main/services/auth-proxy/service.ts b/apps/code/src/main/services/auth-proxy/service.ts index e7a7545c2..3896996cb 100644 --- a/apps/code/src/main/services/auth-proxy/service.ts +++ b/apps/code/src/main/services/auth-proxy/service.ts @@ -137,7 +137,6 @@ export class AuthProxyService { headers[key] = value; } } - headers["x-posthog-use-bedrock-fallback"] = "true"; const fetchOptions: RequestInit = { method: req.method ?? "GET", headers, diff --git a/apps/code/src/main/services/llm-gateway/service.ts b/apps/code/src/main/services/llm-gateway/service.ts index de479c18d..94f22e19a 100644 --- a/apps/code/src/main/services/llm-gateway/service.ts +++ b/apps/code/src/main/services/llm-gateway/service.ts @@ -79,7 +79,6 @@ export class LlmGatewayService { method: "POST", headers: { "Content-Type": "application/json", - "x-posthog-use-bedrock-fallback": "true", }, body: JSON.stringify(requestBody), }, diff --git a/packages/agent/src/adapters/claude/session/options.ts b/packages/agent/src/adapters/claude/session/options.ts index 0872e428a..1ad1bf255 100644 --- a/packages/agent/src/adapters/claude/session/options.ts +++ b/packages/agent/src/adapters/claude/session/options.ts @@ -102,6 +102,12 @@ function buildMcpServers( } function buildEnvironment(): Record { + const bedrockFallbackHeader = "x-posthog-use-bedrock-fallback: true"; + const existingCustomHeaders = process.env.ANTHROPIC_CUSTOM_HEADERS; + const customHeaders = existingCustomHeaders + ? `${existingCustomHeaders}\n${bedrockFallbackHeader}` + : bedrockFallbackHeader; + return { ...process.env, ELECTRON_RUN_AS_NODE: "1", @@ -110,6 +116,8 @@ function buildEnvironment(): Record { ENABLE_TOOL_SEARCH: "auto:0", // Enable idle state as end-of-turn signal (required for SDK 0.2.114+) CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS: "1", + // Route to AWS Bedrock as a fallback when Anthropic returns 5xx + ANTHROPIC_CUSTOM_HEADERS: customHeaders, }; }