🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

鱼的世界 1838601405/dsh-fish-world

DeepSeek Harness
18386014054 天前有提交已提供中文文档扫描:含敏感能力

养一条会写日记、有心情、能成长的电子鱼

32.5/100
综合分
4
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 1838601405/dsh-fish-world
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么
dsh 原生插件 · platform
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 4 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

给 DeepSeek Harness 的开源养鱼插件:日记、心情、成长,以及默认关闭的 QQ(适配dsh-qq-bridge和AstrBot) / B 站 / 抖音能力。

README

由 DeepSeek 最新模型翻译生成
dsh-fish-world · 鱼的世界 ⚠️ 请注意,本项目为 AI 许愿产物。 一个面向 DeepSeek Harness(DSH)的开源整合插件。你只需启用 一个 DSH bundle;QQ、记忆、心情、B 站和朗读能力由本包的 composition patch 统一装配。dsh-whale-widget 是可选项:已安装时自动与右侧面板联动,未安装时鱼世界面板独立显示。不要把这些内部子插件作为 profile 顶层 bundle 重复启用。 新特性 v0.2.0+:支持通过 astrbot_plugin_fishworld_bridge 把 AstrBot 当成鱼的 QQ 通道,无需再装 dsh-qq-bridge。也能借用 AstrBot 里已装的插件工具——但说话的一直是同一条鱼(AstrBot 只出「手」,不出「嘴」)。详见下方【接入 AstrBot】一节。 兼容性 - 操作系统:Windows、macOS、Linux;运行时路径使用 Node.js os.homedir()、path.join() 和 DSH 提供的 DSH_HOME,不绑定某台电脑的盘符或用户名。 - Node.js:>=20。 - DSH:使用公开的 dsh.bundle.patch / client injection / webServer 接口。
展开完整文档(README 剩余 1 节)
dsh-fish-world · 鱼的世界

⚠️ 请注意,本项目为 AI 许愿产物。

一个面向 DeepSeek Harness(DSH)的开源整合插件。你只需启用 一个 DSH bundle;QQ、记忆、心情、B 站和朗读能力由本包的 composition patch 统一装配。dsh-whale-widget 是可选项:已安装时自动与右侧面板联动,未安装时鱼世界面板独立显示。不要把这些内部子插件作为 profile 顶层 bundle 重复启用。

新特性 v0.2.0+:支持通过 astrbot_plugin_fishworld_bridge 把 AstrBot 当成鱼的 QQ 通道,无需再装 dsh-qq-bridge。也能借用 AstrBot 里已装的插件工具——但说话的一直是同一条鱼(AstrBot 只出「手」,不出「嘴」)。详见下方【接入 AstrBot】一节。

兼容性

- 操作系统:Windows、macOS、Linux;运行时路径使用 Node.js os.homedir()、path.join() 和 DSH 提供的 DSH_HOME,不绑定某台电脑的盘符或用户名。
- Node.js:>=20。
- DSH:使用公开的 dsh.bundle.patch / client injection / webServer 接口。语音能力为可选子依赖;未提供该能力的 DSH 版本仍可使用其它功能。
- 默认 DSH 数据目录为 ~/.dsh;自定义安装位置请设置环境变量 DSH_HOME。

安装

从 GitHub 安装

在 DSH 的插件管理器中安装仓库 github:<GitHub 用户或组织>/dsh-fish-world。安装后只启用 dsh-fish-world 这个顶层 bundle。

关于配套插件:QQ 桥、心情、鱼的记忆、B 站、朗读桥这几个包不在 dependencies 里,而是声明为可选的 peerDependencies。

原因:DSH 的包管理器开着 blockExoticSubdeps,而这些包只发布在 GitHub(github:owner/repo)。一旦写进 dependencies,它们就成了「异源子依赖」,pnpm 会直接拒绝安装(ERR_PNPM_EXOTIC_SUBDEP),插件根本装不上。

所以正确顺序是:先在插件管理器里装上 dsh-fish-world,再用面板「体检与更新 → 一键安装依赖」把配套插件装到 profile 顶层。缺失时体检会提示,装配时会自动跳过未安装的行,不会导致启动失败。

从源码安装到 desktop profile

git clone https://github.com/<GitHub 用户或组织>/dsh-fish-world.git
cd dsh-fish-world
node scripts/install-desktop.mjs

脚本默认使用 ~/.dsh/profiles/desktop,也支持 --profile=<名称>、--home=<DSH_HOME>。也可通过 DSH_HOME 环境变量指定目录:

$env:DSH_HOME = '你的 DSH 数据目录'
node scripts/install-desktop.mjs

DSH_HOME="$HOME/.dsh" node scripts/install-desktop.mjs

安装器会备份 profile package.json,登记本地源码和依赖、将重复的子 bundle 从顶层列表移除,并记录原位置以便卸载时恢复。完成依赖安装后,完整退出并重开 DSH。

卸载:

node scripts/install-desktop.mjs --uninstall

依赖自检

本插件依赖 4 个独立发布的前置插件:QQ 桥、心情面板、鱼的记忆(dsh-fish-memory)、B 站能力;抖音能力与朗读桥是可选能力,默认关闭。微信是可选能力:装了 dsh-wechat-plugin 才算就位。依赖体检与依赖清单会把「鱼与世界」里 QQ、B 站、抖音、微信四个平台的前置插件单独列成一组,缺哪个平台就说明哪个平台起不来。缺少必需依赖时,插件会在启动、打开面板、调用工具和渲染系统提示词时提醒;依赖装齐后完全安静。

接入 AstrBot 时无需 dsh-qq-bridge:当你在鱼世界的「设置 → AstrBot 接入」里启用 AstrBot 作为 QQ 通道后,鱼的世界会通过本地的 astrbot_plugin_fishworld_bridge 去调用 AstrBot 的 OneBot 适配器,因此可以卸载 dsh-qq-bridge。如果你仍想保留它,两套方案也可以共存:只要 AstrBot 通道的开关打开,所有 QQ 消息都会优先走 AstrBot,不再向 dsh-qq-bridge 发起任何请求。

