import Roark from '@roarkanalytics/sdk';
const client = new Roark({
bearerToken: process.env['ROARK_API_BEARER_TOKEN'], // This is the default and can be omitted
});
const customerFlow = await client.customerFlow.update('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e');
console.log(customerFlow.data);import os
from roark_analytics import Roark
client = Roark(
bearer_token=os.environ.get("ROARK_API_BEARER_TOKEN"), # This is the default and can be omitted
)
customer_flow = client.customer_flow.update(
flow_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
)
print(customer_flow.data)curl --request PUT \
--url https://api.roark.ai/v1/customer-flow/{flowId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
},
"agentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"agentExpectations": [
{
"prompt": "The agent confirmed the new appointment time back to the customer"
}
]
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.roark.ai/v1/customer-flow/{flowId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'description' => '<string>',
'offScriptPolicy' => [
'reaction' => 'STAY_SILENT',
'maxAttempts' => 3,
'then' => 'HANG_UP',
'sayLine' => '<string>',
'waitSeconds' => 300
],
'agentIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'agentExpectations' => [
[
'prompt' => 'The agent confirmed the new appointment time back to the customer'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.roark.ai/v1/customer-flow/{flowId}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"offScriptPolicy\": {\n \"reaction\": \"STAY_SILENT\",\n \"maxAttempts\": 3,\n \"then\": \"HANG_UP\",\n \"sayLine\": \"<string>\",\n \"waitSeconds\": 300\n },\n \"agentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"agentExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.roark.ai/v1/customer-flow/{flowId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"offScriptPolicy\": {\n \"reaction\": \"STAY_SILENT\",\n \"maxAttempts\": 3,\n \"then\": \"HANG_UP\",\n \"sayLine\": \"<string>\",\n \"waitSeconds\": 300\n },\n \"agentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"agentExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.roark.ai/v1/customer-flow/{flowId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"offScriptPolicy\": {\n \"reaction\": \"STAY_SILENT\",\n \"maxAttempts\": 3,\n \"then\": \"HANG_UP\",\n \"sayLine\": \"<string>\",\n \"waitSeconds\": 300\n },\n \"agentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"agentExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"source": "CUSTOM",
"createdAt": "<string>",
"updatedAt": "<string>",
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>",
"customId": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
}
],
"agentExpectations": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>"
}
],
"type": "SCRIPTED",
"scriptAdherence": "LOOSE",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
},
"branchingMode": "DETERMINISTIC",
"happyPath": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"precededByCustomerFlowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"precededByCustomerFlowVariantId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isGenerated": false,
"createdAt": "<string>",
"updatedAt": "<string>",
"personaOverride": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"language": "EN",
"understoodLanguages": [
"EN"
],
"accent": "US",
"age": "ADULT",
"gender": "MALE",
"backgroundNoise": "NONE",
"speechPace": "NORMAL",
"speechClarity": "CLEAR",
"hasDisfluencies": false,
"baseEmotion": "NEUTRAL",
"intentClarity": "CLEAR",
"confirmationStyle": "EXPLICIT",
"memoryReliability": "HIGH",
"responseTiming": "NORMAL",
"idleMessages": [
"<string>"
],
"idleTimeoutSeconds": 10,
"idleMessageMaxSpokenCount": 3,
"idleMessageResetCountOnUserSpeechEnabled": true,
"properties": {
"age": 35,
"zipCode": "94105",
"occupation": "Software Engineer"
},
"createdAt": "<string>",
"updatedAt": "<string>",
"displayName": "<string>",
"description": "<string>",
"secondaryLanguage": "EN",
"backstoryPrompt": "A busy professional calling during lunch break"
},
"environment": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"backgroundNoise": "NONE",
"backgroundNoiseVolume": 0.1,
"createdAt": "<string>",
"updatedAt": "<string>",
"description": "<string>"
},
"additionalExpectations": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>"
}
],
"type": "SCRIPTED",
"steps": [
{
"type": "AGENT_TURN",
"nodeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ref": "<string>",
"steps": "<array>",
"mergeIntoNodeIds": [
"<string>"
],
"content": "<string>",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
}
}
],
"systemKey": "<string>"
},
"edgeCases": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"precededByCustomerFlowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"precededByCustomerFlowVariantId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isGenerated": false,
"createdAt": "<string>",
"updatedAt": "<string>",
"personaOverride": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"language": "EN",
"understoodLanguages": [
"EN"
],
"accent": "US",
"age": "ADULT",
"gender": "MALE",
"backgroundNoise": "NONE",
"speechPace": "NORMAL",
"speechClarity": "CLEAR",
"hasDisfluencies": false,
"baseEmotion": "NEUTRAL",
"intentClarity": "CLEAR",
"confirmationStyle": "EXPLICIT",
"memoryReliability": "HIGH",
"responseTiming": "NORMAL",
"idleMessages": [
"<string>"
],
"idleTimeoutSeconds": 10,
"idleMessageMaxSpokenCount": 3,
"idleMessageResetCountOnUserSpeechEnabled": true,
"properties": {
"age": 35,
"zipCode": "94105",
"occupation": "Software Engineer"
},
"createdAt": "<string>",
"updatedAt": "<string>",
"displayName": "<string>",
"description": "<string>",
"secondaryLanguage": "EN",
"backstoryPrompt": "A busy professional calling during lunch break"
},
"environment": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"backgroundNoise": "NONE",
"backgroundNoiseVolume": 0.1,
"createdAt": "<string>",
"updatedAt": "<string>",
"description": "<string>"
},
"additionalExpectations": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>"
}
],
"type": "SCRIPTED",
"steps": [
{
"type": "AGENT_TURN",
"nodeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ref": "<string>",
"steps": "<array>",
"mergeIntoNodeIds": [
"<string>"
],
"content": "<string>",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
}
}
],
"systemKey": "<string>"
}
],
"description": "<string>",
"graph": [
{
"type": "AGENT_TURN",
"nodeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ref": "<string>",
"steps": "<array>",
"mergeIntoNodeIds": [
"<string>"
],
"content": "<string>",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
}
}
]
}
}{
"type": "validation",
"code": "invalid_parameter",
"message": "The request was invalid",
"param": "email"
}{
"type": "authentication",
"code": "unauthorized",
"message": "Authentication required"
}{
"type": "forbidden",
"code": "permission_denied",
"message": "You do not have permission to access this resource"
}{
"type": "not_found",
"code": "resource_not_found",
"message": "The requested resource could not be found"
}{
"type": "rate_limit",
"code": "too_many_requests",
"message": "Rate limit exceeded"
}{
"type": "internal",
"code": "internal_error",
"message": "Internal server error"
}Update a customer flow
Updates a flow’s title, description, branching mode, linked agents or flow-level expectations. The step graph is replaced through PUT /graph.
import Roark from '@roarkanalytics/sdk';
const client = new Roark({
bearerToken: process.env['ROARK_API_BEARER_TOKEN'], // This is the default and can be omitted
});
const customerFlow = await client.customerFlow.update('182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e');
console.log(customerFlow.data);import os
from roark_analytics import Roark
client = Roark(
bearer_token=os.environ.get("ROARK_API_BEARER_TOKEN"), # This is the default and can be omitted
)
customer_flow = client.customer_flow.update(
flow_id="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
)
print(customer_flow.data)curl --request PUT \
--url https://api.roark.ai/v1/customer-flow/{flowId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"description": "<string>",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
},
"agentIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"agentExpectations": [
{
"prompt": "The agent confirmed the new appointment time back to the customer"
}
]
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.roark.ai/v1/customer-flow/{flowId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'title' => '<string>',
'description' => '<string>',
'offScriptPolicy' => [
'reaction' => 'STAY_SILENT',
'maxAttempts' => 3,
'then' => 'HANG_UP',
'sayLine' => '<string>',
'waitSeconds' => 300
],
'agentIds' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'agentExpectations' => [
[
'prompt' => 'The agent confirmed the new appointment time back to the customer'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.roark.ai/v1/customer-flow/{flowId}"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"offScriptPolicy\": {\n \"reaction\": \"STAY_SILENT\",\n \"maxAttempts\": 3,\n \"then\": \"HANG_UP\",\n \"sayLine\": \"<string>\",\n \"waitSeconds\": 300\n },\n \"agentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"agentExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.roark.ai/v1/customer-flow/{flowId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"offScriptPolicy\": {\n \"reaction\": \"STAY_SILENT\",\n \"maxAttempts\": 3,\n \"then\": \"HANG_UP\",\n \"sayLine\": \"<string>\",\n \"waitSeconds\": 300\n },\n \"agentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"agentExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.roark.ai/v1/customer-flow/{flowId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"<string>\",\n \"description\": \"<string>\",\n \"offScriptPolicy\": {\n \"reaction\": \"STAY_SILENT\",\n \"maxAttempts\": 3,\n \"then\": \"HANG_UP\",\n \"sayLine\": \"<string>\",\n \"waitSeconds\": 300\n },\n \"agentIds\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"agentExpectations\": [\n {\n \"prompt\": \"The agent confirmed the new appointment time back to the customer\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"source": "CUSTOM",
"createdAt": "<string>",
"updatedAt": "<string>",
"agents": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"description": "<string>",
"customId": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>"
}
],
"agentExpectations": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>"
}
],
"type": "SCRIPTED",
"scriptAdherence": "LOOSE",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
},
"branchingMode": "DETERMINISTIC",
"happyPath": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"precededByCustomerFlowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"precededByCustomerFlowVariantId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isGenerated": false,
"createdAt": "<string>",
"updatedAt": "<string>",
"personaOverride": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"language": "EN",
"understoodLanguages": [
"EN"
],
"accent": "US",
"age": "ADULT",
"gender": "MALE",
"backgroundNoise": "NONE",
"speechPace": "NORMAL",
"speechClarity": "CLEAR",
"hasDisfluencies": false,
"baseEmotion": "NEUTRAL",
"intentClarity": "CLEAR",
"confirmationStyle": "EXPLICIT",
"memoryReliability": "HIGH",
"responseTiming": "NORMAL",
"idleMessages": [
"<string>"
],
"idleTimeoutSeconds": 10,
"idleMessageMaxSpokenCount": 3,
"idleMessageResetCountOnUserSpeechEnabled": true,
"properties": {
"age": 35,
"zipCode": "94105",
"occupation": "Software Engineer"
},
"createdAt": "<string>",
"updatedAt": "<string>",
"displayName": "<string>",
"description": "<string>",
"secondaryLanguage": "EN",
"backstoryPrompt": "A busy professional calling during lunch break"
},
"environment": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"backgroundNoise": "NONE",
"backgroundNoiseVolume": 0.1,
"createdAt": "<string>",
"updatedAt": "<string>",
"description": "<string>"
},
"additionalExpectations": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>"
}
],
"type": "SCRIPTED",
"steps": [
{
"type": "AGENT_TURN",
"nodeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ref": "<string>",
"steps": "<array>",
"mergeIntoNodeIds": [
"<string>"
],
"content": "<string>",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
}
}
],
"systemKey": "<string>"
},
"edgeCases": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"precededByCustomerFlowId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"precededByCustomerFlowVariantId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"isGenerated": false,
"createdAt": "<string>",
"updatedAt": "<string>",
"personaOverride": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"language": "EN",
"understoodLanguages": [
"EN"
],
"accent": "US",
"age": "ADULT",
"gender": "MALE",
"backgroundNoise": "NONE",
"speechPace": "NORMAL",
"speechClarity": "CLEAR",
"hasDisfluencies": false,
"baseEmotion": "NEUTRAL",
"intentClarity": "CLEAR",
"confirmationStyle": "EXPLICIT",
"memoryReliability": "HIGH",
"responseTiming": "NORMAL",
"idleMessages": [
"<string>"
],
"idleTimeoutSeconds": 10,
"idleMessageMaxSpokenCount": 3,
"idleMessageResetCountOnUserSpeechEnabled": true,
"properties": {
"age": 35,
"zipCode": "94105",
"occupation": "Software Engineer"
},
"createdAt": "<string>",
"updatedAt": "<string>",
"displayName": "<string>",
"description": "<string>",
"secondaryLanguage": "EN",
"backstoryPrompt": "A busy professional calling during lunch break"
},
"environment": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"backgroundNoise": "NONE",
"backgroundNoiseVolume": 0.1,
"createdAt": "<string>",
"updatedAt": "<string>",
"description": "<string>"
},
"additionalExpectations": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"prompt": "<string>"
}
],
"type": "SCRIPTED",
"steps": [
{
"type": "AGENT_TURN",
"nodeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ref": "<string>",
"steps": "<array>",
"mergeIntoNodeIds": [
"<string>"
],
"content": "<string>",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
}
}
],
"systemKey": "<string>"
}
],
"description": "<string>",
"graph": [
{
"type": "AGENT_TURN",
"nodeId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"ref": "<string>",
"steps": "<array>",
"mergeIntoNodeIds": [
"<string>"
],
"content": "<string>",
"offScriptPolicy": {
"reaction": "STAY_SILENT",
"maxAttempts": 3,
"then": "HANG_UP",
"sayLine": "<string>",
"waitSeconds": 300
}
}
]
}
}{
"type": "validation",
"code": "invalid_parameter",
"message": "The request was invalid",
"param": "email"
}{
"type": "authentication",
"code": "unauthorized",
"message": "Authentication required"
}{
"type": "forbidden",
"code": "permission_denied",
"message": "You do not have permission to access this resource"
}{
"type": "not_found",
"code": "resource_not_found",
"message": "The requested resource could not be found"
}{
"type": "rate_limit",
"code": "too_many_requests",
"message": "Rate limit exceeded"
}{
"type": "internal",
"code": "internal_error",
"message": "Internal server error"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Body
Fields to change on a customer flow. The step graph is edited through PUT /graph instead.
1Scripted flows only. How closely a run follows the script. LOOSE (default) hands the whole script to the simulated customer as one prompt; it keeps the call moving whatever your agent says. STRICT runs the script as a state machine on the agent service: at every agent step the simulated customer waits, silent, until your agent has said the expected line, and only then moves on. Scripted flows only; STRICT needs the agent-service transport and is not available on realtime models.
LOOSE, STRICT STRICT only. What the simulated customer does when your agent does not say the expected line. Each unmatched agent utterance is an attempt: reaction runs per attempt (STAY_SILENT, REPEAT its last scripted line, RESPOND once in character without moving on, or SAY sayLine), and then runs when attempts reach maxAttempts or your agent stays silent for waitSeconds (HANG_UP ends the call with ended reason SCRIPT_DIVERGED, HANG_UP_INVALIDATE ends it the same way and invalidates the run so it is scored by nothing and counted nowhere, MOVE_ON advances anyway, ADAPT hands the rest of the call to loose behaviour). Null: stay silent, 3 attempts, hang up. The default for every agent step; an AGENT_TURN step can carry its own.
Show child attributes
Show child attributes
Scripted flows only. How a run walks the graph. DETERMINISTIC ("Simulate every path" in the app) places one call per variant, each following its path exactly whatever the agent says. ADAPTIVE ("Adapt to your agent") collapses the paths into one call PER PERSONA, on which the simulated customer picks a branch from what the agent actually said. Both modes speak the exact authored lines, and neither changes how metrics or expectations grade.
DETERMINISTIC, ADAPTIVE Replaces the linked agents. Omit to leave them unchanged. An improv flow must keep at least one; a scripted flow can be left with none.
Replaces the flow-level expectations. Omit to leave them unchanged.
Show child attributes
Show child attributes
Response
The updated customer flow
The conversation a simulated customer has with the agent under test.
- Scripted
- Improv
- Voicemail
Show child attributes
Show child attributes