@@ -10,13 +10,6 @@ def models_url
1010 'api/tags'
1111 end
1212
13- # FIXME: include aliases for tags with the format \d+m or \d+b
14- # ie. given these models in the server,
15- # - gemma3:27b
16- # - gemma3:9b
17- #
18- # create an alias gemma3 for gemma3:27b
19-
2013 # NOTE: Unlike other providers for well known APIs with stable model
2114 # offerings, the Ollama provider deals with local servers which
2215 # might have arbitrarily named models or even zero models installed.
@@ -38,7 +31,28 @@ def list_models
3831 private
3932
4033 def parse_list_models_response ( response , slug , capabilities ) # rubocop:disable Metrics/MethodLength
41- ( response . body [ 'models' ] || [ ] ) . map do |model |
34+ provider_aliases = { }
35+ list = response . body [ 'models' ] || [ ]
36+
37+ # initial pass: discover Ollama "tags"
38+ list . each do |model |
39+ base , tag = model [ 'name' ] . split ( ':' , 2 )
40+ model [ 'model_name_base' ] = base if tag
41+ end
42+
43+ # second pass: set aliases for models with multiple sizes
44+ list . group_by { |m | m [ 'model_name_base' ] } . each do |base , models |
45+ # given these models in the server,
46+ # - gemma3:27b
47+ # - gemma3:9b
48+ # then gemma3:27b will get the 'gemma3' alias since the 27b is larger in bytesize
49+ largest = models . max_by { |m | m [ 'size' ] . to_i }
50+ provider_aliases [ base ] = largest [ 'name' ]
51+ end
52+ RubyLLM ::Aliases . register_runtime_aliases ( slug , provider_aliases )
53+
54+ # final pass: assemble
55+ list . map do |model |
4256 model_id = model [ 'name' ]
4357
4458 ModelInfo . new (
@@ -57,6 +71,7 @@ def parse_list_models_response(response, slug, capabilities) # rubocop:disable M
5771 input_price_per_million : capabilities . input_price_for ( model_id ) ,
5872 output_price_per_million : capabilities . output_price_for ( model_id ) ,
5973 metadata : {
74+ model_name_base : model [ 'model_name_base' ] ,
6075 byte_size : model [ 'size' ] &.to_i ,
6176 parameter_size : model . dig ( 'details' , 'parameter_size' ) ,
6277 quantization_level : model . dig ( 'details' , 'quantization_level' ) ,
0 commit comments