feat: add basic support for aws bedrock to desktop app (#1271)
This commit is contained in:
@@ -52,5 +52,11 @@
|
|||||||
"description": "Connect to Azure OpenAI Service",
|
"description": "Connect to Azure OpenAI Service",
|
||||||
"models": ["gpt-4o", "gpt-4o-mini"],
|
"models": ["gpt-4o", "gpt-4o-mini"],
|
||||||
"required_keys": ["AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_DEPLOYMENT_NAME"]
|
"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"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,9 +63,9 @@ rand = "0.8.5"
|
|||||||
utoipa = "4.1"
|
utoipa = "4.1"
|
||||||
|
|
||||||
# For Bedrock provider
|
# For Bedrock provider
|
||||||
aws-config = { version = "1.1.7", features = ["behavior-version-latest"] }
|
aws-config = { version = "1.5.16", features = ["behavior-version-latest"] }
|
||||||
aws-smithy-types = "1.2.12"
|
aws-smithy-types = "1.2.13"
|
||||||
aws-sdk-bedrockruntime = "1.72.0"
|
aws-sdk-bedrockruntime = "1.74.0"
|
||||||
|
|
||||||
# For GCP Vertex AI provider auth
|
# For GCP Vertex AI provider auth
|
||||||
jsonwebtoken = "9.3.1"
|
jsonwebtoken = "9.3.1"
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ impl Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Load current secrets from the keyring
|
// Load current secrets from the keyring
|
||||||
fn load_secrets(&self) -> Result<HashMap<String, Value>, ConfigError> {
|
pub fn load_secrets(&self) -> Result<HashMap<String, Value>, ConfigError> {
|
||||||
let entry = Entry::new(&self.keyring_service, KEYRING_USERNAME)?;
|
let entry = Entry::new(&self.keyring_service, KEYRING_USERNAME)?;
|
||||||
|
|
||||||
match entry.get_password() {
|
match entry.get_password() {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use aws_sdk_bedrockruntime::operation::converse::ConverseError;
|
|||||||
use aws_sdk_bedrockruntime::{types as bedrock, Client};
|
use aws_sdk_bedrockruntime::{types as bedrock, Client};
|
||||||
use mcp_core::Tool;
|
use mcp_core::Tool;
|
||||||
|
|
||||||
use super::base::{Provider, ProviderMetadata, ProviderUsage};
|
use super::base::{ConfigKey, Provider, ProviderMetadata, ProviderUsage};
|
||||||
use super::errors::ProviderError;
|
use super::errors::ProviderError;
|
||||||
use crate::message::Message;
|
use crate::message::Message;
|
||||||
use crate::model::ModelConfig;
|
use crate::model::ModelConfig;
|
||||||
@@ -33,6 +33,12 @@ pub struct BedrockProvider {
|
|||||||
|
|
||||||
impl BedrockProvider {
|
impl BedrockProvider {
|
||||||
pub fn from_env(model: ModelConfig) -> Result<Self> {
|
pub fn from_env(model: ModelConfig) -> Result<Self> {
|
||||||
|
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 sdk_config = futures::executor::block_on(aws_config::load_from_env());
|
||||||
let client = Client::new(&sdk_config);
|
let client = Client::new(&sdk_config);
|
||||||
|
|
||||||
@@ -51,13 +57,13 @@ impl Default for BedrockProvider {
|
|||||||
impl Provider for BedrockProvider {
|
impl Provider for BedrockProvider {
|
||||||
fn metadata() -> ProviderMetadata {
|
fn metadata() -> ProviderMetadata {
|
||||||
ProviderMetadata::new(
|
ProviderMetadata::new(
|
||||||
"bedrock",
|
"aws_bedrock",
|
||||||
"Amazon 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_DEFAULT_MODEL,
|
||||||
BEDROCK_KNOWN_MODELS.iter().map(|s| s.to_string()).collect(),
|
BEDROCK_KNOWN_MODELS.iter().map(|s| s.to_string()).collect(),
|
||||||
BEDROCK_DOC_LINK,
|
BEDROCK_DOC_LINK,
|
||||||
vec![],
|
vec![ConfigKey::new("AWS_PROFILE", true, false, Some("us-west-2"))],
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ pub fn create(name: &str, model: ModelConfig) -> Result<Box<dyn Provider + Send
|
|||||||
"openai" => Ok(Box::new(OpenAiProvider::from_env(model)?)),
|
"openai" => Ok(Box::new(OpenAiProvider::from_env(model)?)),
|
||||||
"anthropic" => Ok(Box::new(AnthropicProvider::from_env(model)?)),
|
"anthropic" => Ok(Box::new(AnthropicProvider::from_env(model)?)),
|
||||||
"azure_openai" => Ok(Box::new(AzureProvider::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)?)),
|
"databricks" => Ok(Box::new(DatabricksProvider::from_env(model)?)),
|
||||||
"groq" => Ok(Box::new(GroqProvider::from_env(model)?)),
|
"groq" => Ok(Box::new(GroqProvider::from_env(model)?)),
|
||||||
"ollama" => Ok(Box::new(OllamaProvider::from_env(model)?)),
|
"ollama" => Ok(Box::new(OllamaProvider::from_env(model)?)),
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ impl ProviderType {
|
|||||||
],
|
],
|
||||||
ProviderType::OpenAi => &["OPENAI_API_KEY"],
|
ProviderType::OpenAi => &["OPENAI_API_KEY"],
|
||||||
ProviderType::Anthropic => &["ANTHROPIC_API_KEY"],
|
ProviderType::Anthropic => &["ANTHROPIC_API_KEY"],
|
||||||
ProviderType::Bedrock => &["AWS_PROFILE", "AWS_REGION"],
|
ProviderType::Bedrock => &["AWS_PROFILE"],
|
||||||
ProviderType::Databricks => &["DATABRICKS_HOST"],
|
ProviderType::Databricks => &["DATABRICKS_HOST"],
|
||||||
ProviderType::Google => &["GOOGLE_API_KEY"],
|
ProviderType::Google => &["GOOGLE_API_KEY"],
|
||||||
ProviderType::Groq => &["GROQ_API_KEY"],
|
ProviderType::Groq => &["GROQ_API_KEY"],
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ Goose relies heavily on tool calling capabilities and currently works best with
|
|||||||
|
|
||||||
| Provider | Description | Parameters |
|
| 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` |
|
| [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` |
|
| [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` |
|
| [Databricks](https://www.databricks.com/) | Unified data analytics and AI platform for building and deploying models. | `DATABRICKS_HOST`, `DATABRICKS_TOKEN` |
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ export const default_models = {
|
|||||||
ollama: 'qwen2.5',
|
ollama: 'qwen2.5',
|
||||||
azure_openai: 'gpt-4o',
|
azure_openai: 'gpt-4o',
|
||||||
gcp_vertex_ai: 'gemini-2.0-flash-001',
|
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 {
|
export function getDefaultModel(key: string): string | undefined {
|
||||||
@@ -64,6 +65,7 @@ export const required_keys = {
|
|||||||
OpenRouter: ['OPENROUTER_API_KEY'],
|
OpenRouter: ['OPENROUTER_API_KEY'],
|
||||||
'Azure OpenAI': ['AZURE_OPENAI_API_KEY', 'AZURE_OPENAI_ENDPOINT', 'AZURE_OPENAI_DEPLOYMENT_NAME'],
|
'Azure OpenAI': ['AZURE_OPENAI_API_KEY', 'AZURE_OPENAI_ENDPOINT', 'AZURE_OPENAI_DEPLOYMENT_NAME'],
|
||||||
'GCP Vertex AI': ['GCP_PROJECT_ID', 'GCP_LOCATION'],
|
'GCP Vertex AI': ['GCP_PROJECT_ID', 'GCP_LOCATION'],
|
||||||
|
'AWS Bedrock': ['AWS_PROFILE'],
|
||||||
};
|
};
|
||||||
|
|
||||||
export const default_key_value = {
|
export const default_key_value = {
|
||||||
@@ -83,6 +85,7 @@ export const supported_providers = [
|
|||||||
'OpenRouter',
|
'OpenRouter',
|
||||||
'Azure OpenAI',
|
'Azure OpenAI',
|
||||||
'GCP Vertex AI',
|
'GCP Vertex AI',
|
||||||
|
'AWS Bedrock',
|
||||||
];
|
];
|
||||||
|
|
||||||
export const model_docs_link = [
|
export const model_docs_link = [
|
||||||
@@ -97,6 +100,7 @@ export const model_docs_link = [
|
|||||||
{ name: 'OpenRouter', href: 'https://openrouter.ai/models' },
|
{ name: 'OpenRouter', href: 'https://openrouter.ai/models' },
|
||||||
{ name: 'Ollama', href: 'https://ollama.com/library' },
|
{ name: 'Ollama', href: 'https://ollama.com/library' },
|
||||||
{ name: 'GCP Vertex AI', href: 'https://cloud.google.com/vertex-ai' },
|
{ 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 = [
|
export const provider_aliases = [
|
||||||
@@ -109,4 +113,5 @@ export const provider_aliases = [
|
|||||||
{ provider: 'Google', alias: 'google' },
|
{ provider: 'Google', alias: 'google' },
|
||||||
{ provider: 'Azure OpenAI', alias: 'azure_openai' },
|
{ provider: 'Azure OpenAI', alias: 'azure_openai' },
|
||||||
{ provider: 'GCP Vertex AI', alias: 'gcp_vertex_ai' },
|
{ provider: 'GCP Vertex AI', alias: 'gcp_vertex_ai' },
|
||||||
|
{ provider: 'AWS Bedrock', alias: 'aws_bedrock' },
|
||||||
];
|
];
|
||||||
|
|||||||
Reference in New Issue
Block a user