Nyraxis AI

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
}

On this page