# `Sycophant.WireProtocol`

Behaviour for chat wire protocol adapters.

Wire protocol adapters encode `Sycophant.Request` structs into
provider-specific JSON payloads and decode provider responses back
into `Sycophant.Response` structs. Dispatch is by wire protocol
metadata from LLMDB, not by provider identity.

## Built-in Adapters

  * `Sycophant.WireProtocol.OpenAICompletions` - OpenAI Chat Completions API
  * `Sycophant.WireProtocol.OpenAIResponses` - OpenAI Responses API
  * `Sycophant.WireProtocol.AnthropicMessages` - Anthropic Messages API
  * `Sycophant.WireProtocol.GoogleGemini` - Google Gemini API
  * `Sycophant.WireProtocol.BedrockConverse` - AWS Bedrock Converse API

# `decode_response`

```elixir
@callback decode_response(map()) ::
  {:ok, Sycophant.Response.t()} | {:error, Splode.Error.t()}
```

# `decode_stream_chunk`

```elixir
@callback decode_stream_chunk(state :: term(), event :: map()) ::
  {:ok, term(), [Sycophant.StreamChunk.t()]}
  | {:done, Sycophant.Response.t()}
  | {:done, Sycophant.Response.t(), [Sycophant.StreamChunk.t()]}
  | {:terminate, :failed | :incomplete | :cancelled, Splode.Error.t()}
  | {:error, Splode.Error.t()}
```

# `encode_request`

```elixir
@callback encode_request(Sycophant.Request.t()) ::
  {:ok, map()} | {:error, Splode.Error.t()}
```

# `encode_response_schema`

```elixir
@callback encode_response_schema(map()) :: {:ok, map()} | {:error, Splode.Error.t()}
```

# `encode_tools`

```elixir
@callback encode_tools([Sycophant.Tool.t()]) ::
  {:ok, [map()]} | {:error, Splode.Error.t()}
```

# `init_stream`

```elixir
@callback init_stream() :: term()
```

# `param_schema`

```elixir
@callback param_schema() :: Zoi.schema()
```

# `request_path`

```elixir
@callback request_path(Sycophant.Request.t()) :: String.t()
```

# `stream_transport`
*optional* 

```elixir
@callback stream_transport() :: :sse | :event_stream
```

---

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