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

# nemo_voice_agent.evaluation.tools

## Submodules

* **[`nemo_voice_agent.evaluation.tools._write_tool_base`](./_write_tool_base.mdx)**
* **[`nemo_voice_agent.evaluation.tools.basic_tools`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/basic_tools)**
* **[`nemo_voice_agent.evaluation.tools.customer_service_tools`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/customer_service_tools)**
* **[`nemo_voice_agent.evaluation.tools.eva_airline_params`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/eva_airline_params)**
* **[`nemo_voice_agent.evaluation.tools.eva_airline_tools`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/eva_airline_tools)**
* **[`nemo_voice_agent.evaluation.tools.restaurant_tools`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/restaurant_tools)**
* **[`nemo_voice_agent.evaluation.tools.rtvi_control`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/rtvi_control)**
* **[`nemo_voice_agent.evaluation.tools.tau2_airline_params`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_airline_params)**
* **[`nemo_voice_agent.evaluation.tools.tau2_airline_tools`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_airline_tools)**
* **[`nemo_voice_agent.evaluation.tools.tau2_retail_params`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_retail_params)**
* **[`nemo_voice_agent.evaluation.tools.tau2_retail_tools`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_retail_tools)**
* **[`nemo_voice_agent.evaluation.tools.tau2_telecom_init_functions`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_telecom_init_functions)**
* **[`nemo_voice_agent.evaluation.tools.tau2_telecom_params`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_telecom_params)**
* **[`nemo_voice_agent.evaluation.tools.tau2_telecom_predicates`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_telecom_predicates)**
* **[`nemo_voice_agent.evaluation.tools.tau2_telecom_sync`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_telecom_sync)**
* **[`nemo_voice_agent.evaluation.tools.tau2_telecom_tools`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_telecom_tools)**
* **[`nemo_voice_agent.evaluation.tools.tau2_telecom_user_tools`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/tau2_telecom_user_tools)**
* **[`nemo_voice_agent.evaluation.tools.waitlist_tools`](/nemo/labs-voice-agent/nemo-voice-agent/nemo_voice_agent/evaluation/tools/waitlist_tools)**

## Package Contents

### Functions

| Name                                                                                                | Description                                                                          |
| --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| [`_do_register_tool`](#nemo_voice_agent-evaluation-tools-_do_register_tool)                         | Internal: validate + register a tool class into `ALL_SCHEMA_TOOLS_FOR_EVAL[domain]`. |
| [`get_schema_tool_for_eval`](#nemo_voice_agent-evaluation-tools-get_schema_tool_for_eval)           | Instantiate a registered tool by `(domain, name)`, falling back to `"default"`.      |
| [`list_schema_tools_for_eval`](#nemo_voice_agent-evaluation-tools-list_schema_tools_for_eval)       | List registered tool names.                                                          |
| [`normalize_tool_result`](#nemo_voice_agent-evaluation-tools-normalize_tool_result)                 | Deprecated alias for the guard now applied by `StandardSchemaTool.__call__`.         |
| [`register_schema_tool_for_eval`](#nemo_voice_agent-evaluation-tools-register_schema_tool_for_eval) | Class-decorator factory that registers a tool class into a per-domain bucket.        |

### Data

[`ALL_SCHEMA_TOOLS_FOR_EVAL`](#nemo_voice_agent-evaluation-tools-ALL_SCHEMA_TOOLS_FOR_EVAL)

### API

```python
nemo_voice_agent.evaluation.tools._do_register_tool(
    cls,
    domain: str
)
```

Internal: validate + register a tool class into `ALL_SCHEMA_TOOLS_FOR_EVAL[domain]`.

```python
nemo_voice_agent.evaluation.tools.get_schema_tool_for_eval(
    name: str,
    domain: str = 'default',
    rtvi: typing.Optional[pipecat.processors.frameworks.rtvi.RTVIProcessor] = None,
    shared_state: typing.Optional[dict] = None,
    kwargs = {}
) -> nemo_voice_agent.utils.tool_calling.base.StandardSchemaTool
```

Instantiate a registered tool by `(domain, name)`, falling back to `"default"`.

Raises `KeyError` if neither the specified domain nor `"default"` has
a tool by that name. Catches typos (`domain="tau2_arline"`) and missing-
tool issues at the tool-instantiation step rather than silently down the line.

**Parameters:**

**`name`**

Tool class name (e.g., `"GetUserDetailsTool"`).

---

**`domain`**

Registry namespace to look in first (e.g., `"tau2_airline"`).
Defaults to `"default"` (which makes the fallback path a no-op).

---

**`rtvi`**

RTVI processor passed to the tool if its constructor accepts it.

---

**`shared_state`**

Per-scenario mutable state dict passed to the tool if
its constructor accepts it.

---

**`**kwargs`** — default: \{}

Additional keyword arguments forwarded to the tool constructor.

---

**Raises:**

* `KeyError`: if `name` isn't registered in `domain` or `"default"`.

```python
nemo_voice_agent.evaluation.tools.list_schema_tools_for_eval(
    domain: typing.Optional[str] = None
) -> typing.List[str]
```

List registered tool names.

**Parameters:**

**`domain`**

If provided, list tools in that domain only. If `None`,
returns `"domain.name"` strings across all domains for debugging.

---

```python
nemo_voice_agent.evaluation.tools.normalize_tool_result(
    result: typing.Any
) -> typing.Any
```

Deprecated alias for the guard now applied by `StandardSchemaTool.__call__`.

Kept so external callers keep working. Tools no longer need to call this:
delivery (and this normalization) happens once, in `__call__`.

```python
nemo_voice_agent.evaluation.tools.register_schema_tool_for_eval(
    arg = None,
    domain: str = 'default'
)
```

Class-decorator factory that registers a tool class into a per-domain bucket.

Usage::

@register\_schema\_tool\_for\_eval(domain="tau2\_airline")
class GetUserDetailsTool(\_Tau2ReadTool):
...

# Or with the positional shortcut:

@register\_schema\_tool\_for\_eval("tau2\_airline")
class CancelReservationTool(\_Tau2WriteTool):
...

# Legacy: bare `@register_schema_tool_for_eval` (no parens) still

# registers under `"default"` — used by tool modules that haven't

# been migrated yet.

@register\_schema\_tool\_for\_eval
class EndConversationTool(SendExitMessageTool):
...

**Why per-domain registries:** with a single global `&#123;name → class&#125;` dict,
tools with the same short name in different domains (e.g., `CancelReservationTool`
in both eva and tau2) silently overwrote each other at import time. The
alternative — long unique class names like `Tau2AirlineCancelReservationTool`
— crowded the LLM's tool surface. Namespacing by domain lets tools keep
natural short names while remaining unambiguous.

**Parameters:**

**`arg`** — default: None

Either the class being decorated (bare `@register_schema_tool_for_eval`)
or a positional domain string (`@register_schema_tool_for_eval("tau2_airline")`).

---

**`domain`**

Registry namespace. Defaults to `"default"` for tools not
tied to a specific evaluation domain (harness tools in
`basic_tools.py` / `rtvi_control.py` plus customer\_service /
restaurant / qa / waitlist tools).

---

**Raises:**

* `ValueError`: if the class isn't a `StandardSchemaTool` subclass, or if
  a tool with the same name is already registered in this domain.

```python
nemo_voice_agent.evaluation.tools.ALL_SCHEMA_TOOLS_FOR_EVAL: Dict[str, Dict[str, Type[StandardSchemaTool]]] = {}
```