Coverage for packages/core/src/langgate/core/schemas/config.py: 95%
42 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-04-09 21:23 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-04-09 21:23 +0000
1"""Schema definitions for YAML configuration validation."""
3from typing import Any
5from pydantic import BaseModel, ConfigDict, Field, SecretStr, field_validator
7from langgate.core.fields import UrlOrEnvVar
10class ServiceModelPatternConfig(BaseModel):
11 """Configuration for model pattern matching within a service."""
13 default_params: dict[str, Any] = Field(default_factory=dict)
14 override_params: dict[str, Any] = Field(default_factory=dict)
15 remove_params: list[str] = Field(default_factory=list)
16 rename_params: dict[str, str] = Field(default_factory=dict)
19class ServiceConfig(BaseModel):
20 """Configuration for a service provider."""
22 api_key: str | SecretStr
23 base_url: UrlOrEnvVar | None = None
24 default_params: dict[str, Any] = Field(default_factory=dict)
25 override_params: dict[str, Any] = Field(default_factory=dict)
26 remove_params: list[str] = Field(default_factory=list)
27 rename_params: dict[str, str] = Field(default_factory=dict)
28 model_patterns: dict[str, ServiceModelPatternConfig] = Field(default_factory=dict)
30 model_config = ConfigDict(extra="allow")
32 @field_validator("api_key")
33 def validate_api_key(cls, v):
34 """Convert string API keys to SecretStr."""
35 if isinstance(v, str):
36 # Keep environment variable references as strings
37 if v.startswith("${") and v.endswith("}"):
38 return v
39 return SecretStr(v)
40 return v
43class ModelServiceConfig(BaseModel):
44 """Service configuration for a specific model."""
46 provider: str
47 model_id: str
50class ModelConfig(BaseModel):
51 """Configuration for a specific model."""
53 id: str
54 service: ModelServiceConfig
55 name: str | None = None
56 description: str | None = None
57 default_params: dict[str, Any] = Field(default_factory=dict)
58 override_params: dict[str, Any] = Field(default_factory=dict)
59 remove_params: list[str] = Field(default_factory=list)
60 rename_params: dict[str, str] = Field(default_factory=dict)
62 model_config = ConfigDict(extra="allow")
65class ConfigSchema(BaseModel):
66 """Root schema for the configuration YAML."""
68 default_params: dict[str, Any] = Field(default_factory=dict)
69 services: dict[str, ServiceConfig] = Field(default_factory=dict)
70 models: list[ModelConfig] = Field(default_factory=list)
71 app_config: dict[str, Any] = Field(default_factory=dict)