Tools are powerful extensions that allow your AI agents to interact with external systems and perform actions during conversations. This comprehensive guide explains how to create, configure, and manage both user tools and system tools effectively.
Custom tools you create that make HTTP requests to external APIs or services. These are fully customizable and specific to your business needs.
Built-in platform tools that provide common functionality like ending calls or playing sounds. These are pre-configured and maintained by the platform.
Every user tool consists of:
The endpoint your tool will call. Can include placeholders for dynamic values:
https://api.yourstore.com/orders - Static endpointhttps://api.yourstore.com/orders/{orderId} - With path parameterhttps://api.external-service.com/bookings - External serviceParameters can be placed in different parts of the HTTP request:
PARAMETER_LOCATION_BODY - Request body (most common for POST/PUT)PARAMETER_LOCATION_PATH - URL path segmentPARAMETER_LOCATION_QUERY - URL query stringPARAMETER_LOCATION_HEADER - HTTP headerDynamic parameters are extracted from conversation. The AI understands context and fills these automatically.
[
{
"name": "customerMessage",
"location": "PARAMETER_LOCATION_BODY",
"schema": {
"type": "string",
"description": "Customer's message or request"
},
"required": true
}
][
{
"name": "priority",
"location": "PARAMETER_LOCATION_BODY",
"schema": {
"type": "string",
"enum": ["High", "Medium", "Low"],
"description": "The urgency level of the issue"
},
"required": true
}
][
{
"name": "supportTicket",
"location": "PARAMETER_LOCATION_BODY",
"schema": {
"type": "object",
"properties": {
"customerName": {
"type": "string",
"description": "Name of the customer"
},
"priority": {
"type": "string",
"enum": ["High", "Medium", "Low"],
"description": "The urgency level of the issue"
},
"category": {
"type": "string",
"enum": ["Technical", "Billing", "General"],
"description": "Type of support needed"
},
"description": {
"type": "string",
"description": "Detailed description of the issue"
},
"isUrgent": {
"type": "boolean",
"description": "Whether this requires immediate attention"
}
},
"required": ["customerName", "priority", "category", "description"]
},
"required": true
}
][
{
"name": "reservationData",
"location": "PARAMETER_LOCATION_BODY",
"schema": {
"type": "object",
"properties": {
"bookingId": {
"type": "string",
"description": "Booking reference from previous step"
},
"customerInfo": {
"type": "object",
"properties": {
"firstName": {
"type": "string",
"description": "Customer's first name"
},
"lastName": {
"type": "string",
"description": "Customer's last name"
},
"email": {
"type": "string",
"description": "Customer's email address"
},
"phone": {
"type": "string",
"description": "Customer's phone number"
}
},
"required": ["firstName", "lastName", "email"]
}
},
"required": ["bookingId", "customerInfo"]
},
"required": true
}
]Values the system provides automatically (API keys, call context, etc.). These are added to the automaticParameters array in your tool configuration.
KNOWN_PARAM_CALL_ID - Current call identifierKNOWN_PARAM_USER_EMAIL - User's emailKNOWN_PARAM_PHONE_NUMBER - Caller's phone number"automaticParameters": [
{
"name": "authorization",
"location": "PARAMETER_LOCATION_HEADER",
"knownValue": "Bearer sk-your-secret-api-key"
}
]"automaticParameters": [
{
"name": "callId",
"location": "PARAMETER_LOCATION_BODY",
"knownValue": "KNOWN_PARAM_CALL_ID"
},
{
"name": "userEmail",
"location": "PARAMETER_LOCATION_BODY",
"knownValue": "KNOWN_PARAM_USER_EMAIL"
}
]"automaticParameters": [
{
"name": "api_key",
"location": "PARAMETER_LOCATION_QUERY",
"knownValue": "your-api-key-here"
}
]"automaticParameters": [
{
"name": "authorization",
"location": "PARAMETER_LOCATION_HEADER",
"knownValue": "Basic dXNlcm5hbWU6cGFzc3dvcmQ="
}
]"automaticParameters": [
{
"name": "X-API-Key",
"location": "PARAMETER_LOCATION_HEADER",
"knownValue": "your-custom-api-key"
}
]You can also use automatic parameters to pass static values that don't change between calls:
"automaticParameters": [
{
"name": "source",
"location": "PARAMETER_LOCATION_BODY",
"knownValue": "voice-agent"
},
{
"name": "version",
"location": "PARAMETER_LOCATION_HEADER",
"knownValue": "v1.0"
}
]checkOrderStatus not tool1)Here are educational examples showing different patterns and use cases:
Use Case: Check order status for customers
{
"temporaryTool": {
"modelToolName": "checkOrderStatus",
"automaticParameters": [
{
"name": "apiKey",
"location": "PARAMETER_LOCATION_HEADER",
"knownValue": "Bearer sk-your-api-key"
}
],
"dynamicParameters": [
{
"name": "orderId",
"location": "PARAMETER_LOCATION_PATH",
"schema": {
"type": "string",
"description": "Customer's order number or ID"
},
"required": true
}
],
"http": {
"baseUrlPattern": "https://api.yourstore.com/orders/{orderId}",
"httpMethod": "GET"
},
"description": "Retrieves order status and tracking information"
}
}Use Case: Create support tickets for customer issues
{
"temporaryTool": {
"modelToolName": "createSupportTicket",
"automaticParameters": [
{
"name": "authorization",
"location": "PARAMETER_LOCATION_HEADER",
"knownValue": "Bearer sk-support-api-key"
},
{
"name": "source",
"location": "PARAMETER_LOCATION_BODY",
"knownValue": "voice-agent"
}
],
"dynamicParameters": [
{
"name": "ticketData",
"location": "PARAMETER_LOCATION_BODY",
"schema": {
"type": "object",
"properties": {
"customerName": {
"type": "string",
"description": "Name of the customer reporting the issue"
},
"priority": {
"type": "string",
"enum": ["High", "Medium", "Low"],
"description": "Priority level based on issue severity"
},
"category": {
"type": "string",
"enum": ["Technical", "Billing", "Account", "General"],
"description": "Type of issue being reported"
},
"subject": {
"type": "string",
"description": "Brief summary of the issue"
},
"description": {
"type": "string",
"description": "Detailed description of the problem"
},
"affectsMultipleUsers": {
"type": "boolean",
"description": "Whether this issue affects multiple customers"
}
},
"required": ["customerName", "priority", "category", "subject", "description"]
},
"required": true
}
],
"http": {
"baseUrlPattern": "https://api.yoursupport.com/tickets",
"httpMethod": "POST"
},
"description": "Creates a support ticket for customer issues"
}
}Use Case: Multi-step appointment booking workflow
{
"temporaryTool": {
"modelToolName": "checkAvailability",
"automaticParameters": [
{
"name": "apiKey",
"location": "PARAMETER_LOCATION_HEADER",
"knownValue": "Bearer sk-booking-api-key"
}
],
"dynamicParameters": [
{
"name": "searchCriteria",
"location": "PARAMETER_LOCATION_BODY",
"schema": {
"type": "object",
"properties": {
"serviceType": {
"type": "string",
"description": "Type of service needed (e.g., 'consultation', 'checkup')"
},
"preferredLocation": {
"type": "string",
"description": "Preferred location or clinic name"
},
"timeframe": {
"type": "string",
"enum": ["This Week", "Next Week", "This Month", "Next Month"],
"description": "When the customer wants to schedule"
},
"duration": {
"type": "integer",
"description": "Expected duration in minutes"
}
},
"required": ["serviceType", "preferredLocation", "timeframe"]
},
"required": true
}
],
"http": {
"baseUrlPattern": "https://api.booking-system.com/availability",
"httpMethod": "POST"
},
"description": "Finds available appointment slots"
}
}{
"temporaryTool": {
"modelToolName": "confirmBooking",
"automaticParameters": [
{
"name": "apiKey",
"location": "PARAMETER_LOCATION_HEADER",
"knownValue": "Bearer sk-booking-api-key"
}
],
"dynamicParameters": [
{
"name": "bookingDetails",
"location": "PARAMETER_LOCATION_BODY",
"schema": {
"type": "object",
"properties": {
"slotId": {
"type": "string",
"description": "Available slot ID from previous search"
},
"appointmentDate": {
"type": "string",
"description": "Selected date in YYYY-MM-DD format"
},
"appointmentTime": {
"type": "string",
"description": "Selected time in HH:MM format"
},
"customerDetails": {
"type": "object",
"properties": {
"firstName": {
"type": "string",
"description": "Customer's first name"
},
"lastName": {
"type": "string",
"description": "Customer's last name"
},
"email": {
"type": "string",
"description": "Customer's email for confirmation"
},
"phone": {
"type": "string",
"description": "Customer's phone number"
}
},
"required": ["firstName", "lastName", "email", "phone"]
},
"notes": {
"type": "string",
"description": "Any special requests or notes"
}
},
"required": ["slotId", "appointmentDate", "appointmentTime", "customerDetails"]
},
"required": true
}
],
"http": {
"baseUrlPattern": "https://api.booking-system.com/bookings",
"httpMethod": "POST"
},
"description": "Confirms and books the appointment"
}
}When an agent handles a live call, the tool execution follows this workflow:
Customer: "Hi, I'd like to check the status of my order. My order number is ORD-12345."
AI Agent: "I'd be happy to help you check your order status. Let me look that up for you right now."
[AI executes checkOrderStatus tool with orderId: "ORD-12345"]
AI Agent: "Great news! Your order ORD-12345 has been shipped and is currently in transit. It should arrive within 2-3 business days."
PARAMETER_LOCATION_HEADERKNOWN_PARAM_CALL_ID for context