diff options
Diffstat (limited to 'internal/llm/provider')
| -rw-r--r-- | internal/llm/provider/anthropic.go | 12 | ||||
| -rw-r--r-- | internal/llm/provider/bedrock.go | 9 | ||||
| -rw-r--r-- | internal/llm/provider/gemini.go | 9 | ||||
| -rw-r--r-- | internal/llm/provider/openai.go | 13 |
4 files changed, 35 insertions, 8 deletions
diff --git a/internal/llm/provider/anthropic.go b/internal/llm/provider/anthropic.go index a96fe83ee..345904cf3 100644 --- a/internal/llm/provider/anthropic.go +++ b/internal/llm/provider/anthropic.go @@ -13,6 +13,7 @@ import ( "github.com/anthropics/anthropic-sdk-go/bedrock" "github.com/anthropics/anthropic-sdk-go/option" "github.com/opencode-ai/opencode/internal/config" + "github.com/opencode-ai/opencode/internal/llm/models" "github.com/opencode-ai/opencode/internal/llm/tools" "github.com/opencode-ai/opencode/internal/logging" "github.com/opencode-ai/opencode/internal/message" @@ -70,7 +71,14 @@ func (a *anthropicClient) convertMessages(messages []message.Message) (anthropic Type: "ephemeral", } } - anthropicMessages = append(anthropicMessages, anthropic.NewUserMessage(content)) + var contentBlocks []anthropic.ContentBlockParamUnion + contentBlocks = append(contentBlocks, content) + for _, binaryContent := range msg.BinaryContent() { + base64Image := binaryContent.String(models.ProviderAnthropic) + imageBlock := anthropic.NewImageBlockBase64(binaryContent.MIMEType, base64Image) + contentBlocks = append(contentBlocks, imageBlock) + } + anthropicMessages = append(anthropicMessages, anthropic.NewUserMessage(contentBlocks...)) case message.Assistant: blocks := []anthropic.ContentBlockParamUnion{} @@ -204,6 +212,7 @@ func (a *anthropicClient) send(ctx context.Context, messages []message.Message, jsonData, _ := json.Marshal(preparedMessages) logging.Debug("Prepared messages", "messages", string(jsonData)) } + attempts := 0 for { attempts++ @@ -213,6 +222,7 @@ func (a *anthropicClient) send(ctx context.Context, messages []message.Message, ) // If there is an error we are going to see if we can retry the call if err != nil { + logging.Error("Error in Anthropic API call", "error", err) retry, after, retryErr := a.shouldRetry(attempts, err) if retryErr != nil { return nil, retryErr diff --git a/internal/llm/provider/bedrock.go b/internal/llm/provider/bedrock.go index ca0d508c3..9f42e5b18 100644 --- a/internal/llm/provider/bedrock.go +++ b/internal/llm/provider/bedrock.go @@ -55,7 +55,7 @@ func newBedrockClient(opts providerClientOptions) BedrockClient { if strings.Contains(string(opts.model.APIModel), "anthropic") { // Create Anthropic client with Bedrock configuration anthropicOpts := opts - anthropicOpts.anthropicOptions = append(anthropicOpts.anthropicOptions, + anthropicOpts.anthropicOptions = append(anthropicOpts.anthropicOptions, WithAnthropicBedrock(true), WithAnthropicDisableCache(), ) @@ -84,7 +84,7 @@ func (b *bedrockClient) send(ctx context.Context, messages []message.Message, to func (b *bedrockClient) stream(ctx context.Context, messages []message.Message, tools []tools.BaseTool) <-chan ProviderEvent { eventChan := make(chan ProviderEvent) - + if b.childProvider == nil { go func() { eventChan <- ProviderEvent{ @@ -95,6 +95,7 @@ func (b *bedrockClient) stream(ctx context.Context, messages []message.Message, }() return eventChan } - + return b.childProvider.stream(ctx, messages, tools) -}
\ No newline at end of file +} + diff --git a/internal/llm/provider/gemini.go b/internal/llm/provider/gemini.go index d8fd6619f..9aee8e53a 100644 --- a/internal/llm/provider/gemini.go +++ b/internal/llm/provider/gemini.go @@ -57,11 +57,16 @@ func (g *geminiClient) convertMessages(messages []message.Message) []*genai.Cont for _, msg := range messages { switch msg.Role { case message.User: + var parts []genai.Part + parts = append(parts, genai.Text(msg.Content().String())) + for _, binaryContent := range msg.BinaryContent() { + imageFormat := strings.Split(binaryContent.MIMEType, "/") + parts = append(parts, genai.ImageData(imageFormat[1], binaryContent.Data)) + } history = append(history, &genai.Content{ - Parts: []genai.Part{genai.Text(msg.Content().String())}, + Parts: parts, Role: "user", }) - case message.Assistant: content := &genai.Content{ Role: "model", diff --git a/internal/llm/provider/openai.go b/internal/llm/provider/openai.go index d68cfbc2d..8a561c77b 100644 --- a/internal/llm/provider/openai.go +++ b/internal/llm/provider/openai.go @@ -12,6 +12,7 @@ import ( "github.com/openai/openai-go/option" "github.com/openai/openai-go/shared" "github.com/opencode-ai/opencode/internal/config" + "github.com/opencode-ai/opencode/internal/llm/models" "github.com/opencode-ai/opencode/internal/llm/tools" "github.com/opencode-ai/opencode/internal/logging" "github.com/opencode-ai/opencode/internal/message" @@ -71,7 +72,17 @@ func (o *openaiClient) convertMessages(messages []message.Message) (openaiMessag for _, msg := range messages { switch msg.Role { case message.User: - openaiMessages = append(openaiMessages, openai.UserMessage(msg.Content().String())) + var content []openai.ChatCompletionContentPartUnionParam + textBlock := openai.ChatCompletionContentPartTextParam{Text: msg.Content().String()} + content = append(content, openai.ChatCompletionContentPartUnionParam{OfText: &textBlock}) + for _, binaryContent := range msg.BinaryContent() { + imageURL := openai.ChatCompletionContentPartImageImageURLParam{URL: binaryContent.String(models.ProviderOpenAI)} + imageBlock := openai.ChatCompletionContentPartImageParam{ImageURL: imageURL} + + content = append(content, openai.ChatCompletionContentPartUnionParam{OfImageURL: &imageBlock}) + } + + openaiMessages = append(openaiMessages, openai.UserMessage(content)) case message.Assistant: assistantMsg := openai.ChatCompletionAssistantMessageParam{ |
