ClaudeCode.Message.ResultMessage (ClaudeCode v0.16.0)

View Source

Represents a result message from the Claude CLI.

Result messages are the final message in a conversation, containing the final response, timing information, token usage, and cost.

String.Chars Protocol

Result implements String.Chars, so you can use it directly with IO.puts/1 or string interpolation:

{:ok, result} = ClaudeCode.query(session, "Hello")
IO.puts(result)  # prints just the result text

Matches the official SDK schema for successful results:

{
  type: "result",
  subtype: "success",
  uuid: string,
  duration_ms: float,
  duration_api_ms: float,
  is_error: boolean,
  num_turns: int,
  result: string,
  session_id: string,
  total_cost_usd: float,
  usage: object,
  modelUsage: {model: ModelUsage},
  permission_denials: PermissionDenial[],
  structured_output?: unknown
}

And for error results:

{
  type: "result",
  subtype: "error_max_turns" | "error_during_execution" | "error_max_budget_usd" | "error_max_structured_output_retries",
  uuid: string,
  duration_ms: float,
  duration_api_ms: float,
  is_error: boolean,
  num_turns: int,
  session_id: string,
  total_cost_usd: float,
  usage: object,
  modelUsage: {model: ModelUsage},
  permission_denials: PermissionDenial[],
  errors: string[]
}

Summary

Functions

Creates a new Result message from JSON data.

Type guard to check if a value is a Result message.

Types

t()

@type t() :: %ClaudeCode.Message.ResultMessage{
  duration_api_ms: float(),
  duration_ms: float(),
  errors: [String.t()] | nil,
  is_error: boolean(),
  model_usage: %{required(String.t()) => ClaudeCode.Types.model_usage()},
  num_turns: non_neg_integer(),
  permission_denials: [ClaudeCode.Types.permission_denial()],
  result: String.t() | nil,
  session_id: ClaudeCode.Types.session_id(),
  structured_output: any() | nil,
  subtype: ClaudeCode.Types.result_subtype(),
  total_cost_usd: float(),
  type: :result,
  usage: ClaudeCode.Types.usage(),
  uuid: String.t() | nil
}

Functions

new(json)

@spec new(map()) :: {:ok, t()} | {:error, atom() | {:missing_fields, [atom()]}}

Creates a new Result message from JSON data.

Examples

iex> Result.new(%{"type" => "result", "subtype" => "success", ...})
{:ok, %Result{...}}

iex> Result.new(%{"type" => "assistant"})
{:error, :invalid_message_type}

result_message?(arg1)

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

Type guard to check if a value is a Result message.