Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,22 @@ All notable changes to Agents.KT are documented here. The format follows [Keep a

## [Unreleased]

## [0.8.0] — 2026-06-15

**Interoperable, multimodal agents — with capability grants.** The largest minor since 0.5.0:
agent-to-agent interop (**A2A v1**), full **multimodal** (audio STT/TTS, vision, image generation),
a **RAG** seam, richer **composition** (`handoff` / `firstOf` / `.speculative` / `loopUntil` /
built-in aggregators / forum captains), **human-in-the-loop** gates, an **eval** harness, history
compression, an **eighth model provider (Google Gemini)**, **agent.json** definition serialization,
and the **capability-grants** DSL (`grants { allow / confirm }`). Plus the planning groundwork for
the agentic-web standards (AGNTCY / AG-UI / x402 / NLWeb — PRD §12.6–§12.9). Additive: existing
public API surfaces are preserved.

*Deferred to 0.9.0:* the remaining Layer-2 **sandbox backends** — `DockerSandbox` (#2895), the
network hostname-allowlist **proxy** (#2893), and **read confinement** (#4546). `WasmSandbox` (#2894)
was closed won't-do; the rational WASM direction (agent → WASM export, #4547) is a separate
forward-looking track.

### Added — Google Gemini provider adapter (#1917)

Eighth built-in `ModelClient`: `model { gemini("gemini-2.5-flash"); apiKey = ... }` for Google's
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ The 0.6–0.7 line turns those boundaries into reviewable evidence: deterministi
```kotlin
// build.gradle.kts
dependencies {
implementation("ai.deep-code:agents-kt:0.7.24")
implementation("ai.deep-code:agents-kt:0.8.0")
}
```

Expand Down Expand Up @@ -262,7 +262,7 @@ What the framework does **not** enforce — your responsibility:
- **Seven LLM providers shipped** — Ollama, Anthropic, OpenAI, DeepSeek, Kimi (Moonshot AI, #2697), OpenRouter (#2701), and Perplexity (Sonar, #3675) — the last with a `perplexitySearch` web-grounded search tool (#3676 / #3677). Google (Gemini) is the main adapter still on the roadmap (Phase 2); the injectable `ModelClient` covers test stubs and your own adapters in the meantime.
- **Synchronous agentic loop** — `runBlocking` inside the loop until the suspend refactor lands (#638). Calling agents from existing coroutine scopes works but doesn't propagate cancellation cleanly.
- **No built-in MCP rate limiter** — use `McpServer` auth/policy plus a gateway for throttling. Agent/runtime audit events have a first-party JSONL exporter in `:agents-kt-observability`.
- **Streaming runtime** *(shipped — v0.5.0)*. `agent.session(input): AgentSession<OUT>` exposes `events: Flow<AgentEvent<OUT>>` — bracket events (`SkillStarted` / `SkillCompleted` / `Completed<OUT>` / `Failed`) plus mid-loop `Token` / `Reasoning` / `ToolCallStarted` / `ToolCallArgumentsDelta` / `ToolCallFinished` events as the agentic loop runs. All events carry `requestId`, `sessionId`, and `manifestHash` for audit correlation (#1913). All seven providers stream at the wire — Ollama (NDJSON), Anthropic and OpenAI (native SSE), with DeepSeek / Kimi / OpenRouter / Perplexity inheriting the OpenAI-compatible SSE path; live integration tests measure 19 / 2 / 19 chunks for the original three native adapters. `SkillCompleted.tokensUsed` and `Completed.tokensUsed` carry cumulative `TokenUsage` across all turns. The underlying `LlmChunk` sealed type + `ModelClient.chatStream(messages): Flow<LlmChunk>` foundation (#1722) is what custom adapters plug into. See [docs/streaming.md](docs/streaming.md) for the full API + the [v0.5.0 streaming premortem](docs/premortem-0.5.0-streaming.md) for design rationale.
- **Streaming runtime** *(shipped — v0.5.0)*. `agent.session(input): AgentSession<OUT>` exposes `events: Flow<AgentEvent<OUT>>` — bracket events (`SkillStarted` / `SkillCompleted` / `Completed<OUT>` / `Failed`) plus mid-loop `Token` / `Reasoning` / `ToolCallStarted` / `ToolCallArgumentsDelta` / `ToolCallFinished` events as the agentic loop runs. All events carry `requestId`, `sessionId`, and `manifestHash` for audit correlation (#1913). All eight providers stream at the wire — Ollama (NDJSON), Anthropic, OpenAI, and Gemini (native SSE), with DeepSeek / Kimi / OpenRouter / Perplexity inheriting the OpenAI-compatible SSE path; live integration tests measure 19 / 2 / 19 chunks for the original three native adapters. `SkillCompleted.tokensUsed` and `Completed.tokensUsed` carry cumulative `TokenUsage` across all turns. The underlying `LlmChunk` sealed type + `ModelClient.chatStream(messages): Flow<LlmChunk>` foundation (#1722) is what custom adapters plug into. See [docs/streaming.md](docs/streaming.md) for the full API + the [v0.5.0 streaming premortem](docs/premortem-0.5.0-streaming.md) for design rationale.
- *Partial cancellation today.* `Flow` collection cancels promptly, and `perToolTimeout` now applies to both regular and session-aware tool calls. Synchronous skill bodies and blocking HTTP reads still are not fully coroutine-cancellable mid-call; the remaining adapter migration is the `sendAsync`/suspend-refactor track.
- *Composition flow-through shipped (#3866).* Every composition operator exposes `session(...)`, and every `then` overload chains streaming — pipelines mixing `Parallel` / `Forum` / `Loop` / `Branch` mid-chain stream all nested agents' events through the parent session, demultiplexable by `agentId`. Remaining: pipeline-stage event types (`StageStarted` / `PipelineCompleted`).
- **No native binary** — JVM-only (≥ JDK 21). GraalVM and `jlink` bundles are Phase 2 priorities.
Expand Down Expand Up @@ -318,7 +318,7 @@ Topical guides:

## Current Release

The latest published release is `0.7.24` — **Perplexity + truth surface.** (Between releases, `main` carries unreleased work under a `-SNAPSHOT` version; see the [CHANGELOG](CHANGELOG.md) *Unreleased* section for what's landed since.) Perplexity becomes the **seventh model provider** (`model { perplexity("sonar") }`, #3675) and any agent on any model can register the **`perplexitySearch`** tool for live, web-grounded answers with citations that reach both the model context and the JSONL audit row (#3676/#3677) — `untrustedOutput = true`, so results arrive flagged as data, not instructions. The release also lands the **truth-surface pass** an external 0.7.23 review called for: SECURITY.md / production-hardening / skill-routing / HITL docs now match the shipped runtime, `main` adopts a `-SNAPSHOT` between-releases version policy, and a new `DocsConsistencyTest` pins provider counts, `Decision` variants, and routing claims to the code. Dependency line: Kotlin 2.4.0, jline 4, detekt 1.23.8, ksp 2.3.9. Additive only — drop-in on the 0.7.x line.
The latest published release is `0.8.0` — **interoperable, multimodal agents, with capability grants** (the largest minor since 0.5.0). (Between releases, `main` carries unreleased work under a `-SNAPSHOT` version; see the [CHANGELOG](CHANGELOG.md) for what's landed since.) Highlights: **A2A v1** (agents are A2A servers + typed clients), full **multimodal** (vision across Claude/OpenAI/Ollama, audio STT/TTS tools with self-hosted Whisper/Qwen, image generation), an **eighth model provider — Google Gemini** (`model { gemini("gemini-2.5-flash") }`, a full from-scratch adapter with native SSE, function calling, `responseJsonSchema` decoding, and thought-summary reasoning), **capability grants** (`grants { allow(...); confirm(...) }` — `confirm` tools need the granting agent's authorization, fail-closed), **agent.json** serialization, the **RAG** seam, and richer **composition** (`handoff` / `firstOf` / `.speculative` / `loopUntil` / aggregators / forum captains) plus HITL gates and an eval harness. The Layer-2 **sandbox backends** (Docker / egress proxy / read confinement) move to **0.9.0**. Additive only — drop-in on the 0.x line. Dependency line: Kotlin 2.4.0.

**0.7.23 — maintainability + a model-error policy.** A behavior-preserving, drop-in release that closes the bulk of the code-smell remediation epic (#2790) and finishes the **AgenticLoop decomposition** begun in 0.7.21: the `Agent` god class splits into `InterceptorChain` + `ListenerRegistry` (#2793); `McpServer` into HTTP intake + a transport-agnostic `McpDispatcher` (#2795); the five composition operators' duplicated streaming-session scaffold collapses into one `agentSessionScope` (#2797); `LiveShow`'s banner + thread-shadowing spinner become their own units (#2798); `Forum`/`Branch` lose their dual-path duplication (#2802); a typed `GenerableCodec` seam collapses the `@Generable` casts to one boundary (#2803); and `executeAgentic`'s last setup block extracts as `resolveAllowedTools` (#3423). The one **new public API** is **`onLLMError`** (#3508): when a model is configured, a failed model call in the agentic loop fails fast and loud by default, with `onLLMError { e -> RespondWith(fallback) | Rethrow }` as the opt-in recovery hook. The detekt-baseline ratchet fell 423 → 415 and `@Suppress("UNCHECKED_CAST")` 42 → 30 across the release. Only #2791 (the turn-loop core of `executeAgentic`) remains open in the epic.

Expand Down
Loading
Loading