这个座位有人坐吗
比较简单,打发时间的小品游戏。很适合后台挂个AI干活的时候玩。
比较简单,打发时间的小品游戏。很适合后台挂个AI干活的时候玩。
修复特定模型在 DeepSeek Harness(DSH)里「流式内容正常但回合必报错」的流式收尾缺陷。
本仓库是 bitterSmilezzz/dsh-model-fix 的增强版:
在原版(muse-spark-1.2)基础上,加入了对gpt-5.6-luna的支持(同一缺陷,实测
2026-08-23:gpt-5.6-luna流式/非流式响应的finish_reason均为null,且流式不发[DONE])。
opencode 聚合端点(https://opencode.ai/zen/go/v1)上的 muse-spark-1.2 与
gpt-5.6-luna 实现有缺陷:流式响应正常吐出内容,但从不发送 finish_reason、也不发送[DONE],流直接关闭(同端点对照 deepseek-v4-flash / glm-5.2 均正常发送finish_reason: 'stop' + [DONE])。
DSH 的 llm-pi-ai 走 pi-ai SDK(强制 stream: true 且要求流以 finish_reason 收尾),
于是每次对话的真实表现是:
Stream ended without finish_reason(映射为 TRANSPORT 错误);TRANSPORT 在默认可重试列表里 → agent 级重试插件按maxRetries 反复重跑整步,烧多份 token。这与代理无关:直连与走代理的响应完全相同,换代理解决不了。
使用 muse-spark-1.2 / gpt-5.6-luna(经 opencode-go 路由)不需要在 opencode 平台设置里
开启**「Allow models that train on request data」**。
https://opencode.ai/zen/go/v1 即可正常开关位置见下图(opencode 设置页 → 提供商区域,与「启用部署在中国的模型」相邻):

在 llm/stream waterfall 上,对匹配的模型把上述缺陷收尾为正常 stop:
text-delta / reasoning-delta / tool-call-delta)且TRANSPORT / STREAM_CLOSED 且错误信息明确是「缺少终止事件」Stream ended without finish_reason)时才改写;SocketError: other side closed)不受影响,照常失败;修复后 muse-spark-1.2 / gpt-5.6-luna 直连即可正常使用,无需代理、不触发重试。
1 | # 从 GitHub 安装(推荐) |
安装后重启目标 profile(如 dsh web)生效。
cordis.patch.yml 中 config 两个字段:
| 字段 | 默认 | 说明 |
|---|---|---|
modelPattern |
^(muse-spark|gpt-5\.6-luna) |
对模型 id 测试的正则;只修复匹配的模型 |
providers |
[] |
provider 路由键白名单(如 opencode-go3);空 = 所有 provider 中匹配的模型 |
1 | - id: model-fix |
只修 luna 可改为 modelPattern: '^gpt-5\.6-luna';只想限定某个路由可加providers: [ 'opencode-go' ]。
1 | pnpm install |
tests/fix.test.mjs 覆盖缺陷识别、内容保留、空响应放行、真实故障放行等 10 例。error(Stream ended without finish_reason) 变为 {"kind":"stop"}。opencode.ai/zen/go/v1 复现——流式 10 个 chunkfinish_reason 全程 null、无 [DONE],尾部为 data: {"choices":[],"cost":"0"};finish_reason 同样为 null。DeepSeek Harness (DSH) 插件管理器:在 WebUI 设置 → 插件 → 插件管理 里可视化查看、临时打开、关闭其他插件。
settings.plugins.tab 槽位注册的一个标签页,与自带「可配置」标签并列)。profile/package.json 里安装的社区插件 + 你自己在 cordis.patch.yml 里加的条目(如 MCP 桥梁)。entry.update({ disabled })(与官方 dsh-market 主题开关同一条路)。默认在切换后自动刷新网页,让带前端界面的插件(桌宠、侧边栏等)也立即完全生效;也可在面板里切到手动刷新模式(选择保存在浏览器 localStorage)。<profile>/.plugin-manager/state.json,下次启动时自动回放为关闭,直到你把它打开。1 | dsh-plugin-manager/ |
package.json 的 dsh.profile.bundles 增删(那需要重启才生效),而是对运行中的 loader entry 做热开关——这是 dsh-market 主题切换验证过的做法。internal/plugin 事件)同样移植自 dsh-market。openviking-memory)无法直接置 disabled,管理器会自动改为开关其子条目。| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /plugin-manager/list |
返回插件列表与开关状态 |
| POST | /plugin-manager/toggle |
{ id, enabled } 热开关某个插件 |
| POST | /plugin-manager/reset |
恢复所有被保持关闭的插件 |
POST 接口(toggle/reset)做了 Origin === Host 的同源校验;GET 列表是只读、且只暴露在回环地址绑定的 web server 上,不再要求 Origin 头(同源 GET fetch 默认不携带 Origin,要求它会导致面板报 untrusted origin)。
plugin-manager)不会被关闭;系统组件不会提供开关。MIT
原因:酒馆发送的请求主体中不能有stop主体参数。
解决办法:点击API设置界面的附加参数按钮,在排除主体参数栏内填写stop,以不发送此主体参数。
Automatic Gemini API key rotation for modlens on DeepSeek Harness (dsh) — when one key hits its quota (HTTP 429), the read
automatically switches to the next key in the pool and retries, with zero
intervention. Works everywhere modlens reads an image: the dsh GUI paste flow,
the modlens_read_image tool, and the CLI.
⚠️ Unofficial: this patches the installed modlens package. The patch is
wiped by any modlens upgrade;patch.ps1re-applies it in one command.
If modlens upstream ever ships native multi-key support, drop this project.
modlens reads images through a single Gemini API key stored in ~/.modlens/config.json. Free-tier keys hit daily quota (429 RESOURCE_EXHAUSTED) / rate limits quickly, and modlens has no retry or
failover for that. This project adds:
~/.modlens/api-keys.json) — list, add, rotate, inspectnpx -y @deepseek-ai/dsh plugin --profile web add @liustack/modlens@<version>.ps1Clone this repo (or copy scripts/), then:
1 | # 1. copy scripts next to the modlens config |
The active key is the one modlens uses: if you already configured a key via modlens config set gemini-api.apiKey, add it to the pool too so rotation can
cycle back to it.
1 | # manage the pool |
The engine patch makes rotation automatic for every read path (GUI paste, modlens_read_image tool, CLI), so rotate.ps1 rotate is mainly for manual
override or diagnosis.
modlens itself supports it — no changes needed here:
1 | modlens config set proxy http://127.0.0.1:<port> |
Note: Google’s Gemini API is region-restricted. A proxy exit in an unsupported
region (e.g. mainland China, Thailand) fails with 400 User location is not supported for all keys — rotation cannot fix
that; switch the proxy node instead.
1 | powershell -ExecutionPolicy Bypass -File "$env:USERPROFILE\.modlens\patch.ps1" |
It detects whether the patch is still present; if a new version changed the
targeted code and the hunks no longer match, it reports which hunk failed and
tells you to file a new patch.
modlens ships two components in one package:
dsh/index.js — the dsh plugin shell: registers modlens_read_image,dist/main.js — the CLI engine: reads the image, calls GeminiexecuteGeminiApi), parses structured JSON. Every read path funnelsThe patch lives in executeGeminiApi: a single request becomes a loop that
rotates the pool on 429. See PATCH.md for the exact change.
~/.modlens/api-keys.json (same trustconfig.json, which also stores the key in plain$env:USERPROFILE.LICENSE.modlens.LICENSE).ACKNOWLEDGMENTS.md — please star修复 OpenViking 在 Windows + 本地向量库 + 本地 embedding 模型 组合下,记忆文件已生成但搜索不到的问题。
1 | ov find "LoopingIsle" --context-type memory |
返回:
1 | { |
服务日志出现:
1 | openviking.storage.viking_vector_index_backend - ERROR - Error reading existing record before partial update: Strings must be encoded before hashing |
OpenViking 在把字符串 ID 转成 64 位整数时,使用了:
1 | xxhash.xxh64(input_string) |
但 xxhash 在 Python 3 中要求传入 bytes,不能直接传入 str,因此抛出:
1 | Strings must be encoded before hashing |
这导致:
修改文件:
1 | openviking/storage/vectordb/utils/str_to_uint64.py |
修改前:
1 | def str_to_uint64(input_string: str) -> int: |
修改后:
1 | def str_to_uint64(input_string: str) -> int: |
| 文件 | 说明 |
|---|---|
patches/0001-fix-str_to_uint64-xxhash-encoding.patch |
Git 补丁,可直接 git apply |
patches/patch-openviking-xxhash.ps1 |
Windows PowerShell 一键打补丁脚本 |
patches/fix-openviking-memory.ps1 |
重置向量库并重新索引记忆的修复脚本 |
1 | git apply patches/0001-fix-str_to_uint64-xxhash-encoding.patch |
1 | powershell -ExecutionPolicy Bypass -File patches\patch-openviking-xxhash.ps1 |
1 | ov reindex viking://user/default/memories --mode semantic_and_vectors --wait true |
| 项目 | 值 |
|---|---|
| 操作系统 | Windows |
| Python | 3.14.7 |
| OpenViking | 0.4.14 |
| 向量库 | local 本地向量库 |
| Embedding | 本地 GGUF 模型(512 维) |
| VLM | OpenCode Go(deepseek-v4-flash) |
这个 bug 主要在以下组合下出现:
大多数用户使用的是:
所以这条本地路径测试覆盖较少。
如果只是移动了 OpenViking 目录导致向量库元数据路径不匹配,可以在配置中加:
1 | { |
前提是模型没有换、维度没有变。
有始有终,值得好评。
虽然后面有点赶,但感觉把想呈现的效果都呈现了。
就像看了一段也许真的存在的冒险。人物的变化和成长也悄然地推进,不突兀挺好。
原本是单人游戏,但我是跟朋友一起用合作模式通的关。
对于多人体验而言,如果不是多人游戏荒了,不建议把这游戏作为首选项。
各种解密和动作体验中规中矩,在2026年下,没有啥新鲜内容。
各种互动还算不错,动作有些僵硬。
剧情方面中等偏上水准。
值得一提的是,在剧情的最后,当主角处在一个特殊状态下时,一开始无法正确地前往目的地,当我以为附近有什么谜题时,突然脑子里意识到了一个新的可能性,当我把这个可能性告诉我朋友,并真的成功时,当时带给我的尤里卡时刻,还是非常震撼的,并且这个设计也十分符合剧情和玩法,让游戏的机制玩法解释了剧情,让剧情和体验更上了一层楼。甚至我有点怀疑,作者是因为这个时刻,才做了这么一款游戏。
在开始之前,请确保你具备以下条件:
一台 Linux 服务器:本文以 Ubuntu为例。
一个公网 IP:确保你的服务器拥有独立的公网 IP,或已做好端口映射。
开放防火墙端口:确保服务器防火墙和云服务商的安全组放行以下端口:
| 端口 | 协议 | 用途 |
|---|---|---|
| 9987 | UDP | 语音通信 (最核心) |
| 30033 | TCP | 文件传输 (头像/图标) |
| 10011 | TCP | 服务器远程管理 (ServerQuery) |
| 41144 | TCP | 新版客户端查询端口 |
许可证说明:TeamSpeak 3 对非商业用途免费,内置 1个虚拟服务器 和 32个在线用户 的限制,对绝大多数私人团队来说完全够用。
为了安全,我们强烈建议不要使用 root 账号运行 TS3 服务。
sudo apt update && sudo apt upgrade -y
sudo adduser teamspeak
su - teamspeak
进入用户目录,并从官网下载最新版服务端(请以官网最新版本号为准):
cd /home/teamspeak
tar -xjvf teamspeak3-server_linux_amd64-*.tar.bz2
进入解压后的目录,接受许可协议并启动:
cd teamspeak3-server_linux_amd64
touch .ts3server_license_accepted
./ts3server_startscript.sh start
首次启动时,终端日志中会显示两行极其重要的信息:
ServerAdmin privilege key created, please use it to gain serveradmin rights for your virtualserver.
token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
请立即复制并保存这个 token(令牌)。如果你关闭了终端,将无法找回,只能清空数据重新初始化。
为了确保服务器在重启后自动运行,我们可以将其注册为系统服务。
root 权限):sudo nano /etc/systemd/system/teamspeak3.service
/path/to 替换为你的实际绝对路径):[Unit]
Description=TeamSpeak 3 Server
After=network.target
[Service]
User=teamspeak
Group=teamspeak
WorkingDirectory=/home/teamspeak/teamspeak3-server_linux_amd64
ExecStart=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server
ExecStop=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh stop
ExecReload=/home/teamspeak/teamspeak3-server_linux_amd64/ts3server_startscript.sh restart
Restart=always
RestartSec=15
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable teamspeak3
sudo systemctl start teamspeak3
下载客户端:从 TeamSpeak 官网 下载适用于你系统的客户端。
连接服务器:打开客户端,点击 Connections -> Connect,输入你的 服务器 IP 地址(端口默认 9987,可不填)。
获取管理员权限:首次进入频道时,客户端会弹出窗口要求输入 Token。粘贴你在第三步保存的令牌,即可获得管理员权限。
| 问题现象 | 可能原因与解决方案 |
|---|---|
| 客户端连接不上 | 1. 检查 UDP 9987 端口是否放行,这是最常见的坑。 2. 检查云服务商安全组策略。 |
| 听不到声音/语音卡顿 | 检查服务器带宽是否跑满,或客户端 Codec 设置是否过高。 |
| 丢失了管理员 Token | 停止服务端,删除 /home/teamspeak/teamspeak3-server_linux_amd64 下的 query_ip_whitelist.txt 和 query_ip_blacklist.txt,重启后控制台会生成新 Token。 |
有了 TeamSpeak 服务器之后,不妨再给它配上一个“点歌台”。teamspeak-music-bot 是一个功能强大的开源音乐机器人,链接,支持从网易云音乐、QQ音乐、酷狗音乐、哔哩哔哩等多个平台搜索并播放音乐。它最大的亮点在于提供了一个 YesPlayMusic 风格的 WebUI 控制面板,让你可以通过浏览器轻松管理播放,体验非常接近专业的音乐播放器。
如果你受够了运营商的 DNS 劫持,想在手机、电脑上全局去广告,又希望保护上网隐私,这篇文章就是为你准备的。
我花了几天时间,从一台云服务器开始,一步步搭建了自己的加密 DNS 服务。整个过程踩了不少坑:证书申请、端口配置、iOS 描述文件、安卓 DoT 连接失败……最终所有设备都成功跑了起来。
这篇文章就是完整的操作记录,希望能帮你少走弯路。
1 | 互联网 |
在 DNS 服务商控制台添加 A 记录:
| 记录类型 | 主机记录 | 记录值 |
|---|---|---|
| A | @ | 你的服务器公网 IP |
| A | www | 你的服务器公网 IP |
1 | curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v |
安装完成后,访问 http://你的服务器IP:3000 进行初始化设置。
按照网页指引完成设置,记住你设置的管理员账号密码。
AdGuard Home 启用 DoH/DoT 加密必须使用 SSL/TLS 证书。我使用 Let’s Encrypt 的免费证书。
先通过手动 DNS 验证方式申请:
1 | sudo certbot certonly --manual --preferred-challenges=dns -d 域名 |
系统会提示你添加 TXT 记录:
1 | _acme-challenge.域名 TXT "这里是一串验证值" |
添加完成后等待生效,按回车继续。证书申请成功,一共有两份。
⚠️ 注意:--manual 方式不会自动续期!我们后面会改成自动方式。
将输出的内容(从 -----BEGIN CERTIFICATE----- 到 -----END CERTIFICATE-----)复制下来。
登录 AdGuard Home 管理面板 → 设置 → 加密
| 配置项 | 填写内容 |
|---|---|
| 启用加密 | ✅ 勾选 |
| 服务器名称 | 域名 |
| 证书 | 粘贴 fullchain.pem 的全部内容 |
| 私钥 | 粘贴 privkey.pem 的全部内容 |
| HTTPS 端口 | 443(DoH 端口) |
| DNS-over-TLS 端口 | 853(DoT 端口) |
💡 进阶做法:填完内容后,可以改为填写文件路径,方便自动续期时自动加载。
服务器防火墙(如 ufw):
1 | sudo ufw allow 443/tcp |
云服务商安全组:在控制台添加入站规则,允许 TCP 443 和 853 端口。
推荐方式:使用在线工具生成描述文件
https://域名/dns-query.mobileconfig 文件安装路径:设置 → 通用 → VPN 与设备管理 → 已下载的描述文件
安卓系统内置的“私人 DNS”仅支持 DoT(853 端口),但国内网络环境可能干扰 853 端口。推荐使用 DoH。
使用 Intra 应用(Google 官方开源):
方法一:系统网络设置(推荐)