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,413 @@
|
|
|
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 random
|
|
6
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
from ..speaker_selection_result import SpeakerSelectionResult
|
|
11
|
+
from .transition_utils import __AGENT_WRAPPER_PREFIX__
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
# Avoid circular import
|
|
15
|
+
from ...conversable_agent import ConversableAgent
|
|
16
|
+
from ...groupchat import GroupChat
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"AgentNameTarget",
|
|
20
|
+
"AgentTarget",
|
|
21
|
+
"AskUserTarget",
|
|
22
|
+
"NestedChatTarget",
|
|
23
|
+
"RandomAgentTarget",
|
|
24
|
+
"RevertToUserTarget",
|
|
25
|
+
"StayTarget",
|
|
26
|
+
"TerminateTarget",
|
|
27
|
+
"TransitionTarget",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
# Common options for transitions
|
|
31
|
+
# terminate: Terminate the conversation
|
|
32
|
+
# revert_to_user: Revert to the user agent
|
|
33
|
+
# stay: Stay with the current agent
|
|
34
|
+
# group_manager: Use the group manager (auto speaker selection)
|
|
35
|
+
# ask_user: Use the user manager (ask the user, aka manual)
|
|
36
|
+
# TransitionOption = Literal["terminate", "revert_to_user", "stay", "group_manager", "ask_user"]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class TransitionTarget(BaseModel):
|
|
40
|
+
"""Base class for all transition targets across OnCondition, OnContextCondition, and after work."""
|
|
41
|
+
|
|
42
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
43
|
+
"""Check if the target can resolve to an option for speaker selection (Agent, 'None' to end, Str for speaker selection method). In the case of a nested chat, this will return False as it should be encapsulated in an agent."""
|
|
44
|
+
return False
|
|
45
|
+
|
|
46
|
+
def resolve(
|
|
47
|
+
self,
|
|
48
|
+
groupchat: "GroupChat",
|
|
49
|
+
current_agent: "ConversableAgent",
|
|
50
|
+
user_agent: Optional["ConversableAgent"],
|
|
51
|
+
) -> SpeakerSelectionResult:
|
|
52
|
+
"""Resolve to a speaker selection result (Agent, None for termination, or str for speaker selection method)."""
|
|
53
|
+
raise NotImplementedError("Requires subclasses to implement.")
|
|
54
|
+
|
|
55
|
+
def display_name(self) -> str:
|
|
56
|
+
"""Get the display name for the target."""
|
|
57
|
+
raise NotImplementedError("Requires subclasses to implement.")
|
|
58
|
+
|
|
59
|
+
def normalized_name(self) -> str:
|
|
60
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
61
|
+
raise NotImplementedError("Requires subclasses to implement.")
|
|
62
|
+
|
|
63
|
+
def needs_agent_wrapper(self) -> bool:
|
|
64
|
+
"""Check if the target needs to be wrapped in an agent."""
|
|
65
|
+
raise NotImplementedError("Requires subclasses to implement.")
|
|
66
|
+
|
|
67
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
68
|
+
"""Create a wrapper agent for the target if needed."""
|
|
69
|
+
raise NotImplementedError("Requires subclasses to implement.")
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class AgentTarget(TransitionTarget):
|
|
73
|
+
"""Target that represents a direct agent reference."""
|
|
74
|
+
|
|
75
|
+
agent_name: str
|
|
76
|
+
|
|
77
|
+
def __init__(self, agent: "ConversableAgent", **data: Any) -> None: # type: ignore[no-untyped-def]
|
|
78
|
+
# Store the name from the agent for serialization
|
|
79
|
+
super().__init__(agent_name=agent.name, **data)
|
|
80
|
+
|
|
81
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
82
|
+
"""Check if the target can resolve for speaker selection."""
|
|
83
|
+
return True
|
|
84
|
+
|
|
85
|
+
def resolve(
|
|
86
|
+
self,
|
|
87
|
+
groupchat: "GroupChat",
|
|
88
|
+
current_agent: "ConversableAgent",
|
|
89
|
+
user_agent: Optional["ConversableAgent"],
|
|
90
|
+
) -> SpeakerSelectionResult:
|
|
91
|
+
"""Resolve to the actual agent object from the groupchat."""
|
|
92
|
+
return SpeakerSelectionResult(agent_name=self.agent_name)
|
|
93
|
+
|
|
94
|
+
def display_name(self) -> str:
|
|
95
|
+
"""Get the display name for the target."""
|
|
96
|
+
return f"{self.agent_name}"
|
|
97
|
+
|
|
98
|
+
def normalized_name(self) -> str:
|
|
99
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
100
|
+
return self.display_name()
|
|
101
|
+
|
|
102
|
+
def __str__(self) -> str:
|
|
103
|
+
"""String representation for AgentTarget, can be shown as a function call message."""
|
|
104
|
+
return f"Transfer to {self.agent_name}"
|
|
105
|
+
|
|
106
|
+
def needs_agent_wrapper(self) -> bool:
|
|
107
|
+
"""Check if the target needs to be wrapped in an agent."""
|
|
108
|
+
return False
|
|
109
|
+
|
|
110
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
111
|
+
"""Create a wrapper agent for the target if needed."""
|
|
112
|
+
raise NotImplementedError("AgentTarget does not require wrapping in an agent.")
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class AgentNameTarget(TransitionTarget):
|
|
116
|
+
"""Target that represents an agent by name."""
|
|
117
|
+
|
|
118
|
+
agent_name: str
|
|
119
|
+
|
|
120
|
+
def __init__(self, agent_name: str, **data: Any) -> None:
|
|
121
|
+
"""Initialize with agent name as a positional parameter."""
|
|
122
|
+
super().__init__(agent_name=agent_name, **data)
|
|
123
|
+
|
|
124
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
125
|
+
"""Check if the target can resolve for speaker selection."""
|
|
126
|
+
return True
|
|
127
|
+
|
|
128
|
+
def resolve(
|
|
129
|
+
self,
|
|
130
|
+
groupchat: "GroupChat",
|
|
131
|
+
current_agent: "ConversableAgent",
|
|
132
|
+
user_agent: Optional["ConversableAgent"],
|
|
133
|
+
) -> SpeakerSelectionResult:
|
|
134
|
+
"""Resolve to the agent name string."""
|
|
135
|
+
return SpeakerSelectionResult(agent_name=self.agent_name)
|
|
136
|
+
|
|
137
|
+
def display_name(self) -> str:
|
|
138
|
+
"""Get the display name for the target."""
|
|
139
|
+
return f"{self.agent_name}"
|
|
140
|
+
|
|
141
|
+
def normalized_name(self) -> str:
|
|
142
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
143
|
+
return self.display_name()
|
|
144
|
+
|
|
145
|
+
def __str__(self) -> str:
|
|
146
|
+
"""String representation for AgentTarget, can be shown as a function call message."""
|
|
147
|
+
return f"Transfer to {self.agent_name}"
|
|
148
|
+
|
|
149
|
+
def needs_agent_wrapper(self) -> bool:
|
|
150
|
+
"""Check if the target needs to be wrapped in an agent."""
|
|
151
|
+
return False
|
|
152
|
+
|
|
153
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
154
|
+
"""Create a wrapper agent for the target if needed."""
|
|
155
|
+
raise NotImplementedError("AgentNameTarget does not require wrapping in an agent.")
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class NestedChatTarget(TransitionTarget):
|
|
159
|
+
"""Target that represents a nested chat configuration."""
|
|
160
|
+
|
|
161
|
+
nested_chat_config: dict[str, Any]
|
|
162
|
+
|
|
163
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
164
|
+
"""Check if the target can resolve for speaker selection. For NestedChatTarget the nested chat must be encapsulated into an agent."""
|
|
165
|
+
return False
|
|
166
|
+
|
|
167
|
+
def resolve(
|
|
168
|
+
self,
|
|
169
|
+
groupchat: "GroupChat",
|
|
170
|
+
current_agent: "ConversableAgent",
|
|
171
|
+
user_agent: Optional["ConversableAgent"],
|
|
172
|
+
) -> SpeakerSelectionResult:
|
|
173
|
+
"""Resolve to the nested chat configuration."""
|
|
174
|
+
raise NotImplementedError(
|
|
175
|
+
"NestedChatTarget does not support the resolve method. An agent should be used to encapsulate this nested chat and then the target changed to an AgentTarget."
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
def display_name(self) -> str:
|
|
179
|
+
"""Get the display name for the target."""
|
|
180
|
+
return "a nested chat"
|
|
181
|
+
|
|
182
|
+
def normalized_name(self) -> str:
|
|
183
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
184
|
+
return "nested_chat"
|
|
185
|
+
|
|
186
|
+
def __str__(self) -> str:
|
|
187
|
+
"""String representation for AgentTarget, can be shown as a function call message."""
|
|
188
|
+
return "Transfer to nested chat"
|
|
189
|
+
|
|
190
|
+
def needs_agent_wrapper(self) -> bool:
|
|
191
|
+
"""Check if the target needs to be wrapped in an agent. NestedChatTarget must be wrapped in an agent."""
|
|
192
|
+
return True
|
|
193
|
+
|
|
194
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
195
|
+
"""Create a wrapper agent for the nested chat."""
|
|
196
|
+
from ...conversable_agent import ConversableAgent # to avoid circular import - NEED SOLUTION
|
|
197
|
+
|
|
198
|
+
nested_chat_agent = ConversableAgent(name=f"{__AGENT_WRAPPER_PREFIX__}nested_{parent_agent.name}_{index + 1}")
|
|
199
|
+
|
|
200
|
+
nested_chat_agent.register_nested_chats(
|
|
201
|
+
self.nested_chat_config["chat_queue"],
|
|
202
|
+
reply_func_from_nested_chats=self.nested_chat_config.get("reply_func_from_nested_chats")
|
|
203
|
+
or "summary_from_nested_chats",
|
|
204
|
+
config=self.nested_chat_config.get("config"),
|
|
205
|
+
trigger=lambda sender: True,
|
|
206
|
+
position=0,
|
|
207
|
+
use_async=self.nested_chat_config.get("use_async", False),
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# After the nested chat is complete, transfer back to the parent agent
|
|
211
|
+
nested_chat_agent.handoffs.set_after_work(AgentTarget(parent_agent))
|
|
212
|
+
|
|
213
|
+
return nested_chat_agent
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
class TerminateTarget(TransitionTarget):
|
|
217
|
+
"""Target that represents a termination of the conversation."""
|
|
218
|
+
|
|
219
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
220
|
+
"""Check if the target can resolve for speaker selection."""
|
|
221
|
+
return True
|
|
222
|
+
|
|
223
|
+
def resolve(
|
|
224
|
+
self,
|
|
225
|
+
groupchat: "GroupChat",
|
|
226
|
+
current_agent: "ConversableAgent",
|
|
227
|
+
user_agent: Optional["ConversableAgent"],
|
|
228
|
+
) -> SpeakerSelectionResult:
|
|
229
|
+
"""Resolve to termination."""
|
|
230
|
+
return SpeakerSelectionResult(terminate=True)
|
|
231
|
+
|
|
232
|
+
def display_name(self) -> str:
|
|
233
|
+
"""Get the display name for the target."""
|
|
234
|
+
return "Terminate"
|
|
235
|
+
|
|
236
|
+
def normalized_name(self) -> str:
|
|
237
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
238
|
+
return "terminate"
|
|
239
|
+
|
|
240
|
+
def __str__(self) -> str:
|
|
241
|
+
"""String representation for AgentTarget, can be shown as a function call message."""
|
|
242
|
+
return "Terminate"
|
|
243
|
+
|
|
244
|
+
def needs_agent_wrapper(self) -> bool:
|
|
245
|
+
"""Check if the target needs to be wrapped in an agent."""
|
|
246
|
+
return False
|
|
247
|
+
|
|
248
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
249
|
+
"""Create a wrapper agent for the target if needed."""
|
|
250
|
+
raise NotImplementedError("TerminateTarget does not require wrapping in an agent.")
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
class StayTarget(TransitionTarget):
|
|
254
|
+
"""Target that represents staying with the current agent."""
|
|
255
|
+
|
|
256
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
257
|
+
"""Check if the target can resolve for speaker selection."""
|
|
258
|
+
return True
|
|
259
|
+
|
|
260
|
+
def resolve(
|
|
261
|
+
self,
|
|
262
|
+
groupchat: "GroupChat",
|
|
263
|
+
current_agent: "ConversableAgent",
|
|
264
|
+
user_agent: Optional["ConversableAgent"],
|
|
265
|
+
) -> SpeakerSelectionResult:
|
|
266
|
+
"""Resolve to staying with the current agent."""
|
|
267
|
+
return SpeakerSelectionResult(agent_name=current_agent.name)
|
|
268
|
+
|
|
269
|
+
def display_name(self) -> str:
|
|
270
|
+
"""Get the display name for the target."""
|
|
271
|
+
return "Stay"
|
|
272
|
+
|
|
273
|
+
def normalized_name(self) -> str:
|
|
274
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
275
|
+
return "stay"
|
|
276
|
+
|
|
277
|
+
def __str__(self) -> str:
|
|
278
|
+
"""String representation for AgentTarget, can be shown as a function call message."""
|
|
279
|
+
return "Stay with agent"
|
|
280
|
+
|
|
281
|
+
def needs_agent_wrapper(self) -> bool:
|
|
282
|
+
"""Check if the target needs to be wrapped in an agent."""
|
|
283
|
+
return False
|
|
284
|
+
|
|
285
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
286
|
+
"""Create a wrapper agent for the target if needed."""
|
|
287
|
+
raise NotImplementedError("StayTarget does not require wrapping in an agent.")
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
class RevertToUserTarget(TransitionTarget):
|
|
291
|
+
"""Target that represents reverting to the user agent."""
|
|
292
|
+
|
|
293
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
294
|
+
"""Check if the target can resolve for speaker selection."""
|
|
295
|
+
return True
|
|
296
|
+
|
|
297
|
+
def resolve(
|
|
298
|
+
self,
|
|
299
|
+
groupchat: "GroupChat",
|
|
300
|
+
current_agent: "ConversableAgent",
|
|
301
|
+
user_agent: Optional["ConversableAgent"],
|
|
302
|
+
) -> SpeakerSelectionResult:
|
|
303
|
+
"""Resolve to reverting to the user agent."""
|
|
304
|
+
if user_agent is None:
|
|
305
|
+
raise ValueError("User agent must be provided to the chat for the revert_to_user option.")
|
|
306
|
+
return SpeakerSelectionResult(agent_name=user_agent.name)
|
|
307
|
+
|
|
308
|
+
def display_name(self) -> str:
|
|
309
|
+
"""Get the display name for the target."""
|
|
310
|
+
return "Revert to User"
|
|
311
|
+
|
|
312
|
+
def normalized_name(self) -> str:
|
|
313
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
314
|
+
return "revert_to_user"
|
|
315
|
+
|
|
316
|
+
def __str__(self) -> str:
|
|
317
|
+
"""String representation for AgentTarget, can be shown as a function call message."""
|
|
318
|
+
return "Revert to User"
|
|
319
|
+
|
|
320
|
+
def needs_agent_wrapper(self) -> bool:
|
|
321
|
+
"""Check if the target needs to be wrapped in an agent."""
|
|
322
|
+
return False
|
|
323
|
+
|
|
324
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
325
|
+
"""Create a wrapper agent for the target if needed."""
|
|
326
|
+
raise NotImplementedError("RevertToUserTarget does not require wrapping in an agent.")
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
class AskUserTarget(TransitionTarget):
|
|
330
|
+
"""Target that represents asking the user for input."""
|
|
331
|
+
|
|
332
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
333
|
+
"""Check if the target can resolve for speaker selection."""
|
|
334
|
+
return True
|
|
335
|
+
|
|
336
|
+
def resolve(
|
|
337
|
+
self,
|
|
338
|
+
groupchat: "GroupChat",
|
|
339
|
+
current_agent: "ConversableAgent",
|
|
340
|
+
user_agent: Optional["ConversableAgent"],
|
|
341
|
+
) -> SpeakerSelectionResult:
|
|
342
|
+
"""Resolve to asking the user for input."""
|
|
343
|
+
return SpeakerSelectionResult(speaker_selection_method="manual")
|
|
344
|
+
|
|
345
|
+
def display_name(self) -> str:
|
|
346
|
+
"""Get the display name for the target."""
|
|
347
|
+
return "Ask User"
|
|
348
|
+
|
|
349
|
+
def normalized_name(self) -> str:
|
|
350
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
351
|
+
return "ask_user"
|
|
352
|
+
|
|
353
|
+
def __str__(self) -> str:
|
|
354
|
+
"""String representation for AgentTarget, can be shown as a function call message."""
|
|
355
|
+
return "Ask User"
|
|
356
|
+
|
|
357
|
+
def needs_agent_wrapper(self) -> bool:
|
|
358
|
+
"""Check if the target needs to be wrapped in an agent."""
|
|
359
|
+
return False
|
|
360
|
+
|
|
361
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
362
|
+
"""Create a wrapper agent for the target if needed."""
|
|
363
|
+
raise NotImplementedError("AskUserTarget does not require wrapping in an agent.")
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
class RandomAgentTarget(TransitionTarget):
|
|
367
|
+
"""Target that represents a random selection from a list of agents."""
|
|
368
|
+
|
|
369
|
+
agent_names: list[str]
|
|
370
|
+
nominated_name: str = "<Not Randomly Selected Yet>"
|
|
371
|
+
|
|
372
|
+
def __init__(self, agents: list["ConversableAgent"], **data: Any) -> None: # type: ignore[no-untyped-def]
|
|
373
|
+
# Store the name from the agent for serialization
|
|
374
|
+
super().__init__(agent_names=[agent.name for agent in agents], **data)
|
|
375
|
+
|
|
376
|
+
def can_resolve_for_speaker_selection(self) -> bool:
|
|
377
|
+
"""Check if the target can resolve for speaker selection."""
|
|
378
|
+
return True
|
|
379
|
+
|
|
380
|
+
def resolve(
|
|
381
|
+
self,
|
|
382
|
+
groupchat: "GroupChat",
|
|
383
|
+
current_agent: "ConversableAgent",
|
|
384
|
+
user_agent: Optional["ConversableAgent"],
|
|
385
|
+
) -> SpeakerSelectionResult:
|
|
386
|
+
"""Resolve to the actual agent object from the groupchat, choosing a random agent (except the current one)"""
|
|
387
|
+
# Randomly select the next agent
|
|
388
|
+
self.nominated_name = random.choice([name for name in self.agent_names if name != current_agent.name])
|
|
389
|
+
|
|
390
|
+
return SpeakerSelectionResult(agent_name=self.nominated_name)
|
|
391
|
+
|
|
392
|
+
def display_name(self) -> str:
|
|
393
|
+
"""Get the display name for the target."""
|
|
394
|
+
return self.nominated_name
|
|
395
|
+
|
|
396
|
+
def normalized_name(self) -> str:
|
|
397
|
+
"""Get a normalized name for the target that has no spaces, used for function calling"""
|
|
398
|
+
return self.display_name()
|
|
399
|
+
|
|
400
|
+
def __str__(self) -> str:
|
|
401
|
+
"""String representation for RandomAgentTarget, can be shown as a function call message."""
|
|
402
|
+
return f"Transfer to {self.nominated_name}"
|
|
403
|
+
|
|
404
|
+
def needs_agent_wrapper(self) -> bool:
|
|
405
|
+
"""Check if the target needs to be wrapped in an agent."""
|
|
406
|
+
return False
|
|
407
|
+
|
|
408
|
+
def create_wrapper_agent(self, parent_agent: "ConversableAgent", index: int) -> "ConversableAgent":
|
|
409
|
+
"""Create a wrapper agent for the target if needed."""
|
|
410
|
+
raise NotImplementedError("RandomAgentTarget does not require wrapping in an agent.")
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
# TODO: Consider adding a SequentialChatTarget class
|