分类: 软件分享

Obsidian全面切换到Inkstone

最近发现的一个很不错的笔记工具:Inkstone

直接把笔记托管在 Cloudflare 上,自动备份,升级也很方便。

inkstone_screenshot

根据介绍,fork 一份仓库即可使用,中途出错的话一般是没有打开 Cloudflare 某些权限,构建时会有提示。

升级就是去自己 fork 的仓库,点一下同步,Cloudflare 这边就会自动重新构建。

除了没法从 Obsidian 导入导出外,我觉得已经很完善了。

对我来说倒也不是什么问题,我以前爱收集一些脚本片段,到了 AI 时代直接重写就行了,根本就没有备份的必要了。
笔记太多的话,导入导出其实也可以让 AI 来处理……


还发现一个类似的项目:EdgeEver

EdgeEver 覆盖更全一点,不过 Inkstone 支持不绑定信用卡(选 KV 模式)

Muse Code 接入任意模型

最近 Meta 发布一个编码工具,考虑到如今 Harness 如日中天,突然觉得此前 Meta 意欲收购 Manus 也没那么离谱了。尽管工具本身关注度不高,不过因其号称在健壮性方面很强(可能参考过 Manus 的思路),所以打算看看。

Muse Code 不支持第三方模型,但提供了20美金试用,愿意分享数据的话,可以用很久。
程序本身也没什么设防,即使没文档,接入第三方也不算艰难。
研究过程比较零碎,直接抛结论,具体实现在文末的 PoC。

首先,muse 启动参数有几个重要项:

  • META_API_KEY 作为环境变量输入时,比浏览器授权优先级更高。不经 TUI 设置可以跳过 KEY 验证,直接进入界面;
  • --base-url 可以设置 Meta API ,可能是用作镜像,也可以 mock 一个私服作为中转;
  • --model--provider 是设置默认模型,与 base-url 返回的结果对应。

对应的启动方式形如:META_API_KEY="dummy-key" muse --provider meta --base-url http://127.0.0.1:9911 --model glm-5.2 --yolo

base-url是本地搭建的中间层,用来提供模型目录和转发对话。

具体而言,muse 会从 {base-url}/muse-code/models 获取模型列表,官方模型只有 spark 系列,我们可以返回自定义结果。示例:

{
  "schema_version": 1,
  "data": [
    {
      "provider_id": "meta",
      "profile_id": "default",
      "id": "glm-5.2",
      "model_id": "glm-5.2",
      "display_label": "Z.AI/GLM-5.2",
      "visibility": "visible",
      "release_date": "2025-01-01",
      "display_order": 1,
      "is_current": true,
      "is_default": true,
      "context_limit": 65536,
      "output_limit": 8192,
      "description": "Third-Party Model via muse proxy"
    }
  ]
}

具体的对话走 OpenAI Responses 格式接口({base-url}/v1/responses)。

上下文窗口控制和压缩:

  • 默认达到 80% 触发摘要压缩,90% 进行强制硬压缩;
  • settings.json 、CLI 和远程模型信息均可控制窗口,本地设置优先于远程;
  • 可以额外控制是否清除工具输出,默认是清除。

之前的示例已经展示远程模型列表如何传入窗口,以下是 settings.json 示例,优先级更高:

{
  "schema_version": 1,
  "run": {
    "reminder_roster": {
      "interval_steps": 999999,
      "skip_if_running": true,
      "max_in_flight_per_agent": 1
    },
    "context_compaction": {
      "soft_threshold": 0.8,
      "hard_threshold": 0.9,
      "provider_context_limit_tokens": 32768,
      "tool_result_clearing_enabled": true
    }
  }
}

btw:对应的 CLI 参数(一般无需使用)是 --context-compaction-soft-threshold / --context-compaction-strategy / --max-tool-output-bytes

