{"id":"b64ab861-360b-4832-967a-9c04680b239e","entityType":"agent","slug":"clawhub-yijian-baidu-baidu-yijian-vision","name":"Baidu Yijian Vision","canonicalUrl":"https://www.xpersona.co/agent/clawhub-yijian-baidu-baidu-yijian-vision","canonicalPath":"/agent/clawhub-yijian-baidu-baidu-yijian-vision","generatedAt":"2026-10-10T04:29:11.615Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T17:20:07.794Z","emptyReason":null},"description":"Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision. Skill: Baidu Yijian Vision Owner: yijian-baidu Summary: Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision. Tags: latest:","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.2K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17dk6kmahdq6x0kdvc5hjfq4583hba4:baidu-yijian-vision","sourceUrl":"https://clawhub.ai/yijian-baidu/baidu-yijian-vision","homepage":"https://clawhub.ai/yijian-baidu/skills/baidu-yijian-vision","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/yijian-baidu/baidu-yijian-vision","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/yijian-baidu/skills/baidu-yijian-vision","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":67,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:20:07.794Z","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-09T17:20:07.794Z","emptyReason":null},"stars":null,"forks":null,"downloads":2227,"packageName":null,"latestVersion":"0.9.42","tractionLabel":"2.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T17:20:07.793Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T17:20:07.794Z","lastCrawledAt":"2026-10-09T17:20:07.793Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T17:20:07.793Z","lastVerifiedAt":null,"highlights":[{"version":"0.9.42","createdAt":"2026-05-06T03:50:51.584Z","changelog":"v0.9.42","fileCount":19,"zipByteSize":44147},{"version":"0.9.41","createdAt":"2026-04-30T05:52:55.419Z","changelog":"v0.9.41","fileCount":18,"zipByteSize":42099},{"version":"0.9.40","createdAt":"2026-04-29T02:21:14.390Z","changelog":"v0.9.40","fileCount":18,"zipByteSize":42121},{"version":"0.9.39","createdAt":"2026-04-28T10:03:36.396Z","changelog":"v0.9.39","fileCount":18,"zipByteSize":42123},{"version":"0.9.38","createdAt":"2026-04-27T07:34:56.542Z","changelog":"- Updated description for improved clarity and emphasis on Yijian's visual AI specialization and advantages. - No code or functionality changes; all scripts and workflows remain the same.","fileCount":18,"zipByteSize":42086},{"version":"0.9.37","createdAt":"2026-04-27T03:47:29.703Z","changelog":"- Add English keywords to the description for improved search and discoverability. - No functional or workflow changes; documentation updated only.","fileCount":18,"zipByteSize":41982},{"version":"0.9.36","createdAt":"2026-04-24T14:34:27.686Z","changelog":"Version 0.9.36 - 新增 scripts/cache.mjs，用于缓存数据，提升技能获取和列表查询的效率。 - 相关接口现在支持本地缓存，有效减少无效请求。","fileCount":18,"zipByteSize":41922},{"version":"0.9.35","createdAt":"2026-04-23T10:08:58.760Z","changelog":"**Version 0.9.35 Changelog** - Major workflow update: Added \"意图驱动自动路由\"能力，根据自然语言描述智能匹配技能或自动回退到多模态推理。 - 新增脚本：intent-invoke.mjs、multimodal.mjs、query.mjs、workspace.mjs，实现自动技能筛选、多模态/技能切换和私有空间技能查询。 - 大幅简化和重构文档，删除安装、安全、可视化及视频帧处理等冗余说明，聚焦一键意图驱动和自动路由流程。 - 移除多余/过时脚本和 Markdown 文档，提高使用聚焦度。 - 支持自定义置信度阈值、私有技能快速查询、ROI/Tripwire 指定与自动生成。 - 统一参数格式和调用方式，适配全新意图工作流。","fileCount":17,"zipByteSize":41510}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17dk6kmahdq6x0kdvc5hjfq4583hba4:baidu-yijian-vision","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-yijian-baidu-baidu-yijian-vision/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yijian-baidu-baidu-yijian-vision/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yijian-baidu-baidu-yijian-vision/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-yijian-baidu-baidu-yijian-vision/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-yijian-baidu-baidu-yijian-vision/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-yijian-baidu-baidu-yijian-vision/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-10T04:29:11.611Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yijian-baidu-baidu-yijian-vision/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yijian-baidu-baidu-yijian-vision/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yijian-baidu-baidu-yijian-vision/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-yijian-baidu-baidu-yijian-vision/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-09T17:20:07.794Z","emptyReason":null},"readme":"Skill: Baidu Yijian Vision\n\nOwner: yijian-baidu\n\nSummary: Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision.\n\nTags: latest:0.9.42\n\nVersion history:\n\nv0.9.42 | 2026-05-06T03:50:51.584Z | user\n\nv0.9.42\n\nv0.9.41 | 2026-04-30T05:52:55.419Z | user\n\nv0.9.41\n\nv0.9.40 | 2026-04-29T02:21:14.390Z | user\n\nv0.9.40\n\nv0.9.39 | 2026-04-28T10:03:36.396Z | user\n\nv0.9.39\n\nv0.9.38 | 2026-04-27T07:34:56.542Z | user\n\n- Updated description for improved clarity and emphasis on Yijian's visual AI specialization and advantages.\n- No code or functionality changes; all scripts and workflows remain the same.\n\nv0.9.37 | 2026-04-27T03:47:29.703Z | user\n\n- Add English keywords to the description for improved search and discoverability.\n- No functional or workflow changes; documentation updated only.\n\nv0.9.36 | 2026-04-24T14:34:27.686Z | user\n\nVersion 0.9.36\n\n- 新增 scripts/cache.mjs，用于缓存数据，提升技能获取和列表查询的效率。\n- 相关接口现在支持本地缓存，有效减少无效请求。\n\nv0.9.35 | 2026-04-23T10:08:58.760Z | user\n\n**Version 0.9.35 Changelog**\n\n- Major workflow update: Added \"意图驱动自动路由\"能力，根据自然语言描述智能匹配技能或自动回退到多模态推理。\n- 新增脚本：intent-invoke.mjs、multimodal.mjs、query.mjs、workspace.mjs，实现自动技能筛选、多模态/技能切换和私有空间技能查询。\n- 大幅简化和重构文档，删除安装、安全、可视化及视频帧处理等冗余说明，聚焦一键意图驱动和自动路由流程。\n- 移除多余/过时脚本和 Markdown 文档，提高使用聚焦度。\n- 支持自定义置信度阈值、私有技能快速查询、ROI/Tripwire 指定与自动生成。\n- 统一参数格式和调用方式，适配全新意图工作流。\n\nv0.9.32 | 2026-04-20T02:57:33.296Z | user\n\nbaidu-yijian-vision v0.9.32\n\n- 文档内容为小幅优化，术语统一，如“百度一见”、“Baidu Yijian”等表述更标准一致。\n- 英文注释与说明文本的部分行文更精简直白，无功能变更。\n- 平台名称、获取 API Key 相关说明补充“百度”字样，表达更清晰。\n- 技能主描述、用途、系统要求、功能简介等段落格式与表达统一，无实质逻辑更新。\n- 此版本仅文档优化，无代码或功能变化。\n\nv0.9.31 | 2026-04-20T02:17:39.343Z | user\n\nVersion 0.9.31\n\n- 精简了名称和描述表述，使表意更直接（如“视觉 AI Agent”调整为“视觉技能”）。\n- 保留所有原有技能功能、使用说明和文档结构不变。\n- 介绍部分缩短，部分重复或冗余术语得到优化。\n- 不涉及脚本或实际功能更新，仅文档表述微调。\n- 适用于图片、视频分析及相关检测的全流程工作流不变。\n\nv0.9.30 | 2026-04-03T09:06:23.073Z | user\n\nVersion 0.9.30\n\n- Added new utility script: `scripts/preset-utils.mjs`.\n- Documentation update: now includes instructions for filtering skills by user intent before skill invocation.\n\nv0.9.29 | 2026-03-31T11:39:46.769Z | user\n\n- Removed 4 files: package-lock.json, scripts/generate-presets.mjs, scripts/migrate.mjs, skill/skill.json.\n- Skill manifest updated: added metadata for required binaries and environment variables.\n- Documentation and workflow instructions in SKILL.md updated and clarified.\n- English summary and key usage points introduced at the top of SKILL.md.\n\nv0.9.28 | 2026-03-31T10:11:56.275Z | auto\n\n**Changelog for baidu-yijian-vision v0.9.28**\n\n- Added migration and preset generation scripts for improved skill setup and compatibility.\n- Added machine-readable skill metadata file (`skill/skill.json`).\n- Updated documentation (SKILL.md) for more concise usage instructions and new requirements format.\n- Updated type guides and workflow guides (including ROI/grid guides) for clarity and structure.\n- Added package-lock.json for consistent dependency management.\n\nv0.9.27 | 2026-03-31T06:37:10.198Z | user\n\n- Added a concise English summary at the start describing Baidu Yijian Vision as a professional vision AI agent.\n- Updated the main description field to include an English title and clarify product positioning.\n- No functional or workflow changes; documentation improvements only.\n- All usage guides, API instructions, and examples remain unchanged.\n\nv0.9.26 | 2026-03-16T16:21:19.121Z | user\n\n- docs: improve data transmission disclosure in SECURITY.md\n\nv0.9.25 | 2026-03-16T16:10:30.640Z | user\n\n- correct ROI/Tripwire examples in docs\n\nv0.9.24 | 2026-03-16T15:50:10.910Z | user\n\n- 修正了文档中的 API Key 获取路径描述，现在明确指向“一见平台 → 系统管理 → 安全认证 → API Key”。\n- 优化了术语表达，明确了“ROI”为电子围栏、“Tripwire”为绊线，并在文档中补充对应说明。\n- 类型定义部分补充了检测（Detection）、图像（Image）、电子围栏（ROI）、绊线（Tripwire）等相关数据结构的中文解释。\n- 其余文档内容保持与前一版本一致，没有功能变更。\n\nv0.9.22 | 2026-03-15T14:05:10.462Z | user\n\n- Removed two scripts: generate-presets.mjs and migrate.mjs, simplifying the codebase.\n- Updated requirements metadata: now explicitly lists node and npm as required binaries.\n- No changes to end-user workflow or main documentation content.\n\nv0.9.21 | 2026-03-15T13:32:34.030Z | user\n\nSECURITY.md changed\n\nv0.9.20 | 2026-03-15T13:13:33.416Z | user\n\nbaidu-yijian-vision 0.9.20\n\n- 增加 metadata 字段（openclaw 规范），明确标注所需环境变量 YIJIAN_API_KEY 及主凭据。\n- 其他文档内容无变化。\n\nv0.9.19 | 2026-03-13T16:24:59.115Z | user\n\n- 精简和优化了技能描述，更突出专业视觉 AI 能力及核心优势场景。\n- 文档结构保持一致，部分引用由“README.md”调整为“安装指南(INSTALL.md)”。\n- 无新增功能或脚本更改，仅文档描述和说明文本更新。\n- 适合在视觉巡检、工业、安全监控等多种场景快速上手使用。\n\nv0.9.18 | 2026-03-13T15:44:39.454Z | user\n\n- 更新描述，突出行业级应用及典型场景，包含 SOP 合规、质检、红线监控、商业分析、物料盘点等丰富用例\n- 明确支持数据类型：图片、视频及 RTSP/RTMP 实时流\n- 增加“required-env-vars”和“primary-credential”字段，规范环境变量声明\n- 强调专业精度与推理成本优势，突出相较通用基模的性能提升\n- 其他说明、功能结构与用法保持不变\n\nv0.9.17 | 2026-03-13T15:28:26.910Z | user\n\n- Removed README.md from the project.\n- Environment variable, binary, and dependency specifications were removed from SKILL.md’s metadata header.\n- All existing skill features and usage instructions remain unchanged.\n- Installation and requirement information is still included within the body content.\n\nv0.9.16 | 2026-03-13T14:53:36.966Z | user\n\n- Added explicit declaration of required environment variable YIJIAN_API_KEY and its format.\n- Declared node and npm version requirements under required-binaries.\n- Listed native dependency sharp and described its installation method.\n- Added information about remote API endpoint (https://yijian-next.cloud.baidu.com).\n- Updated documentation to highlight these prerequisite conditions in a dedicated section.\n- README.md file added.\n\nv0.9.15 | 2026-03-13T14:26:06.248Z | user\n\n- 安全说明文档（SECURITY.md）和安装指南（INSTALL.md）已新增，提升安全透明与易用性\n- 文档新增“系统要求”、显著的安全声明，并统一指向新文档\n- 入口文档结构优化，更突出常见操作和新手指引\n- 所有详细安装、安全及类型文档在导航中可直接访问\n\nv0.9.14 | 2026-03-13T13:48:25.140Z | user\n\n- Updated documentation with a detailed \"SKILL.md\" covering features, usage guide, setup, and workflow examples.\n- Expanded instructions for skill registration, detection, ROI/tripwire definition, and visualization.\n- Added sample commands for typical tasks, including grid reference and batch video frame processing.\n- Included links to additional guides and detailed example workflows for common scenarios.\n\nArchive index:\n\nArchive v0.9.42: 19 files, 44147 bytes\n\nFiles: grid-guide.md (6164b), package.json (1029b), roi-workflow.md (2693b), scripts/cache.mjs (1908b), scripts/intent-invoke.mjs (5889b), scripts/invoke.mjs (5886b), scripts/list.mjs (1229b), scripts/multimodal.mjs (2608b), scripts/query.mjs (2604b), scripts/show-grid.mjs (7969b), scripts/types.mjs (20158b), scripts/utils.mjs (4553b), scripts/visualize.mjs (19622b), scripts/workspace.mjs (6944b), skill-card.md (2560b), SKILL.md (9482b), tripwire-workflow.md (3411b), types-guide.md (9811b), _meta.json (139b)\n\nFile v0.9.42:SKILL.md\n\n---\nname: baidu-yijian-vision\ndescription: \"Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision. 百度一见视觉技能（Baidu Yijian Vision Skill）- 可用于分析图片和视频。相比通用基模，在维持 95%+ 专业精度的同时，推理成本降低 50% 以上，是处理视觉巡检与监控分析任务的首选工具。主打 安全管理、SOP合规、工业质检、商业运营与物料盘点。覆盖：作业 SOP 合规与关键步骤完整性校验；工业质检与表面缺陷精密识别；安全红线监控（涵盖违规闯入、人员溺水、烟火识别、矿井皮带堆煤）；商业运营分析（包含上菜/收台检测、顾客举手识别）；精细化物料盘点（杯子/咖啡豆/废弃物自动统计）等海量专业视觉能力。\"\nallowed-tools: Bash, Read, Write, Edit\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\"],\"env\":[\"YIJIAN_API_KEY\"]},\"primaryEnv\":\"YIJIAN_API_KEY\"}}\n---\n\n# 百度一见视觉技能（Baidu Yijian Vision Skill）\n\n> **Baidu Yijian Vision Skill** - baidu yijian vision skill for image/video analysis, object detection, safety monitoring, and industrial inspection.\n\n## ⚠️ 必需条件\n\n1. **YIJIAN_API_KEY 环境变量**（必需）— 从[百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)获取：\n   1. 登录百度一见平台\n   2. 激活试用包\n   3. 生成 API Key（系统管理 → 安全认证 → API Key）\n2. **Node.js >= 16.0.0** — 运行时依赖\n\n配置环境变量：`YIJIAN_API_KEY=your-api-key`\n\n---\n\n> **🔒 客户端工具 - 这是一个本地工具，用于与百度一见（Baidu Yijian）平台交互。所有数据处理遵循安全协议。**\n\n## 🎯 此工具的功能\n\n百度一见（[yijian-next.cloud.baidu.com](https://yijian-next.cloud.baidu.com)）是百度（Baidu）的视觉（vision）理解平台。此工具使你能够：\n\n- **意图自动匹配** - 通过自然语言描述自动匹配最佳技能\n- **智能路由** - 高置信度匹配时调用专业视觉技能，低置信度时自动回退到多模态推理\n- **直接技能调用** - 已知技能ID时可直接调用\n- **可视化结果** - 绘制边框、生成网格参考、预览 ROI/绊线\n- **定义检测区域** - 使用交互式工作流定义 ROI（电子围栏）或绊线（检测线）\n\n**支持的检测类型：** 人员检测、行人计数、车辆识别、OCR、姿态估计、目标跟踪等。\n\n## 📚 使用指南\n\n### 意图驱动工作流（推荐）\n\n**当你描述需求但不确定用哪个技能时**，系统会自动匹配最佳技能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg\n```\n\n系统会自动：\n1. 查询一见平台，根据意图匹配公共技能列表\n2. 如果匹配置信度 ≥ 0.7，调用对应的专业技能（自动添加全图 ROI）\n3. 如果公共技能无匹配或调用失败，搜索私有工作空间技能（由你从列表中选择最匹配的技能，再用 invoke 调用）\n4. 如果私有空间也无合适技能，自动回退到多模态直接推理\n\n> **自动 ROI：** 当用户未提供 ROI 时，系统会自动生成覆盖整张图片的 ROI。如需指定检测区域，请使用 `invoke.mjs` 传入自定义 ROI。\n\n#### 自定义置信度阈值\n\n```bash\n# 仅当匹配度≥0.8时才使用技能，否则回退到多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg 0.8\n```\n\n#### 不使用图片（纯文本意图查询）\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\"\n```\n\n#### 返回格式\n\n```json\n{\n  \"success\": true,\n  \"mode\": \"skill\",\n  \"epId\": \"ep-public-xxxxx\",\n  \"skillName\": \"人员摔倒检测\",\n  \"confidence\": 0.92,\n  \"count\": 1,\n  \"detections\": [\n    {\n      \"bbox\": [100, 200, 50, 80],\n      \"category\": \"falling_person\",\n      \"confidence\": 0.94\n    }\n  ]\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `success` | boolean | 调用是否成功 |\n| `mode` | string | `\"skill\"` / `\"workspace-search\"` / `\"multimodal\"`，表示使用的推理模式 |\n| `epId` | string \\| null | 技能ID（技能模式时有值） |\n| `skillName` | string \\| null | 技能名称（技能模式时有值） |\n| `confidence` | number \\| null | 技能匹配置信度（0-1） |\n| `count` | number | 检测到的目标数量 |\n| `detections` | array | 检测结果数组 |\n\n**模式说明：**\n- `\"mode\": \"skill\"` - 使用了百度一见平台的专业技能，精度高、成本低\n- `\"mode\": \"workspace-search\"` - 公共技能无匹配，返回私有工作空间技能列表供选择\n- `\"mode\": \"multimodal\"` - 使用了多模态大模型直接推理，通用性强、无需预设技能\n\n### 查询技能\n\n**查询公共技能**（按意图匹配）：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/list.mjs \"人员检测\"\n```\n\n**查询私有工作空间技能**（按 API Key 关联，缓存1小时）：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/workspace.mjs list-skills\n```\n\n返回技能列表（含 epId、名称和描述）。当公共技能匹配不到时，从私有列表中选择最匹配的技能，用 `invoke.mjs` 调用：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-wsnyqcdj-0xdpgbt4\n```\n\n### 直接调用技能（已知技能ID）\n\n**当你已经知道具体的技能 ID 时**，可以直接调用：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n#### ROI（电子围栏）参数格式\n\nROI 用于限定检测区域。**必须包含 `id`、`name`、`kind`、`points` 四个字段，缺一不可**，否则 API 返回 500 错误。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"zone\",\n  \"kind\": \"ROI\",\n  \"points\": [x1,y1, x2,y2, x3,y3, x4,y4]\n}\n```\n\n- `id` — 任意字符串标识（如 `\"1\"`）\n- `name` — 区域名称（如 `\"zone\"`、`\"doorway\"`）\n- `kind` — 固定值 `\"ROI\"`\n- `points` — 顶点坐标数组，按顺时针/逆时针顺序排列，每对 `[x,y]` 为一个顶点\n\n#### 绊线（Tripwire）参数格式\n\n绊线用于检测穿越事件。**必须包含 `id`、`name`、`kind`、`points`、`direction` 五个字段**。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"line\",\n  \"kind\": \"TripWire\",\n  \"points\": [p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p4_x,p4_y],\n  \"direction\": \"Forward\"\n}\n```\n\n- `id` — 任意字符串标识\n- `name` — 绊线名称\n- `kind` — 固定值 `\"TripWire\"`\n- `points` — 4 个点（8 个数值）：p1→p2 为主线，p3→p4 为 A/B 区域标记\n- `direction` — 检测方向：`\"Forward\"` | `\"Backward\"` | `\"TwoWay\"`\n\n> **绊线不会自动生成**，必须由用户指定。详见 [绊线工作流](./tripwire-workflow.md)。\n\n**调用带 ROI 的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[100,100,500,100,500,400,100,400]}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n**调用带绊线的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[0,540,1920,540,0,500,1920,500],\"direction\":\"Forward\"}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n### 定义检测区域\n\n**需要定义电子围栏（ROI，又叫感兴趣区域）或绊线（Tripwire，又叫检测线）？**\n\n- **[ROI 工作流](./roi-workflow.md)** — 创建电子围栏，仅在指定区域检测\n- **[绊线工作流](./tripwire-workflow.md)** — 绘制检测线，统计穿越事件\n\n两个工作流都包含完整的交互步骤和示例对话。\n\n**预览 ROI/绊线** — 在调用前在图像上预览：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs photo.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"zone\",\"points\":[...]}]'\n```\n\n**生成网格** — 帮助用户使用网格坐标指定点位置：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/show-grid.mjs photo.jpg grid.png\n```\n\n### 查看完整文档\n\n- **[类型定义](./types-guide.md)** — 检测（Detection），图像（Image）、电子围栏（ROI）、绊线（Tripwire）等数据结构\n- **[网格输入系统](./grid-guide.md)** — 使用网格坐标指定点\n\n### 高级：视频帧处理和跟踪\n\n**场景：** 处理 30 秒监控视频，逐帧检测和跟踪人员。\n\n```bash\n# 第 1 步：提取帧\nffmpeg -i surveillance_30sec.mp4 -vf fps=1 frames/frame_%04d.jpg\n\n# 第 2 步：计算 sourceId（视频标识符）\nsourceId=$(head -c 65536 surveillance_30sec.mp4 | md5sum | awk '{print substr($1, 1, 16)}')\n\n# 第 3 步：处理每个帧并跟踪\nfor frame_file in frames/frame_*.jpg; do\n  frame_num=$(basename \"$frame_file\" | grep -oE '[0-9]+' | head -1)\n  frame_index=$((10#$frame_num - 1))\n  timestamp=$((frame_index * 1000))\n  imageId=\"frame_$(printf '%04d' \"$frame_num\")\"\n\n  # 使用意图驱动调用\n  result=$(node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员\" \"$frame_file\")\n\n  detections=$(echo \"$result\" | jq '.detections')\n  echo \"$detections\" > \"results/${imageId}_detections.json\"\ndone\n```\n\nFile v0.9.42:_meta.json\n\n{\n  \"ownerId\": \"kn7aw0s517ypj0hstj91qr6nxs82r2xy\",\n  \"slug\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.42\",\n  \"publishedAt\": 1778039451584\n}\n\nFile v0.9.42:grid-guide.md\n\n# 基于网格的 ROI / 绊线输入指南\n\n## 概述\n\n在命令行环境中手动指定 ROI 区域或绊线的确切像素坐标既繁琐又容易出错。基于网格的输入系统让你可以使用易于理解的网格坐标来代替。\n\n## 工作原理\n\n### 1. 生成网格参考图像\n\n```bash\nnode scripts/show-grid.mjs photo.jpg [output-path] [--cols N] [--rows N]\n```\n\n这会在你的图像上创建带标签的网格叠加层：\n\n```\n       A     B     C     D     E     F     G\n   0   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   1   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   2   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   3   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   4   ·─────·─────·─────·─────·─────·─────·\n```\n\n**输出**：\n- `photo_grid.png` - 网格参考图像\n- `photo_grid_metadata.json` - 坐标映射数据\n\n### 2. 查看并识别坐标\n\n查看网格图像并识别 ROI 或绊线的坐标：\n\n- **列**：A、B、C、D、...（从左到右）\n- **行**：0、1、2、3、...（从上到下）\n- **交点**：网格线交叉的位置（用点标记）\n\n### 3. 使用网格坐标指定\n\n告诉系统网格坐标：\n\n```\n用户：\"在 B1、E1、E3、B3 创建检测区域\"\n```\n\n系统自动转换为像素坐标：\n\n```\nB1 = (列B索引 × 网格宽度, 行1索引 × 网格高度)\nE1 = (列E索引 × 网格宽度, 行1索引 × 网格高度)\nE3 = (列E索引 × 网格宽度, 行3索引 × 网格高度)\nB3 = (列B索引 × 网格宽度, 行3索引 × 网格高度)\n```\n\n## 使用示例\n\n### 示例 1：定义检测区域（ROI）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs office.jpg\n\n# 查看网格图像以识别坐标，然后：\n用户：\"我想要一个办公桌区域的检测区域：B2、G2、G5、B5\"\n\n转换为 ROI：\n{\n  \"kind\": \"ROI\",\n  \"points\": [col_B, row_2, col_G, row_2, col_G, row_5, col_B, row_5]\n}\n\n# 使用 ROI 调用技能\n$ echo '{\"input0\":{\"image\":\"office.jpg\",\"roi\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-2403um2p\n```\n\n### 示例 2：定义穿越线（绊线）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs hallway.jpg\n\n# 查看网格图像，然后：\n用户：\"在走廊中创建一条从 A3 到 H3 的绊线，检测从左到右的穿越\"\n\n转换为绊线：\n{\n  \"kind\": \"TripWire\",\n  \"points\": [col_A, row_3, col_H, row_3],\n  \"direction\": \"Forward\"\n}\n\n# 使用绊线调用技能\n$ echo '{\"input0\":{\"image\":\"hallway.jpg\",\"tripwire\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-ywbjb7tm\n```\n\n### 示例 3：多个 ROI\n\n```bash\n用户：\"我想要 3 个检测区域：入口（A1-C3）、中心（D1-F3）、出口（G1-H3）\"\n\n转换为三个 ROI 对象并作为 Array<ROI> 传递：\n[\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_A, row_1, col_C, row_1, col_C, row_3, col_A, row_3],\n    \"order\": 0\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_D, row_1, col_F, row_1, col_F, row_3, col_D, row_3],\n    \"order\": 1\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_G, row_1, col_H, row_1, col_H, row_3, col_G, row_3],\n    \"order\": 2\n  }\n]\n```\n\n## 网格算法\n\n网格大小会自动计算：\n\n- **目标**：约 30-42 个交点，大致为方形单元\n- **横向图像**（1920×1080）：7 列 × 4 行\n- **纵向图像**（1080×1920）：4 列 × 7 行\n- **方形图像**（800×800）：5 列 × 5 行\n\n**手动覆盖**：\n```bash\nnode scripts/show-grid.mjs photo.jpg --cols 10 --rows 6\n```\n\n## 命令参考\n\n### 生成网格\n\n```bash\nnode scripts/show-grid.mjs <input-image> [output-path] [--cols N] [--rows N]\n```\n\n**参数**：\n- `<input-image>` - 输入图像文件路径\n- `[output-path]` - 可选输出图像路径（默认：`<input>_grid.png`）\n- `--cols N` - 覆盖列数\n- `--rows N` - 覆盖行数\n\n**输出**：\n- 网格图像：`<output>.png`\n- 元数据 JSON：`<output>_metadata.json`\n\n### 使用网格坐标\n\n在指定坐标时：\n\n**有效格式**：\n- 单个点：`A1`\n- 序列：`A1、E1、E3、A3`（用于 ROI）\n- 线：`A2 → G2`（用于绊线，显示方向）\n\n**网格参考格式**：\n- 列：A-Z，然后是 AA-AZ 等\n- 行：0-9，然后是 10-99 等\n\n## 可视化\n\n### 查看网格图像\n\n生成网格后，系统应该显示网格图像以便你可以直观地识别坐标。\n\n### 调用前验证\n\n在用坐标调用技能之前：\n\n```bash\n# 在原始图像上可视化选定的 ROI/绊线\nnode scripts/visualize.mjs office.jpg '<roi-or-tripwire-json>' preview.jpg\n```\n\n这可帮助你在处理前验证坐标是否正确。\n\n## 提示和技巧\n\n1. **从简单开始**：在使用复杂多边形前先从简单的矩形 ROI 开始\n2. **使用均匀网格**：5×5 或 6×6 网格最容易参考\n3. **记录你的区域**：为每个 ROI 指定有意义的名称（例如\"入口\"、\"收银台\"）\n4. **重用坐标**：保存类似摄像机角度的坐标集\n5. **先测试**：在处理前始终用 `visualize.mjs` 预览\n\n## 故障排除\n\n**\"网格图像过于拥挤\"**\n- 降低网格密度：`--cols 4 --rows 4`\n- 如果可能，增大图像大小\n\n**\"看不清网格线\"**\n- 网格使用半透明白色线条（50% 不透明度）\n- 放大网格图像以获得更好的可见性\n\n**\"坐标似乎不对\"**\n- 验证列/行顺序（列 A-Z 从左到右，行 0-N 从上到下）\n- 检查第一个点和最后一个点是否不同（多边形必须闭合）\n- 确保点的顺序一致（全部顺时针或全部逆时针）\n\n**\"网格不适合图像\"**\n- 非常宽或非常高的图像可能有不均匀的单元格\n- 使用 `--cols` 和 `--rows` 强制指定特定的网格尺寸\n\n## 参考\n\n- [类型定义](./types-guide.md) - ROI 和绊线类型规范\n- [SKILL.md](./SKILL.md) - 主技能指南\n\nFile v0.9.42:roi-workflow.md\n\n# ROI（关注区域）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为对象检测定义 ROI（关注区域）时，遵循此交互工作流。\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n向用户显示网格图像并解释行和列标签。\n\n### 第 2 步：询问 ROI 目的\n\n\"你想在这个区域检测什么？例如：\n- 进入收银区域的人员\n- 停车场中的车辆\n- 货架上的产品\"\n\n### 第 3 步：用户指定顶点\n\n用户根据网格标签指定角。\n\n**矩形 ROI 示例：**\n- 用户：\"从 B2 到 G5\"\n- 转换为 4 个顶点：[B2、G2、G5、B5]\n\n### 第 4 步：验证顶点顺序\n\n\"这些点是否围绕周边形成闭合多边形？（顺时针或逆时针）\"\n\n### 第 5 步：预览 ROI\n\n```bash\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"test\",\"points\":[x1,y1,x2,y2,x3,y3,x4,y4]}]'\n```\n\n### 第 6 步：用户确认\n\n\"ROI 位置是否正确？\"\n\n### 第 7 步：调用技能\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[...]}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n> **重要：** 自定义 ROI 必须通过 `invoke.mjs` 传入。不要使用 `intent-invoke.mjs`，因为它会自动添加全图 ROI 覆盖掉你的自定义区域。\n\n---\n\n## 常见错误\n\n❌ 不要假设矩形 ROI\n✅ 支持任意多边形\n\n❌ 不要允许无序的顶点\n✅ 顶点必须按顺序排列\n\n❌ 不要跳过预览验证\n✅ 始终显示预览图像以确认\n\n---\n\n## 完整对话示例\n\n### 示例 1：矩形入口区域\n\n**用户**：\"我想检测进入办公室的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs office.jpg office-grid.png\n```\n2. 问：\"查看网格，入口大概在哪里？\"\n3. 用户：\"大约从 B1 到 G3\"\n4. 确认：\"所以顶点是 B1、G1、G3、B3，对吧？\"\n5. 用户：\"是的\"\n6. 预览 ROI\n7. 问：\"这个矩形是否覆盖了入口？\"\n8. 用户：\"完美！\"\n9. 调用技能进行检测\n\n### 示例 2：复杂多边形（L 形区域）\n\n**用户**：\"我需要监视 L 形存储区域\"\n\n**你**：\n1. 生成网格\n2. 问：\"使用网格坐标标记 L 形的所有角，从一个角开始\"\n3. 用户：\"从左上角开始：A2、E2、E4、D4、D6、A6\"\n4. 确认：\"这些点是否按顺序形成 L 形的边界？确认它关闭回 A2\"\n5. 用户：\"是的\"\n6. 预览 L 形多边形\n7. 验证没有自交\n8. 调用技能\n\n---\n\n## 数据结构\n\n详见 [types-guide.md](./types-guide.md) 了解完整的定义、子对象和示例。\n\nFile v0.9.42:skill-card.md\n\n## Description:\n\nBaidu Yijian Vision helps agents route image and video analysis tasks to Baidu Yijian skills for object detection, safety monitoring, industrial inspection, SOP compliance, and operational analytics.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[yijian-baidu](https://clawhub.ai/user/yijian-baidu)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and external operators use this skill to select or invoke Baidu Yijian vision capabilities against images or video frames, including object detection, ROI and tripwire monitoring, industrial quality inspection, safety monitoring, OCR, pose estimation, and tracking.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can send selected local images, video frames, prompts, and workspace skill metadata to Baidu Yijian using the configured API key.\n\nMitigation: Use only approved inputs, avoid sensitive media unless policy permits sharing it with Baidu Yijian, and keep API keys scoped and rotated according to local credential policy.\n\nRisk: The security summary notes that the client can upload any local file path it is given and lacks clear file-scope safeguards.\n\nMitigation: Run the skill in a constrained workspace, avoid letting untrusted prompts choose file paths, and review planned file paths before execution.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/yijian-baidu/skills/baidu-yijian-vision)\n- [Baidu Yijian platform](https://yijian-next.cloud.baidu.com)\n- [Baidu Yijian API key setup](https://yijian-next.cloud.baidu.com/apaas/)\n- [ROI workflow](roi-workflow.md)\n- [Tripwire workflow](tripwire-workflow.md)\n- [Grid guide](grid-guide.md)\n- [Types guide](types-guide.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Shell commands, Configuration, Files, Guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON responses; generated PNG and JSON files for grids, ROI previews, tripwire previews, and visualized detections.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires Node.js and YIJIAN_API_KEY; uses Baidu Yijian APIs and may create local preview or grid artifacts.]\n\n## Skill Version(s):\n\n0.9.42 (source: package.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 v0.9.42:tripwire-workflow.md\n\n# 绊线（检测线）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为穿越检测定义绊线时，遵循此交互工作流。\n\n## 核心概念\n\n- **p1→p2** 主检测线（用户定义，2 个点）\n- **p3→p4** A-B 区域标记（系统自动生成或用户定义）\n- **方向** Forward/Backward/TwoWay（要检测的方向）\n\n**自动生成过程**：用户只需指定 p1 和 p2 点。系统会自动生成垂直于主线的 p3 和 p4 点用于预览和确认。\n\n矢量穿越检测算法详情，见 [types-guide.md#tripwire](./types-guide.md#tripwire)\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n### 第 2 步：用户指定绊线\n\n\"查看网格，检测线应该在哪里？例如，从 B2 到 G2？\"\n\n### 第 3 步：预览绊线位置\n\n系统基于用户的 2 个点（p1、p2）生成完整的 4 点结构，然后调用 `visualize.mjs` 生成预览：\n\n```bash\n# 自动计算 4 个点后\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\n    \"kind\":\"TripWire\",\n    \"name\":\"tripwire preview\",\n    \"direction\":\"Forward\",\n    \"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y]\n  }]'\n```\n\n预览显示：\n- 主线（p1→p2）虚线 - 橙色\n- A/B 标记（p3→p4）虚线 - 橙色，带标签\n- 方向箭头 - Forward=绿色在 p4，Backward=红色在 p3\n\n### 第 4 步：确认 A/B 区域\n\n\"查看预览图像：\n- A 区在这一侧（例如线的上方）\n- B 区在那一侧（例如线的下方）\n- 绿色箭头显示 Forward 是 A→B\n\n这是否正确？\"\n\n### 第 5 步：选择方向模式\n\n用户看到预览后，提问：\n- Forward（相同方向）\n- Backward（相反方向）\n- TwoWay（检测两个方向）\n\n### 第 6 步：最终确认\n\n生成最终预览，用户确认，然后调用技能：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y],\"direction\":\"Forward\"}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n---\n\n## 常见错误\n\n❌ 不要在显示预览前解释 A/B\n✅ 用户必须看到带 A/B 标记标签的预览\n\n❌ 不要仅使用 2 个点\n✅ 始终提供 4 个点（主线 + A/B 标记）\n\n❌ 不要跳过预览验证\n✅ 始终显示预览以确认\n\n---\n\n## 完整对话示例\n\n**用户**：\"我需要检测进入门的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs door-camera.jpg door-grid.png\n```\n\n2. 问：\"查看网格，检测线应该在哪里？例如 B2 到 G2？\"\n\n3. 用户：\"是的，从 B2 到 G2 的线\"\n\n4. 生成显示绊线位置和 A/B 标记的预览：\n```bash\nnode scripts/visualize.mjs door-camera.jpg '[]' preview1.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"door\",\"direction\":\"Forward\",\"points\":[B2_x,B2_y,G2_x,G2_y,B1_x,B1_y,G3_x,G3_y]}]'\n```\n\n5. 解释：\"这是绊线预览：\n   - 区域 'A' 在线上方（外侧）\n   - 区域 'B' 在线下方（内侧）\n   - 绿色箭头显示 Forward 检测 A→B（从外侧进入）\n\n   你对这个设置满意吗？\"\n\n6. 用户：\"是的，我想检测进入（Forward）\"\n\n7. 生成最终预览以确认\n\n8. 调用技能进行检测\n\n---\n\n## 数据结构\n\n详见 [types-guide.md#tripwire](./types-guide.md#tripwire) 了解完整的定义、矢量算法和示例。\n\nFile v0.9.42:types-guide.md\n\n# 易见类型定义指南\n\n## 概述\n\n易见平台处理视觉信息并返回结构化数据。理解这些类型可帮助你有效地使用技能输入和输出。\n\n## 核心类型\n\n### 基本类型\n\n这些是在整个平台中使用的标量值。\n\n| 类型 | 描述 | 示例 |\n|------|------|------|\n| `String` | 文本数据 | `\"hello\"` |\n| `TemplateString` | 格式化文本 | `\"Result: {value}\"` |\n| `Integer` | 整数 | `42` |\n| `Double` | 浮点数 | `3.14` |\n| `Boolean` | 真/假 | `true` |\n| `Time` | 时间戳 | `\"2026-03-12T10:00:00Z\"` |\n\n### 复杂类型\n\n这些是包含视觉或检测信息的结构化对象。\n\n#### Detection（检测）\n\n表示图像中的检测对象。\n\n```json\n{\n  \"bbox\": [x, y, width, height],\n  \"confidence\": 0.94,\n  \"category\": {\n    \"id\": \"person\",\n    \"name\": \"人体\",\n    \"confidence\": 0.98\n  },\n  \"track_id\": 1,\n  \"ocr\": null,\n  \"keypoints\": null\n}\n```\n\n**字段**：\n- `bbox` - 边框 [x, y, width, height]（像素坐标）\n- `confidence` - 检测置信度（0-1）\n- `category` - 对象分类，包含 id、name、confidence\n- `track_id` - 跟踪 ID（用于帧间跟踪，可选）\n- `ocr` - 文本识别结果（可选）\n- `keypoints` - 姿态/骨骼关键点（可选）\n\n#### TrackDetection（跟踪检测）\n\n与 `Detection` 相同，但用于视频帧间的时间跟踪。\n\n#### Attribute（属性）\n\n表示图像中检测到的属性或属性。\n\n```json\n{\n  \"attribute\": \"age\",\n  \"answer\": \"adult\",\n  \"confidence\": 0.87\n}\n```\n\n**字段**：\n- `attribute` - 属性名称（例如\"age\"、\"gender\"、\"expression\"）\n- `answer` - 属性值\n- `confidence` - 置信度分数\n\n#### Image（图像）\n\n表示技能的视觉输入。\n\n```json\n{\n  \"imageData\": \"base64-encoded-image-data\",\n  \"imageWidth\": 1920,\n  \"imageHeight\": 1080,\n  \"sourceId\": \"abc123def456\",\n  \"imageId\": \"img001\",\n  \"timestamp\": 1705056000000\n}\n```\n\n**字段**：\n- `imageData` - Base64 编码的图像字节（从文件路径自动编码）\n- `imageWidth` - 图像宽度（像素）\n- `imageHeight` - 图像高度（像素）\n- `sourceId` - 源标识符，用于视频流（文件 MD5 哈希）\n- `imageId` - 唯一的图像标识符\n- `timestamp` - 帧时间戳（毫秒）\n\n#### ROI（关注区域 / 电子围栏）\n\n定义用于分析的多边形区域。\n\n**完整工作流：** 见 [roi-workflow.md](./roi-workflow.md)\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"entrance\",\n  \"points\": [x1, y1, x2, y2, x3, y3, x4, y4]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"ROI\"\n- `name` - 区域描述名称（可选）\n- `points` - 多边形顶点坐标数组，按顺序排列：`[x1,y1, x2,y2, x3,y3, ...]`\n\n**示例**:\n\n**矩形ROI - 收银区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"checkout-zone\",\n  \"points\": [100, 100, 300, 100, 300, 250, 100, 250]\n}\n```\n\n**多边形ROI - L形仓库区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"warehouse-l-zone\",\n  \"points\": [100, 100, 400, 100, 400, 200, 300, 200, 300, 350, 100, 350]\n}\n```\n\n**网格坐标输入**:\n使用 `show-grid.mjs` 生成的网格坐标：\n```\nB1, E1, E3, B3  →  自动转换为像素坐标\n```\n\n#### Tripwire（绊线 / 穿越检测线）\n\n定义用于穿越事件的检测线。\n\n**完整工作流：** 见 [tripwire-workflow.md](./tripwire-workflow.md)\n\n**核心概念 - 向量点乘法则**:\n\n绊线穿越检测使用向量点乘：\n\n1. **绊线向量** = p1 → p2 方向\n2. **运动向量** = 前一帧到当前帧的对象移动\n3. **点乘计算**：`dot = V_line.x * V_motion.x + V_line.y * V_motion.y`\n4. **穿越判定**：\n   - `dot > 0` → 正向穿越（Forward，A→B）\n   - `dot < 0` → 反向穿越（Backward，B→A）\n   - TwoWay: 两个方向都检测\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"TripWire\"\n- `name` - 检测线描述名称（可选）\n- `direction` - \"Forward\" | \"Backward\" | \"TwoWay\"\n- `points` - 8元素数组：\n  - p1, p2: 主检测线（用户指定）\n  - p3, p4: A-B区域标记（标识穿越方向）\n\n**自动生成A-B点**:\n\n用户可以只提供 **2个点**（p1, p2 主检测线），系统会自动生成 **p3, p4**（A-B区域标记）：\n\n1. **输入**: 用户给出2个点 `[p1_x, p1_y, p2_x, p2_y]`\n2. **自动计算**:\n   ```\n   dx, dy = 主线方向向量 (p2 - p1)\n   perpX, perpY = 旋转90度得到垂直向量\n   distance = 30px (默认)\n   p3 = p1 + perp * distance  (A区域标记)\n   p4 = p2 + perp * distance  (B区域标记)\n   ```\n3. **结果**: 自动补全为完整的4点结构 `[p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]`\n4. **生成预览图**: 使用 `visualize.mjs` 将Tripwire可视化\n   ```bash\n   node scripts/visualize.mjs <image> '[]' preview.png \\\n     --overlays '[{\n       \"kind\": \"TripWire\",\n       \"name\": \"绊线预览\",\n       \"direction\": \"Forward\",\n       \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n     }]'\n   ```\n   输出：`preview.png` 显示绊线虚线、A/B标记、方向箭头\n5. **用户确认**: 显示预览图让用户确认：\n   - A/B区域位置是否正确\n   - 方向箭头是否指向期望方向\n   - 绊线是否跨越检测区域\n\n**示例**:\n\n用户输入：`[150, 100, 150, 300]` (竖直线)\n系统自动生成：`[150, 100, 150, 300, 120, 100, 120, 300]` (左偏30px)\n生成预览：\n```bash\nnode scripts/visualize.mjs door.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"门\",\"direction\":\"Forward\",\"points\":[150,100,150,300,120,100,120,300]}]'\n```\n用户看预览图确认A(左)→B(右)方向是否符合预期\n\n**结构可视化**:\n```\np1 --------> p2  (主检测线，p1→p2)\n ^            ^\n |            |\np3           p4  (A-B区域标记)\n\n• Forward: 检测p3→p4方向的穿越（A→B）\n• Backward: 检测p4→p3方向的穿越（B→A）\n• TwoWay: 双向都检测\n```\n\n**方向可视化**:\n- **Forward** - 绿色箭头在p4，表示A→B方向\n- **Backward** - 红色箭头在p3，表示B→A方向\n- **TwoWay** - 蓝色箭头在p3和p4，表示双向\n\n**示例**:\n\n**垂直检测线 - 人员进出统计**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [150, 100, 150, 300, 130, 100, 170, 300]\n}\n```\n\n说明：\n- p1(150,100) → p2(150,300): 竖直线\n- p3(130,100) → p4(170,300): A-B标记（左右偏移30px）\n- Forward: 只检测从左→右的穿越\n\n**水平检测线 - 考勤打卡**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"checkin-line\",\n  \"direction\": \"TwoWay\",\n  \"points\": [100, 200, 400, 200, 100, 180, 400, 220]\n}\n```\n\n说明：\n- p1(100,200) → p2(400,200): 水平线\n- p3(100,180) → p4(400,220): A-B标记（上下偏移20px）\n- TwoWay: 双向都统计\n\n### 数组类型\n\n任何类型都可以包装在数组中：\n\n```json\n{\n  \"type\": \"Array<Detection>\",\n  \"example\": [\n    { \"bbox\": [...], \"confidence\": 0.9, ... },\n    { \"bbox\": [...], \"confidence\": 0.85, ... }\n  ]\n}\n```\n\n常见数组：\n- `Array<Detection>` - 多个检测对象\n- `Array<TrackDetection>` - 帧间跟踪的对象\n- `Array<Attribute>` - 多个属性结果\n- `Array<ROI>` - 多个区域\n- `Array<Tripwire>` - 多条检测线\n\n## 可视化和交互\n\n### 检测可视化\n\n使用 `visualize.mjs` 在图像上可视化检测结果：\n\n```bash\nnode scripts/visualize.mjs photo.jpg '<detection-json>' output.jpg\n```\n\n**支持**：\n- 带置信度分数的边框\n- 类别标签\n- 用于跟踪可视化的跟踪 ID\n- 叠加层（ROI 区域、绊线线条）\n- 文本注释\n\n### ROI/绊线输入\n\n用于区域和障碍的交互式输入：\n\n1. 生成网格参考图像：\n   ```bash\n   node scripts/show-grid.mjs photo.jpg\n   ```\n\n2. 使用网格参考指定坐标：\n   ```\n   ROI: B1, E1, E3, B3\n   Tripwire: A2 → G2 (direction: Forward)\n   ```\n\n3. 网格坐标自动转换为像素坐标\n\n详见 [grid-guide.md](./grid-guide.md)。\n\n## 视频帧提取\n\n用于视频帧提取和多帧分析：\n\n```json\n{\n  \"imageData\": \"base64-frame-data\",\n  \"sourceId\": \"video_abc123\",        // 每个视频源唯一\n  \"imageId\": \"frame_001\",             // 每帧唯一\n  \"timestamp\": 1705056000000          // 帧时间戳，单位毫秒\n}\n```\n\n**sourceId 计算**:\n```\nsourceId = MD5(视频文件的前 64KB) → 16 字符十六进制字符串\n```\n\n**timestamp 计算**:\n```\ntimestamp = 帧索引 * 1000 / 帧率\n```\n\n详见 [video-guide.md](./video-guide.md)。\n\n## 类型转换\n\n### 输入转换\n\n当将文件作为 `Image` 类型传递时：\n\n```bash\n# 文件路径自动转换为 base64\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node invoke.mjs ep-detect\n```\n\n### 输出解析\n\n检测结果会自动解析：\n\n```javascript\n// 原始输出\n{ \"detections\": \"[{\\\"bbox\\\": [...]}]\" }\n\n// 解析后的输出\n{ \"detections\": [{ \"bbox\": [...] }] }  // JSON 数组，可以直接使用\n```\n\n## 最佳实践\n\n1. **始终验证边框** - 确保坐标在图像边界内\n2. **使用 track_id 以保持连续性** - 跟踪帧间的对象以获得更好的结果\n3. **有效组合类型** - 使用 ROI 限制检测区域\n4. **时间戳精度** - 为视频分析维持一致的时间戳计算\n5. **sourceId 一致性** - 为来自同一源的所有帧保持 sourceId 常数\n\n## 故障排除\n\n**\"无效的检测\"**\n- 检查边框格式：[x, y, width, height]\n- 验证坐标为非负数\n- 确保框在图像边界内\n\n**\"缺少关键点\"**\n- 并非所有技能都支持关键点\n- 检查技能文档以了解支持的输出\n\n**\"ROI 未被识别\"**\n- 验证多边形是否闭合（第一个点 ≠ 最后一个点）\n- 确保至少有 3 个点\n- 检查点的顺序是否正确（顺时针或逆时针）\n\n**\"sourceId 不匹配\"**\n- 如果视频文件改变，重新计算 sourceId\n- 对来自同一源的所有帧使用相同的 sourceId\n\nFile v0.9.42:package.json\n\n{\n  \"name\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.42\",\n  \"description\": \"Baidu Yijian Vision Skill - Intent-driven visual analysis with automatic skill routing\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"engines\": {\n    \"node\": \">=16.0.0\",\n    \"npm\": \">=8.0.0\"\n  },\n  \"scripts\": {\n    \"pack\": \"node scripts/pack.mjs\",\n    \"publish:clawhub\": \"node scripts/publish.mjs\",\n    \"publish:dry-run\": \"node scripts/publish.mjs --dry-run\",\n    \"test\": \"node --test 'tests/*.test.mjs'\",\n    \"test:integration\": \"node tests/run-integration.mjs --skip-e2e\",\n    \"test:integration:all\": \"node tests/run-integration.mjs\",\n    \"test:integration:e2e\": \"node tests/run-integration.mjs --e2e\",\n    \"test:integration:agent\": \"node tests/run-integration.mjs --agent\",\n    \"test:integration:docker\": \"node tests/run-docker.mjs\",\n    \"test:all\": \"npm test && npm run test:integration\"\n  },\n  \"devDependencies\": {\n    \"archiver\": \"^7.0.1\",\n    \"openclaw\": \"github:openclaw/openclaw#main\"\n  },\n  \"optionalDependencies\": {\n    \"sharp\": \"^0.33.0\"\n  }\n}\n\nArchive v0.9.41: 18 files, 42099 bytes\n\nFiles: grid-guide.md (6164b), package.json (1029b), roi-workflow.md (2693b), scripts/cache.mjs (1693b), scripts/intent-invoke.mjs (5607b), scripts/invoke.mjs (5886b), scripts/list.mjs (1229b), scripts/multimodal.mjs (2608b), scripts/query.mjs (2604b), scripts/show-grid.mjs (7969b), scripts/types.mjs (20158b), scripts/utils.mjs (4553b), scripts/visualize.mjs (19622b), scripts/workspace.mjs (5281b), SKILL.md (9482b), tripwire-workflow.md (3411b), types-guide.md (9811b), _meta.json (139b)\n\nFile v0.9.41:SKILL.md\n\n---\nname: baidu-yijian-vision\ndescription: \"Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision. 百度一见视觉技能（Baidu Yijian Vision Skill）- 可用于分析图片和视频。相比通用基模，在维持 95%+ 专业精度的同时，推理成本降低 50% 以上，是处理视觉巡检与监控分析任务的首选工具。主打 安全管理、SOP合规、工业质检、商业运营与物料盘点。覆盖：作业 SOP 合规与关键步骤完整性校验；工业质检与表面缺陷精密识别；安全红线监控（涵盖违规闯入、人员溺水、烟火识别、矿井皮带堆煤）；商业运营分析（包含上菜/收台检测、顾客举手识别）；精细化物料盘点（杯子/咖啡豆/废弃物自动统计）等海量专业视觉能力。\"\nallowed-tools: Bash, Read, Write, Edit\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\"],\"env\":[\"YIJIAN_API_KEY\"]},\"primaryEnv\":\"YIJIAN_API_KEY\"}}\n---\n\n# 百度一见视觉技能（Baidu Yijian Vision Skill）\n\n> **Baidu Yijian Vision Skill** - baidu yijian vision skill for image/video analysis, object detection, safety monitoring, and industrial inspection.\n\n## ⚠️ 必需条件\n\n1. **YIJIAN_API_KEY 环境变量**（必需）— 从[百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)获取：\n   1. 登录百度一见平台\n   2. 激活试用包\n   3. 生成 API Key（系统管理 → 安全认证 → API Key）\n2. **Node.js >= 16.0.0** — 运行时依赖\n\n配置环境变量：`YIJIAN_API_KEY=your-api-key`\n\n---\n\n> **🔒 客户端工具 - 这是一个本地工具，用于与百度一见（Baidu Yijian）平台交互。所有数据处理遵循安全协议。**\n\n## 🎯 此工具的功能\n\n百度一见（[yijian-next.cloud.baidu.com](https://yijian-next.cloud.baidu.com)）是百度（Baidu）的视觉（vision）理解平台。此工具使你能够：\n\n- **意图自动匹配** - 通过自然语言描述自动匹配最佳技能\n- **智能路由** - 高置信度匹配时调用专业视觉技能，低置信度时自动回退到多模态推理\n- **直接技能调用** - 已知技能ID时可直接调用\n- **可视化结果** - 绘制边框、生成网格参考、预览 ROI/绊线\n- **定义检测区域** - 使用交互式工作流定义 ROI（电子围栏）或绊线（检测线）\n\n**支持的检测类型：** 人员检测、行人计数、车辆识别、OCR、姿态估计、目标跟踪等。\n\n## 📚 使用指南\n\n### 意图驱动工作流（推荐）\n\n**当你描述需求但不确定用哪个技能时**，系统会自动匹配最佳技能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg\n```\n\n系统会自动：\n1. 查询一见平台，根据意图匹配公共技能列表\n2. 如果匹配置信度 ≥ 0.7，调用对应的专业技能（自动添加全图 ROI）\n3. 如果公共技能无匹配或调用失败，搜索私有工作空间技能（由你从列表中选择最匹配的技能，再用 invoke 调用）\n4. 如果私有空间也无合适技能，自动回退到多模态直接推理\n\n> **自动 ROI：** 当用户未提供 ROI 时，系统会自动生成覆盖整张图片的 ROI。如需指定检测区域，请使用 `invoke.mjs` 传入自定义 ROI。\n\n#### 自定义置信度阈值\n\n```bash\n# 仅当匹配度≥0.8时才使用技能，否则回退到多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg 0.8\n```\n\n#### 不使用图片（纯文本意图查询）\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\"\n```\n\n#### 返回格式\n\n```json\n{\n  \"success\": true,\n  \"mode\": \"skill\",\n  \"epId\": \"ep-public-xxxxx\",\n  \"skillName\": \"人员摔倒检测\",\n  \"confidence\": 0.92,\n  \"count\": 1,\n  \"detections\": [\n    {\n      \"bbox\": [100, 200, 50, 80],\n      \"category\": \"falling_person\",\n      \"confidence\": 0.94\n    }\n  ]\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `success` | boolean | 调用是否成功 |\n| `mode` | string | `\"skill\"` / `\"workspace-search\"` / `\"multimodal\"`，表示使用的推理模式 |\n| `epId` | string \\| null | 技能ID（技能模式时有值） |\n| `skillName` | string \\| null | 技能名称（技能模式时有值） |\n| `confidence` | number \\| null | 技能匹配置信度（0-1） |\n| `count` | number | 检测到的目标数量 |\n| `detections` | array | 检测结果数组 |\n\n**模式说明：**\n- `\"mode\": \"skill\"` - 使用了百度一见平台的专业技能，精度高、成本低\n- `\"mode\": \"workspace-search\"` - 公共技能无匹配，返回私有工作空间技能列表供选择\n- `\"mode\": \"multimodal\"` - 使用了多模态大模型直接推理，通用性强、无需预设技能\n\n### 查询技能\n\n**查询公共技能**（按意图匹配）：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/list.mjs \"人员检测\"\n```\n\n**查询私有工作空间技能**（按 API Key 关联，缓存1小时）：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/workspace.mjs list-skills\n```\n\n返回技能列表（含 epId、名称和描述）。当公共技能匹配不到时，从私有列表中选择最匹配的技能，用 `invoke.mjs` 调用：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-wsnyqcdj-0xdpgbt4\n```\n\n### 直接调用技能（已知技能ID）\n\n**当你已经知道具体的技能 ID 时**，可以直接调用：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n#### ROI（电子围栏）参数格式\n\nROI 用于限定检测区域。**必须包含 `id`、`name`、`kind`、`points` 四个字段，缺一不可**，否则 API 返回 500 错误。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"zone\",\n  \"kind\": \"ROI\",\n  \"points\": [x1,y1, x2,y2, x3,y3, x4,y4]\n}\n```\n\n- `id` — 任意字符串标识（如 `\"1\"`）\n- `name` — 区域名称（如 `\"zone\"`、`\"doorway\"`）\n- `kind` — 固定值 `\"ROI\"`\n- `points` — 顶点坐标数组，按顺时针/逆时针顺序排列，每对 `[x,y]` 为一个顶点\n\n#### 绊线（Tripwire）参数格式\n\n绊线用于检测穿越事件。**必须包含 `id`、`name`、`kind`、`points`、`direction` 五个字段**。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"line\",\n  \"kind\": \"TripWire\",\n  \"points\": [p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p4_x,p4_y],\n  \"direction\": \"Forward\"\n}\n```\n\n- `id` — 任意字符串标识\n- `name` — 绊线名称\n- `kind` — 固定值 `\"TripWire\"`\n- `points` — 4 个点（8 个数值）：p1→p2 为主线，p3→p4 为 A/B 区域标记\n- `direction` — 检测方向：`\"Forward\"` | `\"Backward\"` | `\"TwoWay\"`\n\n> **绊线不会自动生成**，必须由用户指定。详见 [绊线工作流](./tripwire-workflow.md)。\n\n**调用带 ROI 的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[100,100,500,100,500,400,100,400]}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n**调用带绊线的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[0,540,1920,540,0,500,1920,500],\"direction\":\"Forward\"}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n### 定义检测区域\n\n**需要定义电子围栏（ROI，又叫感兴趣区域）或绊线（Tripwire，又叫检测线）？**\n\n- **[ROI 工作流](./roi-workflow.md)** — 创建电子围栏，仅在指定区域检测\n- **[绊线工作流](./tripwire-workflow.md)** — 绘制检测线，统计穿越事件\n\n两个工作流都包含完整的交互步骤和示例对话。\n\n**预览 ROI/绊线** — 在调用前在图像上预览：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs photo.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"zone\",\"points\":[...]}]'\n```\n\n**生成网格** — 帮助用户使用网格坐标指定点位置：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/show-grid.mjs photo.jpg grid.png\n```\n\n### 查看完整文档\n\n- **[类型定义](./types-guide.md)** — 检测（Detection），图像（Image）、电子围栏（ROI）、绊线（Tripwire）等数据结构\n- **[网格输入系统](./grid-guide.md)** — 使用网格坐标指定点\n\n### 高级：视频帧处理和跟踪\n\n**场景：** 处理 30 秒监控视频，逐帧检测和跟踪人员。\n\n```bash\n# 第 1 步：提取帧\nffmpeg -i surveillance_30sec.mp4 -vf fps=1 frames/frame_%04d.jpg\n\n# 第 2 步：计算 sourceId（视频标识符）\nsourceId=$(head -c 65536 surveillance_30sec.mp4 | md5sum | awk '{print substr($1, 1, 16)}')\n\n# 第 3 步：处理每个帧并跟踪\nfor frame_file in frames/frame_*.jpg; do\n  frame_num=$(basename \"$frame_file\" | grep -oE '[0-9]+' | head -1)\n  frame_index=$((10#$frame_num - 1))\n  timestamp=$((frame_index * 1000))\n  imageId=\"frame_$(printf '%04d' \"$frame_num\")\"\n\n  # 使用意图驱动调用\n  result=$(node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员\" \"$frame_file\")\n\n  detections=$(echo \"$result\" | jq '.detections')\n  echo \"$detections\" > \"results/${imageId}_detections.json\"\ndone\n```\n\nFile v0.9.41:_meta.json\n\n{\n  \"ownerId\": \"kn7aw0s517ypj0hstj91qr6nxs82r2xy\",\n  \"slug\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.41\",\n  \"publishedAt\": 1777528375419\n}\n\nFile v0.9.41:grid-guide.md\n\n# 基于网格的 ROI / 绊线输入指南\n\n## 概述\n\n在命令行环境中手动指定 ROI 区域或绊线的确切像素坐标既繁琐又容易出错。基于网格的输入系统让你可以使用易于理解的网格坐标来代替。\n\n## 工作原理\n\n### 1. 生成网格参考图像\n\n```bash\nnode scripts/show-grid.mjs photo.jpg [output-path] [--cols N] [--rows N]\n```\n\n这会在你的图像上创建带标签的网格叠加层：\n\n```\n       A     B     C     D     E     F     G\n   0   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   1   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   2   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   3   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   4   ·─────·─────·─────·─────·─────·─────·\n```\n\n**输出**：\n- `photo_grid.png` - 网格参考图像\n- `photo_grid_metadata.json` - 坐标映射数据\n\n### 2. 查看并识别坐标\n\n查看网格图像并识别 ROI 或绊线的坐标：\n\n- **列**：A、B、C、D、...（从左到右）\n- **行**：0、1、2、3、...（从上到下）\n- **交点**：网格线交叉的位置（用点标记）\n\n### 3. 使用网格坐标指定\n\n告诉系统网格坐标：\n\n```\n用户：\"在 B1、E1、E3、B3 创建检测区域\"\n```\n\n系统自动转换为像素坐标：\n\n```\nB1 = (列B索引 × 网格宽度, 行1索引 × 网格高度)\nE1 = (列E索引 × 网格宽度, 行1索引 × 网格高度)\nE3 = (列E索引 × 网格宽度, 行3索引 × 网格高度)\nB3 = (列B索引 × 网格宽度, 行3索引 × 网格高度)\n```\n\n## 使用示例\n\n### 示例 1：定义检测区域（ROI）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs office.jpg\n\n# 查看网格图像以识别坐标，然后：\n用户：\"我想要一个办公桌区域的检测区域：B2、G2、G5、B5\"\n\n转换为 ROI：\n{\n  \"kind\": \"ROI\",\n  \"points\": [col_B, row_2, col_G, row_2, col_G, row_5, col_B, row_5]\n}\n\n# 使用 ROI 调用技能\n$ echo '{\"input0\":{\"image\":\"office.jpg\",\"roi\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-2403um2p\n```\n\n### 示例 2：定义穿越线（绊线）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs hallway.jpg\n\n# 查看网格图像，然后：\n用户：\"在走廊中创建一条从 A3 到 H3 的绊线，检测从左到右的穿越\"\n\n转换为绊线：\n{\n  \"kind\": \"TripWire\",\n  \"points\": [col_A, row_3, col_H, row_3],\n  \"direction\": \"Forward\"\n}\n\n# 使用绊线调用技能\n$ echo '{\"input0\":{\"image\":\"hallway.jpg\",\"tripwire\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-ywbjb7tm\n```\n\n### 示例 3：多个 ROI\n\n```bash\n用户：\"我想要 3 个检测区域：入口（A1-C3）、中心（D1-F3）、出口（G1-H3）\"\n\n转换为三个 ROI 对象并作为 Array<ROI> 传递：\n[\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_A, row_1, col_C, row_1, col_C, row_3, col_A, row_3],\n    \"order\": 0\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_D, row_1, col_F, row_1, col_F, row_3, col_D, row_3],\n    \"order\": 1\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_G, row_1, col_H, row_1, col_H, row_3, col_G, row_3],\n    \"order\": 2\n  }\n]\n```\n\n## 网格算法\n\n网格大小会自动计算：\n\n- **目标**：约 30-42 个交点，大致为方形单元\n- **横向图像**（1920×1080）：7 列 × 4 行\n- **纵向图像**（1080×1920）：4 列 × 7 行\n- **方形图像**（800×800）：5 列 × 5 行\n\n**手动覆盖**：\n```bash\nnode scripts/show-grid.mjs photo.jpg --cols 10 --rows 6\n```\n\n## 命令参考\n\n### 生成网格\n\n```bash\nnode scripts/show-grid.mjs <input-image> [output-path] [--cols N] [--rows N]\n```\n\n**参数**：\n- `<input-image>` - 输入图像文件路径\n- `[output-path]` - 可选输出图像路径（默认：`<input>_grid.png`）\n- `--cols N` - 覆盖列数\n- `--rows N` - 覆盖行数\n\n**输出**：\n- 网格图像：`<output>.png`\n- 元数据 JSON：`<output>_metadata.json`\n\n### 使用网格坐标\n\n在指定坐标时：\n\n**有效格式**：\n- 单个点：`A1`\n- 序列：`A1、E1、E3、A3`（用于 ROI）\n- 线：`A2 → G2`（用于绊线，显示方向）\n\n**网格参考格式**：\n- 列：A-Z，然后是 AA-AZ 等\n- 行：0-9，然后是 10-99 等\n\n## 可视化\n\n### 查看网格图像\n\n生成网格后，系统应该显示网格图像以便你可以直观地识别坐标。\n\n### 调用前验证\n\n在用坐标调用技能之前：\n\n```bash\n# 在原始图像上可视化选定的 ROI/绊线\nnode scripts/visualize.mjs office.jpg '<roi-or-tripwire-json>' preview.jpg\n```\n\n这可帮助你在处理前验证坐标是否正确。\n\n## 提示和技巧\n\n1. **从简单开始**：在使用复杂多边形前先从简单的矩形 ROI 开始\n2. **使用均匀网格**：5×5 或 6×6 网格最容易参考\n3. **记录你的区域**：为每个 ROI 指定有意义的名称（例如\"入口\"、\"收银台\"）\n4. **重用坐标**：保存类似摄像机角度的坐标集\n5. **先测试**：在处理前始终用 `visualize.mjs` 预览\n\n## 故障排除\n\n**\"网格图像过于拥挤\"**\n- 降低网格密度：`--cols 4 --rows 4`\n- 如果可能，增大图像大小\n\n**\"看不清网格线\"**\n- 网格使用半透明白色线条（50% 不透明度）\n- 放大网格图像以获得更好的可见性\n\n**\"坐标似乎不对\"**\n- 验证列/行顺序（列 A-Z 从左到右，行 0-N 从上到下）\n- 检查第一个点和最后一个点是否不同（多边形必须闭合）\n- 确保点的顺序一致（全部顺时针或全部逆时针）\n\n**\"网格不适合图像\"**\n- 非常宽或非常高的图像可能有不均匀的单元格\n- 使用 `--cols` 和 `--rows` 强制指定特定的网格尺寸\n\n## 参考\n\n- [类型定义](./types-guide.md) - ROI 和绊线类型规范\n- [SKILL.md](./SKILL.md) - 主技能指南\n\nFile v0.9.41:roi-workflow.md\n\n# ROI（关注区域）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为对象检测定义 ROI（关注区域）时，遵循此交互工作流。\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n向用户显示网格图像并解释行和列标签。\n\n### 第 2 步：询问 ROI 目的\n\n\"你想在这个区域检测什么？例如：\n- 进入收银区域的人员\n- 停车场中的车辆\n- 货架上的产品\"\n\n### 第 3 步：用户指定顶点\n\n用户根据网格标签指定角。\n\n**矩形 ROI 示例：**\n- 用户：\"从 B2 到 G5\"\n- 转换为 4 个顶点：[B2、G2、G5、B5]\n\n### 第 4 步：验证顶点顺序\n\n\"这些点是否围绕周边形成闭合多边形？（顺时针或逆时针）\"\n\n### 第 5 步：预览 ROI\n\n```bash\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"test\",\"points\":[x1,y1,x2,y2,x3,y3,x4,y4]}]'\n```\n\n### 第 6 步：用户确认\n\n\"ROI 位置是否正确？\"\n\n### 第 7 步：调用技能\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[...]}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n> **重要：** 自定义 ROI 必须通过 `invoke.mjs` 传入。不要使用 `intent-invoke.mjs`，因为它会自动添加全图 ROI 覆盖掉你的自定义区域。\n\n---\n\n## 常见错误\n\n❌ 不要假设矩形 ROI\n✅ 支持任意多边形\n\n❌ 不要允许无序的顶点\n✅ 顶点必须按顺序排列\n\n❌ 不要跳过预览验证\n✅ 始终显示预览图像以确认\n\n---\n\n## 完整对话示例\n\n### 示例 1：矩形入口区域\n\n**用户**：\"我想检测进入办公室的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs office.jpg office-grid.png\n```\n2. 问：\"查看网格，入口大概在哪里？\"\n3. 用户：\"大约从 B1 到 G3\"\n4. 确认：\"所以顶点是 B1、G1、G3、B3，对吧？\"\n5. 用户：\"是的\"\n6. 预览 ROI\n7. 问：\"这个矩形是否覆盖了入口？\"\n8. 用户：\"完美！\"\n9. 调用技能进行检测\n\n### 示例 2：复杂多边形（L 形区域）\n\n**用户**：\"我需要监视 L 形存储区域\"\n\n**你**：\n1. 生成网格\n2. 问：\"使用网格坐标标记 L 形的所有角，从一个角开始\"\n3. 用户：\"从左上角开始：A2、E2、E4、D4、D6、A6\"\n4. 确认：\"这些点是否按顺序形成 L 形的边界？确认它关闭回 A2\"\n5. 用户：\"是的\"\n6. 预览 L 形多边形\n7. 验证没有自交\n8. 调用技能\n\n---\n\n## 数据结构\n\n详见 [types-guide.md](./types-guide.md) 了解完整的定义、子对象和示例。\n\nFile v0.9.41:tripwire-workflow.md\n\n# 绊线（检测线）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为穿越检测定义绊线时，遵循此交互工作流。\n\n## 核心概念\n\n- **p1→p2** 主检测线（用户定义，2 个点）\n- **p3→p4** A-B 区域标记（系统自动生成或用户定义）\n- **方向** Forward/Backward/TwoWay（要检测的方向）\n\n**自动生成过程**：用户只需指定 p1 和 p2 点。系统会自动生成垂直于主线的 p3 和 p4 点用于预览和确认。\n\n矢量穿越检测算法详情，见 [types-guide.md#tripwire](./types-guide.md#tripwire)\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n### 第 2 步：用户指定绊线\n\n\"查看网格，检测线应该在哪里？例如，从 B2 到 G2？\"\n\n### 第 3 步：预览绊线位置\n\n系统基于用户的 2 个点（p1、p2）生成完整的 4 点结构，然后调用 `visualize.mjs` 生成预览：\n\n```bash\n# 自动计算 4 个点后\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\n    \"kind\":\"TripWire\",\n    \"name\":\"tripwire preview\",\n    \"direction\":\"Forward\",\n    \"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y]\n  }]'\n```\n\n预览显示：\n- 主线（p1→p2）虚线 - 橙色\n- A/B 标记（p3→p4）虚线 - 橙色，带标签\n- 方向箭头 - Forward=绿色在 p4，Backward=红色在 p3\n\n### 第 4 步：确认 A/B 区域\n\n\"查看预览图像：\n- A 区在这一侧（例如线的上方）\n- B 区在那一侧（例如线的下方）\n- 绿色箭头显示 Forward 是 A→B\n\n这是否正确？\"\n\n### 第 5 步：选择方向模式\n\n用户看到预览后，提问：\n- Forward（相同方向）\n- Backward（相反方向）\n- TwoWay（检测两个方向）\n\n### 第 6 步：最终确认\n\n生成最终预览，用户确认，然后调用技能：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y],\"direction\":\"Forward\"}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n---\n\n## 常见错误\n\n❌ 不要在显示预览前解释 A/B\n✅ 用户必须看到带 A/B 标记标签的预览\n\n❌ 不要仅使用 2 个点\n✅ 始终提供 4 个点（主线 + A/B 标记）\n\n❌ 不要跳过预览验证\n✅ 始终显示预览以确认\n\n---\n\n## 完整对话示例\n\n**用户**：\"我需要检测进入门的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs door-camera.jpg door-grid.png\n```\n\n2. 问：\"查看网格，检测线应该在哪里？例如 B2 到 G2？\"\n\n3. 用户：\"是的，从 B2 到 G2 的线\"\n\n4. 生成显示绊线位置和 A/B 标记的预览：\n```bash\nnode scripts/visualize.mjs door-camera.jpg '[]' preview1.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"door\",\"direction\":\"Forward\",\"points\":[B2_x,B2_y,G2_x,G2_y,B1_x,B1_y,G3_x,G3_y]}]'\n```\n\n5. 解释：\"这是绊线预览：\n   - 区域 'A' 在线上方（外侧）\n   - 区域 'B' 在线下方（内侧）\n   - 绿色箭头显示 Forward 检测 A→B（从外侧进入）\n\n   你对这个设置满意吗？\"\n\n6. 用户：\"是的，我想检测进入（Forward）\"\n\n7. 生成最终预览以确认\n\n8. 调用技能进行检测\n\n---\n\n## 数据结构\n\n详见 [types-guide.md#tripwire](./types-guide.md#tripwire) 了解完整的定义、矢量算法和示例。\n\nFile v0.9.41:types-guide.md\n\n# 易见类型定义指南\n\n## 概述\n\n易见平台处理视觉信息并返回结构化数据。理解这些类型可帮助你有效地使用技能输入和输出。\n\n## 核心类型\n\n### 基本类型\n\n这些是在整个平台中使用的标量值。\n\n| 类型 | 描述 | 示例 |\n|------|------|------|\n| `String` | 文本数据 | `\"hello\"` |\n| `TemplateString` | 格式化文本 | `\"Result: {value}\"` |\n| `Integer` | 整数 | `42` |\n| `Double` | 浮点数 | `3.14` |\n| `Boolean` | 真/假 | `true` |\n| `Time` | 时间戳 | `\"2026-03-12T10:00:00Z\"` |\n\n### 复杂类型\n\n这些是包含视觉或检测信息的结构化对象。\n\n#### Detection（检测）\n\n表示图像中的检测对象。\n\n```json\n{\n  \"bbox\": [x, y, width, height],\n  \"confidence\": 0.94,\n  \"category\": {\n    \"id\": \"person\",\n    \"name\": \"人体\",\n    \"confidence\": 0.98\n  },\n  \"track_id\": 1,\n  \"ocr\": null,\n  \"keypoints\": null\n}\n```\n\n**字段**：\n- `bbox` - 边框 [x, y, width, height]（像素坐标）\n- `confidence` - 检测置信度（0-1）\n- `category` - 对象分类，包含 id、name、confidence\n- `track_id` - 跟踪 ID（用于帧间跟踪，可选）\n- `ocr` - 文本识别结果（可选）\n- `keypoints` - 姿态/骨骼关键点（可选）\n\n#### TrackDetection（跟踪检测）\n\n与 `Detection` 相同，但用于视频帧间的时间跟踪。\n\n#### Attribute（属性）\n\n表示图像中检测到的属性或属性。\n\n```json\n{\n  \"attribute\": \"age\",\n  \"answer\": \"adult\",\n  \"confidence\": 0.87\n}\n```\n\n**字段**：\n- `attribute` - 属性名称（例如\"age\"、\"gender\"、\"expression\"）\n- `answer` - 属性值\n- `confidence` - 置信度分数\n\n#### Image（图像）\n\n表示技能的视觉输入。\n\n```json\n{\n  \"imageData\": \"base64-encoded-image-data\",\n  \"imageWidth\": 1920,\n  \"imageHeight\": 1080,\n  \"sourceId\": \"abc123def456\",\n  \"imageId\": \"img001\",\n  \"timestamp\": 1705056000000\n}\n```\n\n**字段**：\n- `imageData` - Base64 编码的图像字节（从文件路径自动编码）\n- `imageWidth` - 图像宽度（像素）\n- `imageHeight` - 图像高度（像素）\n- `sourceId` - 源标识符，用于视频流（文件 MD5 哈希）\n- `imageId` - 唯一的图像标识符\n- `timestamp` - 帧时间戳（毫秒）\n\n#### ROI（关注区域 / 电子围栏）\n\n定义用于分析的多边形区域。\n\n**完整工作流：** 见 [roi-workflow.md](./roi-workflow.md)\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"entrance\",\n  \"points\": [x1, y1, x2, y2, x3, y3, x4, y4]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"ROI\"\n- `name` - 区域描述名称（可选）\n- `points` - 多边形顶点坐标数组，按顺序排列：`[x1,y1, x2,y2, x3,y3, ...]`\n\n**示例**:\n\n**矩形ROI - 收银区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"checkout-zone\",\n  \"points\": [100, 100, 300, 100, 300, 250, 100, 250]\n}\n```\n\n**多边形ROI - L形仓库区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"warehouse-l-zone\",\n  \"points\": [100, 100, 400, 100, 400, 200, 300, 200, 300, 350, 100, 350]\n}\n```\n\n**网格坐标输入**:\n使用 `show-grid.mjs` 生成的网格坐标：\n```\nB1, E1, E3, B3  →  自动转换为像素坐标\n```\n\n#### Tripwire（绊线 / 穿越检测线）\n\n定义用于穿越事件的检测线。\n\n**完整工作流：** 见 [tripwire-workflow.md](./tripwire-workflow.md)\n\n**核心概念 - 向量点乘法则**:\n\n绊线穿越检测使用向量点乘：\n\n1. **绊线向量** = p1 → p2 方向\n2. **运动向量** = 前一帧到当前帧的对象移动\n3. **点乘计算**：`dot = V_line.x * V_motion.x + V_line.y * V_motion.y`\n4. **穿越判定**：\n   - `dot > 0` → 正向穿越（Forward，A→B）\n   - `dot < 0` → 反向穿越（Backward，B→A）\n   - TwoWay: 两个方向都检测\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"TripWire\"\n- `name` - 检测线描述名称（可选）\n- `direction` - \"Forward\" | \"Backward\" | \"TwoWay\"\n- `points` - 8元素数组：\n  - p1, p2: 主检测线（用户指定）\n  - p3, p4: A-B区域标记（标识穿越方向）\n\n**自动生成A-B点**:\n\n用户可以只提供 **2个点**（p1, p2 主检测线），系统会自动生成 **p3, p4**（A-B区域标记）：\n\n1. **输入**: 用户给出2个点 `[p1_x, p1_y, p2_x, p2_y]`\n2. **自动计算**:\n   ```\n   dx, dy = 主线方向向量 (p2 - p1)\n   perpX, perpY = 旋转90度得到垂直向量\n   distance = 30px (默认)\n   p3 = p1 + perp * distance  (A区域标记)\n   p4 = p2 + perp * distance  (B区域标记)\n   ```\n3. **结果**: 自动补全为完整的4点结构 `[p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]`\n4. **生成预览图**: 使用 `visualize.mjs` 将Tripwire可视化\n   ```bash\n   node scripts/visualize.mjs <image> '[]' preview.png \\\n     --overlays '[{\n       \"kind\": \"TripWire\",\n       \"name\": \"绊线预览\",\n       \"direction\": \"Forward\",\n       \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n     }]'\n   ```\n   输出：`preview.png` 显示绊线虚线、A/B标记、方向箭头\n5. **用户确认**: 显示预览图让用户确认：\n   - A/B区域位置是否正确\n   - 方向箭头是否指向期望方向\n   - 绊线是否跨越检测区域\n\n**示例**:\n\n用户输入：`[150, 100, 150, 300]` (竖直线)\n系统自动生成：`[150, 100, 150, 300, 120, 100, 120, 300]` (左偏30px)\n生成预览：\n```bash\nnode scripts/visualize.mjs door.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"门\",\"direction\":\"Forward\",\"points\":[150,100,150,300,120,100,120,300]}]'\n```\n用户看预览图确认A(左)→B(右)方向是否符合预期\n\n**结构可视化**:\n```\np1 --------> p2  (主检测线，p1→p2)\n ^            ^\n |            |\np3           p4  (A-B区域标记)\n\n• Forward: 检测p3→p4方向的穿越（A→B）\n• Backward: 检测p4→p3方向的穿越（B→A）\n• TwoWay: 双向都检测\n```\n\n**方向可视化**:\n- **Forward** - 绿色箭头在p4，表示A→B方向\n- **Backward** - 红色箭头在p3，表示B→A方向\n- **TwoWay** - 蓝色箭头在p3和p4，表示双向\n\n**示例**:\n\n**垂直检测线 - 人员进出统计**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [150, 100, 150, 300, 130, 100, 170, 300]\n}\n```\n\n说明：\n- p1(150,100) → p2(150,300): 竖直线\n- p3(130,100) → p4(170,300): A-B标记（左右偏移30px）\n- Forward: 只检测从左→右的穿越\n\n**水平检测线 - 考勤打卡**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"checkin-line\",\n  \"direction\": \"TwoWay\",\n  \"points\": [100, 200, 400, 200, 100, 180, 400, 220]\n}\n```\n\n说明：\n- p1(100,200) → p2(400,200): 水平线\n- p3(100,180) → p4(400,220): A-B标记（上下偏移20px）\n- TwoWay: 双向都统计\n\n### 数组类型\n\n任何类型都可以包装在数组中：\n\n```json\n{\n  \"type\": \"Array<Detection>\",\n  \"example\": [\n    { \"bbox\": [...], \"confidence\": 0.9, ... },\n    { \"bbox\": [...], \"confidence\": 0.85, ... }\n  ]\n}\n```\n\n常见数组：\n- `Array<Detection>` - 多个检测对象\n- `Array<TrackDetection>` - 帧间跟踪的对象\n- `Array<Attribute>` - 多个属性结果\n- `Array<ROI>` - 多个区域\n- `Array<Tripwire>` - 多条检测线\n\n## 可视化和交互\n\n### 检测可视化\n\n使用 `visualize.mjs` 在图像上可视化检测结果：\n\n```bash\nnode scripts/visualize.mjs photo.jpg '<detection-json>' output.jpg\n```\n\n**支持**：\n- 带置信度分数的边框\n- 类别标签\n- 用于跟踪可视化的跟踪 ID\n- 叠加层（ROI 区域、绊线线条）\n- 文本注释\n\n### ROI/绊线输入\n\n用于区域和障碍的交互式输入：\n\n1. 生成网格参考图像：\n   ```bash\n   node scripts/show-grid.mjs photo.jpg\n   ```\n\n2. 使用网格参考指定坐标：\n   ```\n   ROI: B1, E1, E3, B3\n   Tripwire: A2 → G2 (direction: Forward)\n   ```\n\n3. 网格坐标自动转换为像素坐标\n\n详见 [grid-guide.md](./grid-guide.md)。\n\n## 视频帧提取\n\n用于视频帧提取和多帧分析：\n\n```json\n{\n  \"imageData\": \"base64-frame-data\",\n  \"sourceId\": \"video_abc123\",        // 每个视频源唯一\n  \"imageId\": \"frame_001\",             // 每帧唯一\n  \"timestamp\": 1705056000000          // 帧时间戳，单位毫秒\n}\n```\n\n**sourceId 计算**:\n```\nsourceId = MD5(视频文件的前 64KB) → 16 字符十六进制字符串\n```\n\n**timestamp 计算**:\n```\ntimestamp = 帧索引 * 1000 / 帧率\n```\n\n详见 [video-guide.md](./video-guide.md)。\n\n## 类型转换\n\n### 输入转换\n\n当将文件作为 `Image` 类型传递时：\n\n```bash\n# 文件路径自动转换为 base64\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node invoke.mjs ep-detect\n```\n\n### 输出解析\n\n检测结果会自动解析：\n\n```javascript\n// 原始输出\n{ \"detections\": \"[{\\\"bbox\\\": [...]}]\" }\n\n// 解析后的输出\n{ \"detections\": [{ \"bbox\": [...] }] }  // JSON 数组，可以直接使用\n```\n\n## 最佳实践\n\n1. **始终验证边框** - 确保坐标在图像边界内\n2. **使用 track_id 以保持连续性** - 跟踪帧间的对象以获得更好的结果\n3. **有效组合类型** - 使用 ROI 限制检测区域\n4. **时间戳精度** - 为视频分析维持一致的时间戳计算\n5. **sourceId 一致性** - 为来自同一源的所有帧保持 sourceId 常数\n\n## 故障排除\n\n**\"无效的检测\"**\n- 检查边框格式：[x, y, width, height]\n- 验证坐标为非负数\n- 确保框在图像边界内\n\n**\"缺少关键点\"**\n- 并非所有技能都支持关键点\n- 检查技能文档以了解支持的输出\n\n**\"ROI 未被识别\"**\n- 验证多边形是否闭合（第一个点 ≠ 最后一个点）\n- 确保至少有 3 个点\n- 检查点的顺序是否正确（顺时针或逆时针）\n\n**\"sourceId 不匹配\"**\n- 如果视频文件改变，重新计算 sourceId\n- 对来自同一源的所有帧使用相同的 sourceId\n\nFile v0.9.41:package.json\n\n{\n  \"name\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.41\",\n  \"description\": \"Baidu Yijian Vision Skill - Intent-driven visual analysis with automatic skill routing\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"engines\": {\n    \"node\": \">=16.0.0\",\n    \"npm\": \">=8.0.0\"\n  },\n  \"scripts\": {\n    \"pack\": \"node scripts/pack.mjs\",\n    \"publish:clawhub\": \"node scripts/publish.mjs\",\n    \"publish:dry-run\": \"node scripts/publish.mjs --dry-run\",\n    \"test\": \"node --test 'tests/*.test.mjs'\",\n    \"test:integration\": \"node tests/run-integration.mjs --skip-e2e\",\n    \"test:integration:all\": \"node tests/run-integration.mjs\",\n    \"test:integration:e2e\": \"node tests/run-integration.mjs --e2e\",\n    \"test:integration:agent\": \"node tests/run-integration.mjs --agent\",\n    \"test:integration:docker\": \"node tests/run-docker.mjs\",\n    \"test:all\": \"npm test && npm run test:integration\"\n  },\n  \"devDependencies\": {\n    \"archiver\": \"^7.0.1\",\n    \"openclaw\": \"github:openclaw/openclaw#main\"\n  },\n  \"optionalDependencies\": {\n    \"sharp\": \"^0.33.0\"\n  }\n}\n\nArchive v0.9.40: 18 files, 42121 bytes\n\nFiles: grid-guide.md (6164b), package.json (1029b), roi-workflow.md (2693b), scripts/cache.mjs (1693b), scripts/intent-invoke.mjs (5607b), scripts/invoke.mjs (6083b), scripts/list.mjs (1229b), scripts/multimodal.mjs (2608b), scripts/query.mjs (2604b), scripts/show-grid.mjs (7969b), scripts/types.mjs (20158b), scripts/utils.mjs (4553b), scripts/visualize.mjs (19622b), scripts/workspace.mjs (5281b), SKILL.md (9482b), tripwire-workflow.md (3411b), types-guide.md (9811b), _meta.json (139b)\n\nFile v0.9.40:SKILL.md\n\n---\nname: baidu-yijian-vision\ndescription: \"Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision. 百度一见视觉技能（Baidu Yijian Vision Skill）- 可用于分析图片和视频。相比通用基模，在维持 95%+ 专业精度的同时，推理成本降低 50% 以上，是处理视觉巡检与监控分析任务的首选工具。主打 安全管理、SOP合规、工业质检、商业运营与物料盘点。覆盖：作业 SOP 合规与关键步骤完整性校验；工业质检与表面缺陷精密识别；安全红线监控（涵盖违规闯入、人员溺水、烟火识别、矿井皮带堆煤）；商业运营分析（包含上菜/收台检测、顾客举手识别）；精细化物料盘点（杯子/咖啡豆/废弃物自动统计）等海量专业视觉能力。\"\nallowed-tools: Bash, Read, Write, Edit\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\"],\"env\":[\"YIJIAN_API_KEY\"]},\"primaryEnv\":\"YIJIAN_API_KEY\"}}\n---\n\n# 百度一见视觉技能（Baidu Yijian Vision Skill）\n\n> **Baidu Yijian Vision Skill** - baidu yijian vision skill for image/video analysis, object detection, safety monitoring, and industrial inspection.\n\n## ⚠️ 必需条件\n\n1. **YIJIAN_API_KEY 环境变量**（必需）— 从[百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)获取：\n   1. 登录百度一见平台\n   2. 激活试用包\n   3. 生成 API Key（系统管理 → 安全认证 → API Key）\n2. **Node.js >= 16.0.0** — 运行时依赖\n\n配置环境变量：`YIJIAN_API_KEY=your-api-key`\n\n---\n\n> **🔒 客户端工具 - 这是一个本地工具，用于与百度一见（Baidu Yijian）平台交互。所有数据处理遵循安全协议。**\n\n## 🎯 此工具的功能\n\n百度一见（[yijian-next.cloud.baidu.com](https://yijian-next.cloud.baidu.com)）是百度（Baidu）的视觉（vision）理解平台。此工具使你能够：\n\n- **意图自动匹配** - 通过自然语言描述自动匹配最佳技能\n- **智能路由** - 高置信度匹配时调用专业视觉技能，低置信度时自动回退到多模态推理\n- **直接技能调用** - 已知技能ID时可直接调用\n- **可视化结果** - 绘制边框、生成网格参考、预览 ROI/绊线\n- **定义检测区域** - 使用交互式工作流定义 ROI（电子围栏）或绊线（检测线）\n\n**支持的检测类型：** 人员检测、行人计数、车辆识别、OCR、姿态估计、目标跟踪等。\n\n## 📚 使用指南\n\n### 意图驱动工作流（推荐）\n\n**当你描述需求但不确定用哪个技能时**，系统会自动匹配最佳技能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg\n```\n\n系统会自动：\n1. 查询一见平台，根据意图匹配公共技能列表\n2. 如果匹配置信度 ≥ 0.7，调用对应的专业技能（自动添加全图 ROI）\n3. 如果公共技能无匹配或调用失败，搜索私有工作空间技能（由你从列表中选择最匹配的技能，再用 invoke 调用）\n4. 如果私有空间也无合适技能，自动回退到多模态直接推理\n\n> **自动 ROI：** 当用户未提供 ROI 时，系统会自动生成覆盖整张图片的 ROI。如需指定检测区域，请使用 `invoke.mjs` 传入自定义 ROI。\n\n#### 自定义置信度阈值\n\n```bash\n# 仅当匹配度≥0.8时才使用技能，否则回退到多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg 0.8\n```\n\n#### 不使用图片（纯文本意图查询）\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\"\n```\n\n#### 返回格式\n\n```json\n{\n  \"success\": true,\n  \"mode\": \"skill\",\n  \"epId\": \"ep-public-xxxxx\",\n  \"skillName\": \"人员摔倒检测\",\n  \"confidence\": 0.92,\n  \"count\": 1,\n  \"detections\": [\n    {\n      \"bbox\": [100, 200, 50, 80],\n      \"category\": \"falling_person\",\n      \"confidence\": 0.94\n    }\n  ]\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `success` | boolean | 调用是否成功 |\n| `mode` | string | `\"skill\"` / `\"workspace-search\"` / `\"multimodal\"`，表示使用的推理模式 |\n| `epId` | string \\| null | 技能ID（技能模式时有值） |\n| `skillName` | string \\| null | 技能名称（技能模式时有值） |\n| `confidence` | number \\| null | 技能匹配置信度（0-1） |\n| `count` | number | 检测到的目标数量 |\n| `detections` | array | 检测结果数组 |\n\n**模式说明：**\n- `\"mode\": \"skill\"` - 使用了百度一见平台的专业技能，精度高、成本低\n- `\"mode\": \"workspace-search\"` - 公共技能无匹配，返回私有工作空间技能列表供选择\n- `\"mode\": \"multimodal\"` - 使用了多模态大模型直接推理，通用性强、无需预设技能\n\n### 查询技能\n\n**查询公共技能**（按意图匹配）：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/list.mjs \"人员检测\"\n```\n\n**查询私有工作空间技能**（按 API Key 关联，缓存1小时）：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/workspace.mjs list-skills\n```\n\n返回技能列表（含 epId、名称和描述）。当公共技能匹配不到时，从私有列表中选择最匹配的技能，用 `invoke.mjs` 调用：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-wsnyqcdj-0xdpgbt4\n```\n\n### 直接调用技能（已知技能ID）\n\n**当你已经知道具体的技能 ID 时**，可以直接调用：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n#### ROI（电子围栏）参数格式\n\nROI 用于限定检测区域。**必须包含 `id`、`name`、`kind`、`points` 四个字段，缺一不可**，否则 API 返回 500 错误。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"zone\",\n  \"kind\": \"ROI\",\n  \"points\": [x1,y1, x2,y2, x3,y3, x4,y4]\n}\n```\n\n- `id` — 任意字符串标识（如 `\"1\"`）\n- `name` — 区域名称（如 `\"zone\"`、`\"doorway\"`）\n- `kind` — 固定值 `\"ROI\"`\n- `points` — 顶点坐标数组，按顺时针/逆时针顺序排列，每对 `[x,y]` 为一个顶点\n\n#### 绊线（Tripwire）参数格式\n\n绊线用于检测穿越事件。**必须包含 `id`、`name`、`kind`、`points`、`direction` 五个字段**。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"line\",\n  \"kind\": \"TripWire\",\n  \"points\": [p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p4_x,p4_y],\n  \"direction\": \"Forward\"\n}\n```\n\n- `id` — 任意字符串标识\n- `name` — 绊线名称\n- `kind` — 固定值 `\"TripWire\"`\n- `points` — 4 个点（8 个数值）：p1→p2 为主线，p3→p4 为 A/B 区域标记\n- `direction` — 检测方向：`\"Forward\"` | `\"Backward\"` | `\"TwoWay\"`\n\n> **绊线不会自动生成**，必须由用户指定。详见 [绊线工作流](./tripwire-workflow.md)。\n\n**调用带 ROI 的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[100,100,500,100,500,400,100,400]}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n**调用带绊线的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[0,540,1920,540,0,500,1920,500],\"direction\":\"Forward\"}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n### 定义检测区域\n\n**需要定义电子围栏（ROI，又叫感兴趣区域）或绊线（Tripwire，又叫检测线）？**\n\n- **[ROI 工作流](./roi-workflow.md)** — 创建电子围栏，仅在指定区域检测\n- **[绊线工作流](./tripwire-workflow.md)** — 绘制检测线，统计穿越事件\n\n两个工作流都包含完整的交互步骤和示例对话。\n\n**预览 ROI/绊线** — 在调用前在图像上预览：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs photo.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"zone\",\"points\":[...]}]'\n```\n\n**生成网格** — 帮助用户使用网格坐标指定点位置：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/show-grid.mjs photo.jpg grid.png\n```\n\n### 查看完整文档\n\n- **[类型定义](./types-guide.md)** — 检测（Detection），图像（Image）、电子围栏（ROI）、绊线（Tripwire）等数据结构\n- **[网格输入系统](./grid-guide.md)** — 使用网格坐标指定点\n\n### 高级：视频帧处理和跟踪\n\n**场景：** 处理 30 秒监控视频，逐帧检测和跟踪人员。\n\n```bash\n# 第 1 步：提取帧\nffmpeg -i surveillance_30sec.mp4 -vf fps=1 frames/frame_%04d.jpg\n\n# 第 2 步：计算 sourceId（视频标识符）\nsourceId=$(head -c 65536 surveillance_30sec.mp4 | md5sum | awk '{print substr($1, 1, 16)}')\n\n# 第 3 步：处理每个帧并跟踪\nfor frame_file in frames/frame_*.jpg; do\n  frame_num=$(basename \"$frame_file\" | grep -oE '[0-9]+' | head -1)\n  frame_index=$((10#$frame_num - 1))\n  timestamp=$((frame_index * 1000))\n  imageId=\"frame_$(printf '%04d' \"$frame_num\")\"\n\n  # 使用意图驱动调用\n  result=$(node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员\" \"$frame_file\")\n\n  detections=$(echo \"$result\" | jq '.detections')\n  echo \"$detections\" > \"results/${imageId}_detections.json\"\ndone\n```\n\nFile v0.9.40:_meta.json\n\n{\n  \"ownerId\": \"kn7aw0s517ypj0hstj91qr6nxs82r2xy\",\n  \"slug\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.40\",\n  \"publishedAt\": 1777429274390\n}\n\nFile v0.9.40:grid-guide.md\n\n# 基于网格的 ROI / 绊线输入指南\n\n## 概述\n\n在命令行环境中手动指定 ROI 区域或绊线的确切像素坐标既繁琐又容易出错。基于网格的输入系统让你可以使用易于理解的网格坐标来代替。\n\n## 工作原理\n\n### 1. 生成网格参考图像\n\n```bash\nnode scripts/show-grid.mjs photo.jpg [output-path] [--cols N] [--rows N]\n```\n\n这会在你的图像上创建带标签的网格叠加层：\n\n```\n       A     B     C     D     E     F     G\n   0   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   1   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   2   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   3   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   4   ·─────·─────·─────·─────·─────·─────·\n```\n\n**输出**：\n- `photo_grid.png` - 网格参考图像\n- `photo_grid_metadata.json` - 坐标映射数据\n\n### 2. 查看并识别坐标\n\n查看网格图像并识别 ROI 或绊线的坐标：\n\n- **列**：A、B、C、D、...（从左到右）\n- **行**：0、1、2、3、...（从上到下）\n- **交点**：网格线交叉的位置（用点标记）\n\n### 3. 使用网格坐标指定\n\n告诉系统网格坐标：\n\n```\n用户：\"在 B1、E1、E3、B3 创建检测区域\"\n```\n\n系统自动转换为像素坐标：\n\n```\nB1 = (列B索引 × 网格宽度, 行1索引 × 网格高度)\nE1 = (列E索引 × 网格宽度, 行1索引 × 网格高度)\nE3 = (列E索引 × 网格宽度, 行3索引 × 网格高度)\nB3 = (列B索引 × 网格宽度, 行3索引 × 网格高度)\n```\n\n## 使用示例\n\n### 示例 1：定义检测区域（ROI）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs office.jpg\n\n# 查看网格图像以识别坐标，然后：\n用户：\"我想要一个办公桌区域的检测区域：B2、G2、G5、B5\"\n\n转换为 ROI：\n{\n  \"kind\": \"ROI\",\n  \"points\": [col_B, row_2, col_G, row_2, col_G, row_5, col_B, row_5]\n}\n\n# 使用 ROI 调用技能\n$ echo '{\"input0\":{\"image\":\"office.jpg\",\"roi\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-2403um2p\n```\n\n### 示例 2：定义穿越线（绊线）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs hallway.jpg\n\n# 查看网格图像，然后：\n用户：\"在走廊中创建一条从 A3 到 H3 的绊线，检测从左到右的穿越\"\n\n转换为绊线：\n{\n  \"kind\": \"TripWire\",\n  \"points\": [col_A, row_3, col_H, row_3],\n  \"direction\": \"Forward\"\n}\n\n# 使用绊线调用技能\n$ echo '{\"input0\":{\"image\":\"hallway.jpg\",\"tripwire\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-ywbjb7tm\n```\n\n### 示例 3：多个 ROI\n\n```bash\n用户：\"我想要 3 个检测区域：入口（A1-C3）、中心（D1-F3）、出口（G1-H3）\"\n\n转换为三个 ROI 对象并作为 Array<ROI> 传递：\n[\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_A, row_1, col_C, row_1, col_C, row_3, col_A, row_3],\n    \"order\": 0\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_D, row_1, col_F, row_1, col_F, row_3, col_D, row_3],\n    \"order\": 1\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_G, row_1, col_H, row_1, col_H, row_3, col_G, row_3],\n    \"order\": 2\n  }\n]\n```\n\n## 网格算法\n\n网格大小会自动计算：\n\n- **目标**：约 30-42 个交点，大致为方形单元\n- **横向图像**（1920×1080）：7 列 × 4 行\n- **纵向图像**（1080×1920）：4 列 × 7 行\n- **方形图像**（800×800）：5 列 × 5 行\n\n**手动覆盖**：\n```bash\nnode scripts/show-grid.mjs photo.jpg --cols 10 --rows 6\n```\n\n## 命令参考\n\n### 生成网格\n\n```bash\nnode scripts/show-grid.mjs <input-image> [output-path] [--cols N] [--rows N]\n```\n\n**参数**：\n- `<input-image>` - 输入图像文件路径\n- `[output-path]` - 可选输出图像路径（默认：`<input>_grid.png`）\n- `--cols N` - 覆盖列数\n- `--rows N` - 覆盖行数\n\n**输出**：\n- 网格图像：`<output>.png`\n- 元数据 JSON：`<output>_metadata.json`\n\n### 使用网格坐标\n\n在指定坐标时：\n\n**有效格式**：\n- 单个点：`A1`\n- 序列：`A1、E1、E3、A3`（用于 ROI）\n- 线：`A2 → G2`（用于绊线，显示方向）\n\n**网格参考格式**：\n- 列：A-Z，然后是 AA-AZ 等\n- 行：0-9，然后是 10-99 等\n\n## 可视化\n\n### 查看网格图像\n\n生成网格后，系统应该显示网格图像以便你可以直观地识别坐标。\n\n### 调用前验证\n\n在用坐标调用技能之前：\n\n```bash\n# 在原始图像上可视化选定的 ROI/绊线\nnode scripts/visualize.mjs office.jpg '<roi-or-tripwire-json>' preview.jpg\n```\n\n这可帮助你在处理前验证坐标是否正确。\n\n## 提示和技巧\n\n1. **从简单开始**：在使用复杂多边形前先从简单的矩形 ROI 开始\n2. **使用均匀网格**：5×5 或 6×6 网格最容易参考\n3. **记录你的区域**：为每个 ROI 指定有意义的名称（例如\"入口\"、\"收银台\"）\n4. **重用坐标**：保存类似摄像机角度的坐标集\n5. **先测试**：在处理前始终用 `visualize.mjs` 预览\n\n## 故障排除\n\n**\"网格图像过于拥挤\"**\n- 降低网格密度：`--cols 4 --rows 4`\n- 如果可能，增大图像大小\n\n**\"看不清网格线\"**\n- 网格使用半透明白色线条（50% 不透明度）\n- 放大网格图像以获得更好的可见性\n\n**\"坐标似乎不对\"**\n- 验证列/行顺序（列 A-Z 从左到右，行 0-N 从上到下）\n- 检查第一个点和最后一个点是否不同（多边形必须闭合）\n- 确保点的顺序一致（全部顺时针或全部逆时针）\n\n**\"网格不适合图像\"**\n- 非常宽或非常高的图像可能有不均匀的单元格\n- 使用 `--cols` 和 `--rows` 强制指定特定的网格尺寸\n\n## 参考\n\n- [类型定义](./types-guide.md) - ROI 和绊线类型规范\n- [SKILL.md](./SKILL.md) - 主技能指南\n\nFile v0.9.40:roi-workflow.md\n\n# ROI（关注区域）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为对象检测定义 ROI（关注区域）时，遵循此交互工作流。\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n向用户显示网格图像并解释行和列标签。\n\n### 第 2 步：询问 ROI 目的\n\n\"你想在这个区域检测什么？例如：\n- 进入收银区域的人员\n- 停车场中的车辆\n- 货架上的产品\"\n\n### 第 3 步：用户指定顶点\n\n用户根据网格标签指定角。\n\n**矩形 ROI 示例：**\n- 用户：\"从 B2 到 G5\"\n- 转换为 4 个顶点：[B2、G2、G5、B5]\n\n### 第 4 步：验证顶点顺序\n\n\"这些点是否围绕周边形成闭合多边形？（顺时针或逆时针）\"\n\n### 第 5 步：预览 ROI\n\n```bash\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"test\",\"points\":[x1,y1,x2,y2,x3,y3,x4,y4]}]'\n```\n\n### 第 6 步：用户确认\n\n\"ROI 位置是否正确？\"\n\n### 第 7 步：调用技能\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[...]}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n> **重要：** 自定义 ROI 必须通过 `invoke.mjs` 传入。不要使用 `intent-invoke.mjs`，因为它会自动添加全图 ROI 覆盖掉你的自定义区域。\n\n---\n\n## 常见错误\n\n❌ 不要假设矩形 ROI\n✅ 支持任意多边形\n\n❌ 不要允许无序的顶点\n✅ 顶点必须按顺序排列\n\n❌ 不要跳过预览验证\n✅ 始终显示预览图像以确认\n\n---\n\n## 完整对话示例\n\n### 示例 1：矩形入口区域\n\n**用户**：\"我想检测进入办公室的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs office.jpg office-grid.png\n```\n2. 问：\"查看网格，入口大概在哪里？\"\n3. 用户：\"大约从 B1 到 G3\"\n4. 确认：\"所以顶点是 B1、G1、G3、B3，对吧？\"\n5. 用户：\"是的\"\n6. 预览 ROI\n7. 问：\"这个矩形是否覆盖了入口？\"\n8. 用户：\"完美！\"\n9. 调用技能进行检测\n\n### 示例 2：复杂多边形（L 形区域）\n\n**用户**：\"我需要监视 L 形存储区域\"\n\n**你**：\n1. 生成网格\n2. 问：\"使用网格坐标标记 L 形的所有角，从一个角开始\"\n3. 用户：\"从左上角开始：A2、E2、E4、D4、D6、A6\"\n4. 确认：\"这些点是否按顺序形成 L 形的边界？确认它关闭回 A2\"\n5. 用户：\"是的\"\n6. 预览 L 形多边形\n7. 验证没有自交\n8. 调用技能\n\n---\n\n## 数据结构\n\n详见 [types-guide.md](./types-guide.md) 了解完整的定义、子对象和示例。\n\nFile v0.9.40:tripwire-workflow.md\n\n# 绊线（检测线）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为穿越检测定义绊线时，遵循此交互工作流。\n\n## 核心概念\n\n- **p1→p2** 主检测线（用户定义，2 个点）\n- **p3→p4** A-B 区域标记（系统自动生成或用户定义）\n- **方向** Forward/Backward/TwoWay（要检测的方向）\n\n**自动生成过程**：用户只需指定 p1 和 p2 点。系统会自动生成垂直于主线的 p3 和 p4 点用于预览和确认。\n\n矢量穿越检测算法详情，见 [types-guide.md#tripwire](./types-guide.md#tripwire)\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n### 第 2 步：用户指定绊线\n\n\"查看网格，检测线应该在哪里？例如，从 B2 到 G2？\"\n\n### 第 3 步：预览绊线位置\n\n系统基于用户的 2 个点（p1、p2）生成完整的 4 点结构，然后调用 `visualize.mjs` 生成预览：\n\n```bash\n# 自动计算 4 个点后\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\n    \"kind\":\"TripWire\",\n    \"name\":\"tripwire preview\",\n    \"direction\":\"Forward\",\n    \"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y]\n  }]'\n```\n\n预览显示：\n- 主线（p1→p2）虚线 - 橙色\n- A/B 标记（p3→p4）虚线 - 橙色，带标签\n- 方向箭头 - Forward=绿色在 p4，Backward=红色在 p3\n\n### 第 4 步：确认 A/B 区域\n\n\"查看预览图像：\n- A 区在这一侧（例如线的上方）\n- B 区在那一侧（例如线的下方）\n- 绿色箭头显示 Forward 是 A→B\n\n这是否正确？\"\n\n### 第 5 步：选择方向模式\n\n用户看到预览后，提问：\n- Forward（相同方向）\n- Backward（相反方向）\n- TwoWay（检测两个方向）\n\n### 第 6 步：最终确认\n\n生成最终预览，用户确认，然后调用技能：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y],\"direction\":\"Forward\"}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n---\n\n## 常见错误\n\n❌ 不要在显示预览前解释 A/B\n✅ 用户必须看到带 A/B 标记标签的预览\n\n❌ 不要仅使用 2 个点\n✅ 始终提供 4 个点（主线 + A/B 标记）\n\n❌ 不要跳过预览验证\n✅ 始终显示预览以确认\n\n---\n\n## 完整对话示例\n\n**用户**：\"我需要检测进入门的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs door-camera.jpg door-grid.png\n```\n\n2. 问：\"查看网格，检测线应该在哪里？例如 B2 到 G2？\"\n\n3. 用户：\"是的，从 B2 到 G2 的线\"\n\n4. 生成显示绊线位置和 A/B 标记的预览：\n```bash\nnode scripts/visualize.mjs door-camera.jpg '[]' preview1.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"door\",\"direction\":\"Forward\",\"points\":[B2_x,B2_y,G2_x,G2_y,B1_x,B1_y,G3_x,G3_y]}]'\n```\n\n5. 解释：\"这是绊线预览：\n   - 区域 'A' 在线上方（外侧）\n   - 区域 'B' 在线下方（内侧）\n   - 绿色箭头显示 Forward 检测 A→B（从外侧进入）\n\n   你对这个设置满意吗？\"\n\n6. 用户：\"是的，我想检测进入（Forward）\"\n\n7. 生成最终预览以确认\n\n8. 调用技能进行检测\n\n---\n\n## 数据结构\n\n详见 [types-guide.md#tripwire](./types-guide.md#tripwire) 了解完整的定义、矢量算法和示例。\n\nFile v0.9.40:types-guide.md\n\n# 易见类型定义指南\n\n## 概述\n\n易见平台处理视觉信息并返回结构化数据。理解这些类型可帮助你有效地使用技能输入和输出。\n\n## 核心类型\n\n### 基本类型\n\n这些是在整个平台中使用的标量值。\n\n| 类型 | 描述 | 示例 |\n|------|------|------|\n| `String` | 文本数据 | `\"hello\"` |\n| `TemplateString` | 格式化文本 | `\"Result: {value}\"` |\n| `Integer` | 整数 | `42` |\n| `Double` | 浮点数 | `3.14` |\n| `Boolean` | 真/假 | `true` |\n| `Time` | 时间戳 | `\"2026-03-12T10:00:00Z\"` |\n\n### 复杂类型\n\n这些是包含视觉或检测信息的结构化对象。\n\n#### Detection（检测）\n\n表示图像中的检测对象。\n\n```json\n{\n  \"bbox\": [x, y, width, height],\n  \"confidence\": 0.94,\n  \"category\": {\n    \"id\": \"person\",\n    \"name\": \"人体\",\n    \"confidence\": 0.98\n  },\n  \"track_id\": 1,\n  \"ocr\": null,\n  \"keypoints\": null\n}\n```\n\n**字段**：\n- `bbox` - 边框 [x, y, width, height]（像素坐标）\n- `confidence` - 检测置信度（0-1）\n- `category` - 对象分类，包含 id、name、confidence\n- `track_id` - 跟踪 ID（用于帧间跟踪，可选）\n- `ocr` - 文本识别结果（可选）\n- `keypoints` - 姿态/骨骼关键点（可选）\n\n#### TrackDetection（跟踪检测）\n\n与 `Detection` 相同，但用于视频帧间的时间跟踪。\n\n#### Attribute（属性）\n\n表示图像中检测到的属性或属性。\n\n```json\n{\n  \"attribute\": \"age\",\n  \"answer\": \"adult\",\n  \"confidence\": 0.87\n}\n```\n\n**字段**：\n- `attribute` - 属性名称（例如\"age\"、\"gender\"、\"expression\"）\n- `answer` - 属性值\n- `confidence` - 置信度分数\n\n#### Image（图像）\n\n表示技能的视觉输入。\n\n```json\n{\n  \"imageData\": \"base64-encoded-image-data\",\n  \"imageWidth\": 1920,\n  \"imageHeight\": 1080,\n  \"sourceId\": \"abc123def456\",\n  \"imageId\": \"img001\",\n  \"timestamp\": 1705056000000\n}\n```\n\n**字段**：\n- `imageData` - Base64 编码的图像字节（从文件路径自动编码）\n- `imageWidth` - 图像宽度（像素）\n- `imageHeight` - 图像高度（像素）\n- `sourceId` - 源标识符，用于视频流（文件 MD5 哈希）\n- `imageId` - 唯一的图像标识符\n- `timestamp` - 帧时间戳（毫秒）\n\n#### ROI（关注区域 / 电子围栏）\n\n定义用于分析的多边形区域。\n\n**完整工作流：** 见 [roi-workflow.md](./roi-workflow.md)\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"entrance\",\n  \"points\": [x1, y1, x2, y2, x3, y3, x4, y4]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"ROI\"\n- `name` - 区域描述名称（可选）\n- `points` - 多边形顶点坐标数组，按顺序排列：`[x1,y1, x2,y2, x3,y3, ...]`\n\n**示例**:\n\n**矩形ROI - 收银区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"checkout-zone\",\n  \"points\": [100, 100, 300, 100, 300, 250, 100, 250]\n}\n```\n\n**多边形ROI - L形仓库区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"warehouse-l-zone\",\n  \"points\": [100, 100, 400, 100, 400, 200, 300, 200, 300, 350, 100, 350]\n}\n```\n\n**网格坐标输入**:\n使用 `show-grid.mjs` 生成的网格坐标：\n```\nB1, E1, E3, B3  →  自动转换为像素坐标\n```\n\n#### Tripwire（绊线 / 穿越检测线）\n\n定义用于穿越事件的检测线。\n\n**完整工作流：** 见 [tripwire-workflow.md](./tripwire-workflow.md)\n\n**核心概念 - 向量点乘法则**:\n\n绊线穿越检测使用向量点乘：\n\n1. **绊线向量** = p1 → p2 方向\n2. **运动向量** = 前一帧到当前帧的对象移动\n3. **点乘计算**：`dot = V_line.x * V_motion.x + V_line.y * V_motion.y`\n4. **穿越判定**：\n   - `dot > 0` → 正向穿越（Forward，A→B）\n   - `dot < 0` → 反向穿越（Backward，B→A）\n   - TwoWay: 两个方向都检测\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"TripWire\"\n- `name` - 检测线描述名称（可选）\n- `direction` - \"Forward\" | \"Backward\" | \"TwoWay\"\n- `points` - 8元素数组：\n  - p1, p2: 主检测线（用户指定）\n  - p3, p4: A-B区域标记（标识穿越方向）\n\n**自动生成A-B点**:\n\n用户可以只提供 **2个点**（p1, p2 主检测线），系统会自动生成 **p3, p4**（A-B区域标记）：\n\n1. **输入**: 用户给出2个点 `[p1_x, p1_y, p2_x, p2_y]`\n2. **自动计算**:\n   ```\n   dx, dy = 主线方向向量 (p2 - p1)\n   perpX, perpY = 旋转90度得到垂直向量\n   distance = 30px (默认)\n   p3 = p1 + perp * distance  (A区域标记)\n   p4 = p2 + perp * distance  (B区域标记)\n   ```\n3. **结果**: 自动补全为完整的4点结构 `[p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]`\n4. **生成预览图**: 使用 `visualize.mjs` 将Tripwire可视化\n   ```bash\n   node scripts/visualize.mjs <image> '[]' preview.png \\\n     --overlays '[{\n       \"kind\": \"TripWire\",\n       \"name\": \"绊线预览\",\n       \"direction\": \"Forward\",\n       \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n     }]'\n   ```\n   输出：`preview.png` 显示绊线虚线、A/B标记、方向箭头\n5. **用户确认**: 显示预览图让用户确认：\n   - A/B区域位置是否正确\n   - 方向箭头是否指向期望方向\n   - 绊线是否跨越检测区域\n\n**示例**:\n\n用户输入：`[150, 100, 150, 300]` (竖直线)\n系统自动生成：`[150, 100, 150, 300, 120, 100, 120, 300]` (左偏30px)\n生成预览：\n```bash\nnode scripts/visualize.mjs door.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"门\",\"direction\":\"Forward\",\"points\":[150,100,150,300,120,100,120,300]}]'\n```\n用户看预览图确认A(左)→B(右)方向是否符合预期\n\n**结构可视化**:\n```\np1 --------> p2  (主检测线，p1→p2)\n ^            ^\n |            |\np3           p4  (A-B区域标记)\n\n• Forward: 检测p3→p4方向的穿越（A→B）\n• Backward: 检测p4→p3方向的穿越（B→A）\n• TwoWay: 双向都检测\n```\n\n**方向可视化**:\n- **Forward** - 绿色箭头在p4，表示A→B方向\n- **Backward** - 红色箭头在p3，表示B→A方向\n- **TwoWay** - 蓝色箭头在p3和p4，表示双向\n\n**示例**:\n\n**垂直检测线 - 人员进出统计**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [150, 100, 150, 300, 130, 100, 170, 300]\n}\n```\n\n说明：\n- p1(150,100) → p2(150,300): 竖直线\n- p3(130,100) → p4(170,300): A-B标记（左右偏移30px）\n- Forward: 只检测从左→右的穿越\n\n**水平检测线 - 考勤打卡**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"checkin-line\",\n  \"direction\": \"TwoWay\",\n  \"points\": [100, 200, 400, 200, 100, 180, 400, 220]\n}\n```\n\n说明：\n- p1(100,200) → p2(400,200): 水平线\n- p3(100,180) → p4(400,220): A-B标记（上下偏移20px）\n- TwoWay: 双向都统计\n\n### 数组类型\n\n任何类型都可以包装在数组中：\n\n```json\n{\n  \"type\": \"Array<Detection>\",\n  \"example\": [\n    { \"bbox\": [...], \"confidence\": 0.9, ... },\n    { \"bbox\": [...], \"confidence\": 0.85, ... }\n  ]\n}\n```\n\n常见数组：\n- `Array<Detection>` - 多个检测对象\n- `Array<TrackDetection>` - 帧间跟踪的对象\n- `Array<Attribute>` - 多个属性结果\n- `Array<ROI>` - 多个区域\n- `Array<Tripwire>` - 多条检测线\n\n## 可视化和交互\n\n### 检测可视化\n\n使用 `visualize.mjs` 在图像上可视化检测结果：\n\n```bash\nnode scripts/visualize.mjs photo.jpg '<detection-json>' output.jpg\n```\n\n**支持**：\n- 带置信度分数的边框\n- 类别标签\n- 用于跟踪可视化的跟踪 ID\n- 叠加层（ROI 区域、绊线线条）\n- 文本注释\n\n### ROI/绊线输入\n\n用于区域和障碍的交互式输入：\n\n1. 生成网格参考图像：\n   ```bash\n   node scripts/show-grid.mjs photo.jpg\n   ```\n\n2. 使用网格参考指定坐标：\n   ```\n   ROI: B1, E1, E3, B3\n   Tripwire: A2 → G2 (direction: Forward)\n   ```\n\n3. 网格坐标自动转换为像素坐标\n\n详见 [grid-guide.md](./grid-guide.md)。\n\n## 视频帧提取\n\n用于视频帧提取和多帧分析：\n\n```json\n{\n  \"imageData\": \"base64-frame-data\",\n  \"sourceId\": \"video_abc123\",        // 每个视频源唯一\n  \"imageId\": \"frame_001\",             // 每帧唯一\n  \"timestamp\": 1705056000000          // 帧时间戳，单位毫秒\n}\n```\n\n**sourceId 计算**:\n```\nsourceId = MD5(视频文件的前 64KB) → 16 字符十六进制字符串\n```\n\n**timestamp 计算**:\n```\ntimestamp = 帧索引 * 1000 / 帧率\n```\n\n详见 [video-guide.md](./video-guide.md)。\n\n## 类型转换\n\n### 输入转换\n\n当将文件作为 `Image` 类型传递时：\n\n```bash\n# 文件路径自动转换为 base64\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node invoke.mjs ep-detect\n```\n\n### 输出解析\n\n检测结果会自动解析：\n\n```javascript\n// 原始输出\n{ \"detections\": \"[{\\\"bbox\\\": [...]}]\" }\n\n// 解析后的输出\n{ \"detections\": [{ \"bbox\": [...] }] }  // JSON 数组，可以直接使用\n```\n\n## 最佳实践\n\n1. **始终验证边框** - 确保坐标在图像边界内\n2. **使用 track_id 以保持连续性** - 跟踪帧间的对象以获得更好的结果\n3. **有效组合类型** - 使用 ROI 限制检测区域\n4. **时间戳精度** - 为视频分析维持一致的时间戳计算\n5. **sourceId 一致性** - 为来自同一源的所有帧保持 sourceId 常数\n\n## 故障排除\n\n**\"无效的检测\"**\n- 检查边框格式：[x, y, width, height]\n- 验证坐标为非负数\n- 确保框在图像边界内\n\n**\"缺少关键点\"**\n- 并非所有技能都支持关键点\n- 检查技能文档以了解支持的输出\n\n**\"ROI 未被识别\"**\n- 验证多边形是否闭合（第一个点 ≠ 最后一个点）\n- 确保至少有 3 个点\n- 检查点的顺序是否正确（顺时针或逆时针）\n\n**\"sourceId 不匹配\"**\n- 如果视频文件改变，重新计算 sourceId\n- 对来自同一源的所有帧使用相同的 sourceId\n\nFile v0.9.40:package.json\n\n{\n  \"name\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.40\",\n  \"description\": \"Baidu Yijian Vision Skill - Intent-driven visual analysis with automatic skill routing\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"engines\": {\n    \"node\": \">=16.0.0\",\n    \"npm\": \">=8.0.0\"\n  },\n  \"scripts\": {\n    \"pack\": \"node scripts/pack.mjs\",\n    \"publish:clawhub\": \"node scripts/publish.mjs\",\n    \"publish:dry-run\": \"node scripts/publish.mjs --dry-run\",\n    \"test\": \"node --test 'tests/*.test.mjs'\",\n    \"test:integration\": \"node tests/run-integration.mjs --skip-e2e\",\n    \"test:integration:all\": \"node tests/run-integration.mjs\",\n    \"test:integration:e2e\": \"node tests/run-integration.mjs --e2e\",\n    \"test:integration:agent\": \"node tests/run-integration.mjs --agent\",\n    \"test:integration:docker\": \"node tests/run-docker.mjs\",\n    \"test:all\": \"npm test && npm run test:integration\"\n  },\n  \"devDependencies\": {\n    \"archiver\": \"^7.0.1\",\n    \"openclaw\": \"github:openclaw/openclaw#main\"\n  },\n  \"optionalDependencies\": {\n    \"sharp\": \"^0.33.0\"\n  }\n}\n\nArchive v0.9.39: 18 files, 42123 bytes\n\nFiles: grid-guide.md (6164b), package.json (1029b), roi-workflow.md (2693b), scripts/cache.mjs (1693b), scripts/intent-invoke.mjs (5607b), scripts/invoke.mjs (6083b), scripts/list.mjs (1229b), scripts/multimodal.mjs (2608b), scripts/query.mjs (2604b), scripts/show-grid.mjs (7969b), scripts/types.mjs (20158b), scripts/utils.mjs (4553b), scripts/visualize.mjs (19622b), scripts/workspace.mjs (5281b), SKILL.md (9474b), tripwire-workflow.md (3411b), types-guide.md (9811b), _meta.json (139b)\n\nFile v0.9.39:SKILL.md\n\n---\nname: baidu-yijian-vision\ndescription: \"Yijian (一见) is Baidu's specialized visual AI skill for image and video analysis. yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision. 百度一见视觉技能（Baidu Yijian Vision Skill）- 可用于分析图片和视频。相比通用基模，在维持 95%+ 专业精度的同时，推理成本降低 50% 以上，是处理视觉巡检与监控分析任务的首选工具。主打 安全管理、SOP合规、工业质检、商业运营与物料盘点。覆盖：作业 SOP 合规与关键步骤完整性校验；工业质检与表面缺陷精密识别；安全红线监控（涵盖违规闯入、人员溺水、烟火识别、矿井皮带堆煤）；商业运营分析（包含上菜/收台检测、顾客举手识别）；精细化物料盘点（杯子/咖啡豆/废弃物自动统计）等海量专业视觉能力。\"\nallowed-tools: Bash, Read, Write, Edit\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\"],\"env\":[\"YIJIAN_API_KEY\"]},\"primaryEnv\":\"YIJIAN_API_KEY\"}}\n---\n\n# 百度一见视觉技能（Baidu Yijian Vision Skill）\n\n> **Baidu Yijian Vision Skill** - baidu yijian vision skill for image/video analysis, object detection, safety monitoring, and industrial inspection.\n\n## ⚠️ 必需条件\n\n1. **YIJIAN_API_KEY 环境变量**（必需）— 从[百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)获取：\n   1. 登录百度一见平台\n   2. 激活试用包\n   3. 生成 API Key（系统管理 → 安全认证 → API Key）\n2. **Node.js >= 16.0.0** — 运行时依赖\n\n配置环境变量：`YIJIAN_API_KEY=your-api-key`\n\n---\n\n> **🔒 客户端工具 - 这是一个本地工具，用于与百度一见（Baidu Yijian）平台交互。所有数据处理遵循安全协议。**\n\n## 🎯 此工具的功能\n\n百度一见（[yijian-next.cloud.baidu.com](https://yijian-next.cloud.baidu.com)）是百度（Baidu）的视觉（vision）理解平台。此工具使你能够：\n\n- **意图自动匹配** - 通过自然语言描述自动匹配最佳技能\n- **智能路由** - 高置信度匹配时调用专业视觉技能，低置信度时自动回退到多模态推理\n- **直接技能调用** - 已知技能ID时可直接调用\n- **可视化结果** - 绘制边框、生成网格参考、预览 ROI/绊线\n- **定义检测区域** - 使用交互式工作流定义 ROI（电子围栏）或绊线（检测线）\n\n**支持的检测类型：** 人员检测、行人计数、车辆识别、OCR、姿态估计、目标跟踪等。\n\n## 📚 使用指南\n\n### 意图驱动工作流（推荐）\n\n**当你描述需求但不确定用哪个技能时**，系统会自动匹配最佳技能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg\n```\n\n系统会自动：\n1. 查询一见平台，根据意图匹配公共技能列表\n2. 如果匹配置信度 ≥ 0.7，调用对应的专业技能（自动添加全图 ROI）\n3. 如果公共技能无匹配或调用失败，搜索私有工作空间技能（由你从列表中选择最匹配的技能，再用 invoke 调用）\n4. 如果私有空间也无合适技能，自动回退到多模态直接推理\n\n> **自动 ROI：** 当用户未提供 ROI 时，系统会自动生成覆盖整张图片的 ROI。如需指定检测区域，请使用 `invoke.mjs` 传入自定义 ROI。\n\n#### 自定义置信度阈值\n\n```bash\n# 仅当匹配度≥0.8时才使用技能，否则回退到多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg 0.8\n```\n\n#### 不使用图片（纯文本意图查询）\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\"\n```\n\n#### 返回格式\n\n```json\n{\n  \"success\": true,\n  \"mode\": \"skill\",\n  \"epId\": \"ep-public-xxxxx\",\n  \"skillName\": \"人员摔倒检测\",\n  \"confidence\": 0.92,\n  \"count\": 1,\n  \"detections\": [\n    {\n      \"bbox\": [100, 200, 50, 80],\n      \"category\": \"falling_person\",\n      \"confidence\": 0.94\n    }\n  ]\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `success` | boolean | 调用是否成功 |\n| `mode` | string | `\"skill\"` / `\"workspace-search\"` / `\"multimodal\"`，表示使用的推理模式 |\n| `epId` | string \\| null | 技能ID（技能模式时有值） |\n| `skillName` | string \\| null | 技能名称（技能模式时有值） |\n| `confidence` | number \\| null | 技能匹配置信度（0-1） |\n| `count` | number | 检测到的目标数量 |\n| `detections` | array | 检测结果数组 |\n\n**模式说明：**\n- `\"mode\": \"skill\"` - 使用了百度一见平台的专业技能，精度高、成本低\n- `\"mode\": \"workspace-search\"` - 公共技能无匹配，返回私有工作空间技能列表供选择\n- `\"mode\": \"multimodal\"` - 使用了多模态大模型直接推理，通用性强、无需预设技能\n\n### 查询技能\n\n**查询公共技能**（按意图匹配）：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/list.mjs \"人员检测\"\n```\n\n**查询私有工作空间技能**（按 API Key 关联，缓存1小时）：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/workspace.mjs list-skills\n```\n\n返回技能列表（含 epId、名称和描述）。当公共技能匹配不到时，从私有列表中选择最匹配的技能，用 `invoke.mjs` 调用：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-wsnyqcdj-0xdpgbt4\n```\n\n### 直接调用技能（已知技能ID）\n\n**当你已经知道具体的技能 ID 时**，可以直接调用：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n#### ROI（电子围栏）参数格式\n\nROI 用于限定检测区域。**必须包含 `id`、`name`、`kind`、`points` 四个字段，缺一不可**，否则 API 返回 500 错误。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"zone\",\n  \"kind\": \"ROI\",\n  \"points\": [x1,y1, x2,y2, x3,y3, x4,y4]\n}\n```\n\n- `id` — 任意字符串标识（如 `\"1\"`）\n- `name` — 区域名称（如 `\"zone\"`、`\"doorway\"`）\n- `kind` — 固定值 `\"ROI\"`\n- `points` — 顶点坐标数组，按顺时针/逆时针顺序排列，每对 `[x,y]` 为一个顶点\n\n#### 绊线（Tripwire）参数格式\n\n绊线用于检测穿越事件。**必须包含 `id`、`name`、`kind`、`points`、`direction` 五个字段**。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"line\",\n  \"kind\": \"TripWire\",\n  \"points\": [p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p4_x,p4_y],\n  \"direction\": \"Forward\"\n}\n```\n\n- `id` — 任意字符串标识\n- `name` — 绊线名称\n- `kind` — 固定值 `\"TripWire\"`\n- `points` — 4 个点（8 个数值）：p1→p2 为主线，p3→p4 为 A/B 区域标记\n- `direction` — 检测方向：`\"Forward\"` | `\"Backward\"` | `\"TwoWay\"`\n\n> **绊线不会自动生成**，必须由用户指定。详见 [绊线工作流](./tripwire-workflow.md)。\n\n**调用带 ROI 的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[100,100,500,100,500,400,100,400]}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n**调用带绊线的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[0,540,1920,540,0,500,1920,500],\"direction\":\"Forward\"}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n### 定义检测区域\n\n**需要定义电子围栏（ROI，又叫感兴趣区域）或绊线（Tripwire，又叫检测线）？**\n\n- **[ROI 工作流](./roi-workflow.md)** — 创建电子围栏，仅在指定区域检测\n- **[绊线工作流](./tripwire-workflow.md)** — 绘制检测线，统计穿越事件\n\n两个工作流都包含完整的交互步骤和示例对话。\n\n**预览 ROI/绊线** — 在调用前在图像上预览：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs photo.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"zone\",\"points\":[...]}]'\n```\n\n**生成网格** — 帮助用户使用网格坐标指定点位置：\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/show-grid.mjs photo.jpg grid.png\n```\n\n### 查看完整文档\n\n- **[类型定义](./types-guide.md)** — 检测（Detection），图像（Image）、电子围栏（ROI）、绊线（Tripwire）等数据结构\n- **[网格输入系统](./grid-guide.md)** — 使用网格坐标指定点\n\n### 高级：视频帧处理和跟踪\n\n**场景：** 处理 30 秒监控视频，逐帧检测和跟踪人员。\n\n```bash\n# 第 1 步：提取帧\nffmpeg -i surveillance_30sec.mp4 -vf fps=1 frames/frame_%04d.jpg\n\n# 第 2 步：计算 sourceId（视频标识符）\nsourceId=$(head -c 65536 surveillance_30sec.mp4 | md5sum | awk '{print substr($1, 1, 16)}')\n\n# 第 3 步：处理每个帧并跟踪\nfor frame_file in frames/frame_*.jpg; do\n  frame_num=$(basename \"$frame_file\" | grep -oE '[0-9]+' | head -1)\n  frame_index=$((10#$frame_num - 1))\n  timestamp=$((frame_index * 1000))\n  imageId=\"frame_$(printf '%04d' \"$frame_num\")\"\n\n  # 使用意图驱动调用\n  result=$(node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员\" \"$frame_file\")\n\n  detections=$(echo \"$result\" | jq '.detections')\n  echo \"$detections\" > \"results/${imageId}_detections.json\"\ndone\n```\n\nFile v0.9.39:_meta.json\n\n{\n  \"ownerId\": \"kn7aw0s517ypj0hstj91qr6nxs82r2xy\",\n  \"slug\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.39\",\n  \"publishedAt\": 1777370616396\n}\n\nFile v0.9.39:grid-guide.md\n\n# 基于网格的 ROI / 绊线输入指南\n\n## 概述\n\n在命令行环境中手动指定 ROI 区域或绊线的确切像素坐标既繁琐又容易出错。基于网格的输入系统让你可以使用易于理解的网格坐标来代替。\n\n## 工作原理\n\n### 1. 生成网格参考图像\n\n```bash\nnode scripts/show-grid.mjs photo.jpg [output-path] [--cols N] [--rows N]\n```\n\n这会在你的图像上创建带标签的网格叠加层：\n\n```\n       A     B     C     D     E     F     G\n   0   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   1   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   2   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   3   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   4   ·─────·─────·─────·─────·─────·─────·\n```\n\n**输出**：\n- `photo_grid.png` - 网格参考图像\n- `photo_grid_metadata.json` - 坐标映射数据\n\n### 2. 查看并识别坐标\n\n查看网格图像并识别 ROI 或绊线的坐标：\n\n- **列**：A、B、C、D、...（从左到右）\n- **行**：0、1、2、3、...（从上到下）\n- **交点**：网格线交叉的位置（用点标记）\n\n### 3. 使用网格坐标指定\n\n告诉系统网格坐标：\n\n```\n用户：\"在 B1、E1、E3、B3 创建检测区域\"\n```\n\n系统自动转换为像素坐标：\n\n```\nB1 = (列B索引 × 网格宽度, 行1索引 × 网格高度)\nE1 = (列E索引 × 网格宽度, 行1索引 × 网格高度)\nE3 = (列E索引 × 网格宽度, 行3索引 × 网格高度)\nB3 = (列B索引 × 网格宽度, 行3索引 × 网格高度)\n```\n\n## 使用示例\n\n### 示例 1：定义检测区域（ROI）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs office.jpg\n\n# 查看网格图像以识别坐标，然后：\n用户：\"我想要一个办公桌区域的检测区域：B2、G2、G5、B5\"\n\n转换为 ROI：\n{\n  \"kind\": \"ROI\",\n  \"points\": [col_B, row_2, col_G, row_2, col_G, row_5, col_B, row_5]\n}\n\n# 使用 ROI 调用技能\n$ echo '{\"input0\":{\"image\":\"office.jpg\",\"roi\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-2403um2p\n```\n\n### 示例 2：定义穿越线（绊线）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs hallway.jpg\n\n# 查看网格图像，然后：\n用户：\"在走廊中创建一条从 A3 到 H3 的绊线，检测从左到右的穿越\"\n\n转换为绊线：\n{\n  \"kind\": \"TripWire\",\n  \"points\": [col_A, row_3, col_H, row_3],\n  \"direction\": \"Forward\"\n}\n\n# 使用绊线调用技能\n$ echo '{\"input0\":{\"image\":\"hallway.jpg\",\"tripwire\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-ywbjb7tm\n```\n\n### 示例 3：多个 ROI\n\n```bash\n用户：\"我想要 3 个检测区域：入口（A1-C3）、中心（D1-F3）、出口（G1-H3）\"\n\n转换为三个 ROI 对象并作为 Array<ROI> 传递：\n[\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_A, row_1, col_C, row_1, col_C, row_3, col_A, row_3],\n    \"order\": 0\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_D, row_1, col_F, row_1, col_F, row_3, col_D, row_3],\n    \"order\": 1\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_G, row_1, col_H, row_1, col_H, row_3, col_G, row_3],\n    \"order\": 2\n  }\n]\n```\n\n## 网格算法\n\n网格大小会自动计算：\n\n- **目标**：约 30-42 个交点，大致为方形单元\n- **横向图像**（1920×1080）：7 列 × 4 行\n- **纵向图像**（1080×1920）：4 列 × 7 行\n- **方形图像**（800×800）：5 列 × 5 行\n\n**手动覆盖**：\n```bash\nnode scripts/show-grid.mjs photo.jpg --cols 10 --rows 6\n```\n\n## 命令参考\n\n### 生成网格\n\n```bash\nnode scripts/show-grid.mjs <input-image> [output-path] [--cols N] [--rows N]\n```\n\n**参数**：\n- `<input-image>` - 输入图像文件路径\n- `[output-path]` - 可选输出图像路径（默认：`<input>_grid.png`）\n- `--cols N` - 覆盖列数\n- `--rows N` - 覆盖行数\n\n**输出**：\n- 网格图像：`<output>.png`\n- 元数据 JSON：`<output>_metadata.json`\n\n### 使用网格坐标\n\n在指定坐标时：\n\n**有效格式**：\n- 单个点：`A1`\n- 序列：`A1、E1、E3、A3`（用于 ROI）\n- 线：`A2 → G2`（用于绊线，显示方向）\n\n**网格参考格式**：\n- 列：A-Z，然后是 AA-AZ 等\n- 行：0-9，然后是 10-99 等\n\n## 可视化\n\n### 查看网格图像\n\n生成网格后，系统应该显示网格图像以便你可以直观地识别坐标。\n\n### 调用前验证\n\n在用坐标调用技能之前：\n\n```bash\n# 在原始图像上可视化选定的 ROI/绊线\nnode scripts/visualize.mjs office.jpg '<roi-or-tripwire-json>' preview.jpg\n```\n\n这可帮助你在处理前验证坐标是否正确。\n\n## 提示和技巧\n\n1. **从简单开始**：在使用复杂多边形前先从简单的矩形 ROI 开始\n2. **使用均匀网格**：5×5 或 6×6 网格最容易参考\n3. **记录你的区域**：为每个 ROI 指定有意义的名称（例如\"入口\"、\"收银台\"）\n4. **重用坐标**：保存类似摄像机角度的坐标集\n5. **先测试**：在处理前始终用 `visualize.mjs` 预览\n\n## 故障排除\n\n**\"网格图像过于拥挤\"**\n- 降低网格密度：`--cols 4 --rows 4`\n- 如果可能，增大图像大小\n\n**\"看不清网格线\"**\n- 网格使用半透明白色线条（50% 不透明度）\n- 放大网格图像以获得更好的可见性\n\n**\"坐标似乎不对\"**\n- 验证列/行顺序（列 A-Z 从左到右，行 0-N 从上到下）\n- 检查第一个点和最后一个点是否不同（多边形必须闭合）\n- 确保点的顺序一致（全部顺时针或全部逆时针）\n\n**\"网格不适合图像\"**\n- 非常宽或非常高的图像可能有不均匀的单元格\n- 使用 `--cols` 和 `--rows` 强制指定特定的网格尺寸\n\n## 参考\n\n- [类型定义](./types-guide.md) - ROI 和绊线类型规范\n- [SKILL.md](./SKILL.md) - 主技能指南\n\nFile v0.9.39:roi-workflow.md\n\n# ROI（关注区域）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为对象检测定义 ROI（关注区域）时，遵循此交互工作流。\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n向用户显示网格图像并解释行和列标签。\n\n### 第 2 步：询问 ROI 目的\n\n\"你想在这个区域检测什么？例如：\n- 进入收银区域的人员\n- 停车场中的车辆\n- 货架上的产品\"\n\n### 第 3 步：用户指定顶点\n\n用户根据网格标签指定角。\n\n**矩形 ROI 示例：**\n- 用户：\"从 B2 到 G5\"\n- 转换为 4 个顶点：[B2、G2、G5、B5]\n\n### 第 4 步：验证顶点顺序\n\n\"这些点是否围绕周边形成闭合多边形？（顺时针或逆时针）\"\n\n### 第 5 步：预览 ROI\n\n```bash\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"test\",\"points\":[x1,y1,x2,y2,x3,y3,x4,y4]}]'\n```\n\n### 第 6 步：用户确认\n\n\"ROI 位置是否正确？\"\n\n### 第 7 步：调用技能\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[...]}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n> **重要：** 自定义 ROI 必须通过 `invoke.mjs` 传入。不要使用 `intent-invoke.mjs`，因为它会自动添加全图 ROI 覆盖掉你的自定义区域。\n\n---\n\n## 常见错误\n\n❌ 不要假设矩形 ROI\n✅ 支持任意多边形\n\n❌ 不要允许无序的顶点\n✅ 顶点必须按顺序排列\n\n❌ 不要跳过预览验证\n✅ 始终显示预览图像以确认\n\n---\n\n## 完整对话示例\n\n### 示例 1：矩形入口区域\n\n**用户**：\"我想检测进入办公室的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs office.jpg office-grid.png\n```\n2. 问：\"查看网格，入口大概在哪里？\"\n3. 用户：\"大约从 B1 到 G3\"\n4. 确认：\"所以顶点是 B1、G1、G3、B3，对吧？\"\n5. 用户：\"是的\"\n6. 预览 ROI\n7. 问：\"这个矩形是否覆盖了入口？\"\n8. 用户：\"完美！\"\n9. 调用技能进行检测\n\n### 示例 2：复杂多边形（L 形区域）\n\n**用户**：\"我需要监视 L 形存储区域\"\n\n**你**：\n1. 生成网格\n2. 问：\"使用网格坐标标记 L 形的所有角，从一个角开始\"\n3. 用户：\"从左上角开始：A2、E2、E4、D4、D6、A6\"\n4. 确认：\"这些点是否按顺序形成 L 形的边界？确认它关闭回 A2\"\n5. 用户：\"是的\"\n6. 预览 L 形多边形\n7. 验证没有自交\n8. 调用技能\n\n---\n\n## 数据结构\n\n详见 [types-guide.md](./types-guide.md) 了解完整的定义、子对象和示例。\n\nFile v0.9.39:tripwire-workflow.md\n\n# 绊线（检测线）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为穿越检测定义绊线时，遵循此交互工作流。\n\n## 核心概念\n\n- **p1→p2** 主检测线（用户定义，2 个点）\n- **p3→p4** A-B 区域标记（系统自动生成或用户定义）\n- **方向** Forward/Backward/TwoWay（要检测的方向）\n\n**自动生成过程**：用户只需指定 p1 和 p2 点。系统会自动生成垂直于主线的 p3 和 p4 点用于预览和确认。\n\n矢量穿越检测算法详情，见 [types-guide.md#tripwire](./types-guide.md#tripwire)\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n### 第 2 步：用户指定绊线\n\n\"查看网格，检测线应该在哪里？例如，从 B2 到 G2？\"\n\n### 第 3 步：预览绊线位置\n\n系统基于用户的 2 个点（p1、p2）生成完整的 4 点结构，然后调用 `visualize.mjs` 生成预览：\n\n```bash\n# 自动计算 4 个点后\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\n    \"kind\":\"TripWire\",\n    \"name\":\"tripwire preview\",\n    \"direction\":\"Forward\",\n    \"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y]\n  }]'\n```\n\n预览显示：\n- 主线（p1→p2）虚线 - 橙色\n- A/B 标记（p3→p4）虚线 - 橙色，带标签\n- 方向箭头 - Forward=绿色在 p4，Backward=红色在 p3\n\n### 第 4 步：确认 A/B 区域\n\n\"查看预览图像：\n- A 区在这一侧（例如线的上方）\n- B 区在那一侧（例如线的下方）\n- 绿色箭头显示 Forward 是 A→B\n\n这是否正确？\"\n\n### 第 5 步：选择方向模式\n\n用户看到预览后，提问：\n- Forward（相同方向）\n- Backward（相反方向）\n- TwoWay（检测两个方向）\n\n### 第 6 步：最终确认\n\n生成最终预览，用户确认，然后调用技能：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y],\"direction\":\"Forward\"}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n---\n\n## 常见错误\n\n❌ 不要在显示预览前解释 A/B\n✅ 用户必须看到带 A/B 标记标签的预览\n\n❌ 不要仅使用 2 个点\n✅ 始终提供 4 个点（主线 + A/B 标记）\n\n❌ 不要跳过预览验证\n✅ 始终显示预览以确认\n\n---\n\n## 完整对话示例\n\n**用户**：\"我需要检测进入门的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs door-camera.jpg door-grid.png\n```\n\n2. 问：\"查看网格，检测线应该在哪里？例如 B2 到 G2？\"\n\n3. 用户：\"是的，从 B2 到 G2 的线\"\n\n4. 生成显示绊线位置和 A/B 标记的预览：\n```bash\nnode scripts/visualize.mjs door-camera.jpg '[]' preview1.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"door\",\"direction\":\"Forward\",\"points\":[B2_x,B2_y,G2_x,G2_y,B1_x,B1_y,G3_x,G3_y]}]'\n```\n\n5. 解释：\"这是绊线预览：\n   - 区域 'A' 在线上方（外侧）\n   - 区域 'B' 在线下方（内侧）\n   - 绿色箭头显示 Forward 检测 A→B（从外侧进入）\n\n   你对这个设置满意吗？\"\n\n6. 用户：\"是的，我想检测进入（Forward）\"\n\n7. 生成最终预览以确认\n\n8. 调用技能进行检测\n\n---\n\n## 数据结构\n\n详见 [types-guide.md#tripwire](./types-guide.md#tripwire) 了解完整的定义、矢量算法和示例。\n\nFile v0.9.39:types-guide.md\n\n# 易见类型定义指南\n\n## 概述\n\n易见平台处理视觉信息并返回结构化数据。理解这些类型可帮助你有效地使用技能输入和输出。\n\n## 核心类型\n\n### 基本类型\n\n这些是在整个平台中使用的标量值。\n\n| 类型 | 描述 | 示例 |\n|------|------|------|\n| `String` | 文本数据 | `\"hello\"` |\n| `TemplateString` | 格式化文本 | `\"Result: {value}\"` |\n| `Integer` | 整数 | `42` |\n| `Double` | 浮点数 | `3.14` |\n| `Boolean` | 真/假 | `true` |\n| `Time` | 时间戳 | `\"2026-03-12T10:00:00Z\"` |\n\n### 复杂类型\n\n这些是包含视觉或检测信息的结构化对象。\n\n#### Detection（检测）\n\n表示图像中的检测对象。\n\n```json\n{\n  \"bbox\": [x, y, width, height],\n  \"confidence\": 0.94,\n  \"category\": {\n    \"id\": \"person\",\n    \"name\": \"人体\",\n    \"confidence\": 0.98\n  },\n  \"track_id\": 1,\n  \"ocr\": null,\n  \"keypoints\": null\n}\n```\n\n**字段**：\n- `bbox` - 边框 [x, y, width, height]（像素坐标）\n- `confidence` - 检测置信度（0-1）\n- `category` - 对象分类，包含 id、name、confidence\n- `track_id` - 跟踪 ID（用于帧间跟踪，可选）\n- `ocr` - 文本识别结果（可选）\n- `keypoints` - 姿态/骨骼关键点（可选）\n\n#### TrackDetection（跟踪检测）\n\n与 `Detection` 相同，但用于视频帧间的时间跟踪。\n\n#### Attribute（属性）\n\n表示图像中检测到的属性或属性。\n\n```json\n{\n  \"attribute\": \"age\",\n  \"answer\": \"adult\",\n  \"confidence\": 0.87\n}\n```\n\n**字段**：\n- `attribute` - 属性名称（例如\"age\"、\"gender\"、\"expression\"）\n- `answer` - 属性值\n- `confidence` - 置信度分数\n\n#### Image（图像）\n\n表示技能的视觉输入。\n\n```json\n{\n  \"imageData\": \"base64-encoded-image-data\",\n  \"imageWidth\": 1920,\n  \"imageHeight\": 1080,\n  \"sourceId\": \"abc123def456\",\n  \"imageId\": \"img001\",\n  \"timestamp\": 1705056000000\n}\n```\n\n**字段**：\n- `imageData` - Base64 编码的图像字节（从文件路径自动编码）\n- `imageWidth` - 图像宽度（像素）\n- `imageHeight` - 图像高度（像素）\n- `sourceId` - 源标识符，用于视频流（文件 MD5 哈希）\n- `imageId` - 唯一的图像标识符\n- `timestamp` - 帧时间戳（毫秒）\n\n#### ROI（关注区域 / 电子围栏）\n\n定义用于分析的多边形区域。\n\n**完整工作流：** 见 [roi-workflow.md](./roi-workflow.md)\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"entrance\",\n  \"points\": [x1, y1, x2, y2, x3, y3, x4, y4]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"ROI\"\n- `name` - 区域描述名称（可选）\n- `points` - 多边形顶点坐标数组，按顺序排列：`[x1,y1, x2,y2, x3,y3, ...]`\n\n**示例**:\n\n**矩形ROI - 收银区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"checkout-zone\",\n  \"points\": [100, 100, 300, 100, 300, 250, 100, 250]\n}\n```\n\n**多边形ROI - L形仓库区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"warehouse-l-zone\",\n  \"points\": [100, 100, 400, 100, 400, 200, 300, 200, 300, 350, 100, 350]\n}\n```\n\n**网格坐标输入**:\n使用 `show-grid.mjs` 生成的网格坐标：\n```\nB1, E1, E3, B3  →  自动转换为像素坐标\n```\n\n#### Tripwire（绊线 / 穿越检测线）\n\n定义用于穿越事件的检测线。\n\n**完整工作流：** 见 [tripwire-workflow.md](./tripwire-workflow.md)\n\n**核心概念 - 向量点乘法则**:\n\n绊线穿越检测使用向量点乘：\n\n1. **绊线向量** = p1 → p2 方向\n2. **运动向量** = 前一帧到当前帧的对象移动\n3. **点乘计算**：`dot = V_line.x * V_motion.x + V_line.y * V_motion.y`\n4. **穿越判定**：\n   - `dot > 0` → 正向穿越（Forward，A→B）\n   - `dot < 0` → 反向穿越（Backward，B→A）\n   - TwoWay: 两个方向都检测\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"TripWire\"\n- `name` - 检测线描述名称（可选）\n- `direction` - \"Forward\" | \"Backward\" | \"TwoWay\"\n- `points` - 8元素数组：\n  - p1, p2: 主检测线（用户指定）\n  - p3, p4: A-B区域标记（标识穿越方向）\n\n**自动生成A-B点**:\n\n用户可以只提供 **2个点**（p1, p2 主检测线），系统会自动生成 **p3, p4**（A-B区域标记）：\n\n1. **输入**: 用户给出2个点 `[p1_x, p1_y, p2_x, p2_y]`\n2. **自动计算**:\n   ```\n   dx, dy = 主线方向向量 (p2 - p1)\n   perpX, perpY = 旋转90度得到垂直向量\n   distance = 30px (默认)\n   p3 = p1 + perp * distance  (A区域标记)\n   p4 = p2 + perp * distance  (B区域标记)\n   ```\n3. **结果**: 自动补全为完整的4点结构 `[p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]`\n4. **生成预览图**: 使用 `visualize.mjs` 将Tripwire可视化\n   ```bash\n   node scripts/visualize.mjs <image> '[]' preview.png \\\n     --overlays '[{\n       \"kind\": \"TripWire\",\n       \"name\": \"绊线预览\",\n       \"direction\": \"Forward\",\n       \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n     }]'\n   ```\n   输出：`preview.png` 显示绊线虚线、A/B标记、方向箭头\n5. **用户确认**: 显示预览图让用户确认：\n   - A/B区域位置是否正确\n   - 方向箭头是否指向期望方向\n   - 绊线是否跨越检测区域\n\n**示例**:\n\n用户输入：`[150, 100, 150, 300]` (竖直线)\n系统自动生成：`[150, 100, 150, 300, 120, 100, 120, 300]` (左偏30px)\n生成预览：\n```bash\nnode scripts/visualize.mjs door.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"门\",\"direction\":\"Forward\",\"points\":[150,100,150,300,120,100,120,300]}]'\n```\n用户看预览图确认A(左)→B(右)方向是否符合预期\n\n**结构可视化**:\n```\np1 --------> p2  (主检测线，p1→p2)\n ^            ^\n |            |\np3           p4  (A-B区域标记)\n\n• Forward: 检测p3→p4方向的穿越（A→B）\n• Backward: 检测p4→p3方向的穿越（B→A）\n• TwoWay: 双向都检测\n```\n\n**方向可视化**:\n- **Forward** - 绿色箭头在p4，表示A→B方向\n- **Backward** - 红色箭头在p3，表示B→A方向\n- **TwoWay** - 蓝色箭头在p3和p4，表示双向\n\n**示例**:\n\n**垂直检测线 - 人员进出统计**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [150, 100, 150, 300, 130, 100, 170, 300]\n}\n```\n\n说明：\n- p1(150,100) → p2(150,300): 竖直线\n- p3(130,100) → p4(170,300): A-B标记（左右偏移30px）\n- Forward: 只检测从左→右的穿越\n\n**水平检测线 - 考勤打卡**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"checkin-line\",\n  \"direction\": \"TwoWay\",\n  \"points\": [100, 200, 400, 200, 100, 180, 400, 220]\n}\n```\n\n说明：\n- p1(100,200) → p2(400,200): 水平线\n- p3(100,180) → p4(400,220): A-B标记（上下偏移20px）\n- TwoWay: 双向都统计\n\n### 数组类型\n\n任何类型都可以包装在数组中：\n\n```json\n{\n  \"type\": \"Array<Detection>\",\n  \"example\": [\n    { \"bbox\": [...], \"confidence\": 0.9, ... },\n    { \"bbox\": [...], \"confidence\": 0.85, ... }\n  ]\n}\n```\n\n常见数组：\n- `Array<Detection>` - 多个检测对象\n- `Array<TrackDetection>` - 帧间跟踪的对象\n- `Array<Attribute>` - 多个属性结果\n- `Array<ROI>` - 多个区域\n- `Array<Tripwire>` - 多条检测线\n\n## 可视化和交互\n\n### 检测可视化\n\n使用 `visualize.mjs` 在图像上可视化检测结果：\n\n```bash\nnode scripts/visualize.mjs photo.jpg '<detection-json>' output.jpg\n```\n\n**支持**：\n- 带置信度分数的边框\n- 类别标签\n- 用于跟踪可视化的跟踪 ID\n- 叠加层（ROI 区域、绊线线条）\n- 文本注释\n\n### ROI/绊线输入\n\n用于区域和障碍的交互式输入：\n\n1. 生成网格参考图像：\n   ```bash\n   node scripts/show-grid.mjs photo.jpg\n   ```\n\n2. 使用网格参考指定坐标：\n   ```\n   ROI: B1, E1, E3, B3\n   Tripwire: A2 → G2 (direction: Forward)\n   ```\n\n3. 网格坐标自动转换为像素坐标\n\n详见 [grid-guide.md](./grid-guide.md)。\n\n## 视频帧提取\n\n用于视频帧提取和多帧分析：\n\n```json\n{\n  \"imageData\": \"base64-frame-data\",\n  \"sourceId\": \"video_abc123\",        // 每个视频源唯一\n  \"imageId\": \"frame_001\",             // 每帧唯一\n  \"timestamp\": 1705056000000          // 帧时间戳，单位毫秒\n}\n```\n\n**sourceId 计算**:\n```\nsourceId = MD5(视频文件的前 64KB) → 16 字符十六进制字符串\n```\n\n**timestamp 计算**:\n```\ntimestamp = 帧索引 * 1000 / 帧率\n```\n\n详见 [video-guide.md](./video-guide.md)。\n\n## 类型转换\n\n### 输入转换\n\n当将文件作为 `Image` 类型传递时：\n\n```bash\n# 文件路径自动转换为 base64\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node invoke.mjs ep-detect\n```\n\n### 输出解析\n\n检测结果会自动解析：\n\n```javascript\n// 原始输出\n{ \"detections\": \"[{\\\"bbox\\\": [...]}]\" }\n\n// 解析后的输出\n{ \"detections\": [{ \"bbox\": [...] }] }  // JSON 数组，可以直接使用\n```\n\n## 最佳实践\n\n1. **始终验证边框** - 确保坐标在图像边界内\n2. **使用 track_id 以保持连续性** - 跟踪帧间的对象以获得更好的结果\n3. **有效组合类型** - 使用 ROI 限制检测区域\n4. **时间戳精度** - 为视频分析维持一致的时间戳计算\n5. **sourceId 一致性** - 为来自同一源的所有帧保持 sourceId 常数\n\n## 故障排除\n\n**\"无效的检测\"**\n- 检查边框格式：[x, y, width, height]\n- 验证坐标为非负数\n- 确保框在图像边界内\n\n**\"缺少关键点\"**\n- 并非所有技能都支持关键点\n- 检查技能文档以了解支持的输出\n\n**\"ROI 未被识别\"**\n- 验证多边形是否闭合（第一个点 ≠ 最后一个点）\n- 确保至少有 3 个点\n- 检查点的顺序是否正确（顺时针或逆时针）\n\n**\"sourceId 不匹配\"**\n- 如果视频文件改变，重新计算 sourceId\n- 对来自同一源的所有帧使用相同的 sourceId\n\nFile v0.9.39:package.json\n\n{\n  \"name\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.39\",\n  \"description\": \"Baidu Yijian Vision Skill - Intent-driven visual analysis with automatic skill routing\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"engines\": {\n    \"node\": \">=16.0.0\",\n    \"npm\": \">=8.0.0\"\n  },\n  \"scripts\": {\n    \"pack\": \"node scripts/pack.mjs\",\n    \"publish:clawhub\": \"node scripts/publish.mjs\",\n    \"publish:dry-run\": \"node scripts/publish.mjs --dry-run\",\n    \"test\": \"node --test 'tests/*.test.mjs'\",\n    \"test:integration\": \"node tests/run-integration.mjs --skip-e2e\",\n    \"test:integration:all\": \"node tests/run-integration.mjs\",\n    \"test:integration:e2e\": \"node tests/run-integration.mjs --e2e\",\n    \"test:integration:agent\": \"node tests/run-integration.mjs --agent\",\n    \"test:integration:docker\": \"node tests/run-docker.mjs\",\n    \"test:all\": \"npm test && npm run test:integration\"\n  },\n  \"devDependencies\": {\n    \"archiver\": \"^7.0.1\",\n    \"openclaw\": \"github:openclaw/openclaw#main\"\n  },\n  \"optionalDependencies\": {\n    \"sharp\": \"^0.33.0\"\n  }\n}\n\nArchive v0.9.38: 18 files, 42086 bytes\n\nFiles: grid-guide.md (6164b), package.json (1018b), roi-workflow.md (2693b), scripts/cache.mjs (1004b), scripts/intent-invoke.mjs (4584b), scripts/invoke.mjs (6357b), scripts/list.mjs (1590b), scripts/multimodal.mjs (2421b), scripts/query.mjs (2536b), scripts/show-grid.mjs (8345b), scripts/types.mjs (19515b), scripts/utils.mjs (2448b), scripts/visualize.mjs (20422b), scripts/workspace.mjs (4915b), SKILL.md (14031b), tripwire-workflow.md (3411b), types-guide.md (9811b), _meta.json (139b)\n\nFile v0.9.38:SKILL.md\n\n---\nname: baidu-yijian-vision\ndescription: \"Yijian (一见) is Baidu's specialized visual AI skill for image and video analysis. yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision. 百度一见视觉技能（Baidu Yijian Vision Skill）- 可用于分析图片和视频。相比通用基模，在维持 95%+ 专业精度的同时，推理成本降低 50% 以上，是处理视觉巡检与监控分析任务的首选工具。主打 安全管理、SOP合规、工业质检、商业运营与物料盘点。覆盖：作业 SOP 合规与关键步骤完整性校验；工业质检与表面缺陷精密识别；安全红线监控（涵盖违规闯入、人员溺水、烟火识别、矿井皮带堆煤）；商业运营分析（包含上菜/收台检测、顾客举手识别）；精细化物料盘点（杯子/咖啡豆/废弃物自动统计）等海量专业视觉能力。\"\nallowed-tools: Bash, Read, Write, Edit\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\",\"npm\"],\"env\":[\"YIJIAN_API_KEY\"]},\"primaryEnv\":\"YIJIAN_API_KEY\"}}\n---\n\n# 百度一见视觉技能（Baidu Yijian Vision Skill）\n\n> **Baidu Yijian Vision Skill** - baidu yijian vision skill for image/video analysis, object detection, safety monitoring, and industrial inspection.\n\n## ⚠️ 必需条件\n\n**此工具需要以下条件才能运行：**\n\n1. **YIJIAN_API_KEY 环境变量**（必需）- 从[百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)获取\n2. **Node.js >= 16.0.0** - 本工具依赖 Node.js 运行时\n3. **npm >= 8.0.0** - 用于依赖管理和安装\n\n**确保上述条件满足后再使用此工具。**\n\n---\n\n> **🔒 客户端工具 - 这是一个本地工具，用于与百度一见（Baidu Yijian）平台交互。所有数据处理遵循安全协议。**\n\n## 🎯 此工具的功能\n\n百度一见（[yijian-next.cloud.baidu.com](https://yijian-next.cloud.baidu.com)）是百度（Baidu）的视觉（vision）理解平台。此工具使你能够：\n\n- **意图自动匹配** - 通过自然语言描述自动匹配最佳技能\n- **智能路由** - 高置信度匹配时调用专业视觉技能，低置信度时自动回退到多模态推理\n- **直接技能调用** - 已知技能ID时可直接调用\n- **可视化结果** - 绘制边框、生成网格参考、预览 ROI/绊线\n- **定义检测区域** - 使用交互式工作流定义 ROI（电子围栏）或绊线（检测线）\n\n**支持的检测类型：** 人员检测、行人计数、车辆识别、OCR、姿态估计、目标跟踪等。\n\n## 📋 快速开始\n\n### 系统要求\n\n- **Node.js** >= 16.0.0\n- **npm** >= 8.0.0\n- **YIJIAN_API_KEY** 环境变量\n\n## 🔧 前置条件\n\n### 获取 API Key\n\n1. 登录 [百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)\n2. 激活试用包\n3. 生成 API Key（百度一见平台 → 系统管理 → 安全认证 → API Key）\n\n### 配置环境\n\n设置环境变量：\n\n```\nYIJIAN_API_KEY=your-api-key\n```\n\n## 📚 使用指南\n\n### 意图驱动工作流（推荐）\n\n**当你描述需求但不确定用哪个技能时**，系统会自动匹配最佳技能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg\n```\n\n系统会自动：\n1. 查询一见平台，根据意图匹配公共技能列表\n2. 如果匹配置信度 ≥ 0.7，调用对应的专业技能（自动添加全图 ROI）\n3. 如果公共技能无匹配或调用失败，搜索私有工作空间技能（由你从列表中选择最匹配的技能，再用 invoke 调用）\n4. 如果私有空间也无合适技能，自动回退到多模态直接推理\n\n> **自动 ROI：** 当用户未提供 ROI 时，系统会自动生成覆盖整张图片的 ROI。如需指定检测区域，请使用 `invoke.mjs` 传入自定义 ROI。\n\n#### 自定义置信度阈值\n\n```bash\n# 仅当匹配度≥0.8时才使用技能，否则回退到多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg 0.8\n```\n\n#### 不使用图片（纯文本意图查询）\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\"\n```\n\n#### 返回格式\n\n```json\n{\n  \"success\": true,\n  \"mode\": \"skill\",\n  \"epId\": \"ep-public-xxxxx\",\n  \"skillName\": \"人员摔倒检测\",\n  \"confidence\": 0.92,\n  \"count\": 1,\n  \"detections\": [\n    {\n      \"bbox\": [100, 200, 50, 80],\n      \"category\": \"falling_person\",\n      \"confidence\": 0.94\n    }\n  ]\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `success` | boolean | 调用是否成功 |\n| `mode` | string | `\"skill\"` 或 `\"multimodal\"`，表示使用的推理模式 |\n| `epId` | string \\| null | 技能ID（技能模式时有值） |\n| `skillName` | string \\| null | 技能名称（技能模式时有值） |\n| `confidence` | number \\| null | 技能匹配置信度（0-1） |\n| `count` | number | 检测到的目标数量 |\n| `detections` | array | 检测结果数组 |\n\n**模式说明：**\n- `\"mode\": \"skill\"` - 使用了百度一见平台的专业技能，精度高、成本低\n- `\"mode\": \"multimodal\"` - 使用了多模态大模型直接推理，通用性强、无需预设技能\n\n### 查询私有工作空间技能\n\n当公共技能匹配不到或调用失败时，可以搜索你私有工作空间中的技能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/workspace.mjs list-skills\n```\n\n返回你默认工作空间中所有已发布的技能列表（含 epId、名称和描述）。列表会本地缓存1小时。\n\n**使用流程：**\n1. 运行 `list-skills` 获取私有技能列表\n2. 根据用户意图，从列表中选择最匹配的技能\n3. 用选中的 epId 调用 `invoke.mjs` 执行技能\n4. 如果私有空间也无合适技能，走 multimodal 多模态推理\n\n```bash\n# 第1步：获取私有技能列表\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/workspace.mjs list-skills\n\n# 第2步：选择匹配的技能并调用\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-wsnyqcdj-0xdpgbt4\n```\n\n> **注意：** 私有技能列表按 API Key 关联，1小时内自动刷新缓存，无需频繁调用。\n\n### 查询可用技能\n\n如果你想了解有哪些技能可以匹配你的意图：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/list.mjs \"人员检测\"\n```\n\n这会返回匹配的技能列表及其置信度。\n\n### 直接调用技能（已知技能ID）\n\n**当你已经知道具体的技能 ID 时**，可以直接调用：\n\n```bash\n# 调用指定技能（从stdin读取输入）\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy -\n\n# 或者直接作为参数\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n#### ROI（电子围栏）参数格式\n\nROI 用于限定检测区域。**必须包含 `id`、`name`、`kind`、`points` 四个字段，缺一不可**，否则 API 返回 500 错误。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"zone\",\n  \"kind\": \"ROI\",\n  \"points\": [x1,y1, x2,y2, x3,y3, x4,y4]\n}\n```\n\n- `id` — 任意字符串标识（如 `\"1\"`）\n- `name` — 区域名称（如 `\"zone\"`、`\"doorway\"`）\n- `kind` — 固定值 `\"ROI\"`\n- `points` — 顶点坐标数组，按顺时针/逆时针顺序排列，每对 `[x,y]` 为一个顶点\n\n> **自动 ROI：** 如果不传 `roi` 参数，`invoke.mjs` 会自动生成覆盖全图的 ROI。\n\n#### 绊线（Tripwire）参数格式\n\n绊线用于检测穿越事件。**必须包含 `id`、`name`、`kind`、`points`、`direction` 五个字段**。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"line\",\n  \"kind\": \"TripWire\",\n  \"points\": [p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p4_x,p4_y],\n  \"direction\": \"Forward\"\n}\n```\n\n- `id` — 任意字符串标识\n- `name` — 绊线名称\n- `kind` — 固定值 `\"TripWire\"`\n- `points` — 4 个点（8 个数值）：p1→p2 为主线，p3→p4 为 A/B 区域标记\n- `direction` — 检测方向：`\"Forward\"` | `\"Backward\"` | `\"TwoWay\"`\n\n> **绊线不会自动生成**，必须由用户指定。详见 [绊线工作流](./tripwire-workflow.md)。\n\n**调用带 ROI 的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[100,100,500,100,500,400,100,400]}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n**调用带绊线的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[0,540,1920,540,0,500,1920,500],\"direction\":\"Forward\"}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n### 测试 Query 接口\n\n如果你想单独测试意图匹配功能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/query.mjs \"检测人员摔倒\"\n```\n\n返回匹配的技能列表（JSON格式）。\n\n### 测试 Multimodal 接口\n\n如果你想单独测试多模态直接推理：\n\n```bash\n# 纯文本\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/multimodal.mjs \"描述这张图片\"\n\n# 带图片URL\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/multimodal.mjs \"描述这张图片\" \"http://example.com/image.jpg\"\n```\n\n### 定义检测区域\n\n**需要定义电子围栏（ROI，又叫感兴趣区域）或绊线（Tripwire，又叫检测线）？**\n\n- **[ROI 工作流](./roi-workflow.md)** — 创建电子围栏，仅在指定区域检测\n- **[绊线工作流](./tripwire-workflow.md)** — 绘制检测线，统计穿越事件\n\n两个工作流都包含完整的交互步骤和示例对话。\n\n### 查看完整文档\n\n- **[类型定义](./types-guide.md)** — 检测（Detection），图像（Image）、电子围栏（ROI）、绊线（Tripwire）等数据结构\n- **[网格输入系统](./grid-guide.md)** — 使用网格坐标指定点\n\n## 💡 常见任务\n\n### 查询匹配的技能\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/list.mjs \"检测人员\"\n```\n\n### 意图驱动调用（自动路由）\n\n```bash\n# 系统会自动选择技能或多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员摔倒\" photo.jpg\n\n# 自定义阈值\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员摔倒\" photo.jpg 0.8\n```\n\n### 直接调用技能（已知技能ID）\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-public-xxxxx\n```\n\n### 预览 ROI/绊线\n\n在调用前在图像上预览：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs photo.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"zone\",\"points\":[...]}]'\n```\n\n### 生成网格\n\n帮助用户使用网格坐标指定点位置：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/show-grid.mjs photo.jpg grid.png\n```\n\n---\n\n## 📋 使用示例\n\n### 示例 1：意图驱动检测（推荐）\n\n**场景：** 你有一张监控画面图像，想检测是否有人摔倒，但不确定使用哪个技能。\n\n```bash\n# 使用意图驱动工作流，系统自动匹配最佳技能\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" surveillance.jpg\n\n# 返回结果包含检测到的目标\n# {\n#   \"success\": true,\n#   \"mode\": \"skill\",\n#   \"epId\": \"ep-public-inqm15aq\",\n#   \"skillName\": \"人员摔倒\",\n#   \"confidence\": 0.95,\n#   \"count\": 1,\n#   \"detections\": [...]\n# }\n```\n\n### 示例 2：传统直接调用（已知技能ID）\n\n**场景：** 你已经知道具体的技能 ID，直接调用。\n\n```bash\n# 第 1 步：调用指定技能\necho '{\"input0\":{\"image\":\"surveillance.jpg\"}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-public-inqm15aq -\n\n# 第 2 步：可视化结果\ndetections='[{\"bbox\":[150,200,80,180],\"confidence\":0.94,\"category\":{\"id\":\"person\",\"name\":\"人体\"}}]'\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs surveillance.jpg \"$detections\" output.jpg\n\n# 第 3 步：处理结果\necho \"$detections\" | jq 'length'  # 计数人数\n```\n\n### 示例 3：基于网格的 ROI 设置\n\n**场景：** 在走廊监控摄像机中计数进入特定房间的人员，使用 ROI 限制检测区域。\n\n```bash\n# 第 1 步：生成网格参考\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/show-grid.mjs hallway.jpg --cols 6 --rows 4\n\n# 第 2 步：根据网格识别坐标（B1, D1, D3, B3）并创建 ROI\n# 注意：ROI 必须包含 id 和 name 字段\n\n# 第 3 步：验证 ROI\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs hallway.jpg '[]' roi_preview.jpg \\\n  --overlays \"[{\\\"kind\\\":\\\"ROI\\\",\\\"name\\\":\\\"doorway\\\",\\\"points\\\":[320,270,960,270,960,810,320,810]}]\"\n\n# 第 4 步：使用 invoke.mjs 传入自定义 ROI（不要用 intent-invoke.mjs，它只会添加全图 ROI）\necho '{\"input0\":{\"image\":\"hallway.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"doorway\",\"kind\":\"ROI\",\"points\":[320,270,960,270,960,810,320,810]}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n### 示例 4：视频帧处理和跟踪\n\n**场景：** 处理 30 秒监控视频，逐帧检测和跟踪人员。\n\n```bash\n# 第 1 步：提取帧\nffmpeg -i surveillance_30sec.mp4 -vf fps=1 frames/frame_%04d.jpg\n\n# 第 2 步：计算 sourceId（视频标识符）\nsourceId=$(head -c 65536 surveillance_30sec.mp4 | md5sum | awk '{print substr($1, 1, 16)}')\n\n# 第 3 步：处理每个帧并跟踪\nfor frame_file in frames/frame_*.jpg; do\n  frame_num=$(basename \"$frame_file\" | grep -oE '[0-9]+' | head -1)\n  frame_index=$((10#$frame_num - 1))\n  timestamp=$((frame_index * 1000))\n  imageId=\"frame_$(printf '%04d' \"$frame_num\")\"\n\n  # 使用意图驱动调用\n  result=$(node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员\" \"$frame_file\")\n\n  detections=$(echo \"$result\" | jq '.detections')\n  echo \"$detections\" > \"results/${imageId}_detections.json\"\ndone\n```\n\n---\n\n**API Key 从 `YIJIAN_API_KEY` 环境变量读取。所有脚本将 JSON 输出到标准输出，错误输出到标准错误。**\n\nFile v0.9.38:_meta.json\n\n{\n  \"ownerId\": \"kn7aw0s517ypj0hstj91qr6nxs82r2xy\",\n  \"slug\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.38\",\n  \"publishedAt\": 1777275296542\n}\n\nFile v0.9.38:grid-guide.md\n\n# 基于网格的 ROI / 绊线输入指南\n\n## 概述\n\n在命令行环境中手动指定 ROI 区域或绊线的确切像素坐标既繁琐又容易出错。基于网格的输入系统让你可以使用易于理解的网格坐标来代替。\n\n## 工作原理\n\n### 1. 生成网格参考图像\n\n```bash\nnode scripts/show-grid.mjs photo.jpg [output-path] [--cols N] [--rows N]\n```\n\n这会在你的图像上创建带标签的网格叠加层：\n\n```\n       A     B     C     D     E     F     G\n   0   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   1   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   2   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   3   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   4   ·─────·─────·─────·─────·─────·─────·\n```\n\n**输出**：\n- `photo_grid.png` - 网格参考图像\n- `photo_grid_metadata.json` - 坐标映射数据\n\n### 2. 查看并识别坐标\n\n查看网格图像并识别 ROI 或绊线的坐标：\n\n- **列**：A、B、C、D、...（从左到右）\n- **行**：0、1、2、3、...（从上到下）\n- **交点**：网格线交叉的位置（用点标记）\n\n### 3. 使用网格坐标指定\n\n告诉系统网格坐标：\n\n```\n用户：\"在 B1、E1、E3、B3 创建检测区域\"\n```\n\n系统自动转换为像素坐标：\n\n```\nB1 = (列B索引 × 网格宽度, 行1索引 × 网格高度)\nE1 = (列E索引 × 网格宽度, 行1索引 × 网格高度)\nE3 = (列E索引 × 网格宽度, 行3索引 × 网格高度)\nB3 = (列B索引 × 网格宽度, 行3索引 × 网格高度)\n```\n\n## 使用示例\n\n### 示例 1：定义检测区域（ROI）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs office.jpg\n\n# 查看网格图像以识别坐标，然后：\n用户：\"我想要一个办公桌区域的检测区域：B2、G2、G5、B5\"\n\n转换为 ROI：\n{\n  \"kind\": \"ROI\",\n  \"points\": [col_B, row_2, col_G, row_2, col_G, row_5, col_B, row_5]\n}\n\n# 使用 ROI 调用技能\n$ echo '{\"input0\":{\"image\":\"office.jpg\",\"roi\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-2403um2p\n```\n\n### 示例 2：定义穿越线（绊线）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs hallway.jpg\n\n# 查看网格图像，然后：\n用户：\"在走廊中创建一条从 A3 到 H3 的绊线，检测从左到右的穿越\"\n\n转换为绊线：\n{\n  \"kind\": \"TripWire\",\n  \"points\": [col_A, row_3, col_H, row_3],\n  \"direction\": \"Forward\"\n}\n\n# 使用绊线调用技能\n$ echo '{\"input0\":{\"image\":\"hallway.jpg\",\"tripwire\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-ywbjb7tm\n```\n\n### 示例 3：多个 ROI\n\n```bash\n用户：\"我想要 3 个检测区域：入口（A1-C3）、中心（D1-F3）、出口（G1-H3）\"\n\n转换为三个 ROI 对象并作为 Array<ROI> 传递：\n[\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_A, row_1, col_C, row_1, col_C, row_3, col_A, row_3],\n    \"order\": 0\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_D, row_1, col_F, row_1, col_F, row_3, col_D, row_3],\n    \"order\": 1\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_G, row_1, col_H, row_1, col_H, row_3, col_G, row_3],\n    \"order\": 2\n  }\n]\n```\n\n## 网格算法\n\n网格大小会自动计算：\n\n- **目标**：约 30-42 个交点，大致为方形单元\n- **横向图像**（1920×1080）：7 列 × 4 行\n- **纵向图像**（1080×1920）：4 列 × 7 行\n- **方形图像**（800×800）：5 列 × 5 行\n\n**手动覆盖**：\n```bash\nnode scripts/show-grid.mjs photo.jpg --cols 10 --rows 6\n```\n\n## 命令参考\n\n### 生成网格\n\n```bash\nnode scripts/show-grid.mjs <input-image> [output-path] [--cols N] [--rows N]\n```\n\n**参数**：\n- `<input-image>` - 输入图像文件路径\n- `[output-path]` - 可选输出图像路径（默认：`<input>_grid.png`）\n- `--cols N` - 覆盖列数\n- `--rows N` - 覆盖行数\n\n**输出**：\n- 网格图像：`<output>.png`\n- 元数据 JSON：`<output>_metadata.json`\n\n### 使用网格坐标\n\n在指定坐标时：\n\n**有效格式**：\n- 单个点：`A1`\n- 序列：`A1、E1、E3、A3`（用于 ROI）\n- 线：`A2 → G2`（用于绊线，显示方向）\n\n**网格参考格式**：\n- 列：A-Z，然后是 AA-AZ 等\n- 行：0-9，然后是 10-99 等\n\n## 可视化\n\n### 查看网格图像\n\n生成网格后，系统应该显示网格图像以便你可以直观地识别坐标。\n\n### 调用前验证\n\n在用坐标调用技能之前：\n\n```bash\n# 在原始图像上可视化选定的 ROI/绊线\nnode scripts/visualize.mjs office.jpg '<roi-or-tripwire-json>' preview.jpg\n```\n\n这可帮助你在处理前验证坐标是否正确。\n\n## 提示和技巧\n\n1. **从简单开始**：在使用复杂多边形前先从简单的矩形 ROI 开始\n2. **使用均匀网格**：5×5 或 6×6 网格最容易参考\n3. **记录你的区域**：为每个 ROI 指定有意义的名称（例如\"入口\"、\"收银台\"）\n4. **重用坐标**：保存类似摄像机角度的坐标集\n5. **先测试**：在处理前始终用 `visualize.mjs` 预览\n\n## 故障排除\n\n**\"网格图像过于拥挤\"**\n- 降低网格密度：`--cols 4 --rows 4`\n- 如果可能，增大图像大小\n\n**\"看不清网格线\"**\n- 网格使用半透明白色线条（50% 不透明度）\n- 放大网格图像以获得更好的可见性\n\n**\"坐标似乎不对\"**\n- 验证列/行顺序（列 A-Z 从左到右，行 0-N 从上到下）\n- 检查第一个点和最后一个点是否不同（多边形必须闭合）\n- 确保点的顺序一致（全部顺时针或全部逆时针）\n\n**\"网格不适合图像\"**\n- 非常宽或非常高的图像可能有不均匀的单元格\n- 使用 `--cols` 和 `--rows` 强制指定特定的网格尺寸\n\n## 参考\n\n- [类型定义](./types-guide.md) - ROI 和绊线类型规范\n- [SKILL.md](./SKILL.md) - 主技能指南\n\nFile v0.9.38:roi-workflow.md\n\n# ROI（关注区域）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为对象检测定义 ROI（关注区域）时，遵循此交互工作流。\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n向用户显示网格图像并解释行和列标签。\n\n### 第 2 步：询问 ROI 目的\n\n\"你想在这个区域检测什么？例如：\n- 进入收银区域的人员\n- 停车场中的车辆\n- 货架上的产品\"\n\n### 第 3 步：用户指定顶点\n\n用户根据网格标签指定角。\n\n**矩形 ROI 示例：**\n- 用户：\"从 B2 到 G5\"\n- 转换为 4 个顶点：[B2、G2、G5、B5]\n\n### 第 4 步：验证顶点顺序\n\n\"这些点是否围绕周边形成闭合多边形？（顺时针或逆时针）\"\n\n### 第 5 步：预览 ROI\n\n```bash\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"test\",\"points\":[x1,y1,x2,y2,x3,y3,x4,y4]}]'\n```\n\n### 第 6 步：用户确认\n\n\"ROI 位置是否正确？\"\n\n### 第 7 步：调用技能\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[...]}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n> **重要：** 自定义 ROI 必须通过 `invoke.mjs` 传入。不要使用 `intent-invoke.mjs`，因为它会自动添加全图 ROI 覆盖掉你的自定义区域。\n\n---\n\n## 常见错误\n\n❌ 不要假设矩形 ROI\n✅ 支持任意多边形\n\n❌ 不要允许无序的顶点\n✅ 顶点必须按顺序排列\n\n❌ 不要跳过预览验证\n✅ 始终显示预览图像以确认\n\n---\n\n## 完整对话示例\n\n### 示例 1：矩形入口区域\n\n**用户**：\"我想检测进入办公室的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs office.jpg office-grid.png\n```\n2. 问：\"查看网格，入口大概在哪里？\"\n3. 用户：\"大约从 B1 到 G3\"\n4. 确认：\"所以顶点是 B1、G1、G3、B3，对吧？\"\n5. 用户：\"是的\"\n6. 预览 ROI\n7. 问：\"这个矩形是否覆盖了入口？\"\n8. 用户：\"完美！\"\n9. 调用技能进行检测\n\n### 示例 2：复杂多边形（L 形区域）\n\n**用户**：\"我需要监视 L 形存储区域\"\n\n**你**：\n1. 生成网格\n2. 问：\"使用网格坐标标记 L 形的所有角，从一个角开始\"\n3. 用户：\"从左上角开始：A2、E2、E4、D4、D6、A6\"\n4. 确认：\"这些点是否按顺序形成 L 形的边界？确认它关闭回 A2\"\n5. 用户：\"是的\"\n6. 预览 L 形多边形\n7. 验证没有自交\n8. 调用技能\n\n---\n\n## 数据结构\n\n详见 [types-guide.md](./types-guide.md) 了解完整的定义、子对象和示例。\n\nFile v0.9.38:tripwire-workflow.md\n\n# 绊线（检测线）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为穿越检测定义绊线时，遵循此交互工作流。\n\n## 核心概念\n\n- **p1→p2** 主检测线（用户定义，2 个点）\n- **p3→p4** A-B 区域标记（系统自动生成或用户定义）\n- **方向** Forward/Backward/TwoWay（要检测的方向）\n\n**自动生成过程**：用户只需指定 p1 和 p2 点。系统会自动生成垂直于主线的 p3 和 p4 点用于预览和确认。\n\n矢量穿越检测算法详情，见 [types-guide.md#tripwire](./types-guide.md#tripwire)\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n### 第 2 步：用户指定绊线\n\n\"查看网格，检测线应该在哪里？例如，从 B2 到 G2？\"\n\n### 第 3 步：预览绊线位置\n\n系统基于用户的 2 个点（p1、p2）生成完整的 4 点结构，然后调用 `visualize.mjs` 生成预览：\n\n```bash\n# 自动计算 4 个点后\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\n    \"kind\":\"TripWire\",\n    \"name\":\"tripwire preview\",\n    \"direction\":\"Forward\",\n    \"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y]\n  }]'\n```\n\n预览显示：\n- 主线（p1→p2）虚线 - 橙色\n- A/B 标记（p3→p4）虚线 - 橙色，带标签\n- 方向箭头 - Forward=绿色在 p4，Backward=红色在 p3\n\n### 第 4 步：确认 A/B 区域\n\n\"查看预览图像：\n- A 区在这一侧（例如线的上方）\n- B 区在那一侧（例如线的下方）\n- 绿色箭头显示 Forward 是 A→B\n\n这是否正确？\"\n\n### 第 5 步：选择方向模式\n\n用户看到预览后，提问：\n- Forward（相同方向）\n- Backward（相反方向）\n- TwoWay（检测两个方向）\n\n### 第 6 步：最终确认\n\n生成最终预览，用户确认，然后调用技能：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y],\"direction\":\"Forward\"}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n---\n\n## 常见错误\n\n❌ 不要在显示预览前解释 A/B\n✅ 用户必须看到带 A/B 标记标签的预览\n\n❌ 不要仅使用 2 个点\n✅ 始终提供 4 个点（主线 + A/B 标记）\n\n❌ 不要跳过预览验证\n✅ 始终显示预览以确认\n\n---\n\n## 完整对话示例\n\n**用户**：\"我需要检测进入门的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs door-camera.jpg door-grid.png\n```\n\n2. 问：\"查看网格，检测线应该在哪里？例如 B2 到 G2？\"\n\n3. 用户：\"是的，从 B2 到 G2 的线\"\n\n4. 生成显示绊线位置和 A/B 标记的预览：\n```bash\nnode scripts/visualize.mjs door-camera.jpg '[]' preview1.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"door\",\"direction\":\"Forward\",\"points\":[B2_x,B2_y,G2_x,G2_y,B1_x,B1_y,G3_x,G3_y]}]'\n```\n\n5. 解释：\"这是绊线预览：\n   - 区域 'A' 在线上方（外侧）\n   - 区域 'B' 在线下方（内侧）\n   - 绿色箭头显示 Forward 检测 A→B（从外侧进入）\n\n   你对这个设置满意吗？\"\n\n6. 用户：\"是的，我想检测进入（Forward）\"\n\n7. 生成最终预览以确认\n\n8. 调用技能进行检测\n\n---\n\n## 数据结构\n\n详见 [types-guide.md#tripwire](./types-guide.md#tripwire) 了解完整的定义、矢量算法和示例。\n\nFile v0.9.38:types-guide.md\n\n# 易见类型定义指南\n\n## 概述\n\n易见平台处理视觉信息并返回结构化数据。理解这些类型可帮助你有效地使用技能输入和输出。\n\n## 核心类型\n\n### 基本类型\n\n这些是在整个平台中使用的标量值。\n\n| 类型 | 描述 | 示例 |\n|------|------|------|\n| `String` | 文本数据 | `\"hello\"` |\n| `TemplateString` | 格式化文本 | `\"Result: {value}\"` |\n| `Integer` | 整数 | `42` |\n| `Double` | 浮点数 | `3.14` |\n| `Boolean` | 真/假 | `true` |\n| `Time` | 时间戳 | `\"2026-03-12T10:00:00Z\"` |\n\n### 复杂类型\n\n这些是包含视觉或检测信息的结构化对象。\n\n#### Detection（检测）\n\n表示图像中的检测对象。\n\n```json\n{\n  \"bbox\": [x, y, width, height],\n  \"confidence\": 0.94,\n  \"category\": {\n    \"id\": \"person\",\n    \"name\": \"人体\",\n    \"confidence\": 0.98\n  },\n  \"track_id\": 1,\n  \"ocr\": null,\n  \"keypoints\": null\n}\n```\n\n**字段**：\n- `bbox` - 边框 [x, y, width, height]（像素坐标）\n- `confidence` - 检测置信度（0-1）\n- `category` - 对象分类，包含 id、name、confidence\n- `track_id` - 跟踪 ID（用于帧间跟踪，可选）\n- `ocr` - 文本识别结果（可选）\n- `keypoints` - 姿态/骨骼关键点（可选）\n\n#### TrackDetection（跟踪检测）\n\n与 `Detection` 相同，但用于视频帧间的时间跟踪。\n\n#### Attribute（属性）\n\n表示图像中检测到的属性或属性。\n\n```json\n{\n  \"attribute\": \"age\",\n  \"answer\": \"adult\",\n  \"confidence\": 0.87\n}\n```\n\n**字段**：\n- `attribute` - 属性名称（例如\"age\"、\"gender\"、\"expression\"）\n- `answer` - 属性值\n- `confidence` - 置信度分数\n\n#### Image（图像）\n\n表示技能的视觉输入。\n\n```json\n{\n  \"imageData\": \"base64-encoded-image-data\",\n  \"imageWidth\": 1920,\n  \"imageHeight\": 1080,\n  \"sourceId\": \"abc123def456\",\n  \"imageId\": \"img001\",\n  \"timestamp\": 1705056000000\n}\n```\n\n**字段**：\n- `imageData` - Base64 编码的图像字节（从文件路径自动编码）\n- `imageWidth` - 图像宽度（像素）\n- `imageHeight` - 图像高度（像素）\n- `sourceId` - 源标识符，用于视频流（文件 MD5 哈希）\n- `imageId` - 唯一的图像标识符\n- `timestamp` - 帧时间戳（毫秒）\n\n#### ROI（关注区域 / 电子围栏）\n\n定义用于分析的多边形区域。\n\n**完整工作流：** 见 [roi-workflow.md](./roi-workflow.md)\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"entrance\",\n  \"points\": [x1, y1, x2, y2, x3, y3, x4, y4]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"ROI\"\n- `name` - 区域描述名称（可选）\n- `points` - 多边形顶点坐标数组，按顺序排列：`[x1,y1, x2,y2, x3,y3, ...]`\n\n**示例**:\n\n**矩形ROI - 收银区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"checkout-zone\",\n  \"points\": [100, 100, 300, 100, 300, 250, 100, 250]\n}\n```\n\n**多边形ROI - L形仓库区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"warehouse-l-zone\",\n  \"points\": [100, 100, 400, 100, 400, 200, 300, 200, 300, 350, 100, 350]\n}\n```\n\n**网格坐标输入**:\n使用 `show-grid.mjs` 生成的网格坐标：\n```\nB1, E1, E3, B3  →  自动转换为像素坐标\n```\n\n#### Tripwire（绊线 / 穿越检测线）\n\n定义用于穿越事件的检测线。\n\n**完整工作流：** 见 [tripwire-workflow.md](./tripwire-workflow.md)\n\n**核心概念 - 向量点乘法则**:\n\n绊线穿越检测使用向量点乘：\n\n1. **绊线向量** = p1 → p2 方向\n2. **运动向量** = 前一帧到当前帧的对象移动\n3. **点乘计算**：`dot = V_line.x * V_motion.x + V_line.y * V_motion.y`\n4. **穿越判定**：\n   - `dot > 0` → 正向穿越（Forward，A→B）\n   - `dot < 0` → 反向穿越（Backward，B→A）\n   - TwoWay: 两个方向都检测\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"TripWire\"\n- `name` - 检测线描述名称（可选）\n- `direction` - \"Forward\" | \"Backward\" | \"TwoWay\"\n- `points` - 8元素数组：\n  - p1, p2: 主检测线（用户指定）\n  - p3, p4: A-B区域标记（标识穿越方向）\n\n**自动生成A-B点**:\n\n用户可以只提供 **2个点**（p1, p2 主检测线），系统会自动生成 **p3, p4**（A-B区域标记）：\n\n1. **输入**: 用户给出2个点 `[p1_x, p1_y, p2_x, p2_y]`\n2. **自动计算**:\n   ```\n   dx, dy = 主线方向向量 (p2 - p1)\n   perpX, perpY = 旋转90度得到垂直向量\n   distance = 30px (默认)\n   p3 = p1 + perp * distance  (A区域标记)\n   p4 = p2 + perp * distance  (B区域标记)\n   ```\n3. **结果**: 自动补全为完整的4点结构 `[p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]`\n4. **生成预览图**: 使用 `visualize.mjs` 将Tripwire可视化\n   ```bash\n   node scripts/visualize.mjs <image> '[]' preview.png \\\n     --overlays '[{\n       \"kind\": \"TripWire\",\n       \"name\": \"绊线预览\",\n       \"direction\": \"Forward\",\n       \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n     }]'\n   ```\n   输出：`preview.png` 显示绊线虚线、A/B标记、方向箭头\n5. **用户确认**: 显示预览图让用户确认：\n   - A/B区域位置是否正确\n   - 方向箭头是否指向期望方向\n   - 绊线是否跨越检测区域\n\n**示例**:\n\n用户输入：`[150, 100, 150, 300]` (竖直线)\n系统自动生成：`[150, 100, 150, 300, 120, 100, 120, 300]` (左偏30px)\n生成预览：\n```bash\nnode scripts/visualize.mjs door.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"门\",\"direction\":\"Forward\",\"points\":[150,100,150,300,120,100,120,300]}]'\n```\n用户看预览图确认A(左)→B(右)方向是否符合预期\n\n**结构可视化**:\n```\np1 --------> p2  (主检测线，p1→p2)\n ^            ^\n |            |\np3           p4  (A-B区域标记)\n\n• Forward: 检测p3→p4方向的穿越（A→B）\n• Backward: 检测p4→p3方向的穿越（B→A）\n• TwoWay: 双向都检测\n```\n\n**方向可视化**:\n- **Forward** - 绿色箭头在p4，表示A→B方向\n- **Backward** - 红色箭头在p3，表示B→A方向\n- **TwoWay** - 蓝色箭头在p3和p4，表示双向\n\n**示例**:\n\n**垂直检测线 - 人员进出统计**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [150, 100, 150, 300, 130, 100, 170, 300]\n}\n```\n\n说明：\n- p1(150,100) → p2(150,300): 竖直线\n- p3(130,100) → p4(170,300): A-B标记（左右偏移30px）\n- Forward: 只检测从左→右的穿越\n\n**水平检测线 - 考勤打卡**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"checkin-line\",\n  \"direction\": \"TwoWay\",\n  \"points\": [100, 200, 400, 200, 100, 180, 400, 220]\n}\n```\n\n说明：\n- p1(100,200) → p2(400,200): 水平线\n- p3(100,180) → p4(400,220): A-B标记（上下偏移20px）\n- TwoWay: 双向都统计\n\n### 数组类型\n\n任何类型都可以包装在数组中：\n\n```json\n{\n  \"type\": \"Array<Detection>\",\n  \"example\": [\n    { \"bbox\": [...], \"confidence\": 0.9, ... },\n    { \"bbox\": [...], \"confidence\": 0.85, ... }\n  ]\n}\n```\n\n常见数组：\n- `Array<Detection>` - 多个检测对象\n- `Array<TrackDetection>` - 帧间跟踪的对象\n- `Array<Attribute>` - 多个属性结果\n- `Array<ROI>` - 多个区域\n- `Array<Tripwire>` - 多条检测线\n\n## 可视化和交互\n\n### 检测可视化\n\n使用 `visualize.mjs` 在图像上可视化检测结果：\n\n```bash\nnode scripts/visualize.mjs photo.jpg '<detection-json>' output.jpg\n```\n\n**支持**：\n- 带置信度分数的边框\n- 类别标签\n- 用于跟踪可视化的跟踪 ID\n- 叠加层（ROI 区域、绊线线条）\n- 文本注释\n\n### ROI/绊线输入\n\n用于区域和障碍的交互式输入：\n\n1. 生成网格参考图像：\n   ```bash\n   node scripts/show-grid.mjs photo.jpg\n   ```\n\n2. 使用网格参考指定坐标：\n   ```\n   ROI: B1, E1, E3, B3\n   Tripwire: A2 → G2 (direction: Forward)\n   ```\n\n3. 网格坐标自动转换为像素坐标\n\n详见 [grid-guide.md](./grid-guide.md)。\n\n## 视频帧提取\n\n用于视频帧提取和多帧分析：\n\n```json\n{\n  \"imageData\": \"base64-frame-data\",\n  \"sourceId\": \"video_abc123\",        // 每个视频源唯一\n  \"imageId\": \"frame_001\",             // 每帧唯一\n  \"timestamp\": 1705056000000          // 帧时间戳，单位毫秒\n}\n```\n\n**sourceId 计算**:\n```\nsourceId = MD5(视频文件的前 64KB) → 16 字符十六进制字符串\n```\n\n**timestamp 计算**:\n```\ntimestamp = 帧索引 * 1000 / 帧率\n```\n\n详见 [video-guide.md](./video-guide.md)。\n\n## 类型转换\n\n### 输入转换\n\n当将文件作为 `Image` 类型传递时：\n\n```bash\n# 文件路径自动转换为 base64\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node invoke.mjs ep-detect\n```\n\n### 输出解析\n\n检测结果会自动解析：\n\n```javascript\n// 原始输出\n{ \"detections\": \"[{\\\"bbox\\\": [...]}]\" }\n\n// 解析后的输出\n{ \"detections\": [{ \"bbox\": [...] }] }  // JSON 数组，可以直接使用\n```\n\n## 最佳实践\n\n1. **始终验证边框** - 确保坐标在图像边界内\n2. **使用 track_id 以保持连续性** - 跟踪帧间的对象以获得更好的结果\n3. **有效组合类型** - 使用 ROI 限制检测区域\n4. **时间戳精度** - 为视频分析维持一致的时间戳计算\n5. **sourceId 一致性** - 为来自同一源的所有帧保持 sourceId 常数\n\n## 故障排除\n\n**\"无效的检测\"**\n- 检查边框格式：[x, y, width, height]\n- 验证坐标为非负数\n- 确保框在图像边界内\n\n**\"缺少关键点\"**\n- 并非所有技能都支持关键点\n- 检查技能文档以了解支持的输出\n\n**\"ROI 未被识别\"**\n- 验证多边形是否闭合（第一个点 ≠ 最后一个点）\n- 确保至少有 3 个点\n- 检查点的顺序是否正确（顺时针或逆时针）\n\n**\"sourceId 不匹配\"**\n- 如果视频文件改变，重新计算 sourceId\n- 对来自同一源的所有帧使用相同的 sourceId\n\nFile v0.9.38:package.json\n\n{\n  \"name\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.38\",\n  \"description\": \"Baidu Yijian Vision Skill - Intent-driven visual analysis with automatic skill routing\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"engines\": {\n    \"node\": \">=16.0.0\",\n    \"npm\": \">=8.0.0\"\n  },\n  \"scripts\": {\n    \"pack\": \"node scripts/pack.mjs\",\n    \"test\": \"node --test 'tests/*.test.mjs'\",\n    \"test:integration\": \"node tests/run-integration.mjs --skip-e2e\",\n    \"test:integration:all\": \"node tests/run-integration.mjs\",\n    \"test:integration:e2e\": \"node tests/run-integration.mjs --e2e\",\n    \"test:integration:agent\": \"node tests/run-integration.mjs --agent\",\n    \"test:integration:docker\": \"node tests/run-docker.mjs\",\n    \"test:all\": \"npm test && npm run test:integration\"\n  },\n  \"devDependencies\": {\n    \"archiver\": \"^7.0.1\",\n    \"openclaw\": \"github:openclaw/openclaw#main\"\n  },\n  \"optionalDevDependencies\": {\n    \"_openclaw\": \"https://github.com/openclaw/openclaw.git#main\"\n  },\n  \"optionalDependencies\": {\n    \"sharp\": \"^0.33.0\"\n  }\n}\n\nArchive v0.9.37: 18 files, 41982 bytes\n\nFiles: grid-guide.md (6164b), package.json (1018b), roi-workflow.md (2693b), scripts/cache.mjs (1004b), scripts/intent-invoke.mjs (4584b), scripts/invoke.mjs (6357b), scripts/list.mjs (1590b), scripts/multimodal.mjs (2421b), scripts/query.mjs (2536b), scripts/show-grid.mjs (8345b), scripts/types.mjs (19515b), scripts/utils.mjs (2448b), scripts/visualize.mjs (20422b), scripts/workspace.mjs (4915b), SKILL.md (13879b), tripwire-workflow.md (3411b), types-guide.md (9811b), _meta.json (139b)\n\nFile v0.9.37:SKILL.md\n\n---\nname: baidu-yijian-vision\ndescription: \"Keywords: yijian, baidu yijian, yijian vision, visual inspection AI, yijian is Baidu's visual AI skill for image/video analysis, industrial quality inspection, SOP compliance, safety monitoring. 百度一见视觉技能（Baidu Yijian Vision Skill）- 可用于分析图片和视频。相比通用基模，在维持 95%+ 专业精度的同时，推理成本降低 50% 以上，是处理视觉巡检与监控分析任务的首选工具。主打 安全管理、SOP合规、工业质检、商业运营与物料盘点。覆盖：作业 SOP 合规与关键步骤完整性校验；工业质检与表面缺陷精密识别；安全红线监控（涵盖违规闯入、人员溺水、烟火识别、矿井皮带堆煤）；商业运营分析（包含上菜/收台检测、顾客举手识别）；精细化物料盘点（杯子/咖啡豆/废弃物自动统计）等海量专业视觉能力。\"\nallowed-tools: Bash, Read, Write, Edit\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\",\"npm\"],\"env\":[\"YIJIAN_API_KEY\"]},\"primaryEnv\":\"YIJIAN_API_KEY\"}}\n---\n\n# 百度一见视觉技能（Baidu Yijian Vision Skill）\n\n> **Baidu Yijian Vision Skill** - baidu yijian vision skill for image/video analysis, object detection, safety monitoring, and industrial inspection.\n\n## ⚠️ 必需条件\n\n**此工具需要以下条件才能运行：**\n\n1. **YIJIAN_API_KEY 环境变量**（必需）- 从[百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)获取\n2. **Node.js >= 16.0.0** - 本工具依赖 Node.js 运行时\n3. **npm >= 8.0.0** - 用于依赖管理和安装\n\n**确保上述条件满足后再使用此工具。**\n\n---\n\n> **🔒 客户端工具 - 这是一个本地工具，用于与百度一见（Baidu Yijian）平台交互。所有数据处理遵循安全协议。**\n\n## 🎯 此工具的功能\n\n百度一见（[yijian-next.cloud.baidu.com](https://yijian-next.cloud.baidu.com)）是百度（Baidu）的视觉（vision）理解平台。此工具使你能够：\n\n- **意图自动匹配** - 通过自然语言描述自动匹配最佳技能\n- **智能路由** - 高置信度匹配时调用专业视觉技能，低置信度时自动回退到多模态推理\n- **直接技能调用** - 已知技能ID时可直接调用\n- **可视化结果** - 绘制边框、生成网格参考、预览 ROI/绊线\n- **定义检测区域** - 使用交互式工作流定义 ROI（电子围栏）或绊线（检测线）\n\n**支持的检测类型：** 人员检测、行人计数、车辆识别、OCR、姿态估计、目标跟踪等。\n\n## 📋 快速开始\n\n### 系统要求\n\n- **Node.js** >= 16.0.0\n- **npm** >= 8.0.0\n- **YIJIAN_API_KEY** 环境变量\n\n## 🔧 前置条件\n\n### 获取 API Key\n\n1. 登录 [百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)\n2. 激活试用包\n3. 生成 API Key（百度一见平台 → 系统管理 → 安全认证 → API Key）\n\n### 配置环境\n\n设置环境变量：\n\n```\nYIJIAN_API_KEY=your-api-key\n```\n\n## 📚 使用指南\n\n### 意图驱动工作流（推荐）\n\n**当你描述需求但不确定用哪个技能时**，系统会自动匹配最佳技能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg\n```\n\n系统会自动：\n1. 查询一见平台，根据意图匹配公共技能列表\n2. 如果匹配置信度 ≥ 0.7，调用对应的专业技能（自动添加全图 ROI）\n3. 如果公共技能无匹配或调用失败，搜索私有工作空间技能（由你从列表中选择最匹配的技能，再用 invoke 调用）\n4. 如果私有空间也无合适技能，自动回退到多模态直接推理\n\n> **自动 ROI：** 当用户未提供 ROI 时，系统会自动生成覆盖整张图片的 ROI。如需指定检测区域，请使用 `invoke.mjs` 传入自定义 ROI。\n\n#### 自定义置信度阈值\n\n```bash\n# 仅当匹配度≥0.8时才使用技能，否则回退到多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg 0.8\n```\n\n#### 不使用图片（纯文本意图查询）\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\"\n```\n\n#### 返回格式\n\n```json\n{\n  \"success\": true,\n  \"mode\": \"skill\",\n  \"epId\": \"ep-public-xxxxx\",\n  \"skillName\": \"人员摔倒检测\",\n  \"confidence\": 0.92,\n  \"count\": 1,\n  \"detections\": [\n    {\n      \"bbox\": [100, 200, 50, 80],\n      \"category\": \"falling_person\",\n      \"confidence\": 0.94\n    }\n  ]\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `success` | boolean | 调用是否成功 |\n| `mode` | string | `\"skill\"` 或 `\"multimodal\"`，表示使用的推理模式 |\n| `epId` | string \\| null | 技能ID（技能模式时有值） |\n| `skillName` | string \\| null | 技能名称（技能模式时有值） |\n| `confidence` | number \\| null | 技能匹配置信度（0-1） |\n| `count` | number | 检测到的目标数量 |\n| `detections` | array | 检测结果数组 |\n\n**模式说明：**\n- `\"mode\": \"skill\"` - 使用了百度一见平台的专业技能，精度高、成本低\n- `\"mode\": \"multimodal\"` - 使用了多模态大模型直接推理，通用性强、无需预设技能\n\n### 查询私有工作空间技能\n\n当公共技能匹配不到或调用失败时，可以搜索你私有工作空间中的技能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/workspace.mjs list-skills\n```\n\n返回你默认工作空间中所有已发布的技能列表（含 epId、名称和描述）。列表会本地缓存1小时。\n\n**使用流程：**\n1. 运行 `list-skills` 获取私有技能列表\n2. 根据用户意图，从列表中选择最匹配的技能\n3. 用选中的 epId 调用 `invoke.mjs` 执行技能\n4. 如果私有空间也无合适技能，走 multimodal 多模态推理\n\n```bash\n# 第1步：获取私有技能列表\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/workspace.mjs list-skills\n\n# 第2步：选择匹配的技能并调用\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-wsnyqcdj-0xdpgbt4\n```\n\n> **注意：** 私有技能列表按 API Key 关联，1小时内自动刷新缓存，无需频繁调用。\n\n### 查询可用技能\n\n如果你想了解有哪些技能可以匹配你的意图：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/list.mjs \"人员检测\"\n```\n\n这会返回匹配的技能列表及其置信度。\n\n### 直接调用技能（已知技能ID）\n\n**当你已经知道具体的技能 ID 时**，可以直接调用：\n\n```bash\n# 调用指定技能（从stdin读取输入）\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy -\n\n# 或者直接作为参数\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n#### ROI（电子围栏）参数格式\n\nROI 用于限定检测区域。**必须包含 `id`、`name`、`kind`、`points` 四个字段，缺一不可**，否则 API 返回 500 错误。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"zone\",\n  \"kind\": \"ROI\",\n  \"points\": [x1,y1, x2,y2, x3,y3, x4,y4]\n}\n```\n\n- `id` — 任意字符串标识（如 `\"1\"`）\n- `name` — 区域名称（如 `\"zone\"`、`\"doorway\"`）\n- `kind` — 固定值 `\"ROI\"`\n- `points` — 顶点坐标数组，按顺时针/逆时针顺序排列，每对 `[x,y]` 为一个顶点\n\n> **自动 ROI：** 如果不传 `roi` 参数，`invoke.mjs` 会自动生成覆盖全图的 ROI。\n\n#### 绊线（Tripwire）参数格式\n\n绊线用于检测穿越事件。**必须包含 `id`、`name`、`kind`、`points`、`direction` 五个字段**。\n\n```json\n{\n  \"id\": \"1\",\n  \"name\": \"line\",\n  \"kind\": \"TripWire\",\n  \"points\": [p1_x,p1_y, p2_x,p2_y, p3_x,p3_y, p4_x,p4_y],\n  \"direction\": \"Forward\"\n}\n```\n\n- `id` — 任意字符串标识\n- `name` — 绊线名称\n- `kind` — 固定值 `\"TripWire\"`\n- `points` — 4 个点（8 个数值）：p1→p2 为主线，p3→p4 为 A/B 区域标记\n- `direction` — 检测方向：`\"Forward\"` | `\"Backward\"` | `\"TwoWay\"`\n\n> **绊线不会自动生成**，必须由用户指定。详见 [绊线工作流](./tripwire-workflow.md)。\n\n**调用带 ROI 的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[100,100,500,100,500,400,100,400]}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n**调用带绊线的技能：**\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[0,540,1920,540,0,500,1920,500],\"direction\":\"Forward\"}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n### 测试 Query 接口\n\n如果你想单独测试意图匹配功能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/query.mjs \"检测人员摔倒\"\n```\n\n返回匹配的技能列表（JSON格式）。\n\n### 测试 Multimodal 接口\n\n如果你想单独测试多模态直接推理：\n\n```bash\n# 纯文本\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/multimodal.mjs \"描述这张图片\"\n\n# 带图片URL\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/multimodal.mjs \"描述这张图片\" \"http://example.com/image.jpg\"\n```\n\n### 定义检测区域\n\n**需要定义电子围栏（ROI，又叫感兴趣区域）或绊线（Tripwire，又叫检测线）？**\n\n- **[ROI 工作流](./roi-workflow.md)** — 创建电子围栏，仅在指定区域检测\n- **[绊线工作流](./tripwire-workflow.md)** — 绘制检测线，统计穿越事件\n\n两个工作流都包含完整的交互步骤和示例对话。\n\n### 查看完整文档\n\n- **[类型定义](./types-guide.md)** — 检测（Detection），图像（Image）、电子围栏（ROI）、绊线（Tripwire）等数据结构\n- **[网格输入系统](./grid-guide.md)** — 使用网格坐标指定点\n\n## 💡 常见任务\n\n### 查询匹配的技能\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/list.mjs \"检测人员\"\n```\n\n### 意图驱动调用（自动路由）\n\n```bash\n# 系统会自动选择技能或多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员摔倒\" photo.jpg\n\n# 自定义阈值\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员摔倒\" photo.jpg 0.8\n```\n\n### 直接调用技能（已知技能ID）\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-public-xxxxx\n```\n\n### 预览 ROI/绊线\n\n在调用前在图像上预览：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs photo.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"zone\",\"points\":[...]}]'\n```\n\n### 生成网格\n\n帮助用户使用网格坐标指定点位置：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/show-grid.mjs photo.jpg grid.png\n```\n\n---\n\n## 📋 使用示例\n\n### 示例 1：意图驱动检测（推荐）\n\n**场景：** 你有一张监控画面图像，想检测是否有人摔倒，但不确定使用哪个技能。\n\n```bash\n# 使用意图驱动工作流，系统自动匹配最佳技能\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" surveillance.jpg\n\n# 返回结果包含检测到的目标\n# {\n#   \"success\": true,\n#   \"mode\": \"skill\",\n#   \"epId\": \"ep-public-inqm15aq\",\n#   \"skillName\": \"人员摔倒\",\n#   \"confidence\": 0.95,\n#   \"count\": 1,\n#   \"detections\": [...]\n# }\n```\n\n### 示例 2：传统直接调用（已知技能ID）\n\n**场景：** 你已经知道具体的技能 ID，直接调用。\n\n```bash\n# 第 1 步：调用指定技能\necho '{\"input0\":{\"image\":\"surveillance.jpg\"}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-public-inqm15aq -\n\n# 第 2 步：可视化结果\ndetections='[{\"bbox\":[150,200,80,180],\"confidence\":0.94,\"category\":{\"id\":\"person\",\"name\":\"人体\"}}]'\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs surveillance.jpg \"$detections\" output.jpg\n\n# 第 3 步：处理结果\necho \"$detections\" | jq 'length'  # 计数人数\n```\n\n### 示例 3：基于网格的 ROI 设置\n\n**场景：** 在走廊监控摄像机中计数进入特定房间的人员，使用 ROI 限制检测区域。\n\n```bash\n# 第 1 步：生成网格参考\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/show-grid.mjs hallway.jpg --cols 6 --rows 4\n\n# 第 2 步：根据网格识别坐标（B1, D1, D3, B3）并创建 ROI\n# 注意：ROI 必须包含 id 和 name 字段\n\n# 第 3 步：验证 ROI\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/visualize.mjs hallway.jpg '[]' roi_preview.jpg \\\n  --overlays \"[{\\\"kind\\\":\\\"ROI\\\",\\\"name\\\":\\\"doorway\\\",\\\"points\\\":[320,270,960,270,960,810,320,810]}]\"\n\n# 第 4 步：使用 invoke.mjs 传入自定义 ROI（不要用 intent-invoke.mjs，它只会添加全图 ROI）\necho '{\"input0\":{\"image\":\"hallway.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"doorway\",\"kind\":\"ROI\",\"points\":[320,270,960,270,960,810,320,810]}}}' | \\\n  node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n### 示例 4：视频帧处理和跟踪\n\n**场景：** 处理 30 秒监控视频，逐帧检测和跟踪人员。\n\n```bash\n# 第 1 步：提取帧\nffmpeg -i surveillance_30sec.mp4 -vf fps=1 frames/frame_%04d.jpg\n\n# 第 2 步：计算 sourceId（视频标识符）\nsourceId=$(head -c 65536 surveillance_30sec.mp4 | md5sum | awk '{print substr($1, 1, 16)}')\n\n# 第 3 步：处理每个帧并跟踪\nfor frame_file in frames/frame_*.jpg; do\n  frame_num=$(basename \"$frame_file\" | grep -oE '[0-9]+' | head -1)\n  frame_index=$((10#$frame_num - 1))\n  timestamp=$((frame_index * 1000))\n  imageId=\"frame_$(printf '%04d' \"$frame_num\")\"\n\n  # 使用意图驱动调用\n  result=$(node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测人员\" \"$frame_file\")\n\n  detections=$(echo \"$result\" | jq '.detections')\n  echo \"$detections\" > \"results/${imageId}_detections.json\"\ndone\n```\n\n---\n\n**API Key 从 `YIJIAN_API_KEY` 环境变量读取。所有脚本将 JSON 输出到标准输出，错误输出到标准错误。**\n\nFile v0.9.37:_meta.json\n\n{\n  \"ownerId\": \"kn7aw0s517ypj0hstj91qr6nxs82r2xy\",\n  \"slug\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.37\",\n  \"publishedAt\": 1777261649703\n}\n\nFile v0.9.37:grid-guide.md\n\n# 基于网格的 ROI / 绊线输入指南\n\n## 概述\n\n在命令行环境中手动指定 ROI 区域或绊线的确切像素坐标既繁琐又容易出错。基于网格的输入系统让你可以使用易于理解的网格坐标来代替。\n\n## 工作原理\n\n### 1. 生成网格参考图像\n\n```bash\nnode scripts/show-grid.mjs photo.jpg [output-path] [--cols N] [--rows N]\n```\n\n这会在你的图像上创建带标签的网格叠加层：\n\n```\n       A     B     C     D     E     F     G\n   0   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   1   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   2   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   3   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   4   ·─────·─────·─────·─────·─────·─────·\n```\n\n**输出**：\n- `photo_grid.png` - 网格参考图像\n- `photo_grid_metadata.json` - 坐标映射数据\n\n### 2. 查看并识别坐标\n\n查看网格图像并识别 ROI 或绊线的坐标：\n\n- **列**：A、B、C、D、...（从左到右）\n- **行**：0、1、2、3、...（从上到下）\n- **交点**：网格线交叉的位置（用点标记）\n\n### 3. 使用网格坐标指定\n\n告诉系统网格坐标：\n\n```\n用户：\"在 B1、E1、E3、B3 创建检测区域\"\n```\n\n系统自动转换为像素坐标：\n\n```\nB1 = (列B索引 × 网格宽度, 行1索引 × 网格高度)\nE1 = (列E索引 × 网格宽度, 行1索引 × 网格高度)\nE3 = (列E索引 × 网格宽度, 行3索引 × 网格高度)\nB3 = (列B索引 × 网格宽度, 行3索引 × 网格高度)\n```\n\n## 使用示例\n\n### 示例 1：定义检测区域（ROI）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs office.jpg\n\n# 查看网格图像以识别坐标，然后：\n用户：\"我想要一个办公桌区域的检测区域：B2、G2、G5、B5\"\n\n转换为 ROI：\n{\n  \"kind\": \"ROI\",\n  \"points\": [col_B, row_2, col_G, row_2, col_G, row_5, col_B, row_5]\n}\n\n# 使用 ROI 调用技能\n$ echo '{\"input0\":{\"image\":\"office.jpg\",\"roi\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-2403um2p\n```\n\n### 示例 2：定义穿越线（绊线）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs hallway.jpg\n\n# 查看网格图像，然后：\n用户：\"在走廊中创建一条从 A3 到 H3 的绊线，检测从左到右的穿越\"\n\n转换为绊线：\n{\n  \"kind\": \"TripWire\",\n  \"points\": [col_A, row_3, col_H, row_3],\n  \"direction\": \"Forward\"\n}\n\n# 使用绊线调用技能\n$ echo '{\"input0\":{\"image\":\"hallway.jpg\",\"tripwire\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-ywbjb7tm\n```\n\n### 示例 3：多个 ROI\n\n```bash\n用户：\"我想要 3 个检测区域：入口（A1-C3）、中心（D1-F3）、出口（G1-H3）\"\n\n转换为三个 ROI 对象并作为 Array<ROI> 传递：\n[\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_A, row_1, col_C, row_1, col_C, row_3, col_A, row_3],\n    \"order\": 0\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_D, row_1, col_F, row_1, col_F, row_3, col_D, row_3],\n    \"order\": 1\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_G, row_1, col_H, row_1, col_H, row_3, col_G, row_3],\n    \"order\": 2\n  }\n]\n```\n\n## 网格算法\n\n网格大小会自动计算：\n\n- **目标**：约 30-42 个交点，大致为方形单元\n- **横向图像**（1920×1080）：7 列 × 4 行\n- **纵向图像**（1080×1920）：4 列 × 7 行\n- **方形图像**（800×800）：5 列 × 5 行\n\n**手动覆盖**：\n```bash\nnode scripts/show-grid.mjs photo.jpg --cols 10 --rows 6\n```\n\n## 命令参考\n\n### 生成网格\n\n```bash\nnode scripts/show-grid.mjs <input-image> [output-path] [--cols N] [--rows N]\n```\n\n**参数**：\n- `<input-image>` - 输入图像文件路径\n- `[output-path]` - 可选输出图像路径（默认：`<input>_grid.png`）\n- `--cols N` - 覆盖列数\n- `--rows N` - 覆盖行数\n\n**输出**：\n- 网格图像：`<output>.png`\n- 元数据 JSON：`<output>_metadata.json`\n\n### 使用网格坐标\n\n在指定坐标时：\n\n**有效格式**：\n- 单个点：`A1`\n- 序列：`A1、E1、E3、A3`（用于 ROI）\n- 线：`A2 → G2`（用于绊线，显示方向）\n\n**网格参考格式**：\n- 列：A-Z，然后是 AA-AZ 等\n- 行：0-9，然后是 10-99 等\n\n## 可视化\n\n### 查看网格图像\n\n生成网格后，系统应该显示网格图像以便你可以直观地识别坐标。\n\n### 调用前验证\n\n在用坐标调用技能之前：\n\n```bash\n# 在原始图像上可视化选定的 ROI/绊线\nnode scripts/visualize.mjs office.jpg '<roi-or-tripwire-json>' preview.jpg\n```\n\n这可帮助你在处理前验证坐标是否正确。\n\n## 提示和技巧\n\n1. **从简单开始**：在使用复杂多边形前先从简单的矩形 ROI 开始\n2. **使用均匀网格**：5×5 或 6×6 网格最容易参考\n3. **记录你的区域**：为每个 ROI 指定有意义的名称（例如\"入口\"、\"收银台\"）\n4. **重用坐标**：保存类似摄像机角度的坐标集\n5. **先测试**：在处理前始终用 `visualize.mjs` 预览\n\n## 故障排除\n\n**\"网格图像过于拥挤\"**\n- 降低网格密度：`--cols 4 --rows 4`\n- 如果可能，增大图像大小\n\n**\"看不清网格线\"**\n- 网格使用半透明白色线条（50% 不透明度）\n- 放大网格图像以获得更好的可见性\n\n**\"坐标似乎不对\"**\n- 验证列/行顺序（列 A-Z 从左到右，行 0-N 从上到下）\n- 检查第一个点和最后一个点是否不同（多边形必须闭合）\n- 确保点的顺序一致（全部顺时针或全部逆时针）\n\n**\"网格不适合图像\"**\n- 非常宽或非常高的图像可能有不均匀的单元格\n- 使用 `--cols` 和 `--rows` 强制指定特定的网格尺寸\n\n## 参考\n\n- [类型定义](./types-guide.md) - ROI 和绊线类型规范\n- [SKILL.md](./SKILL.md) - 主技能指南\n\nFile v0.9.37:roi-workflow.md\n\n# ROI（关注区域）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为对象检测定义 ROI（关注区域）时，遵循此交互工作流。\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n向用户显示网格图像并解释行和列标签。\n\n### 第 2 步：询问 ROI 目的\n\n\"你想在这个区域检测什么？例如：\n- 进入收银区域的人员\n- 停车场中的车辆\n- 货架上的产品\"\n\n### 第 3 步：用户指定顶点\n\n用户根据网格标签指定角。\n\n**矩形 ROI 示例：**\n- 用户：\"从 B2 到 G5\"\n- 转换为 4 个顶点：[B2、G2、G5、B5]\n\n### 第 4 步：验证顶点顺序\n\n\"这些点是否围绕周边形成闭合多边形？（顺时针或逆时针）\"\n\n### 第 5 步：预览 ROI\n\n```bash\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"test\",\"points\":[x1,y1,x2,y2,x3,y3,x4,y4]}]'\n```\n\n### 第 6 步：用户确认\n\n\"ROI 位置是否正确？\"\n\n### 第 7 步：调用技能\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[...]}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n> **重要：** 自定义 ROI 必须通过 `invoke.mjs` 传入。不要使用 `intent-invoke.mjs`，因为它会自动添加全图 ROI 覆盖掉你的自定义区域。\n\n---\n\n## 常见错误\n\n❌ 不要假设矩形 ROI\n✅ 支持任意多边形\n\n❌ 不要允许无序的顶点\n✅ 顶点必须按顺序排列\n\n❌ 不要跳过预览验证\n✅ 始终显示预览图像以确认\n\n---\n\n## 完整对话示例\n\n### 示例 1：矩形入口区域\n\n**用户**：\"我想检测进入办公室的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs office.jpg office-grid.png\n```\n2. 问：\"查看网格，入口大概在哪里？\"\n3. 用户：\"大约从 B1 到 G3\"\n4. 确认：\"所以顶点是 B1、G1、G3、B3，对吧？\"\n5. 用户：\"是的\"\n6. 预览 ROI\n7. 问：\"这个矩形是否覆盖了入口？\"\n8. 用户：\"完美！\"\n9. 调用技能进行检测\n\n### 示例 2：复杂多边形（L 形区域）\n\n**用户**：\"我需要监视 L 形存储区域\"\n\n**你**：\n1. 生成网格\n2. 问：\"使用网格坐标标记 L 形的所有角，从一个角开始\"\n3. 用户：\"从左上角开始：A2、E2、E4、D4、D6、A6\"\n4. 确认：\"这些点是否按顺序形成 L 形的边界？确认它关闭回 A2\"\n5. 用户：\"是的\"\n6. 预览 L 形多边形\n7. 验证没有自交\n8. 调用技能\n\n---\n\n## 数据结构\n\n详见 [types-guide.md](./types-guide.md) 了解完整的定义、子对象和示例。\n\nFile v0.9.37:tripwire-workflow.md\n\n# 绊线（检测线）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为穿越检测定义绊线时，遵循此交互工作流。\n\n## 核心概念\n\n- **p1→p2** 主检测线（用户定义，2 个点）\n- **p3→p4** A-B 区域标记（系统自动生成或用户定义）\n- **方向** Forward/Backward/TwoWay（要检测的方向）\n\n**自动生成过程**：用户只需指定 p1 和 p2 点。系统会自动生成垂直于主线的 p3 和 p4 点用于预览和确认。\n\n矢量穿越检测算法详情，见 [types-guide.md#tripwire](./types-guide.md#tripwire)\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n### 第 2 步：用户指定绊线\n\n\"查看网格，检测线应该在哪里？例如，从 B2 到 G2？\"\n\n### 第 3 步：预览绊线位置\n\n系统基于用户的 2 个点（p1、p2）生成完整的 4 点结构，然后调用 `visualize.mjs` 生成预览：\n\n```bash\n# 自动计算 4 个点后\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\n    \"kind\":\"TripWire\",\n    \"name\":\"tripwire preview\",\n    \"direction\":\"Forward\",\n    \"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y]\n  }]'\n```\n\n预览显示：\n- 主线（p1→p2）虚线 - 橙色\n- A/B 标记（p3→p4）虚线 - 橙色，带标签\n- 方向箭头 - Forward=绿色在 p4，Backward=红色在 p3\n\n### 第 4 步：确认 A/B 区域\n\n\"查看预览图像：\n- A 区在这一侧（例如线的上方）\n- B 区在那一侧（例如线的下方）\n- 绿色箭头显示 Forward 是 A→B\n\n这是否正确？\"\n\n### 第 5 步：选择方向模式\n\n用户看到预览后，提问：\n- Forward（相同方向）\n- Backward（相反方向）\n- TwoWay（检测两个方向）\n\n### 第 6 步：最终确认\n\n生成最终预览，用户确认，然后调用技能：\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"tripwire\":{\"id\":\"1\",\"name\":\"line\",\"kind\":\"TripWire\",\"points\":[p1_x,p1_y,p2_x,p2_y,p3_x,p3_y,p4_x,p4_y],\"direction\":\"Forward\"}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n---\n\n## 常见错误\n\n❌ 不要在显示预览前解释 A/B\n✅ 用户必须看到带 A/B 标记标签的预览\n\n❌ 不要仅使用 2 个点\n✅ 始终提供 4 个点（主线 + A/B 标记）\n\n❌ 不要跳过预览验证\n✅ 始终显示预览以确认\n\n---\n\n## 完整对话示例\n\n**用户**：\"我需要检测进入门的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs door-camera.jpg door-grid.png\n```\n\n2. 问：\"查看网格，检测线应该在哪里？例如 B2 到 G2？\"\n\n3. 用户：\"是的，从 B2 到 G2 的线\"\n\n4. 生成显示绊线位置和 A/B 标记的预览：\n```bash\nnode scripts/visualize.mjs door-camera.jpg '[]' preview1.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"door\",\"direction\":\"Forward\",\"points\":[B2_x,B2_y,G2_x,G2_y,B1_x,B1_y,G3_x,G3_y]}]'\n```\n\n5. 解释：\"这是绊线预览：\n   - 区域 'A' 在线上方（外侧）\n   - 区域 'B' 在线下方（内侧）\n   - 绿色箭头显示 Forward 检测 A→B（从外侧进入）\n\n   你对这个设置满意吗？\"\n\n6. 用户：\"是的，我想检测进入（Forward）\"\n\n7. 生成最终预览以确认\n\n8. 调用技能进行检测\n\n---\n\n## 数据结构\n\n详见 [types-guide.md#tripwire](./types-guide.md#tripwire) 了解完整的定义、矢量算法和示例。\n\nFile v0.9.37:types-guide.md\n\n# 易见类型定义指南\n\n## 概述\n\n易见平台处理视觉信息并返回结构化数据。理解这些类型可帮助你有效地使用技能输入和输出。\n\n## 核心类型\n\n### 基本类型\n\n这些是在整个平台中使用的标量值。\n\n| 类型 | 描述 | 示例 |\n|------|------|------|\n| `String` | 文本数据 | `\"hello\"` |\n| `TemplateString` | 格式化文本 | `\"Result: {value}\"` |\n| `Integer` | 整数 | `42` |\n| `Double` | 浮点数 | `3.14` |\n| `Boolean` | 真/假 | `true` |\n| `Time` | 时间戳 | `\"2026-03-12T10:00:00Z\"` |\n\n### 复杂类型\n\n这些是包含视觉或检测信息的结构化对象。\n\n#### Detection（检测）\n\n表示图像中的检测对象。\n\n```json\n{\n  \"bbox\": [x, y, width, height],\n  \"confidence\": 0.94,\n  \"category\": {\n    \"id\": \"person\",\n    \"name\": \"人体\",\n    \"confidence\": 0.98\n  },\n  \"track_id\": 1,\n  \"ocr\": null,\n  \"keypoints\": null\n}\n```\n\n**字段**：\n- `bbox` - 边框 [x, y, width, height]（像素坐标）\n- `confidence` - 检测置信度（0-1）\n- `category` - 对象分类，包含 id、name、confidence\n- `track_id` - 跟踪 ID（用于帧间跟踪，可选）\n- `ocr` - 文本识别结果（可选）\n- `keypoints` - 姿态/骨骼关键点（可选）\n\n#### TrackDetection（跟踪检测）\n\n与 `Detection` 相同，但用于视频帧间的时间跟踪。\n\n#### Attribute（属性）\n\n表示图像中检测到的属性或属性。\n\n```json\n{\n  \"attribute\": \"age\",\n  \"answer\": \"adult\",\n  \"confidence\": 0.87\n}\n```\n\n**字段**：\n- `attribute` - 属性名称（例如\"age\"、\"gender\"、\"expression\"）\n- `answer` - 属性值\n- `confidence` - 置信度分数\n\n#### Image（图像）\n\n表示技能的视觉输入。\n\n```json\n{\n  \"imageData\": \"base64-encoded-image-data\",\n  \"imageWidth\": 1920,\n  \"imageHeight\": 1080,\n  \"sourceId\": \"abc123def456\",\n  \"imageId\": \"img001\",\n  \"timestamp\": 1705056000000\n}\n```\n\n**字段**：\n- `imageData` - Base64 编码的图像字节（从文件路径自动编码）\n- `imageWidth` - 图像宽度（像素）\n- `imageHeight` - 图像高度（像素）\n- `sourceId` - 源标识符，用于视频流（文件 MD5 哈希）\n- `imageId` - 唯一的图像标识符\n- `timestamp` - 帧时间戳（毫秒）\n\n#### ROI（关注区域 / 电子围栏）\n\n定义用于分析的多边形区域。\n\n**完整工作流：** 见 [roi-workflow.md](./roi-workflow.md)\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"entrance\",\n  \"points\": [x1, y1, x2, y2, x3, y3, x4, y4]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"ROI\"\n- `name` - 区域描述名称（可选）\n- `points` - 多边形顶点坐标数组，按顺序排列：`[x1,y1, x2,y2, x3,y3, ...]`\n\n**示例**:\n\n**矩形ROI - 收银区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"checkout-zone\",\n  \"points\": [100, 100, 300, 100, 300, 250, 100, 250]\n}\n```\n\n**多边形ROI - L形仓库区域**\n```json\n{\n  \"kind\": \"ROI\",\n  \"name\": \"warehouse-l-zone\",\n  \"points\": [100, 100, 400, 100, 400, 200, 300, 200, 300, 350, 100, 350]\n}\n```\n\n**网格坐标输入**:\n使用 `show-grid.mjs` 生成的网格坐标：\n```\nB1, E1, E3, B3  →  自动转换为像素坐标\n```\n\n#### Tripwire（绊线 / 穿越检测线）\n\n定义用于穿越事件的检测线。\n\n**完整工作流：** 见 [tripwire-workflow.md](./tripwire-workflow.md)\n\n**核心概念 - 向量点乘法则**:\n\n绊线穿越检测使用向量点乘：\n\n1. **绊线向量** = p1 → p2 方向\n2. **运动向量** = 前一帧到当前帧的对象移动\n3. **点乘计算**：`dot = V_line.x * V_motion.x + V_line.y * V_motion.y`\n4. **穿越判定**：\n   - `dot > 0` → 正向穿越（Forward，A→B）\n   - `dot < 0` → 反向穿越（Backward，B→A）\n   - TwoWay: 两个方向都检测\n\n**数据结构**:\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n}\n```\n\n**字段说明**:\n- `kind` - 固定值\"TripWire\"\n- `name` - 检测线描述名称（可选）\n- `direction` - \"Forward\" | \"Backward\" | \"TwoWay\"\n- `points` - 8元素数组：\n  - p1, p2: 主检测线（用户指定）\n  - p3, p4: A-B区域标记（标识穿越方向）\n\n**自动生成A-B点**:\n\n用户可以只提供 **2个点**（p1, p2 主检测线），系统会自动生成 **p3, p4**（A-B区域标记）：\n\n1. **输入**: 用户给出2个点 `[p1_x, p1_y, p2_x, p2_y]`\n2. **自动计算**:\n   ```\n   dx, dy = 主线方向向量 (p2 - p1)\n   perpX, perpY = 旋转90度得到垂直向量\n   distance = 30px (默认)\n   p3 = p1 + perp * distance  (A区域标记)\n   p4 = p2 + perp * distance  (B区域标记)\n   ```\n3. **结果**: 自动补全为完整的4点结构 `[p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]`\n4. **生成预览图**: 使用 `visualize.mjs` 将Tripwire可视化\n   ```bash\n   node scripts/visualize.mjs <image> '[]' preview.png \\\n     --overlays '[{\n       \"kind\": \"TripWire\",\n       \"name\": \"绊线预览\",\n       \"direction\": \"Forward\",\n       \"points\": [p1_x, p1_y, p2_x, p2_y, p3_x, p3_y, p4_x, p4_y]\n     }]'\n   ```\n   输出：`preview.png` 显示绊线虚线、A/B标记、方向箭头\n5. **用户确认**: 显示预览图让用户确认：\n   - A/B区域位置是否正确\n   - 方向箭头是否指向期望方向\n   - 绊线是否跨越检测区域\n\n**示例**:\n\n用户输入：`[150, 100, 150, 300]` (竖直线)\n系统自动生成：`[150, 100, 150, 300, 120, 100, 120, 300]` (左偏30px)\n生成预览：\n```bash\nnode scripts/visualize.mjs door.jpg '[]' preview.png \\\n  --overlays '[{\"kind\":\"TripWire\",\"name\":\"门\",\"direction\":\"Forward\",\"points\":[150,100,150,300,120,100,120,300]}]'\n```\n用户看预览图确认A(左)→B(右)方向是否符合预期\n\n**结构可视化**:\n```\np1 --------> p2  (主检测线，p1→p2)\n ^            ^\n |            |\np3           p4  (A-B区域标记)\n\n• Forward: 检测p3→p4方向的穿越（A→B）\n• Backward: 检测p4→p3方向的穿越（B→A）\n• TwoWay: 双向都检测\n```\n\n**方向可视化**:\n- **Forward** - 绿色箭头在p4，表示A→B方向\n- **Backward** - 红色箭头在p3，表示B→A方向\n- **TwoWay** - 蓝色箭头在p3和p4，表示双向\n\n**示例**:\n\n**垂直检测线 - 人员进出统计**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"door-entrance\",\n  \"direction\": \"Forward\",\n  \"points\": [150, 100, 150, 300, 130, 100, 170, 300]\n}\n```\n\n说明：\n- p1(150,100) → p2(150,300): 竖直线\n- p3(130,100) → p4(170,300): A-B标记（左右偏移30px）\n- Forward: 只检测从左→右的穿越\n\n**水平检测线 - 考勤打卡**\n\n```json\n{\n  \"kind\": \"TripWire\",\n  \"name\": \"checkin-line\",\n  \"direction\": \"TwoWay\",\n  \"points\": [100, 200, 400, 200, 100, 180, 400, 220]\n}\n```\n\n说明：\n- p1(100,200) → p2(400,200): 水平线\n- p3(100,180) → p4(400,220): A-B标记（上下偏移20px）\n- TwoWay: 双向都统计\n\n### 数组类型\n\n任何类型都可以包装在数组中：\n\n```json\n{\n  \"type\": \"Array<Detection>\",\n  \"example\": [\n    { \"bbox\": [...], \"confidence\": 0.9, ... },\n    { \"bbox\": [...], \"confidence\": 0.85, ... }\n  ]\n}\n```\n\n常见数组：\n- `Array<Detection>` - 多个检测对象\n- `Array<TrackDetection>` - 帧间跟踪的对象\n- `Array<Attribute>` - 多个属性结果\n- `Array<ROI>` - 多个区域\n- `Array<Tripwire>` - 多条检测线\n\n## 可视化和交互\n\n### 检测可视化\n\n使用 `visualize.mjs` 在图像上可视化检测结果：\n\n```bash\nnode scripts/visualize.mjs photo.jpg '<detection-json>' output.jpg\n```\n\n**支持**：\n- 带置信度分数的边框\n- 类别标签\n- 用于跟踪可视化的跟踪 ID\n- 叠加层（ROI 区域、绊线线条）\n- 文本注释\n\n### ROI/绊线输入\n\n用于区域和障碍的交互式输入：\n\n1. 生成网格参考图像：\n   ```bash\n   node scripts/show-grid.mjs photo.jpg\n   ```\n\n2. 使用网格参考指定坐标：\n   ```\n   ROI: B1, E1, E3, B3\n   Tripwire: A2 → G2 (direction: Forward)\n   ```\n\n3. 网格坐标自动转换为像素坐标\n\n详见 [grid-guide.md](./grid-guide.md)。\n\n## 视频帧提取\n\n用于视频帧提取和多帧分析：\n\n```json\n{\n  \"imageData\": \"base64-frame-data\",\n  \"sourceId\": \"video_abc123\",        // 每个视频源唯一\n  \"imageId\": \"frame_001\",             // 每帧唯一\n  \"timestamp\": 1705056000000          // 帧时间戳，单位毫秒\n}\n```\n\n**sourceId 计算**:\n```\nsourceId = MD5(视频文件的前 64KB) → 16 字符十六进制字符串\n```\n\n**timestamp 计算**:\n```\ntimestamp = 帧索引 * 1000 / 帧率\n```\n\n详见 [video-guide.md](./video-guide.md)。\n\n## 类型转换\n\n### 输入转换\n\n当将文件作为 `Image` 类型传递时：\n\n```bash\n# 文件路径自动转换为 base64\necho '{\"input0\":{\"image\":\"photo.jpg\"}}' | node invoke.mjs ep-detect\n```\n\n### 输出解析\n\n检测结果会自动解析：\n\n```javascript\n// 原始输出\n{ \"detections\": \"[{\\\"bbox\\\": [...]}]\" }\n\n// 解析后的输出\n{ \"detections\": [{ \"bbox\": [...] }] }  // JSON 数组，可以直接使用\n```\n\n## 最佳实践\n\n1. **始终验证边框** - 确保坐标在图像边界内\n2. **使用 track_id 以保持连续性** - 跟踪帧间的对象以获得更好的结果\n3. **有效组合类型** - 使用 ROI 限制检测区域\n4. **时间戳精度** - 为视频分析维持一致的时间戳计算\n5. **sourceId 一致性** - 为来自同一源的所有帧保持 sourceId 常数\n\n## 故障排除\n\n**\"无效的检测\"**\n- 检查边框格式：[x, y, width, height]\n- 验证坐标为非负数\n- 确保框在图像边界内\n\n**\"缺少关键点\"**\n- 并非所有技能都支持关键点\n- 检查技能文档以了解支持的输出\n\n**\"ROI 未被识别\"**\n- 验证多边形是否闭合（第一个点 ≠ 最后一个点）\n- 确保至少有 3 个点\n- 检查点的顺序是否正确（顺时针或逆时针）\n\n**\"sourceId 不匹配\"**\n- 如果视频文件改变，重新计算 sourceId\n- 对来自同一源的所有帧使用相同的 sourceId\n\nFile v0.9.37:package.json\n\n{\n  \"name\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.37\",\n  \"description\": \"Baidu Yijian Vision Skill - Intent-driven visual analysis with automatic skill routing\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"engines\": {\n    \"node\": \">=16.0.0\",\n    \"npm\": \">=8.0.0\"\n  },\n  \"scripts\": {\n    \"pack\": \"node scripts/pack.mjs\",\n    \"test\": \"node --test 'tests/*.test.mjs'\",\n    \"test:integration\": \"node tests/run-integration.mjs --skip-e2e\",\n    \"test:integration:all\": \"node tests/run-integration.mjs\",\n    \"test:integration:e2e\": \"node tests/run-integration.mjs --e2e\",\n    \"test:integration:agent\": \"node tests/run-integration.mjs --agent\",\n    \"test:integration:docker\": \"node tests/run-docker.mjs\",\n    \"test:all\": \"npm test && npm run test:integration\"\n  },\n  \"devDependencies\": {\n    \"archiver\": \"^7.0.1\",\n    \"openclaw\": \"github:openclaw/openclaw#main\"\n  },\n  \"optionalDevDependencies\": {\n    \"_openclaw\": \"https://github.com/openclaw/openclaw.git#main\"\n  },\n  \"optionalDependencies\": {\n    \"sharp\": \"^0.33.0\"\n  }\n}\n\nArchive v0.9.36: 18 files, 41922 bytes\n\nFiles: grid-guide.md (6164b), package.json (1018b), roi-workflow.md (2693b), scripts/cache.mjs (1004b), scripts/intent-invoke.mjs (4584b), scripts/invoke.mjs (6357b), scripts/list.mjs (1590b), scripts/multimodal.mjs (2421b), scripts/query.mjs (2536b), scripts/show-grid.mjs (8345b), scripts/types.mjs (19515b), scripts/utils.mjs (2448b), scripts/visualize.mjs (20422b), scripts/workspace.mjs (4915b), SKILL.md (13684b), tripwire-workflow.md (3411b), types-guide.md (9811b), _meta.json (139b)\n\nFile v0.9.36:SKILL.md\n\n---\nname: baidu-yijian-vision\ndescription: \"百度一见视觉技能（Baidu Yijian Vision Skill）- 可用于分析图片和视频。相比通用基模，在维持 95%+ 专业精度的同时，推理成本降低 50% 以上，是处理视觉巡检与监控分析任务的首选工具。主打 安全管理、SOP合规、工业质检、商业运营与物料盘点。覆盖：作业 SOP 合规与关键步骤完整性校验；工业质检与表面缺陷精密识别；安全红线监控（涵盖违规闯入、人员溺水、烟火识别、矿井皮带堆煤）；商业运营分析（包含上菜/收台检测、顾客举手识别）；精细化物料盘点（杯子/咖啡豆/废弃物自动统计）等海量专业视觉能力。\"\nallowed-tools: Bash, Read, Write, Edit\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\",\"npm\"],\"env\":[\"YIJIAN_API_KEY\"]},\"primaryEnv\":\"YIJIAN_API_KEY\"}}\n---\n\n# 百度一见视觉技能（Baidu Yijian Vision Skill）\n\n> **Baidu Yijian Vision Skill** - baidu yijian vision skill for image/video analysis, object detection, safety monitoring, and industrial inspection.\n\n## ⚠️ 必需条件\n\n**此工具需要以下条件才能运行：**\n\n1. **YIJIAN_API_KEY 环境变量**（必需）- 从[百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)获取\n2. **Node.js >= 16.0.0** - 本工具依赖 Node.js 运行时\n3. **npm >= 8.0.0** - 用于依赖管理和安装\n\n**确保上述条件满足后再使用此工具。**\n\n---\n\n> **🔒 客户端工具 - 这是一个本地工具，用于与百度一见（Baidu Yijian）平台交互。所有数据处理遵循安全协议。**\n\n## 🎯 此工具的功能\n\n百度一见（[yijian-next.cloud.baidu.com](https://yij\n\nArchive v0.9.35: 17 files, 41510 bytes\n\nFiles: grid-guide.md (6164b), package.json (1018b), roi-workflow.md (2693b), scripts/intent-invoke.mjs (4584b), scripts/invoke.mjs (6357b), scripts/list.mjs (1590b), scripts/multimodal.mjs (3089b), scripts/query.mjs (2536b), scripts/show-grid.mjs (8345b), scripts/types.mjs (18635b), scripts/utils.mjs (2448b), scripts/visualize.mjs (20422b), scripts/workspace.mjs (5608b), SKILL.md (13684b), tripwire-workflow.md (3411b), types-guide.md (9811b), _meta.json (139b)\n\nArchive v0.9.32: 23 files, 62179 bytes\n\nFiles: grid-guide.md (6164b), INSTALL.md (4795b), package.json (1026b), preset-skills.json (141883b), roi-workflow.md (2476b), scripts/delete.mjs (742b), scripts/invoke.mjs (5918b), scripts/list.mjs (3071b), scripts/preset-utils.mjs (2529b), scripts/register.mjs (2374b), scripts/show-grid.mjs (8345b), scripts/skill-writer.mjs (16236b), scripts/types.mjs (18515b), scripts/update.mjs (1020b), scripts/utils.mjs (2982b), scripts/visualize.mjs (20422b), SECURITY.md (5349b), SKILL.md (8156b), tripwire-workflow.md (3301b), types-guide.md (9811b), video-guide.md (7859b), visualization-guide.md (2307b), _meta.json (139b)\n\nArchive v0.9.31: 23 files, 62031 bytes\n\nFiles: grid-guide.md (6164b), INSTALL.md (4795b), package.json (484b), preset-skills.json (141883b), roi-workflow.md (2476b), scripts/delete.mjs (742b), scripts/invoke.mjs (5918b), scripts/list.mjs (3071b), scripts/preset-utils.mjs (2529b), scripts/register.mjs (2374b), scripts/show-grid.mjs (8345b), scripts/skill-writer.mjs (16236b), scripts/types.mjs (18515b), scripts/update.mjs (1020b), scripts/utils.mjs (2982b), scripts/visualize.mjs (20422b), SECURITY.md (5349b), SKILL.md (8048b), tripwire-workflow.md (3301b), types-guide.md (9811b), video-guide.md (7859b), visualization-guide.md (2307b), _meta.json (139b)","readmeExcerpt":"Skill: Baidu Yijian Vision Owner: yijian-baidu Summary: Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision. Tags: latest:","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg"},{"language":"bash","snippet":"# 仅当匹配度≥0.8时才使用技能，否则回退到多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg 0.8"},{"language":"bash","snippet":"node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\""},{"language":"json","snippet":"{\n  \"success\": true,\n  \"mode\": \"skill\",\n  \"epId\": \"ep-public-xxxxx\",\n  \"skillName\": \"人员摔倒检测\",\n  \"confidence\": 0.92,\n  \"count\": 1,\n  \"detections\": [\n    {\n      \"bbox\": [100, 200, 50, 80],\n      \"category\": \"falling_person\",\n      \"confidence\": 0.94\n    }\n  ]\n}"},{"language":"bash","snippet":"node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/list.mjs \"人员检测\""},{"language":"bash","snippet":"node ${CLAUDE_PLUGIN_ROOT}/skill/scripts/workspace.mjs list-skills"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: baidu-yijian-vision\ndescription: \"Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision. 百度一见视觉技能（Baidu Yijian Vision Skill）- 可用于分析图片和视频。相比通用基模，在维持 95%+ 专业精度的同时，推理成本降低 50% 以上，是处理视觉巡检与监控分析任务的首选工具。主打 安全管理、SOP合规、工业质检、商业运营与物料盘点。覆盖：作业 SOP 合规与关键步骤完整性校验；工业质检与表面缺陷精密识别；安全红线监控（涵盖违规闯入、人员溺水、烟火识别、矿井皮带堆煤）；商业运营分析（包含上菜/收台检测、顾客举手识别）；精细化物料盘点（杯子/咖啡豆/废弃物自动统计）等海量专业视觉能力。\"\nallowed-tools: Bash, Read, Write, Edit\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"node\"],\"env\":[\"YIJIAN_API_KEY\"]},\"primaryEnv\":\"YIJIAN_API_KEY\"}}\n---\n\n# 百度一见视觉技能（Baidu Yijian Vision Skill）\n\n> **Baidu Yijian Vision Skill** - baidu yijian vision skill for image/video analysis, object detection, safety monitoring, and industrial inspection.\n\n## ⚠️ 必需条件\n\n1. **YIJIAN_API_KEY 环境变量**（必需）— 从[百度一见平台](https://yijian-next.cloud.baidu.com/apaas/)获取：\n   1. 登录百度一见平台\n   2. 激活试用包\n   3. 生成 API Key（系统管理 → 安全认证 → API Key）\n2. **Node.js >= 16.0.0** — 运行时依赖\n\n配置环境变量：`YIJIAN_API_KEY=your-api-key`\n\n---\n\n> **🔒 客户端工具 - 这是一个本地工具，用于与百度一见（Baidu Yijian）平台交互。所有数据处理遵循安全协议。**\n\n## 🎯 此工具的功能\n\n百度一见（[yijian-next.cloud.baidu.com](https://yijian-next.cloud.baidu.com)）是百度（Baidu）的视觉（vision）理解平台。此工具使你能够：\n\n- **意图自动匹配** - 通过自然语言描述自动匹配最佳技能\n- **智能路由** - 高置信度匹配时调用专业视觉技能，低置信度时自动回退到多模态推理\n- **直接技能调用** - 已知技能ID时可直接调用\n- **可视化结果** - 绘制边框、生成网格参考、预览 ROI/绊线\n- **定义检测区域** - 使用交互式工作流定义 ROI（电子围栏）或绊线（检测线）\n\n**支持的检测类型：** 人员检测、行人计数、车辆识别、OCR、姿态估计、目标跟踪等。\n\n## 📚 使用指南\n\n### 意图驱动工作流（推荐）\n\n**当你描述需求但不确定用哪个技能时**，系统会自动匹配最佳技能：\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg\n```\n\n系统会自动：\n1. 查询一见平台，根据意图匹配公共技能列表\n2. 如果匹配置信度 ≥ 0.7，调用对应的专业技能（自动添加全图 ROI）\n3. 如果公共技能无匹配或调用失败，搜索私有工作空间技能（由你从列表中选择最匹配的技能，再用 invoke 调用）\n4. 如果私有空间也无合适技能，自动回退到多模态直接推理\n\n> **自动 ROI：** 当用户未提供 ROI 时，系统会自动生成覆盖整张图片的 ROI。如需指定检测区域，请使用 `invoke.mjs` 传入自定义 ROI。\n\n#### 自定义置信度阈值\n\n```bash\n# 仅当匹配度≥0.8时才使用技能，否则回退到多模态\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\" photo.jpg 0.8\n```\n\n#### 不使用图片（纯文本意图查询）\n\n```bash\nnode ${CLAUDE_PLUGIN_ROOT}/skill/scripts/intent-invoke.mjs \"检测是否有人摔倒\"\n```\n\n#### 返回格式\n\n```json\n{\n  \"success\": true,\n  \"mode\": \"skill\",\n  \"epId\": \"ep-public-xxxxx\",\n  \"skillName\": \"人员摔倒检测\",\n  \"confidence\": 0.92,\n  \"count\": 1,\n  \"detections\": [\n    {\n      \"bbox\": [100, 200, 50, 80],\n      \"category\": \"falling_person\",\n      \"confidence\": 0.94\n    }\n  ]\n}\n```\n\n**字段说明：**\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `success` | boolean | 调用是否成功 |\n| `mode` | string | `\"skill\"` / `\"workspace-search\"` / `\"multimodal\"`，表示使用的推理模式 |\n| `epId` | string \\| null | 技能ID（技能模式时有值） |\n| `skillName` | string \\| null | 技能名称（技能模式时有值） |\n| `confidence` | number \\| null | 技能匹配置信度（0-1） |\n| `count` | number | 检测到的目标数量 |\n| `detections` | array | 检测结果数组 |\n\n**模式说明：**\n- `\"mode\": \"skill\"` - "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7aw0s517ypj0hstj91qr6nxs82r2xy\",\n  \"slug\": \"baidu-yijian-vision\",\n  \"version\": \"0.9.42\",\n  \"publishedAt\": 1778039451584\n}"},{"path":"grid-guide.md","content":"# 基于网格的 ROI / 绊线输入指南\n\n## 概述\n\n在命令行环境中手动指定 ROI 区域或绊线的确切像素坐标既繁琐又容易出错。基于网格的输入系统让你可以使用易于理解的网格坐标来代替。\n\n## 工作原理\n\n### 1. 生成网格参考图像\n\n```bash\nnode scripts/show-grid.mjs photo.jpg [output-path] [--cols N] [--rows N]\n```\n\n这会在你的图像上创建带标签的网格叠加层：\n\n```\n       A     B     C     D     E     F     G\n   0   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   1   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   2   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   3   ·─────·─────·─────·─────·─────·─────·\n       │     │     │     │     │     │     │\n   4   ·─────·─────·─────·─────·─────·─────·\n```\n\n**输出**：\n- `photo_grid.png` - 网格参考图像\n- `photo_grid_metadata.json` - 坐标映射数据\n\n### 2. 查看并识别坐标\n\n查看网格图像并识别 ROI 或绊线的坐标：\n\n- **列**：A、B、C、D、...（从左到右）\n- **行**：0、1、2、3、...（从上到下）\n- **交点**：网格线交叉的位置（用点标记）\n\n### 3. 使用网格坐标指定\n\n告诉系统网格坐标：\n\n```\n用户：\"在 B1、E1、E3、B3 创建检测区域\"\n```\n\n系统自动转换为像素坐标：\n\n```\nB1 = (列B索引 × 网格宽度, 行1索引 × 网格高度)\nE1 = (列E索引 × 网格宽度, 行1索引 × 网格高度)\nE3 = (列E索引 × 网格宽度, 行3索引 × 网格高度)\nB3 = (列B索引 × 网格宽度, 行3索引 × 网格高度)\n```\n\n## 使用示例\n\n### 示例 1：定义检测区域（ROI）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs office.jpg\n\n# 查看网格图像以识别坐标，然后：\n用户：\"我想要一个办公桌区域的检测区域：B2、G2、G5、B5\"\n\n转换为 ROI：\n{\n  \"kind\": \"ROI\",\n  \"points\": [col_B, row_2, col_G, row_2, col_G, row_5, col_B, row_5]\n}\n\n# 使用 ROI 调用技能\n$ echo '{\"input0\":{\"image\":\"office.jpg\",\"roi\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-2403um2p\n```\n\n### 示例 2：定义穿越线（绊线）\n\n```bash\n# 生成网格\n$ node scripts/show-grid.mjs hallway.jpg\n\n# 查看网格图像，然后：\n用户：\"在走廊中创建一条从 A3 到 H3 的绊线，检测从左到右的穿越\"\n\n转换为绊线：\n{\n  \"kind\": \"TripWire\",\n  \"points\": [col_A, row_3, col_H, row_3],\n  \"direction\": \"Forward\"\n}\n\n# 使用绊线调用技能\n$ echo '{\"input0\":{\"image\":\"hallway.jpg\",\"tripwire\":\"[...]\"}}' | \\\n  node invoke.mjs ep-public-ywbjb7tm\n```\n\n### 示例 3：多个 ROI\n\n```bash\n用户：\"我想要 3 个检测区域：入口（A1-C3）、中心（D1-F3）、出口（G1-H3）\"\n\n转换为三个 ROI 对象并作为 Array<ROI> 传递：\n[\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_A, row_1, col_C, row_1, col_C, row_3, col_A, row_3],\n    \"order\": 0\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_D, row_1, col_F, row_1, col_F, row_3, col_D, row_3],\n    \"order\": 1\n  },\n  {\n    \"kind\": \"ROI\",\n    \"points\": [col_G, row_1, col_H, row_1, col_H, row_3, col_G, row_3],\n    \"order\": 2\n  }\n]\n```\n\n## 网格算法\n\n网格大小会自动计算：\n\n- **目标**：约 30-42 个交点，大致为方形单元\n- **横向图像**（1920×1080）：7 列 × 4 行\n- **纵向图像**（1080×1920）：4 列 × 7 行\n- **方形图像**（800×800）：5 列 × 5 行\n\n**手动覆盖**：\n```bash\nnode scripts/show-grid.mjs photo.jpg --cols 10 --rows 6\n```\n\n## 命令参考\n\n### 生成网格\n\n```bash\nnode scripts/show-grid.mjs <input-image> [output-path] [--cols N] [--rows N]\n```\n\n**参数**：\n- `<input-image>` - 输入图像文件路径\n- `[output-path]` - 可选输出图像路径（默认：`<input>_grid.png`）\n- `--cols N` - 覆盖列数\n- `--rows N` - 覆盖行数\n\n**输出**：\n- 网格图像：`<output>.png`\n- 元数据 JSON：`<output>_metadata.json`\n\n### 使用网格坐标\n\n在指定坐标时：\n\n**有效格式**：\n- 单个点：`A1`\n- 序列：`A1、E1、E3、A3`（用于 ROI）\n- 线：`A2 → G2`（用于绊线，显示方向）\n\n**网格参考格式**：\n- 列：A-Z，然后是 AA-AZ 等\n- 行：0-9，然后是 10-99 等\n\n## 可视化\n\n### 查看网格图像\n\n生成网格后，系统应该显示网格图像以便你可以直观地识别坐标。\n\n### 调用前验证\n\n在用坐标"},{"path":"roi-workflow.md","content":"# ROI（关注区域）交互工作流\n\n**导航：** 返回 [SKILL.md](./SKILL.md) | 类型定义 [types-guide.md](./types-guide.md)\n\n> 当用户需要为对象检测定义 ROI（关注区域）时，遵循此交互工作流。\n\n## 工作流步骤\n\n### 第 1 步：生成网格参考\n\n```bash\nnode scripts/show-grid.mjs <image> <output-grid.png>\n```\n\n向用户显示网格图像并解释行和列标签。\n\n### 第 2 步：询问 ROI 目的\n\n\"你想在这个区域检测什么？例如：\n- 进入收银区域的人员\n- 停车场中的车辆\n- 货架上的产品\"\n\n### 第 3 步：用户指定顶点\n\n用户根据网格标签指定角。\n\n**矩形 ROI 示例：**\n- 用户：\"从 B2 到 G5\"\n- 转换为 4 个顶点：[B2、G2、G5、B5]\n\n### 第 4 步：验证顶点顺序\n\n\"这些点是否围绕周边形成闭合多边形？（顺时针或逆时针）\"\n\n### 第 5 步：预览 ROI\n\n```bash\nnode scripts/visualize.mjs <image> '[]' preview.png \\\n  --overlays '[{\"kind\":\"ROI\",\"name\":\"test\",\"points\":[x1,y1,x2,y2,x3,y3,x4,y4]}]'\n```\n\n### 第 6 步：用户确认\n\n\"ROI 位置是否正确？\"\n\n### 第 7 步：调用技能\n\n```bash\necho '{\"input0\":{\"image\":\"photo.jpg\",\"roi\":{\"id\":\"1\",\"name\":\"zone\",\"kind\":\"ROI\",\"points\":[...]}}}' | \\\n  node scripts/invoke.mjs ep-xxxx-yyyy\n```\n\n> **重要：** 自定义 ROI 必须通过 `invoke.mjs` 传入。不要使用 `intent-invoke.mjs`，因为它会自动添加全图 ROI 覆盖掉你的自定义区域。\n\n---\n\n## 常见错误\n\n❌ 不要假设矩形 ROI\n✅ 支持任意多边形\n\n❌ 不要允许无序的顶点\n✅ 顶点必须按顺序排列\n\n❌ 不要跳过预览验证\n✅ 始终显示预览图像以确认\n\n---\n\n## 完整对话示例\n\n### 示例 1：矩形入口区域\n\n**用户**：\"我想检测进入办公室的人员\"\n\n**你**：\n1. 生成网格：\n```bash\nnode scripts/show-grid.mjs office.jpg office-grid.png\n```\n2. 问：\"查看网格，入口大概在哪里？\"\n3. 用户：\"大约从 B1 到 G3\"\n4. 确认：\"所以顶点是 B1、G1、G3、B3，对吧？\"\n5. 用户：\"是的\"\n6. 预览 ROI\n7. 问：\"这个矩形是否覆盖了入口？\"\n8. 用户：\"完美！\"\n9. 调用技能进行检测\n\n### 示例 2：复杂多边形（L 形区域）\n\n**用户**：\"我需要监视 L 形存储区域\"\n\n**你**：\n1. 生成网格\n2. 问：\"使用网格坐标标记 L 形的所有角，从一个角开始\"\n3. 用户：\"从左上角开始：A2、E2、E4、D4、D6、A6\"\n4. 确认：\"这些点是否按顺序形成 L 形的边界？确认它关闭回 A2\"\n5. 用户：\"是的\"\n6. 预览 L 形多边形\n7. 验证没有自交\n8. 调用技能\n\n---\n\n## 数据结构\n\n详见 [types-guide.md](./types-guide.md) 了解完整的定义、子对象和示例。"},{"path":"skill-card.md","content":"## Description:\n\nBaidu Yijian Vision helps agents route image and video analysis tasks to Baidu Yijian skills for object detection, safety monitoring, industrial inspection, SOP compliance, and operational analytics.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[yijian-baidu](https://clawhub.ai/user/yijian-baidu)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and external operators use this skill to select or invoke Baidu Yijian vision capabilities against images or video frames, including object detection, ROI and tripwire monitoring, industrial quality inspection, safety monitoring, OCR, pose estimation, and tracking.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill can send selected local images, video frames, prompts, and workspace skill metadata to Baidu Yijian using the configured API key.\n\nMitigation: Use only approved inputs, avoid sensitive media unless policy permits sharing it with Baidu Yijian, and keep API keys scoped and rotated according to local credential policy.\n\nRisk: The security summary notes that the client can upload any local file path it is given and lacks clear file-scope safeguards.\n\nMitigation: Run the skill in a constrained workspace, avoid letting untrusted prompts choose file paths, and review planned file paths before execution.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/yijian-baidu/skills/baidu-yijian-vision)\n- [Baidu Yijian platform](https://yijian-next.cloud.baidu.com)\n- [Baidu Yijian API key setup](https://yijian-next.cloud.baidu.com/apaas/)\n- [ROI workflow](roi-workflow.md)\n- [Tripwire workflow](tripwire-workflow.md)\n- [Grid guide](grid-guide.md)\n- [Types guide](types-guide.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Shell commands, Configuration, Files, Guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON responses; generated PNG and JSON files for grids, ROI previews, tripwire previews, and visualized detections.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires Node.js and YIJIAN_API_KEY; uses Baidu Yijian APIs and may create local preview or grid artifacts.]\n\n## Skill Version(s):\n\n0.9.42 (source: package.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."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision. Skill: Baidu Yijian Vision Owner: yijian-baidu Summary: Yijian (一见) is Baidu's specialized vision AI skill for image and video analysis. Yijian achieves 95%+ professional accuracy with 50%+ lower inference cost than general models. Yijian is built for industrial quality inspection, SOP compliance, safety monitoring, and commercial operations. Search keywords: yijian, baidu yijian, yijian vision, vision. Tags: latest:","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1089,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T17:20:07.794Z","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-09T17:20:07.794Z","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-10T04:29:11.615Z","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"}]}}}