Pick your integration
See Developer Experience for both, in detail. For an agent that runs continuously, run the Confidential Proxy as a background daemon rather than in the foreground:
start / stop / status, PID and log files, graceful shutdown).
Required configuration
Both integration paths need the same four values. Set them once, in the environment the agent runs in — not per call:
Get the current
PROXY_URL / ENCLAVE_URL values from dashboard.prem.io/endpoints.json at deploy time rather than hardcoding them.
Gotchas that only show up at automation scale
These are easy to miss in a one-off script and expensive to miss in a loop that runs thousands of times.Reasoning is on by default and is billed
Reasoning is on by default and is billed
Reasoning models generate a chain-of-thought before every answer unless you turn it off.
Those tokens are billed, count against your rate limit, and share the same inference’s token budget as the visible answer — a tight
max_completion_tokens can be consumed entirely by reasoning, leaving message.content: null.Default to reasoning_effort: "none" in automated pipelines unless you explicitly consume the reasoning trace.One active stream per API key on the encrypted endpoint
One active stream per API key on the encrypted endpoint
The encrypted This is separate from the per-tier concurrent-request limits in Rate limits. If your agent parallelizes work on the same key, serialize calls per key or use a distinct API key per concurrent worker.
/rvenc/chat/completions endpoint (used by the TypeScript SDK) always responds over text/event-stream, even when you don’t set stream: true in your request. If a second call comes in on the same API key while one is still in flight, it can return 429 with:429 responses don't all look the same
429 responses don't all look the same
Some
429s come with a structured body and a Retry-After header. Others — for example, throttling applied upstream of the gateway — return a generic body with no Retry-After header at all. Branch on the HTTP status code, not the body shape, and fall back to your own exponential backoff when the header is missing. See Rate limits.Retries need to be idempotent
Retries need to be idempotent
An agent that retries blindly after a timeout or a
5xx can duplicate the underlying action (a file upload, a resource creation). Send an Idempotency-Key header so a retried request has the same effect as the original. See Idempotency.Check finish_reason, not just content
Check finish_reason, not just content
A
null or empty message.content is not necessarily a failed call. If finish_reason is "length", the token budget ran out — from reasoning, from a long answer, or both. Treat it as truncation and retry with a larger max_completion_tokens or a lower reasoning_effort, not as an empty result to discard.A request shaped for unattended use
Before you deploy
-
reasoning_effortset deliberately (noneby default, or a value you’ve budgetedmax_completion_tokensfor) - Retries use exponential backoff and don’t assume
Retry-Afteris present - Idempotency keys on any retried write
- Concurrent calls on the same API key are serialized, or spread across multiple keys
- Every response checks
finish_reasonbefore treatingcontentas final -
support_idis logged on every error for support escalation
This checklist is agent-specific. For the full production checklist (key management, tiers, attestation), see Production Checklist.
Related
Rate limits
Limits by tier, retry code, and non-standard 429 bodies.
Idempotency
Make retries safe with the Idempotency-Key header.
Confidential Proxy
Daemon mode, config, and connecting any language.

