LiveKit
Canonical tools, triggers, auth, schemas, and mock behavior for LiveKit.
Run a valid livekit.create_room call through the same SDK surface used by every toolkit.
Minimal tool call
import { Eyeball } from "@eyeball/sdk";
const eyeball = new Eyeball({
apiKey: process.env.EYEBALL_API_KEY!,
baseUrl: process.env.EYEBALL_EXECUTOR_URL!,
});
const output = await eyeball.tools.run(
"livekit.create_room",
{
"roomName": "example_roomName",
"emptyTimeoutSeconds": 300,
"maxParticipants": 20
},
{ userId: "demo_user",
idempotencyKey: "docs:livekit.create_room:demo-1" },
);
console.log(output);The model receives canonical output. Your application retains the execution envelope through tools.execute or the execution APIs when it needs IDs, status, versions, and latency.
Supported canonical tools
| Tool | Purpose | Execution | Effect | Version |
|---|---|---|---|---|
livekit.create_room | Create a realtime audio/video room and return normalized access metadata. | sync or async | mutation | 1.0.0 |
livekit.join_room | Create participant credentials and normalized join instructions for a realtime room. | sync or async | mutation | 1.0.0 |
Only the rows above are implemented. A capability tool omitted by this manifest returns not_supported; eyeball never synthesizes provider parity.
Supported canonical triggers
This manifest does not implement a canonical trigger.
Input and output schemas
livekit.create_room
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:voice_telephony:create_room:1.0.0:livekit",
"type": "object",
"description": "Realtime room name, limits, and opaque metadata.",
"additionalProperties": false,
"required": [
"roomName"
],
"properties": {
"roomName": {
"type": "string",
"description": "Unique provider room name.",
"minLength": 1
},
"emptyTimeoutSeconds": {
"type": "integer",
"description": "Seconds an empty room may remain allocated.",
"minimum": 1,
"default": 300
},
"maxParticipants": {
"type": "integer",
"description": "Maximum simultaneous participants.",
"minimum": 1,
"default": 20
},
"metadata": {
"type": "string",
"description": "Opaque room metadata."
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:voice_telephony:create_room:output:1.0.0:livekit",
"type": "object",
"description": "The newly allocated realtime room.",
"additionalProperties": false,
"required": [
"roomId",
"roomName",
"state",
"createdAt",
"participantCount"
],
"properties": {
"roomId": {
"type": "string",
"description": "Provider-stable room identifier.",
"minLength": 1
},
"roomName": {
"type": "string",
"description": "Provider room name.",
"minLength": 1
},
"state": {
"type": "string",
"description": "Normalized realtime-room lifecycle state.",
"enum": [
"created",
"active",
"closed"
]
},
"createdAt": {
"type": "string",
"description": "Time the room was created.",
"format": "date-time"
},
"participantCount": {
"type": "integer",
"description": "Current active participant count.",
"minimum": 0
}
}
}livekit.join_room
Input schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:voice_telephony:join_room:1.0.0:livekit",
"type": "object",
"description": "Room and participant identity used to create join credentials.",
"additionalProperties": false,
"required": [
"roomName",
"participantIdentity"
],
"properties": {
"roomName": {
"type": "string",
"description": "Provider room name.",
"minLength": 1
},
"participantIdentity": {
"type": "string",
"description": "Stable participant identity in the room.",
"minLength": 1
},
"participantName": {
"type": "string",
"description": "Human-readable participant name.",
"minLength": 1
},
"metadata": {
"type": "string",
"description": "Opaque participant metadata."
},
"tokenTtlSeconds": {
"type": "integer",
"description": "Lifetime of the short-lived participant token.",
"minimum": 60,
"maximum": 86400,
"default": 3600
}
}
}Output schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:eyeball:voice_telephony:join_room:output:1.0.0:livekit",
"type": "object",
"description": "Participant identity and access token for the room.",
"additionalProperties": false,
"required": [
"roomId",
"roomName",
"participantId",
"participantIdentity",
"token",
"expiresAt"
],
"properties": {
"roomId": {
"type": "string",
"description": "Provider-stable room identifier.",
"minLength": 1
},
"roomName": {
"type": "string",
"description": "Provider room name.",
"minLength": 1
},
"participantId": {
"type": "string",
"description": "Provider-stable participant identifier.",
"minLength": 1
},
"participantIdentity": {
"type": "string",
"description": "Stable participant identity.",
"minLength": 1
},
"token": {
"type": "string",
"description": "Short-lived room access token.",
"minLength": 1
},
"expiresAt": {
"type": "string",
"description": "Time the short-lived room access token expires.",
"format": "date-time"
},
"serverUrl": {
"type": "string",
"format": "uri",
"description": "Realtime server URL when the provider exposes it."
}
}
}Authentication
| Property | Value |
|---|---|
| Auth class | api_key |
| Required scopes | None |
| Optional scopes | None |
| Credential fields | apiKey, apiSecret |
Credentials are resolved inside the executor by CredentialProvider. They never belong in tool input, x_provider, model context, logs, or execution output.
Provider-specific extensions
This manifest declares no provider-specific schema extensions. Use only canonical fields.
Provider differences may appear only under x_provider.livekit and only when the schema above declares them.
Sync and async behavior
All tools are synchronous by nature, but callers may choose mode: "async" to queue them.
Mutations require a stable Idempotency-Key. The TypeScript SDK accepts it as idempotencyKey; it is never part of the JSON request body.
REST example
curl "$EYEBALL_EXECUTOR_URL/v1/execute" \
-H "Authorization: Bearer $EYEBALL_API_KEY" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: docs:livekit.create_room:demo-1' \
--data '{"tool":"livekit.create_room","userId":"demo_user","input":{"roomName":"example_roomName","emptyTimeoutSeconds":300,"maxParticipants":20},"mode":"sync"}'Mock support
Point EYEBALL_EXECUTOR_URL at a mock-configured executor to run through the real catalog, validation, credential seam, adapter, normalized errors, and execution records with no LiveKit account. Mock selection changes the executor endpoint and trusted provider base-URL configuration, never the execute request.
Limitations
- This page describes the manifest's explicit P0 subset, not every operation offered by the provider.
- Provider account policy, consent UI, quota details, and current wire compatibility still require a real-provider certification pass.
- Fields outside the canonical schemas and declared
x_providerextensions are rejected.
Versions
| Contract | Version |
|---|---|
| Runtime catalog | 1.1 |
| Manifest catalog | 1.0 |
| Manifest schema | 1.0 |
| Source | native |
| Tier | P0 |
| Capabilities | voice_telephony |
Next
Use Testing with mocks to exercise this toolkit before connecting a live provider account.