Class: SwarmSDK::Models

Inherits:
Object
  • Object
show all
Defined in:
lib/swarm_sdk/models.rb

Overview

Models provides model validation and suggestion functionality

Uses static JSON files:

  • models.json: Curated model list from Parsera
  • model_aliases.json: Shortcuts mapping to latest models

This avoids network calls, API key requirements, and RubyLLM registry manipulation.

Examples:

model = SwarmSDK::Models.find("claude-sonnet-4-5-20250929")
model = SwarmSDK::Models.find("sonnet")  # Uses alias
suggestions = SwarmSDK::Models.suggest_similar("anthropic:claude-sonnet-4-5")

Defined Under Namespace

Classes: ModelInfo

Constant Summary collapse

MODELS_JSON_PATH =
File.expand_path("models.json", __dir__)
ALIASES_JSON_PATH =
File.expand_path("model_aliases.json", __dir__)

Class Method Summary collapse

Class Method Details

.aliasesHash

Get all aliases

Returns:

  • (Hash)

    Alias mappings



123
124
125
# File 'lib/swarm_sdk/models.rb', line 123

def aliases
  @aliases ||= load_aliases
end

.allArray<Hash>

Get all models

Returns:

  • (Array<Hash>)

    All models from models.json



116
117
118
# File 'lib/swarm_sdk/models.rb', line 116

def all
  @models ||= load_models
end

.find(model_id) ⇒ ModelInfo?

Find a model by ID or alias

Parameters:

  • model_id (String)

    Model ID or alias to find

Returns:

  • (ModelInfo, nil)

    Model info or nil if not found



66
67
68
69
70
71
72
# File 'lib/swarm_sdk/models.rb', line 66

def find(model_id)
  # Check if it's an alias first
  resolved_id = resolve_alias(model_id)

  model_hash = all.find { |m| m["id"] == resolved_id || m[:id] == resolved_id }
  model_hash ? ModelInfo.new(model_hash) : nil
end

.reload!Array<Hash>

Reload models and aliases from JSON files

Returns:

  • (Array<Hash>)

    Loaded models



130
131
132
133
134
# File 'lib/swarm_sdk/models.rb', line 130

def reload!
  @models = load_models
  @aliases = load_aliases
  @models
end

.resolve_alias(model_id) ⇒ String

Resolve a model alias to full model ID

Parameters:

  • model_id (String)

    Model ID or alias

Returns:

  • (String)

    Resolved model ID (or original if not an alias)



78
79
80
# File 'lib/swarm_sdk/models.rb', line 78

def resolve_alias(model_id)
  aliases[model_id.to_s] || model_id
end

.suggest_similar(query, limit: 3) ⇒ Array<Hash>

Suggest similar models for a given query

Strips provider prefixes and normalizes for fuzzy matching.

Parameters:

  • query (String)

    Model ID to match against

  • limit (Integer) (defaults to: 3)

    Maximum number of suggestions

Returns:

  • (Array<Hash>)

    Up to limit similar models



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/swarm_sdk/models.rb', line 89

def suggest_similar(query, limit: 3)
  # Strip provider prefix (e.g., "anthropic:claude-sonnet-4-5" → "claude-sonnet-4-5")
  query_without_prefix = query.to_s.sub(/^[^:]+:/, "")
  normalized_query = query_without_prefix.downcase.gsub(/[.\-_]/, "")

  matches = all.select do |model|
    model_id = (model["id"] || model[:id]).to_s
    model_name = (model["name"] || model[:name]).to_s

    normalized_id = model_id.downcase.gsub(/[.\-_]/, "")
    normalized_name = model_name.downcase.gsub(/[.\-_]/, "")

    normalized_id.include?(normalized_query) || normalized_name.include?(normalized_query)
  end.first(limit)

  matches.map do |m|
    {
      id: m["id"] || m[:id],
      name: m["name"] || m[:name],
      context_window: m["context_window"] || m[:context_window],
    }
  end
end