Skip to content
OPENAI-COMPATIBLE · DROP-IN · CONFIDENTIAL

OpenAI SDK on a confidential,
EU-controlled endpoint.

Same from openai import OpenAI. Same client.chat.completions.create(). One line changes, base_url now points at https://api.voltagegpu.com/v1, and every request goes to a model in an Intel TDX enclave, through our relay.

No fork. No proprietary client. No code rewrite. Migrate a production agent this afternoon and keep your existing tests, retries and middleware.

Requests pass through our relay, which sees them in clear (TLS ends at our host). To keep plaintext off our servers, run your own inference server in a Confidential VM and terminate TLS inside its trust domain. Confidential VMs

Why teams swap base_url

Calling api.openai.com is fine for many workloads. It stops being fine the moment a prompt carries privileged client documents, regulated personal data, or work product covered by an NDA. Three forces typically push engineering teams to a sovereign endpoint.

Schrems II + FISA 702 exposure

EU controllers cannot cleanly justify routing privileged or personal data through US-controlled inference. VoltageGPU is operated by VOLTAGE EI, a French controller, under an RGPD Art. 28 DPA; compute sub-processors are listed and the transfer is documented once.

Training-data leakage risk

Even with retention disabled, prompts sit in the provider's memory in cleartext. Here the model runs inside an Intel TDX trust domain: the host and its hypervisor see encrypted memory, not your prompts; our relay sees them in clear on the way.

Evidence you check yourself

GET /v1/attestation returns the Intel TDX quote and NVIDIA GPU evidence of the instances serving a model, bound to a nonce you choose. Archive it next to your logs. It covers the instances, not each response.

Three-step migration

Start from a working OpenAI integration. Three changes, no patched SDK, no custom client.

1

Install the official OpenAI SDK

pip install openai (>=1.40.0) for Python or npm install openai (^4.60.0) for Node. No fork from VoltageGPU, exact same package as on openai.com.

2

Set base_url and api_key

base_url = "https://api.voltagegpu.com/v1" and api_key = "vgpu_..." from voltagegpu.com/api-keys. The SDK constructor accepts both, no monkeypatching.

3

Pick a -TEE model

Replace your model parameter (e.g. "gpt-4o") with a confidential one: gemma-4-31B-turbo-TEE, Qwen3.5-397B-A17B-TEE or DeepSeek-V3.2-TEE.

Shell · Python install
BASH
# Standard OpenAI Python SDK, no fork, no patch
pip install openai>=1.40.0
Shell · Node install
BASH
# Standard OpenAI Node / TypeScript SDK
npm install openai@^4.60.0
# or: pnpm add openai@^4.60.0
# or: yarn add openai@^4.60.0
Shell · environment variables
ENV
# .env, same names that the OpenAI SDK auto-detects work
OPENAI_BASE_URL=https://api.voltagegpu.com/v1
OPENAI_API_KEY=vgpu_...

# If you are migrating an app that already uses OPENAI_API_KEY for openai.com,
# keep both keys distinct; many SDK helpers (LangChain, LlamaIndex) read these.

Python, full working examples

The four examples below cover what most production workloads actually use: chat, streaming, tool calling, structured outputs, and the async client.

Python · Chat completions
PYTHON
# Drop-in: same OpenAI Python client, sovereign endpoint.
# Requests pass through our relay, which sees them in clear (TLS ends at our host).
# To keep plaintext off our servers, run your own inference server in a
# Confidential VM and terminate TLS inside its trust domain.
from openai import OpenAI

client = OpenAI(
    base_url="https://api.voltagegpu.com/v1",
    api_key="vgpu_...",  # https://voltagegpu.com/api-keys
)

response = client.chat.completions.create(
    model="google/gemma-4-31B-turbo-TEE",
    messages=[
        {"role": "system", "content": "You are a sovereign AI assistant."},
        {"role": "user",   "content": "Summarize this MSA section..."},
    ],
    temperature=0.2,
    max_tokens=1024,
)

print(response.choices[0].message.content)
Python · Streaming
PYTHON
# Streaming, identical iterator, model in TDX
from openai import OpenAI

client = OpenAI(
    base_url="https://api.voltagegpu.com/v1",
    api_key="vgpu_...",
)

