想直接跑?点右边的 Releases,下
whale-girl-3.9.zip(117 MB)。 里面已经带好 Node 22 和 Python 3.12,解压双击就能用,不用装任何环境。解压到原来那个文件夹,选「覆盖」。 包里的
data\(聊天记忆 / Key / 称呼)和config.json(主人名单 / token)都不会被覆盖,所以记忆一直在。已经解压到新文件夹了?双击
一键更新.bat:它发现这个目录还没有记忆,会先找旧安装(同级 / 上级 / 桌面 / 下载 / 各盘根目录),把data\和config.json搬过来再更新(搬之前先备份当前数据)。想手动备份也行:
备份记忆.bat导出 json;恢复记忆.bat放回去。详见下面的「3.51 更新」。旧版(3.x)的
data\store.json会被自动识别并转成 4.0 格式:直接把旧data\合并进来启动即可, 导入完启动器会弹一次「记忆已导入并转换格式」(原文件留在data\memory\legacy\)。也可以随时在 「设置 → 高级 → 旧版记忆」点「一键识别转换记忆」,重复点不会重复导入。
这里的
Code → Download ZIP只有 400 KB 源码(不含运行时,也不含你本地的 Key 和聊天记录)。从源码跑有两条路:
- 双击
一键装运行环境.bat—— 自动下载 Node + Python 并把微信依赖装进runtime\,之后和发行包一样用;- 或者自己装 Node 18+(
npm start就能跑网页版),接微信再装 Python 3.12 +pip install -r requirements.txt。
一个能真正聊天的「鲸鱼娘」:网页私聊 + 微信群自动回复 + B 站热搜/视频信息 + 联网查资料。
人设是一个蓝发鲸鱼娘,说话短、有情绪、会撒娇也会毒舌;接 OpenAI 兼容的大模型(DeepSeek / 智谱 GLM / 通义 / Ollama 本地等),零 npm 依赖。
在启动器「表情包」页打开总闸(默认关闭)。分类由模型在回复末尾写 [[sticker:分类]] 决定:写哪个分类就发那一类,标记会被剥掉,用户看不到;没写标记、分类不存在或该分类没有图就不发,程序不猜情绪、不按概率配图。内置傲娇 / 炸毛 / 开心三类,也可以自己新增分类;启动器里管理分类、上传/删除图片、打开文件夹,支持 GIF、PNG、JPEG、WebP(单张不超过 4 MB)。上传只保存原图,不发送微信消息,不转码 GIF。
自定义分类按名字理解:名字起得越具体越好用(例如「阴阳怪气」「委屈」),模型会从当前有图的分类里挑;名字看不出用途的分类它不会硬选。没有图的分类不会出现在提示词里。
程序只控制“提醒频率”:sticker.demandChance(默认 0.7)决定这一轮要不要在尾部提醒她带一张,0 = 只靠模型自觉,1 = 每轮都提醒;最终发不发仍由模型判断。你明确要表情包时一定会发;对方在难过、求助、说正事时程序不催(15 分钟内或连续 4 条普通消息后自动恢复,说“没事了/哈哈”会提前恢复)。
可选的「排队测试发送」是真实微信操作,排队不代表送达。桥接可能短暂切换到目标微信会话,完成后还原;请先清空输入框。证据不足时跳过,不盲按回车、不自动重试。结果显示「未确认」时不要重复点发送;如果出现附件草稿,请手动清空后继续使用,不会自动删除你的草稿。同会话同一时间只有一个待处理任务,确认后无冷却,超过 90 秒的任务失效而不重放。
只有数据库出现新的本人发送图片记录才记为「确认」;数据库不可用或没有新记录一律记为「未确认」,不是成功。关闭无法撤回已经按下发送的消息。重启服务后不会重放旧任务。
联网更聪明、汇总能关、不打扰的功能删掉、桥接不再一闪而过。
- 联网改由模型判断:不再只认「查一下 / 最新 / 多少钱」这类关键词,词库外的说法(「小蓝鲸是什么梗」)也会查;模型不可用时才回退关键词表。
- 热榜按站点分流:问 B 站热搜走 B 站官方接口、问微博热搜走微博,其它仍用头条榜;问具体视频/事件时不会再硬塞一份榜单,指定平台失败也不会拿别站榜单冒充。
- 修了一个吞结果的 bug:补搜路径对
Set调用数组方法会抛错,把已经搜到的那条也一起丢掉——问到冷门内容时会「明明搜到了却说没有」。 - 总超时:路由最多 2 秒并取消底层请求,抓网页有墙钟截止/跳转上限/体积上限,不会一步等满一个超时。
- 不再乱改检索词:你写的型号、版本号、中文专名不会被清洗掉,也不会硬塞年份。
- 提示词不再装懂:用运行日期代替写死的「现在是 2026 年」;区分「查到资料」和「查了但没结果」,并注明网页摘要是外人写的、抓取时间不等于发布时间。
消息汇总(默认关闭)
- 调试台「功能开关」里一行同时有总开关和「每隔(分钟)」,默认关闭。关掉 = 不采集、不轮询、不推送,接口 404,并清空本轮内容;重新打开只收新消息。
- 只收微信里没接话的普通消息:已回复的、重复的、系统通知、主人的话、静音会话、网页测试聊天都不收。
- 只发给
persona.master.wxids里唯一明确的主人;不按昵称猜人,填了多个或只填昵称就不推。 - 发送前后会重新核对开关、代次、会话、账号、前台和焦点;已粘贴但取消时隔离该会话草稿,不自动删你的草稿,也不会让普通回复把草稿发出去。
- 一批超过上限时游标只推进到真正发出去的最后一条,剩下的留到下一轮;送达不确定的窗口不重试、不补发。
删掉的功能
- 打游戏自动进「休息模式」、离开/回来打招呼、忙时排队补发 —— 全删,控制台里的对应设置项也删。
- 机器人里「我去玩了 / 我回来了」的命令分支和休息状态文件副作用一并删除。
- 「群里常说话的就这些:A(87)…」这种发言次数排行删除;群聊上下文仍保留说话人名字,但不再统计次数。
- 旧配置里残留的
gameWhitelist、awayNotice、returnNotice、queuedMax*、digestMinutes不再起作用,也不会显示在控制台。
桥接启动崩溃
- 修随包三方库的缺陷:密钥诊断把 PID 列表当三元组解包,只要有一个微信进程读不了内存(微信以管理员运行、多开选错号)就抛
TypeError: cannot unpack non-iterable int object,把本该显示的排查提示顶掉,桥接直接退出。 - 现在读不到数据库会输出能照做的步骤:管理员运行桥接、在「启动鲸鱼娘.bat」打开的网页右上角「⚙️ 设置 → 微信账号」里选对账号、确认微信已登录——不再甩一大段 traceback。
装不上 / 看不了 / 连不上,这一版全修了。
- Windows Server:以前一律提示「pip install wechatauto-replica」,其实是缺 VC++ 运行库 → 现在直接给 vc_redist 下载链接
- 看图自带 ffmpeg:微信 4.x 图片是 wxgf/HEVC,包内已带
runtime\ffmpeg\bin\ffmpeg.exe(包体积约 117MB) - 「重启了但不监听」:打开微信数据库加 90 秒超时 + 就绪文件
data\bridge-ready.json+ 重启上限 4 次 - 「积极拒绝」:等服务就绪再监听、本机请求不走代理、服务端口写
data\server-port.txt - 新增启动文件夹:
先点启动鲸鱼娘再点启动桥接\,里面 1、2 两个编号启动器 - 移除:全局热键(PageUp 终止 / PageDown 恢复那套已下线)
群里终于分得清「你」在说谁了。 以前 A 叫过她,A 转头骂 B「你个傻逼」,她冲 A 开火;别人聊「你吃饭没」,她插嘴。
- 触发层收紧:这条消息 @ 了别人、出现「他/她/楼上」、或提到其他成员 → 判定在跟别人说话,不接话
- 「机器人」不再裸算点名:要带指代(这个/那个/你/破/臭/傻)才算叫她
- 提示词:群里先判断「在跟谁说话」,判断不出就当别人;被 @ 的名单直接写进提示词
- 兜底:没点名却自动开火、又说不清对方骂了啥 → 降级成「?」,不再乱喷
功能开关体系:调试台新增「功能开关」卡片,5 个开关可开可关(群聊分清对象 / 开怼需原话 / 媒体清理 / 记忆快照 / 引用回复),关掉即回到旧行为。
引用回复默认关闭:一开每条多走一遍 UI,回复明显变慢。
三件顺手的事:日志节流(没配看图 Key 时不再刷屏)、媒体缓存启动清理(7 天 / 500MB)、搜索时效过滤(问「最新」时不再拿 2010 年的文章当现状)。
更新不再丢记忆。 根因不是程序删数据,是大家把新版本解压到新文件夹——新目录没有 data\,看起来就是记忆全没了。这一版:
- 发行包里不再带
config.json:解压覆盖到原文件夹时,data\和config.json都不受影响,记忆自然还在(第一次运行会自己生成 config.json) - 新增
升级到新版本.bat:已经解压到新文件夹的,双击它自动找旧版本搬data\+config.json(搬前先备份)
正确姿势:解压到同一个文件夹,选覆盖。
记忆能带走了。 以前更新是把整个文件夹换成新版,新目录里没有 data\,看起来就是「记忆全没了」。现在:
- 每次启动自动快照到
data\backups\(留最近 20 份) - 双击
备份记忆.bat立刻备份;HTTP 记忆接口已关闭(不能再用GET /api/memory/export),要导出请用node scripts/memory-tool.js export <文件>,或启动器诊断页「数据维护 → 备份记忆」 - 双击
恢复记忆.bat看快照列表;node scripts/memory-tool.js restore <文件>也能把导出的 json 放回去 - 恢复前会自动把当前记忆另存一份(
before-restore),手滑也能回滚
node scripts/memory-tool.js info # 现在有几段会话、几条消息
node scripts/memory-tool.js backup # 立刻备份
node scripts/memory-tool.js export "D:\鲸鲸记忆.json"
node scripts/memory-tool.js restore "D:\鲸鲸记忆.json"
node scripts/memory-tool.js import "D:\旧版\data\store.json" --dry-run # 3.x 旧记忆先预览
node scripts/memory-tool.js import "D:\旧版\data\store.json" # 真导入(同 chat 会合并)旧版(3.x)记忆可以在 4.0 里直接读:data\store.json(含 .journal)、data\memory.json
和旧备份包都能导。已有 chat 不会被整段跳过——消息按时间合并、重排 seq,notes 去重;
导入前自动留 before-import 快照。
- 称呼:网页设置和调试台改的是同一份
persona.ownerName;清空 = 恢复默认「主人」;老设置只迁移一次,不会重启又被盖回去。 - 状态播报降权:以前每条消息都告诉她「你此刻在泡脚」,于是句句「我刚泡完脚,手还湿着呢」。现在只给时间,「在干嘛」按小时抽样且明确要求别主动说。
- 抢屏修复:
restore_win_state()少了import ctypes,每次发完消息都抛NameError,微信窗口被抬到前台就不还原了。 - 安全闸:
server.host不是回环地址时强制改回127.0.0.1;真要远程访问必须server.allowRemote=true且带x-bot-token。 - 看图:接口按 URL 协议选 http/https 并传端口,本地/自建视觉服务能用了。
- 语音:改 Key / 超时不用重启桥接;Key 查找链补上
config.deepseek.apiKey。 - 数据库目录:兼容「直填账号目录 / 拍平的 db_storage」,盘符不再写死 C..K(L 盘、网络盘都行)。
完整列表见 CHANGELOG.md,每个 bug 的根因和回归测试见 BUGS.md。
「主人识别」这一块基本重写了。 之前典型症状是:在调试台改了主人名单,微信里她还是不认你。三个原因现在都修掉了:
- 判定只有一份。 以前
src/bot.js(真正跑消息)和调试台预览各写一套规则 —— 调试台显示「识别为主人」,微信里却当陌生人。现在统一走src/master.js的matchMaster(),两边不会再打架。 - 只填微信号会静默失效。
master.wxids填成自己设的微信号(比如abc12345,不是wxid_xxx)时,旧逻辑会顺带关掉昵称兜底,等于谁都认不出来。现在会认出「这不像 wxid」并在调试台/日志告警;没有任何真 wxid 时退回按昵称认。 - 认了之后还得「认账」。 认证成功了,但那个会话历史里已经有几十条「你不是主人」,模型会顺着历史继续否认(实测 51 轮历史连问两遍都还是「不是」)。现在提示词里加【身份纠错】,并且喂给模型的历史会剔除这些身份争执(记忆文件不动);万一回复仍然是否认,
finalize()兜底改成认下来。 - 每条微信私聊在
data/whale.log留一行[master] … → 主人(wxid),排查不用猜。 - 调试台「身份 / 主人」卡片新增:名单告警 +「最近说过话的人(真实 senderId)」—— 不知道自己的 wxid,照着抄就行。
其他修复:npm test 只跑 tests/(不再把 runtime/python 里 Python 包自带的 .js 当测试);修 providers.test.js 误写真实 data/settings.json 的问题;saveSettings 不再丢掉别的服务商的 Key;一键修复并自检.bat 换成 CRLF。
- 微信图片是 wxgf(HEVC)容器,以前桥接按扩展名当 JPEG 发出去,视觉接口一直回「图片输入格式/解析错误」—— 所以会出现「有时能认、有时不能」。现在按文件头判格式,wxgf 先转 JPEG 再发。
- 桥接启动时自动找 fmpeg(C:\ffmpeg\bin、 untime\ffmpeg\bin 等);没有 ffmpeg 就看不了图,日志里会写清楚。
- 长截图(高宽比 > 2.2)自动切成 2~3 段识别再拼接。
- 修正智谱 max_tokens 上限(1024),提示词放宽到 900 字并要求逐条转写不省略。
完整列表见 CHANGELOG.md。
- 网页聊天:流式吐字、多气泡、调教台(
/persona)和调试台(/debug) - 微信群自动回复:只认 @ / 叫名字;被叫到后接着聊,冷场 6 分钟或换话题自动闭嘴
- 像真人:一句话拆成 2~3 条短消息发,不带波浪号和句号;任何人单发一个
?她也回一个? - 会记事:私聊里自报的事实(名字、住哪、喜欢什么、忌口)自动记下,之后不用重说;更早的群聊会被压成一句摘要,不会凭空丢失
- 不学舌:不会把别人刚说的话原样发回去;发现模型复读(原样重复、只加问号、「你才X」偷懒句)会自动重写一次,还复读就换成正常回应
- 叫名字也算叫她:群里不一定非要 @,「你好响呀鲸鲸」「鲸鲸你别装了」这种带名字的都会接话;被人骂了但没 @,只要她刚说过话也会回怼(别人之间互骂她不插嘴)
- 看不懂就不说:图片/表情包识别失败时保持沉默,不瞎编
- 懂缩写:
kskbl→ 回zdjd,xswl→我也xswl;词表在resources/abbrev.txt - 会回怼:被骂或主人被骂时按「贴吧老哥」火力回:对方爆粗就带脏字、自称你爹、扣帽子(急了/破防/贵物/收收味/典),六成概率打两连击(先反问或扣帽子,再补一刀),连骂三轮自动收尾走人。台词库
resources/clapback.txt分 9 档:重、爹味、反问、典、急了、轻、叫滚、收尾、一般,可自己加 - 回怼不认输:模型要是说「别生气」「我理解你」「没必要吵」这类软话,会被直接换成库里的狠话
- 回怼有底线:不碰性、不咒对方家人死、不搞地域性别疾病歧视、不威胁线下现实;主人被骂豁免,不会反打主人
- 小助手:主人私聊问「我微信多少」回自己的号;说「可以损我」授权后,主人才可以点名让他被损三句(以前「问群里都有谁就列发言次数排行」的功能已删)
- 听得懂语音:别人发语音会先转成文字再正常接话(
config.json的voice,默认 qwen3-asr-flash);她自己只发文字,不发语音条 - 联网:由模型判断该不该查,Bing 搜索 + B站/微博热搜(按站点分流)+ 头条热榜 + 链接正文抓取;有总超时,会把「查到什么」和「没查到」分开告诉模型,提示词自带当前日期
- 群管理:禁言群、解禁、改模型、切语气、清记忆、低电量自动发晚安
- 一键终止所有:
一键终止.bat,服务、桥接、守护全部停掉并写暂停标记 - 微信桥接:
examples/wechatauto_bridge.py,基于wechatauto-replica的 UI 自动化(只读数据库 + 窗口操作,不注入微信) - 零 npm 依赖:不用
npm install;带runtime\的发行包连 Node 都不用装(本仓库是源码版,不带runtime\)
本仓库是源码版,不含
runtime\,请直接看下一节。只有带runtime\的发行包才用这一节(解压即用,不需要装 Node / Python)。解压到纯英文路径(例如
D:\whale-girl-3.0)。放在带中文的目录里,微信那侧的自动发送会失败并一直报「拒绝访问」,原因见下面「接入微信群」里的说明。
- 解压压缩包
- 双击
启动鲸鱼娘.bat - 打开 http://127.0.0.1:8787
包里已经带了 Node 运行时(runtime\node.exe)和 Python 运行时(runtime\python),两个都不需要你装。启动脚本优先用包内的,找不到才回退系统 PATH。
微信桥接同样双击 启动微信桥接.bat 就行,用的是包内那套 Python(已经装好 wechatauto-replica、pywin32、uiautomation、Pillow、cryptography、pysilk 等依赖)。
唯一还需要你的东西:一个登录着的微信小号,和一个模型 API Key(DeepSeek / 智谱 / 千问任选)。
不用再手动下载解压。双击 一键更新.bat → 回车,它会自己查最新 release、下载、校验、覆盖;
data\(聊天记忆)和 config.json(Key)全程不动。
[回车] 现在更新 [r] 回滚上次更新 [q] 退出
- 校验:按官方 API 给的
sha256比对,对不上直接中止,不会装半个包。 - 失败自动回滚:覆盖后自检版本号 / 记忆条数 /
config.json哈希,任一项不过就用备份还原。 - 官方连不上:自动换镜像(
ghfast.top/gh-proxy.com/gh-proxy.org/ghproxy.net,只搬运、不参与校验);查版本接口被墙时先走gh-proxy.com、gh-proxy.org的 API 转发,全都挂了再从镜像页面抠版本号。 也可以自己下 zip,拖到一键更新.bat上离线装。 - 只看版本:
一键更新.bat -Check;手动回滚:一键更新.bat -Rollback。 - 第一次用(换过文件夹):目录里没有
data\时会先找旧安装,按「最后保存时间」从新到旧列出(带会话数/条数),回车即搬、输序号换一个、s跳过; 也可以直接指定:一键更新.bat -Migrate -FromDir "D:\whale-girl-3.50"。 - Low 完整性标签:安装目录带 Low 标签时 node 写不了
%TEMP%(报EPERM),更新前会自动把runtime\node.exe/python.exe标回 Medium;修不动就改用安装目录里的临时目录,更新照样能跑。
自己改过源码要注意:更新是整包覆盖,会把你改过的文件换掉。检测到本地有自定义功能时, 脚本会列出来并要求确认(
-Force可跳过确认)。
# 1. 需要 Node.js 18+
node -v
# 2. 直接启动(不需要 npm install)
npm start没填 API Key 时会用内置台词演示;在页面右上角「设置」里选服务商、填 Key 即可接真模型。
首次启动会自动把 config.example.json 复制成 config.json;config.json 和 data/ 里是你的 Key、聊天记录和主人名单,已在 .gitignore 里排除,别提交。
支持的 provider:deepseek / zhipu / siliconflow / qwen / ollama(本地)/ custom(任何 OpenAI 兼容接口)。
微信桥接是独立的 Python 脚本,需要 Windows + 已登录的微信 4.x:
py -3.12 -m pip install -r requirements.txt
python examples/wechatauto_bridge.py然后:
- 在
config.json里配置gateway.wechat.inboundToken(桥接和服务器共用的密钥) - 启动
启动微信桥接.bat(带守护循环,异常自动拉起) - 用你的微信给机器人账号发一句话,网页里能看到回复
详细说明见 docs/接入微信.md。桥接依赖
wechatauto-replica的 UI 自动化能力,微信升级可能导致失效,请自行评估风险。
⚠ 装到纯英文路径,否则微信发送一定是坏的。 微信的 Qt accessibility 只能在纯 ASCII 路径下热激活成功。整个文件夹放在
C:\Users\张三\Desktop\whale-girl-3.0(含中文用户名)、D:\我的程序\…这类路径下时, 桥接会ensure_window() = False,之后每条回复都报error(5, 'SetWindowPos', '拒绝访问')、退到 OCR 兜底、发不出去,日志一直刷。 正确做法:D:\whale-girl-3.0、C:\whale-girl-3.0这种纯英文路径。
双击 一键终止.bat,会依次停掉:
- 鲸鲸服务(占用 8787 的进程)
- 微信桥接(
wechatauto_bridge.py) - 桥接守护循环和启动器窗口(否则它 3 秒后又把桥接拉起来)
同时会写 data\PAUSED,防止任何自动重启。脚本会多扫三遍,因为杀父进程时可能正好有子进程在启动;最后会打印结果,停干净了显示绿色,没停干净会列出残留 pid。
恢复只要重新双击 启动鲸鱼娘.bat 和 启动微信桥接.bat(桥接启动时自动清掉 PAUSED)。
开源版不写死任何人的微信 ID,部署者自己决定:
"persona": {
"master": { "names": ["你的昵称"], "wxids": ["wxid_xxx"] }
},
"admin": {
"spell": "设一个只有你知道的暗号",
"minutes": 30,
"allowAll": false
}master.names/master.wxids:填谁,谁就是主人(可以填多个)admin.spell:私聊发这个暗号获得 30 分钟管理员权限;留空则关闭admin.allowAll: true:任何人不发暗号也能直接用管理员命令(适合自己人小群,公开群慎用)
状态
上下文 30
人味 高|中|低
情绪 开|关 / 主动 开|关 / 观点 开|关
语气 温柔|活泼|高冷|毒舌|正经
语态 <一句话描述>
长度 私聊 120 / 回复 短一点
颜文字 少|多|关
能力 链接 开|关 / 能力 主动接话 开|关
禁言 鼠标 / 别在鼠标群说话 / 解除禁言 鼠标
改模型 deepseek-reasoner
演示模式 开|关
重置记忆 / 清空所有记忆 / 恢复默认
退出管理
群里被叫到后,她会接着聊 6 分钟;听到「没你事了 / 滚 / 走吧 / 闭嘴」会回一句「好的主人,我走了」然后闭嘴。时长在 config.json 的 group.engagedMinutes 调。
- 群聊历史按「事件」喂给千问:每条带发言人、时间和 @ 对象,不再把多个群友的话捏成一条,也不会把别人之间的「你」当成在叫鲸鲸。
- 显式 @ 了别人(没 @ 鲸鲸)之后接着说「你」,鲸鲸不会抢答;同时 @ 鲸鲸 和另一个人时,会记下另一个人作为提及对象。
- 私聊默认 100 条、群聊 60 条消息(
chat.historyTurns/chat.groupHistoryTurns,上限 120/100);memory.maxMessages必须 ≥ 最大窗口,否则存不下。面板里的「条数」指消息条数,不是问答轮数。
personas/ 下每一版人设单独一个文件,升级时新增、不覆盖旧的:
personas/persona-v1.json # 通用版,已去掉主人的微信号和群里的人名
personas/persona-v2.json # 下一版
三种用法:
- 网页
/persona页面底部「人设预设」→ 选一个 → 导入 - 接口:
POST /api/persona/preset,body{"id":"persona-v1"} - 直接把人设内容粘进面板的「自定义提示词」
导入只改人设和上下文条数,不动模型、Key、群配置和记忆。personas/ 会跟着发行包发出去,所以里面不能写任何私密信息。
双击 一键终止.bat 停掉服务 + 桥接(不发任何消息)并写 data/PAUSED;
双击 重启鲸鱼娘.bat 清掉暂停标记并重新拉起。
复制示例配置再改(config.json 已被 .gitignore 忽略):
cp config.example.json config.json常用字段:
| 字段 | 说明 |
|---|---|
provider / deepseek.apiKey |
模型服务商与 Key(也可在网页设置里改) |
persona.master.names / wxids |
主人名单,决定谁有特权 |
admin.spell / admin.allowAll |
管理员暗号 / 是否人人可管理 |
chat.privateMaxChars / groupMaxChars |
回复长度上限 |
group.requireAt |
群里是否必须先 @ 才回 |
group.engagedMinutes |
被叫到后继续接话的分钟数 |
group.cooldownSec |
群回复冷却(0 = 不冷却) |
wechat.lowBatteryPercent |
电量低于多少自动发晚安 |
gateway.wechat.inboundToken |
桥接与服务器共享的 token,务必改掉 |
whale-girl/
├─ server.js # HTTP + SSE + webhook + 静态页面
├─ src/
│ ├─ bot.js # 触发判断、管理员命令、回复编排
│ ├─ persona.js # 人设提示词、词库注入、语气规则
│ ├─ llm.js # OpenAI 兼容客户端
│ ├─ memory.js # 会话/记忆存储
│ ├─ presets.js # 人设预设的读取与导入
│ ├─ links.js # 链接正文抓取
│ ├─ websearch.js # Bing 搜索 / 天气 / B站·微博·头条热榜(含总超时)
│ ├─ searchRouter.js # 让模型判断「这条要不要联网」并改写检索词
│ ├─ bilibili.js # B 站搜索/热门/评论
│ └─ config.js / personaStore.js
├─ launcher/ # WPF 启动器(.NET 10,单文件框架依赖)
├─ installer/ # Inno Setup 安装脚本(安装包由 GitHub Actions 构建)
├─ web/ # 聊天页、调教台、调试台
├─ personas/ # 人设预设,一个版本一个文件(persona-v1.json…)
├─ examples/
│ ├─ wechatauto_bridge.py # 微信桥接(UI 自动化)
│ └─ wechaty-bridge.js # 另一种桥接示例
├─ scripts/ # 启动/守护脚本
├─ tests/ # node:test 单元测试
├─ config.example.json
└─ data/ # 运行时数据(Key、记忆、词库、日志)— 不入库
npm test # node --test "tests/*.test.js"(只跑 tests 目录,别扫到 runtime\python 里自带的 .js)
node server.js --doctor # 自检- 人设 / 词库:
data/persona.json、data/slang.txt(网页调教台也可改) - 想改触发逻辑:
src/bot.js的computeTrigger - 想改提示词:
src/persona.js的buildSystem
- 默认只监听
127.0.0.1:8787,不要直接暴露到公网(没有登录鉴权) data/、config.json已被.gitignore忽略;不要把自己的 API Key、聊天记录提交到仓库- 微信桥接是 UI 自动化,不改微信客户端、不注入、不读内存,但仍可能违反微信使用条款,账号风险自负
- 机器人说的话由大模型生成,请在公开群谨慎开启
admin.allowAll和自动分享
安装包只从 GitHub Releases 下载:https://github.com/Banan1cee/whale_gril/releases
Windows 发行包使用 SignPath Foundation 提供的免费代码签名
(Free code signing provided by SignPath.io, certificate by SignPath Foundation),
签名覆盖 WhaleLauncher.exe 与 whale-girl-<版本>-setup.exe。
校验值与验证命令见 DOWNLOAD.md。
发行包的 Windows 签名由 SignPath 提供:
Free code signing provided by SignPath.io, certificate by SignPath Foundation.
签名覆盖 WhaleLauncher.exe 和 whale-girl-<版本>-setup.exe,只对由本仓库
GitHub Actions 构建出来的产物签名(每个发版签名都要人工批准)。
完整的代码签名策略(签哪些文件、谁批准、隐私声明、怎么验证签名)见 CODE_SIGNING_POLICY.md。 隐私声明单独一份:PRIVACY.md。
验证方法:
Get-AuthenticodeSignature .\whale-girl-4.0.0-setup.exe | Format-List Status, SignerCertificate
Get-FileHash .\whale-girl-4.0.0-setup.exe -Algorithm SHA256 # 对照 Release 里的 SHA256SUMS.txtMIT,见 LICENSE。欢迎 fork、改人设、接自己的模型。
