Minimalist language model loop improves long tasks and self updates

Harness as a Language: A Minimalist Agent Framework With Maximal Expressivity

Artificial Intelligence

Summary

Many AI systems that use language models need complex support systems to handle memory and self-improvement. The authors created a simpler framework called JAZ that uses just one main operation, invoke, letting the language model write and execute code itself. This minimal approach matches or beats more complex systems on tasks that require remembering lots of information or improving over time. By treating the core interaction as a programming language primitive, JAZ shows how a simple, flexible approach can handle complicated workflows.

What this means in practice

  • For ai platform engineers: Build AI agents that handle complex long-term tasks without adding external memory or tool systems by using JAZ’s minimal invoke-driven framework.
  • For automation developers: Create self-improving automated workflows where the AI writes and updates its own code autonomously within a simple invoke structure.

Authors

Zhening Li, Joshua Liu, Mateja Vukelic, Nicole Shen, Supriya Lall, Amitayush Thakur, Alex Zhang, Omar Khattab, Jonathan Light, Armando Solar-Lezama

Abstract

Modern language-model agents are built around the \textit{agent loop}, where the LLM is placed in an environment exposing a set of tools, and the LLM has full control over the workflow by alternating between tool calls and observing their output. However, certain workflows currently require additional engineering beyond the agent loop itself, such as memory systems and self-improving systems. We built an LLM agent framework, JAZ, to explore the extent to which a minimal harness that is little more than the agent loop itself can accomplish tasks these specialized systems are built for. JAZ exposes a single LLM-based primitive invoke and provides a set of built-in hooks that allow the programmer to apply constraints and monitoring. Generalizing existing code-mode agent loops, \texttt{invoke} is the simplest loop that satisfies two defining properties: (1) the LLM can write arbitrary executable code that can include recursive \texttt{invoke}; (2) everything visible to the LLM --- all inputs to \texttt{invoke} as well as its interaction history with the code environment --- are variables in the code environment. We motivate our design from first principles, viewing \texttt{invoke} as a language primitive representing a function whose implementation is provided at runtime by an LLM every time it is called. To validate the design of our core \texttt{invoke} primitive, we evaluate \texttt{invoke} --- with only prompting, no manually designed tools, harness, or external systems (e.g., memory or the file system) --- on workflows traditionally implemented through specialized external harnesses. On long-horizon workflows requiring recall beyond the context window, JAZ invoke outperforms Letta (MemGPT) by 8\% at half its cost on the recall-heavy portion of StuLife. On continual self-improvement, JAZ invoke outperforms ACE by 4\% at a lower cost on AppWorld.