# `Tinkex.API.Sampling`
[🔗](https://github.com/North-Shore-AI/tinkex/blob/v0.4.0/lib/tinkex/api/sampling.ex#L1)

Sampling API endpoints.

Uses :sampling pool (high concurrency).
Pool size: 100 connections.

# `sample_async`

```elixir
@spec sample_async(
  map(),
  keyword()
) :: {:ok, map()} | {:error, Tinkex.Error.t()}
```

Async sample request.

Uses :sampling pool (high concurrency).
Sets max_retries: 0 - Phase 4's SamplingClient will implement client-side
rate limiting and retry logic via RateLimiter. The HTTP layer doesn't retry
so that the higher-level client can make intelligent retry decisions based
on rate limit state.

Note: Named `sample_async` for consistency with Elixir naming conventions
(adjective_noun or verb_object patterns). The API endpoint remains /api/v1/asample.

## Examples

    Tinkex.API.Sampling.sample_async(
      %{session_id: "...", prompts: [...]},
      config: config
    )

# `sample_stream`

```elixir
@spec sample_stream(
  map(),
  keyword()
) :: {:ok, Enumerable.t()} | {:error, Tinkex.Error.t()}
```

Streaming sample request via SSE.

Returns a stream of `SampleStreamChunk` structs that can be consumed
incrementally for real-time token generation.

Uses :sampling pool (high concurrency).
Does not retry - streaming responses cannot be reliably retried mid-stream.

## Examples

    {:ok, stream} = Tinkex.API.Sampling.sample_stream(request, config: config)
    Enum.each(stream, fn chunk -> IO.write(chunk.token) end)

---

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