Solidway v0.1.0 is released under AGPL-3.0; source and releases are on GitHub. This documentation is being rewritten against the release — pages outside Quick start and Reference still describe planned behaviour. The current reference lives in docs/getting-started.md and docs/architecture.md in the repository.
Transparent forwarding
What the forward path preserves, the two things it changes, and how a route is resolved.
The forward path has one job: move the bytes from the client to the provider and back without changing them. This page lists both sides honestly — what survives untouched, and the short list of exceptions.
What reaches the provider unchanged
- Request body — byte for byte, apart from the model alias exception below.
- Response body — byte for byte, including the model alias exception in the other direction.
- Prompt prefix — never rewritten, so provider-side prompt caching keeps working.
- Streaming frame boundaries — see Streaming.
Two honest exceptions
1. Model aliases. If a credential maps a client-facing model name to a different
upstream id, the gateway rewrites the top-level model field in the request body, and
writes the client-facing name back into the response’s top-level model. Nothing else in
the body is touched. When the alias equals the upstream id, the body is not modified at all.
2. Header order and casing are not preserved. Headers are forwarded by value, but the HTTP layer stores them in a map: order and original casing may be normalised. Providers that signature-check raw header bytes are not supported by this path.
What is added or changed on the way out
| Change | Reason |
|---|---|
| One credential header or signature | Authenticating to the upstream account |
Host |
The request is addressed to the provider, not to the gateway |
| Hop-by-hop headers dropped | Required by HTTP/1.1 and HTTP/2 |
| Path replaced by the rendered endpoint | The upstream path comes from the credential’s template ({model}, {action}, project/location, …) |
What is read without being changed
- The API key, to resolve the route.
- The model name, for alias mapping and selection.
- Usage counters, for accounting.
Reading for accounting is not rewriting: the bytes forwarded are the bytes received.
How a request finds a route
There are four inbound endpoints, each belonging to a protocol family:
| Endpoint | Family |
|---|---|
POST /v1/chat/completions |
OpenAI Chat Completions |
POST /v1/responses |
OpenAI Responses |
POST /v1/messages |
Anthropic Messages |
POST /v1/messages/count_tokens |
Anthropic Messages |
The API key in the request resolves the route; the path decides the protocol family. Any
other path returns 404. A missing or unknown key returns 401, and a disabled route
returns 403. The gateway does not translate between families — a request is forwarded in
the dialect it arrived in.