InferNode
InferNode is the Saptiva model gateway. It exposes the models in your infrastructure and those of external providers behind a single OpenAI-compatible API. Studio agents and workflows use it without you configuring anything; you can also call it from your own code.
What it does for you
- Batch work. Thousands of requests in a file, which run on their own and do not use up your requests per minute (Process requests in batches).
- A single access point. You switch models by changing the name in the request, not the integration. Call by the public alias (
Saptiva Turbo): a stable name the administrator keeps pointing at the current model. The exact Catalog name (Qwen3.6 35B A3B (FP8)) works too, but it changes when the model is updated, and then your code no longer finds it (Choose a model: use the alias). - Limits per plan. Five counters: requests per minute and per day, tokens per minute and per day, and images per minute. They apply per organization, per user and per key. Each response indicates how much you have left in the
X-RateLimit-*headers; a429carriesRetry-Afterand the counter that was exceeded. - Credits. Each call has a cost in credits (USD) that is deducted from the Client's balance; the response includes the cost (
X-Request-Cost) and the remaining balance (X-Credits-Remaining).X-Credits-Warningappears when the balance is low. A plan can be billing-exempt (common in on-prem installations): in that caseX-Request-Coststill reports the theoretical cost, but nothing is deducted and there is noX-Credits-Remaining. The administrator can set spending caps per organization, user or key. - Content guards. Optionally, conversations are evaluated against risk categories with a guard model from the Catalog and are logged with their category.
- Traceability. Each request carries
X-Request-Id; it is what Saptiva AI needs to investigate a call.
How a call is counted
Input tokens (your prompt, the history and the documents the agent includes) cost less than output tokens, and the price per token depends on the model (GET /v1/models/{name} shows it). An agent with Historial amplio (Wide history) and Longitud larga (Long length) consumes several times more credits per message than one with normal history and short length.
Endpoints
| Endpoint | What for |
|---|---|
POST /v1/chat/completions | Conversation with a model. Supports streaming, tools, JSON format. |
POST /v1/embeddings | Vectors for semantic search (Embeddings-type models). |
POST /v1/images/generations | Image generation (asynchronous: it returns a job that you check with GET /v1/images/generations/{job_id}). |
POST /v1/guard | Evaluate a text against the content guards without generating a response. |
GET /v1/models | Models available for your key, with type, capabilities, context, maximum output and price per token. |
GET /v1/models/{name} | A model's details. If name is an alias, it responds with X-Alias-Of. |
GET /v1/models/aliases | Public aliases (stable names that point to a model). |
GET /v1/me | Your identity, plan and limits. |
GET /v1/billing/balance | Balance, plan, spending caps and the month's usage. |
GET /v1/billing/usage?period=AAAA-MM | The month's usage: requests, input and output tokens, cost, breakdown by model, by key and by day. |
GET /v1/billing/transactions | Credit movements (debit and credit) with totals for the period. |
Response headers
| Header | Meaning |
|---|---|
X-Request-Id | Request identifier. Include it in any report. |
X-RateLimit-Limit-Requests, X-RateLimit-Remaining-Requests, X-RateLimit-Reset-Requests | Limit, remaining amount and reset time, in requests. |
X-RateLimit-Limit-Tokens, X-RateLimit-Remaining-Tokens, X-RateLimit-Reset-Tokens | The same, in tokens. |
X-Request-Cost, X-Credits-Remaining, X-Credits-Warning | Cost of this call, balance, and a warning when the balance is low. |
X-Model-Deprecated, X-Model-Retires-At | The model is being retired, and the date on which it will stop responding. The model's details (deprecation) indicate what to replace it with. |
X-Alias-Of | Only on a model's details (GET /v1/models/{name}) requested by alias: it names the model the alias points at. Inference responses do not carry it; there the model that answered comes in the model field. |
X-Saptiva-Passthrough, X-Saptiva-Model-Defaults | Parameters that were forwarded to the model without validation, and default values the administrator set for that model. |
Content guards
POST /v1/guard receives input (a list of messages with role and content, up to 128) and optionally model, and returns the score for each active risk category (code, label, severity). With guard: true in chat/completions, the evaluation runs on the complete conversation after responding and is logged; GET /v1/guard/events lists the evaluations of your Client. Guard models appear in the Catalog with the type Otros (Other), for example a content safety model.
Errors
The envelope is the OpenAI one with two more fields: code, with the module as a prefix when applicable, and request_id.
{
"error": {
"type": "authentication_error",
"code": "identity.invalid_token",
"message": "Missing or malformed bearer token.",
"param": null,
"request_id": "req_3026fcfe4c8c4a59b4fc82a5db8ae6da"
}
}
| HTTP code | type | What happened |
|---|---|---|
| 401 | authentication_error | identity.invalid_token: the header is missing or malformed. identity.unauthorized: the key does not exist, was revoked, or its account or organization is suspended ("Token is invalid, revoked, or for a suspended org / disabled user"). |
| 403 | permission_error | The key does not have access to that model or resource. |
| 404 | not_found_error (model_not_found) | The model name does not exist for your plan. |
| 402 | billing_error (insufficient_credits) | No credits. |
| 429 | rate_limit_error (rate_limit_exceeded) | Request or token limit. Wait for as long as X-RateLimit-Reset-* indicates. |
| 502 | provider_error | The model provider failed. Retry with exponential backoff. |
| 503 | maintenance_error | Scheduled maintenance. |