# The shape of an agent — about 30 lines, no framework.
def run(client, system, user, tools, max_steps=8):
messages = [
{"role": "system", "content": system},
{"role": "user", "content": user},
]
for step in range(max_steps):
reply = client.messages.create(
model="gemini-3.7-flash",
messages=messages, tools=tools,
)
if reply.stop_reason == "end_turn":
return reply.content
# Otherwise: the model asked to use a tool.
results = [dispatch(c) for c in reply.content
if c.type == "tool_use"]
messages.append({"role": "assistant", "content": reply.content})
messages.append({"role": "user", "content": results})
raise StepLimitExceeded(max_steps)