ag2 0.9.1a1__py3-none-any.whl → 0.9.1.post0__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.
Potentially problematic release.
This version of ag2 might be problematic. Click here for more details.
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info}/METADATA +264 -73
- ag2-0.9.1.post0.dist-info/RECORD +392 -0
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info}/WHEEL +1 -2
- autogen/__init__.py +89 -0
- autogen/_website/__init__.py +3 -0
- autogen/_website/generate_api_references.py +427 -0
- autogen/_website/generate_mkdocs.py +1174 -0
- autogen/_website/notebook_processor.py +476 -0
- autogen/_website/process_notebooks.py +656 -0
- autogen/_website/utils.py +412 -0
- autogen/agentchat/__init__.py +44 -0
- autogen/agentchat/agent.py +182 -0
- autogen/agentchat/assistant_agent.py +85 -0
- autogen/agentchat/chat.py +309 -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 +429 -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 +566 -0
- autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
- autogen/agentchat/contrib/capabilities/vision_capability.py +214 -0
- autogen/agentchat/contrib/captainagent/__init__.py +9 -0
- autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
- autogen/agentchat/contrib/captainagent/captainagent.py +512 -0
- autogen/agentchat/contrib/captainagent/tool_retriever.py +335 -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 +170 -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 +268 -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 +187 -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 +324 -0
- autogen/agentchat/contrib/rag/__init__.py +10 -0
- autogen/agentchat/contrib/rag/chromadb_query_engine.py +272 -0
- autogen/agentchat/contrib/rag/llamaindex_query_engine.py +198 -0
- autogen/agentchat/contrib/rag/mongodb_query_engine.py +329 -0
- autogen/agentchat/contrib/rag/query_engine.py +74 -0
- autogen/agentchat/contrib/retrieve_assistant_agent.py +56 -0
- autogen/agentchat/contrib/retrieve_user_proxy_agent.py +703 -0
- autogen/agentchat/contrib/society_of_mind_agent.py +199 -0
- autogen/agentchat/contrib/swarm_agent.py +1425 -0
- autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
- autogen/agentchat/contrib/vectordb/__init__.py +5 -0
- autogen/agentchat/contrib/vectordb/base.py +232 -0
- autogen/agentchat/contrib/vectordb/chromadb.py +315 -0
- autogen/agentchat/contrib/vectordb/couchbase.py +407 -0
- autogen/agentchat/contrib/vectordb/mongodb.py +550 -0
- autogen/agentchat/contrib/vectordb/pgvectordb.py +928 -0
- autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
- autogen/agentchat/contrib/vectordb/utils.py +126 -0
- autogen/agentchat/contrib/web_surfer.py +303 -0
- autogen/agentchat/conversable_agent.py +4020 -0
- autogen/agentchat/group/__init__.py +64 -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 +41 -0
- autogen/agentchat/group/context_variables.py +192 -0
- autogen/agentchat/group/group_tool_executor.py +202 -0
- autogen/agentchat/group/group_utils.py +591 -0
- autogen/agentchat/group/handoffs.py +244 -0
- autogen/agentchat/group/llm_condition.py +93 -0
- autogen/agentchat/group/multi_agent_chat.py +237 -0
- autogen/agentchat/group/on_condition.py +58 -0
- autogen/agentchat/group/on_context_condition.py +54 -0
- autogen/agentchat/group/patterns/__init__.py +18 -0
- autogen/agentchat/group/patterns/auto.py +159 -0
- autogen/agentchat/group/patterns/manual.py +176 -0
- autogen/agentchat/group/patterns/pattern.py +288 -0
- autogen/agentchat/group/patterns/random.py +106 -0
- autogen/agentchat/group/patterns/round_robin.py +117 -0
- autogen/agentchat/group/reply_result.py +26 -0
- autogen/agentchat/group/speaker_selection_result.py +41 -0
- autogen/agentchat/group/targets/__init__.py +4 -0
- autogen/agentchat/group/targets/group_chat_target.py +132 -0
- autogen/agentchat/group/targets/group_manager_target.py +151 -0
- autogen/agentchat/group/targets/transition_target.py +413 -0
- autogen/agentchat/group/targets/transition_utils.py +6 -0
- autogen/agentchat/groupchat.py +1694 -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 +190 -0
- autogen/agentchat/realtime/experimental/function_observer.py +85 -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 +475 -0
- autogen/agentchat/realtime/experimental/websockets.py +21 -0
- autogen/agentchat/realtime_agent/__init__.py +21 -0
- autogen/agentchat/user_proxy_agent.py +111 -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 +73 -0
- autogen/agents/contrib/time/time_tool_agent.py +51 -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 +316 -0
- autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +118 -0
- autogen/agents/experimental/document_agent/document_agent.py +461 -0
- autogen/agents/experimental/document_agent/document_conditions.py +50 -0
- autogen/agents/experimental/document_agent/document_utils.py +380 -0
- autogen/agents/experimental/document_agent/inmemory_query_engine.py +220 -0
- autogen/agents/experimental/document_agent/parser_utils.py +130 -0
- autogen/agents/experimental/document_agent/url_utils.py +426 -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 +77 -0
- autogen/agents/experimental/websurfer/__init__.py +7 -0
- autogen/agents/experimental/websurfer/websurfer.py +62 -0
- autogen/agents/experimental/wikipedia/__init__.py +7 -0
- autogen/agents/experimental/wikipedia/wikipedia.py +90 -0
- autogen/browser_utils.py +309 -0
- autogen/cache/__init__.py +10 -0
- autogen/cache/abstract_cache_base.py +75 -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 +102 -0
- autogen/cache/in_memory_cache.py +58 -0
- autogen/cache/redis_cache.py +123 -0
- autogen/code_utils.py +596 -0
- autogen/coding/__init__.py +22 -0
- autogen/coding/base.py +119 -0
- autogen/coding/docker_commandline_code_executor.py +268 -0
- autogen/coding/factory.py +47 -0
- autogen/coding/func_with_reqs.py +202 -0
- autogen/coding/jupyter/__init__.py +23 -0
- autogen/coding/jupyter/base.py +36 -0
- autogen/coding/jupyter/docker_jupyter_server.py +167 -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 +231 -0
- autogen/coding/jupyter/jupyter_code_executor.py +160 -0
- autogen/coding/jupyter/local_jupyter_server.py +172 -0
- autogen/coding/local_commandline_code_executor.py +405 -0
- autogen/coding/markdown_code_extractor.py +45 -0
- autogen/coding/utils.py +56 -0
- autogen/doc_utils.py +34 -0
- autogen/events/__init__.py +7 -0
- autogen/events/agent_events.py +1010 -0
- autogen/events/base_event.py +99 -0
- autogen/events/client_events.py +167 -0
- autogen/events/helpers.py +36 -0
- autogen/events/print_event.py +46 -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 +80 -0
- autogen/fast_depends/core/__init__.py +14 -0
- autogen/fast_depends/core/build.py +225 -0
- autogen/fast_depends/core/model.py +576 -0
- autogen/fast_depends/dependencies/__init__.py +15 -0
- autogen/fast_depends/dependencies/model.py +29 -0
- autogen/fast_depends/dependencies/provider.py +39 -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 +280 -0
- autogen/fast_depends/utils.py +187 -0
- autogen/formatting_utils.py +83 -0
- autogen/function_utils.py +13 -0
- autogen/graph_utils.py +178 -0
- autogen/import_utils.py +526 -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 +155 -0
- autogen/interop/langchain/langchain_tool.py +82 -0
- autogen/interop/litellm/__init__.py +7 -0
- autogen/interop/litellm/litellm_config_factory.py +113 -0
- autogen/interop/pydantic_ai/__init__.py +7 -0
- autogen/interop/pydantic_ai/pydantic_ai.py +168 -0
- autogen/interop/registry.py +69 -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 +56 -0
- autogen/io/run_response.py +293 -0
- autogen/io/thread_io_stream.py +63 -0
- autogen/io/websockets.py +213 -0
- autogen/json_utils.py +43 -0
- autogen/llm_config.py +379 -0
- autogen/logger/__init__.py +11 -0
- autogen/logger/base_logger.py +128 -0
- autogen/logger/file_logger.py +261 -0
- autogen/logger/logger_factory.py +42 -0
- autogen/logger/logger_utils.py +57 -0
- autogen/logger/sqlite_logger.py +523 -0
- autogen/math_utils.py +339 -0
- autogen/mcp/__init__.py +7 -0
- autogen/mcp/mcp_client.py +208 -0
- autogen/messages/__init__.py +7 -0
- autogen/messages/agent_messages.py +948 -0
- autogen/messages/base_message.py +107 -0
- autogen/messages/client_messages.py +171 -0
- autogen/messages/print_message.py +49 -0
- autogen/oai/__init__.py +53 -0
- autogen/oai/anthropic.py +714 -0
- autogen/oai/bedrock.py +628 -0
- autogen/oai/cerebras.py +299 -0
- autogen/oai/client.py +1435 -0
- autogen/oai/client_utils.py +169 -0
- autogen/oai/cohere.py +479 -0
- autogen/oai/gemini.py +990 -0
- autogen/oai/gemini_types.py +129 -0
- autogen/oai/groq.py +305 -0
- autogen/oai/mistral.py +303 -0
- autogen/oai/oai_models/__init__.py +11 -0
- autogen/oai/oai_models/_models.py +16 -0
- autogen/oai/oai_models/chat_completion.py +87 -0
- autogen/oai/oai_models/chat_completion_audio.py +32 -0
- autogen/oai/oai_models/chat_completion_message.py +86 -0
- autogen/oai/oai_models/chat_completion_message_tool_call.py +37 -0
- autogen/oai/oai_models/chat_completion_token_logprob.py +63 -0
- autogen/oai/oai_models/completion_usage.py +60 -0
- autogen/oai/ollama.py +643 -0
- autogen/oai/openai_utils.py +881 -0
- autogen/oai/together.py +370 -0
- autogen/retrieve_utils.py +491 -0
- autogen/runtime_logging.py +160 -0
- autogen/token_count_utils.py +267 -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 +41 -0
- autogen/tools/dependency_injection.py +254 -0
- autogen/tools/experimental/__init__.py +43 -0
- autogen/tools/experimental/browser_use/__init__.py +7 -0
- autogen/tools/experimental/browser_use/browser_use.py +161 -0
- autogen/tools/experimental/crawl4ai/__init__.py +7 -0
- autogen/tools/experimental/crawl4ai/crawl4ai.py +153 -0
- autogen/tools/experimental/deep_research/__init__.py +7 -0
- autogen/tools/experimental/deep_research/deep_research.py +328 -0
- autogen/tools/experimental/duckduckgo/__init__.py +7 -0
- autogen/tools/experimental/duckduckgo/duckduckgo_search.py +109 -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 +288 -0
- autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/slack/slack.py +391 -0
- autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/telegram/telegram.py +275 -0
- autogen/tools/experimental/perplexity/__init__.py +7 -0
- autogen/tools/experimental/perplexity/perplexity_search.py +260 -0
- autogen/tools/experimental/tavily/__init__.py +7 -0
- autogen/tools/experimental/tavily/tavily_search.py +183 -0
- autogen/tools/experimental/web_search_preview/__init__.py +7 -0
- autogen/tools/experimental/web_search_preview/web_search_preview.py +114 -0
- autogen/tools/experimental/wikipedia/__init__.py +7 -0
- autogen/tools/experimental/wikipedia/wikipedia.py +287 -0
- autogen/tools/function_utils.py +411 -0
- autogen/tools/tool.py +187 -0
- autogen/tools/toolkit.py +86 -0
- autogen/types.py +29 -0
- autogen/version.py +7 -0
- ag2-0.9.1a1.dist-info/RECORD +0 -6
- ag2-0.9.1a1.dist-info/top_level.txt +0 -1
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
|
@@ -0,0 +1,83 @@
|
|
|
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
|
+
from typing import Any, Optional, Union
|
|
6
|
+
|
|
7
|
+
from .... import Agent, ConversableAgent, UserProxyAgent
|
|
8
|
+
from .graph_query_engine import GraphStoreQueryResult
|
|
9
|
+
from .graph_rag_capability import GraphRagCapability
|
|
10
|
+
from .neo4j_graph_query_engine import Neo4jGraphQueryEngine
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Neo4jGraphCapability(GraphRagCapability):
|
|
14
|
+
"""The Neo4j graph capability integrates Neo4j Property graph into a graph rag agent.
|
|
15
|
+
Ref: https://neo4j.com/labs/genai-ecosystem/llamaindex/#_property_graph_constructing_modules
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
For usage, please refer to example notebook/agentchat_graph_rag_neo4j.ipynb
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, query_engine: Neo4jGraphQueryEngine):
|
|
22
|
+
"""Initialize GraphRAG capability with a graph query engine"""
|
|
23
|
+
self.query_engine = query_engine
|
|
24
|
+
|
|
25
|
+
def add_to_agent(self, agent: ConversableAgent) -> None:
|
|
26
|
+
"""Add Neo4j GraphRAG capability to a UserProxyAgent.
|
|
27
|
+
The restriction to a UserProxyAgent to make sure the returned message only contains information retrieved from the graph DB instead of any LLMs.
|
|
28
|
+
"""
|
|
29
|
+
if not isinstance(agent, UserProxyAgent):
|
|
30
|
+
raise Exception("Neo4j GraphRAG capability can only be added to a UserProxyAgent.")
|
|
31
|
+
|
|
32
|
+
self.graph_rag_agent = agent
|
|
33
|
+
|
|
34
|
+
# Validate the agent config
|
|
35
|
+
if agent.llm_config not in (None, False):
|
|
36
|
+
raise Exception(
|
|
37
|
+
"Agents with GraphRAG capabilities do not use an LLM configuration. Please set your llm_config to None or False."
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
# Register method to generate the reply using a Neo4j query
|
|
41
|
+
# All other reply methods will be removed
|
|
42
|
+
agent.register_reply(
|
|
43
|
+
[ConversableAgent, None], self._reply_using_neo4j_query, position=0, remove_other_reply_funcs=True
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
def _reply_using_neo4j_query(
|
|
47
|
+
self,
|
|
48
|
+
recipient: ConversableAgent,
|
|
49
|
+
messages: Optional[list[dict[str, Any]]] = None,
|
|
50
|
+
sender: Optional[Agent] = None,
|
|
51
|
+
config: Optional[Any] = None,
|
|
52
|
+
) -> tuple[bool, Optional[Union[str, dict[str, Any]]]]:
|
|
53
|
+
"""Query neo4j and return the message. Internally, it queries the Property graph
|
|
54
|
+
and returns the answer from the graph query engine.
|
|
55
|
+
TODO: reply with a dictionary including both the answer and semantic source triplets.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
recipient: The agent instance that will receive the message.
|
|
59
|
+
messages: A list of messages in the conversation history with the sender.
|
|
60
|
+
sender: The agent instance that sent the message.
|
|
61
|
+
config: Optional configuration for message processing.
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
A tuple containing a boolean indicating success and the assistant's reply.
|
|
65
|
+
"""
|
|
66
|
+
if not messages:
|
|
67
|
+
return False, None
|
|
68
|
+
|
|
69
|
+
question = self._get_last_question(messages[-1])
|
|
70
|
+
if not question:
|
|
71
|
+
return False, None
|
|
72
|
+
|
|
73
|
+
result: GraphStoreQueryResult = self.query_engine.query(question) # type: ignore[arg-type]
|
|
74
|
+
|
|
75
|
+
return True, result.answer
|
|
76
|
+
|
|
77
|
+
def _get_last_question(self, message: Union[dict[str, Any], str]) -> Optional[Union[str, dict[str, Any]]]:
|
|
78
|
+
"""Retrieves the last message from the conversation history."""
|
|
79
|
+
if isinstance(message, str):
|
|
80
|
+
return message
|
|
81
|
+
if isinstance(message, dict) and "content" in message:
|
|
82
|
+
return message["content"] # type: ignore[no-any-return]
|
|
83
|
+
return None
|
|
@@ -0,0 +1,210 @@
|
|
|
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 asyncio
|
|
6
|
+
import logging
|
|
7
|
+
from typing import List, Optional, Union
|
|
8
|
+
|
|
9
|
+
from ....import_utils import optional_import_block, require_optional_import
|
|
10
|
+
from .document import Document, DocumentType
|
|
11
|
+
from .graph_query_engine import GraphStoreQueryResult
|
|
12
|
+
|
|
13
|
+
with optional_import_block():
|
|
14
|
+
from neo4j import GraphDatabase
|
|
15
|
+
from neo4j_graphrag.embeddings import Embedder, OpenAIEmbeddings
|
|
16
|
+
from neo4j_graphrag.experimental.pipeline.kg_builder import SimpleKGPipeline
|
|
17
|
+
from neo4j_graphrag.generation import GraphRAG
|
|
18
|
+
from neo4j_graphrag.indexes import create_vector_index
|
|
19
|
+
from neo4j_graphrag.llm.openai_llm import LLMInterface, OpenAILLM
|
|
20
|
+
from neo4j_graphrag.retrievers import VectorRetriever
|
|
21
|
+
|
|
22
|
+
# Set up logging
|
|
23
|
+
logging.basicConfig(level=logging.INFO)
|
|
24
|
+
logging.getLogger("httpx").setLevel(logging.WARNING)
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@require_optional_import(["neo4j", "neo4j_graphrag"], "neo4j")
|
|
29
|
+
class Neo4jNativeGraphQueryEngine:
|
|
30
|
+
"""A graph query engine implemented using the Neo4j GraphRAG SDK.
|
|
31
|
+
Provides functionality to initialize a knowledge graph,
|
|
32
|
+
create a vector index, and query the graph using Neo4j and LLM.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __init__( # type: ignore[no-any-unimported]
|
|
36
|
+
self,
|
|
37
|
+
host: str = "neo4j://localhost",
|
|
38
|
+
port: int = 7687,
|
|
39
|
+
username: str = "neo4j",
|
|
40
|
+
password: str = "password",
|
|
41
|
+
embeddings: Optional["Embedder"] = None,
|
|
42
|
+
embedding_dimension: Optional[int] = 3072,
|
|
43
|
+
llm: Optional["LLMInterface"] = None,
|
|
44
|
+
query_llm: Optional["LLMInterface"] = None,
|
|
45
|
+
entities: Optional[List[str]] = None,
|
|
46
|
+
relations: Optional[List[str]] = None,
|
|
47
|
+
potential_schema: Optional[List[tuple[str, str, str]]] = None,
|
|
48
|
+
):
|
|
49
|
+
"""Initialize a Neo4j graph query engine.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
host (str): Neo4j host URL.
|
|
53
|
+
port (int): Neo4j port.
|
|
54
|
+
username (str): Neo4j username.
|
|
55
|
+
password (str): Neo4j password.
|
|
56
|
+
embeddings (Embedder): Embedding model to embed chunk data and retrieve answers.
|
|
57
|
+
embedding_dimension (int): Dimension of the embeddings for the model.
|
|
58
|
+
llm (LLMInterface): Language model for creating the knowledge graph (returns JSON responses).
|
|
59
|
+
query_llm (LLMInterface): Language model for querying the knowledge graph.
|
|
60
|
+
entities (List[str], optional): Custom entities for guiding graph construction.
|
|
61
|
+
relations (List[str], optional): Custom relations for guiding graph construction.
|
|
62
|
+
potential_schema (List[tuple[str, str, str]], optional): Schema (triplets, i.e., [entity] -> [relationship] -> [entity]) to guide graph construction.
|
|
63
|
+
"""
|
|
64
|
+
self.uri = f"{host}:{port}"
|
|
65
|
+
self.driver = GraphDatabase.driver(self.uri, auth=(username, password))
|
|
66
|
+
self.embeddings = embeddings or OpenAIEmbeddings(model="text-embedding-3-large")
|
|
67
|
+
self.embedding_dimension = embedding_dimension
|
|
68
|
+
self.llm = llm or OpenAILLM(
|
|
69
|
+
model_name="gpt-4o",
|
|
70
|
+
model_params={"response_format": {"type": "json_object"}, "temperature": 0},
|
|
71
|
+
)
|
|
72
|
+
self.query_llm = query_llm or OpenAILLM(model_name="gpt-4o", model_params={"temperature": 0})
|
|
73
|
+
self.entities = entities
|
|
74
|
+
self.relations = relations
|
|
75
|
+
self.potential_schema = potential_schema
|
|
76
|
+
|
|
77
|
+
def init_db(self, input_doc: Optional[Union[list[Document]]] = None) -> None:
|
|
78
|
+
"""Initialize the Neo4j graph database using the provided input doc.
|
|
79
|
+
Currently this method only supports single document input (only reads the first doc).
|
|
80
|
+
|
|
81
|
+
This method supports both text and PDF documents. It performs the following steps:
|
|
82
|
+
1. Clears the existing database.
|
|
83
|
+
2. Extracts graph nodes and relationships from the input data to build a knowledge graph.
|
|
84
|
+
3. Creates a vector index for efficient retrieval.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
input_doc (list[Document]): Input documents for building the graph.
|
|
88
|
+
|
|
89
|
+
Raises:
|
|
90
|
+
ValueError: If the input document is not provided or its type is unsupported.
|
|
91
|
+
"""
|
|
92
|
+
if input_doc is None or len(input_doc) == 0:
|
|
93
|
+
raise ValueError("Input document is required to initialize the database.")
|
|
94
|
+
elif len(input_doc) > 1:
|
|
95
|
+
raise ValueError("Only the first document will be used to initialize the database.")
|
|
96
|
+
|
|
97
|
+
logger.info("Clearing the database...")
|
|
98
|
+
self._clear_db()
|
|
99
|
+
|
|
100
|
+
self._initialize_kg_builders()
|
|
101
|
+
|
|
102
|
+
self._build_graph(input_doc)
|
|
103
|
+
|
|
104
|
+
self.index_name = "vector-index-name"
|
|
105
|
+
logger.info(f"Creating vector index '{self.index_name}'...")
|
|
106
|
+
self._create_index(self.index_name)
|
|
107
|
+
|
|
108
|
+
def add_records(self, new_records: list[Document]) -> bool:
|
|
109
|
+
"""Add new records to the Neo4j database.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
new_records (list[Document]): List of new Documents to be added
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
bool: True if records were added successfully, False otherwise.
|
|
116
|
+
"""
|
|
117
|
+
for record in new_records:
|
|
118
|
+
if not isinstance(record, Document):
|
|
119
|
+
raise ValueError("Invalid record type. Expected Document.")
|
|
120
|
+
|
|
121
|
+
self._build_graph(new_records)
|
|
122
|
+
|
|
123
|
+
return True
|
|
124
|
+
|
|
125
|
+
def query(self, question: str) -> GraphStoreQueryResult:
|
|
126
|
+
"""Query the Neo4j database using a natural language question.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
question (str): The question to be answered by querying the graph.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
GraphStoreQueryResult: The result of the query.
|
|
133
|
+
"""
|
|
134
|
+
self.retriever = VectorRetriever(
|
|
135
|
+
driver=self.driver,
|
|
136
|
+
index_name=self.index_name,
|
|
137
|
+
embedder=self.embeddings,
|
|
138
|
+
)
|
|
139
|
+
rag = GraphRAG(retriever=self.retriever, llm=self.query_llm)
|
|
140
|
+
result = rag.search(query_text=question, retriever_config={"top_k": 5})
|
|
141
|
+
|
|
142
|
+
return GraphStoreQueryResult(answer=result.answer)
|
|
143
|
+
|
|
144
|
+
def _create_index(self, name: str) -> None:
|
|
145
|
+
"""Create a vector index for the Neo4j knowledge graph.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
name (str): Name of the vector index to create.
|
|
149
|
+
"""
|
|
150
|
+
logger.info(f"Creating vector index '{name}'...")
|
|
151
|
+
create_vector_index(
|
|
152
|
+
self.driver,
|
|
153
|
+
name=name,
|
|
154
|
+
label="Chunk",
|
|
155
|
+
embedding_property="embedding",
|
|
156
|
+
dimensions=self.embedding_dimension,
|
|
157
|
+
similarity_fn="euclidean",
|
|
158
|
+
)
|
|
159
|
+
logger.info(f"Vector index '{name}' created successfully.")
|
|
160
|
+
|
|
161
|
+
def _clear_db(self) -> None:
|
|
162
|
+
"""Clear all nodes and relationships from the Neo4j database."""
|
|
163
|
+
logger.info("Clearing all nodes and relationships in the database...")
|
|
164
|
+
self.driver.execute_query("MATCH (n) DETACH DELETE n;")
|
|
165
|
+
logger.info("Database cleared successfully.")
|
|
166
|
+
|
|
167
|
+
def _initialize_kg_builders(self) -> None:
|
|
168
|
+
"""Initialize the knowledge graph builders"""
|
|
169
|
+
logger.info("Initializing the knowledge graph builders...")
|
|
170
|
+
self.text_kg_builder = SimpleKGPipeline(
|
|
171
|
+
driver=self.driver,
|
|
172
|
+
embedder=self.embeddings,
|
|
173
|
+
llm=self.llm,
|
|
174
|
+
entities=self.entities,
|
|
175
|
+
relations=self.relations,
|
|
176
|
+
potential_schema=self.potential_schema,
|
|
177
|
+
on_error="IGNORE",
|
|
178
|
+
from_pdf=False,
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
self.pdf_kg_builder = SimpleKGPipeline(
|
|
182
|
+
driver=self.driver,
|
|
183
|
+
embedder=self.embeddings,
|
|
184
|
+
llm=self.llm,
|
|
185
|
+
entities=self.entities,
|
|
186
|
+
relations=self.relations,
|
|
187
|
+
potential_schema=self.potential_schema,
|
|
188
|
+
on_error="IGNORE",
|
|
189
|
+
from_pdf=True,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
def _build_graph(self, input_doc: List[Document]) -> None:
|
|
193
|
+
"""Build the knowledge graph using the provided input documents.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
input_doc (List[Document]): List of input documents for building the graph.
|
|
197
|
+
"""
|
|
198
|
+
logger.info("Building the knowledge graph...")
|
|
199
|
+
for doc in input_doc:
|
|
200
|
+
if doc.doctype == DocumentType.TEXT:
|
|
201
|
+
# todo: we assume this is a path, and not URL
|
|
202
|
+
with open(doc.path_or_url) as file: # type: ignore[arg-type]
|
|
203
|
+
text = file.read()
|
|
204
|
+
asyncio.run(self.text_kg_builder.run_async(text=text))
|
|
205
|
+
elif doc.doctype == DocumentType.PDF:
|
|
206
|
+
asyncio.run(self.pdf_kg_builder.run_async(file_path=doc.path_or_url))
|
|
207
|
+
else:
|
|
208
|
+
raise ValueError(f"Unsupported document type: {doc.doctype}")
|
|
209
|
+
|
|
210
|
+
logger.info("Knowledge graph built successfully.")
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
from typing import Any, Optional, Union
|
|
6
|
+
|
|
7
|
+
from .... import Agent, ConversableAgent
|
|
8
|
+
from .graph_query_engine import GraphStoreQueryResult
|
|
9
|
+
from .graph_rag_capability import GraphRagCapability
|
|
10
|
+
from .neo4j_native_graph_query_engine import Neo4jNativeGraphQueryEngine
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Neo4jNativeGraphCapability(GraphRagCapability):
|
|
14
|
+
"""The Neo4j native graph capability integrates Neo4j native query engine into a graph rag agent.
|
|
15
|
+
|
|
16
|
+
For usage, please refer to example notebook/agentchat_graph_rag_neo4j_native.ipynb
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self, query_engine: Neo4jNativeGraphQueryEngine):
|
|
20
|
+
"""Initialize GraphRAG capability with a neo4j native graph query engine"""
|
|
21
|
+
self.query_engine = query_engine
|
|
22
|
+
|
|
23
|
+
def add_to_agent(self, agent: ConversableAgent) -> None:
|
|
24
|
+
"""Add native Neo4j GraphRAG capability to a ConversableAgent.
|
|
25
|
+
llm_config of the agent must be None/False (default) to make sure the returned message only contains information retrieved from the graph DB instead of any LLMs.
|
|
26
|
+
"""
|
|
27
|
+
self.graph_rag_agent = agent
|
|
28
|
+
|
|
29
|
+
# Validate the agent config
|
|
30
|
+
if agent.llm_config not in (None, False):
|
|
31
|
+
raise Exception(
|
|
32
|
+
"Agents with GraphRAG capabilities do not use an LLM configuration. Please set your llm_config to None or False."
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
# Register method to generate the reply using a Neo4j query
|
|
36
|
+
# All other reply methods will be removed
|
|
37
|
+
agent.register_reply(
|
|
38
|
+
[ConversableAgent, None], self._reply_using_native_neo4j_query, position=0, remove_other_reply_funcs=True
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
def _reply_using_native_neo4j_query(
|
|
42
|
+
self,
|
|
43
|
+
recipient: ConversableAgent,
|
|
44
|
+
messages: Optional[list[dict[str, Any]]] = None,
|
|
45
|
+
sender: Optional[Agent] = None,
|
|
46
|
+
config: Optional[Any] = None,
|
|
47
|
+
) -> tuple[bool, Optional[Union[str, dict[str, Any]]]]:
|
|
48
|
+
"""Query Neo4j and return the message. Internally, it uses the Neo4jNativeGraphQueryEngine to query the graph.
|
|
49
|
+
|
|
50
|
+
The agent's system message will be incorporated into the query, if it's not blank.
|
|
51
|
+
|
|
52
|
+
If no results are found, a default message is returned: "I'm sorry, I don't have an answer for that."
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
recipient: The agent instance that will receive the message.
|
|
56
|
+
messages: A list of messages in the conversation history with the sender.
|
|
57
|
+
sender: The agent instance that sent the message.
|
|
58
|
+
config: Optional configuration for message processing.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
A tuple containing a boolean indicating success and the assistant's reply.
|
|
62
|
+
"""
|
|
63
|
+
# todo: fix typing, this is not correct
|
|
64
|
+
question = self._messages_summary(messages, recipient.system_message) # type: ignore[arg-type]
|
|
65
|
+
result: GraphStoreQueryResult = self.query_engine.query(question)
|
|
66
|
+
|
|
67
|
+
return True, result.answer if result.answer else "I'm sorry, I don't have an answer for that."
|
|
68
|
+
|
|
69
|
+
def _messages_summary(self, messages: Union[dict[str, Any], str], system_message: str) -> str:
|
|
70
|
+
"""Summarize the messages in the conversation history. Excluding any message with 'tool_calls' and 'tool_responses'
|
|
71
|
+
Includes the 'name' (if it exists) and the 'content', with a new line between each one, like:
|
|
72
|
+
customer:
|
|
73
|
+
<content>
|
|
74
|
+
|
|
75
|
+
agent:
|
|
76
|
+
<content>
|
|
77
|
+
"""
|
|
78
|
+
if isinstance(messages, str):
|
|
79
|
+
return (f"IMPORTANT: {system_message}\n" if system_message else "") + f"Context:\n\n{messages}"
|
|
80
|
+
|
|
81
|
+
elif isinstance(messages, list):
|
|
82
|
+
summary = ""
|
|
83
|
+
for message in messages:
|
|
84
|
+
if "content" in message and "tool_calls" not in message and "tool_responses" not in message:
|
|
85
|
+
summary += f"{message.get('name', '')}: {message.get('content', '')}\n\n"
|
|
86
|
+
|
|
87
|
+
if system_message:
|
|
88
|
+
summary = f"IMPORTANT: {system_message}\nContext:\n\n{summary}"
|
|
89
|
+
|
|
90
|
+
return summary
|
|
91
|
+
|
|
92
|
+
else:
|
|
93
|
+
raise ValueError("Invalid messages format. Must be a list of messages or a string.")
|