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.



143
144
145
146
147
148
149
150
151
152
153
# File 'lib/legion/extensions/llm/model/info.rb', line 143

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.



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/legion/extensions/llm/model/info.rb', line 157

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.



68
69
70
# File 'lib/legion/extensions/llm/model/info.rb', line 68

def context_window
  context_length || [:context_window]
end

#created_atObject



80
81
82
# File 'lib/legion/extensions/llm/model/info.rb', line 80

def created_at
  [:created_at]
end

#display_nameObject



96
97
98
# File 'lib/legion/extensions/llm/model/info.rb', line 96

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



104
105
106
# File 'lib/legion/extensions/llm/model/info.rb', line 104

def input_price_per_million
  pricing.text_tokens.input
end

#knowledge_cutoffObject



84
85
86
# File 'lib/legion/extensions/llm/model/info.rb', line 84

def knowledge_cutoff
  [:knowledge_cutoff]
end

#labelObject



100
101
102
# File 'lib/legion/extensions/llm/model/info.rb', line 100

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

#max_output_tokensObject



72
73
74
# File 'lib/legion/extensions/llm/model/info.rb', line 72

def max_output_tokens
  [:max_output_tokens]
end

#max_tokensObject



76
77
78
# File 'lib/legion/extensions/llm/model/info.rb', line 76

def max_tokens
  max_output_tokens
end

#modalitiesObject



88
89
90
# File 'lib/legion/extensions/llm/model/info.rb', line 88

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

#output_price_per_millionObject



108
109
110
# File 'lib/legion/extensions/llm/model/info.rb', line 108

def output_price_per_million
  pricing.text_tokens.output
end

#pricingObject



92
93
94
# File 'lib/legion/extensions/llm/model/info.rb', line 92

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

#supports?(capability) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/legion/extensions/llm/model/info.rb', line 59

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

#supports_functions?Boolean

Returns:

  • (Boolean)


120
121
122
# File 'lib/legion/extensions/llm/model/info.rb', line 120

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

#supports_video?Boolean

Returns:

  • (Boolean)


116
117
118
# File 'lib/legion/extensions/llm/model/info.rb', line 116

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

#supports_vision?Boolean

Returns:

  • (Boolean)


112
113
114
# File 'lib/legion/extensions/llm/model/info.rb', line 112

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



131
132
133
134
135
136
137
138
139
140
# File 'lib/legion/extensions/llm/model/info.rb', line 131

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)