class Catalog

Read-only view of configured and provider-backed model catalogs.

Definitions

def initialize(routes:, sources:, metadata:)

Build a catalog view over configuration-owned model data.

Signature

parameter routes Hash(String, Symbol)

Explicit model routes.

parameter sources Hash(Symbol, Interface(:each, :find))

Provider discovery sources.

parameter metadata Hash(String, Hash)

Metadata for explicit model routes.

Implementation

def initialize(routes:, sources:, metadata:)
	@routes = routes
	@sources = sources
	@metadata = metadata
end

def empty?

Check whether the catalog contains routes or discovery sources.

Signature

returns Boolean

true when the catalog is empty.

Implementation

def empty?
	@routes.empty? && @sources.empty?
end

def discover?

Check whether the catalog has any provider discovery sources.

Signature

returns Boolean

true when discovery is configured.

Implementation

def discover?
	!@sources.empty?
end

def provider_for(model, default_provider: nil)

Resolve the provider name for a model, using the default as fallback.

Signature

parameter model String | Nil

The model ID to look up.

option :default_provider Symbol | Nil

The fallback provider name.

returns Symbol | Nil

The selected provider name.

Implementation

def provider_for(model, default_provider: nil)
	return @routes[model] if @routes.key?(model)
	
	if model
		matches = @sources.filter_map do |provider, source|
			provider if source.find(model)
		end
		
		return default_provider if matches.include?(default_provider)
		return matches.first unless matches.empty?
	end
	
	return default_provider
end

def each(default_provider: nil, &block)

Enumerate explicit and discovered models without duplicate IDs.

Signature

option :default_provider Symbol | Nil

The preferred owner of duplicate IDs.

yields {|model| ...}

Each model entry in OpenAI model-list format.

parameter model Hash

A model-list entry.

returns Enumerator | Nil

An enumerator without a block, otherwise nil.

Implementation

def each(default_provider: nil, &block)
	return to_enum(__method__, default_provider: default_provider) unless block
	
	models = {}
	owners = {}
	
	@routes.each do |id, provider|
		models[id] = {
			"id" => id,
			"object" => "model",
			"created" => 0,
			"owned_by" => provider.to_s,
		}.tap do |entry|
			if metadata = @metadata[id]
				entry["laiya"] = metadata
			end
		end
		owners[id] = provider
	end
	
	@sources.each do |provider, source|
		source.each do |model|
			id = model["id"]
			next unless id.is_a?(String) && !id.empty?
			next if @routes.key?(id)
			next if owners.key?(id) && provider != default_provider
			
			models[id] = model.merge("owned_by" => provider.to_s)
			owners[id] = provider
		end
	end
	
	models.each_value(&block)
end

def freeze

Freeze the catalog and its shared configuration data.

Signature

returns Laiya::Models::Catalog

This frozen catalog.

Implementation

def freeze
	return self if frozen?
	
	@routes.freeze
	@sources.freeze
	@metadata.freeze
	
	super
end