# `Nous.Messages.OpenAI`
[🔗](https://github.com/nyo16/nous/blob/v0.17.1/lib/nous/messages/openai.ex#L1)

OpenAI format message conversion.

Handles conversion between internal Message structs and OpenAI API format.

# `decode_arguments`

```elixir
@spec decode_arguments(String.t() | nil) ::
  {:ok, map()} | {:error, {:invalid_json, String.t()}}
```

Decode an OpenAI tool-call `arguments` JSON string into a map.

Returns `{:ok, map()}` on success, `{:error, {:invalid_json, raw}}` on
malformed JSON or non-object payload. Used by both the non-streaming
response parser and the streaming `ToolCallAccumulator`; callers tag the
tool_call with `"_invalid_arguments"` so the agent runner can surface a
proper error tool result instead of invoking the tool with bogus args.

# `from_messages`

```elixir
@spec from_messages([map()]) :: [Nous.Message.t()]
```

Convert OpenAI format messages to internal Message structs.

# `from_response`

```elixir
@spec from_response(map()) :: Nous.Message.t()
```

Parse OpenAI response into a Message.

## Examples

    iex> response = %{"choices" => [%{"message" => %{"role" => "assistant", "content" => "Hello"}}]}
    iex> message = Messages.OpenAI.from_response(response)
    iex> {message.role, message.content}
    {:assistant, "Hello"}

# `parse_usage`

```elixir
@spec parse_usage(map() | nil) :: Nous.Usage.t()
```

Parse an OpenAI-format usage map into a `%Nous.Usage{}` struct.

Returns an empty `%Usage{}` for `nil`. Accepts both atom and string keys.

# `to_format`

```elixir
@spec to_format([Nous.Message.t()]) :: [map()]
```

Convert messages to OpenAI format.

## Examples

    iex> messages = [Message.system("Be helpful"), Message.user("Hello")]
    iex> Messages.OpenAI.to_format(messages)
    [
      %{"role" => "system", "content" => "Be helpful"},
      %{"role" => "user", "content" => "Hello"}
    ]

---

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