Built-in Tools

Phonic provides built-in tools that work seamlessly while handling calls on Phonic’s infrastructure. The quickest way to enable one is to add its name to an agent’s or conversation’s tools array (e.g. "tools": ["keypad_input"]) — no tool creation needed. You can also create them as tool instances with your own name and description (see Creating built-in tools as instances below); both behave identically at runtime.

Keypad Input (DTMF)

keypad_input lets the agent press keypad buttons including digits (0-9) and special keys (#, *, A, B, C, D). Phonic uses out-of-band DTMF (RFC 4733) signaling with our telephony integration.

Include keypad_input in the agent’s tools list. When running a conversation via WebSocket, handle the dtmf message on your infrastructure.

Natural Conversation Ending

natural_conversation_ending lets the agent hang up. Include it in the agent’s tools list. When running via WebSocket, handle the assistant_ended_conversation message on your infrastructure.

Choose Not to Respond

choose_not_to_respond lets the agent stay silent for a turn instead of always replying — useful when the caller is thinking out loud, talking to someone else, or hasn’t finished speaking. Include it in the agent’s tools list. By default the agent stays silent for the rest of the turn. To have it wait and then speak a follow-up if the caller is still silent, set respond_after_sec to the number of seconds to wait — either in the agent’s built_in_tool_configs under the tool_choose_not_to_respond key, or on a tool instance (see below).

Creating built-in tools as instances

Instead of attaching a built-in by its bare name, you can create it as a tool with your own name and description — in the dashboard’s Create tool menu, or via tools.create with type set to built_in_natural_conversation_ending, built_in_keypad_input, or built_in_choose_not_to_respond. This is useful when you want a custom-worded description for the model, and you attach the instance to an agent by its name just like any other tool.

These instances take no custom parameters and always run in sync mode (execution_mode is optional and defaults to "sync"). built_in_natural_conversation_ending and built_in_keypad_input accept an optional speech_before_tool_call setting — "required" (speak first), "optional" (model decides), or "suppressed" (stay silent before the call). It defaults to "required" for built_in_natural_conversation_ending and "optional" for built_in_keypad_input. built_in_choose_not_to_respond accepts an optional respond_after_sec — the number of seconds to wait before the agent speaks a follow-up if the caller stays silent; leave it unset (the default) to keep the agent silent for the rest of the turn.

1await client.tools.create({
2 name: "hang_up",
3 description: "End the call once the caller's issue is fully resolved.",
4 type: "built_in_natural_conversation_ending",
5 execution_mode: "sync",
6 speech_before_tool_call: "suppressed",
7});