# ol.llx.ai

_platforms: clj, cljs_

## default-env

### clj

_platforms: clj_

```clojure
(default-env)
```

Returns the default environment for your platform.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L12-L17)

### cljs

_platforms: cljs_

```clojure
(default-env)
```

Returns the default environment for your platform.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L12-L17)

---

## complete*

### clj

_platforms: clj_

```clojure
(complete* env model context opts)
```

Runs one non-streaming assistant turn using provider-style options.

Use `complete*` when you need provider-level control and adapter-specific
options. This is the provider path.

`opts` is validated against `:ol.llx/provider-request-options` in
`src/ol/llx/ai/impl/schema/options.cljc`.

Adapter `build-request` boundaries also validate adapter-specific schemas:
`:ol.llx/openai-completions-provider-options`,
`:ol.llx/openai-responses-provider-options`,
`:ol.llx/anthropic-provider-options`, and
`:ol.llx/google-provider-options`.

Common provider option keys:

|     |     |
| --- | --- |
| key | description |
| `:max-output-tokens` | Requested output token cap. |
| `:temperature` | Sampling temperature. |
| `:top-p` | Nucleus sampling probability. |
| `:reasoning` | Provider reasoning map (shape depends on adapter). |
| `:session-id` | Optional session identifier for provider-side caching/routing. |
| `:api-key` | Provider API key override for this call. |
| `:headers` | Additional provider request headers. |
| `:signal` | Abort/cancel signal forwarded to runtime/provider layer. |
| `:max-retry-delay-ms` | Optional cap for server-requested retry delays. |
| `:metadata` | Request metadata map forwarded to adapter payload builders. |
| `:registry` | Per-call adapter registry override. |
| `:max-retries` | Retry count for transient failures (default `2`). |

Returns a promise that resolves to one canonical assistant message map.
Errors reject the promise with structured LLX exception data.

