The term "AI agent" has become ubiquitous in tech circles, yet its ambiguity fuels confusion. Developer Tornike O cuts through the noise with a rigorous technical definition that transforms vague marketing speak into programmable logic. At its core, an agent isn't just any LLM-powered tool—it's a system where the loop's termination condition depends directly on the LLM's output.

The Anatomy of an Agent

Tornike's framework decomposes agents into three critical components:

  1. LLM Core: A function llm(context: str) -> str that processes inputs
  2. Tools: Functions like conditional(input: str) -> bool or numeric(input: str) -> int that extend capabilities
  3. LLM-Conditioned Loop: Any loop (while/for) where continuation hinges on LLM output

This structure excludes common patterns like:

# Not an agent: Fixed loop independent of LLM output
for _ in range(100):
    output = llm(context)
    ...

Why Loop Control Matters

The critical differentiator lies in agency. When an LLM governs loop termination—not preset counts or user inputs—it exhibits goal-directed behavior. Contrast this with chatbots:

# Chatbot pattern: Loop breaks on USER input
while True:
    query = input('you>')
    if conditional(query):  # User-controlled exit
        break
    ...

True agents decide when to stop processing based on their own "reasoning," enabling autonomous task execution like research or troubleshooting where exit conditions aren't predetermined.

Implications for Developers

This definition has practical teeth:
- Architecture: Forces explicit design of decision boundaries
- Debugging: Creates testable conditions for agent "completion"
- Tool Integration: Clarifies how stateful tools (e.g., memory, API clients) fit within the loop

As Tornike acknowledges, edge cases exist—but this framework provides the missing vocabulary to discuss agentic systems without hand-waving. In an era of LLM hype, precise definitions separate substance from spectacle.