Next.js Integration
Complete guide to integrating the Cadra SDK with a Next.js application.
1. Install Dependencies
bash
npm install @cadraos/sdk react-markdown remark-gfm2. Token API Route
app/api/token/route.ts
import { NextResponse } from 'next/server';
export async function GET() {
// In production, verify the user session first
return NextResponse.json({
token: process.env.CADRA_API_KEY,
});
}3. Attachment Upload Route
app/api/attachments/upload/route.ts
import { CadraClient } from '@cadraos/sdk';
import { NextRequest, NextResponse } from 'next/server';
const client = new CadraClient({
apiKey: process.env.CADRA_API_KEY!,
orgId: Number(process.env.CADRA_ORG_ID),
});
export async function POST(req: NextRequest) {
const body = await req.json();
// Proxy the upload URL request to the Cadra API
const res = await fetch(`${process.env.CADRA_API_URL}/api/v1/attachments/upload`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `ApiKey ${process.env.CADRA_API_KEY}`,
'X-Organization-Id': process.env.CADRA_ORG_ID!,
},
body: JSON.stringify(body),
});
return NextResponse.json(await res.json());
}4. Chat Provider
components/ChatProvider.tsx
'use client';
import { ChatConfigProvider } from '@cadraos/sdk/chat';
export function ChatProvider({ children }: { children: React.ReactNode }) {
return (
<ChatConfigProvider
apiBaseUrl={process.env.NEXT_PUBLIC_CADRA_API_URL!}
tokenProvider={async () => {
const res = await fetch('/api/token');
const { token } = await res.json();
return token;
}}
orgId={Number(process.env.NEXT_PUBLIC_CADRA_ORG_ID)}
>
{children}
</ChatConfigProvider>
);
}5. Chat Page
app/chat/page.tsx
'use client';
import { AgentChat } from '@cadraos/sdk/chat';
import { ChatProvider } from '@/components/ChatProvider';
export default function ChatPage() {
return (
<ChatProvider>
<div className="h-screen">
<AgentChat
agentId={process.env.NEXT_PUBLIC_AGENT_ID!}
enableAttachments
showToolCalls
welcomeMessage="How can I assist you?"
onSessionCreated={(id) => {
// Persist session for reload
sessionStorage.setItem('cadra-session', id);
}}
sessionId={
typeof window !== 'undefined'
? sessionStorage.getItem('cadra-session') ?? undefined
: undefined
}
/>
</div>
</ChatProvider>
);
}6. Server-Side Streaming (API Route)
app/api/agent/route.ts
import { CadraClient } from '@cadraos/sdk';
import { NextRequest } from 'next/server';
const client = new CadraClient({
apiKey: process.env.CADRA_API_KEY!,
orgId: Number(process.env.CADRA_ORG_ID),
});
export async function POST(req: NextRequest) {
const { task, agentId } = await req.json();
const result = await client.agents.executeSync(agentId, { task });
return Response.json(result);
}Environment Variables
.env.local
# Server-side (private)
CADRA_API_KEY=sk-cad-xxxxxxxxxxxx
CADRA_API_URL=https://your-instance.cadraos.com
CADRA_ORG_ID=123
# Client-side (public)
NEXT_PUBLIC_CADRA_API_URL=https://your-instance.cadraos.com
NEXT_PUBLIC_CADRA_ORG_ID=123
NEXT_PUBLIC_AGENT_ID=your-agent-uuid