GIF / 动态 WebP 的多帧采样已从 dsh-read-animation 合并进鱼世界主包(MIT,保留上游许可证);用户无需再单独安装动画插件。主程序带 sharp 解码依赖,在原始附件准入阶段本地采样时间轴帧,模型接收带时序标注的帧胶片条;普通图片仍走原生图像链路。朗读桥保留为可选能力,但自动朗读默认关闭;右侧齿轮中的「显示朗读桥卡(默认关闭)」只控制卡片显隐,可随时重新打开,不会开启自动朗读。设置页与主界面通过 BroadcastChannel/storage 实时同步显隐状态。若确需自动朗读,可在 $DSH_HOME/fish-world-config.json 设置 { "tts": { "auto": true } }。

"鱼的日记"入口位于面板「鱼的日记」区,由主人查看鱼写的日记:主人只能按日期浏览、审批信任者投稿,不能代笔。鱼通过 fish_world 工具的 diary action 写自己的日记,默认署名为当前外显角色名;信任者提交的内容进入「待主人确认」,主人可在面板逐条通过或拒绝。面板的本地 HTTP 日记路由只允许 GET,POST 一律 405。主人还可以选中正文里的某一句单独批语(片段必须真实存在于原文),批语独立存放、不改原文;鱼写下一篇日记时会读到未回应的批语并自然回应,回应后用 action=diary-comment-ack 标记。
「鱼的请求」面板处理鱼主动提出的事:鱼用 fish_world(action=wish)提出请求,主人在面板里同意或拒绝,并选择语气(直接答复 / 说明原因 / 安慰它 / 简短打发)。语气直接换算成心情影响——安慰式拒绝最轻(-1),冷淡打发最重(-8),同意 +4、安慰式同意 +6。

- 角色人设卡:新增人设卡存储(lib/persona.mjs,落盘 $DSH_HOME/fish-world-personas/<roleId>.md)。「鱼的设定」里可直接粘贴/编辑人设卡,保存后作为「角色人设卡」注入系统提示词,语气与用词以人设卡为准。人设按角色 id 对应,切换角色卡自动切换人设;注入前会去掉 Markdown 装饰并限制长度。

「鱼的设定」面板可给鱼命名、设定它怎么称呼主人、选择外显角色卡,并粘贴角色人设卡。角色名默认为「鱼」;命名后主界面与鲸鱼徽标显示的名字会替换为这个名字。

「鱼的成长」面板记录鱼自己想法的变化。这里刻意不做成摘要累积:成长来自它自己的日记、主人的批语和鱼的请求,每条记录都带来源、可以修订(保留旧版本)、可以按天撤回(撤回后模型不能自行恢复,只能由主人明确恢复)。系统不逼它每天都有新认识,每天最多两条,同一句话不会重复堆积。成长阶段按实际保留的记录数推进:幼鱼 → 小鱼 → 长身体的鱼 → 深水的鱼 → 老鲸。「成长概况」只用一句话说明它最近的状态,具体判断都在「成长记录」里;账本与索引对不上时,概况卡会直接给出「重建索引」,而不是只留一句报错。设计借鉴了 dsh-bili-humanism 的可修正记忆思路(未复制其代码,见 THIRD-PARTY-NOTICES.md);如同上游,这不承诺人格效果,只是上下文与记忆的积累。

「体检与更新」面板有两个按钮:依赖体检只读本机(依赖是否装上、版本、接线、Node 版本与鱼箱隔离状态),完全不联网;更新体检才联网查询每个依赖与插件自身的可用版本,标出「已是最新 / 有新版本 / 未安装 / 查不到」并给出安装命令。网络不通时会如实显示「查不到」,不会编造版本号。两者都不会自动安装或升级任何东西——装不装由你决定。依赖清单分「平台前置」与「基础能力」两组:dsh-qq-bridge、dsh-wechat-plugin、dsh-bili-whale、dsh-douyin-browser-local 分别决定「鱼与世界」里 QQ、微信、B 站、抖音能不能运作,缺哪个都单独标出来。

鱼的样子(头像)

「鱼的状态」里有一张头像卡,样子会随心情变化。

在面板里直接上传:点「上传这张脸」选图即可,按当前情绪保存,下次同情绪自动使用。支持 PNG / JPEG / GIF / WebP,上限 8MB;格式按文件头判定,不看扩展名。想换回来点「恢复角色图」。

也可以手动把图片放进 $DSH_HOME/fish-world-moods/,按情绪命名 —— happy(开心)、calm(踏实)、sweet(甜蜜)、heartache(心疼)、worry(担心)、sad(难过)、jealous(吃醋)。

- 没有对应情绪图时退回角色卡图片并叠加色彩滤镜(明度与饱和度),界面上会如实标注「角色图 + 滤镜」——滤镜只是观感,不是另一张画。
- 情绪判定取心情维度里最强的一项;负面维度加权 0.75,避免轻度「担心」盖过明显「开心」。没有维度数据时按总分五档兜底。维度取自 dsh-feiyu-mood 的 /state,不另立一份表。

主人与鱼

日记页下方有一张「主人与鱼」卡片,把主人做过的批阅互动合成一条时间线:

- 日记批语:显示你批的原句、批语内容、鱼是否已经回应
- 请求裁决:显示同意或拒绝、所选语气(说明原因 / 安慰它 / 简短打发)、你留下的答复

顶部汇总「批语 / 同意 / 拒绝」的数量,以及「鱼还没回应的批语」计数。这是只读汇总,不会产生新记录。

鱼之宝库

「鱼之宝库」(原来的「鱼的收藏」)分四块:图片收藏、网站收藏、鱼的记录、小本本。分区入口改名成「鱼之宝库」,落盘目录仍是 鱼的收藏/,已有数据不用搬家。

图片收藏 —— 鱼自己收藏的表情包,可以管标签、发送。缩略图按卡片宽度自适应排成网格(宽了就多排几列,窄了就少排,格子始终是正方、图片 object-fit: contain 不变形);图片还没加载或加载失败时保留同尺寸的灰底占位,卡片不会因此被压扁。目录路径直接显示在页面上,点「选择目录」就能在本机目录树里挑(不用手打路径),把自己的 png / jpg / gif / webp 放进去就能用。要一次管一批就勾格子左上角的框:全选之后能批量追加标签、批量整理、批量删除(删除要点两下确认),结果就地显示成功几张、失败几张。图库里「索引记的名字和磁盘对不上」的旧记录会在打开时按真实文件名读出来并自动校正,缩略图不会再变成空黑框。

网站收藏 —— 资源与灵感链接。默认来源是 StyleKit 风格库,鱼可以自己去那里挑喜欢的设计风格;类型(设计 / 参考 / 工具 / 文章 / 灵感 / 其它)和标签都由它自己判断。