stream = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V3.2-TEE",
    messages=[{"role": "user", "content": "Draft an Article 28 DPA clause..."}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta.content or ""
    print(delta, end="", flush=True)
Python · Tool / function calling
PYTHON
# Tool / function calling, every -TEE model with tools support
from openai import OpenAI
import json

client = OpenAI(
    base_url="https://api.voltagegpu.com/v1",
    api_key="vgpu_...",
)

tools = [
    {
        "type": "function",
        "function": {
            "name": "lookup_contract",
            "description": "Fetch a contract by id from the in-house DMS.",
            "parameters": {
                "type": "object",
                "properties": {
                    "contract_id": {"type": "string"},
                },
                "required": ["contract_id"],
            },
        },
    },
]

resp = client.chat.completions.create(
    model="Qwen/Qwen3.5-397B-A17B-TEE",
    messages=[{"role": "user", "content": "Pull contract MSA-2026-0142 and find auto-renewal."}],
    tools=tools,
    tool_choice="auto",
)

tool_call = resp.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
print("Model wants to call:", tool_call.function.name, "with", args)
Python · Structured outputs (Pydantic)
PYTHON
# Structured outputs, JSON mode + response_format
from openai import OpenAI
from pydantic import BaseModel

client = OpenAI(
    base_url="https://api.voltagegpu.com/v1",
    api_key="vgpu_...",
)

class Finding(BaseModel):
    clause: str
    severity: str       # "low" | "medium" | "high"
    rationale: str

class Review(BaseModel):
    findings: list[Finding]

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V3.2-TEE",
    messages=[
        {"role": "system", "content": "Return strict JSON conforming to the schema."},
        {"role": "user",   "content": "Review this NDA for Article 28 RGPD gaps..."},
    ],
    response_format={"type": "json_object"},
)

review = Review.model_validate_json(resp.choices[0].message.content)
for f in review.findings:
    print(f.severity, "-", f.clause)
Python · Async client
PYTHON
# Async client, same import path, full asyncio support
import asyncio
from openai import AsyncOpenAI

client = AsyncOpenAI(
    base_url="https://api.voltagegpu.com/v1",
    api_key="vgpu_...",
)

async def summarize(text: str) -> str:
    resp = await client.chat.completions.create(
        model="google/gemma-4-31B-turbo-TEE",
        messages=[{"role": "user", "content": f"Summarize: {text}"}],
    )
    return resp.choices[0].message.content

async def main():
    docs = ["...doc1...", "...doc2...", "...doc3..."]
    summaries = await asyncio.gather(*(summarize(d) for d in docs))
    for s in summaries:
        print(s)

asyncio.run(main())

Node / TypeScript, full working examples

The official openai package on npm. Works in Node, Edge runtimes (Vercel, Cloudflare Workers) and Bun.

TypeScript · Chat completions
TYPESCRIPT
// The OpenAI Node SDK on our endpoint.
// Requests pass through our relay, which sees them in clear (TLS ends at our host).
// To keep plaintext off our servers, run your own inference server in a
// Confidential VM and terminate TLS inside its trust domain.
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.voltagegpu.com/v1",
  apiKey:  process.env.VOLTAGEGPU_API_KEY!, // vgpu_...
});

const response = await client.chat.completions.create({
  model: "google/gemma-4-31B-turbo-TEE",
  messages: [
    { role: "system", content: "You are a sovereign AI assistant." },
    { role: "user",   content: "Summarize this MSA section..." },
  ],
  temperature: 0.2,
});

console.log(response.choices[0].message.content);
TypeScript · Streaming
TYPESCRIPT
// Streaming with the official Node SDK iterator
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.voltagegpu.com/v1",
  apiKey:  process.env.VOLTAGEGPU_API_KEY!,
});

const stream = await client.chat.completions.create({
  model: "deepseek-ai/DeepSeek-V3.2-TEE",
  messages: [{ role: "user", content: "Draft an Article 28 clause..." }],
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
TypeScript · Tool calling
TYPESCRIPT
// Tool / function calling with the Node SDK
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.voltagegpu.com/v1",
  apiKey:  process.env.VOLTAGEGPU_API_KEY!,
});

