Class: Legion::Extensions::Llm::Model::Info

Inherits:
Data
  • Object
show all
Defined in:
lib/legion/extensions/llm/model/info.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id:, name: nil, provider: nil, instance: :default, family: nil, capabilities: [], context_length: nil, parameter_count: nil, parameter_size: nil, quantization: nil, size_bytes: nil, modalities_input: [], modalities_output: [], metadata: {}) ⇒ Info

rubocop:disable Metrics/ParameterLists, Metrics/PerceivedComplexity



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/legion/extensions/llm/model/info.rb', line 23

def initialize(
  id:, name: nil, provider: nil, instance: :default,
  family: nil, capabilities: [], context_length: nil,
  parameter_count: nil, parameter_size: nil, quantization: nil,
  size_bytes: nil, modalities_input: [], modalities_output: [],
  metadata: {}
)
  normalized_family = family.nil? ? nil : family.to_s.downcase.strip

  super(
    id: id.to_s.strip,
    name: (name || id).to_s.strip,
    provider: provider.to_s.downcase.to_sym,
    instance: (instance || :default).to_s.downcase.to_sym,
    family: normalized_family,
    capabilities: normalize_symbols(capabilities),
    context_length: to_int(context_length),
    parameter_count: to_int(parameter_count),
    parameter_size: parameter_size&.to_s&.strip,
    quantization: quantization&.to_s&.strip,
    size_bytes: to_int(size_bytes),
    modalities_input: normalize_symbols(modalities_input),
    modalities_output: normalize_symbols(modalities_output),
    metadata: .is_a?(Hash) ?  : {}
  )
end

Instance Attribute Details

#capabilitiesObject (readonly)

Returns the value of attribute capabilities

Returns:

  • (Object)

    the current value of capabilities



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def capabilities
  @capabilities
end

#context_lengthObject (readonly)

Returns the value of attribute context_length

Returns:

  • (Object)

    the current value of context_length



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def context_length
  @context_length
end

#familyObject (readonly)

Returns the value of attribute family

Returns:

  • (Object)

    the current value of family



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def family
  @family
end

#idObject (readonly)

Returns the value of attribute id

Returns:

  • (Object)

    the current value of id



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def id
  @id
end

#instanceObject (readonly)

Returns the value of attribute instance

Returns:

  • (Object)

    the current value of instance



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def instance
  @instance
end

#metadataObject (readonly)

Returns the value of attribute metadata

Returns:

  • (Object)

    the current value of metadata



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def 
  @metadata
end

#modalities_inputObject (readonly)

Returns the value of attribute modalities_input

Returns:

  • (Object)

    the current value of modalities_input



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def modalities_input
  @modalities_input
end

#modalities_outputObject (readonly)

Returns the value of attribute modalities_output

Returns:

  • (Object)

    the current value of modalities_output



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def modalities_output
  @modalities_output
end

#nameObject (readonly)

Returns the value of attribute name

Returns:

  • (Object)

    the current value of name



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def name
  @name
end

#parameter_countObject (readonly)

Returns the value of attribute parameter_count

Returns:

  • (Object)

    the current value of parameter_count



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def parameter_count
  @parameter_count
end

#parameter_sizeObject (readonly)

Returns the value of attribute parameter_size

Returns:

  • (Object)

    the current value of parameter_size



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def parameter_size
  @parameter_size
end

#providerObject (readonly)

Returns the value of attribute provider

Returns:

  • (Object)

    the current value of provider



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def provider
  @provider
end

#quantizationObject (readonly)

Returns the value of attribute quantization

Returns:

  • (Object)

    the current value of quantization



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def quantization
  @quantization
end

#size_bytesObject (readonly)

Returns the value of attribute size_bytes

Returns:

  • (Object)

    the current value of size_bytes



16
17
18
# File 'lib/legion/extensions/llm/model/info.rb', line 16

def size_bytes
  @size_bytes
end

Class Method Details

.default(model_id, provider) ⇒ Object

Factory for assumed-to-exist models without full metadata.



149
150
151
152
153
154
155
156
157
158
159
# File 'lib/legion/extensions/llm/model/info.rb', line 149

def self.default(model_id, provider)
  new(
    id: model_id,
    name: model_id.tr('-', ' ').capitalize,
    provider: provider,
    capabilities: %w[function_calling streaming vision structured_output],
    modalities_input: %w[text image],
    modalities_output: %w[text],
    metadata: { warning: 'Assuming model exists, capabilities may not be accurate' }
  )
end

.from_hash(data) ⇒ Object

Factory that accepts both legacy and new-style hashes and maps them to the new struct fields. Handles round-tripping through to_h.



163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/legion/extensions/llm/model/info.rb', line 163

