Class: Riffer::Providers::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/riffer/providers/base.rb

Overview

Base class for all LLM providers. A template-method flow: subclasses implement the hooks (build_request_params, execute_generate, execute_stream, extract_token_usage, extract_content, extract_tool_calls) and the base class orchestrates them.

Direct Known Subclasses

AmazonBedrock, Anthropic, Gemini, Mock, OpenAI, OpenRouter

Constant Summary collapse

WIRE_SEPARATOR =
"__"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.skills_adapter(model = nil) ⇒ Object

Returns the preferred skill adapter for this provider; override in subclasses (optionally introspecting model) for provider-specific formats. – : (?String?) -> singleton(Riffer::Skills::Adapter)



19
20
21
# File 'lib/riffer/providers/base.rb', line 19

def self.skills_adapter(model = nil)
  Riffer::Skills::MarkdownAdapter
end

Instance Method Details

#generate_text(prompt: nil, system: nil, messages: nil, model: nil, files: nil, **options) ⇒ Object

Generates text using the provider.

– : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Riffer::Messages::Assistant



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/riffer/providers/base.rb', line 27

def generate_text(prompt: nil, system: nil, messages: nil, model: nil, files: nil, **options)
  validate_input!(prompt: prompt, system: system, messages: messages)
  @current_tools = options[:tools] || [] #: Array[singleton(Riffer::Tool)]
  messages = normalize_messages(prompt: prompt, system: system, messages: messages, files: files)
  validate_normalized_messages!(messages)
  messages = merge_consecutive_messages(messages)
  params = build_request_params(messages, model, options)
  response = execute_generate(params)

  content = extract_content(response)
  tool_calls = extract_tool_calls(response)
  token_usage = extract_token_usage(response)
  structured_output = parse_structured_output(content) if options[:structured_output] && tool_calls.empty?

  Riffer::Messages::Assistant.new(
    content,
    tool_calls: tool_calls,
    token_usage: token_usage,
    structured_output: structured_output
  )
end

#stream_text(prompt: nil, system: nil, messages: nil, model: nil, files: nil, **options) ⇒ Object

Streams text from the provider.

– : (?prompt: String?, ?system: String?, ?messages: Array[Hash[Symbol, untyped] | Riffer::Messages::Base]?, ?model: String?, ?files: Array[Hash[Symbol, untyped] | Riffer::Messages::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/riffer/providers/base.rb', line 53

def stream_text(prompt: nil, system: nil, messages: nil, model: nil, files: nil, **options)
  validate_input!(prompt: prompt, system: system, messages: messages)
  @current_tools = options[:tools] || [] #: Array[singleton(Riffer::Tool)]
  messages = normalize_messages(prompt: prompt, system: system, messages: messages, files: files)
  validate_normalized_messages!(messages)
  messages = merge_consecutive_messages(messages)
  params = build_request_params(messages, model, options)
  Enumerator.new do |yielder|
    execute_stream(params, yielder)
  end
end