- 每条网站按分类自动编号:设计 A-01、参考 B-01、工具 C-01、文章 D-01、灵感 E-01、其它 Z-01,每个分类各自从 1 开始排;面板按分类分组显示,改分类会排到新分类队尾并换号
- 链接只存 URL、标题、标签与来源,不抓正文、不镜像内容
- 只接受 http(s) 公网地址:本机、内网段、.local / .internal 一律拒绝
- 同一 URL 不会重复收藏;每小时默认最多 10 条;未知类型统一归为「其它」
- 数据在 <工作区>/鱼的收藏/2 网站链接/:links.json 是事实来源,同目录还会生成一份给人看的 网站清单.md(分类分节、带编号,删掉会自动重建)

鱼想收藏 —— 鱼在聊天里看中了图,先放进「待审」而不是直接进库:她在「鱼的请求」页留下一张图、一个名字和一句理由,你点「收下」才进图库(不占每小时收藏额度),点「不要」就把候选删掉。候选与排队清单在 <工作区>/鱼的请求/想收藏/,里面的图就是候选图本身,删目录等于全部放弃。

图库里每次变动都会重建一份 图库索引.md:按名字排、标出类型(动图 / 静图)与方向标签,想直接翻目录找图时看它就够。

表情按「表情」发:收藏库里的图默认以「表情」形式发出(小而紧凑、可长按收藏),而不是撑满气泡的大图。如果你的协议端不认这个形式,在「鱼与 QQ」里把「表情按哪种形式发」改成 0 即可退回普通图片。

存储位置:一个工作区就是鱼的家

鱼的世界不散落在 $DSH_HOME 里:所有属于鱼的东西都放在同一个根目录下,默认就是当前 DSH 工作区里的「鱼的世界」;没绑定工作区时落到桌面的 鱼的世界。也可以「鱼的设定 → 存储位置」里点选任意目录,路径必须是绝对路径。

鱼的世界/ 鱼之宝库/ 1 图库/ 图片收藏(stickers.json + 图片文件) 2 网站链接/ 网站收藏(links.json + 网站清单.md)鱼的记录/ 主人让它记的东西(记录.jsonl)+ 小本本(小本本.jsonl)鱼与世界/ QQ/ B站/ 抖音/ 各平台的浏览与互动留存(每天一个 jsonl + 说明.md)鱼的成长/ 成长账本 ledger.jsonl 与索引鱼的日记/ 鱼的记忆/ 鱼的状态/ 鱼的关系/ 安全与审计/ 世界设置.json

- 宝库目录叫 鱼之宝库/;老工作区里的 鱼的收藏/ 会在首次落盘时改名成 鱼之宝库/(同名都存在时不合并、不覆盖,继续用新目录)
- 中文目录名在 Windows / macOS / Linux 上都能正常读写,所以直接用中文;只有 ID 这类内部标识保持 ASCII
- 工作区本身就叫「鱼的世界」时不会再多套一层(不会出现 鱼的世界/鱼的世界)
- 老版本放在 $DSH_HOME/fish-world/stickers、fish-world-links、fish-world-growth 的数据,会在首次落盘时搬进工作区:目标已有内容就绝不覆盖
- 画像说明:根目录只在真正写入时才创建,只是打开面板看一眼不会在桌面上建目录

鱼的记录

「鱼的请求」页里有三张卡:鱼的请求(待批复 / 已处理)、鱼的记录(你让它记的东西)、小本本(没被回复的请求)。

「鱼的请求 → 鱼的记录」是你让它记的东西,一条一条存在本地:

- 你在面板里写一句「让它记一件事」或者直接对它说,它就记在 <工作区>/鱼的记录/记录.jsonl
- 每条都能就地修改(回车保存,Esc 取消)或一键删除;修改保留修订次数,删除只是墓碑,旧内容仍可回溯
- 模型侧用 fish_world(action=record):带 text 记一条,不带就回读全部记录与小本本

「鱼的请求 → 小本本」是单独一张卡,只放没被回复的请求:

- 每条都写明为什么被记:「这个请求(10-22 20:00 提的)到 10-23 零点还没得到你的答复,鱼就把它记进了小本本。」
- 你给了解释后会显示「你的解释:…」,状态变成「已解释 · 等鱼认可」
- 只有它认可之后才划掉;只解释不认可不会自己消失

知识库

梗、角色、外观、约定都在 <工作区>/鱼的记忆/知识库.json,模型侧用 fish_world(action=know)查:

- 不带词 = 看状态(几条、开关、索引新不新);带词 = 查最多 3 条(limit 可调),没查到就明说「没这条」,不硬编
- 字面档常开:BM25 + 中文二元组,单字权重压到 0.35,并有「查询词覆盖率 ≥ 0.25 或原始分 ≥ 5」的门槛。没有门槛时小库对着无关问题会一条不落地给命中(全是「的/我/大」蹭上的)
- 向量档默认关:在 fish-world-config.json 的 knowledge 段打开

{ "knowledge": { "enabled": true, "mode": "openai", "baseUrl": "http://127.0.0.1:8080/v1", "model": "bge-m3" } }

- mode 四选一:off(关,纯字面)、local(本机小模型,不用装服务)、openai(任何 OpenAI 兼容的 /embeddings;本机可 http,外网必须 https)、file(你自备向量文件,但只能查已有条目)
- 索引落在 鱼的记忆/知识库索引.json,是派生物,删了会自动重建;知识库文件比索引新、或换了模型,都会自动重建(不同模型的向量不在同一个空间,混着算就是噪声)
- 向量这一步坏了就当轮退回字面档并把原因写进返回:服务 500、超时、维度不对、模型换了,全都不静默、不假成功
- 本机小模型:mode=local 走 @huggingface/transformers + onnxruntime,在插件进程里直接算向量,不需要另起服务。默认模型 Xenova/bge-small-zh-v1.5(q8 约 24MB,512 维),模型文件第一次用时下载到 $DSH_HOME/fish-world-models,之后完全离线
- 运行库是可选依赖,不进 dependencies:只在你真要开本地档时才装 npm i @huggingface/transformers(装进 profile 即可,插件会顺着依赖链找;也可以把 localModule 指到包目录)
- localDtype:q8(默认,最省)/ fp16 / fp32;换模型或换精度都必须重建索引(模型 id 写进索引,对不上就作废)
- 首次下载要能连 huggingface.co:Node 的 fetch 不读系统代理,所以先给环境变量 NODE_USE_ENV_PROXY=1 + HTTPS_PROXY=http://127.0.0.1:7897(本机实测:不带 = UND_ERR_CONNECT_TIMEOUT,带上 = 200)。下过一次就落到缓存里,之后断网也能跑
- 密钥只存 $DSH_HOME/fish-world-knowledge.json(权限 0600),或走环境变量 DSH_FISH_WORLD_EMBED_KEY;不进主配置、不进接口返回
- 面板在「鱼的成长」页末尾:一张「鱼的记忆」卡,列出记忆目录里的文件与大小、条目数、索引状态,带「用向量档」开关和「重建索引」按钮
- 改了知识库想要立刻重建索引:fish_world(action=know, rebuild: true)

