# haystack

> Open-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, m

- **URL**: https://www.freshcrate.ai/projects/haystack
- **Author**: deepset-ai
- **Category**: Frameworks
- **Latest version**: `v2.30.0` (2026-06-03)
- **License**: Apache-2.0
- **Source**: https://github.com/deepset-ai/haystack
- **Homepage**: https://haystack.deepset.ai
- **Language**: MDX
- **GitHub**: 24,941 stars, 2,728 forks
- **Registry**: github
- **Tags**: `agent`, `agents`, `ai`, `gemini`, `generative-ai`, `gpt-4`, `information-retrieval`, `large-language-models`, `mdx`

## Description

Open-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.

## Recent releases

| Version | Date | Urgency | Changes |
| --- | --- | --- | --- |
| `v2.30.0` | 2026-06-03 | High | ## ⭐️ 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 |
| `v2.29.0` | 2026-05-12 | High | ## ⭐️ 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 |
| `v2.28.0` | 2026-04-20 | High | # 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 |
| `v2.28.0-rc2` | 2026-04-20 | High | # 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 |
| `v2.28.0-rc1` | 2026-04-20 | High | # 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 |
| `v2.27.0` | 2026-04-01 | Medium | ## ⭐️ 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 |
| `v2.27.0-rc1` | 2026-03-31 | Medium | Release v2.27.0-rc1 |
| `v2.26.1` | 2026-03-20 | Low | ## 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 |
| `v2.26.1-rc1` | 2026-03-19 | Low | Release v2.26.1-rc1 |
| `v2.26.0` | 2026-03-18 | Low | ## ⭐ 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 |

## Citation

- HTML: https://www.freshcrate.ai/projects/haystack
- Markdown: https://www.freshcrate.ai/projects/haystack.md
- Dependencies JSON: https://www.freshcrate.ai/api/projects/haystack/deps

_Generated by freshcrate.ai. Indexes github releases for AI-agent ecosystem packages._
