Use when the user asks to "create an agent", "set up an agent", "add my agent to Cekura", "configure my voice agent", "connect my agent", "set up mock tools", "add tools to my agent", "upload knowledge base", "configure integration", "connect VAPI", "connect Retell", "connect LiveKit", "connect ElevenLabs", "add dynamic variables", or needs to onboard a voice AI agent onto the Cekura platform. Covers the full agent setup flow: collecting context, creating the agent, configuring the provider integration, setting up mock tools, uploading knowledge base files, and adding dynamic variables.
75
92%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Risky
Do not use without reviewing
Collect comprehensive context about a client's voice AI agent and set it up on Cekura — ready for testing and observability. This is an interactive, multi-step flow that creates the agent, configures provider integration, sets up mock tools, uploads knowledge base files, and adds dynamic variables.
When this skill suggests creating, listing, updating, or evaluating something on Cekura, prefer using available platform tools over describing API calls or dashboard steps. In Claude Code with the Cekura plugin installed, these tools are auto-configured and handle authentication, parameter validation, and error handling for you. Fall back to direct API endpoints or dashboard guidance only when no tools are available in the current session.
This is an interactive collection-and-configuration flow. Walk the user through each phase:
Ask for these essentials:
inbound: true, default) or make calls (inbound: false)?The agent description is the most important field. It powers:
{{agent.description}}Collect the full system prompt. Ask:
Provider-specific exports:
.json)If the description is very long (>10K chars), that's fine — Cekura handles it. Don't truncate.
Format: +1234567890 (must start with +, 8-30 chars). This is the number Cekura will call for testing.
Ask: "What's your agent's phone number? This is the number Cekura will call during tests."
If WebRTC/WebSocket only (no phone), this can be skipped.
Once you have the basics, create the agent (POST to /test_framework/v1/aiagents/) with:
{
"agent_name": "Customer Support Bot",
"project": 123,
"language": "en",
"description": "<full system prompt>",
"contact_number": "+14155551234",
"inbound": true
}Save the returned id — you'll need it for all subsequent steps.
For agent descriptions longer than ~4 KB (multi-state agents, full system prompts, exported workflows), send the request as a direct JSON body via the API rather than relying on tools that may URL-encode parameters — large URL-encoded payloads can hit URI length limits.
curl -X POST https://api.cekura.ai/test_framework/v1/aiagents/ \
-H "X-CEKURA-API-KEY: $CEKURA_API_KEY" \
-H "Content-Type: application/json" \
-d @agent.jsonWhere agent.json contains the full payload (including the long description). This is the safest way to create agents with long system prompts or large state-machine configs.
Ask: "What provider does your agent use? (VAPI, Retell, ElevenLabs, LiveKit, Pipecat, or self-hosted/custom?)"
Provider vs connection mode — keep these distinct. assistant_provider is where the agent lives (the platform it's built on). How Cekura dials into it for a test run (PSTN / WebRTC / WebSocket / SIP / chat) is the connection mode, picked separately below. Never offer SIP / WebSocket / Voice / Text as a provider choice — they are connection modes for self_hosted (or any) agents.
Then collect provider-specific credentials and configure. See references/integrations.md for full details on each provider.
Provider (assistant_provider) | Key Fields |
|---|---|
VAPI (vapi) | vapi_api_key, assistant_id |
Retell (retell) | retell_api_key, assistant_id |
ElevenLabs (elevenlabs) | elevenlabs_api_key, assistant_id |
LiveKit (livekit) | livekit_api_key, livekit_data (JSON with api_secret, url) |
Pipecat (self_hosted) | pipecat_api_key, agent name as contact_number |
Self-hosted / Custom (self_hosted) | Webhook URL or WebSocket URL — they push calls to Cekura |
Apply via PATCH /test_framework/v1/aiagents/{id}/:
{
"assistant_provider": "vapi",
"vapi_api_key": "...",
"assistant_id": "asst_...",
"transcript_provider": "vapi"
}After setting the provider, confirm how Cekura should connect to the agent during test runs. This is independent of the provider — a self_hosted agent can be reached over SIP, WebSocket, or chat; a VAPI agent over PSTN or VAPI WebRTC; etc.
contact_number field. Simplest.websocket_url.sip_endpoint, optionally sip_auth. Typically used with self_hosted provider.chat_assistant_id.Recommend chat/text for initial iteration, voice for final validation.
For VAPI/Retell, offer to enable:
auto_fetch_calls_enabled: true — Auto-imports production calls every 30 seconds (for observability)auto_sync_prompt_enabled: true — (Retell only) Auto-syncs prompt changes every 30 secondsAsk: "Does your agent call external APIs or tools during calls? (e.g., booking systems, CRMs, payment APIs)"
If yes, there are two paths:
If the provider integration is configured with API key + assistant ID:
Note: Auto-fetch is done in the UI — there's no API-only equivalent. After auto-fetch, you can manage tools via API.
For each tool the agent uses:
Identify tools — Read the agent description to find all tool references. Ask: "What tools does your agent call? Give me the tool names and what each one does."
Create each mock tool (POST to /test_framework/v1/aiagents/{agent_id}/tools/):
{
"name": "get_user_info",
"description": "Retrieves user data based on phone number or user ID",
"information": [
{
"input": {"phone_number": "8645239892"},
"output": {"borrower_id": "B001", "first_name": "John", "last_name": "Doe", "dob": "01/15/1990"}
},
{
"input": {"phone_number": "18645239892"},
"output": {"borrower_id": "B001", "first_name": "John", "last_name": "Doe", "dob": "01/15/1990"}
}
],
"freetext_params": ["notes", "reason"]
}Key rules:
name must exactly match the tool name in the agent description (max 64 chars, alphanumeric + underscores + hyphens)information is an array of input/output mappings — Cekura matches incoming tool calls to the closest input and returns the corresponding outputfreetext_params — Parameter names that should be skipped during mock matching (free-text fields like "notes" or "reason" that vary per call)get_loans needs borrower_id from get_user_info), the mock data must be consistent across toolsinformation REPLACES the array; always GET → merge → PATCHSee references/mock-tool-design.md for examples, the design questionnaire, and full guidance.
Ask: "Does your agent reference any knowledge base documents? (e.g., FAQs, product guides, policy docs)"
If yes, upload files via the agent knowledge base upload endpoint.
Supported formats: PDF, text files, documents.
Purpose: Knowledge base files enable:
After upload, the files appear in Agent Settings → Agent's Knowledge.
Optional: Link KB files to hallucination detection by PATCHing the agent with {"hallucination_metric_kb_files": [<file_id_1>, <file_id_2>]}.
Ask: "Does your agent use per-call variables? (e.g., customer name, account ID, appointment details, different system prompts per call)"
If the agent description contains {{variableName}} patterns, Cekura auto-detects them. After creating the agent, check if any were detected.
If the user has dynamic variables that aren't in the description pattern:
Via API: Dynamic variables are managed through the agent description. Add {{variableName}} placeholders to the description where the variable should be injected.
What dynamic variables enable:
Key insight: For clients with multi-agent flows where each node has its own system prompt, recommend using dynamic variables (one per node) rather than putting everything in the agent description. This enables per-node metrics using {{dynamic_variables.nodeName}}.
After all steps are complete, verify:
assistant_provider, API key, and assistant_id are setknowledge_base_files on the agent objectSummary for the user:
Agent: [name] (ID: [id])
Project: [project_id]
Provider: [provider] (assistant: [assistant_id])
Connection: [phone/WebRTC/chat]
Mock tools: [count] configured
Knowledge base: [count] files uploaded
Dynamic variables: [list or "none"]
Ready for: evaluator generation → cekura-eval-design skill
metric setup → cekura-metric-design skillAfter agent setup, the user typically needs:
references/integrations.md — Full provider integration details (VAPI, Retell, ElevenLabs, LiveKit, Pipecat, self-hosted) plus connection-mode reference (PSTN, WebRTC, WebSocket, SIP, chat)references/mock-tool-design.md — Per-input branching examples, design questionnaire, append-not-replace patternreferences/api-reference.md — Complete agent API endpoints and schemasscripts/upload-agent.sh — Curl wrapper to create or update an agent with a large system prompt (>4 KB), bypassing URI-length limits. Reads payload from a JSON file.24ad1d0
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.