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

邪修速验Huggingface Inference Token

官方的接口是:

curl https://huggingface.co/api/whoami-v2
    -H "Authorization: Bearer hf_..."

不过该接口疑似有速率限制,尤其是IP可能受限。

邪修速通方案:401/403是无效,400/404是有效

curl 'https://router.huggingface.co/groq/-' \
  -H 'authorization: Bearer hf_...'

原理是router会先验token,一般错误的会返回401,官方封号是403。由于第三方供应商不支持GET,所以正确时会返回400。
404比较特殊:hf-inference作为供应商(即替换groq)时是支持GET的,但url中要求包含模型名称,模型不存在所以404。

如需要进一步确认是否还有额度,可使用免费模型验证,如:

curl 'https://router.huggingface.co/novita/v3/openai/chat/completions' \
    -H 'authorization: Bearer hf_...' \
    -H 'content-type: application/json' \
    --data-raw \
        '{"messages":[{"role":"user","content":"Hi"}],"max_tokens": 1,"stream":false,"model":"meta-llama/llama-3.2-1b-instruct"}'

附上两份价格表:
Requesty通用价格
HuggingFace价格(有细微偏差,要以账单接口为准)

尝试一下vibe coding

简单玩了下最近很火的 vibe coding。

根据API做了个模型playground,没用什么工作流,就是古法聊天。

界面如下:

在 Antigravity 中使用 Gemini 3 flash 完成,一共就四轮对话,还挺好玩的:完整的 prompt

带善人HuggingFace搞了点新接口

很久没去 HuggingFace,发现又多了一些第三方 LLM 接口,并且特地做了一个支持直接调用的 LLM 列表。可以看到,最全的依然是 novita,其他基本是凑数的。

不过,最大的发现是,图片生成增加了一家供应商:WaveSpeed。相比不能试用的 fal 和审核很严的 Replicate,WaveSpeed 可以说是可用性极高。

配合以前的一个小技巧——HuggingFace 实际支持第三方接口的所有模型(包括不在 HuggingFace 上的闭源模型),我们还可以 router 调用 Nano-Banana。

还不止于此,只要接口统一,其他任何模型,甚至是音乐生成模型,也能调用。

# pip install wavespeed
from wavespeed import Client

hf_key =  YOUR_HF_KEY
hf_base_url = "https://router.huggingface.co/wavespeed"

def text_to_music(prompt, lyrics, model):

    client = Client(api_key=hf_key, base_url=hf_base_url)
    output = client.run(
        model,
        {
            "bitrate": 256000,
            "lyrics": lyrics,
            "prompt": prompt,
            "sample_rate": 44100
        },
        timeout=36000.0,
        poll_interval=1.0,
        enable_sync_mode=False,
    )

    return output["outputs"][0]

model = "minimax/music-02"
prompt = "一首中式古典歌曲,由古筝弹奏,由轻柔的男声演唱"
lyrics = "窗前明月光,\n疑似地上霜。\n举头望明月,\n低头思故乡。"
print(text_to_music(prompt, lyrics, model))

可以说,HuggingFace 的 router 就是真是个 router。实践中,并不是所有的供应商都能随意跨模型,例如:不能用 replicate 的 LLM;调 novita 非 LLM 服务结果会截断。这不是因为 HuggingFace 做了限制,而是 router 这块代码够烂。可能这块是 vibe coding出来的?

简单的免费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 歌软件不方便变速
  • 混音软件不能展示歌词画面

记一次系统内存泄漏排查

我习惯使用Windows睡眠,很少关机。但是系统总是越用越卡,最终不得不重启。这个情况持续了很长一段时间,64G的内存基本上只能支撑1-2周,并且一直找不到原因。

最近,这个问题终于彻底解决。流程和和这篇《win10非分页缓冲池占用过大的解决方法》几乎一致。

内存泄漏的情况千奇百怪,总有前人踩过坑。然而,往往要已经定位到问题,才能搜到对应的文章,属于是马后炮了。所以我姑且记录一下自己的流程。


首先,查了一些常见的系统泄漏情况,关闭了微软输入法,无效。
接着,用Process Explorer查找问题,没有异常进程。

继续研究,有一些用户提到显卡驱动有内存泄漏,如果是这种驱动级泄漏,Process Explorer是找不到的。

ChatGPT的解释:

Process Explorer 本身主要用于查看和分析用户模式下的进程和线程活动,比如 CPU、内存、句柄和 DLL 的使用情况。
它不直接提供定位驱动级别内存泄漏的功能,因为驱动程序运行在内核模式下,而 Process Explorer 主要关注用户模式的行为。

