Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pipeline stuck in loop when a feedback branch is added #8641

Open
1 task done
marfago opened this issue Dec 15, 2024 · 6 comments
Open
1 task done

Pipeline stuck in loop when a feedback branch is added #8641

marfago opened this issue Dec 15, 2024 · 6 comments
Assignees
Labels
P1 High priority, add to the next sprint

Comments

@marfago
Copy link

marfago commented Dec 15, 2024

Describe the bug
I am following this tutorial which introduces a feedback branch.
However, it seems that the pipeline gets stuck in an infinite loop and never exits.

Error message
RuntimeWarning: Pipeline is stuck running in a loop. Partial outputs will be returned. Check the Pipeline graph for possible issues.
warn(RuntimeWarning(msg))

Expected behavior
The pipeline should run once and exit nicely.

Additional context
N/A

To Reproduce
I have created a small example reported at the bottom.

FAQ Check

System:

  • OS: Windows 11
  • GPU/CPU: Intel
  • Haystack version (commit or version number): 2.8
  • DocumentStore: N/A
  • Reader: N/A
  • Retriever: N/A

Code to reproduce the bug

import json
from typing import Optional, List

import pydantic
from colorama import Fore
from haystack import component, Pipeline
from haystack.components.builders import PromptBuilder
from haystack.dataclasses import ChatMessage
from pyarrow import output_stream
from pydantic import ValidationError


@component
class Generator:
    def __init__(self):
        self.iteration_counter = 0

    @component.output_types(replies=str)
    def run(self, prompt: str):
        if self.iteration_counter:
            self.iteration_counter += 1
            return {"replies": ["Not OK"]}
        return {"replies": ["OK"]}


@component
class OutputValidator:
    def __init__(self):
        self.iteration_counter = 0

    # Define the component output
    @component.output_types(valid_replies=List[str], invalid_replies=Optional[str], error_message=Optional[str])
    def run(self, replies: str):
        #if replies == "OK":
        return {"valid_replies": replies}
        #else:
        #    return {"invalid_replies": "Something reaaaalllly bad happened"}

if __name__ == '__main__':
    prompt_builder = PromptBuilder("""
    {{valid_replies}}
    
    {{invalid_replies}}
    """)
    generator = Generator()
    output_validator = OutputValidator()
    pipeline = Pipeline()

    pipeline.add_component("prompt_builder", prompt_builder)
    pipeline.add_component("generator", generator)
    pipeline.add_component("output_validator", output_validator)

    pipeline.connect("prompt_builder", "generator")
    pipeline.connect("generator", "output_validator")
    pipeline.connect("output_validator.invalid_replies", "prompt_builder.invalid_replies")

    pipeline.run({})
@marfago
Copy link
Author

marfago commented Dec 15, 2024

Here is another example with the pipeline running forever:

from typing import Optional, List, Union, Callable

from haystack import component, Pipeline
from haystack.components.builders import PromptBuilder
from haystack.core.component.types import Variadic


@component
class Generator:
    def __init__(self):
        self.iteration_counter = 0

    @component.output_types(replies=str)
    def run(self, parts: Variadic[Union[str, int]],
            streaming_callback: Optional[Callable[[str], None]] = None,):
        if self.iteration_counter:
            self.iteration_counter += 1
            return {"replies": ["Not OK"]}
        return {"replies": ["OK"]}


@component
class OutputValidator:
    def __init__(self):
        self.iteration_counter = 0

    # Define the component output
    @component.output_types(valid_replies=List[str], invalid_replies=Optional[str], error_message=Optional[str])
    def run(self, replies: str):
        # if replies == "OK":
        print("Executing OutputValidator")
        return {"valid_replies": replies}
        # else:
        #    return {"invalid_replies": "Something reaaaalllly bad happened"}


if __name__ == '__main__':
    prompt_builder = PromptBuilder("""
    {{valid_replies}}
    
    {{invalid_replies}}
    """)
    generator = Generator()
    output_validator = OutputValidator()
    pipeline = Pipeline()

    pipeline.add_component("prompt_builder", prompt_builder)
    pipeline.add_component("generator", generator)
    pipeline.add_component("output_validator", output_validator)

    pipeline.connect("prompt_builder", "generator")
    pipeline.connect("generator", "output_validator")
    pipeline.connect("output_validator.invalid_replies", "prompt_builder.invalid_replies")

    pipeline.run({})

