Lab 2 — Streaming & Tool-Calling Agent
Summary — what this page covers Attendees add a streaming endpoint and a multi-tool agent to BookTracker — committed. The agent calls real C# functions against the database before producing its final answer. Keep steps exact.
Duration: 35 min · Deliverable: streaming endpoint + multi-tool agent — committed
Part A — Streaming endpoint (≈15 min)
Implement SSE streaming so tokens appear one at a time. Use client.Messages.CreateStreaming,
surface the text deltas as IAsyncEnumerable<string> from a StreamingService, and write each as a
data: frame, flushing per chunk (see Section 2). Verify with:
curl -N http://localhost:5000/api/chat/stream?q=hello
# Tokens should appear one at a time, not all at once at the end
Part B — Tool-calling agent (≈20 min)
Define 2+ tools wired to real BookTracker services (e.g. find_book, update_reading_progress),
each with a clear, trigger-style description. Run the agent loop until StopReason is EndTurn —
the BetaToolRunner handles the loop for you, or write a manual loop if you want to log each call.
Cap iterations and return is_error tool results on failure. Verify multiple tool calls fire:
# Ask something that needs two lookups, e.g.:
# "Find Dune and mark it as completed"
# Should see 2+ tool calls in the logs before the final response
Checkpoint
- Streaming endpoint emits tokens incrementally
- Agent makes 2+ tool calls before its final response
- Tools read/write real BookTracker data
- Committed to your fork
Bonus — The Streaming Agent
No time pressure. Combine both halves into one endpoint: run the tool-calling agent loop, then stream the final answer token-by-token after the last tool call completes — the agent acts on real data and feels responsive.