Install
openclaw skills install @everfirdev/videoinuVideoinu platform skill — manage projects via Graphs (canvases), upload/download files, chat with AI Agents, and run Workflows. Use when: user mentions Videoinu, Graph management, uploading files to Videoinu, agent chat on Videoinu, or running Videoinu workflows.
openclaw skills install @everfirdev/videoinuVideoinu platform skill — manage projects via Graphs (canvases), upload/download files, chat with AI Agents, and run Workflows.
You MUST use the Python scripts provided by this skill to interact with Videoinu. Do NOT use mcporter, MCP, curl, or any other method to call the API directly.
All scripts are located in the scripts/ directory of this skill. Tokens are stored in ~/.videoinu/credentials.json and scripts read them automatically.
Example: to list projects, run python3 <skill_scripts_dir>/list_graphs.py — do not construct HTTP requests manually.
videoinu-skill provides a set of Python scripts for interacting with the Videoinu platform. It covers the following core capabilities:
python3 (3.9+)VIDEOINU_ACCESS_KEY (required)VIDEOINU_API_BASE (defaults to https://videoinu.com)All requests use Cookie-based authentication: Cookie: token=<VIDEOINU_ACCESS_KEY>
How to obtain your Access Key:
Saving the Access Key (choose one):
Option A: Save locally with auth.py (recommended)
python3 auth.py save "your-access-key"
# Token saved to ~/.videoinu/credentials.json (owner read/write only)
# All scripts will auto-read it — no environment variable needed
Option B: Environment variable
export VIDEOINU_ACCESS_KEY="your-access-key"
Token resolution priority: environment variable > ~/.videoinu/credentials.json
Verify and manage:
python3 auth.py status # Show current auth status
python3 auth.py verify # Verify token validity
python3 auth.py logout # Remove saved token
If the user is not yet logged in, direct them to https://videoinu.com/login to sign up / log in and obtain their key.
Security warning: Never hardcode the Access Key into script files. The Access Key is a JWT token containing user identity information — leaking it could lead to account compromise. Use auth.py save or environment variables.
| Script | Function | Input | Output |
|---|---|---|---|
auth.py | Save/verify/manage Access Key | save/status/verify/logout | Auth status |
list_graphs.py | List user's Graphs | --page-size, --tag | Graph list |
get_graph.py | View Graph details (ViewNode + CoreNode) | GRAPH_ID | Filtered node info |
create_graph.py | Create a new Graph | NAME, --tag | Graph ID + URL |
upload_file.py | Upload a file to create a CoreNode | File path | CoreNode ID + URL |
download_file.py | Download files from a Graph | GRAPH_ID or --urls | Local file paths |
create_session.py | Create an Agent session | GRAPH_ID, --list | Session ID |
agent_chat.py | Chat with an Agent | SESSION_ID, message | Agent reply |
run_workflow.py | Run a Workflow | DEFINITION_ID, inputs | Instance ID |
query_workflow.py | Query Workflow status | INSTANCE_ID, --poll | Execution status |
A Graph is Videoinu's project container. It contains:
Each ViewNode can reference one or more CoreNodes (core_refs), with selected_core_id indicating the currently selected version.
asset: Asset node
asset_type: image | video | audio | text | json | filesource_type: upload | import | generatedurl (media file) or content (text content)operation: Operation node (Workflow execution output)
status: pending | completed | failedAn Agent is an AI assistant bound to a Graph. It communicates via WebSocket in real time.
A predefined automation pipeline that accepts inputs (CoreNode references) and produces new CoreNodes.
# 1. List all Graphs
python3 list_graphs.py
# 2. View details of a specific Graph
python3 get_graph.py GRAPH_ID
# 1. Create a new Graph (auto-tagged with free-mode so it appears in the UI)
python3 create_graph.py "My New Project"
# → returns graph_id
# 2. Upload a reference file
python3 upload_file.py /path/to/reference.png
# → returns core_node_id, file_url
# 3. Verify the Graph
python3 get_graph.py GRAPH_ID
# 1. Create a session
python3 create_session.py GRAPH_ID
# → returns session_id
# 2. Send a message
python3 agent_chat.py SESSION_ID "Analyze the structure of this project"
# 3. Send a message with a file reference
python3 agent_chat.py SESSION_ID "Check this image {{@core_node:CORE_NODE_ID:image.png}}"
# 4. List existing sessions
python3 create_session.py GRAPH_ID --list
# 1. Upload the file
python3 upload_file.py /path/to/video.mp4
# → core_node_id = "abc123"
# 2. Create a session (if you don't have one yet)
python3 create_session.py GRAPH_ID
# → session_id = "sess456"
# 3. Ask the Agent to process the file
python3 agent_chat.py sess456 "Please edit this video {{@core_node:abc123:video.mp4}}" --auto-approve
# 1. List available Workflow definitions
python3 run_workflow.py --list
# 2. Run within an existing Graph
python3 run_workflow.py DEF_ID --graph-id GRAPH_ID \
--inputs '{"input_image": {"type": "core_node_refs", "core_node_ids": ["NODE_ID"]}}'
# → returns instance_id
# 3. Poll execution status until complete
python3 query_workflow.py INSTANCE_ID --poll
# Download all images from the Graph
python3 download_file.py GRAPH_ID --type image --output-dir ./results
# Download all videos
python3 download_file.py GRAPH_ID --type video
# Download specific URLs directly
python3 download_file.py --urls "https://..." "https://..." --output-dir ./output
You can reference nodes in a Graph within messages sent to the Agent:
{{@core_node:CORE_NODE_ID:display_name}}
{{@view_node:VIEW_NODE_ID:display_name}}
Example:
Please analyze this image {{@core_node:a1b2c3d4:sunset.png}}
The Agent will fetch the corresponding CoreNode content based on the reference.
All scripts output JSON to stdout and errors to stderr.
Success:
{
"graphs": [...],
"has_more": false
}
Error:
{
"error": "VIDEOINU_ACCESS_KEY is not set. Run: export VIDEOINU_ACCESS_KEY=\"your-access-key\""
}
get_graph.py to understand the current state of a Graph before performing operations{{@core_node:ID:name}} references instead of text descriptionsupload_file.py first, then reference it in messagesAll HTTP endpoints are based on VIDEOINU_API_BASE (defaults to https://videoinu.com).
/api/backend/)| Method | Path | Description |
|---|---|---|
| GET | /graph/list | List Graphs |
| POST | /graph | Create a Graph |
| GET | /graph/:id | Get Graph details |
| DELETE | /graph/:id | Delete a Graph |
| POST | /core_nodes/upload/presign | Get a pre-signed upload URL |
| POST | /core_nodes | Create CoreNodes (batch) |
| GET | /core_nodes/assets_v2 | List asset CoreNodes |
| POST | /wf/instance/run_in_graph | Run a Workflow in a Graph |
| POST | /wf/instance/run_create_graph | Run a Workflow and create a Graph |
| GET | /wf/instance/:id/status_sse | Workflow status SSE |
| GET | /wf/definition/list | List Workflow definitions |
/api/agent/)| Method | Path | Description |
|---|---|---|
| GET | /projects/by-graph/:graphId | Get Agent Project by Graph ID |
| POST | /projects/ | Create an Agent Project |
| GET | /sessions/by-project/:projectId | List sessions for a Project |
| POST | /sessions/ | Create a session |
| DELETE | /sessions/:sessionId | Delete a session |
| WS | /sessions/:sessionId/stream | WebSocket Agent session stream |
Send prompt:
{"jsonrpc": "2.0", "method": "prompt", "id": "uuid", "params": {"user_input": "message"}}
Heartbeat:
{"jsonrpc": "2.0", "method": "heartbeat", "id": "hb-uuid", "params": {"heartbeat_id": "uuid"}}
Approve tool call:
{"jsonrpc": "2.0", "id": "rpc-id-from-request", "result": {"request_id": "req-id", "response": "approve"}}
Received event types: TurnBegin, ContentPart, ToolCall, ToolCallPart, ToolResult, ApprovalRequest, StatusUpdate, SessionNotice, ReplayComplete