FishChat 是一个本机运行的纯对话 Agent。它只保留聊天所需的能力:流式回答、可选推理、联网搜索和图片输入,没有欢迎词模板、角色设定或其他默认提示词注入。
- DeepSeek 风格暗色网页,支持桌面端和移动端
- 独立全屏 TUI:复用同一配置、SQLite 会话和模型后端,不要求浏览器
- 同时支持 OpenAI 兼容的 Chat Completions 与 Responses API;当前本地配置为
deepseek-v4-flash+ Responses API - Markdown 回答支持 KaTeX 数学公式,兼容
$...$、$$...$$、\\(...\\)和\\[...\\] - 推理强度可选:关闭、高、最大;推理内容默认折叠
- 联网搜索独立开关:Responses API 可调用模型原生
web_search,Chat Completions 使用项目内置open-websearch - PNG、JPEG、WebP 图片输入;单张不超过 10 MB,每条消息最多 4 张
- 主模型不支持图片时,可一键启用 MiMo 视觉辅助后重新发送
- SQLite 本地会话历史、搜索来源、停止生成和失败重试
- 网页设置面板可修改模型、认证方式、能力声明和默认行为
要求:Windows、Node.js 22 或更高版本、pnpm。
双击:
FishChat.cmd
也可以在 PowerShell 中运行:
.\start.ps1脚本会检查依赖、构建项目、启动 http://127.0.0.1:3000 并打开浏览器。关闭启动窗口或按 Ctrl+C 会停止服务。
如果本地配置不存在,脚本会从 config/settings.example.json 创建 config/local.settings.json 并打开记事本。填写密钥后重新启动即可。
双击:
FishChat-TUI.cmd
或在 PowerShell 中运行:
.\start-tui.ps1TUI 会优先复用已运行在 127.0.0.1:3000 的 FishChat 后端;若网页服务未运行,则只在本次终端进程中启动一个静默的内嵌后端。两种方式都读取同一个 config/local.settings.json 和 data/fishchat.db。退出 TUI 时,仅关闭由它自己启动的内嵌后端。
交互中直接输入消息并按 Enter 发送。常用快捷键和命令:
Tab 切换推理强度
Ctrl+W 开关联网搜索
Ctrl+N 新建对话
Ctrl+C 停止当前生成;空闲时退出
PageUp / PageDown 浏览较早或最新内容
/image <图片路径> 加入图片,支持带空格或中文的路径
/vision on|off 开关已配置的视觉辅助模型
/open <序号> 打开会话
/thinking on|off 展开或折叠推理内容
/retry 重试最近的失败回答
/settings 查看不含真实密钥的配置摘要
/help 查看全部命令
也可以使用同一套 TUI/API 客户端执行一次性调用,方便脚本和连通测试:
pnpm build:server
pnpm tui -- --prompt "只回复 OK" --reason off --no-web --temporary--image <路径> 可重复使用,最多 4 张;--web 开启联网;--temporary 会在完成后删除这次测试会话。TUI 会以终端友好的纯文本呈现 Markdown,并保留 LaTeX 源表达式;网页版继续使用 KaTeX 排版公式。
唯一运行配置文件是:
config/local.settings.json
API Key 按需求以明文 JSON 保存,不读取 .env,也不会把模型 API Key 注入系统环境变量。此文件已被 Git 忽略,但任何能读取该文件的本机用户都能看到密钥,请勿分享或提交它。
配置示例:
{
"mainModel": {
"endpoint": "https://api.deepseek.com/v1/responses",
"model": "deepseek-v4-flash",
"protocol": "responses",
"authMode": "bearer",
"apiKey": "",
"supportsVision": false,
"supportsNativeWebSearch": true
},
"visionModel": {
"enabled": false,
"endpoint": "https://api.xiaomimimo.com/v1/chat/completions",
"model": "mimo-v2.5",
"protocol": "chat-completions",
"authMode": "api-key",
"apiKey": "",
"supportsVision": true,
"supportsNativeWebSearch": false
},
"search": {
"provider": "open-websearch",
"fakeIpCidrs": ["198.18.0.0/15"],
"resultLimit": 8
},
"defaults": {
"reasoning": "high",
"webSearch": false
}
}设置面板不会返回真实 API Key;已配置的密钥以只读密码圆点显示。只有点击“更换”后才能输入新密钥,未主动更换时保存会保留原密钥。前端和服务端都会拒绝包含中文、空格等非可打印 ASCII 字符的密钥,避免无效文本进入 HTTP 请求头。切换 API 协议时,常见的 /chat/completions 与 /responses 路径会自动同步调整。视觉辅助默认关闭,只有消息包含图片时才会调用。
- 普通对话请求只发送本地会话中的
user、assistant和必要的tool消息,不添加system消息。 - 联网开关关闭时,不向模型发送工具定义。
- Responses API 开启联网时,仅发送内置工具声明
{"type":"web_search"};不注入系统提示词,也不在本地模拟原生搜索。 - Chat Completions 开启联网时,只加入本地搜索与网页读取工具;外部网页内容会被标记为不可信数据。
- 使用视觉辅助时,MiMo 只收到一条必要的视觉转录指令和用户图片;它不负责回答问题。其结果会明确标记后再交给主模型。
运行时数据位于 data/,并已被 Git 忽略:
data/fishchat.db:SQLite 会话、消息、来源和状态data/uploads/:用户上传的图片副本data/*.log:一键启动时的服务日志
删除对话时,对应数据库记录和上传图片会一起删除。删除操作不可撤销。
pnpm install
pnpm dev
pnpm dev:tui开发网页位于 http://127.0.0.1:5173,API 位于 http://127.0.0.1:3000。
pnpm test
pnpm build
pnpm start
pnpm tuipnpm build 同时执行服务端和网页端 TypeScript 检查。服务只监听回环地址,并拒绝非本机网页来源的修改请求。
src/client/ React 网页
src/tui/ Ink 全屏终端界面与单次调用入口
src/server/chat/ Chat Completions、Responses API 与 Agent 工具循环
src/server/images/ 图片校验和本地存储
src/server/search/ open-websearch 适配
src/server/routes/ 对话、流式事件、重试 API
src/server/database.ts SQLite 数据层
src/shared/types.ts 前后端共享类型
config/settings.example.json
start.ps1 / FishChat.cmd Windows 网页版一键启动
start-tui.ps1 / FishChat-TUI.cmd
Windows TUI 一键启动
Missing local settings file:复制config/settings.example.json为config/local.settings.json,或直接运行start.ps1自动创建。- 图片发送时提示需要视觉辅助:点击“开启并重新发送”,或在设置中打开视觉辅助。
- Responses API 联网提示能力不可用:在主模型设置中确认“原生 Web Search”能力,或切换回 Chat Completions 使用本地搜索。
- 搜索结果异常:在设置中点击联网搜索的“测试连接”;Chat Completions 路径还需检查本机代理或 Fake-IP 网段。
- 端口 3000 被占用:关闭占用该端口的程序后再启动。脚本不会终止未知进程。
- TUI 提示“需要真实终端”:请运行
FishChat-TUI.cmd或在 PowerShell/Windows Terminal 中执行pnpm tui;管道环境请改用--prompt。