Ezviz Multimodal Analysis (萤石多模态分析) 通过萤石设备抓图 + 智能体分析接口,实现对摄像头画面的多模态 AI 理解。 --- ⚠️ 安全警告 (安装前必读) 在使用此技能前,请完成以下安全检查: | # | 检查项 | 状态 | 说明 | |---|--------|------|------| | 1 | 凭证权限 | ⚠️ 必需 | 使用 最小权限 的 AppKey/AppSecret,不要用主账号凭证 | | 2 | 配置文件读取 | ⚠️ 注意 | 技能会读取 文件( 但环境变量优先级更高 ) | | 3 | Token 缓存 | ⚠️ 注意 | Token 缓存在 (权限 600) | | 4 | API 域名 | ✅ 已验证 | 和 是萤石官方 API 端点 | | 5 | 代码审查 | ✅ 推荐 | 审查 和 | 🔒 配置文件读取详细说明 凭证获取优先级 (从高到低): 安全建议 : - ✅ 最佳实践 : 使用环境变量,完全避免配置文件读取 - ✅ 隔离配置 : 在专用配置文件只存放萤石凭证,不混用其他服务 - ⚠️ 风险缓解 : 设置环境变量覆盖配置文件(即使配置文件存在也会被忽略) 快速安全配置 凭证优先级 技能按以下顺序获取凭证( 优先级从高到低 ): 1. 环境变量 ( , , , ) ← 推荐 2. Channels 配置…

