Skip to content
←返回开源项目

OPEN SOURCE DEEP DIVE

CRMAgent工作流TypeScript

Twenty:为 AI 设计的开源 Salesforce 替代

59,424 星的开源 CRM:对象、视图、工作流、agent 全用 TypeScript 包定义与版本化;AI 聊天 bot 读全库记录、自主 agent 跑在工作流里,官方 agent skills 让编码代理直接造 CRM 应用。

twentyhq/twenty59kTypeScriptNOASSERTION2 min read

它是什么:开源的 Salesforce,但从第一天就为 AI 设计

Twenty 在 GitHub 上的自我介绍只有一句话:The open alternative to Salesforce, designed for AI。截至 2026 年 10 月,仓库有 59,424 星、9,680 fork,最新版本 v2.50.0(2026-10-21 发布),主体许可证 AGPL-3.0,少量文件带 Enterprise 商业许可标记。它不是一个功能封闭的 SaaS 副本,而是一套可以像代码一样 build、ship、version 的 CRM 积木:对象、视图、工作流、agent,全部能用 TypeScript 包定义、替换、回滚。

这个定位决定了它的读者是谁:技术团队。官方 README 把卖点写在第一屏——「Twenty is the CRM you build, ship, and version like the rest of your stack」——业务变了就改代码,而不是等厂商排期。云版一分钟开 workspace,自托管一条 Docker Compose 起全套,两条路都通向同一个平台。

Twenty CRM 主界面:公司、机会、任务与时间线视图

CRM as code:SDK 声明实体,AST 在构建期认领

扩展 Twenty 的单位是 app:一个 TypeScript 包,用 twenty-sdk 里的 define 系函数声明实体。npx create-twenty-app my-app 脚手架起手,写一个 defineObject({ nameSingular: 'deal', fields: [...] }) 就有一张带字段类型的业务表;npx twenty app:publish --private 把它推进自己的 workspace,去掉 --private 则上 npm 与 Twenty marketplace。

一个 app 能声明五类实体,覆盖数据、逻辑、界面与 AI:

实体作用
Objects & Fields新数据表,或给内置对象加字段,与内置表同等待遇
Logic Functions服务端 TypeScript,由 HTTP 路由、cron、数据库事件、AI 工具、工作流动作触发
Front Components沙箱化 React 组件,渲染进侧栏、widget、命令菜单
Skills & AgentsAI 能力:可复用的技能指令与带系统提示的自主 agent
Views & Navigation预配置列表视图与侧边栏入口

没有注册样板、没有配置文件:构建期 AST 扫描源码,任何 .ts 文件里的 export default defineObject(...) 都会被认领。schema 一变,typed API client 自动重新生成,应用代码里的字段访问始终带着类型。

两层沙箱:服务端逻辑进隔离 Node 进程,前端组件进 Web Worker

逻辑函数跑在与宿主隔离的独立 Node.js 进程里,不是平台进程内的一个回调;数据访问走按 app 角色权限裁剪过的 typed client,权限在 API 层强制执行——app 只看得到它的角色允许的东西。长任务或限流工作不inline 硬扛:再 enqueue 一次逻辑函数,交给 Twenty 的 worker;中间结果与跨次状态进内置 KV store。安装、升级、卸载三个生命周期还能挂 install hooks,做种子数据、备份与升级校验。

前端组件不走 iframe:它们跑在 Web Worker 里,经 Remote DOM 在主页面渲染原生 DOM 元素——视觉上是原生部件,执行上是隔离上下文。服务端另有 code-interpreter 模块,以可替换 driver 加沙箱脚本承接隔离执行,逻辑函数的运行底座因此可以换实现而不换语义。

用 twenty-sdk 以代码定义对象与视图

AI 层落在哪:聊天 bot、工作流 agent,和一组元工具

