Skip to content

Commit a6ced7a

Browse files
committed
Support attachments when accumulating streams
1 parent 9bf9e3e commit a6ced7a

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

lib/ruby_llm/stream_accumulator.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ class StreamAccumulator
66
attr_reader :content, :model_id, :tool_calls
77

88
def initialize
9+
#@content = nil
910
@content = +''
1011
@tool_calls = {}
1112
@input_tokens = 0
@@ -21,6 +22,7 @@ def add(chunk)
2122
accumulate_tool_calls chunk.tool_calls
2223
else
2324
@content << (chunk.content || '')
25+
# accumulate_content(chunk.content)
2426
end
2527

2628
count_tokens chunk
@@ -30,6 +32,7 @@ def add(chunk)
3032
def to_message(response)
3133
Message.new(
3234
role: :assistant,
35+
#content: final_content,
3336
content: content.empty? ? nil : content,
3437
model_id: model_id,
3538
tool_calls: tool_calls_from_stream,
@@ -41,6 +44,53 @@ def to_message(response)
4144

4245
private
4346

47+
def accumulate_content(new_content)
48+
return unless new_content
49+
50+
if @content.nil?
51+
@content = new_content.is_a?(String) ? +new_content : new_content
52+
else
53+
case [@content.class, new_content.class]
54+
when [String, String]
55+
@content << new_content
56+
when [String, Content]
57+
# Convert accumulated string to Content and merge
58+
@content = Content.new(@content)
59+
merge_content(new_content)
60+
when [Content, String]
61+
# Append string to existing Content's text
62+
@content.instance_variable_set(:@text, (@content.text || '') + new_content)
63+
when [Content, Content]
64+
merge_content(new_content)
65+
end
66+
end
67+
end
68+
69+
def merge_content(new_content)
70+
# Merge text
71+
current_text = @content.text || ''
72+
new_text = new_content.text || ''
73+
@content.instance_variable_set(:@text, current_text + new_text)
74+
75+
# Merge attachments
76+
new_content.attachments.each do |attachment|
77+
@content.attach(attachment)
78+
end
79+
end
80+
81+
def final_content
82+
case @content
83+
when nil
84+
nil
85+
when String
86+
@content.empty? ? nil : @content
87+
when Content
88+
@content.text.nil? && @content.attachments.empty? ? nil : @content
89+
else
90+
@content
91+
end
92+
end
93+
4494
def tool_calls_from_stream
4595
tool_calls.transform_values do |tc|
4696
arguments = if tc.arguments.is_a?(String) && !tc.arguments.empty?

0 commit comments

Comments
 (0)