| v3.4.1 | ## ๐ Security Notes - Haystack now requires `certifi>=2026.10.19`. `certifi` is installed transitively through `httpx` and `posthog`; earlier versions trust eMudhra/emSign certificate authorities whose private keys were compromised (GHSA-6q48-6c7w-9gw2). If you pin `certifi`, raise the pin to at least 2026.10.19. | High | 10/21/2026 |
| v3.4.0 | ## โญ๏ธ Highlights ### ๐ Python 3.15 Support, Python 3.10 Dropped Haystack now officially supports Python 3.15. Python 3.10 reaches end of life in October 2026, so the minimum supported version is now 3.11. โ ๏ธ ### ๐ฆ ToolResultOffloadCompactor: Compact Agent Context Without Losing Tool Results The experimental [`ToolResultOffloadCompactor`](https://docs.haystack.deepset.ai/docs/tool-result-offload-compactor) is a new compaction strategy for [`CompactionHook`](https://docs.haystack.deepset | High | 10/15/2026 |
| v3.3.0 | ## โญ๏ธ Highlight ### โก๏ธ Faster SentenceWindowRetriever [`SentenceWindowRetriever` ](https://docs.haystack.deepset.ai/docs/sentencewindowretriever) now queries the Document Store once per `run` or `run_async` call instead of once per retrieved document. Fewer calls mean lower latency and less load on the Document Store and outputs have not changed, so existing pipelines get faster without code changes. ## โฌ๏ธ Upgrade Notes - `InMemoryDocumentStore.bm25_retrieval` and `InMemoryBM25Retrieve | High | 10/1/2026 |
| v3.2.0 | ## โญ๏ธ Highlights ### ๐ง SummarizationCompactor: Compact Agent Context Without Losing It The experimental [`SummarizationCompactor`](https://docs.haystack.deepset.ai/docs/summarization-compactor) is a new compaction strategy for [`CompactionHook`](https://docs.haystack.deepset.ai/docs/compaction-hook). It replaces older turns and Agent steps with LLM-generated summaries. Long-running Agents keep a condensed record of earlier goals, decisions, and open work. It summarizes as little as needed t | High | 9/24/2026 |
| v3.1.1 | # Release Notes ## v3.1.1 ### Bug Fixes - The OpenAI Chat Completions and Responses converters no longer raise on an assistant message with no content parts, which a Chat Generator returns when it discards a malformed tool call. It is sent with empty content, which the APIs accept, so the next LLM call goes through. `ChatMessage.from_openai_dict_format` accepts the same empty content, so such a message round-trips. - The Hugging Face message converter no longer raises on an assistant message | High | 9/3/2026 |
| v3.1.0 | ## โญ๏ธ Highlights Added experimental context compaction for the `Agent`. `CompactionHook` runs before LLM calls and shortens the conversation when it reaches a configured fraction of the model's context window. The first built-in strategy, `SlidingWindowCompactor`, preserves leading system messages, the latest user task, and as much complete recent conversation as the target allows. It removes complete historical turns first, and only when removing every historical turn is insufficient do | High | 8/24/2026 |
| v3.0.0 | ## โญ๏ธ Highlights Haystack 3.0 is a major release for building **production-grade agents with full control and flexibility**. It ships a wave of new capabilities: a more capable `Agent` with hooks and first-class skills, built-in run introspection, first-class async for serving, a leaner core, and safer pipeline loading. A few small, intentional breaking changes come with it but our [Migration Guide](https://docs.haystack.deepset.ai/docs/migration) and **Upgrading to Haystack 3.0** make it | High | 7/20/2026 |
| v2.31.0 | ## โญ๏ธ Highlights ### ๐ฆ Slimming down Haystack core ahead of 3.0 This release begins the migration of many components out of `haystack` core and into dedicated integration packages, in preparation for Haystack 3.0. Components with heavy or optional dependencies โ including all `SentenceTransformers` embedders and rankers, the Hugging Face API components, the legacy `Generator`s, `TikaDocumentConverter`, `AzureOCRDocumentConverter`, the Whisper transcribers, the OpenAPI connectors, the spaC | High | 7/8/2026 |
| v2.30.2 | ## ๐ Bug Fixes - Fixed the `Agent` exiting prematurely under the default `exit_conditions=["text"]`. The agent now only stops when the last message is an assistant message with non-empty text (or when no tool invoker is configured). Previously, if the LLM produced an invalid tool call that was discarded, the resulting assistant message with empty text and no tool calls would trigger an exit, preventing the agent from recovering. The agent now continues looping so the model can recover on the | High | 6/18/2026 |
| v2.30.1 | ## โก๏ธ Enhancement Notes - `AzureOpenAIChatGenerator` now accepts a `Secret` for the `azure_endpoint` and `api_version` parameters in addition to a plain string. This makes it possible to resolve these values from environment variables at runtime, for example with `Secret.from_env_var("AZURE_OPENAI_ENDPOINT")`, so the same serialized pipeline can switch between environments (e.g. dev and prod) by changing environment variables instead of the pipeline definition. | High | 6/9/2026 |
| v2.30.0 | ## โญ๏ธ Highlights ### ๐ Syntax-aware Python code splitting with `PythonCodeSplitter` The new `PythonCodeSplitter` is a syntax-aware splitter for Python source files, built for code-RAG and code-search pipelines where naive line-based splitting tends to cut through functions and lose structural context. It parses sources with the `ast` module and greedily merges units, such as module docstring, import blocks, top-level functions, class headers, methods, and nested classes, into chunks of ro | High | 6/3/2026 |
| v2.29.0 | ## โญ๏ธ Highlights ### ๐ Combine Retrievers with `MultiRetriever` and `TextEmbeddingRetriever` Two new retriever components make it easier to build hybrid search pipelines. `MultiRetriever` runs multiple text retrievers in parallel and merges their results into a single deduplicated list, ranked by reciprocal rank fusion by default. You can selectively enable or disable individual retrievers at runtime using the `active_retrievers` parameter. This is useful when you want to skip the embeddi | High | 5/12/2026 |
| v2.28.0 | # Release Notes ## v2.28.0 ### Upgrade Notes - As part of the migration from `requests` to `httpx`, `request_with_retry` and `async_request_with_retry` (in `haystack.utils.requests_utils`) no longer raise `requests.exceptions.RequestException` on failure; they now raise `httpx.HTTPError` instead. This also affects `HuggingFaceTEIRanker`, which relies on these utilities. Users catching `requests.exceptions.RequestException` should update their code to catch `httpx.HTTPError`. - The `LLM` comp | High | 4/20/2026 |
| v2.28.0-rc2 | # Release Notes ## ๐ New Features - Tools and components can now declare a `State` (or `State | None`) parameter in their signature to receive the live agent `State` object at invocation time โ no extra wiring needed. For function-based tools created with `@tool` or `create_tool_from_function`, add a `state` parameter annotated as `State`: ``` python from haystack.components.agents import State from haystack.tools import tool @tool def my_tool(query: str, state: St | High | 4/20/2026 |
| v2.28.0-rc1 | # Release Notes ## v2.28.0-rc1 ## ๐ New Features - Tools and components can now declare a `State` (or `State | None`) parameter in their signature to receive the live agent `State` object at invocation time โ no extra wiring needed. For function-based tools created with `@tool` or `create_tool_from_function`, add a `state` parameter annotated as `State`: ``` python from haystack.components.agents import State from haystack.tools import tool @tool def my_tool(que | High | 4/20/2026 |
| v2.27.0 | ## โญ๏ธ Highlights ### ๐ Automatic List Joining in Pipeline When a component expects a list as input, pipelines now automatically join multiple inputs into that list (no extra components needed), even if they come in different but compatible types. This enables patterns like combining a plain query string with a list of `ChatMessage` objects into a single `list[ChatMessage]` input. Supported conversations: Source Types | Target Type | Behavior -- | -- | -- T + T | list[T] | Combines | Medium | 4/1/2026 |
| v2.27.0-rc1 | Release v2.27.0-rc1 | Medium | 3/31/2026 |
| v2.26.1 | ## Security Notes - Fixed an issue in `ChatPromptBuilder` where specially crafted template variables could be interpreted as structured content (e.g., images, tool calls) instead of plain text. Template variables are now automatically sanitized during rendering, ensuring they are always treated as plain text. ## ๐ Bug Fixes - Fix malformed log format string in `DocumentCleaner`. The warning for documents with `None` content used `%{document_id}` instead of `{document_id}`, preventing p | Low | 3/20/2026 |
| v2.26.1-rc1 | Release v2.26.1-rc1 | Low | 3/19/2026 |
| v2.26.0 | ## โญ Highlights ### ๐ง More Flexible Agents with Dynamic System Prompts `Agent` now supports Jinja2 templating in `system_prompt`, enabling runtime parameter injection and conditional logic directly in system messages. This makes it easier to adapt agent behavior dynamically (e.g. language, tone, time-aware responses) and reuse agents across contexts without redefining prompts ``` python from haystack.components.agents import Agent from haystack.components.generators.chat import OpenAIC | Low | 3/18/2026 |
| v2.26.0-rc1 | Release v2.26.0-rc1 | Low | 3/16/2026 |
| v2.25.2 | ## ๐ Bug Fixes - Reverts the change that made Agent messages optional as it caused issues with pipeline execution. As a consequence, the LLM component now defaults to an empty messages list unless provided at runtime. | Low | 3/5/2026 |
| v2.25.2-rc1 | Release v2.25.2-rc1 | Low | 3/5/2026 |
| v2.25.1 | ## โก๏ธ Enhancement Notes - Auto variadic sockets now also support `Optional[list[...]]` input types, in addition to plain `list[...]`. ## ๐ Bug Fixes - Fixed smart connection logic to support connecting multiple outputs to a socket whose type is `Optional[list[...]]` (e.g. `list[ChatMessage] | None`). Previously, connecting two `list[ChatMessage]` outputs to `Agent.messages` would fail after its type was updated from `list[ChatMessage]` to `list[ChatMessage] | None`. | Low | 2/27/2026 |
| v2.25.1-rc1 | Release v2.25.1-rc1 | Low | 2/27/2026 |
| v2.25.0 | ## โญ๏ธ Highlights ### ๐ ๏ธ Dynamic Tool Discovery with `SearchableToolset` For applications with large tool catalogs, weโve added the [SearchableToolset](https://docs.haystack.deepset.ai/docs/searchabletoolset). Instead of exposing all tools upfront, agents start with a single `search_tools` function and dynamically discover relevant tools using BM25-based keyword search. This is particularly useful when connecting MCP servers via [MCPToolset](https://docs.haystack.deepset.ai/docs/mcptoolset) | Low | 2/26/2026 |
| v2.25.0-rc1 | Release v2.25.0-rc1 | Low | 2/25/2026 |
| v2.24.1 | ## ๐ Bug Fixes - Fixed a bug in flexible Pipeline connections that prevented automatic value conversion when the receiving component expects a Union type. For example, connecting a component returning `ChatMessage` to a receiver expecting `list[str] | list[ChatMessage]` should have worked but did not. The conversion strategy now correctly evaluates each branch of a Union receiver and picks the best match. | Low | 2/12/2026 |
| v2.24.1-rc1 | Release v2.24.1-rc1 | Low | 2/12/2026 |
| v2.24.0 | ## โญ๏ธ Highlights ### ๐ Pipelines got simpler With the updated logic, Pipelines can now: * connect multiple `list[T]` component outputs directly to a single `list[T]` input of the next component, simplifying pipeline definitions when multiple components produce compatible outputs. E.g., you can directly connect multiple converters to a writer component without a `DocumentJoiner` component in ingestion pipelines. * support the automatic conversion between `ChatMessage` and `str` types, ena | Low | 2/12/2026 |
| v2.24.0-rc2 | Release v2.24.0-rc2 | Low | 2/11/2026 |
| v2.24.0-rc1 | Release v2.24.0-rc1 | Low | 2/10/2026 |
| v2.23.0 | ## โญ๏ธ Highlights ### ๐ Human-in-the-Loop for Agents Agents can now pause for human confirmation before executing tools. You can define confirmation behavior per tool: **always ask**, **ask only on first use**, or **never ask** and fully customize the confirmation UI. This makes it much easier to build safer, more transparent agent workflows, especially when tools trigger side effects or access sensitive data. ``` python agent = Agent( chat_generator=OpenAIChatGenerator(model="gpt | Low | 1/27/2026 |
| v2.23.0-rc1 | Release v2.23.0-rc1 | Low | 1/26/2026 |
| v2.22.0 | ## โญ๏ธ Highlights ### โ๏ธ Smarter Document Chunking with Embedding-Based Splitting Introducing the new [EmbeddingBasedDocumentSplitter](https://docs.haystack.deepset.ai/docs/embeddingbaseddocumentsplitter), a component that takes an embedder and splits documents based on semantic similarity rather than fixed sizes or rules. ```python from haystack.components.embedders import SentenceTransformersDocumentEmbedder from haystack.components.preprocessors import EmbeddingBasedDocumentSplitter | Low | 1/8/2026 |
| v2.22.0-rc1 | Release v2.22.0-rc1 | Low | 1/7/2026 |
| v2.21.0 | ## โญ๏ธ Highlights ### ๐ Smarter, Broader Retrieval with Multi-Query RAG This release introduces three new components that significantly boost retrieval recall in RAG systems by expanding the user query and retrieving documents across multiple reformulations: - `QueryExpander` generates semantically similar variations of a user query to broaden search coverage. - `MultiQueryTextRetriever` runs multiple queries in parallel using a text-based retriever (e.g., BM25) and merges results by s | Low | 12/8/2025 |
| v2.21.0-rc1 | Release v2.21.0-rc1 | Low | 12/3/2025 |
| v2.20.0 | ## โญ๏ธ Highlights ### Support for OpenAI's Responses API Haystack now integrates the **OpenAI's Responses API** through the new `OpenAIResponsesChatGenerator` and `AzureOpenAIResponsesChatGenerator` components. This unlocks several advanced capabilities like: * Retrieving concise summaries of the modelโs reasoning process. * Using native OpenAI or MCP tool formats alongside Haystack `Tool` objects and `Toolset` instances. Example with reasoning and a web search tool: ```python | Low | 11/13/2025 |
| v2.20.0-rc2 | Release v2.20.0-rc2 | Low | 11/13/2025 |
| v2.20.0-rc1 | Release v2.20.0-rc1 | Low | 11/11/2025 |
| v2.19.0 | ## โญ๏ธ Highlights ### ๐ก๏ธ Try Multiple LLMs with `FallbackChatGenerator` Introduced [`FallbackChatGenerator`](https://docs.haystack.deepset.ai/docs/fallbackchatgenerator), a resilient chat generator that runs multiple LLMs sequentially and automatically falls back when one fails. It tries each generator in order until one succeeds, handling errors like timeouts, rate limits, or server issues. Ideal for building robust, production-grade chat systems that stay responsive across providers. `` | Low | 10/20/2025 |
| v2.19.0-rc1 | Release v2.19.0-rc1 | Low | 10/20/2025 |
| v2.18.1 | # Release Notes ## v2.18.1 ## โก๏ธ Enhancement Notes - Added <span class="title-ref">tools</span> to agent run parameters to enhance the agent's flexibility. Users can now choose a subset of tools for the agent at runtime by providing a list of tool names, or supply an entirely new set by passing Tool objects or a Toolset. ## ๐ Bug Fixes - Fix Agent `run_async` method to correctly handle async streaming callbacks. This previously triggered errors due to a bug. - Prevent dupl | Low | 9/29/2025 |
| v2.18.0 | ## โญ๏ธ Highlights ### ๐ **Pipeline Error Recovery with Snapshots** Pipelines now capture a snapshot of the last successful step when a run fails, including intermediate outputs. This lets you diagnose issues (e.g., failed tool calls), fix them, and resume from the checkpoint instead of restarting the entire run. Currently supported for synchronous `Pipeline` and `Agent` (not yet in `AsyncPipeline`) The snapshot is part of the exception raised with the `PipelineRuntimeError` when the pip | Low | 9/22/2025 |
| v2.18.0-rc1 | Release v2.18.0-rc1 | Low | 9/17/2025 |
| v2.17.1 | # Release Notes ## v2.17.1 ### Bug Fixes - Fixed the `from_dict` method of `MetadataRouter` so the `output_type` parameter introduced in Haystack 2.17 is now optional when loading from YAML. This ensures compatibility with older Haystack pipelines. - In `OpenAIChatGenerator`, improved the logic to exclude unsupported custom tool calls. The previous implementation caused compatibility issues with the Mistral Haystack core integration, which extends `OpenAIChatGenerator`. | Low | 8/20/2025 |
| v2.17.0 | ## โญ๏ธ Highlights ### ๐ผ๏ธ Image support for several model providers Following the introduction of image support in Haystack 2.16.0, we've expanded this to more model providers in Haystack and Haystack Core integrations. **Now supported**: Amazon Bedrock, Anthropic, Azure, Google, Hugging Face API, Meta Llama API, Mistral, Nvidia, Ollama, OpenAI, OpenRouter, STACKIT. ### ๐งฉ Extended components We've improved several components to make them more flexible: - `MetadataRouter`, which | Low | 8/19/2025 |
| v2.17.0-rc2 | Release v2.17.0-rc2 | Low | 8/19/2025 |
| v2.17.0-rc1 | Release v2.17.0-rc1 | Low | 8/19/2025 |
| v2.16.1 | # Release Notes ## v2.16.1 ### Bug Fixes - Improved validation in the `ChatMessage.from_user` class method. The method now raises an error if neither `text` nor `content_parts` are provided. It does not raise an error if `text` is an empty string. | Low | 7/29/2025 |
| v2.16.1-rc1 | Release v2.16.1-rc1 | Low | 7/29/2025 |
| v2.16.0 | ## โญ๏ธ Highlights ### ๐ง Agent Breakpoints This release introduces **Agent Breakpoints**, a powerful new feature that enhances debugging and observability when working with Haystack Agents. You can pause execution mid-run by inserting breakpoints in the Agent or its tools to inspect internal state and resume execution seamlessly. This brings fine-grained control to agent development and significantly improves traceability during complex interactions. ```python from haystack.dataclasses. | Low | 7/29/2025 |
| v2.16.0-rc1 | Release v2.16.0-rc1 | Low | 7/24/2025 |
| v2.15.2 | ### Enhancement Notes - Weโve relaxed the requirements for the `ToolCallDelta` dataclass (introduced in Haystack 2.15). Previously, creating a `ToolCallDelta` instance required either the parameters argument or the name to be set. This constraint has now been removed to align more closely with OpenAI's SDK behavior. The change was necessary as the stricter requirement was causing errors in certain hosted versions of open-source models that adhere to the OpenAI SDK specification. ### Bug | Low | 7/4/2025 |
| v2.15.2-rc1 | Release v2.15.2-rc1 | Low | 7/4/2025 |
| v2.15.1 | ### Bug Fixes - Fix `_convert_streaming_chunks_to_chat_message` which is used to convert Haystack `StreamingChunks` into a Haystack `ChatMessage`. This fixes the scenario where one StreamingChunk contains two `ToolCallDetlas` in StreamingChunk.tool_calls. With this fix this correctly saves both `ToolCallDeltas` whereas before they were overwriting each other. This only occurs with some LLM providers like Mistral (and not OpenAI) due to how the provider returns tool calls. | Low | 6/30/2025 |
| v2.15.1-rc1 | | Low | 6/30/2025 |
| v2.15.0 | ## โญ๏ธ Highlights ### Parallel Tool Calling for Faster Agents - `ToolInvoker` now processes all tool calls passed to `run` or `run_async` in parallel using an internal `ThreadPoolExecutor`. This improves performance by reducing the time spent on sequential tool invocations. - This parallel execution capability enables `ToolInvoker` to batch and process multiple tool calls concurrently, allowing Agents to run complex pipelines efficiently with decreased latency. - You no longer need to pas | Low | 6/26/2025 |
| v2.15.0-rc1 | Release v2.15.0-rc1 | Low | 6/25/2025 |
| v2.14.3 | ### Bug Fixes - In ConditionalRouter fixed the `to_dict` and `from_dict` methods to properly handle the case when `output_type` is a List of types or a List of strings. This occurs when a user specifies a route in ConditionalRouter to have multiple outputs. - Fix the serialization of ComponentTool and Tool when specifying `outputs_to_string`. Previously an error occurred on deserialization right after serializing if `outputs_to_string` is not None. | Low | 6/19/2025 |
| v2.14.3-rc1 | Release v2.14.3-rc1 | Low | 6/18/2025 |