Skip to content

Releases: JetBrains/koog

1.0.0

21 May 16:06

Choose a tag to compare

This is the first stable release of Koog. The 1.0 line establishes a long-term-supported surface across the framework: modules are split into stable and beta streams so production code can pin to APIs that won't break without a deprecation cycle, every previously deprecated API has been removed, and the graph DSL's node names are finalized. Alongside that, 1.0 lands a redesigned Java interop layer, decouples HTTP transport from Ktor, brings OpenTelemetry to Kotlin Multiplatform, and adds Anthropic prompt caching.

Major Features

Stable / Beta module split

  • Modules now ship under two streams — stable and beta — so production code can pin to APIs that won't break without a deprecation cycle (#2011, #2000).
  • All previously @Deprecated APIs have been removed across event handlers, pipeline, agent/strategy/DSL, tools, persistence, executors, MCP, models, Spring autoconfig, and RAG utilities. The 1.0 line carries no deprecated surface (#2001).

Java interop, redesigned

  • Uniform blocking API: All Java-facing entry points follow one pattern — xxxBlocking in Kotlin, plain xxx from Java. Explicit ExecutorService / Executor parameters are gone; the agent's configured dispatcher is used instead (#2005).
  • Deadlock-free reentrant calls: Kotlin → Java → Kotlin call chains on a single-threaded executor no longer deadlock — the reentrant dispatch is detected and skipped (#1945, KG-750).

Graph DSL, finalized

  • The String-input nodes (nodeLLMRequest, nodeLLMRequestOnlyCallingTools, nodeLLMRequestWithoutTools, nodeLLMRequestForceOneTool, nodeLLMRequestMultipleChoices, nodeLLMRequestStreaming, nodeLLMRequestStructured) keep their original names; the Message.User-input variants now use a nodeLLMSendMessage* prefix.
  • nodeExecuteTools returns ReceivedToolResults directly — connect it to nodeLLMSendMessage / nodeLLMSendToolResults* instead of relying on the old auto-writeback behavior.
  • New nodeLLMModerateText(name, moderatingModel, includeCurrentPrompt) accepts plain String input alongside the existing nodeLLMModerateMessage(Message.User) (#2035).

Memory and persistence

  • AIAgentStorage in checkpoints: Custom key-value data is now saved and restored alongside agent checkpoints; a new runFromCheckpoint API restores execution without requiring the Persistence feature (#1998, #1828).
  • Persistence for planner agents: Planner-based agents now support checkpoint/restore (#1786, KG-673).
  • Amazon Bedrock AgentCore as LongTermMemory: Managed vector-memory backend on Bedrock (#1855, KG-603).
  • LongTermMemory reliability: Storage errors no longer silently swallowed — new FailurePolicy plus a fix for double-ingestion during active sessions. Feature promoted from experimental (#1963).

HTTP transport, decoupled from Ktor

  • Pluggable HTTP factory: LLM clients now take a KoogHttpClient.Factory instead of a Ktor HttpClient. A Ktor-backed default is auto-discovered on JVM/Android; users can plug in Java's HTTP client, OkHttp, or Spring's RestClient without touching Koog internals (#2006, #1948, KG-821, KG-818).
  • Ollama on KoogHttpClient: Ollama now routes streaming, headers, and endpoint config through the same abstraction as every other provider (#1993, KG-833).

OpenTelemetry on every target

  • Multiplatform OpenTelemetry: Langfuse, Weave, and DataDog now run on every Koog target via a Ktor-based OTLP/JSON exporter, not just JVM (#1942, KG-785). Please note: the WasmJS target is not included for now (please see KG-846 for more details).
  • Built-in metrics: Agents emit standard gen_ai.client.token.usage, gen_ai.client.operation.duration, and a custom gen_ai.client.tool.count metric — plug straight into existing Prometheus/Grafana stacks (#1381, KG-136).

Anthropic prompt caching

  • Automatic and explicit cache control: End-to-end caching support — automatic on requests, explicit breakpoints on messages, cache tokens in usage metrics. Cuts cost and latency for agents that re-send long system prompts (#1812, KG-707).

New providers

  • LiteRT LLM client: New client for running Google's LiteRT models locally (#1980).
  • Oracle Database ChatHistoryProvider for Oracle-standardized deployments (#1851, KG-772).

Improvements

  • New models: Anthropic Opus 4.7 (#1861), OpenAI GPT-5.5 and GPT-5.5 Pro (#1913), DeepSeek V4 Flash and Pro (#1914), additional Bedrock models — Kimi K 2.5, MiniMax 2.5, Gemma 3, GPT OSS (#1902), and Ollama gpt-oss / qwen3.5 (#1292).
  • ToolCallMetadata side channel: Tools can now receive per-call context (trace IDs, correlation IDs, feature flags, the live AIAgentContext) without polluting their LLM-visible argument schema. Features can contribute metadata via AIAgentPipeline.provideToolCallMetadata, with caller-supplied values winning on key collision (#1886, #1777).
  • Planners moved to a dedicated module: GOAPPlanner and SimpleLLMPlanner now live in a separate agents:agents-planners module, and a simpler AIAgentPlannerStrategy.create(name, planner) factory replaces the old builder. Agents that don't use planning no longer pay the dependency cost (#1997).
  • MCP SDK upgrade with Streamable HTTP: MCP kotlin-sdk upgraded from 0.8.1 to 0.11.1; Streamable HTTP is now the primary transport for both MCP client and server (#1870, KG-792, KG-756, KG-755, KG-49).
  • RetrieveFactsFromHistory extracted from AgentMemory: This HistoryCompressionStrategy now lives outside the AgentMemory feature so it can be used independently. The old AgentMemory feature is removed in favor of the more capable LongTermMemory (#1927).
  • OpenTelemetry GenAI semantic conventions update: Aligned with the latest spec — content is carried via gen_ai.input.messages / gen_ai.output.messages attributes instead of deprecated per-message events; moderation results moved to a Koog custom attribute koog.moderation.result (#1967, KG-826).
  • KoogClock migration: Internal time APIs now use a KoogClock abstraction instead of kotlin.time.Clock, enabling virtual-time testing and consistent clock behavior across platforms (#1925).
  • Minimum Java version raised to 17: Aligns the runtime requirement with documentation and modern toolchain expectations (#1931).
  • Factory functions replace invoke constructors: AIAgent, AIAgentService, ToolRegistry, RollbackToolRegistry, and AIAgentPlannerStrategy now use top-level factory functions. Usage syntax (A(...)) is unchanged for normal callers (#1882).
  • Agent pipeline cleanup: Pipeline event contexts now expose the AIAgent instance directly instead of separate agentId / config fields; parameter order is harmonized across pipeline interfaces (#1991, KG-807).

Bug Fixes

Highlights below — see the 1.0.0-preview entry for the full per-PR list.

  • Streaming hardening across providers (#1844, #1775, #1887, #1237, #1888, KG-811, #1884, #1878, #2012, #1978, #1868, #1865, #1866, #1369, KG-626): Ollama (Flow invariant is violated from cross-dispatcher emission, text/plain JSON responses, tool-call-before-text ordering), OpenAI (additional_properties leak under JsonNamingStrategy.SnakeCase, decode failures wrapped in LLMClientException, keepalive frames honored), Google (reasoning vs. plain text in streaming), and OpenRouter (tool calls during streaming) all now behave consistently end-to-end.
  • Error propagation through the pipeline (#1918, KG-815, #1548, KG-704, #2037, KG-845, #2024, KG-844): Pipeline failure hooks now receive the original Throwable instead of a stringified AIAgentError — fixes a latent error.type mislabel in OpenTelemetry spans, and reflective tool failures surface the real exception message instead of "Unknown error". LLMCallFailedContext.eventType now reports LLMCallFailed (was LLMCallStarting); LLMCallFailedEvent / LLMStreaming / SubgraphExecution are registered for remote event serialization.
  • OpenTelemetry stability (#1435, KG-675, #1969, KG-808, #1547, KG-703, #1856, #1850): Failed LLM requests no longer crash the feature — failures are signaled via span ERROR status and error.type. SpanAdapter.onBeforeSpanFinished now runs on fully populated spans, so Langfuse and Weave adapters see the same data the SDK exports. Langfuse trace-level attributes (langfuse.environment, etc.) are set on every span, not just invoke_agent. The hardcoded JVM shutdown hook is gone — opt in via setShutdownOnAgentClose (default false).
  • Persistence & subgraph correctness (#2044, #1971, #2039): Persistence.runFromCheckpoint skips tools that are no longer registered instead of throwing. subgraphWithTask / subtask no longer drop tool results when the finish tool is called alongside other tools. PromptAugmenter implementations (SystemPromptAugmenter, UserPromptAugmenter, AgentcorePromptAugmenter) append a new MessagePart to the existing Message after the Message / MessagePart refactor.
  • Tool / concurrency / security (#1883, #1881, #1871, #1965): @Tool(customName = ...) is honored in ToolSet.asTools(). withPrompt uses a write lock (was read lock — could race with concurrent prompt mutations). Anthropic API key is masked in Spring Boot autoconfiguration logs (security fix).

Breaking Changes

The 1.0 release is the stable baseline. Highlights below — for the full per-API list (constructor signatures, parameter renames, removed members), see the 1.0.0-preview entry.

  • All @Deprecated APIs removed (#2001): no deprecated members survive into 1.0. Includes a typo-spelling fix Persistency*Persistence* across the storage providers (update imports). Old AIAgentPipeline / AIAgentPipelineImpl are gone — use AIAgentPipelineAPI / AIAgentGraphPipeline / AIAgentPlannerPipeline. Retired models: `AnthropicModels.Ha...
Read more

1.0.0-preview3

20 May 17:04

Choose a tag to compare

1.0.0-preview3 Pre-release
Pre-release

A follow-up to 1.0.0-preview2 focused on final fixes in the Persistence API.

Bug Fixes

  • Persistence.runFromCheckpoint now skips tools that are no longer registered instead of throwing while restoring the state of the agent (#2044).

1.0.0-preview2

19 May 18:43

Choose a tag to compare

1.0.0-preview2 Pre-release
Pre-release

A follow-up to 1.0.0-preview focused on finishing the 1.0 API cleanup. All previously deprecated APIs are now gone, the graph DSL's node names are settled, and a few late-breaking event/augmenter bugs from the preview window are fixed.

Bug Fixes

  • LLMCallFailedContext.eventType reported LLMCallStarting: The failed-call event context advertised the wrong lifecycle type, so listeners filtering by eventType saw failures as starts. Now correctly emits LLMCallFailed (#2037, KG-845).
  • LLMCallFailedEvent missing from remote event serialization: The event wasn't registered in the polymorphic feature-message module, so it never made it across the trace transport. Added registration plus trace-format branches for the previously missing LLMStreaming and SubgraphExecution events (#2024, KG-844).
  • PromptAugmenter implementations after the Message / MessagePart refactor: SystemPromptAugmenter, UserPromptAugmenter, and AgentcorePromptAugmenter now append a new MessagePart to an existing Message instead of constructing a fresh message, and share a common SECTION_SEPARATOR constant for consistent layout (#2039).

Breaking Changes

  • All @Deprecated APIs removed (#2001). The 1.0 line carries no deprecated surface. Notable removals:

    • Event handlers: Deprecated*EventHandlerContext classes (agent, LLM, node, tool, strategy) and the old StrategyEventContext. Use the current AIAgentPipelineAPI / AIAgentGraphPipelineAPI / AIAgentPlannerPipelineAPI event contexts.
    • Pipeline: the old AIAgentPipeline / AIAgentPipelineImpl are gone; surviving APIs live on AIAgentPipelineAPI / AIAgentGraphPipeline / AIAgentPlannerPipeline.
    • Agent / strategy / DSL: deprecated members on AIAgentService, AIAgentTool, GraphAIAgent, AIAgentContext, AIAgentGraphContext, AIAgentGraphStrategy, AIAgentNode, AIAgentNodeDelegate, AIAgentParallelNodesMergeContext, AIAgentSubgraphBuilder, and the deprecated AIAgentConfig constructors.
    • Tools: deprecated entry points on Tool, SimpleTool, ToolArgs, ToolResult, plus ReceivedToolResult legacy fields.
    • Persistence: typo-spelling fix — PersistencyStorageProvider / FilePersistencyStorageProvider / JVMFilePersistencyStorageProvider renamed to Persistence* (update imports). Deprecated Persistence feature shims, PersistenceFeatureConfig members, and the H2/SQL Checkpoint*BackwardCompatibilityTest paths are removed. AgentCheckpointData legacy fields are gone.
    • Executors: deprecated members on DefaultMultiLLMPromptExecutor, SingleLLMPromptExecutor, and the JVM SimplePromptExecutors shims.
    • MCP: deprecated overloads on McpServer and McpToolRegistryProvider.
    • Models: AnthropicModels.Haiku_3 and BedrockModels.AnthropicClaude3Haiku, plus deprecated Google and DeepSeek model entries.
    • Spring autoconfig: deprecated members on the Anthropic / DeepSeek / Google / Mistral / Ollama / OpenAI / OpenRouter auto-configurations.
    • RAG / utilities: deprecated members on SearchStorage, EmbeddingStorage, ModelInfo, DummyAIAgentContext.
  • Graph DSL node names settled (#2035). The WithUserText suffix introduced in 1.0.0-preview is gone — String-input nodes recover their original names, and the Message.User-input variants move to a SendMessage* prefix:

    • nodeLLMRequestWithUserTextnodeLLMRequest (takes String); the Message.User overload from preview is now nodeLLMSendMessage.
    • Same pattern for the other variants: nodeLLMRequestOnlyCallingTools, nodeLLMRequestWithoutTools, nodeLLMRequestForceOneTool, nodeLLMRequestMultipleChoices, nodeLLMRequestStreaming, nodeLLMRequestStructured — the String-input forms keep these names; Message.User-input forms are renamed to nodeLLMSendMessage*.
    • nodeExecuteTools now returns ReceivedToolResults (previously named nodeExecuteToolsAndGetResults). The old nodeExecuteTools that wrote results back into the LLM session and returned Message.User is removed — connect the new nodeExecuteTools directly to nodeLLMSendMessage / nodeLLMSendToolResults* instead.
    • New nodeLLMModerateText(name, moderatingModel, includeCurrentPrompt) accepts plain String input alongside the existing nodeLLMModerateMessage(Message.User).
  • Prompt class moved out of the dsl package (#2022). ai.koog.prompt.dsl.Prompt is now ai.koog.prompt.Prompt. The prompt { ... } DSL builder stays in ai.koog.prompt.dsl — only the type import changes.

  • Dependency ABI cleanup (#2007).

    • oshai.kotlin.logging is no longer in the :prompt-executor-clients public API (apiimplementation). Consumers that imported KLogger transitively must add their own implementation(libs.oshai.kotlin.logging).
    • oshai-logging upgraded 7.0.78.0.01 — 8.x has API refactors; update your KLogger usage if affected.
    • ktor.server.sse is no longer transitively exposed by :agents-features-tokenizer / :agents-features-trace. Depend on it directly if you used it through these modules.
    • Internal: ktor3 3.2.23.3.3, kotlinx-io 0.7.00.9.0. android.useAndroidX=true is now enabled (required by okhttp-android transitive from ktor 3.3.3).

1.0.0-preview

17 May 13:32

Choose a tag to compare

1.0.0-preview Pre-release
Pre-release

This release marks Koog's transition toward a stable 1.0 API. The library is now split into "stable" and "beta" modules, so production code can pin to APIs that won't break unexpectedly while experimental features continue to evolve. Alongside that, this release lands a redesigned Java interop layer, decouples HTTP transport from Ktor, brings OpenTelemetry to Kotlin Multiplatform, and adds Anthropic prompt caching.

Major Features

Stable / Beta module split

  • Versioning by stability: Modules now ship under two streams — stable (1.0.0-preview) and beta (1.0.0-beta-preview) — so production code can pin to APIs that won't break without a deprecation cycle (#2011, #2000).

Java interop, redesigned

  • Uniform blocking API: All Java-facing entry points now follow one pattern — xxxBlocking in Kotlin, plain xxx from Java. Explicit ExecutorService / Executor parameters are gone; the agent's configured dispatcher is used instead (#2005).
  • Deadlock-free reentrant calls: Kotlin → Java → Kotlin call chains on a single-threaded executor no longer deadlock — the reentrant dispatch is detected and skipped (#1945, KG-750).

HTTP transport, decoupled from Ktor

  • Pluggable HTTP factory: LLM clients now take a KoogHttpClient.Factory instead of a default Ktor HttpClient. A Ktor-backed default is auto-discovered on JVM/Android when koog-agents-additions is used; users can plug in Java's HTTP client, OkHttp, or Ktor without touching Koog internals (#2006, #1948, KG-821, KG-818).
  • Ollama on KoogHttpClient: Ollama now routes streaming, headers, and endpoint config through the same abstraction as every other provider (#1993, KG-833).

OpenTelemetry on every target

  • Multiplatform OpenTelemetry: Langfuse, Weave, and DataDog now run on every Koog target via a Ktor-based OTLP/JSON exporter, not just JVM (#1942, KG-785).
  • Built-in metrics: Agents emit standard gen_ai.client.token.usage, gen_ai.client.operation.duration, and a custom gen_ai.client.tool.count metric — plug straight into existing Prometheus/Grafana stacks (#1381, KG-136).

Anthropic prompt caching

  • Automatic and explicit cache control: End-to-end caching support — automatic on requests, explicit breakpoints on messages, cache tokens in usage metrics. Cuts cost and latency for agents that re-send long system prompts (#1812, KG-707).

Memory and persistence

  • AIAgentStorage in checkpoints: Custom key-value data is now saved and restored alongside agent checkpoints; a new runFromCheckpoint API restores execution without requiring the Persistence feature (#1998, #1828).
  • Persistence for planner agents: Planner-based agents now support checkpoint/restore (#1786, KG-673).
  • Amazon Bedrock AgentCore as LongTermMemory: Managed vector-memory backend on Bedrock (#1855, KG-603).
  • LongTermMemory reliability: Storage errors no longer silently swallowed — new FailurePolicy plus a fix for double-ingestion during active sessions. Feature promoted from experimental (#1963).

New providers

  • LiteRT LLM client: New client for running Google's LiteRT models locally (#1980).
  • Oracle Database ChatHistoryProvider for Oracle-standardized deployments (#1851, KG-772).

Improvements

  • New models: Anthropic Opus 4.7 (#1861), OpenAI GPT-5.5 and GPT-5.5 Pro (#1913), DeepSeek V4 Flash and Pro (#1914), additional Bedrock models — Kimi K 2.5, MiniMax 2.5, Gemma 3, GPT OSS (#1902), and Ollama gpt-oss / qwen3.5 (#1292).
  • ToolCallMetadata side channel: Tools can now receive per-call context (trace IDs, correlation IDs, feature flags, the live AIAgentContext) without polluting their LLM-visible argument schema. Features can contribute metadata via AIAgentPipeline.provideToolCallMetadata, with caller-supplied values winning on key collision (#1886, #1777).
  • Planners moved to a dedicated module: GOAPPlanner and SimpleLLMPlanner now live in a separate agents:agents-planners module, and a simpler AIAgentPlannerStrategy.create(name, planner) factory replaces the old builder. Agents that don't use planning no longer pay the dependency cost (#1997).
  • MCP SDK upgrade with Streamable HTTP: MCP kotlin-sdk upgraded from 0.8.1 to 0.11.1; Streamable HTTP is now the primary transport for both MCP client and server (#1870, KG-792, KG-756, KG-755, KG-49).
  • RetrieveFactsFromHistory extracted from AgentMemory: This HistoryCompressionStrategy now lives outside the AgentMemory feature so it can be used independently. The old AgentMemory feature is removed in favor of the more capable LongTermMemory (#1927).
  • OpenTelemetry GenAI semantic conventions update: Aligned with the latest spec — content is carried via gen_ai.input.messages / gen_ai.output.messages attributes instead of deprecated per-message events; moderation results moved to a Koog custom attribute koog.moderation.result (#1967, KG-826).
  • KoogClock migration: Internal time APIs now use a KoogClock abstraction instead of kotlin.time.Clock, enabling virtual-time testing and consistent clock behavior across platforms (#1925).
  • Ollama think parameter from prompt params: The think flag is now sourced from prompt.params instead of being hard-coded, so callers can control reasoning behavior per prompt (#1615, #1877, KG-736).
  • SearchRequest interface in LongTermMemory: Replaces the concrete SimilaritySearchRequest so storages can implement keyword, hybrid, or other search types (#1864).
  • Minimum Java version raised to 17: Aligns the runtime requirement with documentation and modern toolchain expectations (#1931).
  • Factory functions replace invoke constructors: AIAgent, AIAgentService, ToolRegistry, RollbackToolRegistry, and AIAgentPlannerStrategy now use top-level factory functions instead of companion-object invoke operators. Usage syntax (A(...)) is unchanged for normal callers; only unusual forms like A.Companion.invoke() are affected (#1882).
  • Agent pipeline cleanup: Pipeline event contexts now expose the AIAgent instance directly instead of separate agentId / config fields, parameter order is harmonized, and KDoc style is unified across pipeline interfaces (#1991, KG-807).
  • Locks and exception utilities consolidated: Duplicate RWLock code moved into a dedicated agents-utils module (#1893, KG-812).

Bug Fixes

  • Spring Boot: Anthropic API key masked in autoconfiguration logs: Previously the key was emitted in plaintext during application startup. Security fix (#1965).
  • Ollama streaming Flow invariant is violated: buildStreamFrameFlow now uses channelFlow so emission works across the dispatched contexts Ktor's streaming HTTP introduces. Most visibly fixes Ollama streaming (#1844, #1775).
  • Ollama: text/plain responses parsed as JSON: Ollama sometimes returns valid JSON with Content-Type: text/plain. The client now registers JSON decoding for that content type too (#1887, #1237).
  • Ollama: tool calls returned before assistant text: When the model emits both a tool call and a text message, the tool call now comes first — matching OpenAI behavior — so built-in strategies don't terminate prematurely (#1888, KG-811).
  • Ollama batch embeddings: Implementation now handles both current and legacy Ollama API response formats (#1885, #1874).
  • Ollama embeddings implementation: Aligned with the official Ollama embeddings API (#1854).
  • OpenAI: additional_properties no longer leaks into requests: AdditionalPropertiesFlatteningSerializer now recognizes both camelCase and snake_case forms, so the additionalProperties map is correctly stripped under JsonNamingStrategy.SnakeCase and no longer trips OpenAI's 400 unknown_parameter error (#1884, #1878).
  • OpenAI: response decoding exceptions wrapped: AbstractOpenAILLMClient now wraps decode failures in LLMClientException instead of letting arbitrary exception types escape (#2012, #1978).
  • OpenAI / Google: keepalive and reasoning handling in streaming responses: OpenAI streaming now honors keepalive events; Google streaming now correctly distinguishes reasoning content from plain text (#1868, #1865, #1866).
  • OpenRouter: streaming with tool calls no longer errors (#1369, KG-626).
  • Streaming: blank tool call IDs processed correctly (#1915, #1900).
  • Streaming: empty text complete frames filtered out (#1924).
  • Reflective tool failures preserve the original exception message: Previously the InvocationTargetException wrapper hid the real error so agents received "Unknown error" — now the underlying cause is surfaced (#1548, KG-704).
  • @Tool(customName = ...) honored in ToolSet.asTools(): Custom tool names declared via the @Tool annotation are now respected when registering via tools(ToolSet) (#1883, #1881).
  • AIAgentError carries a type parameter: Adds the exception type to the error data class so downstream consumers can branch on it (#1917, KG-814).
  • Tool/agent event contexts carry the original Throwable: Pipeline failure hooks (onToolValidationFailed, onToolCallFailed, etc.) now receive a real Throwable instead of a stringified AIAgentError, preserving full exception details and fixing a latent error.type mislabel in OpenTelemetry spans (#1918, KG-815).
  • OpenTelemetry: failed LLM requests no longer crash the feature: Failures are signalled via span ERROR status and error.type attribute instead of the non-spec finish_reasons=[error] (#1435, KG-675).
  • OpenTelemetry: span adapter hooks run on fully populated spans: SpanAdapter.onBeforeSpanFinished now fires after all attributes are set, so Langfuse and Weave adapters see the same data the SDK exports (#1969, KG-808).
  • OpenTelemetry: Langfuse trace attributes set on every span: Previously only invoke_agent carried tra...
Read more

0.8.0

11 Apr 01:08

Choose a tag to compare

Major Features

  • Spring AI Integration: Added comprehensive Spring AI support with ChatMemoryRepository and VectorStore integration for seamless persistence and retrieval (#1719, #1763)
  • Amazon Bedrock AgentCore Memory: Introduced ChatHistoryProvider backed by Amazon Bedrock AgentCore Memory for managed conversation state (#1758)
  • DataDog LLM Observability: Added DataDog LLM Observability exporter with response metadata forwarding to inference spans (#1591)

Improvements

  • Native structured output for Claude 4.5+: Added JSON Schema support for Claude 4.5+ series models across Anthropic, Bedrock, and Vertex AI providers (#1593)
  • Mermaid diagram support for nested subgraphs: Enhanced Mermaid diagram generator to visualize subgraphs and nested subgraphs (#1745)
  • RAG-based abstractions:LongTermMemory feature now uses cleaner abstractions from rag-base for better modularity (#1785)
  • LLMClient constructor decoupling: Decoupled LLMClient constructors from Ktor for improved flexibility (#1742)
  • Customizable field names: Added support for customized field names in AdditionalPropertiesFlatteningSerializer (#1626)
  • GPT-5.4 models: Added support for GPT-5.4Mini and GPT-5.4Nano models (#1837)
  • Google models update: Updated Google models capabilities and deprecated older model versions (#1827)
  • Environment creation abstraction: Extracted environment creation into prepareEnvironment method in agent implementations for better extensibility (#1790)
  • Reasoning prompt refactoring: Moved reasoning prompt configuration to strategy parameters for better encapsulation (#1789)
  • JSON schema capabilities: Added JSON schema capabilities to OpenAI models (#1822)
  • Add missing JavaAPI for history compression inside write session: Added replaceHistoryWithTLDR as non-suspend method of AIAgentWriteSession (#1839)

Bug Fixes

  • Agent message handling: Corrected description of Koog agent message handling (#1010)
  • History compression with chat memory: Fixed missed prompt messages when chat memory feature is enabled (#1835)
  • Reasoning messages: Added IDs for reasoning messages and improved reasoning process to fix status 400 errors from OpenAI (#1779)
  • Ollama embedding: Check HTTP status before deserializing Ollama embedding response to prevent parsing errors (#1702)
  • Ktor parameter shadowing: Renamed registerTools parameter in koog-ktor to avoid Builder.build() shadowing (#1705, #1721)
  • Opus 4.6 token limit: Corrected maxOutputTokens from 1M to 128K for Claude Opus 4.6 (#1825)
  • Java AIAgentLLMWriteSession: Added Java support for AIAgentLLMWriteSession compress history functionality

Breaking Changes

  • LLMProvider singletons restored: Restored LLMProvider singletons and fixed reified type inference (potentially breaking for custom provider implementations) (#1800)

Examples

  • Spring AI Examples Add comprehensive examples of Koog + Spring AI integration

Documentation

  • Java API documentation: Add Java code snippets for Agent Events documentation (#1833)
  • DataDog documentation: add DataDog exporter documentation (#1801)
  • Java API documentation: Add Java code snippets for tracing feature (#1821)
  • Java API documentation: Add missing Java snippets for Persistence (#1818)
  • Java API documentation: Add java snippets for model capabilities docs (#1815)
  • Java API documentation: Add java snippets for content moderation docs (#1814)
  • Java API documentation: Add missing Java snippets for read/write LLM sessions (#1808)
  • Java API documentation: Predefined strategies Java snippets (#1796)
  • Java API documentation: Update streaming docs with Java snippets (#1792)
  • Fixed broken formatting: fix code snippets to remove leaking includes (#1759)
  • Improve wording: Update wording in History compression and Predefined nodes and components (#1699)

0.7.3

26 Mar 20:59

Choose a tag to compare

Published 26 March 2026

New Features

  • Bedrock prompt caching: Added CacheControl property on Assistant, User, and System messages within the Prompt and integrated explicit cache blocks in the Bedrock Converse API (#1583)

Bug Fixes

  • Agent deadlock fix: Fixed deadlock when agent.run() is called from within executor.submit — when the agent was invoked from a worker thread of the configured ExecutorService, runBlocking(context) would dispatch the coroutine back onto that executor and park the calling thread (KG-750, #1716)
  • AIAgentTool for simple agents: Fixed AIAgentTool to support simple agents that accept primitives as input by introducing AIAgentToolInput wrapper (#1729)
  • MCP custom transport: Fixed runtime crash when using non-default custom MCP transports in MCPToolRegistryProvider (#1740)
  • Anthropic tool error reporting: Added is_error flag for failed tool calls in the Anthropic client so the model is properly informed of tool execution failures (#1700)
  • DeepSeek reasoning with tool calls: Ensured reasoningContent is preserved and merged with tool calls to satisfy DeepSeek API requirements (#1614)

Breaking Changes

  • ToolRegistry.Builder removed: Unified everything under expect/actual ToolRegistryBuilder. Removed tools(Any) overload that was interfering with tools(List) and causing unexpected bugs (#1746)

Build

  • Removed stale coreLibrariesVersion override: The convention plugins were setting coreLibrariesVersion = "2.1.21" which made published POMs declare kotlin-stdlib 2.1.21, mismatching the actual 2.3.x compiler version. Removed the override so the POM picks up the real compiler version (#1697, #1722)

Documentation

  • Updated serialization documentation with Java snippets (#1732)
  • Added Java implementation for custom subgraphs documentation (KG-770, #1730)
  • Added Java implementation for OpenTelemetry, Langfuse, and Weave integration documentation (KG-760, #1696)
  • Moved "Chat agent with memory" tutorial under "Chat memory" feature section (#1686)

0.7.2

19 Mar 13:40

Choose a tag to compare

Published 19 March 2026

Bug Fixes

  • Java API for OpenTelemetry extensions: Fixed Java API inside OpenTelemetryConfig class annotated with @JavaOverride
    that relied on Kotlin Duration class, causing all further attributes to be skipped by the compiler in Langfuse and Weave extensions (KG-754, #1682)
  • System prompt preservation in agent builder: Fixed systemPrompt method in agent builders to preserve previously configured messages, id, and params in the prompt (KG-747, #1671)
  • LLMParams copy overloads: Added correct override fun copy() to all LLMParams subclasses (GoogleParams, AnthropicParams, OpenAIChatParams, etc.) so that Prompt.withUpdatedParams preserves provider-specific fields instead of silently dropping them. Also fixed BedrockConverseParams.copy() missing parameters and DashscopeParams incorrect super.copy() call (KG-742, #1668)

Breaking Changes

  • Removed input parameter from AIAgentFunctionalContext.subtask: The input parameter was not actually used; taskDescription is the right way to specify the task. Related methods and builders updated accordingly (#1667)

Documentation

  • Started porting rest of the documentation to Java (#1669)

0.7.1

17 Mar 20:21

Choose a tag to compare

Published 17 March 2026

Major Features

  • Java API: Introduced comprehensive Java interoperability across the framework:
    • Java API for creating and running agents from pure Java projects (#1185)
    • Builder-based Java API for graph strategies (#1581, #1617, #1366)
    • Java-friendly API for AIAgentStorage with JVM-specific methods (#1600)
    • Blocking API builders for PromptExecutor and LLMClient for Java (#1555, #1604)
    • Jackson as the default serializer for Java API (#1630)
    • Weave and Langfuse integrations now available from Java (#1616)
    • Centralized Java/Kotlin time conversion utilities (TimeUtils, toKotlinDuration, etc.) (#1620)
  • Spring AI Integration: Added two new Spring Boot starters (koog-spring-ai-starter-model-chat and koog-spring-ai-starter-model-embedding) to integrate Spring AI ChatModel and EmbeddingModel implementations as Koog LLM backends, enabling support for the wide range of providers available in Spring AI (KG-109, #1587)
  • Chat Memory: Introduced persistent chat memory with multiple storage backend options:
    • Core ChatMemory feature and ChatHistoryProvider abstraction (#1511)
    • Exposed-ORM based providers for PostgreSQL, MySQL, and H2 (#1584)
    • Pure JDBC ChatHistoryProvider for PostgreSQL, MySQL, and H2 with no ORM dependency (#1597)
    • JDBC-based PersistenceStorageProvider (#1612)
  • Long-term Memory: Added LongTermMemory feature that augments prompts with relevant memory records from storage and extracts/ingests new memories from agent conversations (#1490)
  • Library-Agnostic Serialization API: Introduced a JSONSerializer abstraction to support pluggable serialization libraries. Two implementations provided: KotlinxSerializer (default) and the new JacksonSerializer in a separate serialization-jackson module. Tools API migrated to this new abstraction (#1588)

Improvements

  • OpenTelemetry:
    • Added OpenTelemetry support for functional agent pipelines (KG-677, #1447)
    • Added OpenTelemetry spans for MCP tool calls (#1421)
  • Planner improvements:
    • Added AIAgentPlannerContext and AIAgentFunctionalContextBase for better context hierarchy and planner-specific APIs (#1480)
    • Added planner-specific pipeline interceptors: onPlanCreationStarting/Completed, onStepExecutionStarting/Completed, onPlanCompletionEvaluationStarting/Completed (KG-672, #1550)
    • GOAP strategies now have typed input/output and a dedicated GoapAgentState (#1498)
  • OpenRouter embedding support: Implemented LLMEmbeddingProvider for OpenRouter, enabling access to 21+ embedding models (KG-659, #1398)
  • Swift Package Manager support: Added XCFramework build and distribution infrastructure for iOS/macOS development via SPM (KG-682, #1485)

New LLM Models

  • Anthropic Claude Opus 4.6: Added support via Anthropic and Bedrock executors (#1513)
  • Google Gemini 3 Flash Preview: New model with extended capabilities and high-speed processing (#1621)
  • OpenAI GPT-5.x series: Added GPT-5.1-Codex-Max, GPT-5.2-Codex, GPT-5.3-Codex, GPT-5.4, and GPT-5.4-Pro (#1595)
  • Moonshot Kimi K2 Thinking: Added support via the Bedrock Converse API (#1436)
  • Ollama thinking support: Added think=true request parameter and streaming reasoning delta support for Ollama models (#1532)

Bug Fixes

  • Persistence checkpoints: Fixed last successful node being re-executed when restoring from a checkpoint; changed lastInput to lastOutput in checkpoint structure (#1308)
  • Ollama streaming: Fixed Ollama client to use preparePost(...).execute for proper streaming instead of buffering the full response (#1497)
  • OpenRouter streaming: Fixed missing reasoning and reasoningDetails fields in OpenRouterStreamDelta causing deserialization errors (#1504)
  • Dashscope streaming: Fixed tool call argument merging for streaming responses in DashscopeLLMClient (KG-658, #1590)
  • agents-ext dependency leak: Moved agents-ext from commonMain api to jvmTest implementation in agents-test to prevent transitive compile-time dependency leakage (#1506)
  • Streaming exception handling: executeStreaming now properly propagates exceptions from LLM clients and requires StreamFrame.End to signal stream completion (KG-550, #1580)
  • Debugger feature: Extended to support functional agents in addition to graph-based agents by dispatching appropriate strategy starting events (KG-741, #1637)

Breaking Changes

  • Serialization API: All encode/decode methods in Tool now accept a second JSONSerializer parameter. Automatic ToolDescriptor generation for primitive argument types (Tool<String, String>) is no longer supported without a custom descriptor. AIAgentFeature.createInitialConfig now takes an agentConfig: AIAgentConfig parameter. JSON types in pipeline events changed from kotlinx.serialization to ai.koog.serialization (#1588)
  • TypeToken replaces KType: Nodes and agent features now work with ai.koog.serialization.TypeToken instead of kotlin.reflect.KType. All typeOf<Foo>() usages should be replaced with typeToken<Foo>() (#1581)
  • Global JSON schema registries removed: RegisteredStandardJsonSchemaGenerators and RegisteredBasicJsonSchemaGenerators removed. getStructuredRequest and StructureFixingParser moved to ai.koog.prompt.executor.model package (KG-698, #1517)
  • LLMDescription.description renamed to value: The description field of LLMDescription has been renamed to value for Java compatibility (#1607)
  • Deprecated kotlinx.datetime imports replaced with kotlin.time equivalents (Clock, Instant) (#1533)
  • Retired Anthropic/Bedrock models: Removed Sonnet_3_7, Haiku_3_5, Sonnet_3_5, and Opus_3 from Anthropic models; removed several AI21, Bedrock, and legacy Anthropic models. Haiku_3 marked as deprecated (#1526)

Documentation

  • Added documentation for Java API and Java examples (#1610)
  • Added documentation for Spring AI integration (KG-109, #1627)
  • Added documentation for custom feature creation (#1295)
  • Reworked Getting Started, agent types, and Chat Memory tutorials (#1349, #1552)
  • Improved Prompts and Planner agent documentation (#1302, #1301)
  • Added nightly builds documentation (#1433)

Examples

  • Added Java example for JavaOne 2026 (#1641)
  • Added full Spring Boot Java API example (#1350)
  • Added example for calling a Koog agent from JavaScript code, including browser (TypeScript webapp) and Node.js usage with AbortSignal support (#1500)

0.6.4

04 Mar 09:18

Choose a tag to compare

Major Features

  • LLM Client Router: Added support for routing requests across multiple LLM clients with pluggable load balancing strategies. Includes a built-in round-robin router and fallback handling when a provider is unavailable (#1503)

Improvements

  • Anthropic models list: Implemented models() for the Anthropic LLM client, consistent with other supported providers (KG-527, #1460)
  • Dependency updates: Updated io.lettuce:lettuce-core from 6.5.5.RELEASE to 7.2.1.RELEASE (#1304)

Breaking Changes

  • OllamaModels relocation: OllamaModels and OllamaEmbeddingModels moved from prompt-llm to prompt-executor-ollama-client module (KG-121, #1470)

0.6.3

26 Feb 00:22

Choose a tag to compare

Improvements

  • Streaming reasoning support: Models with reasoning capabilities (like Claude Sonnet 4.5 or GPT-o1) now stream their reasoning process in real-time, allowing you to see how the model thinks through problems as it generates responses (KG-592, #1264)
  • LLModel API enhancement: LLM clients now return List<LLModel> instead of List<String> for improved type safety and direct access to model metadata (#1452)
  • Multiple event handlers per feature: Features can register multiple handlers for the same event type, enabling more flexible event processing (KG-678, #1446)
  • Dependency updates: Updated Kotlin libraries (KG-544, #1475):
    • Kotlin from 2.2.21 to 2.3.10
    • kotlinx-serialization from 1.8.1 to 1.10.0
    • kotlinx-datetime from 0.6.2 to 0.7.1

Bug Fixes

  • OpenRouter streaming: Fixed parsing errors when receiving reasoning content from models with reasoning capabilities by adding missing reasoning and reasoningDetails fields to the streaming response (#854)
  • ReadFileTool: Fixed incorrect binary file detection for empty files (KG-533, #1340)
  • DevstralMedium model: Added missing LLMCapability.Document capability (#1482)
  • Ktor integration: Fixed custom timeout values being ignored when configuring LLM providers in application.yaml (KTOR-8881, #807)

Breaking Changes

  • Streaming API redesign: Restructured StreamFrame types to distinguish between delta frames (incremental content like TextDelta, ReasoningDelta) and complete frames (full content like TextComplete, ReasoningComplete). Added End frame type to signal stream completion (#1264)
  • Kotlin version update: Migrated from Kotlin 2.2.21 to 2.3.10; replaced kotlinx.datetime.Clock/Instant with kotlin.time.Clock/Instant (#1475)
  • LLModel API changes: LLMClient.models() now returns List<LLModel> instead of List<String>; LLModel.capabilities and LLModel.contextLength are now nullable (#1452)

Documentation

  • Updated documentation for the singleRunStrategy API and AIAgentService class.

Refactoring

  • Module restructuring: Moved file-system abstractions (GlobPattern, FileSize, FileSystemEntry, FileSystemEntryBuilders) from agents-ext to rag-base module to reduce transitive dependencies (#1278)

Examples

  • Added the ACP (Agent Communication Protocol) agent example project (#1438)