lex-llm 0.7.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +106 -0
  3. data/RULES.md +97 -0
  4. data/lib/legion/extensions/llm/auto_registration.rb +4 -13
  5. data/lib/legion/extensions/llm/canonical/chunk.rb +106 -92
  6. data/lib/legion/extensions/llm/canonical/content_block.rb +66 -75
  7. data/lib/legion/extensions/llm/canonical/message.rb +52 -67
  8. data/lib/legion/extensions/llm/canonical/params.rb +59 -33
  9. data/lib/legion/extensions/llm/canonical/request.rb +67 -54
  10. data/lib/legion/extensions/llm/canonical/response.rb +61 -76
  11. data/lib/legion/extensions/llm/canonical/strict.rb +105 -0
  12. data/lib/legion/extensions/llm/canonical/thinking.rb +99 -51
  13. data/lib/legion/extensions/llm/canonical/tool_call.rb +42 -51
  14. data/lib/legion/extensions/llm/canonical/tool_definition.rb +56 -46
  15. data/lib/legion/extensions/llm/canonical/tool_schema.rb +15 -22
  16. data/lib/legion/extensions/llm/canonical/usage.rb +47 -40
  17. data/lib/legion/extensions/llm/canonical.rb +6 -5
  18. data/lib/legion/extensions/llm/configuration.rb +40 -10
  19. data/lib/legion/extensions/llm/connection.rb +8 -30
  20. data/lib/legion/extensions/llm/credential_sources.rb +32 -49
  21. data/lib/legion/extensions/llm/discovery/actor.rb +92 -0
  22. data/lib/legion/extensions/llm/discovery/pipeline.rb +604 -0
  23. data/lib/legion/extensions/llm/error.rb +0 -14
  24. data/lib/legion/extensions/llm/fleet/contract_error.rb +15 -0
  25. data/lib/legion/extensions/llm/fleet/envelope_validation.rb +7 -6
  26. data/lib/legion/extensions/llm/fleet/fleet_envelope.rb +66 -0
  27. data/lib/legion/extensions/llm/fleet/protocol.rb +18 -5
  28. data/lib/legion/extensions/llm/fleet/provider_responder.rb +58 -153
  29. data/lib/legion/extensions/llm/fleet/token_validator.rb +15 -21
  30. data/lib/legion/extensions/llm/fleet/worker_execution.rb +107 -150
  31. data/lib/legion/extensions/llm/inventory/errors.rb +0 -1
  32. data/lib/legion/extensions/llm/inventory/evidence.rb +1 -1
  33. data/lib/legion/extensions/llm/inventory/identity.rb +55 -39
  34. data/lib/legion/extensions/llm/inventory/probe_token.rb +9 -12
  35. data/lib/legion/extensions/llm/inventory/publisher.rb +15 -53
  36. data/lib/legion/extensions/llm/inventory/records.rb +82 -99
  37. data/lib/legion/extensions/llm/inventory/registry.rb +54 -46
  38. data/lib/legion/extensions/llm/inventory/snapshot.rb +7 -21
  39. data/lib/legion/extensions/llm/inventory/weight_reconciler.rb +249 -0
  40. data/lib/legion/extensions/llm/inventory/weight_schema.rb +146 -0
  41. data/lib/legion/extensions/llm/provider/open_ai_compatible.rb +172 -182
  42. data/lib/legion/extensions/llm/provider.rb +192 -315
  43. data/lib/legion/extensions/llm/provider_contract.rb +25 -8
  44. data/lib/legion/extensions/llm/provider_settings.rb +5 -26
  45. data/lib/legion/extensions/llm/responses/thinking_extractor.rb +8 -1
  46. data/lib/legion/extensions/llm/responses/tool_arguments.rb +34 -0
  47. data/lib/legion/extensions/llm/routing/provider_outcome.rb +25 -0
  48. data/lib/legion/extensions/llm/routing/records.rb +34 -17
  49. data/lib/legion/extensions/llm/stream_accumulator.rb +186 -270
  50. data/lib/legion/extensions/llm/streaming.rb +50 -35
  51. data/lib/legion/extensions/llm/taxonomies.rb +29 -17
  52. data/lib/legion/extensions/llm/transport/fleet_lane.rb +8 -10
  53. data/lib/legion/extensions/llm/transport/messages/fleet_error.rb +3 -2
  54. data/lib/legion/extensions/llm/transport/messages/fleet_request.rb +6 -8
  55. data/lib/legion/extensions/llm/transport/messages/fleet_response.rb +10 -9
  56. data/lib/legion/extensions/llm/utils.rb +23 -5
  57. data/lib/legion/extensions/llm/version.rb +1 -1
  58. data/lib/legion/extensions/llm.rb +10 -98
  59. data/spec/legion/extensions/llm/auto_registration_spec.rb +4 -9
  60. data/spec/legion/extensions/llm/canonical/chunk_spec.rb +66 -252
  61. data/spec/legion/extensions/llm/canonical/content_block_spec.rb +52 -197
  62. data/spec/legion/extensions/llm/canonical/message_spec.rb +89 -204
  63. data/spec/legion/extensions/llm/canonical/params_spec.rb +57 -136
  64. data/spec/legion/extensions/llm/canonical/request_spec.rb +81 -143
  65. data/spec/legion/extensions/llm/canonical/response_spec.rb +68 -204
  66. data/spec/legion/extensions/llm/canonical/thinking_spec.rb +68 -148
  67. data/spec/legion/extensions/llm/canonical/tool_call_spec.rb +59 -162
  68. data/spec/legion/extensions/llm/canonical/tool_definition_spec.rb +55 -191
  69. data/spec/legion/extensions/llm/canonical/tool_schema_spec.rb +26 -67
  70. data/spec/legion/extensions/llm/canonical/usage_spec.rb +46 -155
  71. data/spec/legion/extensions/llm/configuration_spec.rb +31 -5
  72. data/spec/legion/extensions/llm/conformance/canonical_type_examples.rb +106 -0
  73. data/spec/legion/extensions/llm/conformance/conformance.rb +10 -2
  74. data/spec/legion/extensions/llm/conformance/provider_translator_examples.rb +1 -1
  75. data/spec/legion/extensions/llm/conformance/ssot_contract_conformance_spec.rb +130 -0
  76. data/spec/legion/extensions/llm/conformance/ssot_contract_examples.rb +507 -0
  77. data/spec/legion/extensions/llm/conformance/ssot_provider_examples.rb +11 -10
  78. data/spec/legion/extensions/llm/credential_sources_spec.rb +12 -13
  79. data/spec/legion/extensions/llm/error_spec.rb +2 -12
  80. data/spec/legion/extensions/llm/fleet/exact_offering_spec.rb +59 -45
  81. data/spec/legion/extensions/llm/fleet/provider_responder_spec.rb +178 -67
  82. data/spec/legion/extensions/llm/fleet/token_validator_spec.rb +7 -2
  83. data/spec/legion/extensions/llm/fleet/worker_execution_spec.rb +101 -62
  84. data/spec/legion/extensions/llm/fleet_messages_spec.rb +118 -123
  85. data/spec/legion/extensions/llm/inventory/boot_spec.rb +4 -4
  86. data/spec/legion/extensions/llm/inventory/identity_spec.rb +127 -110
  87. data/spec/legion/extensions/llm/inventory/probe_token_spec.rb +4 -4
  88. data/spec/legion/extensions/llm/inventory/publisher_spec.rb +8 -61
  89. data/spec/legion/extensions/llm/inventory/records_spec.rb +129 -41
  90. data/spec/legion/extensions/llm/inventory/registry_activation_spec.rb +55 -4
  91. data/spec/legion/extensions/llm/inventory/registry_replacement_spec.rb +5 -4
  92. data/spec/legion/extensions/llm/inventory/snapshot_spec.rb +11 -5
  93. data/spec/legion/extensions/llm/inventory/weight_reconciler_spec.rb +312 -0
  94. data/spec/legion/extensions/llm/inventory/weight_schema_spec.rb +141 -0
  95. data/spec/legion/extensions/llm/provider/open_ai_compatible_spec.rb +105 -68
  96. data/spec/legion/extensions/llm/provider/open_ai_compatible_tool_calls_array_spec.rb +7 -31
  97. data/spec/legion/extensions/llm/provider_contract_spec.rb +10 -15
  98. data/spec/legion/extensions/llm/provider_spec.rb +98 -78
  99. data/spec/legion/extensions/llm/routing/records_spec.rb +38 -5
  100. data/spec/legion/extensions/llm/stream_accumulator_spec.rb +174 -144
  101. data/spec/legion/extensions/llm/streaming_spec.rb +27 -0
  102. data/spec/legion/extensions/llm/taxonomies_spec.rb +43 -16
  103. data/spec/legion/extensions/llm/transport/fleet_lane_spec.rb +1 -1
  104. data/spec/legion/extensions/llm/utils_spec.rb +26 -7
  105. data/spec/legion/extensions/llm_base_contract_spec.rb +55 -90
  106. data/spec/legion/extensions/llm_extension_spec.rb +5 -5
  107. data/spec/support/fake_llm_provider.rb +45 -39
  108. data/spec/support/fake_ssot_harness.rb +7 -2
  109. data/spec/support/ssot_registry_helpers.rb +3 -2
  110. metadata +15 -54
  111. data/lib/legion/extensions/llm/agent.rb +0 -366
  112. data/lib/legion/extensions/llm/aliases.json +0 -436
  113. data/lib/legion/extensions/llm/aliases.rb +0 -67
  114. data/lib/legion/extensions/llm/attachment.rb +0 -229
  115. data/lib/legion/extensions/llm/chat.rb +0 -354
  116. data/lib/legion/extensions/llm/chunk.rb +0 -10
  117. data/lib/legion/extensions/llm/content.rb +0 -81
  118. data/lib/legion/extensions/llm/context.rb +0 -33
  119. data/lib/legion/extensions/llm/embedding.rb +0 -33
  120. data/lib/legion/extensions/llm/image.rb +0 -109
  121. data/lib/legion/extensions/llm/inventory/capabilities.rb +0 -40
  122. data/lib/legion/extensions/llm/inventory/scoped_refresher.rb +0 -311
  123. data/lib/legion/extensions/llm/message.rb +0 -118
  124. data/lib/legion/extensions/llm/mime_type.rb +0 -75
  125. data/lib/legion/extensions/llm/model/info.rb +0 -286
  126. data/lib/legion/extensions/llm/model/modalities.rb +0 -26
  127. data/lib/legion/extensions/llm/model/pricing.rb +0 -52
  128. data/lib/legion/extensions/llm/model/pricing_category.rb +0 -50
  129. data/lib/legion/extensions/llm/model/pricing_tier.rb +0 -37
  130. data/lib/legion/extensions/llm/model.rb +0 -11
  131. data/lib/legion/extensions/llm/models.json +0 -57313
  132. data/lib/legion/extensions/llm/models.rb +0 -530
  133. data/lib/legion/extensions/llm/models_schema.json +0 -168
  134. data/lib/legion/extensions/llm/moderation.rb +0 -60
  135. data/lib/legion/extensions/llm/registry_event_builder.rb +0 -141
  136. data/lib/legion/extensions/llm/registry_publisher.rb +0 -107
  137. data/lib/legion/extensions/llm/responses/chat_response.rb +0 -43
  138. data/lib/legion/extensions/llm/responses/embedding_response.rb +0 -38
  139. data/lib/legion/extensions/llm/responses/stream_chunk.rb +0 -43
  140. data/lib/legion/extensions/llm/routing/lane_key.rb +0 -66
  141. data/lib/legion/extensions/llm/routing/model_offering.rb +0 -241
  142. data/lib/legion/extensions/llm/routing/offering_registry.rb +0 -101
  143. data/lib/legion/extensions/llm/routing/registry_event.rb +0 -167
  144. data/lib/legion/extensions/llm/thinking.rb +0 -53
  145. data/lib/legion/extensions/llm/tokens.rb +0 -51
  146. data/lib/legion/extensions/llm/tool_call.rb +0 -34
  147. data/lib/legion/extensions/llm/transcription.rb +0 -39
  148. data/lib/legion/extensions/llm/transport/messages/registry_event.rb +0 -44
  149. data/spec/legion/extensions/llm/agent_spec.rb +0 -179
  150. data/spec/legion/extensions/llm/attachment_spec.rb +0 -25
  151. data/spec/legion/extensions/llm/conformance/fixtures/ssot_identity_vectors.json +0 -84
  152. data/spec/legion/extensions/llm/context_spec.rb +0 -127
  153. data/spec/legion/extensions/llm/inventory/capabilities_spec.rb +0 -43
  154. data/spec/legion/extensions/llm/inventory/scoped_refresher_spec.rb +0 -337
  155. data/spec/legion/extensions/llm/message_spec.rb +0 -64
  156. data/spec/legion/extensions/llm/model/info_spec.rb +0 -222
  157. data/spec/legion/extensions/llm/models_spec.rb +0 -104
  158. data/spec/legion/extensions/llm/registry_event_builder_spec.rb +0 -68
  159. data/spec/legion/extensions/llm/registry_publisher_spec.rb +0 -22
  160. data/spec/legion/extensions/llm/responses/response_objects_spec.rb +0 -75
  161. data/spec/legion/extensions/llm/routing/model_offering_spec.rb +0 -281
  162. data/spec/legion/extensions/llm/routing/offering_registry_spec.rb +0 -50
  163. data/spec/legion/extensions/llm/routing/registry_event_spec.rb +0 -120
