> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cekura.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Test Profile

> Using test profiles to provide identity information for evaluators

export const CopyPageButton = () => {
  if (typeof window !== 'undefined') {
    setTimeout(function () {
      if (document.getElementById('ck-tools')) return;
      var anchor = document.getElementById('content-area') || document.querySelector('.mdx-content');
      if (!anchor) return;
      if (!document.getElementById('ck-style')) {
        var s = document.createElement('style');
        s.id = 'ck-style';
        s.textContent = '#ck-tools{position:absolute;top:6px;right:0;z-index:100;font-family:inherit;}' + '.ck-row{display:inline-flex;align-items:stretch;border:1px solid rgba(0,0,0,0.15);border-radius:8px;overflow:hidden;background:#fff;}' + ':root.dark .ck-row{background:rgba(255,255,255,0.06);border-color:rgba(255,255,255,0.12);}' + '.ck-btn{padding:5px 12px;border:none;background:none;cursor:pointer;font-size:13px;font-weight:500;font-family:inherit;color:#374151;}' + ':root.dark .ck-btn{color:#d1d5db;}' + '.ck-btn:hover{background:rgba(0,0,0,0.04);}' + ':root.dark .ck-btn:hover{background:rgba(255,255,255,0.06);}' + '.ck-chevron{padding:5px 8px;border:none;background:none;cursor:pointer;font-size:14px;font-family:inherit;color:#374151;}' + ':root.dark .ck-chevron{color:#d1d5db;}' + '.ck-chevron:hover{background:rgba(0,0,0,0.04);}' + ':root.dark .ck-chevron:hover{background:rgba(255,255,255,0.06);}' + '.ck-divider{width:1px;background:rgba(0,0,0,0.12);flex-shrink:0;}' + ':root.dark .ck-divider{background:rgba(255,255,255,0.12);}' + '.ck-dd{position:absolute;top:calc(100% + 4px);right:0;min-width:180px;background:#fff;border:1px solid rgba(0,0,0,0.12);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,0.1);padding:4px;display:none;z-index:200;}' + ':root.dark .ck-dd{background:#1f2937;border-color:rgba(255,255,255,0.1);box-shadow:0 4px 16px rgba(0,0,0,0.35);}' + '.ck-item{display:block;width:100%;padding:7px 12px;border:none;background:none;border-radius:6px;cursor:pointer;font-size:13px;font-family:inherit;text-align:left;color:#374151;}' + ':root.dark .ck-item{color:#d1d5db;}' + '.ck-item:hover{background:rgba(0,0,0,0.05);}' + ':root.dark .ck-item:hover{background:rgba(255,255,255,0.07);}';
        document.head.appendChild(s);
      }
      var wrap = document.createElement('div');
      wrap.id = 'ck-tools';
      var row = document.createElement('div');
      row.className = 'ck-row';
      var mainBtn = document.createElement('button');
      mainBtn.className = 'ck-btn';
      mainBtn.textContent = 'Copy page';
      var divider = document.createElement('span');
      divider.className = 'ck-divider';
      var chevron = document.createElement('button');
      chevron.className = 'ck-chevron';
      chevron.textContent = '▾';
      var dd = document.createElement('div');
      dd.className = 'ck-dd';
      function closeDD() {
        dd.style.display = 'none';
      }
      function openDD() {
        dd.style.display = 'block';
      }
      chevron.onclick = function (e) {
        e.stopPropagation();
        if (dd.style.display === 'block') {
          closeDD();
        } else {
          openDD();
        }
      };
      document.addEventListener('click', function (e) {
        if (!e.target.closest('#ck-tools')) {
          closeDD();
        }
      });
      document.addEventListener('keydown', function (e) {
        if (e.key === 'Escape') {
          closeDD();
        }
      });
      function makeItem(label, fn) {
        var b = document.createElement('button');
        b.className = 'ck-item';
        b.textContent = label;
        b.onclick = function () {
          fn();
          closeDD();
        };
        return b;
      }
      function getMarkdown() {
        var walk = function (node) {
          if (!node) return '';
          if (node.nodeType === 3) return node.textContent || '';
          if (node.nodeType !== 1) return '';
          var tag = node.tagName.toLowerCase();
          var skip = ['script', 'style', 'svg', 'noscript', 'button', 'iframe'];
          if (skip.indexOf(tag) !== -1) return '';
          if (node.id === 'ck-tools') return '';
          var ch = Array.from(node.childNodes).map(walk).join('');
          if (tag === 'h1') return '\n# ' + ch.trim() + '\n\n';
          if (tag === 'h2') return '\n## ' + ch.trim() + '\n\n';
          if (tag === 'h3') return '\n### ' + ch.trim() + '\n\n';
          if (tag === 'p') return '\n' + ch.trim() + '\n\n';
          if (tag === 'pre') return '\n```\n' + node.textContent.trim() + '\n```\n\n';
          if (tag === 'li') return '- ' + ch.trim() + '\n';
          if (tag === 'code') return '`' + ch.trim() + '`';
          return ch;
        };
        var content = document.querySelector('.mdx-content') || document.getElementById('content-area') || document.body;
        return walk(content).replace(/\n\n\n+/g, '\n\n').trim();
      }
      function copyMd() {
        var md = getMarkdown();
        navigator.clipboard.writeText(md).then(function () {
          mainBtn.textContent = 'Copied!';
          setTimeout(function () {
            mainBtn.textContent = 'Copy page';
          }, 2000);
        });
      }
      function viewMd() {
        var md = getMarkdown();
        var safe = md.split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;');
        var html = '<!DOCTYPE html><html><head><meta charset="utf-8"><style>body{font-family:monospace;max-width:860px;margin:40px auto;padding:0 24px;line-height:1.7;white-space:pre-wrap;word-wrap:break-word}</style></head><body>' + safe + '</body></html>';
        window.open(URL.createObjectURL(new Blob([html], {
          type: 'text/html'
        })), '_blank');
      }
      function openClaude() {
        var prompt = 'Can you read this Cekura docs page ' + window.location.href + ' so I can ask you questions?';
        window.open('https://claude.ai/new?q=' + encodeURIComponent(prompt), '_blank');
      }
      mainBtn.onclick = copyMd;
      dd.appendChild(makeItem('Copy page', copyMd));
      dd.appendChild(makeItem('View as Markdown', viewMd));
      dd.appendChild(makeItem('Open in Claude', openClaude));
      row.appendChild(mainBtn);
      row.appendChild(divider);
      row.appendChild(chevron);
      wrap.appendChild(row);
      wrap.appendChild(dd);
      anchor.style.position = 'relative';
      anchor.insertBefore(wrap, anchor.firstChild);
    }, 50);
  }
  return null;
};