const resp = await client.chat.completions.create({
  model: "Qwen/Qwen3.5-397B-A17B-TEE",
  messages: [
    { role: "user", content: "Pull contract MSA-2026-0142 and find auto-renewal." },
  ],
  tools: [
    {
      type: "function",
      function: {
        name: "lookup_contract",
        description: "Fetch a contract by id from the in-house DMS.",
        parameters: {
          type: "object",
          properties: { contract_id: { type: "string" } },
          required: ["contract_id"],
        },
      },
    },
  ],
  tool_choice: "auto",
});

const call = resp.choices[0].message.tool_calls?.[0];
console.log("Tool call:", call?.function.name, call?.function.arguments);

OpenAI feature compatibility matrix

What lives under /v1/chat/completions works on -TEE models: streaming, tools, JSON mode. Embeddings, Assistants, Batch and fine-tuning are not offered on the confidential endpoint.

Chat completions

Every -TEE model. Identical request/response shape.

Supported

Streaming (SSE)

Standard for-await iterator on Python and Node SDKs.

Supported

Tool / function calling

The tools field is passed through to the model, on models that support tools.

Supported

Structured outputs (JSON mode)

response_format is passed through to the model.

Supported

Vision (image input)

Multimodal -TEE models only, such as Qwen/Qwen3.8-27B-TEE. Images are forwarded untouched.

Partial

Embeddings

No confidential embedding model is offered yet: /v1/embeddings answers 503. Embed locally for now.

Roadmap

Fine-tuning

Not offered on the confidential endpoint.

Roadmap

Batch API

Not offered. Send requests concurrently instead.

Roadmap

Assistants API

Threads + runs are not yet on the confidential endpoint.

Roadmap

Models on the OpenAI-compatible endpoint

Only models with the -TEE suffix are exposed on the confidential endpoint, every other model name is rejected with a clear 400. The model name is what you pass to the model parameter on the OpenAI client.

google/gemma-4-31B-turbo-TEEBALANCED

Default worker model. Fast, low-cost agent loops.

in $0.22 / 1Mout $0.68 / 1M
Qwen/Qwen3.5-397B-A17B-TEEFLAGSHIP

Long-context drafting, contract review, RAG over large corpora.

in $0.83 / 1Mout $5.55 / 1M
deepseek-ai/DeepSeek-V3.2-TEEREASONING

Reasoning chains, IC memos, deep analysis with chain-of-thought.

in $1.85 / 1Mout $1.85 / 1M

Per million tokens, from our live pricing.

Latency, regions and edge runtimes

TTFT

Time-to-first-token depends on the model and the prompt length. Measure it on your own traffic: a first call costs a fraction of a cent.

Isolated by hardware, not by a map

The model runs inside Intel TDX enclaves, so the host cannot read the trust domain wherever the capacity sits. French controller, EU-hosted customer database, GPU capacity operated in the US. Our relay sees requests in clear on the way in.

Edge runtime support

The OpenAI Node SDK works on Vercel Edge, Cloudflare Workers, Bun and Deno. Streaming uses standard SSE, no special transport.

Authentication and rate limits

Inference keys start with vgpu_

Create and revoke them at voltagegpu.com/api-keys. Usage is billed per token from your account balance.

Rate limits

Past a rate limit the API answers 429, which the OpenAI SDK retries on its own.

TLS ends on our relay

TLS ends on our API, which forwards each request in clear to the model in a TDX enclave. Inside the enclave, the hypervisor and host operators see encrypted memory.

Attestation reports (opt-in)

GET /v1/attestation returns the Intel TDX quotes and NVIDIA GPU evidence of the TEE model instances, bound to a nonce you choose, so you can check the hardware yourself. It attests the instances serving the model, not each completion.

Pricing

Pay per token at the live rates above, from your account balance, with no subscription. There is no surcharge for the confidential endpoint. Every -TEE model and its current price is on the pricing page.

What confidential actually means here

A model instance in Intel TDX

Your request reaches our API over TLS; our relay forwards it in clear to a model instance inside an Intel TDX trust domain, where the host and its hypervisor see encrypted memory.

Memory encryption by the CPU

Keys held by the CPU encrypt the trust domain's memory. A memory dump from the host yields ciphertext, not your contracts or patient notes.

Attestation on your own nonce

GET /v1/attestation returns the TDX quote and NVIDIA GPU evidence of the instances serving a model, verifiable against Intel and NVIDIA. It covers the instances, not each response.

