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)都在页面里维护,环境变量全部可选。你唯一要手动做的是配一个 API Key——角色、话题、关系这些对话配置,直接告诉右下角的机器人就行。
npx @honlnk/duet
唯一前置 uv(brew install uv):npm 包内嵌 Python 后端与页面产物,由 uv 准备 Python ≥3.12 运行环境——无需预装 Python。启动后自动打开浏览器。
git clone https://github.com/honlnk/duet.git
cd duet
pnpm install && cd server && uv sync && cd ..
pnpm dev
开发模式前后端分离:前端 http://localhost:46738(热更新),后端 http://localhost:23892(API + WebSocket)。生产模式 pnpm build 后 uv run duet-langgraph 单进程托管。
docker compose up -d --build
多阶段构建(alpine),非 root 运行,内置健康检查;会话数据与 Provider 配置通过卷(/data)持久化。
首次访问会提示未配置。点右上角「Provider」添加第一条:选择协议(OpenAI 兼容 / Responses / Anthropic / Gemini),填 API Key、Base URL 与模型名,可点「获取列表」拉取上游模型。第一条自动成为默认,到此设置就结束了。
配完 API 不用研究任何设置页——打开右下角的机器人,把需求说成人话就行:「帮我建三个角色:产品经理、前端工程师、测试工程师,再来一个深夜版本评审的话题,让他们互相有点摩擦」。机器人当场调用工具建好角色模板、话题模板和关系,每一步建了什么、改了什么,都实时展示在对话里,不满意就让它改。
机器人建好的模板已直接出现在模板库里:新建对话时选话题、点选这 2~10 个角色 → 开始。A 先发言、B 接力……自动循环;底部输入框随时下达导演指令(永久 / N 轮有效),右侧面板实时显示轮次、token 与成本。
自部署
单 Python 进程即可完整运行(静态前端 + REST API + WebSocket),无需外部数据库。推荐用 Docker Compose 或 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