Module: RubyLLM::Providers::GPUStack::Models

Included in:
RubyLLM::Providers::GPUStack
Defined in:
lib/ruby_llm/providers/gpustack/models.rb

Overview

Models methods of the GPUStack API integration

Class Method Summary collapse

Class Method Details

.build_capabilities(model) ⇒ Object

rubocop:disable Metrics/PerceivedComplexity



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/ruby_llm/providers/gpustack/models.rb', line 50

def build_capabilities(model) # rubocop:disable Metrics/PerceivedComplexity
  capabilities = []

  # Add streaming by default for LLM models
  capabilities << 'streaming' if model['categories']&.include?('llm')

  # Map GPUStack metadata to standard capabilities
  capabilities << 'function_calling' if model.dig('meta', 'support_tool_calls')
  capabilities << 'vision' if model.dig('meta', 'support_vision')
  capabilities << 'reasoning' if model.dig('meta', 'support_reasoning')

  # GPUStack models generally support structured output and json mode
  capabilities << 'structured_output' if model['categories']&.include?('llm')
  capabilities << 'json_mode' if model['categories']&.include?('llm')

  capabilities
end

.build_modalities(model) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/ruby_llm/providers/gpustack/models.rb', line 68

def build_modalities(model)
  input_modalities = []
  output_modalities = []

  if model['categories']&.include?('llm')
    input_modalities << 'text'
    input_modalities << 'image' if model.dig('meta', 'support_vision')
    input_modalities << 'audio' if model.dig('meta', 'support_audio')
    output_modalities << 'text'
  elsif model['categories']&.include?('embedding')
    input_modalities << 'text'
    output_modalities << 'embeddings'
  end

  {
    input: input_modalities,
    output: output_modalities
  }
end

.determine_model_type(model) ⇒ Object



43
44
45
46
47
48
# File 'lib/ruby_llm/providers/gpustack/models.rb', line 43

def determine_model_type(model)
  return 'embedding' if model['categories']&.include?('embedding')
  return 'chat' if model['categories']&.include?('llm')

  'other'
end

.models_urlObject



10
11
12
# File 'lib/ruby_llm/providers/gpustack/models.rb', line 10

def models_url
  'models'
end

.parse_list_models_response(response, slug, _capabilities) ⇒ Object



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/ruby_llm/providers/gpustack/models.rb', line 14

def parse_list_models_response(response, slug, _capabilities)
  items = response.body['items'] || []
  items.map do |model|
    Model::Info.new(
      id: model['name'],
      name: model['name'],
      created_at: model['created_at'] ? Time.parse(model['created_at']) : nil,
      provider: slug,
      family: 'gpustack',
      metadata: {
        description: model['description'],
        source: model['source'],
        huggingface_repo_id: model['huggingface_repo_id'],
        ollama_library_model_name: model['ollama_library_model_name'],
        backend: model['backend'],
        meta: model['meta'],
        categories: model['categories']
      },
      context_window: model.dig('meta', 'n_ctx'),
      max_output_tokens: model.dig('meta', 'n_ctx'),
      capabilities: build_capabilities(model),
      modalities: build_modalities(model),
      pricing: {}
    )
  end
end