Module Ai_provider.Provider_optionsSource

Provider-specific options using an extensible GADT. Each provider registers its own typed key without circular dependencies.

Implementation uses Obj.Extension_constructor.id for key identity and Obj.magic for type recovery — type-safe by construction since matching extension constructor IDs guarantee identical type parameters. This is the standard pattern used by Printexc and other stdlib modules. OCaml 5.1+ Type.eq would replace this with a first-class witness.

Sourcetype _ key = ..

Extensible GADT — each provider adds a constructor via +=.

Sourcetype entry =
  1. | Entry : 'a key * 'a -> entry

Existential wrapper: a typed key paired with its value.

Sourcetype t = entry list

A bag of provider-specific options.

Sourceval empty : t
Sourceval set : 'a key -> 'a -> t -> t

Add or replace an option keyed by the GADT constructor.

Sourceval find : 'a key -> t -> 'a option

Look up an option by key. Returns None if absent.

Sourceval find_exn : 'a key -> t -> 'a

Look up an option by key. Raises Not_found if absent.

Sourcetype key +=
  1. | Provider_metadata : Yojson.Basic.t key

GADT key for raw provider metadata from upstream re-submissions. Stores the upstream providerMetadata JSON blob (Record<string, Record<string, JsonValue>>). Each provider reads its own namespace (e.g. "anthropic").

Sourceval of_provider_metadata : Yojson.Basic.t -> t

Create a t containing only raw provider metadata.

Sourceval provider_metadata : t -> Yojson.Basic.t option

Extract raw provider metadata if present.