{"id":"e898c666-887e-431a-85f2-540f1dd4f2cb","entityType":"agent","slug":"clawhub-fyniujin-cn-llm-router","name":"cn-llm-router","canonicalUrl":"https://www.xpersona.co/agent/clawhub-fyniujin-cn-llm-router","canonicalPath":"/agent/clawhub-fyniujin-cn-llm-router","generatedAt":"2026-10-10T10:45:14.230Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T05:58:32.888Z","emptyReason":null},"description":"国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。 Skill: cn-llm-router Owner: fyniujin Summary: 国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。 Tags: latest:2.7.0","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.6K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s177r8w7p1d7cpbys9bn33kwhs89d0xw:cn-llm-router","sourceUrl":"https://clawhub.ai/fyniujin/cn-llm-router","homepage":"https://clawhub.ai/fyniujin/skills/cn-llm-router","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/fyniujin/cn-llm-router","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/fyniujin/skills/cn-llm-router","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":64,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:58:32.888Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:58:32.888Z","emptyReason":null},"stars":null,"forks":null,"downloads":1635,"packageName":null,"latestVersion":"2.7.0","tractionLabel":"1.6K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:58:32.878Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T05:58:32.888Z","lastCrawledAt":"2026-10-10T05:58:32.878Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T05:58:32.878Z","lastVerifiedAt":null,"highlights":[{"version":"2.7.0","createdAt":"2026-10-09T12:12:03.292Z","changelog":"Version 2.7.0 – 价格档案与调价检测能力上线 - 新增本地模型价格档案（price-history），一键查看12家主流大模型基础价与采集日期 - 新增降价检测(price-check)，可比对主流厂商价目页哈希变化，提示疑似调价 - 报表(report)新增双轨价格统计：档案价估算 vs API 实测回填 - 代码结构优化，新增 price_registry.py、price_checker.py，移除 skill-card.md - 测试与说明文档同步更新","fileCount":45,"zipByteSize":122009},{"version":"2.6.0","createdAt":"2026-09-17T03:05:44.803Z","changelog":"**cn-llm-router 2.6.0 – 多轮会话及多功能增强版** - 新增多轮会话管理（session）：支持历史对话管理、自动上下文携带、对话历史压缩，SQLite 持久化 - 新增文本向量化（embed）与文档重排序（rerank）统一接口，自动路由至支持厂商 - 内置长文本自动切分与 map-reduce 摘要合并，支持处理超长文档 - 新增多模态 describe 命令，统一图片/视频/文档生成与内容路由 - Adapter 工程重构，embed/rerank/vision 接口统一抽象，OpenAI 端点扩展至 11 家（含 embed/rerank 支持） - 新增 scripts/session_manager.py（多轮会话）、scripts/text_splitter.py（长文切分）；移除 skill-card.md - 路由与成本报表功能细节增强，report","fileCount":42,"zipByteSize":113599},{"version":"2.5.0","createdAt":"2026-08-24T16:04:09.171Z","changelog":"**Core refactor: All main modules are now moved into the new _core/ directory, improving structure and maintainability.** - Major refactor: Scripts and adapters relocated from scripts/ to _core/ and _core/adapters/. - Added new internal modules for config, cache, cost tracking, health checks, version management, and simple YAML parsing in _core/. - Updated internal imports and references to accommodate the new file structure. - Removed legacy/duplicate documentation file (skill-card.md).","fileCount":40,"zipByteSize":102616},{"version":"2.4.0","createdAt":"2026-08-16T11:13:01.181Z","changelog":"cn-llm-router 2.4.0 - 增加视觉大模型路由：Qwen-VL、GLM-4V、豆包视觉，支持图片+文本多模态任务路由和识别。 - 统一入口支持 12 家国产文本大模型 + 3 家视觉模型。 - 路由器及任务分类能力覆盖图像识别多模态场景。 - 文档细节更新，进一步说明“图像/音频内容识别”能力。 - skill-card.md 文件移除，文档精简。","fileCount":27,"zipByteSize":76964},{"version":"2.3.0","createdAt":"2026-08-07T13:18:03.189Z","changelog":"Version 2.3.0 - Updated internal metadata and version identifiers to 2.3.0. - Documentation improvements in SKILL.md. - Removed the outdated skill-card.md file. - Codebase maintenance in scripts/cache.py, scripts/meta.py, and scripts/router.py.","fileCount":27,"zipByteSize":74770},{"version":"2.2.0","createdAt":"2026-08-01T10:17:52.561Z","changelog":"**2.2.0 主要更新：新增健康检查模块，提升稳定性和可维护性** - 新增 `scripts/health_check.py`，支持模型路由健康检查功能。 - 优化和修正 `cost_tracker.py`、`meta.py`、`router.py` 等，提高代码健壮性。 - 移除冗余文件 `skill-card.md`，精简存储结构。 - 更新文档（SKILL.md）与版本号，反映最新功能及结构变更。","fileCount":27,"zipByteSize":73487},{"version":"2.1.0","createdAt":"2026-07-24T08:10:50.703Z","changelog":"- 新增对 MiniMax、零一万物 Yi、百川智能、阶跃星辰 Step 等 4 家主流国产大模型支持，现已覆盖 12 家厂商、32 款模型。 - 路由策略升级，结合模型能力画像智能选型，更精细匹配任务类型和性能/价格。 - 流式输出更完善，支持更多厂商，适配逐字显示体验。 - 支持全链路离线 Mock 调试（无 Key、离线环境下也能验证路由与选择逻辑）。 - 配置与环境变量支持所有新增厂商，文档和示例全面更新。","fileCount":26,"zipByteSize":67830},{"version":"2.0.0","createdAt":"2026-07-16T06:59:53.529Z","changelog":"cn-llm-router 2.0.0 - 新增 mock_engine 和 mock_data 支持，便于开发与测试。 - 优化路由和元数据脚本，提升策略引擎的可扩展性与测试便捷性。 - 丰富并完善了路由主流程与相关单元测试。 - 清理旧文档 skill-card.md，保持文档结构精简。 - 更新版本号、使用说明和命令展示。","fileCount":26,"zipByteSize":65080}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s177r8w7p1d7cpbys9bn33kwhs89d0xw:cn-llm-router","setupComplexity":"low","setupSteps":["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.","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":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T10:45:14.226Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-fyniujin-cn-llm-router/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T05:58:32.888Z","emptyReason":null},"readme":"Skill: cn-llm-router\n\nOwner: fyniujin\n\nSummary: 国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。\n\nTags: latest:2.7.0\n\nVersion history:\n\nv2.7.0 | 2026-10-09T12:12:03.292Z | auto\n\nVersion 2.7.0 – 价格档案与调价检测能力上线\n\n- 新增本地模型价格档案（price-history），一键查看12家主流大模型基础价与采集日期\n- 新增降价检测(price-check)，可比对主流厂商价目页哈希变化，提示疑似调价\n- 报表(report)新增双轨价格统计：档案价估算 vs API 实测回填\n- 代码结构优化，新增 price_registry.py、price_checker.py，移除 skill-card.md\n- 测试与说明文档同步更新\n\nv2.6.0 | 2026-09-17T03:05:44.803Z | auto\n\n**cn-llm-router 2.6.0 – 多轮会话及多功能增强版**\n\n- 新增多轮会话管理（session）：支持历史对话管理、自动上下文携带、对话历史压缩，SQLite 持久化\n- 新增文本向量化（embed）与文档重排序（rerank）统一接口，自动路由至支持厂商\n- 内置长文本自动切分与 map-reduce 摘要合并，支持处理超长文档\n- 新增多模态 describe 命令，统一图片/视频/文档生成与内容路由\n- Adapter 工程重构，embed/rerank/vision 接口统一抽象，OpenAI 端点扩展至 11 家（含 embed/rerank 支持）\n- 新增 scripts/session_manager.py（多轮会话）、scripts/text_splitter.py（长文切分）；移除 skill-card.md\n- 路由与成本报表功能细节增强，report\n\nv2.5.0 | 2026-08-24T16:04:09.171Z | auto\n\n**Core refactor: All main modules are now moved into the new _core/ directory, improving structure and maintainability.**\n\n- Major refactor: Scripts and adapters relocated from scripts/ to _core/ and _core/adapters/.\n- Added new internal modules for config, cache, cost tracking, health checks, version management, and simple YAML parsing in _core/.\n- Updated internal imports and references to accommodate the new file structure.\n- Removed legacy/duplicate documentation file (skill-card.md).\n\nv2.4.0 | 2026-08-16T11:13:01.181Z | auto\n\ncn-llm-router 2.4.0\n\n- 增加视觉大模型路由：Qwen-VL、GLM-4V、豆包视觉，支持图片+文本多模态任务路由和识别。\n- 统一入口支持 12 家国产文本大模型 + 3 家视觉模型。\n- 路由器及任务分类能力覆盖图像识别多模态场景。\n- 文档细节更新，进一步说明“图像/音频内容识别”能力。\n- skill-card.md 文件移除，文档精简。\n\nv2.3.0 | 2026-08-07T13:18:03.189Z | auto\n\nVersion 2.3.0\n\n- Updated internal metadata and version identifiers to 2.3.0.\n- Documentation improvements in SKILL.md.\n- Removed the outdated skill-card.md file.\n- Codebase maintenance in scripts/cache.py, scripts/meta.py, and scripts/router.py.\n\nv2.2.0 | 2026-08-01T10:17:52.561Z | auto\n\n**2.2.0 主要更新：新增健康检查模块，提升稳定性和可维护性**\n\n- 新增 `scripts/health_check.py`，支持模型路由健康检查功能。\n- 优化和修正 `cost_tracker.py`、`meta.py`、`router.py` 等，提高代码健壮性。\n- 移除冗余文件 `skill-card.md`，精简存储结构。\n- 更新文档（SKILL.md）与版本号，反映最新功能及结构变更。\n\nv2.1.0 | 2026-07-24T08:10:50.703Z | auto\n\n- 新增对 MiniMax、零一万物 Yi、百川智能、阶跃星辰 Step 等 4 家主流国产大模型支持，现已覆盖 12 家厂商、32 款模型。\n- 路由策略升级，结合模型能力画像智能选型，更精细匹配任务类型和性能/价格。\n- 流式输出更完善，支持更多厂商，适配逐字显示体验。\n- 支持全链路离线 Mock 调试（无 Key、离线环境下也能验证路由与选择逻辑）。\n- 配置与环境变量支持所有新增厂商，文档和示例全面更新。\n\nv2.0.0 | 2026-07-16T06:59:53.529Z | auto\n\ncn-llm-router 2.0.0\n\n- 新增 mock_engine 和 mock_data 支持，便于开发与测试。\n- 优化路由和元数据脚本，提升策略引擎的可扩展性与测试便捷性。\n- 丰富并完善了路由主流程与相关单元测试。\n- 清理旧文档 skill-card.md，保持文档结构精简。\n- 更新版本号、使用说明和命令展示。\n\nv1.2.0 | 2026-07-10T11:02:30.702Z | auto\n\ncn-llm-router v1.2.0\n\n- Bump version to 1.2.0 in version metadata.\n- Documentation and usage guide in SKILL.md updated for the new release.\n\nv1.1.0 | 2026-07-10T08:57:20.996Z | auto\n\n**cn-llm-router v1.1.0 Changelog**\n\n- 增强语义缓存功能：新增长度惩罚机制，有效减少“误命中”情况，优化相似问句缓存准确率。\n- 统一 token 计数与费用估算：各厂商适配器（含流式模式）支持自动兜底 token 估算，流式方式下也能正确预估成本。\n- 测试用例升级：离线测试项增至21项，覆盖更多典型分支和路由策略，提升可靠性。\n- 文档更新：SKILL.md 增加了命令运行实际效果示例，以及语义缓存等新特性的详细提示，并对架构和常见问题做了补充说明。\n- 清理冗余文件：移除 skill-card.md，保持项目结构精简。\n\nv1.0.0 | 2026-07-09T08:05:31.288Z | auto\n\ncn-llm-router 1.0.0 首发版本\n\n- 提供一个命令行统一入口，整合 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火等 8 家国产大模型\n- 支持自动/手动路由，依据任务类型（代码/推理/长文/翻译/摘要/抽取）选择最适合、最省钱的模型\n- 自动统计跨厂商 token 成本，支持本地硬件自适应限流与本地语义缓存，节省 token 消耗\n- 全流程零依赖（除讯飞星火可选 websocket-client），纯 Python 实现，密钥仅通过环境变量读取\n- 附带成本报表、预算保护、配置管理、技能更新检查等实用功能\n- 全部功能（除实际 API 调用）可在无 Key/离线环境下运行\n\nArchive index:\n\nArchive v2.7.0: 45 files, 122009 bytes\n\nFiles: _core_lock.json (102b), _core/adapters/__init__.py (654b), _core/adapters/base.py (4413b), _core/adapters/ernie.py (5025b), _core/adapters/openai_compat.py (6245b), _core/adapters/spark.py (5542b), _core/cache.py (6959b), _core/calibrate.py (10185b), _core/config.py (3133b), _core/cost_tracker.py (7230b), _core/health_check.py (5920b), _core/version.json (230b), _core/yaml_simple.py (6501b), config.example.json (356b), references/mock_data.json (7517b), references/models.yaml (12265b), references/price_history.yaml (23b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (4413b), scripts/adapters/ernie.py (5025b), scripts/adapters/openai_compat.py (6306b), scripts/adapters/spark.py (5542b), scripts/cache.py (6959b), scripts/classifier.py (4601b), scripts/config.py (3133b), scripts/cost_tracker.py (8009b), scripts/hardware.py (3978b), scripts/health_check.py (5920b), scripts/meta.py (491b), scripts/mock_engine.py (13037b), scripts/price_checker.py (9461b), scripts/price_registry.py (3264b), scripts/report.py (6249b), scripts/router.py (54321b), scripts/session_manager.py (5226b), scripts/text_splitter.py (4045b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (2112b), SKILL.md (43679b), tests/test_router.py (31931b), version.json (421b), _meta.json (132b)\n\nFile v2.7.0:SKILL.md\n\n---\nname: cn-llm-router\ndescription: 国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。\nversion: 2.7.0\n---\n\n\n# 国产大模型统一路由（cn-llm-router）\n\n> 一个**核心零依赖（纯 Python 标准库，仅讯飞星火可选一个 `websocket-client`）、零密钥打包**的命令行工具，把 12 家国产大模型收敛成「一个入口、一套命令」。你只管说「我要干嘛」，它帮你挑模型、算成本、限并发、逐字流式输出；断网或无 Key 时也能演示路由逻辑。\n\n## 一、30 秒速查\n\n```bash\n# 不配任何密钥，先看「路由建议」（演示/规划用，不发起调用）\npython scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n\n# 配好密钥后，真正调用（默认 auto 策略 = 任务感知选模型）\nexport DEEPSEEK_API_KEY=sk-xxx          # 至少一个厂商即可\npython scripts/router.py chat --prompt \"解释一下快速排序\" --model auto\n\n# 看这台电脑的硬件画像与建议并发（不拖累电脑的关键）\npython scripts/router.py hardware\n```\n\n**运行效果示例：**\n\n```\n$ python scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n╔══════════════════════════════════════════════════╗\n║         路由建议模式（未配置 API Key）             ║\n║  以下为推荐方案，不发起实际调用。配 Key 后可真跑。 ║\n╚══════════════════════════════════════════════════╝\n\n任务分类: code | 推理需求: True | 长度: short | 预算敏感: False\n推荐策略(auto): deepseek/deepseek-reasoner\n  └─ 理由: 代码生成+强推理, 性价比最优\n\n备选(cheap): deepseek/deepseek-chat        ¥0.0001/千tokens\n备选(quality): glm/glm-4                   ¥0.0010/千tokens\n\n提示: export DEEPSEEK_API_KEY=sk-xxx 即可调用\n```\n\n```\n$ python scripts/router.py hardware\n╔═══════════════ 硬件画像 ═══════════════╗\n│ CPU 逻辑核心:   8 核                    │\n│ 物理内存:       15.9 GB                 │\n│ 硬件档位:       mid                     │\n│ 建议最大并发:    2                       │\n│ 建议单批大小:    8                       │\n╚═══════════════════════════════════════╝\n```\n\n- 支持厂商（12 家 · 32 款模型）：DeepSeek、阿里通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川智能、阶跃星辰 Step。\n- 运行要求：Python 3.8+；**11 家厂商（DeepSeek/通义/智谱/Kimi/混元/豆包/文心/MiniMax/Yi/百川/阶跃）与全部离线功能无需安装任何第三方包**；讯飞星火为可选 `websocket-client`（不装也能用其余 11 家，仅星火调用时给出中文安装指引）。\n- 密钥来源：只用**环境变量**，绝不明文落盘、绝不打包进 skill。\n\n## 二、架构\n\n```\ncn-llm-router/\n├── SKILL.md                  # 本文件（使用说明 + 风险 + 边界 + FAQ + 反模式）\n├── version.json              # 版本号（更新提醒比对用）\n├── config.example.json       # 配置模板（无密钥，复制后改）\n├── references/\n│   ├── models.yaml           # 模型注册表（纯数据，可自助增删厂商）\n│   └── routing-rules.md      # 路由策略规则说明\n├── scripts/\n│   ├── router.py             # 统一 CLI 入口 + 策略引擎（对外只暴露这一个文件）\n│   ├── classifier.py         # 任务分类器（规则 + 关键词，离线）\n│   ├── config.py             # 配置/密钥读取（仅读环境变量）\n│   ├── cost_tracker.py       # 跨厂商成本聚合（SQLite，本地）\n│   ├── hardware.py           # 硬件画像 + 并发/子任务数自适应\n│   ├── cache.py              # 本地语义缓存（降 token 消耗，含长度惩罚防误命中）\n│   ├── report.py             # 文本/HTML 成本报表 + 预算告警\n│   ├── update_check.py       # 更新提醒（可离线，失败静默）\n│   ├── yaml_simple.py        # 自研零依赖 YAML 解析（不引入 PyYAML）\n│   ├── meta.py               # 版本常量\n│   ├── session_manager.py    # 多轮会话管理（SQLite 对话表 + 历史压缩）\n│   ├── text_splitter.py      # 长文切分（段落→句子→硬切 3 级回退）+ map-reduce\n│   ├── price_registry.py     # 价格档案本地化（v2.7.0 新增）\n│   ├── price_checker.py      # 降价检测（v2.7.0 新增）\n│   └── adapters/             # 各厂商适配器（统一接口）\n│       ├── base.py           # AdapterBase + 中文异常 + token 估算工具 + embed/rerank 接口\n│       ├── openai_compat.py  # OpenAI 兼容端点（11 家通用，流式带兜底估算 + embed/rerank）\n│       ├── ernie.py          # 文心大模型（兼容 + 原生双通道，流式估算）\n│       └── spark.py          # 讯飞星火（WebSocket 签名，可选 websocket-client 做传输）\n└── tests/\n    └── test_router.py        # 离线测试（21 项，无需密钥）\n```\n\n核心数据流：`prompt → classifier → 策略引擎(resolve) → adapter → 大模型`，同时旁路写入 `cost_tracker`（成本）与 `cache`（命中则跳过调用）。\n\n## 三、能做哪些（功能清单）\n\n| 功能 | 命令 | 说明 |\n|------|------|------|\n| 智能路由 | `route` | 按任务自动选模型；`--strategy auto/cheap/quality/manual`；无 Key 进「建议模式」只展示不调用 |\n| 统一调用 | `chat` | 单入口对话，自动统计成本；支持流式、系统提示词、JSON 输出、`--session` 多轮会话 |\n| Embedding | `embed` | 文本向量化统一接口；`--json` 输出；自动选支持 embedding 的厂商 |\n| Rerank | `rerank` | 文档重排序统一接口；`--json` 输出；按厂商差异封装 auth/request |\n| 多轮会话 | `session` | 会话管理（list/show/delete）；SQLite 持久化，支持上下文自动携带与模型切换 |\n| 长文/RAG | 内置 | 超长输入自动语义切分 + map-reduce 摘要合并，支持 100k 字符文档 |\n| 多模态描述 | `describe` | 图片/视频/文档统一路由；视频走 ffmpeg 关键帧 + vision 模型，文档走长文本模型 |\n| 价格档案 | `price-history` | v2.7.0 查看 12 厂商主力模型基准价 + 采集日期 |\n| 降价检测 | `price-check` | v2.7.0 轻量抓取厂商价目页做哈希比对，变化时提示疑似调价 |\n| 任务分类 | 内置 | 识别 code/reason/summarize/translate/extract 等，驱动路由 |\n| 成本统计 | `report` | 日/周/月报，跨厂商聚合花费、成功率、P95 延迟；measured/estimated 双列；v2.7.0 双轨计算（档案价估算 vs 实测回填） |\n| 预算保护 | `budget` | 月预算阈值告警，可选推企业微信 |\n| 硬件自适应 | `hardware` | 探测 CPU/内存，自动限制最大并发与单批大小，**不拖累电脑** |\n| 语义缓存 | `cache` | 相似问题命中本地缓存，跳过 API 调用，省 token 省钱（v1.1.0 加长度惩罚减少误命中） |\n| 更新提醒 | `update-check` | 比对 version.json，提示升级（联网失败静默，不阻塞） |\n| 配置查看 | `config` | 列出已配置厂商与环境变量提示 |\n\n**全部命令均可离线运行**（除真正发起 `chat` 调用时），`route/hardware/report/cache/config/update-check/version` 都不需要网络或密钥。\n\n## 四、安装与配置\n\n### 4.1 运行环境\n- Python 3.8+（Windows / macOS / Linux 均可）。\n- **除讯飞星火的可选 `websocket-client` 外，无需 `pip install` 任何依赖**；其余 11 家与全部离线功能均用标准库实现，讯飞星火签名（hmac/hashlib/base64）也自研，仅 WS 传输用可选客户端。\n\n### 4.2 配置密钥（只用环境变量，三种任选其一）\n```bash\n# 方式 A：临时（当前终端）\nexport DEEPSEEK_API_KEY=sk-xxx\nexport DASHSCOPE_API_KEY=sk-xxx        # 通义千问\nexport ZHIPU_API_KEY=sk-xxx            # 智谱\nexport MOONSHOT_API_KEY=sk-xxx         # Kimi\nexport HUNYUAN_API_KEY=sk-xxx          # 腾讯混元\nexport ARK_API_KEY=sk-xxx              # 字节豆包\nexport ERNIE_OPENAI_KEY=sk-xxx         # 文心（OpenAI 兼容端点，推荐）\n# 或文心原生：ERNIE_API_KEY=xxx  +  ERNIE_SECRET_KEY=xxx\nexport SPARK_APP_ID=xxx SPARK_API_KEY=xxx SPARK_API_SECRET=xxx  # 讯飞星火\nexport MINIMAX_API_KEY=sk-xxx          # MiniMax（abab 系列）\nexport YI_API_KEY=sk-xxx               # 零一万物 Yi\nexport BAICHUAN_API_KEY=sk-xxx         # 百川智能\nexport STEP_API_KEY=sk-xxx             # 阶跃星辰 Step\n\n# 方式 B：写进 shell 配置文件（~/.bashrc / ~/.zshrc）后 source 生效\n# 方式 C：Windows PowerShell\n$env:DEEPSEEK_API_KEY=\"sk-xxx\"\n```\n> 仅需配置你**实际要用的那一家**即可，`route` 与 `chat` 会自动只用已配置的厂商做决策。\n\n### 4.3 可选配置文件\n把 `config.example.json` 复制为 `config.json`（或 `~/.cn_llm_router_config.json`），可设月预算、更新地址、企微告警 webhook、缓存 TTL 等。**该文件不含任何密钥**。\n\n## 五、命令参考 + 运行效果示例\n\n> ⭐ **以下是每条命令的实际运行效果**，让你确认自己用对了。\n\n### 5.1 route — 路由决策（不调用 API，离线可用）\n\n```bash\n# 自动策略（根据任务类型选最合适模型）\npython scripts/router.py route --prompt \"用 Python 写个快排\"\n\n# 指定任务类型\npython scripts/router.py route --prompt \"翻译这段话到英文\" --task translate\n\n# 最省钱策略\npython scripts/router.py route --prompt \"总结这篇文章\" --strategy cheap\n\n# 最高质量策略\npython scripts/router.py route --prompt \"证明哥德巴赫猜想\" --strategy quality\n\n# 手动指定模型（跳过自动选择）\npython scripts/router.py route --prompt \"随便聊聊\" --model deepseek:deepseek-chat\n\n# JSON 格式输出（给程序调用）\npython scripts/router.py route --prompt \"分析数据\" --json\n```\n\n**auto 策略运行效果（有 Key 时）：**\n```\n$ python scripts/router.py route --prompt \"帮我写个 REST API\" --task code\n╔════════════════════════════════════════╗\n║           路由决策结果                  ║\n╚════════════════════════════════════════╝\n策略: auto | 任务: code | 推理: True\n┌────────┬─────────────────────┬────────┬──────────┐\n│ 选择   │ 模型                 │ 厂商   │ 价格     │\n├────────┼─────────────────────┼────────┼──────────┤\n│ ★ auto │ deepseek-reasoner   │ DeepSeek│ ¥0.002/千│\n│ cheap  │ deepseek-chat       │ DeepSeek│ ¥0.0001/千│\n│ quality│ glm-4               │ 智谱 GLM│ ¥0.001/千│\n└────────┴─────────────────────┴────────┴──────────┘\n最终选择: deepseek/deepseek-reasoner\n```\n\n**cheap 策略运行效果：**\n```\n$ python scripts/router.py route --prompt \"翻译 hello\" --strategy cheap\n策略: cheap | 最终选择: deepseek/deepseek-chat（¥0.0001/千tokens，最便宜）\n```\n\n**manual 模式运行效果：**\n```\n$ python scripts/router.py route --prompt \"hi\" --model deepseek:deepseek-chat\n策略: manual | 用户指定: deepseek:deepseek-chat\n```\n\n**JSON 输出效果：**\n```json\n{\"strategy\":\"manual\",\"provider\":\"deepseek\",\"model\":\"deepseek-chat\",\"classification\":{\"task_type\":\"chat\"...}}\n```\n\n### 5.2 chat — 统一调用（需配 Key）\n\n```bash\n# 基础对话（auto 策略自动选模型）\npython scripts/router.py chat --prompt \"解释一下量子计算\"\n\n# 流式输出（逐字显示，适合长回答）\npython scripts/router.py chat --prompt \"写一篇500字的AI发展报告\" --stream\n\n# 带系统提示词\npython scripts/router.py chat --prompt \"翻译以下内容\" --system \"你是专业翻译\"\n\n# 禁用缓存（强制每次都调 API）\npython scripts/router.py chat --prompt \"最新天气\" --no-cache\n\n# JSON 结构化输出\npython scripts/router.py chat --prompt \"1+1等于几\" --json\n\n# 手动指定模型\npython scripts/router.py chat --prompt \"你好\" --model qwen:qwen-plus\n\n# 设超时时间（秒）\npython scripts/router.py chat --prompt \"长问题...\" --timeout 120\n```\n\n**chat 运行效果（非流式）：**\n```\n$ python scripts/router.py chat --prompt \"1+1等于几\" --model auto\n[路由] 选择: deepseek/deepseek-chat (auto)\n[调用] deepseek/deepseek-chat ...\n[完成] 1 + 1 = 2\n━━━ 成本 ━━━\n输入 tokens: 12    输出 tokens: 8    预估费用: ¥0.000002\n```\n\n**chat 运行效果（流式）：**\n```\n$ python scripts/router.py chat --prompt \"介绍Python\" --stream --model auto\n[路由] 选择: deepseek/deepseek-chat (auto)\n[调用] deepseek/deepseek-chat (流式)...\nPython 是一门高级编程语言，由 Guido van Rossum 于 1991 年发布。\n它以简洁明了的语法著称，广泛用于 Web 开发、数据分析、人工智能等领域。\n...\n[流式结束] 输入 tokens: ~15(估)  输出 tokens: ~85(估)  费用: ¥0.000010\n```\n> 💡 **流式模式下 token 数标注 `(估)` 表示该数值来自文本估算（部分厂商流式不返回精确 usage），非精确账单。精确用量以厂商控制台为准。\n\n**无 Key 时的友好报错：**\n```\n$ python scripts/router.py chat --prompt \"hi\"\n❌ 当前未检测到任何已配置的厂商 API Key。\n请至少设置一个环境变量，例如：\n  export DEEPSEEK_API_KEY=sk-xxx\n然后运行 python scripts/router.py config 查看当前配置状态。\n```\n\n### 5.3 report — 成本报表\n\n```bash\n# 本月报表（文本格式）\npython scripts/router.py report --period month\n\n# 导出 HTML 报表\npython scripts/router.py report --period month --html cost_report.html\n\n# 今日报表\npython scripts/router.py report --period day\n\n# 本周报表\npython scripts/router.py report --period week\n```\n\n**文本报表效果：**\n```\n$ python scripts/router.py report --period month\n╔══════════════ 2026-07 月度成本报表 ══════════════╗\n│ 统计周期: 2026-07-01 ~ 2026-07-10                  │\n│ 总调用次数: 42                                     │\n│ 总花费:     ¥0.0321                                │\n│ 成功率:     97.6%                                  │\n│ P95 延迟:   1,230 ms                               │\n├───────────────────────────────────────────────────┤\n│ 厂商           │ 花费      │ 调用 │ 输入tok │ 输出tok │\n│ deepseek       │ ¥0.0210  │ 28   │ 12,400  │ 8,200   │\n│ glm            │ ¥0.0111  │ 14   │ 6,800   │ 4,100   │\n╚═══════════════════════════════════════════════════╝\n```\n\n### 5.4 budget — 预算检查\n\n```bash\npython scripts/router.py budget\n```\n\n**运行效果：**\n```\n$ python scripts/router.py budget\n╔═══════════════ 预算检查 ═══════════════╗\n│ 本月已花费:  ¥0.0321                    │\n│ 月预算上限:  ¥50.00                     │\n│ 剩余额度:    ¥49.9679 (99.9%)           │\n│ 状态:        ✅ 安全                     │\n╚═══════════════════════════════════════╝\n```\n\n### 5.5 cache — 缓存管理\n\n```bash\n# 查看缓存条目\npython scripts/router.py cache stats\n\n# 清空缓存\npython scripts/router.py cache clear\n```\n\n**运行效果：**\n```\n$ python scripts/router.py cache stats\n缓存路径: C:\\Users\\你的用户名\\.cn_llm_router\\cache.db\n缓存条目: 15 条\n模糊匹配阈值: 0.80（最短查询长度: 8 字符，含长度惩罚）\n\n$ python scripts/router.py cache clear\n已清空 15 条缓存记录\n```\n\n### 5.6 config — 查看配置\n\n```bash\npython scripts/router.py config\n```\n\n**运行效果（未配 Key 时）：**\n```\n$ python scripts/router.py config\n╔══════════════ 当前配置 ═══════════════╝\n│ 已配置厂商: 无                          │\n│                                              │\n│ 可用环境变量:                                │\n│   DEEPSEEK_API_KEY        — DeepSeek        │\n│   DASHSCOPE_API_KEY       — 通义千问         │\n│   ZHIPU_API_KEY           — 智谱 GLM         │\n│   MOONSHOT_API_KEY        — Kimi (月之暗面)  │\n│   HUNYUAN_API_KEY         — 腾讯混元         │\n│   ARK_API_KEY             — 字节豆包         │\n│   ERNIE_OPENAI_KEY        — 百度文心(推荐)   │\n│   SPARK_APP_ID + _API_KEY + _API_SECRET — 讯飞│\n│   MINIMAX_API_KEY         — MiniMax         │\n│   YI_API_KEY              — 零一万物 Yi      │\n│   BAICHUAN_API_KEY        — 百川智能         │\n│   STEP_API_KEY            — 阶跃星辰 Step    │\n╚══════════════════════════════════════════════╝\n```\n\n### 5.7 update-check / version — 更新与版本\n\n```bash\npython scripts/router.py update-check\npython scripts/router.py version\n```\n\n**运行效果：**\n```\n$ python scripts/router.py version\ncn-llm-router v2.2.0 | 作者: njskills@agent.qq.com\n主页: https://skillhub.cn/skill/cn-llm-router\n\n$ python scripts/router.py update-check\n✅ 已是最新版本 v2.2.0\n```\n\n> Windows 用户把 `python` 换成 `python.exe` 或 `py`；PowerShell 里环境变量用 `$env:XXX=\"...\"`。\n\n## 五（B）、能力画像智能选型（v2.1）\n\n`references/models.yaml` 里每个模型都带三项**能力画像**（0-10 的本地静态经验值，不联网、不打分服务）：\n\n| 字段 | 含义 | auto 策略如何用 |\n|------|------|----------------|\n| `reason_score` | 推理能力 | 推理类任务选此项最高者 |\n| `code_score` | 代码能力 | 代码类任务选此项最高者 |\n| `long_score` | 长文能力 | 长文任务在超长上下文中选此项最高者 |\n\n`auto` 策略决策链：**需推理 → 优先 reasoner 且推理画像最强；长文 → ≥128k 上下文且长文画像最强；代码 → 代码画像最强（同分选更便宜）；价格敏感 → 最便宜；常规 → 均衡默认**。\n\n> 好处：新增厂商只要在 `models.yaml` 填好画像，就会被 `auto` 自动纳入选型，**无需改任何代码**。v2.1 新增的 MiniMax / 零一万物 Yi / 百川 / 阶跃 Step 正是如此接入。画像为经验参考值，追求极致效果请用 `--strategy quality` 或 `--model 厂商:模型` 手动指定。\n\n## 六、硬件自适应（不拖累电脑）\n\n`hardware.py` 在**首次运行/每次运行**时自动探测本机：\n- CPU 逻辑核心数、物理内存总量；\n- 据此分级：`low`（≤4 核或 ≤8GB）→ `mid` → `high`（≥8 核且 ≥16GB）；**内存探测失败时保守回退 low 档**；\n- 自动推导 `max_concurrency`（最大并发，默认 low=1 / mid=2 / high=4）与 `batch_size`（单批大小）；\n- 提供 `recommend_subtasks(total)` 把大任务拆成「不超过并发数」的子任务，**避免一次性铺满 CPU/内存**。\n\n调用方应读取 `hardware.profile()` 的结果来约束自己的并发与批处理，做到「自适应，不抢占用户资源」。语义缓存进一步减少重复 API 调用，间接降低本机网络与等待开销。\n\n## 六（B）、v2.0 全链路离线 Mock 模式（开发者调试利器）\n\n> 🔧 **核心能力**：无网络/无密钥也能跑通 `chat → report → budget → cache` 完整流程。\n\n### 6B.1 快速体验\n\n```bash\n# 基础 mock：不调 API，从本地预设库返回\npython scripts/router.py chat --prompt \"用 Python 写个快排\" --mock\n\n# 带延迟的 mock：模拟 2 秒网络延迟\npython scripts/router.py chat --prompt \"翻译这段话\" --mock --latency 2000\n\n# 流式 mock：逐字输出模拟真实流式体验\npython scripts/router.py chat --prompt \"写个故事\" --mock --stream --latency 500\n\n# JSON 格式输出（供程序调用）\npython scripts/router.py chat --prompt \"分析数据\" --mock --json\n```\n\n**Mock 模式运行效果：**\n```\n$ python scripts/router.py chat --prompt \"用 Python 写个快排\" --mock\n🤖 [Mock / preset] Mock 模式（离线调试，不调用真实 API）\n\n以下是 Python 快速排序的实现：\n\n```python\ndef quick_sort(arr):\n    if len(arr) <= 1:\n        return arr\n    pivot = arr[len(arr) // 2]\n    left = [x for x in arr if x < pivot]\n    middle = [x for x in arr if x == pivot]\n    right = [x for x in arr if x > pivot]\n    return quick_sort(left) + middle + quick_sort(right)\n```\n\n────────── 用量 ──────────\n  token: 入 45 / 出 180 ｜ 花费 ¥0.000000（Mock 免费）｜ 耗时 0ms\n```\n\n### 6B.2 预设场景库（12 个常见场景）\n\nMock 数据完全本地（`references/mock_data.json`），覆盖以下场景：\n\n| 场景 ID | 任务类型 | 匹配关键词 | 响应内容 |\n|---------|----------|-----------|---------|\n| code_quick_sort | code | 排序/sort/快排/算法/python | Python 快排实现代码 |\n| reason_math_proof | reason | 证明/推导/定理/数学 | 勾股定理欧几里得证明 |\n| translate_zh_en | translate | 翻译/translate/英文 | 中英翻译文本 |\n| summarize_long | summarize | 总结/概括/摘要 | 文档核心要点（5 条） |\n| extract_info | extract | 提取/抽取/实体 | 结构化实体 JSON |\n| chat_greeting | chat | 你好/hello/hi/在吗 | AI 助手自我介绍 |\n| code_debug | code | bug/报错/debug/修复 | 调试建议 + 修复方案 |\n| long_context_analysis | chat | 分析/解读/对比/评估 | 综合分析报告 |\n| data_analysis | extract | 数据/报表/趋势/统计 | 数据表格 + 洞察 |\n| creative_writing | chat | 写/创作/故事/文案 | 小说片段 |\n| general_qa | chat | 是什么/为什么/怎么 | 通用问答模板 |\n| fallback | chat | （无匹配时兜底） | 通用兜底响应 |\n\n### 6B.3 网络自动检测与熔断\n\n启动时自动检测各厂商 API 可达性：\n- **所有厂商不可达** → 自动进入 Mock 模式，提示「网络不可用，已自动切换至 Mock 模式」\n- **部分厂商不可达** → 仅熔断不可达厂商，不切换 Mock\n- **性能优化**：检测结果缓存 60 秒，正常模式启动额外开销 <50ms\n\n### 6B.4 交互式 Mock 数据编辑器\n\n```bash\n# 进入交互式编辑\npython scripts/router.py mock --edit\n\n# 列出所有自定义 mock 场景\npython scripts/router.py mock --list\n```\n\n编辑器支持：\n- 添加自定义 mock 场景（ID / 任务类型 / 关键词 / 优先级 / 响应内容 / token 数）\n- 删除已有场景\n- 实时测试 query 匹配效果\n\n自定义 mock 存储在本地 SQLite（`~/.cn_llm_router/mock.db`），优先级高于预设库。\n\n### 6B.5 Mock 回归测试\n\n```bash\n# 运行 mock 专项测试（无需网络+无需密钥）\npython scripts/router.py test --mock\n```\n\n覆盖 10 项 mock 专项测试：\n1. Mock 基础响应（code 类型）\n2. Mock 翻译场景\n3. Mock 推理场景\n4. Mock 缓存命中\n5. Mock 缓存未命中\n6. Mock 延迟模拟\n7. Mock 流式输出\n8. Mock JSON 输出\n9. Mock 自定义场景\n10. Mock 兜底场景\n\n### 6B.6 定位边界（严守死规则#8）\n\n| 不做 | 原因 |\n|------|------|\n| ❌ 本地模型推理 | Mock 只返回预设文本，不调本地模型 |\n| ❌ Mock 数据云同步 | 数据完全本地（JSON + SQLite） |\n| ❌ 生产环境 mock | Mock 模式仅限开发调试，生产强制禁用 |\n| ❌ 替代真实测试 | Mock 用于开发调试，真实测试仍需联网 |\n\n\n\n1. **密钥仅在内存中读取，从环境变量获取**；本技能**不写入、不读取、不打包任何 `.env` 或密钥文件**。请自行保管好环境变量与终端历史。\n2. **网络调用只发往各厂商官方 API 域名**（见 `references/models.yaml` 的 `base_url`），不会发往任何第三方。文心/星火签名在本地完成。\n3. **成本数据库与缓存为本地 SQLite 文件**（默认在用户目录，如 `~/.cn_llm_router/`），不上传、不含密钥，可随时 `cache clear` 删除。\n4. **更新检查联网失败会静默跳过**，不会因此报错阻塞你的工作；更新地址默认指向 SkillHub，可在 `config.json` 改为你信任的地址。\n5. **本技能不含任何可执行二进制 / 脚本类风险文件**（无 `.exe/.ps1/.bat/.sh/.vbs` 等），纯 `.py` 源码 + 文档 + 数据，可被只读审查。\n6. **不收集任何个人隐私数据**：prompt 内容仅用于本地分类与缓存，默认不上报；如需成本聚合请自行管理本地数据库。\n7. **语义缓存在本地做模糊匹配**（v1.1.0 加入长度惩罚机制），理论上不同问题可能被判定为「相似」而误命中缓存。关键场景（如生产环境、金融计算）建议加 `--no-cache` 关闭缓存，确保每次都是实时结果。\n\n> 依赖风险：除讯飞星火的可选 `websocket-client` 外，本技能无任何强制第三方依赖（自研 YAML 解析、自研 WebSocket 签名），不存在供应链投毒面；不装该包时，星火调用会给出中文安装指引，不影响其余 11 家与全部离线功能。\n\n## 八、能力边界（明确不做）\n\n- ❌ 不托管、不代理、不存储你的厂商 API Key；密钥由你自己的环境变量负责。\n- ❌ 不保证各厂商 API 的可用性、速率限制、内容合规——这些由各厂商侧决定，失败会返回中文报错（见下）。\n- ❌ 不实现微调/训练/向量库/RAG 管线，这是一个「路由 + 成本 + 限流」层，不是 Agent 框架。\n- ❌ 模型实际效果取决于厂商版本与配额；本技能的「最优模型」是基于**注册表里的价格/上下文/推理能力标签**的启发式推荐，非实时基准测试。\n- ❌ 语义缓存为本地模糊匹配（含长度惩罚的相似度阈值），可能误命中或漏命中，关键场景请用 `--no-cache`。\n- ❌ 跨厂商价格随官方调整而变化，`references/models.yaml` 中的 `price_*` 是示例值，请以官方最新定价为准。\n- ❌ 流式输出的 token 计数为**估算值**（基于中英文混合字符规则），非厂商精确计费值；精确用量请以各厂商控制台账单为准。\n\n## 九、反模式（这些用法是错的，不要这样做）\n\n> ⚠️ 以下是用户最容易踩的坑，逐一列出供你避开。\n\n| 反模式 | 为什么错 | 正确做法 |\n|--------|----------|----------|\n| 在 `.env` 文件里放 Key 再让脚本去读 | 本技能**刻意不读** `.env` 文件，写了也不会生效 | 只用环境变量：`export DEEPSEEK_API_KEY=sk-xxx` |\n| 用 `chat` 调用前不先跑 `route` 确认 | 可能选到不合适的模型浪费钱 | 先 `route --prompt \"...\"` 看推荐，再用 `chat` 执行 |\n| 对「翻译一段新闻」这种长文本用 `--prompt` 直接传 | 命令行参数长度有限制，超长文本会被截断 | 把长文本写入文件，通过管道或未来版本的多模态接口传入 |\n| 在低配机器（≤4核≤8GB）上设高并发 | `hardware` 会限制并发，但手动绕过会卡死电脑 | 相信 `hardware` 的自动限制，不要手动改 `max_concurrency` |\n| 把 `config.json` 当密钥存储 | 该文件**不应包含**任何 Key | 只存 budget/update_url/webhook 等非敏感配置 |\n| 忽略 `--no-cache` 在关键场景的使用 | 模糊缓存可能对「类似但不同」的问题返回旧答案 | 金融计算、代码生成、实时信息查询务必加 `--no-cache` |\n| 混淆 `--strategy quality` 和 `--model auto` | `quality` 固定选最贵最强的模型；`auto` 会根据任务类型智能匹配 | 日常用 `auto`；只有对质量要求极高且不在乎费用时才用 `quality` |\n| 期望流式 token 统计精确到个位 | 流式模式下多数厂商不返回逐块 usage | 流式 token 数标注 `(估)`，精确账单看厂商后台 |\n\n## 十、中文报错指引（常见问题 → 怎么办）\n\n| 现象 / 报错 | 原因 | 解决 |\n|------------|------|------|\n| `当前未检测到任何厂商 API Key...` | 没设环境变量 | 按第四节 `export` 至少一家；或先 `route` 看建议 |\n| `调用失败：HTTP 401` | Key 错误/过期 | 重新生成厂商 Key 并刷新环境变量 |\n| `调用失败：HTTP 429` | 触发厂商限速 | 降低并发（见 `hardware`），或换策略/厂商 |\n| `调用失败：HTTP 404` | 模型名不匹配 | 检查 `references/models.yaml` 中该厂商 `models[].name` |\n| `调用失败：timed out` | 网络慢/超时 | 加大 `--timeout`（秒），或重试 |\n| `未找到模型: xxx` | manual 指定模型不存在 | 用 `route --model provider:model` 时确认名称 |\n| `解析注册表失败` | models.yaml 被改坏 | 用 `git diff` 还原或重新拉取技能 |\n| `更新检查失败` | 无网络 | 正常，静默跳过；不影响使用 |\n| `讯飞星火需要可选依赖 websocket-client` | 未安装星火的 WS 库 | `pip install websocket-client`，或不使用星火改用其他 11 家 |\n| `流式读取中断` | 网络中途断开 | 重试即可；已内置重试机制（最多 2 次，指数退避） |\n\n所有报错均为中文，且 `chat`/`route` 异常会被捕获后以 `❌ ...` 友好提示退出（**不会抛 Python traceback**）。\n\n## 十一、FAQ\n\n**Q1：一定要配 Key 才能用吗？**\n不一定。`route`（建议模式）、`hardware`、`report`、`cache`、`update-check`、`version` 都**不需要 Key**，可纯离线体验路由逻辑与硬件画像。只有 `chat`（真正调用大模型）才需要至少一个厂商的 Key。\n\n**Q2：怎么新增一个厂商？**\n编辑 `references/models.yaml`，加一段 `providers.<新厂商>`（填 `adapter`/`base_url`/`env_hint`/`models`），并给每个模型补能力画像 `reason_score`/`code_score`/`long_score`（0-10）；若该厂商走 OpenAI 兼容协议则**无需写任何代码**（v2.1 新增的 MiniMax/Yi/百川/阶跃就是这样接入的）；非兼容协议在 `scripts/adapters/` 加一个适配器即可，路由逻辑零改动。补了能力画像后，`auto` 策略会自动把该厂商纳入智能选型。\n\n**Q3：成本统计准吗？**\n非流式调用：计费公式透明（`compute_cost(price, in, out)`），精度取决于厂商返回的 `usage` 字段，通常准确。流式输出：**token 数为估算值**（基于中文字≈1.5 tok/字、英文词≈1.3 tok/词的混合规则），标注 `(估)`，仅供参考，**不作为精确账单**。精确用量以各厂商控制台为准。\n\n**Q4：会拖慢我的电脑吗？**\n不会。`hardware` 自动限制并发与批大小（内存探测失败时回退最低档）；调用是网络 I/O 密集型，不占 CPU；缓存减少重复调用。即使在树莓派级别的设备上也能安全运行。\n\n**Q5：我的对话会被上传吗？**\n不会。prompt 只在本地做分类与缓存，默认不上传任何服务器；成本库与缓存在你本地目录（`~/.cn_llm_router/`）。唯一联网行为是调用厂商 API（你主动发的请求）和可选的版本更新检查。\n\n**Q6：支持流式吗？**\n支持，`chat --stream`；所有 12 家厂商均可流式输出，内容逐字生成、无需等待全部完成。分类器会判断任务是否适合流式（`stream_friendly` 字段：对话/翻译/代码/摘要适合流式；数学推理/结构化抽取建议一次性返回，避免半截思维链误导）。注意流式下 token 为估算值（见 Q3）。\n\n**Q7：缓存会不会返回错误答案？（误命中问题）**\n有可能，但概率很低。v1.1.0 引入了三层防护：\n1. **最短查询限制**：不足 8 字符的 query 不做模糊匹配；\n2. **长度惩罚系数**：两句话长度差异越大，相似度得分越低；\n3. **高阈值门槛**：调整后相似度仍需 ≥ 0.80 才命中。\n关键场景（金融、代码、实时信息）建议加 `--no-cache` 关闭缓存。\n\n**Q8：哪个厂商最便宜？**\n以 `references/models.yaml` 示例价格参考（实际以官方为准）：DeepSeek Chat 通常最便宜（¥0.0001/千 tokens），适合日常对话和简单任务。复杂推理建议用 DeepSeek Reasoner 或 GLM-4。可通过 `route --strategy cheap` 实时查看当前最便宜选项。\n\n**Q9：支持多轮对话吗？**\n当前版本每次 `chat` 调用是独立的单轮请求。多轮对话可通过 `--system` 设置系统提示词来模拟上下文。后续版本计划加入对话历史管理。\n\n**Q10：如何在企业微信/钉钉里收到预算告警？**\n在 `config.json` 中设置 `webhook_url`（企微/钉钉机器人地址），然后运行 `python scripts/router.py budget` 即可推送。详见 `config.example.json` 注释。\n\n## 十二、使用场景推荐与调优建议\n\n### 场景一：日常开发助手（最常用）\n```bash\n# 写代码 — auto 策略会自动选推理强的模型\npython scripts/router.py chat --prompt \"用 Python 实现一个二叉搜索树\" --task code\n\n# 读代码/重构建议\npython scripts/router.py chat --prompt \"优化这段代码的性能\" --task code < mycode.py\n\n# 调优建议：开发任务优先用 auto（性价比最高），不用 quality（太贵）\n```\n\n### 场景二：批量文档处理（省钱关键）\n```bash\n# 先看路由建议（不花钱）\nfor f in *.md; do\n  python scripts/router.py route --prompt \"$(head -5 $f)\" --strategy cheap\ndone\n\n# 确认没问题后再批量调用（cheap 策略保底最省）\nfor f in *.md; do\n  python scripts/router.py chat --prompt \"总结这个文件\" --strategy cheap --no-cache < \"$f\"\ndone\n\n# 调优建议：批量任务务必用 --strategy cheap + 硬件自适应并发\npython scripts/router.py hardware  # 先看建议并发数\n```\n\n### 场景三：翻译与本地化\n```bash\n# 翻译 — auto 能识别 translate 任务\npython scripts/router.py chat --prompt \"翻译成日文：${content}\" --task translate\n\n# 调优建议：翻译任务不需要强推理模型，cheap 即可胜任\n```\n\n### 场景四：学习与研究（追求质量）\n```bash\n# 复杂学术问题 — quality 策略选最强模型\npython scripts/router.py chat --prompt \"解释 Transformer 的注意力机制\" --strategy quality\n\n# 数学证明 — quality + reason 组合最强\npython scripts/router.py chat --prompt \"证明拉格朗日中值定理\" --task reason --strategy quality\n\n# 调优建议：学习研究不差钱就用 quality，差钱用 auto 也够用（95% 场景覆盖）\n```\n\n### 通用调优建议\n| 建议 | 说明 |\n|------|------|\n| **先 route 后 chat** | 每次 `chat` 前 `route` 看一眼推荐，避免选错模型浪费钱 |\n| **善用 --no-cache** | 实时信息、金融计算、代码生成等关键任务关闭缓存 |\n| **定期看 report** | `report --period month` 了解花费分布，发现异常及时止损 |\n| **设预算保护** | `config.json` 里设置 `monthly_budget`，超支前收到告警 |\n| **硬件自适应别绕过** | 不要手动改 `max_concurrency`，相信自动检测结果 |\n\n## 十三、更新提醒\n\n本技能内置 `update-check` 命令：比对本地 `version.json` 与发布源版本号，若有新版会提示你升级。**建议在定时任务或每次使用前跑一次**：\n\n```bash\npython scripts/router.py update-check\n```\n\n升级方式：通过 SkillHub 或你常用的发布流程更新本技能即可。更新日志见各版本 `version.json` 的 `notes` 字段。\n\n## 更新日志\n\n| v2.7.0 | 2026-10-09 | 增加：价格档案本地化——models.yaml 12 厂商主力模型基准价全部标注采集日期（priced_at + price_source）；增加：降价检测 price-check——轻量抓取厂商公开价目页做哈希比对，变化时输出疑似调价提示，人工确认后更新档案；优化：cheap 策略质量感知——按性价比排序（评分/价格）替代纯最便宜选；优化：报表双轨计算——cost 报表拆分「档案价估算」与「实测回填」两列，差异可视化 |\n| v2.6.0 | 2026-08-17 | 增加：embed/rerank 统一接口——CLI 新增 embed/rerank 子命令（--json 输出），AdapterBase 与 OpenAICompatAdapter 新增 embed/rerank 方法，按厂商差异封装 auth/request 格式；增加：RAG/长文路由——classifier 识别长任务时优先选 ≥128k 上下文模型，超长输入走 text_splitter 语义边界切分 + map-reduce 摘要合并，支持 100k 字符文档；增加：多轮会话管理——chat 新增 --session 参数，session_manager.py 维护 SQLite 对话表（session ID / 消息历史 / 模型），支持上下文自动携带与会话内模型切换（历史压缩摘要注入）；增加：describe 命令扩展视频/文档路由——视频走 ffmpeg 关键帧提取后调 vision 模型，文档走长文本模型，统一编排输出含模型 + token 计费；优化：流式 token 计数对齐——优先使用厂商 usage 回执字段，缺失时按 chunk 估算并标注 (est)，成本报表拆分 measured/estimated 两列 |\n| v2.5.0 | 2026-08-17 | 增加：共享内核模式——adapters/cost_tracker/cache/health_check/config/yaml_simple 公共代码抽为 llm-core/ 源码目录，build_core.py 构建脚本在发布时 vendor 注入双包（cn-llm-router + cn-model-gateway），生成 _core_lock.json 版本锁确保同源；增加：build_core.py 三个子命令（inject 注入 / check 版本一致性检查 / regression 双端回归门禁冒烟测试）；增加：能力实测校准器 calibrate.py——跑标准题集（分类/代码/长文各 5 题）实测回填 models.yaml 画像分数，每题 2 分，标注来源（实测+日期），支持全量/抽样预算配置；优化：ernie.py 适配器精简——更新 docstring 标注推荐走 OpenAI 兼容通道，原生签名路径保留作兜底；新增：yaml_simple.py 新增 dump/dump_file 写入功能，支持 Python 对象序列化为 YAML |\n| v2.4.0 | 2026-08-16 | 增加：多模态路由——classifier.py 新增 image/audio 任务识别，models.yaml 新增 Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型厂商，路由层按 multimodal 能力标签过滤候选模型；优化：arena 子命令新增 --blind 开关，--blind 时隐藏模型名盲选投票（原行为），不加时显示模型名直接对比，消除两套重复并行调用代码；优化：流式 token 估算改为复用基类 _extract_usage() 统一取值，覆盖 prompt_tokens/input_tokens/completion_tokens/output_tokens 四种字段名，提升有 usage 返回厂商的计费精度\n| v2.2.0 | 2026-08-01 | 增加：模型竞技场 arena（并行调用 2-4 家模型，盲选最佳回答，长期追踪各模型胜率）；增加：健康检查 health-check（3 秒超时、60s 缓存、并行 ping）；增加：模型降级与故障转移（超时自动切备用模型，最多重试 2 次，成本报表标注降级事件）；增加：AdapterTimeoutError 子类（区分超时与鉴权失败）|\n| v2.1.0 | 2026-07-24 | 增加：MiniMax（abab 系列）、零一万物 Yi、百川智能、阶跃星辰 Step-2 四家厂商，覆盖扩展至 12 家 32 款模型；增加：DeepSeek V3 及全部模型的能力画像字段（推理/代码/长文得分）；优化：auto 策略改由能力画像驱动智能选型，新增厂商填画像即被自动纳入、无需改代码；增加：分类器 stream_friendly 流式适配判断（对话/翻译/代码适合流式，推理/抽取建议一次性）；修复：流式输出 token 计费恒为 0 的问题，改用估算兜底并标注（估） |\n| v2.0.0 | 2026-07-16 | 新增：全链路离线 Mock 模式（`--mock`），含 12 个预设场景（代码/推理/翻译/摘要/提取/分析/创意写作等）；新增：网络自动检测与厂商级熔断（所有厂商不可达时自动进入 mock 模式）；新增：延迟模拟（`--latency 2000`）用于测试超时降级；新增：交互式 Mock 数据编辑器（`mock --edit`）支持自定义 query→response 映射；新增：Mock 回归测试（`test --mock`，10 项 mock 专项测试）；定位：mock 数据完全本地（JSON + SQLite），不依赖外部 API，仅限开发调试，生产环境强制禁用 |\n| v1.1.0 | 2026-07-10 | 优化：缓存模糊匹配加入长度惩罚系数与最短查询限制，大幅减少「答非所问」式误命中；提升：流式输出 token 估算精度（无 usage 时按中英文混合规则兜底并标注「估」）；新增：SKILL.md 命令运行效果示例（每个命令均有真实输出样例）、反模式章节（8 条常见坑）、FAQ 扩充至 10 条、使用场景推荐与调优建议章节；修复：displayName 改为中文「国产大模型统一路由」，解决上传后显示英文名的问题 |\n| v1.0.0 | 2026-07-09 | 首发：单入口路由 + 任务感知策略（auto/cheap/quality/manual）+ 跨模型成本聚合 + 硬件自适应并发限制 + 本地语义缓存 + 更新提醒 + 8 家国产大模型全覆盖 |\n\n## 十四、安全与发布合规\n\n- 本技能**已规避全部默认拦截文件类型**：包内仅含 `.py` 源码、`.md` 文档、`.yaml`/`.json` 数据，**不含** `.bat/.cmd/.ps1/.vbs/.exe/.dll/.lnk/.msi/.docx/.xlsx/.pptx/.iso/.dmg/.zip/.rar/.7z/.tar/.gz/.apk/.jar/.DS_Store/.env/.log/.tmp/.sh/.com/.scr/.hta/.reg` 等任何风险文件。\n- 安全 grep 结果：**无 `eval/exec/os.system/subprocess/pickle` 调用**，所有网络 I/O 仅通过 `urllib` 发往官方域名或用户配置地址，均带超时 + try/except 保护。\n- 已通过「无硬编码密钥、核心无第三方依赖（讯飞星火仅可选 websocket-client）、纯标准库」的自检，可直接提交安全扫描。\n\n## 十五、反馈与建议\n\n有更好建议、遇到 bug、想加厂商，欢迎来信：**njskills@agent.qq.com**\n\n---\n\n*版本：v2.7.0 ｜ 许可：MIT ｜ 核心纯标准库（讯飞星火可选 websocket-client）、零密钥打包、可只读审计。*\n\nFile v2.7.0:_meta.json\n\n{\n  \"ownerId\": \"kn7chdrwbdhaqkwajcyhtfvjx989ddb1\",\n  \"slug\": \"cn-llm-router\",\n  \"version\": \"2.7.0\",\n  \"publishedAt\": 1791547923292\n}\n\nFile v2.7.0:references/mock_data.json\n\n{\n  \"_说明\": \"Mock 预设响应库 — 仅开发调试用，完全本地，不同步到任何云端。覆盖 12 个常见场景。\",\n  \"scenarios\": [\n    {\n      \"id\": \"code_quick_sort\",\n      \"task_type\": \"code\",\n      \"keywords\": [\"排序\", \"sort\", \"快排\", \"算法\", \"python\", \"代码\", \"code\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"以下是 Python 快速排序的实现：\\n\\n```python\\ndef quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n```\\n\\n时间复杂度：平均 O(n log n)，最坏 O(n²)。空间复杂度：O(n)。\",\n        \"in_tokens\": 45,\n        \"out_tokens\": 180\n      }\n    },\n    {\n      \"id\": \"reason_math_proof\",\n      \"task_type\": \"reason\",\n      \"keywords\": [\"证明\", \"推导\", \"定理\", \"数学\", \"reason\", \"推理\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"勾股定理证明（欧几里得证法）：\\n\\n设直角三角形两直角边为 a、b，斜边为 c。\\n构造边长为 (a+b) 的正方形，内部含四个全等直角三角形和一个小正方形。\\n\\n大正方形面积 = (a+b)² = 4×(½ab) + c²\\n展开：a² + 2ab + b² = 2ab + c²\\n化简：a² + b² = c²\\n\\n证毕。\",\n        \"in_tokens\": 30,\n        \"out_tokens\": 150\n      }\n    },\n    {\n      \"id\": \"translate_zh_en\",\n      \"task_type\": \"translate\",\n      \"keywords\": [\"翻译\", \"translate\", \"英文\", \"english\", \"中英文\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"Translation: Artificial intelligence is rapidly transforming every aspect of our lives, from healthcare and education to transportation and entertainment. While the technology brings unprecedented convenience and efficiency, it also raises important questions about privacy, employment, and ethics that society must address proactively.\",\n        \"in_tokens\": 25,\n        \"out_tokens\": 55\n      }\n    },\n    {\n      \"id\": \"summarize_long\",\n      \"task_type\": \"summarize\",\n      \"keywords\": [\"总结\", \"概括\", \"摘要\", \"summarize\", \"归纳\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"文档核心要点：\\n\\n1. 背景：大模型技术正从「对话」向「执行」演进，Agent 成为新范式\\n2. 关键变更：引入函数调用、长期记忆、多步骤规划三大能力\\n3. 数据：基准测试准确率从 72% 提升至 89%，推理成本下降 40%\\n4. 风险：幻觉率仍达 12%，需要人工审核兜底\\n5. 建议：优先在低风险场景试点，逐步向核心业务扩展\",\n        \"in_tokens\": 200,\n        \"out_tokens\": 120\n      }\n    },\n    {\n      \"id\": \"extract_info\",\n      \"task_type\": \"extract\",\n      \"keywords\": [\"提取\", \"抽取\", \"实体\", \"extract\", \"信息\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"{\\n  \\\"entities\\\": [\\n    {\\\"type\\\": \\\"公司\\\", \\\"value\\\": \\\"腾讯科技\\\"},\\n    {\\\"type\\\": \\\"时间\\\", \\\"value\\\": \\\"2026年7月\\\"},\\n    {\\\"type\\\": \\\"金额\\\", \\\"value\\\": \\\"5.2亿元\\\"},\\n    {\\\"type\\\": \\\"事件\\\", \\\"value\\\": \\\"战略融资\\\"}\\n  ],\\n  \\\"confidence\\\": 0.94\\n}\",\n        \"in_tokens\": 80,\n        \"out_tokens\": 95\n      }\n    },\n    {\n      \"id\": \"chat_greeting\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"你好\", \"hello\", \"hi\", \"嗨\", \"在吗\", \"介绍\"],\n      \"priority\": 5,\n      \"response\": {\n        \"content\": \"你好！我是 AI 助手，可以帮你解答问题、写代码、翻译文档、分析数据等。请告诉我你需要什么帮助？\",\n        \"in_tokens\": 10,\n        \"out_tokens\": 45\n      }\n    },\n    {\n      \"id\": \"code_debug\",\n      \"task_type\": \"code\",\n      \"keywords\": [\"bug\", \"报错\", \"debug\", \"修复\", \"错误\", \"异常\", \"traceback\"],\n      \"priority\": 9,\n      \"response\": {\n        \"content\": \"根据错误信息分析：\\n\\n问题原因：`NoneType` 对象没有属性 `split`，说明变量在处理前未正确赋值。\\n\\n修复建议：\\n1. 检查上游函数是否返回了 None\\n2. 添加空值守卫：`if text is not None: text.split()`\\n3. 或使用空合并：`text = get_value() or \\\"\\\"`\\n\\n建议在第 42 行前增加类型检查，确保输入非空。\",\n        \"in_tokens\": 60,\n        \"out_tokens\": 130\n      }\n    },\n    {\n      \"id\": \"long_context_analysis\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"分析\", \"解读\", \"对比\", \"评估\", \"analysis\"],\n      \"priority\": 7,\n      \"response\": {\n        \"content\": \"综合分析报告：\\n\\n## 优势\\n- 方案 A：成本低、落地快，适合 MVP 验证\\n- 方案 B：扩展性强、长期 ROI 高，适合规模化部署\\n\\n## 风险\\n- 方案 A：技术债积累，6 个月后可能需重构\\n- 方案 B：初期投入大，团队学习曲线陡峭\\n\\n## 建议\\n- 0-3 个月：用方案 A 快速验证核心假设\\n- 3-6 个月：根据数据决定是否迁移到方案 B\\n- 关键指标：用户留存率、边际成本、故障率\",\n        \"in_tokens\": 150,\n        \"out_tokens\": 200\n      }\n    },\n    {\n      \"id\": \"data_analysis\",\n      \"task_type\": \"extract\",\n      \"keywords\": [\"数据\", \"报表\", \"趋势\", \"统计\", \"data\", \"chart\"],\n      \"priority\": 8,\n      \"response\": {\n        \"content\": \"数据分析结果：\\n\\n| 指标 | Q1 | Q2 | 环比 |\\n|------|-----|-----|------|\\n| DAU | 12.3万 | 15.8万 | +28% |\\n| 留存 | 45% | 52% | +7pp |\\n| 收入 | ¥320万 | ¥480万 | +50% |\\n\\n关键洞察：7 月新上线的个性化推荐功能显著提升了用户粘性和付费转化率。建议继续优化推荐算法，目标 Q3 留存达到 55%。\",\n        \"in_tokens\": 100,\n        \"out_tokens\": 160\n      }\n    },\n    {\n      \"id\": \"creative_writing\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"写\", \"创作\", \"故事\", \"文案\", \"文章\", \"creative\", \"write\"],\n      \"priority\": 6,\n      \"response\": {\n        \"content\": \"在那个雨水敲打着玻璃的深夜，她终于打开了一封尘封了二十年的信封。\\n\\n泛黄的纸张上，熟悉的字迹让她的心跳骤然加速——那是母亲的笔迹，她以为早已在火灾中化为灰烬的秘密。\\n\\n「如果你看到这封信，说明妈妈没能亲自告诉你……」\\n\\n窗外的雷声轰然炸响，而她手中的信纸，开始微微颤抖。\",\n        \"in_tokens\": 20,\n        \"out_tokens\": 140\n      }\n    },\n    {\n      \"id\": \"general_qa\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"是什么\", \"为什么\", \"怎么\", \"如何\", \"推荐\", \"区别\"],\n      \"priority\": 3,\n      \"response\": {\n        \"content\": \"这是一个很好的问题！让我来解答：\\n\\n首先，我们可以从以下几个维度来理解：\\n1. 核心概念：定义和基本原理\\n2. 应用场景：适合什么情况使用\\n3. 注意事项：容易踩的坑\\n\\n如果你想深入了解某个方面，请告诉我，我可以进一步展开。\",\n        \"in_tokens\": 15,\n        \"out_tokens\": 85\n      }\n    },\n    {\n      \"id\": \"fallback\",\n      \"task_type\": \"chat\",\n      \"keywords\": [],\n      \"priority\": 0,\n      \"response\": {\n        \"content\": \"这是 Mock 模式返回的预设响应。在实际环境中，这里会是真实模型的回答。当前命中了通用兜底 mock，说明你的 query 没有匹配到任何特定场景。如需测试特定场景，请在 query 中加入关键词：翻译/代码/证明/总结/提取/分析 等。\",\n        \"in_tokens\": 12,\n        \"out_tokens\": 70\n      }\n    }\n  ]\n}\n\nFile v2.7.0:references/models.yaml\n\n# 模型注册表（国产大模型统一路由）\r\n\r\n# 说明：\r\n\r\n# - 价格为示例（元 / 每 1M tokens），请以各厂商官方最新定价为准。\r\n\r\n# - 新增厂商：只需在此加一段 provider + 一个 adapter（见 scripts/adapters），不动路由逻辑。\r\n\r\n# - 字段含义：\r\n\r\n#     display       中文名\r\n\r\n#     adapter       适配器类型：openai_compat / ernie / spark\r\n\r\n#     base_url      API 基址（openai_compat / ernie 用）\r\n\r\n#     base_url_openai  文心 Qianfan OpenAI 兼容端点（可选）\r\n\r\n#     env_hint      所需环境变量名（仅提示，密钥不进包）\r\n\r\n#     default_model 默认模型\r\n\r\n#     models[]      name / ctx(上下文窗口 token) / price_in / price_out / reasoner(可选)\r\n\r\n#     能力画像（0-10，越大越强，纯本地静态经验值，供 auto 策略打分）：\r\n\r\n#       reason_score  推理能力   code_score  代码能力   long_score  长文能力\r\n\r\n# - v2.6 新增：embed_models[] 和 reranks 配置块（embedding 与 rerank 统一接口）\r\n\r\n# - v2.7.0 新增：priced_at（采集日期 YYYY-MM-DD）+ price_source（来源说明）\r\n\r\n# - 本文件纯数据，不含任何密钥。\r\n\r\n\r\n\r\nproviders:\r\n\r\n  deepseek:\r\n\r\n    display: DeepSeek\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://api.deepseek.com\r\n\r\n    env_hint: DEEPSEEK_API_KEY\r\n\r\n    default_model: deepseek-chat\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: deepseek-chat\r\n\r\n        ctx: 64000\r\n\r\n        price_in: 1\r\n\r\n        price_out: 2\r\n\r\n        reason_score: 8\r\n\r\n        code_score: 9\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: deepseek-reasoner\r\n\r\n        ctx: 64000\r\n\r\n        price_in: 4\r\n\r\n        price_out: 16\r\n\r\n        reasoner: true\r\n\r\n        reason_score: 10\r\n\r\n        code_score: 9\r\n\r\n        long_score: 6\r\n\r\n  qwen:\r\n\r\n    display: 阿里通义千问\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://dashscope.aliyuncs.com/compatible-mode/v1\r\n\r\n    env_hint: DASHSCOPE_API_KEY\r\n\r\n    default_model: qwen-plus\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: qwen-turbo\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 0.8\r\n\r\n        price_out: 2\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 7\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: qwen-plus\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 0.8\r\n\r\n        price_out: 2\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 8\r\n\r\n        long_score: 8\r\n\r\n      -\r\n\r\n        name: qwen-max\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 2.4\r\n\r\n        price_out: 9.6\r\n\r\n        reason_score: 9\r\n\r\n        code_score: 8\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: qwen-long\r\n\r\n        ctx: 1000000\r\n\r\n        price_in: 0.5\r\n\r\n        price_out: 2\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 10\r\n\r\n  glm:\r\n\r\n    display: 智谱 GLM\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://open.bigmodel.cn/api/paas/v4\r\n\r\n    env_hint: ZHIPU_API_KEY\r\n\r\n    default_model: glm-4-flash\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: glm-4-flash\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 0.1\r\n\r\n        price_out: 0.1\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 8\r\n\r\n      -\r\n\r\n        name: glm-4-air\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 1\r\n\r\n        price_out: 1\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 7\r\n\r\n        long_score: 8\r\n\r\n      -\r\n\r\n        name: glm-4-plus\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 10\r\n\r\n        price_out: 10\r\n\r\n        reason_score: 9\r\n\r\n        code_score: 8\r\n\r\n        long_score: 8\r\n\r\n  kimi:\r\n\r\n    display: 月之暗面 Kimi\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://api.moonshot.cn/v1\r\n\r\n    env_hint: MOONSHOT_API_KEY\r\n\r\n    default_model: moonshot-v1-8k\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: moonshot-v1-8k\r\n\r\n        ctx: 8000\r\n\r\n        price_in: 1\r\n\r\n        price_out: 1\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 5\r\n\r\n      -\r\n\r\n        name: moonshot-v1-32k\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 2.4\r\n\r\n        price_out: 2.4\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 7\r\n\r\n      -\r\n\r\n        name: moonshot-v1-128k\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 10\r\n\r\n        price_out: 10\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 6\r\n\r\n        long_score: 9\r\n\r\n  hunyuan:\r\n\r\n    display: 腾讯混元\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://api.hunyuan.cloud.tencent.com/v1\r\n\r\n    env_hint: HUNYUAN_API_KEY\r\n\r\n    default_model: hunyuan-lite\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: hunyuan-lite\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 0.6\r\n\r\n        price_out: 0.6\r\n\r\n        reason_score: 5\r\n\r\n        code_score: 5\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: hunyuan-standard\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 1.2\r\n\r\n        price_out: 1.2\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: hunyuan-pro\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 3\r\n\r\n        price_out: 3\r\n\r\n        reason_score: 8\r\n\r\n        code_score: 7\r\n\r\n        long_score: 8\r\n\r\n      -\r\n\r\n        name: hunyuan-long\r\n\r\n        ctx: 256000\r\n\r\n        price_in: 3\r\n\r\n        price_out: 3\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 10\r\n\r\n  doubao:\r\n\r\n    display: 字节豆包\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://ark.cn-beijing.volces.com/api/v3\r\n\r\n    env_hint: ARK_API_KEY\r\n\r\n    default_model: doubao-pro-32k\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: doubao-pro-32k\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 0.8\r\n\r\n        price_out: 2\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 7\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: doubao-lite-32k\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 0.3\r\n\r\n        price_out: 0.6\r\n\r\n        reason_score: 5\r\n\r\n        code_score: 5\r\n\r\n        long_score: 6\r\n\r\n  ernie:\r\n\r\n    display: 百度文心\r\n\r\n    adapter: ernie\r\n\r\n    base_url: https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro\r\n\r\n    base_url_openai: https://qianfan.baidubce.com/v2\r\n\r\n    env_hint: ERNIE_OPENAI_KEY\r\n\r\n    default_model: ernie-4.0-8k\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: ernie-4.0-8k\r\n\r\n        ctx: 8000\r\n\r\n        price_in: 8\r\n\r\n        price_out: 8\r\n\r\n        reason_score: 8\r\n\r\n        code_score: 7\r\n\r\n        long_score: 5\r\n\r\n      -\r\n\r\n        name: ernie-3.5-8k\r\n\r\n        ctx: 8000\r\n\r\n        price_in: 1.2\r\n\r\n        price_out: 1.2\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 5\r\n\r\n  spark:\r\n\r\n    display: 讯飞星火\r\n\r\n    adapter: spark\r\n\r\n    version: v3.5\r\n\r\n    domain: generalv3.5\r\n\r\n    env_hint: SPARK_APP_ID / SPARK_API_KEY / SPARK_API_SECRET\r\n\r\n    default_model: spark-v3.5\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: spark-v3.5\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 1.2\r\n\r\n        price_out: 1.2\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 6\r\n\r\n  minimax:\r\n\r\n    display: MiniMax\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://api.minimax.chat/v1\r\n\r\n    env_hint: MINIMAX_API_KEY\r\n\r\n    default_model: abab6.5s-chat\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: abab6.5s-chat\r\n\r\n        ctx: 245000\r\n\r\n        price_in: 1\r\n\r\n        price_out: 1\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 6\r\n\r\n        long_score: 9\r\n\r\n      -\r\n\r\n        name: abab6.5g-chat\r\n\r\n        ctx: 8000\r\n\r\n        price_in: 5\r\n\r\n        price_out: 5\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 6\r\n\r\n        long_score: 5\r\n\r\n  yi:\r\n\r\n    display: 零一万物 Yi\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://api.lingyiwanwu.com/v1\r\n\r\n    env_hint: YI_API_KEY\r\n\r\n    default_model: yi-lightning\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: yi-lightning\r\n\r\n        ctx: 16000\r\n\r\n        price_in: 0.99\r\n\r\n        price_out: 0.99\r\n\r\n        reason_score: 8\r\n\r\n        code_score: 8\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: yi-large\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 20\r\n\r\n        price_out: 20\r\n\r\n        reason_score: 9\r\n\r\n        code_score: 8\r\n\r\n        long_score: 7\r\n\r\n      -\r\n\r\n        name: yi-large-fc\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 20\r\n\r\n        price_out: 20\r\n\r\n        reason_score: 8\r\n\r\n        code_score: 8\r\n\r\n        long_score: 7\r\n\r\n  baichuan:\r\n\r\n    display: 百川智能\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://api.baichuan-ai.com/v1\r\n\r\n    env_hint: BAICHUAN_API_KEY\r\n\r\n    default_model: Baichuan4-Air\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: Baichuan4-Air\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 0.98\r\n\r\n        price_out: 0.98\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 6\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: Baichuan4-Turbo\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 15\r\n\r\n        price_out: 15\r\n\r\n        reason_score: 8\r\n\r\n        code_score: 7\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: Baichuan4\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 100\r\n\r\n        price_out: 100\r\n\r\n        reason_score: 9\r\n\r\n        code_score: 8\r\n\r\n        long_score: 6\r\n\r\n  step:\r\n\r\n    display: 阶跃星辰 Step\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://api.stepfun.com/v1\r\n\r\n    env_hint: STEP_API_KEY\r\n\r\n    default_model: step-2-16k\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: step-1-8k\r\n\r\n        ctx: 8000\r\n\r\n        price_in: 5\r\n\r\n        price_out: 20\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 7\r\n\r\n        long_score: 5\r\n\r\n      -\r\n\r\n        name: step-2-16k\r\n\r\n        ctx: 16000\r\n\r\n        price_in: 38\r\n\r\n        price_out: 120\r\n\r\n        reason_score: 9\r\n\r\n        code_score: 8\r\n\r\n        long_score: 7\r\n\r\n      -\r\n\r\n        name: step-1-256k\r\n\r\n        ctx: 256000\r\n\r\n        price_in: 95\r\n\r\n        price_out: 300\r\n\r\n        reason_score: 8\r\n\r\n        code_score: 7\r\n\r\n        long_score: 10\r\n\r\n\r\n\r\n  # v2.4 视觉模型（多模态）\r\n\r\n  qwen_vl:\r\n\r\n    display: 阿里通义 VL\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://dashscope.aliyuncs.com/compatible-mode/v1\r\n\r\n    env_hint: DASHSCOPE_API_KEY\r\n\r\n    default_model: qwen-vl-plus\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: qwen-vl-plus\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 0.8\r\n\r\n        price_out: 2\r\n\r\n        multimodal: true\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 6\r\n\r\n        long_score: 8\r\n\r\n      -\r\n\r\n        name: qwen-vl-max\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 2.4\r\n\r\n        price_out: 9.6\r\n\r\n        multimodal: true\r\n\r\n        reason_score: 8\r\n\r\n        code_score: 6\r\n\r\n        long_score: 8\r\n\r\n\r\n\r\n  glm_vl:\r\n\r\n    display: 智谱 GLM-4V\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://open.bigmodel.cn/api/paas/v4\r\n\r\n    env_hint: ZHIPU_API_KEY\r\n\r\n    default_model: glm-4v-plus\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: glm-4v-plus\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 1\r\n\r\n        price_out: 1\r\n\r\n        multimodal: true\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 5\r\n\r\n        long_score: 8\r\n\r\n\r\n\r\n  doubao_vl:\r\n\r\n    display: 字节豆包视觉\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://ark.cn-beijing.volces.com/api/v3\r\n\r\n    env_hint: ARK_API_KEY\r\n\r\n    default_model: doubao-vision-pro-32k\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: doubao-vision-pro-32k\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 0.8\r\n\r\n        price_out: 2\r\n\r\n        multimodal: true\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 5\r\n\r\n        long_score: 6\n\nFile v2.7.0:references/price_history.yaml\n\n{\r\n  \"snapshots\": {}\r\n}\n\nFile v2.7.0:references/routing-rules.md\n\n# 路由规则说明（国产大模型统一路由）\n\n本文件解释路由引擎如何把「一次对话请求」映射到「具体厂商 / 模型」。目标：**任务感知、成本最优、失败可降级**。\n\n## 一、四种路由模式\n\n| 模式 | 触发 | 行为 |\n|------|------|------|\n| `auto` | 默认 | 任务分类器 + 成本权重自动选最优 |\n| `cheap` | `--model cheap` | 强制最便宜模型（批量抽取 / 分类 / 翻译场景） |\n| `quality` | `--model quality` | 强制最强模型（复杂推理 / 重要产出） |\n| `manual` | `--model 厂商:模型` | 显式指定，如 `deepseek:deepseek-reasoner` |\n\n## 二、任务分类维度（auto 模式）\n\n分类器为**纯规则 + 启发式**（零密钥、零模型、毫秒级），输出：\n\n- `task_type`：classify / extract / summarize / translate / reason / code / long / general\n- `needs_reasoning`：是否需推理（命中「为什么 / 分析 / 推导 / 根因 …」）\n- `length_bucket`：short(<4k) / mid(4k–32k) / long(>32k) 以字符粗略估算\n- `budget_sensitive`：分类 / 抽取 / 总结 / 翻译 → 对价格更敏感\n\n设 `confidence` 阈值：关键词命中或含推理词 → 0.8；纯 general 且无推理词 → 0.4。\n低于阈值时由路由回退到 `quality` 或 `manual`（用户可随时覆盖）。\n\n## 三、auto 模式映射表（仅从「已配置密钥」的厂商中选择）\n\n| 分类信号 | 偏好 |\n|----------|------|\n| 需推理 | DeepSeek-R1（reasoner） |\n| 长文 (>32k) | Kimi-128k / 混元-long / 通义-long（上下文 ≥128k） |\n| 代码 | DeepSeek-Chat / 通义 |\n| 价格敏感 | GLM-4-Flash / 豆包-lite（最便宜档） |\n| 常规 | DeepSeek-Chat（均衡默认） |\n\n> 若偏好厂商未配置密钥，自动降级到「已配置厂商里最便宜 / 最强」的可用模型，并给出原因说明。\n\n## 四、失败降级（budget guard）\n\n- 主模型返回 429 / 5xx / 超时 → 适配器自动指数退避重试（最多 2 次）。\n- 仍失败 → 路由层 budget guard 阻止「贵模型 runaway」，并记录失败调用（成本统计中的 success=0）。\n- 预算阈值（config.json 的 `budget_monthly`）超支 → 主动告警（CLI 提示 + 可选企微机器人）。\n\n## 五、成本统计（第 7 类：AI 成本 / 用量可观测）\n\n每次调用无论成败都落本地 SQLite（`~/.cn_llm_router/calls.db`）：\n厂商 / 模型 / 任务 / 入 token / 出 token / 花费 / 耗时 / 成功与否。\n\n花费 = 入 token ÷ 1e6 × price_in + 出 token ÷ 1e6 × price_out（价格取自 models.yaml）。\n`report` 命令据此出日 / 周 / 月报、各家花费柱状、成功率、P95 延迟。\n\n## 六、与成熟网关（LiteLLM / One API）的关系\n\n它们是独立部署的网关服务；本技能是 **WorkBuddy 内的轻量封装**：\n- 复用各家 OpenAI 兼容端点（自研 urllib 适配器，零依赖）；\n- 在其之上叠加**任务感知路由**（网关不内置）；\n- 中文成本月报 + 可选企微 / 网盘告警（轻量本地版）。\n\n即：站在巨人肩膀上做「国产任务感知路由 + 成本可观测」这一层差异化。\n\nFile v2.7.0:skill-card.md\n\n## Description:\n\nRoutes text and multimodal tasks across Chinese language-model providers and helps compare usage and costs.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[fyniujin](https://clawhub.ai/user/fyniujin)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and other agent users can select and call Chinese language models for chat, document, image, embedding, and reranking tasks, while comparing estimated costs and usage across providers.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts, documents, embeddings, and rerank inputs may be sent to configured model providers despite inconsistent privacy documentation.\n\nMitigation: Use only providers you trust and avoid sending secrets or sensitive content without approval.\n\nRisk: Prompts and related session data may persist in local storage; cached answers may be stale or mismatched.\n\nMitigation: Use --no-cache for sensitive or critical prompts and clear ~/.cn_llm_router data when needed.\n\nRisk: The legacy ERNIE AK/SK authentication path requires handling additional credentials.\n\nMitigation: Prefer ERNIE_OPENAI_KEY over the legacy ERNIE AK/SK path.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/fyniujin/skills/cn-llm-router)\n- [Routing rules](artifact/references/routing-rules.md)\n- [Model registry](artifact/references/models.yaml)\n- [Price history](artifact/references/price_history.yaml)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Guidance]\n\n**Output Format:** [Plain text or JSON; optional HTML cost reports]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include model recommendations, responses, usage and cost estimates, embeddings, or reranked results.]\n\n## Skill Version(s):\n\n2.7.0 (source: ClawHub release and SKILL.md frontmatter)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.7.0:_core_lock.json\n\n{\r\n  \"core_version\": \"1.0.0\",\r\n  \"injected_at\": \"2026-10-09T19:27:32\",\r\n  \"target\": \"cn-llm-router\"\r\n}\n\nFile v2.7.0:_core/version.json\n\n{\"version\": \"1.0.0\", \"compatible_skills\": {\"cn-llm-router\": \">=2.5.0\", \"cn-model-gateway\": \">=1.7.0\"}, \"adapters\": [\"openai_compat\", \"ernie\", \"spark\"], \"modules\": [\"cost_tracker\", \"cache\", \"health_check\", \"config\", \"yaml_simple\"]}\n\nFile v2.7.0:config.example.json\n\n{\n  \"_comment\": \"本文件是配置模板，不含任何密钥。厂商 API Key 一律用环境变量传入（见 SKILL.md）。请将本文件复制为 ~/.cn_llm_router_config.json 或技能目录下的 config.json 后按需修改。\",\n  \"budget_monthly\": 0.0,\n  \"update_url\": \"\",\n  \"wecom_webhook\": \"\",\n  \"cache_ttl_hours\": 168,\n  \"cache_fuzzy\": false\n}\n\nFile v2.7.0:version.json\n\n{\"version\": \"2.7.0\", \"homepage\": \"https://skillhub.cn/skill/cn-llm-router\", \"notes\": \"v2.7.0：增加价格档案本地化（models.yaml 12 厂商主力模型基准价 + 采集日期）；增加降价检测 price-check（轻量抓取厂商价目页 + 哈希比对 + 人工确认）；优化 cheap 策略质量感知（性价比排序替代纯最便宜）；优化报表双轨计算（档案价估算 vs 实测回填）\"}\n\nArchive v2.6.0: 42 files, 113599 bytes\n\nFiles: _core_lock.json (102b), _core/adapters/__init__.py (654b), _core/adapters/base.py (4413b), _core/adapters/ernie.py (5025b), _core/adapters/openai_compat.py (6245b), _core/adapters/spark.py (5542b), _core/cache.py (6959b), _core/calibrate.py (10185b), _core/config.py (3133b), _core/cost_tracker.py (7230b), _core/health_check.py (5920b), _core/version.json (230b), _core/yaml_simple.py (6501b), config.example.json (356b), references/mock_data.json (7517b), references/models.yaml (10110b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (4413b), scripts/adapters/ernie.py (5025b), scripts/adapters/openai_compat.py (6306b), scripts/adapters/spark.py (5542b), scripts/cache.py (6959b), scripts/classifier.py (4601b), scripts/config.py (3133b), scripts/cost_tracker.py (8009b), scripts/hardware.py (3978b), scripts/health_check.py (5920b), scripts/meta.py (491b), scripts/mock_engine.py (13037b), scripts/report.py (4678b), scripts/router.py (50744b), scripts/session_manager.py (5226b), scripts/text_splitter.py (4045b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (2824b), SKILL.md (42738b), tests/test_router.py (25670b), version.json (556b), _meta.json (132b)\n\nFile v2.6.0:SKILL.md\n\n---\nname: cn-llm-router\ndescription: 国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。\nversion: 2.6.0\n---\n\n\n# 国产大模型统一路由（cn-llm-router）\n\n> 一个**核心零依赖（纯 Python 标准库，仅讯飞星火可选一个 `websocket-client`）、零密钥打包**的命令行工具，把 12 家国产大模型收敛成「一个入口、一套命令」。你只管说「我要干嘛」，它帮你挑模型、算成本、限并发、逐字流式输出；断网或无 Key 时也能演示路由逻辑。\n\n## 一、30 秒速查\n\n```bash\n# 不配任何密钥，先看「路由建议」（演示/规划用，不发起调用）\npython scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n\n# 配好密钥后，真正调用（默认 auto 策略 = 任务感知选模型）\nexport DEEPSEEK_API_KEY=sk-xxx          # 至少一个厂商即可\npython scripts/router.py chat --prompt \"解释一下快速排序\" --model auto\n\n# 看这台电脑的硬件画像与建议并发（不拖累电脑的关键）\npython scripts/router.py hardware\n```\n\n**运行效果示例：**\n\n```\n$ python scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n╔══════════════════════════════════════════════════╗\n║         路由建议模式（未配置 API Key）             ║\n║  以下为推荐方案，不发起实际调用。配 Key 后可真跑。 ║\n╚══════════════════════════════════════════════════╝\n\n任务分类: code | 推理需求: True | 长度: short | 预算敏感: False\n推荐策略(auto): deepseek/deepseek-reasoner\n  └─ 理由: 代码生成+强推理, 性价比最优\n\n备选(cheap): deepseek/deepseek-chat        ¥0.0001/千tokens\n备选(quality): glm/glm-4                   ¥0.0010/千tokens\n\n提示: export DEEPSEEK_API_KEY=sk-xxx 即可调用\n```\n\n```\n$ python scripts/router.py hardware\n╔═══════════════ 硬件画像 ═══════════════╗\n│ CPU 逻辑核心:   8 核                    │\n│ 物理内存:       15.9 GB                 │\n│ 硬件档位:       mid                     │\n│ 建议最大并发:    2                       │\n│ 建议单批大小:    8                       │\n╚═══════════════════════════════════════╝\n```\n\n- 支持厂商（12 家 · 32 款模型）：DeepSeek、阿里通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川智能、阶跃星辰 Step。\n- 运行要求：Python 3.8+；**11 家厂商（DeepSeek/通义/智谱/Kimi/混元/豆包/文心/MiniMax/Yi/百川/阶跃）与全部离线功能无需安装任何第三方包**；讯飞星火为可选 `websocket-client`（不装也能用其余 11 家，仅星火调用时给出中文安装指引）。\n- 密钥来源：只用**环境变量**，绝不明文落盘、绝不打包进 skill。\n\n## 二、架构\n\n```\ncn-llm-router/\n├── SKILL.md                  # 本文件（使用说明 + 风险 + 边界 + FAQ + 反模式）\n├── version.json              # 版本号（更新提醒比对用）\n├── config.example.json       # 配置模板（无密钥，复制后改）\n├── references/\n│   ├── models.yaml           # 模型注册表（纯数据，可自助增删厂商）\n│   └── routing-rules.md      # 路由策略规则说明\n├── scripts/\n│   ├── router.py             # 统一 CLI 入口 + 策略引擎（对外只暴露这一个文件）\n│   ├── classifier.py         # 任务分类器（规则 + 关键词，离线）\n│   ├── config.py             # 配置/密钥读取（仅读环境变量）\n│   ├── cost_tracker.py       # 跨厂商成本聚合（SQLite，本地）\n│   ├── hardware.py           # 硬件画像 + 并发/子任务数自适应\n│   ├── cache.py              # 本地语义缓存（降 token 消耗，含长度惩罚防误命中）\n│   ├── report.py             # 文本/HTML 成本报表 + 预算告警\n│   ├── update_check.py       # 更新提醒（可离线，失败静默）\n│   ├── yaml_simple.py        # 自研零依赖 YAML 解析（不引入 PyYAML）\n│   ├── meta.py               # 版本常量\n│   ├── session_manager.py    # 多轮会话管理（SQLite 对话表 + 历史压缩）\n│   ├── text_splitter.py      # 长文切分（段落→句子→硬切 3 级回退）+ map-reduce\n│   └── adapters/             # 各厂商适配器（统一接口）\n│       ├── base.py           # AdapterBase + 中文异常 + token 估算工具 + embed/rerank 接口\n│       ├── openai_compat.py  # OpenAI 兼容端点（11 家通用，流式带兜底估算 + embed/rerank）\n│       ├── ernie.py          # 文心大模型（兼容 + 原生双通道，流式估算）\n│       └── spark.py          # 讯飞星火（WebSocket 签名，可选 websocket-client 做传输）\n└── tests/\n    └── test_router.py        # 离线测试（21 项，无需密钥）\n```\n\n核心数据流：`prompt → classifier → 策略引擎(resolve) → adapter → 大模型`，同时旁路写入 `cost_tracker`（成本）与 `cache`（命中则跳过调用）。\n\n## 三、能做哪些（功能清单）\n\n| 功能 | 命令 | 说明 |\n|------|------|------|\n| 智能路由 | `route` | 按任务自动选模型；`--strategy auto/cheap/quality/manual`；无 Key 进「建议模式」只展示不调用 |\n| 统一调用 | `chat` | 单入口对话，自动统计成本；支持流式、系统提示词、JSON 输出、`--session` 多轮会话 |\n| Embedding | `embed` | 文本向量化统一接口；`--json` 输出；自动选支持 embedding 的厂商 |\n| Rerank | `rerank` | 文档重排序统一接口；`--json` 输出；按厂商差异封装 auth/request |\n| 多轮会话 | `session` | 会话管理（list/show/delete）；SQLite 持久化，支持上下文自动携带与模型切换 |\n| 长文/RAG | 内置 | 超长输入自动语义切分 + map-reduce 摘要合并，支持 100k 字符文档 |\n| 多模态描述 | `describe` | 图片/视频/文档统一路由；视频走 ffmpeg 关键帧 + vision 模型，文档走长文本模型 |\n| 任务分类 | 内置 | 识别 code/reason/summarize/translate/extract 等，驱动路由 |\n| 成本统计 | `report` | 日/周/月报，跨厂商聚合花费、成功率、P95 延迟；measured/estimated 双列；可导出 HTML |\n| 预算保护 | `budget` | 月预算阈值告警，可选推企业微信 |\n| 硬件自适应 | `hardware` | 探测 CPU/内存，自动限制最大并发与单批大小，**不拖累电脑** |\n| 语义缓存 | `cache` | 相似问题命中本地缓存，跳过 API 调用，省 token 省钱（v1.1.0 加长度惩罚减少误命中） |\n| 更新提醒 | `update-check` | 比对 version.json，提示升级（联网失败静默，不阻塞） |\n| 配置查看 | `config` | 列出已配置厂商与环境变量提示 |\n\n**全部命令均可离线运行**（除真正发起 `chat` 调用时），`route/hardware/report/cache/config/update-check/version` 都不需要网络或密钥。\n\n## 四、安装与配置\n\n### 4.1 运行环境\n- Python 3.8+（Windows / macOS / Linux 均可）。\n- **除讯飞星火的可选 `websocket-client` 外，无需 `pip install` 任何依赖**；其余 11 家与全部离线功能均用标准库实现，讯飞星火签名（hmac/hashlib/base64）也自研，仅 WS 传输用可选客户端。\n\n### 4.2 配置密钥（只用环境变量，三种任选其一）\n```bash\n# 方式 A：临时（当前终端）\nexport DEEPSEEK_API_KEY=sk-xxx\nexport DASHSCOPE_API_KEY=sk-xxx        # 通义千问\nexport ZHIPU_API_KEY=sk-xxx            # 智谱\nexport MOONSHOT_API_KEY=sk-xxx         # Kimi\nexport HUNYUAN_API_KEY=sk-xxx          # 腾讯混元\nexport ARK_API_KEY=sk-xxx              # 字节豆包\nexport ERNIE_OPENAI_KEY=sk-xxx         # 文心（OpenAI 兼容端点，推荐）\n# 或文心原生：ERNIE_API_KEY=xxx  +  ERNIE_SECRET_KEY=xxx\nexport SPARK_APP_ID=xxx SPARK_API_KEY=xxx SPARK_API_SECRET=xxx  # 讯飞星火\nexport MINIMAX_API_KEY=sk-xxx          # MiniMax（abab 系列）\nexport YI_API_KEY=sk-xxx               # 零一万物 Yi\nexport BAICHUAN_API_KEY=sk-xxx         # 百川智能\nexport STEP_API_KEY=sk-xxx             # 阶跃星辰 Step\n\n# 方式 B：写进 shell 配置文件（~/.bashrc / ~/.zshrc）后 source 生效\n# 方式 C：Windows PowerShell\n$env:DEEPSEEK_API_KEY=\"sk-xxx\"\n```\n> 仅需配置你**实际要用的那一家**即可，`route` 与 `chat` 会自动只用已配置的厂商做决策。\n\n### 4.3 可选配置文件\n把 `config.example.json` 复制为 `config.json`（或 `~/.cn_llm_router_config.json`），可设月预算、更新地址、企微告警 webhook、缓存 TTL 等。**该文件不含任何密钥**。\n\n## 五、命令参考 + 运行效果示例\n\n> ⭐ **以下是每条命令的实际运行效果**，让你确认自己用对了。\n\n### 5.1 route — 路由决策（不调用 API，离线可用）\n\n```bash\n# 自动策略（根据任务类型选最合适模型）\npython scripts/router.py route --prompt \"用 Python 写个快排\"\n\n# 指定任务类型\npython scripts/router.py route --prompt \"翻译这段话到英文\" --task translate\n\n# 最省钱策略\npython scripts/router.py route --prompt \"总结这篇文章\" --strategy cheap\n\n# 最高质量策略\npython scripts/router.py route --prompt \"证明哥德巴赫猜想\" --strategy quality\n\n# 手动指定模型（跳过自动选择）\npython scripts/router.py route --prompt \"随便聊聊\" --model deepseek:deepseek-chat\n\n# JSON 格式输出（给程序调用）\npython scripts/router.py route --prompt \"分析数据\" --json\n```\n\n**auto 策略运行效果（有 Key 时）：**\n```\n$ python scripts/router.py route --prompt \"帮我写个 REST API\" --task code\n╔════════════════════════════════════════╗\n║           路由决策结果                  ║\n╚════════════════════════════════════════╝\n策略: auto | 任务: code | 推理: True\n┌────────┬─────────────────────┬────────┬──────────┐\n│ 选择   │ 模型                 │ 厂商   │ 价格     │\n├────────┼─────────────────────┼────────┼──────────┤\n│ ★ auto │ deepseek-reasoner   │ DeepSeek│ ¥0.002/千│\n│ cheap  │ deepseek-chat       │ DeepSeek│ ¥0.0001/千│\n│ quality│ glm-4               │ 智谱 GLM│ ¥0.001/千│\n└────────┴─────────────────────┴────────┴──────────┘\n最终选择: deepseek/deepseek-reasoner\n```\n\n**cheap 策略运行效果：**\n```\n$ python scripts/router.py route --prompt \"翻译 hello\" --strategy cheap\n策略: cheap | 最终选择: deepseek/deepseek-chat（¥0.0001/千tokens，最便宜）\n```\n\n**manual 模式运行效果：**\n```\n$ python scripts/router.py route --prompt \"hi\" --model deepseek:deepseek-chat\n策略: manual | 用户指定: deepseek:deepseek-chat\n```\n\n**JSON 输出效果：**\n```json\n{\"strategy\":\"manual\",\"provider\":\"deepseek\",\"model\":\"deepseek-chat\",\"classification\":{\"task_type\":\"chat\"...}}\n```\n\n### 5.2 chat — 统一调用（需配 Key）\n\n```bash\n# 基础对话（auto 策略自动选模型）\npython scripts/router.py chat --prompt \"解释一下量子计算\"\n\n# 流式输出（逐字显示，适合长回答）\npython scripts/router.py chat --prompt \"写一篇500字的AI发展报告\" --stream\n\n# 带系统提示词\npython scripts/router.py chat --prompt \"翻译以下内容\" --system \"你是专业翻译\"\n\n# 禁用缓存（强制每次都调 API）\npython scripts/router.py chat --prompt \"最新天气\" --no-cache\n\n# JSON 结构化输出\npython scripts/router.py chat --prompt \"1+1等于几\" --json\n\n# 手动指定模型\npython scripts/router.py chat --prompt \"你好\" --model qwen:qwen-plus\n\n# 设超时时间（秒）\npython scripts/router.py chat --prompt \"长问题...\" --timeout 120\n```\n\n**chat 运行效果（非流式）：**\n```\n$ python scripts/router.py chat --prompt \"1+1等于几\" --model auto\n[路由] 选择: deepseek/deepseek-chat (auto)\n[调用] deepseek/deepseek-chat ...\n[完成] 1 + 1 = 2\n━━━ 成本 ━━━\n输入 tokens: 12    输出 tokens: 8    预估费用: ¥0.000002\n```\n\n**chat 运行效果（流式）：**\n```\n$ python scripts/router.py chat --prompt \"介绍Python\" --stream --model auto\n[路由] 选择: deepseek/deepseek-chat (auto)\n[调用] deepseek/deepseek-chat (流式)...\nPython 是一门高级编程语言，由 Guido van Rossum 于 1991 年发布。\n它以简洁明了的语法著称，广泛用于 Web 开发、数据分析、人工智能等领域。\n...\n[流式结束] 输入 tokens: ~15(估)  输出 tokens: ~85(估)  费用: ¥0.000010\n```\n> 💡 **流式模式下 token 数标注 `(估)` 表示该数值来自文本估算（部分厂商流式不返回精确 usage），非精确账单。精确用量以厂商控制台为准。\n\n**无 Key 时的友好报错：**\n```\n$ python scripts/router.py chat --prompt \"hi\"\n❌ 当前未检测到任何已配置的厂商 API Key。\n请至少设置一个环境变量，例如：\n  export DEEPSEEK_API_KEY=sk-xxx\n然后运行 python scripts/router.py config 查看当前配置状态。\n```\n\n### 5.3 report — 成本报表\n\n```bash\n# 本月报表（文本格式）\npython scripts/router.py report --period month\n\n# 导出 HTML 报表\npython scripts/router.py report --period month --html cost_report.html\n\n# 今日报表\npython scripts/router.py report --period day\n\n# 本周报表\npython scripts/router.py report --period week\n```\n\n**文本报表效果：**\n```\n$ python scripts/router.py report --period month\n╔══════════════ 2026-07 月度成本报表 ══════════════╗\n│ 统计周期: 2026-07-01 ~ 2026-07-10                  │\n│ 总调用次数: 42                                     │\n│ 总花费:     ¥0.0321                                │\n│ 成功率:     97.6%                                  │\n│ P95 延迟:   1,230 ms                               │\n├───────────────────────────────────────────────────┤\n│ 厂商           │ 花费      │ 调用 │ 输入tok │ 输出tok │\n│ deepseek       │ ¥0.0210  │ 28   │ 12,400  │ 8,200   │\n│ glm            │ ¥0.0111  │ 14   │ 6,800   │ 4,100   │\n╚═══════════════════════════════════════════════════╝\n```\n\n### 5.4 budget — 预算检查\n\n```bash\npython scripts/router.py budget\n```\n\n**运行效果：**\n```\n$ python scripts/router.py budget\n╔═══════════════ 预算检查 ═══════════════╗\n│ 本月已花费:  ¥0.0321                    │\n│ 月预算上限:  ¥50.00                     │\n│ 剩余额度:    ¥49.9679 (99.9%)           │\n│ 状态:        ✅ 安全                     │\n╚═══════════════════════════════════════╝\n```\n\n### 5.5 cache — 缓存管理\n\n```bash\n# 查看缓存条目\npython scripts/router.py cache stats\n\n# 清空缓存\npython scripts/router.py cache clear\n```\n\n**运行效果：**\n```\n$ python scripts/router.py cache stats\n缓存路径: C:\\Users\\你的用户名\\.cn_llm_router\\cache.db\n缓存条目: 15 条\n模糊匹配阈值: 0.80（最短查询长度: 8 字符，含长度惩罚）\n\n$ python scripts/router.py cache clear\n已清空 15 条缓存记录\n```\n\n### 5.6 config — 查看配置\n\n```bash\npython scripts/router.py config\n```\n\n**运行效果（未配 Key 时）：**\n```\n$ python scripts/router.py config\n╔══════════════ 当前配置 ═══════════════╝\n│ 已配置厂商: 无                          │\n│                                              │\n│ 可用环境变量:                                │\n│   DEEPSEEK_API_KEY        — DeepSeek        │\n│   DASHSCOPE_API_KEY       — 通义千问         │\n│   ZHIPU_API_KEY           — 智谱 GLM         │\n│   MOONSHOT_API_KEY        — Kimi (月之暗面)  │\n│   HUNYUAN_API_KEY         — 腾讯混元         │\n│   ARK_API_KEY             — 字节豆包         │\n│   ERNIE_OPENAI_KEY        — 百度文心(推荐)   │\n│   SPARK_APP_ID + _API_KEY + _API_SECRET — 讯飞│\n│   MINIMAX_API_KEY         — MiniMax         │\n│   YI_API_KEY              — 零一万物 Yi      │\n│   BAICHUAN_API_KEY        — 百川智能         │\n│   STEP_API_KEY            — 阶跃星辰 Step    │\n╚══════════════════════════════════════════════╝\n```\n\n### 5.7 update-check / version — 更新与版本\n\n```bash\npython scripts/router.py update-check\npython scripts/router.py version\n```\n\n**运行效果：**\n```\n$ python scripts/router.py version\ncn-llm-router v2.2.0 | 作者: njskills@agent.qq.com\n主页: https://skillhub.cn/skill/cn-llm-router\n\n$ python scripts/router.py update-check\n✅ 已是最新版本 v2.2.0\n```\n\n> Windows 用户把 `python` 换成 `python.exe` 或 `py`；PowerShell 里环境变量用 `$env:XXX=\"...\"`。\n\n## 五（B）、能力画像智能选型（v2.1）\n\n`references/models.yaml` 里每个模型都带三项**能力画像**（0-10 的本地静态经验值，不联网、不打分服务）：\n\n| 字段 | 含义 | auto 策略如何用 |\n|------|------|----------------|\n| `reason_score` | 推理能力 | 推理类任务选此项最高者 |\n| `code_score` | 代码能力 | 代码类任务选此项最高者 |\n| `long_score` | 长文能力 | 长文任务在超长上下文中选此项最高者 |\n\n`auto` 策略决策链：**需推理 → 优先 reasoner 且推理画像最强；长文 → ≥128k 上下文且长文画像最强；代码 → 代码画像最强（同分选更便宜）；价格敏感 → 最便宜；常规 → 均衡默认**。\n\n> 好处：新增厂商只要在 `models.yaml` 填好画像，就会被 `auto` 自动纳入选型，**无需改任何代码**。v2.1 新增的 MiniMax / 零一万物 Yi / 百川 / 阶跃 Step 正是如此接入。画像为经验参考值，追求极致效果请用 `--strategy quality` 或 `--model 厂商:模型` 手动指定。\n\n## 六、硬件自适应（不拖累电脑）\n\n`hardware.py` 在**首次运行/每次运行**时自动探测本机：\n- CPU 逻辑核心数、物理内存总量；\n- 据此分级：`low`（≤4 核或 ≤8GB）→ `mid` → `high`（≥8 核且 ≥16GB）；**内存探测失败时保守回退 low 档**；\n- 自动推导 `max_concurrency`（最大并发，默认 low=1 / mid=2 / high=4）与 `batch_size`（单批大小）；\n- 提供 `recommend_subtasks(total)` 把大任务拆成「不超过并发数」的子任务，**避免一次性铺满 CPU/内存**。\n\n调用方应读取 `hardware.profile()` 的结果来约束自己的并发与批处理，做到「自适应，不抢占用户资源」。语义缓存进一步减少重复 API 调用，间接降低本机网络与等待开销。\n\n## 六（B）、v2.0 全链路离线 Mock 模式（开发者调试利器）\n\n> 🔧 **核心能力**：无网络/无密钥也能跑通 `chat → report → budget → cache` 完整流程。\n\n### 6B.1 快速体验\n\n```bash\n# 基础 mock：不调 API，从本地预设库返回\npython scripts/router.py chat --prompt \"用 Python 写个快排\" --mock\n\n# 带延迟的 mock：模拟 2 秒网络延迟\npython scripts/router.py chat --prompt \"翻译这段话\" --mock --latency 2000\n\n# 流式 mock：逐字输出模拟真实流式体验\npython scripts/router.py chat --prompt \"写个故事\" --mock --stream --latency 500\n\n# JSON 格式输出（供程序调用）\npython scripts/router.py chat --prompt \"分析数据\" --mock --json\n```\n\n**Mock 模式运行效果：**\n```\n$ python scripts/router.py chat --prompt \"用 Python 写个快排\" --mock\n🤖 [Mock / preset] Mock 模式（离线调试，不调用真实 API）\n\n以下是 Python 快速排序的实现：\n\n```python\ndef quick_sort(arr):\n    if len(arr) <= 1:\n        return arr\n    pivot = arr[len(arr) // 2]\n    left = [x for x in arr if x < pivot]\n    middle = [x for x in arr if x == pivot]\n    right = [x for x in arr if x > pivot]\n    return quick_sort(left) + middle + quick_sort(right)\n```\n\n────────── 用量 ──────────\n  token: 入 45 / 出 180 ｜ 花费 ¥0.000000（Mock 免费）｜ 耗时 0ms\n```\n\n### 6B.2 预设场景库（12 个常见场景）\n\nMock 数据完全本地（`references/mock_data.json`），覆盖以下场景：\n\n| 场景 ID | 任务类型 | 匹配关键词 | 响应内容 |\n|---------|----------|-----------|---------|\n| code_quick_sort | code | 排序/sort/快排/算法/python | Python 快排实现代码 |\n| reason_math_proof | reason | 证明/推导/定理/数学 | 勾股定理欧几里得证明 |\n| translate_zh_en | translate | 翻译/translate/英文 | 中英翻译文本 |\n| summarize_long | summarize | 总结/概括/摘要 | 文档核心要点（5 条） |\n| extract_info | extract | 提取/抽取/实体 | 结构化实体 JSON |\n| chat_greeting | chat | 你好/hello/hi/在吗 | AI 助手自我介绍 |\n| code_debug | code | bug/报错/debug/修复 | 调试建议 + 修复方案 |\n| long_context_analysis | chat | 分析/解读/对比/评估 | 综合分析报告 |\n| data_analysis | extract | 数据/报表/趋势/统计 | 数据表格 + 洞察 |\n| creative_writing | chat | 写/创作/故事/文案 | 小说片段 |\n| general_qa | chat | 是什么/为什么/怎么 | 通用问答模板 |\n| fallback | chat | （无匹配时兜底） | 通用兜底响应 |\n\n### 6B.3 网络自动检测与熔断\n\n启动时自动检测各厂商 API 可达性：\n- **所有厂商不可达** → 自动进入 Mock 模式，提示「网络不可用，已自动切换至 Mock 模式」\n- **部分厂商不可达** → 仅熔断不可达厂商，不切换 Mock\n- **性能优化**：检测结果缓存 60 秒，正常模式启动额外开销 <50ms\n\n### 6B.4 交互式 Mock 数据编辑器\n\n```bash\n# 进入交互式编辑\npython scripts/router.py mock --edit\n\n# 列出所有自定义 mock 场景\npython scripts/router.py mock --list\n```\n\n编辑器支持：\n- 添加自定义 mock 场景（ID / 任务类型 / 关键词 / 优先级 / 响应内容 / token 数）\n- 删除已有场景\n- 实时测试 query 匹配效果\n\n自定义 mock 存储在本地 SQLite（`~/.cn_llm_router/mock.db`），优先级高于预设库。\n\n### 6B.5 Mock 回归测试\n\n```bash\n# 运行 mock 专项测试（无需网络+无需密钥）\npython scripts/router.py test --mock\n```\n\n覆盖 10 项 mock 专项测试：\n1. Mock 基础响应（code 类型）\n2. Mock 翻译场景\n3. Mock 推理场景\n4. Mock 缓存命中\n5. Mock 缓存未命中\n6. Mock 延迟模拟\n7. Mock 流式输出\n8. Mock JSON 输出\n9. Mock 自定义场景\n10. Mock 兜底场景\n\n### 6B.6 定位边界（严守死规则#8）\n\n| 不做 | 原因 |\n|------|------|\n| ❌ 本地模型推理 | Mock 只返回预设文本，不调本地模型 |\n| ❌ Mock 数据云同步 | 数据完全本地（JSON + SQLite） |\n| ❌ 生产环境 mock | Mock 模式仅限开发调试，生产强制禁用 |\n| ❌ 替代真实测试 | Mock 用于开发调试，真实测试仍需联网 |\n\n\n\n1. **密钥仅在内存中读取，从环境变量获取**；本技能**不写入、不读取、不打包任何 `.env` 或密钥文件**。请自行保管好环境变量与终端历史。\n2. **网络调用只发往各厂商官方 API 域名**（见 `references/models.yaml` 的 `base_url`），不会发往任何第三方。文心/星火签名在本地完成。\n3. **成本数据库与缓存为本地 SQLite 文件**（默认在用户目录，如 `~/.cn_llm_router/`），不上传、不含密钥，可随时 `cache clear` 删除。\n4. **更新检查联网失败会静默跳过**，不会因此报错阻塞你的工作；更新地址默认指向 SkillHub，可在 `config.json` 改为你信任的地址。\n5. **本技能不含任何可执行二进制 / 脚本类风险文件**（无 `.exe/.ps1/.bat/.sh/.vbs` 等），纯 `.py` 源码 + 文档 + 数据，可被只读审查。\n6. **不收集任何个人隐私数据**：prompt 内容仅用于本地分类与缓存，默认不上报；如需成本聚合请自行管理本地数据库。\n7. **语义缓存在本地做模糊匹配**（v1.1.0 加入长度惩罚机制），理论上不同问题可能被判定为「相似」而误命中缓存。关键场景（如生产环境、金融计算）建议加 `--no-cache` 关闭缓存，确保每次都是实时结果。\n\n> 依赖风险：除讯飞星火的可选 `websocket-client` 外，本技能无任何强制第三方依赖（自研 YAML 解析、自研 WebSocket 签名），不存在供应链投毒面；不装该包时，星火调用会给出中文安装指引，不影响其余 11 家与全部离线功能。\n\n## 八、能力边界（明确不做）\n\n- ❌ 不托管、不代理、不存储你的厂商 API Key；密钥由你自己的环境变量负责。\n- ❌ 不保证各厂商 API 的可用性、速率限制、内容合规——这些由各厂商侧决定，失败会返回中文报错（见下）。\n- ❌ 不实现微调/训练/向量库/RAG 管线，这是一个「路由 + 成本 + 限流」层，不是 Agent 框架。\n- ❌ 模型实际效果取决于厂商版本与配额；本技能的「最优模型」是基于**注册表里的价格/上下文/推理能力标签**的启发式推荐，非实时基准测试。\n- ❌ 语义缓存为本地模糊匹配（含长度惩罚的相似度阈值），可能误命中或漏命中，关键场景请用 `--no-cache`。\n- ❌ 跨厂商价格随官方调整而变化，`references/models.yaml` 中的 `price_*` 是示例值，请以官方最新定价为准。\n- ❌ 流式输出的 token 计数为**估算值**（基于中英文混合字符规则），非厂商精确计费值；精确用量请以各厂商控制台账单为准。\n\n## 九、反模式（这些用法是错的，不要这样做）\n\n> ⚠️ 以下是用户最容易踩的坑，逐一列出供你避开。\n\n| 反模式 | 为什么错 | 正确做法 |\n|--------|----------|----------|\n| 在 `.env` 文件里放 Key 再让脚本去读 | 本技能**刻意不读** `.env` 文件，写了也不会生效 | 只用环境变量：`export DEEPSEEK_API_KEY=sk-xxx` |\n| 用 `chat` 调用前不先跑 `route` 确认 | 可能选到不合适的模型浪费钱 | 先 `route --prompt \"...\"` 看推荐，再用 `chat` 执行 |\n| 对「翻译一段新闻」这种长文本用 `--prompt` 直接传 | 命令行参数长度有限制，超长文本会被截断 | 把长文本写入文件，通过管道或未来版本的多模态接口传入 |\n| 在低配机器（≤4核≤8GB）上设高并发 | `hardware` 会限制并发，但手动绕过会卡死电脑 | 相信 `hardware` 的自动限制，不要手动改 `max_concurrency` |\n| 把 `config.json` 当密钥存储 | 该文件**不应包含**任何 Key | 只存 budget/update_url/webhook 等非敏感配置 |\n| 忽略 `--no-cache` 在关键场景的使用 | 模糊缓存可能对「类似但不同」的问题返回旧答案 | 金融计算、代码生成、实时信息查询务必加 `--no-cache` |\n| 混淆 `--strategy quality` 和 `--model auto` | `quality` 固定选最贵最强的模型；`auto` 会根据任务类型智能匹配 | 日常用 `auto`；只有对质量要求极高且不在乎费用时才用 `quality` |\n| 期望流式 token 统计精确到个位 | 流式模式下多数厂商不返回逐块 usage | 流式 token 数标注 `(估)`，精确账单看厂商后台 |\n\n## 十、中文报错指引（常见问题 → 怎么办）\n\n| 现象 / 报错 | 原因 | 解决 |\n|------------|------|------|\n| `当前未检测到任何厂商 API Key...` | 没设环境变量 | 按第四节 `export` 至少一家；或先 `route` 看建议 |\n| `调用失败：HTTP 401` | Key 错误/过期 | 重新生成厂商 Key 并刷新环境变量 |\n| `调用失败：HTTP 429` | 触发厂商限速 | 降低并发（见 `hardware`），或换策略/厂商 |\n| `调用失败：HTTP 404` | 模型名不匹配 | 检查 `references/models.yaml` 中该厂商 `models[].name` |\n| `调用失败：timed out` | 网络慢/超时 | 加大 `--timeout`（秒），或重试 |\n| `未找到模型: xxx` | manual 指定模型不存在 | 用 `route --model provider:model` 时确认名称 |\n| `解析注册表失败` | models.yaml 被改坏 | 用 `git diff` 还原或重新拉取技能 |\n| `更新检查失败` | 无网络 | 正常，静默跳过；不影响使用 |\n| `讯飞星火需要可选依赖 websocket-client` | 未安装星火的 WS 库 | `pip install websocket-client`，或不使用星火改用其他 11 家 |\n| `流式读取中断` | 网络中途断开 | 重试即可；已内置重试机制（最多 2 次，指数退避） |\n\n所有报错均为中文，且 `chat`/`route` 异常会被捕获后以 `❌ ...` 友好提示退出（**不会抛 Python traceback**）。\n\n## 十一、FAQ\n\n**Q1：一定要配 Key 才能用吗？**\n不一定。`route`（建议模式）、`hardware`、`report`、`cache`、`update-check`、`version` 都**不需要 Key**，可纯离线体验路由逻辑与硬件画像。只有 `chat`（真正调用大模型）才需要至少一个厂商的 Key。\n\n**Q2：怎么新增一个厂商？**\n编辑 `references/models.yaml`，加一段 `providers.<新厂商>`（填 `adapter`/`base_url`/`env_hint`/`models`），并给每个模型补能力画像 `reason_score`/`code_score`/`long_score`（0-10）；若该厂商走 OpenAI 兼容协议则**无需写任何代码**（v2.1 新增的 MiniMax/Yi/百川/阶跃就是这样接入的）；非兼容协议在 `scripts/adapters/` 加一个适配器即可，路由逻辑零改动。补了能力画像后，`auto` 策略会自动把该厂商纳入智能选型。\n\n**Q3：成本统计准吗？**\n非流式调用：计费公式透明（`compute_cost(price, in, out)`），精度取决于厂商返回的 `usage` 字段，通常准确。流式输出：**token 数为估算值**（基于中文字≈1.5 tok/字、英文词≈1.3 tok/词的混合规则），标注 `(估)`，仅供参考，**不作为精确账单**。精确用量以各厂商控制台为准。\n\n**Q4：会拖慢我的电脑吗？**\n不会。`hardware` 自动限制并发与批大小（内存探测失败时回退最低档）；调用是网络 I/O 密集型，不占 CPU；缓存减少重复调用。即使在树莓派级别的设备上也能安全运行。\n\n**Q5：我的对话会被上传吗？**\n不会。prompt 只在本地做分类与缓存，默认不上传任何服务器；成本库与缓存在你本地目录（`~/.cn_llm_router/`）。唯一联网行为是调用厂商 API（你主动发的请求）和可选的版本更新检查。\n\n**Q6：支持流式吗？**\n支持，`chat --stream`；所有 12 家厂商均可流式输出，内容逐字生成、无需等待全部完成。分类器会判断任务是否适合流式（`stream_friendly` 字段：对话/翻译/代码/摘要适合流式；数学推理/结构化抽取建议一次性返回，避免半截思维链误导）。注意流式下 token 为估算值（见 Q3）。\n\n**Q7：缓存会不会返回错误答案？（误命中问题）**\n有可能，但概率很低。v1.1.0 引入了三层防护：\n1. **最短查询限制**：不足 8 字符的 query 不做模糊匹配；\n2. **长度惩罚系数**：两句话长度差异越大，相似度得分越低；\n3. **高阈值门槛**：调整后相似度仍需 ≥ 0.80 才命中。\n关键场景（金融、代码、实时信息）建议加 `--no-cache` 关闭缓存。\n\n**Q8：哪个厂商最便宜？**\n以 `references/models.yaml` 示例价格参考（实际以官方为准）：DeepSeek Chat 通常最便宜（¥0.0001/千 tokens），适合日常对话和简单任务。复杂推理建议用 DeepSeek Reasoner 或 GLM-4。可通过 `route --strategy cheap` 实时查看当前最便宜选项。\n\n**Q9：支持多轮对话吗？**\n当前版本每次 `chat` 调用是独立的单轮请求。多轮对话可通过 `--system` 设置系统提示词来模拟上下文。后续版本计划加入对话历史管理。\n\n**Q10：如何在企业微信/钉钉里收到预算告警？**\n在 `config.json` 中设置 `webhook_url`（企微/钉钉机器人地址），然后运行 `python scripts/router.py budget` 即可推送。详见 `config.example.json` 注释。\n\n## 十二、使用场景推荐与调优建议\n\n### 场景一：日常开发助手（最常用）\n```bash\n# 写代码 — auto 策略会自动选推理强的模型\npython scripts/router.py chat --prompt \"用 Python 实现一个二叉搜索树\" --task code\n\n# 读代码/重构建议\npython scripts/router.py chat --prompt \"优化这段代码的性能\" --task code < mycode.py\n\n# 调优建议：开发任务优先用 auto（性价比最高），不用 quality（太贵）\n```\n\n### 场景二：批量文档处理（省钱关键）\n```bash\n# 先看路由建议（不花钱）\nfor f in *.md; do\n  python scripts/router.py route --prompt \"$(head -5 $f)\" --strategy cheap\ndone\n\n# 确认没问题后再批量调用（cheap 策略保底最省）\nfor f in *.md; do\n  python scripts/router.py chat --prompt \"总结这个文件\" --strategy cheap --no-cache < \"$f\"\ndone\n\n# 调优建议：批量任务务必用 --strategy cheap + 硬件自适应并发\npython scripts/router.py hardware  # 先看建议并发数\n```\n\n### 场景三：翻译与本地化\n```bash\n# 翻译 — auto 能识别 translate 任务\npython scripts/router.py chat --prompt \"翻译成日文：${content}\" --task translate\n\n# 调优建议：翻译任务不需要强推理模型，cheap 即可胜任\n```\n\n### 场景四：学习与研究（追求质量）\n```bash\n# 复杂学术问题 — quality 策略选最强模型\npython scripts/router.py chat --prompt \"解释 Transformer 的注意力机制\" --strategy quality\n\n# 数学证明 — quality + reason 组合最强\npython scripts/router.py chat --prompt \"证明拉格朗日中值定理\" --task reason --strategy quality\n\n# 调优建议：学习研究不差钱就用 quality，差钱用 auto 也够用（95% 场景覆盖）\n```\n\n### 通用调优建议\n| 建议 | 说明 |\n|------|------|\n| **先 route 后 chat** | 每次 `chat` 前 `route` 看一眼推荐，避免选错模型浪费钱 |\n| **善用 --no-cache** | 实时信息、金融计算、代码生成等关键任务关闭缓存 |\n| **定期看 report** | `report --period month` 了解花费分布，发现异常及时止损 |\n| **设预算保护** | `config.json` 里设置 `monthly_budget`，超支前收到告警 |\n| **硬件自适应别绕过** | 不要手动改 `max_concurrency`，相信自动检测结果 |\n\n## 十三、更新提醒\n\n本技能内置 `update-check` 命令：比对本地 `version.json` 与发布源版本号，若有新版会提示你升级。**建议在定时任务或每次使用前跑一次**：\n\n```bash\npython scripts/router.py update-check\n```\n\n升级方式：通过 SkillHub 或你常用的发布流程更新本技能即可。更新日志见各版本 `version.json` 的 `notes` 字段。\n\n## 更新日志\n\n| v2.6.0 | 2026-08-17 | 增加：embed/rerank 统一接口——CLI 新增 embed/rerank 子命令（--json 输出），AdapterBase 与 OpenAICompatAdapter 新增 embed/rerank 方法，按厂商差异封装 auth/request 格式；增加：RAG/长文路由——classifier 识别长任务时优先选 ≥128k 上下文模型，超长输入走 text_splitter 语义边界切分 + map-reduce 摘要合并，支持 100k 字符文档；增加：多轮会话管理——chat 新增 --session 参数，session_manager.py 维护 SQLite 对话表（session ID / 消息历史 / 模型），支持上下文自动携带与会话内模型切换（历史压缩摘要注入）；增加：describe 命令扩展视频/文档路由——视频走 ffmpeg 关键帧提取后调 vision 模型，文档走长文本模型，统一编排输出含模型 + token 计费；优化：流式 token 计数对齐——优先使用厂商 usage 回执字段，缺失时按 chunk 估算并标注 (est)，成本报表拆分 measured/estimated 两列 |\n| v2.5.0 | 2026-08-17 | 增加：共享内核模式——adapters/cost_tracker/cache/health_check/config/yaml_simple 公共代码抽为 llm-core/ 源码目录，build_core.py 构建脚本在发布时 vendor 注入双包（cn-llm-router + cn-model-gateway），生成 _core_lock.json 版本锁确保同源；增加：build_core.py 三个子命令（inject 注入 / check 版本一致性检查 / regression 双端回归门禁冒烟测试）；增加：能力实测校准器 calibrate.py——跑标准题集（分类/代码/长文各 5 题）实测回填 models.yaml 画像分数，每题 2 分，标注来源（实测+日期），支持全量/抽样预算配置；优化：ernie.py 适配器精简——更新 docstring 标注推荐走 OpenAI 兼容通道，原生签名路径保留作兜底；新增：yaml_simple.py 新增 dump/dump_file 写入功能，支持 Python 对象序列化为 YAML |\n| v2.4.0 | 2026-08-16 | 增加：多模态路由——classifier.py 新增 image/audio 任务识别，models.yaml 新增 Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型厂商，路由层按 multimodal 能力标签过滤候选模型；优化：arena 子命令新增 --blind 开关，--blind 时隐藏模型名盲选投票（原行为），不加时显示模型名直接对比，消除两套重复并行调用代码；优化：流式 token 估算改为复用基类 _extract_usage() 统一取值，覆盖 prompt_tokens/input_tokens/completion_tokens/output_tokens 四种字段名，提升有 usage 返回厂商的计费精度\n| v2.2.0 | 2026-08-01 | 增加：模型竞技场 arena（并行调用 2-4 家模型，盲选最佳回答，长期追踪各模型胜率）；增加：健康检查 health-check（3 秒超时、60s 缓存、并行 ping）；增加：模型降级与故障转移（超时自动切备用模型，最多重试 2 次，成本报表标注降级事件）；增加：AdapterTimeoutError 子类（区分超时与鉴权失败）|\n| v2.1.0 | 2026-07-24 | 增加：MiniMax（abab 系列）、零一万物 Yi、百川智能、阶跃星辰 Step-2 四家厂商，覆盖扩展至 12 家 32 款模型；增加：DeepSeek V3 及全部模型的能力画像字段（推理/代码/长文得分）；优化：auto 策略改由能力画像驱动智能选型，新增厂商填画像即被自动纳入、无需改代码；增加：分类器 stream_friendly 流式适配判断（对话/翻译/代码适合流式，推理/抽取建议一次性）；修复：流式输出 token 计费恒为 0 的问题，改用估算兜底并标注（估） |\n| v2.0.0 | 2026-07-16 | 新增：全链路离线 Mock 模式（`--mock`），含 12 个预设场景（代码/推理/翻译/摘要/提取/分析/创意写作等）；新增：网络自动检测与厂商级熔断（所有厂商不可达时自动进入 mock 模式）；新增：延迟模拟（`--latency 2000`）用于测试超时降级；新增：交互式 Mock 数据编辑器（`mock --edit`）支持自定义 query→response 映射；新增：Mock 回归测试（`test --mock`，10 项 mock 专项测试）；定位：mock 数据完全本地（JSON + SQLite），不依赖外部 API，仅限开发调试，生产环境强制禁用 |\n| v1.1.0 | 2026-07-10 | 优化：缓存模糊匹配加入长度惩罚系数与最短查询限制，大幅减少「答非所问」式误命中；提升：流式输出 token 估算精度（无 usage 时按中英文混合规则兜底并标注「估」）；新增：SKILL.md 命令运行效果示例（每个命令均有真实输出样例）、反模式章节（8 条常见坑）、FAQ 扩充至 10 条、使用场景推荐与调优建议章节；修复：displayName 改为中文「国产大模型统一路由」，解决上传后显示英文名的问题 |\n| v1.0.0 | 2026-07-09 | 首发：单入口路由 + 任务感知策略（auto/cheap/quality/manual）+ 跨模型成本聚合 + 硬件自适应并发限制 + 本地语义缓存 + 更新提醒 + 8 家国产大模型全覆盖 |\n\n## 十四、安全与发布合规\n\n- 本技能**已规避全部默认拦截文件类型**：包内仅含 `.py` 源码、`.md` 文档、`.yaml`/`.json` 数据，**不含** `.bat/.cmd/.ps1/.vbs/.exe/.dll/.lnk/.msi/.docx/.xlsx/.pptx/.iso/.dmg/.zip/.rar/.7z/.tar/.gz/.apk/.jar/.DS_Store/.env/.log/.tmp/.sh/.com/.scr/.hta/.reg` 等任何风险文件。\n- 安全 grep 结果：**无 `eval/exec/os.system/subprocess/pickle` 调用**，所有网络 I/O 仅通过 `urllib` 发往官方域名或用户配置地址，均带超时 + try/except 保护。\n- 已通过「无硬编码密钥、核心无第三方依赖（讯飞星火仅可选 websocket-client）、纯标准库」的自检，可直接提交安全扫描。\n\n## 十五、反馈与建议\n\n有更好建议、遇到 bug、想加厂商，欢迎来信：**njskills@agent.qq.com**\n\n---\n\n*版本：v2.6.0 ｜ 许可：MIT ｜ 核心纯标准库（讯飞星火可选 websocket-client）、零密钥打包、可只读审计。*\n\nFile v2.6.0:_meta.json\n\n{\n  \"ownerId\": \"kn7chdrwbdhaqkwajcyhtfvjx989ddb1\",\n  \"slug\": \"cn-llm-router\",\n  \"version\": \"2.6.0\",\n  \"publishedAt\": 1789614344803\n}\n\nFile v2.6.0:references/mock_data.json\n\n{\n  \"_说明\": \"Mock 预设响应库 — 仅开发调试用，完全本地，不同步到任何云端。覆盖 12 个常见场景。\",\n  \"scenarios\": [\n    {\n      \"id\": \"code_quick_sort\",\n      \"task_type\": \"code\",\n      \"keywords\": [\"排序\", \"sort\", \"快排\", \"算法\", \"python\", \"代码\", \"code\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"以下是 Python 快速排序的实现：\\n\\n```python\\ndef quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n```\\n\\n时间复杂度：平均 O(n log n)，最坏 O(n²)。空间复杂度：O(n)。\",\n        \"in_tokens\": 45,\n        \"out_tokens\": 180\n      }\n    },\n    {\n      \"id\": \"reason_math_proof\",\n      \"task_type\": \"reason\",\n      \"keywords\": [\"证明\", \"推导\", \"定理\", \"数学\", \"reason\", \"推理\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"勾股定理证明（欧几里得证法）：\\n\\n设直角三角形两直角边为 a、b，斜边为 c。\\n构造边长为 (a+b) 的正方形，内部含四个全等直角三角形和一个小正方形。\\n\\n大正方形面积 = (a+b)² = 4×(½ab) + c²\\n展开：a² + 2ab + b² = 2ab + c²\\n化简：a² + b² = c²\\n\\n证毕。\",\n        \"in_tokens\": 30,\n        \"out_tokens\": 150\n      }\n    },\n    {\n      \"id\": \"translate_zh_en\",\n      \"task_type\": \"translate\",\n      \"keywords\": [\"翻译\", \"translate\", \"英文\", \"english\", \"中英文\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"Translation: Artificial intelligence is rapidly transforming every aspect of our lives, from healthcare and education to transportation and entertainment. While the technology brings unprecedented convenience and efficiency, it also raises important questions about privacy, employment, and ethics that society must address proactively.\",\n        \"in_tokens\": 25,\n        \"out_tokens\": 55\n      }\n    },\n    {\n      \"id\": \"summarize_long\",\n      \"task_type\": \"summarize\",\n      \"keywords\": [\"总结\", \"概括\", \"摘要\", \"summarize\", \"归纳\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"文档核心要点：\\n\\n1. 背景：大模型技术正从「对话」向「执行」演进，Agent 成为新范式\\n2. 关键变更：引入函数调用、长期记忆、多步骤规划三大能力\\n3. 数据：基准测试准确率从 72% 提升至 89%，推理成本下降 40%\\n4. 风险：幻觉率仍达 12%，需要人工审核兜底\\n5. 建议：优先在低风险场景试点，逐步向核心业务扩展\",\n        \"in_tokens\": 200,\n        \"out_tokens\": 120\n      }\n    },\n    {\n      \"id\": \"extract_info\",\n      \"task_type\": \"extract\",\n      \"keywords\": [\"提取\", \"抽取\", \"实体\", \"extract\", \"信息\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"{\\n  \\\"entities\\\": [\\n    {\\\"type\\\": \\\"公司\\\", \\\"value\\\": \\\"腾讯科技\\\"},\\n    {\\\"type\\\": \\\"时间\\\", \\\"value\\\": \\\"2026年7月\\\"},\\n    {\\\"type\\\": \\\"金额\\\", \\\"value\\\": \\\"5.2亿元\\\"},\\n    {\\\"type\\\": \\\"事件\\\", \\\"value\\\": \\\"战略融资\\\"}\\n  ],\\n  \\\"confidence\\\": 0.94\\n}\",\n        \"in_tokens\": 80,\n        \"out_tokens\": 95\n      }\n    },\n    {\n      \"id\": \"chat_greeting\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"你好\", \"hello\", \"hi\", \"嗨\", \"在吗\", \"介绍\"],\n      \"priority\": 5,\n      \"response\": {\n        \"content\": \"你好！我是 AI 助手，可以帮你解答问题、写代码、翻译文档、分析数据等。请告诉我你需要什么帮助？\",\n        \"in_tokens\": 10,\n        \"out_tokens\": 45\n      }\n    },\n    {\n      \"id\": \"code_debug\",\n      \"task_type\": \"code\",\n      \"keywords\": [\"bug\", \"报错\", \"debug\", \"修复\", \"错误\", \"异常\", \"traceback\"],\n      \"priority\": 9,\n      \"response\": {\n        \"content\": \"根据错误信息分析：\\n\\n问题原因：`NoneType` 对象没有属性 `split`，说明变量在处理前未正确赋值。\\n\\n修复建议：\\n1. 检查上游函数是否返回了 None\\n2. 添加空值守卫：`if text is not None: text.split()`\\n3. 或使用空合并：`text = get_value() or \\\"\\\"`\\n\\n建议在第 42 行前增加类型检查，确保输入非空。\",\n        \"in_tokens\": 60,\n        \"out_tokens\": 130\n      }\n    },\n    {\n      \"id\": \"long_context_analysis\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"分析\", \"解读\", \"对比\", \"评估\", \"analysis\"],\n      \"priority\": 7,\n      \"response\": {\n        \"content\": \"综合分析报告：\\n\\n## 优势\\n- 方案 A：成本低、落地快，适合 MVP 验证\\n- 方案 B：扩展性强、长期 ROI 高，适合规模化部署\\n\\n## 风险\\n- 方案 A：技术债积累，6 个月后可能需重构\\n- 方案 B：初期投入大，团队学习曲线陡峭\\n\\n## 建议\\n- 0-3 个月：用方案 A 快速验证核心假设\\n- 3-6 个月：根据数据决定是否迁移到方案 B\\n- 关键指标：用户留存率、边际成本、故障率\",\n        \"in_tokens\": 150,\n        \"out_tokens\": 200\n      }\n    },\n    {\n      \"id\": \"data_analysis\",\n      \"task_type\": \"extract\",\n      \"keywords\": [\"数据\", \"报表\", \"趋势\", \"统计\", \"data\", \"chart\"],\n      \"priority\": 8,\n      \"response\": {\n        \"content\": \"数据分析结果：\\n\\n| 指标 | Q1 | Q2 | 环比 |\\n|------|-----|-----|------|\\n| DAU | 12.3万 | 15.8万 | +28% |\\n| 留存 | 45% | 52% | +7pp |\\n| 收入 | ¥320万 | ¥480万 | +50% |\\n\\n关键洞察：7 月新上线的个性化推荐功能显著提升了用户粘性和付费转化率。建议继续优化推荐算法，目标 Q3 留存达到 55%。\",\n        \"in_tokens\": 100,\n        \"out_tokens\": 160\n      }\n    },\n    {\n      \"id\": \"creative_writing\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"写\", \"创作\", \"故事\", \"文案\", \"文章\", \"creative\", \"write\"],\n      \"priority\": 6,\n      \"response\": {\n        \"content\": \"在那个雨水敲打着玻璃的深夜，她终于打开了一封尘封了二十年的信封。\\n\\n泛黄的纸张上，熟悉的字迹让她的心跳骤然加速——那是母亲的笔迹，她以为早已在火灾中化为灰烬的秘密。\\n\\n「如果你看到这封信，说明妈妈没能亲自告诉你……」\\n\\n窗外的雷声轰然炸响，而她手中的信纸，开始微微颤抖。\",\n        \"in_tokens\": 20,\n        \"out_tokens\": 140\n      }\n    },\n    {\n      \"id\": \"general_qa\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"是什么\", \"为什么\", \"怎么\", \"如何\", \"推荐\", \"区别\"],\n      \"priority\": 3,\n      \"response\": {\n        \"content\": \"这是一个很好的问题！让我来解答：\\n\\n首先，我们可以从以下几个维度来理解：\\n1. 核心概念：定义和基本原理\\n2. 应用场景：适合什么情况使用\\n3. 注意事项：容易踩的坑\\n\\n如果你想深入了解某个方面，请告诉我，我可以进一步展开。\",\n        \"in_tokens\": 15,\n        \"out_tokens\": 85\n      }\n    },\n    {\n      \"id\": \"fallback\",\n      \"task_type\": \"chat\",\n      \"keywords\": [],\n      \"priority\": 0,\n      \"response\": {\n        \"content\": \"这是 Mock 模式返回的预设响应。在实际环境中，这里会是真实模型的回答。当前命中了通用兜底 mock，说明你的 query 没有匹配到任何特定场景。如需测试特定场景，请在 query 中加入关键词：翻译/代码/证明/总结/提取/分析 等。\",\n        \"in_tokens\": 12,\n        \"out_tokens\": 70\n      }\n    }\n  ]\n}\n\nFile v2.6.0:references/models.yaml\n\n# 模型注册表（国产大模型统一路由）\n# 说明：\n# - 价格为示例（元 / 每 1M tokens），请以各厂商官方最新定价为准。\n# - 新增厂商：只需在此加一段 provider + 一个 adapter（见 scripts/adapters），不动路由逻辑。\n# - 字段含义：\n#     display       中文名\n#     adapter       适配器类型：openai_compat / ernie / spark\n#     base_url      API 基址（openai_compat / ernie 用）\n#     base_url_openai  文心 Qianfan OpenAI 兼容端点（可选）\n#     env_hint      所需环境变量名（仅提示，密钥不进包）\n#     default_model 默认模型\n#     models[]      name / ctx(上下文窗口 token) / price_in / price_out / reasoner(可选)\n#     能力画像（0-10，越大越强，纯本地静态经验值，供 auto 策略打分）：\n#       reason_score  推理能力   code_score  代码能力   long_score  长文能力\n# - v2.6 新增：embed_models[] 和 reranks 配置块（embedding 与 rerank 统一接口）\n# - 本文件纯数据，不含任何密钥。\n\nproviders:\n  deepseek:\n    display: DeepSeek\n    adapter: openai_compat\n    base_url: https://api.deepseek.com\n    env_hint: DEEPSEEK_API_KEY\n    default_model: deepseek-chat\n    models:\n      -\n        name: deepseek-chat\n        ctx: 64000\n        price_in: 1\n        price_out: 2\n        reason_score: 8\n        code_score: 9\n        long_score: 6\n      -\n        name: deepseek-reasoner\n        ctx: 64000\n        price_in: 4\n        price_out: 16\n        reasoner: true\n        reason_score: 10\n        code_score: 9\n        long_score: 6\n  qwen:\n    display: 阿里通义千问\n    adapter: openai_compat\n    base_url: https://dashscope.aliyuncs.com/compatible-mode/v1\n    env_hint: DASHSCOPE_API_KEY\n    default_model: qwen-plus\n    models:\n      -\n        name: qwen-turbo\n        ctx: 32000\n        price_in: 0.8\n        price_out: 2\n        reason_score: 6\n        code_score: 7\n        long_score: 6\n      -\n        name: qwen-plus\n        ctx: 128000\n        price_in: 0.8\n        price_out: 2\n        reason_score: 7\n        code_score: 8\n        long_score: 8\n      -\n        name: qwen-max\n        ctx: 32000\n        price_in: 2.4\n        price_out: 9.6\n        reason_score: 9\n        code_score: 8\n        long_score: 6\n      -\n        name: qwen-long\n        ctx: 1000000\n        price_in: 0.5\n        price_out: 2\n        reason_score: 6\n        code_score: 6\n        long_score: 10\n  glm:\n    display: 智谱 GLM\n    adapter: openai_compat\n    base_url: https://open.bigmodel.cn/api/paas/v4\n    env_hint: ZHIPU_API_KEY\n    default_model: glm-4-flash\n    models:\n      -\n        name: glm-4-flash\n        ctx: 128000\n        price_in: 0.1\n        price_out: 0.1\n        reason_score: 6\n        code_score: 6\n        long_score: 8\n      -\n        name: glm-4-air\n        ctx: 128000\n        price_in: 1\n        price_out: 1\n        reason_score: 7\n        code_score: 7\n        long_score: 8\n      -\n        name: glm-4-plus\n        ctx: 128000\n        price_in: 10\n        price_out: 10\n        reason_score: 9\n        code_score: 8\n        long_score: 8\n  kimi:\n    display: 月之暗面 Kimi\n    adapter: openai_compat\n    base_url: https://api.moonshot.cn/v1\n    env_hint: MOONSHOT_API_KEY\n    default_model: moonshot-v1-8k\n    models:\n      -\n        name: moonshot-v1-8k\n        ctx: 8000\n        price_in: 1\n        price_out: 1\n        reason_score: 6\n        code_score: 6\n        long_score: 5\n      -\n        name: moonshot-v1-32k\n        ctx: 32000\n        price_in: 2.4\n        price_out: 2.4\n        reason_score: 6\n        code_score: 6\n        long_score: 7\n      -\n        name: moonshot-v1-128k\n        ctx: 128000\n        price_in: 10\n        price_out: 10\n        reason_score: 7\n        code_score: 6\n        long_score: 9\n  hunyuan:\n    display: 腾讯混元\n    adapter: openai_compat\n    base_url: https://api.hunyuan.cloud.tencent.com/v1\n    env_hint: HUNYUAN_API_KEY\n    default_model: hunyuan-lite\n    models:\n      -\n        name: hunyuan-lite\n        ctx: 32000\n        price_in: 0.6\n        price_out: 0.6\n        reason_score: 5\n        code_score: 5\n        long_score: 6\n      -\n        name: hunyuan-standard\n        ctx: 32000\n        price_in: 1.2\n        price_out: 1.2\n        reason_score: 6\n        code_score: 6\n        long_score: 6\n      -\n        name: hunyuan-pro\n        ctx: 128000\n        price_in: 3\n        price_out: 3\n        reason_score: 8\n        code_score: 7\n        long_score: 8\n      -\n        name: hunyuan-long\n        ctx: 256000\n        price_in: 3\n        price_out: 3\n        reason_score: 6\n        code_score: 6\n        long_score: 10\n  doubao:\n    display: 字节豆包\n    adapter: openai_compat\n    base_url: https://ark.cn-beijing.volces.com/api/v3\n    env_hint: ARK_API_KEY\n    default_model: doubao-pro-32k\n    models:\n      -\n        name: doubao-pro-32k\n        ctx: 32000\n        price_in: 0.8\n        price_out: 2\n        reason_score: 7\n        code_score: 7\n        long_score: 6\n      -\n        name: doubao-lite-32k\n        ctx: 32000\n        price_in: 0.3\n        price_out: 0.6\n        reason_score: 5\n        code_score: 5\n        long_score: 6\n  ernie:\n    display: 百度文心\n    adapter: ernie\n    base_url: https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro\n    base_url_openai: https://qianfan.baidubce.com/v2\n    env_hint: ERNIE_OPENAI_KEY\n    default_model: ernie-4.0-8k\n    models:\n      -\n        name: ernie-4.0-8k\n        ctx: 8000\n        price_in: 8\n        price_out: 8\n        reason_score: 8\n        code_score: 7\n        long_score: 5\n      -\n        name: ernie-3.5-8k\n        ctx: 8000\n        price_in: 1.2\n        price_out: 1.2\n        reason_score: 6\n        code_score: 6\n        long_score: 5\n  spark:\n    display: 讯飞星火\n    adapter: spark\n    version: v3.5\n    domain: generalv3.5\n    env_hint: SPARK_APP_ID / SPARK_API_KEY / SPARK_API_SECRET\n    default_model: spark-v3.5\n    models:\n      -\n        name: spark-v3.5\n        ctx: 32000\n        price_in: 1.2\n        price_out: 1.2\n        reason_score: 6\n        code_score: 6\n        long_score: 6\n  minimax:\n    display: MiniMax\n    adapter: openai_compat\n    base_url: https://api.minimax.chat/v1\n    env_hint: MINIMAX_API_KEY\n    default_model: abab6.5s-chat\n    models:\n      -\n        name: abab6.5s-chat\n        ctx: 245000\n        price_in: 1\n        price_out: 1\n        reason_score: 7\n        code_score: 6\n        long_score: 9\n      -\n        name: abab6.5g-chat\n        ctx: 8000\n        price_in: 5\n        price_out: 5\n        reason_score: 7\n        code_score: 6\n        long_score: 5\n  yi:\n    display: 零一万物 Yi\n    adapter: openai_compat\n    base_url: https://api.lingyiwanwu.com/v1\n    env_hint: YI_API_KEY\n    default_model: yi-lightning\n    models:\n      -\n        name: yi-lightning\n        ctx: 16000\n        price_in: 0.99\n        price_out: 0.99\n        reason_score: 8\n        code_score: 8\n        long_score: 6\n      -\n        name: yi-large\n        ctx: 32000\n        price_in: 20\n        price_out: 20\n        reason_score: 9\n        code_score: 8\n        long_score: 7\n      -\n        name: yi-large-fc\n        ctx: 32000\n        price_in: 20\n        price_out: 20\n        reason_score: 8\n        code_score: 8\n        long_score: 7\n  baichuan:\n    display: 百川智能\n    adapter: openai_compat\n    base_url: https://api.baichuan-ai.com/v1\n    env_hint: BAICHUAN_API_KEY\n    default_model: Baichuan4-Air\n    models:\n      -\n        name: Baichuan4-Air\n        ctx: 32000\n        price_in: 0.98\n        price_out: 0.98\n        reason_score: 7\n        code_score: 6\n        long_score: 6\n      -\n        name: Baichuan4-Turbo\n        ctx: 32000\n        price_in: 15\n        price_out: 15\n        reason_score: 8\n        code_score: 7\n        long_score: 6\n      -\n        name: Baichuan4\n        ctx: 32000\n        price_in: 100\n        price_out: 100\n        reason_score: 9\n        code_score: 8\n        long_score: 6\n  step:\n    display: 阶跃星辰 Step\n    adapter: openai_compat\n    base_url: https://api.stepfun.com/v1\n    env_hint: STEP_API_KEY\n    default_model: step-2-16k\n    models:\n      -\n        name: step-1-8k\n        ctx: 8000\n        price_in: 5\n        price_out: 20\n        reason_score: 7\n        code_score: 7\n        long_score: 5\n      -\n        name: step-2-16k\n        ctx: 16000\n        price_in: 38\n        price_out: 120\n        reason_score: 9\n        code_score: 8\n        long_score: 7\n      -\n        name: step-1-256k\n        ctx: 256000\n        price_in: 95\n        price_out: 300\n        reason_score: 8\n        code_score: 7\n        long_score: 10\n\n  # v2.4 视觉模型（多模态）\n  qwen_vl:\n    display: 阿里通义 VL\n    adapter: openai_compat\n    base_url: https://dashscope.aliyuncs.com/compatible-mode/v1\n    env_hint: DASHSCOPE_API_KEY\n    default_model: qwen-vl-plus\n    models:\n      -\n        name: qwen-vl-plus\n        ctx: 128000\n        price_in: 0.8\n        price_out: 2\n        multimodal: true\n        reason_score: 7\n        code_score: 6\n        long_score: 8\n      -\n        name: qwen-vl-max\n        ctx: 128000\n        price_in: 2.4\n        price_out: 9.6\n        multimodal: true\n        reason_score: 8\n        code_score: 6\n        long_score: 8\n\n  glm_vl:\n    display: 智谱 GLM-4V\n    adapter: openai_compat\n    base_url: https://open.bigmodel.cn/api/paas/v4\n    env_hint: ZHIPU_API_KEY\n    default_model: glm-4v-plus\n    models:\n      -\n        name: glm-4v-plus\n        ctx: 128000\n        price_in: 1\n        price_out: 1\n        multimodal: true\n        reason_score: 7\n        code_score: 5\n        long_score: 8\n\n  doubao_vl:\n    display: 字节豆包视觉\n    adapter: openai_compat\n    base_url: https://ark.cn-beijing.volces.com/api/v3\n    env_hint: ARK_API_KEY\n    default_model: doubao-vision-pro-32k\n    models:\n      -\n        name: doubao-vision-pro-32k\n        ctx: 32000\n        price_in: 0.8\n        price_out: 2\n        multimodal: true\n        reason_score: 6\n        code_score: 5\n        long_score: 6\n\nFile v2.6.0:references/routing-rules.md\n\n# 路由规则说明（国产大模型统一路由）\n\n本文件解释路由引擎如何把「一次对话请求」映射到「具体厂商 / 模型」。目标：**任务感知、成本最优、失败可降级**。\n\n## 一、四种路由模式\n\n| 模式 | 触发 | 行为 |\n|------|------|------|\n| `auto` | 默认 | 任务分类器 + 成本权重自动选最优 |\n| `cheap` | `--model cheap` | 强制最便宜模型（批量抽取 / 分类 / 翻译场景） |\n| `quality` | `--model quality` | 强制最强模型（复杂推理 / 重要产出） |\n| `manual` | `--model 厂商:模型` | 显式指定，如 `deepseek:deepseek-reasoner` |\n\n## 二、任务分类维度（auto 模式）\n\n分类器为**纯规则 + 启发式**（零密钥、零模型、毫秒级），输出：\n\n- `task_type`：classify / extract / summarize / translate / reason / code / long / general\n- `needs_reasoning`：是否需推理（命中「为什么 / 分析 / 推导 / 根因 …」）\n- `length_bucket`：short(<4k) / mid(4k–32k) / long(>32k) 以字符粗略估算\n- `budget_sensitive`：分类 / 抽取 / 总结 / 翻译 → 对价格更敏感\n\n设 `confidence` 阈值：关键词命中或含推理词 → 0.8；纯 general 且无推理词 → 0.4。\n低于阈值时由路由回退到 `quality` 或 `manual`（用户可随时覆盖）。\n\n## 三、auto 模式映射表（仅从「已配置密钥」的厂商中选择）\n\n| 分类信号 | 偏好 |\n|----------|------|\n| 需推理 | DeepSeek-R1（reasoner） |\n| 长文 (>32k) | Kimi-128k / 混元-long / 通义-long（上下文 ≥128k） |\n| 代码 | DeepSeek-Chat / 通义 |\n| 价格敏感 | GLM-4-Flash / 豆包-lite（最便宜档） |\n| 常规 | DeepSeek-Chat（均衡默认） |\n\n> 若偏好厂商未配置密钥，自动降级到「已配置厂商里最便宜 / 最强」的可用模型，并给出原因说明。\n\n## 四、失败降级（budget guard）\n\n- 主模型返回 429 / 5xx / 超时 → 适配器自动指数退避重试（最多 2 次）。\n- 仍失败 → 路由层 budget guard 阻止「贵模型 runaway」，并记录失败调用（成本统计中的 success=0）。\n- 预算阈值（config.json 的 `budget_monthly`）超支 → 主动告警（CLI 提示 + 可选企微机器人）。\n\n## 五、成本统计（第 7 类：AI 成本 / 用量可观测）\n\n每次调用无论成败都落本地 SQLite（`~/.cn_llm_router/calls.db`）：\n厂商 / 模型 / 任务 / 入 token / 出 token / 花费 / 耗时 / 成功与否。\n\n花费 = 入 token ÷ 1e6 × price_in + 出 token ÷ 1e6 × price_out（价格取自 models.yaml）。\n`report` 命令据此出日 / 周 / 月报、各家花费柱状、成功率、P95 延迟。\n\n## 六、与成熟网关（LiteLLM / One API）的关系\n\n它们是独立部署的网关服务；本技能是 **WorkBuddy 内的轻量封装**：\n- 复用各家 OpenAI 兼容端点（自研 urllib 适配器，零依赖）；\n- 在其之上叠加**任务感知路由**（网关不内置）；\n- 中文成本月报 + 可选企微 / 网盘告警（轻量本地版）。\n\n即：站在巨人肩膀上做「国产任务感知路由 + 成本可观测」这一层差异化。\n\nFile v2.6.0:skill-card.md\n\n## Description:\n\nRoutes prompts and multimodal tasks across Chinese LLM providers with task-aware model selection, streaming calls, cost reporting, local cache/session features, and offline mock workflows.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[fyniujin](https://clawhub.ai/user/fyniujin)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and engineers use this skill to choose, call, compare, and monitor multiple Chinese LLM providers from one CLI entry point. It supports routing for chat, code, reasoning, summarization, translation, extraction, embeddings, reranking, long-document workflows, and multimodal description.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts and task content may be sent to configured model providers during live calls.\n\nMitigation: Configure only trusted providers, use offline route or mock modes for planning, and avoid sending confidential prompts unless the selected provider is approved for that data.\n\nRisk: Prompt and response history may be retained locally by cache, session, and arena features.\n\nMitigation: Use --no-cache for confidential or critical work, avoid --session unless needed, and periodically clear local cache and session data.\n\nRisk: Configured update_url or webhook destinations can disclose usage or operational metadata.\n\nMitigation: Leave optional destinations unset unless needed, and configure only trusted update and webhook endpoints.\n\nRisk: Local semantic cache matching may return stale or incorrect results for similar but different prompts.\n\nMitigation: Use --no-cache for production, financial, code-generation, and real-time information tasks that require a fresh model call.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/fyniujin/skills/cn-llm-router)\n- [models.yaml](artifact/references/models.yaml)\n- [routing-rules.md](artifact/references/routing-rules.md)\n- [version.json homepage](https://skillhub.cn/skill/cn-llm-router)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Code, Shell commands, Configuration, JSON, Guidance]\n\n**Output Format:** [Markdown and terminal-oriented text, with optional JSON outputs for supported commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include routed provider/model choices, generated model responses, token and cost estimates, local reports, configuration guidance, and mock outputs.]\n\n## Skill Version(s):\n\n2.6.0 (source: SKILL.md frontmatter, artifact/version.json, and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.6.0:_core_lock.json\n\n{\r\n  \"core_version\": \"1.0.0\",\r\n  \"injected_at\": \"2026-09-17T10:29:18\",\r\n  \"target\": \"cn-llm-router\"\r\n}\n\nFile v2.6.0:_core/version.json\n\n{\"version\": \"1.0.0\", \"compatible_skills\": {\"cn-llm-router\": \">=2.5.0\", \"cn-model-gateway\": \">=1.7.0\"}, \"adapters\": [\"openai_compat\", \"ernie\", \"spark\"], \"modules\": [\"cost_tracker\", \"cache\", \"health_check\", \"config\", \"yaml_simple\"]}\n\nFile v2.6.0:config.example.json\n\n{\n  \"_comment\": \"本文件是配置模板，不含任何密钥。厂商 API Key 一律用环境变量传入（见 SKILL.md）。请将本文件复制为 ~/.cn_llm_router_config.json 或技能目录下的 config.json 后按需修改。\",\n  \"budget_monthly\": 0.0,\n  \"update_url\": \"\",\n  \"wecom_webhook\": \"\",\n  \"cache_ttl_hours\": 168,\n  \"cache_fuzzy\": false\n}\n\nFile v2.6.0:version.json\n\n{\"version\": \"2.6.0\", \"homepage\": \"https://skillhub.cn/skill/cn-llm-router\", \"notes\": \"v2.6.0：增加 embed/rerank 统一接口（CLI embed/rerank 子命令 + 适配器层 embed/rerank 方法）；增加 RAG/长文路由（classifier 长任务识别 + text_splitter 语义切分 + map-reduce 摘要合并）；增加多轮会话管理（chat --session + session_manager.py SQLite 对话表）；增加 describe 命令扩展视频/文档路由（ffmpeg 关键帧 + 长文本模型）；优化流式 token 计数对齐（measured/estimated 双列报表）\"}\n\nArchive v2.5.0: 40 files, 102616 bytes\n\nFiles: _core_lock.json (102b), _core/adapters/__init__.py (654b), _core/adapters/base.py (3973b), _core/adapters/ernie.py (5025b), _core/adapters/openai_compat.py (3902b), _core/adapters/spark.py (5542b), _core/cache.py (6959b), _core/calibrate.py (9879b), _core/config.py (3133b), _core/cost_tracker.py (7230b), _core/health_check.py (5920b), _core/version.json (230b), _core/yaml_simple.py (6501b), config.example.json (356b), references/mock_data.json (7517b), references/models.yaml (10016b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (3973b), scripts/adapters/ernie.py (5025b), scripts/adapters/openai_compat.py (3902b), scripts/adapters/spark.py (5542b), scripts/cache.py (6959b), scripts/classifier.py (4601b), scripts/config.py (3133b), scripts/cost_tracker.py (7230b), scripts/hardware.py (3978b), scripts/health_check.py (5920b), scripts/meta.py (491b), scripts/mock_engine.py (13037b), scripts/report.py (4273b), scripts/router.py (38576b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (2632b), SKILL.md (40832b), tests/test_router.py (19088b), version.json (436b), _meta.json (132b)\n\nFile v2.5.0:SKILL.md\n\n---\nname: cn-llm-router\ndescription: 国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。\nversion: 2.5.0\n---\n\n# 国产大模型统一路由（cn-llm-router）\n\n> 一个**核心零依赖（纯 Python 标准库，仅讯飞星火可选一个 `websocket-client`）、零密钥打包**的命令行工具，把 12 家国产大模型收敛成「一个入口、一套命令」。你只管说「我要干嘛」，它帮你挑模型、算成本、限并发、逐字流式输出；断网或无 Key 时也能演示路由逻辑。\n\n## 一、30 秒速查\n\n```bash\n# 不配任何密钥，先看「路由建议」（演示/规划用，不发起调用）\npython scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n\n# 配好密钥后，真正调用（默认 auto 策略 = 任务感知选模型）\nexport DEEPSEEK_API_KEY=sk-xxx          # 至少一个厂商即可\npython scripts/router.py chat --prompt \"解释一下快速排序\" --model auto\n\n# 看这台电脑的硬件画像与建议并发（不拖累电脑的关键）\npython scripts/router.py hardware\n```\n\n**运行效果示例：**\n\n```\n$ python scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n╔══════════════════════════════════════════════════╗\n║         路由建议模式（未配置 API Key）             ║\n║  以下为推荐方案，不发起实际调用。配 Key 后可真跑。 ║\n╚══════════════════════════════════════════════════╝\n\n任务分类: code | 推理需求: True | 长度: short | 预算敏感: False\n推荐策略(auto): deepseek/deepseek-reasoner\n  └─ 理由: 代码生成+强推理, 性价比最优\n\n备选(cheap): deepseek/deepseek-chat        ¥0.0001/千tokens\n备选(quality): glm/glm-4                   ¥0.0010/千tokens\n\n提示: export DEEPSEEK_API_KEY=sk-xxx 即可调用\n```\n\n```\n$ python scripts/router.py hardware\n╔═══════════════ 硬件画像 ═══════════════╗\n│ CPU 逻辑核心:   8 核                    │\n│ 物理内存:       15.9 GB                 │\n│ 硬件档位:       mid                     │\n│ 建议最大并发:    2                       │\n│ 建议单批大小:    8                       │\n╚═══════════════════════════════════════╝\n```\n\n- 支持厂商（12 家 · 32 款模型）：DeepSeek、阿里通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川智能、阶跃星辰 Step。\n- 运行要求：Python 3.8+；**11 家厂商（DeepSeek/通义/智谱/Kimi/混元/豆包/文心/MiniMax/Yi/百川/阶跃）与全部离线功能无需安装任何第三方包**；讯飞星火为可选 `websocket-client`（不装也能用其余 11 家，仅星火调用时给出中文安装指引）。\n- 密钥来源：只用**环境变量**，绝不明文落盘、绝不打包进 skill。\n\n## 二、架构\n\n```\ncn-llm-router/\n├── SKILL.md                  # 本文件（使用说明 + 风险 + 边界 + FAQ + 反模式）\n├── version.json              # 版本号（更新提醒比对用）\n├── config.example.json       # 配置模板（无密钥，复制后改）\n├── references/\n│   ├── models.yaml           # 模型注册表（纯数据，可自助增删厂商）\n│   └── routing-rules.md      # 路由策略规则说明\n├── scripts/\n│   ├── router.py             # 统一 CLI 入口 + 策略引擎（对外只暴露这一个文件）\n│   ├── classifier.py         # 任务分类器（规则 + 关键词，离线）\n│   ├── config.py             # 配置/密钥读取（仅读环境变量）\n│   ├── cost_tracker.py       # 跨厂商成本聚合（SQLite，本地）\n│   ├── hardware.py           # 硬件画像 + 并发/子任务数自适应\n│   ├── cache.py              # 本地语义缓存（降 token 消耗，含长度惩罚防误命中）\n│   ├── report.py             # 文本/HTML 成本报表 + 预算告警\n│   ├── update_check.py       # 更新提醒（可离线，失败静默）\n│   ├── yaml_simple.py        # 自研零依赖 YAML 解析（不引入 PyYAML）\n│   ├── meta.py               # 版本常量\n│   └── adapters/             # 各厂商适配器（统一接口）\n│       ├── base.py           # AdapterBase + 中文异常 + token 估算工具\n│       ├── openai_compat.py  # OpenAI 兼容端点（6 家通用，流式带兜底估算）\n│       ├── ernie.py          # 文心大模型（兼容 + 原生双通道，流式估算）\n│       └── spark.py          # 讯飞星火（WebSocket 签名，可选 websocket-client 做传输）\n└── tests/\n    └── test_router.py        # 离线测试（21 项，无需密钥）\n```\n\n核心数据流：`prompt → classifier → 策略引擎(resolve) → adapter → 大模型`，同时旁路写入 `cost_tracker`（成本）与 `cache`（命中则跳过调用）。\n\n## 三、能做哪些（功能清单）\n\n| 功能 | 命令 | 说明 |\n|------|------|------|\n| 智能路由 | `route` | 按任务自动选模型；`--strategy auto/cheap/quality/manual`；无 Key 进「建议模式」只展示不调用 |\n| 统一调用 | `chat` | 单入口对话，自动统计成本；支持流式、系统提示词、JSON 输出 |\n| 任务分类 | 内置 | 识别 code/reason/summarize/translate/extract 等，驱动路由 |\n| 成本统计 | `report` | 日/周/月报，跨厂商聚合花费、成功率、P95 延迟；可导出 HTML |\n| 预算保护 | `budget` | 月预算阈值告警，可选推企业微信 |\n| 硬件自适应 | `hardware` | 探测 CPU/内存，自动限制最大并发与单批大小，**不拖累电脑** |\n| 语义缓存 | `cache` | 相似问题命中本地缓存，跳过 API 调用，省 token 省钱（v1.1.0 加长度惩罚减少误命中） |\n| 更新提醒 | `update-check` | 比对 version.json，提示升级（联网失败静默，不阻塞） |\n| 配置查看 | `config` | 列出已配置厂商与环境变量提示 |\n\n**全部命令均可离线运行**（除真正发起 `chat` 调用时），`route/hardware/report/cache/config/update-check/version` 都不需要网络或密钥。\n\n## 四、安装与配置\n\n### 4.1 运行环境\n- Python 3.8+（Windows / macOS / Linux 均可）。\n- **除讯飞星火的可选 `websocket-client` 外，无需 `pip install` 任何依赖**；其余 11 家与全部离线功能均用标准库实现，讯飞星火签名（hmac/hashlib/base64）也自研，仅 WS 传输用可选客户端。\n\n### 4.2 配置密钥（只用环境变量，三种任选其一）\n```bash\n# 方式 A：临时（当前终端）\nexport DEEPSEEK_API_KEY=sk-xxx\nexport DASHSCOPE_API_KEY=sk-xxx        # 通义千问\nexport ZHIPU_API_KEY=sk-xxx            # 智谱\nexport MOONSHOT_API_KEY=sk-xxx         # Kimi\nexport HUNYUAN_API_KEY=sk-xxx          # 腾讯混元\nexport ARK_API_KEY=sk-xxx              # 字节豆包\nexport ERNIE_OPENAI_KEY=sk-xxx         # 文心（OpenAI 兼容端点，推荐）\n# 或文心原生：ERNIE_API_KEY=xxx  +  ERNIE_SECRET_KEY=xxx\nexport SPARK_APP_ID=xxx SPARK_API_KEY=xxx SPARK_API_SECRET=xxx  # 讯飞星火\nexport MINIMAX_API_KEY=sk-xxx          # MiniMax（abab 系列）\nexport YI_API_KEY=sk-xxx               # 零一万物 Yi\nexport BAICHUAN_API_KEY=sk-xxx         # 百川智能\nexport STEP_API_KEY=sk-xxx             # 阶跃星辰 Step\n\n# 方式 B：写进 shell 配置文件（~/.bashrc / ~/.zshrc）后 source 生效\n# 方式 C：Windows PowerShell\n$env:DEEPSEEK_API_KEY=\"sk-xxx\"\n```\n> 仅需配置你**实际要用的那一家**即可，`route` 与 `chat` 会自动只用已配置的厂商做决策。\n\n### 4.3 可选配置文件\n把 `config.example.json` 复制为 `config.json`（或 `~/.cn_llm_router_config.json`），可设月预算、更新地址、企微告警 webhook、缓存 TTL 等。**该文件不含任何密钥**。\n\n## 五、命令参考 + 运行效果示例\n\n> ⭐ **以下是每条命令的实际运行效果**，让你确认自己用对了。\n\n### 5.1 route — 路由决策（不调用 API，离线可用）\n\n```bash\n# 自动策略（根据任务类型选最合适模型）\npython scripts/router.py route --prompt \"用 Python 写个快排\"\n\n# 指定任务类型\npython scripts/router.py route --prompt \"翻译这段话到英文\" --task translate\n\n# 最省钱策略\npython scripts/router.py route --prompt \"总结这篇文章\" --strategy cheap\n\n# 最高质量策略\npython scripts/router.py route --prompt \"证明哥德巴赫猜想\" --strategy quality\n\n# 手动指定模型（跳过自动选择）\npython scripts/router.py route --prompt \"随便聊聊\" --model deepseek:deepseek-chat\n\n# JSON 格式输出（给程序调用）\npython scripts/router.py route --prompt \"分析数据\" --json\n```\n\n**auto 策略运行效果（有 Key 时）：**\n```\n$ python scripts/router.py route --prompt \"帮我写个 REST API\" --task code\n╔════════════════════════════════════════╗\n║           路由决策结果                  ║\n╚════════════════════════════════════════╝\n策略: auto | 任务: code | 推理: True\n┌────────┬─────────────────────┬────────┬──────────┐\n│ 选择   │ 模型                 │ 厂商   │ 价格     │\n├────────┼─────────────────────┼────────┼──────────┤\n│ ★ auto │ deepseek-reasoner   │ DeepSeek│ ¥0.002/千│\n│ cheap  │ deepseek-chat       │ DeepSeek│ ¥0.0001/千│\n│ quality│ glm-4               │ 智谱 GLM│ ¥0.001/千│\n└────────┴─────────────────────┴────────┴──────────┘\n最终选择: deepseek/deepseek-reasoner\n```\n\n**cheap 策略运行效果：**\n```\n$ python scripts/router.py route --prompt \"翻译 hello\" --strategy cheap\n策略: cheap | 最终选择: deepseek/deepseek-chat（¥0.0001/千tokens，最便宜）\n```\n\n**manual 模式运行效果：**\n```\n$ python scripts/router.py route --prompt \"hi\" --model deepseek:deepseek-chat\n策略: manual | 用户指定: deepseek:deepseek-chat\n```\n\n**JSON 输出效果：**\n```json\n{\"strategy\":\"manual\",\"provider\":\"deepseek\",\"model\":\"deepseek-chat\",\"classification\":{\"task_type\":\"chat\"...}}\n```\n\n### 5.2 chat — 统一调用（需配 Key）\n\n```bash\n# 基础对话（auto 策略自动选模型）\npython scripts/router.py chat --prompt \"解释一下量子计算\"\n\n# 流式输出（逐字显示，适合长回答）\npython scripts/router.py chat --prompt \"写一篇500字的AI发展报告\" --stream\n\n# 带系统提示词\npython scripts/router.py chat --prompt \"翻译以下内容\" --system \"你是专业翻译\"\n\n# 禁用缓存（强制每次都调 API）\npython scripts/router.py chat --prompt \"最新天气\" --no-cache\n\n# JSON 结构化输出\npython scripts/router.py chat --prompt \"1+1等于几\" --json\n\n# 手动指定模型\npython scripts/router.py chat --prompt \"你好\" --model qwen:qwen-plus\n\n# 设超时时间（秒）\npython scripts/router.py chat --prompt \"长问题...\" --timeout 120\n```\n\n**chat 运行效果（非流式）：**\n```\n$ python scripts/router.py chat --prompt \"1+1等于几\" --model auto\n[路由] 选择: deepseek/deepseek-chat (auto)\n[调用] deepseek/deepseek-chat ...\n[完成] 1 + 1 = 2\n━━━ 成本 ━━━\n输入 tokens: 12    输出 tokens: 8    预估费用: ¥0.000002\n```\n\n**chat 运行效果（流式）：**\n```\n$ python scripts/router.py chat --prompt \"介绍Python\" --stream --model auto\n[路由] 选择: deepseek/deepseek-chat (auto)\n[调用] deepseek/deepseek-chat (流式)...\nPython 是一门高级编程语言，由 Guido van Rossum 于 1991 年发布。\n它以简洁明了的语法著称，广泛用于 Web 开发、数据分析、人工智能等领域。\n...\n[流式结束] 输入 tokens: ~15(估)  输出 tokens: ~85(估)  费用: ¥0.000010\n```\n> 💡 **流式模式下 token 数标注 `(估)` 表示该数值来自文本估算（部分厂商流式不返回精确 usage），非精确账单。精确用量以厂商控制台为准。\n\n**无 Key 时的友好报错：**\n```\n$ python scripts/router.py chat --prompt \"hi\"\n❌ 当前未检测到任何已配置的厂商 API Key。\n请至少设置一个环境变量，例如：\n  export DEEPSEEK_API_KEY=sk-xxx\n然后运行 python scripts/router.py config 查看当前配置状态。\n```\n\n### 5.3 report — 成本报表\n\n```bash\n# 本月报表（文本格式）\npython scripts/router.py report --period month\n\n# 导出 HTML 报表\npython scripts/router.py report --period month --html cost_report.html\n\n# 今日报表\npython scripts/router.py report --period day\n\n# 本周报表\npython scripts/router.py report --period week\n```\n\n**文本报表效果：**\n```\n$ python scripts/router.py report --period month\n╔══════════════ 2026-07 月度成本报表 ══════════════╗\n│ 统计周期: 2026-07-01 ~ 2026-07-10                  │\n│ 总调用次数: 42                                     │\n│ 总花费:     ¥0.0321                                │\n│ 成功率:     97.6%                                  │\n│ P95 延迟:   1,230 ms                               │\n├───────────────────────────────────────────────────┤\n│ 厂商           │ 花费      │ 调用 │ 输入tok │ 输出tok │\n│ deepseek       │ ¥0.0210  │ 28   │ 12,400  │ 8,200   │\n│ glm            │ ¥0.0111  │ 14   │ 6,800   │ 4,100   │\n╚═══════════════════════════════════════════════════╝\n```\n\n### 5.4 budget — 预算检查\n\n```bash\npython scripts/router.py budget\n```\n\n**运行效果：**\n```\n$ python scripts/router.py budget\n╔═══════════════ 预算检查 ═══════════════╗\n│ 本月已花费:  ¥0.0321                    │\n│ 月预算上限:  ¥50.00                     │\n│ 剩余额度:    ¥49.9679 (99.9%)           │\n│ 状态:        ✅ 安全                     │\n╚═══════════════════════════════════════╝\n```\n\n### 5.5 cache — 缓存管理\n\n```bash\n# 查看缓存条目\npython scripts/router.py cache stats\n\n# 清空缓存\npython scripts/router.py cache clear\n```\n\n**运行效果：**\n```\n$ python scripts/router.py cache stats\n缓存路径: C:\\Users\\你的用户名\\.cn_llm_router\\cache.db\n缓存条目: 15 条\n模糊匹配阈值: 0.80（最短查询长度: 8 字符，含长度惩罚）\n\n$ python scripts/router.py cache clear\n已清空 15 条缓存记录\n```\n\n### 5.6 config — 查看配置\n\n```bash\npython scripts/router.py config\n```\n\n**运行效果（未配 Key 时）：**\n```\n$ python scripts/router.py config\n╔══════════════ 当前配置 ═══════════════╝\n│ 已配置厂商: 无                          │\n│                                              │\n│ 可用环境变量:                                │\n│   DEEPSEEK_API_KEY        — DeepSeek        │\n│   DASHSCOPE_API_KEY       — 通义千问         │\n│   ZHIPU_API_KEY           — 智谱 GLM         │\n│   MOONSHOT_API_KEY        — Kimi (月之暗面)  │\n│   HUNYUAN_API_KEY         — 腾讯混元         │\n│   ARK_API_KEY             — 字节豆包         │\n│   ERNIE_OPENAI_KEY        — 百度文心(推荐)   │\n│   SPARK_APP_ID + _API_KEY + _API_SECRET — 讯飞│\n│   MINIMAX_API_KEY         — MiniMax         │\n│   YI_API_KEY              — 零一万物 Yi      │\n│   BAICHUAN_API_KEY        — 百川智能         │\n│   STEP_API_KEY            — 阶跃星辰 Step    │\n╚══════════════════════════════════════════════╝\n```\n\n### 5.7 update-check / version — 更新与版本\n\n```bash\npython scripts/router.py update-check\npython scripts/router.py version\n```\n\n**运行效果：**\n```\n$ python scripts/router.py version\ncn-llm-router v2.2.0 | 作者: njskills@agent.qq.com\n主页: https://skillhub.cn/skill/cn-llm-router\n\n$ python scripts/router.py update-check\n✅ 已是最新版本 v2.2.0\n```\n\n> Windows 用户把 `python` 换成 `python.exe` 或 `py`；PowerShell 里环境变量用 `$env:XXX=\"...\"`。\n\n## 五（B）、能力画像智能选型（v2.1）\n\n`references/models.yaml` 里每个模型都带三项**能力画像**（0-10 的本地静态经验值，不联网、不打分服务）：\n\n| 字段 | 含义 | auto 策略如何用 |\n|------|------|----------------|\n| `reason_score` | 推理能力 | 推理类任务选此项最高者 |\n| `code_score` | 代码能力 | 代码类任务选此项最高者 |\n| `long_score` | 长文能力 | 长文任务在超长上下文中选此项最高者 |\n\n`auto` 策略决策链：**需推理 → 优先 reasoner 且推理画像最强；长文 → ≥128k 上下文且长文画像最强；代码 → 代码画像最强（同分选更便宜）；价格敏感 → 最便宜；常规 → 均衡默认**。\n\n> 好处：新增厂商只要在 `models.yaml` 填好画像，就会被 `auto` 自动纳入选型，**无需改任何代码**。v2.1 新增的 MiniMax / 零一万物 Yi / 百川 / 阶跃 Step 正是如此接入。画像为经验参考值，追求极致效果请用 `--strategy quality` 或 `--model 厂商:模型` 手动指定。\n\n## 六、硬件自适应（不拖累电脑）\n\n`hardware.py` 在**首次运行/每次运行**时自动探测本机：\n- CPU 逻辑核心数、物理内存总量；\n- 据此分级：`low`（≤4 核或 ≤8GB）→ `mid` → `high`（≥8 核且 ≥16GB）；**内存探测失败时保守回退 low 档**；\n- 自动推导 `max_concurrency`（最大并发，默认 low=1 / mid=2 / high=4）与 `batch_size`（单批大小）；\n- 提供 `recommend_subtasks(total)` 把大任务拆成「不超过并发数」的子任务，**避免一次性铺满 CPU/内存**。\n\n调用方应读取 `hardware.profile()` 的结果来约束自己的并发与批处理，做到「自适应，不抢占用户资源」。语义缓存进一步减少重复 API 调用，间接降低本机网络与等待开销。\n\n## 六（B）、v2.0 全链路离线 Mock 模式（开发者调试利器）\n\n> 🔧 **核心能力**：无网络/无密钥也能跑通 `chat → report → budget → cache` 完整流程。\n\n### 6B.1 快速体验\n\n```bash\n# 基础 mock：不调 API，从本地预设库返回\npython scripts/router.py chat --prompt \"用 Python 写个快排\" --mock\n\n# 带延迟的 mock：模拟 2 秒网络延迟\npython scripts/router.py chat --prompt \"翻译这段话\" --mock --latency 2000\n\n# 流式 mock：逐字输出模拟真实流式体验\npython scripts/router.py chat --prompt \"写个故事\" --mock --stream --latency 500\n\n# JSON 格式输出（供程序调用）\npython scripts/router.py chat --prompt \"分析数据\" --mock --json\n```\n\n**Mock 模式运行效果：**\n```\n$ python scripts/router.py chat --prompt \"用 Python 写个快排\" --mock\n🤖 [Mock / preset] Mock 模式（离线调试，不调用真实 API）\n\n以下是 Python 快速排序的实现：\n\n```python\ndef quick_sort(arr):\n    if len(arr) <= 1:\n        return arr\n    pivot = arr[len(arr) // 2]\n    left = [x for x in arr if x < pivot]\n    middle = [x for x in arr if x == pivot]\n    right = [x for x in arr if x > pivot]\n    return quick_sort(left) + middle + quick_sort(right)\n```\n\n────────── 用量 ──────────\n  token: 入 45 / 出 180 ｜ 花费 ¥0.000000（Mock 免费）｜ 耗时 0ms\n```\n\n### 6B.2 预设场景库（12 个常见场景）\n\nMock 数据完全本地（`references/mock_data.json`），覆盖以下场景：\n\n| 场景 ID | 任务类型 | 匹配关键词 | 响应内容 |\n|---------|----------|-----------|---------|\n| code_quick_sort | code | 排序/sort/快排/算法/python | Python 快排实现代码 |\n| reason_math_proof | reason | 证明/推导/定理/数学 | 勾股定理欧几里得证明 |\n| translate_zh_en | translate | 翻译/translate/英文 | 中英翻译文本 |\n| summarize_long | summarize | 总结/概括/摘要 | 文档核心要点（5 条） |\n| extract_info | extract | 提取/抽取/实体 | 结构化实体 JSON |\n| chat_greeting | chat | 你好/hello/hi/在吗 | AI 助手自我介绍 |\n| code_debug | code | bug/报错/debug/修复 | 调试建议 + 修复方案 |\n| long_context_analysis | chat | 分析/解读/对比/评估 | 综合分析报告 |\n| data_analysis | extract | 数据/报表/趋势/统计 | 数据表格 + 洞察 |\n| creative_writing | chat | 写/创作/故事/文案 | 小说片段 |\n| general_qa | chat | 是什么/为什么/怎么 | 通用问答模板 |\n| fallback | chat | （无匹配时兜底） | 通用兜底响应 |\n\n### 6B.3 网络自动检测与熔断\n\n启动时自动检测各厂商 API 可达性：\n- **所有厂商不可达** → 自动进入 Mock 模式，提示「网络不可用，已自动切换至 Mock 模式」\n- **部分厂商不可达** → 仅熔断不可达厂商，不切换 Mock\n- **性能优化**：检测结果缓存 60 秒，正常模式启动额外开销 <50ms\n\n### 6B.4 交互式 Mock 数据编辑器\n\n```bash\n# 进入交互式编辑\npython scripts/router.py mock --edit\n\n# 列出所有自定义 mock 场景\npython scripts/router.py mock --list\n```\n\n编辑器支持：\n- 添加自定义 mock 场景（ID / 任务类型 / 关键词 / 优先级 / 响应内容 / token 数）\n- 删除已有场景\n- 实时测试 query 匹配效果\n\n自定义 mock 存储在本地 SQLite（`~/.cn_llm_router/mock.db`），优先级高于预设库。\n\n### 6B.5 Mock 回归测试\n\n```bash\n# 运行 mock 专项测试（无需网络+无需密钥）\npython scripts/router.py test --mock\n```\n\n覆盖 10 项 mock 专项测试：\n1. Mock 基础响应（code 类型）\n2. Mock 翻译场景\n3. Mock 推理场景\n4. Mock 缓存命中\n5. Mock 缓存未命中\n6. Mock 延迟模拟\n7. Mock 流式输出\n8. Mock JSON 输出\n9. Mock 自定义场景\n10. Mock 兜底场景\n\n### 6B.6 定位边界（严守死规则#8）\n\n| 不做 | 原因 |\n|------|------|\n| ❌ 本地模型推理 | Mock 只返回预设文本，不调本地模型 |\n| ❌ Mock 数据云同步 | 数据完全本地（JSON + SQLite） |\n| ❌ 生产环境 mock | Mock 模式仅限开发调试，生产强制禁用 |\n| ❌ 替代真实测试 | Mock 用于开发调试，真实测试仍需联网 |\n\n\n\n1. **密钥仅在内存中读取，从环境变量获取**；本技能**不写入、不读取、不打包任何 `.env` 或密钥文件**。请自行保管好环境变量与终端历史。\n2. **网络调用只发往各厂商官方 API 域名**（见 `references/models.yaml` 的 `base_url`），不会发往任何第三方。文心/星火签名在本地完成。\n3. **成本数据库与缓存为本地 SQLite 文件**（默认在用户目录，如 `~/.cn_llm_router/`），不上传、不含密钥，可随时 `cache clear` 删除。\n4. **更新检查联网失败会静默跳过**，不会因此报错阻塞你的工作；更新地址默认指向 SkillHub，可在 `config.json` 改为你信任的地址。\n5. **本技能不含任何可执行二进制 / 脚本类风险文件**（无 `.exe/.ps1/.bat/.sh/.vbs` 等），纯 `.py` 源码 + 文档 + 数据，可被只读审查。\n6. **不收集任何个人隐私数据**：prompt 内容仅用于本地分类与缓存，默认不上报；如需成本聚合请自行管理本地数据库。\n7. **语义缓存在本地做模糊匹配**（v1.1.0 加入长度惩罚机制），理论上不同问题可能被判定为「相似」而误命中缓存。关键场景（如生产环境、金融计算）建议加 `--no-cache` 关闭缓存，确保每次都是实时结果。\n\n> 依赖风险：除讯飞星火的可选 `websocket-client` 外，本技能无任何强制第三方依赖（自研 YAML 解析、自研 WebSocket 签名），不存在供应链投毒面；不装该包时，星火调用会给出中文安装指引，不影响其余 11 家与全部离线功能。\n\n## 八、能力边界（明确不做）\n\n- ❌ 不托管、不代理、不存储你的厂商 API Key；密钥由你自己的环境变量负责。\n- ❌ 不保证各厂商 API 的可用性、速率限制、内容合规——这些由各厂商侧决定，失败会返回中文报错（见下）。\n- ❌ 不实现微调/训练/向量库/RAG 管线，这是一个「路由 + 成本 + 限流」层，不是 Agent 框架。\n- ❌ 模型实际效果取决于厂商版本与配额；本技能的「最优模型」是基于**注册表里的价格/上下文/推理能力标签**的启发式推荐，非实时基准测试。\n- ❌ 语义缓存为本地模糊匹配（含长度惩罚的相似度阈值），可能误命中或漏命中，关键场景请用 `--no-cache`。\n- ❌ 跨厂商价格随官方调整而变化，`references/models.yaml` 中的 `price_*` 是示例值，请以官方最新定价为准。\n- ❌ 流式输出的 token 计数为**估算值**（基于中英文混合字符规则），非厂商精确计费值；精确用量请以各厂商控制台账单为准。\n\n## 九、反模式（这些用法是错的，不要这样做）\n\n> ⚠️ 以下是用户最容易踩的坑，逐一列出供你避开。\n\n| 反模式 | 为什么错 | 正确做法 |\n|--------|----------|----------|\n| 在 `.env` 文件里放 Key 再让脚本去读 | 本技能**刻意不读** `.env` 文件，写了也不会生效 | 只用环境变量：`export DEEPSEEK_API_KEY=sk-xxx` |\n| 用 `chat` 调用前不先跑 `route` 确认 | 可能选到不合适的模型浪费钱 | 先 `route --prompt \"...\"` 看推荐，再用 `chat` 执行 |\n| 对「翻译一段新闻」这种长文本用 `--prompt` 直接传 | 命令行参数长度有限制，超长文本会被截断 | 把长文本写入文件，通过管道或未来版本的多模态接口传入 |\n| 在低配机器（≤4核≤8GB）上设高并发 | `hardware` 会限制并发，但手动绕过会卡死电脑 | 相信 `hardware` 的自动限制，不要手动改 `max_concurrency` |\n| 把 `config.json` 当密钥存储 | 该文件**不应包含**任何 Key | 只存 budget/update_url/webhook 等非敏感配置 |\n| 忽略 `--no-cache` 在关键场景的使用 | 模糊缓存可能对「类似但不同」的问题返回旧答案 | 金融计算、代码生成、实时信息查询务必加 `--no-cache` |\n| 混淆 `--strategy quality` 和 `--model auto` | `quality` 固定选最贵最强的模型；`auto` 会根据任务类型智能匹配 | 日常用 `auto`；只有对质量要求极高且不在乎费用时才用 `quality` |\n| 期望流式 token 统计精确到个位 | 流式模式下多数厂商不返回逐块 usage | 流式 token 数标注 `(估)`，精确账单看厂商后台 |\n\n## 十、中文报错指引（常见问题 → 怎么办）\n\n| 现象 / 报错 | 原因 | 解决 |\n|------------|------|------|\n| `当前未检测到任何厂商 API Key...` | 没设环境变量 | 按第四节 `export` 至少一家；或先 `route` 看建议 |\n| `调用失败：HTTP 401` | Key 错误/过期 | 重新生成厂商 Key 并刷新环境变量 |\n| `调用失败：HTTP 429` | 触发厂商限速 | 降低并发（见 `hardware`），或换策略/厂商 |\n| `调用失败：HTTP 404` | 模型名不匹配 | 检查 `references/models.yaml` 中该厂商 `models[].name` |\n| `调用失败：timed out` | 网络慢/超时 | 加大 `--timeout`（秒），或重试 |\n| `未找到模型: xxx` | manual 指定模型不存在 | 用 `route --model provider:model` 时确认名称 |\n| `解析注册表失败` | models.yaml 被改坏 | 用 `git diff` 还原或重新拉取技能 |\n| `更新检查失败` | 无网络 | 正常，静默跳过；不影响使用 |\n| `讯飞星火需要可选依赖 websocket-client` | 未安装星火的 WS 库 | `pip install websocket-client`，或不使用星火改用其他 11 家 |\n| `流式读取中断` | 网络中途断开 | 重试即可；已内置重试机制（最多 2 次，指数退避） |\n\n所有报错均为中文，且 `chat`/`route` 异常会被捕获后以 `❌ ...` 友好提示退出（**不会抛 Python traceback**）。\n\n## 十一、FAQ\n\n**Q1：一定要配 Key 才能用吗？**\n不一定。`route`（建议模式）、`hardware`、`report`、`cache`、`update-check`、`version` 都**不需要 Key**，可纯离线体验路由逻辑与硬件画像。只有 `chat`（真正调用大模型）才需要至少一个厂商的 Key。\n\n**Q2：怎么新增一个厂商？**\n编辑 `references/models.yaml`，加一段 `providers.<新厂商>`（填 `adapter`/`base_url`/`env_hint`/`models`），并给每个模型补能力画像 `reason_score`/`code_score`/`long_score`（0-10）；若该厂商走 OpenAI 兼容协议则**无需写任何代码**（v2.1 新增的 MiniMax/Yi/百川/阶跃就是这样接入的）；非兼容协议在 `scripts/adapters/` 加一个适配器即可，路由逻辑零改动。补了能力画像后，`auto` 策略会自动把该厂商纳入智能选型。\n\n**Q3：成本统计准吗？**\n非流式调用：计费公式透明（`compute_cost(price, in, out)`），精度取决于厂商返回的 `usage` 字段，通常准确。流式输出：**token 数为估算值**（基于中文字≈1.5 tok/字、英文词≈1.3 tok/词的混合规则），标注 `(估)`，仅供参考，**不作为精确账单**。精确用量以各厂商控制台为准。\n\n**Q4：会拖慢我的电脑吗？**\n不会。`hardware` 自动限制并发与批大小（内存探测失败时回退最低档）；调用是网络 I/O 密集型，不占 CPU；缓存减少重复调用。即使在树莓派级别的设备上也能安全运行。\n\n**Q5：我的对话会被上传吗？**\n不会。prompt 只在本地做分类与缓存，默认不上传任何服务器；成本库与缓存在你本地目录（`~/.cn_llm_router/`）。唯一联网行为是调用厂商 API（你主动发的请求）和可选的版本更新检查。\n\n**Q6：支持流式吗？**\n支持，`chat --stream`；所有 12 家厂商均可流式输出，内容逐字生成、无需等待全部完成。分类器会判断任务是否适合流式（`stream_friendly` 字段：对话/翻译/代码/摘要适合流式；数学推理/结构化抽取建议一次性返回，避免半截思维链误导）。注意流式下 token 为估算值（见 Q3）。\n\n**Q7：缓存会不会返回错误答案？（误命中问题）**\n有可能，但概率很低。v1.1.0 引入了三层防护：\n1. **最短查询限制**：不足 8 字符的 query 不做模糊匹配；\n2. **长度惩罚系数**：两句话长度差异越大，相似度得分越低；\n3. **高阈值门槛**：调整后相似度仍需 ≥ 0.80 才命中。\n关键场景（金融、代码、实时信息）建议加 `--no-cache` 关闭缓存。\n\n**Q8：哪个厂商最便宜？**\n以 `references/models.yaml` 示例价格参考（实际以官方为准）：DeepSeek Chat 通常最便宜（¥0.0001/千 tokens），适合日常对话和简单任务。复杂推理建议用 DeepSeek Reasoner 或 GLM-4。可通过 `route --strategy cheap` 实时查看当前最便宜选项。\n\n**Q9：支持多轮对话吗？**\n当前版本每次 `chat` 调用是独立的单轮请求。多轮对话可通过 `--system` 设置系统提示词来模拟上下文。后续版本计划加入对话历史管理。\n\n**Q10：如何在企业微信/钉钉里收到预算告警？**\n在 `config.json` 中设置 `webhook_url`（企微/钉钉机器人地址），然后运行 `python scripts/router.py budget` 即可推送。详见 `config.example.json` 注释。\n\n## 十二、使用场景推荐与调优建议\n\n### 场景一：日常开发助手（最常用）\n```bash\n# 写代码 — auto 策略会自动选推理强的模型\npython scripts/router.py chat --prompt \"用 Python 实现一个二叉搜索树\" --task code\n\n# 读代码/重构建议\npython scripts/router.py chat --prompt \"优化这段代码的性能\" --task code < mycode.py\n\n# 调优建议：开发任务优先用 auto（性价比最高），不用 quality（太贵）\n```\n\n### 场景二：批量文档处理（省钱关键）\n```bash\n# 先看路由建议（不花钱）\nfor f in *.md; do\n  python scripts/router.py route --prompt \"$(head -5 $f)\" --strategy cheap\ndone\n\n# 确认没问题后再批量调用（cheap 策略保底最省）\nfor f in *.md; do\n  python scripts/router.py chat --prompt \"总结这个文件\" --strategy cheap --no-cache < \"$f\"\ndone\n\n# 调优建议：批量任务务必用 --strategy cheap + 硬件自适应并发\npython scripts/router.py hardware  # 先看建议并发数\n```\n\n### 场景三：翻译与本地化\n```bash\n# 翻译 — auto 能识别 translate 任务\npython scripts/router.py chat --prompt \"翻译成日文：${content}\" --task translate\n\n# 调优建议：翻译任务不需要强推理模型，cheap 即可胜任\n```\n\n### 场景四：学习与研究（追求质量）\n```bash\n# 复杂学术问题 — quality 策略选最强模型\npython scripts/router.py chat --prompt \"解释 Transformer 的注意力机制\" --strategy quality\n\n# 数学证明 — quality + reason 组合最强\npython scripts/router.py chat --prompt \"证明拉格朗日中值定理\" --task reason --strategy quality\n\n# 调优建议：学习研究不差钱就用 quality，差钱用 auto 也够用（95% 场景覆盖）\n```\n\n### 通用调优建议\n| 建议 | 说明 |\n|------|------|\n| **先 route 后 chat** | 每次 `chat` 前 `route` 看一眼推荐，避免选错模型浪费钱 |\n| **善用 --no-cache** | 实时信息、金融计算、代码生成等关键任务关闭缓存 |\n| **定期看 report** | `report --period month` 了解花费分布，发现异常及时止损 |\n| **设预算保护** | `config.json` 里设置 `monthly_budget`，超支前收到告警 |\n| **硬件自适应别绕过** | 不要手动改 `max_concurrency`，相信自动检测结果 |\n\n## 十三、更新提醒\n\n本技能内置 `update-check` 命令：比对本地 `version.json` 与发布源版本号，若有新版会提示你升级。**建议在定时任务或每次使用前跑一次**：\n\n```bash\npython scripts/router.py update-check\n```\n\n升级方式：通过 SkillHub 或你常用的发布流程更新本技能即可。更新日志见各版本 `version.json` 的 `notes` 字段。\n\n## 更新日志\n\n| v2.5.0 | 2026-08-17 | 增加：共享内核模式——adapters/cost_tracker/cache/health_check/config/yaml_simple 公共代码抽为 llm-core/ 源码目录，build_core.py 构建脚本在发布时 vendor 注入双包（cn-llm-router + cn-model-gateway），生成 _core_lock.json 版本锁确保同源；增加：build_core.py 三个子命令（inject 注入 / check 版本一致性检查 / regression 双端回归门禁冒烟测试）；增加：能力实测校准器 calibrate.py——跑标准题集（分类/代码/长文各 5 题）实测回填 models.yaml 画像分数，每题 2 分，标注来源（实测+日期），支持全量/抽样预算配置；优化：ernie.py 适配器精简——更新 docstring 标注推荐走 OpenAI 兼容通道，原生签名路径保留作兜底；新增：yaml_simple.py 新增 dump/dump_file 写入功能，支持 Python 对象序列化为 YAML |\n| v2.4.0 | 2026-08-16 | 增加：多模态路由——classifier.py 新增 image/audio 任务识别，models.yaml 新增 Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型厂商，路由层按 multimodal 能力标签过滤候选模型；优化：arena 子命令新增 --blind 开关，--blind 时隐藏模型名盲选投票（原行为），不加时显示模型名直接对比，消除两套重复并行调用代码；优化：流式 token 估算改为复用基类 _extract_usage() 统一取值，覆盖 prompt_tokens/input_tokens/completion_tokens/output_tokens 四种字段名，提升有 usage 返回厂商的计费精度\n| v2.2.0 | 2026-08-01 | 增加：模型竞技场 arena（并行调用 2-4 家模型，盲选最佳回答，长期追踪各模型胜率）；增加：健康检查 health-check（3 秒超时、60s 缓存、并行 ping）；增加：模型降级与故障转移（超时自动切备用模型，最多重试 2 次，成本报表标注降级事件）；增加：AdapterTimeoutError 子类（区分超时与鉴权失败）|\n| v2.1.0 | 2026-07-24 | 增加：MiniMax（abab 系列）、零一万物 Yi、百川智能、阶跃星辰 Step-2 四家厂商，覆盖扩展至 12 家 32 款模型；增加：DeepSeek V3 及全部模型的能力画像字段（推理/代码/长文得分）；优化：auto 策略改由能力画像驱动智能选型，新增厂商填画像即被自动纳入、无需改代码；增加：分类器 stream_friendly 流式适配判断（对话/翻译/代码适合流式，推理/抽取建议一次性）；修复：流式输出 token 计费恒为 0 的问题，改用估算兜底并标注（估） |\n| v2.0.0 | 2026-07-16 | 新增：全链路离线 Mock 模式（`--mock`），含 12 个预设场景（代码/推理/翻译/摘要/提取/分析/创意写作等）；新增：网络自动检测与厂商级熔断（所有厂商不可达时自动进入 mock 模式）；新增：延迟模拟（`--latency 2000`）用于测试超时降级；新增：交互式 Mock 数据编辑器（`mock --edit`）支持自定义 query→response 映射；新增：Mock 回归测试（`test --mock`，10 项 mock 专项测试）；定位：mock 数据完全本地（JSON + SQLite），不依赖外部 API，仅限开发调试，生产环境强制禁用 |\n| v1.1.0 | 2026-07-10 | 优化：缓存模糊匹配加入长度惩罚系数与最短查询限制，大幅减少「答非所问」式误命中；提升：流式输出 token 估算精度（无 usage 时按中英文混合规则兜底并标注「估」）；新增：SKILL.md 命令运行效果示例（每个命令均有真实输出样例）、反模式章节（8 条常见坑）、FAQ 扩充至 10 条、使用场景推荐与调优建议章节；修复：displayName 改为中文「国产大模型统一路由」，解决上传后显示英文名的问题 |\n| v1.0.0 | 2026-07-09 | 首发：单入口路由 + 任务感知策略（auto/cheap/quality/manual）+ 跨模型成本聚合 + 硬件自适应并发限制 + 本地语义缓存 + 更新提醒 + 8 家国产大模型全覆盖 |\n\n## 十四、安全与发布合规\n\n- 本技能**已规避全部默认拦截文件类型**：包内仅含 `.py` 源码、`.md` 文档、`.yaml`/`.json` 数据，**不含** `.bat/.cmd/.ps1/.vbs/.exe/.dll/.lnk/.msi/.docx/.xlsx/.pptx/.iso/.dmg/.zip/.rar/.7z/.tar/.gz/.apk/.jar/.DS_Store/.env/.log/.tmp/.sh/.com/.scr/.hta/.reg` 等任何风险文件。\n- 安全 grep 结果：**无 `eval/exec/os.system/subprocess/pickle` 调用**，所有网络 I/O 仅通过 `urllib` 发往官方域名或用户配置地址，均带超时 + try/except 保护。\n- 已通过「无硬编码密钥、核心无第三方依赖（讯飞星火仅可选 websocket-client）、纯标准库」的自检，可直接提交安全扫描。\n\n## 十五、反馈与建议\n\n有更好建议、遇到 bug、想加厂商，欢迎来信：**njskills@agent.qq.com**\n\n---\n\n*版本：v2.5.0 ｜ 许可：MIT ｜ 核心纯标准库（讯飞星火可选 websocket-client）、零密钥打包、可只读审计。*\n\nFile v2.5.0:_meta.json\n\n{\n  \"ownerId\": \"kn7chdrwbdhaqkwajcyhtfvjx989ddb1\",\n  \"slug\": \"cn-llm-router\",\n  \"version\": \"2.5.0\",\n  \"publishedAt\": 1787587449171\n}\n\nFile v2.5.0:references/mock_data.json\n\n{\n  \"_说明\": \"Mock 预设响应库 — 仅开发调试用，完全本地，不同步到任何云端。覆盖 12 个常见场景。\",\n  \"scenarios\": [\n    {\n      \"id\": \"code_quick_sort\",\n      \"task_type\": \"code\",\n      \"keywords\": [\"排序\", \"sort\", \"快排\", \"算法\", \"python\", \"代码\", \"code\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"以下是 Python 快速排序的实现：\\n\\n```python\\ndef quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n```\\n\\n时间复杂度：平均 O(n log n)，最坏 O(n²)。空间复杂度：O(n)。\",\n        \"in_tokens\": 45,\n        \"out_tokens\": 180\n      }\n    },\n    {\n      \"id\": \"reason_math_proof\",\n      \"task_type\": \"reason\",\n      \"keywords\": [\"证明\", \"推导\", \"定理\", \"数学\", \"reason\", \"推理\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"勾股定理证明（欧几里得证法）：\\n\\n设直角三角形两直角边为 a、b，斜边为 c。\\n构造边长为 (a+b) 的正方形，内部含四个全等直角三角形和一个小正方形。\\n\\n大正方形面积 = (a+b)² = 4×(½ab) + c²\\n展开：a² + 2ab + b² = 2ab + c²\\n化简：a² + b² = c²\\n\\n证毕。\",\n        \"in_tokens\": 30,\n        \"out_tokens\": 150\n      }\n    },\n    {\n      \"id\": \"translate_zh_en\",\n      \"task_type\": \"translate\",\n      \"keywords\": [\"翻译\", \"translate\", \"英文\", \"english\", \"中英文\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"Translation: Artificial intelligence is rapidly transforming every aspect of our lives, from healthcare and education to transportation and entertainment. While the technology brings unprecedented convenience and efficiency, it also raises important questions about privacy, employment, and ethics that society must address proactively.\",\n        \"in_tokens\": 25,\n        \"out_tokens\": 55\n      }\n    },\n    {\n      \"id\": \"summarize_long\",\n      \"task_type\": \"summarize\",\n      \"keywords\": [\"总结\", \"概括\", \"摘要\", \"summarize\", \"归纳\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"文档核心要点：\\n\\n1. 背景：大模型技术正从「对话」向「执行」演进，Agent 成为新范式\\n2. 关键变更：引入函数调用、长期记忆、多步骤规划三大能力\\n3. 数据：基准测试准确率从 72% 提升至 89%，推理成本下降 40%\\n4. 风险：幻觉率仍达 12%，需要人工审核兜底\\n5. 建议：优先在低风险场景试点，逐步向核心业务扩展\",\n        \"in_tokens\": 200,\n        \"out_tokens\": 120\n      }\n    },\n    {\n      \"id\": \"extract_info\",\n      \"task_type\": \"extract\",\n      \"keywords\": [\"提取\", \"抽取\", \"实体\", \"extract\", \"信息\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"{\\n  \\\"entities\\\": [\\n    {\\\"type\\\": \\\"公司\\\", \\\"value\\\": \\\"腾讯科技\\\"},\\n    {\\\"type\\\": \\\"时间\\\", \\\"value\\\": \\\"2026年7月\\\"},\\n    {\\\"type\\\": \\\"金额\\\", \\\"value\\\": \\\"5.2亿元\\\"},\\n    {\\\"type\\\": \\\"事件\\\", \\\"value\\\": \\\"战略融资\\\"}\\n  ],\\n  \\\"confidence\\\": 0.94\\n}\",\n        \"in_tokens\": 80,\n        \"out_tokens\": 95\n      }\n    },\n    {\n      \"id\": \"chat_greeting\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"你好\", \"hello\", \"hi\", \"嗨\", \"在吗\", \"介绍\"],\n      \"priority\": 5,\n      \"response\": {\n        \"content\": \"你好！我是 AI 助手，可以帮你解答问题、写代码、翻译文档、分析数据等。请告诉我你需要什么帮助？\",\n        \"in_tokens\": 10,\n        \"out_tokens\": 45\n      }\n    },\n    {\n      \"id\": \"code_debug\",\n      \"task_type\": \"code\",\n      \"keywords\": [\"bug\", \"报错\", \"debug\", \"修复\", \"错误\", \"异常\", \"traceback\"],\n      \"priority\": 9,\n      \"response\": {\n        \"content\": \"根据错误信息分析：\\n\\n问题原因：`NoneType` 对象没有属性 `split`，说明变量在处理前未正确赋值。\\n\\n修复建议：\\n1. 检查上游函数是否返回了 None\\n2. 添加空值守卫：`if text is not None: text.split()`\\n3. 或使用空合并：`text = get_value() or \\\"\\\"`\\n\\n建议在第 42 行前增加类型检查，确保输入非空。\",\n        \"in_tokens\": 60,\n        \"out_tokens\": 130\n      }\n    },\n    {\n      \"id\": \"long_context_analysis\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"分析\", \"解读\", \"对比\", \"评估\", \"analysis\"],\n      \"priority\": 7,\n      \"response\": {\n        \"content\": \"综合分析报告：\\n\\n## 优势\\n- 方案 A：成本低、落地快，适合 MVP 验证\\n- 方案 B：扩展性强、长期 ROI 高，适合规模化部署\\n\\n## 风险\\n- 方案 A：技术债积累，6 个月后可能需重构\\n- 方案 B：初期投入大，团队学习曲线陡峭\\n\\n## 建议\\n- 0-3 个月：用方案 A 快速验证核心假设\\n- 3-6 个月：根据数据决定是否迁移到方案 B\\n- 关键指标：用户留存率、边际成本、故障率\",\n        \"in_tokens\": 150,\n        \"out_tokens\": 200\n      }\n    },\n    {\n      \"id\": \"data_analysis\",\n      \"task_type\": \"extract\",\n      \"keywords\": [\"数据\", \"报表\", \"趋势\", \"统计\", \"data\", \"chart\"],\n      \"priority\": 8,\n      \"response\": {\n        \"content\": \"数据分析结果：\\n\\n| 指标 | Q1 | Q2 | 环比 |\\n|------|-----|-----|------|\\n| DAU | 12.3万 | 15.8万 | +28% |\\n| 留存 | 45% | 52% | +7pp |\\n| 收入 | ¥320万 | ¥480万 | +50% |\\n\\n关键洞察：7 月新上线的个性化推荐功能显著提升了用户粘性和付费转化率。建议继续优化推荐算法，目标 Q3 留存达到 55%。\",\n        \"in_tokens\": 100,\n        \"out_tokens\": 160\n      }\n    },\n    {\n      \"id\": \"creative_writing\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"写\", \"创作\", \"故事\", \"文案\", \"文章\", \"creative\", \"write\"],\n      \"priority\": 6,\n      \"response\": {\n        \"content\": \"在那个雨水敲打着玻璃的深夜，她终于打开了一封尘封了二十年的信封。\\n\\n泛黄的纸张上，熟悉的字迹让她的心跳骤然加速——那是母亲的笔迹，她以为早已在火灾中化为灰烬的秘密。\\n\\n「如果你看到这封信，说明妈妈没能亲自告诉你……」\\n\\n窗外的雷声轰然炸响，而她手中的信纸，开始微微颤抖。\",\n        \"in_tokens\": 20,\n        \"out_tokens\": 140\n      }\n    },\n    {\n      \"id\": \"general_qa\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"是什么\", \"为什么\", \"怎么\", \"如何\", \"推荐\", \"区别\"],\n      \"priority\": 3,\n      \"response\": {\n        \"content\": \"这是一个很好的问题！让我来解答：\\n\\n首先，我们可以从以下几个维度来理解：\\n1. 核心概念：定义和基本原理\\n2. 应用场景：适合什么情况使用\\n3. 注意事项：容易踩的坑\\n\\n如果你想深入了解某个方面，请告诉我，我可以进一步展开。\",\n        \"in_tokens\": 15,\n        \"out_tokens\": 85\n      }\n    },\n    {\n      \"id\": \"fallback\",\n      \"task_type\": \"chat\",\n      \"keywords\": [],\n      \"priority\": 0,\n      \"response\": {\n        \"content\": \"这是 Mock 模式返回的预设响应。在实际环境中，这里会是真实模型的回答。当前命中了通用兜底 mock，说明你的 query 没有匹配到任何特定场景。如需测试特定场景，请在 query 中加入关键词：翻译/代码/证明/总结/提取/分析 等。\",\n        \"in_tokens\": 12,\n        \"out_tokens\": 70\n      }\n    }\n  ]\n}\n\nFile v2.5.0:references/models.yaml\n\n# 模型注册表（国产大模型统一路由）\n# 说明：\n# - 价格为示例（元 / 每 1M tokens），请以各厂商官方最新定价为准。\n# - 新增厂商：只需在此加一段 provider + 一个 adapter（见 scripts/adapters），不动路由逻辑。\n# - 字段含义：\n#     display       中文名\n#     adapter       适配器类型：openai_compat / ernie / spark\n#     base_url      API 基址（openai_compat / ernie 用）\n#     base_url_openai  文心 Qianfan OpenAI 兼容端点（可选）\n#     env_hint      所需环境变量名（仅提示，密钥不进包）\n#     default_model 默认模型\n#     models[]      name / ctx(上下文窗口 token) / price_in / price_out / reasoner(可选)\n#     能力画像（0-10，越大越强，纯本地静态经验值，供 auto 策略打分）：\n#       reason_score  推理能力   code_score  代码能力   long_score  长文能力\n# - 本文件纯数据，不含任何密钥。\n\nproviders:\n  deepseek:\n    display: DeepSeek\n    adapter: openai_compat\n    base_url: https://api.deepseek.com\n    env_hint: DEEPSEEK_API_KEY\n    default_model: deepseek-chat\n    models:\n      -\n        name: deepseek-chat\n        ctx: 64000\n        price_in: 1\n        price_out: 2\n        reason_score: 8\n        code_score: 9\n        long_score: 6\n      -\n        name: deepseek-reasoner\n        ctx: 64000\n        price_in: 4\n        price_out: 16\n        reasoner: true\n        reason_score: 10\n        code_score: 9\n        long_score: 6\n  qwen:\n    display: 阿里通义千问\n    adapter: openai_compat\n    base_url: https://dashscope.aliyuncs.com/compatible-mode/v1\n    env_hint: DASHSCOPE_API_KEY\n    default_model: qwen-plus\n    models:\n      -\n        name: qwen-turbo\n        ctx: 32000\n        price_in: 0.8\n        price_out: 2\n        reason_score: 6\n        code_score: 7\n        long_score: 6\n      -\n        name: qwen-plus\n        ctx: 128000\n        price_in: 0.8\n        price_out: 2\n        reason_score: 7\n        code_score: 8\n        long_score: 8\n      -\n        name: qwen-max\n        ctx: 32000\n        price_in: 2.4\n        price_out: 9.6\n        reason_score: 9\n        code_score: 8\n        long_score: 6\n      -\n        name: qwen-long\n        ctx: 1000000\n        price_in: 0.5\n        price_out: 2\n        reason_score: 6\n        code_score: 6\n        long_score: 10\n  glm:\n    display: 智谱 GLM\n    adapter: openai_compat\n    base_url: https://open.bigmodel.cn/api/paas/v4\n    env_hint: ZHIPU_API_KEY\n    default_model: glm-4-flash\n    models:\n      -\n        name: glm-4-flash\n        ctx: 128000\n        price_in: 0.1\n        price_out: 0.1\n        reason_score: 6\n        code_score: 6\n        long_score: 8\n      -\n        name: glm-4-air\n        ctx: 128000\n        price_in: 1\n        price_out: 1\n        reason_score: 7\n        code_score: 7\n        long_score: 8\n      -\n        name: glm-4-plus\n        ctx: 128000\n        price_in: 10\n        price_out: 10\n        reason_score: 9\n        code_score: 8\n        long_score: 8\n  kimi:\n    display: 月之暗面 Kimi\n    adapter: openai_compat\n    base_url: https://api.moonshot.cn/v1\n    env_hint: MOONSHOT_API_KEY\n    default_model: moonshot-v1-8k\n    models:\n      -\n        name: moonshot-v1-8k\n        ctx: 8000\n        price_in: 1\n        price_out: 1\n        reason_score: 6\n        code_score: 6\n        long_score: 5\n      -\n        name: moonshot-v1-32k\n        ctx: 32000\n        price_in: 2.4\n        price_out: 2.4\n        reason_score: 6\n        code_score: 6\n        long_score: 7\n      -\n        name: moonshot-v1-128k\n        ctx: 128000\n        price_in: 10\n        price_out: 10\n        reason_score: 7\n        code_score: 6\n        long_score: 9\n  hunyuan:\n    display: 腾讯混元\n    adapter: openai_compat\n    base_url: https://api.hunyuan.cloud.tencent.com/v1\n    env_hint: HUNYUAN_API_KEY\n    default_model: hunyuan-lite\n    models:\n      -\n        name: hunyuan-lite\n        ctx: 32000\n        price_in: 0.6\n        price_out: 0.6\n        reason_score: 5\n        code_score: 5\n        long_score: 6\n      -\n        name: hunyuan-standard\n        ctx: 32000\n        price_in: 1.2\n        price_out: 1.2\n        reason_score: 6\n        code_score: 6\n        long_score: 6\n      -\n        name: hunyuan-pro\n        ctx: 128000\n        price_in: 3\n        price_out: 3\n        reason_score: 8\n        code_score: 7\n        long_score: 8\n      -\n        name: hunyuan-long\n        ctx: 256000\n        price_in: 3\n        price_out: 3\n        reason_score: 6\n        code_score: 6\n        long_score: 10\n  doubao:\n    display: 字节豆包\n    adapter: openai_compat\n    base_url: https://ark.cn-beijing.volces.com/api/v3\n    env_hint: ARK_API_KEY\n    default_model: doubao-pro-32k\n    models:\n      -\n        name: doubao-pro-32k\n        ctx: 32000\n        price_in: 0.8\n        price_out: 2\n        reason_score: 7\n        code_score: 7\n        long_score: 6\n      -\n        name: doubao-lite-32k\n        ctx: 32000\n        price_in: 0.3\n        price_out: 0.6\n        reason_score: 5\n        code_score: 5\n        long_score: 6\n  ernie:\n    display: 百度文心\n    adapter: ernie\n    base_url: https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro\n    base_url_openai: https://qianfan.baidubce.com/v2\n    env_hint: ERNIE_OPENAI_KEY\n    default_model: ernie-4.0-8k\n    models:\n      -\n        name: ernie-4.0-8k\n        ctx: 8000\n        price_in: 8\n        price_out: 8\n        reason_score: 8\n        code_score: 7\n        long_score: 5\n      -\n        name: ernie-3.5-8k\n        ctx: 8000\n        price_in: 1.2\n        price_out: 1.2\n        reason_score: 6\n        code_score: 6\n        long_score: 5\n  spark:\n    display: 讯飞星火\n    adapter: spark\n    version: v3.5\n    domain: generalv3.5\n    env_hint: SPARK_APP_ID / SPARK_API_KEY / SPARK_API_SECRET\n    default_model: spark-v3.5\n    models:\n      -\n        name: spark-v3.5\n        ctx: 32000\n        price_in: 1.2\n        price_out: 1.2\n        reason_score: 6\n        code_score: 6\n        long_score: 6\n  minimax:\n    display: MiniMax\n    adapter: openai_compat\n    base_url: https://api.minimax.chat/v1\n    env_hint: MINIMAX_API_KEY\n    default_model: abab6.5s-chat\n    models:\n      -\n        name: abab6.5s-chat\n        ctx: 245000\n        price_in: 1\n        price_out: 1\n        reason_score: 7\n        code_score: 6\n        long_score: 9\n      -\n        name: abab6.5g-chat\n        ctx: 8000\n        price_in: 5\n        price_out: 5\n        reason_score: 7\n        code_score: 6\n        long_score: 5\n  yi:\n    display: 零一万物 Yi\n    adapter: openai_compat\n    base_url: https://api.lingyiwanwu.com/v1\n    env_hint: YI_API_KEY\n    default_model: yi-lightning\n    models:\n      -\n        name: yi-lightning\n        ctx: 16000\n        price_in: 0.99\n        price_out: 0.99\n        reason_score: 8\n        code_score: 8\n        long_score: 6\n      -\n        name: yi-large\n        ctx: 32000\n        price_in: 20\n        price_out: 20\n        reason_score: 9\n        code_score: 8\n        long_score: 7\n      -\n        name: yi-large-fc\n        ctx: 32000\n        price_in: 20\n        price_out: 20\n        reason_score: 8\n        code_score: 8\n        long_score: 7\n  baichuan:\n    display: 百川智能\n    adapter: openai_compat\n    base_url: https://api.baichuan-ai.com/v1\n    env_hint: BAICHUAN_API_KEY\n    default_model: Baichuan4-Air\n    models:\n      -\n        name: Baichuan4-Air\n        ctx: 32000\n        price_in: 0.98\n        price_out: 0.98\n        reason_score: 7\n        code_score: 6\n        long_score: 6\n      -\n        name: Baichuan4-Turbo\n        ctx: 32000\n        price_in: 15\n        price_out: 15\n        reason_score: 8\n        code_score: 7\n        long_score: 6\n      -\n        name: Baichuan4\n        ctx: 32000\n        price_in: 100\n        price_out: 100\n        reason_score: 9\n        code_score: 8\n        long_score: 6\n  step:\n    display: 阶跃星辰 Step\n    adapter: openai_compat\n    base_url: https://api.stepfun.com/v1\n    env_hint: STEP_API_KEY\n    default_model: step-2-16k\n    models:\n      -\n        name: step-1-8k\n        ctx: 8000\n        price_in: 5\n        price_out: 20\n        reason_score: 7\n        code_score: 7\n        long_score: 5\n      -\n        name: step-2-16k\n        ctx: 16000\n        price_in: 38\n        price_out: 120\n        reason_score: 9\n        code_score: 8\n        long_score: 7\n      -\n        name: step-1-256k\n        ctx: 256000\n        price_in: 95\n        price_out: 300\n        reason_score: 8\n        code_score: 7\n        long_score: 10\n\n  # v2.4 视觉模型（多模态）\n  qwen_vl:\n    display: 阿里通义 VL\n    adapter: openai_compat\n    base_url: https://dashscope.aliyuncs.com/compatible-mode/v1\n    env_hint: DASHSCOPE_API_KEY\n    default_model: qwen-vl-plus\n    models:\n      -\n        name: qwen-vl-plus\n        ctx: 128000\n        price_in: 0.8\n        price_out: 2\n        multimodal: true\n        reason_score: 7\n        code_score: 6\n        long_score: 8\n      -\n        name: qwen-vl-max\n        ctx: 128000\n        price_in: 2.4\n        price_out: 9.6\n        multimodal: true\n        reason_score: 8\n        code_score: 6\n        long_score: 8\n\n  glm_vl:\n    display: 智谱 GLM-4V\n    adapter: openai_compat\n    base_url: https://open.bigmodel.cn/api/paas/v4\n    env_hint: ZHIPU_API_KEY\n    default_model: glm-4v-plus\n    models:\n      -\n        name: glm-4v-plus\n        ctx: 128000\n        price_in: 1\n        price_out: 1\n        multimodal: true\n        reason_score: 7\n        code_score: 5\n        long_score: 8\n\n  doubao_vl:\n    display: 字节豆包视觉\n    adapter: openai_compat\n    base_url: https://ark.cn-beijing.volces.com/api/v3\n    env_hint: ARK_API_KEY\n    default_model: doubao-vision-pro-32k\n    models:\n      -\n        name: doubao-vision-pro-32k\n        ctx: 32000\n        price_in: 0.8\n        price_out: 2\n        multimodal: true\n        reason_score: 6\n        code_score: 5\n        long_score: 6\n\nFile v2.5.0:references/routing-rules.md\n\n# 路由规则说明（国产大模型统一路由）\n\n本文件解释路由引擎如何把「一次对话请求」映射到「具体厂商 / 模型」。目标：**任务感知、成本最优、失败可降级**。\n\n## 一、四种路由模式\n\n| 模式 | 触发 | 行为 |\n|------|------|------|\n| `auto` | 默认 | 任务分类器 + 成本权重自动选最优 |\n| `cheap` | `--model cheap` | 强制最便宜模型（批量抽取 / 分类 / 翻译场景） |\n| `quality` | `--model quality` | 强制最强模型（复杂推理 / 重要产出） |\n| `manual` | `--model 厂商:模型` | 显式指定，如 `deepseek:deepseek-reasoner` |\n\n## 二、任务分类维度（auto 模式）\n\n分类器为**纯规则 + 启发式**（零密钥、零模型、毫秒级），输出：\n\n- `task_type`：classify / extract / summarize / translate / reason / code / long / general\n- `needs_reasoning`：是否需推理（命中「为什么 / 分析 / 推导 / 根因 …」）\n- `length_bucket`：short(<4k) / mid(4k–32k) / long(>32k) 以字符粗略估算\n- `budget_sensitive`：分类 / 抽取 / 总结 / 翻译 → 对价格更敏感\n\n设 `confidence` 阈值：关键词命中或含推理词 → 0.8；纯 general 且无推理词 → 0.4。\n低于阈值时由路由回退到 `quality` 或 `manual`（用户可随时覆盖）。\n\n## 三、auto 模式映射表（仅从「已配置密钥」的厂商中选择）\n\n| 分类信号 | 偏好 |\n|----------|------|\n| 需推理 | DeepSeek-R1（reasoner） |\n| 长文 (>32k) | Kimi-128k / 混元-long / 通义-long（上下文 ≥128k） |\n| 代码 | DeepSeek-Chat / 通义 |\n| 价格敏感 | GLM-4-Flash / 豆包-lite（最便宜档） |\n| 常规 | DeepSeek-Chat（均衡默认） |\n\n> 若偏好厂商未配置密钥，自动降级到「已配置厂商里最便宜 / 最强」的可用模型，并给出原因说明。\n\n## 四、失败降级（budget guard）\n\n- 主模型返回 429 / 5xx / 超时 → 适配器自动指数退避重试（最多 2 次）。\n- 仍失败 → 路由层 budget guard 阻止「贵模型 runaway」，并记录失败调用（成本统计中的 success=0）。\n- 预算阈值（config.json 的 `budget_monthly`）超支 → 主动告警（CLI 提示 + 可选企微机器人）。\n\n## 五、成本统计（第 7 类：AI 成本 / 用量可观测）\n\n每次调用无论成败都落本地 SQLite（`~/.cn_llm_router/calls.db`）：\n厂商 / 模型 / 任务 / 入 token / 出 token / 花费 / 耗时 / 成功与否。\n\n花费 = 入 token ÷ 1e6 × price_in + 出 token ÷ 1e6 × price_out（价格取自 models.yaml）。\n`report` 命令据此出日 / 周 / 月报、各家花费柱状、成功率、P95 延迟。\n\n## 六、与成熟网关（LiteLLM / One API）的关系\n\n它们是独立部署的网关服务；本技能是 **WorkBuddy 内的轻量封装**：\n- 复用各家 OpenAI 兼容端点（自研 urllib 适配器，零依赖）；\n- 在其之上叠加**任务感知路由**（网关不内置）；\n- 中文成本月报 + 可选企微 / 网盘告警（轻量本地版）。\n\n即：站在巨人肩膀上做「国产任务感知路由 + 成本可观测」这一层差异化。\n\nFile v2.5.0:skill-card.md\n\n## Description:\n\ncn-llm-router gives agents a unified command-line router for Chinese LLM providers, selecting models by task, cost, context needs, hardware limits, and configured API keys.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[fyniujin](https://clawhub.ai/user/fyniujin)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and AI tool users use this skill to route prompts across configured Chinese LLM providers, compare cost and quality, manage local cost and cache reporting, and run offline mock or route-planning flows before paid calls.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill handles provider API keys and prompt data.\n\nMitigation: Use least-privilege provider keys, keep keys in environment variables, and prefer ERNIE_OPENAI_KEY over the legacy Ernie AK/SK path.\n\nRisk: Local cache and reporting can retain prompt or response data on the user's machine.\n\nMitigation: Disable or clear cache for confidential prompts and review local cost/cache storage before production use.\n\nRisk: Arena voting can send the same sensitive prompt to multiple configured providers.\n\nMitigation: Avoid arena voting with sensitive prompts or production-only data.\n\nRisk: Spark support depends on the optional websocket-client package.\n\nMitigation: Pin and verify websocket-client before enabling Spark support in controlled environments.\n\nRisk: The calibration helper can call providers and rewrite the model registry.\n\nMitigation: Run calibration only intentionally, with an explicit budget or mock mode, and review registry changes afterward.\n\n## Reference(s):\n\n- [ClawHub release page](https://clawhub.ai/fyniujin/skills/cn-llm-router)\n- [Routing rules](references/routing-rules.md)\n- [Model registry](references/models.yaml)\n- [Configuration example](config.example.json)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Shell commands, Configuration, Guidance]\n\n**Output Format:** [CLI text and JSON, with Markdown guidance and optional HTML cost reports.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Outputs may include routing recommendations, provider responses, cost summaries, cache status, hardware guidance, and update notices.]\n\n## Skill Version(s):\n\n2.5.0 (source: SKILL.md frontmatter, evidence.release.version, artifact/version.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.5.0:_core_lock.json\n\n{\r\n  \"core_version\": \"1.0.0\",\r\n  \"injected_at\": \"2026-08-24T20:47:56\",\r\n  \"target\": \"cn-llm-router\"\r\n}\n\nFile v2.5.0:_core/version.json\n\n{\"version\": \"1.0.0\", \"compatible_skills\": {\"cn-llm-router\": \">=2.5.0\", \"cn-model-gateway\": \">=1.6.0\"}, \"adapters\": [\"openai_compat\", \"ernie\", \"spark\"], \"modules\": [\"cost_tracker\", \"cache\", \"health_check\", \"config\", \"yaml_simple\"]}\n\nFile v2.5.0:config.example.json\n\n{\n  \"_comment\": \"本文件是配置模板，不含任何密钥。厂商 API Key 一律用环境变量传入（见 SKILL.md）。请将本文件复制为 ~/.cn_llm_router_config.json 或技能目录下的 config.json 后按需修改。\",\n  \"budget_monthly\": 0.0,\n  \"update_url\": \"\",\n  \"wecom_webhook\": \"\",\n  \"cache_ttl_hours\": 168,\n  \"cache_fuzzy\": false\n}\n\nFile v2.5.0:version.json\n\n{\"version\": \"2.5.0\", \"homepage\": \"https://skillhub.cn/skill/cn-llm-router\", \"notes\": \"v2.5.0：增加共享内核模式（llm-core/ 源码目录 + build_core.py 构建脚本 vendor 注入双包 + _core_lock.json 版本锁 + 双端回归门禁）；增加能力实测校准器 calibrate.py（标准题集实测回填画像分数）；ernie.py 适配器精简（推荐兼容通道）；yaml_simple.py 新增 dump/dump_file 写入功能\"}\n\nArchive v2.4.0: 27 files, 76964 bytes\n\nFiles: config.example.json (356b), references/mock_data.json (7517b), references/models.yaml (10016b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (3973b), scripts/adapters/ernie.py (4587b), scripts/adapters/openai_compat.py (3902b), scripts/adapters/spark.py (5542b), scripts/cache.py (6959b), scripts/classifier.py (4601b), scripts/config.py (3133b), scripts/cost_tracker.py (7230b), scripts/hardware.py (3978b), scripts/health_check.py (5920b), scripts/meta.py (491b), scripts/mock_engine.py (13037b), scripts/report.py (4273b), scripts/router.py (38576b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (2727b), SKILL.md (39938b), tests/test_router.py (19088b), version.json (329b), _meta.json (132b)\n\nFile v2.4.0:SKILL.md\n\n---\nname: cn-llm-router\ndescription: 国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。\nversion: 2.4.0\n---\n\n\n# 国产大模型统一路由（cn-llm-router）\n\n> 一个**核心零依赖（纯 Python 标准库，仅讯飞星火可选一个 `websocket-client`）、零密钥打包**的命令行工具，把 12 家国产大模型收敛成「一个入口、一套命令」。你只管说「我要干嘛」，它帮你挑模型、算成本、限并发、逐字流式输出；断网或无 Key 时也能演示路由逻辑。\n\n## 一、30 秒速查\n\n```bash\n# 不配任何密钥，先看「路由建议」（演示/规划用，不发起调用）\npython scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n\n# 配好密钥后，真正调用（默认 auto 策略 = 任务感知选模型）\nexport DEEPSEEK_API_KEY=sk-xxx          # 至少一个厂商即可\npython scripts/router.py chat --prompt \"解释一下快速排序\" --model auto\n\n# 看这台电脑的硬件画像与建议并发（不拖累电脑的关键）\npython scripts/router.py hardware\n```\n\n**运行效果示例：**\n\n```\n$ python scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n╔══════════════════════════════════════════════════╗\n║         路由建议模式（未配置 API Key）             ║\n║  以下为推荐方案，不发起实际调用。配 Key 后可真跑。 ║\n╚══════════════════════════════════════════════════╝\n\n任务分类: code | 推理需求: True | 长度: short | 预算敏感: False\n推荐策略(auto): deepseek/deepseek-reasoner\n  └─ 理由: 代码生成+强推理, 性价比最优\n\n备选(cheap): deepseek/deepseek-chat        ¥0.0001/千tokens\n备选(quality): glm/glm-4                   ¥0.0010/千tokens\n\n提示: export DEEPSEEK_API_KEY=sk-xxx 即可调用\n```\n\n```\n$ python scripts/router.py hardware\n╔═══════════════ 硬件画像 ═══════════════╗\n│ CPU 逻辑核心:   8 核                    │\n│ 物理内存:       15.9 GB                 │\n│ 硬件档位:       mid                     │\n│ 建议最大并发:    2                       │\n│ 建议单批大小:    8                       │\n╚═══════════════════════════════════════╝\n```\n\n- 支持厂商（12 家 · 32 款模型）：DeepSeek、阿里通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川智能、阶跃星辰 Step。\n- 运行要求：Python 3.8+；**11 家厂商（DeepSeek/通义/智谱/Kimi/混元/豆包/文心/MiniMax/Yi/百川/阶跃）与全部离线功能无需安装任何第三方包**；讯飞星火为可选 `websocket-client`（不装也能用其余 11 家，仅星火调用时给出中文安装指引）。\n- 密钥来源：只用**环境变量**，绝不明文落盘、绝不打包进 skill。\n\n## 二、架构\n\n```\ncn-llm-router/\n├── SKILL.md                  # 本文件（使用说明 + 风险 + 边界 + FAQ + 反模式）\n├── version.json              # 版本号（更新提醒比对用）\n├── config.example.json       # 配置模板（无密钥，复制后改）\n├── references/\n│   ├── models.yaml           # 模型注册表（纯数据，可自助增删厂商）\n│   └── routing-rules.md      # 路由策略规则说明\n├── scripts/\n│   ├── router.py             # 统一 CLI 入口 + 策略引擎（对外只暴露这一个文件）\n│   ├── classifier.py         # 任务分类器（规则 + 关键词，离线）\n│   ├── config.py             # 配置/密钥读取（仅读环境变量）\n│   ├── cost_tracker.py       # 跨厂商成本聚合（SQLite，本地）\n│   ├── hardware.py           # 硬件画像 + 并发/子任务数自适应\n│   ├── cache.py              # 本地语义缓存（降 token 消耗，含长度惩罚防误命中）\n│   ├── report.py             # 文本/HTML 成本报表 + 预算告警\n│   ├── update_check.py       # 更新提醒（可离线，失败静默）\n│   ├── yaml_simple.py        # 自研零依赖 YAML 解析（不引入 PyYAML）\n│   ├── meta.py               # 版本常量\n│   └── adapters/             # 各厂商适配器（统一接口）\n│       ├── base.py           # AdapterBas\n\nArchive v2.3.0: 27 files, 74770 bytes\n\nFiles: config.example.json (356b), references/mock_data.json (7517b), references/models.yaml (8607b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (3973b), scripts/adapters/ernie.py (4587b), scripts/adapters/openai_compat.py (3960b), scripts/adapters/spark.py (5542b), scripts/cache.py (6959b), scripts/classifier.py (3805b), scripts/config.py (3133b), scripts/cost_tracker.py (7230b), scripts/hardware.py (3978b), scripts/health_check.py (5920b), scripts/meta.py (491b), scripts/mock_engine.py (13037b), scripts/report.py (4273b), scripts/router.py (35681b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (2531b), SKILL.md (39593b), tests/test_router.py (14479b), version.json (364b), _meta.json (132b)\n\nArchive v2.2.0: 27 files, 73487 bytes\n\nFiles: config.example.json (356b), references/mock_data.json (7517b), references/models.yaml (8607b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (3973b), scripts/adapters/ernie.py (4587b), scripts/adapters/openai_compat.py (3960b), scripts/adapters/spark.py (5542b), scripts/cache.py (4723b), scripts/classifier.py (3805b), scripts/config.py (3133b), scripts/cost_tracker.py (7230b), scripts/hardware.py (3978b), scripts/health_check.py (5920b), scripts/meta.py (491b), scripts/mock_engine.py (13037b), scripts/report.py (4273b), scripts/router.py (32760b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (2870b), SKILL.md (39180b), tests/test_router.py (14479b), version.json (398b), _meta.json (132b)\n\nArchive v2.1.0: 26 files, 67830 bytes\n\nFiles: config.example.json (356b), references/mock_data.json (7517b), references/models.yaml (8607b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (3494b), scripts/adapters/ernie.py (4587b), scripts/adapters/openai_compat.py (3960b), scripts/adapters/spark.py (5542b), scripts/cache.py (4723b), scripts/classifier.py (3805b), scripts/config.py (3133b), scripts/cost_tracker.py (4967b), scripts/hardware.py (3978b), scripts/meta.py (491b), scripts/mock_engine.py (13037b), scripts/report.py (4273b), scripts/router.py (25303b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (2692b), SKILL.md (38763b), tests/test_router.py (14479b), version.json (404b), _meta.json (132b)\n\nArchive v2.0.0: 26 files, 65080 bytes\n\nFiles: config.example.json (356b), references/mock_data.json (7517b), references/models.yaml (4460b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (3494b), scripts/adapters/ernie.py (4587b), scripts/adapters/openai_compat.py (3776b), scripts/adapters/spark.py (5542b), scripts/cache.py (4723b), scripts/classifier.py (3162b), scripts/config.py (2903b), scripts/cost_tracker.py (4967b), scripts/hardware.py (3978b), scripts/meta.py (491b), scripts/mock_engine.py (13037b), scripts/report.py (4273b), scripts/router.py (24043b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (2549b), SKILL.md (35886b), tests/test_router.py (14479b), version.json (318b), _meta.json (132b)\n\nArchive v1.2.0: 24 files, 53213 bytes\n\nFiles: config.example.json (356b), references/models.yaml (4460b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (3494b), scripts/adapters/ernie.py (4587b), scripts/adapters/openai_compat.py (3776b), scripts/adapters/spark.py (5542b), scripts/cache.py (4723b), scripts/classifier.py (3162b), scripts/config.py (2903b), scripts/cost_tracker.py (4967b), scripts/hardware.py (3978b), scripts/meta.py (491b), scripts/report.py (4273b), scripts/router.py (19530b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (3608b), SKILL.md (31176b), tests/test_router.py (9914b), version.json (164b), _meta.json (132b)\n\nArchive v1.1.0: 24 files, 52988 bytes\n\nFiles: config.example.json (356b), references/models.yaml (4460b), references/routing-rules.md (3138b), scripts/__init__.py (756b), scripts/adapters/__init__.py (654b), scripts/adapters/base.py (3494b), scripts/adapters/ernie.py (4587b), scripts/adapters/openai_compat.py (3776b), scripts/adapters/spark.py (5542b), scripts/cache.py (4723b), scripts/classifier.py (3162b), scripts/config.py (2903b), scripts/cost_tracker.py (4967b), scripts/hardware.py (3978b), scripts/meta.py (491b), scripts/report.py (4273b), scripts/router.py (19530b), scripts/update_check.py (3241b), scripts/yaml_simple.py (3695b), skill-card.md (2559b), SKILL.md (31089b), tests/test_router.py (9914b), version.json (434b), _meta.json (132b)","readmeExcerpt":"Skill: cn-llm-router Owner: fyniujin Summary: 国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。 Tags: latest:2.7.0","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 不配任何密钥，先看「路由建议」（演示/规划用，不发起调用）\npython scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n\n# 配好密钥后，真正调用（默认 auto 策略 = 任务感知选模型）\nexport DEEPSEEK_API_KEY=sk-xxx          # 至少一个厂商即可\npython scripts/router.py chat --prompt \"解释一下快速排序\" --model auto\n\n# 看这台电脑的硬件画像与建议并发（不拖累电脑的关键）\npython scripts/router.py hardware"},{"language":"text","snippet":"$ python scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n╔══════════════════════════════════════════════════╗\n║         路由建议模式（未配置 API Key）             ║\n║  以下为推荐方案，不发起实际调用。配 Key 后可真跑。 ║\n╚══════════════════════════════════════════════════╝\n\n任务分类: code | 推理需求: True | 长度: short | 预算敏感: False\n推荐策略(auto): deepseek/deepseek-reasoner\n  └─ 理由: 代码生成+强推理, 性价比最优\n\n备选(cheap): deepseek/deepseek-chat        ¥0.0001/千tokens\n备选(quality): glm/glm-4                   ¥0.0010/千tokens\n\n提示: export DEEPSEEK_API_KEY=sk-xxx 即可调用"},{"language":"text","snippet":"$ python scripts/router.py hardware\n╔═══════════════ 硬件画像 ═══════════════╗\n│ CPU 逻辑核心:   8 核                    │\n│ 物理内存:       15.9 GB                 │\n│ 硬件档位:       mid                     │\n│ 建议最大并发:    2                       │\n│ 建议单批大小:    8                       │\n╚═══════════════════════════════════════╝"},{"language":"text","snippet":"cn-llm-router/\n├── SKILL.md                  # 本文件（使用说明 + 风险 + 边界 + FAQ + 反模式）\n├── version.json              # 版本号（更新提醒比对用）\n├── config.example.json       # 配置模板（无密钥，复制后改）\n├── references/\n│   ├── models.yaml           # 模型注册表（纯数据，可自助增删厂商）\n│   └── routing-rules.md      # 路由策略规则说明\n├── scripts/\n│   ├── router.py             # 统一 CLI 入口 + 策略引擎（对外只暴露这一个文件）\n│   ├── classifier.py         # 任务分类器（规则 + 关键词，离线）\n│   ├── config.py             # 配置/密钥读取（仅读环境变量）\n│   ├── cost_tracker.py       # 跨厂商成本聚合（SQLite，本地）\n│   ├── hardware.py           # 硬件画像 + 并发/子任务数自适应\n│   ├── cache.py              # 本地语义缓存（降 token 消耗，含长度惩罚防误命中）\n│   ├── report.py             # 文本/HTML 成本报表 + 预算告警\n│   ├── update_check.py       # 更新提醒（可离线，失败静默）\n│   ├── yaml_simple.py        # 自研零依赖 YAML 解析（不引入 PyYAML）\n│   ├── meta.py               # 版本常量\n│   ├── session_manager.py    # 多轮会话管理（SQLite 对话表 + 历史压缩）\n│   ├── text_splitter.py      # 长文切分（段落→句子→硬切 3 级回退）+ map-reduce\n│   ├── price_registry.py     # 价格档案本地化（v2.7.0 新增）\n│   ├── price_checker.py      # 降价检测（v2.7.0 新增）\n│   └── adapters/             # 各厂商适配器（统一接口）\n│       ├── base.py           # AdapterBase + 中文异常 + token 估算工具 + embed/rerank 接口\n│       ├── openai_compat.py  # OpenAI 兼容端点（11 家通用，流式带兜底估算 + embed/rerank）\n│       ├── ernie.py          # 文心大模型（兼容 + 原生双通道，流式估算）\n│       └── spark.py          # 讯飞星火（WebSocket 签名，可选 websocket-client 做传输）\n└── tests/\n    └── test_router.py        # 离线测试（21 项，无需密钥）"},{"language":"bash","snippet":"# 方式 A：临时（当前终端）\nexport DEEPSEEK_API_KEY=sk-xxx\nexport DASHSCOPE_API_KEY=sk-xxx        # 通义千问\nexport ZHIPU_API_KEY=sk-xxx            # 智谱\nexport MOONSHOT_API_KEY=sk-xxx         # Kimi\nexport HUNYUAN_API_KEY=sk-xxx          # 腾讯混元\nexport ARK_API_KEY=sk-xxx              # 字节豆包\nexport ERNIE_OPENAI_KEY=sk-xxx         # 文心（OpenAI 兼容端点，推荐）\n# 或文心原生：ERNIE_API_KEY=xxx  +  ERNIE_SECRET_KEY=xxx\nexport SPARK_APP_ID=xxx SPARK_API_KEY=xxx SPARK_API_SECRET=xxx  # 讯飞星火\nexport MINIMAX_API_KEY=sk-xxx          # MiniMax（abab 系列）\nexport YI_API_KEY=sk-xxx               # 零一万物 Yi\nexport BAICHUAN_API_KEY=sk-xxx         # 百川智能\nexport STEP_API_KEY=sk-xxx             # 阶跃星辰 Step\n\n# 方式 B：写进 shell 配置文件（~/.bashrc / ~/.zshrc）后 source 生效\n# 方式 C：Windows PowerShell\n$env:DEEPSEEK_API_KEY=\"sk-xxx\""},{"language":"bash","snippet":"# 自动策略（根据任务类型选最合适模型）\npython scripts/router.py route --prompt \"用 Python 写个快排\"\n\n# 指定任务类型\npython scripts/router.py route --prompt \"翻译这段话到英文\" --task translate\n\n# 最省钱策略\npython scripts/router.py route --prompt \"总结这篇文章\" --strategy cheap\n\n# 最高质量策略\npython scripts/router.py route --prompt \"证明哥德巴赫猜想\" --strategy quality\n\n# 手动指定模型（跳过自动选择）\npython scripts/router.py route --prompt \"随便聊聊\" --model deepseek:deepseek-chat\n\n# JSON 格式输出（给程序调用）\npython scripts/router.py route --prompt \"分析数据\" --json"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: cn-llm-router\ndescription: 国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。\nversion: 2.7.0\n---\n\n\n# 国产大模型统一路由（cn-llm-router）\n\n> 一个**核心零依赖（纯 Python 标准库，仅讯飞星火可选一个 `websocket-client`）、零密钥打包**的命令行工具，把 12 家国产大模型收敛成「一个入口、一套命令」。你只管说「我要干嘛」，它帮你挑模型、算成本、限并发、逐字流式输出；断网或无 Key 时也能演示路由逻辑。\n\n## 一、30 秒速查\n\n```bash\n# 不配任何密钥，先看「路由建议」（演示/规划用，不发起调用）\npython scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n\n# 配好密钥后，真正调用（默认 auto 策略 = 任务感知选模型）\nexport DEEPSEEK_API_KEY=sk-xxx          # 至少一个厂商即可\npython scripts/router.py chat --prompt \"解释一下快速排序\" --model auto\n\n# 看这台电脑的硬件画像与建议并发（不拖累电脑的关键）\npython scripts/router.py hardware\n```\n\n**运行效果示例：**\n\n```\n$ python scripts/router.py route --prompt \"用 Python 写个快排\" --task code\n╔══════════════════════════════════════════════════╗\n║         路由建议模式（未配置 API Key）             ║\n║  以下为推荐方案，不发起实际调用。配 Key 后可真跑。 ║\n╚══════════════════════════════════════════════════╝\n\n任务分类: code | 推理需求: True | 长度: short | 预算敏感: False\n推荐策略(auto): deepseek/deepseek-reasoner\n  └─ 理由: 代码生成+强推理, 性价比最优\n\n备选(cheap): deepseek/deepseek-chat        ¥0.0001/千tokens\n备选(quality): glm/glm-4                   ¥0.0010/千tokens\n\n提示: export DEEPSEEK_API_KEY=sk-xxx 即可调用\n```\n\n```\n$ python scripts/router.py hardware\n╔═══════════════ 硬件画像 ═══════════════╗\n│ CPU 逻辑核心:   8 核                    │\n│ 物理内存:       15.9 GB                 │\n│ 硬件档位:       mid                     │\n│ 建议最大并发:    2                       │\n│ 建议单批大小:    8                       │\n╚═══════════════════════════════════════╝\n```\n\n- 支持厂商（12 家 · 32 款模型）：DeepSeek、阿里通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川智能、阶跃星辰 Step。\n- 运行要求：Python 3.8+；**11 家厂商（DeepSeek/通义/智谱/Kimi/混元/豆包/文心/MiniMax/Yi/百川/阶跃）与全部离线功能无需安装任何第三方包**；讯飞星火为可选 `websocket-client`（不装也能用其余 11 家，仅星火调用时给出中文安装指引）。\n- 密钥来源：只用**环境变量**，绝不明文落盘、绝不打包进 skill。\n\n## 二、架构\n\n```\ncn-llm-router/\n├── SKILL.md                  # 本文件（使用说明 + 风险 + 边界 + FAQ + 反模式）\n├── version.json              # 版本号（更新提醒比对用）\n├── config.example.json       # 配置模板（无密钥，复制后改）\n├── references/\n│   ├── models.yaml           # 模型注册表（纯数据，可自助增删厂商）\n│   └── routing-rules.md      # 路由策略规则说明\n├── scripts/\n│   ├── router.py             # 统一 CLI 入口 + 策略引擎（对外只暴露这一个文件）\n│   ├── classifier.py         # 任务分类器（规则 + 关键词，离线）\n│   ├── config.py             # 配置/密钥读取（仅读环境变量）\n│   ├── cost_tracker.py       # 跨厂商成本聚合（SQLite，本地）\n│   ├── hardware.py           # 硬件画像 + 并发/子任务数自适应\n│   ├── cache.py              # 本地语义缓存（降 token 消耗，含长度惩罚防误命中）\n│   ├── report.py             # 文本/HTML 成本报表 + 预算告警\n│   ├── update_check.py       # 更新提醒（可离线，失败静默）\n│   ├── yaml_simple.py        # 自研零依赖 YAML 解析（不引入 PyYAML）\n│   ├── meta.py               # 版本常量\n│   ├── session_manager.py    # 多轮会话管理（SQLite 对话表 + 历史压缩）\n│   ├── text_splitter.py      "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7chdrwbdhaqkwajcyhtfvjx989ddb1\",\n  \"slug\": \"cn-llm-router\",\n  \"version\": \"2.7.0\",\n  \"publishedAt\": 1791547923292\n}"},{"path":"references/mock_data.json","content":"{\n  \"_说明\": \"Mock 预设响应库 — 仅开发调试用，完全本地，不同步到任何云端。覆盖 12 个常见场景。\",\n  \"scenarios\": [\n    {\n      \"id\": \"code_quick_sort\",\n      \"task_type\": \"code\",\n      \"keywords\": [\"排序\", \"sort\", \"快排\", \"算法\", \"python\", \"代码\", \"code\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"以下是 Python 快速排序的实现：\\n\\n```python\\ndef quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n```\\n\\n时间复杂度：平均 O(n log n)，最坏 O(n²)。空间复杂度：O(n)。\",\n        \"in_tokens\": 45,\n        \"out_tokens\": 180\n      }\n    },\n    {\n      \"id\": \"reason_math_proof\",\n      \"task_type\": \"reason\",\n      \"keywords\": [\"证明\", \"推导\", \"定理\", \"数学\", \"reason\", \"推理\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"勾股定理证明（欧几里得证法）：\\n\\n设直角三角形两直角边为 a、b，斜边为 c。\\n构造边长为 (a+b) 的正方形，内部含四个全等直角三角形和一个小正方形。\\n\\n大正方形面积 = (a+b)² = 4×(½ab) + c²\\n展开：a² + 2ab + b² = 2ab + c²\\n化简：a² + b² = c²\\n\\n证毕。\",\n        \"in_tokens\": 30,\n        \"out_tokens\": 150\n      }\n    },\n    {\n      \"id\": \"translate_zh_en\",\n      \"task_type\": \"translate\",\n      \"keywords\": [\"翻译\", \"translate\", \"英文\", \"english\", \"中英文\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"Translation: Artificial intelligence is rapidly transforming every aspect of our lives, from healthcare and education to transportation and entertainment. While the technology brings unprecedented convenience and efficiency, it also raises important questions about privacy, employment, and ethics that society must address proactively.\",\n        \"in_tokens\": 25,\n        \"out_tokens\": 55\n      }\n    },\n    {\n      \"id\": \"summarize_long\",\n      \"task_type\": \"summarize\",\n      \"keywords\": [\"总结\", \"概括\", \"摘要\", \"summarize\", \"归纳\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"文档核心要点：\\n\\n1. 背景：大模型技术正从「对话」向「执行」演进，Agent 成为新范式\\n2. 关键变更：引入函数调用、长期记忆、多步骤规划三大能力\\n3. 数据：基准测试准确率从 72% 提升至 89%，推理成本下降 40%\\n4. 风险：幻觉率仍达 12%，需要人工审核兜底\\n5. 建议：优先在低风险场景试点，逐步向核心业务扩展\",\n        \"in_tokens\": 200,\n        \"out_tokens\": 120\n      }\n    },\n    {\n      \"id\": \"extract_info\",\n      \"task_type\": \"extract\",\n      \"keywords\": [\"提取\", \"抽取\", \"实体\", \"extract\", \"信息\"],\n      \"priority\": 10,\n      \"response\": {\n        \"content\": \"{\\n  \\\"entities\\\": [\\n    {\\\"type\\\": \\\"公司\\\", \\\"value\\\": \\\"腾讯科技\\\"},\\n    {\\\"type\\\": \\\"时间\\\", \\\"value\\\": \\\"2026年7月\\\"},\\n    {\\\"type\\\": \\\"金额\\\", \\\"value\\\": \\\"5.2亿元\\\"},\\n    {\\\"type\\\": \\\"事件\\\", \\\"value\\\": \\\"战略融资\\\"}\\n  ],\\n  \\\"confidence\\\": 0.94\\n}\",\n        \"in_tokens\": 80,\n        \"out_tokens\": 95\n      }\n    },\n    {\n      \"id\": \"chat_greeting\",\n      \"task_type\": \"chat\",\n      \"keywords\": [\"你好\", \"hello\", \"hi\", \"嗨\", \"在吗\", \"介绍\"],\n      \"priority\": 5,\n      \"response\": {\n        \"content\": \"你好！我是 AI 助手，可以帮你解答问题、写代码、翻译文档、分析数据等。请告诉我你需要什么帮助？\",\n        \"in_tokens\": 10,\n        \"out_tokens\": 45\n      }\n    },\n    {\n      \"id\": \"code_debug\",\n      \"task_type\": \"c"},{"path":"references/models.yaml","content":"# 模型注册表（国产大模型统一路由）\r\n\r\n# 说明：\r\n\r\n# - 价格为示例（元 / 每 1M tokens），请以各厂商官方最新定价为准。\r\n\r\n# - 新增厂商：只需在此加一段 provider + 一个 adapter（见 scripts/adapters），不动路由逻辑。\r\n\r\n# - 字段含义：\r\n\r\n#     display       中文名\r\n\r\n#     adapter       适配器类型：openai_compat / ernie / spark\r\n\r\n#     base_url      API 基址（openai_compat / ernie 用）\r\n\r\n#     base_url_openai  文心 Qianfan OpenAI 兼容端点（可选）\r\n\r\n#     env_hint      所需环境变量名（仅提示，密钥不进包）\r\n\r\n#     default_model 默认模型\r\n\r\n#     models[]      name / ctx(上下文窗口 token) / price_in / price_out / reasoner(可选)\r\n\r\n#     能力画像（0-10，越大越强，纯本地静态经验值，供 auto 策略打分）：\r\n\r\n#       reason_score  推理能力   code_score  代码能力   long_score  长文能力\r\n\r\n# - v2.6 新增：embed_models[] 和 reranks 配置块（embedding 与 rerank 统一接口）\r\n\r\n# - v2.7.0 新增：priced_at（采集日期 YYYY-MM-DD）+ price_source（来源说明）\r\n\r\n# - 本文件纯数据，不含任何密钥。\r\n\r\n\r\n\r\nproviders:\r\n\r\n  deepseek:\r\n\r\n    display: DeepSeek\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://api.deepseek.com\r\n\r\n    env_hint: DEEPSEEK_API_KEY\r\n\r\n    default_model: deepseek-chat\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: deepseek-chat\r\n\r\n        ctx: 64000\r\n\r\n        price_in: 1\r\n\r\n        price_out: 2\r\n\r\n        reason_score: 8\r\n\r\n        code_score: 9\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: deepseek-reasoner\r\n\r\n        ctx: 64000\r\n\r\n        price_in: 4\r\n\r\n        price_out: 16\r\n\r\n        reasoner: true\r\n\r\n        reason_score: 10\r\n\r\n        code_score: 9\r\n\r\n        long_score: 6\r\n\r\n  qwen:\r\n\r\n    display: 阿里通义千问\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://dashscope.aliyuncs.com/compatible-mode/v1\r\n\r\n    env_hint: DASHSCOPE_API_KEY\r\n\r\n    default_model: qwen-plus\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: qwen-turbo\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 0.8\r\n\r\n        price_out: 2\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 7\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: qwen-plus\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 0.8\r\n\r\n        price_out: 2\r\n\r\n        reason_score: 7\r\n\r\n        code_score: 8\r\n\r\n        long_score: 8\r\n\r\n      -\r\n\r\n        name: qwen-max\r\n\r\n        ctx: 32000\r\n\r\n        price_in: 2.4\r\n\r\n        price_out: 9.6\r\n\r\n        reason_score: 9\r\n\r\n        code_score: 8\r\n\r\n        long_score: 6\r\n\r\n      -\r\n\r\n        name: qwen-long\r\n\r\n        ctx: 1000000\r\n\r\n        price_in: 0.5\r\n\r\n        price_out: 2\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 10\r\n\r\n  glm:\r\n\r\n    display: 智谱 GLM\r\n\r\n    adapter: openai_compat\r\n\r\n    base_url: https://open.bigmodel.cn/api/paas/v4\r\n\r\n    env_hint: ZHIPU_API_KEY\r\n\r\n    default_model: glm-4-flash\r\n    priced_at: 2026-10-09\r\n    price_source: manual\r\n\r\n    models:\r\n\r\n      -\r\n\r\n        name: glm-4-flash\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 0.1\r\n\r\n        price_out: 0.1\r\n\r\n        reason_score: 6\r\n\r\n        code_score: 6\r\n\r\n        long_score: 8\r\n\r\n      -\r\n\r\n        name: glm-4-air\r\n\r\n        ctx: 128000\r\n\r\n        price_in: 1\r\n\r\n     "},{"path":"references/price_history.yaml","content":"{\r\n  \"snapshots\": {}\r\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。 Skill: cn-llm-router Owner: fyniujin Summary: 国产大模型统一路由。把 DeepSeek、通义千问、智谱 GLM、Kimi、腾讯混元、字节豆包、百度文心、讯飞星火、MiniMax、零一万物 Yi、百川、阶跃 Step 等 12 家国产大模型 + Qwen-VL/GLM-4V/豆包视觉 3 家视觉模型收敛成一个命令入口；支持文本 + 图片多模态任务路由；按任务类型（代码/推理/长文/翻译/摘要/抽取/图像识别）结合能力画像自动或手动选择最合适、最省钱的模型；支持流式输出、自动统计跨厂商 token 成本、硬件自适应限流（不拖累电脑）、本地语义缓存省 token、全链路离线 Mock 调试、技能更新提醒。当用户需要「调用国产大模型」「多模型比价/降本」「统一管理多个模型 Key」「本地跑大模型路由」「不想被某一家厂商绑定」「识别图片/音频内容」时使用。 Tags: latest:2.7.0","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1088,"uniquenessScore":46,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T05:58:32.888Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T05:58:32.888Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T10:45:14.230Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"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!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"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","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}