|

Vercel AI SDK

Use Cencori's first-party provider with streamText(), generateText(), and useChat().

Cencori ships a first-party provider for the Vercel AI SDK. Use it when you want Vercel's chat and streaming primitives with Cencori's routing, security, and observability behind the model call.

Installation

npm install ai cencori

Environment

# .env.local
CENCORI_API_KEY=csk_...

Create a shared provider export for your server code:

// lib/cencori.ts
import { cencori } from 'cencori/vercel';
 
export { cencori };

If you need custom provider settings, use createCencori() instead:

import { createCencori } from 'cencori/vercel';
 
export const cencori = createCencori({
  apiKey: process.env.CENCORI_API_KEY!,
});

Route Handler

// app/api/chat/route.ts
import { streamText, convertToModelMessages, type UIMessage } from 'ai';
import { cencori } from '@/lib/cencori';
 
export async function POST(req: Request) {
  const { messages, model = 'gpt-4o' }: { messages: UIMessage[]; model?: string } = await req.json();
 
  const result = streamText({
    model: cencori(model),
    messages: await convertToModelMessages(messages),
  });
 
  return result.toUIMessageStreamResponse();
}

React Chat UI

// app/page.tsx
'use client';
 
import { useChat } from '@ai-sdk/react';
import { useState, type FormEvent } from 'react';
 
function getMessageText(message: { parts?: Array<{ type: string; text?: string }> }) {
  return message.parts
    ?.map((part) => (part.type === 'text' ? part.text || '' : ''))
    .join('') || '';
}
 
export default function Chat() {
  const [input, setInput] = useState('');
  const { messages, sendMessage, status } = useChat({ api: '/api/chat' });
 
  function handleSubmit(event: FormEvent<HTMLFormElement>) {
    event.preventDefault();
    if (!input.trim() || status !== 'ready') return;
 
    const text = input.trim();
    setInput('');
    void sendMessage({ text });
  }
 
  return (
    <div>
      {messages.map((message) => (
        <div key={message.id}>
          {getMessageText(message)}
        </div>
      ))}
 
      <form onSubmit={handleSubmit}>
        <input value={input} onChange={(event) => setInput(event.target.value)} />
      </form>
    </div>
  );
}

Text Generation

import { generateText } from 'ai';
import { cencori } from '@/lib/cencori';
 
const result = await generateText({
  model: cencori('gemini-2.5-flash'),
  prompt: 'Write a haiku about AI infrastructure.',
});
 
console.log(result.text);

Switching Models

await generateText({
  model: cencori('gpt-4o'),
  prompt: 'Hello',
});
 
await generateText({
  model: cencori('claude-sonnet-4.5'),
  prompt: 'Hello',
});
 
await generateText({
  model: cencori('gemini-2.5-flash'),
  prompt: 'Hello',
});

When To Use The OpenAI-Compatible Base URL

If a library expects an OpenAI-compatible baseURL and apiKey instead of a first-party provider, use:

  • baseURL: https://api.cencori.com/v1
  • apiKey: your Cencori project key (csk_...)

Use cencori/vercel when you are already inside the Vercel AI SDK.