Class: ClaudeAgentSDK::MessageParser

Inherits:
Object
  • Object
show all
Defined in:
lib/claude_agent_sdk/message_parser.rb

Overview

Parse message from CLI output into typed Message objects

Class Method Summary collapse

Class Method Details

.parse(data) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/claude_agent_sdk/message_parser.rb', line 9

def self.parse(data)
  raise MessageParseError.new("Invalid message data type", data: data) unless data.is_a?(Hash)

  message_type = data[:type]
  raise MessageParseError.new("Message missing 'type' field", data: data) unless message_type

  case message_type
  when 'user'
    parse_user_message(data)
  when 'assistant'
    parse_assistant_message(data)
  when 'system'
    parse_system_message(data)
  when 'result'
    parse_result_message(data)
  when 'stream_event'
    parse_stream_event(data)
  when 'rate_limit_event'
    parse_rate_limit_event(data)
  else
    raise MessageParseError.new("Unknown message type: #{message_type}", data: data)
  end
rescue KeyError => e
  raise MessageParseError.new("Missing required field: #{e.message}", data: data)
end

.parse_assistant_message(data) ⇒ Object

Raises:



55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/claude_agent_sdk/message_parser.rb', line 55

def self.parse_assistant_message(data)
  content = data.dig(:message, :content)
  raise MessageParseError.new("Missing content in assistant message", data: data) unless content

  content_blocks = content.map { |block| parse_content_block(block) }
  AssistantMessage.new(
    content: content_blocks,
    model: data.dig(:message, :model),
    parent_tool_use_id: data[:parent_tool_use_id],
    error: data[:error] # authentication_failed, billing_error, rate_limit, invalid_request, server_error, unknown
  )
end

.parse_content_block(block) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/claude_agent_sdk/message_parser.rb', line 103

def self.parse_content_block(block)
  case block[:type]
  when 'text'
    TextBlock.new(text: block[:text])
  when 'thinking'
    ThinkingBlock.new(thinking: block[:thinking], signature: block[:signature])
  when 'tool_use'
    ToolUseBlock.new(id: block[:id], name: block[:name], input: block[:input])
  when 'tool_result'
    ToolResultBlock.new(
      tool_use_id: block[:tool_use_id],
      content: block[:content],
      is_error: block[:is_error]
    )
  else
    raise MessageParseError.new("Unknown content block type: #{block[:type]}")
  end
end

.parse_rate_limit_event(data) ⇒ Object



99
100
101
# File 'lib/claude_agent_sdk/message_parser.rb', line 99

def self.parse_rate_limit_event(data)
  RateLimitEvent.new(data: data)
end

.parse_result_message(data) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/claude_agent_sdk/message_parser.rb', line 75

def self.parse_result_message(data)
  ResultMessage.new(
    subtype: data[:subtype],
    duration_ms: data[:duration_ms],
    duration_api_ms: data[:duration_api_ms],
    is_error: data[:is_error],
    num_turns: data[:num_turns],
    session_id: data[:session_id],
    total_cost_usd: data[:total_cost_usd],
    usage: data[:usage],
    result: data[:result],
    structured_output: data[:structured_output] # Structured output when output_format is specified
  )
end

.parse_stream_event(data) ⇒ Object



90
91
92
93
94
95
96
97
# File 'lib/claude_agent_sdk/message_parser.rb', line 90

def self.parse_stream_event(data)
  StreamEvent.new(
    uuid: data[:uuid],
    session_id: data[:session_id],
    event: data[:event],
    parent_tool_use_id: data[:parent_tool_use_id]
  )
end

.parse_system_message(data) ⇒ Object



68
69
70
71
72
73
# File 'lib/claude_agent_sdk/message_parser.rb', line 68

def self.parse_system_message(data)
  SystemMessage.new(
    subtype: data[:subtype],
    data: data
  )
end

.parse_user_message(data) ⇒ Object

Raises:



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/claude_agent_sdk/message_parser.rb', line 35

def self.parse_user_message(data)
  parent_tool_use_id = data[:parent_tool_use_id]
  uuid = data[:uuid] # UUID for rewind support
  tool_use_result = data[:tool_use_result]
  message_data = data[:message]
  raise MessageParseError.new("Missing message field in user message", data: data) unless message_data

  content = message_data[:content]
  raise MessageParseError.new("Missing content in user message", data: data) unless content

  if content.is_a?(Array)
    content_blocks = content.map { |block| parse_content_block(block) }
    UserMessage.new(content: content_blocks, uuid: uuid, parent_tool_use_id: parent_tool_use_id,
                    tool_use_result: tool_use_result)
  else
    UserMessage.new(content: content, uuid: uuid, parent_tool_use_id: parent_tool_use_id,
                    tool_use_result: tool_use_result)
  end
end