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-gfm

    2. 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