Use [`complete`](#complete) for the unified API.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L19-L56)

### cljs

_platforms: cljs_

```clojure
(complete* env model context opts)
```

Runs one non-streaming assistant turn using provider-style options.

Use `complete*` when you need provider-level control and adapter-specific
options. This is the provider path.

`opts` is validated against `:ol.llx/provider-request-options` in
`src/ol/llx/ai/impl/schema/options.cljc`.

Adapter `build-request` boundaries also validate adapter-specific schemas:
`:ol.llx/openai-completions-provider-options`,
`:ol.llx/openai-responses-provider-options`,
`:ol.llx/anthropic-provider-options`, and
`:ol.llx/google-provider-options`.

Common provider option keys:

|     |     |
| --- | --- |
| key | description |
| `:max-output-tokens` | Requested output token cap. |
| `:temperature` | Sampling temperature. |
| `:top-p` | Nucleus sampling probability. |
| `:reasoning` | Provider reasoning map (shape depends on adapter). |
| `:session-id` | Optional session identifier for provider-side caching/routing. |
| `:api-key` | Provider API key override for this call. |
| `:headers` | Additional provider request headers. |
| `:signal` | Abort/cancel signal forwarded to runtime/provider layer. |
| `:max-retry-delay-ms` | Optional cap for server-requested retry delays. |
| `:metadata` | Request metadata map forwarded to adapter payload builders. |
| `:registry` | Per-call adapter registry override. |
| `:max-retries` | Retry count for transient failures (default `2`). |

Returns a promise that resolves to one canonical assistant message map.
Errors reject the promise with structured LLX exception data.

Use [`complete`](#complete) for the unified API.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L19-L56)

---

## stream*

### clj

_platforms: clj_

```clojure
(stream* env model context opts)
```

Runs one streaming assistant turn using provider-style options.

Use `stream*` when you need provider-level control and adapter-specific
options. This is the provider path.

`opts` is validated against `:ol.llx/provider-request-options` in
`src/ol/llx/ai/impl/schema/options.cljc`, and adapter-specific schemas are
enforced at each adapter `build-request` boundary.

Common provider option keys:

|     |     |
| --- | --- |
| key | description |
| `:max-output-tokens` | Requested output token cap. |
| `:temperature` | Sampling temperature. |
| `:top-p` | Nucleus sampling probability. |
| `:reasoning` | Provider reasoning map (shape depends on adapter). |
| `:session-id` | Optional session identifier for provider-side caching/routing. |
| `:api-key` | Provider API key override for this call. |
| `:headers` | Additional provider request headers. |
| `:signal` | Abort/cancel signal forwarded to runtime/provider layer. |
| `:max-retry-delay-ms` | Optional cap for server-requested retry delays. |
| `:metadata` | Request metadata map forwarded to adapter payload builders. |
| `:registry` | Per-call adapter registry override. |
| `:max-retries` | Retry count for transient failures (default `2`). |

Returns a Promesa CSP channel emitting canonical LLX event maps.
Stream completion emits terminal `:done` or `:error` and closes the channel.
Consumer cancellation is channel closure.

Use [`stream`](#stream) for the unified API.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L58-L91)

### cljs

_platforms: cljs_

```clojure
(stream* env model context opts)
```

Runs one streaming assistant turn using provider-style options.

Use `stream*` when you need provider-level control and adapter-specific
options. This is the provider path.

`opts` is validated against `:ol.llx/provider-request-options` in
`src/ol/llx/ai/impl/schema/options.cljc`, and adapter-specific schemas are
enforced at each adapter `build-request` boundary.

Common provider option keys:

|     |     |
| --- | --- |
| key | description |
| `:max-output-tokens` | Requested output token cap. |
| `:temperature` | Sampling temperature. |
| `:top-p` | Nucleus sampling probability. |
| `:reasoning` | Provider reasoning map (shape depends on adapter). |
| `:session-id` | Optional session identifier for provider-side caching/routing. |
| `:api-key` | Provider API key override for this call. |
| `:headers` | Additional provider request headers. |
| `:signal` | Abort/cancel signal forwarded to runtime/provider layer. |
| `:max-retry-delay-ms` | Optional cap for server-requested retry delays. |
| `:metadata` | Request metadata map forwarded to adapter payload builders. |
| `:registry` | Per-call adapter registry override. |
| `:max-retries` | Retry count for transient failures (default `2`). |

Returns a Promesa CSP channel emitting canonical LLX event maps.
Stream completion emits terminal `:done` or `:error` and closes the channel.
Consumer cancellation is channel closure.

Use [`stream`](#stream) for the unified API.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L58-L91)

---

## complete

### clj

_platforms: clj_

```clojure
(complete env model context unified-opts)
```

Runs one non-streaming assistant turn using the unified options API.

This is the unified path and is recommended for most callers.
`opts` is validated against `:ol.llx/unified-request-options` in
`src/ol/llx/ai/impl/schema/options.cljc`.

Unified options are normalized and forwarded to provider adapters.
For example:
- `:max-tokens` -> provider `:max-output-tokens`
- `:reasoning` / `:reasoning-effort` -> provider reasoning shape

Unified option keys:

|     |     |
| --- | --- |
| key | description |
| `:max-tokens` | Requested output cap. Defaults to `min(model.max-tokens, 32000)`. |
| `:temperature` | Sampling temperature. |
| `:top-p` | Nucleus sampling probability. |
| `:reasoning` | Reasoning level keyword (`:minimal` `:low` `:medium` `:high` `:xhigh`). |
| `:reasoning-effort` | Alias for `:reasoning`. |
| `:session-id` | Optional session identifier for provider-side caching/routing. |
| `:thinking-budgets` | Optional token budgets per reasoning level (provider-dependent). |
| `:api-key` | Provider API key override for this call. |
| `:headers` | Additional provider request headers. |
| `:signal` | Abort/cancel signal forwarded to runtime/provider layer. |
| `:max-retry-delay-ms` | Optional cap for server-requested retry delays. |
| `:metadata` | Request metadata map forwarded to adapter payload builders. |
| `:registry` | Per-call adapter registry override. |

Returns a promise that resolves to one canonical assistant message map.
Errors reject the promise with structured LLX exception data.

Use [`complete*`](#complete*) if you need provider-specific options that are outside the
unified schema.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L93-L129)

### cljs

_platforms: cljs_

```clojure
(complete env model context unified-opts)
```

Runs one non-streaming assistant turn using the unified options API.

This is the unified path and is recommended for most callers.
`opts` is validated against `:ol.llx/unified-request-options` in
`src/ol/llx/ai/impl/schema/options.cljc`.

Unified options are normalized and forwarded to provider adapters.
For example:
- `:max-tokens` -> provider `:max-output-tokens`
- `:reasoning` / `:reasoning-effort` -> provider reasoning shape

Unified option keys:

|     |     |
| --- | --- |
| key | description |
| `:max-tokens` | Requested output cap. Defaults to `min(model.max-tokens, 32000)`. |
| `:temperature` | Sampling temperature. |
| `:top-p` | Nucleus sampling probability. |
| `:reasoning` | Reasoning level keyword (`:minimal` `:low` `:medium` `:high` `:xhigh`). |
| `:reasoning-effort` | Alias for `:reasoning`. |
| `:session-id` | Optional session identifier for provider-side caching/routing. |
| `:thinking-budgets` | Optional token budgets per reasoning level (provider-dependent). |
| `:api-key` | Provider API key override for this call. |
| `:headers` | Additional provider request headers. |
| `:signal` | Abort/cancel signal forwarded to runtime/provider layer. |
| `:max-retry-delay-ms` | Optional cap for server-requested retry delays. |
| `:metadata` | Request metadata map forwarded to adapter payload builders. |
| `:registry` | Per-call adapter registry override. |

Returns a promise that resolves to one canonical assistant message map.
Errors reject the promise with structured LLX exception data.

Use [`complete*`](#complete*) if you need provider-specific options that are outside the
unified schema.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L93-L129)

---

## stream

### clj

_platforms: clj_

```clojure
(stream env model context unified-opts)
```

Runs one streaming assistant turn using the unified options API.

This is the unified path and is recommended for most callers.
`opts` is validated against `:ol.llx/unified-request-options` in
`src/ol/llx/ai/impl/schema/options.cljc`.

Unified option keys:

|     |     |
| --- | --- |
| key | description |
| `:max-tokens` | Requested output cap. Defaults to `min(model.max-tokens, 32000)`. |
| `:temperature` | Sampling temperature. |
| `:top-p` | Nucleus sampling probability. |
| `:reasoning` | Reasoning level keyword (`:minimal` `:low` `:medium` `:high` `:xhigh`). |
| `:reasoning-effort` | Alias for `:reasoning`. |
| `:session-id` | Optional session identifier for provider-side caching/routing. |
| `:thinking-budgets` | Optional token budgets per reasoning level (provider-dependent). |
| `:api-key` | Provider API key override for this call. |
| `:headers` | Additional provider request headers. |
| `:signal` | Abort/cancel signal forwarded to runtime/provider layer. |
| `:max-retry-delay-ms` | Optional cap for server-requested retry delays. |
| `:metadata` | Request metadata map forwarded to adapter payload builders. |
| `:registry` | Per-call adapter registry override. |

Returns a Promesa CSP channel emitting canonical LLX event maps.
Stream completion emits terminal `:done` or `:error` and closes the channel.
Consumer cancellation is channel closure.

Use [`stream*`](#stream*) for provider-specific option control.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L131-L162)

### cljs

_platforms: cljs_

```clojure
(stream env model context unified-opts)
```

Runs one streaming assistant turn using the unified options API.

This is the unified path and is recommended for most callers.
`opts` is validated against `:ol.llx/unified-request-options` in
`src/ol/llx/ai/impl/schema/options.cljc`.

Unified option keys:

|     |     |
| --- | --- |
| key | description |
| `:max-tokens` | Requested output cap. Defaults to `min(model.max-tokens, 32000)`. |
| `:temperature` | Sampling temperature. |
| `:top-p` | Nucleus sampling probability. |
| `:reasoning` | Reasoning level keyword (`:minimal` `:low` `:medium` `:high` `:xhigh`). |
| `:reasoning-effort` | Alias for `:reasoning`. |
| `:session-id` | Optional session identifier for provider-side caching/routing. |
| `:thinking-budgets` | Optional token budgets per reasoning level (provider-dependent). |
| `:api-key` | Provider API key override for this call. |
| `:headers` | Additional provider request headers. |
| `:signal` | Abort/cancel signal forwarded to runtime/provider layer. |
| `:max-retry-delay-ms` | Optional cap for server-requested retry delays. |
| `:metadata` | Request metadata map forwarded to adapter payload builders. |
| `:registry` | Per-call adapter registry override. |

Returns a Promesa CSP channel emitting canonical LLX event maps.
Stream completion emits terminal `:done` or `:error` and closes the channel.
Consumer cancellation is channel closure.

Use [`stream*`](#stream*) for provider-specific option control.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L131-L162)

---

## get-model

### clj

_platforms: clj_

```clojure
(get-model provider model-id)
```

Returns the model definition for `provider` and `model-id`, or `nil` when absent.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L164-L167)

### cljs

_platforms: cljs_

```clojure
(get-model provider model-id)
```

Returns the model definition for `provider` and `model-id`, or `nil` when absent.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L164-L167)

---

## get-models

### clj

_platforms: clj_

```clojure
(get-models provider)
```

Returns all models for `provider` as a deterministic vector sorted by `:id`.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L169-L172)

### cljs

_platforms: cljs_

```clojure
(get-models provider)
```

Returns all models for `provider` as a deterministic vector sorted by `:id`.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L169-L172)

---

## get-providers

### clj

_platforms: clj_

```clojure
(get-providers)
```

Returns supported providers as a deterministic sorted vector.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L174-L177)

### cljs

_platforms: cljs_

```clojure
(get-providers)
```

Returns supported providers as a deterministic sorted vector.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L174-L177)

