agentCLAWHUBUnverified

free-model-router-laodao

为 OpenClaw 提供免费模型智能路由服务,支持本地代理、自动配置、自动轮询、故障切换和配置零侵入。在需要设置免费模型路由、配置 Provider、切换模型或诊断模型可用性问题时使用。 Skill: free-model-router-laodao Owner: laodao-agent Summary: 为 OpenClaw 提供免费模型智能路由服务,支持本地代理、自动配置、自动轮询、故障切换和配置零侵入。在需要设置免费模型路由、配置 Provider、切换模型或诊断模型可用性问题时使用。 Tags: latest:2.2.0 Version history: v2.2.0 | 2026-08-12T04:04:59.191Z | user v2.2.0 更新内容 改进 - **额度耗尽与限流的恢复更可靠**:402 额度耗尽、长期 429 限流不再走固定冷却时间,改为持续探测成功才恢复,避免额度未恢复时反复失败 - **单次 429 限流不再触发长冷却**:单次限流不再立即把 Provider 长时间禁用,按累计次数逐步升档;累计清零后立即恢复 - **单个模型持续失败不再拖累整个 Provider**:单

OpenClaw

Rank

62

Safety

84

Downloads

2.3k

Updated

Oct 9, 2026

Version

2.2.0

Source

CLAWHUB

About

What it does, and when to use it.

Capability contract not published. No trust telemetry is available yet. 2.3K downloads reported by the source. Last updated 10/9/2026.

Avoid when

  • Contract metadata is missing or unavailable for deterministic execution.

Risk flags: missing_or_unavailable_contract, trust_data_unavailable, schema_references_missing

Public facts

Every fact links back to the source it came from.

Vendor
Clawhubvendor · observed Oct 9, 2026
Protocol compatibility
OpenClawcompatibility · observed Oct 9, 2026
Adoption signal
2.3K downloadsadoption · observed Oct 9, 2026
Latest release
2.2.0release · observed Aug 12, 2026
Handshake status
UNKNOWNsecurity

Install and run

Setup complexity: low.

clawhub skill install s1795r81v2nhm9vmecrs9562t584xfr3:free-model-router-v1
  1. Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.
  2. Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.

Contract: missing

curl -s "https://www.xpersona.co/api/v1/agents/clawhub-laodao-agent-free-model-router-v1/snapshot"

Documentation

CLAWHUB

160,000 characters of source documentation, loaded on request.

Extracted files

5 files captured from the source.

SKILL.md

---
name: free-model-router
description: 为 OpenClaw 提供免费模型智能路由服务,支持本地代理、自动配置、自动轮询、故障切换和配置零侵入。在需要设置免费模型路由、配置 Provider、切换模型或诊断模型可用性问题时使用。
---

# free-model-router

> 免费模型智能路由 — 本地代理,自动配置,自动轮询,故障切换,配置零侵入

引导注册免费模型,永久在线,实现token自由。自动同步、自动检测、自动切换、自动救援。

## 数据流向说明

本技能的数据流向分为三层,所有行为均透明可控:

```
Layer 1: 用户 → OpenClaw → 127.0.0.1:5678 本地 Router
         (数据不离开本机)

Layer 2: 本地 Router → 外部模型 Provider(OpenRouter、NVIDIA NIM 等)
         (提示词和模型响应经过 Provider 服务器)

Layer 3: 本地 Router ↔ freemodel 控制服务器
         (仅同步 provider 列表、模型 ID、健康状态,不含对话内容)
```

| 行为 | 说明 | 用户控制 |
|------|------|----------|
| **外部通信** | 向 `freemodel.eu.org` 等服务器注册匿名 API Key、拉取 provider 列表和模型元数据 | 仅同步 provider 配置,**不含任何用户对话内容** |
| **数据上报** | 可选的匿名健康状态上报(模型延迟、可用性) | **默认关闭**,可随时通过 `reporting off` 命令或管理面板开启/关闭 |
| **设备指纹** | SHA256(hostname + homedir + platform + arch) 不可逆哈希 | 仅用于区分设备,**无法反推原始信息** |
| **配置修改** | 仅在 setup 时向 `openclaw.json` 添加 free-model-router provider | 自动备份(最多3份)+ 失败自动回滚,幂等设计 |
| **本地代理** | `127.0.0.1:5678` 仅监听本地回环 | **不暴露公网**,仅接收 OpenClaw 内部请求 |
| **推荐码** | 完全自愿的推荐试用系统 | 不参与不影响任何免费功能 |