AI Chatbot 是对话式的记录查询层:自然语言问全 workspace 的数据,且带页面上下文——停在某家公司的详情页问「this company」,指的就是眼前这条记录。官方给的示例问句就是销售每天的口头语:「哪些机会本月关闭?」「哪些 deal 在 Negotiation 卡了超过 30 天?」「总结我和这个人的往来」。

AI Agents in Workflows 把模型放进流程:AI action 负责enrich、分类、摘要这类单步加工,自主 agent 负责多步任务,两者都能与人工审批、条件分支、外部 API 调用串在同一条工作流里;custom prompt 决定模型怎么处理你的数据。权限模型对 AI 一视同仁:agent 只碰得到其角色可见的对象与字段,设置里按角色逐对象配读写。

服务端 tool-provider 模块给 agent 一组元工具:get-tool-catalog 看当前有什么可用,execute-tool 真正执行,load-skill 与 learn-tools 让 agent 在任务中途装载、学习新技能。工具不是写死的清单,而是可以被 agent 自己扩展的目录。

app 也能自带 AI:defineSkill() 写一段可复用的技能指令(名字、描述、图标加指令正文),defineAgent() 定义带自定义系统提示的 agent。官方文档目前把这条能力标为 alpha:能用,仍在演化。

Twenty 内的 AI agent 与聊天界面

与编码代理的桥梁:官方 skills、Codex 插件、文档 MCP

packages/twenty-agent-skills 是官方的 harness 无关技能集:create-app 脚手架、develop-app 改对象与逻辑、manage-app 管同步部署与日志、publish-app 备市场物料、use-twenty-mcp 经 MCP 连 workspace 并把记录排成可读 Markdown。npx skills add https://github.com/twentyhq/twenty/tree/agent-skills --list 装进 Claude Code、Codex、Cursor、Pi 任一 harness;同一份构建产物也以 twenty 为名发布为 Codex 插件,内置官方文档 MCP server。技能从 agent-skills 分支安装,该分支由 main 的首次成功发布生成,只含构建好的 app 技能。

官方 document-generator 教程把三层的关系演示得很清楚:先写一个生成文档的逻辑函数,把它同时暴露成 AI 工具与工作流动作;再让 agent 在聊天里调用这个工具,「给我一份文档」就成了一次代理任务。同一段服务端代码,同时是 CRM 功能、AI 工具与 agent 的出口——这是「designed for AI」在工程上的具体含义。

技能用途
create-app脚手架一个新 Twenty app
develop-app增改对象、字段、逻辑函数、布局、前端组件、工作流
manage-appremote、同步、构建、部署、日志、排障、CI/CD
publish-appREADME、市场元数据、logo、截图等公开物料
use-twenty-mcp经 MCP 连接 workspace,把记录呈现为可读 Markdown

工程底座与部署形态

TypeScript monorepo,Nx 编排;服务端 NestJS 加 BullMQ 队列、PostgreSQL 存储、Redis 缓存;前端 React 加 Jotai 状态、Linaria 样式、Lingui 国际化。开发态 CLI 监听源文件/live-sync 到运行中的服务器,改一个文件一秒内在 UI 看到;集成测试可以对着真实 Twenty server 跑,CI 模板自带。部署三态:云、Docker Compose 自托管、本地贡献环境,同一套代码。

app 像代码一样版本化与发布

为什么它进办公板块

CRM 是销售团队办公的主系统:客户、机会、邮件、日历、任务都住在里面,一天的办公动作大半从这里过。Twenty 的做法是把 AI 嵌进这个主系统的数据模型与权限系统——聊天 bot 读你可见的记录,agent 在你审批过的流程里跑,app 代码带着角色跑在沙箱里;再往外,官方 agent skills 让编码代理直接参与造 CRM 应用。与同板块里生成文档的办公套件相比,它代表 AI 办公的另一端:不是多产出一份文件,而是让业务数据所在的那个系统本身会对话、会动手、会被代理扩展。办公主流程的开源坐标,缺的正是这一块。

作为亚马逊联盟会员,我们可能从符合条件的购买中获得佣金。