File size: 3,298 Bytes
1397957
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
05e2037
 
1397957
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
"""Configuration management for OpenCode API"""

from typing import Optional, Dict, Any, List
from pydantic import BaseModel, Field
from pydantic_settings import BaseSettings
import os


class ProviderConfig(BaseModel):
    """Configuration for a single LLM provider"""
    api_key: Optional[str] = None
    base_url: Optional[str] = None
    options: Dict[str, Any] = Field(default_factory=dict)


class ModelConfig(BaseModel):
    provider_id: str = "blablador"
    model_id: str = "alias-large"


class Settings(BaseSettings):
    """Application settings loaded from environment"""
    
    # Server settings
    host: str = "0.0.0.0"
    port: int = 7860
    debug: bool = False
    
    # Default model
    default_provider: str = "blablador"
    default_model: str = "alias-large"
    
    # API Keys (loaded from environment)
    anthropic_api_key: Optional[str] = Field(default=None, alias="ANTHROPIC_API_KEY")
    openai_api_key: Optional[str] = Field(default=None, alias="OPENAI_API_KEY")
    google_api_key: Optional[str] = Field(default=None, alias="GOOGLE_API_KEY")
    blablador_api_key: Optional[str] = Field(default=None, alias="BLABLADOR_API_KEY")
    
    # Storage
    storage_path: str = Field(default="/app", alias="OPENCODE_STORAGE_PATH")
    
    # Security
    server_password: Optional[str] = Field(default=None, alias="OPENCODE_SERVER_PASSWORD")
    token: Optional[str] = Field(default=None, alias="TOKEN")
    
    # Supabase
    supabase_url: Optional[str] = Field(default=None, alias="NEXT_PUBLIC_SUPABASE_URL")
    supabase_anon_key: Optional[str] = Field(default=None, alias="NEXT_PUBLIC_SUPABASE_ANON_KEY")
    supabase_service_key: Optional[str] = Field(default=None, alias="SUPABASE_SERVICE_ROLE_KEY")
    supabase_jwt_secret: Optional[str] = Field(default=None, alias="SUPABASE_JWT_SECRET")
    
    class Config:
        env_file = ".env"
        env_file_encoding = "utf-8"
        extra = "ignore"


class Config(BaseModel):
    """Runtime configuration"""
    
    model: ModelConfig = Field(default_factory=ModelConfig)
    providers: Dict[str, ProviderConfig] = Field(default_factory=dict)
    disabled_providers: List[str] = Field(default_factory=list)
    enabled_providers: Optional[List[str]] = None
    
    @classmethod
    def get(cls) -> "Config":
        """Get the current configuration"""
        return _config
    
    @classmethod
    def update(cls, updates: Dict[str, Any]) -> "Config":
        """Update configuration"""
        global _config
        data = _config.model_dump()
        data.update(updates)
        _config = Config(**data)
        return _config


# Global instances
settings = Settings()
_config = Config()


def get_api_key(provider_id: str) -> Optional[str]:
    """Get API key for a provider from settings or config"""
    # Check environment-based settings first
    key_map = {
        "anthropic": settings.anthropic_api_key,
        "openai": settings.openai_api_key,
        "google": settings.google_api_key,
        "blablador": settings.blablador_api_key,
    }
    
    if provider_id in key_map:
        return key_map[provider_id]
    
    # Check provider config
    provider_config = _config.providers.get(provider_id)
    if provider_config:
        return provider_config.api_key
    
    return None