Skip to content

Releases: ivannavas/sprout-ai-framework

v1.5.0 — Spring compatibility & zero-config modules

Choose a tag to compare

@ivannavas ivannavas released this 08 Jul 17:59

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 (and jakarta.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 @Autowired for 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

Choose a tag to compare

@ivannavas ivannavas released this 07 Jul 11:44

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 events
  • void chatStream(String modelName, ModelRequest request, StreamListener listener)

Full Changelog: v1.3.0...v1.4.0

v1.3.0 — Monitoring (usage, tokens & cost)

Choose a tag to compare

@ivannavas ivannavas released this 27 Jun 12:49

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 @UsageStore component, wired by its own @Processor like @Model or @ConversationStore. The shipped InMemoryUsageStore is the in-memory default — put its package on your component scan to use it, or declare your own @UsageStore to 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 from sprout.monitoring.pricing.<model>.input / .output rates (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)

Choose a tag to compare

@ivannavas ivannavas released this 25 Jun 08:58

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 the Document,
    SearchResult and Retriever types — 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 rag example: 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

Choose a tag to compare

@ivannavas ivannavas released this 22 Jun 13:17

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, withTimeout and withRetries bound 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; maxHandoffs bounds 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/batch endpoint: a plain @RestController fans concurrent agent runs out with AgentOrchestrator over 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

Choose a tag to compare

@ivannavas ivannavas released this 19 Jun 17:31

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.