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,291 @@
|
|
|
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 threading
|
|
7
|
+
from typing import TYPE_CHECKING, Any
|
|
8
|
+
|
|
9
|
+
from ...doc_utils import export_module
|
|
10
|
+
from ...events.agent_events import ErrorEvent, RunCompletionEvent
|
|
11
|
+
from ...io.base import IOStream
|
|
12
|
+
from ...io.run_response import AsyncRunResponse, AsyncRunResponseProtocol, RunResponse, RunResponseProtocol
|
|
13
|
+
from ...io.thread_io_stream import AsyncThreadIOStream, ThreadIOStream
|
|
14
|
+
from ...llm_config import LLMConfig
|
|
15
|
+
from ..chat import ChatResult
|
|
16
|
+
from .context_variables import ContextVariables
|
|
17
|
+
from .group_utils import cleanup_temp_user_messages
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from ..agent import Agent
|
|
21
|
+
from .patterns.pattern import Pattern
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"a_initiate_group_chat",
|
|
25
|
+
"a_run_group_chat",
|
|
26
|
+
"initiate_group_chat",
|
|
27
|
+
"run_group_chat",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@export_module("autogen")
|
|
32
|
+
def initiate_group_chat(
|
|
33
|
+
pattern: "Pattern",
|
|
34
|
+
messages: list[dict[str, Any]] | str,
|
|
35
|
+
max_rounds: int = 20,
|
|
36
|
+
safeguard_policy: dict[str, Any] | str | None = None,
|
|
37
|
+
safeguard_llm_config: LLMConfig | None = None,
|
|
38
|
+
mask_llm_config: LLMConfig | None = None,
|
|
39
|
+
) -> tuple[ChatResult, ContextVariables, "Agent"]:
|
|
40
|
+
"""Initialize and run a group chat using a pattern for configuration.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
pattern: Pattern object that encapsulates the chat configuration.
|
|
44
|
+
messages: Initial message(s).
|
|
45
|
+
max_rounds: Maximum number of conversation rounds.
|
|
46
|
+
safeguard_policy: Optional safeguard policy dict or path to JSON file.
|
|
47
|
+
safeguard_llm_config: Optional LLM configuration for safeguard checks.
|
|
48
|
+
mask_llm_config: Optional LLM configuration for masking.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
ChatResult: Conversations chat history.
|
|
52
|
+
ContextVariables: Updated Context variables.
|
|
53
|
+
"ConversableAgent": Last speaker.
|
|
54
|
+
"""
|
|
55
|
+
# Let the pattern prepare the group chat and all its components
|
|
56
|
+
# Only passing the necessary parameters that aren't already in the pattern
|
|
57
|
+
(
|
|
58
|
+
_, # agents,
|
|
59
|
+
_, # wrapped_agents,
|
|
60
|
+
_, # user_agent,
|
|
61
|
+
context_variables,
|
|
62
|
+
_, # initial_agent,
|
|
63
|
+
_, # group_after_work,
|
|
64
|
+
_, # tool_execution,
|
|
65
|
+
_, # groupchat,
|
|
66
|
+
manager,
|
|
67
|
+
processed_messages,
|
|
68
|
+
last_agent,
|
|
69
|
+
_, # group_agent_names,
|
|
70
|
+
_, # temp_user_list,
|
|
71
|
+
) = pattern.prepare_group_chat(
|
|
72
|
+
max_rounds=max_rounds,
|
|
73
|
+
messages=messages,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Apply safeguards if provided
|
|
77
|
+
if safeguard_policy:
|
|
78
|
+
from .safeguards import apply_safeguard_policy
|
|
79
|
+
|
|
80
|
+
apply_safeguard_policy(
|
|
81
|
+
groupchat_manager=manager,
|
|
82
|
+
policy=safeguard_policy,
|
|
83
|
+
safeguard_llm_config=safeguard_llm_config,
|
|
84
|
+
mask_llm_config=mask_llm_config,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
# Start or resume the conversation
|
|
88
|
+
if len(processed_messages) > 1:
|
|
89
|
+
last_agent, last_message = manager.resume(messages=processed_messages)
|
|
90
|
+
clear_history = False
|
|
91
|
+
else:
|
|
92
|
+
last_message = processed_messages[0]
|
|
93
|
+
clear_history = True
|
|
94
|
+
|
|
95
|
+
if last_agent is None:
|
|
96
|
+
raise ValueError("No agent selected to start the conversation")
|
|
97
|
+
|
|
98
|
+
chat_result = last_agent.initiate_chat(
|
|
99
|
+
manager,
|
|
100
|
+
message=last_message,
|
|
101
|
+
clear_history=clear_history,
|
|
102
|
+
summary_method=pattern.summary_method,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
cleanup_temp_user_messages(chat_result)
|
|
106
|
+
|
|
107
|
+
return chat_result, context_variables, manager.last_speaker
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@export_module("autogen.agentchat")
|
|
111
|
+
async def a_initiate_group_chat(
|
|
112
|
+
pattern: "Pattern",
|
|
113
|
+
messages: list[dict[str, Any]] | str,
|
|
114
|
+
max_rounds: int = 20,
|
|
115
|
+
safeguard_policy: dict[str, Any] | str | None = None,
|
|
116
|
+
safeguard_llm_config: LLMConfig | None = None,
|
|
117
|
+
mask_llm_config: LLMConfig | None = None,
|
|
118
|
+
) -> tuple[ChatResult, ContextVariables, "Agent"]:
|
|
119
|
+
"""Initialize and run a group chat using a pattern for configuration, asynchronously.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
pattern: Pattern object that encapsulates the chat configuration.
|
|
123
|
+
messages: Initial message(s).
|
|
124
|
+
max_rounds: Maximum number of conversation rounds.
|
|
125
|
+
safeguard_policy: Optional safeguard policy dict or path to JSON file.
|
|
126
|
+
safeguard_llm_config: Optional LLM configuration for safeguard checks.
|
|
127
|
+
mask_llm_config: Optional LLM configuration for masking.
|
|
128
|
+
|
|
129
|
+
Returns:
|
|
130
|
+
ChatResult: Conversations chat history.
|
|
131
|
+
ContextVariables: Updated Context variables.
|
|
132
|
+
"ConversableAgent": Last speaker.
|
|
133
|
+
"""
|
|
134
|
+
# Let the pattern prepare the group chat and all its components
|
|
135
|
+
# Only passing the necessary parameters that aren't already in the pattern
|
|
136
|
+
(
|
|
137
|
+
_, # agents,
|
|
138
|
+
_, # wrapped_agents,
|
|
139
|
+
_, # user_agent,
|
|
140
|
+
context_variables,
|
|
141
|
+
_, # initial_agent,
|
|
142
|
+
_, # group_after_work,
|
|
143
|
+
_, # tool_execution,
|
|
144
|
+
_, # groupchat,
|
|
145
|
+
manager,
|
|
146
|
+
processed_messages,
|
|
147
|
+
last_agent,
|
|
148
|
+
_, # group_agent_names,
|
|
149
|
+
_, # temp_user_list,
|
|
150
|
+
) = pattern.prepare_group_chat(
|
|
151
|
+
max_rounds=max_rounds,
|
|
152
|
+
messages=messages,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
# Apply safeguards if provided
|
|
156
|
+
if safeguard_policy:
|
|
157
|
+
from .safeguards import apply_safeguard_policy
|
|
158
|
+
|
|
159
|
+
apply_safeguard_policy(
|
|
160
|
+
groupchat_manager=manager,
|
|
161
|
+
policy=safeguard_policy,
|
|
162
|
+
safeguard_llm_config=safeguard_llm_config,
|
|
163
|
+
mask_llm_config=mask_llm_config,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
# Start or resume the conversation
|
|
167
|
+
if len(processed_messages) > 1:
|
|
168
|
+
last_agent, last_message = await manager.a_resume(messages=processed_messages)
|
|
169
|
+
clear_history = False
|
|
170
|
+
else:
|
|
171
|
+
last_message = processed_messages[0]
|
|
172
|
+
clear_history = True
|
|
173
|
+
|
|
174
|
+
if last_agent is None:
|
|
175
|
+
raise ValueError("No agent selected to start the conversation")
|
|
176
|
+
|
|
177
|
+
chat_result = await last_agent.a_initiate_chat(
|
|
178
|
+
manager,
|
|
179
|
+
message=last_message, # type: ignore[arg-type]
|
|
180
|
+
clear_history=clear_history,
|
|
181
|
+
summary_method=pattern.summary_method,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
cleanup_temp_user_messages(chat_result)
|
|
185
|
+
|
|
186
|
+
return chat_result, context_variables, manager.last_speaker
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@export_module("autogen.agentchat")
|
|
190
|
+
def run_group_chat(
|
|
191
|
+
pattern: "Pattern",
|
|
192
|
+
messages: list[dict[str, Any]] | str,
|
|
193
|
+
max_rounds: int = 20,
|
|
194
|
+
safeguard_policy: dict[str, Any] | str | None = None,
|
|
195
|
+
safeguard_llm_config: LLMConfig | None = None,
|
|
196
|
+
mask_llm_config: LLMConfig | None = None,
|
|
197
|
+
) -> RunResponseProtocol:
|
|
198
|
+
iostream = ThreadIOStream()
|
|
199
|
+
# todo: add agents
|
|
200
|
+
response = RunResponse(iostream, agents=[])
|
|
201
|
+
|
|
202
|
+
def _initiate_group_chat(
|
|
203
|
+
pattern: "Pattern" = pattern,
|
|
204
|
+
messages: list[dict[str, Any]] | str = messages,
|
|
205
|
+
max_rounds: int = max_rounds,
|
|
206
|
+
safeguard_policy: dict[str, Any] | str | None = safeguard_policy,
|
|
207
|
+
safeguard_llm_config: LLMConfig | None = safeguard_llm_config,
|
|
208
|
+
mask_llm_config: LLMConfig | None = mask_llm_config,
|
|
209
|
+
iostream: ThreadIOStream = iostream,
|
|
210
|
+
response: RunResponse = response,
|
|
211
|
+
) -> None:
|
|
212
|
+
with IOStream.set_default(iostream):
|
|
213
|
+
try:
|
|
214
|
+
chat_result, context_vars, agent = initiate_group_chat(
|
|
215
|
+
pattern=pattern,
|
|
216
|
+
messages=messages,
|
|
217
|
+
max_rounds=max_rounds,
|
|
218
|
+
safeguard_policy=safeguard_policy,
|
|
219
|
+
safeguard_llm_config=safeguard_llm_config,
|
|
220
|
+
mask_llm_config=mask_llm_config,
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
IOStream.get_default().send(
|
|
224
|
+
RunCompletionEvent( # type: ignore[call-arg]
|
|
225
|
+
history=chat_result.chat_history,
|
|
226
|
+
summary=chat_result.summary,
|
|
227
|
+
cost=chat_result.cost,
|
|
228
|
+
last_speaker=agent.name,
|
|
229
|
+
context_variables=context_vars,
|
|
230
|
+
)
|
|
231
|
+
)
|
|
232
|
+
except Exception as e:
|
|
233
|
+
response.iostream.send(ErrorEvent(error=e)) # type: ignore[call-arg]
|
|
234
|
+
|
|
235
|
+
threading.Thread(
|
|
236
|
+
target=_initiate_group_chat,
|
|
237
|
+
).start()
|
|
238
|
+
|
|
239
|
+
return response
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
@export_module("autogen.agentchat")
|
|
243
|
+
async def a_run_group_chat(
|
|
244
|
+
pattern: "Pattern",
|
|
245
|
+
messages: list[dict[str, Any]] | str,
|
|
246
|
+
max_rounds: int = 20,
|
|
247
|
+
safeguard_policy: dict[str, Any] | str | None = None,
|
|
248
|
+
safeguard_llm_config: LLMConfig | None = None,
|
|
249
|
+
mask_llm_config: LLMConfig | None = None,
|
|
250
|
+
) -> AsyncRunResponseProtocol:
|
|
251
|
+
iostream = AsyncThreadIOStream()
|
|
252
|
+
# todo: add agents
|
|
253
|
+
response = AsyncRunResponse(iostream, agents=[])
|
|
254
|
+
|
|
255
|
+
async def _initiate_group_chat(
|
|
256
|
+
pattern: "Pattern" = pattern,
|
|
257
|
+
messages: list[dict[str, Any]] | str = messages,
|
|
258
|
+
max_rounds: int = max_rounds,
|
|
259
|
+
safeguard_policy: dict[str, Any] | str | None = safeguard_policy,
|
|
260
|
+
safeguard_llm_config: LLMConfig | None = safeguard_llm_config,
|
|
261
|
+
mask_llm_config: LLMConfig | None = mask_llm_config,
|
|
262
|
+
iostream: AsyncThreadIOStream = iostream,
|
|
263
|
+
response: AsyncRunResponse = response,
|
|
264
|
+
) -> None:
|
|
265
|
+
with IOStream.set_default(iostream):
|
|
266
|
+
try:
|
|
267
|
+
chat_result, context_vars, agent = await a_initiate_group_chat(
|
|
268
|
+
pattern=pattern,
|
|
269
|
+
messages=messages,
|
|
270
|
+
max_rounds=max_rounds,
|
|
271
|
+
safeguard_policy=safeguard_policy,
|
|
272
|
+
safeguard_llm_config=safeguard_llm_config,
|
|
273
|
+
mask_llm_config=mask_llm_config,
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
IOStream.get_default().send(
|
|
277
|
+
RunCompletionEvent( # type: ignore[call-arg]
|
|
278
|
+
history=chat_result.chat_history,
|
|
279
|
+
summary=chat_result.summary,
|
|
280
|
+
cost=chat_result.cost,
|
|
281
|
+
last_speaker=agent.name,
|
|
282
|
+
context_variables=context_vars,
|
|
283
|
+
)
|
|
284
|
+
)
|
|
285
|
+
except Exception as e:
|
|
286
|
+
response.iostream.send(ErrorEvent(error=e)) # type: ignore[call-arg]
|
|
287
|
+
|
|
288
|
+
task = asyncio.create_task(_initiate_group_chat())
|
|
289
|
+
# prevent the task from being garbage collected
|
|
290
|
+
response._task_ref = task # type: ignore[attr-defined]
|
|
291
|
+
return response
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
|
|
8
|
+
from ...doc_utils import export_module
|
|
9
|
+
from .available_condition import AvailableCondition
|
|
10
|
+
from .llm_condition import LLMCondition
|
|
11
|
+
from .targets.transition_target import TransitionTarget
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"OnCondition",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@export_module("autogen")
|
|
19
|
+
class OnCondition(BaseModel): # noqa: N801
|
|
20
|
+
"""Defines a condition for transitioning to another agent or nested chats.\n
|
|
21
|
+
\n
|
|
22
|
+
This is for LLM-based condition evaluation where these conditions are translated into tools and attached to the agent.\n
|
|
23
|
+
\n
|
|
24
|
+
These are evaluated after the OnCondition conditions but before the after work condition.\n
|
|
25
|
+
\n
|
|
26
|
+
Args:\n
|
|
27
|
+
target (TransitionTarget): The transition (essentially an agent) to hand off to.\n
|
|
28
|
+
condition (LLMCondition): The condition for transitioning to the target agent, evaluated by the LLM.\n
|
|
29
|
+
available (AvailableCondition): Optional condition to determine if this OnCondition is included for the LLM to evaluate based on context variables using classes like StringAvailableCondition and ContextExpressionAvailableCondition.\n
|
|
30
|
+
llm_function_name (Optional[str]): The name of the LLM function to use for this condition.\n
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
target: TransitionTarget
|
|
34
|
+
condition: LLMCondition
|
|
35
|
+
available: AvailableCondition | None = None
|
|
36
|
+
llm_function_name: str | None = None
|
|
37
|
+
|
|
38
|
+
def has_target_type(self, target_type: type) -> bool:
|
|
39
|
+
"""Check if the target type matches the specified type.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
target_type (type): The target type to check against, which should be a subclass of TransitionTarget
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
bool: True if the target type matches, False otherwise
|
|
46
|
+
"""
|
|
47
|
+
return isinstance(self.target, target_type)
|
|
48
|
+
|
|
49
|
+
def target_requires_wrapping(self) -> bool:
|
|
50
|
+
"""Check if the target requires wrapping in an agent.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
bool: True if the target requires wrapping, False otherwise
|
|
54
|
+
"""
|
|
55
|
+
return self.target.needs_agent_wrapper()
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
|
|
8
|
+
from .available_condition import AvailableCondition
|
|
9
|
+
from .context_condition import ContextCondition
|
|
10
|
+
from .targets.transition_target import TransitionTarget
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"OnContextCondition",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class OnContextCondition(BaseModel): # noqa: N801
|
|
18
|
+
"""Defines a condition for transitioning to another agent or nested chats using context variables and the ContextExpression class.
|
|
19
|
+
|
|
20
|
+
This is for context variable-based condition evaluation (does not use the agent's LLM).
|
|
21
|
+
|
|
22
|
+
These are evaluated before the OnCondition and after work conditions.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
target (TransitionTarget): The transition (essentially an agent) to hand off to.
|
|
26
|
+
condition (Optional[ContextCondition]): The context variable based condition for transitioning to the target agent. If None, the condition always evaluates to True.
|
|
27
|
+
available (AvailableCondition): Optional condition to determine if this OnCondition is included for the LLM to evaluate based on context variables using classes like StringAvailableCondition and ContextExpressionAvailableCondition.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
target: TransitionTarget
|
|
31
|
+
condition: ContextCondition | None = None
|
|
32
|
+
available: AvailableCondition | None = None
|
|
33
|
+
|
|
34
|
+
def has_target_type(self, target_type: type) -> bool:
|
|
35
|
+
"""Check if the target type matches the specified type.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
target_type (type): The target type to check against. Should be a subclass of TransitionTarget.
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
bool: True if the target type matches, False otherwise
|
|
42
|
+
"""
|
|
43
|
+
return isinstance(self.target, target_type)
|
|
44
|
+
|
|
45
|
+
def target_requires_wrapping(self) -> bool:
|
|
46
|
+
"""Check if the target requires wrapping in an agent.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
bool: True if the target requires wrapping, False otherwise
|
|
50
|
+
"""
|
|
51
|
+
return self.target.needs_agent_wrapper()
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
|
|
6
|
+
from .auto import AutoPattern
|
|
7
|
+
from .manual import ManualPattern
|
|
8
|
+
from .pattern import DefaultPattern
|
|
9
|
+
from .random import RandomPattern
|
|
10
|
+
from .round_robin import RoundRobinPattern
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"AutoPattern",
|
|
14
|
+
"DefaultPattern",
|
|
15
|
+
"ManualPattern",
|
|
16
|
+
"RandomPattern",
|
|
17
|
+
"RoundRobinPattern",
|
|
18
|
+
]
|
|
@@ -0,0 +1,160 @@
|
|
|
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 collections.abc import Callable
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
7
|
+
|
|
8
|
+
from ..context_variables import ContextVariables
|
|
9
|
+
from ..targets.group_manager_target import GroupManagerSelectionMessage, GroupManagerTarget
|
|
10
|
+
from ..targets.transition_target import TransitionTarget
|
|
11
|
+
from .pattern import Pattern
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from ...conversable_agent import ConversableAgent
|
|
15
|
+
from ...groupchat import GroupChat, GroupChatManager
|
|
16
|
+
from ..group_tool_executor import GroupToolExecutor
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AutoPattern(Pattern):
|
|
20
|
+
"""AutoPattern implements a flexible pattern where agents are selected based on their expertise.
|
|
21
|
+
|
|
22
|
+
In this pattern, a group manager automatically selects the next agent to speak based on the context
|
|
23
|
+
of the conversation and agent descriptions. The after_work is always set to "group_manager" as
|
|
24
|
+
this is the defining characteristic of this pattern.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
initial_agent: "ConversableAgent",
|
|
30
|
+
agents: list["ConversableAgent"],
|
|
31
|
+
user_agent: Optional["ConversableAgent"] = None,
|
|
32
|
+
group_manager_args: dict[str, Any] | None = None,
|
|
33
|
+
context_variables: ContextVariables | None = None,
|
|
34
|
+
selection_message: GroupManagerSelectionMessage | None = None,
|
|
35
|
+
exclude_transit_message: bool = True,
|
|
36
|
+
summary_method: str | Callable[..., Any] | None = "last_msg",
|
|
37
|
+
):
|
|
38
|
+
"""Initialize the AutoPattern.
|
|
39
|
+
|
|
40
|
+
The after_work is always set to group_manager selection, which is the defining
|
|
41
|
+
characteristic of this pattern. You can customize the selection message used
|
|
42
|
+
by the group manager when selecting the next agent.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
initial_agent: The first agent to speak in the group chat.
|
|
46
|
+
agents: List of all agents participating in the chat.
|
|
47
|
+
user_agent: Optional user proxy agent.
|
|
48
|
+
group_manager_args: Optional arguments for the GroupChatManager.
|
|
49
|
+
context_variables: Initial context variables for the chat.
|
|
50
|
+
selection_message: Custom message to use when the group manager is selecting agents.
|
|
51
|
+
exclude_transit_message: Whether to exclude transit messages from the conversation.
|
|
52
|
+
summary_method: Method for summarizing the conversation.
|
|
53
|
+
"""
|
|
54
|
+
# Create the group_manager after_work with the provided selection message
|
|
55
|
+
group_manager_after_work = GroupManagerTarget(selection_message=selection_message)
|
|
56
|
+
|
|
57
|
+
super().__init__(
|
|
58
|
+
initial_agent=initial_agent,
|
|
59
|
+
agents=agents,
|
|
60
|
+
user_agent=user_agent,
|
|
61
|
+
group_manager_args=group_manager_args,
|
|
62
|
+
context_variables=context_variables,
|
|
63
|
+
group_after_work=group_manager_after_work,
|
|
64
|
+
exclude_transit_message=exclude_transit_message,
|
|
65
|
+
summary_method=summary_method,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# Store the selection message for potential use
|
|
69
|
+
self.selection_message = selection_message
|
|
70
|
+
|
|
71
|
+
def prepare_group_chat(
|
|
72
|
+
self,
|
|
73
|
+
max_rounds: int,
|
|
74
|
+
messages: list[dict[str, Any]] | str,
|
|
75
|
+
) -> tuple[
|
|
76
|
+
list["ConversableAgent"],
|
|
77
|
+
list["ConversableAgent"],
|
|
78
|
+
Optional["ConversableAgent"],
|
|
79
|
+
ContextVariables,
|
|
80
|
+
"ConversableAgent",
|
|
81
|
+
TransitionTarget,
|
|
82
|
+
"GroupToolExecutor",
|
|
83
|
+
"GroupChat",
|
|
84
|
+
"GroupChatManager",
|
|
85
|
+
list[dict[str, Any]],
|
|
86
|
+
Any,
|
|
87
|
+
list[str],
|
|
88
|
+
list[Any],
|
|
89
|
+
]:
|
|
90
|
+
"""Prepare the group chat for organic agent selection.
|
|
91
|
+
|
|
92
|
+
Ensures that:
|
|
93
|
+
1. The group manager has a valid LLM config
|
|
94
|
+
2. All agents have appropriate descriptions for the group manager to use
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
max_rounds: Maximum number of conversation rounds.
|
|
98
|
+
messages: Initial message(s) to start the conversation.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
Tuple containing all necessary components for the group chat.
|
|
102
|
+
"""
|
|
103
|
+
# Validate that group_manager_args has an LLM config which is required for this pattern
|
|
104
|
+
if not self.group_manager_args.get("llm_config", False):
|
|
105
|
+
# Check if any agent has an LLM config we can use
|
|
106
|
+
has_llm_config = any(getattr(agent, "llm_config", False) for agent in self.agents)
|
|
107
|
+
|
|
108
|
+
if not has_llm_config:
|
|
109
|
+
raise ValueError(
|
|
110
|
+
"AutoPattern requires the group_manager_args to include an llm_config, "
|
|
111
|
+
"or at least one agent to have an llm_config"
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Check that all agents have descriptions for effective group manager selection
|
|
115
|
+
for agent in self.agents:
|
|
116
|
+
if not hasattr(agent, "description") or not agent.description:
|
|
117
|
+
agent.description = f"Agent {agent.name}"
|
|
118
|
+
|
|
119
|
+
# Use the parent class's implementation to prepare the agents and group chat
|
|
120
|
+
components = super().prepare_group_chat(
|
|
121
|
+
max_rounds=max_rounds,
|
|
122
|
+
messages=messages,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# Extract the group_after_work and the rest of the components
|
|
126
|
+
(
|
|
127
|
+
agents,
|
|
128
|
+
wrapped_agents,
|
|
129
|
+
user_agent,
|
|
130
|
+
context_variables,
|
|
131
|
+
initial_agent,
|
|
132
|
+
_,
|
|
133
|
+
tool_executor,
|
|
134
|
+
groupchat,
|
|
135
|
+
manager,
|
|
136
|
+
processed_messages,
|
|
137
|
+
last_agent,
|
|
138
|
+
group_agent_names,
|
|
139
|
+
temp_user_list,
|
|
140
|
+
) = components
|
|
141
|
+
|
|
142
|
+
# Ensure we're using the group_manager after_work
|
|
143
|
+
group_after_work = self.group_after_work
|
|
144
|
+
|
|
145
|
+
# Return all components with our group_after_work
|
|
146
|
+
return (
|
|
147
|
+
agents,
|
|
148
|
+
wrapped_agents,
|
|
149
|
+
user_agent,
|
|
150
|
+
context_variables,
|
|
151
|
+
initial_agent,
|
|
152
|
+
group_after_work,
|
|
153
|
+
tool_executor,
|
|
154
|
+
groupchat,
|
|
155
|
+
manager,
|
|
156
|
+
processed_messages,
|
|
157
|
+
last_agent,
|
|
158
|
+
group_agent_names,
|
|
159
|
+
temp_user_list,
|
|
160
|
+
)
|