可以看到,在配置文件中还有一个reminder_roster
在实际调度中,每次回应后会有几秒的延迟,显示 Finishing up,期间程序会发起多次额外对话:

  • scope reminder(与对话调用并发)
  • approval judge
  • goal reminder
  • verification watcher
    简单来说,就是 muse 在发起额外检查,确保操作没有越界、真的完成任务。它还引入了一个二号观察员,用来监督检查是否真的起效(可以说是有迫害妄想症)。

如果想要关闭或者调整,可以配置reminder_roster,按需设定:

  • interval_steps :执行多少步开始检查,默认可能是1,大数等同于跳过;
  • skip_if_running:如果已有 reminder 在运行,跳过本次调度;
  • max_in_flight_per_agent:每个agent 最多几个并发 reminder。

至此,我们已经有了大致信息,可以完成一个简单的中间层,通过 CC-Switch、New API 等工具,我们也可以接入 /chat/completions 端点。

具体的中间层可以查看这份:PoC

简单的免费SSL证书生成网站

由于需要 HTTPS,稍微找了一下手动生成方案,目前最方便似乎是PunchSalad。每次生成 Let's Encrypt 可以提供90天的免费证书。

据我了解,AMH、SSL For Free 也有申请证书的服务,不过还要注册,不如 PunchSalad 方便。

之所以需要手动生成,是因为之前在「支付宝-小程序云」上托管了几个静态页面:前情提要。这个「小程序云」自然是无法自动续期证书的,只能手动。顺带一提,这个空间不支持通配符证书……

背景

之前,我想用自己的域名做短链,从而避免烂大街的域名被微信、QQ 限制。试用了国内的服务,凡是免费层级都不让用 HTTPS,而且必在跳转时随机插广告(借口被运营商劫持,其实根本就是服务商自己搞鬼)。

后来退而求其次,找到了替代品:搜狐快码。直接购买的门槛比较高,通过好单库生成,可以用多少充多少,性价比比较高。一些国内企业建立的 Yourls 服务也挺好用,因为过于小众,又有备案,不容易被限制。

至于静态托管的问题,似乎今年阿里云的免费 ESA 也上线了,也许托管到 Github Pages 再套个 CDN 更省事,有空再试试看。

玩点老资历赛车游戏

最近突然想玩点赛车游戏,稍微看了一下,好家伙一个个都动辄几十G,瞬间就不想玩了。

突然想起来当年有个单机版的跑跑卡丁车,没想到现在已经进化到可以玩最新地图了,还可以AI填充。

启动器:yanygm@github/Launcher_V2
客户端:brownsugar@github/popkart-client-archive

3个G还是可以的,还是个绿色版~

开得一塌糊涂,只能玩玩简单AI,还不如以前小板车跑得快(扶额)

很不错的K歌软件——剪映

最近在试唱英文歌,发现市面上的K歌App都不好用,最终动用了视频剪辑软件。

视频剪辑软件的优点:

  • 歌存在大量连读,还有省略发音,所以一开始会频繁用到倍速播放。很多剪辑软件都支持J K L预览倍速。我把原曲调成了0.5倍速,通过双击L播放,J快退,很方便。
  • 网上现成的背景音素材很多,分开导入音乐和人声,可以方便静音某个音轨。

剪映的优势:

  • 小、免费(相比 Premiere pro)
  • 加速不会卡顿爆音(相比 Kdenlive)
  • 自带 AI 人声分离(这条不算重点)

其他方案的问题:

  • 播放器不支持多音轨同时播放,如音乐和人声合并/独立播放
  • 传统 K 歌软件不方便变速
  • 混音软件不能展示歌词画面

Huggingface行了又不太行

最近一段时间,Huggingface做了一点改动。

Space归类

在Space页面,按Space功能加了一行Icon。因为搜索很烂,所以官方归类一下还是不错的。从靠前的Space可以看到比较不错的项目和模型,或者说就是现阶段最好的模型。我试了下靠前的Background Removal项目,就挺好用。

