98 lines
3.9 KiB
TypeScript
98 lines
3.9 KiB
TypeScript
/**
|
|
* 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 {};
|