skyl's entire function is sending your users' text to a third party. This page says exactly what leaves your process, derived from the code rather than from intent — written for the person who has to answer "where does the prompt go?" in a privacy review.
Short version#
- Everything you put in a
Requestis transmitted to the provider you chose. - The library keeps nothing after a call returns, and logs nothing, ever.
- The gateway logs metadata only — with one exception, named below.
- Nothing is written to disk unless you explicitly turn on cassette recording.
What leaves your process#
Everything in the Request#
Every field of skyl.Request is transmitted: System, Messages (all text,
images, tool calls and tool results), Tools, Model, sampling parameters, and
ProviderOptions verbatim.
The credential#
One header per provider:
| Adapter | Header |
|---|---|
| openai / openaicompat | Authorization: Bearer |
| anthropic | X-Api-Key |
| gemini | x-goog-api-key |
Gemini's key is deliberately a header rather than a URL parameter, so it does not land in proxy access logs.
Two negotiation headers#
Content-Type and Accept. That is the complete list skyl adds — no
User-Agent, no client identifier, no request ID.
One exception: the Anthropic adapter#
What is kept in memory#
Response.Raw holds the provider's whole body for the life of the response. In
a batch pipeline holding thousands of responses, that is the heap — extract what
you need and drop the reference.
Client itself holds no per-request state. Request is retained only for
the duration of the call, and is reused across retries.
What is written to disk#
Nothing, unless you turn on cassette recording — the mechanism that records real provider exchanges for offline replay. Credentials are scrubbed on write, and a test walks every committed fixture looking for credential-shaped strings.
What is logged#
The library logs nothing. It has no logger and takes no logging dependency.
The gateway logs method, path, status, duration, request ID, and the caller
label from SKYL_AUTH_TOKENS — never headers, never bodies, never tokens.
skyl/otel records model, sampling parameters and token counts. No prompt
content, deliberately: a span is a durable record shipped to a third-party
backend.
Errors#
*skyl.Error carries provider, status, message, retry hint, and up to 2 KB
of the provider's error body. It never contains credentials — there is a
test asserting this.
The gateway deliberately does not forward provider error bodies to callers: they can echo request content back to someone who should not see it.
For your privacy review#
| Question | Answer |
|---|---|
| Where does the prompt go? | To the provider you constructed. skyl chooses no default provider and no default host. |
| Does skyl retain it? | No. Nothing after the call returns. |
| Does skyl log it? | No. The library has no logger. |
| Does skyl write it to disk? | Only with cassette recording explicitly enabled. |
| Can I audit egress? | Yes — supply your own *http.Client, or route everything through the gateway. |
| What about sub-processors? | The provider's business. skyl adds none. |
See also#
- Threat Model — trust boundaries and what an authenticated caller can do.
- Security Policy — reporting a vulnerability.
- Credentials — where keys should live.