Java 21+  ·  Apache 2.0  ·  Multi-Agent Systems

Multi-agent coordination
for the JVM.

Autonomous agents that negotiate, delegate, and execute — with
Contract-Net dialogue, directories, and schedulers.
LLM, MCP, and A2A support are optional.

Pre-1.0 — built from source, not yet on Maven Central.
Every removal is announced two releases ahead: read the changelog.

@Agent("librarian") public class LibrarianAgent extends BaseAgent { // Declaring the field is the whole wiring. private final DialogueCapability dialogue = new DialogueCapability(this); @DialogueHandler(performatives = Performative.QUERY) public void onQuestion(DialogueMessage question) { dialogue.inform(question, "we have 3 books about " + question.content()); } } // The reader asks; the answer arrives as a message, because // the agent answering might be in another process. DialogueMessage answer = dialogue.query("librarian", "Kafka").join();
Your first agent in 5 minutes.  Get Started → · Runnable examples, Level 0 → 6 →
Contract-Net Protocol

Agents that negotiate, not just react.

Workers bid on a task; the manager awards it to the lowest bidder — a built-in dialogue of CFP, PROPOSE, and AGREE performatives. No LLM in the loop.

See the full example →
@DialogueHandler(performatives = Performative.CFP) public void handleCFP(DialogueMessage msg) { Task task = (Task) msg.content(); double cost = task.complexity() / efficiency; dialogue.propose(msg, new Bid(cost, etaSeconds)); } // Manager: award the lowest bid dialogue.callForProposals(workerIds, task, TIMEOUT) .thenAccept(bids -> { DialogueMessage best = bids.stream() .min(comparing(Bid::cost)) .orElseThrow(); dialogue.reply(best, AGREE, "You win!"); });
Modular by design

The core has never heard of an LLM.

agenor-core plus agenor-runtime is already a complete multi-agent system: agents, messaging, directory, scheduler. Reasoning, extended behaviors and classpath scanning are three separate modules you add only if you need them — which is what keeps the runtime friendly to GraalVM native image.

Read the architecture guide →
<!-- git checkout v0.33.0 && mvn install --> <!-- A multi-agent system. No LLM on the classpath. --> <dependency> <groupId>dev.agenor</groupId> <artifactId>agenor-runtime</artifactId> <version>0.33.0</version> </dependency> <!-- Add only what you actually need: --> <!-- agenor-runtime-llm reasoning, memory, guardrails --> <!-- agenor-runtime-ext FSM, HITL, filters --> <!-- agenor-runtime-scanning classpath discovery --> <!-- agenor-adapters OpenAI, Ollama, MCP, A2A -->

Multi-Agent Coordination

Dialogue and negotiation protocols — including Contract-Net — plus agent directories, schedulers, and message dispatch. The core runtime has zero dependencies on any LLM.

Three Behavior Types

When does this run? has three answers: once, on an interval, or as an FSM that decides its own transitions. Compose the rest. Retry, batching, rate limiting and circuit breaking are deliberately not behavior types — they wrap a call, and belong to a resilience library, or to the runtime's delivery layer and mailbox.

LLM Layer (Optional)

Plug in LLM-powered reasoning, memory, guardrails (PII redaction, content policy), Human-in-the-Loop approval, and reflection — an add-on module, not a dependency of the core runtime.

Protocol Interop: MCP + A2A

Optional adapters for connecting to MCP tool servers and interoperating with any A2A-compatible agent — for when your agents need to reach outside the JVM.

One Process, or Many

Start in-memory with nothing to install. Swap in Redis Streams for at-least-once delivery across nodes, or a JDBC-backed directory and approval queue when agents must outlive a restart. A message the runtime gives up on lands in a dead-letter queue you can read back — in memory by default with nothing to wire, or off the Redis stream. Every component is an interface, so agent code doesn't change.

A Runtime, Not Just an API

Each message handler runs on its own virtual thread, so an agent's handlers overlap rather than queue — guard shared state, and keep them idempotent, because a transport with redelivery runs a failed handler again. OpenTelemetry tracing is opt-in and no-op by default. A web console, a CLI, and a scenario evaluation harness ship with it.

Spring Boot Ready

Zero-config starter for Spring Boot 4.x. One dependency, one YAML block, Actuator health indicator included. Your agents are Spring beans.

Who it's for

MAS coordination, not LLM tool orchestration.

Agenor is a multi-agent coordination framework, not a general-purpose LLM toolkit.

Agenor is for

  • Multi-agent systems that need to coordinate, negotiate, and communicate — Contract-Net task allocation, agent directories, and message dispatch on the JVM.
  • Java and Spring Boot teams building production multi-agent systems on virtual threads, without pulling in LLM machinery they don't use.
  • Projects that want LLM reasoning, MCP tools, or A2A interop later — as optional modules bolted onto a MAS core, not the other way around.

Agenor is not

  • A chatbot-building framework — there's no prompt templating, conversational UI, or single-turn LLM orchestration out of the box.
  • A LangChain/LlamaIndex-style single-agent LLM toolkit — if you just need one agent calling one LLM, plain library code is simpler.
  • A replacement for MCP or A2A themselves — Agenor consumes those protocols optionally, it doesn't reinvent them.