Evaluators

Run evaluators in text / SMS / chat mode

Changed on

TEXT / SMS / CHAT RUN: Execute evaluators against your agent using text-only simulation (SMS, chat, or an agent-hosted websocket). Cheaper than voice — billed at the text-simulation rate. Requires a chat connection (provider.chat_agent_details) on the agent, or a websocket URL for self_hosted agents.

Run-count math: total conversations = len(scenarios) × frequency × max(1, len(personality_ids)) × max(1, len(test_profile_ids)).

Concurrency: use concurrency_limit to cap parallel conversations. Default: unbounded (subject to provider rate limits).

Scenario selection (pick one):

  • scenarios — list of integer evaluator IDs (e.g. [101, 102])
  • tags — select by tag
  • folder_path — select by folder path (e.g. "Sales.Inbound"); requires project_id

Websocket override: if the agent exposes a plain websocket URL for text, pass it as websocket_url — this bypasses the agent's standard text-readiness check. Pass websocket_headers (JSON object) to override connection headers for this run — merged over the agent's configured headers, with the per-run values winning.

When to use this vs others (pick the endpoint matching the agent's configured connection — check aiagents_retrieve):

  • run_scenarios — real voice / phone / SIP call
  • run_scenarios_with_websockets — each scenario carries its own websocket URL (bulk)
  • run_scenarios_pipecat — Pipecat/Daily.co WebRTC deployment

self_hosted agents: agents with assistant_provider="self_hosted" require a websocket URL. Either pre-configure websocket_url on the agent, or pass it directly in this request. Without it, the run fails with ["Agent does not have a websocket URL"]. Passing websocket_url here changes the result's run_type to "WebSocket" instead of "Text".

Personality override: personality_ids must be IDs that are already enabled for the agent's project. Check which are enabled via aiagents_retrieve → enabled_personalities field. To enable a new personality, call aiagents_partial_update with the updated enabled_personalities list before using it here. Note: enabling a personality applies project-wide, not just to one agent. Passing an ID that is not enabled returns ["Invalid personalities provided."].

Scheduled runs: to run on a cron schedule, create a CronJob via POST /test_framework/v1/cron_jobs/ with execution_mode="text" instead.

Polling for completion: the response is the result itself — read its top-level id (status: 'running'). Poll GET /test_framework/v1/results/{result_id}/ until status is completed, failed, timeout or cancelled. A result stays non-terminal until every run has ended, then becomes completed if any run completed — even if runs failed their checks or others errored. To gate, require success_runs_count == total_runs_count (failed_runs_count counts only completed runs that failed evaluation). There is no separate progress endpoint for runs. Check failed_reasons for infrastructure errors; check runs[run_id].error_message for per-run errors.

post/test_framework/v2/scenarios/run_scenarios_text/

Request

  • Base URL
    https://api.cekura.ai
  • URL
    https://api.cekura.ai/test_framework/v2/scenarios/run_scenarios_text/
  • Auth
    • API key in header X-CEKURA-API-KEY
    • or HTTP bearer
    • or HTTP bearer

Request body

agent_idinteger

ID of the agent to run evaluators for

assistant_idstring

Alternative to agent ID - the assistant ID to use for this scenario Example: "asst_1234567890"

namestring

Label text for result

scenariosinteger[]

List of evaluator IDs to run. Either scenarios, tags, or folder_path must be provided. Runs start in the order given. Example: [11, 22, 33]

To run evaluators by tag or folder, use the tags or folder_path fields instead.

tagsstring[]

List of tags to filter evaluators to run. Either evaluators or tags must be provided. Example: ["tag1", "tag2", "tag3"]

folder_pathstring

Dot-separated folder path to select evaluators from (e.g. "Sales.Inbound"). Mutually exclusive with scenarios and tags. Requires project_id.

project_idinteger

Project ID. Required when using folder_path (or when passing a folder path string via scenarios). Example: 1376

frequencyinteger

The number of times each evaluator will run. Each repeat runs the whole list in order before the next one starts (A, B, A, B), rather than grouping repeats of one evaluator. Example: 1

websocket_urlstring

If provided, the simulated caller connects to this websocket URL instead of using the agent's configured text/SMS gateway. Use for agents that expose a websocket endpoint for text testing. Bypasses the normal agent.can_run_as_text() check.

websocket_headersobject

Headers to send on the websocket connection for this run. Merged over the agent's configured websocket_headers — keys provided here win. System X-VOCERA-* headers cannot be overridden.

personality_idsinteger[] nullable

List of personality IDs to override for this run. If not provided, uses the scenario's default personality.

test_profile_idsinteger[] nullable

List of test profile IDs to override for this run. If not provided, uses the scenario's default test profile.

agent_numberstring

Override the phone number from which the agent under test receives the call during outbound runs. This allows overriding the default agent contact number for testing purposes. Example: "+1234567890"

outbound_phone_numberstring

Override the phone number to use for outbound calls. Example: "+1234567890"

concurrency_limitinteger

Cap on the number of evaluator runs executed in parallel. Default: unbounded (subject to your provider's rate limits). Use this to avoid hitting provider rate limits on large frequency or folder runs. Example: 5

calls_per_secondnumber double nullable

Most calls started per second for this run, a number from 0.1 to 4 (e.g. 0.5 starts one call every 2 seconds). Leave unset for no limit.

mock_tool_namesstring[]

Names of mock tools to activate for this run. Cekura swaps those tools' URLs to mock endpoints while the run is active and restores the originals when it finishes. Omit (or send null) to mock every tool configured on the agent; send an empty list to mock none so every tool keeps its original endpoint. Example: ["get_appointments", "cancel_booking"]

agent_version_idstring

Run against a stored version of the agent instead of the agent as it is live. Cekura makes a private copy of the agent in your provider account, puts that version's prompt on it, and runs against the copy — voice, model and tools stay as the agent is configured now, and the live agent is never changed. Accepts the version label shown in the agent's version history (v12, or p1 for a version an improvement run proposed) or its numeric history_id. List them with GET /test_framework/v1/aiagents/{id}/history/; a version is usable when its is_runnable is true. Available for VAPI, Retell, ElevenLabs and Bland agents that are outbound and have a single prompt. Example: "v12"

Response

idinteger

ID of the result

agentinteger

ID of the agent

status'running' | 'completed' | 'failed' | 'pending' | 'in_progress' | 'evaluating' | 'in_queue' | 'timeout' | 'cancelled' | 'scaling_up'

Status of the result. Poll until it is completed, failed, timeout or cancelled. It stays non-terminal until every run has ended, then becomes completed if any run completed — even if runs failed their checks or others errored.

run_as_textboolean

Whether the scenario ran as text or not

created_atstring date-time

Example response

{
  "runs": [
    {
      "number": "+11234567890",
      "inbound_number": "+11234567890"
    }
  ],
  "created_at": "2025-02-25T21:00:01.990052Z"
}

Changes