|
20 | 20 | classify_model_type, |
21 | 21 | fetch_anthropic_model_ids, |
22 | 22 | ) |
| 23 | +from open_notebook.ai.provider_registry import PROVIDERS |
23 | 24 | from open_notebook.domain.credential import Credential |
24 | 25 | from open_notebook.utils.encryption import get_secret_from_env |
25 | 26 | from open_notebook.utils.url_validation import validate_url |
|
28 | 29 | # Constants |
29 | 30 | # ============================================================================= |
30 | 31 |
|
31 | | -# Provider environment variable configuration. |
| 32 | +# Provider environment variable configuration, derived from the provider |
| 33 | +# registry (open_notebook/ai/provider_registry.py — the source of truth). |
32 | 34 | # - "required": ALL listed env vars must be set for the provider to be considered configured. |
33 | 35 | # - "required_any": at least ONE of the listed env vars must be set. |
34 | 36 | # - "optional": additional env vars used during migration but not required. |
35 | 37 | PROVIDER_ENV_CONFIG: Dict[str, dict] = { |
36 | | - "openai": {"required": ["OPENAI_API_KEY"]}, |
37 | | - "anthropic": {"required": ["ANTHROPIC_API_KEY"]}, |
38 | | - "google": {"required_any": ["GOOGLE_API_KEY", "GEMINI_API_KEY"]}, |
39 | | - "groq": {"required": ["GROQ_API_KEY"]}, |
40 | | - "mistral": {"required": ["MISTRAL_API_KEY"]}, |
41 | | - "deepseek": {"required": ["DEEPSEEK_API_KEY"]}, |
42 | | - "xai": {"required": ["XAI_API_KEY"]}, |
43 | | - "openrouter": {"required": ["OPENROUTER_API_KEY"]}, |
44 | | - "voyage": {"required": ["VOYAGE_API_KEY"]}, |
45 | | - "elevenlabs": {"required": ["ELEVENLABS_API_KEY"]}, |
46 | | - "deepgram": {"required": ["DEEPGRAM_API_KEY"]}, |
47 | | - "ollama": {"required": ["OLLAMA_API_BASE"]}, |
48 | | - "vertex": { |
49 | | - "required": ["VERTEX_PROJECT", "VERTEX_LOCATION"], |
50 | | - "optional": ["GOOGLE_APPLICATION_CREDENTIALS"], |
51 | | - }, |
52 | | - "azure": { |
53 | | - "required": ["AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT", "AZURE_OPENAI_API_VERSION"], |
54 | | - "optional": [ |
55 | | - "AZURE_OPENAI_ENDPOINT_LLM", |
56 | | - "AZURE_OPENAI_ENDPOINT_EMBEDDING", |
57 | | - "AZURE_OPENAI_ENDPOINT_STT", |
58 | | - "AZURE_OPENAI_ENDPOINT_TTS", |
59 | | - ], |
60 | | - }, |
61 | | - "openai_compatible": { |
62 | | - "required_any": ["OPENAI_COMPATIBLE_BASE_URL", "OPENAI_COMPATIBLE_API_KEY"], |
63 | | - }, |
64 | | - "dashscope": {"required": ["DASHSCOPE_API_KEY"]}, |
65 | | - "minimax": {"required": ["MINIMAX_API_KEY"]}, |
| 38 | + name: spec.env_config() for name, spec in PROVIDERS.items() |
66 | 39 | } |
67 | 40 |
|
68 | 41 | PROVIDER_MODALITIES: Dict[str, List[str]] = { |
69 | | - "openai": ["language", "embedding", "speech_to_text", "text_to_speech"], |
70 | | - "anthropic": ["language"], |
71 | | - "google": ["language", "embedding", "speech_to_text", "text_to_speech"], |
72 | | - "groq": ["language", "speech_to_text"], |
73 | | - "mistral": ["language", "embedding", "speech_to_text", "text_to_speech"], |
74 | | - "deepseek": ["language"], |
75 | | - "xai": ["language", "text_to_speech"], |
76 | | - "openrouter": ["language", "embedding"], |
77 | | - "voyage": ["embedding"], |
78 | | - "elevenlabs": ["text_to_speech", "speech_to_text"], |
79 | | - "deepgram": ["text_to_speech"], |
80 | | - "ollama": ["language", "embedding"], |
81 | | - "vertex": ["language", "embedding", "text_to_speech"], |
82 | | - "azure": ["language", "embedding", "speech_to_text", "text_to_speech"], |
83 | | - "openai_compatible": ["language", "embedding", "speech_to_text", "text_to_speech"], |
84 | | - "dashscope": ["language"], |
85 | | - "minimax": ["language"], |
| 42 | + name: list(spec.modalities) for name, spec in PROVIDERS.items() |
86 | 43 | } |
87 | 44 |
|
88 | 45 |
|
@@ -426,16 +383,11 @@ def models_endpoint(url: str) -> str: |
426 | 383 | model_names = list(ANTHROPIC_FALLBACK_MODELS) |
427 | 384 | return [{"name": m, "provider": "anthropic"} for m in model_names] |
428 | 385 |
|
429 | | - # API-based discovery URLs (OpenAI-style /models endpoints) |
| 386 | + # API-based discovery URLs (OpenAI-style /models endpoints), from the registry |
430 | 387 | url_map = { |
431 | | - "openai": "https://api.openai.com/v1/models", |
432 | | - "groq": "https://api.groq.com/openai/v1/models", |
433 | | - "mistral": "https://api.mistral.ai/v1/models", |
434 | | - "deepseek": "https://api.deepseek.com/models", |
435 | | - "xai": "https://api.x.ai/v1/models", |
436 | | - "openrouter": "https://openrouter.ai/api/v1/models", |
437 | | - "dashscope": "https://dashscope.aliyuncs.com/compatible-mode/v1/models", |
438 | | - "minimax": "https://api.minimax.io/v1/models", |
| 388 | + name: spec.openai_compat_discovery_url |
| 389 | + for name, spec in PROVIDERS.items() |
| 390 | + if spec.openai_compat_discovery_url |
439 | 391 | } |
440 | 392 |
|
441 | 393 | if provider == "ollama": |
|
0 commit comments