ag2 0.10.2__py3-none-any.whl
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.
- ag2-0.10.2.dist-info/METADATA +819 -0
- ag2-0.10.2.dist-info/RECORD +423 -0
- ag2-0.10.2.dist-info/WHEEL +4 -0
- ag2-0.10.2.dist-info/licenses/LICENSE +201 -0
- ag2-0.10.2.dist-info/licenses/NOTICE.md +19 -0
- autogen/__init__.py +88 -0
- autogen/_website/__init__.py +3 -0
- autogen/_website/generate_api_references.py +426 -0
- autogen/_website/generate_mkdocs.py +1216 -0
- autogen/_website/notebook_processor.py +475 -0
- autogen/_website/process_notebooks.py +656 -0
- autogen/_website/utils.py +413 -0
- autogen/a2a/__init__.py +36 -0
- autogen/a2a/agent_executor.py +86 -0
- autogen/a2a/client.py +357 -0
- autogen/a2a/errors.py +18 -0
- autogen/a2a/httpx_client_factory.py +79 -0
- autogen/a2a/server.py +221 -0
- autogen/a2a/utils.py +207 -0
- autogen/agentchat/__init__.py +47 -0
- autogen/agentchat/agent.py +180 -0
- autogen/agentchat/assistant_agent.py +86 -0
- autogen/agentchat/chat.py +325 -0
- autogen/agentchat/contrib/__init__.py +5 -0
- autogen/agentchat/contrib/agent_eval/README.md +7 -0
- autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
- autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
- autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
- autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
- autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
- autogen/agentchat/contrib/agent_eval/task.py +42 -0
- autogen/agentchat/contrib/agent_optimizer.py +432 -0
- autogen/agentchat/contrib/capabilities/__init__.py +5 -0
- autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
- autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
- autogen/agentchat/contrib/capabilities/teachability.py +393 -0
- autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
- autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
- autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
- autogen/agentchat/contrib/capabilities/transforms.py +578 -0
- autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
- autogen/agentchat/contrib/capabilities/vision_capability.py +215 -0
- autogen/agentchat/contrib/captainagent/__init__.py +9 -0
- autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
- autogen/agentchat/contrib/captainagent/captainagent.py +514 -0
- autogen/agentchat/contrib/captainagent/tool_retriever.py +334 -0
- autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
- autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
- autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
- autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
- autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
- autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
- autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
- autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
- autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
- autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
- autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
- autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
- autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
- autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
- autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
- autogen/agentchat/contrib/graph_rag/document.py +29 -0
- autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +167 -0
- autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
- autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
- autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
- autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +263 -0
- autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
- autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
- autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
- autogen/agentchat/contrib/img_utils.py +397 -0
- autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
- autogen/agentchat/contrib/llava_agent.py +189 -0
- autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
- autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
- autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +325 -0
- autogen/agentchat/contrib/rag/__init__.py +10 -0
- autogen/agentchat/contrib/rag/chromadb_query_engine.py +268 -0
- autogen/agentchat/contrib/rag/llamaindex_query_engine.py +195 -0
- autogen/agentchat/contrib/rag/mongodb_query_engine.py +319 -0
- autogen/agentchat/contrib/rag/query_engine.py +76 -0
- autogen/agentchat/contrib/retrieve_assistant_agent.py +59 -0
- autogen/agentchat/contrib/retrieve_user_proxy_agent.py +704 -0
- autogen/agentchat/contrib/society_of_mind_agent.py +200 -0
- autogen/agentchat/contrib/swarm_agent.py +1404 -0
- autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
- autogen/agentchat/contrib/vectordb/__init__.py +5 -0
- autogen/agentchat/contrib/vectordb/base.py +224 -0
- autogen/agentchat/contrib/vectordb/chromadb.py +316 -0
- autogen/agentchat/contrib/vectordb/couchbase.py +405 -0
- autogen/agentchat/contrib/vectordb/mongodb.py +551 -0
- autogen/agentchat/contrib/vectordb/pgvectordb.py +927 -0
- autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
- autogen/agentchat/contrib/vectordb/utils.py +126 -0
- autogen/agentchat/contrib/web_surfer.py +304 -0
- autogen/agentchat/conversable_agent.py +4307 -0
- autogen/agentchat/group/__init__.py +67 -0
- autogen/agentchat/group/available_condition.py +91 -0
- autogen/agentchat/group/context_condition.py +77 -0
- autogen/agentchat/group/context_expression.py +238 -0
- autogen/agentchat/group/context_str.py +39 -0
- autogen/agentchat/group/context_variables.py +182 -0
- autogen/agentchat/group/events/transition_events.py +111 -0
- autogen/agentchat/group/group_tool_executor.py +324 -0
- autogen/agentchat/group/group_utils.py +659 -0
- autogen/agentchat/group/guardrails.py +179 -0
- autogen/agentchat/group/handoffs.py +303 -0
- autogen/agentchat/group/llm_condition.py +93 -0
- autogen/agentchat/group/multi_agent_chat.py +291 -0
- autogen/agentchat/group/on_condition.py +55 -0
- autogen/agentchat/group/on_context_condition.py +51 -0
- autogen/agentchat/group/patterns/__init__.py +18 -0
- autogen/agentchat/group/patterns/auto.py +160 -0
- autogen/agentchat/group/patterns/manual.py +177 -0
- autogen/agentchat/group/patterns/pattern.py +295 -0
- autogen/agentchat/group/patterns/random.py +106 -0
- autogen/agentchat/group/patterns/round_robin.py +117 -0
- autogen/agentchat/group/reply_result.py +24 -0
- autogen/agentchat/group/safeguards/__init__.py +21 -0
- autogen/agentchat/group/safeguards/api.py +241 -0
- autogen/agentchat/group/safeguards/enforcer.py +1158 -0
- autogen/agentchat/group/safeguards/events.py +140 -0
- autogen/agentchat/group/safeguards/validator.py +435 -0
- autogen/agentchat/group/speaker_selection_result.py +41 -0
- autogen/agentchat/group/targets/__init__.py +4 -0
- autogen/agentchat/group/targets/function_target.py +245 -0
- autogen/agentchat/group/targets/group_chat_target.py +133 -0
- autogen/agentchat/group/targets/group_manager_target.py +151 -0
- autogen/agentchat/group/targets/transition_target.py +424 -0
- autogen/agentchat/group/targets/transition_utils.py +6 -0
- autogen/agentchat/groupchat.py +1832 -0
- autogen/agentchat/realtime/__init__.py +3 -0
- autogen/agentchat/realtime/experimental/__init__.py +20 -0
- autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
- autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
- autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
- autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
- autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
- autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
- autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
- autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
- autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
- autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
- autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
- autogen/agentchat/realtime/experimental/clients/realtime_client.py +191 -0
- autogen/agentchat/realtime/experimental/function_observer.py +84 -0
- autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
- autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
- autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
- autogen/agentchat/realtime/experimental/realtime_swarm.py +533 -0
- autogen/agentchat/realtime/experimental/websockets.py +21 -0
- autogen/agentchat/realtime_agent/__init__.py +21 -0
- autogen/agentchat/user_proxy_agent.py +114 -0
- autogen/agentchat/utils.py +206 -0
- autogen/agents/__init__.py +3 -0
- autogen/agents/contrib/__init__.py +10 -0
- autogen/agents/contrib/time/__init__.py +8 -0
- autogen/agents/contrib/time/time_reply_agent.py +74 -0
- autogen/agents/contrib/time/time_tool_agent.py +52 -0
- autogen/agents/experimental/__init__.py +27 -0
- autogen/agents/experimental/deep_research/__init__.py +7 -0
- autogen/agents/experimental/deep_research/deep_research.py +52 -0
- autogen/agents/experimental/discord/__init__.py +7 -0
- autogen/agents/experimental/discord/discord.py +66 -0
- autogen/agents/experimental/document_agent/__init__.py +19 -0
- autogen/agents/experimental/document_agent/chroma_query_engine.py +301 -0
- autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +113 -0
- autogen/agents/experimental/document_agent/document_agent.py +643 -0
- autogen/agents/experimental/document_agent/document_conditions.py +50 -0
- autogen/agents/experimental/document_agent/document_utils.py +376 -0
- autogen/agents/experimental/document_agent/inmemory_query_engine.py +214 -0
- autogen/agents/experimental/document_agent/parser_utils.py +134 -0
- autogen/agents/experimental/document_agent/url_utils.py +417 -0
- autogen/agents/experimental/reasoning/__init__.py +7 -0
- autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
- autogen/agents/experimental/slack/__init__.py +7 -0
- autogen/agents/experimental/slack/slack.py +73 -0
- autogen/agents/experimental/telegram/__init__.py +7 -0
- autogen/agents/experimental/telegram/telegram.py +76 -0
- autogen/agents/experimental/websurfer/__init__.py +7 -0
- autogen/agents/experimental/websurfer/websurfer.py +70 -0
- autogen/agents/experimental/wikipedia/__init__.py +7 -0
- autogen/agents/experimental/wikipedia/wikipedia.py +88 -0
- autogen/browser_utils.py +309 -0
- autogen/cache/__init__.py +10 -0
- autogen/cache/abstract_cache_base.py +71 -0
- autogen/cache/cache.py +203 -0
- autogen/cache/cache_factory.py +88 -0
- autogen/cache/cosmos_db_cache.py +144 -0
- autogen/cache/disk_cache.py +97 -0
- autogen/cache/in_memory_cache.py +54 -0
- autogen/cache/redis_cache.py +119 -0
- autogen/code_utils.py +598 -0
- autogen/coding/__init__.py +30 -0
- autogen/coding/base.py +120 -0
- autogen/coding/docker_commandline_code_executor.py +283 -0
- autogen/coding/factory.py +56 -0
- autogen/coding/func_with_reqs.py +203 -0
- autogen/coding/jupyter/__init__.py +23 -0
- autogen/coding/jupyter/base.py +36 -0
- autogen/coding/jupyter/docker_jupyter_server.py +160 -0
- autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
- autogen/coding/jupyter/import_utils.py +82 -0
- autogen/coding/jupyter/jupyter_client.py +224 -0
- autogen/coding/jupyter/jupyter_code_executor.py +154 -0
- autogen/coding/jupyter/local_jupyter_server.py +164 -0
- autogen/coding/local_commandline_code_executor.py +341 -0
- autogen/coding/markdown_code_extractor.py +44 -0
- autogen/coding/utils.py +55 -0
- autogen/coding/yepcode_code_executor.py +197 -0
- autogen/doc_utils.py +35 -0
- autogen/environments/__init__.py +10 -0
- autogen/environments/docker_python_environment.py +365 -0
- autogen/environments/python_environment.py +125 -0
- autogen/environments/system_python_environment.py +85 -0
- autogen/environments/venv_python_environment.py +220 -0
- autogen/environments/working_directory.py +74 -0
- autogen/events/__init__.py +7 -0
- autogen/events/agent_events.py +1016 -0
- autogen/events/base_event.py +100 -0
- autogen/events/client_events.py +168 -0
- autogen/events/helpers.py +44 -0
- autogen/events/print_event.py +45 -0
- autogen/exception_utils.py +73 -0
- autogen/extensions/__init__.py +5 -0
- autogen/fast_depends/__init__.py +16 -0
- autogen/fast_depends/_compat.py +75 -0
- autogen/fast_depends/core/__init__.py +14 -0
- autogen/fast_depends/core/build.py +206 -0
- autogen/fast_depends/core/model.py +527 -0
- autogen/fast_depends/dependencies/__init__.py +15 -0
- autogen/fast_depends/dependencies/model.py +30 -0
- autogen/fast_depends/dependencies/provider.py +40 -0
- autogen/fast_depends/library/__init__.py +10 -0
- autogen/fast_depends/library/model.py +46 -0
- autogen/fast_depends/py.typed +6 -0
- autogen/fast_depends/schema.py +66 -0
- autogen/fast_depends/use.py +272 -0
- autogen/fast_depends/utils.py +177 -0
- autogen/formatting_utils.py +83 -0
- autogen/function_utils.py +13 -0
- autogen/graph_utils.py +173 -0
- autogen/import_utils.py +539 -0
- autogen/interop/__init__.py +22 -0
- autogen/interop/crewai/__init__.py +7 -0
- autogen/interop/crewai/crewai.py +88 -0
- autogen/interop/interoperability.py +71 -0
- autogen/interop/interoperable.py +46 -0
- autogen/interop/langchain/__init__.py +8 -0
- autogen/interop/langchain/langchain_chat_model_factory.py +156 -0
- autogen/interop/langchain/langchain_tool.py +78 -0
- autogen/interop/litellm/__init__.py +7 -0
- autogen/interop/litellm/litellm_config_factory.py +178 -0
- autogen/interop/pydantic_ai/__init__.py +7 -0
- autogen/interop/pydantic_ai/pydantic_ai.py +172 -0
- autogen/interop/registry.py +70 -0
- autogen/io/__init__.py +15 -0
- autogen/io/base.py +151 -0
- autogen/io/console.py +56 -0
- autogen/io/processors/__init__.py +12 -0
- autogen/io/processors/base.py +21 -0
- autogen/io/processors/console_event_processor.py +61 -0
- autogen/io/run_response.py +294 -0
- autogen/io/thread_io_stream.py +63 -0
- autogen/io/websockets.py +214 -0
- autogen/json_utils.py +42 -0
- autogen/llm_clients/MIGRATION_TO_V2.md +782 -0
- autogen/llm_clients/__init__.py +77 -0
- autogen/llm_clients/client_v2.py +122 -0
- autogen/llm_clients/models/__init__.py +55 -0
- autogen/llm_clients/models/content_blocks.py +389 -0
- autogen/llm_clients/models/unified_message.py +145 -0
- autogen/llm_clients/models/unified_response.py +83 -0
- autogen/llm_clients/openai_completions_client.py +444 -0
- autogen/llm_config/__init__.py +11 -0
- autogen/llm_config/client.py +59 -0
- autogen/llm_config/config.py +461 -0
- autogen/llm_config/entry.py +169 -0
- autogen/llm_config/types.py +37 -0
- autogen/llm_config/utils.py +223 -0
- autogen/logger/__init__.py +11 -0
- autogen/logger/base_logger.py +129 -0
- autogen/logger/file_logger.py +262 -0
- autogen/logger/logger_factory.py +42 -0
- autogen/logger/logger_utils.py +57 -0
- autogen/logger/sqlite_logger.py +524 -0
- autogen/math_utils.py +338 -0
- autogen/mcp/__init__.py +7 -0
- autogen/mcp/__main__.py +78 -0
- autogen/mcp/helpers.py +45 -0
- autogen/mcp/mcp_client.py +349 -0
- autogen/mcp/mcp_proxy/__init__.py +19 -0
- autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +62 -0
- autogen/mcp/mcp_proxy/mcp_proxy.py +577 -0
- autogen/mcp/mcp_proxy/operation_grouping.py +166 -0
- autogen/mcp/mcp_proxy/operation_renaming.py +110 -0
- autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
- autogen/mcp/mcp_proxy/security.py +399 -0
- autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -0
- autogen/messages/__init__.py +7 -0
- autogen/messages/agent_messages.py +946 -0
- autogen/messages/base_message.py +108 -0
- autogen/messages/client_messages.py +172 -0
- autogen/messages/print_message.py +48 -0
- autogen/oai/__init__.py +61 -0
- autogen/oai/anthropic.py +1516 -0
- autogen/oai/bedrock.py +800 -0
- autogen/oai/cerebras.py +302 -0
- autogen/oai/client.py +1658 -0
- autogen/oai/client_utils.py +196 -0
- autogen/oai/cohere.py +494 -0
- autogen/oai/gemini.py +1045 -0
- autogen/oai/gemini_types.py +156 -0
- autogen/oai/groq.py +319 -0
- autogen/oai/mistral.py +311 -0
- autogen/oai/oai_models/__init__.py +23 -0
- autogen/oai/oai_models/_models.py +16 -0
- autogen/oai/oai_models/chat_completion.py +86 -0
- autogen/oai/oai_models/chat_completion_audio.py +32 -0
- autogen/oai/oai_models/chat_completion_message.py +97 -0
- autogen/oai/oai_models/chat_completion_message_tool_call.py +60 -0
- autogen/oai/oai_models/chat_completion_token_logprob.py +62 -0
- autogen/oai/oai_models/completion_usage.py +59 -0
- autogen/oai/ollama.py +657 -0
- autogen/oai/openai_responses.py +451 -0
- autogen/oai/openai_utils.py +897 -0
- autogen/oai/together.py +387 -0
- autogen/remote/__init__.py +18 -0
- autogen/remote/agent.py +199 -0
- autogen/remote/agent_service.py +197 -0
- autogen/remote/errors.py +17 -0
- autogen/remote/httpx_client_factory.py +131 -0
- autogen/remote/protocol.py +37 -0
- autogen/remote/retry.py +102 -0
- autogen/remote/runtime.py +96 -0
- autogen/retrieve_utils.py +490 -0
- autogen/runtime_logging.py +161 -0
- autogen/testing/__init__.py +12 -0
- autogen/testing/messages.py +45 -0
- autogen/testing/test_agent.py +111 -0
- autogen/token_count_utils.py +280 -0
- autogen/tools/__init__.py +20 -0
- autogen/tools/contrib/__init__.py +9 -0
- autogen/tools/contrib/time/__init__.py +7 -0
- autogen/tools/contrib/time/time.py +40 -0
- autogen/tools/dependency_injection.py +249 -0
- autogen/tools/experimental/__init__.py +54 -0
- autogen/tools/experimental/browser_use/__init__.py +7 -0
- autogen/tools/experimental/browser_use/browser_use.py +154 -0
- autogen/tools/experimental/code_execution/__init__.py +7 -0
- autogen/tools/experimental/code_execution/python_code_execution.py +86 -0
- autogen/tools/experimental/crawl4ai/__init__.py +7 -0
- autogen/tools/experimental/crawl4ai/crawl4ai.py +150 -0
- autogen/tools/experimental/deep_research/__init__.py +7 -0
- autogen/tools/experimental/deep_research/deep_research.py +329 -0
- autogen/tools/experimental/duckduckgo/__init__.py +7 -0
- autogen/tools/experimental/duckduckgo/duckduckgo_search.py +103 -0
- autogen/tools/experimental/firecrawl/__init__.py +7 -0
- autogen/tools/experimental/firecrawl/firecrawl_tool.py +836 -0
- autogen/tools/experimental/google/__init__.py +14 -0
- autogen/tools/experimental/google/authentication/__init__.py +11 -0
- autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
- autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
- autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
- autogen/tools/experimental/google/drive/__init__.py +9 -0
- autogen/tools/experimental/google/drive/drive_functions.py +124 -0
- autogen/tools/experimental/google/drive/toolkit.py +88 -0
- autogen/tools/experimental/google/model.py +17 -0
- autogen/tools/experimental/google/toolkit_protocol.py +19 -0
- autogen/tools/experimental/google_search/__init__.py +8 -0
- autogen/tools/experimental/google_search/google_search.py +93 -0
- autogen/tools/experimental/google_search/youtube_search.py +181 -0
- autogen/tools/experimental/messageplatform/__init__.py +17 -0
- autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/discord/discord.py +284 -0
- autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/slack/slack.py +385 -0
- autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/telegram/telegram.py +271 -0
- autogen/tools/experimental/perplexity/__init__.py +7 -0
- autogen/tools/experimental/perplexity/perplexity_search.py +249 -0
- autogen/tools/experimental/reliable/__init__.py +10 -0
- autogen/tools/experimental/reliable/reliable.py +1311 -0
- autogen/tools/experimental/searxng/__init__.py +7 -0
- autogen/tools/experimental/searxng/searxng_search.py +142 -0
- autogen/tools/experimental/tavily/__init__.py +7 -0
- autogen/tools/experimental/tavily/tavily_search.py +176 -0
- autogen/tools/experimental/web_search_preview/__init__.py +7 -0
- autogen/tools/experimental/web_search_preview/web_search_preview.py +120 -0
- autogen/tools/experimental/wikipedia/__init__.py +7 -0
- autogen/tools/experimental/wikipedia/wikipedia.py +284 -0
- autogen/tools/function_utils.py +412 -0
- autogen/tools/tool.py +188 -0
- autogen/tools/toolkit.py +86 -0
- autogen/types.py +29 -0
- autogen/version.py +7 -0
- templates/client_template/main.jinja2 +72 -0
- templates/config_template/config.jinja2 +7 -0
- templates/main.jinja2 +61 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
from collections.abc import Sequence
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel
|
|
12
|
+
|
|
13
|
+
from ....doc_utils import export_module
|
|
14
|
+
from ....import_utils import optional_import_block, require_optional_import
|
|
15
|
+
|
|
16
|
+
with optional_import_block():
|
|
17
|
+
import chromadb
|
|
18
|
+
from chromadb.api.models.Collection import Collection
|
|
19
|
+
from chromadb.api.types import EmbeddingFunction
|
|
20
|
+
from chromadb.utils.embedding_functions import DefaultEmbeddingFunction
|
|
21
|
+
from llama_index.core import SimpleDirectoryReader, StorageContext, VectorStoreIndex
|
|
22
|
+
from llama_index.core.llms import LLM
|
|
23
|
+
from llama_index.core.query_engine import CitationQueryEngine
|
|
24
|
+
from llama_index.core.schema import Document as LlamaDocument
|
|
25
|
+
from llama_index.core.schema import NodeWithScore
|
|
26
|
+
from llama_index.llms.openai import OpenAI
|
|
27
|
+
from llama_index.vector_stores.chroma import ChromaVectorStore
|
|
28
|
+
|
|
29
|
+
__all__ = ["VectorChromaCitationQueryEngine", "VectorChromaQueryEngine"]
|
|
30
|
+
|
|
31
|
+
DEFAULT_COLLECTION_NAME = "docling-parsed-docs"
|
|
32
|
+
EMPTY_RESPONSE_TEXT = "Empty Response" # Indicates that the query did not return any results
|
|
33
|
+
EMPTY_RESPONSE_REPLY = "Sorry, I couldn't find any information on that. If you haven't ingested any documents, please try that." # Default response for queries without results
|
|
34
|
+
|
|
35
|
+
# Set up logging
|
|
36
|
+
logging.basicConfig(level=logging.INFO)
|
|
37
|
+
logging.getLogger("httpx").setLevel(logging.WARNING)
|
|
38
|
+
logger = logging.getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@require_optional_import(["chromadb", "llama_index"], "rag")
|
|
42
|
+
@export_module("autogen.agents.experimental")
|
|
43
|
+
class VectorChromaQueryEngine:
|
|
44
|
+
"""This engine leverages Chromadb to persist document embeddings in a named collection
|
|
45
|
+
and LlamaIndex's VectorStoreIndex to efficiently index and retrieve documents, and generate an answer in response
|
|
46
|
+
to natural language queries. The Chromadb collection serves as the storage layer, while
|
|
47
|
+
the collection name uniquely identifies the set of documents within the persistent database.
|
|
48
|
+
|
|
49
|
+
This implements the autogen.agentchat.contrib.rag.RAGQueryEngine protocol.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__( # type: ignore[no-any-unimported]
|
|
53
|
+
self,
|
|
54
|
+
db_path: str | None = None,
|
|
55
|
+
embedding_function: "EmbeddingFunction[Any] | None" = None,
|
|
56
|
+
metadata: dict[str, Any] | None = None,
|
|
57
|
+
llm: Optional["LLM"] = None,
|
|
58
|
+
collection_name: str | None = None,
|
|
59
|
+
) -> None:
|
|
60
|
+
"""Initializes the VectorChromaQueryEngine with db_path, metadata, and embedding function and llm.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
db_path: The file system path where Chromadb will store its persistent data.
|
|
64
|
+
If not specified, the default directory "./chroma" is used.
|
|
65
|
+
embedding_function: A callable that converts text into vector embeddings. Default embedding uses Sentence Transformers model all-MiniLM-L6-v2.
|
|
66
|
+
For more embeddings that ChromaDB support, please refer to [embeddings](https://docs.trychroma.com/docs/embeddings/embedding-functions)
|
|
67
|
+
metadata: A dictionary containing configuration parameters for the Chromadb collection.
|
|
68
|
+
This metadata is typically used to configure the HNSW indexing algorithm.
|
|
69
|
+
For more details about the default metadata, please refer to [HNSW configuration](https://cookbook.chromadb.dev/core/configuration/#hnsw-configuration)
|
|
70
|
+
llm: LLM model used by LlamaIndex for query processing.
|
|
71
|
+
You can find more supported LLMs at [LLM](https://docs.llamaindex.ai/en/stable/module_guides/models/llms/)
|
|
72
|
+
collection_name (str): The unique name for the Chromadb collection. If omitted, a constant name will be used. Populate this to reuse previous ingested data.
|
|
73
|
+
"""
|
|
74
|
+
self.llm: LLM = llm or OpenAI(model="gpt-4o", temperature=0.0) # type: ignore[no-any-unimported]
|
|
75
|
+
self.embedding_function: EmbeddingFunction[Any] = embedding_function or DefaultEmbeddingFunction() # type: ignore[no-any-unimported,assignment]
|
|
76
|
+
self.metadata: dict[str, Any] = metadata or {
|
|
77
|
+
"hnsw:space": "ip",
|
|
78
|
+
"hnsw:construction_ef": 30,
|
|
79
|
+
"hnsw:M": 32,
|
|
80
|
+
}
|
|
81
|
+
self.client = chromadb.PersistentClient(path=db_path or "./chroma")
|
|
82
|
+
self.collection_name: str | None = collection_name
|
|
83
|
+
|
|
84
|
+
self.connect_db()
|
|
85
|
+
|
|
86
|
+
def connect_db(self, *args: Any, **kwargs: Any) -> bool:
|
|
87
|
+
"""Establish a connection to the Chromadb database and initialize the collection."""
|
|
88
|
+
self.collection_name = self.collection_name or DEFAULT_COLLECTION_NAME
|
|
89
|
+
|
|
90
|
+
if self._collection_exists(self.collection_name):
|
|
91
|
+
logger.info(f"Using existing collection {self.collection_name} from the database.")
|
|
92
|
+
else:
|
|
93
|
+
logger.info(f"Creating new collection {self.collection_name} in the database.")
|
|
94
|
+
|
|
95
|
+
self.collection = self.client.create_collection(
|
|
96
|
+
name=self.collection_name,
|
|
97
|
+
embedding_function=self.embedding_function,
|
|
98
|
+
metadata=self.metadata,
|
|
99
|
+
get_or_create=True, # If collection already exists, get the collection
|
|
100
|
+
)
|
|
101
|
+
self.index = self._create_index(self.collection)
|
|
102
|
+
|
|
103
|
+
return True
|
|
104
|
+
|
|
105
|
+
def query(self, question: str) -> str:
|
|
106
|
+
"""Retrieve information from indexed documents by processing a natural language query.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
question: A natural language query string used to search the indexed documents.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
A string containing the response generated by LLM.
|
|
113
|
+
"""
|
|
114
|
+
self.validate_query_index()
|
|
115
|
+
self.query_engine = self.index.as_query_engine(llm=self.llm)
|
|
116
|
+
response = self.query_engine.query(question)
|
|
117
|
+
|
|
118
|
+
if str(response) == EMPTY_RESPONSE_TEXT:
|
|
119
|
+
return EMPTY_RESPONSE_REPLY
|
|
120
|
+
|
|
121
|
+
return str(response)
|
|
122
|
+
|
|
123
|
+
def add_docs(
|
|
124
|
+
self,
|
|
125
|
+
new_doc_dir: Path | str | None = None,
|
|
126
|
+
new_doc_paths_or_urls: Sequence[Path | str] | None = None,
|
|
127
|
+
) -> None:
|
|
128
|
+
"""Add additional documents to the existing vector index.
|
|
129
|
+
|
|
130
|
+
Loads new Docling-parsed Markdown files from a specified directory or a list of file paths
|
|
131
|
+
and inserts them into the current index for future queries.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
new_doc_dir: The directory path from which to load additional documents.
|
|
135
|
+
If provided, all eligible files in this directory are loaded.
|
|
136
|
+
new_doc_paths_or_urls: A list of file paths specifying additional documents to load.
|
|
137
|
+
Each file should be a Docling-parsed Markdown file.
|
|
138
|
+
"""
|
|
139
|
+
self.validate_query_index()
|
|
140
|
+
new_doc_dir = new_doc_dir or ""
|
|
141
|
+
new_doc_paths = new_doc_paths_or_urls or []
|
|
142
|
+
new_docs = self._load_doc(input_dir=new_doc_dir, input_docs=new_doc_paths)
|
|
143
|
+
for doc in new_docs:
|
|
144
|
+
self.index.insert(doc)
|
|
145
|
+
|
|
146
|
+
def _load_doc( # type: ignore[no-any-unimported]
|
|
147
|
+
self, input_dir: Path | str | None, input_docs: Sequence[Path | str] | None
|
|
148
|
+
) -> list["LlamaDocument"]:
|
|
149
|
+
"""Load documents from a directory and/or a list of file paths.
|
|
150
|
+
|
|
151
|
+
This helper method reads Docling-parsed Markdown files using LlamaIndex's
|
|
152
|
+
SimpleDirectoryReader. It supports multiple file [formats]((https://docs.llamaindex.ai/en/stable/module_guides/loading/simpledirectoryreader/#supported-file-types)),
|
|
153
|
+
but the intended use is for documents processed by Docling.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
input_dir (Optional[Union[Path, str]]): The directory containing documents to be loaded.
|
|
157
|
+
If provided, all files in the directory will be considered.
|
|
158
|
+
input_docs (Optional[list[Union[Path, str]]]): A list of individual file paths to load.
|
|
159
|
+
Each path must point to an existing file.
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
A list of documents loaded as LlamaDocument objects.
|
|
163
|
+
|
|
164
|
+
Raises:
|
|
165
|
+
ValueError: If the specified directory does not exist.
|
|
166
|
+
ValueError: If any provided file path does not exist.
|
|
167
|
+
ValueError: If neither input_dir nor input_docs is provided.
|
|
168
|
+
"""
|
|
169
|
+
loaded_documents = []
|
|
170
|
+
if input_dir:
|
|
171
|
+
logger.info(f"Loading docs from directory: {input_dir}")
|
|
172
|
+
if not os.path.exists(input_dir):
|
|
173
|
+
raise ValueError(f"Input directory not found: {input_dir}")
|
|
174
|
+
loaded_documents.extend(SimpleDirectoryReader(input_dir=input_dir).load_data())
|
|
175
|
+
|
|
176
|
+
if input_docs:
|
|
177
|
+
for doc in input_docs:
|
|
178
|
+
logger.info(f"Loading input doc: {doc}")
|
|
179
|
+
if not os.path.exists(doc):
|
|
180
|
+
raise ValueError(f"Document file not found: {doc}")
|
|
181
|
+
loaded_documents.extend(SimpleDirectoryReader(input_files=list(input_docs)).load_data())
|
|
182
|
+
|
|
183
|
+
if not input_dir and not input_docs:
|
|
184
|
+
raise ValueError("No input directory or docs provided!")
|
|
185
|
+
|
|
186
|
+
return loaded_documents
|
|
187
|
+
|
|
188
|
+
def _create_index( # type: ignore[no-any-unimported]
|
|
189
|
+
self, collection: "Collection"
|
|
190
|
+
) -> "VectorStoreIndex":
|
|
191
|
+
"""Build a vector index for document retrieval using a Chromadb collection.
|
|
192
|
+
|
|
193
|
+
Wraps the provided Chromadb collection into a vector store and uses LlamaIndex's
|
|
194
|
+
StorageContext to create a VectorStoreIndex from the collection.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
collection (Collection): A Chromadb Collection object that stores the embeddings of the documents.
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
A VectorStoreIndex object built from the provided collection.
|
|
201
|
+
"""
|
|
202
|
+
self.vector_store = ChromaVectorStore(chroma_collection=collection)
|
|
203
|
+
self.storage_context = StorageContext.from_defaults(vector_store=self.vector_store)
|
|
204
|
+
|
|
205
|
+
index = VectorStoreIndex.from_vector_store(vector_store=self.vector_store, storage_context=self.storage_context)
|
|
206
|
+
|
|
207
|
+
return index
|
|
208
|
+
|
|
209
|
+
def _collection_exists(self, collection_name: str) -> bool:
|
|
210
|
+
"""Check if a collection with the given name exists in the database.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
collection_name (str): The name of the collection to check.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
True if a collection with the given name exists in the database, False otherwise.
|
|
217
|
+
"""
|
|
218
|
+
existing_collections = self.client.list_collections()
|
|
219
|
+
return any(col == collection_name for col in existing_collections)
|
|
220
|
+
|
|
221
|
+
def get_collection_name(self) -> str:
|
|
222
|
+
"""Get the name of the collection used by the query engine.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
The name of the collection.
|
|
226
|
+
"""
|
|
227
|
+
if self.collection_name:
|
|
228
|
+
return self.collection_name
|
|
229
|
+
else:
|
|
230
|
+
raise ValueError("Collection name not set.")
|
|
231
|
+
|
|
232
|
+
def validate_query_index(self) -> None:
|
|
233
|
+
"""Ensures an index exists"""
|
|
234
|
+
if not hasattr(self, "index"):
|
|
235
|
+
raise Exception("Query index is not initialized. Please ingest some documents before querying.")
|
|
236
|
+
|
|
237
|
+
def init_db(
|
|
238
|
+
self,
|
|
239
|
+
new_doc_dir: Path | str | None = None,
|
|
240
|
+
new_doc_paths_or_urls: Sequence[Path | str] | None = None,
|
|
241
|
+
*args: Any,
|
|
242
|
+
**kwargs: Any,
|
|
243
|
+
) -> bool:
|
|
244
|
+
"""Not required nor implemented for VectorChromaQueryEngine"""
|
|
245
|
+
raise NotImplementedError("Method, init_db, not required nor implemented for VectorChromaQueryEngine")
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
class AnswerWithCitations(BaseModel): # type: ignore[no-any-unimported]
|
|
249
|
+
answer: str
|
|
250
|
+
citations: list["NodeWithScore"] # type: ignore[no-any-unimported]
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
@require_optional_import(["chromadb", "llama_index"], "rag")
|
|
254
|
+
@export_module("autogen.agents.experimental")
|
|
255
|
+
class VectorChromaCitationQueryEngine(VectorChromaQueryEngine):
|
|
256
|
+
"""This engine leverages VectorChromaQueryEngine and CitationQueryEngine to answer queries with citations."""
|
|
257
|
+
|
|
258
|
+
def __init__( # type: ignore[no-any-unimported]
|
|
259
|
+
self,
|
|
260
|
+
db_path: str | None = None,
|
|
261
|
+
embedding_function: "EmbeddingFunction[Any] | None" = None,
|
|
262
|
+
metadata: dict[str, Any] | None = None,
|
|
263
|
+
llm: Optional["LLM"] = None,
|
|
264
|
+
collection_name: str | None = None,
|
|
265
|
+
enable_query_citations: bool = False,
|
|
266
|
+
citation_chunk_size: int = 512,
|
|
267
|
+
) -> None:
|
|
268
|
+
"""See parent class VectorChromaQueryEngine."""
|
|
269
|
+
super().__init__(db_path, embedding_function, metadata, llm, collection_name)
|
|
270
|
+
self.enable_query_citations = enable_query_citations
|
|
271
|
+
self.citation_chunk_size = citation_chunk_size
|
|
272
|
+
|
|
273
|
+
def query_with_citations(self, query: str) -> AnswerWithCitations:
|
|
274
|
+
"""Query the index with the given query and return the answer along with citations.
|
|
275
|
+
|
|
276
|
+
Args:
|
|
277
|
+
query (str): The query to be answered.
|
|
278
|
+
citation_chunk_size (int): The size of chunks to use for each citation. Default is 512.
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
AnswerWithCitations: An object containing the answer and citations.
|
|
282
|
+
"""
|
|
283
|
+
query_engine = CitationQueryEngine.from_args(
|
|
284
|
+
index=self.index,
|
|
285
|
+
citation_chunk_size=self.citation_chunk_size,
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
response = query_engine.query(query)
|
|
289
|
+
|
|
290
|
+
if hasattr(response, "response"):
|
|
291
|
+
return AnswerWithCitations(answer=response.response, citations=response.source_nodes)
|
|
292
|
+
else:
|
|
293
|
+
raise ValueError(f"Query response of type '{type(response)}' does not contain a response attribute.")
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
# mypy will fail if ChromaDBQueryEngine does not implement RAGQueryEngine protocol
|
|
297
|
+
if TYPE_CHECKING:
|
|
298
|
+
from ....agentchat.contrib.rag.query_engine import RAGQueryEngine
|
|
299
|
+
|
|
300
|
+
def _check_implement_protocol(o: VectorChromaQueryEngine) -> RAGQueryEngine:
|
|
301
|
+
return o
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Literal
|
|
8
|
+
|
|
9
|
+
from .... import ConversableAgent
|
|
10
|
+
from ....agentchat.contrib.rag.query_engine import RAGQueryEngine
|
|
11
|
+
from ....agentchat.group.context_variables import ContextVariables
|
|
12
|
+
from ....agentchat.group.reply_result import ReplyResult
|
|
13
|
+
from ....agentchat.group.targets.transition_target import AgentNameTarget
|
|
14
|
+
from ....doc_utils import export_module
|
|
15
|
+
from ....llm_config import LLMConfig
|
|
16
|
+
from ..document_agent.parser_utils import docling_parse_docs
|
|
17
|
+
from .chroma_query_engine import VectorChromaQueryEngine
|
|
18
|
+
from .document_utils import preprocess_path
|
|
19
|
+
|
|
20
|
+
__all__ = ["DoclingDocIngestAgent"]
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
DOCLING_PARSE_TOOL_NAME = "docling_parse_docs"
|
|
25
|
+
|
|
26
|
+
DEFAULT_DOCLING_PARSER_PROMPT = f"""
|
|
27
|
+
You are an expert in parsing and understanding text. You can use {DOCLING_PARSE_TOOL_NAME} tool to parse various documents and extract information from them. You can only use the tool once per turn.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@export_module("autogen.agents.experimental")
|
|
32
|
+
class DoclingDocIngestAgent(ConversableAgent):
|
|
33
|
+
"""A DoclingDocIngestAgent is a swarm agent that ingests documents using the docling_parse_docs tool."""
|
|
34
|
+
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
name: str | None = None,
|
|
38
|
+
llm_config: LLMConfig | dict | Literal[False] | None = None, # type: ignore[type-arg]
|
|
39
|
+
parsed_docs_path: Path | str | None = None,
|
|
40
|
+
query_engine: RAGQueryEngine | None = None,
|
|
41
|
+
return_agent_success: str = "TaskManagerAgent",
|
|
42
|
+
return_agent_error: str = "ErrorManagerAgent",
|
|
43
|
+
collection_name: str | None = None,
|
|
44
|
+
):
|
|
45
|
+
"""Initialize the DoclingDocIngestAgent.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
name: The name of the DoclingDocIngestAgent.
|
|
49
|
+
llm_config: The configuration for the LLM.
|
|
50
|
+
parsed_docs_path: The path where parsed documents will be stored.
|
|
51
|
+
query_engine: The VectorChromaQueryEngine to use for querying documents.
|
|
52
|
+
return_agent_success: The agent to return on successful completion of the task.
|
|
53
|
+
return_agent_error: The agent to return on error.
|
|
54
|
+
collection_name: The unique name for the Chromadb collection. Set this to a value to reuse a collection. If a query_engine is provided, this will be ignored.
|
|
55
|
+
"""
|
|
56
|
+
name = name or "DoclingDocIngestAgent"
|
|
57
|
+
|
|
58
|
+
parsed_docs_path = parsed_docs_path or Path("./parsed_docs")
|
|
59
|
+
parsed_docs_path = preprocess_path(str_or_path=parsed_docs_path, mk_path=True)
|
|
60
|
+
|
|
61
|
+
self._query_engine = query_engine or VectorChromaQueryEngine(collection_name=collection_name)
|
|
62
|
+
|
|
63
|
+
def data_ingest_task(context_variables: ContextVariables) -> ReplyResult:
|
|
64
|
+
"""A tool for Swarm agent to ingests documents using the docling_parse_docs to parse documents to markdown
|
|
65
|
+
and add them to the docling_query_engine.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
context_variables (ContextVariables): The context variables for the task.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
ReplyResult: The result of the task.
|
|
72
|
+
"""
|
|
73
|
+
try:
|
|
74
|
+
input_file_path = ""
|
|
75
|
+
tasks = context_variables.get("DocumentsToIngest", [])
|
|
76
|
+
while tasks:
|
|
77
|
+
task = tasks.pop()
|
|
78
|
+
input_file_path = task.path_or_url
|
|
79
|
+
output_files = docling_parse_docs(
|
|
80
|
+
input_file_path=input_file_path, output_dir_path=parsed_docs_path, output_formats=["markdown"]
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
# Limit to one output markdown file for now.
|
|
84
|
+
if output_files:
|
|
85
|
+
output_file = output_files[0]
|
|
86
|
+
if output_file.suffix == ".md":
|
|
87
|
+
self._query_engine.add_docs(new_doc_paths_or_urls=[output_file])
|
|
88
|
+
|
|
89
|
+
# Keep track of documents ingested
|
|
90
|
+
context_variables["DocumentsIngested"].append(input_file_path)
|
|
91
|
+
|
|
92
|
+
context_variables["CompletedTaskCount"] += 1
|
|
93
|
+
logger.info(f"data_ingest_task context_variables: {context_variables.to_dict()}")
|
|
94
|
+
|
|
95
|
+
except Exception as e:
|
|
96
|
+
return ReplyResult(
|
|
97
|
+
target=AgentNameTarget(agent_name=return_agent_error),
|
|
98
|
+
message=f"Data Ingestion Task Failed, Error {e}: '{input_file_path}'",
|
|
99
|
+
context_variables=context_variables,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
return ReplyResult(
|
|
103
|
+
target=AgentNameTarget(agent_name=return_agent_success),
|
|
104
|
+
message=f"Data Ingestion Task Completed for {input_file_path}",
|
|
105
|
+
context_variables=context_variables,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
super().__init__(
|
|
109
|
+
name=name,
|
|
110
|
+
llm_config=llm_config,
|
|
111
|
+
functions=[data_ingest_task],
|
|
112
|
+
system_message=DEFAULT_DOCLING_PARSER_PROMPT,
|
|
113
|
+
)
|