> **重要提示**:你的提示词和模型响应会被转发到外部模型 Provider(如 OpenRouter、NVIDIA NIM 等),请知悉。本技能不收集、不传输、不存储任何用户对话内容、提示词或模型响应数据。所有外部请求仅涉及模型配置元数据。

## 核心架构

- **OpenClaw 配置只改一次** — 仅在 setup 时写入 `free-model-router` provider 指向本地 Router (127.0.0.1:5678)
- **所有模型切换在 Router 层透明完成** — 运行期间不再触碰 openclaw.json,避免 Gateway 宕机
- **Sticky 粘性路由** — 默认策略,同能力池内优先命中上次成功的 Provider,失败时自动切换并支持跨池救援
- **自动故障切换** — 主模型故障自动切换到备模型,所有 provider 不可用时自动降级
- **事件通知系统** — 模型切换、故障等事件写入 events.json,由 cron 任务推送

## 安装幂等性

**本技能支持幂等安装 — 多次触发 setup 不会产生副作用。**

详见 [references/idempotency.md](references/idempotency.md)

核心要点:
- Router 已运行则跳过,OpenClaw 已配置则跳过
- 重复执行时仅同步 provider 列表,**不会覆盖用户手动设置的主备模型**
- 用户手动配置的 API Key 和主模型值始终保留

## ⚠️ 版本更新后必须重启 Router

**Skill 更新只会替换磁盘文件,不会自动重启正在运行的 Router 进程。** 旧进程仍在使用旧代码,新功能/修复不会生效。

**必须在 skill 更新后执行以下操作:**

```bash
# 1. 停止旧进程
node <skill_dir>/scripts/free-model-cli.js stop

# 2. 重新启动(setup 会自动启动 Router 并完成初始化)
node <skill_dir>/scripts/free-model-cli.js setup
```

> **注意:** `stop` + `setup` 是安全的——Router 配置、API Key、主备模型等用户数据均持久化在 `~/.free-model-router/data/router-config.json` 中,重启不会丢失。

## 配置流程触发

安装/识别技能后,向用户展示:

**选项 A:现在设置(推荐)** — 回复 "现在设置"/"开始配置"
**选项 B:延后设置** — 回复 "延后设置"/"稍后再说"

配置完成后,Router 注册两个定时任务(北京时间 UTC+8):
- **事件通知检查**: 每天 10:00、15:00、20:00 检查一次(避免夜间打扰)
- **每日状态汇报**: 每天 9:00 自动汇报各 provider 运行状态

> **注意:** 如果已安装(Router 运行 + OpenClaw 已配置),setup 命令会输出当前状态摘要而非重新配置。

> **CLI 路径:** 下文所有命令中的 `<skill_dir>` 指技能安装目录。默认路径为 `~/.openclaw/skills/free-model-router`,具体路径取决于当前 OpenClaw 变种的安装目录和技能名称(例如 `~/.kimi-openclaw/skills/free-model-router`)。

## 命令执行约束

**禁止复合命令:** OpenClaw 的 exec 工具不支持 `cd ... && node ...` 或 `bash -c "..."` 等复合命令。所有命令必须使用直接调用格式:

```bash
node <skill_dir>/scripts/free-model-cli.js <command>
```

