Videoinu 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)
bash
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
bash
export VIDEOINU_ACCESS_KEY="your-access-key"
Token resolution priority: environment variable > ~/.videoinu/credentials.json
Verify and manage:
bash
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.
ScriptFunctionInputOutputauth.pySave/verify/manage Access Keysave/ status/ verify/ logoutAuth statuslist_graphs.pyList user's Graphs--page-size, --tagGraph listget_graph.pyView Graph details (ViewNode + CoreNode)GRAPH_IDFiltered node infocreate_graph.pyCreate a new GraphNAME, --tagGraph ID + URLupload_file.pyUpload a file to create a CoreNodeFile pathCoreNode ID + URLdownload_file.pyDownload files from a GraphGRAPH_ID or --urlsLocal file pathscreate_session.pyCreate an Agent sessionGRAPH_ID, --listSession IDagent_chat.pyChat with an AgentSESSION_ID, messageAgent replyrun_workflow.pyRun a WorkflowDEFINITION_ID, inputsInstance IDquery_workflow.pyQuery Workflow statusINSTANCE_ID, --pollExecution 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.
bash
# 1. List all Graphs
python3 list_graphs.py
# 2. View details of a specific Graph
python3 get_graph.py GRAPH_ID
bash
# 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
bash
# 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
bash
# 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
bash
# 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
bash
# 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:
text
{{@core_node:CORE_NODE_ID:display_name}}
{{@view_node:VIEW_NODE_ID:display_name}}
Example:
text
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:
json
{
"graphs": [...],
"has_more": false
}
Error:
json
{
"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/)#MethodPathDescriptionGET/graph/listList GraphsPOST/graphCreate a GraphGET/graph/:idGet Graph detailsDELETE/graph/:idDelete a GraphPOST/core_nodes/upload/presignGet a pre-signed upload URLPOST/core_nodesCreate CoreNodes (batch)GET/core_nodes/assets_v2List asset CoreNodesPOST/wf/instance/run_in_graphRun a Workflow in a GraphPOST/wf/instance/run_create_graphRun a Workflow and create a GraphGET/wf/instance/:id/status_sseWorkflow status SSEGET/wf/definition/listList Workflow definitions
/api/agent/)#MethodPathDescriptionGET/projects/by-graph/:graphIdGet Agent Project by Graph IDPOST/projects/Create an Agent ProjectGET/sessions/by-project/:projectIdList sessions for a ProjectPOST/sessions/Create a sessionDELETE/sessions/:sessionIdDelete a sessionWS/sessions/:sessionId/streamWebSocket Agent session stream
Send prompt:
json
{"jsonrpc": "2.0", "method": "prompt", "id": "uuid", "params": {"user_input": "message"}}
Heartbeat:
json
{"jsonrpc": "2.0", "method": "heartbeat", "id": "hb-uuid", "params": {"heartbeat_id": "uuid"}}
Approve tool call:
json
{"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