<CopyPageButton />

## What is a Test Profile?

A test profile gives your evaluator a specific identity with personal information such as name, date of birth, address, phone number, and other relevant details. This allows the evaluator to provide consistent, realistic identity information during conversations with your AI agent.

## When to Use Test Profiles

Test profiles are essential when your AI agent needs to:

* **Verify Identity**: Confirm the caller's identity before proceeding with sensitive actions
* **Lookup Records**: Find specific accounts, appointments, or orders based on personal information
* **Personalize Interactions**: Address the caller by name or reference their specific details
* **Authenticate Users**: Verify security questions or personal details

### Common Use Cases

| Scenario               | Required Information                     | Example                                |
| ---------------------- | ---------------------------------------- | -------------------------------------- |
| Healthcare Appointment | Name, DOB, Phone Number                  | "I'm calling to cancel my appointment" |
| Banking Support        | Name, Account Number, DOB, Address       | "I need help with my account"          |
| E-commerce Returns     | Name, Order Number, Email                | "I want to return an order"            |
| Hotel Reservations     | Name, Confirmation Number, Check-in Date | "I need to modify my reservation"      |

## How Test Profiles Work

### Setup Process

1. **Create Test Data in Your System**: Add mock records (appointments, accounts, orders) with specific test information
2. **Create Matching Test Profile**: Create a test profile with the same information in Cekura
3. **Attach to Evaluator**: Assign the test profile to your evaluator
4. **Run Tests**: The evaluator will use the profile information during conversations

