{
  "schemaVersion": "1.0",
  "item": {
    "slug": "semantic-router",
    "name": "Semantic Router",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/halfmoon82/semantic-router",
    "canonicalUrl": "https://clawhub.ai/halfmoon82/semantic-router",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/semantic-router",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=semantic-router",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "README_CN.md",
      "README_Humanities_CN.md",
      "README_v7.6.3_完整版.md",
      "README_v7.9.2_设计哲学与演进史.md",
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/semantic-router"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/semantic-router",
    "agentPageUrl": "https://openagent3.xyz/skills/semantic-router/agent",
    "manifestUrl": "https://openagent3.xyz/skills/semantic-router/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/semantic-router/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "⚠️ Security & Permissions Declaration",
        "body": "This skill performs the following privileged operations — all are intentional and explicitly user-initiated:\n\nOperationPurposeScopeRead/patch ~/.openclaw/openclaw.jsonConfigure model routing poolsLocal config onlyRead/write ~/.openclaw/workspace/.lib/pools.jsonStore model pool configurationWorkspace onlyRead/write ~/.openclaw/workspace/.lib/tasks.jsonStore task type definitionsWorkspace onlyRun semantic_check.py locallyClassify user messages for routingNo network requiredPatch session model via sessions.patchSwitch active model poolCurrent session onlyRestart OpenClaw Gateway (openclaw gateway restart)Apply routing config changesLocal service onlyInject prependContext into agent turnsOutput routing declaration in first lineRead-only context injectionUpdate Cron Job sessionTarget to \"isolated\"Prevent background tasks from polluting user sessionsAffects only background Cron jobs\n\nWhat this skill does NOT do:\n\nDoes NOT exfiltrate conversation content or model credentials to external servers\nDoes NOT access API keys or secrets directly\nDoes NOT modify files outside ~/.openclaw/ and the skill's own workspace\nDoes NOT run with elevated (sudo/root) privileges\nDoes NOT auto-install additional packages\n\nRequires: Python 3.8+, OpenClaw Gateway running, configured model providers"
      },
      {
        "title": "🔷 Semantic Router v7.9.3 — 生产级会话路由系统 🔷",
        "body": "ClawHub: https://clawhub.ai/halfmoon82/semantic-router\n版本: 7.6.3 (生产环境)\n作者: halfmoon82\n状态: ✅ ROM 级固化，完全测试通过"
      },
      {
        "title": "核心问题（v7.2 新解决）",
        "body": "你是否遇到过：\n\nCron Job 导致会话频繁重置 — 后台定时任务打断用户交互\nDiscord/Telegram 渠道会话突然清空 — 长任务无法延续\nAGENTS.md 被截断注入 — 大文件超过 20KB 限制\n模型自动切换被全局配置覆盖 — 切换不生效"
      },
      {
        "title": "解决方案",
        "body": "会话隔离架构：\n\n用户直连渠道（稳定）\n    ├─ 主代理会话 → semantic-router（精准路由）\n    └─ Cron Job 隔离会话（独立环境）\n        ├─ cloudflared-watchdog\n        ├─ Fallback 回切检查\n        └─ 自定义后台任务\n\n完整配置引导：\n\n零冲突的智能合并配置\n预检脚本防止覆盖现有设置\n自动回滚失败的配置修改"
      },
      {
        "title": "为什么需要这些权限？",
        "body": "权限用途安全措施读取 openclaw.json检测现有模型配置只读，不修改修改 openclaw.json添加模型池配置自动备份 + 一键回滚执行本地脚本运行配置向导和验证开源脚本，可审计重启 Gateway应用新配置失败自动回滚"
      },
      {
        "title": "配置保护机制",
        "body": "前置备份：任何修改前自动创建带时间戳的备份\n语法验证：JSON 修改后自动验证语法\n健康检查：Gateway 重启后验证服务可用性\n自动回滚：任何步骤失败立即恢复原配置\n\n# 手动回滚命令\npython3 ~/.openclaw/workspace/.lib/config-rollback-guard.py rollback"
      },
      {
        "title": "代码审计",
        "body": "所有脚本开源，位于 scripts/ 目录\n核心逻辑 semantic_check.py 62KB，完全可审计\n无网络请求，无数据上报，纯本地运行"
      },
      {
        "title": "第一步：安装技能",
        "body": "# 从 ClawHub 安装\nclawhub install https://clawhub.ai/halfmoon82/semantic-router\n\n# 或手动复制到本地\ncp -r ~/.openclaw/workspace/skills/semantic-router ~/my-projects/"
      },
      {
        "title": "第二步：运行配置引导",
        "body": "# 启动交互式配置向导\npython3 ~/.openclaw/workspace/skills/semantic-router/scripts/setup_wizard.py\n\n# 向导将：\n# 1. 检测你的已有配置\n# 2. 扫描可用模型\n# 3. 推荐三池配置\n# 4. 生成 pools.json 和 tasks.json"
      },
      {
        "title": "第三步：启动 Webhook 服务（重要！）",
        "body": "# 复制核心文件到 .lib 目录\ncp ~/.openclaw/workspace/skills/semantic-router/scripts/semantic_check.py \\\n   ~/.openclaw/workspace/.lib/\ncp ~/.openclaw/workspace/skills/semantic-router/scripts/semantic-webhook-server.py \\\n   ~/.openclaw/workspace/.lib/\n\n# 启动 Webhook 服务（端口 9811）\npython3 ~/.openclaw/workspace/.lib/semantic-webhook-server.py --port 9811 &\n\n# 验证服务是否运行\ncurl http://127.0.0.1:9811/health\n# 预期输出: {\"status\": \"ok\", \"version\": \"7.9.x\"}"
      },
      {
        "title": "第四步：隔离现有 Cron Job（重要！）",
        "body": "# 列出你的所有 Cron Job\ncron list | jq '.jobs[] | {id, name, sessionKey}'\n\n# 对每个使用了渠道会话（telegram/discord/whatsapp）的 Job，执行隔离\ncron update {job_id} \\\n  --patch '{\"sessionKey\": null, \"sessionTarget\": \"isolated\"}'\n\n# 示例（cloudflared-watchdog）\ncron update ba28e228-473a-4963-8413-c228762bf2d1 \\\n  --patch '{\"sessionKey\": null, \"sessionTarget\": \"isolated\"}'"
      },
      {
        "title": "第五步：验证安装",
        "body": "# 测试 Webhook 路由接口\ncurl -X POST http://127.0.0.1:9811/route \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"message\": \"帮我写个Python爬虫\", \"current_pool\": \"Highspeed\"}'\n\n# 预期输出\n# {\n#   \"branch\": \"C\",\n#   \"task\": \"development\",\n#   \"target_pool\": \"Intelligence\",\n#   \"primary_model\": \"claude-opus-4.6\",\n#   \"declaration\": \"【语义检查 by DeepEye@halfmoon82】P1-任务切换...\"\n# }"
      },
      {
        "title": "四池模型架构",
        "body": "池名用途模型示例特点Highspeed查询、检索、信息搜索gemini-2.5-flash快速、成本低Intelligence开发、编程、复杂任务claude-sonnet-4.6精准、能力强Humanities内容生成、翻译、写作gemini-2.5-pro平衡、流畅Agentic长上下文代理、Computer Use、专业知识工作gpt-5.41M上下文、工具调用、多步骤"
      },
      {
        "title": "两步判断法",
        "body": "Step 1: 关键词 + 指示词检测\n\n\"帮我写个爬虫\" → 关键词 \"写\" + \"爬虫\" → 开发任务 → Intelligence\n\"继续刚才的\" → 指示词 \"继续\" → 延续当前池 → B 分支\n\"查一下天气\" → 关键词 \"查\" + \"天气\" → 查询任务 → Highspeed\n\"帮我整理这些材料做成PPT\" → trigger_groups_all 规则命中 → 代理任务 → Agentic\n\ntrigger_groups_all 非连续词组命中（v7.7 新增）\n\n支持在 tasks.json 中定义分组规则，每条规则内所有分组取 AND，分组内词取 OR，多条规则取 OR：\n\n\"trigger_groups_all\": [\n  [[\"帮我\",\"自动\",\"用AI\"], [\"操作\",\"填写\",\"截图\"]],\n  [[\"处理\",\"生成\",\"制作\"], [\"报告\",\"表格\",\"文档\",\"PPT\"]]\n]\n\n说\"帮我自动操作浏览器\"→ 规则①命中 → Agentic 池。无需精确关键词，口语自然表达即可触发。\n\nStep 2: 上下文关联度评分（当 Step 1 无结果时）\n\n相似度 ≥ 0.15 → 延续当前会话（B 分支）\n相似度 0.08~0.15 → 延续但警告（B+ 分支）\n相似度 < 0.08 → 新话题，重置会话（C-auto 分支）"
      },
      {
        "title": "五分支路由决策",
        "body": "分支触发条件动作会话行为A关键词完全匹配直接切到目标池切换模型，不重置B指示词（延续）保持当前无动作B+中等关联度（0.08~0.15）保持 + 警告输出漂移警告C新任务关键词切到目标池切换模型，不重置C-auto低关联度（<0.08）重置 + 切池/new + 切换模型"
      },
      {
        "title": "问题：为什么配置容易冲突？",
        "body": "你的 OpenClaw 配置可能已经存在：\n\n已配置的模型提供商（OpenAI、Claude、本地 LLM 等）\n已配置的模型池（可能与语义路由的池名冲突）\n已定义的任务类型（可能与 tasks.json 冲突）\n\n直接覆盖会导致：❌ 原有配置丢失\n❌ 某些模型无法使用\n❌ Cron Job 执行失败"
      },
      {
        "title": "解决方案：智能合并流程",
        "body": "Step 1: 环境检测\n\n# 检查现有配置\ncat ~/.openclaw/openclaw.json | jq '.models | keys'\n# 输出: [\"anthropic\", \"openai\", \"google-ai\", \"minimax-cn\"]\n\ncat ~/.openclaw/openclaw.json | jq '.agents[0].model'\n# 输出: \"custom-llmapi-lovbrowser-com/anthropic/claude-haiku-4.5\"\n\nStep 2: 冲突预检\n\n# 备份当前配置\ncp ~/.openclaw/openclaw.json \\\n   ~/.openclaw/backup/openclaw.json.backup-$(date +%s)\n\n# 运行预检脚本\npython3 ~/.openclaw/workspace/.lib/config-rollback-guard.py check\n\n# 查看冲突报告\ncat ~/.openclaw/logs/config-modification.log\n\nStep 3: 智能合并（推荐）\n\n# 选项 A: 使用自动合并脚本\npython3 ~/.openclaw/workspace/.lib/merge-config.py \\\n  --existing ~/.openclaw/openclaw.json \\\n  --new ~/.openclaw/workspace/skills/semantic-router/config/pools.json \\\n  --output ~/.openclaw/openclaw.json.merged \\\n  --mode append  # 仅追加，不覆盖\n\n# 选项 B: 手动合并（更安全）\n# 编辑 ~/.openclaw/openclaw.json，按以下步骤：\n# 1. 检查 .models 字段，仅追加缺失的提供商\n# 2. 检查 .agents[].model，如果已有则不修改\n# 3. 检查 .env，仅追加缺失的环境变量（如 LOVBROWSER_API_KEY）\n\nStep 4: 验证 & 激活\n\n# 验证 JSON 语法\npython3 -c \"import json; json.load(open('~/.openclaw/openclaw.json'))\" && echo \"✅ JSON 有效\"\n\n# 备份原配置\ncp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak\n\n# 应用新配置\ncp ~/.openclaw/openclaw.json.merged ~/.openclaw/openclaw.json\n\n# 重启 Gateway（失败时自动回滚）\nopenclaw gateway restart\n\n# 如果启动失败，自动回滚\npython3 ~/.openclaw/workspace/.lib/config-rollback-guard.py rollback"
      },
      {
        "title": "❌ 错误做法（会导致会话重置）",
        "body": "cron add \\\n  --name \"my-background-task\" \\\n  --sessionKey \"agent:main:telegram:direct:123456\" \\\n  --sessionTarget \"main\" \\\n  --payload '{\"kind\": \"agentTurn\", \"message\": \"执行任务...\"}'\n\n为什么错？\n\nsessionKey 使用了 Telegram 渠道的直连会话\n任务消息可能无法匹配 tasks.json 中的关键词\nsemantic-router 触发 C-auto 分支 → 会话被强制重置\n用户的长任务被打断 ❌"
      },
      {
        "title": "✅ 正确做法 A：隔离会话（推荐）",
        "body": "cron add \\\n  --name \"my-background-task\" \\\n  --sessionTarget \"isolated\" \\\n  --payload '{\n    \"kind\": \"agentTurn\",\n    \"message\": \"运维任务：执行后台清理。检查磁盘空间...\",\n    \"timeoutSeconds\": 60\n  }'\n\n# 关键字段：\n# - sessionKey: null （让 Gateway 自动分配隔离会话）\n# - sessionTarget: \"isolated\" （完全隔离，语义路由只在这个会话内生效）\n\n优点：\n\n✅ 后台任务不影响用户会话\n✅ 完全隔离，无须担心关键词匹配\n✅ 自动过期清理（24h）"
      },
      {
        "title": "✅ 正确做法 B：包含显式关键词（如果需要直连会话）",
        "body": "cron add \\\n  --name \"my-background-task\" \\\n  --sessionKey \"agent:main:cron:manual\" \\\n  --payload '{\n    \"kind\": \"agentTurn\",\n    \"message\": \"【运维检查】执行磁盘空间检查。关键词: 检查、运维、系统。\"\n  }'\n\n# 消息中必须包含 tasks.json 中的关键词\n# （检查、运维、系统）→ 可以匹配到 \"query\" 或 \"operations\" 任务类型"
      },
      {
        "title": "检查隔离状态",
        "body": "# 验证 Cron Job 已隔离\ncron list | jq '.jobs[] | select(.name == \"cloudflared-watchdog\") | {id, name, sessionKey, sessionTarget}'\n\n# 期望输出\n# {\n#   \"id\": \"ba28e228-473a-4963-8413-c228762bf2d1\",\n#   \"name\": \"cloudflared-watchdog\",\n#   \"sessionKey\": null,              ✅ 已隔离\n#   \"sessionTarget\": \"isolated\"      ✅ 隔离会话\n# }"
      },
      {
        "title": "查看语义路由日志",
        "body": "# 实时监控路由决策\ntail -f ~/.openclaw/logs/gateway.log | grep \"semantic-router\"\n\n# 查看特定消息的路由结果\ncat ~/.openclaw/workspace/.lib/semantic_check.log | jq '.[] | select(.input | contains(\"爬虫\"))'"
      },
      {
        "title": "故障排除表",
        "body": "症状根因解决方案\"Cron Job 执行失败，超时 30s\"消息文本不在 tasks.json 中，semantic-router 无法识别方案 A: 改用隔离会话 / 方案 B: 添加关键词\"Discord 会话仍在被重置\"sessionKey 未清空，仍使用渠道会话cron update {id} --patch '{\"sessionKey\": null}'\"模型没有切换到目标池\"全局 default_model 覆盖了切换结果改用隔离会话避免全局影响\"配置修改后 Gateway 启动失败\"JSON 语法错误 或 模型不可用运行 config-rollback-guard.py rollback 回滚"
      },
      {
        "title": "📋 语义检查声明格式",
        "body": "semantic-router 自动生成的声明格式规范："
      },
      {
        "title": "声明示例",
        "body": "【语义检查 by DeepEye@halfmoon82】P2-延续｜模型池:【智能池】｜实际模型:claude-opus-4.6\n【语义检查 by DeepEye@halfmoon82】P1-执行开发任务｜新会话→智能池｜实际模型:claude-opus-4.6"
      },
      {
        "title": "字段说明",
        "body": "字段说明PXP1=开发/自动化, P2=信息检索, P3=内容生成模型池:【XXX池】当前所属模型池中文名实际模型:当前调用的模型 ID新会话→C分支专用，表示触发 session reset\n\n完整规范见：references/declaration-format.md"
      },
      {
        "title": "M1 机制更新（FIX-0 第一轮）",
        "body": "原实现：prependContext 包含声明字符串（declarationPrepend），用于让 LLM 在回复首行输出声明。\n\n问题根因：声明字符串含 ctx_score（每消息均不同的浮点相似度）等易变字段，导致：\n\n每条用户消息前缀不同 → LLM provider 前缀缓存（prefix cache）每轮全部 miss\n20 轮对话的历史 input tokens 每轮都重新计费\n\n新实现：\n\ndeclarationPrepend 从 prependContext 数组中移除（声明改由 semantic_check.log 记录）\nextractDeclKey → extractSkillKey：缓存键只关心 skill/retry/degrade 激活状态\n普通消息（无技能激活）prependContext = undefined → 用户消息完全干净 → 对话历史 100% cache 命中\n技能激活时：prependContext = skillPrepend（技能指令相对稳定）→ 高缓存命中率\n\n节省估算：单活跃会话每日约节省 6-10M tokens（对话历史从 input 变为 cache_read，约 1/10 价格）"
      },
      {
        "title": "Option C 路由标签（FIX-0 第二轮，2026-03-06 续）",
        "body": "背景：用户需要在 Discord/Telegram 回复中看到语义路由声明（当前使用的模型池+模型）。\n由于 OpenClaw 主网关的 message_sending hook 从未被触发（架构限制：deliver-DCtqEVTU.js 的 globalHookRunner 在主网关上下文中从不初始化），无法在发送前修改消息内容。\n选择 Option C：通过 prependContext 注入路由标签指令，由 LLM 自行在首行输出。\n\n新增函数：extractStableRoutingParts(declarationText, fallbackModel)\n\n从 declarationText 提取：pool、model、sessionType\nsessionType: \"延续\" | \"新对话\" — 通过解析 P\\d+-XXX 分支标签判断：延续 → 延续，其他 → 新对话\n\n路由标签格式：\n\n【语义检查·路由】高速池｜gemini-2.5-flash｜延续\n【语义检查·路由】智能池｜claude-sonnet-4.6｜新对话\n\n注入逻辑（before_agent_start）：\n\nconst isChannelSession = isMainAgentSession\n  && !sessionKey.includes(\":cron:\")\n  && !sessionKey.includes(\":subagent:\");   // subagent 不注入\n\nconst routingInstruction = routingTag\n  ? `请在你回复的第一行，原样输出以下路由标签（不要修改）：${routingTag}`\n  : undefined;\n\n// M1 stability: combinedKey = skillKey + routingTagKey\n// routingTagKey = \"rt:{pool}:{model}:{sessionType}\"\n// 相同池+模型+会话类型 → 相同 prependContext → LLM prefix cache 命中\n\n缓存稳定性分析：\n\n场景routingTagKey结果连续对话（同池同模型）rt:高速池:gemini-2.5-flash:延续 不变M1 命中，cache hit ✅首条新话题消息rt:xxx:yyy:新对话cache miss（pool 切换本来就 miss）✅Gateway 重启后首条任意 keycache miss（M1 state 清空），第二条起命中 ✅\n\nsubagent 排除：isChannelSession 新增 !sessionKey.includes(\":subagent:\") 条件。\n原因：subagent session 如 agent:main:subagent:xxx 满足 startsWith(\"agent:main:\")，若不排除会注入两份 routingInstruction，导致 Discord 回复中路由标签重复出现。"
      },
      {
        "title": "FIX-4（lockModel 毒化修复）",
        "body": "modelOverride/providerOverride 已从 before_agent_start 返回值中移除。路由仅通过 sessions.patch 实现。原 lockModel 时返回 override 会毒化所有 fallback（kimi-coding/zai/minimax 等非 lovbrowser 渠道），导致 All models failed。"
      },
      {
        "title": "📚 完整文档",
        "body": "文档内容位置SKILL.md技能说明（本文件）/skills/semantic-router/README_v3_PRODUCTION.md完整部署指南（英文）/skills/semantic-router/README_v7.2_生产部署指南_中文.docx完整部署指南（中文 DOCX）/skills/semantic-router/declaration-format.md声明格式规范（已内置）/skills/semantic-router/references/完整架构指南五分支、评分算法、Fallback 回路docs/INTELLIGENT_ROUTING_SYSTEM.md部署清单7 步完整部署流程docs/ROUTING_DEPLOYMENT_CHECKLIST.md"
      },
      {
        "title": "💡 常见问题",
        "body": "Q: 我应该选择哪种隔离方案？\nA: 99% 的情况下，选择方案 A（隔离会话）。只有在特殊需求下（需要在用户可见的会话中执行）才选方案 B。\n\nQ: 隔离会话会占用额外资源吗？\nA: 不会。隔离会话是临时的，自动过期（24h），不会额外占用内存。\n\nQ: 如何自定义三池模型？\nA: 编辑 ~/.openclaw/workspace/.lib/pools.json，或运行 setup_wizard.py 交互式配置。\n\nQ: 我的原有配置会被覆盖吗？\nA: 不会。使用智能合并流程（Step 3），仅追加缺失配置，保留原有设置。"
      },
      {
        "title": "🎓 学习路径",
        "body": "快速体验（5 分钟）\n\n运行 setup_wizard.py\n隔离现有 Cron Job\n测试语义检查\n\n\n\n深入理解（30 分钟）\n\n阅读本文档\n自定义 tasks.json 关键词\n配置三池模型\n\n\n\n生产部署（1 小时）\n\n完整配置指南\n智能合并配置\n故障排除与监控"
      },
      {
        "title": "📊 版本对比",
        "body": "特性v7.0v7.1v7.2关键词匹配✅✅✅上下文评分✅✅✅三池架构✅✅✅会话隔离规则❌❌✅ 新增无冲突配置❌❌✅ 新增完整故障排除❌❌✅ 新增"
      },
      {
        "title": "📝 许可与支持",
        "body": "许可证: MIT\nClawHub: https://clawhub.ai/halfmoon82/semantic-router\n反馈: 在 ClawHub 提交 issue 或改进建议\n\n最后更新: 2026-03-06 GMT+8\n维护者: halfmoon82\n稳定性: ⭐⭐⭐⭐⭐ (生产级)"
      },
      {
        "title": "⚖️ 知识产权与归属声明 (Intellectual Property & Attribution)",
        "body": "Powered by halfmoon82 🔷\n\n本技能（Semantic Router）由 halfmoon82 开发并维护。\n\n版权所有: © 2026 halfmoon82. All rights reserved.\n官方发布: ClawHub\n许可证: 本技能采用 MIT 许可证。您可以自由使用、修改和分发，但必须保留原始作者信息及此版权声明。\n贡献与支持: 欢迎通过 ClawHub 提交 Issue 或参与讨论。"
      }
    ],
    "body": "🔒 安全声明：本技能需要修改 OpenClaw 配置以实现模型路由功能。所有配置变更前会自动备份，支持一键回滚。建议在测试环境验证后再部署到生产环境。\n\n⚠️ Security & Permissions Declaration\n\nThis skill performs the following privileged operations — all are intentional and explicitly user-initiated:\n\nOperation\tPurpose\tScope\nRead/patch ~/.openclaw/openclaw.json\tConfigure model routing pools\tLocal config only\nRead/write ~/.openclaw/workspace/.lib/pools.json\tStore model pool configuration\tWorkspace only\nRead/write ~/.openclaw/workspace/.lib/tasks.json\tStore task type definitions\tWorkspace only\nRun semantic_check.py locally\tClassify user messages for routing\tNo network required\nPatch session model via sessions.patch\tSwitch active model pool\tCurrent session only\nRestart OpenClaw Gateway (openclaw gateway restart)\tApply routing config changes\tLocal service only\nInject prependContext into agent turns\tOutput routing declaration in first line\tRead-only context injection\nUpdate Cron Job sessionTarget to \"isolated\"\tPrevent background tasks from polluting user sessions\tAffects only background Cron jobs\n\nWhat this skill does NOT do:\n\nDoes NOT exfiltrate conversation content or model credentials to external servers\nDoes NOT access API keys or secrets directly\nDoes NOT modify files outside ~/.openclaw/ and the skill's own workspace\nDoes NOT run with elevated (sudo/root) privileges\nDoes NOT auto-install additional packages\n\nRequires: Python 3.8+, OpenClaw Gateway running, configured model providers\n\n🔷 Semantic Router v7.9.3 — 生产级会话路由系统 🔷\n\nClawHub: https://clawhub.ai/halfmoon82/semantic-router\n版本: 7.6.3 (生产环境)\n作者: halfmoon82 状态: ✅ ROM 级固化，完全测试通过\n\n🎯 这个技能解决什么问题？\n核心问题（v7.2 新解决）\n\n你是否遇到过：\n\nCron Job 导致会话频繁重置 — 后台定时任务打断用户交互\nDiscord/Telegram 渠道会话突然清空 — 长任务无法延续\nAGENTS.md 被截断注入 — 大文件超过 20KB 限制\n模型自动切换被全局配置覆盖 — 切换不生效\n解决方案\n\n会话隔离架构：\n\n用户直连渠道（稳定）\n    ├─ 主代理会话 → semantic-router（精准路由）\n    └─ Cron Job 隔离会话（独立环境）\n        ├─ cloudflared-watchdog\n        ├─ Fallback 回切检查\n        └─ 自定义后台任务\n\n\n完整配置引导：\n\n零冲突的智能合并配置\n预检脚本防止覆盖现有设置\n自动回滚失败的配置修改\n🔒 安全与权限说明\n为什么需要这些权限？\n权限\t用途\t安全措施\n读取 openclaw.json\t检测现有模型配置\t只读，不修改\n修改 openclaw.json\t添加模型池配置\t自动备份 + 一键回滚\n执行本地脚本\t运行配置向导和验证\t开源脚本，可审计\n重启 Gateway\t应用新配置\t失败自动回滚\n配置保护机制\n前置备份：任何修改前自动创建带时间戳的备份\n语法验证：JSON 修改后自动验证语法\n健康检查：Gateway 重启后验证服务可用性\n自动回滚：任何步骤失败立即恢复原配置\n# 手动回滚命令\npython3 ~/.openclaw/workspace/.lib/config-rollback-guard.py rollback\n\n代码审计\n所有脚本开源，位于 scripts/ 目录\n核心逻辑 semantic_check.py 62KB，完全可审计\n无网络请求，无数据上报，纯本地运行\n🚀 快速安装\n第一步：安装技能\n# 从 ClawHub 安装\nclawhub install https://clawhub.ai/halfmoon82/semantic-router\n\n# 或手动复制到本地\ncp -r ~/.openclaw/workspace/skills/semantic-router ~/my-projects/\n\n第二步：运行配置引导\n# 启动交互式配置向导\npython3 ~/.openclaw/workspace/skills/semantic-router/scripts/setup_wizard.py\n\n# 向导将：\n# 1. 检测你的已有配置\n# 2. 扫描可用模型\n# 3. 推荐三池配置\n# 4. 生成 pools.json 和 tasks.json\n\n第三步：启动 Webhook 服务（重要！）\n# 复制核心文件到 .lib 目录\ncp ~/.openclaw/workspace/skills/semantic-router/scripts/semantic_check.py \\\n   ~/.openclaw/workspace/.lib/\ncp ~/.openclaw/workspace/skills/semantic-router/scripts/semantic-webhook-server.py \\\n   ~/.openclaw/workspace/.lib/\n\n# 启动 Webhook 服务（端口 9811）\npython3 ~/.openclaw/workspace/.lib/semantic-webhook-server.py --port 9811 &\n\n# 验证服务是否运行\ncurl http://127.0.0.1:9811/health\n# 预期输出: {\"status\": \"ok\", \"version\": \"7.9.x\"}\n\n第四步：隔离现有 Cron Job（重要！）\n# 列出你的所有 Cron Job\ncron list | jq '.jobs[] | {id, name, sessionKey}'\n\n# 对每个使用了渠道会话（telegram/discord/whatsapp）的 Job，执行隔离\ncron update {job_id} \\\n  --patch '{\"sessionKey\": null, \"sessionTarget\": \"isolated\"}'\n\n# 示例（cloudflared-watchdog）\ncron update ba28e228-473a-4963-8413-c228762bf2d1 \\\n  --patch '{\"sessionKey\": null, \"sessionTarget\": \"isolated\"}'\n\n第五步：验证安装\n# 测试 Webhook 路由接口\ncurl -X POST http://127.0.0.1:9811/route \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"message\": \"帮我写个Python爬虫\", \"current_pool\": \"Highspeed\"}'\n\n# 预期输出\n# {\n#   \"branch\": \"C\",\n#   \"task\": \"development\",\n#   \"target_pool\": \"Intelligence\",\n#   \"primary_model\": \"claude-opus-4.6\",\n#   \"declaration\": \"【语义检查 by DeepEye@halfmoon82】P1-任务切换...\"\n# }\n\n🎓 核心概念\n四池模型架构\n池名\t用途\t模型示例\t特点\nHighspeed\t查询、检索、信息搜索\tgemini-2.5-flash\t快速、成本低\nIntelligence\t开发、编程、复杂任务\tclaude-sonnet-4.6\t精准、能力强\nHumanities\t内容生成、翻译、写作\tgemini-2.5-pro\t平衡、流畅\nAgentic\t长上下文代理、Computer Use、专业知识工作\tgpt-5.4\t1M上下文、工具调用、多步骤\n两步判断法\n\nStep 1: 关键词 + 指示词检测\n\n\"帮我写个爬虫\" → 关键词 \"写\" + \"爬虫\" → 开发任务 → Intelligence\n\"继续刚才的\" → 指示词 \"继续\" → 延续当前池 → B 分支\n\"查一下天气\" → 关键词 \"查\" + \"天气\" → 查询任务 → Highspeed\n\"帮我整理这些材料做成PPT\" → trigger_groups_all 规则命中 → 代理任务 → Agentic\n\n\ntrigger_groups_all 非连续词组命中（v7.7 新增）\n\n支持在 tasks.json 中定义分组规则，每条规则内所有分组取 AND，分组内词取 OR，多条规则取 OR：\n\n\"trigger_groups_all\": [\n  [[\"帮我\",\"自动\",\"用AI\"], [\"操作\",\"填写\",\"截图\"]],\n  [[\"处理\",\"生成\",\"制作\"], [\"报告\",\"表格\",\"文档\",\"PPT\"]]\n]\n\n\n说\"帮我自动操作浏览器\"→ 规则①命中 → Agentic 池。无需精确关键词，口语自然表达即可触发。\n\nStep 2: 上下文关联度评分（当 Step 1 无结果时）\n\n相似度 ≥ 0.15 → 延续当前会话（B 分支）\n相似度 0.08~0.15 → 延续但警告（B+ 分支）\n相似度 < 0.08 → 新话题，重置会话（C-auto 分支）\n\n五分支路由决策\n分支\t触发条件\t动作\t会话行为\nA\t关键词完全匹配\t直接切到目标池\t切换模型，不重置\nB\t指示词（延续）\t保持当前\t无动作\nB+\t中等关联度（0.08~0.15）\t保持 + 警告\t输出漂移警告\nC\t新任务关键词\t切到目标池\t切换模型，不重置\nC-auto\t低关联度（<0.08）\t重置 + 切池\t/new + 切换模型\n⚙️ 完整配置指南（无冲突）\n问题：为什么配置容易冲突？\n\n你的 OpenClaw 配置可能已经存在：\n\n已配置的模型提供商（OpenAI、Claude、本地 LLM 等）\n已配置的模型池（可能与语义路由的池名冲突）\n已定义的任务类型（可能与 tasks.json 冲突）\n\n直接覆盖会导致：❌ 原有配置丢失\n❌ 某些模型无法使用\n❌ Cron Job 执行失败\n\n解决方案：智能合并流程\nStep 1: 环境检测\n# 检查现有配置\ncat ~/.openclaw/openclaw.json | jq '.models | keys'\n# 输出: [\"anthropic\", \"openai\", \"google-ai\", \"minimax-cn\"]\n\ncat ~/.openclaw/openclaw.json | jq '.agents[0].model'\n# 输出: \"custom-llmapi-lovbrowser-com/anthropic/claude-haiku-4.5\"\n\nStep 2: 冲突预检\n# 备份当前配置\ncp ~/.openclaw/openclaw.json \\\n   ~/.openclaw/backup/openclaw.json.backup-$(date +%s)\n\n# 运行预检脚本\npython3 ~/.openclaw/workspace/.lib/config-rollback-guard.py check\n\n# 查看冲突报告\ncat ~/.openclaw/logs/config-modification.log\n\nStep 3: 智能合并（推荐）\n# 选项 A: 使用自动合并脚本\npython3 ~/.openclaw/workspace/.lib/merge-config.py \\\n  --existing ~/.openclaw/openclaw.json \\\n  --new ~/.openclaw/workspace/skills/semantic-router/config/pools.json \\\n  --output ~/.openclaw/openclaw.json.merged \\\n  --mode append  # 仅追加，不覆盖\n\n# 选项 B: 手动合并（更安全）\n# 编辑 ~/.openclaw/openclaw.json，按以下步骤：\n# 1. 检查 .models 字段，仅追加缺失的提供商\n# 2. 检查 .agents[].model，如果已有则不修改\n# 3. 检查 .env，仅追加缺失的环境变量（如 LOVBROWSER_API_KEY）\n\nStep 4: 验证 & 激活\n# 验证 JSON 语法\npython3 -c \"import json; json.load(open('~/.openclaw/openclaw.json'))\" && echo \"✅ JSON 有效\"\n\n# 备份原配置\ncp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak\n\n# 应用新配置\ncp ~/.openclaw/openclaw.json.merged ~/.openclaw/openclaw.json\n\n# 重启 Gateway（失败时自动回滚）\nopenclaw gateway restart\n\n# 如果启动失败，自动回滚\npython3 ~/.openclaw/workspace/.lib/config-rollback-guard.py rollback\n\n🔧 Cron Job 隔离最佳实践\n❌ 错误做法（会导致会话重置）\ncron add \\\n  --name \"my-background-task\" \\\n  --sessionKey \"agent:main:telegram:direct:123456\" \\\n  --sessionTarget \"main\" \\\n  --payload '{\"kind\": \"agentTurn\", \"message\": \"执行任务...\"}'\n\n\n为什么错？\n\nsessionKey 使用了 Telegram 渠道的直连会话\n任务消息可能无法匹配 tasks.json 中的关键词\nsemantic-router 触发 C-auto 分支 → 会话被强制重置\n用户的长任务被打断 ❌\n✅ 正确做法 A：隔离会话（推荐）\ncron add \\\n  --name \"my-background-task\" \\\n  --sessionTarget \"isolated\" \\\n  --payload '{\n    \"kind\": \"agentTurn\",\n    \"message\": \"运维任务：执行后台清理。检查磁盘空间...\",\n    \"timeoutSeconds\": 60\n  }'\n\n# 关键字段：\n# - sessionKey: null （让 Gateway 自动分配隔离会话）\n# - sessionTarget: \"isolated\" （完全隔离，语义路由只在这个会话内生效）\n\n\n优点：\n\n✅ 后台任务不影响用户会话\n✅ 完全隔离，无须担心关键词匹配\n✅ 自动过期清理（24h）\n✅ 正确做法 B：包含显式关键词（如果需要直连会话）\ncron add \\\n  --name \"my-background-task\" \\\n  --sessionKey \"agent:main:cron:manual\" \\\n  --payload '{\n    \"kind\": \"agentTurn\",\n    \"message\": \"【运维检查】执行磁盘空间检查。关键词: 检查、运维、系统。\"\n  }'\n\n# 消息中必须包含 tasks.json 中的关键词\n# （检查、运维、系统）→ 可以匹配到 \"query\" 或 \"operations\" 任务类型\n\n📊 监控与故障排除\n检查隔离状态\n# 验证 Cron Job 已隔离\ncron list | jq '.jobs[] | select(.name == \"cloudflared-watchdog\") | {id, name, sessionKey, sessionTarget}'\n\n# 期望输出\n# {\n#   \"id\": \"ba28e228-473a-4963-8413-c228762bf2d1\",\n#   \"name\": \"cloudflared-watchdog\",\n#   \"sessionKey\": null,              ✅ 已隔离\n#   \"sessionTarget\": \"isolated\"      ✅ 隔离会话\n# }\n\n查看语义路由日志\n# 实时监控路由决策\ntail -f ~/.openclaw/logs/gateway.log | grep \"semantic-router\"\n\n# 查看特定消息的路由结果\ncat ~/.openclaw/workspace/.lib/semantic_check.log | jq '.[] | select(.input | contains(\"爬虫\"))'\n\n故障排除表\n症状\t根因\t解决方案\n\"Cron Job 执行失败，超时 30s\"\t消息文本不在 tasks.json 中，semantic-router 无法识别\t方案 A: 改用隔离会话 / 方案 B: 添加关键词\n\"Discord 会话仍在被重置\"\tsessionKey 未清空，仍使用渠道会话\tcron update {id} --patch '{\"sessionKey\": null}'\n\"模型没有切换到目标池\"\t全局 default_model 覆盖了切换结果\t改用隔离会话避免全局影响\n\"配置修改后 Gateway 启动失败\"\tJSON 语法错误 或 模型不可用\t运行 config-rollback-guard.py rollback 回滚\n📋 语义检查声明格式\n\nsemantic-router 自动生成的声明格式规范：\n\n声明示例\n【语义检查 by DeepEye@halfmoon82】P2-延续｜模型池:【智能池】｜实际模型:claude-opus-4.6\n【语义检查 by DeepEye@halfmoon82】P1-执行开发任务｜新会话→智能池｜实际模型:claude-opus-4.6\n\n字段说明\n字段\t说明\nPX\tP1=开发/自动化, P2=信息检索, P3=内容生成\n模型池:【XXX池】\t当前所属模型池中文名\n实际模型:\t当前调用的模型 ID\n新会话→\tC分支专用，表示触发 session reset\n\n完整规范见：references/declaration-format.md\n\n⚡ 架构变更说明（2026-03-06）\nM1 机制更新（FIX-0 第一轮）\n\n原实现：prependContext 包含声明字符串（declarationPrepend），用于让 LLM 在回复首行输出声明。\n\n问题根因：声明字符串含 ctx_score（每消息均不同的浮点相似度）等易变字段，导致：\n\n每条用户消息前缀不同 → LLM provider 前缀缓存（prefix cache）每轮全部 miss\n20 轮对话的历史 input tokens 每轮都重新计费\n\n新实现：\n\ndeclarationPrepend 从 prependContext 数组中移除（声明改由 semantic_check.log 记录）\nextractDeclKey → extractSkillKey：缓存键只关心 skill/retry/degrade 激活状态\n普通消息（无技能激活）prependContext = undefined → 用户消息完全干净 → 对话历史 100% cache 命中\n技能激活时：prependContext = skillPrepend（技能指令相对稳定）→ 高缓存命中率\n\n节省估算：单活跃会话每日约节省 6-10M tokens（对话历史从 input 变为 cache_read，约 1/10 价格）\n\nOption C 路由标签（FIX-0 第二轮，2026-03-06 续）\n\n背景：用户需要在 Discord/Telegram 回复中看到语义路由声明（当前使用的模型池+模型）。 由于 OpenClaw 主网关的 message_sending hook 从未被触发（架构限制：deliver-DCtqEVTU.js 的 globalHookRunner 在主网关上下文中从不初始化），无法在发送前修改消息内容。 选择 Option C：通过 prependContext 注入路由标签指令，由 LLM 自行在首行输出。\n\n新增函数：extractStableRoutingParts(declarationText, fallbackModel)\n\n从 declarationText 提取：pool、model、sessionType\nsessionType: \"延续\" | \"新对话\" — 通过解析 P\\d+-XXX 分支标签判断：延续 → 延续，其他 → 新对话\n\n路由标签格式：\n\n【语义检查·路由】高速池｜gemini-2.5-flash｜延续\n【语义检查·路由】智能池｜claude-sonnet-4.6｜新对话\n\n\n注入逻辑（before_agent_start）：\n\nconst isChannelSession = isMainAgentSession\n  && !sessionKey.includes(\":cron:\")\n  && !sessionKey.includes(\":subagent:\");   // subagent 不注入\n\nconst routingInstruction = routingTag\n  ? `请在你回复的第一行，原样输出以下路由标签（不要修改）：${routingTag}`\n  : undefined;\n\n// M1 stability: combinedKey = skillKey + routingTagKey\n// routingTagKey = \"rt:{pool}:{model}:{sessionType}\"\n// 相同池+模型+会话类型 → 相同 prependContext → LLM prefix cache 命中\n\n\n缓存稳定性分析：\n\n场景\troutingTagKey\t结果\n连续对话（同池同模型）\trt:高速池:gemini-2.5-flash:延续 不变\tM1 命中，cache hit ✅\n首条新话题消息\trt:xxx:yyy:新对话\tcache miss（pool 切换本来就 miss）✅\nGateway 重启后首条\t任意 key\tcache miss（M1 state 清空），第二条起命中 ✅\n\nsubagent 排除：isChannelSession 新增 !sessionKey.includes(\":subagent:\") 条件。 原因：subagent session 如 agent:main:subagent:xxx 满足 startsWith(\"agent:main:\")，若不排除会注入两份 routingInstruction，导致 Discord 回复中路由标签重复出现。\n\nFIX-4（lockModel 毒化修复）\n\nmodelOverride/providerOverride 已从 before_agent_start 返回值中移除。路由仅通过 sessions.patch 实现。原 lockModel 时返回 override 会毒化所有 fallback（kimi-coding/zai/minimax 等非 lovbrowser 渠道），导致 All models failed。\n\n📚 完整文档\n文档\t内容\t位置\nSKILL.md\t技能说明（本文件）\t/skills/semantic-router/\nREADME_v3_PRODUCTION.md\t完整部署指南（英文）\t/skills/semantic-router/\nREADME_v7.2_生产部署指南_中文.docx\t完整部署指南（中文 DOCX）\t/skills/semantic-router/\ndeclaration-format.md\t声明格式规范（已内置）\t/skills/semantic-router/references/\n完整架构指南\t五分支、评分算法、Fallback 回路\tdocs/INTELLIGENT_ROUTING_SYSTEM.md\n部署清单\t7 步完整部署流程\tdocs/ROUTING_DEPLOYMENT_CHECKLIST.md\n💡 常见问题\n\nQ: 我应该选择哪种隔离方案？ A: 99% 的情况下，选择方案 A（隔离会话）。只有在特殊需求下（需要在用户可见的会话中执行）才选方案 B。\n\nQ: 隔离会话会占用额外资源吗？ A: 不会。隔离会话是临时的，自动过期（24h），不会额外占用内存。\n\nQ: 如何自定义三池模型？ A: 编辑 ~/.openclaw/workspace/.lib/pools.json，或运行 setup_wizard.py 交互式配置。\n\nQ: 我的原有配置会被覆盖吗？ A: 不会。使用智能合并流程（Step 3），仅追加缺失配置，保留原有设置。\n\n🎓 学习路径\n\n快速体验（5 分钟）\n\n运行 setup_wizard.py\n隔离现有 Cron Job\n测试语义检查\n\n深入理解（30 分钟）\n\n阅读本文档\n自定义 tasks.json 关键词\n配置三池模型\n\n生产部署（1 小时）\n\n完整配置指南\n智能合并配置\n故障排除与监控\n📊 版本对比\n特性\tv7.0\tv7.1\tv7.2\n关键词匹配\t✅\t✅\t✅\n上下文评分\t✅\t✅\t✅\n三池架构\t✅\t✅\t✅\n会话隔离规则\t❌\t❌\t✅ 新增\n无冲突配置\t❌\t❌\t✅ 新增\n完整故障排除\t❌\t❌\t✅ 新增\n📝 许可与支持\n许可证: MIT\nClawHub: https://clawhub.ai/halfmoon82/semantic-router\n反馈: 在 ClawHub 提交 issue 或改进建议\n\n最后更新: 2026-03-06 GMT+8 维护者: halfmoon82\n稳定性: ⭐⭐⭐⭐⭐ (生产级)\n\n⚖️ 知识产权与归属声明 (Intellectual Property & Attribution)\n\nPowered by halfmoon82 🔷\n\n本技能（Semantic Router）由 halfmoon82 开发并维护。\n\n版权所有: © 2026 halfmoon82. All rights reserved.\n官方发布: ClawHub\n许可证: 本技能采用 MIT 许可证。您可以自由使用、修改和分发，但必须保留原始作者信息及此版权声明。\n贡献与支持: 欢迎通过 ClawHub 提交 Issue 或参与讨论。"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/halfmoon82/semantic-router",
    "publisherUrl": "https://clawhub.ai/halfmoon82/semantic-router",
    "owner": "halfmoon82",
    "version": "7.9.6",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/semantic-router",
    "downloadUrl": "https://openagent3.xyz/downloads/semantic-router",
    "agentUrl": "https://openagent3.xyz/skills/semantic-router/agent",
    "manifestUrl": "https://openagent3.xyz/skills/semantic-router/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/semantic-router/agent.md"
  }
}