@@ -1,436 +0,0 @@
1
- {
2
- "claude-3-5-haiku": {
3
- "anthropic": "claude-3-5-haiku-20241022",
4
- "openrouter": "anthropic/claude-3.5-haiku",
5
- "bedrock": "anthropic.claude-3-5-haiku-20241022-v1:0"
6
- },
7
- "claude-3-5-haiku-latest": {
8
- "anthropic": "claude-3-5-haiku-latest"
9
- },
10
- "claude-3-5-sonnet": {
11
- "anthropic": "claude-3-5-sonnet-20241022",
12
- "bedrock": "anthropic.claude-3-5-sonnet-20241022-v2:0"
13
- },
14
- "claude-3-7-sonnet": {
15
- "anthropic": "claude-3-7-sonnet-20250219",
16
- "openrouter": "anthropic/claude-3.7-sonnet",
17
- "bedrock": "anthropic.claude-3-7-sonnet-20250219-v1:0"
18
- },
19
- "claude-3-haiku": {
20
- "anthropic": "claude-3-haiku-20240307",
21
- "openrouter": "anthropic/claude-3-haiku",
22
- "bedrock": "anthropic.claude-3-haiku-20240307-v1:0:200k"
23
- },
24
- "claude-3-opus": {
25
- "anthropic": "claude-3-opus-20240229"
26
- },
27
- "claude-3-sonnet": {
28
- "anthropic": "claude-3-sonnet-20240229",
29
- "bedrock": "anthropic.claude-3-sonnet-20240229-v1:0:200k"
30
- },
31
- "claude-haiku-4-5": {
32
- "anthropic": "claude-haiku-4-5-20251001",
33
- "openrouter": "anthropic/claude-haiku-4.5",
34
- "bedrock": "anthropic.claude-haiku-4-5-20251001-v1:0",
35
- "azure": "claude-haiku-4-5-20251001"
36
- },
37
- "claude-opus-4": {
38
- "anthropic": "claude-opus-4-20250514",
39
- "openrouter": "anthropic/claude-opus-4",
40
- "bedrock": "anthropic.claude-opus-4-1-20250805-v1:0"
41
- },
42
- "claude-opus-4-0": {
43
- "anthropic": "claude-opus-4-0"
44
- },
45
- "claude-opus-4-1": {
46
- "anthropic": "claude-opus-4-1-20250805",
47
- "openrouter": "anthropic/claude-opus-4.1",
48
- "bedrock": "anthropic.claude-opus-4-1-20250805-v1:0",
49
- "azure": "claude-opus-4-1-20250805"
50
- },
51
- "claude-opus-4-5": {
52
- "anthropic": "claude-opus-4-5-20251101",
53
- "openrouter": "anthropic/claude-opus-4.5",
54
- "bedrock": "anthropic.claude-opus-4-5-20251101-v1:0",
55
- "azure": "claude-opus-4-5-20251101"
56
- },
57
- "claude-opus-4-6": {
58
- "anthropic": "claude-opus-4-6",
59
- "openrouter": "anthropic/claude-opus-4.6",
60
- "bedrock": "anthropic.claude-opus-4-6-v1",
61
- "azure": "claude-opus-4-6"
62
- },
63
- "claude-sonnet-4": {
64
- "anthropic": "claude-sonnet-4-20250514",
65
- "openrouter": "anthropic/claude-sonnet-4",
66
- "bedrock": "anthropic.claude-sonnet-4-20250514-v1:0"
67
- },
68
- "claude-sonnet-4-0": {
69
- "anthropic": "claude-sonnet-4-0"
70
- },
71
- "claude-sonnet-4-5": {
72
- "anthropic": "claude-sonnet-4-5-20250929",
73
- "openrouter": "anthropic/claude-sonnet-4.5",
74
- "bedrock": "anthropic.claude-sonnet-4-5-20250929-v1:0",
75
- "azure": "claude-sonnet-4-5-20250929"
76
- },
77
- "claude-sonnet-4-6": {
78
- "anthropic": "claude-sonnet-4-6",
79
- "openrouter": "anthropic/claude-sonnet-4.6",
80
- "bedrock": "anthropic.claude-sonnet-4-6",
81
- "azure": "claude-sonnet-4-6"
82
- },
83
- "deepseek-chat": {
84
- "deepseek": "deepseek-chat",
85
- "openrouter": "deepseek/deepseek-chat"
86
- },
87
- "gemini-1.5-flash": {
88
- "gemini": "gemini-1.5-flash",
89
- "vertexai": "gemini-1.5-flash"
90
- },
91
- "gemini-1.5-flash-8b": {
92
- "gemini": "gemini-1.5-flash-8b",
93
- "vertexai": "gemini-1.5-flash-8b"
94
- },
95
- "gemini-1.5-pro": {
96
- "gemini": "gemini-1.5-pro",
97
- "vertexai": "gemini-1.5-pro"
98
- },
99
- "gemini-2.0-flash": {
100
- "gemini": "gemini-2.0-flash",
101
- "vertexai": "gemini-2.0-flash"
102
- },
103
- "gemini-2.0-flash-001": {
104
- "gemini": "gemini-2.0-flash-001",
105
- "openrouter": "google/gemini-2.0-flash-001",
106
- "vertexai": "gemini-2.0-flash-001"
107
- },
108
- "gemini-2.0-flash-lite": {
109
- "gemini": "gemini-2.0-flash-lite",
110
- "vertexai": "gemini-2.0-flash-lite"
111
- },
112
- "gemini-2.0-flash-lite-001": {
113
- "gemini": "gemini-2.0-flash-lite-001",
114
- "openrouter": "google/gemini-2.0-flash-lite-001",
115
- "vertexai": "gemini-2.0-flash-lite-001"
116
- },
117
- "gemini-2.5-flash": {
118
- "gemini": "gemini-2.5-flash",
119
- "openrouter": "google/gemini-2.5-flash",
120
- "vertexai": "gemini-2.5-flash"
121
- },
122
- "gemini-2.5-flash-image": {
123
- "gemini": "gemini-2.5-flash-image",
124
- "openrouter": "google/gemini-2.5-flash-image"
125
- },
126
- "gemini-2.5-flash-lite": {
127
- "gemini": "gemini-2.5-flash-lite",
128
- "openrouter": "google/gemini-2.5-flash-lite",
129
- "vertexai": "gemini-2.5-flash-lite"
130
- },
131
- "gemini-2.5-flash-lite-preview-06-17": {
132
- "gemini": "gemini-2.5-flash-lite-preview-06-17",
133
- "vertexai": "gemini-2.5-flash-lite-preview-06-17"
134
- },
135
- "gemini-2.5-flash-lite-preview-09-2025": {
136
- "gemini": "gemini-2.5-flash-lite-preview-09-2025",
137
- "openrouter": "google/gemini-2.5-flash-lite-preview-09-2025",
138
- "vertexai": "gemini-2.5-flash-lite-preview-09-2025"
139
- },
140
- "gemini-2.5-flash-preview-04-17": {
141
- "gemini": "gemini-2.5-flash-preview-04-17",
142
- "vertexai": "gemini-2.5-flash-preview-04-17"
143
- },
144
- "gemini-2.5-flash-preview-05-20": {
145
- "gemini": "gemini-2.5-flash-preview-05-20",
146
- "vertexai": "gemini-2.5-flash-preview-05-20"
147
- },
148
- "gemini-2.5-flash-preview-09-2025": {
149
- "gemini": "gemini-2.5-flash-preview-09-2025",
150
- "openrouter": "google/gemini-2.5-flash-preview-09-2025",
151
- "vertexai": "gemini-2.5-flash-preview-09-2025"
152
- },
153
- "gemini-2.5-pro": {
154
- "gemini": "gemini-2.5-pro",
155
- "openrouter": "google/gemini-2.5-pro",
156
- "vertexai": "gemini-2.5-pro"
157
- },
158
- "gemini-2.5-pro-preview-05-06": {
159
- "gemini": "gemini-2.5-pro-preview-05-06",
160
- "openrouter": "google/gemini-2.5-pro-preview-05-06",
161
- "vertexai": "gemini-2.5-pro-preview-05-06"
162
- },
163
- "gemini-2.5-pro-preview-06-05": {
164
- "gemini": "gemini-2.5-pro-preview-06-05",
165
- "openrouter": "google/gemini-2.5-pro-preview-06-05",
166
- "vertexai": "gemini-2.5-pro-preview-06-05"
167
- },
168
- "gemini-3-flash-preview": {
169
- "gemini": "gemini-3-flash-preview",
170
- "openrouter": "google/gemini-3-flash-preview",
171
- "vertexai": "gemini-3-flash-preview"
172
- },
173
- "gemini-3-pro-image-preview": {
174
- "gemini": "gemini-3-pro-image-preview",
175
- "openrouter": "google/gemini-3-pro-image-preview"
176
- },
177
- "gemini-3-pro-preview": {
178
- "gemini": "gemini-3-pro-preview",
179
- "openrouter": "google/gemini-3-pro-preview",
180
- "vertexai": "gemini-3-pro-preview"
181
- },
182
- "gemini-3.1-flash-image-preview": {
183
- "gemini": "gemini-3.1-flash-image-preview",
184
- "openrouter": "google/gemini-3.1-flash-image-preview",
185
- "vertexai": "gemini-3.1-flash-image-preview"
186
- },
187
- "gemini-3.1-flash-lite-preview": {
188
- "gemini": "gemini-3.1-flash-lite-preview",
189
- "openrouter": "google/gemini-3.1-flash-lite-preview",
190
- "vertexai": "gemini-3.1-flash-lite-preview"
191
- },
192
- "gemini-3.1-pro-preview": {
193
- "gemini": "gemini-3.1-pro-preview",
194
- "openrouter": "google/gemini-3.1-pro-preview",
195
- "vertexai": "gemini-3.1-pro-preview"
196
- },
197
- "gemini-3.1-pro-preview-customtools": {
198
- "gemini": "gemini-3.1-pro-preview-customtools",
199
- "openrouter": "google/gemini-3.1-pro-preview-customtools",
200
- "vertexai": "gemini-3.1-pro-preview-customtools"
201
- },
202
- "gemini-embedding-001": {
203
- "gemini": "gemini-embedding-001",
204
- "vertexai": "gemini-embedding-001"
205
- },
206
- "gemini-flash": {
207
- "gemini": "gemini-flash-latest",
208
- "vertexai": "gemini-flash-latest"
209
- },
210
- "gemini-flash-lite": {
211
- "gemini": "gemini-flash-lite-latest",
212
- "vertexai": "gemini-flash-lite-latest"
213
- },
214
- "gemma-3-12b-it": {
215
- "gemini": "gemma-3-12b-it",
216
- "openrouter": "google/gemma-3-12b-it"
217
- },
218
- "gemma-3-27b-it": {
219
- "gemini": "gemma-3-27b-it",
220
- "openrouter": "google/gemma-3-27b-it"
221
- },
222
- "gemma-3-4b-it": {
223
- "gemini": "gemma-3-4b-it",
224
- "openrouter": "google/gemma-3-4b-it"
225
- },
226
- "gemma-3n-e4b-it": {
227
- "gemini": "gemma-3n-e4b-it",
228
- "openrouter": "google/gemma-3n-e4b-it"
229
- },
230
- "gemma-4-26b-a4b-it": {
231
- "gemini": "gemma-4-26b-a4b-it",
232
- "openrouter": "google/gemma-4-26b-a4b-it"
233
- },
234
- "gemma-4-31b-it": {
235
- "gemini": "gemma-4-31b-it",
236
- "openrouter": "google/gemma-4-31b-it"
237
- },
238
- "gpt-3.5-turbo": {
239
- "openai": "gpt-3.5-turbo",
240
- "openrouter": "openai/gpt-3.5-turbo"
241
- },
242
- "gpt-3.5-turbo-16k": {
243
- "openai": "gpt-3.5-turbo-16k",
244
- "openrouter": "openai/gpt-3.5-turbo-16k"
245
- },
246
- "gpt-3.5-turbo-instruct": {
247
- "openai": "gpt-3.5-turbo-instruct",
248
- "openrouter": "openai/gpt-3.5-turbo-instruct"
249
- },
250
- "gpt-4": {
251
- "openai": "gpt-4",
252
- "openrouter": "openai/gpt-4",
253
- "azure": "gpt-4"
254
- },
255
- "gpt-4-turbo": {
256
- "openai": "gpt-4-turbo",
257
- "openrouter": "openai/gpt-4-turbo"
258
- },
259
- "gpt-4.1": {
260
- "openai": "gpt-4.1",
261
- "openrouter": "openai/gpt-4.1",
262
- "azure": "gpt-4.1"
263
- },
264
- "gpt-4.1-mini": {
265
- "openai": "gpt-4.1-mini",
266
- "openrouter": "openai/gpt-4.1-mini",
267
- "azure": "gpt-4.1-mini"
268
- },
269
- "gpt-4.1-nano": {
270
- "openai": "gpt-4.1-nano",
271
- "openrouter": "openai/gpt-4.1-nano",
272
- "azure": "gpt-4.1-nano"
273
- },
274
- "gpt-4o": {
275
- "openai": "gpt-4o",
276
- "openrouter": "openai/gpt-4o",
277
- "azure": "gpt-4o"
278
- },
279
- "gpt-4o-2024-05-13": {
280
- "openai": "gpt-4o-2024-05-13",
281
- "openrouter": "openai/gpt-4o-2024-05-13",
282
- "azure": "gpt-4o-2024-05-13"
283
- },
284
- "gpt-4o-2024-08-06": {
285
- "openai": "gpt-4o-2024-08-06",
286
- "openrouter": "openai/gpt-4o-2024-08-06",
287
- "azure": "gpt-4o-2024-08-06"
288
- },
289
- "gpt-4o-2024-11-20": {
290
- "openai": "gpt-4o-2024-11-20",
291
- "openrouter": "openai/gpt-4o-2024-11-20",
292
- "azure": "gpt-4o-2024-11-20"
293
- },
294
- "gpt-4o-audio-preview": {
295
- "openai": "gpt-4o-audio-preview",
296
- "openrouter": "openai/gpt-4o-audio-preview"
297
- },
298
- "gpt-4o-mini": {
299
- "openai": "gpt-4o-mini",
300
- "openrouter": "openai/gpt-4o-mini",
301
- "azure": "gpt-4o-mini"
302
- },
303
- "gpt-4o-mini-2024-07-18": {
304
- "openai": "gpt-4o-mini-2024-07-18",
305
- "openrouter": "openai/gpt-4o-mini-2024-07-18",
306
- "azure": "gpt-4o-mini-2024-07-18"
307
- },
308
- "gpt-4o-mini-search-preview": {
309
- "openai": "gpt-4o-mini-search-preview",
310
- "openrouter": "openai/gpt-4o-mini-search-preview"
311
- },
312
- "gpt-4o-search-preview": {
313
- "openai": "gpt-4o-search-preview",
314
- "openrouter": "openai/gpt-4o-search-preview"
315
- },
316
- "gpt-5": {
317
- "openai": "gpt-5",
318
- "openrouter": "openai/gpt-5"
319
- },
320
- "gpt-5-codex": {
321
- "openai": "gpt-5-codex",
322
- "openrouter": "openai/gpt-5-codex"
323
- },
324
- "gpt-5-mini": {
325
- "openai": "gpt-5-mini",
326
- "openrouter": "openai/gpt-5-mini"
327
- },
328
- "gpt-5-nano": {
329
- "openai": "gpt-5-nano",
330
- "openrouter": "openai/gpt-5-nano"
331
- },
332
- "gpt-5-pro": {
333
- "openai": "gpt-5-pro",
334
- "openrouter": "openai/gpt-5-pro"
335
- },
336
- "gpt-5.1": {
337
- "openai": "gpt-5.1",
338
- "openrouter": "openai/gpt-5.1",
339
- "azure": "gpt-5.1"
340
- },
341
- "gpt-5.1-codex": {
342
- "openai": "gpt-5.1-codex",
343
- "openrouter": "openai/gpt-5.1-codex"
344
- },
345
- "gpt-5.1-codex-max": {
346
- "openai": "gpt-5.1-codex-max",
347
- "openrouter": "openai/gpt-5.1-codex-max"
348
- },
349
- "gpt-5.1-codex-mini": {
350
- "openai": "gpt-5.1-codex-mini",
351
- "openrouter": "openai/gpt-5.1-codex-mini"
352
- },
353
- "gpt-5.2": {
354
- "openai": "gpt-5.2",
355
- "openrouter": "openai/gpt-5.2"
356
- },
357
- "gpt-5.2-codex": {
358
- "openai": "gpt-5.2-codex",
359
- "openrouter": "openai/gpt-5.2-codex"
360
- },
361
- "gpt-5.2-pro": {
362
- "openai": "gpt-5.2-pro",
363
- "openrouter": "openai/gpt-5.2-pro"
364
- },
365
- "gpt-5.3-codex": {
366
- "openai": "gpt-5.3-codex",
367
- "openrouter": "openai/gpt-5.3-codex"
368
- },
369
- "gpt-5.4": {
370
- "openai": "gpt-5.4",
371
- "openrouter": "openai/gpt-5.4"
372
- },
373
- "gpt-5.4-mini": {
374
- "openai": "gpt-5.4-mini",
375
- "openrouter": "openai/gpt-5.4-mini"
376
- },
377
- "gpt-5.4-nano": {
378
- "openai": "gpt-5.4-nano",
379
- "openrouter": "openai/gpt-5.4-nano"
380
- },
381
- "gpt-5.4-pro": {
382
- "openai": "gpt-5.4-pro",
383
- "openrouter": "openai/gpt-5.4-pro"
384
- },
385
- "gpt-audio": {
386
- "openai": "gpt-audio",
387
- "openrouter": "openai/gpt-audio"
388
- },
389
- "gpt-audio-mini": {
390
- "openai": "gpt-audio-mini",
391
- "openrouter": "openai/gpt-audio-mini"
392
- },
393
- "lyria-3-clip-preview": {
394
- "gemini": "lyria-3-clip-preview",
395
- "openrouter": "google/lyria-3-clip-preview"
396
- },
397
- "lyria-3-pro-preview": {
398
- "gemini": "lyria-3-pro-preview",
399
- "openrouter": "google/lyria-3-pro-preview"
400
- },
401
- "o1": {
402
- "openai": "o1",
403
- "openrouter": "openai/o1"
404
- },
405
- "o1-pro": {
406
- "openai": "o1-pro",
407
- "openrouter": "openai/o1-pro",
408
- "azure": "o1-pro"
409
- },
410
- "o3": {
411
- "openai": "o3",
412
- "openrouter": "openai/o3"
413
- },
414
- "o3-deep-research": {
415
- "openai": "o3-deep-research",
416
- "openrouter": "openai/o3-deep-research"
417
- },
418
- "o3-mini": {
419
- "openai": "o3-mini",
420
- "openrouter": "openai/o3-mini",
421
- "azure": "o3-mini"
422
- },
423
- "o3-pro": {
424
- "openai": "o3-pro",
425
- "openrouter": "openai/o3-pro"
426
- },
427
- "o4-mini": {
428
- "openai": "o4-mini",
429
- "openrouter": "openai/o4-mini",
430
- "azure": "o4-mini"
431
- },
432
- "o4-mini-deep-research": {
433
- "openai": "o4-mini-deep-research",
434
- "openrouter": "openai/o4-mini-deep-research"
435
- }
436
- }
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Legion
4
- module Extensions
5
- module Llm
6
- # Manages model aliases for provider-specific versions
7
- class Aliases
8
- class << self
9
- def resolve(model_id, provider = nil)
10
- return model_id unless aliases[model_id]
11
-
12
- if provider
13
- aliases[model_id][provider.to_s] || model_id
14
- else
15
- aliases[model_id].values.first || model_id
16
- end
17
- end
18
-
19
- def normalize_model_alias(model_id)
20
- model_id.to_s.strip
21
- end
22
-
23
- def canonical_model_alias(model_id, provider = nil)
24
- normalized = normalize_model_alias(model_id)
25
- provider_name = provider&.to_s
26
-
27
- aliases.each do |alias_name, provider_map|
28
- next unless alias_matches?(provider_map, normalized, provider_name)
29
-
30
- return alias_name
31
- end
32
-
33
- normalized
34
- end
35
-
36
- def aliases
37
- @aliases ||= load_aliases
38
- end
39
-
40
- def aliases_file
41
- File.expand_path('aliases.json', __dir__)
42
- end
43
-
44
- def load_aliases
45
- if File.exist?(aliases_file)
46
- Legion::JSON.parse(File.read(aliases_file), symbolize_names: false)
47
- else
48
- {}
49
- end
50
- end
51
-
52
- def reload!
53
- @aliases = load_aliases
54
- end
55
-
56
- private
57
-
58
- def alias_matches?(provider_map, model_id, provider)
59
- return provider_map[provider] == model_id if provider
60
-
61
- provider_map.value?(model_id)
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end