Skip to content

Releases: 12we21/cute-fat-fish-pet

可爱大肥鱼桌宠 1.2.1

Choose a tag to compare

@12we21 12we21 released this 09 Oct 15:35

Release notes — Cute Fat Fish Pet 1.2.1

Bug-fix release. 2026-10-09 · Windows x64 · MIT · 中文说明见下方

1.2.0 gave the console a button that checks GitHub and installs a new version by itself. Three things
about using the console were still wrong, and a patch release is the only way for the people who
already downloaded 1.2.0 to get them: the result of 「测一下通不通」 was invisible, the console fought
a real person (19 px click strips, no focus ring, results scrolled away), and asking her "are you online
or offline?" got a guess instead of an answer.

Nothing else changed: same engine, same data directory, same one-click updater. Files that were already
correct in 1.2.0 are byte-identical here.

Downloads

File Size SHA-256
cute-fat-fish-pet-1.2.1-setup.exe 347864787 B 5D354375D41AD7CC6F8C1B5C87375664384E173B9AEE9520F0CEBDDDED516EC2
cute-fat-fish-pet-1.2.1-win-x64.zip 417022629 B 8C36D3B89C72EC5F968473BCB48AA28C6A93FA0E311261E863D264D2025B2843

Each file also has a .sha256 companion (<SHA256> <filename>). Check a download with:

Get-FileHash .\cute-fat-fish-pet-1.2.1-setup.exe -Algorithm SHA256

There is also a version-less copy of the installer (cute-fat-fish-pet-setup.exe, identical bytes)
whose link always points at the latest release.

Install

Double-click the setup — no admin rights, installs to %LOCALAPPDATA%\BlueHairMaid by default, and if
an older copy is registered it upgrades that directory instead of adding a second ~761 MB tree.

The portable zip works too: unpack it first (right-click → Extract All…), then either double-click
安装.cmd (shortcuts + uninstall entry) or run standalone\start-pet.vbs (no registry writes).

What changed in 1.2.1

1. 「测一下通不通」 now says something where you are looking.

  • The answer is written on its own line right next to the two buttons (联网模型:可以连通 · 312 ms,
    看屏幕:没有配视觉模型…) instead of only into the terminal at the bottom of a 2375 px page.
  • The same message appears in the status bar fixed at the bottom of the window, so a test result is
    visible no matter where you scrolled; there is a 去终端 ↓ link in that bar.
  • The probe now saves the fields you just typed before testing. It used to test the saved settings,
    so a connection test could quietly check the previous configuration.

2. The console is usable by a real person. A pass over every interactive piece, with measurements
(_accept\ui-audit.cjs: 123 controls, Tab reachability, hit-target sizes, focus styles, terminal
behaviour):

  • Whole header rows click. Every collapsed section used to have a 52 px coloured bar of which only a
    19 px strip reacted to a click; now the whole bar toggles it, with a hover tint and a blue arrow.
  • Focus is always visible. The stylesheet had exactly two :focus rules; buttons, summaries, chips
    and segmented options showed nothing when reached by Tab. Every one of them now gets a visible focus
    ring, and the black-and-white review screenshots confirm it.
  • Pressing something feels like pressing something — a 1 px press and a brightness change on
    buttons, chips, list rows and segmented options (there was hover feedback, but no press feedback).
  • Small targets are bigger: show/hide API-key buttons 26 → 30 px, chips 19 → 26 px or more with
    padding, checkbox rows 26 px tall with a 15 px box, sliders 16 → 26 px, ghost/utility buttons 32 px.
  • 「● 有改动没保存」 appears on a section whose inputs you edited and disappears when you save it
    (sections whose buttons save immediately are not marked). Deliberately not a blocking
    "are you sure you want to leave" dialog — this window is meant to stay open all day.
  • Results land where you look. The terminal grew a ↓ 有新消息 pill when new output arrives while
    you are scrolled up, a 清屏 button, and its own auto-scroll no longer yanks you to the bottom while
    you are reading history.
  • The console remembers: which sections were open (localStorage pet.console.sections.v1), and the
    last 50 commands you typed (↑ / ↓ in the command box).
  • Keyboard reaches everything: chips and the start-menu app rows now respond to Enter and Space,
    and the segmented 在线 / 本地 / 自动择优 (and 性格) options are reachable by Tab (they were
    display: none, so the keyboard could not get in at all).
  • Disabled buttons explain themselves: 停止桌宠 / 状态页 / 下载并更新 carry a title saying why.
  • Deleting a saved persona set now takes two clicks (the button turns into 「再点一次删掉」 for 3 s).

3. Asking her "在线还是离线" is answered by code, not guessed.

  • The chat system prompt now carries one line about the current mode; when you ask whether she is online,
    local, which model she uses or where it runs, the answer comes from the real configuration —
    我现在是在线模式哦——说话走联网的 deepseek-flash(api.deepseek.com);本机的 deepseek-r1:8b 只在联网连不上时兜底。
  • If the online model is not configured, she says so instead of claiming to be online.
  • 「你现在是本地模型吗」 used to be read as the command 「用本地」 and silently switched the mode;
    questions (吗 / 呢 / 还是 / 什么 / ?, without a leading 换 / 用 / 切 / 改) are now answered, not executed.
  • The status line reports the model too: 在线(deepseek-flash) instead of just 在线.

Also: version 1.2.1 in the four package.json files and the !define APP_VER default of
build\installer.nsi. No other file changed.

What is affected

  • The console: launcher\index.html (markup, styles, behaviour) and the plugin/host file
    src\lib\index.js (the file behind chat, which is also what the standalone runner loads).
  • Everything else is untouched: the pet engine and its animations, voice, the three permission switches,
    drag physics, click-through, the right-click menu, OBS recording, screen watching, the API-key masking
    from 1.1.4, and the one-click updater from 1.2.0.

Requirements

Windows 10/11 x64, about 761 MB unpacked. A GPU is optional; local models run on Ollama if you have it.
One-click updating needs to reach api.github.com and github.com (or a mirror).

Known limitations

  • 1.1.4 and older still have to update by hand once. The 「检查更新 / 下载并更新」 buttons only exist
    from 1.2.0 on; there is no way for code that is not there to update itself.
  • A full re-download every time. There is no delta patcher; each update pulls the whole installer
    (about 331.7 MB) again. The already-downloaded copy is reused only when the hash matches.
  • Update checks are rate-limited by GitHub: 60 anonymous requests per hour per IP address.
  • The installer is still not code-signed, so SmartScreen shows "Windows protected your PC" once
    (More info → Run anyway).
  • The pet and the console are restarted by the update; the update takes a couple of minutes.
  • No auto-start and no background update check: nothing happens until you press the button.
  • File names and in-app text are still Chinese; the repository and the GitHub page are English-first.

Updating to a newer version

From 1.2.0: open the console → 更新 → 检查更新 → 下载并更新. The window closes by itself,
installs, and comes back on the new version. (From 1.2.1 on, that is also how you get 1.2.2.)

By hand (any older version, or if the button cannot reach GitHub):

  1. Download the new cute-fat-fish-pet-setup.exe (or the zip) and .sha256; check the hash.
  2. Quit the console and the pet (tray icon → quit, or standalone\stop-pet.vbs).
  3. Run the new installer — it finds the registered directory and installs over it. Your settings,
    chat history, personas and photos live in %APPDATA%\BlueHairMaid and are never touched.
  4. Start her again; the console shows the new version.

Permanent link to the latest installer:
https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe

License and attribution

MIT (see LICENSE). The upstream pet dsh-pet 0.3.0 by PC2005-cloud is MIT as well; of its
243 public files, 232 are byte-identical here and 11 are deliberately modified (each with size and reason
in differences-from-upstream.md), no upstream file was deleted, and we add
three engine files of our own (obs-ctl.js, stt-worker.mjs, targets.js) plus the console-side
launcher\update.js. assets/第三方声明.txt inside the package lists every bundled component.


中文说明

修复版。 2026-10-09 · Windows x64 · MIT

1.2.0 已经让控制台能自己检查更新、自己装好新版。但用这个控制台还有三件事不对,而且只有重新发一版,
已经下过 1.2.0 的人才能拿到:「测一下通不通」的结果看不见、界面跟真人作对(19 像素的点击条、没有
焦点圈、结果滚到看不见的地方)、问她「你是在线还是离线」只能靠猜。

其它一切没变:同一个引擎、同一个数据目录、同一个一键更新。1.2.0 里本来就对的文件,在这一版里逐字节相同。

下载

文件 大小 SHA-256
cute-fat-fish-pet-1.2.1-setup.exe 347864787 B 5D354375D41AD7CC6F8C1B5C87375664384E173B9AEE9520F0CEBDDDED516EC2
cute-fat-fish-pet-1.2.1-win-x64.zip 417022629 B 8C36D3B89C72EC5F968473BCB48AA28C6A93FA0E311261E863D264D2025B2843

每个文件都有一个 .sha256 同名文件(格式 <SHA256> <文件名>)。核对下载:

Get-FileHash .\cute-fat-fish-pet-1.2.1-setup.exe -Algorithm SHA256

另外还有一份去掉版本号的安装器副本(cute-fat-fish-pet-setup.exe,字节完全相同),那个链接永远指向最新版。

安装

双击安装器就行:不需要管理员权限,默认装到 %LOCALAPPDATA%\BlueHairMaid;如果检测到已登记的旧版本,
会装回同一个目录,不会再铺一份 761 MB。

绿色包也一样:先右键 →「全部解压缩…」,然后二选一 —— 双击 安装.cmd(建快捷方式 + 登记卸载),
或者跑 standalone\start-pet.vbs(不写注册表)。

这一版改了什么

*...

Read more

可爱大肥鱼桌宠 1.2.0

Choose a tag to compare

@12we21 12we21 released this 09 Oct 13:07

Release notes — Cute Fat Fish Pet 1.2.0

Feature release. 2026-10-09 · Windows x64 · MIT · 中文说明见下方

Someone installs this on a brand-new machine and then a new version comes out. Until now the only way
to get it was to find the release page, download 347 MB by hand, quit the console and the pet, and run
the installer over the old directory. 1.2.0 makes that one button: the console now checks GitHub for a
new version, downloads the installer, verifies its SHA-256, closes itself, installs silently over the
same directory and starts itself and the pet back up.

Downloads

File Size SHA-256
cute-fat-fish-pet-1.2.0-setup.exe 347802318 B 22DB908B29AB28E6C811FC8019E624240BAEC676E9A6D046D330EA39643CAFB4
cute-fat-fish-pet-1.2.0-win-x64.zip 417016073 B 75EA491EBF46B2A4ADBDA1EE6589AC8ACEE17F1E397E0A928EC8D2110AA44502

Each file also has a .sha256 companion (<SHA256> <filename>). Check a download with:

Get-FileHash .\cute-fat-fish-pet-1.2.0-setup.exe -Algorithm SHA256

There is also a version-less copy of the installer (cute-fat-fish-pet-setup.exe, identical bytes)
whose link always points at the latest release.

Install

Double-click the setup — no admin rights, installs to %LOCALAPPDATA%\BlueHairMaid by default, and
if an older copy is registered it upgrades that directory instead of adding a second ~761 MB tree.

The portable zip works too: unpack it first (right-click → Extract All…), then either double-click
安装.cmd (shortcuts + uninstall entry) or run standalone\start-pet.vbs (no registry writes).

What changed in 1.2.0

Why. "How does a person who installed this on a clean machine update it?" The old answer was
"download it and run it over the top, and remember to quit the pet first". The new answer is one button
in the console. Nothing else about updating changed — the same installer, the same directory, the same
user data.

New 更新 section in the console.

  • 检查更新 asks https://api.github.com/repos/12we21/cute-fat-fish-pet/releases/latest and shows
    current version → new version, release date and the release notes. Answers are honest about why it
    failed: no network / blocked / needs a proxy, GitHub rate-limiting us (anonymous API allows 60
    requests per hour), or a release feed it could not read. When it cannot reach GitHub there is always a
    在浏览器里打开发布页 button as the manual way out.
  • 下载并更新 downloads the installer attached to that release into <data root>\updates\, streaming
    it to disk while computing SHA-256 on the fly (progress shows MB, percent and speed). The hash is the
    digest GitHub publishes on the asset itself; if a release has no hash, the console refuses to
    install it automatically
    — it tells you to download it by hand instead. A file that fails the check
    is deleted, never executed. A file that was already downloaded and still matches is reused, so a
    retry after a failed install does not re-download 347 MB.
  • The console cannot overwrite itself — electron.exe is locked by the running console — so the
    real work is handed to a generated apply-update.ps1 (written with a UTF-8 BOM, because PowerShell
    5.1 needs it to read Chinese paths). A tiny generated apply-update.vbs starts it through
    wscript.exe: PowerShell is a console program, and a console program started with no console exits
    immediately without doing anything. It waits for the console to
    exit (60 s at most; if it never exits, nothing is touched), stops the pet, runs
    setup.exe /S /D=<the same directory>, then removes the four portable scripts the zip channel left
    behind, deletes the 347 MB installer, writes the outcome, and starts the pet (only if it was running)
    and the console back up. A failed install still reopens the console, on the old version, so you are
    never left staring at nothing.
  • The result is read back on the next start and reported in the terminal — and it is judged by
    comparing version numbers, not by trusting what the script reported. A "success" whose version did not
    actually move is shown as a failure. Results older than a week are not mentioned again.
  • Silent installs into the right directory. The console writes
    HKCU\Software\BlueHairMaid\InstallDir before installing, which is both what the NSIS installer reads
    for its default directory and the key the portable-zip channel never wrote. Paths containing spaces
    fall back to the 8.3 short path, because NSIS requires /D= to be the last, unquoted argument.
  • Source checkouts are refused. If electron\electron.exe and launcher\main.js are not both
    present (running from a git clone), the console says so and tells you to git pull instead.
  • Optional mirror. A first line in <data root>\update-mirror.txt (or the DSH_PET_UPDATE_MIRROR
    environment variable) redirects only the asset download to another host, for networks that cannot
    reach GitHub's release CDN. The update check still talks to GitHub directly.

Also: version 1.2.0 in the four package.json files and the !define APP_VER default of
build\installer.nsi; new module launcher\update.js (about one third of it is the generated
PowerShell, and it is now listed in build\check-release.mjs so the release proves its bytes).

What is affected

  • The console window: one new section, plus launcher\update.js in the main process.
  • Everything else is untouched: the pet, chat, voice, the three permission switches, drag physics,
    click-through, the menus, OBS recording, screen watching, and the API-key masking from 1.1.4.

Requirements

Windows 10/11 x64, about 761 MB unpacked. A GPU is optional; local models run on Ollama if you have it.
One-click updating needs to reach api.github.com and github.com (or a mirror).

Known limitations

  • A full re-download every time. There is no delta patcher; each update pulls the whole ~347 MB
    installer again. The already-downloaded copy is reused only when the hash matches.
  • Update checks are rate-limited by GitHub: 60 anonymous requests per hour per IP address. The
    console says so when it hits the limit; it does not silently pretend to be up to date.
  • Nothing is downloaded from anywhere but the release's own assets, and only an asset that carries a
    sha256 digest is installed automatically — but the installer is still not code-signed, so
    SmartScreen shows "Windows protected your PC" once (More info → Run anyway).
  • The pet and the console are restarted by the update. Anything mid-sentence or mid-recording is
    interrupted; the update takes a couple of minutes.
  • On a portable-zip install the update deletes that channel's four scripts (安装.cmd, 卸载.cmd,
    install.ps1, uninstall.ps1) after the installer has taken over uninstall duty — the data directory
    is untouched either way.
  • If the console is installed to a directory it may not write to, the update cannot install; the log
    says so (see below).
  • No auto-start, no background update check: nothing happens until you press the button.
  • File names and in-app text are still Chinese; the repository and the GitHub page are English-first.

Update logs live in <data root>\updates\update-<version>.log, and the last outcome in
<data root>\updates\last-result.txt (read and deleted on the next start).

Updating to a newer version

From 1.1.4 or 1.2.0: open the console → 更新 → 检查更新 → 下载并更新. The window closes
by itself, installs, and comes back on the new version.

By hand (any older version, or if the button cannot reach GitHub):

  1. Download the new cute-fat-fish-pet-setup.exe (or the zip) and .sha256; check the hash.
  2. Quit the console and the pet (tray icon → quit, or standalone\stop-pet.vbs).
  3. Run the new installer — it finds the registered directory and installs over it. Your settings,
    chat history, personas and photos live in %APPDATA%\BlueHairMaid and are never touched.
  4. Start her again; the console shows the new version.

Permanent link to the latest installer:
https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe

License and attribution

MIT (see LICENSE). The upstream pet dsh-pet 0.3.0 by PC2005-cloud is MIT as well; of
its 243 public files, 232 are byte-identical here and 11 are deliberately modified (each with size and
reason in differences-from-upstream.md), no upstream file was deleted,
and we add three engine files of our own (obs-ctl.js, stt-worker.mjs, targets.js) plus the
console-side launcher\update.js. assets/第三方声明.txt inside the package lists every bundled
component.


中文说明

功能版。 2026-10-09 · Windows x64 · MIT

别人在一台全新的电脑上装完之后,出了新版怎么办?以前只能自己去发布页找、手动下 347 MB、先退出控制台和桌宠,
再把安装器盖上去。1.2.0 把这件事变成控制台里的一个按钮:检查 GitHub 有没有新版 → 下安装包并核对
SHA-256 → 关掉自己 → 静默装回同一个目录 → 把桌宠(本来在跑的话)和控制台自己开回来。

下载

