Skip to content

Commit f332543

Browse files
committed
docs: refresh runtime/version/sample claims to 4.0.43 ground truth
1 parent 9bb08d8 commit f332543

15 files changed

Lines changed: 159 additions & 88 deletions

docs/src/content/docs/index.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@ import { Card, CardGrid } from '@astrojs/starlight/components';
3232
Build a complete real-time application from scratch. Covers transports, rooms, AI streaming, MCP, clustering, channels, and production deployment.
3333
</Card>
3434
<Card title="Spring Boot & Quarkus" icon="setting">
35-
First-class starters with auto-configuration, native image support, Micrometer metrics, and OpenTelemetry tracing. Tracks Spring Boot 4.0.5 and Quarkus 3.31.
35+
First-class starters with auto-configuration, native image support, Micrometer metrics, and OpenTelemetry tracing. Tracks Spring Boot 4.0.5 and Quarkus 3.35.
3636
</Card>
3737
</CardGrid>

docs/src/content/docs/integrations/koog.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,20 @@ aspiration.
8787
| `SYSTEM_PROMPT` || Honored by the Koog prompt builder |
8888
| `CONVERSATION_MEMORY` || Per-session memory threaded through `AgentExecutionContext` |
8989
| `AGENT_ORCHESTRATION` || Works with `@Coordinator` and `@Fleet` |
90-
| `TOKEN_USAGE` || Not declared. Koog reports usage on its response objects but the bridge does not yet thread it into `StreamingSession.usage(TokenUsage)`. Tier 1 follow-up. |
91-
| `VISION` || Koog 0.7.x does not expose a stable multi-modal input API on the bridge path |
92-
| `MULTI_MODAL` || Same limitation |
93-
| `PROMPT_CACHING` || Koog 0.7.3 only ships Bedrock-specific cache variants; no OpenAI-compatible passthrough |
94-
| `PER_REQUEST_RETRY` || Inherits Koog's native retry layer (not per-request overridable from the bridge) |
90+
| `TOKEN_USAGE` || The `StreamFrame.End` handler reads Koog's usage totals and emits a typed `TokenUsage` record via `session.usage()` after drain (`executeWithAgent` lines 223-232). |
91+
| `VISION` || Koog 0.8.0 accepts `ContentPart.Image` natively via `buildPrompt`'s `user(String, List<ContentPart>)` overload (no-tools path) |
92+
| `AUDIO` || Same path as `VISION``ContentPart.Audio` attached via `AttachmentContent.Binary.Base64` |
93+
| `MULTI_MODAL` || Combined image + audio + text inputs work on the no-tools path; tools + multi-modal degrade gracefully (the tool path wins with a WARN — `AIAgent.run(String)` only accepts plain text) |
94+
| `PROMPT_CACHING` || Koog 0.8.0 honors Bedrock-specific `CacheControl.Bedrock.{FiveMinutes, OneHour}` mapped from Atmosphere's portable `CacheHint`. Non-Bedrock providers silently drop the cache control — same shape Spring AI / LC4j take for OpenAI `prompt_cache_key`. |
95+
| `CANCELLATION` || `executeWithHandle` returns an `ExecutionHandle` whose `cancel()` calls `Job.cancel()` + `Thread.interrupt()` + resolves the done-future with synthetic completion (terminal-path closure per Correctness Invariant #2) |
96+
| `PER_REQUEST_RETRY` || Honored via `executeWithOuterRetry` which wraps `executeInternal` in a retry loop respecting `context.retryPolicy()`. Pre-stream transient failures retry on top of Koog's native HTTP retry. |
9597

9698
Exclusions are **honest** — Koog declares them as absent in its `capabilities()` set so runtime-truth advertising is accurate (Correctness Invariant #5). When Koog upstream adds these surfaces in a future release, the bridge will honor them without a breaking change. No `KoogEmbeddingRuntime` ships today — if you need Koog-backed embeddings, wire a Spring AI or LangChain4j `EmbeddingModel` alongside the Koog agent runtime.
9799

98100
## Samples
99101

100-
- [spring-boot-koog-chat](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-koog-chat)`@AiEndpoint` chat sample routing through Koog's `executeStreaming`
101-
- [spring-boot-ai-classroom](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ai-classroom)swap the runtime to Koog by changing one dependency, same `@Agent` code
102+
- [spring-boot-ai-chat](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ai-chat)swap to Koog by adding `atmosphere-koog` to `pom.xml`; the same `@AiEndpoint` code routes through `KoogAgentRuntime` (Atmosphere's SPI promise)
103+
- [spring-boot-ai-classroom](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ai-classroom)multi-room shared AI; same one-Maven-dep swap to route through Koog
102104

103105
## See Also
104106

docs/src/content/docs/integrations/quarkus.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
---
22
title: "Quarkus"
3-
description: "Build-time processing for Quarkus 3.31.3+"
3+
description: "Build-time processing for Quarkus 3.35.2+"
44
---
55

66
# Quarkus Integration
77

8-
A Quarkus extension that integrates Atmosphere with Quarkus 3.31.3+. Provides build-time annotation scanning via Jandex, Arc CDI integration, and GraalVM native image support.
8+
A Quarkus extension that integrates Atmosphere with Quarkus 3.35.2+. Provides build-time annotation scanning via Jandex, Arc CDI integration, and GraalVM native image support.
99

1010
## Maven Coordinates
1111

@@ -113,11 +113,12 @@ See [Spring Boot → `@AiEndpoint` annotation surfaces](spring-boot/#aiendpoint-
113113

114114
- **`load-on-startup`** must be > 0 for the endpoint to register at boot time (Quarkus's `UndertowDeploymentRecorder` skips on `<= 0`, unlike the Servlet spec).
115115

116-
**Runtime coverage:** per-request retry is **Built-in only** in 4.0.36. Framework runtimes inherit their native retry layers. See the [per-runtime capability matrix](../../tutorial/11-ai-adapters/#per-runtime-capability-matrix).
116+
**Runtime coverage:** all eight framework adapters declare `PER_REQUEST_RETRY` honestly as of 4.0.43 (commit `374631e7`) — they all inherit `AbstractAgentRuntime.executeWithOuterRetry`. Each adapter stacks this on top of its own native retry layer (Spring Retry, LC4j `RetryUtils`, ADK `HttpClient`, Koog `CallRetryPolicy`, SK `OpenAIAsyncClient`). See the [per-runtime capability matrix](../../tutorial/11-ai-adapters/#per-runtime-capability-matrix).
117117

118118
## Samples
119119

120120
- [Quarkus Chat](https://github.com/Atmosphere/atmosphere/tree/main/samples/quarkus-chat) -- real-time chat with WebSocket and long-polling fallback
121+
- [Quarkus AI Chat](https://github.com/Atmosphere/atmosphere/tree/main/samples/quarkus-ai-chat) -- five `@AiEndpoint` demos (basic streaming, retry, multi-modal, prompt caching, structured output) on Quarkus + Quarkus LangChain4j bridge, port `18810`
121122

122123
## See Also
123124

docs/src/content/docs/integrations/semantic-kernel.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ description: "AgentRuntime backed by Microsoft Semantic Kernel — ChatCompletio
77

88
`AgentRuntime` implementation backed by [Microsoft Semantic Kernel](https://learn.microsoft.com/en-us/semantic-kernel/) for Java. Semantic Kernel is Microsoft's enterprise-grade AI orchestration SDK with plugins, memory, and planners. Adding `atmosphere-semantic-kernel` as a dependency makes `@AiEndpoint` route streaming chat through an SK `ChatCompletionService` and makes `EmbeddingRuntime` use SK's `TextEmbeddingGenerationService`.
99

10-
Semantic Kernel is the **7th runtime** added to Atmosphere in 4.0.36.
10+
Semantic Kernel landed as the 7th `AgentRuntime` in Atmosphere 4.0.36; the 8th and 9th (AgentScope, Spring AI Alibaba) followed in 4.0.42.
1111

1212
## Maven Coordinates
1313

@@ -126,7 +126,7 @@ See the `modules/semantic-kernel/README.md` exclusion note for the full trade-of
126126

127127
## Samples
128128

129-
Semantic Kernel is wired into [spring-boot-ai-classroom](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ai-classroom) as one of the seven swappable runtimes. Drop the `atmosphere-semantic-kernel` JAR alongside `atmosphere-ai` and the same `@AiEndpoint` code routes through SK.
129+
Semantic Kernel is wired into [spring-boot-ai-classroom](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ai-classroom) as one of the nine swappable runtimes. Drop the `atmosphere-semantic-kernel` JAR alongside `atmosphere-ai` and the same `@AiEndpoint` code routes through SK.
130130

131131
## See Also
132132

docs/src/content/docs/integrations/spring-boot.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public class BackgroundChat {
244244
- `maxDelayMs` — cap on exponential backoff (default `30000`)
245245
- `backoffMultiplier` — exponential factor (default `2.0`)
246246

247-
**Runtime coverage:** per-request retry is **Built-in only** in 4.0.36. Framework runtimes (Spring AI, LangChain4j, ADK, Koog, Embabel, Semantic Kernel) inherit their native retry layers and ignore the per-request override. The Built-in runtime threads `context.retryPolicy()` into `OpenAiCompatibleClient.sendWithRetry` as a real override. See the [per-runtime capability matrix](../../tutorial/11-ai-adapters/#per-runtime-capability-matrix) for the full breakdown.
247+
**Runtime coverage:** all eight framework adapters declare `PER_REQUEST_RETRY` honestly as of 4.0.43 (commit `374631e7`) — `AbstractAgentRuntime.executeWithOuterRetry` wraps each adapter's dispatch in a retry loop respecting `context.retryPolicy(...)`, on top of each runtime's own native retry layer (Spring Retry, LC4j `RetryUtils`, ADK `HttpClient`, Koog `CallRetryPolicy`, SK `OpenAIAsyncClient`). The Built-in runtime additionally threads `context.retryPolicy()` into `OpenAiCompatibleClient.sendWithRetry` as a native override. See the [per-runtime capability matrix](../../tutorial/11-ai-adapters/#per-runtime-capability-matrix) for the full breakdown.
248248

249249
## Samples
250250

docs/src/content/docs/reference/ai.md

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public interface AgentRuntime {
8181

8282
To switch runtimes, change a single Maven dependency — no code changes needed.
8383

84-
> **Spring AI Alibaba runtime — Spring Boot 3 only today.** Spring AI Alibaba `1.1.2.0` is compiled against Spring AI `1.1.2`, and `spring-ai-alibaba-graph-core-1.1.2.0` hardcodes Spring AI 1.1.2-only types like `DeepSeekAssistantMessage`, so the runtime requires Spring AI 1.1.2. Spring AI 1.1.2 itself requires Spring Boot 3 — it pins the SB3-era FQN of `RestClientAutoConfiguration`, which Spring Boot 4 ships at a renamed FQN. Drop `atmosphere-spring-ai-alibaba` into a Spring Boot 3 sample (e.g. `samples/spring-boot-ai-chat -Pspring-boot3`) and it round-trips end-to-end (verified via chrome-devtools against Ollama). A Spring Boot 4 path will become possible once Alibaba publishes a Spring AI 2.x-aligned `spring-ai-alibaba-agent-framework`. `atmosphere-agentscope` is unaffected and works on Spring Boot 4.
84+
> **Spring AI Alibaba runtime — Spring Boot 3 only today.** Spring AI Alibaba `1.1.2.2` is compiled against Spring AI `1.1.2`, and `spring-ai-alibaba-graph-core-1.1.2.x` hardcodes Spring AI 1.1.2-only types like `DeepSeekAssistantMessage`, so the runtime requires Spring AI 1.1.2. Spring AI 1.1.2 itself requires Spring Boot 3 — it pins the SB3-era FQN of `RestClientAutoConfiguration`, which Spring Boot 4 ships at a renamed FQN. Drop `atmosphere-spring-ai-alibaba` into a Spring Boot 3 sample (e.g. `samples/spring-boot-ai-chat -Pspring-boot3`) and it round-trips end-to-end (verified via chrome-devtools against Ollama). A Spring Boot 4 path will become possible once Alibaba publishes a Spring AI 2.x-aligned `spring-ai-alibaba-agent-framework`. `atmosphere-agentscope` is unaffected and works on Spring Boot 4.
8585
8686
### Per-Request Runtime Extensions
8787

@@ -90,16 +90,22 @@ that need framework-native composition (Spring AI advisor chain, LangChain4j
9090
`AiServices`, Koog graph DSL, ADK multi-agent topology), a small per-request
9191
helper attaches the framework-native object to `AgentExecutionContext.metadata()`
9292
and the runtime applies it for that one call — no `AgentRuntime` SPI growth, no
93-
mutation of shared beans. All five helpers follow the `CacheHint` pattern:
94-
`from(context)` and `attach(context, ...)` static methods.
93+
mutation of shared beans. Every helper follows the `CacheHint` pattern:
94+
`from(context)` and `attach(context, ...)` static methods, with strict type
95+
checking that throws `IllegalArgumentException` on a wrong-type slot (silent
96+
drops would mask the override never firing).
9597

9698
| Helper | Runtime | Slot it drives |
9799
|--------|---------|----------------|
98-
| `SpringAiAdvisors` | Spring AI | `ChatClient.prompt().advisors(...)` — RAG, memory, guardrails, observability |
99-
| `LangChain4jAiServices` | LangChain4j | Routes through caller's `AiServices`-backed interface (`TokenStream` callbacks bridged to session) |
100+
| `SpringAiAdvisors` | Spring AI | `ChatClient.prompt().advisors(...)` — RAG, memory, guardrails, observability (additive — multiple advisors compose into a chain) |
101+
| `LangChain4jAiServices` | LangChain4j | Routes through caller's `AiServices`-backed interface (`TokenStream` callbacks bridged to session) — gives access to `maxSequentialToolsInvocations`, custom system message providers, etc. |
100102
| `KoogStrategy` | Koog | Swaps default `chatAgentStrategy()` with a custom `AIAgentGraphStrategy<String, String>` from the `strategy {}` DSL |
101103
| `AdkRootAgent` | ADK | Replaces the runtime's default `LlmAgent` with `SequentialAgent` / `ParallelAgent` / `LoopAgent` / any `BaseAgent` subclass |
102-
| `ToolLoopPolicies` | Built-in | Per-request `ToolLoopPolicy(maxIterations, OnMaxIterations)` for the OpenAI-compatible tool loop |
104+
| `SemanticKernelInvocation` | Semantic Kernel | Per-request `InvocationContext` — unlocks `KernelHooks`, `withMaxAutoInvokeAttempts`, custom `PromptExecutionSettings` |
105+
| `EmbabelPromptRunner` | Embabel | `UnaryOperator<PromptRunner>` customizer applied AFTER the runtime's default wiring — stack `withTemperature` / `withModel` / `withGuardrails` on top. Atmosphere-native dispatch path only |
106+
| `AgentScopeAgent` | AgentScope | Per-request `ReActAgent` — useful when different prompts route through different agent topologies (planner vs. quick lookup) without re-installing the runtime client |
107+
| `SpringAiAlibabaRunnableConfig` | Spring AI Alibaba | Per-request `RunnableConfig` — Alibaba's natural per-invocation handle for `threadId` (memory thread continuation), `checkPointId` (resume), `streamMode`, metadata, store |
108+
| `ToolLoopPolicies` | Built-in, Koog | Per-request `ToolLoopPolicy(maxIterations, OnMaxIterations)` — Built-in honors via OpenAI-compatible tool loop, Koog via `AIAgent.maxIterations` |
103109

104110
Example — Spring AI advisor scoped to one request:
105111

@@ -123,11 +129,14 @@ returns non-empty). See the per-module READMEs for full DSL examples:
123129
[`modules/adk`](https://github.com/Atmosphere/atmosphere/blob/main/modules/adk/README.md#multi-agent-composition-adkrootagent),
124130
and the [`ToolLoopPolicy`](https://github.com/Atmosphere/atmosphere/blob/main/modules/ai/README.md#tool-loop-policy) section.
125131

126-
Other runtimes (`AgentScope`, `Embabel`, `SemanticKernel`, `SpringAiAlibaba`) do
127-
not yet ship a per-request bridge. `Embabel` did get **native streaming** in the
128-
same merge: when `StreamingPromptRunnerBuilder.streaming().generateStream()` is
129-
available the runtime emits `Flux<String>` chunks directly to the session, with
130-
graceful fallback to `runner.generateText(...)` when the streaming API is absent.
132+
All eight framework runtimes now ship a per-request sidecar (the four added
133+
most recently — `SemanticKernelInvocation`, `EmbabelPromptRunner`,
134+
`AgentScopeAgent`, `SpringAiAlibabaRunnableConfig` — close the matrix that
135+
previously left these adapters without a per-request escape hatch). `Embabel`
136+
also has **native streaming**: when
137+
`StreamingPromptRunnerBuilder.streaming().generateStream()` is available the
138+
runtime emits `Flux<String>` chunks directly to the session, with graceful
139+
fallback to `runner.generateText(...)` when the streaming API is absent.
131140

132141
### Model-Lifecycle Observability
133142

@@ -682,7 +691,8 @@ The `RecordingSession` test double captures all events, text chunks, metadata, a
682691
- [Spring Boot AI Chat](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ai-chat) -- built-in client with Gemini/OpenAI/Ollama
683692
- [Spring Boot AI Tools](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ai-tools) -- framework-agnostic `@AiTool` pipeline
684693
- [Spring Boot AI Classroom](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-ai-classroom) -- rooms-based multi-room AI with an Expo client
685-
- [Spring Boot Koog Chat](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-koog-chat) -- JetBrains Koog adapter
694+
- [Spring Boot RAG Chat](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-rag-chat) -- Spring AI VectorStore-backed RAG agent
695+
- [Quarkus AI Chat](https://github.com/Atmosphere/atmosphere/tree/main/samples/quarkus-ai-chat) -- five `@AiEndpoint` demos on Quarkus + LangChain4j bridge
686696
- [Spring Boot Dentist Agent](https://github.com/Atmosphere/atmosphere/tree/main/samples/spring-boot-dentist-agent) -- `@Agent` with tools, memory, and approval gates
687697

688698
## See Also

docs/src/content/docs/reference/foundation-primitives.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ broadcasters on reconnect but not in-flight agent runs.
110110
- **Shipped**: SPI + default implementation + unit tests + zero-warning
111111
compile. All eight primitives are shipped in the current branch.
112112
- **Complete**: shipped + wired into live paths + cross-runtime contract
113-
tests green on all seven runtimes + security invariants verified.
113+
tests green on all nine runtimes + security invariants verified.
114114

115115
The completion bar is raised by three follow-up phases: gateway wire-in,
116116
cross-runtime contract test matrix, and security default hardening.

docs/src/content/docs/tutorial/00-cli.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ The interactive picker shows every sample grouped by category. Pick one, then ch
8080
4) spring-boot-ai-chat AI streaming with conversation memory and structured events
8181
5) spring-boot-ai-classroom Multiple clients share streaming AI responses
8282
6) spring-boot-ai-tools Framework-agnostic @AiTool tool calling
83-
7) spring-boot-koog-chat Kotlin-based Koog agent chat
83+
7) spring-boot-rag-chat RAG agent over Spring AI VectorStore
8484
...
8585
8686
Pick a sample:
@@ -124,9 +124,12 @@ plain `mvn compile`.
124124
| `mcp-server` | `spring-boot-mcp-server` | MCP tools, resources, and prompts |
125125
| `rag` | `spring-boot-rag-chat` | RAG chat with Spring AI vector store + embeddings |
126126
| `agent` | `spring-boot-dentist-agent` | Single agent with `@Agent` / `@Command` + skill file |
127-
| `koog` | `spring-boot-koog-chat` | JetBrains Koog runtime (Kotlin) |
128127
| `multi-agent` | `spring-boot-multi-agent-startup-team` | 5-agent `@Coordinator` fleet with A2A specialists |
129128
| `classroom` | `spring-boot-ai-classroom` | Multi-room shared AI (Spring Boot + Expo React Native client) |
129+
| `ms-governance` | `spring-boot-ms-governance-chat` | Microsoft Agent Governance Toolkit demo (`@AgentScope` policy chain) |
130+
| `coding-agent` | `spring-boot-coding-agent` | Sandboxed coding agent — clones a repo, reads files, proposes a patch |
131+
| `guarded-agent` | `spring-boot-guarded-email-agent` | Plan-and-Verify (`atmosphere-verifier`) inbox-exfiltration demo |
132+
| `assistant` | `spring-boot-personal-assistant` | Long-lived `@Coordinator` assistant with memory + delegation |
130133

131134
Pass `--skill-file <path>` to auto-select the `agent` template with
132135
your skill file wired in.
@@ -146,9 +149,9 @@ atmosphere new my-kotlin-ai --template ai-chat --runtime embabel
146149

147150
Available runtimes: `builtin` (default — no extra deps),
148151
`spring-ai`, `langchain4j`, `adk`, `koog`, `embabel`,
149-
`semantic-kernel`. The mapping lives in `cli/runtime-overlays.json`;
150-
each entry lists the dep set to inject (and any extra repository, e.g.
151-
Embabel's release repo).
152+
`semantic-kernel`, `agentscope`, `spring-ai-alibaba`. The mapping
153+
lives in `cli/runtime-overlays.json`; each entry lists the dep set to
154+
inject (and any extra repository, e.g. Embabel's release repo).
152155

153156
#### `--force`: Strip Pre-Pinned Adapters
154157

@@ -201,7 +204,8 @@ always in sync.
201204
| `spring-boot-ai-chat` | Conversation memory, structured events, capability validation | 8080 |
202205
| `spring-boot-ai-classroom` | Multiple clients share streaming AI responses | 8080 |
203206
| `spring-boot-ai-tools` | Framework-agnostic `@AiTool` tool calling | 8080 |
204-
| `spring-boot-koog-chat` | Kotlin-based Koog agent chat | 8080 |
207+
| `spring-boot-rag-chat` | RAG agent over Spring AI VectorStore | 8080 |
208+
| `quarkus-ai-chat` | Same `@AiEndpoint` shape as `spring-boot-ai-chat` on Quarkus + LangChain4j bridge | 18810 |
205209
| `spring-boot-rag-chat` | RAG with Spring AI vector store | 8080 |
206210

207211
### Agents & Coordination

0 commit comments

Comments
 (0)