Architecture
This module is an isolated adapter from OpenAI’s Responses API to the public Spice Agent model contract.
The root package owns validated configuration and an instance-scoped Responses
service. Client.Stream performs a deterministic, bounded translation from a
validated model.Request; the request’s model is authoritative. The adapter
prefetches the first SDK event before returning a stream so startup failures can
be represented as model.ProviderError. One bounded pump then owns the raw SDK
stream, allowing each Recv call to honor its own context without leaking one
goroutine per deadline. Close may race with the sole Recv caller, cancels
the operation, and joins that pump. Multiple concurrent Recv calls are not
supported.
Only finalized function calls from the completed response become Spice tool calls. This prevents partial argument deltas from becoming executable work. Unknown tools, provider-hosted executable output, malformed arguments, duplicate call IDs, inconsistent final text, and limit violations fail closed. The adapter does not expose provider reasoning or raw SDK objects. Tool effects, replay safety, capabilities, and fingerprints are authoritative host policy and identity metadata. Translation deliberately sends only the function name, description, and JSON input schema to OpenAI, so policy-only changes cannot alter or disclose provider request content.
autoconfigure is the only library-default activation surface. It is selected
solely by an explicit blank import and contributes one fallback
model.Provider; an application-owned provider replaces it through ordinary
Spice DI. The root package has no activation side effect.
The adapter may depend on spice-agent and openai-go; neither dependency may
depend back on this repository. It does not own an agent loop, dispatcher,
daemon, registry, service locator, or package scanner. Callers own contexts and
engine metadata allowlists. No retry occurs after a stream has been returned.
An application-supplied http.Client and transport are trusted. Spice supplies
the bounded request context and calls stream close, but cannot safely force-stop
a transport that ignores both cancellation and close. Such a transport may
prevent Close from joining and is outside this module’s cooperative contract.