diff --git a/crates/goose-server/src/routes/providers_and_keys.json b/crates/goose-server/src/routes/providers_and_keys.json index ea5e8d5e69ba..e4079e3d411e 100644 --- a/crates/goose-server/src/routes/providers_and_keys.json +++ b/crates/goose-server/src/routes/providers_and_keys.json @@ -52,5 +52,11 @@ "description": "Connect to Azure OpenAI Service", "models": ["gpt-4o", "gpt-4o-mini"], "required_keys": ["AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_DEPLOYMENT_NAME"] + }, + "aws_bedrock": { + "name": "AWS Bedrock", + "description": "Connect to LLMs via AWS Bedrock", + "models": ["us.anthropic.claude-3-7-sonnet-20250219-v1:0"], + "required_keys": ["AWS_PROFILE"] } } diff --git a/crates/goose/Cargo.toml b/crates/goose/Cargo.toml index 551ed18b287e..d7ab4b565fd7 100644 --- a/crates/goose/Cargo.toml +++ b/crates/goose/Cargo.toml @@ -63,9 +63,9 @@ rand = "0.8.5" utoipa = "4.1" # For Bedrock provider -aws-config = { version = "1.1.7", features = ["behavior-version-latest"] } -aws-smithy-types = "1.2.12" -aws-sdk-bedrockruntime = "1.72.0" +aws-config = { version = "1.5.16", features = ["behavior-version-latest"] } +aws-smithy-types = "1.2.13" +aws-sdk-bedrockruntime = "1.74.0" # For GCP Vertex AI provider auth jsonwebtoken = "9.3.1" diff --git a/crates/goose/src/config/base.rs b/crates/goose/src/config/base.rs index bd752f36a523..5b756cd8eb56 100644 --- a/crates/goose/src/config/base.rs +++ b/crates/goose/src/config/base.rs @@ -191,7 +191,7 @@ impl Config { } // Load current secrets from the keyring - fn load_secrets(&self) -> Result, ConfigError> { + pub fn load_secrets(&self) -> Result, ConfigError> { let entry = Entry::new(&self.keyring_service, KEYRING_USERNAME)?; match entry.get_password() { diff --git a/crates/goose/src/providers/bedrock.rs b/crates/goose/src/providers/bedrock.rs index ad40a321c1a2..1f486efd702a 100644 --- a/crates/goose/src/providers/bedrock.rs +++ b/crates/goose/src/providers/bedrock.rs @@ -4,7 +4,7 @@ use aws_sdk_bedrockruntime::operation::converse::ConverseError; use aws_sdk_bedrockruntime::{types as bedrock, Client}; use mcp_core::Tool; -use super::base::{Provider, ProviderMetadata, ProviderUsage}; +use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage}; use super::errors::ProviderError; use crate::message::Message; use crate::model::ModelConfig; @@ -33,6 +33,12 @@ pub struct BedrockProvider { impl BedrockProvider { pub fn from_env(model: ModelConfig) -> Result { + let config = crate::config::Config::global(); + for (key, value) in config.load_secrets()?.iter() { + if key.starts_with("AWS_") && value.is_string() { + std::env::set_var(key, value.as_str().unwrap()); + } + } let sdk_config = futures::executor::block_on(aws_config::load_from_env()); let client = Client::new(&sdk_config); @@ -51,13 +57,13 @@ impl Default for BedrockProvider { impl Provider for BedrockProvider { fn metadata() -> ProviderMetadata { ProviderMetadata::new( - "bedrock", + "aws_bedrock", "Amazon Bedrock", - "Run models through Amazon Bedrock. You may have to set AWS_ACCESS_KEY_ID, AWS_ACCESS_KEY, and AWS_REGION as env vars before configuring.", + "Run models through Amazon Bedrock. You may have to set 'AWS_' environment variables to configure authentication.", BEDROCK_DEFAULT_MODEL, BEDROCK_KNOWN_MODELS.iter().map(|s| s.to_string()).collect(), BEDROCK_DOC_LINK, - vec![], + vec![ConfigKey::new("AWS_PROFILE", true, false, Some("us-west-2"))], ) } diff --git a/crates/goose/src/providers/factory.rs b/crates/goose/src/providers/factory.rs index d2ba7bfb4efe..84ac4f7eb642 100644 --- a/crates/goose/src/providers/factory.rs +++ b/crates/goose/src/providers/factory.rs @@ -34,7 +34,7 @@ pub fn create(name: &str, model: ModelConfig) -> Result Ok(Box::new(OpenAiProvider::from_env(model)?)), "anthropic" => Ok(Box::new(AnthropicProvider::from_env(model)?)), "azure_openai" => Ok(Box::new(AzureProvider::from_env(model)?)), - "bedrock" => Ok(Box::new(BedrockProvider::from_env(model)?)), + "aws_bedrock" => Ok(Box::new(BedrockProvider::from_env(model)?)), "databricks" => Ok(Box::new(DatabricksProvider::from_env(model)?)), "groq" => Ok(Box::new(GroqProvider::from_env(model)?)), "ollama" => Ok(Box::new(OllamaProvider::from_env(model)?)), diff --git a/crates/goose/tests/truncate_agent.rs b/crates/goose/tests/truncate_agent.rs index 3bc10a2b319c..1fd7901cb2f6 100644 --- a/crates/goose/tests/truncate_agent.rs +++ b/crates/goose/tests/truncate_agent.rs @@ -37,7 +37,7 @@ impl ProviderType { ], ProviderType::OpenAi => &["OPENAI_API_KEY"], ProviderType::Anthropic => &["ANTHROPIC_API_KEY"], - ProviderType::Bedrock => &["AWS_PROFILE", "AWS_REGION"], + ProviderType::Bedrock => &["AWS_PROFILE"], ProviderType::Databricks => &["DATABRICKS_HOST"], ProviderType::Google => &["GOOGLE_API_KEY"], ProviderType::Groq => &["GROQ_API_KEY"], diff --git a/documentation/docs/getting-started/providers.md b/documentation/docs/getting-started/providers.md index 88875e7d8d4c..a199e3841ee3 100644 --- a/documentation/docs/getting-started/providers.md +++ b/documentation/docs/getting-started/providers.md @@ -19,7 +19,7 @@ Goose relies heavily on tool calling capabilities and currently works best with | Provider | Description | Parameters | |-----------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| [Amazon Bedrock](https://aws.amazon.com/bedrock/) | Offers a variety of foundation models, including Claude, Jurassic-2, and others. **Environment variables must be set in advance, not configured through `goose configure`** | `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION` | +| [Amazon Bedrock](https://aws.amazon.com/bedrock/) | Offers a variety of foundation models, including Claude, Jurassic-2, and others. **AWS environment variables must be set in advance, not configured through `goose configure`** | `AWS_PROFILE`, or `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_REGION`, ... | | [Anthropic](https://www.anthropic.com/) | Offers Claude, an advanced AI model for natural language tasks. | `ANTHROPIC_API_KEY` | | [Azure OpenAI](https://learn.microsoft.com/en-us/azure/ai-services/openai/) | Access Azure-hosted OpenAI models, including GPT-4 and GPT-3.5. | `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_ENDPOINT`, `AZURE_OPENAI_DEPLOYMENT_NAME` | | [Databricks](https://www.databricks.com/) | Unified data analytics and AI platform for building and deploying models. | `DATABRICKS_HOST`, `DATABRICKS_TOKEN` | diff --git a/ui/desktop/src/components/settings/models/hardcoded_stuff.tsx b/ui/desktop/src/components/settings/models/hardcoded_stuff.tsx index 6e4245817e07..94185b4e7589 100644 --- a/ui/desktop/src/components/settings/models/hardcoded_stuff.tsx +++ b/ui/desktop/src/components/settings/models/hardcoded_stuff.tsx @@ -46,6 +46,7 @@ export const default_models = { ollama: 'qwen2.5', azure_openai: 'gpt-4o', gcp_vertex_ai: 'gemini-2.0-flash-001', + aws_bedrock: 'us.anthropic.claude-3-7-sonnet-20250219-v1:0', }; export function getDefaultModel(key: string): string | undefined { @@ -64,6 +65,7 @@ export const required_keys = { OpenRouter: ['OPENROUTER_API_KEY'], 'Azure OpenAI': ['AZURE_OPENAI_API_KEY', 'AZURE_OPENAI_ENDPOINT', 'AZURE_OPENAI_DEPLOYMENT_NAME'], 'GCP Vertex AI': ['GCP_PROJECT_ID', 'GCP_LOCATION'], + 'AWS Bedrock': ['AWS_PROFILE'], }; export const default_key_value = { @@ -83,6 +85,7 @@ export const supported_providers = [ 'OpenRouter', 'Azure OpenAI', 'GCP Vertex AI', + 'AWS Bedrock', ]; export const model_docs_link = [ @@ -97,6 +100,7 @@ export const model_docs_link = [ { name: 'OpenRouter', href: 'https://openrouter.ai/models' }, { name: 'Ollama', href: 'https://ollama.com/library' }, { name: 'GCP Vertex AI', href: 'https://cloud.google.com/vertex-ai' }, + { name: 'AWS Bedrock', href: 'https://console.aws.amazon.com/bedrock/home#/model-catalog' }, ]; export const provider_aliases = [ @@ -109,4 +113,5 @@ export const provider_aliases = [ { provider: 'Google', alias: 'google' }, { provider: 'Azure OpenAI', alias: 'azure_openai' }, { provider: 'GCP Vertex AI', alias: 'gcp_vertex_ai' }, + { provider: 'AWS Bedrock', alias: 'aws_bedrock' }, ];