← Lesson
Anatomy of an Agent
Joeven
Run
Reset
Python loads on first run
import json GOAL = "add 2 and 3, then finish" TOOLS = { "add": lambda a, b: a + b, "finish": lambda text: {"final": str(text)}, } memory = [] def assemble(goal, memory, tools): return {"goal": goal, "recent": memory[-6:], "tools": list(tools)} def model(ctx): if not any(m.get("kind") == "obs" for m in ctx["recent"]): return "CALL add " + json.dumps({"a": 2, "b": 3}) last = ctx["recent"][-1]["value"] return "CALL finish " + json.dumps({"text": str(last)}) def parse(raw): kind, rest = raw.split(" ", 1) name, args_s = rest.split(" ", 1) return {"kind": kind, "name": name, "args": json.loads(args_s)} def execute(decision, tools): return tools[decision["name"]](**decision["args"]) def should_stop(decision, steps, max_steps=8): if steps >= max_steps: return True return decision["name"] == "finish" final = None for steps in range(1, 9): ctx = assemble(GOAL, memory, TOOLS) decision = parse(model(ctx)) obs = execute(decision, TOOLS) memory.append({"kind": "act", "value": decision}) memory.append({"kind": "obs", "value": obs}) print("step", steps, decision["name"], "->", obs) if should_stop(decision, steps): final = obs break print("FINAL", final) print("parts: assembler, model, parser, executor, memory, stop")
Run to execute this in your browser. Nothing is sent to a server.