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

# 04.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:

<AccordionGroup>
  <Accordion title="Information architecture updates" icon="bars" id="information-architecture-updates">
    <div align="center">
      <img src="https://mintcdn.com/polyai/ZVzKq3G72RK1ScpE/images/release-notes/2504/sidebar.png?fit=max&auto=format&n=ZVzKq3G72RK1ScpE&q=85&s=da8a13e1501f2ff06b1c12d14b9c6ac5" alt="Sidebar navigation" width="125" data-path="images/release-notes/2504/sidebar.png" />
    </div>

    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.
  </Accordion>

  <Accordion title="Metrics" icon="circle-three-quarters" id="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.

    <img src="https://mintcdn.com/polyai/ZVzKq3G72RK1ScpE/images/release-notes/2504/call-batch-run.png?fit=max&auto=format&n=ZVzKq3G72RK1ScpE&q=85&s=ebc17d1067c9b0f7fba680a8de8366fe" alt="call-batch-run" width="3024" height="1616" data-path="images/release-notes/2504/call-batch-run.png" />

    **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
  </Accordion>

  <Accordion title="Live collaboration and edit history" icon="users" id="live-collaboration-and-edit-history">
    Agent Studio now supports real-time collaboration and edit tracking across your team.

    <div align="center">
      <img src="https://res.cloudinary.com/dtdd8khwd/image/upload/v1742990655/multi_user-refresh_view-2025-03-20_ba6e4w.gif" alt="Multi-user refresh view demo" />

      <p><em>Multi-user refresh view in action</em></p>
    </div>

    **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.
  </Accordion>

  <Accordion title="Call categorization" icon="list-check" id="call-categorization">
    You can now use an LLM to review and rate calls.

    <img src="https://mintcdn.com/polyai/ZVzKq3G72RK1ScpE/images/release-notes/2504/call-categorization.png?fit=max&auto=format&n=ZVzKq3G72RK1ScpE&q=85&s=6a8773f6dd1174d04dc8b348d07e0e89" alt="agent-analysis" width="3024" height="1628" data-path="images/release-notes/2504/call-categorization.png" />

    **What you can do:**

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

  <Accordion title="Workspace filter in Conversations" icon="window-restore" id="workspace-filter-in-conversations">
    You can now filter conversations by workspace on the Conversations page.

    <img src="https://mintcdn.com/polyai/ZVzKq3G72RK1ScpE/images/release-notes/2504/version-filter.png?fit=max&auto=format&n=ZVzKq3G72RK1ScpE&q=85&s=b62e7a06f83c26ba97b60e0c47d27452" alt="workspace-filter" width="3020" height="1600" data-path="images/release-notes/2504/version-filter.png" />

    **Why it helps:**

    * Focus on the calls your team is responsible for
    * Cleaner review experience for large orgs
  </Accordion>

  <Accordion title="Utility function – utils.extract_address" icon="address-book" id="utility-function--utilsextract_address">
    <Note>This is an opt-in feature and will not be enabled by default. Contact PolyAI for access.</Note>

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

    <img src="https://mintcdn.com/polyai/ZVzKq3G72RK1ScpE/images/release-notes/2504/address-util.png?fit=max&auto=format&n=ZVzKq3G72RK1ScpE&q=85&s=79ca1d74d626bc8d63f0ea68fe8a5f0d" alt="extract-address-util" width="2532" height="1280" data-path="images/release-notes/2504/address-util.png" />

    **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 theme={"theme":{"light":"github-light","dark":"github-dark"}}
    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 theme={"theme":{"light":"github-light","dark":"github-dark"}}
    @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
  </Accordion>

  <Accordion title="Conversation history access – conv.history" icon="book-open" id="conversation-history-access--convhistory">
    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 theme={"theme":{"light":"github-light","dark":"github-dark"}}
    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
  </Accordion>

  <Accordion title="Import and export variants" icon="arrow-right-arrow-left" id="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](/variant-management/introduction) page for advanced use cases like SMS personalization or routing.</Tip>
  </Accordion>

  <Accordion title="Variant ID added to conversations" icon="fingerprint" id="variant-id-added-to-conversations">
    Reviewed conversations now show the **variant ID** used in each call.

    <img src="https://mintcdn.com/polyai/ZVzKq3G72RK1ScpE/images/release-notes/2504/call-variant.png?fit=max&auto=format&n=ZVzKq3G72RK1ScpE&q=85&s=344229b3fc8472e4dbcb31afb50e9a75" alt="variant-id" width="3024" height="1628" data-path="images/release-notes/2504/call-variant.png" />

    **Why it matters:**

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

  <Accordion title="Builtin handoff improvements" icon="phone-intercom" id="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](/tools/introduction).

    **Example usage:**

    ```python theme={"theme":{"light":"github-light","dark":"github-dark"}}
        def escalate(conv: Conversation):
            return conv.call_handoff(
                reason="policy_violation",
                utterance="Let me transfer you to a specialist who can help."
            )
    ```
  </Accordion>

  <Accordion title="Multi-voice agents" icon="people" id="multi-voice-agents">
    <img src="https://mintcdn.com/polyai/ZVzKq3G72RK1ScpE/images/release-notes/2504/multi-voice.png?fit=max&auto=format&n=ZVzKq3G72RK1ScpE&q=85&s=d113b9353fd2b603db5be5ff8b233787" alt="call-batch-run" width="3836" height="1596" data-path="images/release-notes/2504/multi-voice.png" />

    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
  </Accordion>
</AccordionGroup>

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