Module: Axn::RubyLLM::RSpec::Helpers

Defined in:
lib/axn/ruby_llm/rspec.rb

Instance Method Summary collapse

Instance Method Details

#stub_axn_ruby_llm(positional_response = UNSET, response: UNSET, model: nil, schema: nil, input_tokens: nil, output_tokens: nil, cache_read_tokens: nil, cache_write_tokens: nil, cost: nil) ⇒ Object

Stubs RubyLLM so that Ask returns a canned response. The response can be given positionally (the common case) or as response: — both are equivalent.

Usage in a spec:

stub_axn_ruby_llm("Here is a summary.")
stub_axn_ruby_llm({ "key" => "value" })          # auto-JSON-serialized for json: true calls
stub_axn_ruby_llm({ "k" => "v" }, schema: MySchema) # Hash passed through unparsed
stub_axn_ruby_llm("...", input_tokens: 100, output_tokens: 50, cost: 0.0023)
stub_axn_ruby_llm("...", cache_read_tokens: 500, cache_write_tokens: 200)
stub_axn_ruby_llm(response: "...")               # keyword form still works

Returns the chat instance double for further assertions if needed.

Raises:

  • (ArgumentError)


24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/axn/ruby_llm/rspec.rb', line 24

def stub_axn_ruby_llm(positional_response = UNSET, response: UNSET, model: nil, schema: nil,
                      input_tokens: nil, output_tokens: nil, cache_read_tokens: nil,
                      cache_write_tokens: nil, cost: nil)
  response = positional_response unless positional_response.equal?(UNSET)
  raise ArgumentError, "stub_axn_ruby_llm requires a response (positionally or as `response:`)" if response.equal?(UNSET)

  resolved_model_id = model || Axn::RubyLLM.config.default_model
  llm_message = _stub_axn_ruby_llm_message(response, resolved_model_id, input_tokens, output_tokens,
                                           cache_read_tokens:, cache_write_tokens:, schema:)
  chat_instance = _stub_axn_ruby_llm_chat(model, llm_message, schema:)
  _stub_axn_ruby_llm_cost(llm_message, resolved_model_id, cost)
  chat_instance
end