Module: OllamaAgent::ChatStreamCarry
- Defined in:
- lib/ollama_agent/chat_stream_carry.rb
Overview
ollama-client 1.1.0 process_chat_stream_chunk returns the previous last_data for every non-done line, so message.tool_calls seen on an intermediate NDJSON row are dropped when the final done row omits them. Carry forward merged state and copy tool_calls onto the done row.
Class Method Summary collapse
- .json_dup(payload) ⇒ Object
- .merge_carry(prev, obj) ⇒ Object
- .next_last_data(prev, obj) ⇒ Object
- .stitch_done_message_tool_calls!(done_obj, prev_carry) ⇒ Object
- .truthy_done?(obj) ⇒ Boolean
Class Method Details
.json_dup(payload) ⇒ Object
37 38 39 40 41 42 43 |
# File 'lib/ollama_agent/chat_stream_carry.rb', line 37 def json_dup(payload) return payload if payload.nil? JSON.parse(JSON.generate(payload)) rescue JSON::GeneratorError, JSON::ParserError, TypeError dup_via_marshal(payload) end |
.merge_carry(prev, obj) ⇒ Object
24 25 26 27 28 29 30 31 |
# File 'lib/ollama_agent/chat_stream_carry.rb', line 24 def merge_carry(prev, obj) merged = json_dup(prev) chunk_msg = obj["message"] return merged if chunk_msg.nil? || !chunk_msg.is_a?(Hash) (merged, chunk_msg) merged end |
.next_last_data(prev, obj) ⇒ Object
10 11 12 13 14 15 |
# File 'lib/ollama_agent/chat_stream_carry.rb', line 10 def next_last_data(prev, obj) return json_dup(obj) if prev.nil? && !truthy_done?(obj) return prev if truthy_done?(obj) merge_carry(prev, obj) end |
.stitch_done_message_tool_calls!(done_obj, prev_carry) ⇒ Object
17 18 19 20 21 22 |
# File 'lib/ollama_agent/chat_stream_carry.rb', line 17 def (done_obj, prev_carry) prev_tc = tool_calls_from_carry(prev_carry) return if prev_tc.nil? || !truthy_done?(done_obj) apply_tool_calls_to_done!(done_obj, prev_tc) end |
.truthy_done?(obj) ⇒ Boolean
33 34 35 |
# File 'lib/ollama_agent/chat_stream_carry.rb', line 33 def truthy_done?(obj) obj.is_a?(Hash) && (obj["done"] == true || obj[:done] == true) end |