import { NextResponse } from "next/server"; const INTEGRATION_SLUG = "langgraph-python"; export const dynamic = "force-dynamic"; export const maxDuration = 60; export async function GET() { const start = Date.now(); const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || `http://localhost:${process.env.PORT || 3000}`; try { const res = await fetch(`${baseUrl}/api/copilotkit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ method: "agent/run", params: { agentId: "agentic_chat" }, body: { threadId: `smoke-${Date.now()}`, runId: `smoke-run-${Date.now()}`, state: {}, messages: [ { id: `smoke-msg-${Date.now()}`, role: "user", content: "Respond with exactly: OK", }, ], tools: [], context: [], forwardedProps: {}, }, }), signal: AbortSignal.timeout(45000), }); const latency = Date.now() - start; if (!res.ok) { const errBody = await res.text().catch(() => ""); return NextResponse.json( { status: "error", integration: INTEGRATION_SLUG, stage: "runtime_response", error: `Runtime returned ${res.status}: ${errBody.slice(0, 200)}`, latency_ms: latency, timestamp: new Date().toISOString(), }, { status: 502 }, ); } // TTFB: read first chunk only to confirm SSE stream started, then cancel const reader = res.body?.getReader(); if (!reader) { return NextResponse.json( { status: "error", integration: INTEGRATION_SLUG, stage: "response_empty", error: "Runtime returned no readable body", latency_ms: latency, timestamp: new Date().toISOString(), }, { status: 502 }, ); } const { value, done } = await reader.read(); reader.cancel(); if (done || !value || value.length === 0) { return NextResponse.json( { status: "error", integration: INTEGRATION_SLUG, stage: "response_empty", error: "Runtime returned empty response body", latency_ms: latency, timestamp: new Date().toISOString(), }, { status: 502 }, ); } return NextResponse.json({ status: "ok", integration: INTEGRATION_SLUG, latency_ms: latency, timestamp: new Date().toISOString(), }); } catch (e: unknown) { const err = e instanceof Error ? e : new Error(String(e)); const latency = Date.now() - start; let stage = "unknown"; if (err.name === "AbortError" || err.message.includes("timeout")) stage = "timeout"; else if ( err.message.includes("fetch") || err.message.includes("ECONNREFUSED") ) stage = "agent_unreachable"; else stage = "pipeline_error"; return NextResponse.json( { status: "error", integration: INTEGRATION_SLUG, stage, error: err.message, latency_ms: latency, timestamp: new Date().toISOString(), }, { status: 502 }, ); } }