# Messages

## List Messages For Step

`client.steps.messages.list(stringstepID, MessageListParamsquery?, RequestOptionsoptions?): ArrayPage<MessageListResponse>`

**get** `/v1/steps/{step_id}/messages`

List messages for a given step.

### Parameters

- `stepID: string`

  The ID of the step in the format 'step-<uuid4>'

- `query: MessageListParams`

  - `after?: string | null`

    Cursor for pagination (message ID). Returns results relative to this ID in the specified sort order. Expected format: 'message-<uuid4>'

  - `before?: string | null`

    Cursor for pagination (message ID). Returns results relative to this ID in the specified sort order. Expected format: 'message-<uuid4>'

  - `limit?: number | null`

    Maximum number of messages to return

  - `order?: "asc" | "desc"`

    Sort order for messages by creation time. 'asc' for oldest first, 'desc' for newest first

    - `"asc"`

    - `"desc"`

  - `order_by?: "created_at"`

    Sort by field

    - `"created_at"`

### Returns

- `MessageListResponse = SystemMessage | UserMessage | ReasoningMessage | 8 more`

  A message generated by the system. Never streamed back on a response, only used for cursor pagination.

  Args:
  id (str): The ID of the message
  date (datetime): The date the message was created in ISO format
  name (Optional[str]): The name of the sender of the message
  content (str): The message content sent by the system

  - `SystemMessage`

    A message generated by the system. Never streamed back on a response, only used for cursor pagination.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    content (str): The message content sent by the system

    - `id: string`

    - `content: string`

      The message content sent by the system

    - `date: string`

    - `is_err?: boolean | null`

    - `message_type?: "system_message"`

      The type of the message.

      - `"system_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `UserMessage`

    A message sent by the user. Never streamed back on a response, only used for cursor pagination.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    content (Union[str, List[LettaUserMessageContentUnion]]): The message content sent by the user (can be a string or an array of multi-modal content parts)

    - `id: string`

    - `content: Array<LettaUserMessageContentUnion> | string`

      The message content sent by the user (can be a string or an array of multi-modal content parts)

      - `Array<LettaUserMessageContentUnion>`

        - `TextContent`

          - `text: string`

            The text content of the message.

          - `signature?: string | null`

            Stores a unique identifier for any reasoning associated with this text content.

          - `type?: "text"`

            The type of the message.

            - `"text"`

        - `ImageContent`

          - `source: URLImage | Base64Image | LettaImage`

            The source of the image.

            - `URLImage`

              - `url: string`

                The URL of the image.

              - `type?: "url"`

                The source type for the image.

                - `"url"`

            - `Base64Image`

              - `data: string`

                The base64 encoded image data.

              - `media_type: string`

                The media type for the image.

              - `detail?: string | null`

                What level of detail to use when processing and understanding the image (low, high, or auto to let the model decide)

              - `type?: "base64"`

                The source type for the image.

                - `"base64"`

            - `LettaImage`

              - `file_id: string`

                The unique identifier of the image file persisted in storage.

              - `data?: string | null`

                The base64 encoded image data.

              - `detail?: string | null`

                What level of detail to use when processing and understanding the image (low, high, or auto to let the model decide)

              - `media_type?: string | null`

                The media type for the image.

              - `type?: "letta"`

                The source type for the image.

                - `"letta"`

          - `type?: "image"`

            The type of the message.

            - `"image"`

      - `string`

    - `date: string`

    - `is_err?: boolean | null`

    - `message_type?: "user_message"`

      The type of the message.

      - `"user_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `ReasoningMessage`

    Representation of an agent's internal reasoning.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    source (Literal["reasoner_model", "non_reasoner_model"]): Whether the reasoning
    content was generated natively by a reasoner model or derived via prompting
    reasoning (str): The internal reasoning of the agent
    signature (Optional[str]): The model-generated signature of the reasoning step

    - `id: string`

    - `date: string`

    - `reasoning: string`

    - `is_err?: boolean | null`

    - `message_type?: "reasoning_message"`

      The type of the message.

      - `"reasoning_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `signature?: string | null`

    - `source?: "reasoner_model" | "non_reasoner_model"`

      - `"reasoner_model"`

      - `"non_reasoner_model"`

    - `step_id?: string | null`

  - `HiddenReasoningMessage`

    Representation of an agent's internal reasoning where reasoning content
    has been hidden from the response.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    state (Literal["redacted", "omitted"]): Whether the reasoning
    content was redacted by the provider or simply omitted by the API
    hidden_reasoning (Optional[str]): The internal reasoning of the agent

    - `id: string`

    - `date: string`

    - `state: "redacted" | "omitted"`

      - `"redacted"`

      - `"omitted"`

    - `hidden_reasoning?: string | null`

    - `is_err?: boolean | null`

    - `message_type?: "hidden_reasoning_message"`

      The type of the message.

      - `"hidden_reasoning_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `ToolCallMessage`

    A message representing a request to call a tool (generated by the LLM to trigger tool execution).

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    tool_call (Union[ToolCall, ToolCallDelta]): The tool call

    - `id: string`

    - `date: string`

    - `tool_call: ToolCall | ToolCallDelta`

      - `ToolCall`

        - `arguments: string`

        - `name: string`

        - `tool_call_id: string`

      - `ToolCallDelta`

        - `arguments?: string | null`

        - `name?: string | null`

        - `tool_call_id?: string | null`

    - `is_err?: boolean | null`

    - `message_type?: "tool_call_message"`

      The type of the message.

      - `"tool_call_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

    - `tool_calls?: Array<ToolCall> | ToolCallDelta | null`

      - `Array<ToolCall>`

        - `arguments: string`

        - `name: string`

        - `tool_call_id: string`

      - `ToolCallDelta`

  - `ToolReturnMessage`

    A message representing the return value of a tool call (generated by Letta executing the requested tool).

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    tool_return (str): The return value of the tool (deprecated, use tool_returns)
    status (Literal["success", "error"]): The status of the tool call (deprecated, use tool_returns)
    tool_call_id (str): A unique identifier for the tool call that generated this message (deprecated, use tool_returns)
    stdout (Optional[List(str)]): Captured stdout (e.g. prints, logs) from the tool invocation (deprecated, use tool_returns)
    stderr (Optional[List(str)]): Captured stderr from the tool invocation (deprecated, use tool_returns)
    tool_returns (Optional[List[ToolReturn]]): List of tool returns for multi-tool support

    - `id: string`

    - `date: string`

    - `status: "success" | "error"`

      - `"success"`

      - `"error"`

    - `tool_call_id: string`

    - `tool_return: string`

    - `is_err?: boolean | null`

    - `message_type?: "tool_return_message"`

      The type of the message.

      - `"tool_return_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `stderr?: Array<string> | null`

    - `stdout?: Array<string> | null`

    - `step_id?: string | null`

    - `tool_returns?: Array<ToolReturn> | null`

      - `status: "success" | "error"`

        - `"success"`

        - `"error"`

      - `tool_call_id: string`

      - `tool_return: Array<TextContent | ImageContent> | string`

        The tool return value - either a string or list of content parts (text/image)

        - `Array<TextContent | ImageContent>`

          - `TextContent`

          - `ImageContent`

        - `string`

      - `stderr?: Array<string> | null`

      - `stdout?: Array<string> | null`

      - `type?: "tool"`

        The message type to be created.

        - `"tool"`

  - `AssistantMessage`

    A message sent by the LLM in response to user input. Used in the LLM context.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    content (Union[str, List[LettaAssistantMessageContentUnion]]): The message content sent by the agent (can be a string or an array of content parts)

    - `id: string`

    - `content: Array<LettaAssistantMessageContentUnion> | string`

      The message content sent by the agent (can be a string or an array of content parts)

      - `Array<LettaAssistantMessageContentUnion>`

        - `text: string`

          The text content of the message.

        - `signature?: string | null`

          Stores a unique identifier for any reasoning associated with this text content.

        - `type?: "text"`

          The type of the message.

          - `"text"`

      - `string`

    - `date: string`

    - `is_err?: boolean | null`

    - `message_type?: "assistant_message"`

      The type of the message.

      - `"assistant_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `ApprovalRequestMessage`

    A message representing a request for approval to call a tool (generated by the LLM to trigger tool execution).

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    tool_call (ToolCall): The tool call

    - `id: string`

    - `date: string`

    - `tool_call: ToolCall | ToolCallDelta`

      The tool call that has been requested by the llm to run

      - `ToolCall`

      - `ToolCallDelta`

    - `is_err?: boolean | null`

    - `message_type?: "approval_request_message"`

      The type of the message.

      - `"approval_request_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

    - `tool_calls?: Array<ToolCall> | ToolCallDelta | null`

      The tool calls that have been requested by the llm to run, which are pending approval

      - `Array<ToolCall>`

        - `arguments: string`

        - `name: string`

        - `tool_call_id: string`

      - `ToolCallDelta`

  - `ApprovalResponseMessage`

    A message representing a response form the user indicating whether a tool has been approved to run.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    approve: (bool) Whether the tool has been approved
    approval_request_id: The ID of the approval request
    reason: (Optional[str]) An optional explanation for the provided approval status

    - `id: string`

    - `date: string`

    - `approval_request_id?: string | null`

      The message ID of the approval request

    - `approvals?: Array<ApprovalReturn | ToolReturn> | null`

      The list of approval responses

      - `ApprovalReturn`

        - `approve: boolean`

          Whether the tool has been approved

        - `tool_call_id: string`

          The ID of the tool call that corresponds to this approval

        - `reason?: string | null`

          An optional explanation for the provided approval status

        - `type?: "approval"`

          The message type to be created.

          - `"approval"`

      - `ToolReturn`

        - `status: "success" | "error"`

        - `tool_call_id: string`

        - `tool_return: Array<TextContent | ImageContent> | string`

          The tool return value - either a string or list of content parts (text/image)

        - `stderr?: Array<string> | null`

        - `stdout?: Array<string> | null`

        - `type?: "tool"`

          The message type to be created.

    - `approve?: boolean | null`

      Whether the tool has been approved

    - `is_err?: boolean | null`

    - `message_type?: "approval_response_message"`

      The type of the message.

      - `"approval_response_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `reason?: string | null`

      An optional explanation for the provided approval status

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `SummaryMessage`

    A message representing a summary of the conversation. Sent to the LLM as a user or system message depending on the provider.

    - `id: string`

    - `date: string`

    - `summary: string`

    - `compaction_stats?: CompactionStats | null`

      Statistics about a memory compaction operation.

      - `context_window: number`

        The model's context window size

      - `messages_count_after: number`

        Number of messages after compaction

      - `messages_count_before: number`

        Number of messages before compaction

      - `trigger: string`

        What triggered the compaction (e.g., 'context_window_exceeded', 'post_step_context_check')

      - `context_tokens_after?: number | null`

        Token count after compaction (message tokens only, does not include tool definitions)

      - `context_tokens_before?: number | null`

        Token count before compaction (from LLM usage stats, includes full context sent to LLM)

    - `is_err?: boolean | null`

    - `message_type?: "summary_message"`

      - `"summary_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `EventMessage`

    A message for notifying the developer that an event that has occured (e.g. a compaction). Events are NOT part of the context window.

    - `id: string`

    - `date: string`

    - `event_data: Record<string, unknown>`

    - `event_type: "compaction"`

      - `"compaction"`

    - `is_err?: boolean | null`

    - `message_type?: "event_message"`

      - `"event_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

### Example

```typescript
import Letta from '@letta-ai/letta-client';

