Aithos [/ˈaɪ.θoʊs/] = AI + Ethos, 中文名艾索斯, 意为 AI 之人格.
Aithos 是一个轻量、纯前端的多智能体群聊应用。你可以在浏览器里配置多个 AI 角色,将它们拉进同一个群聊里自动对话、轮流发言,甚至让“AI 选择器”根据上下文决定下一位发言者,适合:
- 多角色 Prompt 设计与调优
- 多智能体协作交互的概念验证
- 演示 / 教学场景中的“AI 群聊”展示
整个应用只有一个 index.html,无需构建、无需后端,直接打开即可使用。
-
多智能体群聊
- 左侧:群聊列表(多个场景 / 话题)
- 右侧:AI 角色列表(可以被多个群聊复用)
- 中间:对话区,支持 Markdown、自动滚动、置底按钮
-
自动回复与多种对话模式
- 轮流固定(round robin):按顺序轮流发言
- 随机(random):随机挑选下一位 AI 说话
- AI 决定(ai selector):通过单独的模型,根据上下文选择下一位发言者
-
细粒度的多智能体“视野 / 权限”控制
- “我能看见谁 / 谁能看见我”:控制消息对各个 AI 的可见性
- “视野(消息上下文)”:用表达式描述每个角色能看到的历史片段(如
1,2,8:0、-4:-1等)
-
OpenAI / 兼容接口支持
- 全局 Base URL + API Key 配置(默认指向官方 OpenAI API)
- 每个角色可选是否继承全局配置,或使用独立的 Base URL、API Key、模型、温度、最大 tokens
- 内置模型列表刷新(通过
models.list自动拉取)
-
TTS 文本朗读集成(可选)
- 全局 TTS 配置:Base URL、API Key、Voice、Style、Rate、Pitch、Format
- 每个角色可覆盖或继承全局 TTS 配置
- 配合一个兼容 Microsoft Azure Speech 的后端即可使用
- 本仓库提供了配套文档:
tts-api-doc.md
-
智能 UI 与良好交互
- 消息置底按钮 + 自动滚动逻辑:输入时强制置底,阅读历史时不打断
- 消息悬停工具条:复制 / 导出 等操作
- 输入框支持
@角色名智能提示与补全 - 模态框头部 / 底部固定,超长内容滚动区域独立
-
数据本地持久化
- 所有群聊、角色、全局配置、界面偏好等都保存在浏览器
localStorage - 不依赖任何后端数据库
- 清除浏览器缓存 / 本地存储会清空数据
- 所有群聊、角色、全局配置、界面偏好等都保存在浏览器
-
响应式布局
- 桌面端:双侧栏 + 中间对话区域
- 移动端:侧栏默认收起,有遮罩层,支持单侧打开 / 关闭
- 侧栏展开状态会记忆在
localStorage中
- 访问:https://aithos.pages.dev
- 推荐浏览器:最新版 Chrome / Edge / Safari / Firefox
- 建议在桌面端体验完整的多智能体配置与高级功能
- 克隆或下载仓库代码
- 在文件管理器中双击打开
index.html(或右键用浏览器打开) - 即可在本地开始配置与使用
注意:部分浏览器在
file://协议下对模块导入有安全限制,如遇报错,建议使用方式二。
只要能够提供静态文件服务即可,推荐用 Python 自带的 HTTP 服务:
cd WebMultiAgentChat
python3 -m http.server 8080然后在浏览器中访问:
http://localhost:8080
WebMultiAgentChat/
├─ index.html # 主页面(应用入口 & 所有逻辑)
├─ __index_backup__.html # 旧版本备份
├─ __index2_backup__.html # 另一份备份
├─ test-markdown-punctuation.html # Markdown 标点修复函数测试页
├─ tts-api-doc.md # TTS 后端 API 文档(Microsoft Azure 语音服务)
├─ AGENTS.md # 面向 Agent 的说明文档(本项目的 Agent 规范)
└─ README.md # 本说明文件
首次打开页面时,建议先进行“用户设置”:
- 点击左下角的「设置」按钮,打开“用户设置”模态框
- 在“用户昵称”中填入你的显示名称
- 在“全局 API 配置”中填入:
- Base URL:如
https://api.openai.com/v1或你的兼容服务地址 - API Key:你的密钥(保存在浏览器本地)
- 模型:选择默认模型(如
gpt-4o/gpt-3.5-turbo等) - 如需获取完整模型列表,可以在角色或群聊设置中点击“刷新模型”
- Base URL:如
安全提示:应用通过浏览器直接调用接口(
dangerouslyAllowBrowser: true),请在可信环境中使用你的 API Key。若使用自建的兼容网关,请格外注意网关的访问控制。
-
点击右侧栏中的「新建角色」按钮
-
在弹出的“角色设置”中填写:
- 角色名称(必填):会显示在消息头部
- 角色定位:一句话描述身份,如“产品经理”、“安全顾问”等
- 系统提示词(必填):详细描述性格、边界、说话风格等
- 头像颜色:用于区分不同角色的消息气泡颜色
-
配置 API 行为:
- 勾选 / 取消勾选「使用全局配置」
- 若不使用全局配置,可为此角色单独设置:
- Base URL
- API Key
- 模型(可点击“刷新”加载模型列表)
- Temperature 与 Max Tokens
-
可选:配置 TTS(语音朗读)行为:
- 使用全局 TTS 配置,或单独设置 TTS Base URL / API Key / Voice / Style 等
-
高级:JSON ⇄ Markdown 导入导出
- “导入 JSON 到提示词”:将任意 JSON 扁平化为 Markdown 列表并追加到提示词末尾,适合把一个配置/知识结构快速附加给角色
- “导出为角色 JSON”:
- 完全导出:包含当前表单所有字段(包括敏感信息)
- 导出(不包括敏感信息):剔除 API Key 等
- 仅导出角色提示词
角色配置保存在浏览器 localStorage,刷新页面不会丢失。
-
点击左侧栏中的「创建群聊」按钮
-
在“群聊设置”中填写:
- 群聊名称(必填)
- 群聊描述(选填)
- 选择参与的 AI 角色(至少一个)
-
可配置自动回复:
- 勾选「自动回复」后,可选择模式:
- 轮流固定(round_robin):参与角色按顺序轮流发言,最多 N 轮
- 随机(random):每轮随机挑选不同角色,避免连续同一个
- AI 决定(ai_selector):使用一个“选择器模型”,根据最近对话为下一轮选择合适的角色
- “最大自动回复轮数”:控制一次自动流程最多运行多少轮
- 勾选「自动回复」后,可选择模式:
-
保存后,群聊会出现在左侧列表中,选中即可进入对话。
- 在底部输入框中输入内容回车或点击“发送”即可发消息
- 输入框中输入
@会弹出当前群聊内角色列表,可快速 @角色名 指定或提示下一位发言者 - 若开启“自动回复”,发送后会自动触发多轮 AI 互动:
- 轮流模式:按顺序逐个角色回复
- 随机模式:随机选择,避免重复
- AI 决定模式:通过单独的选择器模型构造一个多轮“谁说话”的控制流
在没有新输入内容但已有正在运行的自动回复时,再次点击发送按钮会变成“停止”按钮,用于中止当前自动流程。
对于每个“群聊内的角色”,都可以在角色设置中打开“权限(仅当前群聊)”,配置:
-
我能看见谁(iCanSee)
- all:能看到群内所有其他角色的消息
- none:完全看不见其他 AI(只能看到用户)
- 自定义列表:只看到某几个指定角色
-
谁能看见我(canSeeMe)
- all:我的消息对所有角色可见
- none:我的消息只对用户可见
- 自定义列表:仅对部分角色可见
-
视野(消息上下文)
- all:默认看到所有历史消息
- 最近 N 条:只看最近几条非系统消息
- 自定义规则:用表达式描述可见消息索引,例如:
1,2,8:0-4:-19::01,3,-2
系统会根据这些设置,在真正调用模型前构造该角色的“可见历史”,作为其上下文。
当群聊的自动回复模式选择「AI 决定」时:
- 系统会为群聊中的所有候选角色构造一个列表(姓名、角色)
- 从最近的若干轮对话中,提取用户与各角色的发言,整理成一段“对话记录”
- 通过一个“选择器模型”(可单独指定,也可使用全局模型)发送一条系统消息,要求它返回下一位发言者的名字或
"STOP" - 若返回有效角色名,则让该角色进行一次回复;若返回
"STOP",则结束自动流程
相关逻辑都在浏览器端运行,仅通过 API 与模型交互。
本项目支持将文本转换为语音播放,但自身不包含后端服务,需要你提供一个兼容的 TTS 接口。
推荐搭配仓库:https://github.com/zuoban/tts
本仓库已附带详细 TTS API 说明:tts-api-doc.md,包含 /tts、/v1/audio/speech、/voices、/reader.json 等接口定义。
配置步骤示例:
-
打开“用户设置”
-
在「TTS 语音朗读(全局)」部分填写:
- TTS Base URL:你的 TTS 服务地址,例如
https://your-domain.com - TTS API Key:后端约定的认证方式(一般对应
api_key或Authorization: Bearer) - Voice / Style:可通过“刷新”按钮从后端拉取可选语音列表
- Rate / Pitch / Format:根据后端支持在 -100~100 范围内调整语速、音调及输出格式
- TTS Base URL:你的 TTS 服务地址,例如
-
在角色设置中勾选“使用全局配置”或配置角色自己的 TTS 参数
- 所有数据(包括用户昵称、全局/角色配置、群聊列表、消息历史、侧栏展开状态等)都保存在 浏览器本地的
localStorage中 - 应用本身不提供任何服务器端数据存储逻辑
- 清除浏览器缓存 / 本地存储会导致所有配置与聊天记录丢失,请注意备份(例如导出角色 JSON)
- 若你在公共设备上使用,请注意清理浏览器数据,以避免泄露 API Key 等敏感信息
本项目刻意保持极简形态,方便直接修改与二开:
-
技术栈
- 纯 HTML + CSS + 原生 JavaScript(模块脚本)
- 使用 CDN 引入:
openai@6.xJavaScript SDK- Vditor(用于 Markdown 渲染与预览)
-
主要文件
- 所有 UI + 逻辑聚合在
index.html中 test-markdown-punctuation.html用于测试 Markdown 标点修复函数(如**hello,**→**hello** ,)AGENTS.md描述了项目中 Agent 的行为/规范(更多偏向对“AI 助手本身”的约束)
- 所有 UI + 逻辑聚合在
-
本地开发建议
- 使用浏览器开发者工具观察
localStorage中的存储结构 - 如需拆分为多文件或加入打包工具(Vite / Webpack 等),建议:
- 先将
<script>中的逻辑抽离为独立.js模块 - 再在 HTML 中通过打包后的入口文件引入
- 先将
- 使用浏览器开发者工具观察
Q:为什么需要在前端页面里填 API Key?它安全吗?
A:应用通过浏览器直接调用 OpenAI 或兼容服务的 API,为了不引入后端,必须在前端持有 Key。Key 会保存在本地 localStorage 中,不会上传到本仓库或其他服务器。但这意味着:
- 你应仅在可信设备与网络环境中使用
- 如果使用官方 OpenAI Key,请避免在公共电脑上长期保存
- 更推荐在自己控制的 API 网关上使用“临时 / 限权 Key”
Q:能否使用非 OpenAI 的大模型服务?
A:可以,只要它提供了 OpenAI 兼容接口(如 POST /v1/chat/completions,GET /v1/models 等),你就可以在“全局 API 配置”或角色配置中改成对应的 Base URL 和模型名称。
Q:聊天记录丢失了怎么办?
A:本项目不会自动上传或远程备份数据,若浏览器清除缓存、本地存储,或在隐身模式下使用,数据都会随之消失。
目前主要的手动备份方式是 导出角色 JSON,后续若你有需求,可以自行扩展“导出全部群聊/消息”的功能。
欢迎通过以下方式参与项目:
- 提交 Issue:反馈 Bug、提出新功能建议、讨论多智能体玩法
- 提交 Pull Request:UI 改进、交互优化、模型集成增强、文档补充等
在提交 PR 前,请尽量确认:
- 基本功能可用,没有明显的控制台报错
- 新增或修改的 UI 与现有风格保持一致
- 不在前端代码中硬编码真实的 API Key 或其他敏感信息
MIT