Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit 8b573fe

Browse files
authored
FIX: maintain newest uploads correctly when constructing context (#1242)
1 parent a14fe92 commit 8b573fe

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

lib/completions/prompt_messages_builder.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -389,8 +389,9 @@ def compress_messages_buffer(buffer, max_uploads:)
389389
compressed << current_text if current_text.present?
390390

391391
if upload_count > max_uploads
392-
counter = max_uploads - upload_count
393-
compressed.delete_if { |item| item.is_a?(Hash) && (counter += 1) > 0 }
392+
to_remove = upload_count - max_uploads
393+
removed = 0
394+
compressed.delete_if { |item| item.is_a?(Hash) && (removed += 1) <= to_remove }
394395
end
395396

396397
compressed = compressed[0] if compressed.length == 1 && compressed[0].is_a?(String)

spec/lib/completions/prompt_messages_builder_spec.rb

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,70 @@
238238
end
239239
end
240240

241+
describe "upload limits in messages_from_chat" do
242+
fab!(:test_channel) { Fabricate(:category_channel) }
243+
fab!(:test_user) { Fabricate(:user) }
244+
245+
# Create MAX_CHAT_UPLOADS + 1 uploads
246+
fab!(:uploads) do
247+
(described_class::MAX_CHAT_UPLOADS + 1).times.map do |i|
248+
Fabricate(:upload, user: test_user, original_filename: "image#{i}.png", extension: "png")
249+
end
250+
end
251+
252+
# Create MAX_CHAT_UPLOADS + 1 messages with those uploads
253+
fab!(:messages_with_uploads) do
254+
uploads.map do |upload|
255+
Fabricate(
256+
:chat_message,
257+
chat_channel: test_channel,
258+
user: test_user,
259+
message: "Message with upload #{upload.id}",
260+
).tap do |msg|
261+
UploadReference.create!(target: msg, upload: upload)
262+
msg.update!(upload_ids: [upload.id])
263+
end
264+
end
265+
end
266+
267+
let(:max_uploads) { described_class::MAX_CHAT_UPLOADS }
268+
269+
it "limits uploads to MAX_CHAT_UPLOADS in the final result" do
270+
last_message = messages_with_uploads.last
271+
272+
# Make sure uploads are properly associated
273+
messages_with_uploads.each_with_index do |msg, i|
274+
expect(msg.uploads.first.id).to eq(uploads[i].id)
275+
end
276+
277+
context =
278+
described_class.messages_from_chat(
279+
last_message,
280+
channel: test_channel,
281+
context_post_ids: nil,
282+
max_messages: messages_with_uploads.size,
283+
include_uploads: true,
284+
bot_user_ids: [],
285+
instruction_message: nil,
286+
)
287+
288+
# We should have one message containing all message content
289+
expect(context.length).to eq(1)
290+
content = context.first[:content]
291+
292+
# Count the upload hashes in the content
293+
upload_hashes = content.select { |item| item.is_a?(Hash) && item[:upload_id] }
294+
295+
# Should have exactly MAX_CHAT_UPLOADS upload references
296+
expect(upload_hashes.size).to eq(max_uploads)
297+
298+
# The most recent uploads should be preserved (not the oldest)
299+
expected_upload_ids = uploads.last(max_uploads).map(&:id)
300+
actual_upload_ids = upload_hashes.map { |h| h[:upload_id] }
301+
expect(actual_upload_ids).to match_array(expected_upload_ids)
302+
end
303+
end
304+
241305
describe ".messages_from_post" do
242306
fab!(:pm) do
243307
Fabricate(

0 commit comments

Comments
 (0)