Class: Riffer::Providers::Base

Inherits:
Object
  • Object
show all
Includes:
Helpers::Dependencies, Messages::Converter
Defined in:
lib/riffer/providers/base.rb

Overview

Base class for all LLM providers in the Riffer framework.

Provides a template-method flow for text generation and streaming. Subclasses implement five hook methods; the base class orchestrates them.

Hook methods

build_request_params

convert messages, tools, and options into SDK params

execute_generate

call the SDK and return the raw response

execute_stream

call the streaming SDK, mapping events to the yielder

extract_token_usage

pull token counts from the SDK response

extract_content

extract text content from the SDK response

extract_tool_calls

extract tool calls from the SDK response

Direct Known Subclasses

AmazonBedrock, Anthropic, Gemini, Mock, OpenAI

Constant Summary collapse

WIRE_SEPARATOR =

: String

"__"

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Messages::Converter

#convert_to_file_part, #convert_to_message_object

Methods included from Helpers::Dependencies

#depends_on

Class Method Details

.skills_adapterObject

Returns the preferred skill adapter for this provider.

Override in subclasses for provider-specific formats.

– : () -> singleton(Riffer::Skills::Adapter)



31
32
33
# File 'lib/riffer/providers/base.rb', line 31

def self.skills_adapter
  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::FilePart]?, **untyped) -> Riffer::Messages::Assistant



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/riffer/providers/base.rb', line 39

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] || []
  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::FilePart]?, **untyped) -> Enumerator[Riffer::StreamEvents::Base, void]



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/riffer/providers/base.rb', line 65

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] || []
  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