你写好了 Agent 逻辑,但只能在 Python 里自己调用?本教程教你用 FastAPI 把它包装成一个标准 HTTP 接口——这样前端页面、其他系统、甚至手机 App 都能通过 POST 请求来调用你的 Agent。从「一个函数」到「一个可被调用的服务」,就差这几步。
🔌 本教程适合:会用 Python 调大模型、想让 Agent 真正「上线被调用」的开发者。需要 Python 3.10+ 和任意 OpenAI 兼容的 API Key。
Step 1:准备环境
1 安装 FastAPI 与服务器
pip install fastapi uvicorn openai
# uvicorn 是跑 FastAPI 的 ASGI 服务器
💡 只装
fastapi 没法直接跑,必须搭配 uvicorn(或 hypercorn)当服务器。Step 2:先写好你的 Agent 函数
2 复用你已有的对话逻辑
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
base_url="https://api.deepseek.com", # 换成你的模型服务地址
)
def ask_agent(message: str, history: list[dict]) -> str:
messages = [{"role": "system", "content": "你是一个 helpful 的中文助手。"}]
messages += history
messages.append({"role": "user", "content": message})
resp = client.chat.completions.create(model="deepseek-chat", messages=messages)
return resp.choices[0].message.content
密钥管理:用环境变量读 Key,别硬编码。模型名(如 deepseek-chat)随官方更新变化,以你所选厂商的当前文档为准。
Step 3:用 FastAPI 暴露 /chat 接口
3 用 Pydantic 定义请求体
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(title="My Agent API")
class ChatReq(BaseModel):
message: str
history: list[dict] = [] # 形如 [{"role":"user","content":"..."}]
@app.post("/chat")
def chat(req: ChatReq):
try:
reply = ask_agent(req.message, req.history)
return {"reply": reply}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
🚀 Pydantic 会自动校验请求格式,缺字段或类型错会直接返回 422,省去手写校验代码。
Step 4:加上流式输出(可选)
4 SSE 让前端边收边显
from fastapi.responses import StreamingResponse
@app.post("/chat/stream")
def chat_stream(req: ChatReq):
messages = [{"role": "system", "content": "你是一个 helpful 的中文助手。"}]
messages += req.history
messages.append({"role": "user", "content": req.message})
def event_gen():
stream = client.chat.completions.create(
model="deepseek-chat", messages=messages, stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content or ""
if delta:
yield f"data: {delta}\n\n" # SSE 格式
return StreamingResponse(event_gen(), media_type="text/event-stream")
💡 前端用
EventSource 或 fetch 读这个接口,就能实现打字机效果。生产环境通常再加一个统一的鉴权中间件。Step 5:本地启动并用 curl 验证
5 启动服务 + 发请求
# 终端 1:启动(热重载,改代码自动重启)
uvicorn main:app --reload --port 8000
# 终端 2:调用测试
curl -X POST http://127.0.0.1:8000/chat \
-H "Content-Type: application/json" \
-d '{"message":"用一句话介绍你自己","history":[]}'
别裸奔上公网:示例没有鉴权,只能本机/内网用。要对外开放,必须加 API Key / Token 校验(如 FastAPI 的 Depends 依赖)、用 HTTPS,并在反向代理层做限流。CORS 也请用 CORSMiddleware 明确白名单,不要 allow_origins=["*"] 一把梭。
常见问题速查
| 现象 | 大概率原因 & 解决 |
|---|---|
| 启动报「module not found」 | 没装 uvicorn,或不在虚拟环境里跑 |
| 访问返回 500 | 看终端报错,多半是 Key 没设 / 模型名错 / 余额不足 |
| 前端跨域被拦 | 没配 CORS,或白名单没包含你的前端域名 |
| 想自动生成接口文档 | FastAPI 自带,打开 http://127.0.0.1:8000/docs 即可 |