TS 还是 Python:一次真实的技术决策
实战锚点 · lovelyPet:Python Agent 服务废弃、AI 并入全栈 TS 的完整决策复盘——两条路线的真实权衡。
2026 年 8 月 23 日,我做了一个决定:废弃萌宠圈的 Python Agent 服务,AI 能力并入全栈 TS。这个决定对不对?这篇文章是完整的决策复盘。
背景:同一个项目里有两套 AI 服务
萌宠圈(lovelyPet)是一个宠物社交 App。在架构演进中,它同时存在过两套 AI 服务:
Python 路线的三个痛点
1. 部署双倍
Python 服务需要独立的运行时、独立的 Docker 镜像、独立的 CI/CD 流水线。对于一个人的项目,这不是「微服务」,这是双倍运维。
2. 类型断裂
前端 → TS API → Python Agent → 数据库。每一次跨界,TypeScript 的类型安全就断一次。DTO 要写两遍(TS 的 interface + Python 的 Pydantic model),改一个字段要动两个项目。
3. 生态优势在缩小
2024 年选 Python 的理由是 LangChain/LlamaIndex 只有 Python 版。但 2026 年:
- LangChain.js 已完整支持工具调用、记忆、RAG、Agent
- easy-agent 证明纯 TS 可以做出 Claude Code 级的 Agent
- OpenAI SDK 的 TS 版和 Python 版功能完全对齐
TS 路线的三个优势
1. 一个进程、一套部署
// hp-pet-api/src/modules/ai/ai.service.ts
// AI 功能就是 NestJS 的一个 module,和其他业务模块平级
@Module({
imports: [AiModule],
controllers: [AiController],
providers: [AiService],
})
export class PetApiModule {}
不需要独立的 AI 服务。AI 调用就是 AiService 的一个方法,和 UserService、PetService 没有任何区别。
2. 类型安全贯穿全栈
// 前端定义的 DiaryStyle
enum DiaryStyle {
WARM = 'warm',
INDEPENDENT = 'independent',
RAMBLE = 'ramble',
}
// AI Service 直接用同一个类型
const STYLE_PROMPTS: Record<DiaryStyle, string> = {
[DiaryStyle.WARM]: '风格:暖心。语气温柔、真诚…',
[DiaryStyle.INDEPENDENT]: '风格:独立。高冷、傲娇…',
[DiaryStyle.RAMBLE]: '风格:碎碎念。活泼跳脱…',
};
前端加了一种新风格 → TypeScript 编译器立刻报错 → 不会漏改。这是 Python 路线做不到的。
3. 代码量减半
Python 服务有 diary、rag、tts 三个 module + 每个的 service/controller/dto + 独立的数据库连接 + 独立的配置。废弃后,TS 版 ai.service.ts 只有 134 行——因为不需要跨服务通信的胶水代码。
那 Python 什么时候更合适?
诚实地列出 Python 的真实优势:
| 维度 | Python 更合适 | TS 更合适 |
|---|---|---|
| 团队背景 | 数据/算法团队 | 前端/全栈团队 |
| 模型微调 | PyTorch 生态只有 Python | 不涉及 |
| 数据处理 | pandas/numpy 无可替代 | 简单 CRUD |
| Agent 框架 | LangGraph Python 文档更丰富 | LangChain.js 已够用 |
| 部署运维 | 已有 Python 基础设施 | 已有 Node 基础设施 |
| 类型安全 | 不在乎 | 核心需求 |
| 团队规模 | 多人分工(AI 团队 + 业务团队) | 一人/小团队 |
我的情况:前端工程师、一人项目、已有 NestJS 全栈、不需要微调。六个维度全指向 TS。
决策框架:不是「哪个更好」,是「哪个对你更好」
本章要点
- Python Agent 服务的三个痛点:部署双倍、类型断裂、生态优势在缩小
- TS 的三个优势:一个进程、类型贯穿全栈、代码量减半
- Python 仍然有真实优势:数据科学、微调、多人分工
- 选型不是「哪个更好」,是「对你的团队和项目哪个更合适」
- easy-agent 证明纯 TS 可以做出 Claude Code 级 Agent——「TS 不够用」不再是借口
→ 下一章:Context Engineering