An agent is a loop: the model either calls a tool or gives a final answer, tool results are fed back, and the loop repeats until it's done.
Implement run_agent(model, tools, question, max_steps=5):
model(messages) returns a dict: either {"tool": name, "args": {...}} or {"answer": text}.messages starts as [{"role": "user", "content": question}].{"role": "assistant", "tool": name, "args": args}, then run tools[name](**args) and append {"role": "tool", "name": name, "content": str(result)}.
"error: unknown tool <name>" instead."error: <ExceptionType>: <message>". Don't crash. The model can recover.{"role": "assistant", "content": text} and return {"answer": text, "steps": n, "messages": messages}, where n is the number of model calls.max_steps model calls without an answer, return {"answer": None, "steps": max_steps, "messages": messages}.