Releases: ivannavas/sprout-ai-framework
Release list
v1.5.0 — Spring compatibility & zero-config modules
What's new
Deeper Spring (and JSR-330) compatibility, plus zero-config modules. Sprout now blends into a Spring Boot app with even less wiring — and stays framework-agnostic at its core.
Mix each framework's DI annotations — both ways
- A Sprout component works when wired with Spring's or JSR-330's
@Autowired/@Value/@Qualifier(andjakarta.inject.@Inject/@Named), right alongside Sprout's own. - A Spring-managed bean works when wired with Sprout's
@Autowired/@Value/@Qualifier/@PostConstruct(field injection +@PostConstruct; use Spring's@Autowiredfor constructor injection on a Spring bean). - Same-named annotations from either framework no longer clash.
Treat this as a compatibility net for mixed or migrating code — not a style. The recommendation stands: use Sprout's annotations in Sprout components, and each DI container's own annotations in its own beans. sprout-core never references Spring or the inject API; the starter contributes those equivalents through a DiAnnotationContributor SPI.
Zero-config module scanning
Framework modules now contribute their own packages to the component scan, so the sprout-openai / sprout-anthropic @Model executors are discovered the moment the jar is on the classpath — no sprout.scan.base-packages needed just to pick them up.
Monitoring activates on its own
Adding sprout-monitoring installs the in-memory usage store and subscribes the collector automatically (exposed as the Spring usageStore bean) — declare your own @UsageStore and it takes over. No package to scan or configure.
Full Changelog: v1.4.0...v1.5.0
v1.4.0
What's new
Per-call model selection on ModelExecutor. chat, invoke and chatStream each gain a leading String modelName overload that targets a specific model for that call, overriding the one configured externally (e.g. anthropic.model.name). The built-in Anthropic and OpenAI executors honour it; the default for other executors ignores the name and delegates to the configured behaviour, so existing implementations and stubs are unaffected.
ModelResponse chat(String modelName, ModelRequest request)ModelResponse invoke(String modelName, ModelRequest request)— observable execution, emits the same model lifecycle eventsvoid chatStream(String modelName, ModelRequest request, StreamListener listener)
Full Changelog: v1.3.0...v1.4.0
v1.3.0 — Monitoring (usage, tokens & cost)
sprout-monitoring
A new module that tracks agent and model usage, tokens and cost — per model, per agent and per tool — with no change to your agents. It builds on the event bus introduced alongside it: a collector subscribes to the prefab lifecycle events and folds each one into a usage store.
Highlights
- New
@UsageStorecomponent, wired by its own@Processorlike@Modelor@ConversationStore. The shippedInMemoryUsageStoreis the in-memory default — put its package on your component scan to use it, or declare your own@UsageStoreto persist usage elsewhere (database, Prometheus/StatsD, …), with nothing else changing. - Token & cost accounting. Per-model token totals and cost, per-agent runs/iterations/tokens, per-tool call counts, and global totals via
UsageSnapshot. Costs come fromsprout.monitoring.pricing.<model>.input/.outputrates (per one million tokens); unpriced models are tracked at zero cost. - Spring-friendly. The store is a managed singleton named
usageStore, so under the Spring Boot starter it is exposed as a Spring bean automatically.
Maven
<dependency>
<groupId>io.github.ivannavas</groupId>
<artifactId>sprout-monitoring</artifactId>
<version>1.3.0</version>
</dependency>All modules (core, anthropic, openai, mcp, orchestration, monitoring, spring-boot-starter) are published at 1.3.0.
v1.2.0 — Retrieval-augmented generation (RAG)
Retrieval-augmented generation (RAG)
Agents can now ground their answers in your own documents. An @Agent enables RAG by declaring a
vectorStore and an embeddingModel; before each turn Sprout embeds the prompt, retrieves the
retrievalTopK most relevant documents and prepends them as context. The original question is what gets
persisted, so reloaded conversations never carry stale context forward. RAG is opt-in — an agent that
declares no vector store does no retrieval.
New in sprout-core
AbstractVectorStore(@VectorStore),EmbeddingModel(@Embedding), and theDocument,
SearchResultandRetrievertypes — the same component pattern as the rest of the framework.@Agent(vectorStore, embeddingModel, retrievalTopK)to wire retrieval into the agent loop.- Built-in defaults so RAG runs offline with no API key:
InMemoryVectorStore(cosine similarity) and
HashingEmbeddingModel(a lexical embedding).
Provider-backed semantic embeddings
OpenaiEmbeddingModel(sprout-openai) — OpenAI's embeddings API.VoyageEmbeddingModel(sprout-anthropic) — Voyage AI, the embedding provider Anthropic recommends
(the Anthropic API itself has no embeddings endpoint).
Examples
- A new runnable
ragexample:mvn -pl sprout-examples -am -Prag exec:exec.
Also includes the concurrent orchestration, supervisor delegation and conversation hand-off
(sprout-orchestration) added since 1.0.0.
Sprout 1.1.0
Sprout 1.1.0
New module: sprout-orchestration
Multi-agent coordination, built on the existing tool SPI — no core forks:
AgentOrchestrator— run agent prompts concurrently and collect results by id, as a reactive stream, or by blocking on a batch. Failures are isolated per run;withMaxConcurrency,withTimeoutandwithRetriesbound execution.AgentDelegation— a supervisor delegates subtasks to specialist agents exposed as tools, and composes the reply.AgentHandoff— transfer control of a live conversation between agents. The receiving agent continues the shared transcript under its own system prompt;maxHandoffsbounds transfers.
These compose: a delegating supervisor can be orchestrated concurrently and be the target of a hand-off.
Core
- An agent's system prompt is now applied at the head of every run instead of being persisted once. An agent that picks up a conversation another started (a hand-off) now governs its turns with its own prompt, and stored transcripts no longer carry system messages (self-healing on load).
Spring
- The Spring example gains a
/weather/batchendpoint: a plain@RestControllerfans concurrent agent runs out withAgentOrchestratorover a Spring-managed agent, persisting conversations through JPA — Spring DI and concurrent multi-agent work in a single request.
Examples
- Consolidated the multi-agent examples into one runnable "research desk" showing orchestration, delegation and hand-off composing around one supervisor.
Maven
<dependency>
<groupId>io.github.ivannavas</groupId>
<artifactId>sprout-orchestration</artifactId>
<version>1.1.0</version>
</dependency>Full module set (all on Maven Central under io.github.ivannavas): sprout-core, sprout-anthropic, sprout-openai, sprout-mcp, sprout-orchestration, sprout-spring-boot-starter.
v1.0.0
Sprout AI Framework 1.0.0 — first release.
A Spring-compatible foundation for building AI agents and tooling in Java: an IoC container, a provider-agnostic model layer (Anthropic, OpenAI), automatic @tool JSON-schema plumbing, Model Context Protocol support, and an open processor SPI.
Published to Maven Central under io.github.ivannavas. See the README for usage and the roadmap.