on main help sign in
fix: fix openai compatible provider

some providers expect simple content differently Co-authored-by: Peter Steinberger <steipete@gmail.com>

commit8940ba1ddf3d686e2e8b3f29a04ab904ec2e8c66 authorKujtim Hoxha <kujtimii.h@gmail.com> dateSat 2 Aug 2025, 09:16 (1 year ago) parent6da6500
1 file changed+18−9
internal/llm/provider/openai.go+18−9
internal/llm/provider/openai.go+18−9
@@ -70,8 +70,9 @@ func (o *openaiClient) convertMessages(messages []message.Message) (openaiMessag
7070 systemMessage = o.providerOptions.systemPromptPrefix + "\n" + systemMessage
7171 }
7272
73− systemTextBlock := openai.ChatCompletionContentPartTextParam{Text: systemMessage}
73+ system := openai.SystemMessage(systemMessage)
7474 if isAnthropicModel && !o.providerOptions.disableCache {
75+ systemTextBlock := openai.ChatCompletionContentPartTextParam{Text: systemMessage}
7576 systemTextBlock.SetExtraFields(
7677 map[string]any{
7778 "cache_control": map[string]string{
@@ -79,10 +80,10 @@ func (o *openaiClient) convertMessages(messages []message.Message) (openaiMessag
7980 },
8081 },
8182 )
83+ var content []openai.ChatCompletionContentPartTextParam
84+ content = append(content, systemTextBlock)
85+ system = openai.SystemMessage(content)
8286 }
83− var content []openai.ChatCompletionContentPartTextParam
84− content = append(content, systemTextBlock)
85− system := openai.SystemMessage(content)
8687 openaiMessages = append(openaiMessages, system)
8788
8889 for i, msg := range messages {
@@ -93,9 +94,12 @@ func (o *openaiClient) convertMessages(messages []message.Message) (openaiMessag
9394 switch msg.Role {
9495 case message.User:
9596 var content []openai.ChatCompletionContentPartUnionParam
97+
9698 textBlock := openai.ChatCompletionContentPartTextParam{Text: msg.Content().String()}
9799 content = append(content, openai.ChatCompletionContentPartUnionParam{OfText: &textBlock})
100+ hasBinaryContent := false
98101 for _, binaryContent := range msg.BinaryContent() {
102+ hasBinaryContent = true
99103 imageURL := openai.ChatCompletionContentPartImageImageURLParam{URL: binaryContent.String(catwalk.InferenceProviderOpenAI)}
100104 imageBlock := openai.ChatCompletionContentPartImageParam{ImageURL: imageURL}
101105
@@ -108,8 +112,11 @@ func (o *openaiClient) convertMessages(messages []message.Message) (openaiMessag
108112 },
109113 })
110114 }
111−
112− openaiMessages = append(openaiMessages, openai.UserMessage(content))
115+ if hasBinaryContent || (isAnthropicModel && !o.providerOptions.disableCache) {
116+ openaiMessages = append(openaiMessages, openai.UserMessage(content))
117+ } else {
118+ openaiMessages = append(openaiMessages, openai.UserMessage(msg.Content().String()))
119+ }
113120
114121 case message.Assistant:
115122 assistantMsg := openai.ChatCompletionAssistantMessageParam{
@@ -134,13 +141,15 @@ func (o *openaiClient) convertMessages(messages []message.Message) (openaiMessag
134141 },
135142 },
136143 }
144+ if !isAnthropicModel {
145+ assistantMsg.Content = openai.ChatCompletionAssistantMessageParamContentUnion{
146+ OfString: param.NewOpt(msg.Content().String()),
147+ }
148+ }
137149 }
138150
139151 if len(msg.ToolCalls()) > 0 {
140152 hasContent = true
141− assistantMsg.Content = openai.ChatCompletionAssistantMessageParamContentUnion{
142− OfString: param.NewOpt(msg.Content().String()),
143− }
144153 assistantMsg.ToolCalls = make([]openai.ChatCompletionMessageToolCallParam, len(msg.ToolCalls()))
145154 for i, call := range msg.ToolCalls() {
146155 assistantMsg.ToolCalls[i] = openai.ChatCompletionMessageToolCallParam{