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,106 @@
|
|
|
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 TYPE_CHECKING, Any, Optional, Tuple, Union
|
|
6
|
+
|
|
7
|
+
from ..context_variables import ContextVariables
|
|
8
|
+
from ..targets.transition_target import RandomAgentTarget, TransitionTarget
|
|
9
|
+
from .pattern import Pattern
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from ...conversable_agent import ConversableAgent
|
|
13
|
+
from ...groupchat import GroupChat, GroupChatManager
|
|
14
|
+
from ..group_tool_executor import GroupToolExecutor
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class RandomPattern(Pattern):
|
|
18
|
+
"""RandomPattern implements a random agent selection process."""
|
|
19
|
+
|
|
20
|
+
def _generate_handoffs(
|
|
21
|
+
self,
|
|
22
|
+
initial_agent: "ConversableAgent",
|
|
23
|
+
agents: list["ConversableAgent"],
|
|
24
|
+
user_agent: Optional["ConversableAgent"],
|
|
25
|
+
) -> None:
|
|
26
|
+
"""Generate handoffs between agents in a random fashion."""
|
|
27
|
+
agent_list = agents + ([user_agent] if user_agent is not None else [])
|
|
28
|
+
|
|
29
|
+
for agent in agent_list:
|
|
30
|
+
# Get the list of agents except itself
|
|
31
|
+
other_agents = [a for a in agent_list if a != agent]
|
|
32
|
+
|
|
33
|
+
# Create a random after work
|
|
34
|
+
agent.handoffs.set_after_work(target=RandomAgentTarget(agents=other_agents))
|
|
35
|
+
|
|
36
|
+
def prepare_group_chat(
|
|
37
|
+
self,
|
|
38
|
+
max_rounds: int,
|
|
39
|
+
messages: Union[list[dict[str, Any]], str],
|
|
40
|
+
) -> Tuple[
|
|
41
|
+
list["ConversableAgent"],
|
|
42
|
+
list["ConversableAgent"],
|
|
43
|
+
Optional["ConversableAgent"],
|
|
44
|
+
ContextVariables,
|
|
45
|
+
"ConversableAgent",
|
|
46
|
+
TransitionTarget,
|
|
47
|
+
"GroupToolExecutor",
|
|
48
|
+
"GroupChat",
|
|
49
|
+
"GroupChatManager",
|
|
50
|
+
list[dict[str, Any]],
|
|
51
|
+
Any,
|
|
52
|
+
list[str],
|
|
53
|
+
list[Any],
|
|
54
|
+
]:
|
|
55
|
+
"""Prepare the group chat for organic agent selection.
|
|
56
|
+
|
|
57
|
+
Ensures that:
|
|
58
|
+
1. The group manager has a valid LLM config
|
|
59
|
+
2. All agents have appropriate descriptions for the group manager to use
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
max_rounds: Maximum number of conversation rounds.
|
|
63
|
+
messages: Initial message(s) to start the conversation.
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Tuple containing all necessary components for the group chat.
|
|
67
|
+
"""
|
|
68
|
+
# Use the parent class's implementation to prepare the agents and group chat
|
|
69
|
+
(
|
|
70
|
+
agents,
|
|
71
|
+
wrapped_agents,
|
|
72
|
+
user_agent,
|
|
73
|
+
context_variables,
|
|
74
|
+
initial_agent,
|
|
75
|
+
group_after_work,
|
|
76
|
+
tool_executor,
|
|
77
|
+
groupchat,
|
|
78
|
+
manager,
|
|
79
|
+
processed_messages,
|
|
80
|
+
last_agent,
|
|
81
|
+
group_agent_names,
|
|
82
|
+
temp_user_list,
|
|
83
|
+
) = super().prepare_group_chat(
|
|
84
|
+
max_rounds=max_rounds,
|
|
85
|
+
messages=messages,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# Create the random handoffs between agents
|
|
89
|
+
self._generate_handoffs(initial_agent=initial_agent, agents=agents, user_agent=user_agent)
|
|
90
|
+
|
|
91
|
+
# Return all components with our group_after_work
|
|
92
|
+
return (
|
|
93
|
+
agents,
|
|
94
|
+
wrapped_agents,
|
|
95
|
+
user_agent,
|
|
96
|
+
context_variables,
|
|
97
|
+
initial_agent,
|
|
98
|
+
group_after_work,
|
|
99
|
+
tool_executor,
|
|
100
|
+
groupchat,
|
|
101
|
+
manager,
|
|
102
|
+
processed_messages,
|
|
103
|
+
last_agent,
|
|
104
|
+
group_agent_names,
|
|
105
|
+
temp_user_list,
|
|
106
|
+
)
|
|
@@ -0,0 +1,117 @@
|
|
|
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 TYPE_CHECKING, Any, Optional, Tuple, Union
|
|
6
|
+
|
|
7
|
+
from ..context_variables import ContextVariables
|
|
8
|
+
from ..targets.transition_target import AgentTarget, TransitionTarget
|
|
9
|
+
from .pattern import Pattern
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from ...conversable_agent import ConversableAgent
|
|
13
|
+
from ...groupchat import GroupChat, GroupChatManager
|
|
14
|
+
from ..group_tool_executor import GroupToolExecutor
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class RoundRobinPattern(Pattern):
|
|
18
|
+
"""RoundRobinPattern implements a round robin with handoffs between agents."""
|
|
19
|
+
|
|
20
|
+
def _generate_handoffs(
|
|
21
|
+
self,
|
|
22
|
+
initial_agent: "ConversableAgent",
|
|
23
|
+
agents: list["ConversableAgent"],
|
|
24
|
+
user_agent: Optional["ConversableAgent"],
|
|
25
|
+
) -> None:
|
|
26
|
+
"""Generate handoffs between agents in a round-robin fashion."""
|
|
27
|
+
# Create a list of the agents and the user_agent but put the initial_agent first
|
|
28
|
+
agent_list = [initial_agent]
|
|
29
|
+
|
|
30
|
+
# Add the rest of the agents, excluding the initial_agent and user_agent
|
|
31
|
+
for agent in agents:
|
|
32
|
+
if agent != initial_agent and (user_agent is None or agent != user_agent):
|
|
33
|
+
agent_list.append(agent)
|
|
34
|
+
|
|
35
|
+
# Add the user_agent last if it exists
|
|
36
|
+
if user_agent is not None:
|
|
37
|
+
agent_list.append(user_agent)
|
|
38
|
+
|
|
39
|
+
# Create handoffs in a round-robin fashion
|
|
40
|
+
for i, agent in enumerate(agent_list):
|
|
41
|
+
# Last agent hands off to the first agent
|
|
42
|
+
# Otherwise agent hands off to the next one
|
|
43
|
+
handoff_target = agent_list[0] if i == len(agent_list) - 1 else agent_list[i + 1]
|
|
44
|
+
|
|
45
|
+
agent.handoffs.set_after_work(target=AgentTarget(agent=handoff_target))
|
|
46
|
+
|
|
47
|
+
def prepare_group_chat(
|
|
48
|
+
self,
|
|
49
|
+
max_rounds: int,
|
|
50
|
+
messages: Union[list[dict[str, Any]], str],
|
|
51
|
+
) -> Tuple[
|
|
52
|
+
list["ConversableAgent"],
|
|
53
|
+
list["ConversableAgent"],
|
|
54
|
+
Optional["ConversableAgent"],
|
|
55
|
+
ContextVariables,
|
|
56
|
+
"ConversableAgent",
|
|
57
|
+
TransitionTarget,
|
|
58
|
+
"GroupToolExecutor",
|
|
59
|
+
"GroupChat",
|
|
60
|
+
"GroupChatManager",
|
|
61
|
+
list[dict[str, Any]],
|
|
62
|
+
Any,
|
|
63
|
+
list[str],
|
|
64
|
+
list[Any],
|
|
65
|
+
]:
|
|
66
|
+
"""Prepare the group chat for organic agent selection.
|
|
67
|
+
|
|
68
|
+
Ensures that:
|
|
69
|
+
1. The group manager has a valid LLM config
|
|
70
|
+
2. All agents have appropriate descriptions for the group manager to use
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
max_rounds: Maximum number of conversation rounds.
|
|
74
|
+
messages: Initial message(s) to start the conversation.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Tuple containing all necessary components for the group chat.
|
|
78
|
+
"""
|
|
79
|
+
# Use the parent class's implementation to prepare the agents and group chat
|
|
80
|
+
(
|
|
81
|
+
agents,
|
|
82
|
+
wrapped_agents,
|
|
83
|
+
user_agent,
|
|
84
|
+
context_variables,
|
|
85
|
+
initial_agent,
|
|
86
|
+
group_after_work,
|
|
87
|
+
tool_executor,
|
|
88
|
+
groupchat,
|
|
89
|
+
manager,
|
|
90
|
+
processed_messages,
|
|
91
|
+
last_agent,
|
|
92
|
+
group_agent_names,
|
|
93
|
+
temp_user_list,
|
|
94
|
+
) = super().prepare_group_chat(
|
|
95
|
+
max_rounds=max_rounds,
|
|
96
|
+
messages=messages,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Create the handoffs between agents
|
|
100
|
+
self._generate_handoffs(initial_agent=initial_agent, agents=agents, user_agent=user_agent)
|
|
101
|
+
|
|
102
|
+
# Return all components with our group_after_work
|
|
103
|
+
return (
|
|
104
|
+
agents,
|
|
105
|
+
wrapped_agents,
|
|
106
|
+
user_agent,
|
|
107
|
+
context_variables,
|
|
108
|
+
initial_agent,
|
|
109
|
+
group_after_work,
|
|
110
|
+
tool_executor,
|
|
111
|
+
groupchat,
|
|
112
|
+
manager,
|
|
113
|
+
processed_messages,
|
|
114
|
+
last_agent,
|
|
115
|
+
group_agent_names,
|
|
116
|
+
temp_user_list,
|
|
117
|
+
)
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
__all__ = ["ReplyResult"]
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
from typing import Optional
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel
|
|
12
|
+
|
|
13
|
+
from .context_variables import ContextVariables
|
|
14
|
+
from .targets.transition_target import TransitionTarget
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ReplyResult(BaseModel):
|
|
18
|
+
"""Result of a tool call that is used to provide the return message and the target to transition to."""
|
|
19
|
+
|
|
20
|
+
message: str
|
|
21
|
+
target: Optional[TransitionTarget] = None
|
|
22
|
+
context_variables: Optional[ContextVariables] = None
|
|
23
|
+
|
|
24
|
+
def __str__(self) -> str:
|
|
25
|
+
"""The string representation for ReplyResult will be just the message."""
|
|
26
|
+
return self.message
|
|
@@ -0,0 +1,41 @@
|
|
|
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 TYPE_CHECKING, Optional, Union
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from ..agent import Agent
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
# Avoid circular import
|
|
13
|
+
from ..groupchat import GroupChat
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SpeakerSelectionResult(BaseModel):
|
|
17
|
+
"""Represents a speaker selection result that will be returned to GroupChat._prepare_and_select_agents to determine the next speaker.
|
|
18
|
+
|
|
19
|
+
This class can return an Agent, a None to end the conversation, or a string for a speaker selection method.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
terminate: Optional[bool] = None
|
|
23
|
+
agent_name: Optional[str] = None
|
|
24
|
+
speaker_selection_method: Optional[str] = None
|
|
25
|
+
|
|
26
|
+
def get_speaker_selection_result(self, groupchat: "GroupChat") -> Optional[Union[Agent, str]]:
|
|
27
|
+
"""Get the speaker selection result. If None, the conversation will end."""
|
|
28
|
+
if self.agent_name is not None:
|
|
29
|
+
# Find the agent by name in the groupchat
|
|
30
|
+
for agent in groupchat.agents:
|
|
31
|
+
if agent.name == self.agent_name:
|
|
32
|
+
return agent
|
|
33
|
+
raise ValueError(f"Agent '{self.agent_name}' not found in groupchat.")
|
|
34
|
+
elif self.speaker_selection_method is not None:
|
|
35
|
+
return self.speaker_selection_method
|
|
36
|
+
elif self.terminate is not None and self.terminate:
|
|
37
|
+
return None
|
|
38
|
+
else:
|
|
39
|
+
raise ValueError(
|
|
40
|
+
"Unable to establish speaker selection result. No terminate, agent, or speaker selection method provided."
|
|
41
|
+
)
|
|
@@ -0,0 +1,132 @@
|
|
|
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 TYPE_CHECKING, Any, Optional, Union
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from ....doc_utils import export_module
|
|
10
|
+
from ...agent import Agent
|
|
11
|
+
from ..speaker_selection_result import SpeakerSelectionResult
|
|
12
|
+
from .transition_target import AgentTarget, TransitionTarget
|
|
13
|
+
from .transition_utils import __AGENT_WRAPPER_PREFIX__
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from ...conversable_agent import ConversableAgent
|
|
17
|
+
from ...groupchat import GroupChat
|
|
18
|
+
from ..patterns.pattern import Pattern
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
__all__ = ["GroupChatConfig", "GroupChatTarget"]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@export_module("autogen.agentchat.group")
|
|
25
|
+
class GroupChatConfig(BaseModel):
|
|
26
|
+
"""Configuration for a group chat transition target.
|
|
27
|
+
|
|
28
|
+
Note: If context_variables are not passed in, the outer context variables will be passed in"""
|
|
29
|
+
|
|
30
|
+
pattern: "Pattern"
|
|
31
|
+
messages: Union[list[dict[str, Any]], str]
|
|
32
|
+
max_rounds: int = 20
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@export_module("autogen.agentchat.group")
|
|
36
|
+
class GroupChatTarget(TransitionTarget):
|
|
37
|
+
"""Target that represents a group chat."""
|
|
38
|
+
|
|
39
|
+
group_chat_config: GroupChatConfig
|
|
40
|
+
|
|
41
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
42
|
+
"""Check if the target can resolve for speaker selection. For GroupChatTarget the chat must be encapsulated into an agent."""
|
|
43
|
+
return False
|
|
44
|
+
|
|
45
|
+
def resolve(
|
|
46
|
+
self,
|
|
47
|
+
groupchat: "GroupChat",
|
|
48
|
+
current_agent: "ConversableAgent",
|
|
49
|
+
user_agent: Optional["ConversableAgent"],
|
|
50
|
+
) -> SpeakerSelectionResult:
|
|
51
|
+
"""Resolve to the nested chat configuration."""
|
|
52
|
+
raise NotImplementedError(
|
|
53
|
+
"GroupChatTarget does not support the resolve method. An agent should be used to encapsulate this nested chat and then the target changed to an AgentTarget."
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
def display_name(self) -> str:
|
|
57
|
+
"""Get the display name for the target."""
|
|
58
|
+
return "a group chat"
|
|
59
|
+
|
|
60
|
+
def normalized_name(self) -> str:
|
|
61
|
+
"""Get a normalized name for the target that has no spaces, used for function calling."""
|
|
62
|
+
return "group_chat"
|
|
63
|
+
|
|
64
|
+
def __str__(self) -> str:
|
|
65
|
+
"""String representation for AgentTarget, can be shown as a function call message."""
|
|
66
|
+
return "Transfer to group chat"
|
|
67
|
+
|
|
68
|
+
def needs_agent_wrapper(self) -> bool:
|
|
69
|
+
"""Check if the target needs to be wrapped in an agent. GroupChatTarget must be wrapped in an agent."""
|
|
70
|
+
return True
|
|
71
|
+
|
|
72
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
73
|
+
"""Create a wrapper agent for the group chat."""
|
|
74
|
+
from autogen.agentchat import initiate_group_chat
|
|
75
|
+
|
|
76
|
+
from ...conversable_agent import ConversableAgent # to avoid circular import
|
|
77
|
+
|
|
78
|
+
# Create the wrapper agent with a name that identifies it as a wrapped group chat
|
|
79
|
+
group_chat_agent = ConversableAgent(
|
|
80
|
+
name=f"{__AGENT_WRAPPER_PREFIX__}group_{parent_agent.name}_{index + 1}",
|
|
81
|
+
# Copy LLM config from parent agent to ensure it can generate replies if needed
|
|
82
|
+
llm_config=parent_agent.llm_config,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Store the config directly on the agent
|
|
86
|
+
group_chat_agent._group_chat_config = self.group_chat_config # type: ignore[attr-defined]
|
|
87
|
+
|
|
88
|
+
# Define the reply function that will run the group chat
|
|
89
|
+
def group_chat_reply(
|
|
90
|
+
agent: "ConversableAgent",
|
|
91
|
+
messages: Optional[list[dict[str, Any]]] = None,
|
|
92
|
+
sender: Optional["Agent"] = None,
|
|
93
|
+
config: Optional[Any] = None,
|
|
94
|
+
) -> tuple[bool, Optional[dict[str, Any]]]:
|
|
95
|
+
"""Run the inner group chat and return its results as a reply."""
|
|
96
|
+
# Get the configuration stored directly on the agent
|
|
97
|
+
group_config = agent._group_chat_config # type: ignore[attr-defined]
|
|
98
|
+
|
|
99
|
+
# Pull through the second last message from the outer chat (the last message will be the handoff message)
|
|
100
|
+
# This may need work to make sure we get the right message(s) from the outer chat
|
|
101
|
+
message = (
|
|
102
|
+
messages[-2]["content"]
|
|
103
|
+
if messages and len(messages) >= 2 and "content" in messages[-2]
|
|
104
|
+
else "No message to pass through."
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
# Run the group chat with direct agent references from the config
|
|
109
|
+
result, _, _ = initiate_group_chat(
|
|
110
|
+
pattern=group_config.pattern,
|
|
111
|
+
messages=message,
|
|
112
|
+
max_rounds=group_config.max_rounds,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# Return the summary from the chat result summary
|
|
116
|
+
return True, {"content": result.summary}
|
|
117
|
+
|
|
118
|
+
except Exception as e:
|
|
119
|
+
# Handle any errors during execution
|
|
120
|
+
return True, {"content": f"Error running group chat: {str(e)}"}
|
|
121
|
+
|
|
122
|
+
# Register the reply function with the wrapper agent
|
|
123
|
+
group_chat_agent.register_reply(
|
|
124
|
+
trigger=[ConversableAgent, None],
|
|
125
|
+
reply_func=group_chat_reply,
|
|
126
|
+
remove_other_reply_funcs=True, # Use only this reply function
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# After the group chat completes, transition back to the parent agent
|
|
130
|
+
group_chat_agent.handoffs.set_after_work(AgentTarget(parent_agent))
|
|
131
|
+
|
|
132
|
+
return group_chat_agent
|
|
@@ -0,0 +1,151 @@
|
|
|
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 TYPE_CHECKING, Any, Optional, Type, Union
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, field_validator
|
|
8
|
+
|
|
9
|
+
from ....doc_utils import export_module
|
|
10
|
+
from ..context_str import ContextStr
|
|
11
|
+
from ..group_tool_executor import GroupToolExecutor
|
|
12
|
+
from ..speaker_selection_result import SpeakerSelectionResult
|
|
13
|
+
from .transition_target import TransitionTarget
|
|
14
|
+
from .transition_utils import __AGENT_WRAPPER_PREFIX__
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
# Avoid circular import
|
|
18
|
+
from ...conversable_agent import ConversableAgent
|
|
19
|
+
from ...groupchat import GroupChat
|
|
20
|
+
|
|
21
|
+
__all__ = ["GroupManagerTarget"]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def prepare_groupchat_auto_speaker(
|
|
25
|
+
groupchat: "GroupChat",
|
|
26
|
+
last_group_agent: "ConversableAgent",
|
|
27
|
+
group_chat_manager_selection_msg: Optional[Any],
|
|
28
|
+
) -> None:
|
|
29
|
+
"""Prepare the group chat for auto speaker selection, includes updating or restore the groupchat speaker selection message.
|
|
30
|
+
|
|
31
|
+
Tool Executor and wrapped agents will be removed from the available agents list.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
groupchat (GroupChat): GroupChat instance.
|
|
35
|
+
last_group_agent ("ConversableAgent"): The last group agent for which the LLM config is used
|
|
36
|
+
group_chat_manager_selection_msg (GroupManagerSelectionMessage): Optional message to use for the agent selection (in internal group chat).
|
|
37
|
+
"""
|
|
38
|
+
from ...groupchat import SELECT_SPEAKER_PROMPT_TEMPLATE
|
|
39
|
+
|
|
40
|
+
def substitute_agentlist(template: str) -> str:
|
|
41
|
+
# Run through group chat's string substitution first for {agentlist}
|
|
42
|
+
# We need to do this so that the next substitution doesn't fail with agentlist
|
|
43
|
+
# and we can remove the tool executor and wrapped chats from the available agents list
|
|
44
|
+
agent_list = [
|
|
45
|
+
agent
|
|
46
|
+
for agent in groupchat.agents
|
|
47
|
+
if not isinstance(agent, GroupToolExecutor) and not agent.name.startswith(__AGENT_WRAPPER_PREFIX__)
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
groupchat.select_speaker_prompt_template = template
|
|
51
|
+
return groupchat.select_speaker_prompt(agent_list)
|
|
52
|
+
|
|
53
|
+
# Use the default speaker selection prompt if one is not specified, otherwise use the specified one
|
|
54
|
+
groupchat.select_speaker_prompt_template = substitute_agentlist(
|
|
55
|
+
SELECT_SPEAKER_PROMPT_TEMPLATE
|
|
56
|
+
if group_chat_manager_selection_msg is None
|
|
57
|
+
else group_chat_manager_selection_msg.get_message(last_group_agent)
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# GroupManagerSelectionMessage protocol and implementations
|
|
62
|
+
@export_module("autogen.agentchat.group")
|
|
63
|
+
class GroupManagerSelectionMessage(BaseModel):
|
|
64
|
+
"""Base class for all GroupManager selection message types."""
|
|
65
|
+
|
|
66
|
+
def get_message(self, agent: "ConversableAgent") -> str:
|
|
67
|
+
"""Get the formatted message."""
|
|
68
|
+
raise NotImplementedError("Requires subclasses to implement.")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@export_module("autogen.agentchat.group")
|
|
72
|
+
class GroupManagerSelectionMessageString(GroupManagerSelectionMessage):
|
|
73
|
+
"""Selection message that uses a plain string template."""
|
|
74
|
+
|
|
75
|
+
message: str
|
|
76
|
+
|
|
77
|
+
def get_message(self, agent: "ConversableAgent") -> str:
|
|
78
|
+
"""Get the message string."""
|
|
79
|
+
return self.message
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
@export_module("autogen.agentchat.group")
|
|
83
|
+
class GroupManagerSelectionMessageContextStr(GroupManagerSelectionMessage):
|
|
84
|
+
"""Selection message that uses a ContextStr template."""
|
|
85
|
+
|
|
86
|
+
context_str_template: str
|
|
87
|
+
|
|
88
|
+
# We will replace {agentlist} with another term and return it later for use with the internal group chat auto speaker selection
|
|
89
|
+
# Otherwise our format will fail
|
|
90
|
+
@field_validator("context_str_template", mode="before")
|
|
91
|
+
def _replace_agentlist_placeholder(cls: Type["GroupManagerSelectionMessageContextStr"], v: Any) -> Union[str, Any]: # noqa: N805
|
|
92
|
+
"""Replace {agentlist} placeholder before validation/assignment."""
|
|
93
|
+
if isinstance(v, str):
|
|
94
|
+
if "{agentlist}" in v:
|
|
95
|
+
return v.replace("{agentlist}", "<<agent_list>>") # Perform the replacement
|
|
96
|
+
else:
|
|
97
|
+
return v # If no replacement is needed, return the original value
|
|
98
|
+
return ""
|
|
99
|
+
|
|
100
|
+
def get_message(self, agent: "ConversableAgent") -> str:
|
|
101
|
+
"""Get the formatted message with context variables substituted."""
|
|
102
|
+
context_str = ContextStr(template=self.context_str_template)
|
|
103
|
+
format_result = context_str.format(agent.context_variables)
|
|
104
|
+
if format_result is None:
|
|
105
|
+
return ""
|
|
106
|
+
|
|
107
|
+
return format_result.replace(
|
|
108
|
+
"<<agent_list>>", "{agentlist}"
|
|
109
|
+
) # Restore agentlist so it can be substituted by the internal group chat auto speaker selection
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class GroupManagerTarget(TransitionTarget):
|
|
113
|
+
"""Target that represents an agent by name."""
|
|
114
|
+
|
|
115
|
+
selection_message: Optional[GroupManagerSelectionMessage] = None
|
|
116
|
+
|
|
117
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
118
|
+
"""Check if the target can resolve for speaker selection."""
|
|
119
|
+
return True
|
|
120
|
+
|
|
121
|
+
def resolve(
|
|
122
|
+
self,
|
|
123
|
+
groupchat: "GroupChat",
|
|
124
|
+
current_agent: "ConversableAgent",
|
|
125
|
+
user_agent: Optional["ConversableAgent"],
|
|
126
|
+
) -> SpeakerSelectionResult:
|
|
127
|
+
"""Resolve to the speaker selection for the group."""
|
|
128
|
+
if self.selection_message is not None:
|
|
129
|
+
prepare_groupchat_auto_speaker(groupchat, current_agent, self.selection_message)
|
|
130
|
+
|
|
131
|
+
return SpeakerSelectionResult(speaker_selection_method="auto")
|
|
132
|
+
|
|
133
|
+
def display_name(self) -> str:
|
|
134
|
+
"""Get the display name for the target."""
|
|
135
|
+
return "the group manager"
|
|
136
|
+
|
|
137
|
+
def normalized_name(self) -> str:
|
|
138
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
139
|
+
return self.display_name()
|
|
140
|
+
|
|
141
|
+
def __str__(self) -> str:
|
|
142
|
+
"""String representation for AgentTarget, can be shown as a function call message."""
|
|
143
|
+
return "Transfer to the group manager"
|
|
144
|
+
|
|
145
|
+
def needs_agent_wrapper(self) -> bool:
|
|
146
|
+
"""Check if the target needs to be wrapped in an agent."""
|
|
147
|
+
return False
|
|
148
|
+
|
|
149
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
150
|
+
"""Create a wrapper agent for the target if needed."""
|
|
151
|
+
raise NotImplementedError("GroupManagerTarget does not require wrapping in an agent.")
|