Vercel AI SDK
Add guardrails to Vercel AI SDK streaming responses.
Vercel AI SDK Integration
Route handler
import { NyraxisClient } from "@nyraxis/sdk";
import { openai } from "@ai-sdk/openai";
import { streamText } from "ai";
const nyraxis = new NyraxisClient({ apiKey: process.env.NYRAXIS_API_KEY! });
export async function POST(req: Request) {
const { messages } = await req.json();
const lastMessage = messages[messages.length - 1].content;
// Evaluate input before streaming
const check = await nyraxis.evaluate({ input: lastMessage });
if (!check.allowed) {
return new Response(
JSON.stringify({ error: "blocked", violations: check.violations }),
{ status: 422 }
);
}
const result = streamText({
model: openai("gpt-4o"),
messages,
});
return result.toDataStreamResponse();
}With useChat hook
"use client";
import { useChat } from "@ai-sdk/react";
export function Chat() {
const { messages, input, handleInputChange, handleSubmit, error } = useChat({
api: "/api/chat",
});
return (
<div>
{error && <p className="text-red-500">{error.message}</p>}
{messages.map((m) => (
<div key={m.id}>{m.content}</div>
))}
<form onSubmit={handleSubmit}>
<input value={input} onChange={handleInputChange} />
</form>
</div>
);
}The 422 response from the route handler will populate the error state in useChat.
Output evaluation
To also check model responses, evaluate after streaming completes:
const result = streamText({ model: openai("gpt-4o"), messages });
// After stream finishes
const fullText = await result.text;
const outputCheck = await nyraxis.evaluate({ output: fullText });
if (!outputCheck.allowed) {
// Log or alert — response already sent
}