AgentSkillsCN

Fastapi Endpoint

FastAPI 端点

SKILL.md

FastAPI Endpoint Generator

Critical for Phases: II, III

Generates complete FastAPI route handlers with error handling, validation, and documentation.

Usage

code
/gen.fastapi-endpoint "<resource>" "<operations>"

# Examples:
/gen.fastapi-endpoint "Todo" "GET list all, POST create, GET by id, PUT update, DELETE"
/gen.fastapi-endpoint "User" "GET profile, PUT update profile, DELETE account"
/gen.fastapi-endpoint "Chat" "POST send message, GET history, DELETE conversation"

What It Generates

  • FastAPI router with full CRUD operations
  • Pydantic models for request/response
  • Error handling with proper HTTP status codes
  • Query parameter validation and filtering
  • Pagination support for list endpoints
  • OpenAPI/Swagger documentation
  • Unit tests for each endpoint

Output Structure

code
phase-XX/src/api/
  ├── todos/
  │   ├── router.py        # FastAPI router
  │   ├── schemas.py       # Pydantic models
  │   └── endpoints.py     # Route handlers
  └── dependencies.py        # Auth and database deps

Features

  • HTTP status code handling (200, 201, 404, 422, 500)
  • Input validation with Pydantic
  • Database error handling
  • Custom exception classes
  • Response models with proper typing
  • Query filters (e.g., ?completed=true)
  • Sort by any field
  • Pagination (?page=1&limit=20)
  • CORS configuration
  • Rate limiting support

Phase Usage

  • Phase II: Todos CRUD (/api/todos), Users (/api/users)
  • Phase III: Chat (/api/chat, /api/conversations)
  • Phase III: AI endpoints (/api/ai/parse, /api/ai/suggest)

Example Output

python
from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlmodel import Session, select

router = APIRouter(prefix="/api/v1/todos", tags=["todos"])

@router.get("", response_model=List[TodoResponse])
def list_todos(
    completed: Optional[bool] = Query(None),
    skip: int = Query(0, ge=0),
    limit: int = Query(20, ge=1, le=100),
    session: Session = Depends(get_session),
    current_user: User = Depends(get_current_user),
):
    """List all todos with filtering and pagination."""
    query = select(Todo).where(Todo.user_id == current_user.id)
    if completed is not None:
        query = query.where(Todo.completed == completed)
    query = query.offset(skip).limit(limit)
    return session.exec(query).all()

@router.post("", response_model=TodoResponse, status_code=201)
def create_todo(
    todo_data: TodoCreate,
    session: Session = Depends(get_session),
    current_user: User = Depends(get_current_user),
):
    """Create a new todo."""
    todo = Todo(**todo_data.model_dump(), user_id=current_user.id)
    session.add(todo)
    session.commit()
    session.refresh(todo)
    return todo

Error Handling

  • 400 Bad Request - Invalid input
  • 401 Unauthorized - Missing/invalid token
  • 403 Forbidden - Resource belongs to another user
  • 404 Not Found - Resource doesn't exist
  • 422 Unprocessable Entity - Validation error
  • 500 Internal Server Error - Database/connection issues