文件 大小 SHA-256
cute-fat-fish-pet-1.2.0-setup.exe 347802318 B 22DB908B29AB28E6C811FC8019E624240BAEC676E9A6D046D330EA39643CAFB4
cute-fat-fish-pet-1.2.0-win-x64.zip 417016073 B 75EA491EBF46B2A4ADBDA1EE6589AC8ACEE17F1E397E0A928EC8D2110AA44502

每个文件都有一个 .sha256 同名文件(格式 <SHA256> <文件名>)。核对下载:

Get-FileHash .\cute-fat-fish-pet-1.2.0-setup...
Read more

Cute Fat Fish Pet 1.1.4 - the console can hide an API key

Choose a tag to compare

@12we21 12we21 released this 09 Oct 11:57

Release notes — Cute Fat Fish Pet 1.1.4

Feature release. 2026-10-09 · Windows x64 · MIT · 中文说明见下方

1.1.3 taught her the sentence 「打开 X」. 1.1.4 is for the person filming her: the console now hides the
API key you do not want on camera — the two key fields are dots by default with a 显示 / 隐藏 button
beside each one, and any key the console would print is masked as it is written.

Downloads

File Size SHA-256
cute-fat-fish-pet-1.1.4-setup.exe 347880285 B 495F5D3506C419B7967513E3F8C73F655F108FAC965BFF58B643EE018553C5D0
cute-fat-fish-pet-1.1.4-win-x64.zip 417002153 B 54F6832CCC6D609FC26497F12B54EE9DA4016E8ACA2F144246AC0F23CC9542FC

Each file also has a .sha256 companion (<SHA256> <filename>). Check a download with:

Get-FileHash .\cute-fat-fish-pet-1.1.4-setup.exe -Algorithm SHA256

There is also a version-less copy of the installer (cute-fat-fish-pet-setup.exe, identical bytes)
whose link always points at the latest release.

Install

Double-click the setup — no admin rights, installs to %LOCALAPPDATA%\BlueHairMaid by default, and
if an older copy is registered it upgrades that directory instead of adding a second ~761 MB tree.

The portable zip works too: unpack it first (right-click → Extract All…), then either double-click
安装.cmd (shortcuts + uninstall entry) or run standalone\start-pet.vbs (no registry writes).

What changed in 1.1.4

Why. Recording a promo video of the console means recording whatever the console shows. It showed
the API key in plain text in two places at once — the two key fields of 「联网模型」, and any log line
that happened to echo it. Editing around that after the fact is no way to record.

Fix — the console hides the API key.

  • The key fields are dots by default. Both key inputs are real password fields now, with a
    显示 / 隐藏 button beside each one. The key is still filled in and saved exactly as before; you
    reveal it per field, and only for as long as you are looking at it. The two fields are independent:
    showing the chat key never reveals the vision key.
  • The console's own output is masked as it is written. A saved key becomes ••••••, sk-… becomes
    sk-•••••• and Bearer <token> becomes Bearer •••••• — in the terminal, the 本机适配 log, the
    permission log and the footer's data path alike. This holds whether the field is currently shown or
    hidden, so a key cannot reach the screen through a log line mid-demo. There is no switch to remember
    and nothing to turn on: the console simply never prints a key it knows.
  • Nothing else is touched. The masker only rewrites the key and sk-… / Bearer … tokens; paths,
    user names and ordinary text come out exactly as before.
  • The keys themselves are untouched. They are read from and written to standalone\online.json in
    the same format as always; masking is a display-only layer. It is not encryption — that file is
    still plain text, which is exactly why it lives in the app directory and never in a log.

Also: version 1.1.4 in the four package.json files and the !define APP_VER default of
build\installer.nsi. The privacy gate also caught this release-notes file itself: it quoted a literal
local test path as a counter-example, build\check-paths.mjs rejects those on sight, and the build
stopped on those 2 hits until the path was written the way the rest of the docs write it. Packaging is
green again: 184 files scanned, 0 hits.

What is affected

  • The console window, and only it: two new buttons, and how the console writes its own log lines
    to the screen.
  • Everything else is untouched: the pet, chat, voice, the three permission switches, drag physics,
    click-through, the menus, OBS recording, screen watching, and both model paths. Nothing the pet says
    in her own speech bubbles is affected either.

Requirements

Windows 10/11 x64, about 761 MB unpacked. A GPU is optional; local models run on Ollama if you have it.

Known limitations

  • The masker hides what the console renders. It does not encrypt or scramble standalone\online.json
    itself, and a key typed somewhere else (a chat bubble, another app) is outside its reach.
  • The masker knows three shapes: the exact saved key, sk-… and Bearer …. A screenshot of the pet's
    own window, or one you take yourself, is outside its reach.
  • It is a display feature, not a security boundary: anyone who can read the files can read the key.
  • The installer is not code-signed, so SmartScreen shows "Windows protected your PC" once
    (More info → Run anyway). SHA-256 hashes are the integrity check.
  • No auto-start, no auto-update yet (a one-click update in the console is planned for 1.2.0).
  • File names and in-app text are still Chinese; the repository and the GitHub page are English-first.

Updating to a newer version

  1. Download the new cute-fat-fish-pet-setup.exe (or the zip) and .sha256; check the hash.
  2. Quit the console and the pet (tray icon → quit, or standalone\stop-pet.vbs).
  3. Run the new installer — it finds the registered directory and installs over it. Your settings,
    chat history, personas and photos live in %APPDATA%\BlueHairMaid and are never touched.
  4. Start her again; the console shows the new version.

Permanent link to the latest installer:
https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe

License and attribution

MIT (see LICENSE). The upstream pet dsh-pet 0.3.0 by PC2005-cloud is MIT as well; of
its 243 public files, 232 are byte-identical here and 11 are deliberately modified (each with size and
reason in differences-from-upstream.md), no upstream file was deleted,
and we add three engine files of our own (obs-ctl.js, stt-worker.mjs, targets.js).
assets/第三方声明.txt inside the package lists every bundled component.


中文说明

功能版。 2026-10-09 · Windows x64 · MIT

1.1.3 教会了她「打开 X」这句话;1.1.4 是给要拍她的人的:控制台现在能把不想入镜的 API Key 自己藏起来 ——
两个 Key 框默认就是圆点、各带一个「显示 / 隐藏」按钮,而且控制台自己打印出来的 Key 在写出去时就已经被抹掉。

下载

文件 大小 SHA-256
cute-fat-fish-pet-1.1.4-setup.exe 347880285 B 495F5D3506C419B7967513E3F8C73F655F108FAC965BFF58B643EE018553C5D0
cute-fat-fish-pet-1.1.4-win-x64.zip 417002153 B 54F6832CCC6D609FC26497F12B54EE9DA4016E8ACA2F144246AC0F23CC9542FC

每个文件都有一个 .sha256 同名文件(格式 <SHA256> <文件名>)。核对下载:

Get-FileHash .\cute-fat-fish-pet-1.1.4-setup.exe -Algorithm SHA256

另外还有一份去掉版本号的安装器副本(cute-fat-fish-pet-setup.exe,字节完全相同),那个链接永远指向最新版。

安装

双击安装器就行:不需要管理员权限,默认装到 %LOCALAPPDATA%\BlueHairMaid;如果检测到已登记的旧版本,
会装回同一个目录,不会再铺一份 761 MB。

绿色包也一样:先右键 →「全部解压缩…」,然后二选一 —— 双击 安装.cmd(建快捷方式 + 登记卸载),
或者跑 standalone\start-pet.vbs(不写注册表)。

这一版改了什么

起因。 要录控制台的宣传视频,就等于把控制台显示的东西一起录进去。而它把 API Key 一次就露两处:
「联网模型」里那两个 Key 输入框是明文,日志里任何顺手回显了 Key 的行也是明文。事后打码不是个办法。

修法 —— 控制台把 API Key 藏起来。

  • Key 输入框默认就是圆点。 两个 Key 框改成真正的 password 输入框,各自配一个「显示 / 隐藏」按钮。
    Key 的读取与保存一切照旧,只有你主动点「显示」时才明文,而且只影响你点的那一个框 ——
    点开聊天 Key 不会带出视觉 Key。
  • 控制台自己打印的东西,写出去时就已经脱敏。 保存的那把 Key 变成 ••••••、sk-… 变成 sk-••••••、
    Bearer <令牌> 变成 Bearer •••••• —— 终端、本机适配日志、权限日志、页脚的数据路径全都一样。
    输入框当前是显示还是隐藏都无所谓,所以录到一半也不可能有哪一行日志把 Key 漏到屏幕上。
    没有开关要记、没有东西要提前打开:控制台只是不再把自己知道的 Key 打出来。
  • 别的一概不动。 脱敏只改那把 Key 和 sk-… / Bearer … 令牌;路径、用户名、普通文字都原样输出。
  • Key 本身没动。 依旧按原格式读写 standalone\online.json,脱敏只是显示层。注意这不是加密 ——
    那个文件本身仍是明文,这也正是它住在程序目录、从不进日志的原因。