, device_str):\n return False, \"Device serial contains invalid characters (only A-Z, a-z, 0-9, :, comma allowed)\"\n \n return True, None\n\n\ndef get_credentials_from_env_or_config():\n \"\"\"\n Get credentials from environment variables or config files.\n \n Priority:\n 1. Environment variables (highest)\n 2. OpenClaw config files (~/.openclaw/*.json)\n 3. Command line arguments (lowest)\n \n Returns:\n tuple: (app_key, app_secret, agent_id, source)\n \"\"\"\n app_key = APP_KEY\n app_secret = APP_SECRET\n agent_id = AGENT_ID\n source = \"environment\"\n \n # If env vars are set, use them\n if app_key and app_secret:\n return app_key, app_secret, agent_id, source\n \n # Try to load from config files\n config_paths = [\n os.path.expanduser(\"~/.openclaw/config.json\"),\n os.path.expanduser(\"~/.openclaw/gateway/config.json\"),\n os.path.expanduser(\"~/.openclaw/channels.json\"),\n ]\n \n for config_path in config_paths:\n if not os.path.exists(config_path):\n continue\n \n try:\n with open(config_path, 'r') as f:\n config = json.load(f)\n \n ezviz_config = config.get(\"channels\", {}).get(\"ezviz\", {})\n if ezviz_config.get(\"enabled\", True):\n config_app_key = ezviz_config.get(\"appId\", \"\")\n config_app_secret = ezviz_config.get(\"appSecret\", \"\")\n \n if config_app_key and config_app_secret:\n print(f\"[WARNING] Reading credentials from config file: {config_path}\")\n print(f\"[WARNING] Environment variables have higher priority\")\n app_key = config_app_key\n app_secret = config_app_secret\n source = f\"config:{config_path}\"\n break\n except Exception as e:\n continue\n \n return app_key, app_secret, agent_id, source\n\n\ndef parse_device_list(device_str, channel_str=\"1\"):\n \"\"\"Parse device list from string.\"\"\"\n devices = []\n if not device_str:\n return devices\n \n for item in device_str.split(\",\"):\n item = item.strip()\n if not item:\n continue\n \n if \":\" in item:\n parts = item.split(\":\")\n serial = parts[0].strip().upper()\n channel = int(parts[1].strip()) if len(parts) > 1 else int(channel_str)\n else:\n serial = item.upper()\n channel = int(channel_str)\n \n devices.append((serial, channel))\n \n return devices\n\n\ndef capture_device_image(access_token, device_serial, channel_no=1):\n \"\"\"Capture image from device.\"\"\"\n headers = {\"Content-Type\": \"application/x-www-form-urlencoded\"}\n data = {\n \"accessToken\": access_token,\n \"deviceSerial\": device_serial.upper(),\n \"channelNo\": str(channel_no)\n }\n \n try:\n response = requests.post(DEVICE_CAPTURE_API_URL, headers=headers, data=data, timeout=30)\n result = response.json()\n \n if result.get(\"code\") == \"200\":\n data = result.get(\"data\", {})\n return {\"success\": True, \"pic_url\": data.get(\"picUrl\", \"\")}\n else:\n return {\"success\": False, \"error\": result.get(\"msg\", \"Capture failed\")}\n except Exception as e:\n return {\"success\": False, \"error\": str(e)}\n\n\ndef agent_analysis(access_token, agent_id, image_url, analysis_text=\"请分析这张图片的内容\"):\n \"\"\"\n Call intelligent agent analysis API.\n \n API: POST /api/service/open/intelligent/agent/engine/agent/anaylsis\n \n Args:\n access_token: Ezviz access token\n agent_id: AI agent ID (from console)\n image_url: Image URL to analyze\n analysis_text: Analysis prompt/instruction\n \n Returns:\n dict: Analysis result\n \"\"\"\n print(f\"[INFO] Calling agent analysis: agentId={agent_id[:8]}...\")\n \n headers = {\n \"accessToken\": access_token,\n \"Content-Type\": \"application/json\"\n }\n \n payload = {\n \"appId\": agent_id,\n \"mediaType\": \"image\",\n \"text\": analysis_text,\n \"dataType\": \"url\",\n \"data\": image_url\n }\n \n try:\n response = requests.post(AGENT_ANALYSIS_API_URL, headers=headers, json=payload, timeout=60)\n result = response.json()\n \n # Don't log full response to avoid leaking data\n \n if result.get(\"meta\", {}).get(\"code\") == 200:\n # Parse the data field (it's a JSON string inside JSON)\n data_str = result.get(\"data\", \"\")\n try:\n data_parsed = json.loads(data_str) if data_str else {}\n except:\n data_parsed = {\"raw\": data_str}\n \n print(f\"[SUCCESS] Analysis completed!\")\n return {\n \"success\": True,\n \"analysis\": data_parsed,\n \"raw_data\": data_str\n }\n else:\n meta = result.get(\"meta\", {})\n error_msg = meta.get(\"message\", \"Analysis failed\")\n print(f\"[ERROR] Analysis failed: {error_msg}\")\n return {\n \"success\": False,\n \"error\": error_msg,\n \"code\": meta.get(\"code\")\n }\n except Exception as e:\n print(f\"[ERROR] Analysis failed: {type(e).__name__}\")\n return {\"success\": False, \"error\": str(e)}\n\n\ndef main():\n \"\"\"Main workflow.\"\"\"\n print(\"=\" * 70)\n print(\"Ezviz Multimodal Analysis Skill (萤石多模态理解技能)\")\n print(\"=\" * 70)\n print(f\"[Time] {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\")\n \n # Configuration\n app_key = APP_KEY or sys.argv[1] if len(sys.argv) > 1 else \"\"\n app_secret = APP_SECRET or sys.argv[2] if len(sys.argv) > 2 else \"\"\n device_str = DEVICE_SERIAL or sys.argv[3] if len(sys.argv) > 3 else \"\"\n channel_str = CHANNEL_NO or (sys.argv[4] if len(sys.argv) > 4 else \"1\")\n agent_id = AGENT_ID or sys.argv[5] if len(sys.argv) > 5 else \"\"\n analysis_text = ANALYSIS_TEXT or (sys.argv[6] if len(sys.argv) > 6 else \"请分析这张图片的内容\")\n \n # If env vars not set, try to load from config\n if not app_key or not app_secret:\n app_key, app_secret, config_agent_id, source = get_credentials_from_env_or_config()\n if config_agent_id and not agent_id:\n agent_id = config_agent_id\n \n # Validate device serial\n is_valid, error_msg = validate_device_serial(device_str)\n if not is_valid:\n print(f\"[ERROR] Invalid device serial: {error_msg}\")\n sys.exit(1)\n \n # Validate credentials source\n if \"config:\" in (app_key + app_secret):\n print(f\"[WARNING] Credentials loaded from config file\")\n else:\n print(f\"[OK] Using credentials from environment variables\")\n \n print(f\"[OK] Device serial format validated\")\n \n devices = parse_device_list(device_str, channel_str)\n if not devices:\n print(\"[ERROR] At least one device serial required.\")\n sys.exit(1)\n \n if not agent_id:\n print(\"[ERROR] agentId required. Get from https://openai.ys7.com/console/aiAgent/aiAgent.html\")\n sys.exit(1)\n \n print(f\"[INFO] Target devices: {len(devices)}\")\n for serial, channel in devices:\n print(f\" - {serial} (Channel: {channel})\")\n print(f\"[INFO] Agent ID: {agent_id[:8]}...\")\n print(f\"[INFO] Analysis: {analysis_text}\")\n \n # Step 1: Get access token (using global cache)\n print(f\"\\n{'='*70}\")\n print(\"[Step 1] Getting access token...\")\n print(f\"{'='*70}\")\n \n token_result = get_cached_token(app_key, app_secret)\n \n if not token_result[\"success\"]:\n print(f\"[ERROR] Failed to get token: {token_result.get('error')}\")\n sys.exit(1)\n \n access_token = token_result[\"access_token\"]\n expire_time = token_result.get(\"expire_time\", 0)\n expire_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(expire_time / 1000))\n \n # Step 2: Process each device\n print(f\"\\n{'='*70}\")\n print(\"[Step 2] Capturing and analyzing images...\")\n print(f\"{'='*70}\")\n \n results = {\n \"total\": len(devices),\n \"success\": 0,\n \"failed\": 0,\n \"analyses\": []\n }\n \n for device_serial, channel_no in devices:\n print(f\"\\n{'='*70}\")\n print(f\"[Device] {device_serial} (Channel: {channel_no})\")\n print(f\"{'='*70}\")\n \n # Capture image\n capture_result = capture_device_image(access_token, device_serial, channel_no)\n \n if not capture_result[\"success\"]:\n print(f\"[ERROR] Capture failed: {capture_result.get('error')}\")\n results[\"failed\"] += 1\n results[\"analyses\"].append({\n \"device\": device_serial,\n \"channel\": channel_no,\n \"error\": capture_result.get(\"error\")\n })\n continue\n \n image_url = capture_result[\"pic_url\"]\n print(f\"[SUCCESS] Image captured: {image_url[:60]}...\")\n \n # Agent analysis\n analysis_result = agent_analysis(access_token, agent_id, image_url, analysis_text)\n \n if analysis_result[\"success\"]:\n print(f\"[SUCCESS] Analysis completed!\")\n print(f\"\\n[Analysis Result]\")\n print(json.dumps(analysis_result[\"analysis\"], indent=2, ensure_ascii=False))\n \n results[\"success\"] += 1\n results[\"analyses\"].append({\n \"device\": device_serial,\n \"channel\": channel_no,\n \"image_url\": image_url,\n \"analysis\": analysis_result[\"analysis\"],\n \"success\": True\n })\n else:\n print(f\"[ERROR] Analysis failed: {analysis_result.get('error')}\")\n results[\"failed\"] += 1\n results[\"analyses\"].append({\n \"device\": device_serial,\n \"channel\": channel_no,\n \"image_url\": image_url,\n \"error\": analysis_result.get(\"error\"),\n \"success\": False\n })\n \n # Wait 4s between devices to avoid rate limiting (Ezviz recommends >=4s interval)\n time.sleep(4)\n \n # Summary\n print(f\"\\n{'='*70}\")\n print(\"ANALYSIS SUMMARY\")\n print(f\"{'='*70}\")\n print(f\" Total devices: {results['total']}\")\n print(f\" Success: {results['success']}\")\n print(f\" Failed: {results['failed']}\")\n print(f\"{'='*70}\")\n \n print(f\"\\n[JSON Result]\")\n print(json.dumps(results, indent=2, ensure_ascii=False))\n \n print(f\"\\n{'='*70}\")\n print(\"Workflow completed\")\n print(f\"{'='*70}\")\n \n sys.exit(0 if results[\"failed\"] == 0 else 1)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":12470,"content_sha256":"1f8e5eb42d37a632de1f55159711e5ae4d00c02e707bf96ca500f6d53e11e4df"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Ezviz Multimodal Analysis (萤石多模态分析)","type":"text"}]},{"type":"paragraph","content":[{"text":"通过萤石设备抓图 + 智能体分析接口,实现对摄像头画面的多模态 AI 理解。","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"⚠️ 安全警告 (安装前必读)","type":"text"}]},{"type":"paragraph","content":[{"text":"在使用此技能前,请完成以下安全检查:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"#","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检查项","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"状态","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"凭证权限","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"⚠️ 必需","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"使用","type":"text"},{"text":"最小权限","type":"text","marks":[{"type":"strong"}]},{"text":"的 AppKey/AppSecret,不要用主账号凭证","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"配置文件读取","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"⚠️ 注意","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"技能会读取 ","type":"text"},{"text":"~/.openclaw/*.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 文件(","type":"text"},{"text":"但环境变量优先级更高","type":"text","marks":[{"type":"strong"}]},{"text":")","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"3","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Token 缓存","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"⚠️ 注意","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Token 缓存在 ","type":"text"},{"text":"/tmp/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]},{"text":" (权限 600)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"4","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"API 域名","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 已验证","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" 和 ","type":"text"},{"text":"aidialoggw.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" 是萤石官方 API 端点","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"5","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"代码审查","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 推荐","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"审查 ","type":"text"},{"text":"scripts/multimodal_analysis.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 和 ","type":"text"},{"text":"lib/token_manager.py","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"🔒 配置文件读取详细说明","type":"text"}]},{"type":"paragraph","content":[{"text":"凭证获取优先级","type":"text","marks":[{"type":"strong"}]},{"text":"(从高到低):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"┌─────────────────────────────────────────────────────────────┐\n│ 1. 环境变量 (最高优先级 - 推荐) │\n│ ├─ EZVIZ_APP_KEY │\n│ ├─ EZVIZ_APP_SECRET │\n│ ├─ EZVIZ_DEVICE_SERIAL │\n│ └─ EZVIZ_AGENT_ID │\n│ ✅ 优点:不读取配置文件,完全隔离 │\n├─────────────────────────────────────────────────────────────┤\n│ 2. OpenClaw 配置文件 (仅当环境变量未设置时使用) │\n│ ├─ ~/.openclaw/config.json │\n│ ├─ ~/.openclaw/gateway/config.json │\n│ └─ ~/.openclaw/channels.json │\n│ ⚠️ 注意:只读取 channels.ezviz 字段,不读取其他服务凭证 │\n├─────────────────────────────────────────────────────────────┤\n│ 3. 命令行参数 (最低优先级) │\n│ python3 multimodal_analysis.py appKey appSecret ... │\n└─────────────────────────────────────────────────────────────┘","type":"text"}]},{"type":"paragraph","content":[{"text":"安全建议","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"最佳实践","type":"text","marks":[{"type":"strong"}]},{"text":": 使用环境变量,完全避免配置文件读取","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"隔离配置","type":"text","marks":[{"type":"strong"}]},{"text":": 在专用配置文件只存放萤石凭证,不混用其他服务","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"风险缓解","type":"text","marks":[{"type":"strong"}]},{"text":": 设置环境变量覆盖配置文件(即使配置文件存在也会被忽略)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"快速安全配置","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. 使用环境变量(优先级最高,避免配置文件意外使用)\nexport EZVIZ_APP_KEY=\"your_dedicated_app_key\"\nexport EZVIZ_APP_SECRET=\"your_dedicated_app_secret\"\nexport EZVIZ_DEVICE_SERIAL=\"dev1,dev2,dev3\"\nexport EZVIZ_AGENT_ID=\"your_agent_id\"\n\n# 2. 高安全环境:禁用 Token 缓存\nexport EZVIZ_TOKEN_CACHE=0\n\n# 3. 测试凭证(推荐先用测试账号)\n# 登录 https://openai.ys7.com/ 创建专用应用,仅开通抓图和 AI 分析相关权限\n# 获取 Agent ID: https://openai.ys7.com/console/aiAgent/aiAgent.html","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"凭证优先级","type":"text"}]},{"type":"paragraph","content":[{"text":"技能按以下顺序获取凭证(","type":"text"},{"text":"优先级从高到低","type":"text","marks":[{"type":"strong"}]},{"text":"):","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"环境变量","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"EZVIZ_APP_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"EZVIZ_APP_SECRET","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"EZVIZ_DEVICE_SERIAL","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"EZVIZ_AGENT_ID","type":"text","marks":[{"type":"code_inline"}]},{"text":") ← 推荐","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Channels 配置","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"~/.openclaw/config.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 等)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"命令行参数","type":"text","marks":[{"type":"strong"}]},{"text":" (直接传入)","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"快速开始","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"安装依赖","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"pip install requests","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"设置环境变量","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_APP_KEY=\"your_app_key\"\nexport EZVIZ_APP_SECRET=\"your_app_secret\"\nexport EZVIZ_DEVICE_SERIAL=\"dev1,dev2,dev3\"\nexport EZVIZ_AGENT_ID=\"your_agent_id\"","type":"text"}]},{"type":"paragraph","content":[{"text":"可选环境变量:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_CHANNEL_NO=\"1\" # 通道号,默认 1\nexport EZVIZ_ANALYSIS_TEXT=\"请分析这张图片\" # 分析提示词\nexport EZVIZ_TOKEN_CACHE=\"1\" # Token 缓存:1=启用 (默认), 0=禁用","type":"text"}]},{"type":"paragraph","content":[{"text":"Token 缓存说明","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"默认启用","type":"text","marks":[{"type":"strong"}]},{"text":": 技能默认使用 Token 缓存,提升效率","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"禁用缓存","type":"text","marks":[{"type":"strong"}]},{"text":": 设置 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]},{"text":" 每次重新获取 Token","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"📁 ","type":"text"},{"text":"缓存位置","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"/tmp/ezviz_global_token_cache/global_token_cache.json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"🔒 ","type":"text"},{"text":"文件权限","type":"text","marks":[{"type":"strong"}]},{"text":": 600 (仅所有者可读写)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⏰ ","type":"text"},{"text":"有效期","type":"text","marks":[{"type":"strong"}]},{"text":": 7 天,到期前 5 分钟自动刷新","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"注意","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不需要设置 ","type":"text"},{"text":"EZVIZ_ACCESS_TOKEN","type":"text","marks":[{"type":"code_inline"}]},{"text":"!技能会自动获取 Token","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Agent ID 从萤石 AI 智能体控制台获取:https://openai.ys7.com/console/aiAgent/aiAgent.html","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"图片 URL 有效期 2 小时","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"运行","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 {baseDir}/scripts/multimodal_analysis.py","type":"text"}]},{"type":"paragraph","content":[{"text":"命令行参数:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 单个设备\npython3 {baseDir}/scripts/multimodal_analysis.py appKey appSecret dev1 1 agentId\n\n# 多个设备(逗号分隔)\npython3 {baseDir}/scripts/multimodal_analysis.py appKey appSecret \"dev1,dev2,dev3\" 1 agentId\n\n# 自定义分析提示词\npython3 {baseDir}/scripts/multimodal_analysis.py appKey appSecret dev1 1 agentId \"请识别画面中的人员\"","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Channels 配置(推荐)","type":"text"}]},{"type":"paragraph","content":[{"text":"技能支持从 OpenClaw 的 channels 配置中自动读取萤石凭证,无需单独设置环境变量。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"配置方式","type":"text"}]},{"type":"paragraph","content":[{"text":"在 ","type":"text"},{"text":"~/.openclaw/config.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 或 ","type":"text"},{"text":"~/.openclaw/channels.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中添加:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"channels\": {\n \"ezviz\": {\n \"appId\": \"your_app_id\",\n \"appSecret\": \"your_app_secret\",\n \"domain\": \"https://openai.ys7.com\",\n \"enabled\": true\n }\n }\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"配置搜索顺序","type":"text"}]},{"type":"paragraph","content":[{"text":"技能会按以下顺序查找配置文件:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"~/.openclaw/config.json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"~/.openclaw/gateway/config.json","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"~/.openclaw/channels.json","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"优先级","type":"text"}]},{"type":"paragraph","content":[{"text":"凭证获取优先级:","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"环境变量","type":"text","marks":[{"type":"strong"}]},{"text":" (最高优先级)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"EZVIZ_APP_KEY","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"EZVIZ_APP_SECRET","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"EZVIZ_DEVICE_SERIAL","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"EZVIZ_AGENT_ID","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Channels 配置","type":"text","marks":[{"type":"strong"}]},{"text":" (中等优先级)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"channels.ezviz.appId","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"channels.ezviz.appSecret","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"命令行参数","type":"text","marks":[{"type":"strong"}]},{"text":" (最低优先级)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"优势","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 集中管理凭证","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 无需每次设置环境变量","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 多个技能共享同一配置","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 更符合 OpenClaw 最佳实践","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"工作流程","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"1. 获取 Token (appKey + appSecret → accessToken)\n ↓\n2. 设备抓图 (accessToken + deviceSerial → picUrl)\n ↓\n3. AI 分析 (agentId + picUrl → 分析结果)\n ↓\n4. 输出结果 (JSON + 控制台)","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Token 自动获取说明","type":"text"}]},{"type":"paragraph","content":[{"text":"你不需要手动获取或配置 ","type":"text","marks":[{"type":"strong"}]},{"text":"EZVIZ_ACCESS_TOKEN","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":"!","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"技能会自动处理 Token 的获取:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"首次运行:\n appKey + appSecret → 调用萤石 API → 获取 accessToken (有效期 7 天)\n ↓\n保存到缓存文件(系统临时目录)\n ↓\n后续运行:\n 检查缓存 Token 是否过期\n ├─ 未过期 → 直接使用缓存 Token ✅\n └─ 已过期 → 重新获取新 Token","type":"text"}]},{"type":"paragraph","content":[{"text":"Token 管理特性","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"自动获取","type":"text","marks":[{"type":"strong"}]},{"text":": 首次运行自动调用萤石 API 获取","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"有效期 7 天","type":"text","marks":[{"type":"strong"}]},{"text":": 获取的 Token 7 天内有效","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"智能缓存","type":"text","marks":[{"type":"strong"}]},{"text":": Token 有效期内不重复获取,提升效率","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"安全缓冲","type":"text","marks":[{"type":"strong"}]},{"text":": 到期前 5 分钟自动刷新,避免边界问题","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"无需配置","type":"text","marks":[{"type":"strong"}]},{"text":": 不需要手动设置 ","type":"text"},{"text":"EZVIZ_ACCESS_TOKEN","type":"text","marks":[{"type":"code_inline"}]},{"text":" 环境变量","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"安全存储","type":"text","marks":[{"type":"strong"}]},{"text":": 缓存文件存储在系统临时目录,权限 600","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"可选禁用","type":"text","marks":[{"type":"strong"}]},{"text":": 设置 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]},{"text":" 可禁用缓存(每次运行重新获取)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"输出示例","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"======================================================================\nEzviz Multimodal Analysis Skill (萤石多模态分析)\n======================================================================\n[Time] 2026-03-18 20:50:00\n[INFO] Target devices: 2\n - dev1 (Channel: 1)\n - dev2 (Channel: 1)\n[INFO] Agent ID: 98af3e...\n[INFO] Analysis: 请分析这张图片的内容\n\n======================================================================\nSECURITY VALIDATION\n======================================================================\n[OK] Device serial format validated\n[OK] Using credentials from environment variables\n\n======================================================================\n[Step 1] Getting access token...\n======================================================================\n[INFO] Using cached global token, expires: 2026-03-25 19:21:16\n[SUCCESS] Using cached token, expires: 2026-03-25 19:21:16\n\n======================================================================\n[Step 2] Capturing and analyzing images...\n======================================================================\n\n[Device] dev1 (Channel: 1)\n[SUCCESS] Image captured: https://opencapture.ys7.com/...\n[SUCCESS] Analysis completed!\n\n[Analysis Result]\n{\n \"场景\": \"办公室\",\n \"人员数量\": 3,\n \"主要物体\": [\"办公桌\", \"电脑\", \"椅子\"]\n}\n\n[Device] dev2 (Channel: 1)\n[SUCCESS] Image captured: https://opencapture.ys7.com/...\n[SUCCESS] Analysis completed!\n\n[Analysis Result]\n{\n \"场景\": \"会议室\",\n \"人员数量\": 5,\n \"主要物体\": [\"会议桌\", \"投影仪\", \"椅子\"]\n}\n\n======================================================================\nANALYSIS SUMMARY\n======================================================================\n Total devices: 2\n Success: 2\n Failed: 0\n======================================================================","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"多设备格式","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"格式","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"示例","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"单设备","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dev1","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"默认通道 1","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"多设备","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dev1,dev2,dev3","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"全部使用默认通道","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"指定通道","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dev1:1,dev2:2","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"每个设备独立通道","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"混合","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dev1,dev2:2,dev3","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"部分指定通道","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"API 接口","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"接口","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"URL","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文档","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"获取 Token","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"POST /api/lapp/token/get","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://openai.ys7.com/help/81","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备抓图","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"POST /api/lapp/device/capture","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://openai.ys7.com/help/687","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"智能体分析","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"POST /api/service/open/intelligent/agent/engine/agent/anaylsis","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"https://openai.ys7.com/help/5006","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"网络端点","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"域名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用途","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"萤石开放平台 API(Token、抓图)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"aidialoggw.ys7.com","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"萤石 AI 智能体分析接口","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"格式代码","type":"text"}]},{"type":"paragraph","content":[{"text":"返回字段","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"analysis","type":"text","marks":[{"type":"code_inline"}]},{"text":" - AI 分析结果(依赖智能体配置)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"pic_url","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 抓拍图片 URL(有效期 2 小时)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"错误码","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"200","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 操作成功","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"400","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 参数错误","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"500","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 服务异常","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"10002","type":"text","marks":[{"type":"code_inline"}]},{"text":" - accessToken 过期","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"10028","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 抓图次数超限","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"20007","type":"text","marks":[{"type":"code_inline"}]},{"text":" - 设备不在线","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Tips","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"多设备","type":"text","marks":[{"type":"strong"}]},{"text":": 逗号分隔 ","type":"text"},{"text":"dev1,dev2,dev3","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"指定通道","type":"text","marks":[{"type":"strong"}]},{"text":": 冒号分隔 ","type":"text"},{"text":"dev1:1,dev2:2","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Token 有效期","type":"text","marks":[{"type":"strong"}]},{"text":": 7 天(每次运行自动获取)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"图片有效期","type":"text","marks":[{"type":"strong"}]},{"text":": 2 小时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"频率限制","type":"text","marks":[{"type":"strong"}]},{"text":": 设备间自动间隔 4 秒,避免限流","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"分析超时","type":"text","marks":[{"type":"strong"}]},{"text":": 默认 60 秒","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"智能体","type":"text","marks":[{"type":"strong"}]},{"text":": 从 https://openai.ys7.com/console/aiAgent/aiAgent.html 获取","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"分析提示词示例","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"场景","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"提示词","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"通用分析","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"请分析这张图片的内容\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"人员识别","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"请识别画面中的人员数量和位置\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"行为分析","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"请分析画面中人员的行为活动\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"安全检测","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"请检测画面中是否存在安全隐患\"","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"物体识别","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"\"请识别画面中的主要物体\"","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"注意事项","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"频率限制","type":"text","marks":[{"type":"strong"}]},{"text":": 萤石抓图接口建议间隔 4 秒以上。技能已自动在设备间等待 4 秒,避免触发限流(错误码 10028)","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"隐私合规","type":"text","marks":[{"type":"strong"}]},{"text":": 使用摄像头监控可能涉及隐私问题,确保符合当地法律法规","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"设备要求","type":"text","marks":[{"type":"strong"}]},{"text":": 设备必须在线且支持抓图功能(","type":"text"},{"text":"support_capture=1","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"Token 安全","type":"text","marks":[{"type":"strong"}]},{"text":": Token 会缓存到系统临时目录(自动管理),不写入日志,不发送到非萤石端点","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"分析超时","type":"text","marks":[{"type":"strong"}]},{"text":": AI 分析可能耗时较长,默认超时 60 秒","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"数据流出说明","type":"text"}]},{"type":"paragraph","content":[{"text":"本技能会向第三方服务发送数据","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"数据类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"发送到","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"用途","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是否必需","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appKey/appSecret","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" (萤石)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"获取访问 Token","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 必需","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备序列号","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" (萤石)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"请求抓图","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 必需","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"抓拍图片 URL","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" (萤石)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"AI 智能体分析","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 必需","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"智能体 ID","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"aidialoggw.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" (萤石)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"AI 分析请求","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 必需","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"EZVIZ_ACCESS_TOKEN","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"自动生成","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"每次运行自动获取","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"✅ 自动","type":"text","marks":[{"type":"strong"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"数据流出说明","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"萤石开放平台","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":"): Token 请求、设备抓图 - 萤石官方 API","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"萤石 AI 智能体","type":"text","marks":[{"type":"strong"}]},{"text":" (","type":"text"},{"text":"aidialoggw.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":"): 图片分析 - 萤石官方 API","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ ","type":"text"},{"text":"无其他第三方","type":"text","marks":[{"type":"strong"}]},{"text":": 不会发送数据到其他服务","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"凭证权限建议","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"使用","type":"text"},{"text":"最小权限","type":"text","marks":[{"type":"strong"}]},{"text":"的 appKey/appSecret","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"仅开通必要的 API 权限(设备抓图、AI 分析)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"定期轮换凭证","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不要使用主账号凭证","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"本地处理","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ Token 缓存到系统临时目录(","type":"text"},{"text":"/tmp/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]},{"text":"),权限 600","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ Token 有效期 7 天,到期前 5 分钟自动刷新","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 可禁用缓存:设置 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]},{"text":" 环境变量","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 不记录完整 API 响应","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 图片 URL 只显示前 50 字符","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"应用场景","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"场景","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🏢 办公场景","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"识别人员数量、工作状态、办公环境","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🏭 工厂监控","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检测安全规范、设备状态、人员行为","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🏪 零售分析","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"客流统计、货架状态、顾客行为","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"🏠 智能家居","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"场景识别、异常检测、家庭成员活动","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"使用示例","type":"text"}]},{"type":"paragraph","content":[{"text":"场景 1: 单设备快速分析","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 multimodal_analysis.py your_key your_secret BF6985110 1 your_agent_id","type":"text"}]},{"type":"paragraph","content":[{"text":"场景 2: 多设备批量分析","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_DEVICE_SERIAL=\"dev1,dev2,dev3\"\nexport EZVIZ_AGENT_ID=\"your_agent_id\"\npython3 multimodal_analysis.py","type":"text"}]},{"type":"paragraph","content":[{"text":"场景 3: 自定义分析提示词","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_ANALYSIS_TEXT=\"请检测画面中是否存在安全隐患\"\npython3 multimodal_analysis.py your_key your_secret dev1 1 your_agent_id","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"API 详细说明","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. 获取 AccessToken 接口","type":"text"}]},{"type":"paragraph","content":[{"text":"文档 URL","type":"text","marks":[{"type":"strong"}]},{"text":": https://openai.ys7.com/help/81","type":"text"}]},{"type":"paragraph","content":[{"text":"接口说明","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"AccessToken 是访问令牌,接口调用必备的公共参数","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"有效期 7 天","type":"text","marks":[{"type":"strong"}]},{"text":",有效期内不需要重复申请","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"新 Token 不会使老 Token 失效","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"最佳实践:本地缓存,即将过期或报错 10002 时再获取","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"请求地址","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"POST https://openai.ys7.com/api/lapp/token/get","type":"text"}]},{"type":"paragraph","content":[{"text":"请求参数","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"参数名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是否必选","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appKey","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appKey","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appSecret","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appSecret","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"返回数据","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"data\": {\n \"accessToken\": \"at.xxxxxxxxxxxxx\",\n \"expireTime\": 1470810222045\n },\n \"code\": \"200\",\n \"msg\": \"操作成功!\"\n}","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. 设备抓拍图片接口","type":"text"}]},{"type":"paragraph","content":[{"text":"文档 URL","type":"text","marks":[{"type":"strong"}]},{"text":": https://openai.ys7.com/help/687","type":"text"}]},{"type":"paragraph","content":[{"text":"接口功能","type":"text","marks":[{"type":"strong"}]},{"text":": 抓拍设备当前画面,","type":"text"},{"text":"该接口仅适用于 IPC 或者关联 IPC 的 DVR 设备","type":"text","marks":[{"type":"strong"}]},{"text":"。","type":"text"}]},{"type":"paragraph","content":[{"text":"该接口需要设备支持能力集","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"},{"text":"support_capture=1","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"注意","type":"text","marks":[{"type":"strong"}]},{"text":":设备抓图能力有限,请勿频繁调用,建议每个摄像头调用的间隔","type":"text"},{"text":"4s 以上","type":"text","marks":[{"type":"strong"}]},{"text":"。","type":"text"}]}]},{"type":"paragraph","content":[{"text":"请求地址","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"POST https://openai.ys7.com/api/lapp/device/capture","type":"text"}]},{"type":"paragraph","content":[{"text":"请求参数","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"参数名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是否必选","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"accessToken","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"授权过程获取的 access_token","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"deviceSerial","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备序列号,字母需为大写","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"channelNo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"int","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"通道号,IPC 设备填写 1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"返回数据","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"data\": {\n \"picUrl\": \"https://opencapture.ys7.com/.../capture/xxx.jpg?Expires=xxx&...\"\n },\n \"code\": \"200\",\n \"msg\": \"操作成功!\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"返回字段","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"字段名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"picUrl","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"抓拍后的图片路径,","type":"text"},{"text":"图片保存有效期为 2 小时","type":"text","marks":[{"type":"strong"}]}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. 智能体分析接口","type":"text"}]},{"type":"paragraph","content":[{"text":"文档 URL","type":"text","marks":[{"type":"strong"}]},{"text":": https://openai.ys7.com/help/5006","type":"text"}]},{"type":"paragraph","content":[{"text":"接口功能","type":"text","marks":[{"type":"strong"}]},{"text":": 调用萤石 AI 智能体对图片进行多模态理解分析。","type":"text"}]},{"type":"paragraph","content":[{"text":"请求地址","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"POST https://aidialoggw.ys7.com/api/service/open/intelligent/agent/engine/agent/anaylsis","type":"text"}]},{"type":"paragraph","content":[{"text":"请求参数","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"参数名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"是否必选","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"accessToken","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"授权过程获取的 access_token","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"appId","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"智能体 ID","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"mediaType","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"媒体类型:image","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"text","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"分析提示词","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"dataType","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"数据类型:url","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"data","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"图片 URL","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Y","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"返回数据","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"meta\": {\n \"code\": 200,\n \"message\": \"success\"\n },\n \"data\": \"{\\\"场景\\\":\\\"办公室\\\",\\\"人员数量\\\":3}\"\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"返回字段","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"字段名","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"类型","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"描述","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"meta.code","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Number","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"响应码","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"meta.message","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"响应消息","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"data","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"分析结果(JSON 字符串)","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"🔐 Token 管理与安全","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Token 缓存行为","type":"text"}]},{"type":"paragraph","content":[{"text":"默认行为","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ Token 会缓存到系统临时目录(","type":"text"},{"text":"/tmp/ezviz_global_token_cache/global_token_cache.json","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 缓存有效期 7 天(与 Token 实际有效期一致)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 到期前 5 分钟自动刷新","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 缓存文件权限 600(仅当前用户可读写)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"为什么缓存 Token","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"⚡ ","type":"text"},{"text":"性能","type":"text","marks":[{"type":"strong"}]},{"text":": 避免每次运行都调用 API 获取 Token(减少等待时间)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"🌐 ","type":"text"},{"text":"稳定性","type":"text","marks":[{"type":"strong"}]},{"text":": 减少 API 调用次数,降低网络失败风险","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"💰 ","type":"text"},{"text":"限流保护","type":"text","marks":[{"type":"strong"}]},{"text":": 避免频繁调用触发 API 限流","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"禁用 Token 缓存","type":"text"}]},{"type":"paragraph","content":[{"text":"如果您不希望 Token 被持久化,可以通过以下方式禁用缓存:","type":"text"}]},{"type":"paragraph","content":[{"text":"方法 1: 环境变量","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_TOKEN_CACHE=0\npython3 scripts/multimodal_analysis.py ...","type":"text"}]},{"type":"paragraph","content":[{"text":"方法 2: 修改代码","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from token_manager import get_cached_token\n\n# 禁用缓存\ntoken_result = get_cached_token(app_key, app_secret, use_cache=False)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"缓存文件位置","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"系统","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"路径","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"macOS","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/var/folders/xx/xxxx/T/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Linux","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/tmp/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Windows","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"C:\\Users\\{user}\\AppData\\Local\\Temp\\ezviz_global_token_cache\\","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"查看缓存","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# macOS/Linux\nls -la /tmp/ezviz_global_token_cache/\ncat /tmp/ezviz_global_token_cache/global_token_cache.json\n\n# 清除缓存\nrm -rf /tmp/ezviz_global_token_cache/","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"验证命令","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 1. 验证缓存文件权限\nls -la /tmp/ezviz_global_token_cache/global_token_cache.json\n# 应该显示:-rw------- (600)\n\n# 2. 验证缓存内容\ncat /tmp/ezviz_global_token_cache/global_token_cache.json | python3 -m json.tool\n\n# 3. 验证禁用缓存\nexport EZVIZ_TOKEN_CACHE=0\npython3 scripts/multimodal_analysis.py ...\n# 应该显示 \"Getting access token from Ezviz API\" 而不是 \"Using cached global token\"\n\n# 4. 清除缓存\npython3 lib/token_manager.py clear","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"🔒 安全建议","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. 使用最小权限凭证","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"创建专用的 appKey/appSecret,仅开通必要的 API 权限","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不要使用主账号凭证","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"定期轮换凭证(建议每 90 天)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. 环境变量安全","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 推荐:使用 .env 文件(不要提交到版本控制)\necho \"EZVIZ_APP_KEY=your_key\" >> .env\necho \"EZVIZ_APP_SECRET=your_secret\" >> .env\nchmod 600 .env\n\n# 加载环境变量\nsource .env","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. 禁用缓存(高安全场景)","type":"text"}]},{"type":"paragraph","content":[{"text":"如果您在共享计算机或高安全环境中使用:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_TOKEN_CACHE=0 # 禁用缓存\npython3 scripts/multimodal_analysis.py ...","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"4. 定期清理缓存","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 清除所有缓存的 Token\nrm -rf /tmp/ezviz_global_token_cache/","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"5. 配置文件扫描说明","type":"text"}]},{"type":"paragraph","content":[{"text":"技能会读取以下路径中的萤石配置(仅当环境变量未设置时):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"~/.openclaw/config.json\n~/.openclaw/gateway/config.json\n~/.openclaw/channels.json","type":"text"}]},{"type":"paragraph","content":[{"text":"配置格式","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"channels\": {\n \"ezviz\": {\n \"appId\": \"your_app_id\",\n \"appSecret\": \"your_app_secret\",\n \"domain\": \"https://openai.ys7.com\",\n \"enabled\": true\n }\n }\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"安全建议","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 使用","type":"text"},{"text":"专用萤石凭证","type":"text","marks":[{"type":"strong"}]},{"text":",不要与其他服务共享","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 如果不想使用配置文件扫描,设置环境变量覆盖","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 定期审查配置文件中的凭证权限","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 不要在配置文件中存储主账号凭证","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"禁用配置文件扫描","type":"text","marks":[{"type":"strong"}]},{"text":"(环境变量优先):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"export EZVIZ_APP_KEY=\"your_key\"\nexport EZVIZ_APP_SECRET=\"your_secret\"\n# 环境变量优先级高于配置文件","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"定时任务示例","type":"text"}]},{"type":"paragraph","content":[{"text":"Linux Crontab","type":"text","marks":[{"type":"strong"}]},{"text":" (每 5 分钟):","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"*/5 * * * * cd /path/to/multimodal-analysis && python3 scripts/multimodal_analysis.py >> /var/log/analysis.log 2>&1","type":"text"}]},{"type":"paragraph","content":[{"text":"macOS Launchd","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"xml"},"content":[{"text":"\u003ckey>StartInterval\u003c/key>\n\u003cinteger>300\u003c/integer>","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"安全审计清单 (安装前完成)","type":"text"}]},{"type":"paragraph","content":[{"text":"根据安全审计建议,请在安装前完成以下检查:","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"安装前检查","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"审查代码","type":"text","marks":[{"type":"strong"}]},{"text":" — 阅读 ","type":"text"},{"text":"scripts/multimodal_analysis.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 和 ","type":"text"},{"text":"lib/token_manager.py","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"验证 API 域名","type":"text","marks":[{"type":"strong"}]},{"text":" — 确认 ","type":"text"},{"text":"openai.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" 和 ","type":"text"},{"text":"aidialoggw.ys7.com","type":"text","marks":[{"type":"code_inline"}]},{"text":" 是萤石官方端点","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"准备测试凭证","type":"text","marks":[{"type":"strong"}]},{"text":" — 创建专用萤石应用,仅开通抓图和 AI 分析相关权限","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"获取 Agent ID","type":"text","marks":[{"type":"strong"}]},{"text":" — 从 https://openai.ys7.com/console/aiAgent/aiAgent.html 获取","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"检查配置文件","type":"text","marks":[{"type":"strong"}]},{"text":" — 审查 ","type":"text"},{"text":"~/.openclaw/*.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 中是否有敏感凭证","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"确认缓存位置","type":"text","marks":[{"type":"strong"}]},{"text":" — 确认 ","type":"text"},{"text":"/tmp/ezviz_global_token_cache/","type":"text","marks":[{"type":"code_inline"}]},{"text":" 可接受","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"安装时配置","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"使用环境变量","type":"text","marks":[{"type":"strong"}]},{"text":" — 优先使用 ","type":"text"},{"text":"EZVIZ_APP_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":" 等环境变量","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"禁用缓存","type":"text","marks":[{"type":"strong"}]},{"text":" (可选) — 高安全环境设置 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"最小权限凭证","type":"text","marks":[{"type":"strong"}]},{"text":" — 不要使用主账号凭证","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"隔离环境","type":"text","marks":[{"type":"strong"}]},{"text":" (可选) — 在容器/VM 中运行","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"安装后验证","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"验证缓存权限","type":"text","marks":[{"type":"strong"}]},{"text":" — 确认缓存文件权限为 600","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"测试功能","type":"text","marks":[{"type":"strong"}]},{"text":" — 使用测试设备验证分析和抓图功能","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"监控日志","type":"text","marks":[{"type":"strong"}]},{"text":" — 检查 API 调用是否正常","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"记录凭证","type":"text","marks":[{"type":"strong"}]},{"text":" — 安全存储凭证信息(密钥管理器)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"持续维护","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"定期轮换凭证","type":"text","marks":[{"type":"strong"}]},{"text":" — 建议每 90 天轮换一次","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"审查依赖","type":"text","marks":[{"type":"strong"}]},{"text":" — 定期检查 ","type":"text"},{"text":"requests","type":"text","marks":[{"type":"code_inline"}]},{"text":" 等依赖的安全更新","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"清理缓存","type":"text","marks":[{"type":"strong"}]},{"text":" — 高安全环境使用后清除缓存","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"监控异常","type":"text","marks":[{"type":"strong"}]},{"text":" — 关注异常 API 调用或错误","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"paragraph","content":[{"text":"更新日志","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"日期","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"版本","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"变更","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"说明","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"初始版本","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"与 ezviz-open-picture 文档结构对齐","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加 channels.json 支持","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"从 OpenClaw 配置文件读取凭证,优先级低于环境变量","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加安全验证","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"设备序列号格式验证、凭证来源警告","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加 Token 缓存说明","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"明确缓存行为,支持 ","type":"text"},{"text":"EZVIZ_TOKEN_CACHE=0","type":"text","marks":[{"type":"code_inline"}]},{"text":" 禁用","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"2026-03-18","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"1.0.1","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"添加安全审计清单","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"根据安全建议添加完整检查清单","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"最后更新","type":"text","marks":[{"type":"strong"}]},{"text":": 2026-03-18","type":"text"},{"type":"br"},{"text":"版本","type":"text","marks":[{"type":"strong"}]},{"text":": 1.0.1 (Channels 配置支持版)","type":"text"}]}]},"metadata":{"date":"2026-06-05","name":"ezviz-multimodal-analysis","author":"@skillopedia","source":{"stars":2012,"repo_name":"openclaw-master-skills","origin_url":"https://github.com/leoyeai/openclaw-master-skills/blob/HEAD/skills/hsa-test3/SKILL.md","repo_owner":"leoyeai","body_sha256":"c397f7e83661479efe36cbfb6325cde858d30b7942a6a45f757a9273498a0c43","cluster_key":"5d6038a47379daf0a7ca208b81916c86ed6aae7369ab00c5a8a770baf3aae3b1","clean_bundle":{"format":"clean-skill-bundle-v1","source":"leoyeai/openclaw-master-skills/skills/hsa-test3/SKILL.md","attachments":[{"id":"0b1144bb-2a3f-5c1a-a985-ba05a6dc6ef4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0b1144bb-2a3f-5c1a-a985-ba05a6dc6ef4/attachment.json","path":"_meta.json","size":273,"sha256":"fa880186dac7e4b388fa0e43ac62a1c247fb188f8d8558674c3e7661493fdee3","contentType":"application/json; charset=utf-8"},{"id":"9b20a792-5105-55c4-b18e-cc3441732648","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9b20a792-5105-55c4-b18e-cc3441732648/attachment.py","path":"lib/token_manager.py","size":11608,"sha256":"0ff679fb209846978bdcf902112fee1731ad049e05bcffb2ef624d1b34a8ecf0","contentType":"text/x-python; charset=utf-8"},{"id":"11146766-084e-5e0a-b1e3-51b32d29bc43","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/11146766-084e-5e0a-b1e3-51b32d29bc43/attachment.md","path":"references/ezviz-agent-api.md","size":4278,"sha256":"2ffb0af08b7dd594eb10ba93e6b0fd62eb5c749639ce0aee02cc7f99debf8cda","contentType":"text/markdown; charset=utf-8"},{"id":"16b1b4fe-dac3-5b72-bdbe-1eac9a2f688d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/16b1b4fe-dac3-5b72-bdbe-1eac9a2f688d/attachment.py","path":"scripts/multimodal_analysis.py","size":12470,"sha256":"1f8e5eb42d37a632de1f55159711e5ae4d00c02e707bf96ca500f6d53e11e4df","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"9cfa427bc302547899caf0080a3b1acad5b95d506e8a8cded5f994615cde6f58","attachment_count":4,"text_attachments":4,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":2,"skill_md_path":"skills/hsa-test3/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"web-development","category_label":"Web"},"exact_dupes_collapsed_into_this":1},"version":"v1","category":"web-development","metadata":{"openclaw":{"emoji":"🧠","config":{"tokenCache":{"path":"/tmp/ezviz_global_token_cache/global_token_cache.json","envVar":"EZVIZ_TOKEN_CACHE","default":true,"description":"Enable token caching (default: true). Set to 0 to disable.","permissions":"0600"},"configFileRead":{"paths":["~/.openclaw/config.json","~/.openclaw/gateway/config.json","~/.openclaw/channels.json"],"priority":"lower than environment variables","description":"Reads Ezviz credentials from OpenClaw config files as fallback"}},"requires":{"env":["EZVIZ_APP_KEY","EZVIZ_APP_SECRET","EZVIZ_DEVICE_SERIAL","EZVIZ_AGENT_ID"],"pip":["requests"]},"warnings":["Requires Ezviz credentials with minimal permissions","Token cached in system temp directory (configurable)","May read ~/.openclaw/*.json for credentials (env vars have priority)"],"primaryEnv":"EZVIZ_APP_KEY"}},"import_tag":"clean-skills-v1","description":"萤石多模态理解技能。通过设备抓图 + 智能体分析接口,实现对摄像头画面的 AI 理解分析。\nUse when: 需要对监控画面进行智能分析、场景识别、行为理解、物体检测等多模态 AI 分析任务。\n\n⚠️ 安全要求:必须设置 EZVIZ_APP_KEY 和 EZVIZ_APP_SECRET 环境变量,使用最小权限凭证。\n"}},"renderedAt":1782988986908}

Ezviz Multimodal Analysis (萤石多模态分析) 通过萤石设备抓图 + 智能体分析接口,实现对摄像头画面的多模态 AI 理解。 --- ⚠️ 安全警告 (安装前必读) 在使用此技能前,请完成以下安全检查: | # | 检查项 | 状态 | 说明 | |---|--------|------|------| | 1 | 凭证权限 | ⚠️ 必需 | 使用 最小权限 的 AppKey/AppSecret,不要用主账号凭证 | | 2 | 配置文件读取 | ⚠️ 注意 | 技能会读取 文件( 但环境变量优先级更高 ) | | 3 | Token 缓存 | ⚠️ 注意 | Token 缓存在 (权限 600) | | 4 | API 域名 | ✅ 已验证 | 和 是萤石官方 API 端点 | | 5 | 代码审查 | ✅ 推荐 | 审查 和 | 🔒 配置文件读取详细说明 凭证获取优先级 (从高到低): 安全建议 : - ✅ 最佳实践 : 使用环境变量,完全避免配置文件读取 - ✅ 隔离配置 : 在专用配置文件只存放萤石凭证,不混用其他服务 - ⚠️ 风险缓解 : 设置环境变量覆盖配置文件(即使配置文件存在也会被忽略) 快速安全配置 凭证优先级 技能按以下顺序获取凭证( 优先级从高到低 ): 1. 环境变量 ( , , , ) ← 推荐 2. Channels 配置…