duet 是一个开源的多智能体自主对话聊天室:为每个智能体配置角色、世界观与关系,它们按顺序自动轮流对话;你在旁边当导演,随时改变话题走向。支持多 Provider 混用、思考档位、独立长记忆与成本统计。
功能
duet 围绕「多智能体自主对话」构建了完整的编排与治理能力:独立的视角记忆让身份永不混淆,角色 / 关系 / 导演三层注入让对话可控可编排。
A→B→C… 固定顺序自动轮流发言,循环往复。每个智能体可绑定不同的 Provider 与模型——OpenAI 兼容(含 DeepSeek)/ Responses / Anthropic / Gemini 四种协议在同一会话里混用。
每个智能体维护自己视角的上下文:自己的发言是 assistant,别人的是带名字的 user,物理隔离互不干扰。每 N 轮自动生成第一人称摘要压缩历史,长对话不失忆、不串身份。
逐字流式输出,实时围观 AI 发言。随时优雅暂停(不打断当前发言者),重设轮数 / 时长上限后继续;调用失败自动指数退避重试,期间可随时退出。
每个智能体可单独设置思考档位(low / medium / high…),按所选模型动态拉取支持的档位,自动映射为各协议的原生推理参数——推理模型即插即用。
智能体模板(名字 / 角色描述 / 性格)与世界观模板在设置页集中维护,新建对话全部点选、不手填。常用设定一次保存,处处复用。
可视化关系画布:每条连线编辑两份第一人称描述——「A 眼中的 B」与「B 眼中的 A」可以不同,允许误解、暗恋与信息差。关系随会话注入各智能体的角色卡。
以导演身份随时下达干预指令:「让话题转向…」「加入一个冲突…」。可设有效期(永久或 N 轮),以最高优先级注入所有智能体的下一轮上下文,对话进行中热更新。
AI 聊得比你读得快?翻上去回看历史时,后端自动缓冲几轮、等你回到底部再继续生成——自主对话第一次有了「人类友好的播放节奏」。
快速开始
duet 是本地优先的工具:启动后所有配置(包括 API Key)都在页面里维护,环境变量全部可选。
npx @honlnk/duet
自动拉取并启动,随后自动打开浏览器。建议用 DATA_DIR 指定数据目录,避免会话数据写到包目录:
# 或全局安装后使用
npm i -g @honlnk/duet
DATA_DIR=~/.duet duet-chat
git clone https://github.com/honlnk/duet.git
cd duet
pnpm install
pnpm dev
开发模式前后端分离:前端 http://localhost:5174(热更新),后端 http://localhost:3000(API + WebSocket)。生产模式 pnpm build && pnpm start 单进程托管。
docker compose up -d --build
多阶段构建(alpine),非 root 运行,内置健康检查;会话数据与 Provider 配置通过卷(/data)持久化。
首次访问会提示未配置。点右上角「Provider」添加第一条:选择协议(OpenAI 兼容 / Responses / Anthropic / Gemini),填 API Key、Base URL、模型名,可点「获取列表」拉取上游模型。第一条自动成为默认。
选话题(可叠加世界观)→ 从模板点选 2~10 个智能体 → 开始。高级设置里可为每个智能体单独绑定 Provider、思考档位、温度、摘要频率等。
A 先发言、B 接力……自动循环。随时点「暂停」优雅停止;底部输入框可下达导演指令(永久 / N 轮有效),下一轮立即生效。右侧面板实时显示轮次、token 与成本。
自部署
单 Node 进程即可完整运行(静态前端 + REST API + WebSocket),无需外部数据库。推荐用 Docker Compose 或 pm2 / systemd 守护。
git clone https://github.com/honlnk/duet.git
cd duet
docker compose up -d --build
或直接 docker run:
docker build -t duet .
docker run -d -p 3000:3000 -v duet-data:/data duet
全部可选。API Key / 模型 / 价格等凭证不走环境变量,启动后在页面 Provider 面板维护(落盘到 providers.json)。
| 变量 | 默认值 | 说明 |
|---|---|---|
PORT | 3000 | 服务端口(0 = 自动分配) |
DATA_DIR | data/sessions | 会话数据持久化目录(providers.json 落盘到其父目录) |
ABSOLUTE_MAX_ROUNDS | 200 | 全局硬熔断轮数 |
ABSOLUTE_MAX_DURATION_SEC | 7200 | 全局硬熔断时长(秒) |
REQUEST_TIMEOUT_MS | 30000 | 单次 AI 调用超时(毫秒) |
providers.json),前端不直接调用任何模型 API