from __future__ import annotations import os from dataclasses import dataclass from typing import Literal ProviderKind = Literal["ollama", "openrouter", "local"] @dataclass class ProviderConfig: kind: ProviderKind = "openrouter" ollama_base_url: str = "http://192.168.0.50:11434" ollama_model: str = "gemma2:9b" openrouter_api_key: str = "" openrouter_model: str = "openrouter/free" openrouter_key_env: str = "DCC_OPENROUTER_KEY" openrouter_free_fallback: bool = True local_base_url: str = "https://opencode.ai/zen/go/v1" local_api_key: str = "" local_model: str = "deepseek-v4-flash" local_fallback_url: str = "https://opencode.ai/zen/v1" local_fallback_model: str = "big-pickle" timeout: int = 120 def load_from_env() -> ProviderConfig: return ProviderConfig( kind=os.getenv("DCC_LLM_PROVIDER", "local"), # type: ignore ollama_base_url=os.getenv("DCC_OLLAMA_URL", "http://192.168.0.50:11434"), ollama_model=os.getenv("DCC_OLLAMA_MODEL", "gemma2:9b"), openrouter_api_key=os.getenv("DCC_OPENROUTER_KEY", os.getenv("OPENROUTER_API_KEY", "")), openrouter_model=os.getenv("DCC_OPENROUTER_MODEL", "openrouter/free"), openrouter_free_fallback=os.getenv("DCC_OR_FREE_FALLBACK", "1") == "1", local_base_url=os.getenv("DCC_LOCAL_URL", "https://opencode.ai/zen/v1"), local_api_key=os.getenv("DCC_LOCAL_KEY", ""), local_model=os.getenv("DCC_LOCAL_MODEL", "big-pickle"), local_fallback_url=os.getenv("DCC_LOCAL_FALLBACK_URL", "https://opencode.ai/zen/go/v1"), local_fallback_model=os.getenv("DCC_LOCAL_FALLBACK_MODEL", "deepseek-v4-flash"), timeout=int(os.getenv("DCC_LLM_TIMEOUT", "120")), )