OpenAI Chat Completions Configuration with AI Gateway
Control which providers serve your request, what happens when one fails, and how much of your prompt is cached between calls. For controlling how much a model thinks before answering, see Reasoning.
The AI Gateway can route your requests across multiple AI providers for better reliability and performance. You can control which providers are used and in what order through the providerOptions parameter.
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
const completion = await openai.chat.completions.create({
model: 'anthropic/claude-opus-5',
messages: [
{
role: 'user',
content:
'Tell me the history of the San Francisco Mission-style burrito in two paragraphs.',
},
],
stream: false,
// Provider options for gateway routing preferences
// AI Gateway extension fields are not included in the upstream SDK types.
...{
providerOptions: {
gateway: {
order: ['vertex', 'anthropic'], // Try Vertex AI first, then Anthropic
},
},
},
});
console.log('Assistant:', completion.choices[0].message.content);
console.log('Tokens used:', completion.usage);import os
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
completion = client.chat.completions.create(
model='anthropic/claude-opus-5',
messages=[
{
'role': 'user',
'content': 'Tell me the history of the San Francisco Mission-style burrito in two paragraphs.'
}
],
stream=False,
# Provider options for gateway routing preferences
extra_body={
'providerOptions': {
'gateway': {
'order': ['vertex', 'anthropic'] # Try Vertex AI first, then Anthropic
}
}
}
)
print('Assistant:', completion.choices[0].message.content)
print('Tokens used:', completion.usage)curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-opus-5",
"messages": [
{
"role": "user",
"content": "Tell me the history of the San Francisco Mission-style burrito in two paragraphs."
}
],
"stream": false,
"providerOptions": {
"gateway": {
"order": [
"vertex",
"anthropic"
]
}
}
}'You can specify fallback models that will be tried in order if the primary model fails. There are two ways to do this:
The simplest way is to use the models field directly at the top level of your request:
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
const completion = await openai.chat.completions.create({
model: 'openai/gpt-6-astra', // Primary model
// @ts-ignore - models is a gateway extension
...{
models: ['anthropic/claude-opus-5', 'google/gemini-3.6-flash'],
}, // Fallback models
messages: [
{
role: 'user',
content: 'Write a haiku about TypeScript.',
},
],
stream: false,
});
console.log('Assistant:', completion.choices[0].message.content);
// Check which model was actually used
console.log('Model used:', completion.model);import os
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
completion = client.chat.completions.create(
model='openai/gpt-6-astra', # Primary model
messages=[
{
'role': 'user',
'content': 'Write a haiku about TypeScript.'
}
],
stream=False,
# models is a gateway extension for fallback models
extra_body={
'models': ['anthropic/claude-opus-5', 'google/gemini-3.6-flash'] # Fallback models
}
)
print('Assistant:', completion.choices[0].message.content)
# Check which model was actually used
print('Model used:', completion.model)curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-6-astra",
"models": [
"anthropic/claude-opus-5",
"google/gemini-3.6-flash"
],
"messages": [
{
"role": "user",
"content": "Write a haiku about TypeScript."
}
],
"stream": false
}'Alternatively, you can specify model fallbacks through the providerOptions.gateway.models field:
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
const completion = await openai.chat.completions.create({
model: 'openai/gpt-6-astra', // Primary model
messages: [
{
role: 'user',
content: 'Write a haiku about TypeScript.',
},
],
stream: false,
// Model fallbacks via provider options
...{
providerOptions: {
gateway: {
models: ['anthropic/claude-opus-5', 'google/gemini-3.6-flash'], // Fallback models
},
},
},
});
console.log('Assistant:', completion.choices[0].message.content);
console.log('Model used:', completion.model);import os
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
completion = client.chat.completions.create(
model='openai/gpt-6-astra', # Primary model
messages=[
{
'role': 'user',
'content': 'Write a haiku about TypeScript.'
}
],
stream=False,
# Model fallbacks via provider options
extra_body={
'providerOptions': {
'gateway': {
'models': ['anthropic/claude-opus-5', 'google/gemini-3.6-flash'] # Fallback models
}
}
}
)
print('Assistant:', completion.choices[0].message.content)
print('Model used:', completion.model)curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-6-astra",
"messages": [
{
"role": "user",
"content": "Write a haiku about TypeScript."
}
],
"stream": false,
"providerOptions": {
"gateway": {
"models": [
"anthropic/claude-opus-5",
"google/gemini-3.6-flash"
]
}
}
}'Both configurations will:
- Try the primary model (
openai/gpt-6-astra) first - If it fails, try
anthropic/claude-opus-5 - If that also fails, try
google/gemini-3.6-flash - Return the result from the first model that succeeds
Provider options work with streaming requests as well:
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
const stream = await openai.chat.completions.create({
model: 'anthropic/claude-opus-5',
messages: [
{
role: 'user',
content:
'Tell me the history of the San Francisco Mission-style burrito in two paragraphs.',
},
],
stream: true,
...{
providerOptions: {
gateway: {
order: ['vertex', 'anthropic'],
},
},
},
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content;
if (content) {
process.stdout.write(content);
}
}import os
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
stream = client.chat.completions.create(
model='anthropic/claude-opus-5',
messages=[
{
'role': 'user',
'content': 'Tell me the history of the San Francisco Mission-style burrito in two paragraphs.'
}
],
stream=True,
extra_body={
'providerOptions': {
'gateway': {
'order': ['vertex', 'anthropic']
}
}
}
)
for chunk in stream:
content = chunk.choices[0].delta.content
if content:
print(content, end='', flush=True)curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-opus-5",
"messages": [
{
"role": "user",
"content": "Tell me the history of the San Francisco Mission-style burrito in two paragraphs."
}
],
"stream": true,
"providerOptions": {
"gateway": {
"order": [
"vertex",
"anthropic"
]
}
}
}'For more details about available providers and advanced provider configuration, see the Provider Options documentation.
Use the sort option to rank providers by cost, latency, or throughput. The gateway sorts the available providers by the chosen metric and tries them in that order.
| Value | Description | Direction |
|---|---|---|
'cost' | Sort by estimated cost | Lowest cost first |
'ttft' | Sort by time to first token (median, in ms) | Lowest latency first |
'tps' | Sort by tokens per second throughput (median) | Highest first |
You can pass sort through providerOptions.gateway:
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
const completion = await openai.chat.completions.create({
model: 'anthropic/claude-sonnet-5',
messages: [
{
role: 'user',
content: 'What is 2 + 2? Answer in one sentence.',
},
],
stream: false,
...{
providerOptions: {
gateway: {
sort: 'tps', // Use the highest throughput provider first
},
},
},
});
console.log('Assistant:', completion.choices[0].message.content);import os
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
completion = client.chat.completions.create(
model='anthropic/claude-sonnet-5',
messages=[
{
'role': 'user',
'content': 'What is 2 + 2? Answer in one sentence.'
}
],
stream=False,
extra_body={
'providerOptions': {
'gateway': {
'sort': 'tps' # Use the highest throughput provider first
}
}
}
)
print('Assistant:', completion.choices[0].message.content)curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [
{
"role": "user",
"content": "What is 2 + 2? Answer in one sentence."
}
],
"stream": false,
"providerOptions": {
"gateway": {
"sort": "tps"
}
}
}'Or use the provider shorthand directly in the request body:
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
const completion = await openai.chat.completions.create({
model: 'anthropic/claude-sonnet-5',
messages: [
{
role: 'user',
content: 'What is 2 + 2? Answer in one sentence.',
},
],
stream: false,
...{
provider: {
sort: 'tps',
},
},
});
console.log('Assistant:', completion.choices[0].message.content);import os
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
completion = client.chat.completions.create(
model='anthropic/claude-sonnet-5',
messages=[
{
'role': 'user',
'content': 'What is 2 + 2? Answer in one sentence.'
}
],
stream=False,
extra_body={
'provider': {
'sort': 'tps' # Use the highest throughput provider first
}
}
)
print('Assistant:', completion.choices[0].message.content)curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [
{
"role": "user",
"content": "What is 2 + 2? Answer in one sentence."
}
],
"stream": false,
"provider": {
"sort": "tps"
}
}'You can set per-provider timeouts for BYOK credentials to trigger fast failover when a provider is slow to respond. Pass providerTimeouts in providerOptions.gateway:
"providerOptions": {
"gateway": {
"providerTimeouts": {
"byok": { "anthropic": 3000, "bedrock": 5000 }
}
}
}For full details, limits, and response metadata, see Provider Timeouts.
You can pass your own provider credentials on a per-request basis using the byok option in providerOptions.gateway. This allows you to use your existing provider accounts and access private resources without configuring credentials in the gateway settings.
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
const completion = await openai.chat.completions.create({
model: 'anthropic/claude-opus-5',
messages: [
{
role: 'user',
content: 'Hello, world!',
},
],
...{
providerOptions: {
gateway: {
byok: {
anthropic: [
{
apiKey: process.env.ANTHROPIC_API_KEY,
},
],
},
},
},
},
});
console.log(completion.choices[0].message.content);import os
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
completion = client.chat.completions.create(
model='anthropic/claude-opus-5',
messages=[
{
'role': 'user',
'content': 'Hello, world!'
}
],
extra_body={
'providerOptions': {
'gateway': {
'byok': {
'anthropic': [{'apiKey': os.getenv('ANTHROPIC_API_KEY')}]
}
}
}
}
)
print(completion.choices[0].message.content)curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-opus-5",
"messages": [
{ "role": "user", "content": "Hello, world!" }
],
"providerOptions": {
"gateway": {
"byok": {
"anthropic": [{ "apiKey": "'"$ANTHROPIC_API_KEY"'" }]
}
}
}
}'The byok option is a record where keys are provider slugs and values are arrays of credential objects. Each provider can have multiple credentials that are tried in order.
Credential structure by provider:
- Anthropic:
{ apiKey: string } - OpenAI:
{ apiKey: string } - Google Vertex AI:
{ project: string, location: string, googleCredentials: { privateKey: string, clientEmail: string } } - Amazon Bedrock:
{ accessKeyId: string, secretAccessKey: string, region?: string }
For detailed credential parameters for each provider, see the AI SDK providers documentation.
Multiple credentials example:
providerOptions: {
gateway: {
byok: {
// Multiple credentials for the same provider (tried in order)
vertex: [
{ project: 'proj-1', location: 'us-east5', googleCredentials: { privateKey: '...', clientEmail: '...' } },
{ project: 'proj-2', location: 'us-east5', googleCredentials: { privateKey: '...', clientEmail: '...' } },
],
// Multiple providers
anthropic: [{ apiKey: 'sk-ant-...' }],
},
},
},Anthropic Claude models support prompt caching, which can significantly reduce costs and latency for repeated prompts. You can enable caching automatically or manually.
Use caching: 'auto' in providerOptions to let AI Gateway automatically add cache markers for providers that require them (like Anthropic). For full details, supported providers, and examples, see Automatic Caching.
For fine-grained control, you can manually mark content with cache_control:
import OpenAI from 'openai';
const apiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
const openai = new OpenAI({
apiKey,
baseURL: 'https://ai-gateway.vercel.sh/v1',
});
const response = await openai.chat.completions.create({
model: 'anthropic/claude-opus-5',
messages: [
{
role: 'user',
content: 'Analyze this document and summarize the key points.',
...{
cache_control: {
type: 'ephemeral',
},
},
},
],
});
console.log(response.choices[0].message.content);import os
from openai import OpenAI
api_key = os.getenv('AI_GATEWAY_API_KEY') or os.getenv('VERCEL_OIDC_TOKEN')
client = OpenAI(
api_key=api_key,
base_url='https://ai-gateway.vercel.sh/v1'
)
response = client.chat.completions.create(
model='anthropic/claude-opus-5',
messages=[
{
'role': 'user',
'content': 'Analyze this document and summarize the key points.',
'cache_control': {
'type': 'ephemeral'
}
}
]
)
print(response.choices[0].message.content)curl -X POST "https://ai-gateway.vercel.sh/v1/chat/completions" \
-H "Authorization: Bearer $AI_GATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-opus-5",
"messages": [
{
"role": "user",
"content": "Analyze this document and summarize the key points.",
"cache_control": {
"type": "ephemeral"
}
}
]
}'Was this helpful?