Supported providers
Call transfer is available for telephony calls using Twilio, Telnyx, or Asterisk ARI providers.How call transfer works
When the LLM decides a transfer is needed, it calls the Call Transfer tool. EESI resolves the destination, validates the transfer setup, and then starts the provider transfer. For a successful transfer:- The agent calls the Call Transfer tool.
- EESI resolves the destination from either static configuration or a dynamic HTTP resolver.
- EESI optionally plays a pre-transfer message.
- EESI starts dialing the destination through the telephony provider.
- The caller hears hold music while the destination leg is connecting.
- When the destination answers, EESI connects the caller and ends the AI agentβs involvement.
Destination source
You must choose one destination source for each Call Transfer tool.Static / Template
Use this when the transfer destination is already known before the transfer happens. Static destinations can be:- A fixed E.164 phone number, such as
+1234567890 - A SIP endpoint, such as
PJSIP/sales-queue - A template value from context, such as
{{initial_context.transfer_destination}}
Dynamic HTTP Resolver
Use this when the destination must be decided during the conversation. EESI sends aPOST request to your resolver endpoint before starting the transfer. Your endpoint returns the destination and may return a custom message to play before dialing.
Common use cases:
- Route by region, timezone, or language
- Look up the right account team in your customer system
- Route by customer tier or account status
- Route by issue type, language, or department
- Use business logic from your backend instead of hardcoding numbers in EESI
Dynamic resolver request
The resolver request body is a flat JSON object. EESI builds it from:- LLM parameters: values the agent extracts from the conversation when it calls the transfer tool
- Preset parameters: values EESI injects from fixed values or templates such as
{{initial_context.account_id}}or{{gathered_context.billing_issue_type}}
EESI does not send the full conversation transcript to the resolver. Add the specific values you need as LLM parameters or preset parameters.
Dynamic resolver response
Your resolver must return a JSON object withtransfer_context.destination.
transfer_context.custom_message is optional.
destination: Required. E.164 phone number or SIP endpoint.custom_message: Optional. If returned, this message is played before the provider transfer starts.
transfer_context.destination, the transfer fails gracefully and the agent can continue handling the caller.
Dynamic resolver configuration
When using a dynamic resolver, configure:- Resolver URL: HTTPS or HTTP endpoint EESI calls with
POST - Resolver Timeout: How long EESI waits for the resolver response
- Resolver Wait Message: Optional message spoken while EESI waits, such as βOne moment while I find the right team.β
- LLM Parameters: Values the agent should extract from the conversation, such as
billing_issue_typeorrequested_department - Preset Parameters: Values injected by EESI from context or fixed values
- Custom Headers: Static headers sent to your resolver endpoint
- Credential: Optional saved credential used to authenticate the resolver request
The dynamic resolver uses
POST only. If you need custom backend behavior, implement it behind your resolver endpoint and return the expected transfer_context shape.Pre-transfer messages
Call Transfer supports a common pre-transfer message setting for both static and dynamic destinations. For static transfers:- EESI resolves the static or template destination.
- EESI plays the configured pre-transfer message, if any.
- EESI starts the provider transfer.
- EESI may play the resolver wait message while calling your resolver.
- If the resolver returns
custom_message, EESI plays that message. - If the resolver does not return
custom_message, EESI uses the configured pre-transfer message. - EESI starts the provider transfer.
custom_message overrides the configured pre-transfer message for that transfer attempt.
Transfer timeout
Transfer timeout is the maximum time EESI waits for the destination to answer after the provider transfer starts. This timeout applies to both static and dynamic transfers. The resolver timeout is separate. It controls only how long EESI waits for your HTTP resolver before dialing starts.Destination formats
Twilio and Telnyx
Use E.164 phone numbers:Asterisk ARI
Use SIP endpoints:Example: route enterprise billing calls
Use this setup when the agent identifies a billing issue and your backend decides whether to route the caller to standard billing, enterprise billing, or collections. Configure LLM parameters:Best practices
- Keep resolver latency low. Aim for 2-3 seconds.
- Use a resolver wait message if the resolver may take noticeable time.
- Send only the parameters your resolver needs.
- Prefer preset parameters for values already available in
initial_contextorgathered_context. - Make LLM parameter descriptions explicit so the agent knows what to extract.
- Test both successful transfer and resolver failure paths before going live.
- Keep destination validation and routing logic in your backend when routing depends on account data or business rules.
Troubleshooting
The transfer tool is not called
Check that the tool is attached to the correct node and that the node prompt clearly tells the agent when to transfer.Static transfer fails with no destination
Static mode requires a configured destination. Use a fixed destination or a template that resolves to a non-empty value.Dynamic transfer fails before dialing
Check the resolver response. It must include:Resolver receives missing parameters
Confirm the parameter is configured as either:- an LLM parameter, if the agent should extract it from the conversation
- a preset parameter, if EESI should inject it from context
{{initial_context.account_id}} or {{gathered_context.billing_issue_type}}.