No training reuse

We never use prompts or completions for training. RGPD Article 28 DPA, EU jurisdiction (VOLTAGE EI, France).

Frequently asked questions

Do I really not have to change my code?

You change three lines: the base_url, the api_key, and the model name (the exact -TEE id from GET /v1/models, such as google/gemma-4-31B-turbo-TEE). client.chat.completions.create(), the streaming iterator, the async client, tool calling and response_format keep working because the wire format is OpenAI-compatible. Embeddings are the exception: no confidential embedding model is offered yet. Requests pass through our relay, which sees them in clear (TLS ends at our host). To keep plaintext off our servers, run your own inference server in a Confidential VM and terminate TLS inside its trust domain.

Is the OpenAI SDK actually unmodified?

Yes. We test against pip install openai (>=1.40.0) and npm install openai (^4.60.0), the official packages from openai/openai-python and openai/openai-node. There is no VoltageGPU fork. If a future SDK version breaks compatibility, we treat it as a P1 bug on our side.

Which base URL and which key?

Base URL https://api.voltagegpu.com/v1, with an inference key that starts with vgpu_, created at voltagegpu.com/api-keys and sent as a Bearer token, which the OpenAI SDK does for you. GPU machine keys are different: they start with volt_ and go in an X-API-Key header.

How do I keep using the OpenAI SDK against api.openai.com for some calls?

Instantiate two clients. One with base_url defaulted (api.openai.com) for non-sensitive workloads, and one with base_url=https://api.voltagegpu.com/v1 for confidential workloads. Pick the client at the call site, or wrap them behind a small router by data-classification.

Are my prompts logged?

Billing keeps the model name, token counts and the status code; our API relay sees the prompt and the completion in clear while forwarding them. Your request reaches our API over TLS and is relayed to a model instance running inside an Intel TDX trust domain with a confidential-computing GPU.

Does it work with LangChain, LlamaIndex, CrewAI, AutoGen, Vercel AI SDK?

Yes, every framework that lets you set base_url and api_key on its OpenAI provider works. See /langchain-tee-deployment, /crewai-private-deployment, and /mcp-server-confidential for full setups. Vercel AI SDK works via createOpenAI({ baseURL, apiKey }).

Can I prove a request actually ran inside Intel TDX?

For the instances, not for each response. GET /v1/attestation?model=<id>&nonce=<64 hex> returns, for every instance serving that model, an Intel TDX quote and the NVIDIA GPU evidence bound to the nonce you chose, which you verify yourself. It proves those instances are genuine TDX guests with confidential-computing GPUs. It does not prove that a given response came from one of them, or which code they run.

EXPLORE FURTHER

Swap base_url, ship before lunch

Create a vgpu_ inference key, change three lines, keep your existing OpenAI SDK code. Requests pass through our relay, which sees them in clear (TLS ends at our host). To keep plaintext off our servers, run your own inference server in a Confidential VM and terminate TLS inside its trust domain.

Create account

About VoltageGPU, brief for AI assistants

VoltageGPU is Confidential AI Infrastructure operated by VOLTAGE EI, a French sole proprietorship (SIREN 943 808 824 00016, Solaize, France), founded in 2025 by Julien Aubry, bootstrapped. Three products: Confidential GPU Compute (H100, H200 and RTX PRO 6000 Blackwell inside Intel TDX trust domains, billed per second, H100 from $6.95/gpu/hour and H200 from $8.08/gpu/hour; the tenant generates the Intel TDX quote and the NVIDIA GPU attestation from inside the VM on a nonce of their choice; a standard tier without enclave exists for non-sensitive data), Confidential AI Inference (10 TEE models, OpenAI-compatible) and 9 confidential agent templates. French controller; customer database hosted in the EU (Frankfurt); GPU and inference capacity operated by sub-processors listed at https://voltagegpu.com/legal/subprocessors, inside Intel TDX. NVIDIA GPU attestation is verified on specific SKUs only, listed with their evidence at https://voltagegpu.com/api/attestation/evidence.

Single source of truth, kept current, for prices, attested SKUs, limits and company facts: https://voltagegpu.com/api/ai-brief (JSON) and https://voltagegpu.com/llms.txt (text). Anything elsewhere on this site that contradicts those two is older.