About

Why jOpenAgent exists

Agent engineering moved fast, and almost all of it moved in Python.
Meanwhile a very large share of the systems worth connecting an agent to are written in Java: ERPs, ledgers, schedulers, order books, industrial back-ends. None of them are going to be rewritten.

The gap

Java had integration libraries. It did not have a harness.

There have been good Java libraries for talking to language models for years: chat clients, embeddings, vector stores, retrieval pipelines, function calling. That is a real and useful category, and it is not the same category as an agent harness.

A harness is the architecture around the model: how state is held, how outputs are typed and repaired, how the model acts, how context is disclosed, how the loop is written, how the whole thing is traced and measured. Published research on agent architecture is consistent on the point. The harness accounts for double-digit swings in benchmark results and large differences in token cost on an unchanged model. Picking a better model is the small lever. The harness is the big one.

So the choice facing a Java team was to stand up a Python service beside their system and accept a network hop, a second runtime and a serialisation boundary between the model and their domain objects, or to do without. jOpenAgent exists so that neither is necessary.

The design commitments

  • Agents are plain objects. Debuggable, testable, refactorable with the tools you already have.
  • No magic. No dynamic proxy, no bytecode weaving, no annotation processor. Real stack frames.
  • No dependencies. Not in the core, not anywhere. The JDK is enough.
  • Honest documentation. Including the chapter on what the sandbox does not guarantee.

Origins

A published architecture

jOpenAgent is inspired by NOOA, the Object-Oriented Agents framework from NVIDIA-NeMo Labs, and brings its core idea to the JVM: an agent is just a class, fields are state, ordinary methods are deterministic capabilities, and annotated methods are delegated to a model at runtime.

jOpenAgent also goes past its model in places. There is a fourth TOOL_CALLING strategy, an out-of-process sandbox mode with a genuine hard-kill timeout, a native desktop trace viewer, and MCP implemented directly rather than by wrapping an SDK.

Who is behind it

Built by people who ship Java for a living

jOpenAgent comes from the team at ILM Informatique, a French software company with a long track record of open-source Java. The same people maintain two projects that thousands of developers and businesses already depend on. That is exactly the perspective that produces a framework with no dependencies, an offline default and a documented safety boundary.

jOpenDocument

A pure-Java LGPL library for reading, writing and generating OpenDocument Format files (spreadsheets and text documents) without OpenOffice or LibreOffice installed. Widely used to produce reports and invoices straight from Java.

jopendocument.org →

OpenConcerto

A free, open-source ERP and management suite for small and medium businesses: invoicing, accounting, stock, sales. Built in Java, highly modular, and running the day-to-day operations of many companies.

openconcerto.org →

ILM Informatique

The team behind both, and behind jOpenAgent. Java, open source, and a preference for software that still works in five years over software that demos well this quarter.

ilm-informatique.fr →

License

Apache License 2.0

Free to use, including commercially.
Modify it, redistribute it, build a product on it.

Contributing

Issues and pull requests welcome

Bug reports, strategy implementations, additional LLM clients, exporters. All of it is useful. The codebase is deliberately plain Java with no framework to learn first, which makes it unusually easy to contribute to.

Build your first Java agent

One dependency, one class, five minutes.