模型接口变化

Huggingface大概在一个月前,接入了其他模型供应商。官方自己的接口一直都很烂,不但容易掉线,非热门模型撤得也快,基本只能当玩具。接入第三方后,自然稳定很多。

但是,配额暴降。之前是FREE账户限制模型范围,PRO账户有20K/M的调用次数。现在缩水到FREE账户$0.1/M,RPO账户$2/M。
我测试了一下,在模型页面右侧的使用Demo也会扣配额。Huggingface没有说具体的计算方式,如果是按调用次数,等于PRO用户砍了九成配额。
当然了,也有办法增加配额,我只能说懂的都懂。

更正:Huggingface是按各个服务商的定价按原价转发。

具体的供应商列表在源码PROVIDER_T里,相应的接口(LLM):`
https://router.huggingface.co/{:PROVIDER}/v1/chat/completions

有意思的是,如果是走第三方供应商,一些Huggingface上不存在的模型也是可以调用的。但不是所有接口都可以,Huggingface对每个供应商只实现了部分接口,具体可以看源码中的定义。

修了一个Bug

Space原本是不支持/v1路径的,访问会404,所以作为LLM接口调用必须要多加一层路径(如/hf/v1),现在似乎修好了。

将FastCopy整合进系统

目前主流的复制工具有 TeraCopy 和 FastCopy,我不是要讨论谁更强大,而是要解决 Windows 卡死的问题。我看了下知乎上的评测文章,很多评论和我的情况是一样的。大家对差个几秒并没有太多感知,只是 Windows 在多线操作时经常会降速到不可忍受,有时还会卡在最后 1% 无法完成。罪魁祸首是那个该死的进度条,但系统又不让关闭。

文件操作主要是复制和删除(移动可以看作复制+删除)。FastCopy 同时支持两种操作,整合得不太好;TeraCopy 不支持删除,但很好集成。

我的方法是,同时安装两个软件,然后在 TeraCopy 中勾选集成复制功能-接管拖放操作/默认使用 TeraCopy 复制文件
此时粘贴文件,TeraCopy 会弹出一个窗口,右上角有个设置,点击后可以“Edit Menu”(即修改软件目录下的 PasteMenu.ini)。
添加几个选项,原始内容按序号顺延,FastCopy.exe改为自己的路径:

[1]
title=FastCopy - Copy - !!Just Overwrite!!
path=C:\Users\YOUR_USERNAME\FastCopy\FastCopy.exe
copy=
cut=
parameters=/auto_close /cmd=diff /srcfile="{list}" /to="{target}"
[2]
title=FastCopy - Move - !!Overwrite!!
path=C:\Users\YOUR_USERNAME\FastCopy\FastCopy.exe
copy=
cut=
parameters=/auto_close /cmd=move /srcfile="{list}" /to="{target}"
[3]
title=FastCopy - Copy (Not Overwrite)
path=C:\Users\YOUR_USERNAME\FastCopy\FastCopy.exe
copy=
cut=
parameters=/auto_close /cmd=noexist_only /srcfile="{list}" /to="{target}"
[4]
title=FastCopy - Copy (Keep the Newer File)
path=C:\Users\YOUR_USERNAME\FastCopy\FastCopy.exe
copy=
cut=
parameters=/auto_close /cmd=update /srcfile="{list}" /to="{target}"

再次复制或移动时,就可以默认调用 FastCopy 了。

TeraCopy 也不算纯粹的工具人,稍微复杂一些的调度用 TeraCopy 还是挺方便的。

接下来是删除,我用 AutoHotKey 接管了 Shift + Delete,代码如下:

#IfWinActive ahk_exe explorer.exe
+Del::
fastCopyPath := "C:\Users\YOUR_USERNAME\FastCopy\FastCopy.exe"
selectedFiles := ""
for window in ComObjCreate("Shell.Application").Windows {
    if (window.HWND = WinExist("A")) {
        for item in window.document.SelectedItems
            selectedFiles .= """" item.Path """ "
    }
}
if selectedFiles
    Run, % fastCopyPath . " /force_close /cmd=delete " . selectedFiles
return

从原理上讲 del / robocopy 都可以实现快速删除,但 FastCopy 默认会弹一个确认窗口,和系统自带的 Shift+Delete 操作习惯完全一致。

在Huggingface上跑代理

Huggingface 给每个人无限量的临时 Space 配额,试了试居然可以运行代理:一个简单的 Trojan 示例

直接 Dumplicate,然后修改 PASSWORD 和 WS_PATH 两个 secret 就能启动了。
WS_PATH(伪装路径)不是必须的,删掉它就等同于跑在首页上。

HF Space 踩坑记录

① websocket 问题
代理协议要套用 websocket 才能连接成功。由于很多聊天 Demo 的流式输出都基于 websocket,倒是不用担心像 Colab 那样被掐。

② binding host 问题
始终使用 0.0.0.0 而非 127.0.0.1,否则可能会出现奇奇怪怪的状况。Space 必须要 Public,否则知道 hf.space 地址也不能连接成功。

③ 卡 Starting 问题
即使 Space 内的程序已经正常 Running,仍有可能卡在 Starting。
如果一切正常,且有服务占用 7860 端口(默认端口),Space 状态理应切换为 Running。但 HF 对端口占用检测有 Bug,此时 Space 就会无限 Starting。由于只有 Running 状态,端口才会转发数据,所以此时即使服务正常也无法访问。
解决办法:在启动脚本里加上一句 python -m http.server 7860 & kill $! 。也就是用一个 HF 能识别的服务进程占用 7860 端口后立刻杀掉,再在这个端口上运行其他服务。

④ 保活问题
每个 Space 的运行时间是 48h,之后”不活跃“的 Space 将进入睡眠。之前我猜测只要 .hf.space 有访问就能保活,后来看到确实有人引入 upapp 来检测自己保活。这样的话应该也可以用 UptimeRobot 这类第三方检测来定期访问保活。

⑤ 滥用问题
HF 好像没有具体说明代理是否属于滥用,不过大规模滥用应该是不可能的,只适合自用或备用。第一,HF 给每个用户(对,是账户下所有 Space)分配了 3 个 固定 IP,没有 AnyCast,所以不太可能被批量白嫖。第二,所有 IP 都在美国,延迟一般,也无法绑定域名。

将官方Qwen1.5接入Chatbot

之前提到,Qwen 官方提供了一个在线 Demo。本来是基于 Gradio 的,我将它转换成了 OpenAI 的接口,并且直接部署在了 HF 上: Qwen 1.5 minimal Chat

虽然名字叫 minimal,实际接入的是 110B…… 本地连 7B 都费劲,只能白嫖官方勉强维持生活。

碎碎念:HF space 的 Docker 还是有点奇怪的,调试完了新建项目再部署,就出现 .sh 文件找不到。折腾了半天用 bash 就可以,直接 ./ 就不行,莫名其妙。

因为 HF space 有 48h 不访问就 sleep 的限制,我加上了一个每隔一小时访问自己的脚本,看看能不能绕过这个限制。

仅通过wget在两台机器间传输文件

发现一个有意思的网站:station307.com

该网站用于两台机器间传输文件,只需要 wget 或 curl 即可。流式传输,而非临时网盘。

接收端输入 wget 命令,在输出中有一行随机生成的 web.url,在浏览器中打开这个地址,选文件发送即可。也可以不经过浏览器直接 post 数据过去。

这有什么好处呢?有时环境比较简单,可能没有 server 或者 ssh 权限,典型的如 kaggle,有了这个网站就可以很方便地发送本地文件。
最近还遇到的一个场景是,目标机器只能 ipv6 访问,正好手上的网络不支持,也用这个网站完成了快速分享。