单个 LLM 的回答常带幻觉、过时信息或推理跳跃。让执行模型与审核模型角色分离,能显著降低事实错误并提升内容完整度。
苦于某度翻译各种广告、非 VIP 限制图文翻译次数等,于是创建了 翻译 功能,借助视觉模型实现翻译自由。
提示词每次都需要重新编辑,于是做了一个提示词模版管理工具,支持维护模版、支持直接编辑不保存复制功能,这样每次就在模版上填入本次任务内容即可复制使用。
基于以上,一个集 审核-反思对话、AI 翻译、提示词管理 于一体的多功能 AI 工具箱就诞生了。所有功能均通过可配置的 OpenAI-compatible API 驱动,支持任意兼容的 LLM 后端。
| 功能 | 说明 | 核心技术 |
|---|---|---|
| 审核-反思对话 | 双模型互审,执行端与审核端角色分离,自动循环反思改进 | WebSocket 流式渲染、结构化审核协议 |
| AI 翻译 | 文本翻译 + 图片翻译,支持文件上传,多语言方向选择 | 独立 API 配置、AES-GCM 加密存储 |
| 提示词管理 | 管理可复用的提示词片段,支持创建、编辑、复制、删除 | 持久化 JSON 文件、搜索过滤 |
当一个模型回答得不够好时,由另一个模型来挑刺、给修改建议,再让第一个模型基于审核意见重新作答 —— 循环若干轮,输出经过相互校验的最终回答。
用户提问 → [执行模型] 生成回答 → [审核模型] 评估
→ verdict=pass → 直接输出
→ needs_improvement → 执行模型反思改进 → 再次审核(循环)
→ 达到 maxCycles 次后输出最终结果
- 多模型互审:通过
models.json配置任意 OpenAI-compatible 模型作为「执行模型」与「审核模型」 - 可配置反思轮数:默认 2 轮,1-5 可调;审核通过时自动短路
- 结构化审核报告:每轮输出 issues / overall_score / verdict 三段式结果
- 多窗口并行对话:侧边栏多开会话,互不干扰,每会话可独立指定模型
- 模版系统:保存「执行提示词 + 审核提示词」组合,一键复用
- 流式渲染:基于 WebSocket 的事件驱动,逐阶段推送 + Markdown 代码高亮
- 反思模式可关:关闭后等同普通单轮问答
- 点击侧边栏 + 新建会话
- 选择模版(提供执行提示词 + 审核提示词预设)
- 可选择执行端 / 审核端模型,不修改则沿用全局设置
- 输入消息后发送,系统自动执行审核-反思循环
- 每条回复下方可展开「审核报告」查看每轮评分与问题详情
侧边栏底部入口:
- 循环次数:审核/反思闭环运行次数(1-5)
- 模型角色:全局执行端 / 审核端模型选择
- LLM 配置:新增、编辑、删除模型配置(API Key 服务端遮蔽)
- 模版管理:新增、编辑、删除审核模版
- 文本翻译:支持中文 / 英文双向翻译,自动检测源语言
- 图片翻译:上传或拖放图片,利用多模态模型提取并翻译图中文字
- 文件上传:支持 .txt、.md、.json、.html、.xml、.csv 等文本格式导入
- 独立 API 配置:翻译功能拥有独立的 LLM 配置(不与对话共享),API Key 经 AES-GCM 加密后存储在 localStorage
- 粘贴/拖放:图片区域支持粘贴板粘贴和拖放上传
- 通过顶部导航切换到翻译模式
- 选择源语言和目标语言(中文 / 英文)
- 在文本模式下输入或粘贴要翻译的内容(或上传文件)
- 在图片模式下拖放/粘贴/点击上传图片
- 点击翻译按钮执行,结果展示在右侧面板
- 可点击复制按钮一键复制翻译结果
翻译 API Key 使用 Web Crypto API (AES-GCM) 加密后存入 localStorage,密钥不落盘。每次读/写都经过加密/解密操作。
- 提示词管理:集中的提示词编辑器,支持创建、编辑、删除
- 搜索过滤:按名称实时搜索过滤
- 一键复制:快速复制提示词内容
- 复制副本:基于现有提示词快速创建变体
- 持久化存储:所有提示词保存在
prompts.json,重启后保留
- 通过顶部导航切换到提示词管理
- 左侧列表展示所有提示词,支持搜索
- 点击 + 新建提示词,自动在列表中创建并选中
- 右侧编辑区域可修改名称和内容
- 每项提示词的 ⋯ 菜单支持复制副本和删除操作
- 编辑后点击「保存」更新
npm install在项目根目录创建 models.json(已加入 .gitignore,不会被提交到仓库):
[
{
"id": "my-executor",
"name": "GPT-4o",
"baseURL": "https://api.openai.com/v1",
"apiKey": "sk-xxx",
"model": "gpt-4o"
},
{
"id": "my-auditor",
"name": "Claude Sonnet",
"baseURL": "https://api.anthropic.com/v1",
"apiKey": "sk-xxx",
"model": "claude-sonnet-4"
}
]每个模型配置对应一个 OpenAI-compatible API(POST /v1/chat/completions)。至少配置 1 个模型即可运行对话功能。翻译功能有独立的 API 配置,在翻译页中设置。
支持任意兼容 OpenAI 接口的服务:OpenAI、Anthropic、Google、本地部署的 llama.cpp / Ollama / vLLM / LM Studio 等。
npm run dev并发启动后端(localhost:3001)和前端(localhost:5173)。
npm run dev:backend # 仅后端(tsx watch)
npm run dev:frontend # 仅前端 (vite)
npm run build # 构建生产版本
npm run stop # 关闭 dev 启动的进程chat_agent/
├── models.json # [安全] 模型配置(对话用)
├── templates.json # 运行时持久化的用户模版
├── prompts.json # 运行时持久化的提示词
├── src/
│ ├── shared/
│ │ └── types.ts # 前后端共享 WebSocket / 业务类型
│ ├── backend/
│ │ ├── index.ts # 后端入口
│ │ ├── server.ts # Express + WebSocketServer 路由
│ │ ├── api-provider.ts # OpenAI-compatible API 客户端抽象
│ │ ├── session/
│ │ │ ├── session-manager.ts # 纯内存会话管理
│ │ │ └── types.ts
│ │ ├── cycle/
│ │ │ ├── cycle-orchestrator.ts # 审核-反思状态机(AsyncGenerator)
│ │ │ └── retry.ts # API 调用自动重试
│ │ ├── audit/
│ │ │ └── audit-protocol.ts # 审核提示词模板 + 报告解析器
│ │ ├── prompt/
│ │ │ └── prompt-manager.ts # 提示词持久化管理
│ │ ├── template/
│ │ │ └── template-manager.ts # 模版持久化(templates.json)
│ │ └── __tests__/
│ ├── frontend/
│ │ ├── main.tsx
│ │ ├── App.tsx # 顶层状态 + WS 事件 + 路由
│ │ ├── Sidebar.tsx # 会话列表 + 搜索
│ │ ├── ChatWindow.tsx # 对话消息流 + 输入工具栏
│ │ ├── SettingsPanel.tsx # 全局设置模态框
│ │ ├── NewDialogModal.tsx # 新建对话弹窗
│ │ ├── ProgressIndicator.tsx # Cycle 阶段进度
│ │ ├── AuditReportPanel.tsx # 单轮审核报告 UI
│ │ ├── TranslationTab.tsx # 【翻译】文本 + 图片翻译
│ │ ├── PromptTools.tsx # 【提示词】编辑器
│ │ ├── TemplateManager.tsx # 独立模版管理
│ │ ├── useWebSocket.ts # WebSocket Hook(自动重连)
│ │ ├── crypto-storage.ts # AES-GCM 加密存储
│ │ ├── index.css # 全局样式
│ │ └── __tests__/
├── docs/
│ ├── adr/ # 架构决策记录
│ └── agents/ # 项目内部约定
├── package.json
├── vite.config.ts
├── tsconfig.json / tsconfig.backend.json
├── CONTEXT.md
└── README.md
| 层 | 技术 |
|---|---|
| 前端 | React 19 + Vite 6 + TypeScript 5 |
| 渲染 | react-markdown + rehype-highlight + remark-gfm |
| 后端 | Node.js + Express + ws (WebSocket) |
| 模型调用 | OpenAI-compatible API(POST /v1/chat/completions) |
| 持久化 | localStorage(会话/翻译配置)+ JSON 文件(模版/提示词) |
| 加密 | Web Crypto API (AES-GCM) |
| 测试 | Vitest + @testing-library/react + jsdom |
- 服务端遮蔽 — 下发的 API Key 自动替换为
********,前端无法直接读取 - 加密存储 — 翻译 API Key 使用 AES-GCM 加密后存入 localStorage
- 一次性输入 — 密码类型输入框,聚焦自动清空遮蔽值
| type | 说明 |
|---|---|
ping |
心跳 |
session:list |
拉取服务端会话列表 |
session:create |
新建会话 |
session:close |
关闭会话 |
chat:message |
发送消息(含上下文恢复) |
config:update |
更新全局配置 |
config:save-models |
保存模型配置到文件 |
template:create / update / delete / list |
模版 CRUD |
prompt:create / update / delete / list |
提示词 CRUD |
| type | 说明 |
|---|---|
config:updated |
当前全局配置(含模型列表) |
session:* |
会话生命周期事件 |
template:* / prompt:* |
模版/提示词变更通知 |
cycle:start |
Cycle 开始 |
executor:* |
执行端各阶段(generating / streaming / response / complete) |
audit:* |
审核端进度与结果 |
reflection:* |
反思阶段 |
cycle:complete |
Cycle 结束,含最终答案和所有轮次详情 |
cycle:error |
错误通知 |
{
"issues": [
{
"severity": "high",
"description": "事实错误:XX",
"suggestion": "应改为 YY"
}
],
"overall_score": 7,
"verdict": "needs_improvement"
}npm test # 一次性运行
npm run test:watch # 监听模式Q: 三个功能共用同一套 API Key 吗?
A: 对话功能和翻译功能使用独立的 API 配置。对话模型在 models.json 中配置,翻译模型在翻译页的设置面板中配置(Key 经加密存储)。
Q: 重启服务后对话历史还在吗?
A: 会话历史通过 conversationHistory 注入,重启后前端发送消息时会带上历史,模型可继续上下文。
Q: 翻译功能支持哪些模型? A: 支持任意 OpenAI-compatible 的文本模型和视觉多模态模型(图片翻译需要支持多模态的模型,如 GPT-4o、Claude 3.5 Sonnet 等)。
Q: 提示词和模版有什么区别? A: 模版用于对话功能,包含「执行提示词 + 审核提示词」一对组合。提示词是独立的文本片段,用于任何需要快速插入预设内容的场景,两者相互独立。
Q: 为什么有时候反思轮数没跑满就结束了?
A: 审核 verdict=pass 时短路,这是设计行为——内容已达标则跳过剩余反思以节省算力。
MIT