---

## calculate-cost

### clj

_platforms: clj_

```clojure
(calculate-cost model usage)
```

Calculates usage cost totals from `model` pricing and `usage` token counts.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L179-L182)

### cljs

_platforms: cljs_

```clojure
(calculate-cost model usage)
```

Calculates usage cost totals from `model` pricing and `usage` token counts.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L179-L182)

---

## supports-xhigh?

### clj

_platforms: clj_

```clojure
(supports-xhigh? model)
```

Returns true when `model` supports `:xhigh` reasoning effort.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L184-L187)

### cljs

_platforms: cljs_

```clojure
(supports-xhigh? model)
```

Returns true when `model` supports `:xhigh` reasoning effort.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L184-L187)

---

## models-equal?

### clj

_platforms: clj_

```clojure
(models-equal? a b)
```

Returns true when two model maps refer to the same `:provider` and `:id`.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L189-L192)

### cljs

_platforms: cljs_

```clojure
(models-equal? a b)
```

Returns true when two model maps refer to the same `:provider` and `:id`.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L189-L192)

---

## validate-tool-call

### clj

_platforms: clj_

```clojure
(validate-tool-call tools tool-call)
```

Validates a `tool-call` entry against matching tool definitions in `tools`.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L194-L197)

### cljs

_platforms: cljs_

