Zum Inhalt springen
EN DE

Boss Fight: Research Agent

Du baust einen Research Agent — ein Terminal-Programm, das autonom zu einem Thema recherchiert, Ergebnisse zusammenfasst und sie nach menschlicher Freigabe speichert. Der Agent kombiniert alle fuenf Bausteine aus Level 3.

Dein Agent soll sich so anfuehlen:

Recherchiere: Welche neuen Features hat TypeScript 5.8?
[TOOL] search("TypeScript 5.8 features")
→ 3 Ergebnisse gefunden
[TOOL] search("TypeScript 5.8 release notes")
→ 2 Ergebnisse gefunden
[TOOL] summarize(...)
→ Zusammenfassung erstellt
--- Approval Request ---
Agent will saveResults("/tmp/research-typescript-5.8.txt") ausführen.
Erlauben? (y/n): y
Genehmigt.
[TOOL] saveResults("/tmp/research-typescript-5.8.txt")
→ Datei gespeichert
=== Ergebnis ===
TypeScript 5.8 bringt folgende neue Features: ...
(3 Schritte, 4 Tool Calls, 847 Tokens)

Dieses Projekt verbindet alle fuenf Bausteine:

User Input startet Research Agent: LLM nutzt Tool Loop mit Search, Summarize und Save (mit Approval), formatierte Ausgabe am Ende
  1. Search Tool (Challenge 3.1 oder 3.4) — Der Agent hat ein search-Tool, das zu einem Thema Informationen findet. Du kannst es als lokales Tool mit simulierten Ergebnissen bauen oder als MCP Tool (Bonus) anbinden.

  2. Summarize Tool (Challenge 3.1) — Ein summarize-Tool, das gesammelte Informationen in Key Points zusammenfasst.

  3. Save Results Tool mit Approval (Challenge 3.5) — Ein saveResults-Tool mit needsApproval: true, das die Ergebnisse in eine Datei speichert. Der User muss im Terminal bestaetigen.

  4. Agentic Loop (Challenge 3.3) — Der Agent nutzt stopWhen: stepCountIs(n) und entscheidet autonom, welche Tools er in welcher Reihenfolge aufruft.

  5. Formatierte Ausgabe (Challenge 3.2) — Jeder Tool Call und jedes Tool Result wird formatiert im Terminal angezeigt. Der User sieht in Echtzeit, was der Agent tut.

  6. System Prompt — Der Agent hat eine definierte Rolle: “Du bist ein Research Agent. Recherchiere gruendlich, fasse zusammen und speichere die Ergebnisse.”

  7. Agent-Verlauf — Am Ende wird eine Zusammenfassung angezeigt: Anzahl Schritte, alle Tool Calls, Token-Verbrauch.

  8. Interaktive Eingabe — Der User gibt das Recherche-Thema im Terminal ein. “exit” beendet das Programm.

Datei: boss-fight-3.ts | Ausfuehren: npx tsx boss-fight-3.ts

import { generateText, tool, stepCountIs } from 'ai';
import { anthropic } from '@ai-sdk/anthropic';
import { z } from 'zod';
import * as readline from 'readline';
// TODO: System Prompt definieren
// TODO: searchTool definieren (lokal oder MCP)
// TODO: summarizeTool definieren
// TODO: saveResultsTool definieren (mit needsApproval: true)
// TODO: askUser() Hilfsfunktion für Terminal-Approval
// TODO: Hauptfunktion:
// 1. User-Input lesen (readline)
// 2. Agent-Loop:
// a) generateText aufrufen
// b) result.content auf 'tool-approval-request' Parts prüfen
// c) User im Terminal fragen (askUser)
// d) tool-approval-response bauen und zu messages pushen
// e) generateText erneut aufrufen bis keine Approval Requests mehr
// 3. Tool Events formatiert ausgeben (onStepFinish)
// 4. Agent-Verlauf anzeigen (Schritte, Tool Calls, Tokens)

Dein Boss Fight ist bestanden, wenn:

  • Mindestens 3 Tools definiert (search, summarize, saveResults)
  • saveResults hat needsApproval: true — User wird vor dem Speichern gefragt
  • stopWhen: stepCountIs(n) begrenzt die Schritte
  • Approval Loop: result.content wird auf tool-approval-request geprueft, User wird gefragt, tool-approval-response wird gebaut
  • Agent nutzt Tools autonom in sinnvoller Reihenfolge (erst suchen, dann zusammenfassen, dann speichern)
  • Jeder Tool Call wird formatiert im Terminal angezeigt (Name, Parameter, Ergebnis)
  • Am Ende: Zusammenfassung mit Schritten, Tool Calls und Token-Verbrauch
  • Programm laeuft interaktiv und reagiert auf User-Eingaben
Hinweis 1: Tool-Beschreibungen sind entscheidend

Die description der Tools beeinflusst stark, in welcher Reihenfolge das LLM sie nutzt. Formuliere die Beschreibungen so, dass klar wird: search ist für Informationsbeschaffung, summarize für Zusammenfassung von gesammelten Daten, und saveResults für das Speichern am Ende. Der System Prompt kann die Reihenfolge zusätzlich lenken: “Recherchiere zuerst, fasse dann zusammen, speichere am Ende.”

Hinweis 2: onStepFinish für Live-Ausgabe

Nutze onStepFinish für die formatierte Ausgabe waehrend der Agent-Ausfuehrung. In diesem Callback hast Du Zugriff auf stepNumber, toolCalls, toolResults und usage. Du kannst dort jeden Tool Call mit seinem Ergebnis formatiert ins Terminal schreiben.

Hinweis 3: Approval bei Ablehnung

Wenn der User einen Tool Call ablehnt (approved: false im tool-approval-response Objekt), bekommt das LLM die Information, dass der Tool Call abgelehnt wurde. Es kann dann darauf reagieren — z.B. die Ergebnisse trotzdem als Text ausgeben, ohne sie zu speichern. Teste beide Pfade: Genehmigung und Ablehnung.

Part of AI Learning — free courses from prompt to production. Jan on LinkedIn