ReqLLM.ToolCall (ReqLLM v1.12.0)

View Source

Represents a single tool call from an assistant message.

This struct matches the OpenAI Chat Completions API wire format:

{
  "id": "call_abc123",
  "type": "function",
  "function": {
    "name": "get_weather",
    "arguments": "{"location":"Paris"}"
  }
}

Fields

  • id - Unique call identifier (auto-generated if nil)
  • type - Always "function" (reserved for future extensibility)
  • function - Map with name (string) and arguments (JSON string)

Examples

iex> ToolCall.new("call_abc", "get_weather", ~s({"location":"Paris"}))
%ReqLLM.ToolCall{
  id: "call_abc",
  type: "function",
  function: %{name: "get_weather", arguments: ~s({"location":"Paris"})}
}

iex> ToolCall.new(nil, "get_time", "{}")
%ReqLLM.ToolCall{
  id: "call_..." # auto-generated
  type: "function",
  function: %{name: "get_time", arguments: "{}"}
}

Summary

Functions

Extract the arguments JSON string from a ToolCall.

Extract and decode the arguments as a map from a ToolCall. Returns nil if decoding fails.

Returns true when the ToolCall (or tool-call-shaped map) represents a server-side builtin invocation. Handles both OpenAI-shaped wrappers and bare maps: unwraps a nested :function map when present.

builtin_flag?(map) deprecated

Find the first tool call matching the given name and return its decoded arguments. Returns nil if no match found or if arguments cannot be decoded.

Returns true when the given map carries a truthy :builtin? (or "builtin?") flag directly on it. Does not unwrap a nested :function map — use it for chunk metadata or raw tool-call shapes that don't have the OpenAI function nesting.

Normalize a map or ToolCall to the standard %{id, name, arguments} format.

Check if a ToolCall matches the given function name.

Extract the function name from a ToolCall.

Create a new ToolCall with OpenAI-compatible structure.

Create a ToolCall representing a server-side builtin invocation that the provider executed on the model's behalf (e.g. OpenAI Responses API web_search_call, file_search_call).

Sets :builtin? => true on map when flag is true; otherwise returns map unchanged. Used by stream/response builders that propagate the builtin marker onto plain tool-call maps before they reach new_builtin/3.

Returns the Zoi schema for this module

Convert a ToolCall to a flat map with decoded arguments.

Types

t()

@type t() :: %ReqLLM.ToolCall{function: map(), id: binary(), type: binary()}

Functions

args_json(tool_call)

@spec args_json(t()) :: String.t()

Extract the arguments JSON string from a ToolCall.

args_map(tool_call, opts \\ [])

@spec args_map(
  t(),
  keyword()
) :: map() | nil

Extract and decode the arguments as a map from a ToolCall. Returns nil if decoding fails.

builtin?(map)

@spec builtin?(t() | map()) :: boolean()

Returns true when the ToolCall (or tool-call-shaped map) represents a server-side builtin invocation. Handles both OpenAI-shaped wrappers and bare maps: unwraps a nested :function map when present.

Prefer this over flagged_builtin?/1 whenever you have a %ToolCall{} or a map that may carry the OpenAI function: nesting.

builtin_flag?(map)

This function is deprecated. Use flagged_builtin?/1 instead — the rename makes the flag-only semantics explicit.
@spec builtin_flag?(any()) :: boolean()

find_args(tool_calls, name, opts \\ [])

@spec find_args([t()], String.t(), keyword()) :: map() | nil

Find the first tool call matching the given name and return its decoded arguments. Returns nil if no match found or if arguments cannot be decoded.

flagged_builtin?(map)

@spec flagged_builtin?(any()) :: boolean()

Returns true when the given map carries a truthy :builtin? (or "builtin?") flag directly on it. Does not unwrap a nested :function map — use it for chunk metadata or raw tool-call shapes that don't have the OpenAI function nesting.

For structured %ToolCall{} or OpenAI-wrapped maps, prefer builtin?/1.

from_map(tool_call, opts \\ [])

@spec from_map(
  t() | map(),
  keyword()
) :: %{id: String.t(), name: String.t(), arguments: map()}

Normalize a map or ToolCall to the standard %{id, name, arguments} format.

Accepts ToolCall structs or plain maps with atom/string keys. Arguments are decoded from JSON if provided as a string.

Examples

iex> ToolCall.from_map(%{"id" => "call_123", "name" => "get_weather", "arguments" => ~s({"location":"Paris"})})
%{id: "call_123", name: "get_weather", arguments: %{"location" => "Paris"}}

iex> tc = ToolCall.new("call_456", "get_time", "{}")
iex> ToolCall.from_map(tc)
%{id: "call_456", name: "get_time", arguments: %{}}

matches_name?(tool_call, expected_name)

@spec matches_name?(t(), String.t()) :: boolean()

Check if a ToolCall matches the given function name.

name(tool_call)

@spec name(t()) :: String.t()

Extract the function name from a ToolCall.

new(id, name, arguments_json)

@spec new(String.t() | nil, String.t(), String.t()) :: t()

Create a new ToolCall with OpenAI-compatible structure.

Parameters

  • id - Unique identifier (generates "call_<uuid>" if nil)
  • name - Function name
  • arguments_json - Arguments as JSON-encoded string

Examples

ToolCall.new("call_123", "get_weather", ~s({"location":"SF"}))
ToolCall.new(nil, "get_time", "{}")

new_builtin(id, name, arguments_json)

@spec new_builtin(String.t() | nil, String.t(), String.t()) :: t()

Create a ToolCall representing a server-side builtin invocation that the provider executed on the model's behalf (e.g. OpenAI Responses API web_search_call, file_search_call).

These calls are exposed in message.tool_calls for inspection and observability — the OTel GenAI bridge surfaces them as tool_call parts in gen_ai.output.messages. They are not replayable: the provider already executed them, and the OpenAI Responses request schema rejects them in input. Request encoders, finish_reason derivation, and tool call ID sanitisers must skip entries where builtin?(tc) is true.

arguments_json should be a JSON-encoded string capturing whatever per-call payload the provider returned (action, query, result URLs, etc.).

put_builtin_flag(map, arg2)

@spec put_builtin_flag(map(), boolean()) :: map()

Sets :builtin? => true on map when flag is true; otherwise returns map unchanged. Used by stream/response builders that propagate the builtin marker onto plain tool-call maps before they reach new_builtin/3.

schema()

Returns the Zoi schema for this module

to_map(tc, opts \\ [])

@spec to_map(
  t(),
  keyword()
) :: %{id: String.t(), name: String.t(), arguments: map()}

Convert a ToolCall to a flat map with decoded arguments.

Returns a map with :id, :name, and :arguments keys. Arguments are decoded from JSON; returns empty map if decoding fails.

Examples

iex> tc = ToolCall.new("call_123", "get_weather", ~s({"location":"Paris"}))
iex> ToolCall.to_map(tc)
%{id: "call_123", name: "get_weather", arguments: %{"location" => "Paris"}}

iex> tc = ToolCall.new("call_456", "get_time", "{}")
iex> ToolCall.to_map(tc)
%{id: "call_456", name: "get_time", arguments: %{}}