← Lesson
A Mini Agent in Python
Joeven
Run
Reset
Python loads on first run
import json def search(q): hits = {"rain": "bring a coat", "python": "use a venv"} return hits.get(q, "no hits") def finish(text): return {"final": text} TOOLS = { "search": search, "finish": finish, } def parse_action(text): try: data = json.loads(text) except json.JSONDecodeError: return {"ok": False, "error": "bad_json"} tool = data.get("tool") args = data.get("args") if isinstance(data.get("args"), dict) else {} if tool not in TOOLS: return {"ok": False, "error": "unknown_tool"} return {"ok": True, "tool": tool, "args": args} def make_model(lines): i = {"n": 0} def fake_model(_transcript): if i["n"] >= len(lines): return '{"tool": "finish", "args": {"text": "stop"}}' text = lines[i["n"]] i["n"] += 1 return text return fake_model def run_agent(goal, lines, max_steps=6): transcript = [{"role": "user", "content": goal}] model = make_model(lines) for step in range(1, max_steps + 1): raw = model(transcript) print("step", step, "model", raw) parsed = parse_action(raw) transcript.append({"role": "model", "content": raw}) if not parsed["ok"]: obs = {"error": parsed["error"]} transcript.append({"role": "tool", "content": obs}) print(" observe", obs) continue tool = parsed["tool"] args = parsed["args"] try: result = TOOLS[tool](**args) except Exception as exc: result = {"error": type(exc).__name__, "detail": str(exc)} transcript.append({"role": "tool", "name": tool, "content": result}) print(" tool", tool, "->", result) if tool == "finish": print("done") break else: print("stop: budget") print("--- transcript ---") for row in transcript: print(row) return transcript script = [ '{"tool": "search", "args": {"q": "rain"}}', '{"tool": "finish", "args": {"text": "Bring a coat."}}', ] print("=== run 1 ===") run_agent("Should I take a coat?", script, max_steps=6) print("=== run 2 budget ===") run_agent("Should I take a coat?", script, max_steps=1)
Run to execute this in your browser. Nothing is sent to a server.