skills/interhuman-stream-analyze/SKILL.md
--- name: interhuman-stream-analyze description: Connect to Interhuman v1 WebSocket stream analyze for real-time video segment analysis. Use for live streams, chunked video, WebSocket, or /v1/stream/analyze. Returns verbatim JSON event envelopes without modification. --- # Interhuman Stream Analyze (v1) Wrapper for the Interhuman API v1 WebSocket streaming endpoint that analyzes video segments in real time and returns social-intelligence events. Use **v1 only** (`/v1/stream/analyze`). Do no
npx skillsauth add interhumanai/skills skills/interhuman-stream-analyzeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Wrapper for the Interhuman API v1 WebSocket streaming endpoint that analyzes video segments in real time and returns social-intelligence events.
Use v1 only (/v1/stream/analyze). Do not use the legacy v0 endpoint (/v0/stream/analyze).
Use this skill when:
signal.detected, engagement.updated, etc.) as analysis progressesDo NOT use this skill for:
POST /v1/upload/analyze) insteadAPI Key: Bearer credential or Sec-WebSocket-Protocol value (see Authentication)
Video segments: Binary chunks sent over the WebSocket
Content requirements (both video and audio must be meaningful):
Prefer the API key in the Authorization header when your WebSocket client supports it:
Authorization: Bearer <api_key>If the client cannot set Authorization on the WebSocket handshake, pass the API key via subprotocol:
Sec-WebSocket-Protocol: <api_key>Optional correlation for your own logs (not echoed in responses):
X-Client-Request-Id: <your-request-id>The server assigns a connection correlation_id returned in every event envelope and in the X-Correlation-ID HTTP response header on upgrade.
wss://api.interhuman.ai/v1/stream/analyzewss://api.interhuman.ai/v1/stream/analyze with authentication headers.Times in v1 server events (start, end) use absolute session-cumulative seconds across all segments sent in the connection.
Send a JSON text frame with optional fields:
{
"include": ["conversation_quality_overall", "conversation_quality_timeline"]
}
| Field | Values | Purpose |
|-------|--------|---------|
| include | conversation_quality_overall, conversation_quality_timeline | Opt in to conversation_quality.updated event sections |
conversation_quality_overall: cumulative CQI across every window emitted so far in the sessionconversation_quality_timeline: single per-window CQI entry for the current analysis windowUnknown include values are ignored. Omit fields you do not need.
Every server message is a JSON envelope with type, timestamp, correlation_id, and data. Narrow on type:
| type | Summary |
|--------|---------|
| signal.detected | Social signal in the current window |
| engagement.updated | Engagement state for the current window |
| conversation_quality.updated | CQI sections per session include flags |
| error | Processing failure |
For full field definitions and examples, see reference.md.
signal.detected uses data.signal_type. Supported values:
agreement, confidence, confusion, disagreement, disengagement, engagement, frustration, hesitation, interest, skepticism, stress, uncertainty
data.probability is one of: high, medium, low.
import asyncio
import json
import websockets
API_KEY = "YOUR_API_KEY"
VIDEO_PATH = "/path/to/segment.mp4"
WS_URL = "wss://api.interhuman.ai/v1/stream/analyze"
async def main():
headers = {"Authorization": f"Bearer {API_KEY}"}
async with websockets.connect(WS_URL, additional_headers=headers) as ws:
await ws.send(
json.dumps({"include": ["conversation_quality_overall"]})
)
with open(VIDEO_PATH, "rb") as f:
await ws.send(f.read())
async for message in ws:
event = json.loads(message)
print(json.dumps(event)) # verbatim envelope
asyncio.run(main())
import fs from "fs";
import WebSocket from "ws";
const apiKey = process.env.INTERHUMAN_API_KEY;
const videoPath = "path/to/segment.mp4";
const ws = new WebSocket("wss://api.interhuman.ai/v1/stream/analyze", {
headers: { Authorization: `Bearer ${apiKey}` },
});
ws.on("open", () => {
ws.send(JSON.stringify({ include: ["conversation_quality_overall"] }));
ws.send(fs.readFileSync(videoPath));
});
ws.on("message", (data) => {
const event = JSON.parse(data.toString());
console.log(JSON.stringify(event)); // verbatim envelope
});
If Authorization is not supported, connect with subprotocol auth:
const ws = new WebSocket("wss://api.interhuman.ai/v1/stream/analyze", apiKey);
Errors arrive as envelopes with type: "error":
ih6002)See error handling for error code details.
CRITICAL: This skill is a strict wrapper. You MUST:
Each server message should be passed through verbatim as a single JSON object.
development
Wrapper for Interhuman API POST /v1/upload/analyze endpoint. Analyzes completed video files and returns raw JSON responses with detected social signals. Use when the user wants to analyze a pre-recorded video file. Returns the exact JSON response from the API without modification.
development
Wrapper for Interhuman API POST /v1/auth endpoint. Generates short-lived bearer access tokens using API key credentials. Use when the user needs to authenticate before calling Interhuman API endpoints. Returns the exact JSON response from the API without modification.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.