The difference with the previous case is that generator has 2 inputs and this is causing the component to never been seen with enough input to be run.

@julian-risch julian-risch added the P1 High priority, add to the next sprint label Dec 16, 2024
@bilgeyucel
Copy link
Contributor

bilgeyucel commented Dec 16, 2024

Hi @marfago, thanks for opening the issue!

I tried the code snippet you shared. It seems like working as it is so I made an assumption that I need to revert the code snippets you commented out in OutputValidator. Here's my OutputValidator with a small adjustment 👇

@component
class OutputValidator:
    def __init__(self):
        self.iteration_counter = 0

    # Define the component output
    @component.output_types(valid_replies=List[str], invalid_replies=Optional[str], error_message=Optional[str])
    def run(self, replies: str):
        if replies[0] == "OK":
          return {"valid_replies": replies}
        else:
           return {"invalid_replies": "Something reaaaalllly bad happened"}

The reason the pipeline is stuck in the loop seems like a small bug in the code. Since replies is List[str], you need to check as if replies[0] == "OK":. if replies == "OK" will always return false.

ℹ️ Even though that's not the point of this issue, setting max_runs_per_component as pipeline = Pipeline(max_runs_per_component=5) prevents getting stuck in an infinite loop. It might be useful to limit it, especially in the development process

Let me know if you have more info to share. Happy to investigate further if this isn't the issue 🙌

@marfago
Copy link
Author

marfago commented Dec 16, 2024

Hello bilgeyucel, thank you for your reply.

I tried your suggested fix, but in my case, both the examples (with and without the comments) get stuck somewhere.
For the case with comments I have enabled the logs, and this is what I see:

Executing OutputValidator
DEBUG:haystack.core.pipeline.base:Adding component 'prompt_builder' (<haystack.components.builders.prompt_builder.PromptBuilder object at 0x000001D872938D90>

Inputs:
  - invalid_replies: Any
  - valid_replies: Any
  - template: Optional[str]
  - template_variables: Optional[Dict[str, Any]]
Outputs:
  - prompt: str)
DEBUG:haystack.core.pipeline.base:Adding component 'generator' (<__main__.Generator object at 0x000001D872939050>

Inputs:
  - parts: Union[str, int]
  - streaming_callback: Optional[Callable[]]
Outputs:
  - replies: str)
DEBUG:haystack.core.pipeline.base:Adding component 'output_validator' (<__main__.OutputValidator object at 0x000001D872939B10>

Inputs:
  - replies: str
Outputs:
  - valid_replies: List[str]
  - invalid_replies: Optional[str]
  - error_message: Optional[str])
DEBUG:haystack.core.pipeline.base:Connecting 'prompt_builder.prompt' to 'generator.parts'
DEBUG:haystack.core.pipeline.base:Connecting 'generator.replies' to 'output_validator.replies'
DEBUG:haystack.core.pipeline.base:Connecting 'output_validator.invalid_replies' to 'prompt_builder.invalid_replies'
INFO:haystack.core.pipeline.pipeline:Running component prompt_builder
INFO:haystack.core.pipeline.pipeline:Running component generator
INFO:haystack.core.pipeline.pipeline:Running component output_validator
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): eu.i.posthog.com:443
DEBUG:urllib3.connectionpool:https://eu.i.posthog.com:443 "POST /batch/ HTTP/11" 200 15

Is there a way for me to provide more details or help you with the investigation?

Updated: I am currently using python 3.11.9.

@bilgeyucel
Copy link
Contributor

@marfago What are the logs when you run the pipeline? You can enable Real-Time Logging to see the inputs and outputs of each component

import logging
from haystack import tracing
from haystack.tracing.logging_tracer import LoggingTracer

logging.basicConfig(format="%(levelname)s - %(name)s -  %(message)s", level=logging.WARNING)
logging.getLogger("haystack").setLevel(logging.DEBUG)

tracing.tracer.is_content_tracing_enabled = True # to enable tracing/logging content (inputs/outputs)
tracing.enable_tracing(LoggingTracer(tags_color_strings={"haystack.component.input": "\x1b[1;31m", "haystack.component.name": "\x1b[1;34m"}))

@marfago
Copy link
Author

marfago commented Dec 17, 2024

This is the log trace as you suggested.

2024-12-17 07:59:56 DEBUG - haystack.core.pipeline.base -  Adding component 'prompt_builder' (<haystack.components.builders.prompt_builder.PromptBuilder object at 0x000001B1E80F8E50>

Inputs:
  - invalid_replies: Any
  - valid_replies: Any
  - template: Optional[str]
  - template_variables: Optional[Dict[str, Any]]
Outputs:
  - prompt: str)
2024-12-17 07:59:56 DEBUG - haystack.core.pipeline.base -  Adding component 'generator' (<__main__.Generator object at 0x000001B18BCB9390>

Inputs:
  - parts: Union[str, int]
  - streaming_callback: Optional[Callable[]]
Outputs:
  - replies: str)
2024-12-17 07:59:56 DEBUG - haystack.core.pipeline.base -  Adding component 'output_validator' (<__main__.OutputValidator object at 0x000001B18BCB9610>

Inputs:
  - replies: str
Outputs:
  - valid_replies: List[str]
  - invalid_replies: Optional[str]
  - error_message: Optional[str])
2024-12-17 07:59:56 DEBUG - haystack.core.pipeline.base -  Connecting 'prompt_builder.prompt' to 'generator.parts'
2024-12-17 07:59:56 DEBUG - haystack.core.pipeline.base -  Connecting 'generator.replies' to 'output_validator.replies'
2024-12-17 07:59:56 DEBUG - haystack.core.pipeline.base -  Connecting 'output_validator.invalid_replies' to 'prompt_builder.invalid_replies'
2024-12-17 07:59:56 INFO - haystack.core.pipeline.pipeline -  Running component prompt_builder
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  Operation: haystack.component.run
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.name=prompt_builder
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.type=PromptBuilder
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_types={'valid_replies': 'str', 'template': 'NoneType', 'template_variables': 'NoneType', 'invalid_replies': 'str'}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_spec={'invalid_replies': {'type': 'Any', 'senders': ['output_validator']}, 'valid_replies': {'type': 'Any', 'senders': []}, 'template': {'type': 'typing.Optional[str]', 'senders': []}, 'template_variables': {'type': 'typing.Optional[typing.Dict[str, typing.Any]]', 'senders': []}}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output_spec={'prompt': {'type': 'str', 'receivers': ['generator']}}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input={'valid_replies': '', 'template': None, 'template_variables': None, 'invalid_replies': ''}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.visits=1
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output={'prompt': '\n    \n    \n    \n    '}
2024-12-17 07:59:56 INFO - haystack.core.pipeline.pipeline -  Running component generator
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  Operation: haystack.component.run
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.name=generator
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.type=Generator
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_types={'streaming_callback': 'NoneType', 'parts': 'list'}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_spec={'parts': {'type': 'typing.Union[str, int]', 'senders': ['prompt_builder']}, 'streaming_callback': {'type': 'typing.Optional[typing.Callable[[str], NoneType]]', 'senders': []}}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output_spec={'replies': {'type': 'str', 'receivers': ['output_validator']}}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input={'streaming_callback': None, 'parts': ['\n    \n    \n    \n    ']}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.visits=1
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output={'replies': ['OK']}
2024-12-17 07:59:56 INFO - haystack.core.pipeline.pipeline -  Running component output_validator
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  Operation: haystack.component.run
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.name=output_validator
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.type=OutputValidator
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_types={'replies': 'list'}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_spec={'replies': {'type': 'str', 'senders': ['generator']}}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output_spec={'valid_replies': {'type': 'typing.List[str]', 'receivers': []}, 'invalid_replies': {'type': 'typing.Optional[str]', 'receivers': ['prompt_builder']}, 'error_message': {'type': 'typing.Optional[str]', 'receivers': []}}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input={'replies': ['OK']}
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.visits=1
2024-12-17 07:59:56 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output={'valid_replies': ['OK']}
Executing OutputValidator
2024-12-17 08:03:49 DEBUG - haystack.tracing.logging_tracer -  Operation: haystack.pipeline.run
2024-12-17 08:03:49 DEBUG - haystack.tracing.logging_tracer -  haystack.pipeline.input_data={}
2024-12-17 08:03:49 DEBUG - haystack.tracing.logging_tracer -  haystack.pipeline.output_data={'output_validator': {'valid_replies': ['OK']}}
2024-12-17 08:03:49 DEBUG - haystack.tracing.logging_tracer -  haystack.pipeline.metadata={}
2024-12-17 08:03:49 DEBUG - haystack.tracing.logging_tracer -  haystack.pipeline.max_runs_per_component=2
Traceback (most recent call last):
  File "...\src\test\test_loop.py", line 68, in <module>
    pipeline.run({})
  File "...\venv\Lib\site-packages\haystack\core\pipeline\pipeline.py", line 527, in run
    _add_missing_input_defaults(name, comp, components_inputs)
  File "...\venv\Lib\site-packages\haystack\core\pipeline\base.py", line 1308, in _add_missing_input_defaults
    for input_socket in comp.__haystack_input__._sockets_dict.values():  # type: ignore
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "...\venv\Lib\site-packages\haystack\core\component\sockets.py", line 131, in __getattribute__
    def __getattribute__(self, name):
    
KeyboardInterrupt

It seems like my code gets stuck in this endless loop:

while len(run_queue) > 0:

@marfago
Copy link
Author

marfago commented Dec 18, 2024

Here is a simplified version of the code (no conditions, no lists):

import logging
from typing import Optional, List, Union, Callable

from haystack import component, Pipeline
from haystack.components.builders import PromptBuilder
from haystack.core.component.types import Variadic


@component
class Generator:
    def __init__(self):
        self.iteration_counter = 0

    # Define the component output
    @component.output_types(reply=str)
    def run(self, parts: Variadic[Union[str, int]]):
        return {"reply": "OK"}


# Define the component input parameters
@component
class OutputValidator:
    def __init__(self):
        self.iteration_counter = 0

    # Define the component output
    @component.output_types(valid_reply=Optional[str], invalid_reply=Optional[str], error_message=Optional[str])
    def run(self, reply: str):
        return {"valid_reply": reply}

if __name__ == '__main__':
    import logging
    from haystack import tracing
    from haystack.tracing.logging_tracer import LoggingTracer

    logging.basicConfig(format="%(asctime)s %(levelname)s - %(name)s -  %(message)s", level=logging.WARNING, datefmt='%Y-%m-%d %H:%M:%S')
    logging.getLogger("haystack").setLevel(logging.DEBUG)

    tracing.tracer.is_content_tracing_enabled = True # to enable tracing/logging content (inputs/outputs)
    tracing.enable_tracing(LoggingTracer(tags_color_strings={"haystack.component.input": "\x1b[1;31m", "haystack.component.name": "\x1b[1;34m"}))

    prompt_builder = PromptBuilder("""
    {{valid_reply}}
    
    {{invalid_reply}}
    {{error_message}}
    """)
    generator = Generator()
    output_validator = OutputValidator()
    pipeline = Pipeline(max_runs_per_component=2)

    pipeline.add_component("prompt_builder", prompt_builder)
    pipeline.add_component("generator", generator)
    pipeline.add_component("output_validator", output_validator)

    pipeline.connect("prompt_builder", "generator")
    pipeline.connect("generator", "output_validator")
    pipeline.connect("output_validator.invalid_reply", "prompt_builder.invalid_reply")

    pipeline.run({})

And the logs:

2024-12-18 00:19:36 DEBUG - haystack.core.pipeline.base -  Adding component 'prompt_builder' (<haystack.components.builders.prompt_builder.PromptBuilder object at 0x0000028A0D0F5750>

Inputs:
  - valid_reply: Any
  - invalid_reply: Any
  - template: Optional[str]
  - template_variables: Optional[Dict[str, Any]]
Outputs:
  - prompt: str)