另外: 四个 package.json 与 build\installer.nsi 的 !define APP_VER 升到 1.1.4。另外,隐私门禁这次拦下的
是这份发布说明自己:里面把一条本机测试路径当反面例子原样引用了,而 build\check-paths.mjs 见一次拦一次 ——
这 2 处改成该文档体系一贯的写法后,门禁重新干净:扫描 184 个文件、0 命中。

影响范围

  • 只有控制台窗口:多了两个按钮,以及它自己往屏幕上写日志的方式。
  • 其他一切不动:桌宠本体、聊天、语音、三个权限开关、拖拽物理、鼠标穿透、菜单、OBS 录制、看屏幕、
    在线/本机模型。她自己在气泡里说的话也不受影响。

系统要求

Windows 10/11 x64,解压后约 761 MB。显卡可选;本地模型走你已经装好的 Ollama。

已知限制

  • 脱敏遮的是控制台渲染出来的东西。它不会加密或打乱 standalone\online.json 本身;你自己打进别的地方
    (聊天框、别的软件)的 Key 它也管不着。
  • 脱敏只认三种形状:保存的那把 Key 原文、sk-…、Bearer …。桌宠自己气泡里的内容、或者你自己另外截的图,
    都不在它的范围内。
  • 这是显示层功能,不是安全边界:能读到文件的人一样能读到 Key。
  • 安装器没有代码签名,所以 SmartScreen 会拦一次(「更多信息」→「仍要运行」)。完整性请用 SHA-256 核对。
  • 没有开机自启,也还没有自动更新(控制台里的一键更新排在 1.2.0)。
  • 包内文件名与文案仍是中文;仓库与 GitHub 页面以英文为主。

以后怎么升级

  1. 下载新的 cute-fat-fish-pet-setup.exe(或 zip)与 .sha256,核对哈希。
  2. 先退出控制台与桌宠(托盘图标退出,或 standalone\stop-pet.vbs)。
  3. 跑新安装器 —— 它会认出已登记的目录并装回去。你的设置、聊天记录、人设、照片都在
    %APPDATA%\BlueHairMaid,永远不动。
  4. 重新启动她,控制台会显示新版本号。

永远指向最新安装器的链接:
https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe

许可与署名

MIT(见 LICENSE)。上游桌宠 dsh-pet 0.3.0(PC2005-cloud)同样是 MIT;它公开的 243 个文件里,
232 个与本仓库逐字节相同、11 个是刻意修改的(每个都带大小与原因,见
differences-from-upstream.md),没有删掉上游任何文件;我们另外加了三个引擎文件
(obs-ctl.js、stt-worker.mjs、targets.js)。包内 assets/第三方声明.txt 列了所有随包分发的组件。

Cute Fat Fish Pet 1.1.3 - open X reaches a website, a folder or a file

Choose a tag to compare

@12we21 12we21 released this 08 Oct 18:21

Release notes — Cute Fat Fish Pet 1.1.3

Feature release. 2026-10-09 · Windows x64 · MIT · 中文说明见下方

1.1.2 stopped the online model from saying its thinking out loud. 1.1.3 is about one sentence you can
now say to her and mean three different things: 「打开 X」 — a website (打开 A站首页), a folder
or file
on this PC (打开 下载文件夹, 打开 报告.docx), or an app (打开 求生之路2). It works
the same whether you type it in the chat or say it out loud.

Downloads

File Size SHA-256
cute-fat-fish-pet-1.1.3-setup.exe 347865488 B 88A64CF8432669F230B54647D0AF35B79FE6C3035CCEF4227E9AE2F766A1202D
cute-fat-fish-pet-1.1.3-win-x64.zip 417001082 B 5BAB95740EA66117E72B9060E86621242B774EC757C674BAE27C3EF5EF790A21

Each file also has a .sha256 companion (<SHA256> <filename>). Check a download with:

Get-FileHash .\cute-fat-fish-pet-1.1.3-setup.exe -Algorithm SHA256

There is also a version-less copy of the installer (cute-fat-fish-pet-setup.exe, identical bytes)
whose link always points at the latest release.

Install

Double-click the setup — no admin rights, installs to %LOCALAPPDATA%\BlueHairMaid by default, and
if an older copy is registered it upgrades that directory instead of adding a second ~761 MB tree.

The portable zip works too: unpack it first (right-click → Extract All…), then either double-click
安装.cmd (shortcuts + uninstall entry) or run standalone\start-pet.vbs (no registry writes).

What changed in 1.1.3

Symptom. 「打开 A站首页」 opened nothing; 「打开 下载文件夹」 was treated as an app name and came
back as not found; 「打开 报告.docx」 the same. Only http://…/www.… URLs and app names got through,
because the router only had two buckets — URL and app.

Fix — a real classifier for what she heard. A new engine file,
runtime/electron-helper/targets.js, turns the words after 「打开」 into one of three kinds, in this
order: website → local path → system folder → drive → site alias → app (the fallback). Both the
voice path and the typed path go through the same function, so they cannot drift apart.

  • Websites — https://…, www.…, or a curated alias list: A站/acfun, B站/小破站/哔哩哔哩,
    知乎, 微博, 百度, 贴吧, 淘宝, 天猫, 京东, 拼多多, 豆瓣, 抖音, 快手, 小红书, 腾讯视频, 爱奇艺,
    优酷, 网易云音乐, QQ音乐, 维基百科, 必应, GitHub, YouTube, Twitter, Facebook. Trailing
    「首页 / 主页 / 官网 / 官方网站 / 网站 / 网页 / 网址 / 官方」 and sentence-final particles
    (吧 / 呀 / 啊 / 哦 / 嘛 / 呢 / 啦 …) are stripped first, so 「B站吧」 works.
  • Folders and files — 下载/下载夹/下载目录/下载文件夹 → the real Downloads folder, and the same
    for 文档/我的文档/文稿, 图片/照片/相册, 桌面, 视频/影片, 主目录/用户目录/家目录, 临时文件夹;
    音乐文件夹 works while 「打开 音乐」 still starts your music app. D盘/d:/D:\ →
    D:\, absolute paths are opened as-is, and a bare name is looked up in
    桌面 / 下载 / 文档 / 图片 / 视频 / 音乐.
  • Searching — 「百度一下 …」 / 「搜一下 …」 / 「查一下 …」 opens the results page: Bing by default,
    Baidu when you actually said 百度.
  • Apps — unchanged. 「打开 求生之路2」, 「打开 微信」, 「打开 我的电脑」 still take the old path
    (Start-menu/desktop shortcuts, the Chinese-name map, and your own aliases.json).

Fix — the third permission switch. Opening files and folders is a new capability, so it gets its
own switch: 允许她打开文件夹/文件 (default off, like the other two). With it off she answers
with the permission line and nothing opens. Apps and websites keep their existing switches.

Fix — she never guesses, and only ever opens. If a bare file name matches more than one thing she
asks which one; if nothing matches she says she could not find it. The lookup reads the top level of
those six folders read-only, and it deliberately skips shortcuts and executables
(.lnk/.url/.exe/.bat/.cmd) — those are apps, and the file permission must never be able to
launch software by accident. She only ever calls shell.openPath / shell.openExternal: no delete, no
move, no rename. Requests that mean "uninstall X" are still refused outright.

Also: the packaged smoke self-test now waits for the context menu before checking it (it used to
report a false negative because the menu is built after two awaits); version 1.1.3 in the four
package.json files and the !define APP_VER default of build\installer.nsi.

What is affected

  • Voice input and typed chat (the chat box and the voice path share one router).
  • Everything else is untouched: animations, drag physics, click-through, the menus, OBS recording,
    screen watching and the online/local model paths.
  • An ordinary sentence is still not intercepted — she only acts when the sentence is a command.

Requirements

Windows 10/11 x64, about 761 MB unpacked. A GPU is optional; local models run on Ollama if you have it.

Known limitations

  • File lookup is one level deep in the six known folders — it does not walk subdirectories and has
    no fuzzy or pinyin matching. For a nested file, say the path (打开 D:\我的游戏\存档).
  • The site list is curated, not a search: an unknown name falls through to the app path, which is
    what makes 「打开 求生之路2」 start a game.
  • The installer is not code-signed, so SmartScreen shows "Windows protected your PC" once
    (More info → Run anyway). SHA-256 hashes are the integrity check.
  • No auto-start, no auto-update yet (a one-click update in the console is planned for 1.2.0).
  • File names and in-app text are still Chinese; the repository and the GitHub page are English-first.

Updating to a newer version

  1. Download the new cute-fat-fish-pet-setup.exe (or the zip) and .sha256; check the hash.
  2. Quit the console and the pet (tray icon → quit, or standalone\stop-pet.vbs).
  3. Run the new installer — it finds the registered directory and installs over it. Your settings,
    chat history, personas and photos live in %APPDATA%\BlueHairMaid and are never touched.
  4. Start her again; the console shows the new version.

Permanent link to the latest installer:
https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe

License and attribution

MIT (see LICENSE). The upstream pet dsh-pet 0.3.0 by PC2005-cloud is MIT as well; of
its 243 public files, 232 are byte-identical here and 11 are deliberately modified (each with size and
reason in differences-from-upstream.md), no upstream file was deleted,
and we add three engine files of our own (obs-ctl.js, stt-worker.mjs, targets.js).
assets/第三方声明.txt inside the package lists every bundled component.


中文说明

功能版。 2026-10-09 · Windows x64 · MIT

1.1.2 让联网模型不再把「思考过程」念出来;1.1.3 只做一件事:让「打开 X」这句话真的能开三种东西 ——
网页(打开 A站首页)、本机的文件夹或文件(打开 下载文件夹、打开 报告.docx)、
软件(打开 求生之路2)。而且打字说和开口说完全一样。

下载

文件 大小 SHA-256
cute-fat-fish-pet-1.1.3-setup.exe 347865488 B 88A64CF8432669F230B54647D0AF35B79FE6C3035CCEF4227E9AE2F766A1202D
cute-fat-fish-pet-1.1.3-win-x64.zip 417001082 B 5BAB95740EA66117E72B9060E86621242B774EC757C674BAE27C3EF5EF790A21

每个文件都有一个 .sha256 同名文件(格式 <SHA256> <文件名>)。核对下载:

Get-FileHash .\cute-fat-fish-pet-1.1.3-setup.exe -Algorithm SHA256

另外还有一份去掉版本号的安装器副本(cute-fat-fish-pet-setup.exe,字节完全相同),那个链接永远指向最新版。

安装

双击安装器就行:不需要管理员权限,默认装到 %LOCALAPPDATA%\BlueHairMaid;如果检测到已登记的旧版本,
会装回同一个目录,不会再铺一份 761 MB。

绿色包也一样:先右键 →「全部解压缩…」,然后二选一 —— 双击 安装.cmd(建快捷方式 + 登记卸载),
或者跑 standalone\start-pet.vbs(不写注册表)。

这一版改了什么

现象。 说「打开 A站首页」没反应;说「打开 下载文件夹」「打开 报告.docx」会被当成软件名去找,最后回一句
「没找到」。只有 http://…/www.… 开头的网址和软件名能走通 —— 因为原来的路由只有两个桶:网址、软件。

修法 —— 给她一个真正会分类的「目标判定」。 新增引擎文件
runtime/electron-helper/targets.js:把「打开」后面那串字按固定顺序判成三类之一 ——
网址 → 本机路径 → 系统文件夹 → 盘符 → 站点别名 → 软件(兜底)。语音与打字走的是同一个函数,
不可能出现两套行为。

  • 网址:https://…、www.…,以及一份人工整理的别名表:A站/acfun、B站/小破站/哔哩哔哩、知乎、微博、
    百度、贴吧、淘宝、天猫、京东、拼多多、豆瓣、抖音、快手、小红书、腾讯视频、爱奇艺、优酷、网易云音乐、
    QQ音乐、维基百科、必应、GitHub、YouTube、Twitter、Facebook。判定前先削掉句尾的
    「首页 / 主页 / 官网 / 官方网站 / 网站 / 网页 / 网址 / 官方」和语气词(吧/呀/啊/哦/嘛/呢/啦…),
    所以「B站吧」也能认。
  • 文件夹与文件:下载/下载夹/下载目录/下载文件夹 → 真正的下载目录,文档/我的文档/文稿、图片/照片/相册、
    桌面、视频/影片、主目录/用户目录/家目录、临时文件夹同理;音乐文件夹 能开文件夹,而「打开 音乐」仍然是
    开音乐软件。D盘/d:/D:\ → D:\,绝对路径原样打开,只给一个名字时去
    桌面 / 下载 / 文档 / 图片 / 视频 / 音乐 里找。
  • 搜索:「百度一下 …」「搜一下 …」「查一下 …」直接开结果页 —— 默认必应,说了「百度」就用百度。
  • 软件:不变。「打开 求生之路2」「打开 微信」「打开 我的电脑」还是老路(开始菜单/桌面快捷方式、
    中文对照表、以及你自己的 aliases.json)。

修法 —— 第三个权限开关。 打开文件/文件夹是新能力,所以给它单独一个开关:允许她打开文件夹/文件
(默认关闭,和前两个一样)。关着的时候她只回一句权限提示、什么都不开。软件与网页沿用原来的开关。

修法 —— 她永远不猜,而且只开不删。 同名文件有多个时她会问是哪一个;一个都没找到就如实说没找到。
查找是只读、只扫那六个目录的顶层,并且刻意跳过快捷方式与可执行文件
(.lnk/.url/.exe/.bat/.cmd)—— 那些属于软件那条路,文件权限绝不能顺手把软件拉起来。
她只会调 shell.openPath / shell.openExternal:不删除、不移动、不改名。凡是意思是「卸载 X」的请求,
照旧直接拒绝。

另外: 包内自检对右键菜单的检查改成「等菜单挂出来再查」(以前因为菜单要等两个 await 才建,自检会误报
失败);四个 package.json 与 build\installer.nsi 的 !define APP_VER 都升到 1.1.3。

影响范围

  • 语音输入与打字聊天(聊天框和语音走的是同一个路由器)。
  • 其他一切不动:动画、拖拽物理、鼠标穿透、菜单、OBS 录制、看屏幕、在线/本机模型。
  • 普通聊天依旧不会被拦截 —— 只有像命令的句子才会触发动作。

系统要求

Windows 10/11 x64,解压后约 761 MB。显卡可选;本地模型走你已经装好的 Ollama。

已知限制

  • 文件查找只有一层:只在那六个目录的顶层找,不递归、不支持拼音或模糊匹配。文件在子目录里就把路径说出来
    (打开 D:\我的游戏\存档)。
  • 站点别名是人工整理的清单,不是搜索:认不出来的名字会落到软件那条路 —— 「打开 求生之路2」能开游戏正是靠这个。
  • 安装器没有代码签名,所以 SmartScreen 会拦一次(「更多信息」→「仍要运行」)。完整性请用 SHA-256 核对。
  • 没有开机自启,也还没有自动更新(控制台里的一键更新排在 1.2.0)。
  • 包内文件名与文案仍是中文;仓库与 GitHub 页面以英文为主。

