将后端backend部分重构为TS版本#1
收到,我来分析一下后端重构为 TypeScript 版本的可行性和工作量。
| 模块 | Python 文件数 | 代码行数 |
|---|---|---|
| app/ (Gateway + Channels) | 34 | ~8,000 |
| packages/harness/ (核心引擎) | 156 | ~24,000 |
| tests/ | 110 | ~35,000 |
| 合计 | 300 | ~67,000 |
后端深度依赖 Python 生态,主要依赖链:
langgraph, langgraph-sdk, langgraph-runtime-inmem, langgraph-cli) — Agent 编排核心,无 TS 等价物langchain, langchain-openai, langchain-anthropic, langchain-deepseek) — LLM 抽象层,TS 版 @langchain/core 存在但生态不完整agent-sandbox, kubernetes) — 沙箱执行,K8s client 有 TS 版| 风险 | 说明 |
|---|---|
| LangGraph 无 TS 版 | Agent 编排核心 langgraph 仅有 Python 实现,TS 生态无等价物。@langchain/langgraph 存在但功能差异大,且 langgraph-runtime-inmem(checkpointer/store)无 TS 版 |
| Middleware 体系 | 14+ 个 Agent Middleware(summarization, memory, loop detection, sandbox audit 等)均依赖 langchain.agents Python API,TS 端 API 差异巨大 |
| 社区工具链 | ddg_search, exa, firecrawl, tavily, infoquest, jina_ai 等工具包装均为 Python 实现 |
| 工作量巨大 | ~32,000 行业务代码 + ~35,000 行测试,预估 3-6 人月 |
将整个 backend 重写为 TS,由于 LangGraph 核心依赖无 TS 等价,需要自行实现 Agent 编排引擎,风险极高。
Spence,你倾向哪个方案? 如果选方案 B,我可以先从 Gateway 层开始拆分 PR 推进。
@spence(spence)
是的,LangGraph 有 TypeScript 版本!
@langchain/langgraph(当前约 v1.2.6)核心概念(State、Node、Edge 等)与 Python 版一致,API 风格也基本对齐,可以作为后端重构为 TS 版本的基础。
如果你打算推进这个 Issue(后端重构为 TS),我可以帮你分析当前项目结构,制定重构方案。
收到,开始推进后端 Python → TypeScript 重构,保持功能不变。以下是基于代码分析后的完整重构方案。
| 模块 | Python 文件数 | 代码行数 |
|---|---|---|
app/gateway (FastAPI Gateway + Routers) | 17 | ~3,700 |
app/channels (IM 频道) | 10 | ~4,900 |
packages/harness (核心引擎) | 120 | ~23,000 |
tests/ | 110 | ~9,300 |
| 合计 | 257 | ~41,000 |
| Python 包 | TS 替代 |
|---|---|
fastapi + uvicorn | fastify + @fastify/cors |
langchain + langgraph | @langchain/core + @langchain/langgraph |
langgraph-runtime-inmem | @langchain/langgraph 内存 Checkpointer |
langgraph-checkpoint-sqlite | 需自行实现 SQLite checkpointer 或用 better-sqlite3 |
pydantic | zod |
pyyaml | yaml (js-yaml) |
dotenv | dotenv |
langgraph-sdk | @langchain/langgraph-sdk |
httpx | undici / node-fetch |
sse-starlette | 原生 SSE (TransformStream) |
| IM SDK (飞书/Slack/Telegram 等) | 各平台 JS SDK |
kubernetes | @kubernetes/client-node |
tiktoken | js-tiktoken |
duckdb | duckdb (Node.js binding) |
backend-ts/),配置 tsconfig.json、package.json、eslintconfig/ 模块(15 个配置文件,~1,100 行)→ Zod schema + YAML 加载langgraph.json → TS 等价入口配置app/gateway/app.py → Fastify 应用入口 + 生命周期app/gateway/deps.py → 依赖注入(StreamBridge / RunManager / Checkpointer)health, models, mcp, memory, skills, artifacts, uploads, threads, agents, suggestions, channels, assistants_compat, runs / thread_runsapp/gateway/services.py → Run 生命周期 + SSE 流runtime/runs/ → RunManager + RunWorker + Schemasruntime/store/ → Store Provider (内存 + SQLite)runtime/stream_bridge/ → StreamBridge (内存实现)runtime/serialization.py → 序列化工具agents/thread_state.py → LangGraph State 定义agents/lead_agent/ → Agent 工厂 + Prompt 模板agents/factory.py → create_deerflow_agent 工厂agents/checkpointer/ → Checkpointer Provideragents/features.py → RuntimeFeaturesThreadDataMiddleware → UploadsMiddleware → SandboxMiddleware → DanglingToolCallMiddleware → ... → ClarificationMiddleware@Next/@Prev 锚点机制tools/builtins/ (9 个内置工具)tools/skill_manage_tool.py + tools/tools.pysubagents/ (executor, registry, builtins)community/ (ddg_search, exa, firecrawl, tavily, jina_ai, infoquest, image_search, aio_sandbox)sandbox/ (local + remote, security, middleware, tools)skills/ (loader, manager, parser, installer, security_scanner, validation)agents/memory/, mcp/, guardrails/, models/, uploads/, tracing/, reflection/, utils/channels/ (feishu, slack, telegram, discord, wechat, wecom, manager, service, message_bus)准备开始了!🚀
Phase 1 已完成!我在本地搭建了 TS 后端项目脚手架和完整的配置层,但推送时遇到权限问题(repo-code:rw 权限不足),无法推送到远程仓库。
backend-ts/
├── .gitignore
├── package.json # Fastify + @langchain/langgraph + Zod
├── tsconfig.json
└── src/
├── index.ts
└── config/
├── index.ts # 统一导出
├── app-config.ts # 主配置 (对应 Python AppConfig)
├── model-config.ts # 模型配置
├── sandbox-config.ts # 沙箱配置
├── paths.ts # 路径管理 (含虚拟路径解析)
├── token-usage-config.ts
├── tool-config.ts
├── skills-config.ts
├── skill-evolution-config.ts
├── extensions-config.ts # MCP + Skills 状态
├── tool-search-config.ts
├── summarization-config.ts
├── title-config.ts
├── memory-config.ts
├── agents-api-config.ts
├── subagents-config.ts
├── guardrails-config.ts
├── checkpointer-config.ts
├── stream-bridge-config.ts
├── acp-config.ts
├── tracing-config.ts
└── agents-config.ts
$VAR 引用 → process.env.VARtsc --noEmit 零错误refactor/backend-python-to-typescriptfeat: scaffold TypeScript backend with config layer (Phase 1)需要你操作:请检查你的工作模式是否开启了 repo-code:rw 权限,或者手动在仓库设置中为 CodeBuddy 授予写权限,这样我才能推送代码和创建 PR。
收到,直接开干!🚀 开始 Phase 1:项目脚手架 + 配置层。
/workspace/backend-ts/ 创建 TS 项目骨架package.json、tsconfig.json、eslint.config.mjsapp_config.ts — 核心配置加载(YAML + 环境变量解析 + 单例缓存 + 热重载)model_config.ts、tool_config.ts、sandbox_config.ts 等paths.ts — 路径管理extensions_config.ts — MCP/Skills 扩展配置app.py → app.ts,FastAPI → Fastify)deps.ts(依赖注入/生命周期管理)services.ts(SSE 流)每个模块保持与 Python 版功能一致,API 路径和协议不变。
Phase 1 脚手架已完成!代码在本地分支 auto/feat/ts-backend-phase1-scaffold 上,但推送时提示权限不足(repo-code:rw),需要你授权或手动处理。
项目骨架 (backend-ts/)
package.json — Fastify + Zod + @langchain/langgraph + TypeScripttsconfig.json — strict 模式,Node16 模块解析vitest.config.ts — 测试框架配置配置层 (backend-ts/src/config/) — 18 个 Zod schema 模块
| 模块 | 对应 Python |
|---|---|
model-config.ts | Pydantic ModelConfig |
sandbox-config.ts | SandboxConfig + VolumeMountConfig |
tool-config.ts | ToolConfig + ToolGroupConfig |
checkpointer-config.ts | CheckpointerConfig |
stream-bridge-config.ts | StreamBridgeConfig |
title-config.ts | TitleConfig |
summarization-config.ts | SummarizationConfig + ContextSize |
memory-config.ts | MemoryConfig |
agents-api-config.ts | AgentsApiConfig |
subagents-config.ts | SubagentsAppConfig |
guardrails-config.ts | GuardrailsConfig |
tool-search-config.ts | ToolSearchConfig |
extensions-config.ts | ExtensionsConfig + MCP/Skills |
acp-config.ts | ACPAgentConfig |
circuit-breaker-config.ts | CircuitBreakerConfig |
uploads-config.ts | UploadsConfig |
skill-evolution-config.ts | SkillEvolutionConfig |
skills-config.ts | SkillsConfig |
核心加载器
app-config.ts — YAML 加载 + $ENV_VAR 解析 + camelCase 转换 + 热重载paths.ts — 路径管理单例(线程目录、沙箱挂载、虚拟路径解析)Gateway
验证结果
请授予推送权限,或我可以在你打开工作模式后继续推送并创建 PR。后续 Phase 2 将迁移完整的 Gateway 路由层。
在 CNB 平台上授权 NPC(如 @CodeBuddy)有以下几种场景:
在 Issue 或 PR 评论区 @CodeBuddy 时,勾选 「替我上班」 即可开启工作模式。
前提条件:你需要拥有该仓库的开发者及以上权限。
开启后,NPC 可以自主执行:
如果你是在第三方应用(如 IDE 插件)中需要连接 CNB 账号:
撤销授权: CNB → 右上角头像 → 个人设置 → 授权管理 → 点击撤销
如果需要通过 API 操作仓库,可在 CNB 个人设置中创建访问令牌(Access Token),用于命令行或脚本中的身份认证。
如果你是问「怎么让我(@CodeBuddy)能帮你写代码」,只需要在评论区 @CodeBuddy 并勾选 「替我上班」 就行 😎
详细文档:
当前 Python 后端包含 ~100+ 个 Python 文件,涉及以下核心模块:
| 模块 | 文件数 | 复杂度 | 说明 |
|---|---|---|---|
| Gateway API (FastAPI) | ~15 | 高 | 12 个路由模块 + 应用配置 + 依赖注入 |
| Agent 系统 (LangGraph) | ~25 | 极高 | Lead Agent + 14 个 Middleware + ThreadState |
| Sandbox 系统 | ~13 | 高 | 沙箱抽象 + Local/AIO Provider + 文件锁 + 安全 |
| Subagent 系统 | ~7 | 高 | 执行器 + 注册表 + 2 个内置 Agent |
| Skills 系统 | ~8 | 中 | 加载器 + 安装器 + 解析器 + 安全扫描 |
| Tools 系统 | ~11 | 中 | 内置工具 + MCP + Tool Search |
| Config 系统 | ~18 | 中 | Pydantic 配置模型 + YAML 加载 |
| Community 工具 | ~10 | 低 | Tavily/Jina/Firecrawl/DDG 等 |
| Runtime | ~10 | 高 | RunManager + StreamBridge + Store + 序列化 |
| Channels (IM) | ~13 | 中 | 飞书/Slack/Telegram/Discord/微信/企业微信 |
| Memory 系统 | ~5 | 中 | 记忆提取 + 存储 + 队列 |
| Models | ~7 | 中 | LLM Provider 抽象 + Patch |
| Utils | ~3 | 低 | 网络/可读性/文件转换 |
| Tests | ~85+ | 极高 | 完整测试套件 |
@langchain/langgraph 能力@langchain/core 等官方 TS 包⚠️ 这是一个超大工程,单次 PR 难以完成,建议分阶段推进:
Spence,请确认:
请回复后我将开始编码。
收到!按方案执行,使用 Node.js + Hono,保持 API 兼容性。
backend-ts/ 目录结构package.json — Hono + @langchain/langgraph + Zodtsconfig.json — strict 模式Paths 路径管理所有 API 路径和 SSE 协议保持与 Python 版完全一致,前端无需修改。
Phase 1 完成!已创建 PR #2。
backend-ts/)package.json — Fastify + @langchain/langgraph + Zod + TypeScripttsconfig.json — strict 模式,ES2022 target,Node16 模块解析.gitignore — 排除 node_modules/dist| Python Pydantic | TypeScript Zod |
|---|---|
AppConfig | app_config.ts — YAML 加载 + 环境变量解析 + 单例缓存 + 热重载 |
ModelConfig | model_config.ts |
SandboxConfig | sandbox_config.ts |
ToolConfig / ToolGroupConfig | tool_config.ts |
CheckpointerConfig | checkpointer_config.ts |
MemoryConfig | memory_config.ts |
SummarizationConfig | summarization_config.ts |
TitleConfig | title_config.ts |
SkillsConfig | skills_config.ts |
ExtensionsConfig (MCP + Skills) | extensions_config.ts |
GuardrailsConfig | guardrails_config.ts |
SubagentsAppConfig | subagents_config.ts |
ACPAgentConfig | acp_config.ts |
TracingConfig | tracing_config.ts |
Paths | paths.ts — 完整路径管理 + 沙箱虚拟路径解析 |
app.ts — Fastify 应用入口 + 生命周期钩子deps.ts — 依赖注入(StreamBridge/RunManager/Checkpointer/Store)services.ts — SSE 格式化 + Run 生命周期服务(桩)tsc --noEmit ✅tsc build ✅(dist/ 输出正常)Phase 1-3 已完成!代码已推送到分支 refactor/backend-python-to-typescript,PR 已创建:#3
backend-ts/ 项目骨架:package.json (Hono + @langchain/langgraph + Zod)、tsconfig.jsonPaths 路径管理:线程目录、沙箱挂载、虚拟路径解析、主机路径保留AppConfig 主加载器:YAML 加载 + $ENV_VAR 解析 + mtime 自动重载 + 单例缓存useStream 可直接使用)RunManager + RunRecord + RunStatus / DisconnectModeMemoryStreamBridge(内存事件日志 + 心跳 + Last-Event-ID 重连)MemoryStore(线程元数据存储)Spence,请 review PR #3,确认后我继续推进 Phase 4。
Phase 3 + Phase 4 已完成并推送到 PR #3 🚀
RunManager + RunRecord — 带异步互斥锁的线程安全运行注册表RunStatus / DisconnectMode 枚举runAgent worker — LangGraph 流式传输、中断和回滚支持StreamBridge 抽象 + MemoryStreamBridge 内存实现serialize, serializeChannelValues 等)RuntimeDeps 已接入真实类型ThreadState — 带 reducers (mergeArtifacts, mergeViewedImages)RuntimeFeatures — @Next/@Prev 中间件定位装饰器makeLeadAgent 工厂 — 模型解析 + Prompt 生成applyPromptTemplate — subagent/skills/memory 动态段落makeCheckpointer 异步工厂 (memory/sqlite/postgres)AgentMiddleware 基类 + 14 个中间件 stub| Phase | 模块 | 状态 |
|---|---|---|
| 1 | 项目脚手架 + 配置层 | ✅ |
| 2 | Gateway 层 (Hono) | ✅ |
| 3 | Runtime 层 | ✅ |
| 4 | Agent 核心引擎 | ✅ |
| 5 | Middleware 链 (14个) | 🔄 stubs ready |
| 6 | Tools + Subagents | ⏳ |
| 7-12 | 其余模块 | ⏳ |
接下来继续 Phase 5 (Middleware 完整实现) 还是先 review PR?
No description provided