### Example: Clinic Receptionist

Let's say you have a clinic receptionist AI agent that can cancel appointments. The agent verifies identity by asking for the patient's date of birth before cancellation.

**Step-by-Step Setup:**

<Steps>
  <Step title="Create mock appointment in your system">
    Create a test appointment with:

    * Patient Name: John Smith
    * Date of Birth: January 1, 2000
    * Appointment Date: March 15, 2025
    * Appointment ID: APT-12345
  </Step>

  <Step title="Create matching test profile in Cekura">
    Create a test profile with:

    * Name: John Smith
    * Date of Birth: January 1, 2000
    * Additional Notes: "Appointment ID: APT-12345"
  </Step>

  <Step title="Create evaluator with instructions">
    Create an evaluator with instructions:
    "Call to cancel the appointment scheduled for March 15, 2025. Provide date of birth when asked for verification."
  </Step>

  <Step title="Attach test profile to evaluator">
    Assign the "John Smith" test profile to this evaluator.
  </Step>
</Steps>

**During Testing:**

When the evaluator converses with your agent:

1. Evaluator: "Hi, I'd like to cancel my appointment."
2. Agent: "I can help with that. Can I have your date of birth for verification?"
3. Evaluator: "January 1, 2000" *(from test profile)*
4. Agent: "Thank you. I see you have an appointment on March 15, 2025. Would you like to cancel this?"
5. Evaluator: "Yes, please."
6. Agent: "Your appointment has been cancelled. Your confirmation number is APT-12345."

## Test Profile Fields

A test profile can include:

* **Name**: First and last name
* **Date of Birth**: DOB in various formats
* **Address**: Full mailing address
* **Phone Number**: Contact number
* **Email**: Email address
* **Account/Customer ID**: Unique identifiers
* **Security Information**: Answers to security questions
* **Custom Fields**: Any additional information your agent might need

<Tip>
  **Keep Test Profiles Organized**: Use clear naming conventions like "Customer-Banking-Premium" or "Patient-Dental-Regular" to easily identify which test profile to use for different scenarios.
</Tip>

## Profile Sections — Main Agent vs Testing Agent

A test profile's `information` is split into two sections so each value reaches only the right consumer:

| Section                   | Sent to                                                                                                                                                                              | What goes here                                                                                                                                                                                                      |
| ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `main_agent_variables`    | The **agent under test** (over the wire as dynamic variables — `assistantOverrides.variableValues` on VAPI, `retell_llm_dynamic_variables` on Retell, `request_data` on Bland, etc.) | Values your production agent already expects to receive at call start: `user_id`, `account_id`, `order_id`, signed customer-id tokens — anything your agent is configured to read as a registered dynamic variable. |
| `testing_agent_variables` | The **testing agent** (Cekura's simulated caller)                                                                                                                                    | Persona / context the simulator uses to play the caller: `customer_name`, `date_of_birth`, story details, situational facts. These never reach the agent under test.                                                |

Sectioned example:

```json theme={null}
{
  "main_agent_variables": {
    "user_id": "U-42",
    "account_id": "ACCT-99",
    "order_id": "ORD-2024-98765"
  },
  "testing_agent_variables": {
    "customer_name": "Sarah Johnson",
    "date_of_birth": "1986-04-12",
    "story": "Wants to return a blue sweater that didn't fit."
  }
}
```

<Tip>
  **Why split?** Persona PII like `customer_name` shouldn't be sent to the agent under test as a dynamic variable unless your agent registered it. Conversely, dynamic-variable values your production code expects shouldn't leak into the testing agent's persona prompt. The split keeps each side honest.
</Tip>

<Note>
  **Both sections are optional.** Set only the ones you need:

  * If your agent has no registered [dynamic variables](/documentation/key-concepts/evaluators/dynamic-variables), omit `main_agent_variables` (or leave it `{}`) — there's nothing for it to deliver. Put persona/context for the simulated caller in `testing_agent_variables` only.
  * If you only need to send dynamic-variable values and don't need to brief the simulated caller separately, populate `main_agent_variables` and leave `testing_agent_variables` empty (or omit it).
  * Both empty / both missing is also valid — the profile then has no information payload but can still be attached to a scenario for naming purposes.
</Note>

## Using Test Profile Variables in Instructions

You can reference test profile fields directly in your evaluator instructions using template variables. This gives you precise control over which values appear in your instructions.

### Template Syntax

Use the `{{test_profile.field_name}}` syntax to insert test profile values into your instructions:

**Dot notation** for simple fields:

```
{{test_profile.name}}
{{test_profile.phone_number}}
{{test_profile.account_id}}
```

**Dot notation** for nested fields:

```
{{test_profile.address.city}}
{{test_profile.address.zip}}
```

**Bracket notation** (useful for keys with spaces):

```
{{test_profile['customer name']}}
{{test_profile["order id"]}}
```

### Example

Generic instructions:

```
Call to cancel the appointment. Provide your date of birth when asked.
```

With template variables:

```
Call to cancel the appointment scheduled for {{test_profile.appointment_date}}.
When asked for verification, provide your date of birth: {{test_profile.date_of_birth}}.
Your name is {{test_profile.name}} and your patient ID is {{test_profile.patient_id}}.
```

### How It Works

When a test runs, template variables are replaced with actual values from the test profile. For example, if your test profile contains:

```json theme={null}
{
  "name": "John Smith",
  "date_of_birth": "January 1, 2000",
  "appointment_date": "March 15, 2025",
  "patient_id": "PT-12345"
}
```

The instructions become:

```
Call to cancel the appointment scheduled for March 15, 2025.
When asked for verification, provide your date of birth: January 1, 2000.
Your name is John Smith and your patient ID is PT-12345.
```

<Tip>
  If a template variable references a field that doesn't exist in the test profile, it will be replaced with an empty string. Make sure your test profile includes all fields you reference in your instructions.
</Tip>

### When to Use Template Variables

Template variables are especially useful when:

* You need the evaluator to provide **exact values** (like specific IDs or dates)
* You're testing multiple scenarios with **different test profiles** but the same instruction structure
* You want to ensure **consistency** between your backend system and what the evaluator says

## Best Practices

### 1. Synchronize Test Data

Ensure your test profile information matches exactly what exists in your backend system. Mismatches will cause verification failures.

```
❌ Incorrect:
System DOB: 01/01/2000
Profile DOB: 1 January 2000
(Agent might not match these formats)

✅ Correct:
System DOB: 01/01/2000
Profile DOB: 01/01/2000
```

### 2. Create Multiple Test Profiles

Build a library of test profiles for different scenarios:

* Happy path scenarios (everything matches perfectly)
* Edge cases (partial information, multiple matches)
* Negative scenarios (wrong information, no matches)

### 3. Update Profiles Regularly

When your system's data structure changes, update your test profiles accordingly. Outdated profiles lead to failed tests that don't reflect real issues.

## Example: E-commerce Support Agent

**Scenario**: Testing an AI agent that handles order returns

**Test Profile Setup:**

```json theme={null}
{
  "name": "Sarah Johnson",
  "email": "sarah.j@email.com",
  "order_number": "ORD-2024-98765",
  "order_date": "February 10, 2025",
  "phone": "+1-555-0123",
  "shipping_address": "123 Main St, Apt 4B, New York, NY 10001"
}
```

**Corresponding System Data:**

Create a test order in your e-commerce system with:

* Order ID: ORD-2024-98765
* Customer Email: [sarah.j@email.com](mailto:sarah.j@email.com)
* Order Date: February 10, 2025
* Status: Delivered
* Items: Blue Sweater (Medium), Size: M, Price: \$49.99

**Evaluator Instructions:**

"Call to return the blue sweater from your recent order. Provide order number and email when asked. State that the size doesn't fit and you'd like a refund."

**Expected Outcome:**

"The agent successfully initiates a return, provides a return label, and confirms the refund timeline."

***

## Testing Without Test Profiles

For evaluators that don't require identity verification or personalization, test profiles are optional. Examples include:

* General information inquiries
* FAQ testing
* Menu navigation testing
* Opening hours requests

In these cases, the evaluator's instructions alone are sufficient to guide the conversation.