以后怎么升级

  1. 下载新的 cute-fat-fish-pet-setup.exe(或 zip)与 .sha256,核对哈希。
  2. 先退出控制台与桌宠(托盘图标退出,或 standalone\stop-pet.vbs)。
  3. 跑新安装器 —— 它会认出已登记的目录并装回去。你的设置、聊天记录、人设、照片都在
    `%APPDATA%\BlueHai...
Read more

Cute Fat Fish Pet 1.1.2 - the online model stops saying its thinking out loud

Choose a tag to compare

@12we21 12we21 released this 08 Oct 16:36

Release notes — Cute Fat Fish Pet 1.1.2

Fix release. 2026-10-09 · Windows x64 · MIT · 中文说明见下方

1.1.1 made the portable zip install and uninstall on a double-click. 1.1.2 fixes one thing that
made the online model unusable in chat: she used to say her thinking process out loud.

Downloads

File Size SHA-256
cute-fat-fish-pet-1.1.2-setup.exe 347760952 B A35571AF44F2ED27C6512528B4B4785DA67C663FDAE60001CCF7C87E795D160D
cute-fat-fish-pet-1.1.2-win-x64.zip 416993754 B F4F9B684C5BBA85A46471C19E4E0BB7EAB43EE9346472550EBAC2FEACD1A04E5

Each file also has a .sha256 companion (<SHA256> <filename>). Check a download with:

Get-FileHash .\cute-fat-fish-pet-1.1.2-setup.exe -Algorithm SHA256

There is also a version-less copy of the installer (cute-fat-fish-pet-setup.exe, identical bytes)
whose link always points at the latest release.

Install

Double-click the setup — no admin rights, installs to %LOCALAPPDATA%\BlueHairMaid by default, and
if an older copy is registered it upgrades that directory instead of adding a second ~761 MB tree.

The portable zip works too: unpack it first (right-click → Extract All…), then either double-click
安装.cmd (shortcuts + uninstall entry) or run standalone\start-pet.vbs (no registry writes).
That whole path was the subject of 1.1.1 — see release notes 1.1.1.

What changed in 1.1.2

Symptom. With the brain set to 「在线(联网模型)」 or 「自动择优」 and an OpenAI-compatible
endpoint configured (the one DeepSeek endpoint is what shipped as the default), her replies in the
console chat were a wall of reasoning text instead of a line.

Root cause, measured. DeepSeek's current models (deepseek-flash, deepseek-v4-pro) are
thinking models: they emit a separate reasoning_content field before the answer. On a short budget
— exactly the pet's case, it wants 20–40 characters — the reasoning eats the whole budget and
content comes back empty (measured: 20-token budget → 0 characters of answer, 556 characters of
thinking). standalone/online.mjs handled "no content" by falling back to reasoning_content,
so the reasoning was spoken as her line.

Fix 1 — turn thinking off at the endpoint. For api.deepseek.com the request now carries
"thinking": {"type": "disabled"} (never for reasoner models; other OpenAI-compatible endpoints do
not get this field, so nothing else changes). The same one-liner went from 400 tokens burned on
thinking to 2 tokens and a real answer: 「辛苦啦,快靠过来,我给你充充电~」.

Fix 2 — never speak thinking again. If a response still has only reasoning_content and no
content, online.mjs now returns an honest error (thinking-only, 「联网模型只想了、没写正文:把预算
调大,或在控制台换一个不思考的模型」) instead of narrating it. This matches what the local path has
always done (app/lib/index.js:431, and the helper's pet:local-quip which only returns an error
code).

Fix 3 — string-shaped messages. toOpenAIMessages accepted only array-shaped content; a plain
string silently became an empty prompt (and the model then answered something unrelated). It now
accepts strings too.

Also: version 1.1.2 in the four package.json files and the !define APP_VER default of
build\installer.nsi. The README.md shipped inside the package still names no version, so a future
release does not have to repack just for a version string.

What is affected

  • Online models only (the console's 「联网模型」 page, with the brain on 「在线」 or 「自动择优」).
  • Local Ollama models are untouched — that path never spoke thinking; with a thinking model on a short
    budget it reports 「本机模型没返回文本」 instead of narrating.
  • The 1.1.1 portable-zip install/uninstall behaviour is unchanged.

Requirements

Windows 10/11 x64, about 761 MB unpacked. A GPU is optional; local models run on Ollama if you have it.

Known limitations

  • The installer is not code-signed, so SmartScreen shows "Windows protected your PC" once
    (More info → Run anyway). SHA-256 hashes are the integrity check.
  • No auto-start, no auto-update yet (a one-click update in the console is planned for 1.2.0).
  • File names and in-app text are still Chinese; the repository and the GitHub page are English-first.
  • src/lib/ is a build product of src/src/; GitHub reports the license as NOASSERTION (MIT is in
    LICENSE, and the upstream notices are kept).
  • Observed, not introduced by this release: that DeepSeek endpoint occasionally returned content
    unrelated to the prompt (two occurrences while testing; unrelated requests, same key).

Updating to a newer version

  1. Download the new cute-fat-fish-pet-setup.exe (or the zip) and .sha256; check the hash.
  2. Quit the console and the pet (tray icon → quit, or standalone\stop-pet.vbs).
  3. Run the new installer — it finds the registered directory and installs over it. Your settings,
    chat history, personas and photos live in %APPDATA%\BlueHairMaid and are never touched.
  4. Start her again; the console shows the new version.

Permanent link to the latest installer:
https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe

License and attribution

MIT (see LICENSE). The upstream pet dsh-pet 0.3.0 by PC2005-cloud is MIT as well; of
its 243 public files, 232 are byte-identical here and 11 are deliberately modified (each with size and
reason in differences-from-upstream.md), and no upstream file was
deleted. assets/第三方声明.txt inside the package lists every bundled component.


中文说明

修复版。 2026-10-09 · Windows x64 · MIT

1.1.1 让绿色 zip 包「解压 → 双击 安装.cmd」第一次就能装成功;1.1.2 只修一件事:联网模型会在聊天里
把「思考过程」整段念出来
,这一版让她闭嘴想、只说话。

下载

文件 大小 SHA-256
cute-fat-fish-pet-1.1.2-setup.exe 347760952 B A35571AF44F2ED27C6512528B4B4785DA67C663FDAE60001CCF7C87E795D160D
cute-fat-fish-pet-1.1.2-win-x64.zip 416993754 B F4F9B684C5BBA85A46471C19E4E0BB7EAB43EE9346472550EBAC2FEACD1A04E5

每个文件都有一个 .sha256 同名文件(格式 <SHA256> <文件名>)。核对下载:

Get-FileHash .\cute-fat-fish-pet-1.1.2-setup.exe -Algorithm SHA256

另外还有一份去掉版本号的安装器副本(cute-fat-fish-pet-setup.exe,字节完全相同),那个链接永远指向最新版。

安装

双击安装器就行:不需要管理员权限,默认装到 %LOCALAPPDATA%\BlueHairMaid;如果检测到已登记的旧版本,
会装回同一个目录,不会再铺一份 761 MB。

绿色包也一样:先右键 →「全部解压缩…」,然后二选一 —— 双击 安装.cmd(建快捷方式 + 登记卸载),
或者跑 standalone\start-pet.vbs(不写注册表)。这条路的修复见 1.1.1 发布说明。

这一版改了什么

现象。 大脑选「在线(联网模型)」或「自动择优」、并配了 OpenAI 兼容端点(默认填的就是 DeepSeek 的地址)时,
控制台里的对话回过来的是一大段推理文字,而不是一句话。

根因(实测)。 DeepSeek 现在的模型(deepseek-flash、deepseek-v4-pro)都是思考型:先输出一段独立的
reasoning_content,再写正文。而桌宠要的是 20~40 字的短句,预算给得小 —— 实测 20 token 预算下正文 0 字、
思考 556 字
,正文直接是空的。standalone/online.mjs 遇到「正文为空」时退而把 reasoning_content 当回答,
于是思考就变成了她的台词。

修法 1 — 在端点上直接关掉思考。 对 api.deepseek.com 的请求体现在带 "thinking": {"type": "disabled"}
(reasoner 类不加;别的 OpenAI 兼容端点不发这个字段,所以不影响其他服务)。同一句话从「400 token 全烧在思考」
变成 2 个 token 直接回答:「辛苦啦,快靠过来,我给你充充电~」。

修法 2 — 再也不把思考念出来。 如果响应仍然只有 reasoning_content、没有正文,online.mjs 现在如实报错
(thinking-only:「联网模型只想了、没写正文:把预算调大,或在控制台换一个不思考的模型」),而不是把它念出来。
这与本地那条路一直以来的做法一致(app/lib/index.js:431,以及 helper 的 pet:local-quip 只回错误码)。

修法 3 — 字符串形状的消息。 toOpenAIMessages 以前只认数组形状的 content,传纯字符串会被静默变成空 prompt
(模型于是答非所问);现在也接受字符串。

另外: 四个 package.json 与 build\installer.nsi 的 !define APP_VER 默认值都升到 1.1.2;
包内的 README.md 仍然不写死版本号,以后发版不必为了版本字符串重打包。

影响范围

  • 只有联网模型这条路(控制台「联网模型」页,且大脑在「在线」或「自动择优」)。
  • 本地 Ollama 不受影响 —— 那条路本来就只读正文;思考型模型在短预算下它会报「本机模型没返回文本」,不会念思考。
  • 1.1.1 的绿色包安装/卸载行为不变。

系统要求

Windows 10/11 x64,解压后约 761 MB。显卡可选;本地模型走你已经装好的 Ollama。

已知限制

  • 安装器没有代码签名,所以 SmartScreen 会拦一次(「更多信息」→「仍要运行」)。完整性请用 SHA-256 核对。
  • 没有开机自启,也还没有自动更新(控制台里的一键更新排在 1.2.0)。
  • 包内文件名与文案仍是中文;仓库与 GitHub 页面以英文为主。
  • src/lib/ 是 src/src/ 的构建产物;GitHub 会把许可识别成 NOASSERTION(MIT 在 LICENSE 里,上游声明都保留着)。
  • 顺带记录的观察(不是这一版引入的):那个 DeepSeek 端点偶发返回与提问无关的内容(测试期间撞到两次,与密钥/请求无关)。

以后怎么升级

  1. 下载新的 cute-fat-fish-pet-setup.exe(或 zip)与 .sha256,核对哈希。
  2. 先退出控制台与桌宠(托盘图标退出,或 standalone\stop-pet.vbs)。
  3. 跑新安装器 —— 它会认出已登记的目录并装回去。你的设置、聊天记录、人设、照片都在
    %APPDATA%\BlueHairMaid,永远不动。
  4. 重新启动她,控制台会显示新版本号。

永远指向最新安装器的链接:
https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe

许可与署名

MIT(见 LICENSE)。上游桌宠 dsh-pet 0.3.0(PC2005-cloud)同样是 MIT;它公开的 243 个文件里,
232 个与本仓库逐字节相同、11 个是刻意修改的(每个都带大小与原因,见
differences-from-upstream.md),没有删掉上游任何文件。
包内 assets/第三方声明.txt 列了所有随包分发的组件。

Cute Fat Fish Pet 1.1.1 - the portable zip installs on a double-click

Choose a tag to compare

@12we21 12we21 released this 08 Oct 13:42

Release notes — Cute Fat Fish Pet 1.1.1

Portable-zip fix release: unpack it, double-click 安装.cmd, and it installs. 2026-10-08 · Windows x64 · MIT

中文说明见下方

What this release is

1.1.0 was the first public release. 1.1.1 is a small, focused fix release for the portable zip:
three defects could make "unpack the zip, double-click 安装.cmd" fail, print nothing, or install a copy that still
called itself 1.0.0 — and while testing the fix, a fourth one turned up in the uninstaller, which left the whole
installation directory behind. All four are fixed, verified on a real Windows machine and written up in
known-issues.md (symptom → reproduction → root cause → fix).

The setup.exe installer was never affected by the first three (it does not use those scripts), and it is rebuilt here
only so that its version number matches. Its behaviour is unchanged from 1.1.0.

Downloads

File Size SHA-256
cute-fat-fish-pet-1.1.1-setup.exe 347882493 B (331.8 MB) 9A0DBB160E92C9192E1F7BB7D37D620B45F0F77DCE462A9ACC1AEB3908FC2022
cute-fat-fish-pet-1.1.1-win-x64.zip 416992984 B (397.7 MB) 18A22ED88D221F71BA3872D3CA9A854B09BEF8C07B3EEBE6E71F8C0544C4C4DC

Both files also have a .sha256 next to them on the release page, in the format <SHA256> <filename>; to check a
download yourself:

Get-FileHash .\cute-fat-fish-pet-1.1.1-setup.exe -Algorithm SHA256

The aliases cute-fat-fish-pet-setup.exe / cute-fat-fish-pet-setup.exe.sha256 point at the same bytes and never
change name, so https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe
always downloads the newest installer.

What changed in 1.1.1

  • The portable 安装.cmd no longer vanishes (KI-1). The old wrapper (285 B) only paused when PowerShell returned a
    non-zero exit code — but Windows PowerShell prints The argument '…' to the -File parameter does not exist to stderr
    and exits 0 when the script is missing, which is exactly what happens if you double-click 安装.cmd inside the
    zip preview window
    (Windows runs it from a temporary copy where the rest of the package is not there). The window
    closed instantly and said nothing. The new 安装.cmd (3,941 B) checks for install.ps1, electron\electron.exe and
    app\package.json first, prints a Chinese explanation through powershell -EncodedCommand (so no code page can
    mangle it), and always pauses.
  • The portable install carries the real product name and version (KI-2). install.ps1 (9,284 B → 11,085 B) used to
    write the old name 「蓝毛小女仆」 and version 1.0.0 into the shortcut and the "Apps & features" entry. It now uses
    「可爱大肥鱼桌宠」 (the same string as the installer), reads the version from the packaged app\package.json, and
    shares the publisher string with the installer. If an old 蓝毛小女仆 shortcut still points at the directory being
    installed, it is renamed to .lnk.bak-<timestamp> instead of leaving two icons on the desktop.
  • Chinese text in a .cmd no longer breaks parsing (KI-3). The old .cmd was UTF-8 with Chinese comments and ran
    chcp 65001; cmd.exe parses batch files byte by byte, so lines after the code-page switch were mis-read
    ('onPolicy' is not recognized as an internal or external command was really half of -ExecutionPolicy). Both
    .cmd files are now pure ASCII, without BOM, with LF endings; Chinese messages come from PowerShell.
  • Uninstalling really uninstalls (KI-5, found while testing this release). The uninstaller used to run from inside
    the directory it was deleting — cmd.exe's working directory was the install folder and it was reading 卸载.cmd
    itself — so Remove-Item -Recurse -Force -ErrorAction SilentlyContinue failed as a whole, silently, and all 714 files
    stayed on disk. 卸载.cmd (1,086 B → 1,298 B) now parks its working directory in %TEMP%; uninstall.ps1
    (5,221 B → 8,191 B) deletes everything except the .cmd file that is still open, and a detached hidden helper
    finishes the job a moment after the window closes.
  • Version 1.1.1 in the four package.json files and in build\installer.nsi; the README.md shipped inside the
    package no longer names a version, so future releases do not have to touch a packaged file.

How to install the portable zip

  1. Right-click the zip → Extract All… and unpack it anywhere (about 761 MB unpacked).
    Do not double-click 安装.cmd inside the zip preview window — Windows would run it from a temporary folder where
    the rest of the package is missing (that is the case the new wrapper now explains politely).
  2. In the extracted folder, double-click 安装.cmd. It needs no administrator rights, copies the tree next to
    itself, creates the desktop and Start-menu shortcut and registers the uninstall entry, so the pet appears in
    Settings → Apps as 「可爱大肥鱼桌宠 1.1.1」.
  3. To remove it, run 卸载.cmd in the same folder (or Settings → Apps → 可爱大肥鱼桌宠 → Uninstall). Your pet's
    data in %APPDATA%\BlueHairMaid is kept.
  4. If you only want to try her without touching the registry at all, run standalone\start-pet.vbs instead — no
    shortcuts, no uninstall entry.

Verification

This release was accepted on a real Windows 10 machine, on the artifacts that are published here:

  • unpacked the zip → ran 安装.cmd (finished in 10.2 s, printed the Chinese progress messages and [ok] Setup finished.)
    → build\verify-install.py compared the installed tree against the staged tree: 710 of 710 files byte-identical
    (797,834,384 B);
  • the registry entry it created reads DisplayName=可爱大肥鱼桌宠, DisplayVersion=1.1.1,
    UninstallString="<install dir>\卸载.cmd";
  • ran that uninstaller: shortcuts and uninstall entry removed, %APPDATA%\BlueHairMaid untouched, and the install
    directory was gone two seconds after the window closed;
  • gates: build\check-release.mjs (staged tree identical to the repository byte for byte), build\check-paths.mjs
    (no local paths or private directories), build\nsi-syntax-check.py, build\mkzip.py, build\mkexe.py, and the
    verify.mjs that ships inside the package.

You can repeat all of it yourself — docs\development-log.md (step 11) lists the exact commands, and every defect has a
reproduction recipe in docs\known-issues.md.

Known limitations

  • The binaries are not code-signed, so Windows SmartScreen will say "Windows protected your PC" the first time; click
    More info → Run anyway. See code-signing.zh-CN.md.
  • No autostart and no auto-update. To start her with Windows, put a shortcut in shell:startup. A "check for
    updates" button inside the console is planned for 1.2.0; update checks that download and run an installer silently
    would need code signing first.
  • File names and in-package text are still Chinese (English is the repository's front page; the product itself speaks
    Chinese).
  • src\lib\ and the assembled app\ tree are build output, not handwritten source — the handwritten source sits next to
    them (src\host\, runtime\electron-helper\, launcher\, standalone\).
  • GitHub shows the licence as NOASSERTION because LICENSE contains two copyright blocks (upstream + this project).

Updating to a newer version

  1. Download the newest cute-fat-fish-pet-setup.exe (permanent link:
    https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe).
  2. Run it — the wizard recognises the existing installation and upgrades it in place (one 761 MB copy, not two).
  3. Portable-zip users: unpack the new zip over (or next to) the old folder and run 安装.cmd again; it reuses the
    directory you already have.
  4. Your pet's data, character settings and API keys stay in %APPDATA%\BlueHairMaid and are never overwritten by an
    install or removed by an uninstall.

License and attribution

MIT. The early architecture comes from PC2005-cloud/dsh-pet 0.3.0 (MIT,
attribution kept in NOTICE.md, LICENSE, assets\LICENSE.txt and assets\第三方声明.txt); of the 243
files that upstream 0.3.0 ships, 232 are still byte-identical, 11 were deliberately modified (each one listed with
sizes and reasons in differences-from-upstream.md), none were deleted, and two engine
files (runtime\electron-helper\obs-ctl.js, runtime\electron-helper\stt-worker.mjs) are new here.


中文说明

绿色包修复版:解压完双击 安装.cmd,这次真的能装上了。 2026-10-08 · Windows x64 · MIT

这是什么

1.1.0 是第一次公开发布;1.1.1 是一次小而集中的修复版,只针对绿色 zip 包:
有三个缺陷会让「解压 → 双击 安装.cmd」失败、什么都不提示,或者装出来的副本自称 1.0.0;而在验证修复的过程中
又发现了第四个 —— 卸载之后整个安装目录都还在。四个问题都已修好、在真实 Windows 上验收过,并且写进了
known-issues.md(现象 → 复现 → 根因 → 修法,各自都带证据)。

setup.exe 安装程序从来没受前三个问题影响(它不走这几个脚本),这次重打只是因为版本号要一致,行为与 1.1.0 完全相同。

下载

文件 大小 SHA-256
cute-fat-fish-pet-1.1.1-setup.exe 347882493 B(331.8 MB) 9A0DBB160E92C9192E1F7BB7D37D620B45F0F77DCE462A9ACC1AEB3908FC2022
cute-fat-fish-pet-1.1.1-win-x64.zip 416992984 B(397.7 MB) 18A22ED88D221F71BA3872D3CA9A854B09BEF8C07B3EEBE6E71F8C0544C4C4DC

两个文件在 Release 页上各有一个 .sha256(格式 <SHA256> <文件名>),想自己核对:

Get-FileHash .\cute-fat-fish-pet-1.1.1-setup...
Read more

Cute Fat Fish Pet 1.1.0 - first public release

Choose a tag to compare

@12we21 12we21 released this 08 Oct 04:34

Release notes — Cute Fat Fish Pet 1.1.0

First public release. 2026-10-08 · Windows x64 · MIT

中文说明见下方


What this is

Cute Fat Fish Pet is a desktop pet for Windows: a transparent little maid who lives on your desktop, chats with you (local Ollama or any OpenAI-compatible model), can look at your screen and comment on it, and — when you allow it — can open apps, files, folders and web pages for you or start a screen recording.

This is the first public release of the project, and the first one published from its own source repository.

Downloads

File Size SHA-256
cute-fat-fish-pet-1.1.0-setup.exe 347902120 B (331.8 MB) 6C87705E890D020E95D23040A65F1DA6EB6224DDF4FB156AA1816D295F12C882
cute-fat-fish-pet-1.1.0-win-x64.zip 416989171 B (397.7 MB) 7915809C79C9AE7F58FE7DB766BC68C399F8224CB9F024F05AE3CDE45D5075A9

Each asset ships with a .sha256 file in the format <SHA256> <filename>:

Get-FileHash .\cute-fat-fish-pet-1.1.0-setup.exe -Algorithm SHA256
  • Installer: double-click, no administrator rights needed, installs to %LOCALAPPDATA%\BlueHairMaid (the location can be changed on the "Choose install location" page). Upgrades detect an existing installation and reuse its directory instead of installing a second 761 MB copy.
  • Portable zip: unpack anywhere (~761 MB unpacked), then either double-click 安装.cmd (creates shortcuts + uninstall entry) or run standalone\start-pet.vbs (writes nothing to the registry).
  • Both packages are self-contained and offline-ready: Electron runtime, the speech engine and the SenseVoice int8 model, and the real node.exe used for speech recognition are all inside.

Requirements: Windows 10/11 x64, about 761 MB of disk space. A GPU is optional: on first start she reads your VRAM, looks for models already present in Ollama and configures herself accordingly. Without any model she still idles and moves, she just does not talk.

Start / stop: the desktop shortcut opens the console; press 启动桌宠 to bring her up. The console deliberately does not start her automatically. Autostart and auto-update are not implemented yet.

What is in this release

The project is now a standalone source repository

  • The repository contains the actual shipped source in src/ — there is no "upstream blueprint + patch scripts" step any more. overlay/ and the patch tooling are gone; a fresh clone builds the released layout directly.
  • The build chain was rewritten for that: build/build.mjs lays the repository out into stage/ (app, launcher, standalone, defaults, assets, verify, electron, node, speech), and build/toolchain.mjs locates the three external runtime pieces (Electron 43.3.0, node v24.21.0, sherpa-onnx + SenseVoice) either from a previously installed copy or from explicit flags.
  • build/check-release.mjs proves that stage/ matches the repository byte for byte, and verify.mjs self-checks the installed package (tree fingerprints plus a list of files that must never be shipped).

Local control bridge hardened

The console talks to the pet over a loopback HTTP bridge. Both ends were tightened:

  • The desktop-side control server now requires a token — Authorization: Bearer <token> or X-Pet-Token — generated per installation into helper-control.json with mode 0600, compared in constant time. Write requests without it are rejected with 401 and nothing is written to the page.
  • Access-Control-Allow-Origin: * is gone. Origins are checked against an allow-list (127.0.0.1, localhost, ::1 over http/https, plus requests with no Origin); unknown origins get 403 and no CORS headers. Responses echo the requesting origin and carry Vary: Origin.
  • OPTIONS is answered as a preflight only; /health stays unauthenticated but only reports ok + a window count. Key names containing __proto__ are rejected.
  • If the token file cannot be written, the bridge fails closed: every write request is refused.
  • The standalone runner's HTTP server got the same treatment: origin allow-list, and /shutdown now requires POST + token instead of accepting a bare GET (which any web page could previously trigger with a single <img> tag).

Because both ends changed together, the console and the pet must both be from 1.1.0 — after upgrading, if the console reports "the control bridge wants a key", restart the pet once so it writes its token.

Privacy: no local paths in the package

  • Hard-coded absolute paths to the author's machine were removed from the runtime. The speech worker now derives node.exe from the installation layout (electron/electron.exe and node/bin/node.exe are siblings), and remaining references use %USERPROFILE%-style placeholders.
  • A build-time gate, build/check-paths.mjs (npm run paths), scans the repository and the staged package for local absolute paths and private directories; build/build.mjs runs it before laying out stage/.
  • The test suite no longer contains a real user name; synthetic paths use a placeholder.

Documentation

Compatibility

Upgrading keeps everything: the internal identifiers (BlueHairMaid app folder, dsh-pet plugin package, dsh-pet-electron-helper renderer, dsh-pet-* storage keys, /dsh-pet-7340 route prefix and the %APPDATA%\BlueHairMaid data root) are deliberately unchanged, so your persona, memory, chat history, position and settings are picked up as they are. Uninstalling still does not delete your data.

Known limitations

  • The binaries are not code-signed. Windows SmartScreen may warn on first run ("More info" → "Run anyway"). What signing would involve is described in docs/code-signing.zh-CN.md (Chinese).
  • No autostart, no auto-update, no installer-less update path yet.
  • Files and text inside the package are still Chinese (安装.cmd, 卸载.cmd, assets\使用说明.txt, …). Renaming them changes the package layout, so it is planned for a later release rather than mixed into this one.
  • src/lib/ is the compiled output of the TypeScript sources in src/src/; editing the TypeScript requires rebuilding lib/ with the upstream toolchain.
  • GitHub reports the license as NOASSERTION: LICENSE is MIT but carries two copyright lines (upstream author + this project), which the license detector does not recognize as a standard MIT file.

Updating to a newer version

There is no automatic updater yet — updating means downloading the new installer and running it over the old copy. Only program files are replaced.

  1. Close the pet first (right-click her tray icon → exit, or double-click standalone\stop-pet.vbs). The installer will not replace files while she is running.
  2. Download the newest installer. This link always points at the latest one:
    https://github.com/12we21/cute-fat-fish-pet/releases/latest/download/cute-fat-fish-pet-setup.exe
  3. Run it and click Next: it detects the folder of the previous installation and installs back into it, so you do not end up with a second copy. Desktop and Start-menu shortcuts are recreated.
  4. Start her again from the console.

Persona, memory, chat history, settings and model configuration live in %APPDATA%\BlueHairMaid, which the installer never touches. Portable-zip users unpack the new zip over the old folder.

License and attribution

MIT — see LICENSE. The upstream MIT text ships unmodified as assets/LICENSE.txt, with the original author's attribution intact; third-party components are listed in assets/第三方声明.txt and NOTICE.md.

The pet engine started from dsh-pet 0.3.0 by PC2005-cloud: of the 243 files in the published upstream package, 232 are byte-identical here and 11 were modified on purpose (each one listed in differences-from-upstream.md); no upstream file was dropped. Everything else in this repository is this project's own work.


中文说明

这是什么

可爱大肥鱼桌宠(她叫「蓝毛小女仆」)是一只住在 Windows 桌面上的透明小桌宠:陪你聊天(本机 Ollama 或任何 OpenAI 兼容接口)、能看一眼你的屏幕说两句;你允许的话,她还能替你打开软件 / 文件 / 文件夹 / 网页,或者起一段录屏。

这是本项目的首次公开发布,也是第一次从它自己的源码仓库发布。

下载

文件 大小 SHA-256
cute-fat-fish-pet-1.1.0-setup.exe 347902120 B(331.8 MB) 6C87705E890D020E95D23040A65F1DA6EB6224DDF4FB156AA1816D295F12C882
cute-fat-fish-pet-1.1.0-win-x64.zip 416989171 B(397.7 MB) 7915809C79C9AE7F58FE7DB766BC68C399F8224CB9F024F05AE3CDE45D5075A9

每个成品旁边都有同名 .sha256(格式 <SHA256> <文件名>):

Get-FileHash .\cute-fat-fish-pet-1.1.0-setup.exe -Algorithm SHA256
  • 安装程序:双击即可,不需要管理员权限,默认装到 %LOCALAPPDATA%\BlueHairMaid(在「选择安装位置」那一步可以改)。升级时会认出已经装过的那一份,直接装回原目录,不会再装一份 761 MB 的副本。
  • 绿色 zip:解压到任意目录(解压后约 761 MB),然后二选一:双击 安装.cmd(建快捷方式 + 写卸载登记),或直接运行 standalone\start-pet.vbs(不写注册表)。
  • 两个包都是自带运行时、离线可用的:Electron、语音引擎与 SenseVoice int8 模型、语音识别要用的真 node.exe 都在包里。

电脑要求:Windows 10/11 x64,约 761 MB 磁盘空间。显卡可选:第一次启动她会读显存、找本机 Ollama 里已有的模型,自己适配;一个模型都没有也能跑,只是不开口。

开与关:桌面快捷方式打开的是控制台,在里面点「启动桌宠」她才出来;控制台不会自动拉起她。开机自启和自动更新目前没做。

这一版做了什么

变成一个自洽的独立源码仓库

  • 仓库里 src/ 就是成品源码...
Read more