Skip to main content
Automate your agent testing by integrating Cekura with GitHub Actions. This guide walks you through setting up workflows to test your agents automatically on every code change, pull request, or on a custom schedule. The Cekura GitHub Action is a simple, dependency-free solution that uses standard tools available on GitHub runners (curl, bash, and python3 for JSON parsing). No installation or setup required - it works out of the box.

Before You Get Started

Important: Before setting up a workflow, ensure your agent is properly configured with scenarios in the Cekura dashboard.
You’ll need your Agent ID and either Scenario IDs or Tags to select which tests to run.

Finding Your Agent ID

  1. Log in to your Cekura dashboard
  2. Navigate to the Agents section
  3. Select your agent
  4. Copy the Agent ID displayed in the agent details
You can retrieve your agent ID programmatically using the Cekura API:
The response will include your agent ID in the id field.

Using Tags vs Scenario IDs

You can run tests in two ways:

Using Scenario IDs

Run specific scenarios by their IDs. Use this when you want to test exact scenarios.

Using Tags

Run all scenarios with specific tags. Use this when you want to test groups of scenarios (e.g., smoke-test, critical).

Step-by-Step Tutorial

1

Create Workflow File

In your repository, create a file at .github/workflows/test-agents.yml:
2

Configure Variables & Secrets

Go to your repository → Settings → Secrets and variables → ActionsAdd Secret (API Key):
  1. Click New repository secret
  2. Name: CEKURA_API_KEY
  3. Value: Your API key from the Cekura dashboard
Add Variables:
  1. Click the Variables tab
  2. Click New repository variable
  3. Add required variables:
    • AGENT_ID - Your agent ID (required)
  4. Add one or both of the following:
    • SCENARIO_IDS - Comma-separated scenario IDs (e.g., 123,456,789)
    • TAGS - Comma-separated tags (e.g., smoke-test,critical)
  5. Optionally add:
    • PHONE_NUMBER - Outbound phone number for testing (e.g., +1234567890)
Add GitHub Variables
3

Start Test Run

To test your workflow, make a change to your codebase and raise a pull request. This will trigger the workflow automatically.Workflow Triggered
4

Monitor Workflow

  1. Go to your repository on GitHub
  2. Click the Actions tab
  3. You’ll see your workflow running
  4. Click on the workflow run to see detailed logs
Workflow Running

Advanced Usage

Different Triggers

Then trigger from the Actions tab → Run workflow button.
For more information about workflow triggers and events, check out the GitHub Actions official documentation.

Environment-Specific Testing

Test different environments (staging, production) with separate secrets:

Testing with Phone Numbers

When testing agents that make outbound calls, you can specify a phone number:

Execution Modes

execution_mode picks how the scenarios reach your agent. It defaults to voice.
livekit_data accepts agent_name, url and config; pipecat_data accepts pipecat_agent_name, config and room_properties. Both override the agent’s saved connection settings for that run only. Do not put LiveKit or Pipecat Cloud credentials in the workflow.

Action Inputs

*Provide scenario_ids or tags (or both) for voice and text; livekit_v2 and pipecat_v2 require scenario_ids.

Action Outputs

When the Action Passes

The action polls the result every 30 seconds until it is completed, failed, timeout or cancelled, then writes a summary to the job and:
  • passes when the result is completed and every run passed;
  • fails otherwise — a run that failed its checks, errored, never connected or timed out counts as not passed, and so does a result that ends failed, timeout or cancelled.
The job summary shows the result’s counts and one row per run, with the scenario, the outcome and, for a run that did not pass, why (the failed metrics or the error). If the result is still running after timeout seconds, the action ends its active calls, writes the result ID and a shareable link to the job summary, and fails the step. Result statuses and gating explains each status and count.

Cancelling and job timeouts

If the workflow is cancelled, or the job hits its timeout-minutes, the action:
  • asks Cekura to end the result’s active calls, so no runs are left going in the background;
  • still writes the result ID to the job summary and sets the result_id output, so you can open the result in Cekura;
  • adds a shareable link (and the result_url output) if Cekura answers within GitHub’s few-second cancellation window.

Example with All Options

Running Many Groups Under One Concurrency Limit

To run several agents’ scenarios from one step, use the run-batch action. A group can also have several legs that must run at the same time, each as its own result, such as the caller and the transfer target of a warm transfer, or the parties of a 3-way call. You set a single concurrency, and the action starts groups only while their calls fit under it, so you don’t need a matrix or a job per batch.
  • Single-agent group (agent_id + scenario_ids): runs as one result. It reserves scenarios × frequency calls, or the whole concurrency if that is smaller, and Cekura runs no more than that many at once.
  • Group with legs (two or more): the legs are matched by position, so scenario i of every leg forms set i, and every leg needs the same number of scenarios. Repeat an ID to reuse a scenario. Each set starts one result per leg together, in separate contexts, and counts as one call per leg. frequency repeats the whole set rather than the runs inside each result. A leg’s optional name labels it in the summary; keys set on the group, such as agent_id, are defaults for every leg.
  • Scheduling: groups start in the order listed, each one only when its calls fit in what is left of concurrency. A group’s calls are freed when its result finishes. Set dry_run: true to validate the batch and print the plan without placing calls.
  • Job summary: one row per result, with links, plus every run that did not pass and why. The step passes only when every run in every result passed. The passed, total_runs, passed_runs and result_ids outputs carry the same totals.
  • Cancelling or timing out: ends every active result’s calls and skips the groups that have not started.
Keep concurrency at or below your organization’s Cekura concurrency limit, minus any other runs (schedules, other workflows) that share it. Above that limit Cekura queues the extra results, so calls wait in the queue and the legs of a set may not start at the same time.
batch accepts JSON or YAML (YAML needs PyYAML on the runner), or use batch_file. The run-batch README lists every key and input.

Troubleshooting

Make sure your workflow file is:
  • Located in .github/workflows/ directory
  • Pushed to your repository (workflows don’t run from local files)
  • Named with .yml or .yaml extension
Common secret issues:
  • Secret names are case-sensitive - must match exactly
  • Secrets must be added in Settings → Secrets and variables → Actions
  • Forked repos can’t access secrets from the parent repository
Check these in your workflow logs:
  • API key is valid and has correct permissions
  • Agent ID and Scenario IDs are correct
  • Scenario IDs format: comma-separated with no spaces (e.g., 123,456,789)
  • Try increasing timeout with timeout: '7200' parameter
Make sure you’re using Variables (not Secrets) for Agent ID and Scenario IDs:
  • Go to Settings → Secrets and variables → Actions → Variables tab
  • Variables are referenced with vars.VARIABLE_NAME
  • Secrets are referenced with secrets.SECRET_NAME