# Les 17 — Lesopdracht ## Langfuse setup + eerste traces **Vak:** AI-Assisted Development **Duur:** 30 min in-class --- ## Doel Aan het einde: Langfuse hangt aan je Polderfest-chat (of een willekeurige AI-app). Je ziet elke chat-call in het Langfuse-dashboard met prompt, response, tokens, cost, latency. --- ## Stap 1 — Langfuse account 1. Ga naar https://cloud.langfuse.com — sign up (mag met Google/GitHub) 2. New project — naam: `polderfest-chat` 3. Settings → API Keys → kopieer **Public Key** + **Secret Key** --- ## Stap 2 — Install In je polderfest-chat repo (uit Les 12): ```bash pnpm add langfuse-vercel langfuse ``` `.env.local`: ``` LANGFUSE_PUBLIC_KEY=pk-lf-... LANGFUSE_SECRET_KEY=sk-lf-... LANGFUSE_BASE_URL=https://cloud.langfuse.com ``` --- ## Stap 3 — Wrap je chat-route `app/api/chat/route.ts` — voeg `experimental_telemetry` toe aan je `streamText` of `generateText`: ```typescript import { streamText, convertToModelMessages } from "ai"; import { openai } from "@ai-sdk/openai"; export async function POST(req: Request) { const { messages } = await req.json(); const result = streamText({ model: openai("gpt-4o-mini"), messages: convertToModelMessages(messages), tools: { /* je bestaande tools */ }, stopWhen: stepCountIs(5), experimental_telemetry: { isEnabled: true, functionId: "polderfest-chat", metadata: { userId: "anonymous", }, }, }); return result.toUIMessageStreamResponse(); } ``` --- ## Stap 4 — Telemetry exporter `instrumentation.ts` in project-root: ```typescript import { registerOTel } from "@vercel/otel"; import { LangfuseExporter } from "langfuse-vercel"; export function register() { registerOTel({ serviceName: "polderfest-chat", traceExporter: new LangfuseExporter(), }); } ``` `pnpm add @vercel/otel @opentelemetry/api` `next.config.ts` — enable instrumentation: ```typescript export default { experimental: { instrumentationHook: true, }, }; ``` --- ## Stap 5 — Test ```bash pnpm dev ``` Open http://localhost:3000/chat — stel 3 vragen. Open https://cloud.langfuse.com → jouw project → **Traces** tab. Je ziet: - 3 traces (één per vraag) - Per trace: prompt, response, tool-calls, model, tokens, cost - Latency in ms Klik op een trace → zie de volledige conversation tree. --- ## Eisen - [ ] Langfuse account + project aangemaakt - [ ] API keys in `.env.local` - [ ] `experimental_telemetry` actief in chat-route - [ ] OpenTelemetry exporter geconfigureerd - [ ] Min 3 traces zichtbaar in dashboard - [ ] Per trace: tokens + cost + latency zichtbaar --- ## Tijdsindeling (30 min) | Stap | Tijd | |------|------| | 1-2 — Setup + install | 8 min | | 3-4 — Code-changes | 12 min | | 5 — Test + debug | 10 min | --- ## Veelvoorkomende problemen | Symptoom | Oplossing | |----------|-----------| | Geen traces in dashboard | Wacht 30s — flush is async. Of `await langfuse.flushAsync()` toevoegen | | "instrumentationHook is required" | `next.config.ts` aanpassen + restart `pnpm dev` | | Cost = $0 | Klopt vaak voor mini-calls — check `tokens` is wel goed | | Tool-calls niet zichtbaar | Update naar laatste AI SDK + langfuse-vercel versies | | 401 Unauthorized | Public + secret key check, regio (US vs EU) klopt | --- ## Klaar? Verder met huiswerk: - Eval-suite (10 cases voor je app) - Prompt-injection bescherming - Per-user rate limiting + cost-strategie - `POLISH.md` met screenshots + cijfers Zie `Les17-Huiswerk.pdf`.