fix: add validation logging and debug info for tool instance creation

- Add RequestValidationError handler to log validation errors
- Add extra=ignore to CreateInstanceRequest to be more lenient
- Add logging to create_instance endpoint to see received data
- Add missing logger import in tool_instances.py
This commit is contained in:
Fusion
2026-05-19 23:17:08 +02:00
parent 461cb30b28
commit 62752a8390
2 changed files with 31 additions and 1 deletions
+12
View File
@@ -1,9 +1,12 @@
"""Tool instance API endpoints.""" """Tool instance API endpoints."""
import logging
import os import os
import uuid import uuid
from datetime import datetime from datetime import datetime
logger = logging.getLogger(__name__)
from fastapi import APIRouter, Depends, HTTPException, status from fastapi import APIRouter, Depends, HTTPException, status
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from sqlalchemy import select from sqlalchemy import select
@@ -33,6 +36,8 @@ router = APIRouter(prefix="/projects", tags=["tool-instances"])
class CreateInstanceRequest(BaseModel): class CreateInstanceRequest(BaseModel):
"""Request body for creating a tool instance.""" """Request body for creating a tool instance."""
model_config = {"extra": "ignore"}
tool_type_id: str = Field(description="UUID of the tool type to instantiate") tool_type_id: str = Field(description="UUID of the tool type to instantiate")
display_name: str | None = Field(default=None, description="Optional display name for the instance") display_name: str | None = Field(default=None, description="Optional display name for the instance")
@@ -96,6 +101,13 @@ async def create_instance(
Returns: Returns:
Dictionary with instance details. Dictionary with instance details.
""" """
logger.info(
"Creating instance: project_id=%s, repo_id=%s, tool_type_id=%s, display_name=%s",
project_id,
repo_id,
data.tool_type_id,
data.display_name,
)
_user = await _get_user(session, user_id) _user = await _get_user(session, user_id)
_project = await _get_owned_project(project_id, user_id, session) _project = await _get_owned_project(project_id, user_id, session)
+19 -1
View File
@@ -1,8 +1,10 @@
import logging import logging
import os import os
from fastapi import FastAPI from fastapi import FastAPI, Request
from fastapi.exceptions import RequestValidationError
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from sqlalchemy import select, text from sqlalchemy import select, text
@@ -48,6 +50,22 @@ app.add_middleware(RequestLoggingMiddleware)
app.add_middleware(ExceptionLoggingMiddleware) app.add_middleware(ExceptionLoggingMiddleware)
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
"""Log validation errors and return detailed response."""
errors = exc.errors()
logger.warning(
"Validation error for %s %s: %s",
request.method,
request.url.path,
errors,
)
return JSONResponse(
status_code=422,
content={"detail": errors},
)
async def _table_exists(session, table_name: str) -> bool: async def _table_exists(session, table_name: str) -> bool:
"""Check if a table exists in the database.""" """Check if a table exists in the database."""
try: try: