@wy51ai/clawzenmux 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,295 @@
1
+ # ClawZenMux
2
+
3
+ **[English](README_EN.md)** | 中文
4
+
5
+ OpenClaw 智能 LLM 路由插件 —— 通过 [ZenMux](https://zenmux.ai) 统一网关调用 90+ 模型,自动选择最便宜的模型处理请求,节省 78-96% 的 token 费用。
6
+
7
+ > **注意**:这是一个社区第三方插件,非 OpenClaw 或 ZenMux 官方出品。欢迎各位大佬提交PR改进。
8
+ >
9
+ > 本插件参考 [ClawRouter](https://github.com/BlockRunAI/ClawRouter) 架构开发,去掉了区块链/x402 支付部分,改用 ZenMux 统一网关 + API Key 认证。感谢 ClawRouter 作者的开源贡献!
10
+
11
+ ## 工作原理
12
+
13
+ ```
14
+ OpenClaw Agent
15
+
16
+ ▼ POST /v1/chat/completions { model: "clawzenmux/auto", messages: [...] }
17
+
18
+ ▼ localhost:8403 (ClawZenMux 本地代理)
19
+
20
+ ├─ 1. 解析请求,提取用户 prompt
21
+ ├─ 2. 规则引擎评分 (14 维加权,<1ms,零成本)
22
+ ├─ 3. 根据复杂度选择最便宜的模型
23
+ ├─ 4. 替换 model 字段,转发到 ZenMux API
24
+ ├─ 5. 流式返回响应给 Agent
25
+ └─ 6. 记录使用日志
26
+ ```
27
+
28
+ **核心思路**:简单问题用便宜模型(DeepSeek $0.28/M),中等问题用均衡模型(Gemini 3 Flash),复杂问题用强力模型(Claude $3/M),推理问题用专业模型(DeepSeek Thinking)。用户只需设置 `clawzenmux/auto`,路由器自动判断。
29
+
30
+ ## 快速开始
31
+
32
+ ### 1. 获取 ZenMux API Key
33
+
34
+ 前往 [zenmux.ai](https://zenmux.ai) 注册,在 Console > API Keys 页面创建密钥。
35
+
36
+ ### 2. 安装插件
37
+
38
+ ```bash
39
+ openclaw plugin install @wy51ai/clawzenmux
40
+ ```
41
+
42
+ ### 3. 配置 API Key(三种方式,任选其一)
43
+
44
+ ```bash
45
+ # 方式一:环境变量(推荐)
46
+ export ZENMUX_API_KEY=your-key-here
47
+
48
+ # 方式二:保存到文件
49
+ echo "your-key-here" > ~/.openclaw/zenmux/api.key
50
+
51
+ # 方式三:在 openclaw.json 中配置
52
+ # 见下方「配置」章节
53
+ ```
54
+
55
+ ### 4. 使用智能路由
56
+
57
+ ```bash
58
+ # 自动选择最优模型
59
+ openclaw models set clawzenmux/auto
60
+
61
+ # 或者指定特定模型
62
+ openclaw models set anthropic/claude-sonnet-4.5
63
+ ```
64
+
65
+ ### 5. 提示词强制路由(可选)
66
+
67
+ 当你使用 `clawzenmux/auto` 时,可以在用户消息里加入控制指令强制层级:
68
+
69
+ ```text
70
+ USE SIMPLE
71
+ USE MEDIUM
72
+ USE COMPLEX
73
+ USE REASONING
74
+ ```
75
+
76
+ 示例:
77
+
78
+ ```text
79
+ USE COMPLEX 设计一个分布式消息队列的架构
80
+ ```
81
+
82
+ 说明:
83
+ - 该指令只在 `model=clawzenmux/auto`(或 `auto`)时生效
84
+ - 代理会在转发前移除 `USE ...` 指令文本,避免污染真正的提示词
85
+ - 若同一条消息没有指令,继续走默认规则引擎
86
+
87
+ ## 智能路由详解
88
+
89
+ ### 四层分级
90
+
91
+ | 层级 | 默认模型 | 价格 ($/M tokens) | 适用场景 |
92
+ |------|---------|-------------------|----------|
93
+ | **SIMPLE** | deepseek/deepseek-v3.2 | $0.28 / $0.43 | 简单问答、翻译、定义 |
94
+ | **MEDIUM** | google/gemini-3-flash-preview | $0.15 / $0.60 | 一般编码、摘要、解释 |
95
+ | **COMPLEX** | anthropic/claude-sonnet-4.5 | $3.00 / $15.00 | 复杂代码、架构设计、多步分析 |
96
+ | **REASONING** | deepseek/deepseek-v3.2-thinking | $0.28 / $0.43 | 数学证明、逻辑推导、定理证明 |
97
+
98
+ ### 规则引擎(<1ms,免费)
99
+
100
+ 100% 本地规则评分,无外部 API 调用。对 prompt 进行 14 维加权评分,根据总分映射到层级。关键词覆盖英文、中文、日文、俄文:
101
+
102
+ | 维度 | 权重 | 检测内容 | 多语言关键词示例 |
103
+ |------|------|----------|-----------------|
104
+ | 推理标记 | 0.18 | 证明、推导类提示 | prove, theorem / 证明, 推导 / 証明, 定理 / доказать |
105
+ | 代码存在 | 0.15 | 代码相关内容 | function, class, \`\`\` / 函数, 类 / 関数 / функция |
106
+ | 简单指标 | 0.12 | 简单问题标记 | what is, hello / 什么是, 你好 / とは / что такое |
107
+ | 多步模式 | 0.12 | 多步骤任务 | first...then, step 1, 1. 2. 3. |
108
+ | 技术术语 | 0.10 | 专业技术词汇 | algorithm / 算法 / アルゴリズム / алгоритм |
109
+ | Token 数量 | 0.08 | 输入长度 | <50 tokens → 简单,>500 → 复杂 |
110
+ | 创意标记 | 0.05 | 创意写作 | story, poem / 故事, 诗 / 物語 / история |
111
+ | 问题复杂度 | 0.05 | 多个问号 | 超过 3 个 ? |
112
+ | 约束条件 | 0.04 | 限制条件 | at most / 不超过 / 以下 / не более |
113
+ | 命令动词 | 0.03 | 构建指令 | build, create / 构建, 创建 / 構築 / создать |
114
+ | 输出格式 | 0.03 | 结构化输出 | json, yaml / 表格 / テーブル / таблица |
115
+ | 引用复杂度 | 0.02 | 上下文引用 | above, the docs / 上面, 文档 / 上記 / выше |
116
+ | 领域特异性 | 0.02 | 专业领域 | quantum, fpga / 量子 / 量子 / квантовый |
117
+ | 否定复杂度 | 0.01 | 否定约束 | don't, avoid / 不要, 避免 / しないで / избегать |
118
+
119
+ **评分逻辑**:
120
+ ```
121
+ 加权总分 = Σ(维度得分 × 权重)
122
+
123
+ 总分 < 0.0 → SIMPLE
124
+ 0.0 ~ 0.15 → MEDIUM
125
+ 0.15 ~ 0.25 → COMPLEX
126
+ ≥ 0.25 → REASONING
127
+
128
+ 特殊规则:2+ 个推理关键词命中 → 直接判定 REASONING
129
+ 架构设计信号(architecture/架构 + 分布式/消息队列/分片/容灾/QPS/多租户等)→ 直接判定 COMPLEX
130
+ 置信度 < 0.6 → 标记为「模糊」,回退到默认层级 (MEDIUM)
131
+ ```
132
+
133
+ ### 覆盖规则
134
+
135
+ - **大上下文** (>100k tokens) → 强制 COMPLEX
136
+ - **结构化输出** (system prompt 含 json/structured/schema) → 最低 MEDIUM
137
+ - **模糊判定** → 默认 MEDIUM
138
+
139
+ ## 配置
140
+
141
+ 在 `~/.openclaw/openclaw.json` 中配置插件:
142
+
143
+ ```json
144
+ {
145
+ "plugins": {
146
+ "entries": {
147
+ "clawzenmux": {
148
+ "config": {
149
+ "apiKey": "your-zenmux-api-key",
150
+ "routing": {
151
+ "tiers": {
152
+ "SIMPLE": {
153
+ "primary": "deepseek/deepseek-v3.2",
154
+ "fallback": ["google/gemini-2.5-flash"]
155
+ },
156
+ "MEDIUM": {
157
+ "primary": "google/gemini-3-flash-preview",
158
+ "fallback": ["deepseek/deepseek-v3.2"]
159
+ },
160
+ "COMPLEX": {
161
+ "primary": "anthropic/claude-sonnet-4.5",
162
+ "fallback": ["anthropic/claude-sonnet-4", "openai/gpt-4o"]
163
+ },
164
+ "REASONING": {
165
+ "primary": "deepseek/deepseek-v3.2-thinking",
166
+ "fallback": ["openai/gpt-5.2"]
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ }
174
+ }
175
+ ```
176
+
177
+ ### 配置项说明
178
+
179
+ | 参数 | 类型 | 默认值 | 说明 |
180
+ |------|------|--------|------|
181
+ | `apiKey` | string | — | ZenMux API Key,也可用环境变量 `ZENMUX_API_KEY` |
182
+ | `routing.tiers.{TIER}.primary` | string | 见上表 | 该层级的首选模型 |
183
+ | `routing.tiers.{TIER}.fallback` | string[] | 见上表 | 首选不可用时的备选模型 |
184
+
185
+ ## 动态模型同步
186
+
187
+ 插件启动时会调用 ZenMux `GET /v1/models` API 获取最新的模型列表和定价信息:
188
+
189
+ - 30 分钟缓存,避免频繁请求
190
+ - API 不可用时自动回退到内置静态模型目录
191
+ - 确保定价信息始终最新
192
+
193
+ ## 支持的模型
194
+
195
+ 通过 ZenMux 平台访问 90+ 模型,包括:
196
+
197
+ | 提供商 | 模型 |
198
+ |--------|------|
199
+ | **OpenAI** | GPT-5.2 Pro, GPT-5.2, GPT-5.1, GPT-5, GPT-5 Mini/Nano, GPT-4.1, o3, o4-mini, Codex |
200
+ | **Anthropic** | Claude Opus 4.6/4.5, Claude Sonnet 4.5/4, Claude Haiku 4.5 |
201
+ | **Google** | Gemini 3 Pro/Flash Preview, Gemini 2.5 Pro/Flash/Flash-Lite |
202
+ | **DeepSeek** | V3.2, V3.2 Thinking |
203
+ | **xAI** | Grok 4.1 Fast, Grok 4 Fast, Grok 3 |
204
+ | **阿里** | Qwen3-Max, Qwen3-Coder-Plus, Qwen3-VL-Plus |
205
+ | **智谱** | GLM 4.7, GLM 4.6 |
206
+ | **月之暗面** | Kimi K2 Thinking, Kimi K2.5 |
207
+ | **Mistral** | Mistral Large 3 |
208
+ | **百度** | ERNIE-5.0 Thinking Preview |
209
+ | **字节** | Doubao-Seed-Code |
210
+ | **小米** | MiMo-V2-Flash |
211
+
212
+ ## 项目结构
213
+
214
+ ```
215
+ src/
216
+ ├── index.ts # 插件入口,注册 provider,启动代理
217
+ ├── provider.ts # OpenClaw provider 定义
218
+ ├── proxy.ts # 本地 HTTP 代理服务器 (port 8403)
219
+ ├── models.ts # 内置模型目录(90+ 模型 + 定价)
220
+ ├── model-sync.ts # 动态模型同步(从 ZenMux API 拉取最新)
221
+ ├── auth.ts # API Key 解析(config / 文件 / 环境变量 / 向导)
222
+ ├── types.ts # OpenClaw 插件类型定义
223
+ ├── dedup.ts # 请求去重(防止超时重试导致重复计费)
224
+ ├── retry.ts # 指数退避重试(429/502/503/504)
225
+ ├── logger.ts # 使用日志(~/.openclaw/zenmux/logs/)
226
+ ├── errors.ts # 错误类型定义
227
+ └── router/
228
+ ├── index.ts # 路由入口(纯规则评分,同步)
229
+ ├── rules.ts # 规则引擎(14 维加权评分)
230
+ ├── selector.ts # 层级 → 模型选择 + 费用估算
231
+ ├── config.ts # 默认路由配置
232
+ └── types.ts # 路由类型定义
233
+ ```
234
+
235
+ ## 代理服务器特性
236
+
237
+ - **SSE 心跳**:流式请求立即返回 200 + 心跳包,防止 OpenClaw 10-15 秒超时
238
+ - **请求去重**:SHA-256 哈希请求体,30 秒 TTL 缓存,防止重试导致重复计费
239
+ - **重试机制**:429/502/503/504 自动指数退避重试,支持 Retry-After header
240
+ - **使用日志**:每次请求记录为 JSONL 行 (`~/.openclaw/zenmux/logs/usage-YYYY-MM-DD.jsonl`)
241
+
242
+ ## 费用节省示例
243
+
244
+ ```
245
+ "什么是量子计算?"(简单问题)
246
+ → 规则引擎: SIMPLE → deepseek/deepseek-v3.2
247
+ → 费用: $0.0003 vs Opus 4.6 $0.025 = 节省 98.8%
248
+
249
+ "帮我写一个 React 组件"(一般编码)
250
+ → 规则引擎: MEDIUM → google/gemini-3-flash-preview
251
+ → 费用: $0.0002 vs Opus 4.6 $0.025 = 节省 99.2%
252
+
253
+ "设计一个分布式消息队列的架构"(复杂任务)
254
+ → 规则引擎: COMPLEX → anthropic/claude-sonnet-4.5
255
+ → 费用: $0.045 vs Opus 4.6 $0.25 = 节省 82%
256
+
257
+ "证明 √2 是无理数"(推理)
258
+ → 规则引擎: REASONING → deepseek/deepseek-v3.2-thinking
259
+ → 费用: $0.0003 vs Opus 4.6 $0.25 = 节省 99.9%
260
+ ```
261
+
262
+ ## 开发
263
+
264
+ ```bash
265
+ # 安装依赖
266
+ npm install
267
+
268
+ # 开发模式(监听文件变化)
269
+ npm run dev
270
+
271
+ # 类型检查
272
+ npm run typecheck
273
+
274
+ # 构建
275
+ npm run build
276
+
277
+ # 输出: dist/index.js (~50KB, 零运行时依赖)
278
+ ```
279
+
280
+ ## 健康检查
281
+
282
+ 代理启动后可通过 HTTP 检查状态:
283
+
284
+ ```bash
285
+ curl http://localhost:8403/health
286
+ # {"status":"ok","provider":"zenmux","models":94}
287
+ ```
288
+
289
+ ## 作者
290
+
291
+ **WY** — [X / Twitter](https://x.com/akokoi1)
292
+
293
+ ## 许可证
294
+
295
+ MIT