mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
feat(providers): add AWS Bedrock provider (#1903)
Add support for AWS Bedrock as an LLM provider using the Converse API. The implementation is behind a build tag (-tags bedrock) to keep the default binary size small. Features: - AWS SDK v2 with automatic credential chain (env vars, profiles, IAM roles) - Converse API for unified access to Claude, Llama, Mistral models - Tool/function calling support with proper document handling - Image support with base64 decoding and size limits - Request timeout configuration - Region validation and endpoint resolution for all AWS partitions Usage: go build -tags bedrock model: bedrock/us.anthropic.claude-sonnet-4-20250514-v1:0 api_base: us-east-1 (or full endpoint URL)
This commit is contained in:
@@ -6,12 +6,15 @@
|
||||
package providers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/sipeed/picoclaw/pkg/config"
|
||||
anthropicmessages "github.com/sipeed/picoclaw/pkg/providers/anthropic_messages"
|
||||
"github.com/sipeed/picoclaw/pkg/providers/azure"
|
||||
"github.com/sipeed/picoclaw/pkg/providers/bedrock"
|
||||
)
|
||||
|
||||
// createClaudeAuthProvider creates a Claude provider using OAuth credentials from auth store.
|
||||
@@ -55,8 +58,9 @@ func ExtractProtocol(model string) (protocol, modelID string) {
|
||||
|
||||
// CreateProviderFromConfig creates a provider based on the ModelConfig.
|
||||
// It uses the protocol prefix in the Model field to determine which provider to create.
|
||||
// Supported protocols: openai, litellm, novita, anthropic, anthropic-messages,
|
||||
// antigravity, claude-cli, codex-cli, github-copilot
|
||||
// Supported protocol families include OpenAI-compatible prefixes (e.g., openai, openrouter, groq, gemini),
|
||||
// Azure OpenAI, Amazon Bedrock, Anthropic (including messages), and various CLI/compatibility shims.
|
||||
// See the switch on protocol in this function for the authoritative list.
|
||||
// Returns the provider, the model ID (without protocol prefix), and any error.
|
||||
func CreateProviderFromConfig(cfg *config.ModelConfig) (LLMProvider, string, error) {
|
||||
if cfg == nil {
|
||||
@@ -114,6 +118,42 @@ func CreateProviderFromConfig(cfg *config.ModelConfig) (LLMProvider, string, err
|
||||
cfg.RequestTimeout,
|
||||
), modelID, nil
|
||||
|
||||
case "bedrock":
|
||||
// AWS Bedrock uses AWS SDK credentials (env vars, profiles, IAM roles, etc.)
|
||||
// api_base can be:
|
||||
// - A full endpoint URL: https://bedrock-runtime.us-east-1.amazonaws.com
|
||||
// - A region name: us-east-1 (AWS SDK resolves endpoint automatically)
|
||||
var opts []bedrock.Option
|
||||
if cfg.APIBase != "" {
|
||||
if !strings.Contains(cfg.APIBase, "://") {
|
||||
// Treat as region: let AWS SDK resolve the correct endpoint
|
||||
// (supports all AWS partitions: aws, aws-cn, aws-us-gov, etc.)
|
||||
opts = append(opts, bedrock.WithRegion(cfg.APIBase))
|
||||
} else {
|
||||
// Full endpoint URL provided (for custom endpoints or testing)
|
||||
opts = append(opts, bedrock.WithBaseEndpoint(cfg.APIBase))
|
||||
}
|
||||
}
|
||||
// Use a separate timeout for AWS config loading (credential resolution can block)
|
||||
initTimeout := 30 * time.Second
|
||||
if cfg.RequestTimeout > 0 {
|
||||
reqTimeout := time.Duration(cfg.RequestTimeout) * time.Second
|
||||
// Set request timeout for API calls
|
||||
opts = append(opts, bedrock.WithRequestTimeout(reqTimeout))
|
||||
// Ensure init timeout is at least as large as request timeout
|
||||
if reqTimeout > initTimeout {
|
||||
initTimeout = reqTimeout
|
||||
}
|
||||
}
|
||||
ctx, cancel := context.WithTimeout(context.Background(), initTimeout)
|
||||
defer cancel()
|
||||
// Note: AWS_PROFILE env var is automatically used by AWS SDK
|
||||
provider, err := bedrock.NewProvider(ctx, opts...)
|
||||
if err != nil {
|
||||
return nil, "", fmt.Errorf("creating bedrock provider: %w", err)
|
||||
}
|
||||
return provider, modelID, nil
|
||||
|
||||
case "litellm", "openrouter", "groq", "zhipu", "gemini", "nvidia",
|
||||
"ollama", "moonshot", "shengsuanyun", "deepseek", "cerebras",
|
||||
"vivgrid", "volcengine", "vllm", "qwen", "qwen-intl", "qwen-international", "dashscope-intl",
|
||||
|
||||
Reference in New Issue
Block a user