系统开机一段时间后,用PoolMonX查驱动,Diff排序,此时FMfn攀升到第一位。

按照网上的说法,应该要查Non Paged,不过我这里显示是Paged。Diff代表申请和释放内存的差值,如果数字太大,代表没释放的内存在堆积。

C:\WINDOWS\system32>fltmc

筛选器名称                      数字实例       高度          框架
------------------------------  -------------  ------------  -----
cbfs6                                                       <过时>
bindflt                                 1       409800         0
lrtp                                   17       389170         0
sysdiag                                 7       324600         0
storqosflt                              0       244000         0
wcifs                                   1       189900         0
CldFlt                                 10       180451         0
FileCrypt                               1       141100         0
luafv                                   1       135000         0
npsvctrig                               1        46000         0
Wof                                    13        40700         0
FileInfo                               17        40500         0

问一下ChatGPT这都是些什么:

cbfs6:通常与 Callback File System 相关,这是一个用于开发虚拟文件系统的第三方工具。
bindflt:Windows 内置驱动,绑定筛选器驱动程序,用于文件系统绑定操作。
lrtp:未知,这个名称不像常见的系统驱动,可能需要更深入的检查。
sysdiag:未知,名称看似与系统诊断有关,但没有明确的 Windows 系统驱动使用这个名称。
storqosflt:Windows 内置驱动,存储质量服务过滤器,与存储设备的性能管理相关。
wcifs:Windows 内置驱动,Windows 容器隔离文件系统,支持容器化文件操作。
CldFlt:Windows 内置驱动,Cloud Files Mini Filter Driver,用于 OneDrive 等云存储服务的文件占位符功能。
FileCrypt:Windows 内置驱动,文件加密驱动,处理文件级别的加密操作。
luafv:Windows 内置驱动,用户账户控制虚拟化,用于兼容旧软件的 UAC 虚拟化支持。
npsvctrig:Windows 内置驱动,服务触发器提供程序,用于触发基于网络事件的服务操作。
Wof:Windows 内置驱动,Windows Overlay Filter,用于处理压缩和解压缩的文件存取操作(如 NTFS 压缩或 WIM 挂载)。
FileInfo:Windows 内置驱动,文件信息筛选器,用于收集文件元数据,常用于安全审计。

有两个未知,其中sysdiag是火绒。继续定位lrtp.sys

C:\>findstr /m /l /s lrtp *.sys
Program Files (x86)\Lenovo\LenovoInternetSoftwareFramework\lrtp.sys
FINDSTR: 无法打开 swapfile.sys
Windows\System32\drivers\lrtp.sys

原来是联想的东西,搜了一下,这个驱动属于老版本的管家残留,新版本已经换驱动了,所以无法通过装新版再卸载来解决。网上大概有三四篇文章提到这个驱动存在内存泄漏,包括开头提到的那篇。
总之,可以暴力删除,也可以用这篇文章末尾的批处理:《联想电脑管家卸载残留完整分析》

至此,系统内存泄漏问题解决。


题外话,通过这次排查,我才知道任务管理器的使用中内存根本就是文字游戏,备用内存更是毫无意义的数字。

使用中代表这部分物理内存正在使用,但真正不能释放的部分是已提交。打个比方,有人预订了酒店,但他不一定入住,酒店没办法把这些空房安排给其他客人。预订就是已提交使用中就是实际入住,有人占着茅坑不拉屎,不等于茅坑能再次分配。

备用就更没有意义,这个数字等于物理内存总量减去使用中。其中既有不能释放的申请,又包括了可以释放的缓存。这个名称给人一种”这些内存在必要时可以分配给其他应用“的错觉,我不知道计算这个的意义是什么。

内存释放工具主要就是转移这部分内存,这些数据被暂时移到硬盘后,又会被系统慢慢加载回来,所以解决不了内存爆炸后的卡顿的问题,最多只能缓解几分钟。而频繁清理,硬盘压力会变大,只会使系统更加卡顿。

一个典型的例子是Photoshop。在Photoshop中关闭文件后,这部分内存并不会被释放。官方的解释是,软件为了不反复申请内存,所以不释放内存,而是留着给未来的操作重用。实际上,这就是典型的内存泄漏,而且这些内存根本不像官方说的那样会重用。

如果用内存清理软件清理,这些物理内存占用快速下降,但是观察进程管理器,可以看到内存很快又会攀升,并且磁盘忙碌。整个过程最多5分钟,已提交的数字不会变化,等于是这些内存去分页文件逛了一圈。这时候,唯一能做的就是重启Photoshop。

