{"id":"9a441235-ae51-487a-890f-92e9c40bb2ab","entityType":"agent","slug":"clawhub-13681882136-kami-image-search","name":"Kami Image Search","canonicalUrl":"https://www.xpersona.co/agent/clawhub-13681882136-kami-image-search","canonicalPath":"/agent/clawhub-13681882136-kami-image-search","generatedAt":"2026-10-11T14:15:34.820Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:09:48.570Z","emptyReason":null},"description":"A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s170wja1qf8kmkzj5brvhsj1r185a522:kami-image-search","sourceUrl":"https://clawhub.ai/13681882136/kami-image-search","homepage":"https://clawhub.ai/13681882136/skills/kami-image-search","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/13681882136/kami-image-search","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/13681882136/skills/kami-image-search","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Kami Image Search technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:09:48.570Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:09:48.570Z","emptyReason":null},"stars":null,"forks":null,"downloads":1091,"packageName":null,"latestVersion":"1.0.7","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:09:48.556Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T10:09:48.570Z","lastCrawledAt":"2026-10-11T10:09:48.556Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T10:09:48.556Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.7","createdAt":"2026-06-10T06:30:36.368Z","changelog":"- Clarified instructions to require showing the RTSP brand template table to the user during camera configuration. - Improved configuration guidance for camera setup and RTSP URL selection. - General documentation updates for onboarding and parameter confirmation. - No functional code or API changes.","fileCount":8,"zipByteSize":25290},{"version":"1.0.6","createdAt":"2026-06-10T01:29:25.339Z","changelog":"- Added RTSP URL templates for common camera brands in the configuration section to help users set up their cameras more easily. - Removed the file skill-card.md. - No changes to the core features or functionality.","fileCount":8,"zipByteSize":25253},{"version":"1.0.5","createdAt":"2026-05-29T03:23:27.307Z","changelog":"- Documentation update only: README.md was updated with no code changes. - No changes to functionality or user experience.","fileCount":8,"zipByteSize":24876},{"version":"1.0.4","createdAt":"2026-05-29T03:10:28.954Z","changelog":"Multi-camera support and device-specific control added. - Support for managing multiple cameras via a new cameras array in image_config.json. - Each camera can have unique settings such as STREAM_URL, DEVICE_ID, and CAPTURE_INTERVAL. - CLI commands can start, stop, check status, and search images for all cameras or by specific device ID. - Legacy single-camera configuration remains compatible. - skill-card.md file removed.","fileCount":8,"zipByteSize":24323},{"version":"1.0.3","createdAt":"2026-05-27T07:53:03.590Z","changelog":"- Added detailed privacy notice, describing cloud API usage, local storage, and user control over data. - Improved hardware and network requirements listing (requires Python 3.10, specific RAM, storage, and optional GPU). - Enhanced installation section to clarify auto-detection and installation of Python 3.10. - Adjusted handling of Kamivision API key setup: checks `image_config.json` field before prompting user. - Removed test files from the distribution.","fileCount":8,"zipByteSize":22449},{"version":"1.0.2","createdAt":"2026-05-13T06:12:51.333Z","changelog":"- Documentation update: new users are now informed they get 200 free credits on first registration at Kamivision Flow. - No code or functional changes; only the SKILL.md file was updated.","fileCount":9,"zipByteSize":18918},{"version":"1.0.1","createdAt":"2026-05-11T03:24:19.317Z","changelog":"- Updated Kamivision API key registration URL in documentation. - No functional or code changes; documentation only.","fileCount":9,"zipByteSize":18898},{"version":"1.0.0","createdAt":"2026-05-11T03:04:45.865Z","changelog":"Initial release of the Kami Image Search skill. - Capture frames from camera streams and describe them with AI for natural language search. - Import and index images manually; supports JPEG, PNG, BMP, WebP formats. - Search your visual history using text queries, with time-range filtering and duplicate frame detection. - Integrates with Kami SmartHome ecosystem and the Kamivision cloud API. - Simple setup via `setup.sh`, requiring your own Kamivision API key and camera stream configuration.","fileCount":9,"zipByteSize":18910}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170wja1qf8kmkzj5brvhsj1r185a522:kami-image-search","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s170wja1qf8kmkzj5brvhsj1r185a522:kami-image-search` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/13681882136/kami-image-search before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T14:15:34.817Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-13681882136-kami-image-search/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T10:09:48.570Z","emptyReason":null},"readme":"Skill: Kami Image Search\n\nOwner: 13681882136\n\nSummary: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\n\nTags: latest:1.0.7\n\nVersion history:\n\nv1.0.7 | 2026-06-10T06:30:36.368Z | auto\n\n- Clarified instructions to require showing the RTSP brand template table to the user during camera configuration.\n- Improved configuration guidance for camera setup and RTSP URL selection.\n- General documentation updates for onboarding and parameter confirmation.\n- No functional code or API changes.\n\nv1.0.6 | 2026-06-10T01:29:25.339Z | auto\n\n- Added RTSP URL templates for common camera brands in the configuration section to help users set up their cameras more easily.\n- Removed the file skill-card.md.\n- No changes to the core features or functionality.\n\nv1.0.5 | 2026-05-29T03:23:27.307Z | auto\n\n- Documentation update only: README.md was updated with no code changes.\n- No changes to functionality or user experience.\n\nv1.0.4 | 2026-05-29T03:10:28.954Z | auto\n\nMulti-camera support and device-specific control added.\n\n- Support for managing multiple cameras via a new cameras array in image_config.json.\n- Each camera can have unique settings such as STREAM_URL, DEVICE_ID, and CAPTURE_INTERVAL.\n- CLI commands can start, stop, check status, and search images for all cameras or by specific device ID.\n- Legacy single-camera configuration remains compatible.\n- skill-card.md file removed.\n\nv1.0.3 | 2026-05-27T07:53:03.590Z | auto\n\n- Added detailed privacy notice, describing cloud API usage, local storage, and user control over data.\n- Improved hardware and network requirements listing (requires Python 3.10, specific RAM, storage, and optional GPU).\n- Enhanced installation section to clarify auto-detection and installation of Python 3.10.\n- Adjusted handling of Kamivision API key setup: checks `image_config.json` field before prompting user.\n- Removed test files from the distribution.\n\nv1.0.2 | 2026-05-13T06:12:51.333Z | auto\n\n- Documentation update: new users are now informed they get 200 free credits on first registration at Kamivision Flow.\n- No code or functional changes; only the SKILL.md file was updated.\n\nv1.0.1 | 2026-05-11T03:24:19.317Z | auto\n\n- Updated Kamivision API key registration URL in documentation.\n- No functional or code changes; documentation only.\n\nv1.0.0 | 2026-05-11T03:04:45.865Z | auto\n\nInitial release of the Kami Image Search skill.\n\n- Capture frames from camera streams and describe them with AI for natural language search.\n- Import and index images manually; supports JPEG, PNG, BMP, WebP formats.\n- Search your visual history using text queries, with time-range filtering and duplicate frame detection.\n- Integrates with Kami SmartHome ecosystem and the Kamivision cloud API.\n- Simple setup via `setup.sh`, requiring your own Kamivision API key and camera stream configuration.\n\nArchive index:\n\nArchive v1.0.7: 8 files, 25290 bytes\n\nFiles: image_config.json (696b), image_search.py (55971b), README.md (6137b), requirements.txt (72b), setup.sh (7888b), skill-card.md (2820b), SKILL.md (9052b), _meta.json (136b)\n\nFile v1.0.7:SKILL.md\n\n---\r\nname: kami-image-search\r\ndescription: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\r\nversion: 1.0.0\r\nauthor: kami-smarthome\r\ntags:\r\n  - smart-home\r\n  - kami\r\n  - smarthome\r\n  - text-to-image search\r\n  - image-search\r\n  - visual-search\r\n  - camera\r\n  - rtsp\r\n  - faiss\r\n  - embedding\r\n  - ai-vision\r\n  - kamivision\r\n  - monitoring\r\n  - home-assistant\r\n  - iot\r\n  - edge-ai\r\ntriggers:\r\n  - smart home\r\n  - kami\r\n  - text to image search\r\n  - home assistant\r\n  - image search\r\n  - search image\r\n  - find image\r\n  - visual search\r\n  - kami image\r\n  - kami smart home\r\n  - search camera\r\n  - what did the camera see\r\n  - find photo\r\n  - search photos\r\n  - look up image\r\n  - camera history\r\n  - check camera\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - python3.10\r\n      hardware:\r\n        cpu: \"2+ cores (x86_64 / ARM64)\"\r\n        memory: \"2 GB+\"\r\n        storage: \"5 GB+\"\r\n        gpu: \"optional\"\r\n      network:\r\n        - \"RTSP camera access (LAN)\"\r\n        - \"Internet (KamiClaw API)\"\r\n      devices:\r\n        - \"RTSP IP camera\"\r\n    emoji: \"🔍\"\r\n---\r\n\r\n# Kami Image Search\r\n\r\n> Search your camera's visual history with natural language.\r\n\r\nMonitor your camera feed, capture frames automatically, and retrieve matching images by simply describing what you're looking for. Powered by the Kamivision cloud API for AI description and embedding generation.\r\n\r\n### Features\r\n\r\n- 🔍 Natural language image search\r\n- 📸 Automatic frame capture from video streams\r\n- 🧠 AI-powered image description (Kamivision API)\r\n- 📁 Manual image import (JPEG / PNG / BMP / WebP)\r\n- 🔁 Built-in duplicate frame detection\r\n- ⏱ Time-range filtering\r\n- 🏠 Designed for Kami SmartHome ecosystem\r\n\r\n### Scenarios\r\n\r\n- Doorstep delivery verification\r\n- Home activity review\r\n- Pet or child monitoring playback\r\n- Batch photo indexing and retrieval\r\n\r\n## Installation\r\n\r\n```bash\r\nbash setup.sh\r\n```\r\n\r\nChecks for Python 3.10, creates `.venv/`, and installs `opencv-python-headless`, `numpy`, `requests`, `Pillow`, `faiss-cpu`. Idempotent.\r\n\r\n## Prerequisites\r\n\r\n- Python 3.10 (setup.sh auto-detects system / pyenv / conda; auto-installs via conda or pyenv if missing)\r\n- `image_config.json` configured with your stream URL(s) and Kamivision API key\r\n- RTSP/RTMP camera(s) online and reachable (for capture mode)\r\n\r\n## Kamivision API Key Setup\r\n\r\nThis skill requires a `KAMIVISION_API_KEY` to access the Kamivision cloud API.\r\n\r\n**Check**: Read the `KAMIVISION_API_KEY` field in `image_config.json`.\r\n\r\n- **If already configured (non-empty)** → Use it directly, no need to ask.\r\n- **If empty** → Ask the user if they already have an API Key:\r\n  - **Yes** → Enter the key directly. It will be saved to `image_config.json`.\r\n  - **No** → Register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain your API key. 🎁 **New users get 200 free credits on first registration.**\r\n\r\n## Parameter Confirmation\r\n\r\nBefore running, confirm these key settings in `image_config.json`:\r\n\r\n| Parameter | Default | Description |\r\n|-----------|---------|-------------|\r\n| `cameras` | (array) | Camera list. Each entry requires `STREAM_URL` and `DEVICE_ID` |\r\n| `cameras[].STREAM_URL` | — | RTSP/RTMP/HTTP camera stream URL |\r\n| `cameras[].DEVICE_ID` | `CAM-001` | Unique camera device identifier |\r\n| `cameras[].CAPTURE_INTERVAL` | `10` | Seconds between frame captures (per-camera override) |\r\n| `KAMIVISION_API_KEY` | — | Your Kamivision API key (shared across all cameras) |\r\n| `SIMILARITY_THRESHOLD` | `0.35` | Search similarity threshold (0.0–1.0) |\r\n| `SEARCH_TOP_K` | `5` | Max results per search |\r\n| `TIME_ZONE_OFFSET` | `0` | UTC offset in hours for local time display (e.g. `-12` for UTC+12, `8` for UTC+8) |\r\n\r\n### Multi-Camera Configuration Example\r\n\r\n```json\r\n{\r\n  \"cameras\": [\r\n    {\r\n      \"STREAM_URL\": \"rtsp://192.168.1.100/stream\",\r\n      \"DEVICE_ID\": \"CAM-FRONT\",\r\n      \"CAPTURE_INTERVAL\": 10\r\n    },\r\n    {\r\n      \"STREAM_URL\": \"rtsp://192.168.1.101/stream\",\r\n      \"DEVICE_ID\": \"CAM-BACK\",\r\n      \"CAPTURE_INTERVAL\": 15\r\n    }\r\n  ],\r\n  \"KAMIVISION_API_KEY\": \"your-api-key\",\r\n  \"DATA_DIR\": \"./image_data\",\r\n  \"TIME_ZONE_OFFSET\": -12\r\n}\r\n```\r\n\r\n- Each camera runs as an independent background process\r\n- `DEVICE_ID` must be unique across all cameras\r\n- Camera entries can override global defaults (`CAPTURE_INTERVAL`, `OUTPUT_WIDTH`, `SKIP_DUPLICATE`, etc.)\r\n- Legacy single-camera config (without `cameras` array) is still supported for backward compatibility\r\n\r\n### Common Brand RTSP Templates\r\n\r\n**MUST show this table to the user** when configuring cameras, so they can pick a URL pattern based on their brand:\r\n\r\n| Brand key | Brand | URL pattern |\r\n|-----------|-------|-------------|\r\n| `hikvision` | Hikvision | `rtsp://{user}:{pwd}@{ip}:554/Streaming/Channels/101` (`101`=ch1 main, `102`=ch1 sub) |\r\n| `dahua` | Dahua | `rtsp://{user}:{pwd}@{ip}:554/cam/realmonitor?channel=1&subtype=0` (`subtype=0` main, `1` sub) |\r\n| `tplink` | TP-Link | `rtsp://{user}:{pwd}@{ip}:554/stream1` (`stream1` main, `stream2` sub) |\r\n| `ezviz` | EZVIZ | `rtsp://admin:{verify_code}@{ip}:554/H264/ch1/main/av_stream` |\r\n| `uniview` | Uniview | `rtsp://{user}:{pwd}@{ip}:554/media/video1` |\r\n| `reolink` | Reolink | `rtsp://{user}:{pwd}@{ip}:554/h264Preview_01_main` |\r\n\r\n**Ask the user: do any parameters need to be changed?**\r\n\r\n## Usage\r\n\r\n### Start Capture\r\n\r\n```bash\r\n# Start all cameras\r\n.venv/bin/python image_search.py --start-capture\r\n\r\n# Start a specific camera\r\n.venv/bin/python image_search.py --start-capture --device CAM-FRONT\r\n```\r\n\r\n### Stop Capture\r\n\r\n```bash\r\n# Stop all cameras\r\n.venv/bin/python image_search.py --stop-capture\r\n\r\n# Stop a specific camera\r\n.venv/bin/python image_search.py --stop-capture --device CAM-FRONT\r\n```\r\n\r\n### Check Status\r\n\r\n```bash\r\n# Status of all cameras\r\n.venv/bin/python image_search.py --status\r\n\r\n# Status of a specific camera\r\n.venv/bin/python image_search.py --status --device CAM-FRONT\r\n```\r\n\r\n### Import Images\r\n\r\n```bash\r\n# Single image\r\n.venv/bin/python image_search.py --import /path/to/photo.jpg --json\r\n\r\n# Entire directory (recursive)\r\n.venv/bin/python image_search.py --import /path/to/photos/ --json\r\n```\r\n\r\n### Search\r\n\r\n```bash\r\n# Search across all cameras\r\n.venv/bin/python image_search.py --search \"keys on the table\" --json\r\n\r\n# Search a specific camera only\r\n.venv/bin/python image_search.py --search \"keys on the table\" --device CAM-FRONT --json\r\n```\r\n\r\n### Search with Time Range\r\n\r\n```bash\r\n.venv/bin/python image_search.py \\\r\n  --search \"person in blue jacket\" \\\r\n  --time-start 1754538000 --time-end 1754541600 \\\r\n  --json\r\n```\r\n\r\n## Output (stdout JSON)\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"query\": \"keys on the table\",\r\n  \"count\": 1,\r\n  \"results\": [\r\n    {\r\n      \"image_name\": \"CAM-FRONT_1754538507.jpg\",\r\n      \"image_path\": \"/opt/image_data/CAM-FRONT/20250815/CAM-FRONT_1754538507.jpg\",\r\n      \"description\": \"A set of keys and a wallet on a table\",\r\n      \"device_id\": \"CAM-FRONT\",\r\n      \"timestamp\": 1754538507,\r\n      \"time\": \"2025-08-15 10:00:07 AM\",\r\n      \"score\": 0.7823\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n## Exit Codes\r\n\r\n| Code | Meaning |\r\n|------|---------|\r\n| `0` | Success |\r\n| `1` | Error (config issue, stream failure, API error, runtime exception) |\r\n\r\n## Troubleshooting\r\n\r\n- `bash: .venv/bin/python: No such file or directory` → Run `bash setup.sh`\r\n- `OpenCV cannot open stream` → Check camera is online and `STREAM_URL` is correct\r\n- `Kamivision API error` → Verify `KAMIVISION_API_KEY` and network connectivity\r\n- `Unsupported file format` → Only JPEG, PNG, BMP, WebP are supported\r\n- `No search results` → Ensure images have been captured/imported; try lowering `SIMILARITY_THRESHOLD`\r\n- `FAISS index load failed` → Index may be corrupted; system rebuilds automatically, re-import data if needed\r\n\r\n## Privacy Notice\r\n\r\nThis skill involves camera video stream frame capture and cloud-based image analysis. Please review the following privacy information before use:\r\n\r\n### Cloud API Calls\r\n\r\n- Relies on **KamiClaw API** for VLM image description and text embedding\r\n- Data sent to the cloud is used solely for real-time inference and **will not be persistently stored or used for model training**\r\n- API communication uses HTTPS encryption\r\n\r\n### Local Data Storage\r\n\r\n- Captured frames are stored in the working directory; users can delete them at any time\r\n- Supports `retention_days` parameter for automatic expiration and deletion of historical data\r\n- API Key is cached in `~/.kami/credentials.json` (permission 600, readable only by the current user)\r\n\r\n### User Control\r\n\r\n- Camera URL is configured by the user; this skill will not auto-discover or connect to cameras\r\n- You can stop the skill at any time, delete local frame data and index files\r\n- You can revoke your API Key at any time to terminate cloud access\r\n\r\n> For more details on our privacy policy, visit: https://kamiclaw-skill.kamihome.com/privacy\n\nFile v1.0.7:README.md\n\n# Kami Image Search\n\nCapture frames from video streams or import local images. Uses the Kamivision cloud API to generate image descriptions + text embeddings (2048-dim) in a single call, with FAISS vector indexing for natural language image retrieval.\n\n## Architecture\n\n```\nCamera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results\n```\n\n## Quick Start\n\n### 1. Setup\n\n```bash\nbash setup.sh\n```\n\nChecks Python 3.10 (auto-installs via conda/pyenv if missing), creates Python virtual environment, installs dependencies.\n\n### 2. Configure\n\nEdit `image_config.json` (multi-camera example):\n\n```json\n{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n      \"DEVICE_ID\": \"CAM-FRONT\",\n      \"CAPTURE_INTERVAL\": 10\n    },\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.101:554/stream1\",\n      \"DEVICE_ID\": \"CAM-BACK\",\n      \"CAPTURE_INTERVAL\": 15\n    }\n  ],\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}\n```\n\nEach camera runs as an independent background process; `DEVICE_ID` must be unique. Legacy single-camera config (flat `STREAM_URL` / `DEVICE_ID` at top level, without the `cameras` array) is still supported.\n\n> `KAMIVISION_API_KEY` is required. If you don't have one, register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain it.\n\n### 3. Usage\n\n```bash\n# Start background frame capture (all cameras)\npython image_search.py --start-capture\n\n# Start a specific camera\npython image_search.py --start-capture --device CAM-FRONT\n\n# Check capture status (all cameras or a specific one)\npython image_search.py --status\npython image_search.py --status --device CAM-FRONT\n\n# Stop capture (all cameras or a specific one)\npython image_search.py --stop-capture\npython image_search.py --stop-capture --device CAM-FRONT\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search across all cameras\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search a specific camera only\npython image_search.py --search \"keys on the table\" --device CAM-FRONT --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24\n```\n\n## Configuration\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `cameras` | Camera list (array). Each entry requires `STREAM_URL` and `DEVICE_ID` | — |\n| `cameras[].STREAM_URL` | Per-camera video stream URL (RTSP/RTMP/HTTP) | `\"\"` |\n| `cameras[].DEVICE_ID` | Per-camera unique identifier | `CAM-001` |\n| `cameras[].CAPTURE_INTERVAL` | Per-camera capture interval (overrides global, seconds) | `10` |\n| `STREAM_URL` | Legacy single-camera stream URL (when `cameras` array is absent) | `\"\"` |\n| `DEVICE_ID` | Legacy single-camera identifier (when `cameras` array is absent) | `CAM-001` |\n| `CAPTURE_INTERVAL` | Global default capture interval (seconds) | `10` |\n| `OUTPUT_WIDTH` / `OUTPUT_HEIGHT` | Output image dimensions | `640` × `360` |\n| `ENABLE_DESCRIPTION` | Enable image description generation | `true` |\n| `VLM_PROMPT` | Custom prompt (empty = cloud default) | `\"\"` |\n| `KAMIVISION_API_URL` | Kamivision API endpoint | `https://kamiclaw-skill-api.kamihome.com/v1/detect` |\n| `KAMIVISION_API_KEY` | Kamivision API key (shared across all cameras) | — |\n| `SIMILARITY_THRESHOLD` | Search similarity threshold | `0.35` |\n| `SEARCH_TOP_K` | Max results returned | `5` |\n| `DATA_DIR` | Data storage directory | `./image_data` |\n| `RETENTION_DAYS` | Data retention days (0 = keep forever) | `30` |\n| `SKIP_DUPLICATE` | Skip duplicate frames | `true` |\n| `DUPLICATE_THRESHOLD` | Duplicate frame pixel diff threshold | `5.0` |\n| `TIME_ZONE_OFFSET` | Timezone offset (hours) | `-12` |\n\n## Cloud API\n\nAll AI capabilities are provided by the Kamivision cloud API — no local models required:\n\n- `SUMMARY`: Takes image base64, returns description (summary) + text embedding (2048-dim)\n- `EMBED`: Takes query text, returns text embedding (2048-dim)\n\nBoth operate in the same text vector space, enabling direct similarity matching.\n\n## Data Storage Structure\n\nEach camera owns its own subdirectory named after its `DEVICE_ID`:\n\n```\nimage_data/\n├── CAM-FRONT/\n│   ├── 20260423/\n│   │   ├── CAM-FRONT_1777010097.jpg\n│   │   └── ...\n│   ├── imported/          # Images from --import\n│   ├── metadata.db        # SQLite metadata\n│   ├── faiss.index        # FAISS vector index\n│   └── capturer.pid       # Background daemon PID\n└── CAM-BACK/\n    └── ...\n```\n\n## CLI Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--start-capture` | Start background frame capture (all cameras, or one when paired with `--device`) |\n| `--stop-capture` | Stop background capture (all cameras, or one when paired with `--device`) |\n| `--status` | Check capture process status (all cameras, or one when paired with `--device`) |\n| `--device DEVICE_ID` | Target a specific camera for the operation above |\n| `--import PATH` | Import image file or directory |\n| `--search TEXT` | Natural language search (optionally narrowed by `--device`) |\n| `--list HOURS` | List images from last N hours |\n| `--json` | JSON output format |\n| `--time-start TS` | Search start time (unix timestamp) |\n| `--time-end TS` | Search end time (unix timestamp) |\n| `--config PATH` | Config file path |\n| `--log-file PATH` | Log file path |\n| `--log-level LEVEL` | Log level (DEBUG/INFO/WARNING/ERROR) |\n| `--export-config` | Export current config to JSON |\n\n## Dependencies\n\n- Python 3.10 (setup.sh auto-installs via conda/pyenv if missing)\n- Kamivision API key\n\nPython packages (setup.sh installs into .venv):\n- opencv-python-headless\n- numpy\n- requests\n- Pillow\n- faiss-cpu\n\nFile v1.0.7:_meta.json\n\n{\n  \"ownerId\": \"kn7e9156e1awf00v1sas2wkdfd85a4zh\",\n  \"slug\": \"kami-image-search\",\n  \"version\": \"1.0.7\",\n  \"publishedAt\": 1781073036368\n}\n\nFile v1.0.7:skill-card.md\n\n## Description:\n\nA skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[13681882136](https://clawhub.ai/user/13681882136)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and smart-home operators use this skill to capture or import camera images, index visual history, and retrieve matching images with natural-language queries. Developers can configure camera streams, retention, and search thresholds for RTSP-based monitoring workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Camera frames, imported images, and search text may be sent to Kamivision for cloud inference.\n\nMitigation: Use the skill only when that data sharing is acceptable, verify KAMIVISION_API_URL is the intended HTTPS Kami endpoint, and avoid processing sensitive images unnecessarily.\n\nRisk: Camera stream URLs and API keys can expose private credentials if stored or logged insecurely.\n\nMitigation: Restrict permissions on image_config.json and log files, avoid embedding camera passwords in stream URLs when possible, and rotate credentials if exposure is suspected.\n\nRisk: The setup script can install Python tooling and may request sudo package installation for build dependencies.\n\nMitigation: Review setup.sh before running it and approve sudo installation only when system-wide changes are acceptable.\n\nRisk: Captured images, imported images, SQLite metadata, and FAISS indexes are stored locally.\n\nMitigation: Set retention to the shortest practical period, protect the data directory, and delete local frame and index data when it is no longer needed.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/13681882136/skills/kami-image-search)\n- [Publisher profile](https://clawhub.ai/user/13681882136)\n- [Kamivision Flow](https://kamiclaw-skill.kamihome.com/)\n- [Kamivision privacy policy](https://kamiclaw-skill.kamihome.com/privacy)\n- [Kamivision API endpoint](https://kamiclaw-skill-api.kamihome.com/v1/detect)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON CLI output]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May produce JSON search results, camera status output, configuration updates, and local image/index files.]\n\n## Skill Version(s):\n\n1.0.7 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.7:image_config.json\n\n{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://admin:xxx@192.168.XXX/stream1\",\n      \"DEVICE_ID\": \"camera1\"\n    },\n    {\n      \"STREAM_URL\": \"rtsp://admin:xxx@192.168.xxx/stream1\",\n      \"DEVICE_ID\": \"camera2\"\n    }\n  ],\n  \"OUTPUT_WIDTH\": 640,\n  \"OUTPUT_HEIGHT\": 360,\n  \"ENABLE_DESCRIPTION\": true,\n  \"VLM_PROMPT\": \"\",\n  \"EMBEDDING_MODE\": \"text\",\n  \"KAMIVISION_API_URL\": \"https://kamiclaw-skill-api.kamihome.com/v1/detect\",\n  \"KAMIVISION_API_KEY\": \"\",\n  \"SIMILARITY_THRESHOLD\": 0.35,\n  \"SEARCH_TOP_K\": 5,\n  \"DATA_DIR\": \"./image_data\",\n  \"RETENTION_DAYS\": 30,\n  \"RECONNECT_DELAY\": 3,\n  \"SKIP_DUPLICATE\": true,\n  \"DUPLICATE_THRESHOLD\": 5.0,\n  \"TIME_ZONE_OFFSET\": -12,\n  \"CAPTURE_INTERVAL\": 10\n}\n\nFile v1.0.7:requirements.txt\n\nopencv-python-headless\r\nnumpy\r\nrequests\r\nPillow\r\nfaiss-cpu\r\nhypothesis\n\nArchive v1.0.6: 8 files, 25253 bytes\n\nFiles: image_config.json (696b), image_search.py (55971b), README.md (6137b), requirements.txt (72b), setup.sh (7888b), skill-card.md (2882b), SKILL.md (9031b), _meta.json (136b)\n\nFile v1.0.6:SKILL.md\n\n---\r\nname: kami-image-search\r\ndescription: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\r\nversion: 1.0.0\r\nauthor: kami-smarthome\r\ntags:\r\n  - smart-home\r\n  - kami\r\n  - smarthome\r\n  - text-to-image search\r\n  - image-search\r\n  - visual-search\r\n  - camera\r\n  - rtsp\r\n  - faiss\r\n  - embedding\r\n  - ai-vision\r\n  - kamivision\r\n  - monitoring\r\n  - home-assistant\r\n  - iot\r\n  - edge-ai\r\ntriggers:\r\n  - smart home\r\n  - kami\r\n  - text to image search\r\n  - home assistant\r\n  - image search\r\n  - search image\r\n  - find image\r\n  - visual search\r\n  - kami image\r\n  - kami smart home\r\n  - search camera\r\n  - what did the camera see\r\n  - find photo\r\n  - search photos\r\n  - look up image\r\n  - camera history\r\n  - check camera\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - python3.10\r\n      hardware:\r\n        cpu: \"2+ cores (x86_64 / ARM64)\"\r\n        memory: \"2 GB+\"\r\n        storage: \"5 GB+\"\r\n        gpu: \"optional\"\r\n      network:\r\n        - \"RTSP camera access (LAN)\"\r\n        - \"Internet (KamiClaw API)\"\r\n      devices:\r\n        - \"RTSP IP camera\"\r\n    emoji: \"🔍\"\r\n---\r\n\r\n# Kami Image Search\r\n\r\n> Search your camera's visual history with natural language.\r\n\r\nMonitor your camera feed, capture frames automatically, and retrieve matching images by simply describing what you're looking for. Powered by the Kamivision cloud API for AI description and embedding generation.\r\n\r\n### Features\r\n\r\n- 🔍 Natural language image search\r\n- 📸 Automatic frame capture from video streams\r\n- 🧠 AI-powered image description (Kamivision API)\r\n- 📁 Manual image import (JPEG / PNG / BMP / WebP)\r\n- 🔁 Built-in duplicate frame detection\r\n- ⏱ Time-range filtering\r\n- 🏠 Designed for Kami SmartHome ecosystem\r\n\r\n### Scenarios\r\n\r\n- Doorstep delivery verification\r\n- Home activity review\r\n- Pet or child monitoring playback\r\n- Batch photo indexing and retrieval\r\n\r\n## Installation\r\n\r\n```bash\r\nbash setup.sh\r\n```\r\n\r\nChecks for Python 3.10, creates `.venv/`, and installs `opencv-python-headless`, `numpy`, `requests`, `Pillow`, `faiss-cpu`. Idempotent.\r\n\r\n## Prerequisites\r\n\r\n- Python 3.10 (setup.sh auto-detects system / pyenv / conda; auto-installs via conda or pyenv if missing)\r\n- `image_config.json` configured with your stream URL(s) and Kamivision API key\r\n- RTSP/RTMP camera(s) online and reachable (for capture mode)\r\n\r\n## Kamivision API Key Setup\r\n\r\nThis skill requires a `KAMIVISION_API_KEY` to access the Kamivision cloud API.\r\n\r\n**Check**: Read the `KAMIVISION_API_KEY` field in `image_config.json`.\r\n\r\n- **If already configured (non-empty)** → Use it directly, no need to ask.\r\n- **If empty** → Ask the user if they already have an API Key:\r\n  - **Yes** → Enter the key directly. It will be saved to `image_config.json`.\r\n  - **No** → Register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain your API key. 🎁 **New users get 200 free credits on first registration.**\r\n\r\n## Parameter Confirmation\r\n\r\nBefore running, confirm these key settings in `image_config.json`:\r\n\r\n| Parameter | Default | Description |\r\n|-----------|---------|-------------|\r\n| `cameras` | (array) | Camera list. Each entry requires `STREAM_URL` and `DEVICE_ID` |\r\n| `cameras[].STREAM_URL` | — | RTSP/RTMP/HTTP camera stream URL |\r\n| `cameras[].DEVICE_ID` | `CAM-001` | Unique camera device identifier |\r\n| `cameras[].CAPTURE_INTERVAL` | `10` | Seconds between frame captures (per-camera override) |\r\n| `KAMIVISION_API_KEY` | — | Your Kamivision API key (shared across all cameras) |\r\n| `SIMILARITY_THRESHOLD` | `0.35` | Search similarity threshold (0.0–1.0) |\r\n| `SEARCH_TOP_K` | `5` | Max results per search |\r\n| `TIME_ZONE_OFFSET` | `0` | UTC offset in hours for local time display (e.g. `-12` for UTC+12, `8` for UTC+8) |\r\n\r\n### Multi-Camera Configuration Example\r\n\r\n```json\r\n{\r\n  \"cameras\": [\r\n    {\r\n      \"STREAM_URL\": \"rtsp://192.168.1.100/stream\",\r\n      \"DEVICE_ID\": \"CAM-FRONT\",\r\n      \"CAPTURE_INTERVAL\": 10\r\n    },\r\n    {\r\n      \"STREAM_URL\": \"rtsp://192.168.1.101/stream\",\r\n      \"DEVICE_ID\": \"CAM-BACK\",\r\n      \"CAPTURE_INTERVAL\": 15\r\n    }\r\n  ],\r\n  \"KAMIVISION_API_KEY\": \"your-api-key\",\r\n  \"DATA_DIR\": \"./image_data\",\r\n  \"TIME_ZONE_OFFSET\": -12\r\n}\r\n```\r\n\r\n- Each camera runs as an independent background process\r\n- `DEVICE_ID` must be unique across all cameras\r\n- Camera entries can override global defaults (`CAPTURE_INTERVAL`, `OUTPUT_WIDTH`, `SKIP_DUPLICATE`, etc.)\r\n- Legacy single-camera config (without `cameras` array) is still supported for backward compatibility\r\n\r\n### Common Brand RTSP Templates\r\n\r\nIf the user is unsure about the RTSP URL, suggest one of these patterns based on camera brand:\r\n\r\n| Brand key | Brand | URL pattern |\r\n|-----------|-------|-------------|\r\n| `hikvision` | Hikvision | `rtsp://{user}:{pwd}@{ip}:554/Streaming/Channels/101` (`101`=ch1 main, `102`=ch1 sub) |\r\n| `dahua` | Dahua | `rtsp://{user}:{pwd}@{ip}:554/cam/realmonitor?channel=1&subtype=0` (`subtype=0` main, `1` sub) |\r\n| `tplink` | TP-Link | `rtsp://{user}:{pwd}@{ip}:554/stream1` (`stream1` main, `stream2` sub) |\r\n| `ezviz` | EZVIZ | `rtsp://admin:{verify_code}@{ip}:554/H264/ch1/main/av_stream` |\r\n| `uniview` | Uniview | `rtsp://{user}:{pwd}@{ip}:554/media/video1` |\r\n| `reolink` | Reolink | `rtsp://{user}:{pwd}@{ip}:554/h264Preview_01_main` |\r\n\r\n**Ask the user: do any parameters need to be changed?**\r\n\r\n## Usage\r\n\r\n### Start Capture\r\n\r\n```bash\r\n# Start all cameras\r\n.venv/bin/python image_search.py --start-capture\r\n\r\n# Start a specific camera\r\n.venv/bin/python image_search.py --start-capture --device CAM-FRONT\r\n```\r\n\r\n### Stop Capture\r\n\r\n```bash\r\n# Stop all cameras\r\n.venv/bin/python image_search.py --stop-capture\r\n\r\n# Stop a specific camera\r\n.venv/bin/python image_search.py --stop-capture --device CAM-FRONT\r\n```\r\n\r\n### Check Status\r\n\r\n```bash\r\n# Status of all cameras\r\n.venv/bin/python image_search.py --status\r\n\r\n# Status of a specific camera\r\n.venv/bin/python image_search.py --status --device CAM-FRONT\r\n```\r\n\r\n### Import Images\r\n\r\n```bash\r\n# Single image\r\n.venv/bin/python image_search.py --import /path/to/photo.jpg --json\r\n\r\n# Entire directory (recursive)\r\n.venv/bin/python image_search.py --import /path/to/photos/ --json\r\n```\r\n\r\n### Search\r\n\r\n```bash\r\n# Search across all cameras\r\n.venv/bin/python image_search.py --search \"keys on the table\" --json\r\n\r\n# Search a specific camera only\r\n.venv/bin/python image_search.py --search \"keys on the table\" --device CAM-FRONT --json\r\n```\r\n\r\n### Search with Time Range\r\n\r\n```bash\r\n.venv/bin/python image_search.py \\\r\n  --search \"person in blue jacket\" \\\r\n  --time-start 1754538000 --time-end 1754541600 \\\r\n  --json\r\n```\r\n\r\n## Output (stdout JSON)\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"query\": \"keys on the table\",\r\n  \"count\": 1,\r\n  \"results\": [\r\n    {\r\n      \"image_name\": \"CAM-FRONT_1754538507.jpg\",\r\n      \"image_path\": \"/opt/image_data/CAM-FRONT/20250815/CAM-FRONT_1754538507.jpg\",\r\n      \"description\": \"A set of keys and a wallet on a table\",\r\n      \"device_id\": \"CAM-FRONT\",\r\n      \"timestamp\": 1754538507,\r\n      \"time\": \"2025-08-15 10:00:07 AM\",\r\n      \"score\": 0.7823\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n## Exit Codes\r\n\r\n| Code | Meaning |\r\n|------|---------|\r\n| `0` | Success |\r\n| `1` | Error (config issue, stream failure, API error, runtime exception) |\r\n\r\n## Troubleshooting\r\n\r\n- `bash: .venv/bin/python: No such file or directory` → Run `bash setup.sh`\r\n- `OpenCV cannot open stream` → Check camera is online and `STREAM_URL` is correct\r\n- `Kamivision API error` → Verify `KAMIVISION_API_KEY` and network connectivity\r\n- `Unsupported file format` → Only JPEG, PNG, BMP, WebP are supported\r\n- `No search results` → Ensure images have been captured/imported; try lowering `SIMILARITY_THRESHOLD`\r\n- `FAISS index load failed` → Index may be corrupted; system rebuilds automatically, re-import data if needed\r\n\r\n## Privacy Notice\r\n\r\nThis skill involves camera video stream frame capture and cloud-based image analysis. Please review the following privacy information before use:\r\n\r\n### Cloud API Calls\r\n\r\n- Relies on **KamiClaw API** for VLM image description and text embedding\r\n- Data sent to the cloud is used solely for real-time inference and **will not be persistently stored or used for model training**\r\n- API communication uses HTTPS encryption\r\n\r\n### Local Data Storage\r\n\r\n- Captured frames are stored in the working directory; users can delete them at any time\r\n- Supports `retention_days` parameter for automatic expiration and deletion of historical data\r\n- API Key is cached in `~/.kami/credentials.json` (permission 600, readable only by the current user)\r\n\r\n### User Control\r\n\r\n- Camera URL is configured by the user; this skill will not auto-discover or connect to cameras\r\n- You can stop the skill at any time, delete local frame data and index files\r\n- You can revoke your API Key at any time to terminate cloud access\r\n\r\n> For more details on our privacy policy, visit: https://kamiclaw-skill.kamihome.com/privacy\n\nFile v1.0.6:README.md\n\n# Kami Image Search\n\nCapture frames from video streams or import local images. Uses the Kamivision cloud API to generate image descriptions + text embeddings (2048-dim) in a single call, with FAISS vector indexing for natural language image retrieval.\n\n## Architecture\n\n```\nCamera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results\n```\n\n## Quick Start\n\n### 1. Setup\n\n```bash\nbash setup.sh\n```\n\nChecks Python 3.10 (auto-installs via conda/pyenv if missing), creates Python virtual environment, installs dependencies.\n\n### 2. Configure\n\nEdit `image_config.json` (multi-camera example):\n\n```json\n{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n      \"DEVICE_ID\": \"CAM-FRONT\",\n      \"CAPTURE_INTERVAL\": 10\n    },\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.101:554/stream1\",\n      \"DEVICE_ID\": \"CAM-BACK\",\n      \"CAPTURE_INTERVAL\": 15\n    }\n  ],\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}\n```\n\nEach camera runs as an independent background process; `DEVICE_ID` must be unique. Legacy single-camera config (flat `STREAM_URL` / `DEVICE_ID` at top level, without the `cameras` array) is still supported.\n\n> `KAMIVISION_API_KEY` is required. If you don't have one, register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain it.\n\n### 3. Usage\n\n```bash\n# Start background frame capture (all cameras)\npython image_search.py --start-capture\n\n# Start a specific camera\npython image_search.py --start-capture --device CAM-FRONT\n\n# Check capture status (all cameras or a specific one)\npython image_search.py --status\npython image_search.py --status --device CAM-FRONT\n\n# Stop capture (all cameras or a specific one)\npython image_search.py --stop-capture\npython image_search.py --stop-capture --device CAM-FRONT\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search across all cameras\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search a specific camera only\npython image_search.py --search \"keys on the table\" --device CAM-FRONT --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24\n```\n\n## Configuration\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `cameras` | Camera list (array). Each entry requires `STREAM_URL` and `DEVICE_ID` | — |\n| `cameras[].STREAM_URL` | Per-camera video stream URL (RTSP/RTMP/HTTP) | `\"\"` |\n| `cameras[].DEVICE_ID` | Per-camera unique identifier | `CAM-001` |\n| `cameras[].CAPTURE_INTERVAL` | Per-camera capture interval (overrides global, seconds) | `10` |\n| `STREAM_URL` | Legacy single-camera stream URL (when `cameras` array is absent) | `\"\"` |\n| `DEVICE_ID` | Legacy single-camera identifier (when `cameras` array is absent) | `CAM-001` |\n| `CAPTURE_INTERVAL` | Global default capture interval (seconds) | `10` |\n| `OUTPUT_WIDTH` / `OUTPUT_HEIGHT` | Output image dimensions | `640` × `360` |\n| `ENABLE_DESCRIPTION` | Enable image description generation | `true` |\n| `VLM_PROMPT` | Custom prompt (empty = cloud default) | `\"\"` |\n| `KAMIVISION_API_URL` | Kamivision API endpoint | `https://kamiclaw-skill-api.kamihome.com/v1/detect` |\n| `KAMIVISION_API_KEY` | Kamivision API key (shared across all cameras) | — |\n| `SIMILARITY_THRESHOLD` | Search similarity threshold | `0.35` |\n| `SEARCH_TOP_K` | Max results returned | `5` |\n| `DATA_DIR` | Data storage directory | `./image_data` |\n| `RETENTION_DAYS` | Data retention days (0 = keep forever) | `30` |\n| `SKIP_DUPLICATE` | Skip duplicate frames | `true` |\n| `DUPLICATE_THRESHOLD` | Duplicate frame pixel diff threshold | `5.0` |\n| `TIME_ZONE_OFFSET` | Timezone offset (hours) | `-12` |\n\n## Cloud API\n\nAll AI capabilities are provided by the Kamivision cloud API — no local models required:\n\n- `SUMMARY`: Takes image base64, returns description (summary) + text embedding (2048-dim)\n- `EMBED`: Takes query text, returns text embedding (2048-dim)\n\nBoth operate in the same text vector space, enabling direct similarity matching.\n\n## Data Storage Structure\n\nEach camera owns its own subdirectory named after its `DEVICE_ID`:\n\n```\nimage_data/\n├── CAM-FRONT/\n│   ├── 20260423/\n│   │   ├── CAM-FRONT_1777010097.jpg\n│   │   └── ...\n│   ├── imported/          # Images from --import\n│   ├── metadata.db        # SQLite metadata\n│   ├── faiss.index        # FAISS vector index\n│   └── capturer.pid       # Background daemon PID\n└── CAM-BACK/\n    └── ...\n```\n\n## CLI Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--start-capture` | Start background frame capture (all cameras, or one when paired with `--device`) |\n| `--stop-capture` | Stop background capture (all cameras, or one when paired with `--device`) |\n| `--status` | Check capture process status (all cameras, or one when paired with `--device`) |\n| `--device DEVICE_ID` | Target a specific camera for the operation above |\n| `--import PATH` | Import image file or directory |\n| `--search TEXT` | Natural language search (optionally narrowed by `--device`) |\n| `--list HOURS` | List images from last N hours |\n| `--json` | JSON output format |\n| `--time-start TS` | Search start time (unix timestamp) |\n| `--time-end TS` | Search end time (unix timestamp) |\n| `--config PATH` | Config file path |\n| `--log-file PATH` | Log file path |\n| `--log-level LEVEL` | Log level (DEBUG/INFO/WARNING/ERROR) |\n| `--export-config` | Export current config to JSON |\n\n## Dependencies\n\n- Python 3.10 (setup.sh auto-installs via conda/pyenv if missing)\n- Kamivision API key\n\nPython packages (setup.sh installs into .venv):\n- opencv-python-headless\n- numpy\n- requests\n- Pillow\n- faiss-cpu\n\nFile v1.0.6:_meta.json\n\n{\n  \"ownerId\": \"kn7e9156e1awf00v1sas2wkdfd85a4zh\",\n  \"slug\": \"kami-image-search\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1781054965339\n}\n\nFile v1.0.6:skill-card.md\n\n## Description: <br>\nA skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[13681882136](https://clawhub.ai/user/13681882136) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and smart-home operators use this skill to index camera frames or imported images, then search visual history with natural-language queries. It is suited for camera-history review tasks such as delivery verification, activity review, and locating events in saved imagery. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Camera frames, imported images, and search text are sent to Kamivision's cloud API. <br>\nMitigation: Review the privacy policy before use, avoid importing unnecessary folders, and only configure cameras or image sources approved for cloud analysis. <br>\nRisk: The skill requires a Kamivision API key and camera stream URLs that may be sensitive. <br>\nMitigation: Keep image_config.json private, use a limited or revocable API key where possible, and remove credentials before sharing logs or artifacts. <br>\nRisk: setup.sh may modify the local Python environment by creating environments or installing Python through conda or pyenv. <br>\nMitigation: Review setup.sh before execution and run it in an isolated user account or disposable environment when appropriate. <br>\nRisk: Background capture control relies on PID files under the configured data directory. <br>\nMitigation: Use a data directory writable only by the intended user and verify capture status before starting or stopping long-running processes. <br>\n\n\n## Reference(s): <br>\n- [ClawHub release page](https://clawhub.ai/13681882136/kami-image-search) <br>\n- [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) <br>\n- [Kamivision privacy policy](https://kamiclaw-skill.kamihome.com/privacy) <br>\n- [Kamivision API endpoint](https://kamiclaw-skill-api.kamihome.com/v1/detect) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with shell commands, JSON configuration, and JSON CLI results] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Search results include image paths, descriptions, device identifiers, timestamps, and similarity scores when JSON output is requested.] <br>\n\n## Skill Version(s): <br>\n1.0.6 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.0.6:image_config.json\n\n{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://admin:xxx@192.168.XXX/stream1\",\n      \"DEVICE_ID\": \"camera1\"\n    },\n    {\n      \"STREAM_URL\": \"rtsp://admin:xxx@192.168.xxx/stream1\",\n      \"DEVICE_ID\": \"camera2\"\n    }\n  ],\n  \"OUTPUT_WIDTH\": 640,\n  \"OUTPUT_HEIGHT\": 360,\n  \"ENABLE_DESCRIPTION\": true,\n  \"VLM_PROMPT\": \"\",\n  \"EMBEDDING_MODE\": \"text\",\n  \"KAMIVISION_API_URL\": \"https://kamiclaw-skill-api.kamihome.com/v1/detect\",\n  \"KAMIVISION_API_KEY\": \"\",\n  \"SIMILARITY_THRESHOLD\": 0.35,\n  \"SEARCH_TOP_K\": 5,\n  \"DATA_DIR\": \"./image_data\",\n  \"RETENTION_DAYS\": 30,\n  \"RECONNECT_DELAY\": 3,\n  \"SKIP_DUPLICATE\": true,\n  \"DUPLICATE_THRESHOLD\": 5.0,\n  \"TIME_ZONE_OFFSET\": -12,\n  \"CAPTURE_INTERVAL\": 10\n}\n\nFile v1.0.6:requirements.txt\n\nopencv-python-headless\r\nnumpy\r\nrequests\r\nPillow\r\nfaiss-cpu\r\nhypothesis\n\nArchive v1.0.5: 8 files, 24876 bytes\n\nFiles: image_config.json (588b), image_search.py (55971b), README.md (6137b), requirements.txt (72b), setup.sh (7888b), skill-card.md (2885b), SKILL.md (8256b), _meta.json (136b)\n\nFile v1.0.5:SKILL.md\n\n---\r\nname: kami-image-search\r\ndescription: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\r\nversion: 1.0.0\r\nauthor: kami-smarthome\r\ntags:\r\n  - smart-home\r\n  - kami\r\n  - smarthome\r\n  - text-to-image search\r\n  - image-search\r\n  - visual-search\r\n  - camera\r\n  - rtsp\r\n  - faiss\r\n  - embedding\r\n  - ai-vision\r\n  - kamivision\r\n  - monitoring\r\n  - home-assistant\r\n  - iot\r\n  - edge-ai\r\ntriggers:\r\n  - smart home\r\n  - kami\r\n  - text to image search\r\n  - home assistant\r\n  - image search\r\n  - search image\r\n  - find image\r\n  - visual search\r\n  - kami image\r\n  - kami smart home\r\n  - search camera\r\n  - what did the camera see\r\n  - find photo\r\n  - search photos\r\n  - look up image\r\n  - camera history\r\n  - check camera\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - python3.10\r\n      hardware:\r\n        cpu: \"2+ cores (x86_64 / ARM64)\"\r\n        memory: \"2 GB+\"\r\n        storage: \"5 GB+\"\r\n        gpu: \"optional\"\r\n      network:\r\n        - \"RTSP camera access (LAN)\"\r\n        - \"Internet (KamiClaw API)\"\r\n      devices:\r\n        - \"RTSP IP camera\"\r\n    emoji: \"🔍\"\r\n---\r\n\r\n# Kami Image Search\r\n\r\n> Search your camera's visual history with natural language.\r\n\r\nMonitor your camera feed, capture frames automatically, and retrieve matching images by simply describing what you're looking for. Powered by the Kamivision cloud API for AI description and embedding generation.\r\n\r\n### Features\r\n\r\n- 🔍 Natural language image search\r\n- 📸 Automatic frame capture from video streams\r\n- 🧠 AI-powered image description (Kamivision API)\r\n- 📁 Manual image import (JPEG / PNG / BMP / WebP)\r\n- 🔁 Built-in duplicate frame detection\r\n- ⏱ Time-range filtering\r\n- 🏠 Designed for Kami SmartHome ecosystem\r\n\r\n### Scenarios\r\n\r\n- Doorstep delivery verification\r\n- Home activity review\r\n- Pet or child monitoring playback\r\n- Batch photo indexing and retrieval\r\n\r\n## Installation\r\n\r\n```bash\r\nbash setup.sh\r\n```\r\n\r\nChecks for Python 3.10, creates `.venv/`, and installs `opencv-python-headless`, `numpy`, `requests`, `Pillow`, `faiss-cpu`. Idempotent.\r\n\r\n## Prerequisites\r\n\r\n- Python 3.10 (setup.sh auto-detects system / pyenv / conda; auto-installs via conda or pyenv if missing)\r\n- `image_config.json` configured with your stream URL(s) and Kamivision API key\r\n- RTSP/RTMP camera(s) online and reachable (for capture mode)\r\n\r\n## Kamivision API Key Setup\r\n\r\nThis skill requires a `KAMIVISION_API_KEY` to access the Kamivision cloud API.\r\n\r\n**Check**: Read the `KAMIVISION_API_KEY` field in `image_config.json`.\r\n\r\n- **If already configured (non-empty)** → Use it directly, no need to ask.\r\n- **If empty** → Ask the user if they already have an API Key:\r\n  - **Yes** → Enter the key directly. It will be saved to `image_config.json`.\r\n  - **No** → Register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain your API key. 🎁 **New users get 200 free credits on first registration.**\r\n\r\n## Parameter Confirmation\r\n\r\nBefore running, confirm these key settings in `image_config.json`:\r\n\r\n| Parameter | Default | Description |\r\n|-----------|---------|-------------|\r\n| `cameras` | (array) | Camera list. Each entry requires `STREAM_URL` and `DEVICE_ID` |\r\n| `cameras[].STREAM_URL` | — | RTSP/RTMP/HTTP camera stream URL |\r\n| `cameras[].DEVICE_ID` | `CAM-001` | Unique camera device identifier |\r\n| `cameras[].CAPTURE_INTERVAL` | `10` | Seconds between frame captures (per-camera override) |\r\n| `KAMIVISION_API_KEY` | — | Your Kamivision API key (shared across all cameras) |\r\n| `SIMILARITY_THRESHOLD` | `0.35` | Search similarity threshold (0.0–1.0) |\r\n| `SEARCH_TOP_K` | `5` | Max results per search |\r\n| `TIME_ZONE_OFFSET` | `0` | UTC offset in hours for local time display (e.g. `-12` for UTC+12, `8` for UTC+8) |\r\n\r\n### Multi-Camera Configuration Example\r\n\r\n```json\r\n{\r\n  \"cameras\": [\r\n    {\r\n      \"STREAM_URL\": \"rtsp://192.168.1.100/stream\",\r\n      \"DEVICE_ID\": \"CAM-FRONT\",\r\n      \"CAPTURE_INTERVAL\": 10\r\n    },\r\n    {\r\n      \"STREAM_URL\": \"rtsp://192.168.1.101/stream\",\r\n      \"DEVICE_ID\": \"CAM-BACK\",\r\n      \"CAPTURE_INTERVAL\": 15\r\n    }\r\n  ],\r\n  \"KAMIVISION_API_KEY\": \"your-api-key\",\r\n  \"DATA_DIR\": \"./image_data\",\r\n  \"TIME_ZONE_OFFSET\": -12\r\n}\r\n```\r\n\r\n- Each camera runs as an independent background process\r\n- `DEVICE_ID` must be unique across all cameras\r\n- Camera entries can override global defaults (`CAPTURE_INTERVAL`, `OUTPUT_WIDTH`, `SKIP_DUPLICATE`, etc.)\r\n- Legacy single-camera config (without `cameras` array) is still supported for backward compatibility\r\n\r\n**Ask the user: do any parameters need to be changed?**\r\n\r\n## Usage\r\n\r\n### Start Capture\r\n\r\n```bash\r\n# Start all cameras\r\n.venv/bin/python image_search.py --start-capture\r\n\r\n# Start a specific camera\r\n.venv/bin/python image_search.py --start-capture --device CAM-FRONT\r\n```\r\n\r\n### Stop Capture\r\n\r\n```bash\r\n# Stop all cameras\r\n.venv/bin/python image_search.py --stop-capture\r\n\r\n# Stop a specific camera\r\n.venv/bin/python image_search.py --stop-capture --device CAM-FRONT\r\n```\r\n\r\n### Check Status\r\n\r\n```bash\r\n# Status of all cameras\r\n.venv/bin/python image_search.py --status\r\n\r\n# Status of a specific camera\r\n.venv/bin/python image_search.py --status --device CAM-FRONT\r\n```\r\n\r\n### Import Images\r\n\r\n```bash\r\n# Single image\r\n.venv/bin/python image_search.py --import /path/to/photo.jpg --json\r\n\r\n# Entire directory (recursive)\r\n.venv/bin/python image_search.py --import /path/to/photos/ --json\r\n```\r\n\r\n### Search\r\n\r\n```bash\r\n# Search across all cameras\r\n.venv/bin/python image_search.py --search \"keys on the table\" --json\r\n\r\n# Search a specific camera only\r\n.venv/bin/python image_search.py --search \"keys on the table\" --device CAM-FRONT --json\r\n```\r\n\r\n### Search with Time Range\r\n\r\n```bash\r\n.venv/bin/python image_search.py \\\r\n  --search \"person in blue jacket\" \\\r\n  --time-start 1754538000 --time-end 1754541600 \\\r\n  --json\r\n```\r\n\r\n## Output (stdout JSON)\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"query\": \"keys on the table\",\r\n  \"count\": 1,\r\n  \"results\": [\r\n    {\r\n      \"image_name\": \"CAM-FRONT_1754538507.jpg\",\r\n      \"image_path\": \"/opt/image_data/CAM-FRONT/20250815/CAM-FRONT_1754538507.jpg\",\r\n      \"description\": \"A set of keys and a wallet on a table\",\r\n      \"device_id\": \"CAM-FRONT\",\r\n      \"timestamp\": 1754538507,\r\n      \"time\": \"2025-08-15 10:00:07 AM\",\r\n      \"score\": 0.7823\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n## Exit Codes\r\n\r\n| Code | Meaning |\r\n|------|---------|\r\n| `0` | Success |\r\n| `1` | Error (config issue, stream failure, API error, runtime exception) |\r\n\r\n## Troubleshooting\r\n\r\n- `bash: .venv/bin/python: No such file or directory` → Run `bash setup.sh`\r\n- `OpenCV cannot open stream` → Check camera is online and `STREAM_URL` is correct\r\n- `Kamivision API error` → Verify `KAMIVISION_API_KEY` and network connectivity\r\n- `Unsupported file format` → Only JPEG, PNG, BMP, WebP are supported\r\n- `No search results` → Ensure images have been captured/imported; try lowering `SIMILARITY_THRESHOLD`\r\n- `FAISS index load failed` → Index may be corrupted; system rebuilds automatically, re-import data if needed\r\n\r\n## Privacy Notice\r\n\r\nThis skill involves camera video stream frame capture and cloud-based image analysis. Please review the following privacy information before use:\r\n\r\n### Cloud API Calls\r\n\r\n- Relies on **KamiClaw API** for VLM image description and text embedding\r\n- Data sent to the cloud is used solely for real-time inference and **will not be persistently stored or used for model training**\r\n- API communication uses HTTPS encryption\r\n\r\n### Local Data Storage\r\n\r\n- Captured frames are stored in the working directory; users can delete them at any time\r\n- Supports `retention_days` parameter for automatic expiration and deletion of historical data\r\n- API Key is cached in `~/.kami/credentials.json` (permission 600, readable only by the current user)\r\n\r\n### User Control\r\n\r\n- Camera URL is configured by the user; this skill will not auto-discover or connect to cameras\r\n- You can stop the skill at any time, delete local frame data and index files\r\n- You can revoke your API Key at any time to terminate cloud access\r\n\r\n> For more details on our privacy policy, visit: https://kamiclaw-skill.kamihome.com/privacy\n\nFile v1.0.5:README.md\n\n# Kami Image Search\n\nCapture frames from video streams or import local images. Uses the Kamivision cloud API to generate image descriptions + text embeddings (2048-dim) in a single call, with FAISS vector indexing for natural language image retrieval.\n\n## Architecture\n\n```\nCamera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results\n```\n\n## Quick Start\n\n### 1. Setup\n\n```bash\nbash setup.sh\n```\n\nChecks Python 3.10 (auto-installs via conda/pyenv if missing), creates Python virtual environment, installs dependencies.\n\n### 2. Configure\n\nEdit `image_config.json` (multi-camera example):\n\n```json\n{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n      \"DEVICE_ID\": \"CAM-FRONT\",\n      \"CAPTURE_INTERVAL\": 10\n    },\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.101:554/stream1\",\n      \"DEVICE_ID\": \"CAM-BACK\",\n      \"CAPTURE_INTERVAL\": 15\n    }\n  ],\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}\n```\n\nEach camera runs as an independent background process; `DEVICE_ID` must be unique. Legacy single-camera config (flat `STREAM_URL` / `DEVICE_ID` at top level, without the `cameras` array) is still supported.\n\n> `KAMIVISION_API_KEY` is required. If you don't have one, register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain it.\n\n### 3. Usage\n\n```bash\n# Start background frame capture (all cameras)\npython image_search.py --start-capture\n\n# Start a specific camera\npython image_search.py --start-capture --device CAM-FRONT\n\n# Check capture status (all cameras or a specific one)\npython image_search.py --status\npython image_search.py --status --device CAM-FRONT\n\n# Stop capture (all cameras or a specific one)\npython image_search.py --stop-capture\npython image_search.py --stop-capture --device CAM-FRONT\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search across all cameras\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search a specific camera only\npython image_search.py --search \"keys on the table\" --device CAM-FRONT --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24\n```\n\n## Configuration\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `cameras` | Camera list (array). Each entry requires `STREAM_URL` and `DEVICE_ID` | — |\n| `cameras[].STREAM_URL` | Per-camera video stream URL (RTSP/RTMP/HTTP) | `\"\"` |\n| `cameras[].DEVICE_ID` | Per-camera unique identifier | `CAM-001` |\n| `cameras[].CAPTURE_INTERVAL` | Per-camera capture interval (overrides global, seconds) | `10` |\n| `STREAM_URL` | Legacy single-camera stream URL (when `cameras` array is absent) | `\"\"` |\n| `DEVICE_ID` | Legacy single-camera identifier (when `cameras` array is absent) | `CAM-001` |\n| `CAPTURE_INTERVAL` | Global default capture interval (seconds) | `10` |\n| `OUTPUT_WIDTH` / `OUTPUT_HEIGHT` | Output image dimensions | `640` × `360` |\n| `ENABLE_DESCRIPTION` | Enable image description generation | `true` |\n| `VLM_PROMPT` | Custom prompt (empty = cloud default) | `\"\"` |\n| `KAMIVISION_API_URL` | Kamivision API endpoint | `https://kamiclaw-skill-api.kamihome.com/v1/detect` |\n| `KAMIVISION_API_KEY` | Kamivision API key (shared across all cameras) | — |\n| `SIMILARITY_THRESHOLD` | Search similarity threshold | `0.35` |\n| `SEARCH_TOP_K` | Max results returned | `5` |\n| `DATA_DIR` | Data storage directory | `./image_data` |\n| `RETENTION_DAYS` | Data retention days (0 = keep forever) | `30` |\n| `SKIP_DUPLICATE` | Skip duplicate frames | `true` |\n| `DUPLICATE_THRESHOLD` | Duplicate frame pixel diff threshold | `5.0` |\n| `TIME_ZONE_OFFSET` | Timezone offset (hours) | `-12` |\n\n## Cloud API\n\nAll AI capabilities are provided by the Kamivision cloud API — no local models required:\n\n- `SUMMARY`: Takes image base64, returns description (summary) + text embedding (2048-dim)\n- `EMBED`: Takes query text, returns text embedding (2048-dim)\n\nBoth operate in the same text vector space, enabling direct similarity matching.\n\n## Data Storage Structure\n\nEach camera owns its own subdirectory named after its `DEVICE_ID`:\n\n```\nimage_data/\n├── CAM-FRONT/\n│   ├── 20260423/\n│   │   ├── CAM-FRONT_1777010097.jpg\n│   │   └── ...\n│   ├── imported/          # Images from --import\n│   ├── metadata.db        # SQLite metadata\n│   ├── faiss.index        # FAISS vector index\n│   └── capturer.pid       # Background daemon PID\n└── CAM-BACK/\n    └── ...\n```\n\n## CLI Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--start-capture` | Start background frame capture (all cameras, or one when paired with `--device`) |\n| `--stop-capture` | Stop background capture (all cameras, or one when paired with `--device`) |\n| `--status` | Check capture process status (all cameras, or one when paired with `--device`) |\n| `--device DEVICE_ID` | Target a specific camera for the operation above |\n| `--import PATH` | Import image file or directory |\n| `--search TEXT` | Natural language search (optionally narrowed by `--device`) |\n| `--list HOURS` | List images from last N hours |\n| `--json` | JSON output format |\n| `--time-start TS` | Search start time (unix timestamp) |\n| `--time-end TS` | Search end time (unix timestamp) |\n| `--config PATH` | Config file path |\n| `--log-file PATH` | Log file path |\n| `--log-level LEVEL` | Log level (DEBUG/INFO/WARNING/ERROR) |\n| `--export-config` | Export current config to JSON |\n\n## Dependencies\n\n- Python 3.10 (setup.sh auto-installs via conda/pyenv if missing)\n- Kamivision API key\n\nPython packages (setup.sh installs into .venv):\n- opencv-python-headless\n- numpy\n- requests\n- Pillow\n- faiss-cpu\n\nFile v1.0.5:_meta.json\n\n{\n  \"ownerId\": \"kn7e9156e1awf00v1sas2wkdfd85a4zh\",\n  \"slug\": \"kami-image-search\",\n  \"version\": \"1.0.5\",\n  \"publishedAt\": 1780025007307\n}\n\nFile v1.0.5:skill-card.md\n\n## Description: <br>\nA skill by Kami SmartHome that captures frames from cameras, describes them with AI, and searches visual history using natural language. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[13681882136](https://clawhub.ai/user/13681882136) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and developers use this skill to index camera frames or imported images, then search visual history with natural-language queries. Typical uses include home activity review, delivery verification, and camera-history lookup. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Captured camera frames, imported images, and camera-history search text may be sent to the Kamivision cloud API for processing. <br>\nMitigation: Use the skill only for cameras and images where cloud processing is acceptable, review the linked privacy information, and obtain any required consent before capture or import. <br>\nRisk: Camera stream URLs, API keys, local credentials, and logs may contain sensitive information. <br>\nMitigation: Restrict permissions on configuration, credential, data, and log files; avoid committing them; and rotate or revoke API keys if exposure is suspected. <br>\nRisk: Background capture can continuously collect private camera images. <br>\nMitigation: Start and stop capture deliberately, check status before leaving it running, and set retention to match privacy and storage requirements. <br>\nRisk: The setup script installs Python tooling and dependencies before the skill is used. <br>\nMitigation: Review setup.sh before running it and install in a controlled environment where dependency changes are acceptable. <br>\n\n\n## Reference(s): <br>\n- [Kami Image Search on ClawHub](https://clawhub.ai/13681882136/kami-image-search) <br>\n- [Publisher Profile](https://clawhub.ai/user/13681882136) <br>\n- [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) <br>\n- [Kamivision Privacy Policy](https://kamiclaw-skill.kamihome.com/privacy) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, JSON, Shell commands, Configuration, Guidance] <br>\n**Output Format:** [Markdown guidance with shell commands and JSON command output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May start or stop background frame capture and write image files, SQLite metadata, FAISS indexes, logs, and local configuration under configured paths.] <br>\n\n## Skill Version(s): <br>\n1.0.5 (source: server release metadata; artifact frontmatter says 1.0.0) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.0.5:image_config.json\n\n{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://test.example/stream\",\n      \"DEVICE_ID\": \"CAM-001\",\n      \"CAPTURE_INTERVAL\": 10\n    }\n  ],\n  \"OUTPUT_WIDTH\": 640,\n  \"OUTPUT_HEIGHT\": 360,\n  \"ENABLE_DESCRIPTION\": true,\n  \"VLM_PROMPT\": \"\",\n  \"EMBEDDING_MODE\": \"text\",\n  \"KAMIVISION_API_URL\": \"https://kamiclaw-skill-api.kamihome.com/v1/detect\",\n  \"KAMIVISION_API_KEY\": \"\",\n  \"SIMILARITY_THRESHOLD\": 0.35,\n  \"SEARCH_TOP_K\": 5,\n  \"DATA_DIR\": \"./image_data\",\n  \"RETENTION_DAYS\": 30,\n  \"RECONNECT_DELAY\": 3,\n  \"SKIP_DUPLICATE\": true,\n  \"DUPLICATE_THRESHOLD\": 5.0,\n  \"TIME_ZONE_OFFSET\": -12\n}\n\nFile v1.0.5:requirements.txt\n\nopencv-python-headless\r\nnumpy\r\nrequests\r\nPillow\r\nfaiss-cpu\r\nhypothesis\n\nArchive v1.0.4: 8 files, 24323 bytes\n\nFiles: image_config.json (588b), image_search.py (55971b), README.md (4392b), requirements.txt (72b), setup.sh (7888b), skill-card.md (2635b), SKILL.md (8256b), _meta.json (136b)\n\nFile v1.0.4:SKILL.md\n\n---\r\nname: kami-image-search\r\ndescription: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\r\nversion: 1.0.0\r\nauthor: kami-smarthome\r\ntags:\r\n  - smart-home\r\n  - kami\r\n  - smarthome\r\n  - text-to-image search\r\n  - image-search\r\n  - visual-search\r\n  - camera\r\n  - rtsp\r\n  - faiss\r\n  - embedding\r\n  - ai-vision\r\n  - kamivision\r\n  - monitoring\r\n  - home-assistant\r\n  - iot\r\n  - edge-ai\r\ntriggers:\r\n  - smart home\r\n  - kami\r\n  - text to image search\r\n  - home assistant\r\n  - image search\r\n  - search image\r\n  - find image\r\n  - visual search\r\n  - kami image\r\n  - kami smart home\r\n  - search camera\r\n  - what did the camera see\r\n  - find photo\r\n  - search photos\r\n  - look up image\r\n  - camera history\r\n  - check camera\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - python3.10\r\n      hardware:\r\n        cpu: \"2+ cores (x86_64 / ARM64)\"\r\n        memory: \"2 GB+\"\r\n        storage: \"5 GB+\"\r\n        gpu: \"optional\"\r\n      network:\r\n        - \"RTSP camera access (LAN)\"\r\n        - \"Internet (KamiClaw API)\"\r\n      devices:\r\n        - \"RTSP IP camera\"\r\n    emoji: \"🔍\"\r\n---\r\n\r\n# Kami Image Search\r\n\r\n> Search your camera's visual history with natural language.\r\n\r\nMonitor your camera feed, capture frames automatically, and retrieve matching images by simply describing what you're looking for. Powered by the Kamivision cloud API for AI description and embedding generation.\r\n\r\n### Features\r\n\r\n- 🔍 Natural language image search\r\n- 📸 Automatic frame capture from video streams\r\n- 🧠 AI-powered image description (Kamivision API)\r\n- 📁 Manual image import (JPEG / PNG / BMP / WebP)\r\n- 🔁 Built-in duplicate frame detection\r\n- ⏱ Time-range filtering\r\n- 🏠 Designed for Kami SmartHome ecosystem\r\n\r\n### Scenarios\r\n\r\n- Doorstep delivery verification\r\n- Home activity review\r\n- Pet or child monitoring playback\r\n- Batch photo indexing and retrieval\r\n\r\n## Installation\r\n\r\n```bash\r\nbash setup.sh\r\n```\r\n\r\nChecks for Python 3.10, creates `.venv/`, and installs `opencv-python-headless`, `numpy`, `requests`, `Pillow`, `faiss-cpu`. Idempotent.\r\n\r\n## Prerequisites\r\n\r\n- Python 3.10 (setup.sh auto-detects system / pyenv / conda; auto-installs via conda or pyenv if missing)\r\n- `image_config.json` configured with your stream URL(s) and Kamivision API key\r\n- RTSP/RTMP camera(s) online and reachable (for capture mode)\r\n\r\n## Kamivision API Key Setup\r\n\r\nThis skill requires a `KAMIVISION_API_KEY` to access the Kamivision cloud API.\r\n\r\n**Check**: Read the `KAMIVISION_API_KEY` field in `image_config.json`.\r\n\r\n- **If already configured (non-empty)** → Use it directly, no need to ask.\r\n- **If empty** → Ask the user if they already have an API Key:\r\n  - **Yes** → Enter the key directly. It will be saved to `image_config.json`.\r\n  - **No** → Register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain your API key. 🎁 **New users get 200 free credits on first registration.**\r\n\r\n## Parameter Confirmation\r\n\r\nBefore running, confirm these key settings in `image_config.json`:\r\n\r\n| Parameter | Default | Description |\r\n|-----------|---------|-------------|\r\n| `cameras` | (array) | Camera list. Each entry requires `STREAM_URL` and `DEVICE_ID` |\r\n| `cameras[].STREAM_URL` | — | RTSP/RTMP/HTTP camera stream URL |\r\n| `cameras[].DEVICE_ID` | `CAM-001` | Unique camera device identifier |\r\n| `cameras[].CAPTURE_INTERVAL` | `10` | Seconds between frame captures (per-camera override) |\r\n| `KAMIVISION_API_KEY` | — | Your Kamivision API key (shared across all cameras) |\r\n| `SIMILARITY_THRESHOLD` | `0.35` | Search similarity threshold (0.0–1.0) |\r\n| `SEARCH_TOP_K` | `5` | Max results per search |\r\n| `TIME_ZONE_OFFSET` | `0` | UTC offset in hours for local time display (e.g. `-12` for UTC+12, `8` for UTC+8) |\r\n\r\n### Multi-Camera Configuration Example\r\n\r\n```json\r\n{\r\n  \"cameras\": [\r\n    {\r\n      \"STREAM_URL\": \"rtsp://192.168.1.100/stream\",\r\n      \"DEVICE_ID\": \"CAM-FRONT\",\r\n      \"CAPTURE_INTERVAL\": 10\r\n    },\r\n    {\r\n      \"STREAM_URL\": \"rtsp://192.168.1.101/stream\",\r\n      \"DEVICE_ID\": \"CAM-BACK\",\r\n      \"CAPTURE_INTERVAL\": 15\r\n    }\r\n  ],\r\n  \"KAMIVISION_API_KEY\": \"your-api-key\",\r\n  \"DATA_DIR\": \"./image_data\",\r\n  \"TIME_ZONE_OFFSET\": -12\r\n}\r\n```\r\n\r\n- Each camera runs as an independent background process\r\n- `DEVICE_ID` must be unique across all cameras\r\n- Camera entries can override global defaults (`CAPTURE_INTERVAL`, `OUTPUT_WIDTH`, `SKIP_DUPLICATE`, etc.)\r\n- Legacy single-camera config (without `cameras` array) is still supported for backward compatibility\r\n\r\n**Ask the user: do any parameters need to be changed?**\r\n\r\n## Usage\r\n\r\n### Start Capture\r\n\r\n```bash\r\n# Start all cameras\r\n.venv/bin/python image_search.py --start-capture\r\n\r\n# Start a specific camera\r\n.venv/bin/python image_search.py --start-capture --device CAM-FRONT\r\n```\r\n\r\n### Stop Capture\r\n\r\n```bash\r\n# Stop all cameras\r\n.venv/bin/python image_search.py --stop-capture\r\n\r\n# Stop a specific camera\r\n.venv/bin/python image_search.py --stop-capture --device CAM-FRONT\r\n```\r\n\r\n### Check Status\r\n\r\n```bash\r\n# Status of all cameras\r\n.venv/bin/python image_search.py --status\r\n\r\n# Status of a specific camera\r\n.venv/bin/python image_search.py --status --device CAM-FRONT\r\n```\r\n\r\n### Import Images\r\n\r\n```bash\r\n# Single image\r\n.venv/bin/python image_search.py --import /path/to/photo.jpg --json\r\n\r\n# Entire directory (recursive)\r\n.venv/bin/python image_search.py --import /path/to/photos/ --json\r\n```\r\n\r\n### Search\r\n\r\n```bash\r\n# Search across all cameras\r\n.venv/bin/python image_search.py --search \"keys on the table\" --json\r\n\r\n# Search a specific camera only\r\n.venv/bin/python image_search.py --search \"keys on the table\" --device CAM-FRONT --json\r\n```\r\n\r\n### Search with Time Range\r\n\r\n```bash\r\n.venv/bin/python image_search.py \\\r\n  --search \"person in blue jacket\" \\\r\n  --time-start 1754538000 --time-end 1754541600 \\\r\n  --json\r\n```\r\n\r\n## Output (stdout JSON)\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"query\": \"keys on the table\",\r\n  \"count\": 1,\r\n  \"results\": [\r\n    {\r\n      \"image_name\": \"CAM-FRONT_1754538507.jpg\",\r\n      \"image_path\": \"/opt/image_data/CAM-FRONT/20250815/CAM-FRONT_1754538507.jpg\",\r\n      \"description\": \"A set of keys and a wallet on a table\",\r\n      \"device_id\": \"CAM-FRONT\",\r\n      \"timestamp\": 1754538507,\r\n      \"time\": \"2025-08-15 10:00:07 AM\",\r\n      \"score\": 0.7823\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n## Exit Codes\r\n\r\n| Code | Meaning |\r\n|------|---------|\r\n| `0` | Success |\r\n| `1` | Error (config issue, stream failure, API error, runtime exception) |\r\n\r\n## Troubleshooting\r\n\r\n- `bash: .venv/bin/python: No such file or directory` → Run `bash setup.sh`\r\n- `OpenCV cannot open stream` → Check camera is online and `STREAM_URL` is correct\r\n- `Kamivision API error` → Verify `KAMIVISION_API_KEY` and network connectivity\r\n- `Unsupported file format` → Only JPEG, PNG, BMP, WebP are supported\r\n- `No search results` → Ensure images have been captured/imported; try lowering `SIMILARITY_THRESHOLD`\r\n- `FAISS index load failed` → Index may be corrupted; system rebuilds automatically, re-import data if needed\r\n\r\n## Privacy Notice\r\n\r\nThis skill involves camera video stream frame capture and cloud-based image analysis. Please review the following privacy information before use:\r\n\r\n### Cloud API Calls\r\n\r\n- Relies on **KamiClaw API** for VLM image description and text embedding\r\n- Data sent to the cloud is used solely for real-time inference and **will not be persistently stored or used for model training**\r\n- API communication uses HTTPS encryption\r\n\r\n### Local Data Storage\r\n\r\n- Captured frames are stored in the working directory; users can delete them at any time\r\n- Supports `retention_days` parameter for automatic expiration and deletion of historical data\r\n- API Key is cached in `~/.kami/credentials.json` (permission 600, readable only by the current user)\r\n\r\n### User Control\r\n\r\n- Camera URL is configured by the user; this skill will not auto-discover or connect to cameras\r\n- You can stop the skill at any time, delete local frame data and index files\r\n- You can revoke your API Key at any time to terminate cloud access\r\n\r\n> For more details on our privacy policy, visit: https://kamiclaw-skill.kamihome.com/privacy\n\nFile v1.0.4:README.md\n\n# Kami Image Search\n\nCapture frames from video streams or import local images. Uses the Kamivision cloud API to generate image descriptions + text embeddings (2048-dim) in a single call, with FAISS vector indexing for natural language image retrieval.\n\n## Architecture\n\n```\nCamera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results\n```\n\n## Quick Start\n\n### 1. Setup\n\n```bash\nbash setup.sh\n```\n\nChecks Python 3.10 (auto-installs via conda/pyenv if missing), creates Python virtual environment, installs dependencies.\n\n### 2. Configure\n\nEdit `image_config.json`:\n\n```json\n{\n  \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n  \"DEVICE_ID\": \"CAM-001\",\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}\n```\n\n> `KAMIVISION_API_KEY` is required. If you don't have one, register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain it.\n\n### 3. Usage\n\n```bash\n# Start background frame capture\npython image_search.py --start-capture\n\n# Check capture status\npython image_search.py --status\n\n# Stop capture\npython image_search.py --stop-capture\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24\n```\n\n## Configuration\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `STREAM_URL` | Video stream URL (RTSP/RTMP/HTTP) | `\"\"` |\n| `DEVICE_ID` | Device identifier | `CAM-001` |\n| `CAPTURE_INTERVAL` | Frame capture interval (seconds) | `10` |\n| `OUTPUT_WIDTH` / `OUTPUT_HEIGHT` | Output image dimensions | `640` × `360` |\n| `ENABLE_DESCRIPTION` | Enable image description generation | `true` |\n| `VLM_PROMPT` | Custom prompt (empty = cloud default) | `\"\"` |\n| `KAMIVISION_API_URL` | Kamivision API endpoint | `https://kamiclaw-skill-api.kamihome.com/v1/detect` |\n| `KAMIVISION_API_KEY` | Kamivision API key | — |\n| `SIMILARITY_THRESHOLD` | Search similarity threshold | `0.35` |\n| `SEARCH_TOP_K` | Max results returned | `5` |\n| `DATA_DIR` | Data storage directory | `./image_data` |\n| `RETENTION_DAYS` | Data retention days (0 = keep forever) | `30` |\n| `SKIP_DUPLICATE` | Skip duplicate frames | `true` |\n| `DUPLICATE_THRESHOLD` | Duplicate frame pixel diff threshold | `5.0` |\n| `TIME_ZONE_OFFSET` | Timezone offset (hours) | `-12` |\n\n## Cloud API\n\nAll AI capabilities are provided by the Kamivision cloud API — no local models required:\n\n- `SUMMARY`: Takes image base64, returns description (summary) + text embedding (2048-dim)\n- `EMBED`: Takes query text, returns text embedding (2048-dim)\n\nBoth operate in the same text vector space, enabling direct similarity matching.\n\n## Data Storage Structure\n\n```\nimage_data/\n└── CAM-001/\n    ├── 20260423/\n    │   ├── CAM-001_1777010097.jpg\n    │   └── ...\n    ├── imported/          # Images from --import\n    ├── metadata.db        # SQLite metadata\n    └── faiss.index        # FAISS vector index\n```\n\n## CLI Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--start-capture` | Start background frame capture |\n| `--stop-capture` | Stop background capture |\n| `--status` | Check capture process status |\n| `--import PATH` | Import image file or directory |\n| `--search TEXT` | Natural language search |\n| `--list HOURS` | List images from last N hours |\n| `--json` | JSON output format |\n| `--time-start TS` | Search start time (unix timestamp) |\n| `--time-end TS` | Search end time (unix timestamp) |\n| `--config PATH` | Config file path |\n| `--log-file PATH` | Log file path |\n| `--log-level LEVEL` | Log level (DEBUG/INFO/WARNING/ERROR) |\n| `--export-config` | Export current config to JSON |\n\n## Dependencies\n\n- Python 3.10 (setup.sh auto-installs via conda/pyenv if missing)\n- Kamivision API key\n\nPython packages (setup.sh installs into .venv):\n- opencv-python-headless\n- numpy\n- requests\n- Pillow\n- faiss-cpu\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn7e9156e1awf00v1sas2wkdfd85a4zh\",\n  \"slug\": \"kami-image-search\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1780024228954\n}\n\nFile v1.0.4:skill-card.md\n\n## Description: <br>\nA skill by Kami SmartHome that captures frames from cameras, describes them with AI, and searches visual history using natural language. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[13681882136](https://clawhub.ai/user/13681882136) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal smart-home users and developers use this skill to capture or import camera images, index AI-generated descriptions and embeddings, and retrieve matching images with natural-language queries. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Camera images and search queries may contain sensitive home or workplace information and are processed by a provider cloud service while also being indexed locally. <br>\nMitigation: Use only approved cameras, avoid sensitive locations until provider retention and consent controls are understood, and configure retention or delete local frame data and indexes when no longer needed. <br>\nRisk: Setup and capture features can modify the local environment and run background capture processes. <br>\nMitigation: Review setup.sh before execution, avoid sudo or host package changes unless explicitly approved, and use the status and stop commands to confirm background capture is stopped. <br>\nRisk: The skill depends on a Kamivision API key and camera stream URLs. <br>\nMitigation: Keep configuration files access-controlled, avoid sharing logs or configs that include credentials or stream URLs, and revoke or rotate the API key if exposure is suspected. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/13681882136/kami-image-search) <br>\n- [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) <br>\n- [Kami privacy policy](https://kamiclaw-skill.kamihome.com/privacy) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [shell commands, configuration, JSON, guidance] <br>\n**Output Format:** [Markdown guidance with shell commands and JSON CLI output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Requires image_config.json with camera stream settings and KAMIVISION_API_KEY; search results include image paths, descriptions, device IDs, timestamps, and scores.] <br>\n\n## Skill Version(s): <br>\n1.0.4 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.0.4:image_config.json\n\n{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://test.example/stream\",\n      \"DEVICE_ID\": \"CAM-001\",\n      \"CAPTURE_INTERVAL\": 10\n    }\n  ],\n  \"OUTPUT_WIDTH\": 640,\n  \"OUTPUT_HEIGHT\": 360,\n  \"ENABLE_DESCRIPTION\": true,\n  \"VLM_PROMPT\": \"\",\n  \"EMBEDDING_MODE\": \"text\",\n  \"KAMIVISION_API_URL\": \"https://kamiclaw-skill-api.kamihome.com/v1/detect\",\n  \"KAMIVISION_API_KEY\": \"\",\n  \"SIMILARITY_THRESHOLD\": 0.35,\n  \"SEARCH_TOP_K\": 5,\n  \"DATA_DIR\": \"./image_data\",\n  \"RETENTION_DAYS\": 30,\n  \"RECONNECT_DELAY\": 3,\n  \"SKIP_DUPLICATE\": true,\n  \"DUPLICATE_THRESHOLD\": 5.0,\n  \"TIME_ZONE_OFFSET\": -12\n}\n\nFile v1.0.4:requirements.txt\n\nopencv-python-headless\r\nnumpy\r\nrequests\r\nPillow\r\nfaiss-cpu\r\nhypothesis\n\nArchive v1.0.3: 8 files, 22449 bytes\n\nFiles: image_config.json (545b), image_search.py (48890b), README.md (4392b), requirements.txt (72b), setup.sh (7888b), skill-card.md (2742b), SKILL.md (6765b), _meta.json (136b)\n\nFile v1.0.3:SKILL.md\n\n---\r\nname: kami-image-search\r\ndescription: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\r\nversion: 1.0.0\r\nauthor: kami-smarthome\r\ntags:\r\n  - smart-home\r\n  - kami\r\n  - smarthome\r\n  - text-to-image search\r\n  - image-search\r\n  - visual-search\r\n  - camera\r\n  - rtsp\r\n  - faiss\r\n  - embedding\r\n  - ai-vision\r\n  - kamivision\r\n  - monitoring\r\n  - home-assistant\r\n  - iot\r\n  - edge-ai\r\ntriggers:\r\n  - smart home\r\n  - kami\r\n  - text to image search\r\n  - home assistant\r\n  - image search\r\n  - search image\r\n  - find image\r\n  - visual search\r\n  - kami image\r\n  - kami smart home\r\n  - search camera\r\n  - what did the camera see\r\n  - find photo\r\n  - search photos\r\n  - look up image\r\n  - camera history\r\n  - check camera\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - python3.10\r\n      hardware:\r\n        cpu: \"2+ cores (x86_64 / ARM64)\"\r\n        memory: \"2 GB+\"\r\n        storage: \"5 GB+\"\r\n        gpu: \"optional\"\r\n      network:\r\n        - \"RTSP camera access (LAN)\"\r\n        - \"Internet (KamiClaw API)\"\r\n      devices:\r\n        - \"RTSP IP camera\"\r\n    emoji: \"🔍\"\r\n---\r\n\r\n# Kami Image Search\r\n\r\n> Search your camera's visual history with natural language.\r\n\r\nMonitor your camera feed, capture frames automatically, and retrieve matching images by simply describing what you're looking for. Powered by the Kamivision cloud API for AI description and embedding generation.\r\n\r\n### Features\r\n\r\n- 🔍 Natural language image search\r\n- 📸 Automatic frame capture from video streams\r\n- 🧠 AI-powered image description (Kamivision API)\r\n- 📁 Manual image import (JPEG / PNG / BMP / WebP)\r\n- 🔁 Built-in duplicate frame detection\r\n- ⏱ Time-range filtering\r\n- 🏠 Designed for Kami SmartHome ecosystem\r\n\r\n### Scenarios\r\n\r\n- Doorstep delivery verification\r\n- Home activity review\r\n- Pet or child monitoring playback\r\n- Batch photo indexing and retrieval\r\n\r\n## Installation\r\n\r\n```bash\r\nbash setup.sh\r\n```\r\n\r\nChecks for Python 3.10, creates `.venv/`, and installs `opencv-python-headless`, `numpy`, `requests`, `Pillow`, `faiss-cpu`. Idempotent.\r\n\r\n## Prerequisites\r\n\r\n- Python 3.10 (setup.sh auto-detects system / pyenv / conda; auto-installs via conda or pyenv if missing)\r\n- `image_config.json` configured with your stream URL and Kamivision API key\r\n- RTSP/RTMP camera online and reachable (for capture mode)\r\n\r\n## Kamivision API Key Setup\r\n\r\nThis skill requires a `KAMIVISION_API_KEY` to access the Kamivision cloud API.\r\n\r\n**Check**: Read the `KAMIVISION_API_KEY` field in `image_config.json`.\r\n\r\n- **If already configured (non-empty)** → Use it directly, no need to ask.\r\n- **If empty** → Ask the user if they already have an API Key:\r\n  - **Yes** → Enter the key directly. It will be saved to `image_config.json`.\r\n  - **No** → Register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain your API key. 🎁 **New users get 200 free credits on first registration.**\r\n\r\n## Parameter Confirmation\r\n\r\nBefore running, confirm these key settings in `image_config.json`:\r\n\r\n| Parameter | Default | Description |\r\n|-----------|---------|-------------|\r\n| `STREAM_URL` | — | RTSP/RTMP/HTTP camera stream URL |\r\n| `DEVICE_ID` | `CAM-001` | Camera device identifier |\r\n| `KAMIVISION_API_KEY` | — | Your Kamivision API key |\r\n| `CAPTURE_INTERVAL` | `10` | Seconds between frame captures |\r\n| `SIMILARITY_THRESHOLD` | `0.35` | Search similarity threshold (0.0–1.0) |\r\n| `SEARCH_TOP_K` | `5` | Max results per search |\r\n| `TIME_ZONE_OFFSET` | `0` | UTC offset in hours for local time display (e.g. `-12` for UTC+12, `8` for UTC+8) |\r\n\r\n**Ask the user: do any parameters need to be changed?**\r\n\r\n## Usage\r\n\r\n### Start Capture\r\n\r\n```bash\r\n.venv/bin/python image_search.py --start-capture\r\n```\r\n\r\n### Stop Capture\r\n\r\n```bash\r\n.venv/bin/python image_search.py --stop-capture\r\n```\r\n\r\n### Check Status\r\n\r\n```bash\r\n.venv/bin/python image_search.py --status\r\n```\r\n\r\n### Import Images\r\n\r\n```bash\r\n# Single image\r\n.venv/bin/python image_search.py --import /path/to/photo.jpg --json\r\n\r\n# Entire directory (recursive)\r\n.venv/bin/python image_search.py --import /path/to/photos/ --json\r\n```\r\n\r\n### Search\r\n\r\n```bash\r\n.venv/bin/python image_search.py --search \"keys on the table\" --json\r\n```\r\n\r\n### Search with Time Range\r\n\r\n```bash\r\n.venv/bin/python image_search.py \\\r\n  --search \"person in blue jacket\" \\\r\n  --time-start 1754538000 --time-end 1754541600 \\\r\n  --json\r\n```\r\n\r\n## Output (stdout JSON)\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"query\": \"keys on the table\",\r\n  \"count\": 1,\r\n  \"results\": [\r\n    {\r\n      \"image_name\": \"CAM-001_1754538507.jpg\",\r\n      \"image_path\": \"/opt/image_data/CAM-001/20250815/CAM-001_1754538507.jpg\",\r\n      \"description\": \"A set of keys and a wallet on a table\",\r\n      \"timestamp\": 1754538507,\r\n      \"time\": \"2025-08-15 10:00:07 AM\",\r\n      \"score\": 0.7823\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n## Exit Codes\r\n\r\n| Code | Meaning |\r\n|------|---------|\r\n| `0` | Success |\r\n| `1` | Error (config issue, stream failure, API error, runtime exception) |\r\n\r\n## Troubleshooting\r\n\r\n- `bash: .venv/bin/python: No such file or directory` → Run `bash setup.sh`\r\n- `OpenCV cannot open stream` → Check camera is online and `STREAM_URL` is correct\r\n- `Kamivision API error` → Verify `KAMIVISION_API_KEY` and network connectivity\r\n- `Unsupported file format` → Only JPEG, PNG, BMP, WebP are supported\r\n- `No search results` → Ensure images have been captured/imported; try lowering `SIMILARITY_THRESHOLD`\r\n- `FAISS index load failed` → Index may be corrupted; system rebuilds automatically, re-import data if needed\r\n\r\n## Privacy Notice\r\n\r\nThis skill involves camera video stream frame capture and cloud-based image analysis. Please review the following privacy information before use:\r\n\r\n### Cloud API Calls\r\n\r\n- Relies on **KamiClaw API** for VLM image description and text embedding\r\n- Data sent to the cloud is used solely for real-time inference and **will not be persistently stored or used for model training**\r\n- API communication uses HTTPS encryption\r\n\r\n### Local Data Storage\r\n\r\n- Captured frames are stored in the working directory; users can delete them at any time\r\n- Supports `retention_days` parameter for automatic expiration and deletion of historical data\r\n- API Key is cached in `~/.kami/credentials.json` (permission 600, readable only by the current user)\r\n\r\n### User Control\r\n\r\n- Camera URL is configured by the user; this skill will not auto-discover or connect to cameras\r\n- You can stop the skill at any time, delete local frame data and index files\r\n- You can revoke your API Key at any time to terminate cloud access\r\n\r\n> For more details on our privacy policy, visit: https://kamiclaw-skill.kamihome.com/privacy\n\nFile v1.0.3:README.md\n\n# Kami Image Search\n\nCapture frames from video streams or import local images. Uses the Kamivision cloud API to generate image descriptions + text embeddings (2048-dim) in a single call, with FAISS vector indexing for natural language image retrieval.\n\n## Architecture\n\n```\nCamera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results\n```\n\n## Quick Start\n\n### 1. Setup\n\n```bash\nbash setup.sh\n```\n\nChecks Python 3.10 (auto-installs via conda/pyenv if missing), creates Python virtual environment, installs dependencies.\n\n### 2. Configure\n\nEdit `image_config.json`:\n\n```json\n{\n  \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n  \"DEVICE_ID\": \"CAM-001\",\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}\n```\n\n> `KAMIVISION_API_KEY` is required. If you don't have one, register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain it.\n\n### 3. Usage\n\n```bash\n# Start background frame capture\npython image_search.py --start-capture\n\n# Check capture status\npython image_search.py --status\n\n# Stop capture\npython image_search.py --stop-capture\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24\n```\n\n## Configuration\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `STREAM_URL` | Video stream URL (RTSP/RTMP/HTTP) | `\"\"` |\n| `DEVICE_ID` | Device identifier | `CAM-001` |\n| `CAPTURE_INTERVAL` | Frame capture interval (seconds) | `10` |\n| `OUTPUT_WIDTH` / `OUTPUT_HEIGHT` | Output image dimensions | `640` × `360` |\n| `ENABLE_DESCRIPTION` | Enable image description generation | `true` |\n| `VLM_PROMPT` | Custom prompt (empty = cloud default) | `\"\"` |\n| `KAMIVISION_API_URL` | Kamivision API endpoint | `https://kamiclaw-skill-api.kamihome.com/v1/detect` |\n| `KAMIVISION_API_KEY` | Kamivision API key | — |\n| `SIMILARITY_THRESHOLD` | Search similarity threshold | `0.35` |\n| `SEARCH_TOP_K` | Max results returned | `5` |\n| `DATA_DIR` | Data storage directory | `./image_data` |\n| `RETENTION_DAYS` | Data retention days (0 = keep forever) | `30` |\n| `SKIP_DUPLICATE` | Skip duplicate frames | `true` |\n| `DUPLICATE_THRESHOLD` | Duplicate frame pixel diff threshold | `5.0` |\n| `TIME_ZONE_OFFSET` | Timezone offset (hours) | `-12` |\n\n## Cloud API\n\nAll AI capabilities are provided by the Kamivision cloud API — no local models required:\n\n- `SUMMARY`: Takes image base64, returns description (summary) + text embedding (2048-dim)\n- `EMBED`: Takes query text, returns text embedding (2048-dim)\n\nBoth operate in the same text vector space, enabling direct similarity matching.\n\n## Data Storage Structure\n\n```\nimage_data/\n└── CAM-001/\n    ├── 20260423/\n    │   ├── CAM-001_1777010097.jpg\n    │   └── ...\n    ├── imported/          # Images from --import\n    ├── metadata.db        # SQLite metadata\n    └── faiss.index        # FAISS vector index\n```\n\n## CLI Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--start-capture` | Start background frame capture |\n| `--stop-capture` | Stop background capture |\n| `--status` | Check capture process status |\n| `--import PATH` | Import image file or directory |\n| `--search TEXT` | Natural language search |\n| `--list HOURS` | List images from last N hours |\n| `--json` | JSON output format |\n| `--time-start TS` | Search start time (unix timestamp) |\n| `--time-end TS` | Search end time (unix timestamp) |\n| `--config PATH` | Config file path |\n| `--log-file PATH` | Log file path |\n| `--log-level LEVEL` | Log level (DEBUG/INFO/WARNING/ERROR) |\n| `--export-config` | Export current config to JSON |\n\n## Dependencies\n\n- Python 3.10 (setup.sh auto-installs via conda/pyenv if missing)\n- Kamivision API key\n\nPython packages (setup.sh installs into .venv):\n- opencv-python-headless\n- numpy\n- requests\n- Pillow\n- faiss-cpu\n\nFile v1.0.3:_meta.json\n\n{\n  \"ownerId\": \"kn7e9156e1awf00v1sas2wkdfd85a4zh\",\n  \"slug\": \"kami-image-search\",\n  \"version\": \"1.0.3\",\n  \"publishedAt\": 1779868383590\n}\n\nFile v1.0.3:skill-card.md\n\n## Description: <br>\nA skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[13681882136](https://clawhub.ai/user/13681882136) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nSmart home users and developers use this skill to capture or import camera images, send them to Kamivision for descriptions and embeddings, and search visual history with natural language. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill can upload camera frames, imported photos, and search text to Kamivision's cloud API. <br>\nMitigation: Use it only with appropriate consent and non-sensitive camera or image sources, and review the cloud API and privacy terms before enabling capture or import. <br>\nRisk: Continuous capture can store private images and indexes locally. <br>\nMitigation: Set a non-sensitive DATA_DIR, keep retention enabled, and delete local frame data and indexes when they are no longer needed. <br>\nRisk: The Kamivision API key is a sensitive credential. <br>\nMitigation: Protect the key, limit access to configuration and credential files, and rotate or revoke the key if exposure is suspected. <br>\nRisk: The setup workflow can make broad local environment changes. <br>\nMitigation: Review setup.sh before use and consider creating a pinned Python environment manually instead of allowing automatic pyenv, conda, Python build, or system package changes. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill listing](https://clawhub.ai/13681882136/kami-image-search) <br>\n- [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) <br>\n- [Kamivision API endpoint](https://kamiclaw-skill-api.kamihome.com/v1/detect) <br>\n- [Kamivision privacy policy](https://kamiclaw-skill.kamihome.com/privacy) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, JSON, guidance] <br>\n**Output Format:** [Markdown guidance with shell command examples and JSON CLI output] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Returns ranked image-search results with image paths, descriptions, timestamps, and similarity scores when JSON output is requested.] <br>\n\n## Skill Version(s): <br>\n1.0.3 (source: server release metadata; artifact frontmatter says 1.0.0) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.0.3:image_config.json\n\n{\n  \"STREAM_URL\": \"rtsp://test.example/stream\",\n  \"DEVICE_ID\": \"CAM-001\",\n  \"CAPTURE_INTERVAL\": 10,\n  \"OUTPUT_WIDTH\": 640,\n  \"OUTPUT_HEIGHT\": 360,\n  \"ENABLE_DESCRIPTION\": true,\n  \"VLM_PROMPT\": \"\",\n  \"EMBEDDING_MODE\": \"text\",\n  \"KAMIVISION_API_URL\": \"https://kamiclaw-skill-api.kamihome.com/v1/detect\",\n  \"KAMIVISION_API_KEY\": \"\",\n  \"SIMILARITY_THRESHOLD\": 0.35,\n  \"SEARCH_TOP_K\": 5,\n  \"DATA_DIR\": \"./image_data\",\n  \"RETENTION_DAYS\": 30,\n  \"RECONNECT_DELAY\": 3,\n  \"SKIP_DUPLICATE\": true,\n  \"DUPLICATE_THRESHOLD\": 5.0,\n  \"TIME_ZONE_OFFSET\": -12\n}\n\nFile v1.0.3:requirements.txt\n\nopencv-python-headless\r\nnumpy\r\nrequests\r\nPillow\r\nfaiss-cpu\r\nhypothesis\n\nArchive v1.0.2: 9 files, 18918 bytes\n\nFiles: image_config.json (586b), image_search.py (48890b), README.md (4328b), requirements.txt (72b), setup.sh (996b), SKILL.md (5354b), tests/__init__.py (25b), tests/test_properties.py (74b), _meta.json (136b)\n\nFile v1.0.2:SKILL.md\n\n---\r\nname: kami-image-search\r\ndescription: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\r\nversion: 1.0.0\r\nauthor: kami-smarthome\r\ntags:\r\n  - smart-home\r\n  - kami\r\n  - smarthome\r\n  - text-to-image search\r\n  - image-search\r\n  - visual-search\r\n  - camera\r\n  - rtsp\r\n  - faiss\r\n  - embedding\r\n  - ai-vision\r\n  - kamivision\r\n  - monitoring\r\n  - home-assistant\r\n  - iot\r\n  - edge-ai\r\ntriggers:\r\n  - smart home\r\n  - kami\r\n  - text to image search\r\n  - home assistant\r\n  - image search\r\n  - search image\r\n  - find image\r\n  - visual search\r\n  - kami image\r\n  - kami smart home\r\n  - search camera\r\n  - what did the camera see\r\n  - find photo\r\n  - search photos\r\n  - look up image\r\n  - camera history\r\n  - check camera\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - python3\r\n        - ffmpeg\r\n      config:\r\n        - image_config.json\r\n    emoji: \"🔍\"\r\n---\r\n\r\n# Kami Image Search\r\n\r\n> Search your camera's visual history with natural language.\r\n\r\nMonitor your camera feed, capture frames automatically, and retrieve matching images by simply describing what you're looking for. Powered by the Kamivision cloud API for AI description and embedding generation.\r\n\r\n### Features\r\n\r\n- 🔍 Natural language image search\r\n- 📸 Automatic frame capture from video streams\r\n- 🧠 AI-powered image description (Kamivision API)\r\n- 📁 Manual image import (JPEG / PNG / BMP / WebP)\r\n- 🔁 Built-in duplicate frame detection\r\n- ⏱ Time-range filtering\r\n- 🏠 Designed for Kami SmartHome ecosystem\r\n\r\n### Scenarios\r\n\r\n- Doorstep delivery verification\r\n- Home activity review\r\n- Pet or child monitoring playback\r\n- Batch photo indexing and retrieval\r\n\r\n## Installation\r\n\r\n```bash\r\nbash setup.sh\r\n```\r\n\r\nChecks for `python3` and `ffmpeg`, creates `.venv/`, and installs `opencv-python-headless`, `numpy`, `requests`, `Pillow`, `faiss-cpu`. Idempotent.\r\n\r\n## Prerequisites\r\n\r\n- `python3` and `python3-venv` installed\r\n- `ffmpeg` installed (setup.sh will attempt to install it)\r\n- `image_config.json` configured with your stream URL and Kamivision API key\r\n- RTSP/RTMP camera online and reachable (for capture mode)\r\n\r\n## Kamivision API Key Setup\r\n\r\nThis skill requires a `KAMIVISION_API_KEY` to access the Kamivision cloud API. The key is NOT included in the skill package — you must provide your own.\r\n\r\n**Ask the user: Do you already have a `KAMIVISION_API_KEY`?**\r\n\r\n- **Yes** → Enter the key directly. It will be saved to `image_config.json`.\r\n- **No** → Register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain your API key. 🎁 **New users get 200 free credits on first registration.**\r\n\r\n## Parameter Confirmation\r\n\r\nBefore running, confirm these key settings in `image_config.json`:\r\n\r\n| Parameter | Default | Description |\r\n|-----------|---------|-------------|\r\n| `STREAM_URL` | — | RTSP/RTMP/HTTP camera stream URL |\r\n| `DEVICE_ID` | `CAM-001` | Camera device identifier |\r\n| `KAMIVISION_API_KEY` | — | Your Kamivision API key |\r\n| `CAPTURE_INTERVAL` | `10` | Seconds between frame captures |\r\n| `SIMILARITY_THRESHOLD` | `0.35` | Search similarity threshold (0.0–1.0) |\r\n| `SEARCH_TOP_K` | `5` | Max results per search |\r\n| `TIME_ZONE_OFFSET` | `0` | UTC offset in hours for local time display (e.g. `-12` for UTC+12, `8` for UTC+8) |\r\n\r\n**Ask the user: do any parameters need to be changed?**\r\n\r\n## Usage\r\n\r\n### Start Capture\r\n\r\n```bash\r\n.venv/bin/python image_search.py --start-capture\r\n```\r\n\r\n### Stop Capture\r\n\r\n```bash\r\n.venv/bin/python image_search.py --stop-capture\r\n```\r\n\r\n### Check Status\r\n\r\n```bash\r\n.venv/bin/python image_search.py --status\r\n```\r\n\r\n### Import Images\r\n\r\n```bash\r\n# Single image\r\n.venv/bin/python image_search.py --import /path/to/photo.jpg --json\r\n\r\n# Entire directory (recursive)\r\n.venv/bin/python image_search.py --import /path/to/photos/ --json\r\n```\r\n\r\n### Search\r\n\r\n```bash\r\n.venv/bin/python image_search.py --search \"keys on the table\" --json\r\n```\r\n\r\n### Search with Time Range\r\n\r\n```bash\r\n.venv/bin/python image_search.py \\\r\n  --search \"person in blue jacket\" \\\r\n  --time-start 1754538000 --time-end 1754541600 \\\r\n  --json\r\n```\r\n\r\n## Output (stdout JSON)\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"query\": \"keys on the table\",\r\n  \"count\": 1,\r\n  \"results\": [\r\n    {\r\n      \"image_name\": \"CAM-001_1754538507.jpg\",\r\n      \"image_path\": \"/opt/image_data/CAM-001/20250815/CAM-001_1754538507.jpg\",\r\n      \"description\": \"A set of keys and a wallet on a table\",\r\n      \"timestamp\": 1754538507,\r\n      \"time\": \"2025-08-15 10:00:07 AM\",\r\n      \"score\": 0.7823\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n## Exit Codes\r\n\r\n| Code | Meaning |\r\n|------|---------|\r\n| `0` | Success |\r\n| `1` | Error (config issue, stream failure, API error, runtime exception) |\r\n\r\n## Troubleshooting\r\n\r\n- `bash: .venv/bin/python: No such file or directory` → Run `bash setup.sh`\r\n- `OpenCV cannot open stream` → Check camera is online and `STREAM_URL` is correct\r\n- `Kamivision API error` → Verify `KAMIVISION_API_KEY` and network connectivity\r\n- `Unsupported file format` → Only JPEG, PNG, BMP, WebP are supported\r\n- `No search results` → Ensure images have been captured/imported; try lowering `SIMILARITY_THRESHOLD`\r\n- `FAISS index load failed` → Index may be corrupted; system rebuilds automatically, re-import data if needed\n\nFile v1.0.2:README.md\n\n# Kami Image Search\n\nCapture frames from video streams or import local images. Uses the Kamivision cloud API to generate image descriptions + text embeddings (2048-dim) in a single call, with FAISS vector indexing for natural language image retrieval.\n\n## Architecture\n\n```\nCamera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results\n```\n\n## Quick Start\n\n### 1. Setup\n\n```bash\nbash setup.sh\n```\n\nInstalls ffmpeg, creates Python virtual environment, installs dependencies.\n\n### 2. Configure\n\nEdit `image_config.json`:\n\n```json\n{\n  \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n  \"DEVICE_ID\": \"CAM-001\",\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}\n```\n\n> `KAMIVISION_API_KEY` is required. If you don't have one, register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain it.\n\n### 3. Usage\n\n```bash\n# Start background frame capture\npython image_search.py --start-capture\n\n# Check capture status\npython image_search.py --status\n\n# Stop capture\npython image_search.py --stop-capture\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24\n```\n\n## Configuration\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `STREAM_URL` | Video stream URL (RTSP/RTMP/HTTP) | `\"\"` |\n| `DEVICE_ID` | Device identifier | `CAM-001` |\n| `CAPTURE_INTERVAL` | Frame capture interval (seconds) | `10` |\n| `OUTPUT_WIDTH` / `OUTPUT_HEIGHT` | Output image dimensions | `640` × `360` |\n| `ENABLE_DESCRIPTION` | Enable image description generation | `true` |\n| `VLM_PROMPT` | Custom prompt (empty = cloud default) | `\"\"` |\n| `KAMIVISION_API_URL` | Kamivision API endpoint | `https://kamiclaw-skill-api.kamihome.com/v1/detect` |\n| `KAMIVISION_API_KEY` | Kamivision API key | — |\n| `SIMILARITY_THRESHOLD` | Search similarity threshold | `0.35` |\n| `SEARCH_TOP_K` | Max results returned | `5` |\n| `DATA_DIR` | Data storage directory | `./image_data` |\n| `RETENTION_DAYS` | Data retention days (0 = keep forever) | `30` |\n| `SKIP_DUPLICATE` | Skip duplicate frames | `true` |\n| `DUPLICATE_THRESHOLD` | Duplicate frame pixel diff threshold | `5.0` |\n| `TIME_ZONE_OFFSET` | Timezone offset (hours) | `-12` |\n\n## Cloud API\n\nAll AI capabilities are provided by the Kamivision cloud API — no local models required:\n\n- `SUMMARY`: Takes image base64, returns description (summary) + text embedding (2048-dim)\n- `EMBED`: Takes query text, returns text embedding (2048-dim)\n\nBoth operate in the same text vector space, enabling direct similarity matching.\n\n## Data Storage Structure\n\n```\nimage_data/\n└── CAM-001/\n    ├── 20260423/\n    │   ├── CAM-001_1777010097.jpg\n    │   └── ...\n    ├── imported/          # Images from --import\n    ├── metadata.db        # SQLite metadata\n    └── faiss.index        # FAISS vector index\n```\n\n## CLI Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--start-capture` | Start background frame capture |\n| `--stop-capture` | Stop background capture |\n| `--status` | Check capture process status |\n| `--import PATH` | Import image file or directory |\n| `--search TEXT` | Natural language search |\n| `--list HOURS` | List images from last N hours |\n| `--json` | JSON output format |\n| `--time-start TS` | Search start time (unix timestamp) |\n| `--time-end TS` | Search end time (unix timestamp) |\n| `--config PATH` | Config file path |\n| `--log-file PATH` | Log file path |\n| `--log-level LEVEL` | Log level (DEBUG/INFO/WARNING/ERROR) |\n| `--export-config` | Export current config to JSON |\n\n## Dependencies\n\n- Python 3.8+\n- ffmpeg (setup.sh auto-installs)\n- Kamivision API key\n\nPython packages (setup.sh installs into .venv):\n- opencv-python-headless\n- numpy\n- requests\n- Pillow\n- faiss-cpu\n\nFile v1.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn7e9156e1awf00v1sas2wkdfd85a4zh\",\n  \"slug\": \"kami-image-search\",\n  \"version\": \"1.0.2\",\n  \"publishedAt\": 1778652771333\n}\n\nFile v1.0.2:image_config.json\n\n{\r\n  \"STREAM_URL\": \"rtsp://admin:ai123456@192.168.2.108:554/stream1\",\r\n  \"DEVICE_ID\": \"CAM-001\",\r\n  \"CAPTURE_INTERVAL\": 10,\r\n  \"OUTPUT_WIDTH\": 640,\r\n  \"OUTPUT_HEIGHT\": 360,\r\n  \"ENABLE_DESCRIPTION\": true,\r\n  \"VLM_PROMPT\": \"\",\r\n  \"EMBEDDING_MODE\": \"text\",\r\n  \"KAMIVISION_API_URL\": \"https://kamiclaw-skill-api.kamihome.com/v1/detect\",\r\n  \"KAMIVISION_API_KEY\": \"\",\r\n  \"SIMILARITY_THRESHOLD\": 0.35,\r\n  \"SEARCH_TOP_K\": 5,\r\n  \"DATA_DIR\": \"./image_data\",\r\n  \"RETENTION_DAYS\": 30,\r\n  \"RECONNECT_DELAY\": 3,\r\n  \"SKIP_DUPLICATE\": true,\r\n  \"DUPLICATE_THRESHOLD\": 5.0,\r\n  \"TIME_ZONE_OFFSET\": -12\r\n}\n\nFile v1.0.2:requirements.txt\n\nopencv-python-headless\r\nnumpy\r\nrequests\r\nPillow\r\nfaiss-cpu\r\nhypothesis\n\nArchive v1.0.1: 9 files, 18898 bytes\n\nFiles: image_config.json (586b), image_search.py (48890b), README.md (4328b), requirements.txt (72b), setup.sh (996b), SKILL.md (5327b), tests/__init__.py (25b), tests/test_properties.py (74b), _meta.json (136b)\n\nFile v1.0.1:SKILL.md\n\n---\r\nname: kami-image-search\r\ndescription: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\r\nversion: 1.0.0\r\nauthor: kami-smarthome\r\ntags:\r\n  - smart-home\r\n  - kami\r\n  - smarthome\r\n  - text-to-image search\r\n  - image-search\r\n  - visual-search\r\n  - camera\r\n  - rtsp\r\n  - faiss\r\n  - embedding\r\n  - ai-vision\r\n  - kamivision\r\n  - monitoring\r\n  - home-assistant\r\n  - iot\r\n  - edge-ai\r\ntriggers:\r\n  - smart home\r\n  - kami\r\n  - text to image search\r\n  - home assistant\r\n  - image search\r\n  - search image\r\n  - find image\r\n  - visual search\r\n  - kami image\r\n  - kami smart home\r\n  - search camera\r\n  - what did the camera see\r\n  - find photo\r\n  - search photos\r\n  - look up image\r\n  - camera history\r\n  - check camera\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - python3\r\n        - ffmpeg\r\n      config:\r\n        - image_config.json\r\n    emoji: \"🔍\"\r\n---\r\n\r\n# Kami Image Search\r\n\r\n> Search your camera's visual history with natural language.\r\n\r\nMonitor your camera feed, capture frames automatically, and retrieve matching images by simply describing what you're looking for. Powered by the Kamivision cloud API for AI description and embedding generation.\r\n\r\n### Features\r\n\r\n- 🔍 Natural language image search\r\n- 📸 Automatic frame capture from video streams\r\n- 🧠 AI-powered image description (Kamivision API)\r\n- 📁 Manual image import (JPEG / PNG / BMP / WebP)\r\n- 🔁 Built-in duplicate frame detection\r\n- ⏱ Time-range filtering\r\n- 🏠 Designed for Kami SmartHome ecosystem\r\n\r\n### Scenarios\r\n\r\n- Doorstep delivery verification\r\n- Home activity review\r\n- Pet or child monitoring playback\r\n- Batch photo indexing and retrieval\r\n\r\n## Installation\r\n\r\n```bash\r\nbash setup.sh\r\n```\r\n\r\nChecks for `python3` and `ffmpeg`, creates `.venv/`, and installs `opencv-python-headless`, `numpy`, `requests`, `Pillow`, `faiss-cpu`. Idempotent.\r\n\r\n## Prerequisites\r\n\r\n- `python3` and `python3-venv` installed\r\n- `ffmpeg` installed (setup.sh will attempt to install it)\r\n- `image_config.json` configured with your stream URL and Kamivision API key\r\n- RTSP/RTMP camera online and reachable (for capture mode)\r\n\r\n## Kamivision API Key Setup\r\n\r\nThis skill requires a `KAMIVISION_API_KEY` to access the Kamivision cloud API. The key is NOT included in the skill package — you must provide your own.\r\n\r\n**Ask the user: Do you already have a `KAMIVISION_API_KEY`?**\r\n\r\n- **Yes** → Enter the key directly. It will be saved to `image_config.json`.\r\n- **No** → Please register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain your API key, then come back and enter it.\r\n\r\n## Parameter Confirmation\r\n\r\nBefore running, confirm these key settings in `image_config.json`:\r\n\r\n| Parameter | Default | Description |\r\n|-----------|---------|-------------|\r\n| `STREAM_URL` | — | RTSP/RTMP/HTTP camera stream URL |\r\n| `DEVICE_ID` | `CAM-001` | Camera device identifier |\r\n| `KAMIVISION_API_KEY` | — | Your Kamivision API key |\r\n| `CAPTURE_INTERVAL` | `10` | Seconds between frame captures |\r\n| `SIMILARITY_THRESHOLD` | `0.35` | Search similarity threshold (0.0–1.0) |\r\n| `SEARCH_TOP_K` | `5` | Max results per search |\r\n| `TIME_ZONE_OFFSET` | `0` | UTC offset in hours for local time display (e.g. `-12` for UTC+12, `8` for UTC+8) |\r\n\r\n**Ask the user: do any parameters need to be changed?**\r\n\r\n## Usage\r\n\r\n### Start Capture\r\n\r\n```bash\r\n.venv/bin/python image_search.py --start-capture\r\n```\r\n\r\n### Stop Capture\r\n\r\n```bash\r\n.venv/bin/python image_search.py --stop-capture\r\n```\r\n\r\n### Check Status\r\n\r\n```bash\r\n.venv/bin/python image_search.py --status\r\n```\r\n\r\n### Import Images\r\n\r\n```bash\r\n# Single image\r\n.venv/bin/python image_search.py --import /path/to/photo.jpg --json\r\n\r\n# Entire directory (recursive)\r\n.venv/bin/python image_search.py --import /path/to/photos/ --json\r\n```\r\n\r\n### Search\r\n\r\n```bash\r\n.venv/bin/python image_search.py --search \"keys on the table\" --json\r\n```\r\n\r\n### Search with Time Range\r\n\r\n```bash\r\n.venv/bin/python image_search.py \\\r\n  --search \"person in blue jacket\" \\\r\n  --time-start 1754538000 --time-end 1754541600 \\\r\n  --json\r\n```\r\n\r\n## Output (stdout JSON)\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"query\": \"keys on the table\",\r\n  \"count\": 1,\r\n  \"results\": [\r\n    {\r\n      \"image_name\": \"CAM-001_1754538507.jpg\",\r\n      \"image_path\": \"/opt/image_data/CAM-001/20250815/CAM-001_1754538507.jpg\",\r\n      \"description\": \"A set of keys and a wallet on a table\",\r\n      \"timestamp\": 1754538507,\r\n      \"time\": \"2025-08-15 10:00:07 AM\",\r\n      \"score\": 0.7823\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n## Exit Codes\r\n\r\n| Code | Meaning |\r\n|------|---------|\r\n| `0` | Success |\r\n| `1` | Error (config issue, stream failure, API error, runtime exception) |\r\n\r\n## Troubleshooting\r\n\r\n- `bash: .venv/bin/python: No such file or directory` → Run `bash setup.sh`\r\n- `OpenCV cannot open stream` → Check camera is online and `STREAM_URL` is correct\r\n- `Kamivision API error` → Verify `KAMIVISION_API_KEY` and network connectivity\r\n- `Unsupported file format` → Only JPEG, PNG, BMP, WebP are supported\r\n- `No search results` → Ensure images have been captured/imported; try lowering `SIMILARITY_THRESHOLD`\r\n- `FAISS index load failed` → Index may be corrupted; system rebuilds automatically, re-import data if needed\n\nFile v1.0.1:README.md\n\n# Kami Image Search\n\nCapture frames from video streams or import local images. Uses the Kamivision cloud API to generate image descriptions + text embeddings (2048-dim) in a single call, with FAISS vector indexing for natural language image retrieval.\n\n## Architecture\n\n```\nCamera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results\n```\n\n## Quick Start\n\n### 1. Setup\n\n```bash\nbash setup.sh\n```\n\nInstalls ffmpeg, creates Python virtual environment, installs dependencies.\n\n### 2. Configure\n\nEdit `image_config.json`:\n\n```json\n{\n  \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n  \"DEVICE_ID\": \"CAM-001\",\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}\n```\n\n> `KAMIVISION_API_KEY` is required. If you don't have one, register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain it.\n\n### 3. Usage\n\n```bash\n# Start background frame capture\npython image_search.py --start-capture\n\n# Check capture status\npython image_search.py --status\n\n# Stop capture\npython image_search.py --stop-capture\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24\n```\n\n## Configuration\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `STREAM_URL` | Video stream URL (RTSP/RTMP/HTTP) | `\"\"` |\n| `DEVICE_ID` | Device identifier | `CAM-001` |\n| `CAPTURE_INTERVAL` | Frame capture interval (seconds) | `10` |\n| `OUTPUT_WIDTH` / `OUTPUT_HEIGHT` | Output image dimensions | `640` × `360` |\n| `ENABLE_DESCRIPTION` | Enable image description generation | `true` |\n| `VLM_PROMPT` | Custom prompt (empty = cloud default) | `\"\"` |\n| `KAMIVISION_API_URL` | Kamivision API endpoint | `https://kamiclaw-skill-api.kamihome.com/v1/detect` |\n| `KAMIVISION_API_KEY` | Kamivision API key | — |\n| `SIMILARITY_THRESHOLD` | Search similarity threshold | `0.35` |\n| `SEARCH_TOP_K` | Max results returned | `5` |\n| `DATA_DIR` | Data storage directory | `./image_data` |\n| `RETENTION_DAYS` | Data retention days (0 = keep forever) | `30` |\n| `SKIP_DUPLICATE` | Skip duplicate frames | `true` |\n| `DUPLICATE_THRESHOLD` | Duplicate frame pixel diff threshold | `5.0` |\n| `TIME_ZONE_OFFSET` | Timezone offset (hours) | `-12` |\n\n## Cloud API\n\nAll AI capabilities are provided by the Kamivision cloud API — no local models required:\n\n- `SUMMARY`: Takes image base64, returns description (summary) + text embedding (2048-dim)\n- `EMBED`: Takes query text, returns text embedding (2048-dim)\n\nBoth operate in the same text vector space, enabling direct similarity matching.\n\n## Data Storage Structure\n\n```\nimage_data/\n└── CAM-001/\n    ├── 20260423/\n    │   ├── CAM-001_1777010097.jpg\n    │   └── ...\n    ├── imported/          # Images from --import\n    ├── metadata.db        # SQLite metadata\n    └── faiss.index        # FAISS vector index\n```\n\n## CLI Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--start-capture` | Start background frame capture |\n| `--stop-capture` | Stop background capture |\n| `--status` | Check capture process status |\n| `--import PATH` | Import image file or directory |\n| `--search TEXT` | Natural language search |\n| `--list HOURS` | List images from last N hours |\n| `--json` | JSON output format |\n| `--time-start TS` | Search start time (unix timestamp) |\n| `--time-end TS` | Search end time (unix timestamp) |\n| `--config PATH` | Config file path |\n| `--log-file PATH` | Log file path |\n| `--log-level LEVEL` | Log level (DEBUG/INFO/WARNING/ERROR) |\n| `--export-config` | Export current config to JSON |\n\n## Dependencies\n\n- Python 3.8+\n- ffmpeg (setup.sh auto-installs)\n- Kamivision API key\n\nPython packages (setup.sh installs into .venv):\n- opencv-python-headless\n- numpy\n- requests\n- Pillow\n- faiss-cpu\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7e9156e1awf00v1sas2wkdfd85a4zh\",\n  \"slug\": \"kami-image-search\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1778469859317\n}\n\nFile v1.0.1:image_config.json\n\n{\r\n  \"STREAM_URL\": \"rtsp://admin:ai123456@192.168.2.108:554/stream1\",\r\n  \"DEVICE_ID\": \"CAM-001\",\r\n  \"CAPTURE_INTERVAL\": 10,\r\n  \"OUTPUT_WIDTH\": 640,\r\n  \"OUTPUT_HEIGHT\": 360,\r\n  \"ENABLE_DESCRIPTION\": true,\r\n  \"VLM_PROMPT\": \"\",\r\n  \"EMBEDDING_MODE\": \"text\",\r\n  \"KAMIVISION_API_URL\": \"https://kamiclaw-skill-api.kamihome.com/v1/detect\",\r\n  \"KAMIVISION_API_KEY\": \"\",\r\n  \"SIMILARITY_THRESHOLD\": 0.35,\r\n  \"SEARCH_TOP_K\": 5,\r\n  \"DATA_DIR\": \"./image_data\",\r\n  \"RETENTION_DAYS\": 30,\r\n  \"RECONNECT_DELAY\": 3,\r\n  \"SKIP_DUPLICATE\": true,\r\n  \"DUPLICATE_THRESHOLD\": 5.0,\r\n  \"TIME_ZONE_OFFSET\": -12\r\n}\n\nFile v1.0.1:requirements.txt\n\nopencv-python-headless\r\nnumpy\r\nrequests\r\nPillow\r\nfaiss-cpu\r\nhypothesis\n\nArchive v1.0.0: 9 files, 18910 bytes\n\nFiles: image_config.json (586b), image_search.py (48890b), README.md (4332b), requirements.txt (72b), setup.sh (996b), SKILL.md (5334b), tests/__init__.py (25b), tests/test_properties.py (74b), _meta.json (136b)\n\nFile v1.0.0:SKILL.md\n\n---\r\nname: kami-image-search\r\ndescription: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\r\nversion: 1.0.0\r\nauthor: kami-smarthome\r\ntags:\r\n  - smart-home\r\n  - kami\r\n  - smarthome\r\n  - text-to-image search\r\n  - image-search\r\n  - visual-search\r\n  - camera\r\n  - rtsp\r\n  - faiss\r\n  - embedding\r\n  - ai-vision\r\n  - kamivision\r\n  - monitoring\r\n  - home-assistant\r\n  - iot\r\n  - edge-ai\r\ntriggers:\r\n  - smart home\r\n  - kami\r\n  - text to image search\r\n  - home assistant\r\n  - image search\r\n  - search image\r\n  - find image\r\n  - visual search\r\n  - kami image\r\n  - kami smart home\r\n  - search camera\r\n  - what did the camera see\r\n  - find photo\r\n  - search photos\r\n  - look up image\r\n  - camera history\r\n  - check camera\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - python3\r\n        - ffmpeg\r\n      config:\r\n        - image_config.json\r\n    emoji: \"🔍\"\r\n---\r\n\r\n# Kami Image Search\r\n\r\n> Search your camera's visual history with natural language.\r\n\r\nMonitor your camera feed, capture frames automatically, and retrieve matching images by simply describing what you're looking for. Powered by the Kamivision cloud API for AI description and embedding generation.\r\n\r\n### Features\r\n\r\n- 🔍 Natural language image search\r\n- 📸 Automatic frame capture from video streams\r\n- 🧠 AI-powered image description (Kamivision API)\r\n- 📁 Manual image import (JPEG / PNG / BMP / WebP)\r\n- 🔁 Built-in duplicate frame detection\r\n- ⏱ Time-range filtering\r\n- 🏠 Designed for Kami SmartHome ecosystem\r\n\r\n### Scenarios\r\n\r\n- Doorstep delivery verification\r\n- Home activity review\r\n- Pet or child monitoring playback\r\n- Batch photo indexing and retrieval\r\n\r\n## Installation\r\n\r\n```bash\r\nbash setup.sh\r\n```\r\n\r\nChecks for `python3` and `ffmpeg`, creates `.venv/`, and installs `opencv-python-headless`, `numpy`, `requests`, `Pillow`, `faiss-cpu`. Idempotent.\r\n\r\n## Prerequisites\r\n\r\n- `python3` and `python3-venv` installed\r\n- `ffmpeg` installed (setup.sh will attempt to install it)\r\n- `image_config.json` configured with your stream URL and Kamivision API key\r\n- RTSP/RTMP camera online and reachable (for capture mode)\r\n\r\n## Kamivision API Key Setup\r\n\r\nThis skill requires a `KAMIVISION_API_KEY` to access the Kamivision cloud API. The key is NOT included in the skill package — you must provide your own.\r\n\r\n**Ask the user: Do you already have a `KAMIVISION_API_KEY`?**\r\n\r\n- **Yes** → Enter the key directly. It will be saved to `image_config.json`.\r\n- **No** → Please register at [Kamivision Flow](https://kamiclaw-flow-ui.stg.kamicloud.net/) to obtain your API key, then come back and enter it.\r\n\r\n## Parameter Confirmation\r\n\r\nBefore running, confirm these key settings in `image_config.json`:\r\n\r\n| Parameter | Default | Description |\r\n|-----------|---------|-------------|\r\n| `STREAM_URL` | — | RTSP/RTMP/HTTP camera stream URL |\r\n| `DEVICE_ID` | `CAM-001` | Camera device identifier |\r\n| `KAMIVISION_API_KEY` | — | Your Kamivision API key |\r\n| `CAPTURE_INTERVAL` | `10` | Seconds between frame captures |\r\n| `SIMILARITY_THRESHOLD` | `0.35` | Search similarity threshold (0.0–1.0) |\r\n| `SEARCH_TOP_K` | `5` | Max results per search |\r\n| `TIME_ZONE_OFFSET` | `0` | UTC offset in hours for local time display (e.g. `-12` for UTC+12, `8` for UTC+8) |\r\n\r\n**Ask the user: do any parameters need to be changed?**\r\n\r\n## Usage\r\n\r\n### Start Capture\r\n\r\n```bash\r\n.venv/bin/python image_search.py --start-capture\r\n```\r\n\r\n### Stop Capture\r\n\r\n```bash\r\n.venv/bin/python image_search.py --stop-capture\r\n```\r\n\r\n### Check Status\r\n\r\n```bash\r\n.venv/bin/python image_search.py --status\r\n```\r\n\r\n### Import Images\r\n\r\n```bash\r\n# Single image\r\n.venv/bin/python image_search.py --import /path/to/photo.jpg --json\r\n\r\n# Entire directory (recursive)\r\n.venv/bin/python image_search.py --import /path/to/photos/ --json\r\n```\r\n\r\n### Search\r\n\r\n```bash\r\n.venv/bin/python image_search.py --search \"keys on the table\" --json\r\n```\r\n\r\n### Search with Time Range\r\n\r\n```bash\r\n.venv/bin/python image_search.py \\\r\n  --search \"person in blue jacket\" \\\r\n  --time-start 1754538000 --time-end 1754541600 \\\r\n  --json\r\n```\r\n\r\n## Output (stdout JSON)\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"query\": \"keys on the table\",\r\n  \"count\": 1,\r\n  \"results\": [\r\n    {\r\n      \"image_name\": \"CAM-001_1754538507.jpg\",\r\n      \"image_path\": \"/opt/image_data/CAM-001/20250815/CAM-001_1754538507.jpg\",\r\n      \"description\": \"A set of keys and a wallet on a table\",\r\n      \"timestamp\": 1754538507,\r\n      \"time\": \"2025-08-15 10:00:07 AM\",\r\n      \"score\": 0.7823\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n## Exit Codes\r\n\r\n| Code | Meaning |\r\n|------|---------|\r\n| `0` | Success |\r\n| `1` | Error (config issue, stream failure, API error, runtime exception) |\r\n\r\n## Troubleshooting\r\n\r\n- `bash: .venv/bin/python: No such file or directory` → Run `bash setup.sh`\r\n- `OpenCV cannot open stream` → Check camera is online and `STREAM_URL` is correct\r\n- `Kamivision API error` → Verify `KAMIVISION_API_KEY` and network connectivity\r\n- `Unsupported file format` → Only JPEG, PNG, BMP, WebP are supported\r\n- `No search results` → Ensure images have been captured/imported; try lowering `SIMILARITY_THRESHOLD`\r\n- `FAISS index load failed` → Index may be corrupted; system rebuilds automatically, re-import data if needed\n\nFile v1.0.0:README.md\n\n# Kami Image Search\n\nCapture frames from video streams or import local images. Uses the Kamivision cloud API to generate image descriptions + text embeddings (2048-dim) in a single call, with FAISS vector indexing for natural language image retrieval.\n\n## Architecture\n\n```\nCamera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results\n```\n\n## Quick Start\n\n### 1. Setup\n\n```bash\nbash setup.sh\n```\n\nInstalls ffmpeg, creates Python virtual environment, installs dependencies.\n\n### 2. Configure\n\nEdit `image_config.json`:\n\n```json\n{\n  \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n  \"DEVICE_ID\": \"CAM-001\",\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}\n```\n\n> `KAMIVISION_API_KEY` is required. If you don't have one, register at [Kamivision Flow](https://kamiclaw-flow-ui.stg.kamicloud.net/) to obtain it.\n\n### 3. Usage\n\n```bash\n# Start background frame capture\npython image_search.py --start-capture\n\n# Check capture status\npython image_search.py --status\n\n# Stop capture\npython image_search.py --stop-capture\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24\n```\n\n## Configuration\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `STREAM_URL` | Video stream URL (RTSP/RTMP/HTTP) | `\"\"` |\n| `DEVICE_ID` | Device identifier | `CAM-001` |\n| `CAPTURE_INTERVAL` | Frame capture interval (seconds) | `10` |\n| `OUTPUT_WIDTH` / `OUTPUT_HEIGHT` | Output image dimensions | `640` × `360` |\n| `ENABLE_DESCRIPTION` | Enable image description generation | `true` |\n| `VLM_PROMPT` | Custom prompt (empty = cloud default) | `\"\"` |\n| `KAMIVISION_API_URL` | Kamivision API endpoint | `https://kamiclaw-test.kamivision.com/v1/detect` |\n| `KAMIVISION_API_KEY` | Kamivision API key | — |\n| `SIMILARITY_THRESHOLD` | Search similarity threshold | `0.35` |\n| `SEARCH_TOP_K` | Max results returned | `5` |\n| `DATA_DIR` | Data storage directory | `./image_data` |\n| `RETENTION_DAYS` | Data retention days (0 = keep forever) | `30` |\n| `SKIP_DUPLICATE` | Skip duplicate frames | `true` |\n| `DUPLICATE_THRESHOLD` | Duplicate frame pixel diff threshold | `5.0` |\n| `TIME_ZONE_OFFSET` | Timezone offset (hours) | `-12` |\n\n## Cloud API\n\nAll AI capabilities are provided by the Kamivision cloud API — no local models required:\n\n- `SUMMARY`: Takes image base64, returns description (summary) + text embedding (2048-dim)\n- `EMBED`: Takes query text, returns text embedding (2048-dim)\n\nBoth operate in the same text vector space, enabling direct similarity matching.\n\n## Data Storage Structure\n\n```\nimage_data/\n└── CAM-001/\n    ├── 20260423/\n    │   ├── CAM-001_1777010097.jpg\n    │   └── ...\n    ├── imported/          # Images from --import\n    ├── metadata.db        # SQLite metadata\n    └── faiss.index        # FAISS vector index\n```\n\n## CLI Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `--start-capture` | Start background frame capture |\n| `--stop-capture` | Stop background capture |\n| `--status` | Check capture process status |\n| `--import PATH` | Import image file or directory |\n| `--search TEXT` | Natural language search |\n| `--list HOURS` | List images from last N hours |\n| `--json` | JSON output format |\n| `--time-start TS` | Search start time (unix timestamp) |\n| `--time-end TS` | Search end time (unix timestamp) |\n| `--config PATH` | Config file path |\n| `--log-file PATH` | Log file path |\n| `--log-level LEVEL` | Log level (DEBUG/INFO/WARNING/ERROR) |\n| `--export-config` | Export current config to JSON |\n\n## Dependencies\n\n- Python 3.8+\n- ffmpeg (setup.sh auto-installs)\n- Kamivision API key\n\nPython packages (setup.sh installs into .venv):\n- opencv-python-headless\n- numpy\n- requests\n- Pillow\n- faiss-cpu\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7e9156e1awf00v1sas2wkdfd85a4zh\",\n  \"slug\": \"kami-image-search\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1778468685865\n}\n\nFile v1.0.0:image_config.json\n\n{\r\n  \"STREAM_URL\": \"rtsp://admin:ai123456@192.168.2.108:554/stream1\",\r\n  \"DEVICE_ID\": \"CAM-001\",\r\n  \"CAPTURE_INTERVAL\": 10,\r\n  \"OUTPUT_WIDTH\": 640,\r\n  \"OUTPUT_HEIGHT\": 360,\r\n  \"ENABLE_DESCRIPTION\": true,\r\n  \"VLM_PROMPT\": \"\",\r\n  \"EMBEDDING_MODE\": \"text\",\r\n  \"KAMIVISION_API_URL\": \"https://kamiclaw-skill-api.kamihome.com/v1/detect\",\r\n  \"KAMIVISION_API_KEY\": \"\",\r\n  \"SIMILARITY_THRESHOLD\": 0.35,\r\n  \"SEARCH_TOP_K\": 5,\r\n  \"DATA_DIR\": \"./image_data\",\r\n  \"RETENTION_DAYS\": 30,\r\n  \"RECONNECT_DELAY\": 3,\r\n  \"SKIP_DUPLICATE\": true,\r\n  \"DUPLICATE_THRESHOLD\": 5.0,\r\n  \"TIME_ZONE_OFFSET\": -12\r\n}\n\nFile v1.0.0:requirements.txt\n\nopencv-python-headless\r\nnumpy\r\nrequests\r\nPillow\r\nfaiss-cpu\r\nhypothesis","readmeExcerpt":"Skill: Kami Image Search Owner: 13681882136 Summary: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language. Tags: latest:1.0.7 Version history: v1.0.7 | 2026-06-10T06:30:36.368Z | auto - Clarified instructions to require showing the RTSP brand template table to the user during camera configuration. - Improved configuration guidance for","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"Camera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results"},{"language":"bash","snippet":"bash setup.sh"},{"language":"json","snippet":"{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n      \"DEVICE_ID\": \"CAM-FRONT\",\n      \"CAPTURE_INTERVAL\": 10\n    },\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.101:554/stream1\",\n      \"DEVICE_ID\": \"CAM-BACK\",\n      \"CAPTURE_INTERVAL\": 15\n    }\n  ],\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}"},{"language":"bash","snippet":"# Start background frame capture (all cameras)\npython image_search.py --start-capture\n\n# Start a specific camera\npython image_search.py --start-capture --device CAM-FRONT\n\n# Check capture status (all cameras or a specific one)\npython image_search.py --status\npython image_search.py --status --device CAM-FRONT\n\n# Stop capture (all cameras or a specific one)\npython image_search.py --stop-capture\npython image_search.py --stop-capture --device CAM-FRONT\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search across all cameras\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search a specific camera only\npython image_search.py --search \"keys on the table\" --device CAM-FRONT --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24"},{"language":"text","snippet":"image_data/\n├── CAM-FRONT/\n│   ├── 20260423/\n│   │   ├── CAM-FRONT_1777010097.jpg\n│   │   └── ...\n│   ├── imported/          # Images from --import\n│   ├── metadata.db        # SQLite metadata\n│   ├── faiss.index        # FAISS vector index\n│   └── capturer.pid       # Background daemon PID\n└── CAM-BACK/\n    └── ..."},{"language":"text","snippet":"Camera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\r\nname: kami-image-search\r\ndescription: A skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\r\nversion: 1.0.0\r\nauthor: kami-smarthome\r\ntags:\r\n  - smart-home\r\n  - kami\r\n  - smarthome\r\n  - text-to-image search\r\n  - image-search\r\n  - visual-search\r\n  - camera\r\n  - rtsp\r\n  - faiss\r\n  - embedding\r\n  - ai-vision\r\n  - kamivision\r\n  - monitoring\r\n  - home-assistant\r\n  - iot\r\n  - edge-ai\r\ntriggers:\r\n  - smart home\r\n  - kami\r\n  - text to image search\r\n  - home assistant\r\n  - image search\r\n  - search image\r\n  - find image\r\n  - visual search\r\n  - kami image\r\n  - kami smart home\r\n  - search camera\r\n  - what did the camera see\r\n  - find photo\r\n  - search photos\r\n  - look up image\r\n  - camera history\r\n  - check camera\r\nmetadata:\r\n  openclaw:\r\n    requires:\r\n      bins:\r\n        - python3.10\r\n      hardware:\r\n        cpu: \"2+ cores (x86_64 / ARM64)\"\r\n        memory: \"2 GB+\"\r\n        storage: \"5 GB+\"\r\n        gpu: \"optional\"\r\n      network:\r\n        - \"RTSP camera access (LAN)\"\r\n        - \"Internet (KamiClaw API)\"\r\n      devices:\r\n        - \"RTSP IP camera\"\r\n    emoji: \"🔍\"\r\n---\r\n\r\n# Kami Image Search\r\n\r\n> Search your camera's visual history with natural language.\r\n\r\nMonitor your camera feed, capture frames automatically, and retrieve matching images by simply describing what you're looking for. Powered by the Kamivision cloud API for AI description and embedding generation.\r\n\r\n### Features\r\n\r\n- 🔍 Natural language image search\r\n- 📸 Automatic frame capture from video streams\r\n- 🧠 AI-powered image description (Kamivision API)\r\n- 📁 Manual image import (JPEG / PNG / BMP / WebP)\r\n- 🔁 Built-in duplicate frame detection\r\n- ⏱ Time-range filtering\r\n- 🏠 Designed for Kami SmartHome ecosystem\r\n\r\n### Scenarios\r\n\r\n- Doorstep delivery verification\r\n- Home activity review\r\n- Pet or child monitoring playback\r\n- Batch photo indexing and retrieval\r\n\r\n## Installation\r\n\r\n```bash\r\nbash setup.sh\r\n```\r\n\r\nChecks for Python 3.10, creates `.venv/`, and installs `opencv-python-headless`, `numpy`, `requests`, `Pillow`, `faiss-cpu`. Idempotent.\r\n\r\n## Prerequisites\r\n\r\n- Python 3.10 (setup.sh auto-detects system / pyenv / conda; auto-installs via conda or pyenv if missing)\r\n- `image_config.json` configured with your stream URL(s) and Kamivision API key\r\n- RTSP/RTMP camera(s) online and reachable (for capture mode)\r\n\r\n## Kamivision API Key Setup\r\n\r\nThis skill requires a `KAMIVISION_API_KEY` to access the Kamivision cloud API.\r\n\r\n**Check**: Read the `KAMIVISION_API_KEY` field in `image_config.json`.\r\n\r\n- **If already configured (non-empty)** → Use it directly, no need to ask.\r\n- **If empty** → Ask the user if they already have an API Key:\r\n  - **Yes** → Enter the key directly. It will be saved to `image_config.json`.\r\n  - **No** → Register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain your API key. 🎁 **New users get 200 free credits on first registration.**\r\n\r\n## Parameter Confirma"},{"path":"README.md","content":"# Kami Image Search\n\nCapture frames from video streams or import local images. Uses the Kamivision cloud API to generate image descriptions + text embeddings (2048-dim) in a single call, with FAISS vector indexing for natural language image retrieval.\n\n## Architecture\n\n```\nCamera RTSP stream / Local image import\n        │\n        ▼\n   Frame capture & dedup (pixel diff detection)\n        │\n        ▼\n   Kamivision SUMMARY API (returns description + embedding)\n        │\n        ▼\n   FAISS IndexFlatIP + SQLite storage\n        │\n        ▼\n   Natural language query → Kamivision EMBED API → vector matching → ranked results\n```\n\n## Quick Start\n\n### 1. Setup\n\n```bash\nbash setup.sh\n```\n\nChecks Python 3.10 (auto-installs via conda/pyenv if missing), creates Python virtual environment, installs dependencies.\n\n### 2. Configure\n\nEdit `image_config.json` (multi-camera example):\n\n```json\n{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.100:554/stream1\",\n      \"DEVICE_ID\": \"CAM-FRONT\",\n      \"CAPTURE_INTERVAL\": 10\n    },\n    {\n      \"STREAM_URL\": \"rtsp://admin:password@192.168.1.101:554/stream1\",\n      \"DEVICE_ID\": \"CAM-BACK\",\n      \"CAPTURE_INTERVAL\": 15\n    }\n  ],\n  \"KAMIVISION_API_KEY\": \"your-api-key-here\"\n}\n```\n\nEach camera runs as an independent background process; `DEVICE_ID` must be unique. Legacy single-camera config (flat `STREAM_URL` / `DEVICE_ID` at top level, without the `cameras` array) is still supported.\n\n> `KAMIVISION_API_KEY` is required. If you don't have one, register at [Kamivision Flow](https://kamiclaw-skill.kamihome.com/) to obtain it.\n\n### 3. Usage\n\n```bash\n# Start background frame capture (all cameras)\npython image_search.py --start-capture\n\n# Start a specific camera\npython image_search.py --start-capture --device CAM-FRONT\n\n# Check capture status (all cameras or a specific one)\npython image_search.py --status\npython image_search.py --status --device CAM-FRONT\n\n# Stop capture (all cameras or a specific one)\npython image_search.py --stop-capture\npython image_search.py --stop-capture --device CAM-FRONT\n\n# Import local images\npython image_search.py --import /path/to/photos/ --json\n\n# Natural language search across all cameras\npython image_search.py --search \"person in blue jacket\" --json\n\n# Search a specific camera only\npython image_search.py --search \"keys on the table\" --device CAM-FRONT --json\n\n# Search with time range\npython image_search.py --search \"keys\" --time-start 1777010000 --time-end 1777013000 --json\n\n# List images from the last 24 hours\npython image_search.py --list 24\n```\n\n## Configuration\n\n| Field | Description | Default |\n|-------|-------------|---------|\n| `cameras` | Camera list (array). Each entry requires `STREAM_URL` and `DEVICE_ID` | — |\n| `cameras[].STREAM_URL` | Per-camera video stream URL (RTSP/RTMP/HTTP) | `\"\"` |\n| `cameras[].DEVICE_ID` | Per-camera unique identifier | `CAM-001` |\n| `cameras[].CAPTURE_INTERVAL` | Per-camera capture interval (overrides global, seconds) | `10` |\n| `STREAM_UR"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7e9156e1awf00v1sas2wkdfd85a4zh\",\n  \"slug\": \"kami-image-search\",\n  \"version\": \"1.0.7\",\n  \"publishedAt\": 1781073036368\n}"},{"path":"skill-card.md","content":"## Description:\n\nA skill by Kami SmartHome. Capture frames from your camera, describe them with AI, and search your visual history using natural language.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[13681882136](https://clawhub.ai/user/13681882136)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and smart-home operators use this skill to capture or import camera images, index visual history, and retrieve matching images with natural-language queries. Developers can configure camera streams, retention, and search thresholds for RTSP-based monitoring workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Camera frames, imported images, and search text may be sent to Kamivision for cloud inference.\n\nMitigation: Use the skill only when that data sharing is acceptable, verify KAMIVISION_API_URL is the intended HTTPS Kami endpoint, and avoid processing sensitive images unnecessarily.\n\nRisk: Camera stream URLs and API keys can expose private credentials if stored or logged insecurely.\n\nMitigation: Restrict permissions on image_config.json and log files, avoid embedding camera passwords in stream URLs when possible, and rotate credentials if exposure is suspected.\n\nRisk: The setup script can install Python tooling and may request sudo package installation for build dependencies.\n\nMitigation: Review setup.sh before running it and approve sudo installation only when system-wide changes are acceptable.\n\nRisk: Captured images, imported images, SQLite metadata, and FAISS indexes are stored locally.\n\nMitigation: Set retention to the shortest practical period, protect the data directory, and delete local frame and index data when it is no longer needed.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/13681882136/skills/kami-image-search)\n- [Publisher profile](https://clawhub.ai/user/13681882136)\n- [Kamivision Flow](https://kamiclaw-skill.kamihome.com/)\n- [Kamivision privacy policy](https://kamiclaw-skill.kamihome.com/privacy)\n- [Kamivision API endpoint](https://kamiclaw-skill-api.kamihome.com/v1/detect)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands and JSON CLI output]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May produce JSON search results, camera status output, configuration updates, and local image/index files.]\n\n## Skill Version(s):\n\n1.0.7 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"image_config.json","content":"{\n  \"cameras\": [\n    {\n      \"STREAM_URL\": \"rtsp://admin:xxx@192.168.XXX/stream1\",\n      \"DEVICE_ID\": \"camera1\"\n    },\n    {\n      \"STREAM_URL\": \"rtsp://admin:xxx@192.168.xxx/stream1\",\n      \"DEVICE_ID\": \"camera2\"\n    }\n  ],\n  \"OUTPUT_WIDTH\": 640,\n  \"OUTPUT_HEIGHT\": 360,\n  \"ENABLE_DESCRIPTION\": true,\n  \"VLM_PROMPT\": \"\",\n  \"EMBEDDING_MODE\": \"text\",\n  \"KAMIVISION_API_URL\": \"https://kamiclaw-skill-api.kamihome.com/v1/detect\",\n  \"KAMIVISION_API_KEY\": \"\",\n  \"SIMILARITY_THRESHOLD\": 0.35,\n  \"SEARCH_TOP_K\": 5,\n  \"DATA_DIR\": \"./image_data\",\n  \"RETENTION_DAYS\": 30,\n  \"RECONNECT_DELAY\": 3,\n  \"SKIP_DUPLICATE\": true,\n  \"DUPLICATE_THRESHOLD\": 5.0,\n  \"TIME_ZONE_OFFSET\": -12,\n  \"CAPTURE_INTERVAL\": 10\n}"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1708,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T10:09:48.570Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T10:09:48.570Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:15:34.820Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}