haystack-ai 3.4.0.dev20261005000357__tar.gz → 3.4.0.dev20261007000336__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/PKG-INFO +1 -1
- haystack_ai-3.4.0.dev20261007000336/VERSION.txt +1 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/agents/agent.py +31 -12
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/agents/utils.py +1 -1
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/builders/chat_prompt_builder.py +8 -16
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/builders/prompt_builder.py +2 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/extractors/image/llm_document_content_extractor.py +10 -8
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/extractors/llm_metadata_extractor.py +9 -10
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/azure.py +5 -14
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/llm.py +2 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/openai.py +5 -13
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/openai_responses.py +5 -17
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/joiners/answer_joiner.py +3 -3
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/joiners/branch.py +6 -6
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/joiners/list_joiner.py +3 -3
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/joiners/string_joiner.py +0 -3
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/query/query_expander.py +45 -12
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/rankers/llm_ranker.py +52 -25
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/validators/json_schema.py +4 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/pipeline/pipeline.py +10 -15
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/super_component/super_component.py +2 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/chat_message.py +164 -6
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/budget/hooks.py +2 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/from_function.py +6 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/human_in_the_loop/hooks.py +2 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/tool_result_offloading/hooks.py +2 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/token_counters/openai_counter.py +1 -1
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/__init__.py +4 -1
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/component_tool.py +25 -11
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/pipeline_tool.py +2 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/searchable_toolset.py +47 -16
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/skills/skill_toolset.py +9 -2
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/tool.py +18 -20
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/toolset.py +5 -37
- haystack_ai-3.4.0.dev20261007000336/haystack/tools/utils.py +116 -0
- haystack_ai-3.4.0.dev20261005000357/VERSION.txt +0 -1
- haystack_ai-3.4.0.dev20261005000357/haystack/tools/utils.py +0 -64
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/.gitignore +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/LICENSE +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/README.md +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/agents/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/agents/state/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/agents/state/state.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/agents/state/state_utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/agents/tool_calling.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/builders/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/builders/answer_builder.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/caching/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/caching/cache_checker.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/csv.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/docx.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/file_to_file_content.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/html.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/image/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/image/document_to_image.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/image/file_to_document.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/image/file_to_image.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/image/image_utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/image/pdf_to_image.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/json.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/markdown.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/msg.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/multi_file_converter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/output_adapter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/pdfminer.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/pptx.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/pypdf.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/txt.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/converters/xlsx.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/azure_document_embedder.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/azure_text_embedder.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/mock_document_embedder.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/mock_text_embedder.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/mock_utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/openai_document_embedder.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/openai_text_embedder.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/types/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/embedders/types/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/answer_exact_match.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/context_relevance.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/document_map.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/document_mrr.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/document_ndcg.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/document_recall.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/faithfulness.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/llm_evaluator.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/evaluators/sas_evaluator.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/extractors/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/extractors/image/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/extractors/regex_text_extractor.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/fetchers/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/fetchers/link_content.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/azure_responses.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/fallback.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/mock.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/types/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/chat/types/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/openai_image_generator.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/generators/utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/joiners/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/joiners/document_joiner.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/_page_numbers.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/csv_document_cleaner.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/csv_document_splitter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/document_cleaner.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/document_preprocessor.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/document_splitter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/embedding_based_document_splitter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/hierarchical_document_splitter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/markdown_header_splitter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/python_code_splitter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/recursive_splitter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/sentence_tokenizer.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/preprocessors/text_cleaner.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/query/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/rankers/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/rankers/lost_in_the_middle.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/rankers/meta_field.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/rankers/meta_field_grouping_ranker.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/auto_merging_retriever.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/filter_retriever.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/in_memory/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/in_memory/bm25_retriever.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/in_memory/embedding_retriever.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/multi_query_embedding_retriever.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/multi_query_text_retriever.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/multi_retriever.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/sentence_window_retriever.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/text_embedding_retriever.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/types/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/retrievers/types/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/routers/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/routers/conditional_router.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/routers/document_length_router.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/routers/document_type_router.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/routers/file_type_router.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/routers/llm_messages_router.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/routers/metadata_router.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/samplers/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/samplers/top_p.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/validators/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/writers/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/components/writers/document_writer.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/component/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/component/component.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/component/sockets.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/component/types.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/errors.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/pipeline/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/pipeline/base.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/pipeline/breakpoint.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/pipeline/component_checks.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/pipeline/descriptions.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/pipeline/draw.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/pipeline/utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/serialization.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/serialization_security.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/super_component/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/super_component/utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/core/type_utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/data/abbreviations/de.txt +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/data/abbreviations/en.txt +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/answer.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/breakpoints.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/byte_stream.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/document.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/file_content.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/image_content.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/skill_info.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/sparse_embedding.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/dataclasses/streaming_chunk.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/document_stores/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/document_stores/errors/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/document_stores/errors/errors.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/document_stores/in_memory/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/document_stores/in_memory/document_store.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/document_stores/types/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/document_stores/types/filter_policy.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/document_stores/types/policy.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/document_stores/types/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/errors.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/evaluation/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/evaluation/eval_run_result.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/budget/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/AGENTS.md +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/CLAUDE.md +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/hooks.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/sliding_window.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/summarization.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/tool_result_pruning.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/types/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/types/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/compaction/utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/human_in_the_loop/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/human_in_the_loop/dataclasses.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/human_in_the_loop/policies.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/human_in_the_loop/strategies.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/human_in_the_loop/types/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/human_in_the_loop/types/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/human_in_the_loop/user_interfaces.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/invocation.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/tool_result_offloading/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/tool_result_offloading/policies.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/tool_result_offloading/stores.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/tool_result_offloading/types/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/tool_result_offloading/types/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/hooks/utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/lazy_imports.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/logging.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/marshal/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/marshal/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/marshal/yaml.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/py.typed +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/skill_stores/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/skill_stores/file_system/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/skill_stores/file_system/skill_store.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/skill_stores/types/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/skill_stores/types/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/telemetry/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/telemetry/_environment.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/telemetry/_telemetry.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/callable_serialization/random_callable.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/document_store.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/document_store_async.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/factory.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/accumulate.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/add_value.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/concatenate.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/double.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/fstring.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/future_annotations.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/greet.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/hello.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/joiner.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/parity.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/remainder.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/repeat.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/subtract.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/sum.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/text_splitter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/sample_components/threshold.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/telemetry.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/testing/test_utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/token_counters/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/token_counters/approximate_counter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/token_counters/tiktoken_counter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/token_counters/types/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/token_counters/types/protocol.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/token_counters/utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/agent_tool.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/errors.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/from_function.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/parameters_schema_utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/serde_utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/skills/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tools/tool_types.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tracing/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tracing/logging_tracer.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tracing/tracer.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/tracing/utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/__init__.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/async_utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/auth.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/azure.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/base_serialization.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/callable_serialization.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/dataclasses.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/deserialization.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/device.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/experimental.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/filters.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/hf.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/http_client.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/jinja2_chat_extension.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/jinja2_extensions.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/jinja2_sandbox.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/jupyter.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/misc.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/requests_utils.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/type_serialization.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/utils/url_validation.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/haystack/version.py +0 -0
- {haystack_ai-3.4.0.dev20261005000357 → haystack_ai-3.4.0.dev20261007000336}/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: haystack-ai
|
|
3
|
-
Version: 3.4.0.
|
|
3
|
+
Version: 3.4.0.dev20261007000336
|
|
4
4
|
Summary: LLM framework to build customizable, production-ready LLM applications. Connect components (models, vector DBs, file converters) to pipelines or agents that can interact with your data.
|
|
5
5
|
Project-URL: CI: GitHub, https://github.com/deepset-ai/haystack/actions
|
|
6
6
|
Project-URL: Docs: RTD, https://haystack.deepset.ai/overview/intro
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.4.0.dev20261007000336
|
|
@@ -54,10 +54,13 @@ from haystack.tools import (
|
|
|
54
54
|
Toolset,
|
|
55
55
|
ToolsType,
|
|
56
56
|
_check_duplicate_tool_names,
|
|
57
|
+
close_tools,
|
|
58
|
+
close_tools_async,
|
|
57
59
|
deserialize_tools_or_toolset_inplace,
|
|
58
60
|
flatten_tools_or_toolsets,
|
|
59
61
|
serialize_tools_or_toolset,
|
|
60
62
|
warm_up_tools,
|
|
63
|
+
warm_up_tools_async,
|
|
61
64
|
)
|
|
62
65
|
from haystack.utils.async_utils import _execute_component_async
|
|
63
66
|
from haystack.utils.callable_serialization import deserialize_callable, serialize_callable
|
|
@@ -241,7 +244,7 @@ class Agent:
|
|
|
241
244
|
|
|
242
245
|
```python
|
|
243
246
|
from haystack.components.agents import Agent
|
|
244
|
-
from haystack.components.generators.chat import
|
|
247
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
245
248
|
from haystack.components.generators.utils import print_streaming_chunk
|
|
246
249
|
from haystack.dataclasses import ChatMessage
|
|
247
250
|
from haystack.tools import tool
|
|
@@ -272,7 +275,7 @@ class Agent:
|
|
|
272
275
|
"You are a helpful assistant. Use the 'search' tool to find information "
|
|
273
276
|
"about a user's question and the 'calculator' tool to perform math."
|
|
274
277
|
),
|
|
275
|
-
chat_generator=
|
|
278
|
+
chat_generator=OpenAIResponsesChatGenerator(),
|
|
276
279
|
tools=[search, calculator],
|
|
277
280
|
streaming_callback=print_streaming_chunk,
|
|
278
281
|
)
|
|
@@ -293,7 +296,7 @@ class Agent:
|
|
|
293
296
|
|
|
294
297
|
```python
|
|
295
298
|
from haystack.components.agents import Agent
|
|
296
|
-
from haystack.components.generators.chat import
|
|
299
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
297
300
|
from haystack.tools import tool
|
|
298
301
|
from typing import Annotated
|
|
299
302
|
|
|
@@ -308,7 +311,7 @@ class Agent:
|
|
|
308
311
|
return f"[Translated '{text}' to {target_language}]"
|
|
309
312
|
|
|
310
313
|
agent = Agent(
|
|
311
|
-
chat_generator=
|
|
314
|
+
chat_generator=OpenAIResponsesChatGenerator(),
|
|
312
315
|
tools=[translate],
|
|
313
316
|
system_prompt="You are a helpful translation assistant.",
|
|
314
317
|
user_prompt=\"\"\"{% message role="user"%}
|
|
@@ -347,7 +350,7 @@ class Agent:
|
|
|
347
350
|
```python
|
|
348
351
|
from haystack.components.agents import Agent
|
|
349
352
|
from haystack.components.agents.state import State
|
|
350
|
-
from haystack.components.generators.chat import
|
|
353
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
351
354
|
from haystack.dataclasses import ChatMessage
|
|
352
355
|
from haystack.hooks import hook
|
|
353
356
|
from haystack.tools import tool
|
|
@@ -369,7 +372,7 @@ class Agent:
|
|
|
369
372
|
|
|
370
373
|
|
|
371
374
|
agent = Agent(
|
|
372
|
-
chat_generator=
|
|
375
|
+
chat_generator=OpenAIResponsesChatGenerator(),
|
|
373
376
|
tools=[save_result],
|
|
374
377
|
hooks={"on_exit": [require_save]},
|
|
375
378
|
)
|
|
@@ -601,7 +604,7 @@ class Agent:
|
|
|
601
604
|
|
|
602
605
|
async def warm_up_async(self) -> None:
|
|
603
606
|
"""Warm up the tools, hooks, and the underlying chat generator on the serving event loop."""
|
|
604
|
-
|
|
607
|
+
await warm_up_tools_async(tools=self.tools)
|
|
605
608
|
await warm_up_hooks_async(self.hooks)
|
|
606
609
|
if hasattr(self.chat_generator, "warm_up_async"):
|
|
607
610
|
await self.chat_generator.warm_up_async()
|
|
@@ -609,13 +612,15 @@ class Agent:
|
|
|
609
612
|
self.chat_generator.warm_up()
|
|
610
613
|
|
|
611
614
|
def close(self) -> None:
|
|
612
|
-
"""Release
|
|
615
|
+
"""Release tools, hooks, and chat generator resources."""
|
|
616
|
+
close_tools(tools=self.tools)
|
|
613
617
|
close_hooks(self.hooks)
|
|
614
618
|
if hasattr(self.chat_generator, "close"):
|
|
615
619
|
self.chat_generator.close()
|
|
616
620
|
|
|
617
621
|
async def close_async(self) -> None:
|
|
618
|
-
"""Release
|
|
622
|
+
"""Release async tools, hooks, and chat generator resources."""
|
|
623
|
+
await close_tools_async(tools=self.tools)
|
|
619
624
|
await close_hooks_async(self.hooks)
|
|
620
625
|
if hasattr(self.chat_generator, "close_async"):
|
|
621
626
|
await self.chat_generator.close_async()
|
|
@@ -817,9 +822,6 @@ class Agent:
|
|
|
817
822
|
|
|
818
823
|
if isinstance(tools, (Toolset, list)):
|
|
819
824
|
selected = cast(ToolsType, tools) # mypy can't narrow the Union type from the isinstance checks
|
|
820
|
-
# Per-run tools are not covered by the Agent's own warm_up(), so warm them up here.
|
|
821
|
-
# warm_up() is expected to be idempotent, so re-warming on every run is cheap.
|
|
822
|
-
warm_up_tools(tools=selected)
|
|
823
825
|
return _spawn_tools(tools=selected)
|
|
824
826
|
|
|
825
827
|
raise TypeError(
|
|
@@ -847,6 +849,8 @@ class Agent:
|
|
|
847
849
|
precedence, keys set only at initialization are kept.
|
|
848
850
|
:param tools: Optional list of Tool objects, a Toolset, or list of tool names to use for this run.
|
|
849
851
|
When passing tool names, tools are selected from the Agent's originally configured tools.
|
|
852
|
+
Tool and Toolset objects passed here are warmed up automatically; the caller is responsible for
|
|
853
|
+
closing them if they hold resources.
|
|
850
854
|
:param hook_context: Optional dictionary of request-scoped resources made available to hooks via
|
|
851
855
|
`state.data.get("hook_context")`. Useful in web/server environments to provide per-request objects
|
|
852
856
|
(e.g., WebSocket connections, async queues, Redis pub/sub clients) that a hook can use, for
|
|
@@ -874,6 +878,12 @@ class Agent:
|
|
|
874
878
|
"""
|
|
875
879
|
agent_inputs = {"messages": messages, "streaming_callback": streaming_callback, **kwargs}
|
|
876
880
|
self.warm_up()
|
|
881
|
+
# warm up tools passed at runtime
|
|
882
|
+
if isinstance(tools, Toolset):
|
|
883
|
+
tools_to_warm_up: ToolsType = tools
|
|
884
|
+
else:
|
|
885
|
+
tools_to_warm_up = [tool for tool in tools or [] if not isinstance(tool, str)]
|
|
886
|
+
warm_up_tools(tools=tools_to_warm_up)
|
|
877
887
|
|
|
878
888
|
exe_context = self._initialize_fresh_execution(
|
|
879
889
|
messages=messages,
|
|
@@ -934,6 +944,9 @@ class Agent:
|
|
|
934
944
|
with the `generation_kwargs` passed at the chat generator's initialization: keys provided here take
|
|
935
945
|
precedence, keys set only at initialization are kept.
|
|
936
946
|
:param tools: Optional list of Tool objects, a Toolset, or list of tool names to use for this run.
|
|
947
|
+
When passing tool names, tools are selected from the Agent's originally configured tools.
|
|
948
|
+
Tool and Toolset objects passed here are warmed up automatically; the caller is responsible for
|
|
949
|
+
closing them if they hold resources.
|
|
937
950
|
:param hook_context: Optional dictionary of request-scoped resources made available to hooks via
|
|
938
951
|
`state.data.get("hook_context")`. Useful in web/server environments to provide per-request objects
|
|
939
952
|
(e.g., WebSocket connections, async queues, Redis pub/sub clients) that a hook can use, for
|
|
@@ -961,6 +974,12 @@ class Agent:
|
|
|
961
974
|
"""
|
|
962
975
|
agent_inputs = {"messages": messages, "streaming_callback": streaming_callback, **kwargs}
|
|
963
976
|
await self.warm_up_async()
|
|
977
|
+
# warm up tools passed at runtime
|
|
978
|
+
if isinstance(tools, Toolset):
|
|
979
|
+
tools_to_warm_up: ToolsType = tools
|
|
980
|
+
else:
|
|
981
|
+
tools_to_warm_up = [tool for tool in tools or [] if not isinstance(tool, str)]
|
|
982
|
+
await warm_up_tools_async(tools=tools_to_warm_up)
|
|
964
983
|
|
|
965
984
|
exe_context = self._initialize_fresh_execution(
|
|
966
985
|
messages=messages,
|
|
@@ -115,7 +115,7 @@ def _select_tools_by_name(configured_tools: ToolsType, names: list[str]) -> list
|
|
|
115
115
|
Standalone Tools are kept when their name is requested. A Toolset with run-scoped state (one overriding
|
|
116
116
|
`spawn()`, such as SearchableToolset) is replaced by a per-run copy carrying the requested names, so its
|
|
117
117
|
dynamic behavior (search/lazy-loading) is preserved without mutating the shared, configured Toolset. Any
|
|
118
|
-
other Toolset is
|
|
118
|
+
other Toolset is reduced to the matching Tools. The caller must warm up the tools before selection.
|
|
119
119
|
|
|
120
120
|
:param configured_tools: The tools configured on the Agent.
|
|
121
121
|
:param names: The requested tool names.
|
|
@@ -68,13 +68,13 @@ class ChatPromptBuilder:
|
|
|
68
68
|
|
|
69
69
|
```python
|
|
70
70
|
from haystack.components.builders import ChatPromptBuilder
|
|
71
|
-
from haystack.components.generators.chat import
|
|
71
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
72
72
|
from haystack.dataclasses import ChatMessage
|
|
73
73
|
from haystack import Pipeline
|
|
74
74
|
|
|
75
75
|
# no parameter init, we don't use any runtime template variables
|
|
76
76
|
prompt_builder = ChatPromptBuilder()
|
|
77
|
-
llm =
|
|
77
|
+
llm = OpenAIResponsesChatGenerator(model="gpt-5.6-luna")
|
|
78
78
|
|
|
79
79
|
pipe = Pipeline()
|
|
80
80
|
pipe.add_component("prompt_builder", prompt_builder)
|
|
@@ -88,26 +88,18 @@ class ChatPromptBuilder:
|
|
|
88
88
|
|
|
89
89
|
res = pipe.run(data={"prompt_builder": {"template_variables": {"location": location, "language": language},
|
|
90
90
|
"template": messages}})
|
|
91
|
-
print(res)
|
|
92
|
-
# >>
|
|
93
|
-
#
|
|
94
|
-
# and diverse cities in Europe. Here are some key things to know...Enjoy your time exploring the vibrant and dynamic
|
|
95
|
-
# capital of Germany!")], _name=None, _meta={'model': 'gpt-5-mini',
|
|
96
|
-
# 'index': 0, 'finish_reason': 'stop', 'usage': {'prompt_tokens': 27, 'completion_tokens': 681, 'total_tokens':
|
|
97
|
-
# 708}})]}}
|
|
91
|
+
print(res["llm"]["replies"][0].text)
|
|
92
|
+
# >> Berlin is the capital city of Germany and one of the most vibrant and diverse cities in Europe. Here are some
|
|
93
|
+
# >> key things to know...Enjoy your time exploring the vibrant and dynamic capital of Germany!
|
|
98
94
|
|
|
99
95
|
messages = [system_message, ChatMessage.from_user("What's the weather forecast for {{location}} in the next {{day_count}} days?")]
|
|
100
96
|
|
|
101
97
|
res = pipe.run(data={"prompt_builder": {"template_variables": {"location": location, "day_count": "5"},
|
|
102
98
|
"template": messages}})
|
|
103
99
|
|
|
104
|
-
print(res)
|
|
105
|
-
# >>
|
|
106
|
-
#
|
|
107
|
-
# days:\\n\\nDay 1: Mostly cloudy with a high of 22°C (72°F) and...so it's always a good idea to check for updates
|
|
108
|
-
# closer to your visit.")], _name=None, _meta={'model': 'gpt-5-mini',
|
|
109
|
-
# 'index': 0, 'finish_reason': 'stop', 'usage': {'prompt_tokens': 37, 'completion_tokens': 201,
|
|
110
|
-
# 'total_tokens': 238}})]}}
|
|
100
|
+
print(res["llm"]["replies"][0].text)
|
|
101
|
+
# >> Here is the weather forecast for Berlin in the next 5 days: Day 1: Mostly cloudy with a high of 22°C (72°F)
|
|
102
|
+
# >> and...so it's always a good idea to check for updates closer to your visit.
|
|
111
103
|
```
|
|
112
104
|
|
|
113
105
|
#### String prompt template
|
|
@@ -47,7 +47,7 @@ class PromptBuilder:
|
|
|
47
47
|
```python
|
|
48
48
|
from haystack import Pipeline, Document
|
|
49
49
|
from haystack.utils import Secret
|
|
50
|
-
from haystack.components.generators.chat import
|
|
50
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
51
51
|
from haystack.components.builders.prompt_builder import PromptBuilder
|
|
52
52
|
|
|
53
53
|
# in a real world use case documents could come from a retriever, web, or any other source
|
|
@@ -64,7 +64,7 @@ class PromptBuilder:
|
|
|
64
64
|
\"\"\"
|
|
65
65
|
p = Pipeline()
|
|
66
66
|
p.add_component(instance=PromptBuilder(template=prompt_template), name="prompt_builder")
|
|
67
|
-
p.add_component(instance=
|
|
67
|
+
p.add_component(instance=OpenAIResponsesChatGenerator(api_key=Secret.from_env_var("OPENAI_API_KEY")), name="llm")
|
|
68
68
|
p.connect("prompt_builder", "llm")
|
|
69
69
|
|
|
70
70
|
question = "Where does Joe live?"
|
|
@@ -74,8 +74,8 @@ class LLMDocumentContentExtractor:
|
|
|
74
74
|
- If the LLM returns a **JSON object with multiple keys**, the value of ``document_content`` (if present) is
|
|
75
75
|
written to content and all other keys are merged into the document's metadata.
|
|
76
76
|
|
|
77
|
-
The ChatGenerator can be configured to return JSON
|
|
78
|
-
in
|
|
77
|
+
The ChatGenerator can be configured to return JSON. For example, with the OpenAIResponsesChatGenerator, pass
|
|
78
|
+
`{"text": {"format": {"type": "json_schema", ...}}}` in `generation_kwargs` as shown in the usage example below.
|
|
79
79
|
|
|
80
80
|
Documents that fail extraction are returned in ``failed_documents`` with ``content_extraction_error`` in metadata.
|
|
81
81
|
|
|
@@ -83,7 +83,7 @@ class LLMDocumentContentExtractor:
|
|
|
83
83
|
|
|
84
84
|
```python
|
|
85
85
|
from haystack import Document
|
|
86
|
-
from haystack.components.generators.chat import
|
|
86
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
87
87
|
from haystack.components.extractors.image import LLMDocumentContentExtractor
|
|
88
88
|
|
|
89
89
|
prompt = \"\"\"
|
|
@@ -95,12 +95,13 @@ class LLMDocumentContentExtractor:
|
|
|
95
95
|
Return this metadata as additional key-value pairs in the same JSON object.
|
|
96
96
|
\"\"\"
|
|
97
97
|
|
|
98
|
-
chat_generator =
|
|
98
|
+
chat_generator = OpenAIResponsesChatGenerator(
|
|
99
99
|
generation_kwargs={
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
|
|
100
|
+
"text": {
|
|
101
|
+
"format": {
|
|
102
|
+
"type": "json_schema",
|
|
103
103
|
"name": "entity_extraction",
|
|
104
|
+
"strict": False,
|
|
104
105
|
"schema": {
|
|
105
106
|
"type": "object",
|
|
106
107
|
"properties": {
|
|
@@ -148,7 +149,8 @@ class LLMDocumentContentExtractor:
|
|
|
148
149
|
Initialize the LLMDocumentContentExtractor component.
|
|
149
150
|
|
|
150
151
|
:param chat_generator: A ChatGenerator that supports vision input. Optionally configured for JSON
|
|
151
|
-
(e.g.
|
|
152
|
+
(e.g. `{"text": {"format": {"type": "json_schema", ...}}}` in `generation_kwargs` when using the
|
|
153
|
+
OpenAIResponsesChatGenerator).
|
|
152
154
|
:param prompt: Prompt for extraction. Must not contain Jinja variables.
|
|
153
155
|
:param file_path_meta_field: The metadata field in the Document that contains the file path to the image or PDF.
|
|
154
156
|
:param root_path: The root directory path where document files are located. If provided, file paths in
|
|
@@ -46,7 +46,7 @@ class LLMMetadataExtractor:
|
|
|
46
46
|
```python
|
|
47
47
|
from haystack import Document
|
|
48
48
|
from haystack.components.extractors.llm_metadata_extractor import LLMMetadataExtractor
|
|
49
|
-
from haystack.components.generators.chat import
|
|
49
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
50
50
|
|
|
51
51
|
NER_PROMPT = '''
|
|
52
52
|
-Goal-
|
|
@@ -92,15 +92,13 @@ class LLMMetadataExtractor:
|
|
|
92
92
|
Document(content="Hugging Face is a company that was founded in New York, USA and is known for its Transformers library")
|
|
93
93
|
]
|
|
94
94
|
|
|
95
|
-
chat_generator =
|
|
95
|
+
chat_generator = OpenAIResponsesChatGenerator(
|
|
96
96
|
generation_kwargs={
|
|
97
|
-
"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
"response_format": {
|
|
101
|
-
"type": "json_schema",
|
|
102
|
-
"json_schema": {
|
|
97
|
+
"text": {
|
|
98
|
+
"format": {
|
|
99
|
+
"type": "json_schema",
|
|
103
100
|
"name": "entity_extraction",
|
|
101
|
+
"strict": True,
|
|
104
102
|
"schema": {
|
|
105
103
|
"type": "object",
|
|
106
104
|
"properties": {
|
|
@@ -167,8 +165,9 @@ class LLMMetadataExtractor:
|
|
|
167
165
|
which points to a single document in the list of documents. For example, to access the content of the
|
|
168
166
|
document, use `{{ document.content }}` in the prompt.
|
|
169
167
|
:param chat_generator: a ChatGenerator instance which represents the LLM. In order for the component to work,
|
|
170
|
-
the LLM should be configured to return a JSON object. For example, when using the
|
|
171
|
-
should pass `{"
|
|
168
|
+
the LLM should be configured to return a JSON object. For example, when using the
|
|
169
|
+
OpenAIResponsesChatGenerator, you should pass `{"text": {"format": {"type": "json_schema", ...}}}` in the
|
|
170
|
+
`generation_kwargs`.
|
|
172
171
|
:param expected_keys: The keys expected in the JSON output from the LLM.
|
|
173
172
|
:param page_range: A range of pages to extract metadata from. For example, page_range=['1', '3'] will extract
|
|
174
173
|
metadata from the first and third pages of each document. It also accepts printable range strings, e.g.:
|
|
@@ -18,7 +18,6 @@ from haystack.tools import (
|
|
|
18
18
|
deserialize_tools_or_toolset_inplace,
|
|
19
19
|
flatten_tools_or_toolsets,
|
|
20
20
|
serialize_tools_or_toolset,
|
|
21
|
-
warm_up_tools,
|
|
22
21
|
)
|
|
23
22
|
from haystack.utils import Secret, deserialize_callable, serialize_callable
|
|
24
23
|
from haystack.utils.http_client import init_http_client
|
|
@@ -29,7 +28,7 @@ class AzureOpenAIChatGenerator(OpenAIChatGenerator):
|
|
|
29
28
|
"""
|
|
30
29
|
Generates text using OpenAI's models on Azure.
|
|
31
30
|
|
|
32
|
-
It works with
|
|
31
|
+
It works with OpenAI's GPT models deployed on Azure and supports streaming responses
|
|
33
32
|
from OpenAI API. It uses [ChatMessage](https://docs.haystack.deepset.ai/docs/chatmessage)
|
|
34
33
|
format in input and output.
|
|
35
34
|
|
|
@@ -53,7 +52,7 @@ class AzureOpenAIChatGenerator(OpenAIChatGenerator):
|
|
|
53
52
|
client = AzureOpenAIChatGenerator(
|
|
54
53
|
azure_endpoint="<Your Azure endpoint e.g. `https://your-company.azure.openai.com/>",
|
|
55
54
|
api_key=Secret.from_token("<your-api-key>"),
|
|
56
|
-
azure_deployment="<this is a model name, e.g. gpt-
|
|
55
|
+
azure_deployment="<this is a model name, e.g. gpt-5.6-luna>")
|
|
57
56
|
response = client.run(messages)
|
|
58
57
|
print(response)
|
|
59
58
|
```
|
|
@@ -64,7 +63,7 @@ class AzureOpenAIChatGenerator(OpenAIChatGenerator):
|
|
|
64
63
|
"Natural Language Processing (NLP) is a branch of artificial intelligence that focuses on
|
|
65
64
|
enabling computers to understand, interpret, and generate human language in a way that is useful.")],
|
|
66
65
|
_name=None,
|
|
67
|
-
_meta={'model': 'gpt-
|
|
66
|
+
_meta={'model': 'gpt-5.6-luna', 'index': 0, 'finish_reason': 'stop',
|
|
68
67
|
'usage': {'prompt_tokens': 15, 'completion_tokens': 36, 'total_tokens': 51}})]
|
|
69
68
|
}
|
|
70
69
|
```
|
|
@@ -234,7 +233,6 @@ class AzureOpenAIChatGenerator(OpenAIChatGenerator):
|
|
|
234
233
|
|
|
235
234
|
self.client: AzureOpenAI | None = None
|
|
236
235
|
self.async_client: AsyncAzureOpenAI | None = None
|
|
237
|
-
self._tools_warmed_up = False
|
|
238
236
|
|
|
239
237
|
def _client_kwargs(self) -> dict[str, Any]:
|
|
240
238
|
timeout = self.timeout if self.timeout is not None else float(os.environ.get("OPENAI_TIMEOUT", "30.0"))
|
|
@@ -260,16 +258,10 @@ class AzureOpenAIChatGenerator(OpenAIChatGenerator):
|
|
|
260
258
|
"azure_ad_token_provider": self.azure_ad_token_provider,
|
|
261
259
|
}
|
|
262
260
|
|
|
263
|
-
def _warm_up_tools(self) -> None:
|
|
264
|
-
if not self._tools_warmed_up:
|
|
265
|
-
warm_up_tools(self.tools)
|
|
266
|
-
self._tools_warmed_up = True
|
|
267
|
-
|
|
268
261
|
def warm_up(self) -> None:
|
|
269
262
|
"""
|
|
270
|
-
|
|
263
|
+
Initialize the synchronous Azure OpenAI client.
|
|
271
264
|
"""
|
|
272
|
-
self._warm_up_tools()
|
|
273
265
|
if self.client is None:
|
|
274
266
|
# openai>=3 annotates http_client as httpx2, but legacy httpx clients are supported at runtime.
|
|
275
267
|
# https://github.com/openai/openai-python/blob/main/httpx2.md
|
|
@@ -281,9 +273,8 @@ class AzureOpenAIChatGenerator(OpenAIChatGenerator):
|
|
|
281
273
|
|
|
282
274
|
async def warm_up_async(self) -> None: # noqa: RUF029
|
|
283
275
|
"""
|
|
284
|
-
|
|
276
|
+
Initialize the asynchronous Azure OpenAI client on the serving event loop.
|
|
285
277
|
"""
|
|
286
|
-
self._warm_up_tools()
|
|
287
278
|
if self.async_client is None:
|
|
288
279
|
# openai>=3 annotates http_client as httpx2, but legacy httpx clients are supported at runtime.
|
|
289
280
|
# https://github.com/openai/openai-python/blob/main/httpx2.md
|
|
@@ -26,10 +26,10 @@ class LLM(Agent):
|
|
|
26
26
|
### Usage examples
|
|
27
27
|
```python
|
|
28
28
|
from haystack.components.generators.chat import LLM
|
|
29
|
-
from haystack.components.generators.chat import
|
|
29
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
30
30
|
|
|
31
31
|
llm = LLM(
|
|
32
|
-
chat_generator=
|
|
32
|
+
chat_generator=OpenAIResponsesChatGenerator(),
|
|
33
33
|
system_prompt="You are a helpful translation assistant.",
|
|
34
34
|
user_prompt="Summarize the following document: {{ document }}",
|
|
35
35
|
required_variables=["document"],
|
|
@@ -39,6 +39,7 @@ from haystack.dataclasses import (
|
|
|
39
39
|
ToolCallDelta,
|
|
40
40
|
select_streaming_callback,
|
|
41
41
|
)
|
|
42
|
+
from haystack.dataclasses.chat_message import _parse_openai_tool_call_arguments
|
|
42
43
|
from haystack.dataclasses.streaming_chunk import _invoke_streaming_callback
|
|
43
44
|
from haystack.tools import (
|
|
44
45
|
ToolsType,
|
|
@@ -46,7 +47,6 @@ from haystack.tools import (
|
|
|
46
47
|
deserialize_tools_or_toolset_inplace,
|
|
47
48
|
flatten_tools_or_toolsets,
|
|
48
49
|
serialize_tools_or_toolset,
|
|
49
|
-
warm_up_tools,
|
|
50
50
|
)
|
|
51
51
|
from haystack.utils import Secret, deserialize_callable, serialize_callable
|
|
52
52
|
from haystack.utils.http_client import init_http_client
|
|
@@ -59,7 +59,7 @@ class OpenAIChatGenerator:
|
|
|
59
59
|
"""
|
|
60
60
|
Completes chats using OpenAI's large language models (LLMs).
|
|
61
61
|
|
|
62
|
-
It works with
|
|
62
|
+
It works with OpenAI's GPT models through the Chat Completions API and supports streaming responses
|
|
63
63
|
from OpenAI API. It uses [ChatMessage](https://docs.haystack.deepset.ai/docs/chatmessage)
|
|
64
64
|
format in input and output.
|
|
65
65
|
|
|
@@ -211,7 +211,6 @@ class OpenAIChatGenerator:
|
|
|
211
211
|
|
|
212
212
|
self.client: OpenAI | None = None
|
|
213
213
|
self.async_client: AsyncOpenAI | None = None
|
|
214
|
-
self._tools_warmed_up = False
|
|
215
214
|
|
|
216
215
|
def _client_kwargs(self) -> dict[str, Any]:
|
|
217
216
|
timeout = self.timeout if self.timeout is not None else float(os.environ.get("OPENAI_TIMEOUT", "30.0"))
|
|
@@ -226,16 +225,10 @@ class OpenAIChatGenerator:
|
|
|
226
225
|
"max_retries": max_retries,
|
|
227
226
|
}
|
|
228
227
|
|
|
229
|
-
def _warm_up_tools(self) -> None:
|
|
230
|
-
if not self._tools_warmed_up:
|
|
231
|
-
warm_up_tools(self.tools)
|
|
232
|
-
self._tools_warmed_up = True
|
|
233
|
-
|
|
234
228
|
def warm_up(self) -> None:
|
|
235
229
|
"""
|
|
236
|
-
|
|
230
|
+
Initialize the synchronous OpenAI client.
|
|
237
231
|
"""
|
|
238
|
-
self._warm_up_tools()
|
|
239
232
|
if self.client is None:
|
|
240
233
|
# openai>=3 annotates http_client as httpx2, but legacy httpx clients are supported at runtime.
|
|
241
234
|
# https://github.com/openai/openai-python/blob/main/httpx2.md
|
|
@@ -247,9 +240,8 @@ class OpenAIChatGenerator:
|
|
|
247
240
|
|
|
248
241
|
async def warm_up_async(self) -> None: # noqa: RUF029
|
|
249
242
|
"""
|
|
250
|
-
|
|
243
|
+
Initialize the asynchronous OpenAI client on the serving event loop.
|
|
251
244
|
"""
|
|
252
|
-
self._warm_up_tools()
|
|
253
245
|
if self.async_client is None:
|
|
254
246
|
# openai>=3 annotates http_client as httpx2, but legacy httpx clients are supported at runtime.
|
|
255
247
|
# https://github.com/openai/openai-python/blob/main/httpx2.md
|
|
@@ -668,7 +660,7 @@ def _convert_chat_completion_to_chat_message(
|
|
|
668
660
|
for openai_tc in openai_tool_calls:
|
|
669
661
|
arguments_str = openai_tc.function.arguments
|
|
670
662
|
try:
|
|
671
|
-
arguments =
|
|
663
|
+
arguments = _parse_openai_tool_call_arguments(arguments_str)
|
|
672
664
|
tool_calls.append(ToolCall(id=openai_tc.id, tool_name=openai_tc.function.name, arguments=arguments))
|
|
673
665
|
except json.JSONDecodeError:
|
|
674
666
|
logger.warning(
|
|
@@ -29,6 +29,7 @@ from haystack.dataclasses import (
|
|
|
29
29
|
ToolCallDelta,
|
|
30
30
|
select_streaming_callback,
|
|
31
31
|
)
|
|
32
|
+
from haystack.dataclasses.chat_message import _parse_openai_tool_call_arguments
|
|
32
33
|
from haystack.dataclasses.streaming_chunk import FinishReason, _invoke_streaming_callback
|
|
33
34
|
from haystack.tools import (
|
|
34
35
|
ToolsType,
|
|
@@ -36,7 +37,6 @@ from haystack.tools import (
|
|
|
36
37
|
deserialize_tools_or_toolset_inplace,
|
|
37
38
|
flatten_tools_or_toolsets,
|
|
38
39
|
serialize_tools_or_toolset,
|
|
39
|
-
warm_up_tools,
|
|
40
40
|
)
|
|
41
41
|
from haystack.utils import Secret, deserialize_callable, serialize_callable
|
|
42
42
|
from haystack.utils.http_client import init_http_client
|
|
@@ -69,7 +69,7 @@ class OpenAIResponsesChatGenerator:
|
|
|
69
69
|
"""
|
|
70
70
|
Completes chats using OpenAI's Responses API.
|
|
71
71
|
|
|
72
|
-
It works with
|
|
72
|
+
It works with OpenAI's GPT and o-series models and supports streaming responses
|
|
73
73
|
from OpenAI API. It uses [ChatMessage](https://docs.haystack.deepset.ai/docs/chatmessage)
|
|
74
74
|
format in input and output.
|
|
75
75
|
|
|
@@ -231,7 +231,6 @@ class OpenAIResponsesChatGenerator:
|
|
|
231
231
|
|
|
232
232
|
self.client: OpenAI | None = None
|
|
233
233
|
self.async_client: AsyncOpenAI | None = None
|
|
234
|
-
self._tools_warmed_up = False
|
|
235
234
|
|
|
236
235
|
def _client_kwargs(self) -> dict[str, Any]:
|
|
237
236
|
timeout = self.timeout if self.timeout is not None else float(os.environ.get("OPENAI_TIMEOUT", "30.0"))
|
|
@@ -247,20 +246,10 @@ class OpenAIResponsesChatGenerator:
|
|
|
247
246
|
"max_retries": max_retries,
|
|
248
247
|
}
|
|
249
248
|
|
|
250
|
-
def _warm_up_tools(self) -> None:
|
|
251
|
-
if not self._tools_warmed_up:
|
|
252
|
-
is_openai_tool = isinstance(self.tools, list) and bool(self.tools) and isinstance(self.tools[0], dict)
|
|
253
|
-
# We only warm up Haystack tools, not OpenAI/MCP tools
|
|
254
|
-
# The type ignore is needed because mypy cannot infer the type correctly
|
|
255
|
-
if not is_openai_tool:
|
|
256
|
-
warm_up_tools(self.tools) # type: ignore[arg-type]
|
|
257
|
-
self._tools_warmed_up = True
|
|
258
|
-
|
|
259
249
|
def warm_up(self) -> None:
|
|
260
250
|
"""
|
|
261
|
-
|
|
251
|
+
Initialize the synchronous OpenAI client.
|
|
262
252
|
"""
|
|
263
|
-
self._warm_up_tools()
|
|
264
253
|
if self.client is None:
|
|
265
254
|
# openai>=3 annotates http_client as httpx2, but legacy httpx clients are supported at runtime.
|
|
266
255
|
# https://github.com/openai/openai-python/blob/main/httpx2.md
|
|
@@ -272,9 +261,8 @@ class OpenAIResponsesChatGenerator:
|
|
|
272
261
|
|
|
273
262
|
async def warm_up_async(self) -> None: # noqa: RUF029
|
|
274
263
|
"""
|
|
275
|
-
|
|
264
|
+
Initialize the asynchronous OpenAI client on the serving event loop.
|
|
276
265
|
"""
|
|
277
|
-
self._warm_up_tools()
|
|
278
266
|
if self.async_client is None:
|
|
279
267
|
# openai>=3 annotates http_client as httpx2, but legacy httpx clients are supported at runtime.
|
|
280
268
|
# https://github.com/openai/openai-python/blob/main/httpx2.md
|
|
@@ -692,7 +680,7 @@ def _convert_response_to_chat_message(responses: Response | ParsedResponse) -> C
|
|
|
692
680
|
|
|
693
681
|
elif output.type == "function_call":
|
|
694
682
|
try:
|
|
695
|
-
arguments =
|
|
683
|
+
arguments = _parse_openai_tool_call_arguments(output.arguments)
|
|
696
684
|
tool_calls.append(
|
|
697
685
|
ToolCall(
|
|
698
686
|
id=output.id, tool_name=output.name, arguments=arguments, extra={"call_id": output.call_id}
|
|
@@ -59,7 +59,7 @@ class AnswerJoiner:
|
|
|
59
59
|
|
|
60
60
|
from haystack.core.pipeline import Pipeline
|
|
61
61
|
|
|
62
|
-
from haystack.components.generators.chat import
|
|
62
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
63
63
|
from haystack.dataclasses import ChatMessage
|
|
64
64
|
|
|
65
65
|
|
|
@@ -68,8 +68,8 @@ class AnswerJoiner:
|
|
|
68
68
|
ChatMessage.from_user(query)]
|
|
69
69
|
|
|
70
70
|
pipe = Pipeline()
|
|
71
|
-
pipe.add_component("llm_1",
|
|
72
|
-
pipe.add_component("llm_2",
|
|
71
|
+
pipe.add_component("llm_1", OpenAIResponsesChatGenerator())
|
|
72
|
+
pipe.add_component("llm_2", OpenAIResponsesChatGenerator())
|
|
73
73
|
pipe.add_component("aba", AnswerBuilder())
|
|
74
74
|
pipe.add_component("abb", AnswerBuilder())
|
|
75
75
|
pipe.add_component("joiner", AnswerJoiner())
|
|
@@ -33,7 +33,7 @@ class BranchJoiner:
|
|
|
33
33
|
import json
|
|
34
34
|
|
|
35
35
|
from haystack import Pipeline
|
|
36
|
-
from haystack.components.generators.chat import
|
|
36
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
37
37
|
from haystack.components.joiners import BranchJoiner
|
|
38
38
|
from haystack.components.validators import JsonSchemaValidator
|
|
39
39
|
from haystack.dataclasses import ChatMessage
|
|
@@ -54,7 +54,7 @@ class BranchJoiner:
|
|
|
54
54
|
|
|
55
55
|
# Add components to the pipeline
|
|
56
56
|
pipe.add_component("joiner", BranchJoiner(list[ChatMessage]))
|
|
57
|
-
pipe.add_component("generator",
|
|
57
|
+
pipe.add_component("generator", OpenAIResponsesChatGenerator(model="gpt-5.6-luna"))
|
|
58
58
|
pipe.add_component("validator", JsonSchemaValidator(json_schema=person_schema))
|
|
59
59
|
|
|
60
60
|
# And connect them
|
|
@@ -64,7 +64,7 @@ class BranchJoiner:
|
|
|
64
64
|
|
|
65
65
|
result = pipe.run(
|
|
66
66
|
data={
|
|
67
|
-
"generator": {"generation_kwargs": {"
|
|
67
|
+
"generator": {"generation_kwargs": {"text": {"format": {"type": "json_object"}}}},
|
|
68
68
|
"joiner": {"value": [ChatMessage.from_user("Create json from Peter Parker")]}}
|
|
69
69
|
)
|
|
70
70
|
|
|
@@ -80,9 +80,9 @@ class BranchJoiner:
|
|
|
80
80
|
connected components and also the type of data that `BranchJoiner` will send through its output.
|
|
81
81
|
|
|
82
82
|
In the code example, `BranchJoiner` receives a looped back `list[ChatMessage]` from the `JsonSchemaValidator` and
|
|
83
|
-
sends it down to the `
|
|
84
|
-
pipeline. In this instance, the downstream component is only one (the `
|
|
85
|
-
have more than one downstream component.
|
|
83
|
+
sends it down to the `OpenAIResponsesChatGenerator` for re-generation. We can have multiple loopback connections in
|
|
84
|
+
the pipeline. In this instance, the downstream component is only one (the `OpenAIResponsesChatGenerator`), but the
|
|
85
|
+
pipeline could have more than one downstream component.
|
|
86
86
|
"""
|
|
87
87
|
|
|
88
88
|
def __init__(self, type_: type) -> None:
|
|
@@ -21,7 +21,7 @@ class ListJoiner:
|
|
|
21
21
|
Usage example:
|
|
22
22
|
```python
|
|
23
23
|
from haystack.components.builders import ChatPromptBuilder
|
|
24
|
-
from haystack.components.generators.chat import
|
|
24
|
+
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
|
|
25
25
|
from haystack.dataclasses import ChatMessage
|
|
26
26
|
from haystack import Pipeline
|
|
27
27
|
from haystack.components.joiners import ListJoiner
|
|
@@ -39,8 +39,8 @@ class ListJoiner:
|
|
|
39
39
|
|
|
40
40
|
prompt_builder = ChatPromptBuilder(template=user_message)
|
|
41
41
|
feedback_prompt_builder = ChatPromptBuilder(template=feedback_message)
|
|
42
|
-
llm =
|
|
43
|
-
feedback_llm =
|
|
42
|
+
llm = OpenAIResponsesChatGenerator()
|
|
43
|
+
feedback_llm = OpenAIResponsesChatGenerator()
|
|
44
44
|
|
|
45
45
|
pipe = Pipeline()
|
|
46
46
|
pipe.add_component("prompt_builder", prompt_builder)
|
|
@@ -19,9 +19,6 @@ class StringJoiner:
|
|
|
19
19
|
from haystack.components.builders import PromptBuilder
|
|
20
20
|
from haystack.core.pipeline import Pipeline
|
|
21
21
|
|
|
22
|
-
from haystack.components.generators.chat import OpenAIChatGenerator
|
|
23
|
-
from haystack.dataclasses import ChatMessage
|
|
24
|
-
|
|
25
22
|
string_1 = "What's Natural Language Processing?"
|
|
26
23
|
string_2 = "What is life?"
|
|
27
24
|
|