2024-12-18 00:19:36 DEBUG - haystack.core.pipeline.base -  Adding component 'generator' (<__main__.Generator object at 0x0000028A33E63350>

Inputs:
  - parts: Union[str, int]
Outputs:
  - reply: str)
2024-12-18 00:19:36 DEBUG - haystack.core.pipeline.base -  Adding component 'output_validator' (<__main__.OutputValidator object at 0x0000028A33E709D0>

Inputs:
  - reply: str
Outputs:
  - valid_reply: Optional[str]
  - invalid_reply: Optional[str]
  - error_message: Optional[str])
2024-12-18 00:19:36 DEBUG - haystack.core.pipeline.base -  Connecting 'prompt_builder.prompt' to 'generator.parts'
2024-12-18 00:19:36 DEBUG - haystack.core.pipeline.base -  Connecting 'generator.reply' to 'output_validator.reply'
2024-12-18 00:19:36 DEBUG - haystack.core.pipeline.base -  Connecting 'output_validator.invalid_reply' to 'prompt_builder.invalid_reply'
2024-12-18 00:19:36 INFO - haystack.core.pipeline.pipeline -  Running component prompt_builder
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  Operation: haystack.component.run
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.name=prompt_builder
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.type=PromptBuilder
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_types={'valid_reply': 'str', 'template': 'NoneType', 'template_variables': 'NoneType', 'invalid_reply': 'str'}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_spec={'valid_reply': {'type': 'Any', 'senders': []}, 'invalid_reply': {'type': 'Any', 'senders': ['output_validator']}, 'template': {'type': 'typing.Optional[str]', 'senders': []}, 'template_variables': {'type': 'typing.Optional[typing.Dict[str, typing.Any]]', 'senders': []}}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output_spec={'prompt': {'type': 'str', 'receivers': ['generator']}}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input={'valid_reply': '', 'template': None, 'template_variables': None, 'invalid_reply': ''}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.visits=1
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output={'prompt': '\n    \n    \n    \n    '}
2024-12-18 00:19:36 INFO - haystack.core.pipeline.pipeline -  Running component generator
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  Operation: haystack.component.run
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.name=generator
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.type=Generator
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_types={'parts': 'list'}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_spec={'parts': {'type': 'typing.Union[str, int]', 'senders': ['prompt_builder']}}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output_spec={'reply': {'type': 'str', 'receivers': ['output_validator']}}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input={'parts': ['\n    \n    \n    \n    ']}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.visits=1
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output={'reply': 'OK'}
2024-12-18 00:19:36 INFO - haystack.core.pipeline.pipeline -  Running component output_validator
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  Operation: haystack.component.run
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.name=output_validator
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.type=OutputValidator
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_types={'reply': 'str'}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input_spec={'reply': {'type': 'str', 'senders': ['generator']}}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output_spec={'valid_reply': {'type': 'typing.Optional[str]', 'receivers': []}, 'invalid_reply': {'type': 'typing.Optional[str]', 'receivers': ['prompt_builder']}, 'error_message': {'type': 'typing.Optional[str]', 'receivers': []}}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.input={'reply': 'OK'}
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.visits=1
2024-12-18 00:19:36 DEBUG - haystack.tracing.logging_tracer -  haystack.component.output={'valid_reply': 'OK'}
2024-12-18 00:20:29 DEBUG - haystack.tracing.logging_tracer -  Operation: haystack.pipeline.run
2024-12-18 00:20:29 DEBUG - haystack.tracing.logging_tracer -  haystack.pipeline.input_data={}
2024-12-18 00:20:29 DEBUG - haystack.tracing.logging_tracer -  haystack.pipeline.output_data={'output_validator': {'valid_reply': 'OK'}}
2024-12-18 00:20:29 DEBUG - haystack.tracing.logging_tracer -  haystack.pipeline.metadata={}
2024-12-18 00:20:29 DEBUG - haystack.tracing.logging_tracer -  haystack.pipeline.max_runs_per_component=2

From the logs you can see it was stuck for some time before I stopped it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
P1 High priority, add to the next sprint
Projects
None yet
Development

No branches or pull requests

3 participants