Skip to content

Commit f6a2e2e

Browse files
authored
Improve AWS credential loading and configuration handling in BedrockProvider (#5699)
Signed-off-by: fbalicchia <[email protected]>
1 parent 9c52611 commit f6a2e2e

File tree

1 file changed

+37
-11
lines changed

1 file changed

+37
-11
lines changed

crates/goose/src/providers/bedrock.rs

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ use super::formats::bedrock::{
2222
pub const BEDROCK_DOC_LINK: &str =
2323
"https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html";
2424

25-
pub const BEDROCK_DEFAULT_MODEL: &str = "us.anthropic.claude-sonnet-4-20250514-v1:0";
25+
pub const BEDROCK_DEFAULT_MODEL: &str = "us.anthropic.claude-sonnet-4-5-20250929-v1:0";
2626
pub const BEDROCK_KNOWN_MODELS: &[&str] = &[
27+
"us.anthropic.claude-sonnet-4-5-20250929-v1:0",
2728
"us.anthropic.claude-sonnet-4-20250514-v1:0",
2829
"us.anthropic.claude-3-7-sonnet-20250219-v1:0",
2930
"us.anthropic.claude-opus-4-20250514-v1:0",
@@ -37,6 +38,8 @@ pub const BEDROCK_DEFAULT_MAX_RETRY_INTERVAL_MS: u64 = 120_000;
3738

3839
#[derive(Debug, serde::Serialize)]
3940
pub struct BedrockProvider {
41+
#[serde(skip)]
42+
client: Client,
4043
model: ModelConfig,
4144
#[serde(skip)]
4245
retry_config: RetryConfig,
@@ -49,7 +52,7 @@ impl BedrockProvider {
4952
let config = crate::config::Config::global();
5053

5154
// Attempt to load config and secrets to get AWS_ prefixed keys
52-
// to re-export them into the environment for aws_config::load_from_env()
55+
// to re-export them into the environment for aws_config to use as fallback
5356
let set_aws_env_vars = |res: Result<HashMap<String, Value>, _>| {
5457
if let Ok(map) = res {
5558
map.into_iter()
@@ -62,16 +65,38 @@ impl BedrockProvider {
6265
set_aws_env_vars(config.all_values());
6366
set_aws_env_vars(config.all_secrets());
6467

65-
let sdk_config = aws_config::load_from_env().await;
68+
// Use load_defaults() which supports AWS SSO, profiles, and environment variables
69+
let mut loader = aws_config::defaults(aws_config::BehaviorVersion::latest());
70+
71+
if let Ok(profile_name) = config.get_param::<String>("AWS_PROFILE") {
72+
if !profile_name.is_empty() {
73+
loader = loader.profile_name(&profile_name);
74+
}
75+
}
76+
77+
// Check for AWS_REGION configuration
78+
if let Ok(region) = config.get_param::<String>("AWS_REGION") {
79+
if !region.is_empty() {
80+
loader = loader.region(aws_config::Region::new(region));
81+
}
82+
}
83+
84+
let sdk_config = loader.load().await;
85+
86+
// Validate credentials or return error back up
6687
sdk_config
6788
.credentials_provider()
68-
.unwrap()
89+
.ok_or_else(|| anyhow::anyhow!("No AWS credentials provider configured"))?
6990
.provide_credentials()
70-
.await?;
91+
.await
92+
.map_err(|e| anyhow::anyhow!("Failed to load AWS credentials: {}. Make sure to run 'aws sso login --profile <your-profile>' if using SSO", e))?;
93+
94+
let client = Client::new(&sdk_config);
7195

7296
let retry_config = Self::load_retry_config(config);
7397

7498
Ok(Self {
99+
client,
75100
model,
76101
retry_config,
77102
name: Self::metadata().name,
@@ -111,10 +136,8 @@ impl BedrockProvider {
111136
) -> Result<(bedrock::Message, Option<bedrock::TokenUsage>), ProviderError> {
112137
let model_name = &self.model.model_name;
113138

114-
let sdk_config = aws_config::load_from_env().await;
115-
let client = Client::new(&sdk_config);
116-
117-
let mut request = client
139+
let mut request = self
140+
.client
118141
.converse()
119142
.system(bedrock::SystemContentBlock::Text(system.to_string()))
120143
.model_id(model_name.to_string())
@@ -175,11 +198,14 @@ impl Provider for BedrockProvider {
175198
ProviderMetadata::new(
176199
"aws_bedrock",
177200
"Amazon Bedrock",
178-
"Run models through Amazon Bedrock. You may have to set 'AWS_' environment variables to configure authentication.",
201+
"Run models through Amazon Bedrock. Supports AWS SSO profiles - run 'aws sso login --profile <profile-name>' before using. Configure with AWS_PROFILE and AWS_REGION, or use environment variables/credentials.",
179202
BEDROCK_DEFAULT_MODEL,
180203
BEDROCK_KNOWN_MODELS.to_vec(),
181204
BEDROCK_DOC_LINK,
182-
vec![ConfigKey::new("AWS_PROFILE", true, false, Some("default"))],
205+
vec![
206+
ConfigKey::new("AWS_PROFILE", true, false, Some("default")),
207+
ConfigKey::new("AWS_REGION", true, false, None),
208+
],
183209
)
184210
}
185211

0 commit comments

Comments
 (0)