驱动级泄漏最麻烦的地方在于,如果有多个进程或服务在使用这个驱动,很难确定是谁的问题,只能排除法。另外,删除驱动后,需要重启验证,如果泄漏缓慢,可能要等待几天甚至几周才能确定问题是否解决。

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),现在似乎修好了。

【2025.02】聊聊最近可以角色扮演的模型

有一段时间没推荐过新模型了,这次推荐的主要是长上下文模型,比较适合角色扮演(当然大部分也是通用模型)。

之前模型百花齐放,主要得益于Yi-34B和Qwen-32B的各种微调。现在这些内容有些过时了,所以这期主要是推荐一些云端模型。

这些模型要么没有审核,要么很容易jailbreak,具体就自己发挥吧。

MiniMax-Text-01

海螺AI的开源模型,角色扮演型模型。他们家主要就是做角色扮演的,旗下有个叫星野的APP,用的是一个小号模型。

和Deepseek一样,对个人来说开源了等于没开源,体积太大了。
官方的Demo:点这里,我适配的接口:点这里
要稳定的话自己官网注册账号,1M上下文,输入0.001元/千token, 输出0.008元/千token。

这个模型发布后登上了几天Huggingface热门榜,然后就没什么波澜了。官方模型介绍提到「其中每8层中有7个是基于Lightning Attention的线性注意力,有一层是传统的SoftMax注意力」,是不是有点像RWKV?

效果上看:适合角色扮演,但也只适合角色扮演。不要用在需要严谨推理的地方,尤其是不要问数学题。

Doubao-character

豆包专门用于角色扮演的模型,这是一个系列,有Lite和Pro以及最多32K上下文的版本,官方每个版本送500万tokens。
我只是浅浅试了一下jailbreak,几乎没有限制,更多的就没有深入体验。

character版本的低限制应该是有意设计的,普通的Pro版本很难越狱(Lite可以jailbreak,但文本质量差很多)。

Gemini-2.0-Flash

Gemini 2.0 Flash正式版发布了,可能是受股价下跌的刺激,这次来得很突然。正式版模型有1M上下文,限制比任何实验版都要少。这个模型很强,除了扮演也可以干正事。

在最近的审查选项里,除了BLOCK_NONE外还额外新增了一个OFF。在谷歌给的演示中,HARM_CATEGORY_SEXUALLY_EXPLICIT就是OFF,好像是在暗示什么。我不知道两者有什么区别,总之调成OFF后,正式版几乎不会中断输出。

关于Gemini还有两个小新闻。
第一是,实时搜索功能上线了,好像是仅限付费版,要在tool参数里设置。
第二是,API上的思维链被砍了,只能AI Studio里看到思考内容。我不知道谷歌为什么要这么做,而且就在Deepseek R1刚发布后,感觉纯纯有病。

Qwen-2.5-Max

也是在Deepseek发布后紧急上线的模型,能力比Deepseek强。通用能力强,扮演也强,和Gemini一样,可以作为主力,然后就是贵。刚发布时完全被R1的光芒掩盖了,春节后才开始登上榜单。

官方的Demo:点这里,我适配的接口:点这里
要稳定用的话去官网注册吧,应该是送不少tokens,我估计过阵子价格还会降。

deepseek-chat

我测试是可以扮演的,但是因为热度的关系,实在是太卡了,也就没深入测试。R1不适合扮演,莫要强求。


自从Yi-34B发布后,我就有个想法,以后只会有小模型和超大模型开源。
原因是小模型是端侧的玩具,几乎不能拿去卖钱;超大模型用来秀肌肉,开了等于没开,如开;中等体量是真的能用,只会便宜了用户和友商。
不过之后一段时间,Qwen仍在继续更新30-40B的模型,我觉得他们或许也是没什么KPI压力。

随着Deepseek R1的发布,我已经遇到了好几个人和我有同样的想法。在受到商业上的刺激后,不知道阿里还有没有心情做这种「慈善型」的中等体量模型。

再补充下R1蒸馏版的体验

我在之前的文章里说R1蒸馏进Llama 70B后继承了Llama重复的问题,不过话又说回来,后来我又发现R1蒸馏进Qwen-32B后,继承了审查宽松的特性。

目前R1-Qwen-32B可以通过我的这个接口配合自己的HF Token + Model:deepseek-ai/DeepSeek-R1-Distill-Qwen-32B体验。根据HuggingFace的惯例,一旦热度下降就会撤掉部署,估计随时失效吧。

R1-Llama-70B目前可以在Sambanova体验。不过呢,他们很快就要取消免费版了,所以也是随时失效。或者用我的CerebrasUnofficial也行。

蒸馏版纯属娱乐,不推荐自己部署。