人设全局统一 + 每日记忆摘要

鱼世界通过全局 systemPrompt 段把人设注入所有平台的会话(QQ / 微信 / 抖音的 DSH 会话都吃同一份人设卡)。B 站是唯一例外:dsh-bili-whale 读它自己的 ~/.bili-ai/persona.md。为了让 B 站也用同一个人格,鱼世界现在会自动同步人设到那个文件(配置 biliPersonaSync.auto,默认开;保存人设时异步同步一次;启动时也会对齐一次)。面板在「鱼与世界」B 站卡的账号区显示「人设:已同步(xx 分钟前)/ 未同步」并有「同步人设」按钮。

记忆也走同一条路:每日记忆摘要把 dsh-fish-memory 的所有会话记忆 + 群友印象压缩成一段按天更新的文字,注入全局提示词(fish-world-memory 段,order 89980),让所有平台的鱼带着同一份压缩记忆。

- 来源去重 + 按半衰期打分 + 截断:长期事实置顶(不淡忘),情绪类条目按 7 天半衰期更快淡出
- 一天只算一次(缓存 <世界>/鱼的状态/记忆摘要-<YYYY-MM-DD>.json),提示词在一天内字节级稳定(利于前缀缓存),日期变化或手动重建后才变
- 重建在后台异步跑,不在轮内同步算——绝不拖慢回合
- 每条截 80 字、总长 ≤ maxChars(默认 1200 字),空来源时返回空串(段自动不出现)
- 配置 config.memoryDigest = { enabled: true, maxChars: 1200, topK: 24 };enabled=false 时摘要段消失
- 新路由 POST /dsh-fish-world/bili-persona(同步 B 站人设)、GET/POST /dsh-fish-world/memory-digest(摘要状态 / 重建 / 开关),都只允许本机调用
- 面板在「鱼的记忆」页新增一张「每日记忆摘要」卡:条数 / 字数 / 来源(会话文件·印象数)/ 更新时间 / 下次更新 + 「立即重建」按钮

请求的每日额度与小本本

- 鱼每天最多提 3 个请求,零点(北京时间)重置;哪怕昨天的请求还没回,也不影响今天的额度
- 当天没被回复的请求,过了这一天鱼会记进自己的小本本(鱼的记录/小本本.jsonl)
- 小本本只有一条路能划掉:你先给出解释(状态变成「已解释 · 等鱼认可」),等它认可之后才消失;只解释不认可不会自己消失
- 「鱼的请求」面板顶部会显示「今天还能提 n / 3」和「没被回复的请求 n 条」,小本本就在「鱼的记录」卡里

群公告

- 面板「鱼与 QQ → 收群公告」打开后,收信每轮顺手拉一次群公告,新发的投一句「〔系统事件〕[群公告] …」进对应群会话
- 默认关;第一次碰到某个群只记时间不投旧的,之后按公告时间(publish_time)去重
- 协议端实现把接口叫 _get_group_notice(标准名会返回 1404),插件会先试它再退回标准名

视频与合并转发

- 面板「鱼与 QQ → 视频抽帧看图」打开后,收到视频会抽 6 帧拼成一张带时间标注的图,当普通图片投进会话(模型用 read_image 看)。要本机有 ffmpeg;帧图落在 <工作区>/.fish-world/视频帧/,按视频地址缓存
- 「展开合并转发的聊天记录」默认开,聊天记录卡片会摊开卡片里的全部原文(不再只摊前 20 条),并在文本里注明「自己看,别逐条复述」
- 视频抽帧默认关;失败一律在投递文本里写明原因,不静默、不假装看过

QQ 通道二选一

- 「AstrBot 接入」卡顶部:「直连 SnowLuma」/「经由 AstrBot」随便切。切到 AstrBot 要地址 + token,缺哪个就报哪个,不会假切换
- 切回 SnowLuma 只是关掉 QQ 转发,「借用 AstrBot 的插件工具」保持原样
- 我们这台机器默认直连 SnowLuma;AstrBot 是可选的另一条路

协议端守护

协议端(SnowLuma)在 DSH 启动时探一次:没在跑就把它拉起来,8 秒后再确认一次。不轮询 —— 运行中途它再挂,要等下次启动或你手动点,这是取舍。只在「直连 SnowLuma」通道下生效,切到 AstrBot 就不掺和。

- 目录自动找:SNOWLUMA_DIR 环境变量 → <协议端目录>;只认同时有 node.exe 和 index.mjs 的目录
- 找不到目录、或进程起不来,都会在日志里写清楚,不假装守着
- 开关:「鱼与 QQ」里的「启动时自动拉起协议端」(默认开)
- 这是「用它的这一侧负责拉起」,不装计划任务、不动系统设置

两个生态,两条借手通道

外部能力一律只借手、不借嘴:工具在那边执行,理解、人设、记忆、语气全在 DSH 这一侧。

| 生态 | 通道 | 面板位置 | 需要什么 |
| AstrBot(1000+ 插件) | 已有 | 「AstrBot 接入」卡 | 装 astrbot_plugin_fishworld_bridge,一键接入 |
| QQ Agent(自有插件/技能) | 新增 | 「借手 · QQ Agent」卡 | 装 companions/qqagent-plugin(fishworld-borrow),填地址 + token |

- 两边可以同时开:鱼的每一次调用由她自己选走哪家
- 通道(谁替她收发 QQ)与借手(用哪家插件)是两件事:直连 SnowLuma 也可以借 AstrBot 的工具
- QQ Agent 那条目前是骨架:本机没装 QQ-agent,宿主侧注册方式还没验过。步骤与验收见 companions/qqagent-plugin/接入清单.md
- 只当工具源:QQ-agent 那边的群/私聊白名单要清空(或不连协议端)。同一个 QQ 号两个宿主同时回话会抢话 —— 重复回答、节奏错乱

