Class: LittleGhost::Model

Inherits:
Object
  • Object
show all
Includes:
ModelInterface
Defined in:
lib/little_ghost/model.rb

Overview

Model is the resolved connection between an agent selection and a provider. It keeps provider behavior behind one executable interface whether an agent selected a role, canonical target, or inline configuration.

It merges profile settings into every ModelRequest, validates attachment modalities declared in metadata, lets providers prepare capability-sensitive requests, and delegates the normalized stream to the provider.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(provider:, target:, settings: {}, details: nil, role: nil) ⇒ Model

Connects a provider adapter to its canonical target, profile settings, optional model details, and logical role.

Raises:

  • (ArgumentError)


34
35
36
37
38
39
40
41
42
# File 'lib/little_ghost/model.rb', line 34

def initialize(provider:, target:, settings: {}, details: nil, role: nil)
  raise ArgumentError, "provider must be a LittleGhost::Providers::Base" unless provider.is_a?(Providers::Base)

  @provider = provider
  @target = Models::Target.parse(target)
  @settings = settings.to_h.transform_keys(&:to_sym).freeze
  @role = role&.to_s
  @details = details || Models::Details.new(target: @target)
end

Instance Attribute Details

#detailsObject (readonly)

Provider object, canonical target, default settings, normalized model details, and logical application role.



30
31
32
# File 'lib/little_ghost/model.rb', line 30

def details
  @details
end

#providerObject (readonly)

Provider object, canonical target, default settings, normalized model details, and logical application role.



30
31
32
# File 'lib/little_ghost/model.rb', line 30

def provider
  @provider
end

#roleObject (readonly)

Provider object, canonical target, default settings, normalized model details, and logical application role.



30
31
32
# File 'lib/little_ghost/model.rb', line 30

def role
  @role
end

#settingsObject (readonly)

Provider object, canonical target, default settings, normalized model details, and logical application role.



30
31
32
# File 'lib/little_ghost/model.rb', line 30

def settings
  @settings
end

#targetObject (readonly)

Provider object, canonical target, default settings, normalized model details, and logical application role.



30
31
32
# File 'lib/little_ghost/model.rb', line 30

def target
  @target
end

Instance Method Details

#capabilitiesObject

Uses advertised provider capabilities.



80
81
82
# File 'lib/little_ghost/model.rb', line 80

def capabilities
  @capabilities ||= provider.capabilities(metadata: details.attributes)
end

#model_idObject

Provider-owned identifier from the canonical target.



45
# File 'lib/little_ghost/model.rb', line 45

def model_id = target.model_id

#stream(request, &block) ⇒ Object

Streams request through the configured provider.

Profile settings are defaults; settings on request take precedence.



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/little_ghost/model.rb', line 50

def stream(request, &block)
  validate_input_modalities!(request)
  configured_settings = settings.merge(request.settings)
  configured_max_tokens = if request.settings.key?(:max_tokens)
    request.settings[:max_tokens]
  elsif request.settings.key?("max_tokens")
    request.settings["max_tokens"]
  else
    settings[:max_tokens] || settings["max_tokens"]
  end
  if configured_max_tokens && details.max_output_tokens
    configured_settings.delete(:max_tokens)
    configured_settings.delete("max_tokens")
    configured_settings[:max_tokens] = [configured_max_tokens, details.max_output_tokens].min
  end
  configured_request = ModelRequest.new(
    messages: request.messages,
    tools: request.tools,
    settings: configured_settings,
    output_schema: request.output_schema,
    tool_choice: request.tool_choice,
    required_capabilities: request.required_capabilities,
    cancellation_token: request.cancellation_token,
    deadline: request.deadline
  )
  configured_request = provider.prepare_request(configured_request, capabilities:)
  provider.stream(configured_request, &block)
end