diff --git a/packages/core/src/model-resolver.ts b/packages/core/src/model-resolver.ts index 1e13ea150ca..a924c899835 100644 --- a/packages/core/src/model-resolver.ts +++ b/packages/core/src/model-resolver.ts @@ -278,7 +278,7 @@ function prepareProviderSettings( ): Effect.Effect>, UnresolvedProviderVariablesError> { const baseURL = settings.baseURL if (typeof baseURL !== "string") return Effect.succeed(settings) - return prepareProviderURL(model, baseURL).pipe( + return prepareProviderURL(model, baseURL, settings).pipe( Effect.map((prepared) => (prepared === baseURL ? settings : { ...settings, baseURL: prepared })), ) } @@ -286,9 +286,15 @@ function prepareProviderSettings( function prepareProviderURL( model: RuntimeInfo, baseURL: string, + settings: Readonly>, ): Effect.Effect { if (!baseURL.includes("${")) return Effect.succeed(baseURL) - const prepared = baseURL.replace(/\$\{([^}]+)\}/g, (placeholder, name: string) => process.env[name] ?? placeholder) + // Catalog Bedrock URLs are model settings while `region` is a provider setting, so they only meet here. + const prepared = baseURL.replace( + /\$\{([^}]+)\}/g, + (placeholder, name: string) => + (name === "AWS_REGION" && typeof settings.region === "string" ? settings.region : process.env[name]) ?? placeholder, + ) const failure = unresolvedProviderVariables(model, prepared) return failure ? Effect.fail(failure) : Effect.succeed(prepared) } diff --git a/packages/core/test/model-resolver.test.ts b/packages/core/test/model-resolver.test.ts index 5ea1062524b..49334f6974d 100644 --- a/packages/core/test/model-resolver.test.ts +++ b/packages/core/test/model-resolver.test.ts @@ -242,6 +242,24 @@ describe("ModelResolver", () => { ), ) + it.effect("fills Mantle catalog URLs from the provider region", () => + withEnv({ AWS_REGION: undefined, AWS_DEFAULT_REGION: undefined }, () => + Effect.gen(function* () { + const catalog = model(Provider.aisdk("@ai-sdk/amazon-bedrock/mantle"), { + providerID: Provider.ID.amazonBedrock, + modelID: "openai.gpt-5.5", + settings: { baseURL: "https://bedrock-mantle.${AWS_REGION}.api.aws/openai/v1" }, + }) + const resolved = yield* ModelResolver.fromCatalogModel({ + ...catalog, + settings: Provider.mergeOverlay({ region: "us-west-2" }, catalog.settings), + }) + + expect(resolved.route.endpoint.baseURL).toBe("https://bedrock-mantle.us-west-2.api.aws/openai/v1") + }), + ), + ) + it.effect("prefers the configured Mantle region over the environment", () => withEnv({ AWS_REGION: "us-east-1" }, () => Effect.gen(function* () {