const client = new Letta({
  apiKey: process.env['LETTA_API_KEY'], // This is the default and can be omitted
});

// Automatically fetches more pages as needed.
for await (const messageListResponse of client.steps.messages.list(
  'step-123e4567-e89b-42d3-8456-426614174000',
)) {
  console.log(messageListResponse);
}
```

#### Response

```json
[
  {
    "id": "id",
    "content": "content",
    "date": "2019-12-27T18:11:19.117Z",
    "is_err": true,
    "message_type": "system_message",
    "name": "name",
    "otid": "otid",
    "run_id": "run_id",
    "sender_id": "sender_id",
    "seq_id": 0,
    "step_id": "step_id"
  }
]
```

## Domain Types

### Message List Response

- `MessageListResponse = SystemMessage | UserMessage | ReasoningMessage | 8 more`

  A message generated by the system. Never streamed back on a response, only used for cursor pagination.

  Args:
  id (str): The ID of the message
  date (datetime): The date the message was created in ISO format
  name (Optional[str]): The name of the sender of the message
  content (str): The message content sent by the system

  - `SystemMessage`

    A message generated by the system. Never streamed back on a response, only used for cursor pagination.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    content (str): The message content sent by the system

    - `id: string`

    - `content: string`

      The message content sent by the system

    - `date: string`

    - `is_err?: boolean | null`

    - `message_type?: "system_message"`

      The type of the message.

      - `"system_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `UserMessage`

    A message sent by the user. Never streamed back on a response, only used for cursor pagination.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    content (Union[str, List[LettaUserMessageContentUnion]]): The message content sent by the user (can be a string or an array of multi-modal content parts)

    - `id: string`

    - `content: Array<LettaUserMessageContentUnion> | string`

      The message content sent by the user (can be a string or an array of multi-modal content parts)

      - `Array<LettaUserMessageContentUnion>`

        - `TextContent`

          - `text: string`

            The text content of the message.

          - `signature?: string | null`

            Stores a unique identifier for any reasoning associated with this text content.

          - `type?: "text"`

            The type of the message.

            - `"text"`

        - `ImageContent`

          - `source: URLImage | Base64Image | LettaImage`

            The source of the image.

            - `URLImage`

              - `url: string`

                The URL of the image.

              - `type?: "url"`

                The source type for the image.

                - `"url"`

            - `Base64Image`

              - `data: string`

                The base64 encoded image data.

              - `media_type: string`

                The media type for the image.

              - `detail?: string | null`

                What level of detail to use when processing and understanding the image (low, high, or auto to let the model decide)

              - `type?: "base64"`

                The source type for the image.

                - `"base64"`

            - `LettaImage`

              - `file_id: string`

                The unique identifier of the image file persisted in storage.

              - `data?: string | null`

                The base64 encoded image data.

              - `detail?: string | null`

                What level of detail to use when processing and understanding the image (low, high, or auto to let the model decide)

              - `media_type?: string | null`

                The media type for the image.

              - `type?: "letta"`

                The source type for the image.

                - `"letta"`

          - `type?: "image"`

            The type of the message.

            - `"image"`

      - `string`

    - `date: string`

    - `is_err?: boolean | null`

    - `message_type?: "user_message"`

      The type of the message.

      - `"user_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `ReasoningMessage`

    Representation of an agent's internal reasoning.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    source (Literal["reasoner_model", "non_reasoner_model"]): Whether the reasoning
    content was generated natively by a reasoner model or derived via prompting
    reasoning (str): The internal reasoning of the agent
    signature (Optional[str]): The model-generated signature of the reasoning step

    - `id: string`

    - `date: string`

    - `reasoning: string`

    - `is_err?: boolean | null`

    - `message_type?: "reasoning_message"`

      The type of the message.

      - `"reasoning_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `signature?: string | null`

    - `source?: "reasoner_model" | "non_reasoner_model"`

      - `"reasoner_model"`

      - `"non_reasoner_model"`

    - `step_id?: string | null`

  - `HiddenReasoningMessage`

    Representation of an agent's internal reasoning where reasoning content
    has been hidden from the response.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    state (Literal["redacted", "omitted"]): Whether the reasoning
    content was redacted by the provider or simply omitted by the API
    hidden_reasoning (Optional[str]): The internal reasoning of the agent

    - `id: string`

    - `date: string`

    - `state: "redacted" | "omitted"`

      - `"redacted"`

      - `"omitted"`

    - `hidden_reasoning?: string | null`

    - `is_err?: boolean | null`

    - `message_type?: "hidden_reasoning_message"`

      The type of the message.

      - `"hidden_reasoning_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `ToolCallMessage`

    A message representing a request to call a tool (generated by the LLM to trigger tool execution).

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    tool_call (Union[ToolCall, ToolCallDelta]): The tool call

    - `id: string`

    - `date: string`

    - `tool_call: ToolCall | ToolCallDelta`

      - `ToolCall`

        - `arguments: string`

        - `name: string`

        - `tool_call_id: string`

      - `ToolCallDelta`

        - `arguments?: string | null`

        - `name?: string | null`

        - `tool_call_id?: string | null`

    - `is_err?: boolean | null`

    - `message_type?: "tool_call_message"`

      The type of the message.

      - `"tool_call_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

    - `tool_calls?: Array<ToolCall> | ToolCallDelta | null`

      - `Array<ToolCall>`

        - `arguments: string`

        - `name: string`

        - `tool_call_id: string`

      - `ToolCallDelta`

  - `ToolReturnMessage`

    A message representing the return value of a tool call (generated by Letta executing the requested tool).

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    tool_return (str): The return value of the tool (deprecated, use tool_returns)
    status (Literal["success", "error"]): The status of the tool call (deprecated, use tool_returns)
    tool_call_id (str): A unique identifier for the tool call that generated this message (deprecated, use tool_returns)
    stdout (Optional[List(str)]): Captured stdout (e.g. prints, logs) from the tool invocation (deprecated, use tool_returns)
    stderr (Optional[List(str)]): Captured stderr from the tool invocation (deprecated, use tool_returns)
    tool_returns (Optional[List[ToolReturn]]): List of tool returns for multi-tool support

    - `id: string`

    - `date: string`

    - `status: "success" | "error"`

      - `"success"`

      - `"error"`

    - `tool_call_id: string`

    - `tool_return: string`

    - `is_err?: boolean | null`

    - `message_type?: "tool_return_message"`

      The type of the message.

      - `"tool_return_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `stderr?: Array<string> | null`

    - `stdout?: Array<string> | null`

    - `step_id?: string | null`

    - `tool_returns?: Array<ToolReturn> | null`

      - `status: "success" | "error"`

        - `"success"`

        - `"error"`

      - `tool_call_id: string`

      - `tool_return: Array<TextContent | ImageContent> | string`

        The tool return value - either a string or list of content parts (text/image)

        - `Array<TextContent | ImageContent>`

          - `TextContent`

          - `ImageContent`

        - `string`

      - `stderr?: Array<string> | null`

      - `stdout?: Array<string> | null`

      - `type?: "tool"`

        The message type to be created.

        - `"tool"`

  - `AssistantMessage`

    A message sent by the LLM in response to user input. Used in the LLM context.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    content (Union[str, List[LettaAssistantMessageContentUnion]]): The message content sent by the agent (can be a string or an array of content parts)

    - `id: string`

    - `content: Array<LettaAssistantMessageContentUnion> | string`

      The message content sent by the agent (can be a string or an array of content parts)

      - `Array<LettaAssistantMessageContentUnion>`

        - `text: string`

          The text content of the message.

        - `signature?: string | null`

          Stores a unique identifier for any reasoning associated with this text content.

        - `type?: "text"`

          The type of the message.

          - `"text"`

      - `string`

    - `date: string`

    - `is_err?: boolean | null`

    - `message_type?: "assistant_message"`

      The type of the message.

      - `"assistant_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `ApprovalRequestMessage`

    A message representing a request for approval to call a tool (generated by the LLM to trigger tool execution).

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    tool_call (ToolCall): The tool call

    - `id: string`

    - `date: string`

    - `tool_call: ToolCall | ToolCallDelta`

      The tool call that has been requested by the llm to run

      - `ToolCall`

      - `ToolCallDelta`

    - `is_err?: boolean | null`

    - `message_type?: "approval_request_message"`

      The type of the message.

      - `"approval_request_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

    - `tool_calls?: Array<ToolCall> | ToolCallDelta | null`

      The tool calls that have been requested by the llm to run, which are pending approval

      - `Array<ToolCall>`

        - `arguments: string`

        - `name: string`

        - `tool_call_id: string`

      - `ToolCallDelta`

  - `ApprovalResponseMessage`

    A message representing a response form the user indicating whether a tool has been approved to run.

    Args:
    id (str): The ID of the message
    date (datetime): The date the message was created in ISO format
    name (Optional[str]): The name of the sender of the message
    approve: (bool) Whether the tool has been approved
    approval_request_id: The ID of the approval request
    reason: (Optional[str]) An optional explanation for the provided approval status

    - `id: string`

    - `date: string`

    - `approval_request_id?: string | null`

      The message ID of the approval request

    - `approvals?: Array<ApprovalReturn | ToolReturn> | null`

      The list of approval responses

      - `ApprovalReturn`

        - `approve: boolean`

          Whether the tool has been approved

        - `tool_call_id: string`

          The ID of the tool call that corresponds to this approval

        - `reason?: string | null`

          An optional explanation for the provided approval status

        - `type?: "approval"`

          The message type to be created.

          - `"approval"`

      - `ToolReturn`

        - `status: "success" | "error"`

        - `tool_call_id: string`

        - `tool_return: Array<TextContent | ImageContent> | string`

          The tool return value - either a string or list of content parts (text/image)

        - `stderr?: Array<string> | null`

        - `stdout?: Array<string> | null`

        - `type?: "tool"`

          The message type to be created.

    - `approve?: boolean | null`

      Whether the tool has been approved

    - `is_err?: boolean | null`

    - `message_type?: "approval_response_message"`

      The type of the message.

      - `"approval_response_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `reason?: string | null`

      An optional explanation for the provided approval status

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `SummaryMessage`

    A message representing a summary of the conversation. Sent to the LLM as a user or system message depending on the provider.

    - `id: string`

    - `date: string`

    - `summary: string`

    - `compaction_stats?: CompactionStats | null`

      Statistics about a memory compaction operation.

      - `context_window: number`

        The model's context window size

      - `messages_count_after: number`

        Number of messages after compaction

      - `messages_count_before: number`

        Number of messages before compaction

      - `trigger: string`

        What triggered the compaction (e.g., 'context_window_exceeded', 'post_step_context_check')

      - `context_tokens_after?: number | null`

        Token count after compaction (message tokens only, does not include tool definitions)

      - `context_tokens_before?: number | null`

        Token count before compaction (from LLM usage stats, includes full context sent to LLM)

    - `is_err?: boolean | null`

    - `message_type?: "summary_message"`

      - `"summary_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`

  - `EventMessage`

    A message for notifying the developer that an event that has occured (e.g. a compaction). Events are NOT part of the context window.

    - `id: string`

    - `date: string`

    - `event_data: Record<string, unknown>`

    - `event_type: "compaction"`

      - `"compaction"`

    - `is_err?: boolean | null`

    - `message_type?: "event_message"`

      - `"event_message"`

    - `name?: string | null`

    - `otid?: string | null`

      The offline threading id (OTID). Set by the client to deduplicate requests. Used for idempotency in background streaming mode — each message in a request must have a unique OTID. Retries of the same request should reuse the same OTIDs.

    - `run_id?: string | null`

    - `sender_id?: string | null`

    - `seq_id?: number | null`

    - `step_id?: string | null`
