fix: migrate message model config off deprecated pydantic api

parent 2c9b5310
......@@ -23,7 +23,7 @@ Why did the programmer quit his job? Because he didn't get arrays!
A modular proxy server for managing multiple AI provider integrations.
"""
from pydantic import BaseModel, Field
from pydantic import BaseModel, ConfigDict, Field
from typing import Dict, List, Optional, Union
class Message(BaseModel):
......@@ -33,8 +33,7 @@ class Message(BaseModel):
tool_call_id: Optional[str] = None
name: Optional[str] = None
class Config:
extra = "allow" # Allow extra fields not defined in the model
model_config = ConfigDict(extra="allow")
class ChatCompletionRequest(BaseModel):
model: str
messages: List[Message]
......
......@@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
import inspect
import json
from pathlib import Path
import sys
......@@ -30,6 +31,8 @@ from itsdangerous import TimestampSigner
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
from aisbf.routes.dashboard import providers as dashboard_providers
from aisbf.routes.dashboard import settings as dashboard_settings
from aisbf.models import Message
from aisbf.database import DatabaseRegistry
from aisbf.studio import build_studio_catalog
from main import app
......@@ -572,6 +575,31 @@ def test_search_provider_models_refresh_uses_autodetect_flow_without_exposing_st
assert response.json() == {"models": ["whisper-large-v3"], "fetched_live": True}
def test_message_model_uses_pydantic_v2_model_config():
assert Message.model_config.get("extra") == "allow"
assert "Config" not in Message.__dict__
def test_dashboard_user_query_uses_pattern_constraints():
route = next(route for route in dashboard_settings.router.routes if route.endpoint is dashboard_settings.dashboard_users)
query_params = {param.name: param for param in route.dependant.query_params}
assert query_params["order_by"].field_info.json_schema_extra == {"pattern": "^(username|last_login|created_at|tier_name)$"}
assert query_params["direction"].field_info.json_schema_extra == {"pattern": "^(asc|desc)$"}
assert query_params["status_filter"].field_info.json_schema_extra == {"pattern": "^(active|inactive)$"}
assert query_params["role_filter"].field_info.json_schema_extra == {"pattern": "^(admin|user)$"}
source = inspect.getsource(dashboard_settings.dashboard_users)
assert "regex=" not in source
def test_fastapi_app_uses_lifespan_instead_of_on_event_decorators():
lifespan_context = getattr(app.router, "lifespan_context", None)
assert lifespan_context is not None
assert not getattr(app.router, "on_startup", [])
assert not getattr(app.router, "on_shutdown", [])
class DummyOpen:
def __init__(self, sink):
self.sink = sink
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment