|
201 | 201 | (merge model-base |
202 | 202 | {:model-name "gemini-3.1-pro-preview"}) |
203 | 203 |
|
| 204 | + ;; Mistral Models (via OpenAI-compatible API) |
| 205 | + :mistral/mistral-large |
| 206 | + (merge model-base |
| 207 | + {:provider :openai |
| 208 | + :model-name "mistral-large-latest" |
| 209 | + :base-url "https://api.mistral.ai/v1"}) |
| 210 | + |
| 211 | + :mistral/mistral-medium |
| 212 | + (merge model-base |
| 213 | + {:provider :openai |
| 214 | + :model-name "mistral-medium-latest" |
| 215 | + :base-url "https://api.mistral.ai/v1"}) |
| 216 | + |
| 217 | + :mistral/mistral-small |
| 218 | + (merge model-base |
| 219 | + {:provider :openai |
| 220 | + :model-name "mistral-small-latest" |
| 221 | + :base-url "https://api.mistral.ai/v1"}) |
| 222 | + |
| 223 | + :mistral/codestral |
| 224 | + (merge model-base |
| 225 | + {:provider :openai |
| 226 | + :model-name "codestral-latest" |
| 227 | + :base-url "https://api.mistral.ai/v1"}) |
| 228 | + |
| 229 | + :mistral/devstral |
| 230 | + (merge model-base |
| 231 | + {:provider :openai |
| 232 | + :model-name "devstral-2-25-12" |
| 233 | + :base-url "https://api.mistral.ai/v1"}) |
| 234 | + |
| 235 | + :mistral/magistral-medium |
| 236 | + (merge reasoning-model-base |
| 237 | + {:provider :openai |
| 238 | + :model-name "magistral-medium-latest" |
| 239 | + :base-url "https://api.mistral.ai/v1"}) |
| 240 | + |
| 241 | + :mistral/magistral-small |
| 242 | + (merge reasoning-model-base |
| 243 | + {:provider :openai |
| 244 | + :model-name "magistral-small-latest" |
| 245 | + :base-url "https://api.mistral.ai/v1"}) |
| 246 | + |
204 | 247 | ;; Anthropic Models |
205 | 248 | :anthropic/claude-opus-4-1 |
206 | 249 | (merge model-base |
|
313 | 356 | :codex :openai/gpt-5-4-pro |
314 | 357 | :gpt-5-1-codex :openai/gpt-5-1-codex |
315 | 358 | :gpt-5-1-codex-max :openai/gpt-5-1-codex-max |
316 | | - :gpt-5-2-codex :openai/gpt-5-2-codex}) |
| 359 | + :gpt-5-2-codex :openai/gpt-5-2-codex |
| 360 | + ;; Mistral aliases |
| 361 | + :mistral :mistral/mistral-large |
| 362 | + :mistral-large :mistral/mistral-large |
| 363 | + :mistral-medium :mistral/mistral-medium |
| 364 | + :mistral-small :mistral/mistral-small |
| 365 | + :codestral :mistral/codestral |
| 366 | + :devstral :mistral/devstral |
| 367 | + :magistral :mistral/magistral-medium |
| 368 | + :magistral-medium :mistral/magistral-medium |
| 369 | + :magistral-small :mistral/magistral-small}) |
317 | 370 |
|
318 | 371 | (defn resolve-model-alias |
319 | 372 | "Resolves a model key, checking aliases for unnamespaced keywords. |
|
376 | 429 | ;; Return other values as-is |
377 | 430 | :else config)) |
378 | 431 |
|
| 432 | +(def api-key-env-mapping |
| 433 | + "Maps provider/namespace keywords to environment variable names for API keys." |
| 434 | + {:openai "OPENAI_API_KEY" |
| 435 | + :google "GEMINI_API_KEY" |
| 436 | + :anthropic "ANTHROPIC_API_KEY" |
| 437 | + :mistral "MISTRAL_API_KEY"}) |
| 438 | + |
379 | 439 | (defn- ensure-api-key |
380 | | - "Ensures API key is present, getting from environment if needed" |
381 | | - [config provider] |
382 | | - (if (:api-key config) |
383 | | - config |
384 | | - (let [env-key-mapping {:openai "OPENAI_API_KEY" |
385 | | - :google "GEMINI_API_KEY" |
386 | | - :anthropic "ANTHROPIC_API_KEY"} |
387 | | - env-key (get env-key-mapping provider)] |
388 | | - (if-let [api-key (and env-key (get-env env-key))] |
389 | | - (assoc config :api-key api-key) |
390 | | - config)))) |
| 440 | + "Ensures API key is present, getting from environment if needed. |
| 441 | + Checks the model-key namespace first (e.g. :mistral -> MISTRAL_API_KEY), |
| 442 | + then falls back to the provider (e.g. :openai -> OPENAI_API_KEY)." |
| 443 | + ([config provider] |
| 444 | + (ensure-api-key config provider nil)) |
| 445 | + ([config provider model-key-ns] |
| 446 | + (if (:api-key config) |
| 447 | + config |
| 448 | + ;; Try namespace-specific env var first, then provider env var |
| 449 | + (let [ns-env-key (get api-key-env-mapping model-key-ns) |
| 450 | + provider-env-key (get api-key-env-mapping provider) |
| 451 | + api-key (or (and ns-env-key (get-env ns-env-key)) |
| 452 | + (and provider-env-key (get-env provider-env-key)))] |
| 453 | + (if api-key |
| 454 | + (assoc config :api-key api-key) |
| 455 | + config))))) |
391 | 456 |
|
392 | 457 | (defn- ensure-provider |
393 | 458 | "Ensures provider is present in config, extracting from model-key if needed. |
|
564 | 629 | config (-> base-config |
565 | 630 | (resolve-env-refs) ; Also resolve any env refs from defaults |
566 | 631 | (ensure-provider model-key) |
567 | | - (as-> cfg (ensure-api-key cfg (:provider cfg))))] |
| 632 | + (as-> cfg (ensure-api-key cfg (:provider cfg) (some-> model-key namespace keyword))))] |
568 | 633 | ;; Validate if requested |
569 | 634 | (when validate? |
570 | 635 | (schema/validate-model-key model-key) |
|
673 | 738 | ;; Extract provider for API key |
674 | 739 | provider (:provider config-with-provider) |
675 | 740 | ;; Ensure API key |
676 | | - final-config (ensure-api-key config-with-provider provider)] |
| 741 | + final-config (ensure-api-key config-with-provider provider (some-> model-key namespace keyword))] |
677 | 742 | ;; Validate if requested |
678 | 743 | (when validate? |
679 | 744 | (schema/validate-model-key model-key) |
|
0 commit comments