The Tresor API follows the OpenAI request and response shape for both chat completions and audio transcriptions, so existing OpenAI SDKs work. You only need to change two things in your existing code:
https://api.tresor.co/v1.tr-).For supported parameters and known limitations, see the chat completions reference and the audio transcriptions reference.
Tresor-specific request body fields such as region, provider, and chat-completions failover go through extra_body in OpenAI SDKs. Router control headers such as X-Tresor-Receipt and X-Tresor-Timeout-Seconds go through extra_headers. See Routing failover for the routing-specific semantics.
tresor-attest.pip install openai
npm install openai
go get github.com/sashabaranov/go-openai
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.tresor.co/v1",
)
stream = client.chat.completions.create(
model="gpt-oss-120b",
messages=[{"role": "user", "content": "Hello!"}],
stream=True,
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.tresor.co/v1",
});
const stream = await client.chat.completions.create({
model: "gpt-oss-120b",
messages: [{ role: "user", content: "Hello!" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || "");
}
package main
import (
"context"
"fmt"
openai "github.com/sashabaranov/go-openai"
)
func main() {
cfg := openai.DefaultConfig("YOUR_API_KEY")
cfg.BaseURL = "https://api.tresor.co/v1"
client := openai.NewClientWithConfig(cfg)
resp, err := client.CreateChatCompletion(context.Background(),
openai.ChatCompletionRequest{
Model: "gpt-oss-120b",
Messages: []openai.ChatCompletionMessage{
{Role: "user", Content: "Hello!"},
},
},
)
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
}
Every chat completion comes back with a tresor.receipt_id field (or chunk on a stream's finish event) that you can later fetch and verify — see Verify a receipt.
Streaming remains the preferred path for long-running generations. For the cases where you intentionally want stream=False, the router keeps the default timeout at 180s and accepts an optional X-Tresor-Timeout-Seconds header. Positive values below 180 shorten the budget, and values above 600 are clamped to the hard cap of 600s.
Use extra_headers for the timeout override and extra_body for Tresor body extensions:
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.tresor.co/v1",
)
resp = client.chat.completions.create(
model="eu/privatemode/gemma-4-31b",
stream=False,
messages=[{"role": "user", "content": "Translate the attached policy into German."}],
extra_headers={"X-Tresor-Timeout-Seconds": "600"},
extra_body={
"failover": ["auto/auto/gemma-4-31b"]
},
)
print(resp.choices[0].message.content)
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.tresor.co/v1",
defaultHeaders: {
"X-Tresor-Timeout-Seconds": "600",
},
});
const resp = await client.chat.completions.create({
model: "eu/privatemode/gemma-4-31b",
stream: false,
messages: [
{ role: "user", content: "Translate the attached policy into German." },
],
extra_body: {
failover: ["auto/auto/gemma-4-31b"],
},
});
console.log(resp.choices[0]?.message?.content);
The timeout override is valid only for chat completions when stream is omitted or false. Positive integer values below 180 are accepted and shorten the request budget. Values above 600 are clamped. Invalid, duplicate, fractional, or non-positive values return 400 invalid_timeout_override. If the request still times out at 600s, switch to streaming rather than increasing the synchronous wait further.
OpenAI SDKs can also call Tresor's transcription route.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.tresor.co/v1",
)
with open("meeting.webm", "rb") as audio:
transcript = client.audio.transcriptions.create(
model="auto/auto/whisper-large-v3",
file=audio,
response_format="json",
)
print(transcript.text)
import fs from "node:fs";
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.tresor.co/v1",
});
const transcript = await client.audio.transcriptions.create({
model: "auto/auto/whisper-large-v3",
file: fs.createReadStream("./meeting.webm"),
response_format: "json",
});
console.log(transcript.text);
:::
For request fields, supported upload types, and the verbose_json requirements, see Audio transcriptions.