# `ReqLLM.Message`
[🔗](https://github.com/agentjido/req_llm/blob/main/lib/req_llm/message.ex#L1)

Message represents a single conversation message with multi-modal content support.

Content is always a list of `ContentPart` structs, never a string.
This ensures consistent handling across all providers and eliminates polymorphism.

## Reasoning Details

The `reasoning_details` field contains provider-specific reasoning metadata that must
be preserved across conversation turns for reasoning models. This field is:
- `nil` for non-reasoning models or models that don't provide structured reasoning metadata
- A list of normalized ReasoningDetails for reasoning models

For multi-turn reasoning continuity, include the previous assistant message
(with its reasoning_details) in subsequent requests.

# `t`

```elixir
@type t() :: %ReqLLM.Message{
  content: [any()],
  metadata: map(),
  name: nil | nil | binary(),
  reasoning_details: nil | nil | [any()],
  role: :user | :assistant | :system | :tool,
  tool_call_id: nil | nil | binary(),
  tool_calls: nil | nil | [any()]
}
```

# `schema`

# `valid?`

```elixir
@spec valid?(t()) :: boolean()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
