Skip to content
Spice Framework on GitHub

Dependency review

openai-providerMaturity: experimentalSource: spice-agent-provider-openai@dd57781Exact reviewed source

Decision

Approved runtime dependencies are pinned to:

  • github.com/spice-framework/spice-agent v0.0.0-20260806225954-af79fc7fe4ad
  • github.com/openai/openai-go/v3 v3.50.0

The first supplies the exact provider-neutral contracts and bounds. The second is OpenAI’s official generated Go SDK for the Responses API. Both are Apache-2.0. Licenses are retained in committed vendor contents. Version changes require API, maintenance, license, vulnerability, cancellation, retry, and generated-dependency review.

Ownership and dependency direction

This adapter depends on the agent SPI; the agent kernel never depends on this provider. It constructs an instance-owned responses.ResponseService with explicit options and exposes only model.Provider. No raw SDK client, response, or stream crosses the public boundary.

Spice core is pinned at v0.1.0-preview.1.0.20260806200749-524424a04df0, and the toolchain is pinned at v0.1.0-preview.1.0.20260806203056-d0b9ac086bd6. The compiler is authorized by the standard Go tool directive. All runtime and build modules participate in ordinary Go selection, checksums, vendoring, and offline verification; there is no custom dependency system.

Security and privacy

  • The provider does not call openai.NewClient, so it does not capture ambient OPENAI_* variables.
  • API keys arrive only through explicit typed configuration and are secret marked. Configuration and error strings redact them.
  • Only absolute HTTPS endpoints without URL user information are accepted.
  • Prompt/output content, tool arguments/results, headers, URLs, credentials, raw response bodies, and raw SDK objects are excluded from metadata.
  • Construction performs no network operation and starts no goroutine.

Cancellation and retry

Each operation derives from the caller context. After synchronously acquiring the first response event, one bounded pump owns the SDK stream; Close cancels and joins it. A separate Recv deadline does not create an unbounded helper goroutine. Configuration accepts request timeouts from greater than zero through thirty minutes; zero selects the two-minute default. One receiver may race with Close safely. Application-supplied transports remain trusted cooperative code and must honor context cancellation or close.

The SDK retry count is explicit and bounded to 0–8. A stable hashed idempotency key is supplied for startup attempts. The adapter never retries after returning a stream, and the engine does not retry after observing an event. Ambiguous or partial streams are therefore never replayed by this module.

Observability

Provider metadata is optional, bounded, namespaced, and application-allowlisted. The only permitted fields are response ID, request ID, model, status, service tier, and HTTP status. Usage remains provider-neutral core data. Live testing is opt-in and never prints prompts, outputs, keys, authorization headers, or raw provider errors.