增强配置系统

This commit is contained in:
strepsiades
2026-03-10 16:13:10 +08:00
parent a638e4203b
commit 291aa0b4b7
10 changed files with 481 additions and 45 deletions
+25 -14
View File
@@ -1,30 +1,33 @@
from __future__ import annotations
from typing import Annotated, Any, Dict, List, Literal, Union
from typing import Annotated, Any, Dict, List, Literal
from pydantic import BaseModel, ConfigDict, Field
from pydantic import BaseModel, ConfigDict, Field, PlainSerializer, PlainValidator
from ..datasource.type_registry import register_datasource_config_model, validate_registered_datasource_config
class JsonlDataSourceConfig(BaseModel):
class BaseDataSourceConfig(BaseModel):
model_config = ConfigDict(extra="forbid", validate_assignment=True)
type: str
target_project_ids: List[str] = Field(default_factory=list)
handler_configs: Dict[str, Dict[str, Any]] = Field(default_factory=dict)
class JsonlDataSourceConfig(BaseDataSourceConfig):
type: Literal["jsonl"] = "jsonl"
jsonl_dir: str
read_only: bool = False
target_project_ids: List[str] = Field(default_factory=list)
handler_configs: Dict[str, Dict[str, Any]] = Field(default_factory=dict)
class DbDataSourceConfig(BaseModel):
model_config = ConfigDict(extra="forbid", validate_assignment=True)
class DbDataSourceConfig(BaseDataSourceConfig):
type: Literal["db"] = "db"
target_project_ids: List[str] = Field(default_factory=list)
handler_configs: Dict[str, Dict[str, Any]] = Field(default_factory=dict)
class ApiDataSourceConfig(BaseModel):
model_config = ConfigDict(extra="forbid", validate_assignment=True)
class ApiDataSourceConfig(BaseDataSourceConfig):
type: Literal["api"] = "api"
api_base_url: str = ""
@@ -36,10 +39,18 @@ class ApiDataSourceConfig(BaseModel):
api_rate_limit_max_requests: int = 10
api_rate_limit_window_seconds: float = 10.0
target_project_ids: List[str] = Field(min_length=1)
handler_configs: Dict[str, Dict[str, Any]] = Field(default_factory=dict)
DataSourceConfig = Annotated[
Union[JsonlDataSourceConfig, DbDataSourceConfig, ApiDataSourceConfig],
Field(discriminator="type"),
BaseDataSourceConfig,
PlainValidator(validate_registered_datasource_config),
PlainSerializer(
lambda value: value.model_dump(mode="python") if isinstance(value, BaseModel) else value,
return_type=dict[str, Any],
),
]
register_datasource_config_model("jsonl", JsonlDataSourceConfig)
register_datasource_config_model("db", DbDataSourceConfig)
register_datasource_config_model("api", ApiDataSourceConfig)