The glamorous part is model choice. The useful part is a toolbelt that reads files, searches the web, fetches URLs, writes drafts, runs tests, and reports failures without destroying the workspace. Most agent products are differentiated by tool quality more than by slogans.
Separate read, write, and execute
Do not give one vague file_tool the power to list, read, write, delete, and shell out. Split tools by blast radius. Read tools can be broad. Write tools should be scoped. Execute tools need sandboxing, timeout, output caps, and approval.
Tool results should point, not dump
A search tool should return ids, titles, URLs, snippets, and confidence. It should not dump an entire webpage. A file search should return paths and match ranges. The next tool can fetch the full content when the model has earned it.
def web_search(query: str, max_results: int = 5) -> dict:
raw = search_provider(query, max_results=max_results)
return {
"query": query,
"results": [
{
"id": f"r{i}",
"title": item["title"],
"url": item["url"],
"snippet": item["snippet"][:240],
}
for i, item in enumerate(raw[:max_results])
],
"next_action": "Use fetch_url(url) for the most relevant official source.",
}