# `Arcanum.ModelProfile`
[🔗](https://github.com/kakilangit/arcanum/blob/v0.1.0/lib/arcanum/model_profile.ex#L1)

Declares model capabilities upfront so adapters serialize correctly
on the first attempt — no runtime detection, no retry-on-error branching.

Every model gets a profile. Unknown models get `default/0` which assumes
the weakest common denominator (no system role, XML text tool calls).

# `t`

```elixir
@type t() :: %Arcanum.ModelProfile{
  max_context: pos_integer(),
  preserve_reasoning: boolean(),
  provider_routing: map() | nil,
  reasoning_field: atom() | nil,
  supports_system_role: boolean(),
  supports_tools: boolean(),
  thinking_param: map() | nil,
  tool_call_format: tool_call_format()
}
```

# `tool_call_format`

```elixir
@type tool_call_format() :: :native | :xml_text
```

# `capable`

```elixir
@spec capable() :: t()
```

Profile for models with full OpenAI-compatible capabilities.
GPT-4o, Claude via OpenAI proxy, etc.

# `default`

```elixir
@spec default() :: t()
```

Default profile for unknown models. Assumes weak model capabilities.
Safe for free-tier / community models that may reject system role
and emit tool calls as XML text.

---

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