from pydantic import BaseModel, Field, validator from typing import Optional import os class OllamaConfig(BaseModel): """Ollama配置验证""" base_url: str = Field(default="http://localhost:11434") model_name: str = Field(default="qwen2.5:latest") temperature: float = Field(default=0.7, ge=0.0, le=1.0) max_tokens: int = Field(default=2048, gt=0) class FlaskConfig(BaseModel): """Flask配置验证""" host: str = Field(default="0.0.0.0") port: int = Field(default=5000, gt=0, lt=65536) debug: bool = Field(default=False) api_prefix: str = Field(default="/api/v1") class Config(BaseModel): """应用配置验证""" ollama: OllamaConfig = Field(default_factory=OllamaConfig) flask: FlaskConfig = Field(default_factory=FlaskConfig) @validator('ollama.base_url') def validate_base_url(cls, v): if not v.startswith(('http://', 'https://')): raise ValueError('base_url must start with http:// or https://') return v @validator('flask.api_prefix') def validate_api_prefix(cls, v): if not v.startswith('/'): raise ValueError('api_prefix must start with /') return v def validate_config() -> Config: """验证并返回配置""" try: config = Config( ollama=OllamaConfig( base_url=os.getenv("OLLAMA_BASE_URL", "http://localhost:11434"), model_name=os.getenv("DEFAULT_MODEL", "qwen2.5:latest"), temperature=float(os.getenv("TEMPERATURE", "0.7")), max_tokens=int(os.getenv("MAX_TOKENS", "2048")) ), flask=FlaskConfig( host=os.getenv("FLASK_HOST", "0.0.0.0"), port=int(os.getenv("FLASK_PORT", "5000")), debug=os.getenv("FLASK_DEBUG", "False").lower() == "true", api_prefix=os.getenv("API_PREFIX", "/api/v1") ) ) return config except Exception as e: raise ValueError(f"配置验证失败: {str(e)}")