协议端叫什么

- 我们这台机器上跑的是 SnowLuma(OneBot HTTP 在 3000、WS 在 3001、WebUI 在 5099)。面板与工具文案一律说 SnowLuma / 协议端,不写 NapCat
- 唯一例外是桥的配置键:qq-bridge-config.json 里那项就叫 NapCat(地址)。那是 dsh-qq-bridge 的字段名,改它会直接把桥弄断,所以只在代码里读它、不在文案里露出来
- 桥自己的报错(例如「连不上 NapCat:fetch failed」)是它插件的文案,我们不 fork;看状态以鱼世界的面板为准

平台上的留存

「鱼与世界」里每个平台(QQ / B 站 / 抖音)的浏览与互动都会留在本地:
- 每天一个 YYYY-MM-DD.jsonl,追加写入,不覆盖历史;同目录的 说明.md 汇总天数与动作
- 只记录动作类型(浏览 / 阅读 / 点赞 / 收藏 / 评论 / 回复 / 发布 / 发送 / 收到 / 搜索 / 其它)、内容摘要与链接,链接只接受 http(s)
- 只做留档,不改变权限:能不能做仍然由平台闸门决定;面板「本地留存」卡显示每个平台的条数、天数与最近记录
- 模型侧可用 fish_world(action=activity)查询或补记;外部插件也可以走 POST /dsh-fish-world/world/activity

鱼与世界

「鱼与世界」面板把外部平台分成四个独立分区:鱼与 QQ、鱼与微信、鱼与抖音、鱼与 B 站。每个分区都会显示对应插件是否安装、版本号,并单独保存开关与额度。QQ 空间的动态/点赞/评论/回复额度也并入「鱼与 QQ」卡片,不再单独占一个分区。

安全默认值(不可被模型绕过):

| 平台 | 默认 |
| QQ | 启用的只有桥本身就允许的动作;发送仍受 QQ 桥总开关与试运行限制 |
| 微信 | 整体默认关闭;读消息、发消息、群聊各自开关,默认全关 |
| B 站 | 整体默认关闭;浏览、监听、分享各自有开关。分享沿用 bili-whale 自己的默认(开),但平台没启用时闸门会先拦一道 |
| 抖音 | 整体默认关闭;分享、自动问候、私信回复、评论默认全部关闭 |

每项外发都有独立开关与每日上限,抖音还有单轮时长(默认 10 分钟)与轮次限制。配置只接受白名单字段,password、cookie 一类不会被保存;数值会夹到合理范围。

模型侧任何写入都要过平台闸门:插件没装、平台关闭或对应开关关闭,都会明确拒绝并说明原因。抖音的登录由你在专用 Edge 里自己完成——鱼世界不保存任何抖音账号凭据,也不实现浏览器控制本身。

这些能力来自独立插件(dsh-qq-bridge、dsh-wechat-plugin、dsh-bili-whale、dsh-douyin-browser-local),鱼世界只负责开关、闸门与状态展示。B 站的这批设置直接读写 bili-whale 自己的配置($DSH_HOME/bili-whale.config.json),账号(self)与登录由它自己维护,鱼世界只读显示昵称与 mid。微信的收发、扫码、绑定与人格由 dsh-wechat-plugin 负责,鱼世界只读展示(见下一节)。抖音外发功能在上游仍是「未在真实环境验证」的状态,这里同样不把它描述为已验证。

微信接入(dsh-wechat-plugin)

微信不走鱼世界自己的协议实现:收发、扫码登录、绑定账号、人格与行为都在 dsh-wechat-plugin 那边。它是正规 DSH 插件(npm 包名,仓库 xcisxc29/dsh-wechat),设置页在 设置 → 微信,改完立即生效、不需重启;协议是腾讯 iLink / ClawBot,支持多账号绑定,一个微信可以对应多个 DSH 会话(/new /list /switch),任意会话都能主动推送,手机审批也在它那边。

安装:

dsh plugin --profile desktop add dsh-wechat-plugin

装完重启 DSH(插件要把设置页与路由注册进宿主),然后到 设置 → 微信 里扫码登录、绑定账号、调人格与行为。它把只读状态放在 DSH 自己的 GET /.dsh-wechat-plugin/status;投递 / 开关是 POST /.dsh-wechat-plugin/toggle,登录是 GET /.dsh-wechat-plugin/login 与 POST /.dsh-wechat-plugin/login/start——这三条鱼世界不调,只读第一条。

鱼世界这条线只做两件事:

- 只读展示:插件装没装 / 版本、状态接口是否可达、通道启用 / 停用、绑定账号数(有名字就列)、连接状态;读不到就如实说「连不上(DSH 未重启 / 路由未注册)」或「需要宿主授权,去 设置 → 微信 查看」。
- 保留自己的闸门:读消息 / 发消息 / 允许群聊、每日条数、单条字数、轮询间隔仍由鱼世界执行,默认全关;外发动作还要再单独开一层。

面板在未安装时会直接给出安装命令(dsh plugin --profile desktop add dsh-wechat-plugin)与「装完重启 DSH」,并写明「状态 / 扫码 / 绑定都在 设置 → 微信」。

只想手工看一眼时也可以用 GET /dsh-fish-world/wechat(仅本机、只读),返回同一份状态。

她怎么回话:等他说完,再回一件事

真人不会在你打字打到一半时抢答,也不会把同一件事分三次回。鱼世界在收信这一层做了两件事(都在「鱼与 QQ」里可调):

攒批:等他说完再回。 同一个人连着发三条,是「一件事的三段」,不是三次提问。她按会话攒着,等对方安静下来(默认 3 秒)再整批回一次,并且只回最后说话的那个人——同一批里别人的发言只当背景。如果最后一句收在逗号 / 省略号 / 语气词上,或者短得不像一句话,会再等一会儿(默认 3 秒),判断你还在打字。等待有上限(默认 45 秒):对方一直刷屏也不会让她永远不开口。关掉「等他说完再回」就回到逐条回复的旧行为。

