Class: RubyLLM::Protocols::OpenRouter::Responses

Inherits:
Protocols::Responses
  • Object
show all
Defined in:
lib/ruby_llm/protocols/openrouter/responses.rb

Overview

OpenRouter's opt-in Responses endpoint and hosted tools.

Constant Summary collapse

SERVER_TOOL_ALIASES =
%i[web_search web_fetch datetime image_generation apply_patch shell].to_h do |name|
  [name, { tool: { type: "openrouter:#{name}" } }]
end.merge(
  url_context: { tool: { type: 'openrouter:web_fetch' } },
  code_execution: { tool: { type: 'openrouter:shell' } },
  mcp: Protocols::Responses::SERVER_TOOL_ALIASES.fetch(:mcp)
).freeze

Instance Method Summary collapse

Instance Method Details

#build_chunk(data) ⇒ Object



44
45
46
47
48
49
# File 'lib/ruby_llm/protocols/openrouter/responses.rb', line 44

def build_chunk(data)
  return super unless data['type'] == 'response.mcp_call_arguments.done'

  chunk server_tool_calls: [ServerToolCall.new(type: 'mcp_call', id: data['item_id'],
                                               input: data['arguments'], raw: data)]
end

#merge_server_tool_entries(payload, entries) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
# File 'lib/ruby_llm/protocols/openrouter/responses.rb', line 20

def merge_server_tool_entries(payload, entries)
  entries.each do |entry|
    tool = Support::Utils.deep_symbolize_keys(entry)
    next unless tool[:type] == 'mcp'
    next if tool[:require_approval].to_s == 'never'

    raise ArgumentError,
          "OpenRouter MCP requires explicit require_approval: 'never'; approval events are not returned"
  end
  super
end

#parse_usage(usage) ⇒ Object



32
33
34
# File 'lib/ruby_llm/protocols/openrouter/responses.rb', line 32

def parse_usage(usage)
  super.merge(reported_cost: reported_cost(usage), server_tool_use: server_tool_use(usage))
end

#reported_cost(usage) ⇒ Object



36
37
38
39
40
41
42
# File 'lib/ruby_llm/protocols/openrouter/responses.rb', line 36

def reported_cost(usage)
  cost = usage['cost']
  return nil unless cost

  cost += usage.dig('cost_details', 'upstream_inference_cost').to_f if usage['is_byok']
  cost
end

#server_tool_aliasesObject



16
17
18
# File 'lib/ruby_llm/protocols/openrouter/responses.rb', line 16

def server_tool_aliases
  SERVER_TOOL_ALIASES
end