其中 `<skill_dir>` 的完整路径取决于当前 OpenClaw 变种的安装目录(例如 `~/.openclaw/skills/free-model-router` 或 `~/.kimi-openclaw/skill

node_modules/@foxt/js-srp/README.md

# js-srp-gsa

This is a fork of [`js-srp`](https://github.com/jchv/js-srp) that adds support for the variant of SRP used by Apple icloud.com.

## Example usage

### SRP wrapper
```ts
import { Client, Hash, Mode, Srp, util } from "@foxt/js-srp";
import crypto from "crypto";

export type SRPProtocol = "s2k" | "s2k_fo";

export interface ServerSRPInitRequest {
    a: string;
    accountName: string;
    protocols: SRPProtocol[];
}
export interface ServerSRPInitResponse {
    iteration: number;
    salt: string;
    protocol: "s2k" | "s2k_fo";
    b: string;
    c: string;
}
export interface ServerSRPCompleteRequest {
    accountName: string;
    c: string;
    m1: string;
    m2: string;
    rememberMe: boolean;
    trustTokens: string[];
}

let srp = new Srp(Mode.GSA, Hash.SHA256, 2048);
const stringToU8Array = (str: string) => new TextEncoder().encode(str);
const base64ToU8Array = (str: string) => Uint8Array.from(Buffer.from(str, "base64"));
export class GSASRPAuthenticator {
    constructor(private username: string) { }
    private srpClient?: Client = undefined;


    private async derivePassword(protocol: "s2k" | "s2k_fo", password: string, salt: Uint8Array, iterations: number) {
        let passHash = new Uint8Array(await util.hash(srp.h, stringToU8Array(password)));
        if (protocol == "s2k_fo") {
            passHash = stringToU8Array(util.toHex(passHash));
        }

        let imported = await crypto.subtle.importKey(
            "raw",
            passHash,
            { name: "PBKDF2" },
            false,
            ["deriveBits"]
        );
        let derived = await crypto.subtle.deriveBits({
            name: "PBKDF2",
            hash: { name: "SHA-256" },
            iterations, salt
        }, imported, 256);

        return new Uint8Array(derived);
    }


    async getInit(): Promise<ServerSRPInitRequest> {
        if (this.srpClient) throw new Error("Already initialized");
        this.srpClient = await srp.newClient(
            stringToU8Array(this.username),
            // provide fake passsword because we need to get data from server
            new Uint8Array()
        );
        let a = Buffer.from(
            util.bytesFromBigint(this.srpClient.A)
        ).toString("base64");
        return {
            a, protocols: ["s2k", "s2k_fo"],
            accountName: this.username,
        };
    }
    async getComplete(password: string, serverData: ServerSRPInitResponse): Promise<Pick<ServerSRPCompleteRequest, "m1" | "m2" | "c" | "accountName">> {
        if (!this.srpClient) throw new Error("Not initialized");
        if ((serverData.protocol != "s2k") &&
            (serverData.protocol != "s2k_fo")) throw new Error("Unsupported protocol " + serverData.protocol);
        let salt = base64ToU8Array(serverData.salt);
        let serverPub = base64ToU8Array(serverData.b);
        let iterations = serverData.iteration;
        let derived = await this.derivePassword(
            serverData.protocol, password,
         

_meta.json

{
  "ownerId": "kn70ctf7xm30wgwwzbemy34ydd84xyqy",
  "slug": "free-model-router-v1",
  "version": "2.2.0",
  "publishedAt": 1786507499191
}

references/event-system.md

# 事件通知系统

> Router 内置事件通知系统,文件位于 `<skill_dir>/data/events.json`(`<skill_dir>` 为技能安装目录,默认 `~/.openclaw/skills/free-model-router`,具体路径取决于当前 OpenClaw 变种)。

## 事件类型

| 类型 | 优先级 | 说明 |
|------|--------|------|
| `announce` | normal | model-server 公告 |
| `modelFailover` | high | 模型故障自动切换 |
| `modelUnavailable` | critical | 模型完全不可用 |
| `dailyStatus` | normal | 每日状态汇报 |
| `providerAdded` | normal | 新增 provider |
| `providerRemoved` | normal | 移除 provider |

## 事件状态

`pending`(待推送) → `notified`(已推送) → `read`(已读)

## 公告事件格式

公告事件可能包含可点击的链接,格式如下:

```json
{
  "id": "{eventId}",
  "title": "{公告标题}",
  "content": "{公告内容描述}",
  "type": "{类型: info/important/warning}",
  "metadata": {
    "url": "{链接地址}",
    "action": "{链接按钮文本}"
  }
}
```

### 推送格式规范

推送公告时,**根据 metadata.url 决定是否展示超链接**:

**有链接时:**
```
📢 公告: {title}

{content}

[🔗 {metadata.action 或 "查看详情"}]({metadata.url})
```

**无链接时:**
```
📢 公告: {title}

{content}
```

### 超链接展示要求

1. **必须使用 Markdown 链接格式**: `[显示文本](URL)`
2. **链接文本优先级**: `metadata.action` > "查看详情"
3. **链接位置**: 放在内容下方,单独一行
4. **链接图标**: 使用 🔗 前缀增强可识别性

### 示例

**带链接的公告:**
```markdown
📢 公告: 新模型上线

Qwen3-Coder 免费模型已上线,支持代码补全和对话。

[🔗 立即体验](https://openrouter.ai/models/qwen/qwen3-coder:free)
```

**不带链接的公告:**
```markdown
📢 公告: 系统维护通知

今晚 02:00-04:00 进行系统维护,期间服务可能不稳定。
```

> **注意:** 公告内容完全由 model-server 动态返回,不要写死数据。如果 `metadata.url` 存在,**在域名校验通过后**向用户展示该链接;`metadata.action` 为链接的可选显示文本。

### 链接安全

公告链接的域名必须经过白名单校验。允许的域名:
- `freemodel.eu.org`
- `freemodel.dpdns.org`

**通过校验**:正常渲染为 Markdown 链接 `[点击查看](url)`。
**未通过校验**:不渲染为可点击链接,改为纯文本展示 `相关链接(未通过安全校验): url`,并附加警告提示。

## Cron 读取方式

1. 读取 `status=pending` 且 `shouldNotify=true` 的事件
2. 向用户推送
3. 推送后调用 `node <skill_dir>/scripts/free-model-cli.js mark-notified <eventId,...>` 标记已推送,避免重复

## 事件推送示例

**模型故障切换:**
```
⚠️ 模型故障切换
Provider openrouter 主模型 qwen/qwen3-coder:free 故障
已自动切换到备模型: anthropic/claude-sonnet-4:free
```

**模型完全不可用:**
```
🚨 模型不可用
Provider openrouter 所有模型均不可用
请检查 API Key 或稍后重试
```

**每日状态汇报:**
```
📊 每日状态汇报
openrouter: healthy (主模型 qwen/qwen3-coder:free)
modelscope: healthy (主模型 qwen/qwen3:free)
```

references/idempotency.md

# 安装幂等性指南

> 本技能支持幂等安装 — 多次触发 setup 不会产生副作用。

## 已安装状态检测

Agent 在触发 setup 前,应检查以下指标判断是否已安装:

| 检查项 | 判断方式 |
|--------|---------|
| Router 是否运行 | `curl http://127.0.0.1:5678/api/status` 返回 `running: true` |
| OpenClaw 是否已配置 | openclaw.json 中存在 `free-model-router` provider |
| cron 任务是否已注册 | `cron list` 检查 `free-model-router-event-check` 和 `free-model-router-daily-status` |

## 幂等行为

- **Router 启动**:已运行则跳过
- **OpenClaw 配置**:已写入 `free-model-router` provider 则跳过
- **初始化**:重复执行时,仅同步 provider 列表,**不会覆盖用户手动设置的主备模型**
- **cron 任务**:先删除旧任务再添加新任务,确保新配置生效
- **API Key / 主模型设置**:用户手动配置的值始终保留

## 二次安装输出

当用户第二次触发 setup 时,CLI 会输出当前状态摘要:

```
free-model-router 已安装,当前状态:
  Router: 运行中 (http://127.0.0.1:5678)
  OpenClaw: 已配置 (free-model-router provider)
  已配置 Provider: openrouter, modelscope
  事件检查任务: 已注册
  每日状态汇报: 已注册

提示:如需重新配置,请先运行 providers 查看当前状态
```

如果仅缺失 cron 任务,会提示缺失的部分:

```
--- 缺失的定时任务 ---
请使用 OpenClaw 内置 cron 工具注册以下缺失的定时任务:
### 任务: free-model-router-event-check
...
```

## 注意事项

- 如果已安装(Router 运行 + OpenClaw 已配置),setup 命令会输出当前状态摘要而非重新配置
- 注册 cron 任务时,先用 `cron delete` 删除旧任务,再用 `cron add` 添加新任务
- 这种方式确保新版本的定时任务配置能够正确生效
Github ReposUpdated 2h agoRank 70

AionUi

Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!

MCPOPENCLAW
Github ReposUpdated 6mo agoRank 70

activepieces

AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents

OPENCLAW
Github ReposUpdated 6mo agoRank 70

cherry-studio

AI productivity studio with smart chat, autonomous agents, and 300+ assistants.

MCPOPENCLAW
Github ReposUpdated 7mo agoRank 70

CopilotKit

The Frontend for Agents & Generative UI. React + Angular

OPENCLAW

Machine-readable data

The same record, as JSON, for agents and crawlers.

{
  "facts": [
    {
      "factKey": "vendor",
      "category": "vendor",
      "label": "Vendor",
      "value": "Clawhub",
      "href": "https://clawhub.ai/laodao-agent/skills/free-model-router-v1",
      "sourceUrl": "https://clawhub.ai/laodao-agent/skills/free-model-router-v1",
      "sourceType": "profile",
      "confidence": "medium",
      "observedAt": "2026-10-09T16:13:16.318Z",
      "isPublic": true
    },
    {
      "factKey": "protocols",
      "category": "compatibility",
      "label": "Protocol compatibility",
      "value": "OpenClaw",
      "href": "https://www.xpersona.co/api/v1/agents/clawhub-laodao-agent-free-model-router-v1/contract",
      "sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-laodao-agent-free-model-router-v1/contract",
      "sourceType": "contract",
      "confidence": "medium",
      "observedAt": "2026-10-09T16:13:16.318Z",
      "isPublic": true
    },
    {
      "factKey": "traction",
      "category": "adoption",
      "label": "Adoption signal",
      "value": "2.3K downloads",
      "href": "https://clawhub.ai/laodao-agent/free-model-router-v1",
      "sourceUrl": "https://clawhub.ai/laodao-agent/free-model-router-v1",
      "sourceType": "profile",
      "confidence": "medium",
      "observedAt": "2026-10-09T16:13:16.318Z",
      "isPublic": true
    },
    {
      "factKey": "latest_release",
      "category": "release",
      "label": "Latest release",
      "value": "2.2.0",
      "href": "https://clawhub.ai/laodao-agent/free-model-router-v1",
      "sourceUrl": "https://clawhub.ai/laodao-agent/free-model-router-v1",
      "sourceType": "release",
      "confidence": "medium",
      "observedAt": "2026-08-12T04:04:59.191Z",
      "isPublic": true
    },
    {
      "factKey": "handshake_status",
      "category": "security",
      "label": "Handshake status",
      "value": "UNKNOWN",
      "href": "https://www.xpersona.co/api/v1/agents/clawhub-laodao-agent-free-model-router-v1/trust",
      "sourceUrl": "https://www.xpersona.co/api/v1/agents/clawhub-laodao-agent-free-model-router-v1/trust",
      "sourceType": "trust",
      "confidence": "medium",
      "observedAt": null,
      "isPublic": true
    }
  ],
  "events": [
    {
      "eventType": "release",
      "title": "Release 2.2.0",
      "description": "## v2.2.0 更新内容 ### 改进 - **额度耗尽与限流的恢复更可靠**:402 额度耗尽、长期 429 限流不再走固定冷却时间,改为持续探测成功才恢复,避免额度未恢复时反复失败 - **单次 429 限流不再触发长冷却**:单次限流不再立即把 Provider 长时间禁用,按累计次数逐步升档;累计清零后立即恢复 - **单个模型持续失败不再拖累整个 Provider**:单个模型持续失败到阈值时自动转入冷池探测恢复,其他模型正常路由 ### 修复 - **模型被误禁用后未恢复**:触发禁用阈值后未正确恢复的回归已修复;连续失败计数跨请求批次累积,避免分散失败被误判为偶发 - **402 额度耗尽不再误降权**:402 属于配额类故障,不再计入 Provider 质量分母 - **管理面板修改 apiKey 后立即生效**:修改 Provider apiKey 后立即重载新 key,不再依赖重启",
      "href": "https://clawhub.ai/laodao-agent/free-model-router-v1",
      "sourceUrl": "https://clawhub.ai/laodao-agent/free-model-router-v1",
      "sourceType": "release",
      "confidence": "medium",
      "observedAt": "2026-08-12T04:04:59.191Z",
      "isPublic": true
    }
  ]
}

Record generated Oct 9, 2026.

Sponsored

Ads related to free-model-router-laodao and adjacent AI workflows.