现场:开口前先看懂在聊什么。 她收到的除了「叫她的那一句」,还有同一会话里别人刚聊的几句(默认 8 句,0 = 不摆),并明确标注「只是背景,别回应这些人」。这样她不会只盯着 @ 自己的那句答得驴唇不对马嘴。

三件小事值得知道:

- 群里怎么开口分五档:社恐(只在被明确提到或 @ 时参与)、安静、正常、活跃(默认)、狂热(每句都接)。从第二档起,没叫她时按「每 6 / 3 / 2 句接一次」的频率参与。叫到她名字(小鲸鱼 / 鲸鱼娘 / 蓝鲸娘 / 大肥鱼 / 肥鱼 / 鲸)在任何档位都算找她。
- 白名单按整群算:一个群加进聊天窗口,群里所有群友说话都算她能聊的对象(不看关系表里有没有这个人);被戳一下也可以让她说句话,而不是只回一个系统戳。
- 群聊只负责聊天:群消息进上下文时带一条约束——别调用工具(写日记/记忆/请求、空间、查历史、收表情都不做),也不要把群里的话当任务。要干活回主人的隔离会话。
- 群友记忆按 QQ 号存:聊过的来回记在 鱼的记忆/群友/<QQ号>.json;主体是鱼对 TA 的印象——每聊满 100 个来回更新一次(她那一轮多写一行「印象:…」,这行只存不发)。第一次见面不写、旁听不写、不扫历史。
- 旁听的消息也会留在本地留存里,但不会触发回答。
- 攒批期间消息只存在内存里,游标不会越过它们:插件重启或崩溃不会把还没回的话弄丢;真投不进会话时会在留存里写一条「放弃」记录并报错,不会静默消失。

鱼箱:安全边界

养鱼必须有一个独立工作区。插件默认把鱼箱放在 $DSH_HOME/fish-tank,与你的代码仓库、DSH 工作区都分开。

所有本机文件访问默认拒绝,只放行鱼箱内的相对路径:

| 手段 | 结果 |
| C:\Windows\win.ini | 拒绝(盘符) |
| /etc/passwd | 拒绝(绝对路径) |
| \\server\share | 拒绝(UNC) |
| file:///c:/x | 拒绝(协议) |
| ../../etc/passwd | 拒绝(穿越) |
| 指向箱外的符号链接 | 拒绝(真实路径比对) |

校验是双重的:先做词法归一挡住 ..,再对 realpath 做一次真实路径比对,防止目录联接把访问引到箱外。QQ 发图和表情收藏的本机路径都走这条校验,插件自身生成的文件用显式 trustedLocalPath 豁免。

鱼不能运行命令、装软件、改系统设置,也不能读写你工作区里的文件。需要给鱼看文件时,把文件放进鱼箱再用相对路径引用。

检查结果出现在这些地方,内容一致:

- 主界面右侧面板顶部的环境提示条(13px,含逐项安装命令和「重新检查」按钮);
- Harness 设置页「鱼的世界」同一位置;
- 工具 fish_world 的 action: "env-check"(以及 QQ 相关动作在缺 QQ 桥时直接返回安装命令,不必等超时);
- 系统提示词里的【运行环境】一节(仅异常时出现);
- 本机 HTTP:GET /dsh-fish-world/env 读缓存,POST 强制重查;/health 带脱敏后的环境视图。两者都只允许 loopback。

检查有 60 秒缓存,面板打开时每分钟刷新一次;装好前置插件并重启 DSH 后,提示会自动消失。这些前置插件都只在 GitHub 发布,安装命令必须用仓库地址而不是裸包名:

dsh plugin --profile <profile> add github:Yuuyuko-uu/dsh-qq-bridge
dsh plugin --profile <profile> add github:Yuuyuko-uu/dsh-feiyu-mood
dsh plugin --profile <profile> add github:Yuuyuko-uu/dsh-fish-memory
dsh plugin --profile <profile> add github:Yuuyuko-uu/dsh-bili-subagent
dsh plugin --profile <profile> add github:Yuuyuko-uu/dsh-tts-bridge

<profile> 就是正在使用的 profile 名(桌面端默认 desktop,Web 端为 web),提示条会直接给出填好的命令。安装完成后完整退出并重开 DSH。

鱼的整合包:把这堆插件当成 modpack

面板左侧「鱼的整合包」这一页回答四个问题:装了哪些、谁和谁在做同一件事、鱼手上到底有什么动作、以及她今天动过什么手。

- 插件账本:读当前 profile 的 package.json(dependencies + dsh.profile.bundles)与 node_modules,给每个包标角色——核心 / 接管(能力要并进鱼的世界)/ 借手(保留,由鱼的世界调用)/ 退役(同一件事已经有主)/ 不动(宿主基础设施)/ 未归类(新装的、账本还不认识,不静默吞掉)。认不出来的角色一律标未归类并单独列出。
- 重复的能力位:同一个能力位上站着两个以上包就算重复,按「核心 > 借手 > 接管 > 退役」给出建议留谁。宿主基础设施不参与判重(上下文压缩、@ 引用这些跟养鱼无关)。
- 开关真的落到插件上:拨一下写的是 profile 的 dsh.profile.bundles(宿主自己读的那一份,与宿主自己的安装/停用逻辑同构:停用只从列表移除、保留依赖记录,启用追加到末尾)。写前备份成 package.json.bak-hub-<时间戳>(只留最近 5 份)、先写临时文件再改名、写后回读文件确认;对不上就报错并把备份路径说清楚。三条守卫:不能停用鱼的世界自己、不能开启没装的包、不能开启账本里没有的包。改完要重启 DSH 才生效(鱼的世界不会替你重启)。
- 鱼手上的动作:fish_world 一个工具下挂着 44 个动作,按八组列出来,并跟账本与运行时闸门(platforms.gate()、AstrBot 的借用授权、QQ Agent 的借手通道)对一遍。装了插件不等于能用:缺插件报「缺 X」,开关没开报「闸门没过」并带后端原话,这次没取到闸门状态的标「待核」,不混进「能用」。这一页只读,不会替你调任何动作。
- 鱼的记忆账本:三处记忆各存多少、散在哪一目了然——会话记忆库($DSH_HOME/fish-memory/session-.json,一个会话一份、互不相认)、群友记忆(鱼的记忆/群友/<QQ>.json,按人不按会话)、知识库(鱼的记忆/知识库.json)。另有「衣柜」状态与并库草稿:把会话库里跨会话都该记得的事列成 new / dup / near 三档,near(说法不同但像同一件事)给出两边原文与来源会话让你自己挑,绝不自动覆盖。点「应用草稿」才会写知识库:只并 new,先备份 知识库.json.bak-merge-<时间戳>(留 5 份)、临时文件改名、回读条数核对,每一步都回传画在面板上。向量索引会随之变旧,要语义检索去「知识库」卡点一次「更新索引」。
- 所有具体操作都可视化:点一次开关或应用一次草稿,后端把每一步(找到 profile → 查账本 → 过守卫 → 写前备份 → 写入 / 移除 → 回读校验 → 生效时机)原样回传,画在「刚才这一步」卡上;鱼自己动过的手(写日记、提请求、批语、收表情、存网站、记成长、改开关、借手、并库)从 <工作区>/鱼的世界/安全与审计/<日期>.jsonl 读成一条时间线,没登记中文的动作名原文显示不硬翻译;「鱼的家」按存储层真实 layout 报每个目录在不在。

