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

# Overview

> How tool calling works on Tavus - LLM, perception, post-call, and system tools like end_call, plus delivery channels.

**Tool calling** lets a PAL trigger code while a conversation is happening - look something up, write to a CRM, hit a third-party API, or notify your frontend. Tools are reusable objects: create them once, and attach them to any number of PALs.

<Note>
  **Skills vs tools:** [Tools](/sections/conversational-video-interface/pal/tools) are functions **you** define and attach for the LLM or Raven to call. [Skills](/sections/conversational-video-interface/skills/overview) are Tavus-authored capabilities (search, presentation, Magic Canvas, etc.) you attach from the skill registry. A PAL can use both.
</Note>

## Tool Types

| Type | When to use it | Pages |
| - | - | - |
| **LLM tool** | The conversational LLM should call a function based on what the **user says**. | [Tool Calling for LLM](/sections/conversational-video-interface/pal/llm-tool) |
| **Perception tool** | Raven should call a function based on what it **sees or hears** in the audio/video streams. | [Tool Calling for Perception](/sections/conversational-video-interface/pal/perception-tool) |
| **Post-call action** | You want work to run **once after the conversation ends**, using the transcript and perception analysis. | [Post-Call Actions](/sections/conversational-video-interface/pal/post-call-tool) |
| **System tool** | You need a built-in Tavus capability that is always available - today, hanging up with `end_call`. | [System Tools](#system-tools) |

## In-Call Tools

In-call tools fire during the conversation. Pick the type by setting `origin` on the tool: `"llm"`, `"vision"`, or `"audio"`. A single PAL can hold both LLM and perception tools.

| Type | Triggered by | Pages |
| - | - | - |
| **LLM tool** | What the **user says** - the conversational LLM decides to call the tool. | [Tool Calling for LLM](/sections/conversational-video-interface/pal/llm-tool) |
| **Perception tool** | What Raven **sees or hears** in the audio/video streams. | [Tool Calling for Perception](/sections/conversational-video-interface/pal/perception-tool) |

## Post-Call Actions

[Post-call actions](/sections/conversational-video-interface/pal/post-call-tool) run **once after the conversation ends**, with Tavus filling open arguments from the transcript and perception analysis and delivering the call for you. Set `trigger_type: "post_call"` (and omit `origin`) instead of using in-call `origin` values.

## System Tools

**System tools** are built-in tools Tavus provides. They are available on every conversation. You do not create them, attach them, update them, or delete them.

List them with [Get Tools](/api-reference/tools/get-tools) using `type=system` (or `type=all` to see system tools first, then your tools). System tools have `is_system_tool: true`, `owner_id: null`, and use their `name` as the `tool_id`.

| Tool | What it does |
| - | - |
| `end_call` | Lets the PAL hang up when the conversation reaches a natural stopping point. |

### `end_call`

`end_call` is always available. The conversational LLM can invoke it when the call should end - for example after the participant says goodbye, after objectives are complete, or when your system prompt tells the PAL to wrap up.

Steer when the PAL uses it with the system prompt, objectives, or conversational context. You do not attach `end_call` to a PAL.

```bash theme={null}
curl "https://tavusapi.com/v2/tools?type=system" \
  -H "x-api-key: <api-key>"
```

## Delivery Channels

Every tool dispatches via **exactly one** channel:

* **App message** (default) - the call lands as a `conversation.tool_call` event your frontend handles.
* **API call** - Tavus makes an HTTPS request to a URL you configure - your own callback endpoint or a third-party API directly.

See [Tool Delivery](/sections/conversational-video-interface/pal/llm-tool-delivery) for the request shape, URL templating, and response handling. See [Tool Authentication](/sections/conversational-video-interface/pal/llm-tool-auth) for the auth types and how they map to outgoing headers.

## Quick Start

1. **Create the tool** at `/v2/tools` with a `name`, `description`, `parameters` JSON Schema, `origin`, and `delivery`.
2. **Attach it to a PAL** at `/v2/pals/{pal_id}/tools`.
3. **Start a conversation** with that PAL; the tool is now callable.

## Legacy Inline Tools

Older integrations define tools directly on the PAL (`layers.llm.tools`, `layers.perception.visual_tools`, `layers.perception.audio_tools`). That path still runs for existing PALs but is deprecated for new work. See [Legacy inline tool calling](/sections/troubleshooting#legacy-inline-tool-calling) for how it behaves and how to migrate.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.