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



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/legion/extensions/llm/model/info.rb', line 14

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



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def capabilities
  @capabilities
end

#context_lengthObject (readonly)

Returns the value of attribute context_length

Returns:

  • (Object)

    the current value of context_length



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def context_length
  @context_length
end

#familyObject (readonly)

Returns the value of attribute family

Returns:

  • (Object)

    the current value of family



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def family
  @family
end

#idObject (readonly)

Returns the value of attribute id

Returns:

  • (Object)

    the current value of id



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def id
  @id
end

#instanceObject (readonly)

Returns the value of attribute instance

Returns:

  • (Object)

    the current value of instance



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def instance
  @instance
end

#metadataObject (readonly)

Returns the value of attribute metadata

Returns:

  • (Object)

    the current value of metadata



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def 
  @metadata
end

#modalities_inputObject (readonly)

Returns the value of attribute modalities_input

Returns:

  • (Object)

    the current value of modalities_input



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def modalities_input
  @modalities_input
end

#modalities_outputObject (readonly)

Returns the value of attribute modalities_output

Returns:

  • (Object)

    the current value of modalities_output



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def modalities_output
  @modalities_output
end

#nameObject (readonly)

Returns the value of attribute name

Returns:

  • (Object)

    the current value of name



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def name
  @name
end

#parameter_countObject (readonly)

Returns the value of attribute parameter_count

Returns:

  • (Object)

    the current value of parameter_count



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def parameter_count
  @parameter_count
end

#parameter_sizeObject (readonly)

Returns the value of attribute parameter_size

Returns:

  • (Object)

    the current value of parameter_size



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def parameter_size
  @parameter_size
end

#providerObject (readonly)

Returns the value of attribute provider

Returns:

  • (Object)

    the current value of provider



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def provider
  @provider
end

#quantizationObject (readonly)

Returns the value of attribute quantization

Returns:

  • (Object)

    the current value of quantization



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def quantization
  @quantization
end

#size_bytesObject (readonly)

Returns the value of attribute size_bytes

Returns:

  • (Object)

    the current value of size_bytes



7
8
9
# File 'lib/legion/extensions/llm/model/info.rb', line 7

def size_bytes
  @size_bytes
end

Class Method Details

.default(model_id, provider) ⇒ Object

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



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

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.



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/legion/extensions/llm/model/info.rb', line 148

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)


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

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.



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

def context_window
  context_length || [:context_window]
end

#created_atObject



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

def created_at
  [:created_at]
end

#display_nameObject



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

def display_name
  name
end

#embedding?Boolean

Returns:

  • (Boolean)


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

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

#input_price_per_millionObject



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

def input_price_per_million
  pricing.text_tokens.input
end

#knowledge_cutoffObject



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

def knowledge_cutoff
  [:knowledge_cutoff]
end

#labelObject



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

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

#max_output_tokensObject



63
64
65
# File 'lib/legion/extensions/llm/model/info.rb', line 63

def max_output_tokens
  [:max_output_tokens]
end

#max_tokensObject



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

def max_tokens
  max_output_tokens
end

#modalitiesObject



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

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

#output_price_per_millionObject



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

def output_price_per_million
  pricing.text_tokens.output
end

#pricingObject



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

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

#supports?(capability) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/legion/extensions/llm/model/info.rb', line 50

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

#supports_functions?Boolean

Returns:

  • (Boolean)


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

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

#supports_video?Boolean

Returns:

  • (Boolean)


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

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

#supports_vision?Boolean

Returns:

  • (Boolean)


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

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

#thinking?Boolean

Returns:

  • (Boolean)


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

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

#tools?Boolean

Returns:

  • (Boolean)


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

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

#typeObject



122
123
124
125
126
127
128
129
130
131
# File 'lib/legion/extensions/llm/model/info.rb', line 122

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)


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

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