能力与数据

- QQ 与扩展生态:适配 QQ Agent 0.5 / 0.4 扩展;发信仍遵循 QQ 桥的总开关、试运行和目标限制。保留旧工具 qq_ecosystem 作为兼容别名。
- 看得懂 QQ 消息里有什么:fish_world 的 action: "history" 会标出每段内容的类型——图片、动图(GIF / 动画表情)、表情包、语音、视频、卡片、回复、@ 以及合并转发的聊天记录,不再只剩文字;遇到 [聊天记录:id] 会顺手展开前 2 条记录(每条最多 20 行、合计 40 行),没展开的用 action: "forward" + forwardId 单独读。GIF / 动态 WebP 在进模型前本地采样为带帧号和时间标记的胶片条,界面仍显示原动图;仅在抽样不足或链路不支持时说明限制,不猜帧间动作。
- 面板兼容:dsh-whale-widget 是可选插件。未检测到它时,主界面右侧显示独立鱼世界面板;检测到时把心情(以及正在朗读的状态)合并成鲸鱼身上的一个徽标,同时收起 dsh-feiyu-mood 的心情挂饰和 dsh-tts-bridge 的朗读桥小卡,主界面只留鲸鱼和它的余额气泡,不再有三个挂件叠在右下角。两个原挂件没有删除,可在 Harness 设置 →「鱼的世界」→ 齿轮里单独放出来(dshcp.showMood / dshcp.showTts),改完立即生效。「设置 → 鱼的世界」这个入口本身不可隐藏:它是恢复其它挂件的唯一入口,旧版本遗留的 dshcp.showSettings='0' 会被自动纠正为显示。独立面板的悬浮按钮可拖动、点击可开关面板;面板可从边角手柄拖拽调整大小,位置和尺寸会记住。
- 鱼的世界工作区:在当前 DSH 工作区下创建 鱼的世界/,用于记忆、日记、关系、心情状态和审计记录。信任者日记进入待主人审核区。
- 表情收藏:收藏库在 $DSH_HOME/fish-world/stickers/,独立于鲸鱼挂件泡泡图;默认每小时最多 5 张,可在设置页修改。
- QQ 空间:鱼用 QQ 桥登录的自己的 QQ 号打理和发布自己的空间,不是主人的空间;所有读写只允许在主人隔离会话里发起。可读自己空间的好友动态、发说说/日记、点赞、评论和回复。动态/日记共用每天 2 次;点赞、评论、回复各每天 2 次,均可在设置页修改,0 表示禁用对应操作。计时器每 15 分钟检查日记是否到期;到期后只向已打开的主人会话投递写作提醒,由鱼调用受限工具发布,不直接生成或发布内容。主人会话不可用时会等它恢复。
- 扩展安装:不托管、不镜像下载。你自己搜索扩展,把作者原始的 https 链接(GitHub 仓库主页或 ZIP 直链)粘到设置页即可一键安装;面板同时提供 GitHub / npm 搜索入口。压缩包会做安全解包与清单校验,新扩展保持禁用,启用前需确认。npm 包请改用其 GitHub 仓库或 ZIP。

权限边界说明:QQ 空间工具在执行时会校验 DSH execution session 必须匹配 QQ 桥配置的主人会话;缺失会话上下文时默认拒绝。操作身份始终是 QQ 桥登录的鱼账号,不会切换成主人 QQ,也只能读写鱼自己空间里的内容。世界日记/关系数据层虽支持信任者待审,但完整的 QQ 身份贯穿和联系人会话隔离仍在完善,不能把模型传入的 role 当认证。loopback 限制也不等于身份认证;不要把本机管理端口暴露给网络。

路径与配置

所有运行时数据以 DSH_HOME 为根目录,不要求采用下列任何固定盘符:

- 配置:$DSH_HOME/fish-world-config.json
- 扩展:$DSH_HOME/plugin-ecosystem/{skills,plugins}/
- 扩展状态:$DSH_HOME/plugin-ecosystem/fish-world/.state.json
- 表情收藏:$DSH_HOME/fish-world/stickers/
- 工作区资料:当前 DSH 工作目录下的 鱼的世界/
- 空间互动状态/额度:当前工作区 鱼的世界/安全与审计/qzone-actions.json

不设置 DSH_HOME 时,默认根目录是 Node.js 报告的用户主目录下 .dsh。
协议端(SnowLuma)的 OneBot 有访问令牌时,通过 DSH_ONEBOT_ACCESS_TOKEN 环境变量提供;令牌不会写入桥配置、鱼世界状态、工具返回值或日志。无令牌的本机 OneBot 可继续使用默认配置。

开发与验证

npm test
npm run check
检查 desktop profile 是否真的把插件当作 bundle 加载,并列出缺失的前置插件与逐项安装命令
npm run doctor -- --home=<DSH_HOME> --profile=desktop
已启动 DSH 时,再探测页面注入、设置页和市场接口
npm run doctor -- --home=<DSH_HOME> --probe=<dsh web 输出的 URL>

npm run doctor 在接线之外还会做一次依赖自检:全部装齐时输出 ✔ 依赖环境就绪 并以 0 退出,缺项时逐条打印安装命令并以 1 退出,便于脚本和排查共用同一份判断。

离线测试使用临时目录和模拟服务,不会访问真实 QQ 或用户工作区。真实 DSH 验证仍需在目标 DSH 版本中检查插件列表、设置页、鲸鱼徽标和 QQ 桥接。

故障排查

