@@ -128,6 +128,7 @@ interface ClaudeSessionContext {
128128 readonly query : ClaudeQueryRuntime ;
129129 readonly startedAt : string ;
130130 readonly basePermissionMode : PermissionMode | undefined ;
131+ readonly bedrockOptions : BedrockOptions | undefined ;
131132 resumeSessionId : string | undefined ;
132133 readonly pendingApprovals : Map < ApprovalRequestId , PendingApproval > ;
133134 readonly pendingUserInputs : Map < ApprovalRequestId , PendingUserInput > ;
@@ -199,6 +200,71 @@ function toPermissionMode(value: unknown): PermissionMode | undefined {
199200 }
200201}
201202
203+ // ── Bedrock helpers ──────────────────────────────────────────────────
204+
205+ interface BedrockOptions {
206+ readonly useBedrock ?: boolean | undefined ;
207+ readonly awsRegion ?: string | undefined ;
208+ readonly awsProfile ?: string | undefined ;
209+ readonly bedrockModelOverrideHaiku ?: string | undefined ;
210+ readonly bedrockModelOverrideSonnet ?: string | undefined ;
211+ readonly bedrockModelOverrideOpus ?: string | undefined ;
212+ }
213+
214+ function isBedrockActive ( opts : BedrockOptions | undefined ) : boolean {
215+ if ( ! opts ) return false ;
216+ return Boolean (
217+ opts . useBedrock ||
218+ opts . awsRegion ||
219+ opts . awsProfile ||
220+ opts . bedrockModelOverrideHaiku ||
221+ opts . bedrockModelOverrideSonnet ||
222+ opts . bedrockModelOverrideOpus ,
223+ ) ;
224+ }
225+
226+ function resolveBedrockModel (
227+ modelSlug : string | undefined ,
228+ opts : BedrockOptions ,
229+ ) : string | undefined {
230+ if ( ! modelSlug ) return opts . bedrockModelOverrideSonnet ?? opts . bedrockModelOverrideOpus ;
231+ const slug = modelSlug . toLowerCase ( ) ;
232+ if ( slug . includes ( "haiku" ) && opts . bedrockModelOverrideHaiku ) return opts . bedrockModelOverrideHaiku ;
233+ if ( slug . includes ( "opus" ) && opts . bedrockModelOverrideOpus ) return opts . bedrockModelOverrideOpus ;
234+ if ( opts . bedrockModelOverrideSonnet ) return opts . bedrockModelOverrideSonnet ;
235+ if ( opts . bedrockModelOverrideOpus ) return opts . bedrockModelOverrideOpus ;
236+ return undefined ;
237+ }
238+
239+ function buildBedrockEnv (
240+ baseEnv : NodeJS . ProcessEnv ,
241+ opts : BedrockOptions ,
242+ resolvedModelArn : string | undefined ,
243+ ) : NodeJS . ProcessEnv {
244+ const env : NodeJS . ProcessEnv = { ...baseEnv } ;
245+ env . CLAUDE_CODE_USE_BEDROCK = "1" ;
246+ if ( opts . awsRegion ) {
247+ env . AWS_REGION = opts . awsRegion ;
248+ env . ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION = opts . awsRegion ;
249+ }
250+ if ( opts . awsProfile ) {
251+ env . AWS_PROFILE = opts . awsProfile ;
252+ }
253+ if ( opts . bedrockModelOverrideHaiku ) {
254+ env . ANTHROPIC_DEFAULT_HAIKU_MODEL = opts . bedrockModelOverrideHaiku ;
255+ }
256+ if ( opts . bedrockModelOverrideSonnet ) {
257+ env . ANTHROPIC_DEFAULT_SONNET_MODEL = opts . bedrockModelOverrideSonnet ;
258+ }
259+ if ( opts . bedrockModelOverrideOpus ) {
260+ env . ANTHROPIC_DEFAULT_OPUS_MODEL = opts . bedrockModelOverrideOpus ;
261+ }
262+ if ( resolvedModelArn ) {
263+ env . ANTHROPIC_MODEL = resolvedModelArn ;
264+ }
265+ return env ;
266+ }
267+
202268function readClaudeResumeState ( resumeCursor : unknown ) : ClaudeResumeState | undefined {
203269 if ( ! resumeCursor || typeof resumeCursor !== "object" ) {
204270 return undefined ;
@@ -2209,6 +2275,14 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
22092275 ) ;
22102276
22112277 const providerOptions = input . providerOptions ?. claudeAgent ;
2278+ const bedrock = isBedrockActive ( providerOptions ) ;
2279+ const resolvedModelArn = bedrock
2280+ ? resolveBedrockModel ( input . model , providerOptions ! )
2281+ : undefined ;
2282+ const sessionModel = bedrock ? resolvedModelArn : input . model ;
2283+ const sessionEnv = bedrock
2284+ ? buildBedrockEnv ( process . env , providerOptions ! , resolvedModelArn )
2285+ : process . env ;
22122286 const requestedEffort = resolveReasoningEffortForProvider (
22132287 "claudeAgent" ,
22142288 input . modelOptions ?. claudeAgent ?. effort ?? null ,
@@ -2236,7 +2310,7 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
22362310
22372311 const queryOptions : ClaudeQueryOptions = {
22382312 ...( input . cwd ? { cwd : input . cwd } : { } ) ,
2239- ...( input . model ? { model : input . model } : { } ) ,
2313+ ...( sessionModel ? { model : sessionModel } : { } ) ,
22402314 ...( providerOptions ?. binaryPath
22412315 ? { pathToClaudeCodeExecutable : providerOptions . binaryPath }
22422316 : { } ) ,
@@ -2253,7 +2327,7 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
22532327 ...( resumeState ?. resumeSessionAt ? { resumeSessionAt : resumeState . resumeSessionAt } : { } ) ,
22542328 includePartialMessages : true ,
22552329 canUseTool,
2256- env : process . env ,
2330+ env : sessionEnv ,
22572331 ...( input . cwd ? { additionalDirectories : [ input . cwd ] } : { } ) ,
22582332 } ;
22592333
@@ -2298,6 +2372,7 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
22982372 query : queryRuntime ,
22992373 startedAt,
23002374 basePermissionMode : permissionMode ,
2375+ bedrockOptions : bedrock ? providerOptions : undefined ,
23012376 resumeSessionId : resumeState ?. resume ,
23022377 pendingApprovals,
23032378 pendingUserInputs,
@@ -2375,10 +2450,15 @@ function makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {
23752450 }
23762451
23772452 if ( input . model ) {
2378- yield * Effect . tryPromise ( {
2379- try : ( ) => context . query . setModel ( input . model ) ,
2380- catch : ( cause ) => toRequestError ( input . threadId , "turn/setModel" , cause ) ,
2381- } ) ;
2453+ const turnModel = context . bedrockOptions
2454+ ? resolveBedrockModel ( input . model , context . bedrockOptions )
2455+ : input . model ;
2456+ if ( turnModel ) {
2457+ yield * Effect . tryPromise ( {
2458+ try : ( ) => context . query . setModel ( turnModel ) ,
2459+ catch : ( cause ) => toRequestError ( input . threadId , "turn/setModel" , cause ) ,
2460+ } ) ;
2461+ }
23822462 }
23832463
23842464 // Apply interaction mode by switching the SDK's permission mode.
0 commit comments