Alloy
A minimal, OTP-native agent loop for Elixir that sends messages to any language model, executes its tool calls and repeats until done, leaving sessions, memory and scheduling to the application built on top.
Alloy is described by its own author as a harness, not a framework: it implements the completion-and-tool-call loop and nothing else. A single function call sends a message to a configured provider, executes any tool calls the model requests, and loops until the model is finished, with the provider swappable by changing one argument.
It has three runtime dependencies and is small enough, at around 9,000 lines, to read in an afternoon, with everything beyond the core loop built as a recipe on top of Erlang's process model rather than as a subsystem of the library itself: a subagent is a supervised function call, an MCP server mounts as an ordinary tool, parallel tool execution uses a task supervisor, and crash isolation falls out of using separate processes. Sessions, persistence, memory, scheduling, dashboards and user interface concerns are explicitly left to the application, not owned by Alloy.
It currently has provider support for OpenAI, Anthropic, Gemini, DeepSeek, Grok and xAI-compatible endpoints.