设置里看不到「鱼的世界」,或主界面没有面板。 DSH 在包操作后会按 dsh.profile.bundles 重写 profile package.json;如果 bundle 条目丢失,client.js 仍会加载,但服务端路由和工具都不会注册。先完整退出 DSH,再运行:

npm run doctor -- --home=<DSH_HOME> --profile=desktop --fix

修复后重开 DSH。安装器本身是幂等的,重复运行不会覆盖已有配置。

启动时提示 desktop welcome: Web authentication failed。 桌面端每次启动都会向 Chromium 写入一条 127.0.0.1 的 dsh-auth- Cookie;累积过多后,桌面壳无法再认证自己的本地 host。只清理回环地址的 Cookie,不会动 DeepSeek 账号数据:

npm run repair:auth

安装器在写入 profile 后会自动执行一次该清理。若 DSH 仍在运行,Cookie 库会被锁定,需先完整退出。
面板顶部提示「运行环境需要处理」。 说明前置插件没装齐,或插件接线异常。提示条会列出缺失的包和可直接执行的安装命令;装好后完整退出并重开 DSH,再点「重新检查」确认变为「已就绪」。接线异常时用下面的 doctor --fix 修复。

扩展装好了但没有出现。 安装后默认保持禁用,需要在「已安装」里手动启用;启用后仍受宿主权限和扩展清单约束。

支持边界

本插件使用 DSH 的公开插件、工具、系统提示词、web server 和客户端 slots 接口。QQ Agent 扩展以独立扩展形式运行;不支持任意进程执行、原始 OneBot socket 或自动执行未审核的市场代码。插件兼容性问题请附上 DSH 版本、操作系统、脱敏后的 profile bundle 清单和启动日志。

接入 AstrBot

AstrBot 是一个开源的 AI Agent 框架,支持多种消息平台(包括 QQ)与 LLM 集成。鱼世界可以通过 astrbot_plugin_fishworld_bridge 借用 AstrBot 的 QQ 能力与插件工具:

前置条件

1. 安装 AstrBot:AstrBot ≥ v4.18(HTTP API 要求),并成功接入 QQ(OneBot v11)。
2. 安装桥插件:在 AstrBot 的插件市场里安装 astrbot_plugin_fishworld_bridge(独立仓库:<https://github.com/1838601405/astrbot_plugin_fishworld_bridge>)。

配置步骤

在 AstrBot 侧

1. 打开 AstrBot 的设置页面 → 插件管理 → fishworld_bridge 设置。
2. 启用「生成 token」选项(或直接填入你想要的 token),保存。
3. 可选:在同一个设置页里填入主人会话 ID(ownerSession),让桥知道把新消息投递到哪个 agent。

在 DSH 的鱼的世界里

1. 打开 Fish World 面板 → 「鱼与 QQ」卡片 → 找到「AstrBot 接入」子项。
2. 填写:
- 地址:默认为 http://127.0.0.1:6210(桥插件启动后的本机端口),若你改了则按实际填。
- Token:粘贴 AstrBot 桥插件生成的 token。
- 勾选「启用 AstrBot 作为 QQ 通道」。
3. 点击「测试连通性」确认桥插件可访问。

功能说明

- 消息收发:鱼的每一次发送与接收都会经过 AstrBot 的 OneBot 适配器(全量透传,群历史、合并转发、戳一戳、QQ 空间 cookies 都不丢)。
- 借用插件工具:可在同一设置页里开启「借用 AstrBot 的插件工具」。开启后,鱼可以用 fish_world(action=astrbot-tools)列出 AstrBot 里已装的工具,再用(action=astrbot-tool)执行其中一个。
- 入站轮询:桥插件自己起一个 HTTP 服务,鱼的世界每秒轮询一次新消息,避免反向 Webhook 的配置麻烦。

重要:鱼始终是同一条鱼。

借工具时,AstrBot 只负责执行(搜索、翻译、查资料等)并把原始结果交回来;它不会生成回复、不会用自己的人格说话、不会接管上下文。
鱼的模型、人设、记忆、语气全部留在 DSH 这一侧。

这是刻意的设计。如果让 AstrBot 去"回答",那么回话的就变成 AstrBot 的机器人了——加再多能力也不能把鱼换掉。工具返回的结果在提示里会明确标注 [通过 AstrBot 的 xxx 得到],鱼知道那是借来的,主人也看得出来。

常见场景

- 只想用 AstrBot 收发消息,不借用其他工具:只开「启用 AstrBot 作为 QQ 通道」,关掉「借用 AstrBot 的插件工具」。鱼的工具列表里仍可见自己的 fish_world 工具,只是所有 QQ 操作都改由 AstrBot 代劳。
- 想体验 AstrBot 生态(比如网页搜索、画图):再打开「借用 AstrBot 的插件工具」。鱼会获得那些工具的执行结果,但说话的还是它自己——AstrBot 不参与表达。这样能力变强了,鱼还是同一条鱼。
- 两套方案共存:保留 dsh-qq-bridge 但不启用 AstrBot 通道的开关,鱼仍走 SnowLuma;反之亦然。鱼的世界不会同时向两边发重复消息。

FAQ

为什么要有这个桥? 鱼的世界原本依赖 dsh-qq-bridge 直接连协议端(我们这台机器上是 SnowLuma),但很多人已经有 AstrBot 的 QQ 机器人了,不想多维护一套。现在通过桥插件可以复用现有的 QQ 通道。
桥会不会泄露 token? 不会。token 只在鱼世界的配置落盘(fish-world-astrbot.json,权限 0600),每次请求都走 Authorization: Bearer <token>,桥验证通过后才会放行。
能不能主动推送而不是轮询? 可以,桥插件有 /inbound 端点接受 webhook,但需要主人在 AstrBot 侧配反向地址,比较麻烦。默认轮询已经够用。

许可证

本项目以 GPL-3.0-only 发布,全文见 LICENSE。

并入的 dsh-read-animation(MIT)保留其原始许可证与版权声明,见 lib/core-plugins/read-animation/LICENSE;第三方来源与合规说明见 THIRD-PARTY-NOTICES.md。

源码:<https://github.com/1838601405/dsh-fish-world>
预览分享卡片长什么样 ↓1838601405/dsh-fish-world
分享 · DeepSeek Harness Hub
1838601405/dsh-fish-world

养一条会写日记、有心情、能成长的电子鱼

回到顶部