diff --git a/promptlens/models/config.py b/promptlens/models/config.py index 7c85798..0645f07 100644 --- a/promptlens/models/config.py +++ b/promptlens/models/config.py @@ -2,7 +2,7 @@ from typing import Any, Dict, List, Optional -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field class ProviderConfig(BaseModel): @@ -114,9 +114,8 @@ class RunConfig(BaseModel): execution: ExecutionConfig = Field(default_factory=ExecutionConfig) output: OutputConfig = Field(default_factory=OutputConfig) - class Config: - """Pydantic config.""" - json_schema_extra = { + model_config = ConfigDict( + json_schema_extra={ "example": { "golden_set": "./examples/golden_sets/customer_support.yaml", "models": [ @@ -143,3 +142,4 @@ class Config: }, } } + ) diff --git a/promptlens/models/test_case.py b/promptlens/models/test_case.py index 931208f..4861929 100644 --- a/promptlens/models/test_case.py +++ b/promptlens/models/test_case.py @@ -2,7 +2,7 @@ from typing import Any, Dict, List, Optional -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field from promptlens.models.tools import ToolDefinition, ExpectedToolCall @@ -50,9 +50,8 @@ class TestCase(BaseModel): description="Whether to actually execute tools (default: False, evaluation only)" ) - class Config: - """Pydantic config.""" - json_schema_extra = { + model_config = ConfigDict( + json_schema_extra={ "example": { "id": "cs-001", "query": "How do I reset my password?", @@ -61,6 +60,7 @@ class Config: "tags": ["password", "account"], } } + ) class GoldenSet(BaseModel): @@ -80,9 +80,8 @@ class GoldenSet(BaseModel): test_cases: List[TestCase] metadata: Dict[str, Any] = Field(default_factory=dict) - class Config: - """Pydantic config.""" - json_schema_extra = { + model_config = ConfigDict( + json_schema_extra={ "example": { "name": "Customer Support Tests", "description": "Test cases for customer support chatbot", @@ -98,3 +97,4 @@ class Config: ], } } + ) diff --git a/promptlens/models/tools.py b/promptlens/models/tools.py index bd7d52b..011447f 100644 --- a/promptlens/models/tools.py +++ b/promptlens/models/tools.py @@ -8,7 +8,7 @@ """ from typing import Any, Dict, List, Optional -from pydantic import BaseModel, Field +from pydantic import BaseModel, ConfigDict, Field class ToolParameter(BaseModel): @@ -24,8 +24,7 @@ class ToolParameter(BaseModel): properties: Optional[Dict[str, "ToolParameter"]] = Field(None, description="For object types, nested properties") items: Optional["ToolParameter"] = Field(None, description="For array types, the item schema") - class Config: - extra = "allow" # Allow additional JSON Schema fields + model_config = ConfigDict(extra="allow") # Allow additional JSON Schema fields class ToolDefinition(BaseModel): diff --git a/tests/test_pydantic_configdict.py b/tests/test_pydantic_configdict.py new file mode 100644 index 0000000..0569d72 --- /dev/null +++ b/tests/test_pydantic_configdict.py @@ -0,0 +1,39 @@ +"""Regression tests for Pydantic v2 model_config migration.""" + +from promptlens.models.config import RunConfig +from promptlens.models.test_case import GoldenSet, TestCase as PromptLensTestCase +from promptlens.models.tools import ToolParameter + + +def test_tool_parameter_allows_additional_json_schema_fields() -> None: + param = ToolParameter( + type="string", + description="User locale", + format="email", + minLength=3, + ) + + dumped = param.model_dump() + assert dumped["format"] == "email" + assert dumped["minLength"] == 3 + + +def test_test_case_schema_keeps_example_metadata() -> None: + schema = PromptLensTestCase.model_json_schema() + + assert "example" in schema + assert schema["example"]["id"] == "cs-001" + + +def test_run_config_schema_keeps_example_metadata() -> None: + schema = RunConfig.model_json_schema() + + assert "example" in schema + assert schema["example"]["golden_set"].endswith("customer_support.yaml") + + +def test_golden_set_schema_keeps_example_metadata() -> None: + schema = GoldenSet.model_json_schema() + + assert "example" in schema + assert schema["example"]["name"] == "Customer Support Tests"