def self.from_hash(data)
  data = data.transform_keys(&:to_sym) if data.is_a?(Hash)

  input_mods, output_mods = extract_modalities(data)

  new(
    id: data[:id],
    name: data[:name],
    provider: data[:provider],
    instance: data[:instance],
    family: data[:family],
    capabilities: data[:capabilities] || [],
    context_length: data[:context_length] || data[:context_window],
    parameter_count: data[:parameter_count],
    parameter_size: data[:parameter_size],
    quantization: data[:quantization],
    size_bytes: data[:size_bytes],
    modalities_input: input_mods,
    modalities_output: output_mods,
    metadata: (data)
  )
end

Instance Method Details

#completion?Boolean

── Capability predicates ─────────────────────────────────────

Returns:

  • (Boolean)


53
# File 'lib/legion/extensions/llm/model/info.rb', line 53

def completion? = capabilities.include?(:completion)

#context_windowObject

── Backward-compatible accessors ─────────────────────────────These bridge the legacy Model::Info class API used by Models, OpenAICompatible, and provider gems. They read from metadata where the old fields were stored.



74
75
76
# File 'lib/legion/extensions/llm/model/info.rb', line 74

def context_window
  context_length || [:context_window]
end

#created_atObject



86
87
88
# File 'lib/legion/extensions/llm/model/info.rb', line 86

def created_at
  [:created_at]
end

#display_nameObject



102
103
104
# File 'lib/legion/extensions/llm/model/info.rb', line 102

def display_name
  name
end

#embedding?Boolean

Returns:

  • (Boolean)


54
# File 'lib/legion/extensions/llm/model/info.rb', line 54

def embedding?  = capabilities.include?(:embedding)

#input_price_per_millionObject



110
111
112
# File 'lib/legion/extensions/llm/model/info.rb', line 110

def input_price_per_million
  pricing.text_tokens.input
end

#knowledge_cutoffObject



90
91
92
# File 'lib/legion/extensions/llm/model/info.rb', line 90

def knowledge_cutoff
  [:knowledge_cutoff]
end

#labelObject



106
107
108
# File 'lib/legion/extensions/llm/model/info.rb', line 106

def label
  "#{provider} - #{display_name}"
end

#max_output_tokensObject



78
79
80
# File 'lib/legion/extensions/llm/model/info.rb', line 78

def max_output_tokens
  [:max_output_tokens]
end

#max_tokensObject



82
83
84
# File 'lib/legion/extensions/llm/model/info.rb', line 82

def max_tokens
  max_output_tokens
end

#modalitiesObject



94
95
96
# File 'lib/legion/extensions/llm/model/info.rb', line 94

def modalities
  Modalities.new(input: modalities_input.map(&:to_s), output: modalities_output.map(&:to_s))
end

#output_price_per_millionObject



114
115
116
# File 'lib/legion/extensions/llm/model/info.rb', line 114

def output_price_per_million
  pricing.text_tokens.output
end

#pricingObject



98
99
100
# File 'lib/legion/extensions/llm/model/info.rb', line 98

def pricing
  Pricing.new([:pricing] || {})
end

#supports?(capability) ⇒ Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/legion/extensions/llm/model/info.rb', line 65

def supports?(capability)
  capabilities.include?(capability.to_s.downcase.to_sym)
end

#supports_functions?Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/legion/extensions/llm/model/info.rb', line 126

def supports_functions?
  tools? || capabilities.include?(:function_calling)
end

#supports_prompt_caching?Boolean

Returns true if the model supports prompt caching (Anthropic Claude 4.x, 3.5 Sonnet+). Checks the explicit ‘prompt_caching` capability flag in the capabilities array.

Returns:

  • (Boolean)


61
62
63
# File 'lib/legion/extensions/llm/model/info.rb', line 61

def supports_prompt_caching?
  capabilities.include?(:prompt_caching)
end

#supports_video?Boolean

Returns:

  • (Boolean)


122
123
124
# File 'lib/legion/extensions/llm/model/info.rb', line 122

def supports_video?
  modalities_input.include?(:video)
end

#supports_vision?Boolean

Returns:

  • (Boolean)


118
119
120
# File 'lib/legion/extensions/llm/model/info.rb', line 118

def supports_vision?
  vision? || modalities_input.include?(:image)
end

#thinking?Boolean

Returns:

  • (Boolean)


57
# File 'lib/legion/extensions/llm/model/info.rb', line 57

def thinking?   = capabilities.include?(:thinking)

#tools?Boolean

Returns:

  • (Boolean)


56
# File 'lib/legion/extensions/llm/model/info.rb', line 56

def tools?      = capabilities.include?(:tools)

#typeObject



137
138
139
140
141
142
143
144
145
146
# File 'lib/legion/extensions/llm/model/info.rb', line 137

def type
  output = modalities_output.map(&:to_s)
  return 'embedding' if output.include?('embeddings') || embedding?
  return 'moderation' if output.include?('moderation')
  return 'image' if output.include?('image')
  return 'audio' if output.include?('audio')
  return 'video' if output.include?('video')

  'chat'
end

#vision?Boolean

Returns:

  • (Boolean)


55
# File 'lib/legion/extensions/llm/model/info.rb', line 55

def vision?     = capabilities.include?(:vision)