Class: Terret::OpenRouter::Adapter

Inherits:
LLM::AdapterBase
  • Object
show all
Defined in:
lib/terret/openrouter/adapter.rb

Overview

The ctx.llm adapter. Transport is injectable: tests drive it with canned SSE bodies; the default (lazily required) streams over async-http. Retries apply only before any bytes have streamed — once the consumer has seen deltas, a failure surfaces as StreamError and raises.

Constant Summary collapse

DEFAULT_BASE_URL =
"https://openrouter.ai/api/v1"

Instance Method Summary collapse

Constructor Details

#initialize(api_key: nil, base_url: DEFAULT_BASE_URL, referer: nil, title: nil, transport: nil, credentials: nil, **retry_opts) ⇒ Adapter

Returns a new instance of Adapter.



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/terret/openrouter/adapter.rb', line 14

def initialize(api_key: nil, base_url: DEFAULT_BASE_URL, referer: nil,
               title: nil, transport: nil, credentials: nil, **retry_opts)
  super(**retry_opts)
  @api_key = api_key
  @base_url = base_url.chomp("/")
  @referer = referer
  @title = title
  @transport = transport
  # An optional resolver callable (the row wires it to ctx[:credentials]),
  # consulted lazily at request time so mount order never matters.
  @credentials = credentials
end

Instance Method Details

#stream(request, &on_event) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
# File 'lib/terret/openrouter/adapter.rb', line 27

def stream(request, &on_event)
  body = JSON.generate(Translate.request_body(request))
  headers = request_headers
  with_retries do
    transport.call(url: "#{@base_url}/chat/completions",
                   headers: headers, body: body) do |status, chunks|
      check_status!(status, chunks)
      consume(chunks, &on_event)
    end
  end
end