ag2 0.9.1__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.1.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.1.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.1.dist-info/RECORD +0 -6
- ag2-0.9.1.dist-info/top_level.txt +0 -1
- {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
- {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
|
@@ -0,0 +1,192 @@
|
|
|
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, Generator, Iterable, Optional
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
__all__ = ["ContextVariables"]
|
|
10
|
+
|
|
11
|
+
# Parameter name for context variables
|
|
12
|
+
# Use the value in functions and they will be substituted with the context variables:
|
|
13
|
+
# e.g. def my_function(context_variables: ContextVariables, my_other_parameters: Any) -> Any:
|
|
14
|
+
__CONTEXT_VARIABLES_PARAM_NAME__ = "context_variables"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ContextVariables(BaseModel):
|
|
18
|
+
"""
|
|
19
|
+
Stores and manages context variables for agentic workflows.
|
|
20
|
+
|
|
21
|
+
Utilises a dictionary-like interface for setting, getting, and removing variables.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
# Internal storage for context variables
|
|
25
|
+
data: dict[str, Any] = Field(default_factory=dict)
|
|
26
|
+
|
|
27
|
+
def __init__(self, data: Optional[dict[str, Any]] = None, **kwargs: Any) -> None:
|
|
28
|
+
"""Initialize with data dictionary as an optional positional parameter.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
data: Initial dictionary of context variables (optional)
|
|
32
|
+
kwargs: Additional keyword arguments for the parent class
|
|
33
|
+
"""
|
|
34
|
+
init_data = data or {}
|
|
35
|
+
super().__init__(data=init_data, **kwargs)
|
|
36
|
+
|
|
37
|
+
def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]:
|
|
38
|
+
"""
|
|
39
|
+
Get a value from the context by key.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
key: The key to retrieve
|
|
43
|
+
default: The default value to return if key is not found
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
The value associated with the key or default if not found
|
|
47
|
+
"""
|
|
48
|
+
return self.data.get(key, default)
|
|
49
|
+
|
|
50
|
+
def set(self, key: str, value: Any) -> None:
|
|
51
|
+
"""
|
|
52
|
+
Set a value in the context by key.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
key: The key to set
|
|
56
|
+
value: The value to store
|
|
57
|
+
"""
|
|
58
|
+
self.data[key] = value
|
|
59
|
+
|
|
60
|
+
def remove(self, key: str) -> bool:
|
|
61
|
+
"""
|
|
62
|
+
Remove a key from the context.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
key: The key to remove
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
True if the key was removed, False if it didn't exist
|
|
69
|
+
"""
|
|
70
|
+
if key in self.data:
|
|
71
|
+
del self.data[key]
|
|
72
|
+
return True
|
|
73
|
+
return False
|
|
74
|
+
|
|
75
|
+
def keys(self) -> Iterable[str]:
|
|
76
|
+
"""
|
|
77
|
+
Get all keys in the context.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
An iterable of all keys
|
|
81
|
+
"""
|
|
82
|
+
return self.data.keys()
|
|
83
|
+
|
|
84
|
+
def values(self) -> Iterable[Any]:
|
|
85
|
+
"""
|
|
86
|
+
Get all values in the context.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
An iterable of all values
|
|
90
|
+
"""
|
|
91
|
+
return self.data.values()
|
|
92
|
+
|
|
93
|
+
def items(self) -> Iterable[tuple[str, Any]]:
|
|
94
|
+
"""
|
|
95
|
+
Get all key-value pairs in the context.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
An iterable of all key-value pairs
|
|
99
|
+
"""
|
|
100
|
+
return self.data.items()
|
|
101
|
+
|
|
102
|
+
def clear(self) -> None:
|
|
103
|
+
"""Clear all keys and values from the context."""
|
|
104
|
+
self.data.clear()
|
|
105
|
+
|
|
106
|
+
def contains(self, key: str) -> bool:
|
|
107
|
+
"""
|
|
108
|
+
Check if a key exists in the context.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
key: The key to check
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
True if the key exists, False otherwise
|
|
115
|
+
"""
|
|
116
|
+
return key in self.data
|
|
117
|
+
|
|
118
|
+
def update(self, other: dict[str, Any]) -> None:
|
|
119
|
+
"""
|
|
120
|
+
Update context with key-value pairs from another dictionary.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
other: Dictionary containing key-value pairs to add
|
|
124
|
+
"""
|
|
125
|
+
self.data.update(other)
|
|
126
|
+
|
|
127
|
+
def to_dict(self) -> dict[str, Any]:
|
|
128
|
+
"""
|
|
129
|
+
Convert context variables to a dictionary.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
Dictionary representation of all context variables
|
|
133
|
+
"""
|
|
134
|
+
return self.data.copy()
|
|
135
|
+
|
|
136
|
+
# Dictionary-compatible interface
|
|
137
|
+
def __getitem__(self, key: str) -> Any:
|
|
138
|
+
"""Get a value using dictionary syntax: context[key]"""
|
|
139
|
+
try:
|
|
140
|
+
return self.data[key]
|
|
141
|
+
except KeyError:
|
|
142
|
+
raise KeyError(f"Context variable '{key}' not found")
|
|
143
|
+
|
|
144
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
145
|
+
"""Set a value using dictionary syntax: context[key] = value"""
|
|
146
|
+
self.data[key] = value
|
|
147
|
+
|
|
148
|
+
def __delitem__(self, key: str) -> None:
|
|
149
|
+
"""Delete a key using dictionary syntax: del context[key]"""
|
|
150
|
+
try:
|
|
151
|
+
del self.data[key]
|
|
152
|
+
except KeyError:
|
|
153
|
+
raise KeyError(f"Cannot delete non-existent context variable '{key}'")
|
|
154
|
+
|
|
155
|
+
def __contains__(self, key: str) -> bool:
|
|
156
|
+
"""Check if key exists using 'in' operator: key in context"""
|
|
157
|
+
return key in self.data
|
|
158
|
+
|
|
159
|
+
def __len__(self) -> int:
|
|
160
|
+
"""Get the number of items: len(context)"""
|
|
161
|
+
return len(self.data)
|
|
162
|
+
|
|
163
|
+
def __iter__(self) -> Generator[tuple[str, Any], None, None]:
|
|
164
|
+
"""Iterate over keys: for key in context"""
|
|
165
|
+
for key in self.data:
|
|
166
|
+
yield (key, self.data[key])
|
|
167
|
+
|
|
168
|
+
def __str__(self) -> str:
|
|
169
|
+
"""String representation of context variables."""
|
|
170
|
+
return f"ContextVariables({self.data})"
|
|
171
|
+
|
|
172
|
+
def __repr__(self) -> str:
|
|
173
|
+
"""Detailed representation of context variables."""
|
|
174
|
+
return f"ContextVariables(data={self.data!r})"
|
|
175
|
+
|
|
176
|
+
# Utility methods
|
|
177
|
+
@classmethod
|
|
178
|
+
def from_dict(cls, data: dict[str, Any]) -> "ContextVariables":
|
|
179
|
+
"""
|
|
180
|
+
Create a new ContextVariables instance from a dictionary.
|
|
181
|
+
|
|
182
|
+
E.g.:
|
|
183
|
+
my_context = {"user_id": "12345", "settings": {"theme": "dark"}}
|
|
184
|
+
context = ContextVariables.from_dict(my_context)
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
data: Dictionary of key-value pairs
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
New ContextVariables instance
|
|
191
|
+
"""
|
|
192
|
+
return cls(data=data)
|
|
@@ -0,0 +1,202 @@
|
|
|
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 inspect
|
|
6
|
+
from copy import deepcopy
|
|
7
|
+
from typing import Annotated, Any, Callable, Optional
|
|
8
|
+
|
|
9
|
+
from ...oai import OpenAIWrapper
|
|
10
|
+
from ...tools import Depends, Tool
|
|
11
|
+
from ...tools.dependency_injection import inject_params, on
|
|
12
|
+
from ..agent import Agent
|
|
13
|
+
from ..conversable_agent import ConversableAgent
|
|
14
|
+
from .context_variables import __CONTEXT_VARIABLES_PARAM_NAME__, ContextVariables
|
|
15
|
+
from .reply_result import ReplyResult
|
|
16
|
+
from .targets.transition_target import TransitionTarget
|
|
17
|
+
|
|
18
|
+
__TOOL_EXECUTOR_NAME__ = "_Group_Tool_Executor"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class GroupToolExecutor(ConversableAgent):
|
|
22
|
+
"""Tool executor for the group chat initiated with initiate_group_chat"""
|
|
23
|
+
|
|
24
|
+
def __init__(self) -> None:
|
|
25
|
+
super().__init__(
|
|
26
|
+
name=__TOOL_EXECUTOR_NAME__,
|
|
27
|
+
system_message="Tool Execution, do not use this agent directly.",
|
|
28
|
+
human_input_mode="NEVER",
|
|
29
|
+
code_execution_config=False,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Store the next target from a tool call
|
|
33
|
+
self._group_next_target: Optional[TransitionTarget] = None
|
|
34
|
+
|
|
35
|
+
# Primary tool reply function for handling the tool reply and the ReplyResult and TransitionTarget returns
|
|
36
|
+
self.register_reply([Agent, None], self._generate_group_tool_reply, remove_other_reply_funcs=True)
|
|
37
|
+
|
|
38
|
+
def set_next_target(self, next_target: TransitionTarget) -> None:
|
|
39
|
+
"""Sets the next target to transition to, used in the determine_next_agent function."""
|
|
40
|
+
self._group_next_target = next_target
|
|
41
|
+
|
|
42
|
+
def get_next_target(self) -> TransitionTarget:
|
|
43
|
+
"""Gets the next target to transition to."""
|
|
44
|
+
"""Returns the next target to transition to, if it exists."""
|
|
45
|
+
if self._group_next_target is None:
|
|
46
|
+
raise ValueError(
|
|
47
|
+
"No next target set. Please set a next target before calling this method. Use has_next_target() to check if a next target exists."
|
|
48
|
+
)
|
|
49
|
+
return self._group_next_target
|
|
50
|
+
|
|
51
|
+
def has_next_target(self) -> bool:
|
|
52
|
+
"""Checks if there is a next target to transition to."""
|
|
53
|
+
return self._group_next_target is not None
|
|
54
|
+
|
|
55
|
+
def clear_next_target(self) -> None:
|
|
56
|
+
"""Clears the next target to transition to."""
|
|
57
|
+
self._group_next_target = None
|
|
58
|
+
|
|
59
|
+
def _modify_context_variables_param(
|
|
60
|
+
self, f: Callable[..., Any], context_variables: ContextVariables
|
|
61
|
+
) -> Callable[..., Any]:
|
|
62
|
+
"""Modifies the context_variables parameter to use dependency injection and link it to the group context variables.
|
|
63
|
+
|
|
64
|
+
This essentially changes:
|
|
65
|
+
def some_function(some_variable: int, context_variables: ContextVariables) -> str:
|
|
66
|
+
|
|
67
|
+
to:
|
|
68
|
+
|
|
69
|
+
def some_function(some_variable: int, context_variables: Annotated[ContextVariables, Depends(on(self.context_variables))]) -> str:
|
|
70
|
+
"""
|
|
71
|
+
sig = inspect.signature(f)
|
|
72
|
+
|
|
73
|
+
# Check if context_variables parameter exists and update it if so
|
|
74
|
+
if __CONTEXT_VARIABLES_PARAM_NAME__ in sig.parameters:
|
|
75
|
+
new_params = []
|
|
76
|
+
for name, param in sig.parameters.items():
|
|
77
|
+
if name == __CONTEXT_VARIABLES_PARAM_NAME__:
|
|
78
|
+
# Replace with new annotation using Depends
|
|
79
|
+
new_param = param.replace(annotation=Annotated[ContextVariables, Depends(on(context_variables))])
|
|
80
|
+
new_params.append(new_param)
|
|
81
|
+
else:
|
|
82
|
+
new_params.append(param)
|
|
83
|
+
|
|
84
|
+
# Update signature
|
|
85
|
+
new_sig = sig.replace(parameters=new_params)
|
|
86
|
+
f.__signature__ = new_sig # type: ignore[attr-defined]
|
|
87
|
+
|
|
88
|
+
return f
|
|
89
|
+
|
|
90
|
+
def _change_tool_context_variables_to_depends(
|
|
91
|
+
self, agent: ConversableAgent, current_tool: Tool, context_variables: ContextVariables
|
|
92
|
+
) -> None:
|
|
93
|
+
"""Checks for the context_variables parameter in the tool and updates it to use dependency injection."""
|
|
94
|
+
|
|
95
|
+
# If the tool has a context_variables parameter, remove the tool and reregister it without the parameter
|
|
96
|
+
if __CONTEXT_VARIABLES_PARAM_NAME__ in current_tool.tool_schema["function"]["parameters"]["properties"]:
|
|
97
|
+
# We'll replace the tool, so start with getting the underlying function
|
|
98
|
+
tool_func = current_tool._func
|
|
99
|
+
|
|
100
|
+
# Remove the Tool from the agent
|
|
101
|
+
name = current_tool._name
|
|
102
|
+
description = current_tool._description
|
|
103
|
+
agent.remove_tool_for_llm(current_tool)
|
|
104
|
+
|
|
105
|
+
# Recreate the tool without the context_variables parameter
|
|
106
|
+
tool_func = self._modify_context_variables_param(current_tool._func, context_variables)
|
|
107
|
+
tool_func = inject_params(tool_func)
|
|
108
|
+
new_tool = ConversableAgent._create_tool_if_needed(
|
|
109
|
+
func_or_tool=tool_func, name=name, description=description
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
# Re-register with the agent
|
|
113
|
+
agent.register_for_llm()(new_tool)
|
|
114
|
+
|
|
115
|
+
def register_agents_functions(self, agents: list[ConversableAgent], context_variables: ContextVariables) -> None:
|
|
116
|
+
"""Adds the functions of the agents to the group tool executor."""
|
|
117
|
+
for agent in agents:
|
|
118
|
+
# As we're moving towards tools and away from function maps, this may not be used
|
|
119
|
+
self._function_map.update(agent._function_map)
|
|
120
|
+
|
|
121
|
+
# Update any agent tools that have context_variables parameters to use Dependency Injection
|
|
122
|
+
for tool in agent.tools:
|
|
123
|
+
self._change_tool_context_variables_to_depends(agent, tool, context_variables)
|
|
124
|
+
|
|
125
|
+
# Add all tools to the Tool Executor agent
|
|
126
|
+
for tool in agent.tools:
|
|
127
|
+
self.register_for_execution(serialize=False, silent_override=True)(tool)
|
|
128
|
+
|
|
129
|
+
def _generate_group_tool_reply(
|
|
130
|
+
self,
|
|
131
|
+
agent: ConversableAgent,
|
|
132
|
+
messages: Optional[list[dict[str, Any]]] = None,
|
|
133
|
+
sender: Optional[Agent] = None,
|
|
134
|
+
config: Optional[OpenAIWrapper] = None,
|
|
135
|
+
) -> tuple[bool, Optional[dict[str, Any]]]:
|
|
136
|
+
"""Pre-processes and generates tool call replies.
|
|
137
|
+
|
|
138
|
+
This function:
|
|
139
|
+
1. Adds context_variables back to the tool call for the function, if necessary.
|
|
140
|
+
2. Generates the tool calls reply.
|
|
141
|
+
3. Updates context_variables and next_agent based on the tool call response."""
|
|
142
|
+
|
|
143
|
+
if config is None:
|
|
144
|
+
config = agent # type: ignore[assignment]
|
|
145
|
+
if messages is None:
|
|
146
|
+
messages = agent._oai_messages[sender]
|
|
147
|
+
|
|
148
|
+
message = messages[-1]
|
|
149
|
+
if "tool_calls" in message:
|
|
150
|
+
tool_call_count = len(message["tool_calls"])
|
|
151
|
+
|
|
152
|
+
# Loop through tool calls individually (so context can be updated after each function call)
|
|
153
|
+
next_target: Optional[TransitionTarget] = None
|
|
154
|
+
tool_responses_inner = []
|
|
155
|
+
contents = []
|
|
156
|
+
for index in range(tool_call_count):
|
|
157
|
+
message_copy = deepcopy(message)
|
|
158
|
+
|
|
159
|
+
# 1. add context_variables to the tool call arguments
|
|
160
|
+
tool_call = message_copy["tool_calls"][index]
|
|
161
|
+
|
|
162
|
+
# Ensure we are only executing the one tool at a time
|
|
163
|
+
message_copy["tool_calls"] = [tool_call]
|
|
164
|
+
|
|
165
|
+
# 2. generate tool calls reply
|
|
166
|
+
_, tool_message = agent.generate_tool_calls_reply([message_copy])
|
|
167
|
+
|
|
168
|
+
if tool_message is None:
|
|
169
|
+
raise ValueError("Tool call did not return a message")
|
|
170
|
+
|
|
171
|
+
# 3. update context_variables and next_agent, convert content to string
|
|
172
|
+
for tool_response in tool_message["tool_responses"]:
|
|
173
|
+
content = tool_response.get("content")
|
|
174
|
+
|
|
175
|
+
# Tool Call returns that are a target are either a ReplyResult or a TransitionTarget are the next agent
|
|
176
|
+
if isinstance(content, ReplyResult):
|
|
177
|
+
if content.context_variables and content.context_variables.to_dict() != {}:
|
|
178
|
+
agent.context_variables.update(content.context_variables.to_dict())
|
|
179
|
+
if content.target is not None:
|
|
180
|
+
next_target = content.target
|
|
181
|
+
elif isinstance(content, TransitionTarget):
|
|
182
|
+
next_target = content
|
|
183
|
+
|
|
184
|
+
# Serialize the content to a string
|
|
185
|
+
if content is not None:
|
|
186
|
+
tool_response["content"] = str(content)
|
|
187
|
+
|
|
188
|
+
tool_responses_inner.append(tool_response)
|
|
189
|
+
contents.append(str(tool_response["content"]))
|
|
190
|
+
|
|
191
|
+
self._group_next_target = next_target # type: ignore[attr-defined]
|
|
192
|
+
|
|
193
|
+
# Put the tool responses and content strings back into the response message
|
|
194
|
+
# Caters for multiple tool calls
|
|
195
|
+
if tool_message is None:
|
|
196
|
+
raise ValueError("Tool call did not return a message")
|
|
197
|
+
|
|
198
|
+
tool_message["tool_responses"] = tool_responses_inner
|
|
199
|
+
tool_message["content"] = "\n".join(contents)
|
|
200
|
+
|
|
201
|
+
return True, tool_message
|
|
202
|
+
return False, None
|