关于 backend-dev
用于开发 FastAPI 端点、Pydantic 模型、数据库操作、LLM 集成及 Python 服务的后端技能,结合项目架构文档、实现示例和必需的编码规则。
主要功能
- 01FastAPI 端点模式
- 02Pydantic 模型指引
- 03TinyDB 操作示例
- 04LiteLLM 集成模式
- 05错误处理约定
- 06强制类型提示
适用场景
- 01创建或修改 API 端点
- 02定义请求与响应模型
- 03实现数据库操作
- 04在服务中添加 LLM 调用
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ srbhr/ resume-matcher --skill backend-dev安装后在 Claude Code 中输入/backend-dev确认已加载。
详细介绍
后端开发
在创建或修改 FastAPI 端点、Pydantic 模式、数据库操作、LLM 集成或 Python 服务逻辑时使用。
编写代码之前
- 阅读
docs/agent/architecture/backend-guide.md了解架构 - 阅读
docs/agent/apis/front-end-apis.md了解 API 契约 - 阅读
docs/agent/llm-integration.md了解 LLM 模式 - 先检查相关目录中的现有代码
不可协商的规则
- 所有函数必须包含类型提示,没有例外
- 对可变默认值使用
copy.deepcopy() - 在服务端记录详细错误,向客户端返回通用消息
- 对共享资源初始化使用
asyncio.Lock() - 通过
api_key=将 API 密钥直接传递给 litellm,切勿使用os.environ
项目结构
apps/backend/app/
├── main.py # FastAPI app, CORS, lifespan, routers
├── config.py # Pydantic BaseSettings from env
├── database.py # TinyDB wrapper (JSON file storage)
├── llm.py # LiteLLM wrapper (multi-provider)
├── routers/ # API endpoint handlers
├── services/ # Business logic layer
├── schemas/ # Pydantic request/response models
└── prompts/ # LLM prompt templates (Jinja2)
模式
新建端点
from fastapi import APIRouter, HTTPException
from app.schemas.my_schema import MyRequest, MyResponse
import logging
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/v1", tags=["my-feature"])
@router.post("/my-endpoint", response_model=MyResponse)
async def create_thing(request: MyRequest) -> MyResponse:
try:
result = await process_data(request)
return result
except Exception as e:
logger.error(f"Failed to create thing: {e}")
raise HTTPException(status_code=500, detail="Operation failed. Please try again.")
新建模式
from pydantic import BaseModel, Field
class MyRequest(BaseModel):
name: str = Field(..., min_length=1, max_length=200)
description: str | None = None
class MyResponse(BaseModel):
id: str
name: str
status: str = "created"
数据库操作
import copy
from app.database import get_db
DEFAULT_DATA = {"sections": [], "metadata": {}}
async def get_or_create(doc_id: str) -> dict:
db = get_db()
existing = db.get(doc_id)
if existing:
return existing
data = copy.deepcopy(DEFAULT_DATA) # ALWAYS deepcopy mutable defaults
db.insert(data)
return data
LLM 调用
from app.llm import get_completion
from app.config import settings
async def improve_text(text: str) -> str:
prompt = f"Improve this resume text:\n\n{text}"
result = await get_completion(
prompt=prompt,
model=settings.LLM_MODEL,
api_key=settings.LLM_API_KEY, # Pass directly, not via env
json_mode=True,
)
return result
错误处理模式
except Exception as e:
logger.error(f"Operation failed: {e}") # Detailed for server logs
raise HTTPException(
status_code=500,
detail="Operation failed. Please try again." # Generic for client
)
检查清单
- 所有函数都有类型提示
- 可变默认值使用
copy.deepcopy() - 错误处理会记录详情,并返回通用消息
- 新端点已在
main.py的路由包含列表中注册 - 所有请求/响应体都已定义模式
- 通过
api_key=参数传递 API 密钥
评论
支持 Markdown