主题
Hono.js vs FastAPI
要点
- Hono.js 和 FastAPI 都能写出清晰的 API,差异主要来自运行时、生态和部署模型。
- Agent 项目如果采用边缘 API、TypeScript 前后端共享类型和流式返回,Hono.js 更贴合用户等待的主路径。
- FastAPI 适合 Python 生态更重的后台能力,例如文档解析、批量评估、模型服务、rerank 和数据处理。
- 框架选型不宜写成「谁更先进」的语言偏好题,而要回到同步链路、后台链路和评测链路的职责划分。
1. 为什么要比较这两个框架
在前一篇文章里,我们把部署拆成了边缘同步路径和后台重任务路径。接下来要回答的是:Agent 项目的 API 层,应该用什么框架组织。
Agent 项目的服务端通常有两类入口:
- 用户请求入口:接收任务需求、鉴权、读取任务状态、触发研究 / 规划 / 执行 / 审稿 Agent、转发流式响应。
- 后台任务入口:资料抓取、正文抽取、向量化、批量审稿、质量评估、索引重建。
- 内部协作入口:让编排服务、评测服务、资料库和管理后台共享同一套任务状态。
Hono.js 和 FastAPI 都可以做 API。选型前需要先判断的是:哪一类入口更适合哪个框架。
2. 两者的基本定位
Hono.js 是 TypeScript 生态里的轻量 Web 框架,基于 Web 标准(Fetch API、Request/Response 等)构建,官方自称设计目标是「small, simple, and ultrafast」,并且可以在多个运行时上运行,包括 Cloudflare Workers、Fastly Compute、Deno、Bun、Vercel、AWS Lambda、Lambda@Edge 和 Node.js 等。它默认零依赖,hono/tiny 预设体积不到 14 kB,适合做边缘 API、路由中间件、流式响应和轻量代理。
FastAPI 是 Python 生态里的现代 API 框架,基于 Python 类型注解和 Pydantic 做数据校验。它会自动把类型声明转成 OpenAPI schema,并默认提供 /docs(Swagger UI)和 /redoc(ReDoc)两套交互式文档。这让它适合构建需要强契约、Python 服务、机器学习接口、数据处理 API 和内部管理服务。
从 Agent 项目看,可以先这样划分:
| 场景 | 更适合 |
|---|---|
| 边缘 API、鉴权、限流、流式代理 | Hono.js |
| 前后端共享 TypeScript schema | Hono.js |
| 调用 Cloudflare Workers/D1/KV/Queues | Hono.js |
| 批量文档解析、PDF 处理、NLP 任务 | FastAPI |
| Python 模型服务、评估脚本、rerank | FastAPI |
| 内部后台管理 API | 两者都可,取决于团队生态 |
3. Hono.js 适合主路径的原因
Agent 产品的主路径是用户正在等待的路径。它需要尽快完成校验、调度、状态写入和流式返回。
Hono.js 在这里有几个优势:
- 运行时贴合边缘。 Hono 基于 Web 标准,可以直接部署到 Cloudflare Workers 等边缘运行时,并且 Cloudflare 官方在框架指南中收录了 Hono。适合承载靠近用户的边缘入口。
- 中间件模型轻。 鉴权、限流、日志、错误处理可以按请求管线组织,代码量不大,启动开销也低。
- TypeScript 共享成本低。 前端、API、契约类型可以在同一语言生态里维护,减少跨语言契约漂移。
- 流式响应路径短。 对结构、产物、改写建议这类长输出,可以把模型 token 或后台事件转成 SSE,Hono 对 Web Streams 的支持可以直接利用。
- 和边缘存储配合直接。 D1、KV、Queues、R2 等平台能力可以作为 API 层依赖,用来读写任务状态、缓存资料片段或投递后台作业。
一个简化的任务入口可能是:
typescript
import { Hono } from "hono";
const app = new Hono();
app.post("/agent-tasks", async (c) => {
const body = await c.req.json();
// 1. 校验任务目标、语种、目标对象和引用要求
// 2. 创建任务状态
// 3. 触发研究、规划、执行或审稿 Agent
// 4. 返回任务 id,或把后续事件转成流式响应
return c.json({ taskId: "task_123", status: "queued" });
});
export default app;这类代码的重点放在请求分发和状态追踪上。产物生成仍然交给研究、规划、执行和审稿等后续能力处理。
4. FastAPI 适合后台能力的原因
FastAPI 的优势在 Python 生态和自动化契约。Agent 系统里,很多后台任务更适合由 Python 服务承载:
- 解析 PDF、Word、网页正文。
- 做批量文本清洗和特征抽取。
- 跑评估脚本、质量评分和重复检测。
- 调用 Python NLP、机器学习或数据分析库。
- 暴露内部模型服务或 rerank 服务。
- 借助 Pydantic 自动完成请求/响应校验和错误提示,并通过 OpenAPI 自动生成接口文档,减少后台 API 的契约沟通成本。
这些任务通常不在用户等待路径上。它们更关心可控运行时、依赖管理、任务重试和资源配置。FastAPI 可以作为后台服务入口,配合队列和 worker 处理长任务。
例如:
python
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class EvaluationJob(BaseModel):
task_id: str
product: str
source_ids: list[str]
criteria: list[str]
@app.post('/internal/evaluate')
async def evaluate(job: EvaluationJob):
# 运行事实检查、结构评分、引用覆盖率和重复检测等后台评估
return {'task_id': job.task_id, 'status': 'accepted'}这不和 Hono.js 冲突。一个项目可以同时使用 Hono 作为边缘入口,用 FastAPI 承载少数 Python 后台服务。边界可以按「用户等待路径」和「后台计算路径」划分,而不是按框架偏好划分。
5. 选型时看五个问题
5.1 请求是否在用户等待路径上
如果接口直接影响用户首字节时间,优先考虑边缘 API。任务创建、状态查询、流式返回、取消任务都属于这一类。
5.2 是否需要 Python 生态
如果核心工作依赖 Python 库,不必为了统一技术栈强行迁移到 TypeScript。文档解析、批量评估、模型服务和离线数据分析都可以独立成 Python 后台服务。
5.3 类型契约在哪里维护
如果前端、API、任务状态和共享 schema 都在 TypeScript monorepo 里,Hono.js 会减少类型同步成本。FastAPI 也能生成 OpenAPI,但跨语言契约仍然需要额外同步。对 Agent 项目来说,任务状态、Agent 事件、引用来源和评测结果都属于容易漂移的契约,最好只维护一个权威来源。
5.4 接口是编排型还是计算型
编排型接口主要做鉴权、路由、状态读写、工具代理和流式转发;计算型接口主要做文档处理、模型推理、批量评估和特征抽取。前者更适合 Hono.js,后者更适合 FastAPI。
5.5 是否需要独立扩缩容
Agent 任务的峰值通常来自用户同时发起生成、改写或审稿。后台解析和批量评测的峰值则可能来自资料导入、索引重建或离线回归测试。两类峰值如果混在同一个服务里,排队、超时和依赖升级会互相影响。把 Hono.js 放在边缘入口,把 FastAPI 放在后台计算入口,可以让扩缩容策略和发布节奏分开。
6. 一个务实组合
对 Agent 项目,可以采用这样的组合:
txt
Web / Admin
-> Hono.js on Cloudflare Workers
-> 鉴权、限流、任务状态、Agent 事件、流式返回、工具代理
-> D1 / KV / Queues / Vectorize
-> Python 后台服务(可选)
-> 文档解析
-> 批量评估
-> rerank / 质量评分这个组合的好处是:主路径轻,靠近用户;后台能力独立,保留 Python 生态。后续如果后台任务变多,也可以把 Python 服务拆到集群或专门队列里,不影响边缘 API。
需要说明的是,Cloudflare 等平台正在逐步支持 Python Workers(目前处于 beta/持续演进阶段),但 Python 生态里的大量依赖、模型二进制和重计算任务在边缘运行时仍有明显限制。FastAPI 的主流部署方式仍然是容器、虚拟机或服务器环境,而不是边缘函数。因此,把 FastAPI 放在后台计算入口,把 Hono 放在边缘入口,仍然更符合当前各运行时的实际约束。
两个框架并存会带来契约同步成本。比较稳的做法是把任务状态、事件类型、错误码和评测结果定义成共享契约,再让 FastAPI 通过 OpenAPI、schema 导出或生成代码接入,而不是让两个服务各自临时定义字段。
7. 小结
Hono.js 和 FastAPI 的选择,不应该变成语言偏好之争。
在 Agent 项目里,Hono.js 更适合做边缘入口和编排型 API;FastAPI 更适合承载 Python 生态里的后台计算和评估服务。把两者放到各自适合的位置,比强行二选一更稳。