a builder's codex
codex · operators · Simon Willison · ins_willison-emergent-agent-tooling

Agent behaviors emerge from composable CLI primitives without requiring an explicit agent framework

By Simon Willison · Creator of Datasette; co-creator of Django; prolific LLM and agentic-engineering blogger · 2026-08-04 · post · New release of LLM adds support for reasoning traces, OpenAI Responses, server-side tools, and smarter logging

Tier B · TL;DR
Agent behaviors emerge from composable CLI primitives without requiring an explicit agent framework

Claim

When a CLI tool assembles modular tool discovery, structured streaming events, and loop execution control as independent composable features, agent-shaped behavior emerges bottom-up without deliberate agent framework design.

Mechanism

Willison released LLM 0.32 having added four features that each solved a specific user problem: (1) reasoning trace separation to stderr so piped outputs stay clean, (2) server-side tools from any provider loaded as single CLI arguments, (3) structured streaming events returning granular types (reasoning, text, tool calls, images) instead of flat strings, and (4) content-addressable message logging that avoids duplicate JSON storage across multi-turn conversations. None of these features were designed as agent primitives. Together they created what Willison called an "accidental agent framework": a CLI utility that can mix tools from different sources, maintain conversation state efficiently, expose reasoning, and pause for human approval mid-loop. The emergence pattern suggests dedicated agent architecture is not the only path to agent capability; it can also arrive as the convergence of composable lower-level features responding to real user need.

Conditions

Holds when: (a) users have genuine need for multi-source tool mixing and the library assembles the right composable primitives to support it; (b) the task complexity fits single-threaded sequential tool execution.

Fails when: tasks require parallel execution, complex graph-based coordination, or persistent memory across independent sessions. Accidental agent frameworks hit ceilings that purpose-built frameworks handle by design.

Evidence

Willison described the discovery of LLM's agent-shaped convergence directly:

"There's something neat about having a CLI utility that can mix and match different tools from different sources with different models all as a one-liner"

He added: "Maybe the next version of LLM will bake the concept of an 'agent' into the core library." The accidental framing is notable: Willison shipped each feature for a concrete use case, not as part of a planned agent architecture.

Signals

Counter-evidence

Purpose-built agent frameworks (LangGraph, AutoGen) handle graph-based execution, branching, and persistent memory by design from the start. Accidental convergence produces a capable but constrained agent: it works for linear tool loops, not for multi-agent coordination, long-horizon memory, or parallel subtask execution. The "emergent" path works at small scale; it creates architectural debt at larger scale.

Cross-references

Open the interactive view → View original source → Markdown source →