• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

deepset-ai / haystack / 14838765775

05 May 2025 02:23PM UTC coverage: 90.41% (-0.1%) from 90.517%
14838765775

push

github

web-flow
feat: enable streaming ToolCall/Result from Agent (#9290)

* Testing solutions for streaming

* Remove unused methods

* Add fixes

* Update docstrings

* add release notes and test

* PR comments

* add a new util function

* Adjust emit_tool_info

* PR comments

* Remove emit function, add streaming for tool_call


---------

Co-authored-by: Sebastian Husch Lee <sjrl423@gmail.com>

10908 of 12065 relevant lines covered (90.41%)

0.9 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

15.79
haystack/components/generators/utils.py
1
# SPDX-FileCopyrightText: 2022-present deepset GmbH <info@deepset.ai>
2
#
3
# SPDX-License-Identifier: Apache-2.0
4

5
from openai.types.chat.chat_completion_chunk import ChoiceDeltaToolCall
1✔
6

7
from haystack.dataclasses import StreamingChunk
1✔
8

9

10
def print_streaming_chunk(chunk: StreamingChunk) -> None:
1✔
11
    """
12
    Callback function to handle and display streaming output chunks.
13

14
    This function processes a `StreamingChunk` object by:
15
    - Printing tool call metadata (if any), including function names and arguments, as they arrive.
16
    - Printing tool call results when available.
17
    - Printing the main content (e.g., text tokens) of the chunk as it is received.
18

19
    The function outputs data directly to stdout and flushes output buffers to ensure immediate display during
20
    streaming.
21

22
    :param chunk: A chunk of streaming data containing content and optional metadata, such as tool calls and
23
        tool results.
24
    """
25
    # Print tool call metadata if available (from ChatGenerator)
26
    if chunk.meta.get("tool_calls"):
×
27
        for tool_call in chunk.meta["tool_calls"]:
×
28
            if isinstance(tool_call, ChoiceDeltaToolCall) and tool_call.function:
×
29
                # print the tool name
30
                if tool_call.function.name and not tool_call.function.arguments:
×
31
                    print("[TOOL CALL]\n", flush=True, end="")
×
32
                    print(f"Tool: {tool_call.function.name} ", flush=True, end="")
×
33

34
                # print the tool arguments
35
                if tool_call.function.arguments:
×
36
                    if tool_call.function.arguments.startswith("{"):
×
37
                        print("\nArguments: ", flush=True, end="")
×
38
                    print(tool_call.function.arguments, flush=True, end="")
×
39
                    if tool_call.function.arguments.endswith("}"):
×
40
                        print("\n\n", flush=True, end="")
×
41

42
    # Print tool call results if available (from ToolInvoker)
43
    if chunk.meta.get("tool_result"):
×
44
        print(f"[TOOL RESULT]\n{chunk.meta['tool_result']}\n\n", flush=True, end="")
×
45

46
    # Print the main content of the chunk (from ChatGenerator)
47
    if chunk.content:
×
48
        print(chunk.content, flush=True, end="")
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc