The daily firehose — everything the toolchain shipped today, already filtered.
// HOW THIS ISSUE IS MADE
We read every release from the 174 tools on our watchlist at the source — GitHub and GitLab release notes, vendor release pages and changelogs, project blogs and feeds, vendor press releases, and the source code behind the tag. Bug-fix-only releases and non-product newsroom noise are dropped; what's left is summarized down to the new capability, how to try it, and any screenshots or videos the release itself published. Every entry links to the sources it was built from.
Agno v2.5.0 adds TeamMode execution strategies, an @approval decorator for HITL workflows, cron scheduling, and vector-search isolation for shared Knowledge stores.
└──▷ GET THIS VERSION
$ git clone --branch v2.5.0 https://github.com/agno-agi/agno.git
# already have the repo? check out this version:$ git checkout v2.5.0
└──▷ USE IT
Run a team in broadcast mode to fan a single task out to all members simultaneously and collect their responses.
python
from agno.team import Team, TeamMode
team = Team(
mode=TeamMode.broadcast,
members=[analyst, researcher, summarizer],
)
team.run('Summarize the latest threat intelligence report')
Share one vector database across multiple Knowledge instances while keeping their search results isolated from each other.
python
from agno.knowledge import Knowledge
vuln_kb = Knowledge(
name='vulnerabilities',
isolate_vector_search=True,
)
patch_kb = Knowledge(
name='patches',
isolate_vector_search=True,
)
# Both can point at the same DB/table; searches will only return their own documents.
›Adds TeamMode enum with four execution modes: coordinate (default supervisor pattern), route (routes to a specialist and returns response directly), broadcast (delegates the same task to all members simultaneously), and tasks (autonomous task decomposition into a shared task list).
›Adds isolate_vector_search flag to the Knowledge class — when enabled, documents are tagged with linked_to metadata at insert time and searches filter by that tag, letting multiple Knowledge instances share one vector database with isolated results; defaults to False for backward compatibility.
›Adds store_history_messages config key to Agent/Team — set store_history_messages=True to restore the previous behavior of persisting conversation history (now defaults to False).
›New @approval decorator enables human-in-the-loop approval workflows: @approval(type='required') pauses a run until resolved via the Approvals API; @approval(type='audit') records a non-blocking audit trail for compliance and logging, with persistent status tracking (pending, approved, rejected, expired, cancelled).
›New Approvals API for listing, inspecting, and resolving approval records created by the @approval decorator.
+3 moreshow less
›Adds cron-based scheduling for agents, teams, and workflows with retry, timeout, and timezone support.
›Adds LearningMachine support for Teams, enabling persistent learning across team runs.
›Adds AWS EFS volume and mount point support for AWS app infrastructure.
└──▷ BREAKING ON UPGRADE
!store_history_messages now defaults to False — existing setups that rely on persisted conversation history must explicitly set store_history_messages=True or history will no longer be stored.
!Knowledge instances now require a unique combination of database, table, and knowledge name — multiple Knowledge instances cannot share the same table without distinct names, breaking any setup that reused a table across instances without differentiating names.
Haystack v2.24.0 eliminates adapter boilerplate with native type coercion, adds FileContent for PDF inputs, and introduces MarkdownHeaderSplitter.
└──▷ GET THIS VERSION
$ git clone --branch v2.24.0 https://github.com/deepset-ai/haystack.git
# already have the repo? check out this version:$ git checkout v2.24.0
└──▷ USE IT
Attach a PDF to a chat message and send it to an OpenAI model for summarization — no file-parsing pipeline required.
python
from haystack.components.generators.chat.openai import OpenAIChatGenerator
from haystack.dataclasses.chat_message import ChatMessage
from haystack.dataclasses.file_content import FileContent
file_content = FileContent.from_url("https://arxiv.org/pdf/2309.08632")
chat_message = ChatMessage.from_user(content_parts=[file_content, "Summarize this paper in 100 words."])
llm = OpenAIChatGenerator(model="gpt-4.1-mini")
response = llm.run(messages=[chat_message])
Wire two file-type converters directly to a DocumentWriter without a DocumentJoiner in an ingestion pipeline.
python
from haystack import Pipeline
from haystack.components.converters import HTMLToDocument, TextFileToDocument
from haystack.components.routers import FileTypeRouter
from haystack.components.writers import DocumentWriter
from haystack.dataclasses import ByteStream
from haystack.document_stores.in_memory import InMemoryDocumentStore
doc_store = InMemoryDocumentStore()
pipe = Pipeline()
pipe.add_component("router", FileTypeRouter(mime_types=["text/plain", "text/html"]))
pipe.add_component("txt_converter", TextFileToDocument())
pipe.add_component("html_converter", HTMLToDocument())
pipe.add_component("writer", DocumentWriter(doc_store))
pipe.connect("router.text/plain", "txt_converter.sources")
pipe.connect("router.text/html", "html_converter.sources")
pipe.connect("txt_converter.documents", "writer.documents")
pipe.connect("html_converter.documents", "writer.documents")
Build a query-rewriting RAG pipeline where the LLM's list[ChatMessage] output is automatically coerced to str for the BM25 retriever — no OutputAdapter needed.
python
from haystack import Pipeline
from haystack.components.builders import ChatPromptBuilder
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.retrievers import InMemoryBM25Retriever
from haystack.document_stores.in_memory import InMemoryDocumentStore
p = Pipeline()
p.add_component("prompt_builder", ChatPromptBuilder(template=template))
p.add_component("llm", OpenAIChatGenerator(model="gpt-4.1-mini"))
p.add_component("retriever", InMemoryBM25Retriever(document_store=document_store, top_k=3))
# list[ChatMessage] from llm is auto-converted to str for retriever
p.connect("prompt_builder", "llm")
p.connect("llm", "retriever")
›Introduces the FileContent dataclass (importable from haystack.dataclasses.file_content) enabling ChatMessage objects to carry file inputs (e.g. PDFs via FileContent.from_url(...)) for OpenAIChatGenerator and AzureOpenAIChatGenerator, with OpenAIResponsesChatGenerator and AzureOpenAIResponsesChatGenerator also supported.
›Introduces the MarkdownHeaderSplitter component that splits documents at Markdown headers (#, ##, etc.), preserves header hierarchy as metadata, supports secondary splitting modes (word, passage, period, or line) via Haystack's DocumentSplitter, and handles edge cases such as no headers or empty content.
›Adds delete_all_documents(), update_by_filter(), and delete_by_filter() operations to InMemoryDocumentStore, with corresponding standard DocumentStore tests for all three.
›Adds run_async method to SearchApiWebSearch and SerperDevWebSearch components.
›Pipelines now natively connect multiple list[T] outputs to a single list[T] input without a ListJoiner or DocumentJoiner, enabling direct multi-converter-to-writer wiring via pipe.connect().
+4 moreshow less
›Pipelines automatically convert between ChatMessage and str types on connection: str → user ChatMessage, and ChatMessage → str (via .text); raises PipelineRuntimeError if .text is None.
›Pipelines support list wrapping (T → list[T]) and list collapsing (list[T] → T using first element, for str and ChatMessage only); raises PipelineRuntimeError on empty list.
›Agent components now accept a tuple of tool names as a key in confirmation_strategies, allowing multiple tools to share a single BlockingConfirmationStrategy instead of requiring one entry per tool.
›All Rankers (HuggingFaceTEIRanker, LostInTheMiddleRanker, MetaFieldRanker, MetaFieldGroupingRanker, SentenceTransformersDiversityRanker, SentenceTransformersSimilarityRanker, TransformersSimilarityRanker) now deduplicate documents by id before ranking, removing the need for a DocumentJoiner after hybrid retrieval.
└──▷ BREAKING ON UPGRADE
!All Rankers (HuggingFaceTEIRanker, LostInTheMiddleRanker, MetaFieldRanker, MetaFieldGroupingRanker, SentenceTransformersDiversityRanker, SentenceTransformersSimilarityRanker, TransformersSimilarityRanker) now deduplicate documents by id before ranking; pipelines that relied on duplicate documents with the same user-defined id passing through the ranker will silently drop those duplicates.
!MultiQueryEmbeddingRetriever and MultiQueryTextRetriever now deduplicate by id instead of by document content; setups where multiple documents share identical content but different id values will no longer be deduplicated, and setups expecting content-based deduplication will behave differently.
!The deprecated deserialize_document_store_in_init_params_inplace function (deprecated in Haystack 2.23.0) has been removed.
Pi v0.52.10 adds terminal input interception for extensions, richer --model selection syntax, and new built-in GLM-5 and gpt-5.3-codex-spark models.
└──▷ GET THIS VERSION
$ git clone --branch v0.52.10 https://github.com/earendil-works/pi.git
# already have the repo? check out this version:$ git checkout v0.52.10
└──▷ TRY IT
Select a model with a thinking budget suffix without specifying a provider — useful for quickly switching reasoning depth in CI or ad-hoc sessions.
$ pi --model sonnet:high
Target a specific provider and model in one flag when you have multiple providers configured and want deterministic routing.
$ pi --model openai/gpt-4o
›Adds terminal_input extension event, letting extensions intercept, consume, or transform raw terminal input before normal TUI handling.
›Adds extension event forwarding for full message and tool execution lifecycles: message_start, message_update, message_end, tool_execution_start, tool_execution_update, tool_execution_end.
›Expands --model flag to support provider/id syntax, fuzzy matching, and :<thinking> suffixes (e.g., --model sonnet:high, --model openai/gpt-4o) without requiring --provider.
›Adds built-in gpt-5.3-codex-spark model definition for OpenAI and OpenAI Codex providers (research preview).
›Adds built-in GLM-5 model support via z.ai and OpenRouter provider catalogs.
+1 moreshow less
›Routes GitHub Copilot Claude 4.x models through the Anthropic Messages API with updated Copilot header handling.
└──▷ BREAKING ON UPGRADE
!ContextUsage.tokens and ContextUsage.percent are now number | null; extensions reading these fields must handle the null case after compaction.
!The usageTokens, trailingTokens, and lastUsageIndex fields have been removed from ContextUsage; extensions referencing these fields will break.
!Git source parsing is now strict: shorthand sources like github.com/org/repo and [email protected]:org/repo no longer work without the git: prefix — only protocol URLs (https://, http://, ssh://, git://) are recognized automatically.
llama.cpp b8003 adds Kimi-K2.5 multimodal model support including image and vision capabilities.
└──▷ GET THIS VERSION
$ git clone --branch b8003 https://github.com/ggml-org/llama.cpp.git
# already have the repo? check out this version:$ git checkout b8003
›Adds support for the Kimi-K2.5 model, including image and vision inference via updated convert_hf_to_gguf.py with new kimi-k2.5 keys and V_MMPROJ / V_M_IMP_NORM tensor mappings.