进阶 📋 5 个步骤 第 410 / 470 篇

用 FastAPI 把 Agent 包装成 HTTP API 服务(从脚本到可调用接口)

用 FastAPI 把 Agent 函数包装成标准 HTTP 接口,前端与其他系统都能调用,含流式输出与本地验证。

2026.09.11· 15 分钟阅读· 约 767 字· 🔌 FastAPI / 🐍 Python

你写好了 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 即可
← 返回教程中心