```clojure
(validate-tool-call tools tool-call)
```

Validates a `tool-call` entry against matching tool definitions in `tools`.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L194-L197)

---

## context-overflow?

### clj

_platforms: clj_

```clojure
(context-overflow? assistant-message)
(context-overflow? assistant-message context-window)
```

Returns true when the input matches known context-window overflow patterns.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L199-L204)

### cljs

_platforms: cljs_

```clojure
(context-overflow? assistant-message)
(context-overflow? assistant-message context-window)
```

Returns true when the input matches known context-window overflow patterns.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L199-L204)

---

## sanitize-surrogates

### clj

_platforms: clj_

```clojure
(sanitize-surrogates text)
```

Removes unpaired surrogate code units while preserving valid Unicode pairs.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L206-L209)

### cljs

_platforms: cljs_

```clojure
(sanitize-surrogates text)
```

Removes unpaired surrogate code units while preserving valid Unicode pairs.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L206-L209)

---

## schema-regsitry

### clj

_platforms: clj_

```clojure
(schema-regsitry)
```

Returns the full LLX schema registry map.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L211-L214)

### cljs

_platforms: cljs_

```clojure
(schema-regsitry)
```

Returns the full LLX schema registry map.

[source,window=_blank](https://github.com/outskirtslabs/llx/blob/main/src/ol/llx/ai.cljc#L211-L214)
