Skip to main content
Function calling (also known as tool calling) allows LLMs to request information from external services and APIs during conversations. This extends your voice AI bot’s capabilities beyond its training data to access real-time information and perform actions.

Pipeline Integration

Function calling works seamlessly within your existing pipeline structure. The LLM service handles function calls automatically when they’re needed:
Function call flow:
  1. User asks a question requiring external data
  2. LLM recognizes the need and calls appropriate function
  3. Your function handler executes and returns results
  4. LLM incorporates results into its response
  5. Response flows to TTS and user as normal
Context integration: Function calls and their results are automatically stored in conversation context by the context aggregators, maintaining complete conversation history.

Understanding Function Calling

Function calling allows your bot to access real-time data and perform actions that aren’t part of its training data. For example, you could give your bot the ability to:
  • Check current weather conditions
  • Look up stock prices
  • Query a database
  • Control smart home devices
  • Schedule appointments
Here’s how it works:
  1. You define functions the LLM can use and register them to the LLM service used in your pipeline
  2. When needed, the LLM requests a function call
  3. Your application executes any corresponding functions
  4. The result is sent back to the LLM
  5. The LLM uses this information in its response

Implementation

1. Define Functions

Pipecat provides a standardized FunctionSchema that works across all supported LLM providers. This makes it easy to define functions once and use them with any provider. As a shorthand, you could also bypass specifying a function configuration at all and instead use “direct” functions. Under the hood, these are converted to FunctionSchemas.
The ToolsSchema will be automatically converted to the correct format for your LLM provider through adapters.

Using Direct Functions (Shorthand)

You can bypass specifying a function configuration (as a FunctionSchema or in a provider-specific format) and instead pass the function directly to your ToolsSchema. Pipecat will auto-configure the function, gathering relevant metadata from its signature and docstring. Metadata includes:
  • name
  • description
  • properties (including individual property descriptions)
  • list of required properties
Note that the function signature is a bit different when using direct functions. The first parameter is FunctionCallParams, followed by any others necessary for the function.

Using Provider-Specific Formats (Alternative)

You can also define functions in the provider-specific format if needed:

Provider-Specific Custom Tools

Some providers support unique tools that don’t fit the standard function schema. For these cases, you can add custom tools:
See the provider-specific documentation for details on custom tools and their formats.

2. Register Function Handlers

Register handlers for your functions using one of these LLM service methods:
  • register_function
  • register_direct_function
Which one you use depends on whether your function is a “direct” function.
Key registration options:
  • cancel_on_interruption=True (default): Function call is cancelled if user interrupts
  • cancel_on_interruption=False: Function call continues even if user interrupts
  • timeout_secs=None (default): Optional per-tool timeout in seconds. Overrides the global function_call_timeout_secs for this specific function
Use cancel_on_interruption=False for critical operations that should complete even if the user starts speaking. Function calls are async, so you can continue the conversation while the function executes. Once the result returns, the LLM will automatically incorporate it into the conversation context. LLMs vary in terms of how well they incorporate changes to previous messages, so you may need to experiment with your LLM provider to see how it handles this. Use timeout_secs to set a specific timeout for a function that differs from the global default. For example, you might want a longer timeout for database queries or shorter timeouts for quick lookups.

3. Create the Pipeline

Include your LLM service in your pipeline with the registered functions:

Function Handler Details

FunctionCallParams

Every function handler receives a FunctionCallParams object containing all the information needed for execution:
Using the parameters:
See the API reference for complete details.

Handler Structure

Your function handler should:
  1. Receive necessary arguments, either:
    • From params.arguments
    • Directly from function arguments, if using direct functions
  2. Process data or call external services
  3. Return results via params.result_callback(result)

Controlling Function Call Behavior (Advanced)

When returning results from a function handler, you can control how the LLM processes those results using a FunctionCallResultProperties object passed to the result callback.

Properties

FunctionCallResultProperties provides fine-grained control over LLM execution:
Property options:
  • run_llm=True: Run LLM after function call (default behavior)
  • run_llm=False: Don’t run LLM after function call (useful for chained calls)
  • on_context_updated: Async callback executed after the function result is added to context
Skip LLM execution (run_llm=False) when you have back-to-back function calls. If you skip a completion, you must manually trigger one from the context aggregator.
See the API reference for complete details.

Example Usage

Key Takeaways

  • Function calling extends LLM capabilities beyond training data to real-time information
  • Context integration is automatic - function calls and results are stored in conversation history
  • Multiple definition approaches - use standard schema for portability, direct functions for simplicity
  • Pipeline integration is seamless - functions work within your existing voice AI architecture
  • Advanced control available - fine-tune LLM execution and monitor function call lifecycle

What’s Next

Now that you understand function calling, let’s explore how to configure text-to-speech services to convert your LLM’s responses (including function call results) into natural-sounding speech.

Text to Speech

Learn how to configure speech synthesis in your voice AI pipeline