> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://poly-ai.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://poly-ai.ferndocs.com/_mcp/server.

# 4.2025

> April 2025 release notes.

The **April 2025** PolyAI Agent Studio release includes new tools for call review, debugging, and utility development.

Expand the items for details:

#### Information architecture updates

![Sidebar navigation](/_fern-files/_img/0f4f62e4a68091781c971561c0648e9e87c400ff20ea87e6af8b266dae0b7bf7.webp)

We have refined the sidebar layout to better group tools by function and clarify where key capabilities live. Think of this as a smart re-balancing of where things go and a review of section naming.

### What's new, renamed, or moved:

**Analyze** renamed to **Manage**

* **Agent Analysis** → New feature. See below for more details.

**Build**

* **Agent** → Renamed from **About**.
* **Model Training** → Moved here from **Annotations**, previously under **Conversation Review**.
* **Variant Management** → Moved here from the **Configure** menu.

**Voice**

* **Agent Voice** → Moved here from Configure (combines features previously under **Voice** and **Rules**)
* **Cache Management** → Previously the **Audio Management** tab.

**Configure**

* **Environments** and **Project History** → New sections, previously under **Environment & Versions**.

### Why it matters

These adjustments make it easier to find what you need, reduce clutter, and prepare the platform for future capabilities.

#### Metrics

You can now generate **LLM-powered performance metrics** in the PolyAI Agent Studio using the new **Agent Analysis** flow. Define a custom prompt and category set, then run it across a batch of calls to generate insight-rich evaluations and visual summaries.

![call-batch-run](/_fern-files/_img/faff49734cc6a07cbb6fd09ad789963ff3737ef9740768fde58abb6e832e233e.webp)

**How it works:**

* Create a custom evaluation prompt, with categories and descriptions
* Select a batch of calls using the Agent Analysis feature.
* Automatically assess agent performance across key custom criteria like tone, intent success, or compliance (or any other potential variables)
* View results in a dedicated **Agent Analysis UI**, with graphs showing how your calls measure up against each evaluation axis

#### Live collaboration and edit history

Agent Studio now supports real-time collaboration and edit tracking across your team.

![Multi-user refresh view demo](https://res.cloudinary.com/dtdd8khwd/image/upload/v1742990655/multi_user-refresh_view-2025-03-20_ba6e4w.gif)

*Multi-user refresh view in action*

**How it works:**

* See who else is editing a draft in real time.
* Receive notifications when changes are saved by others.
* Copy unsaved edits before refreshing to avoid overwriting.
* View full change logs using the **history** panel.

#### Call categorization

You can now use an LLM to review and rate calls.

![agent-analysis](/_fern-files/_img/5a4b8dc88a1e8ed04a8d14e0271e8f89802bca4f59f5971b8a08d15e68b8773d.webp)

**What you can do:**

* Rate calls for tone, intent success, or compliance
* Use project-specific categories
* Get automatic summaries

#### Workspace filter in Conversations

You can now filter conversations by workspace on the Conversations page.

![workspace-filter](/_fern-files/_img/d053a381c37d0ea136ddcb776996212cde14b8042d0aae319bb8798c03c6c464.webp)

**Why it helps:**

* Focus on the calls your team is responsible for
* Cleaner review experience for large orgs

#### Utility function – utils.extract_address

> **Note**
>
> This is an opt-in feature and will not be enabled by default. Contact PolyAI for access.

You can now extract structured address data from free-text input using a built-in LLM utility: `extract_address()`.

![extract-address-util](/_fern-files/_img/59325f8f89f444d55093180e43ad2be2141da1e4977f1b4c14070d748754b66f.webp)

**What it does:**

* Parses the most recent user message for address info
* Returns an `Address` object with fields like street, postcode, and country
* Raises an `ExtractionError` if parsing fails

**Usage:**

```python
try:
    address = conv.utils.extract_address(country="US")
    conv.state.parsed_address = address
except ExtractionError as e:
    conv.state.address_error = str(e)
```

**Address object:**

```python
@dataclass
class Address:
    street_number: Optional[str]
    street_name: Optional[str]
    city: Optional[str]
    state: Optional[str]
    postcode: Optional[str]
    country: Optional[str]
```

**Other details:**

* Calls an LLM, so may take a few seconds
* You can optionally validate against a list of known addresses
* Some fields may be missing depending on input quality

#### Conversation history access – conv.history

You can now access earlier conversation turns from within utility functions using `conv.history`.

**What it does:**

* Returns a list of events: user inputs, agent replies, function calls, etc.
* Useful for writing context-aware logic

**Usage:**

```python
def some_function(conv: Conversation):
    history = conv.history

    for event in history:
        print(event.to_dict())

    return {
        "utterance": "Here's a response that depends on previous turns.",
        "content": f"Conversation so far: {str(history)}"
    }
```

**Why it matters:**

* Build logic based on what's already happened in the conversation
* Avoid passing state manually
* Better debugging and flow control

#### Import and export variants

You can now export and import variants between agents or environments.

**What you can do:**

* Export all variant data to CSV
* Edit things like contact numbers or opening hours in bulk
* Reimport to update the same or a different agent

**Why it matters:**

* Makes it easy to scale across multiple sites
* No need to rebuild variant logic from scratch
* Keeps your CSVs in sync with other tools

> **Tip**
>
> See the full [variant management](/agent-studio/knowledge/variants/overview) page for advanced use cases like SMS personalization or routing.

#### Variant ID added to conversations

Reviewed conversations now show the **variant ID** used in each call.

![variant-id](/_fern-files/_img/cfb23a18ab9ea18fb3b2507297a282e735b9b8e59982aefb447e9a49906c4c9a.webp)

**Why it matters:**

* See exactly which variant was active
* Easier to debug and compare different versions
* Adds context for QA and bug tracking

#### Builtin handoff improvements

The built-in handoff now supports **handoff reasons** and **custom utterances**, and you can now use a `handoff()` method directly inside functions.

**What you can do:**

* Specify a reason for the handoff (e.g. compliance, escalation, etc.)
* Set a custom utterance to be spoken at handoff
* Use `handoff()` programmatically inside a [function](/agent-studio/tools/overview).

**Example usage:**

```python
    def escalate(conv: Conversation):
        return conv.call_handoff(
            reason="policy_violation",
            utterance="Let me transfer you to a specialist who can help."
        )
```

#### Multi-voice agents

![call-batch-run](/_fern-files/_img/8d4c5e74e2d4f0c3556fc98c97bc02593631808e0238b7d9fbcee3f63d88a6e9.webp)

You can now configure multiple TTS voices for your agent and distribute them across calls. Use percentage values adding up to 100% to distribute the likelihood of each agent answering a call.

**Why it matters:**

* A/B test different voices for performance or tone
* Assign different voices to different intents or caller types
* Create more natural, human-like team dynamics

**What you can do:**

* Select and assign multiple voices
* Preview how your agent sounds across scenarios

For help or feedback, reach out to your PolyAI representative.