Python 3.10 pipelines keep each step visible
Haystack requires Python 3.10 or newer and represents an AI application as connected components. A pipeline can retrieve documents, rank them, build a prompt, call a model, route the result, and write data back to a store. Branches, loops, synchronous runs, asynchronous runs, and streaming use the same component model. That explicit graph is useful when a response must be traced to a retriever or when one provider needs replacing without rebuilding the application around it.
commit b7e1dd8 was a substantial checkout: 10,737 files, about 146,225 source lines, and 93.7 MB before installation. The size makes sense once converters, evaluators, agents, pipeline state, tracing, tools, and shared data types live under one roof. It also sets expectations. Haystack is infrastructure for a team that wants an application framework; a 20-line script calling one hosted model will gain concepts without solving a proportionate problem.
The 27-second install covers the core, not every integration
Our base install succeeded in 27 seconds, added 71 packages, and occupied 135 MB. Building the package took another 4 seconds. Those are approachable numbers for trying the framework, and the README's pip install haystack-ai command is accurate for the core. The plain package does not promise every model, store, or file parser. Haystack keeps much of that breadth in optional packages and a separate integrations repository.
A useful deployment needs decisions that the 71-package install cannot make. Hosted model components need the corresponding provider account and credentials. Local models need their own runtime and files. Retrieval needs a document store or search backend selected for the application. PDF, PowerPoint, Word, spreadsheet, and message conversion can add parser packages. Pin the extras that match the graph, because a passing core import says little about the exact ingestion path users will exercise.
What happened when we ran it
Our sandbox installed Haystack in 27 seconds and built it in 4 seconds on 3 CPUs with 8 GB of RAM. The checkout used commit b7e1dd8 inside a fresh unprivileged Debian container running Python 3.12, with no secrets. Installation and build both succeeded. The full pytest step did not: it returned exit code 1 after 32 seconds, so the quick package result should not be mistaken for a clean contributor setup.
Pytest reported 208 passed, 112 failed, 2 skipped, and 88 collection or setup errors. The tail repeatedly shows PDFMinerToDocument tests raising an ImportError for pdfminer, followed by PPTXToDocument tests raising an ImportError for pptx. The same tail includes direct ModuleNotFoundError messages for pdfminer. It does not identify the cause of every failure or error, so we cannot turn those final lines into a broader diagnosis.
The declared test environment at b7e1dd8 lists pdfminer.six and python-pptx alongside other converter dependencies. That confirms the full suite expects more than the base runtime, while the log only confirms that those 2 modules were unavailable during our run. Pip-audit found 0 known vulnerabilities among the installed packages. The repository also had 33 CI workflow files and a tests directory, although no Dockerfile was present in the checkout.
Haystack 3.1.0 leaves HTTP and MCP serving to Hayhooks
Haystack v3.1.0 provides the orchestration library, while the current README sends REST API and MCP serving to Hayhooks, a separate project. That boundary is easy to miss when evaluating a framework described as production ready. The pipeline can run synchronously or asynchronously and stream tokens, but an operator still has to package the application, expose it, secure the route, manage worker lifecycles, and connect logs or traces.
Version 3.1.0 adds experimental context compactors, token counters, and AgentTool for wrapping one agent as a tool for another. Its upgrade notes also reserve an exit_reason state key and change snapshot input shape. A process-wide HAYSTACK_UNSAFE_DESERIALIZATION setting can disable pipeline and tool deserialization checks; the release notes warn that one untrusted artifact can then execute code. Keep that switch off for inputs your team did not create and review.
Open issues expose gaps in approval and replay
Haystack 3.1.0 has human approval hooks, but open issue #12060 reports an important visibility gap for tools that receive values from agent state. The approval view can show model-supplied arguments, then the execution path injects additional values later. The issue asks for an opt-in mode that displays the fully materialized call and labels each argument's source. Until that exists and is verified, sensitive tools need an application-level check immediately before execution.
For a 10,737-file framework, reproducible pipeline failures matter. Open issue #11836 requests native recording, deterministic replay, run diffs, and aggregated usage because an executed run currently leaves no first-class replay artifact. Haystack has tracing, snapshots, and breakpoints, but the issue explains why those pieces do not provide full record-and-replay behavior. Teams with strict reproduction requirements must add their own capture system or an external diagnostics service.
A September 1 push supports a high community score
GitHub recorded a last push on September 1, 2026, more than 26,000 stars, and more than 100 combined issues and pull requests when fetched. The latest release was v3.1.0 on August 24, and the recently updated queue contained both bug reports and fixes under review. Our checkout also had 33 CI workflow files. The combined open total includes pull requests and must not be read as a count of confirmed bugs.
Haystack is a sensible choice once retrieval and agent behavior need a shared structure that several engineers can inspect. Our 27-second install makes a trial cheap; the 112 failed tests and 88 errors require a production-like test image during adoption. Start with the smallest graph that represents the real workflow, pin its providers and converters, and confirm the exact tool arguments and documents that cross each boundary.

