Lesson 38 — Beginner

Capstone — Streaming Tool-Using Assistant

Poore L2 ka kaam yahin judta hai: ek assistant jo stream karta hai, tools chalata hai, failures handle karta hai aur har run ko trace karta hai. Is capstone mein hum architecture, core loop ka skeleton, aur ship karne se pehle ka checklist dekhenge — code apne project mein paste kar ke shuru karo.

⏱ 10 min• Beginner• Other Orchestration Frameworks

Capstone mein kya banega

WHAT

Ek CLI/endpoint based assistant: user ka message leta hai, zaroorat padne par tools (order lookup, FAQ search) chalata hai, aur final jawab token-by-token stream karta hai — saath mein har run ka structured trace.

WHEN

L2 khatam hone par — jab tumhe lagta hai ki individual cheezein (state, streaming, tools, retries) aa gayi hain, ab unhe ek system mein jodna baaki hai. Yehi capstone ka maqsad hai.

WHERE

Yahi skeleton aage RAG (L4) aur agents (aage ke levels) mein dobara aayega — tool loop, streaming aur tracing wahi rehti hain, sirf tools badalte hain.

Scope deliberately chhota rakho: do tools, ek provider, ek conversation state. Quality bar features ki sankhya nahi, integration ki saaf-suthri hai — har lesson ka concept iske andar dikhna chahiye.

Architecture — kya kahan baithta hai

user input
   |
   v
[conversation state] ---- messages[] (stateless API ke liye)
   |
   v
[assistant loop]
   |-- no tool -> [stream reply] ----> tokens -> UI (SSE/terminal)
   |-- tool?   -> [validate args] -> [execute tools] -> role "tool" result
   |                 |                     |
   |                 +-- error -> structured error message (loop zinda)
   |
[reliability layer] : timeout + backoff retry (wrap har API call)
[trace]             : per round -> model, tokens, latency, tool, ok/error
Design rule: Loop mein har round ka cap laga do (jaise 5 rounds). Model galat ya phas jaaye toh system beinteha ghoomta rehta hai — cap se graceful exit milti hai.

Core loop ka skeleton

import json, time, logging

log = logging.getLogger("assistant")
TOOLS = [order_status_schema, faq_search_schema]     # M2.5/M2.6 wali schemas
MAX_ROUNDS = 5

def chat(user_text, history):
    history.append({"role": "user", "content": user_text})
    for round_no in range(MAX_ROUNDS):
        t0 = time.perf_counter()
        resp = call_with_retry(lambda **k: client.chat.completions.create(  # M2.9
            model=MODEL, messages=history, tools=TOOLS, **k))
        msg = resp.choices[0].message
        history.append(msg)

        if not msg.tool_calls:
            return msg.content          # agla step: isi ko stream karo (M2.2)

        for call in msg.tool_calls:     # safe_run -> errors bhi tool result
            history.append({"role": "tool", "tool_call_id": call.id,
                            "content": safe_run(call)})

        log.info("round", extra={"round": round_no, "tool": msg.tool_calls[0].function.name,
                 "tokens": resp.usage.total_tokens,
                 "ms": round((time.perf_counter() - t0) * 1000), "ok": True})
    return "Bahut zyada steps lag gaye — shuru se ek hi sawaal chhota karke batao."

def stream_final(history):              # M2.2 — final answer stream
    parts = []
    for chunk in client.chat.completions.create(model=MODEL, messages=history, stream=True):
        d = chunk.choices[0].delta.content
        if d:
            parts.append(d)
            yield d
    history.append({"role": "assistant", "content": "".join(parts)})
Assemble karo: Har block tumhare purane code se aata hai — history (M2.1), streaming (M2.2), schemas (M2.4), tool loop (M2.5), retry (M2.9), log record (M2.10). Nayi cheez sirf inka arrangement hai.

Ship checklist

Definition of done: Jab koi aur banda tumhara repo clone kar ke bina tumhare poochhe assistant chala le, aur tumhe uske trace se bata sake ki uski har request mein kya hua — tab capstone done hai.

Exercise

Question: Assistant ka final jawab kaise dena chahiye — poora ek saath ya streaming se?

Question: Tool loop mein kitne rounds tak chalne ka cap rakhna chahiye — bina cap ya max rounds?

Question: Har run ka trace kin fields se bhara jaata hai — tokens, latency aur kis cheez se? (model/tool/error mein ek)

Question: API key kahan se aani chahiye — hardcoded string se ya environment se?

Common mistakes

Desi example: Naye waiter ki pehli shift

Naya waiter apne pehle din: order sunta hai, kitchen bhejta hai (tools), khud nahi banata (stateless), khushi order par khud bolta hai (streaming), aur shift-end mein khata dekhta hai (trace). Ek system, sab akhade nahi:

text
Order suno (user msg) -> menu check (tool choose) -> kitchen (execute)
Khana plate mein aate hi bolna (stream)
Kitchen busy? thoda ruk kar dobara (retry + backoff)
Shift end: khata — kya bikta raha, kya atka (trace)

Yehi tumhara capstone hai — bas waiter AI hai.
Interview angle — yahan se sawaal aate hain
  • Q: Ek tool-using streaming assistant ke core components? — Conversation state, tool loop (validate + execute + tool results), streaming reply, retry layer, trace log.
  • Q: Tool calls aur streaming saath kaise handle karte hain? — Tool rounds non-stream (structured), final answer stream; ya deltas + tool-call delta merge (advanced).
  • Q: Loop ko infinite se kaise bachaoge? — Max rounds cap, repeated-call detection, aur final fallback message — gracefully exit, kabhi ghoomna nahi.
  • Q: Tumhara assistant production-ready kaise dikhega? — Keys env se, retries + timeouts wired, per-run JSONL trace, manual test script ke saath verified.
Lesson complete?

L2 capstone complete — tumne API, streaming, tools aur reliability ek system mein jod diya. Agle level mein prompt engineering se output quality ko tighten karenge.

Popular courses: Data Science Course in Lucknow · AI Course in Lucknow · Python Course in Lucknow · Power BI Course · Data Analytics Course