Skip to content

Commit bb571be

Browse files
authored
fix(adapters): openai_responses images merged as text (#2733)
1 parent dfb0ca9 commit bb571be

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

lua/codecompanion/adapters/http/openai_responses.lua

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,12 @@ return {
181181
}
182182

183183
-- If next message is also from user with text content, combine them
184-
if next_msg and next_msg.role == m.role and type(next_msg.content) == "string" then
184+
if
185+
next_msg
186+
and next_msg.role == m.role
187+
and type(next_msg.content) == "string"
188+
and not (next_msg._meta and next_msg._meta.tag == "image")
189+
then
185190
table.insert(combined_content, {
186191
type = "input_text",
187192
text = next_msg.content,

tests/adapters/http/test_openai_responses.lua

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,74 @@ T["Responses"]["build_messages"]["images"] = function()
153153
h.eq(expected, adapter.handlers.request.build_messages(adapter, messages))
154154
end
155155

156+
T["Responses"]["build_messages"]["multiple consecutive images are not merged as text"] = function()
157+
local messages = {
158+
{
159+
content = "img1_base64",
160+
role = "user",
161+
opts = { visible = false },
162+
context = { mimetype = "image/png" },
163+
_meta = { tag = "image" },
164+
},
165+
{
166+
content = "img2_base64",
167+
role = "user",
168+
opts = { visible = false },
169+
context = { mimetype = "image/png" },
170+
_meta = { tag = "image" },
171+
},
172+
{
173+
content = "img3_base64",
174+
role = "user",
175+
opts = { visible = false },
176+
context = { mimetype = "image/png" },
177+
_meta = { tag = "image" },
178+
},
179+
{
180+
content = "How many images do you see?",
181+
role = "user",
182+
},
183+
}
184+
185+
local expected = {
186+
input = {
187+
{
188+
role = "user",
189+
content = {
190+
{
191+
type = "input_image",
192+
image_url = "data:image/png;base64,img1_base64",
193+
},
194+
},
195+
},
196+
{
197+
role = "user",
198+
content = {
199+
{
200+
type = "input_image",
201+
image_url = "data:image/png;base64,img2_base64",
202+
},
203+
},
204+
},
205+
{
206+
role = "user",
207+
content = {
208+
{
209+
type = "input_image",
210+
image_url = "data:image/png;base64,img3_base64",
211+
},
212+
{
213+
type = "input_text",
214+
text = "How many images do you see?",
215+
},
216+
},
217+
},
218+
},
219+
}
220+
221+
h.eq(expected, adapter.handlers.request.build_messages(adapter, messages))
222+
end
223+
156224
T["Responses"]["build_messages"]["format tool calls"] = function()
157225
local messages = {
158226
{

0 commit comments

Comments
 (0)