The Transport Contract
All HTTP communication flows through a single contract:CanSendHttpRequests implementation. Each driver translates its domain request
into an HttpRequest, resolves the PendingHttpResponse, and normalizes the
result into its operation-specific response.
Default Client
When a runtime is created from config without an HTTP client, Polyglot creates a default one usingHttpClientBuilder. This applies to InferenceRuntime,
EmbeddingsRuntime, and DecisionRuntime:
DecisionRuntime::fromConfig(..., httpClient: $httpClient) when transport customization or mock HTTP behavior is required.
Decision owns its retry loop, so avoid wrapping Decision calls in a second HTTP
retry middleware.
HttpRequest and HttpResponse
These data objects represent the HTTP layer’s request and response. Drivers createHttpRequest objects through their request adapters and read HttpResponse objects through their response adapters.
HttpRequest
HttpResponse
TheHttpResponse interface provides access to the response data:
stream() method returns a Generator that yields chunks as they arrive from the provider. The driver’s response adapter parses these chunks into SSE events and then into PartialInferenceDelta objects.
Middleware
The HTTP client supports a middleware stack for cross-cutting concerns like logging, retries, caching, and authentication. Middleware implements theHttpMiddleware interface:
BaseMiddleware abstract class provides convenient hooks so you do not need to manage the chain manually:
Managing the Middleware Stack
TheMiddlewareStack supports named middleware for easy manipulation:
prepend() runs before middleware added with append(). The name parameter is optional but recommended — it allows you to replace or remove middleware later without tracking references.
Stream Cache Manager
For advanced use cases, Polyglot supports stream caching through theCanManageStreamCache contract. When provided, the stream cache manager can record and replay streaming responses, which is useful for testing and development:
ResponseCachePolicy enum on the InferenceRequest. You can set this through the facade: