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

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)

  merge_message_fields!(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 stitch_done_message_tool_calls!(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

Returns:

  • (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