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

1"""Schema definitions for YAML configuration validation.""" 

2 

3from typing import Any 

4 

5from pydantic import BaseModel, ConfigDict, Field, SecretStr, field_validator 

6 

7from langgate.core.fields import UrlOrEnvVar 

8 

9 

10class ServiceModelPatternConfig(BaseModel): 

11 """Configuration for model pattern matching within a service.""" 

12 

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) 

17 

18 

19class ServiceConfig(BaseModel): 

20 """Configuration for a service provider.""" 

21 

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) 

29 

30 model_config = ConfigDict(extra="allow") 

31 

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 

41 

42 

43class ModelServiceConfig(BaseModel): 

44 """Service configuration for a specific model.""" 

45 

46 provider: str 

47 model_id: str 

48 

49 

50class ModelConfig(BaseModel): 

51 """Configuration for a specific model.""" 

52 

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) 

61 

62 model_config = ConfigDict(extra="allow") 

63 

64 

65class ConfigSchema(BaseModel): 

66 """Root schema for the configuration YAML.""" 

67 

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)