Files
homelab/integrations/nextjs/api-routes.ts
T

98 lines
3.9 KiB
TypeScript
Raw Normal View History

/**
* NextJS API Route Examples
*
* Copy these to your NextJS app's pages/api/ or app/api/ directory
*/
// ═══════════════════════════════════════════════════════════════════════════════
// pages/api/chat.ts (Pages Router)
// ═══════════════════════════════════════════════════════════════════════════════
/*
import type { NextApiRequest, NextApiResponse } from 'next';
import { chat, streamChat, type Message } from '@/lib/llm-client';
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== 'POST') {
return res.status(405).json({ error: 'Method not allowed' });
}
const { messages, model = 'reasoning', stream = false } = req.body;
if (!messages || !Array.isArray(messages)) {
return res.status(400).json({ error: 'messages required' });
}
try {
if (stream) {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
for await (const chunk of streamChat({ model, messages })) {
res.write(`data: ${JSON.stringify({ content: chunk })}\n\n`);
}
res.write('data: [DONE]\n\n');
res.end();
} else {
const response = await chat({ model, messages });
res.json(response);
}
} catch (err) {
res.status(500).json({ error: err instanceof Error ? err.message : 'Unknown error' });
}
}
*/
// ═══════════════════════════════════════════════════════════════════════════════
// app/api/chat/route.ts (App Router)
// ═══════════════════════════════════════════════════════════════════════════════
/*
import { NextRequest } from 'next/server';
import { chat, createStreamResponse, type Model, type Message } from '@/lib/llm-client';
export async function POST(req: NextRequest) {
const { messages, model = 'reasoning', stream = false } = await req.json();
if (!messages || !Array.isArray(messages)) {
return Response.json({ error: 'messages required' }, { status: 400 });
}
if (stream) {
return createStreamResponse({ model, messages });
}
const response = await chat({ model, messages });
return Response.json(response);
}
*/
// ═══════════════════════════════════════════════════════════════════════════════
// app/api/metrics/route.ts (App Router - Grafana proxy)
// ═══════════════════════════════════════════════════════════════════════════════
/*
import { NextRequest } from 'next/server';
import { getLLMMetrics, getDashboard } from '@/lib/grafana-client';
export async function GET(req: NextRequest) {
const { searchParams } = new URL(req.url);
const type = searchParams.get('type') || 'metrics';
try {
if (type === 'dashboard') {
const dashboard = await getDashboard('llm-frontend');
return Response.json(dashboard);
}
const metrics = await getLLMMetrics();
return Response.json(metrics);
} catch (err) {
return Response.json(
{ error: err instanceof Error ? err.message : 'Unknown error' },
{ status: 500 }
);
}
}
*/
export {};