ag2 0.9.1a1__py3-none-any.whl → 0.9.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.
Potentially problematic release.
This version of ag2 might be problematic. Click here for more details.
- {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info}/METADATA +272 -75
- ag2-0.9.2.dist-info/RECORD +406 -0
- {ag2-0.9.1a1.dist-info → ag2-0.9.2.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 +4023 -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 +1013 -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 +179 -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 +382 -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/__main__.py +78 -0
- autogen/mcp/mcp_client.py +208 -0
- autogen/mcp/mcp_proxy/__init__.py +19 -0
- autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +63 -0
- autogen/mcp/mcp_proxy/mcp_proxy.py +581 -0
- autogen/mcp/mcp_proxy/operation_grouping.py +158 -0
- autogen/mcp/mcp_proxy/operation_renaming.py +114 -0
- autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
- autogen/mcp/mcp_proxy/security.py +400 -0
- autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -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 +1444 -0
- autogen/oai/client_utils.py +169 -0
- autogen/oai/cohere.py +479 -0
- autogen/oai/gemini.py +998 -0
- autogen/oai/gemini_types.py +155 -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 +48 -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/reliable/__init__.py +10 -0
- autogen/tools/experimental/reliable/reliable.py +1316 -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
- templates/client_template/main.jinja2 +69 -0
- templates/config_template/config.jinja2 +7 -0
- templates/main.jinja2 +61 -0
- ag2-0.9.1a1.dist-info/RECORD +0 -6
- ag2-0.9.1a1.dist-info/top_level.txt +0 -1
- {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info/licenses}/LICENSE +0 -0
- {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info/licenses}/NOTICE.md +0 -0
|
@@ -0,0 +1,244 @@
|
|
|
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 Optional, Union, overload
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
from .on_condition import OnCondition
|
|
10
|
+
from .on_context_condition import OnContextCondition
|
|
11
|
+
from .targets.transition_target import TransitionTarget
|
|
12
|
+
|
|
13
|
+
__all__ = ["Handoffs"]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Handoffs(BaseModel):
|
|
17
|
+
"""
|
|
18
|
+
Container for all handoff transition conditions of a ConversableAgent.
|
|
19
|
+
|
|
20
|
+
Three types of conditions can be added, each with a different order and time of use:
|
|
21
|
+
1. OnContextConditions (evaluated without an LLM)
|
|
22
|
+
2. OnConditions (evaluated with an LLM)
|
|
23
|
+
3. After work TransitionTarget (if no other transition is triggered)
|
|
24
|
+
|
|
25
|
+
Supports method chaining:
|
|
26
|
+
agent.handoffs.add_context_conditions([condition1]) \
|
|
27
|
+
.add_llm_condition(condition2) \
|
|
28
|
+
.set_after_work(after_work)
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
context_conditions: list[OnContextCondition] = Field(default_factory=list)
|
|
32
|
+
llm_conditions: list[OnCondition] = Field(default_factory=list)
|
|
33
|
+
after_work: Optional[TransitionTarget] = None
|
|
34
|
+
|
|
35
|
+
def add_context_condition(self, condition: OnContextCondition) -> "Handoffs":
|
|
36
|
+
"""
|
|
37
|
+
Add a single context condition.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
condition: The OnContextCondition to add
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
Self for method chaining
|
|
44
|
+
"""
|
|
45
|
+
# Validate that it is an OnContextCondition
|
|
46
|
+
if not isinstance(condition, OnContextCondition):
|
|
47
|
+
raise TypeError(f"Expected an OnContextCondition instance, got {type(condition).__name__}")
|
|
48
|
+
|
|
49
|
+
self.context_conditions.append(condition)
|
|
50
|
+
return self
|
|
51
|
+
|
|
52
|
+
def add_context_conditions(self, conditions: list[OnContextCondition]) -> "Handoffs":
|
|
53
|
+
"""
|
|
54
|
+
Add multiple context conditions.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
conditions: List of OnContextConditions to add
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Self for method chaining
|
|
61
|
+
"""
|
|
62
|
+
# Validate that it is a list of OnContextConditions
|
|
63
|
+
if not all(isinstance(condition, OnContextCondition) for condition in conditions):
|
|
64
|
+
raise TypeError("All conditions must be of type OnContextCondition")
|
|
65
|
+
|
|
66
|
+
self.context_conditions.extend(conditions)
|
|
67
|
+
return self
|
|
68
|
+
|
|
69
|
+
def add_llm_condition(self, condition: OnCondition) -> "Handoffs":
|
|
70
|
+
"""
|
|
71
|
+
Add a single LLM condition.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
condition: The OnCondition to add
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Self for method chaining
|
|
78
|
+
"""
|
|
79
|
+
# Validate that it is an OnCondition
|
|
80
|
+
if not isinstance(condition, OnCondition):
|
|
81
|
+
raise TypeError(f"Expected an OnCondition instance, got {type(condition).__name__}")
|
|
82
|
+
|
|
83
|
+
self.llm_conditions.append(condition)
|
|
84
|
+
return self
|
|
85
|
+
|
|
86
|
+
def add_llm_conditions(self, conditions: list[OnCondition]) -> "Handoffs":
|
|
87
|
+
"""
|
|
88
|
+
Add multiple LLM conditions.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
conditions: List of OnConditions to add
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
Self for method chaining
|
|
95
|
+
"""
|
|
96
|
+
# Validate that it is a list of OnConditions
|
|
97
|
+
if not all(isinstance(condition, OnCondition) for condition in conditions):
|
|
98
|
+
raise TypeError("All conditions must be of type OnCondition")
|
|
99
|
+
|
|
100
|
+
self.llm_conditions.extend(conditions)
|
|
101
|
+
return self
|
|
102
|
+
|
|
103
|
+
def set_after_work(self, target: TransitionTarget) -> "Handoffs":
|
|
104
|
+
"""
|
|
105
|
+
Set the after work target (only one allowed).
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
target: The after work TransitionTarget to set
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Self for method chaining
|
|
112
|
+
"""
|
|
113
|
+
if not isinstance(target, TransitionTarget):
|
|
114
|
+
raise TypeError(f"Expected a TransitionTarget instance, got {type(target).__name__}")
|
|
115
|
+
|
|
116
|
+
self.after_work = target
|
|
117
|
+
return self
|
|
118
|
+
|
|
119
|
+
@overload
|
|
120
|
+
def add(self, condition: OnContextCondition) -> "Handoffs": ...
|
|
121
|
+
|
|
122
|
+
@overload
|
|
123
|
+
def add(self, condition: OnCondition) -> "Handoffs": ...
|
|
124
|
+
|
|
125
|
+
def add(self, condition: Union[OnContextCondition, OnCondition]) -> "Handoffs":
|
|
126
|
+
"""
|
|
127
|
+
Add a single condition (OnContextCondition or OnCondition).
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
condition: The condition to add (OnContextCondition or OnCondition)
|
|
131
|
+
|
|
132
|
+
Raises:
|
|
133
|
+
TypeError: If the condition type is not supported
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
Self for method chaining
|
|
137
|
+
"""
|
|
138
|
+
# This add method is a helper method designed to make it easier for
|
|
139
|
+
# adding handoffs without worrying about the specific type.
|
|
140
|
+
if isinstance(condition, OnContextCondition):
|
|
141
|
+
return self.add_context_condition(condition)
|
|
142
|
+
elif isinstance(condition, OnCondition):
|
|
143
|
+
return self.add_llm_condition(condition)
|
|
144
|
+
else:
|
|
145
|
+
raise TypeError(f"Unsupported condition type: {type(condition).__name__}")
|
|
146
|
+
|
|
147
|
+
def add_many(self, conditions: list[Union[OnContextCondition, OnCondition]]) -> "Handoffs":
|
|
148
|
+
"""
|
|
149
|
+
Add multiple conditions of any supported types (OnContextCondition and OnCondition).
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
conditions: List of conditions to add
|
|
153
|
+
|
|
154
|
+
Raises:
|
|
155
|
+
TypeError: If an unsupported condition type is provided
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
Self for method chaining
|
|
159
|
+
"""
|
|
160
|
+
# This add_many method is a helper method designed to make it easier for
|
|
161
|
+
# adding handoffs without worrying about the specific type.
|
|
162
|
+
context_conditions = []
|
|
163
|
+
llm_conditions = []
|
|
164
|
+
|
|
165
|
+
for condition in conditions:
|
|
166
|
+
if isinstance(condition, OnContextCondition):
|
|
167
|
+
context_conditions.append(condition)
|
|
168
|
+
elif isinstance(condition, OnCondition):
|
|
169
|
+
llm_conditions.append(condition)
|
|
170
|
+
else:
|
|
171
|
+
raise TypeError(f"Unsupported condition type: {type(condition).__name__}")
|
|
172
|
+
|
|
173
|
+
if context_conditions:
|
|
174
|
+
self.add_context_conditions(context_conditions)
|
|
175
|
+
if llm_conditions:
|
|
176
|
+
self.add_llm_conditions(llm_conditions)
|
|
177
|
+
|
|
178
|
+
return self
|
|
179
|
+
|
|
180
|
+
def clear(self) -> "Handoffs":
|
|
181
|
+
"""
|
|
182
|
+
Clear all handoff conditions.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
Self for method chaining
|
|
186
|
+
"""
|
|
187
|
+
self.context_conditions.clear()
|
|
188
|
+
self.llm_conditions.clear()
|
|
189
|
+
self.after_work = None
|
|
190
|
+
return self
|
|
191
|
+
|
|
192
|
+
def get_llm_conditions_by_target_type(self, target_type: type) -> list[OnCondition]:
|
|
193
|
+
"""
|
|
194
|
+
Get OnConditions for a specific target type.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
target_type: The type of condition to retrieve
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
List of conditions of the specified type, or None if none exist
|
|
201
|
+
"""
|
|
202
|
+
return [on_condition for on_condition in self.llm_conditions if on_condition.has_target_type(target_type)]
|
|
203
|
+
|
|
204
|
+
def get_context_conditions_by_target_type(self, target_type: type) -> list[OnContextCondition]:
|
|
205
|
+
"""
|
|
206
|
+
Get OnContextConditions for a specific target type.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
target_type: The type of condition to retrieve
|
|
210
|
+
|
|
211
|
+
Returns:
|
|
212
|
+
List of conditions of the specified type, or None if none exist
|
|
213
|
+
"""
|
|
214
|
+
return [
|
|
215
|
+
on_context_condition
|
|
216
|
+
for on_context_condition in self.context_conditions
|
|
217
|
+
if on_context_condition.has_target_type(target_type)
|
|
218
|
+
]
|
|
219
|
+
|
|
220
|
+
def get_llm_conditions_requiring_wrapping(self) -> list[OnCondition]:
|
|
221
|
+
"""
|
|
222
|
+
Get LLM conditions that have targets that require wrapping.
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
List of LLM conditions that require wrapping
|
|
226
|
+
"""
|
|
227
|
+
return [condition for condition in self.llm_conditions if condition.target_requires_wrapping()]
|
|
228
|
+
|
|
229
|
+
def get_context_conditions_requiring_wrapping(self) -> list[OnContextCondition]:
|
|
230
|
+
"""
|
|
231
|
+
Get context conditions that have targets that require wrapping.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
List of context conditions that require wrapping
|
|
235
|
+
"""
|
|
236
|
+
return [condition for condition in self.context_conditions if condition.target_requires_wrapping()]
|
|
237
|
+
|
|
238
|
+
def set_llm_function_names(self) -> None:
|
|
239
|
+
"""
|
|
240
|
+
Set the LLM function names for all LLM conditions, creating unique names for each function.
|
|
241
|
+
"""
|
|
242
|
+
for i, condition in enumerate(self.llm_conditions):
|
|
243
|
+
# Function names are made unique and allow multiple OnCondition's to the same agent
|
|
244
|
+
condition.llm_function_name = f"transfer_to_{condition.target.normalized_name()}_{i + 1}"
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING, Any
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from .context_str import ContextStr
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
# Avoid circular import
|
|
13
|
+
from ..conversable_agent import ConversableAgent
|
|
14
|
+
|
|
15
|
+
__all__ = ["ContextStrLLMCondition", "LLMCondition", "StringLLMCondition"]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class LLMCondition(BaseModel):
|
|
19
|
+
"""Protocol for conditions evaluated by an LLM."""
|
|
20
|
+
|
|
21
|
+
def get_prompt(self, agent: "ConversableAgent", messages: list[dict[str, Any]]) -> str:
|
|
22
|
+
"""Get the prompt text for LLM evaluation.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
agent: The agent evaluating the condition
|
|
26
|
+
messages: The conversation history
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
The prompt text to be evaluated by the LLM
|
|
30
|
+
"""
|
|
31
|
+
raise NotImplementedError("Requires subclasses to implement.")
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class StringLLMCondition(LLMCondition):
|
|
35
|
+
"""Simple string-based LLM condition.
|
|
36
|
+
|
|
37
|
+
This condition provides a static string prompt to be evaluated by an LLM.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
prompt: str
|
|
41
|
+
|
|
42
|
+
def __init__(self, prompt: str, **data: Any) -> None:
|
|
43
|
+
"""Initialize with a prompt string as a positional parameter.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
prompt: The static prompt string to evaluate
|
|
47
|
+
data: Additional data for the parent class
|
|
48
|
+
"""
|
|
49
|
+
super().__init__(prompt=prompt, **data)
|
|
50
|
+
|
|
51
|
+
def get_prompt(self, agent: "ConversableAgent", messages: list[dict[str, Any]]) -> str:
|
|
52
|
+
"""Return the static prompt string.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
agent: The agent evaluating the condition (not used)
|
|
56
|
+
messages: The conversation history (not used)
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
The static prompt string
|
|
60
|
+
"""
|
|
61
|
+
return self.prompt
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ContextStrLLMCondition(LLMCondition):
|
|
65
|
+
"""Context variable-based LLM condition.
|
|
66
|
+
|
|
67
|
+
This condition uses a ContextStr object with context variable placeholders that
|
|
68
|
+
will be substituted before being evaluated by an LLM.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
context_str: ContextStr
|
|
72
|
+
|
|
73
|
+
def __init__(self, context_str: ContextStr, **data: Any) -> None:
|
|
74
|
+
"""Initialize with a context string as a positional parameter.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
context_str: The ContextStr object with variable placeholders
|
|
78
|
+
data: Additional data for the parent class
|
|
79
|
+
"""
|
|
80
|
+
super().__init__(context_str=context_str, **data)
|
|
81
|
+
|
|
82
|
+
def get_prompt(self, agent: "ConversableAgent", messages: list[dict[str, Any]]) -> str:
|
|
83
|
+
"""Return the prompt with context variables substituted.
|
|
84
|
+
|
|
85
|
+
Args:
|
|
86
|
+
agent: The agent evaluating the condition (provides context variables)
|
|
87
|
+
messages: The conversation history (not used)
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
The prompt with context variables substituted
|
|
91
|
+
"""
|
|
92
|
+
result = self.context_str.format(agent.context_variables)
|
|
93
|
+
return result if result is not None else ""
|
|
@@ -0,0 +1,237 @@
|
|
|
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, Union
|
|
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 ..chat import ChatResult
|
|
15
|
+
from .context_variables import ContextVariables
|
|
16
|
+
from .group_utils import cleanup_temp_user_messages
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from ..agent import Agent
|
|
20
|
+
from .patterns.pattern import Pattern
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"a_initiate_group_chat",
|
|
24
|
+
"a_run_group_chat",
|
|
25
|
+
"initiate_group_chat",
|
|
26
|
+
"run_group_chat",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@export_module("autogen")
|
|
31
|
+
def initiate_group_chat(
|
|
32
|
+
pattern: "Pattern",
|
|
33
|
+
messages: Union[list[dict[str, Any]], str],
|
|
34
|
+
max_rounds: int = 20,
|
|
35
|
+
) -> tuple[ChatResult, ContextVariables, "Agent"]:
|
|
36
|
+
"""Initialize and run a group chat using a pattern for configuration.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
pattern: Pattern object that encapsulates the chat configuration.
|
|
40
|
+
messages: Initial message(s).
|
|
41
|
+
max_rounds: Maximum number of conversation rounds.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
ChatResult: Conversations chat history.
|
|
45
|
+
ContextVariables: Updated Context variables.
|
|
46
|
+
"ConversableAgent": Last speaker.
|
|
47
|
+
"""
|
|
48
|
+
# Let the pattern prepare the group chat and all its components
|
|
49
|
+
# Only passing the necessary parameters that aren't already in the pattern
|
|
50
|
+
(
|
|
51
|
+
_, # agents,
|
|
52
|
+
_, # wrapped_agents,
|
|
53
|
+
_, # user_agent,
|
|
54
|
+
context_variables,
|
|
55
|
+
_, # initial_agent,
|
|
56
|
+
_, # group_after_work,
|
|
57
|
+
_, # tool_execution,
|
|
58
|
+
_, # groupchat,
|
|
59
|
+
manager,
|
|
60
|
+
processed_messages,
|
|
61
|
+
last_agent,
|
|
62
|
+
_, # group_agent_names,
|
|
63
|
+
_, # temp_user_list,
|
|
64
|
+
) = pattern.prepare_group_chat(
|
|
65
|
+
max_rounds=max_rounds,
|
|
66
|
+
messages=messages,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Start or resume the conversation
|
|
70
|
+
if len(processed_messages) > 1:
|
|
71
|
+
last_agent, last_message = manager.resume(messages=processed_messages)
|
|
72
|
+
clear_history = False
|
|
73
|
+
else:
|
|
74
|
+
last_message = processed_messages[0]
|
|
75
|
+
clear_history = True
|
|
76
|
+
|
|
77
|
+
if last_agent is None:
|
|
78
|
+
raise ValueError("No agent selected to start the conversation")
|
|
79
|
+
|
|
80
|
+
chat_result = last_agent.initiate_chat(
|
|
81
|
+
manager,
|
|
82
|
+
message=last_message,
|
|
83
|
+
clear_history=clear_history,
|
|
84
|
+
summary_method=pattern.summary_method,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
cleanup_temp_user_messages(chat_result)
|
|
88
|
+
|
|
89
|
+
return chat_result, context_variables, manager.last_speaker
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
@export_module("autogen.agentchat")
|
|
93
|
+
async def a_initiate_group_chat(
|
|
94
|
+
pattern: "Pattern",
|
|
95
|
+
messages: Union[list[dict[str, Any]], str],
|
|
96
|
+
max_rounds: int = 20,
|
|
97
|
+
) -> tuple[ChatResult, ContextVariables, "Agent"]:
|
|
98
|
+
"""Initialize and run a group chat using a pattern for configuration, asynchronously.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
pattern: Pattern object that encapsulates the chat configuration.
|
|
102
|
+
messages: Initial message(s).
|
|
103
|
+
max_rounds: Maximum number of conversation rounds.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
ChatResult: Conversations chat history.
|
|
107
|
+
ContextVariables: Updated Context variables.
|
|
108
|
+
"ConversableAgent": Last speaker.
|
|
109
|
+
"""
|
|
110
|
+
# Let the pattern prepare the group chat and all its components
|
|
111
|
+
# Only passing the necessary parameters that aren't already in the pattern
|
|
112
|
+
(
|
|
113
|
+
_, # agents,
|
|
114
|
+
_, # wrapped_agents,
|
|
115
|
+
_, # user_agent,
|
|
116
|
+
context_variables,
|
|
117
|
+
_, # initial_agent,
|
|
118
|
+
_, # group_after_work,
|
|
119
|
+
_, # tool_execution,
|
|
120
|
+
_, # groupchat,
|
|
121
|
+
manager,
|
|
122
|
+
processed_messages,
|
|
123
|
+
last_agent,
|
|
124
|
+
_, # group_agent_names,
|
|
125
|
+
_, # temp_user_list,
|
|
126
|
+
) = pattern.prepare_group_chat(
|
|
127
|
+
max_rounds=max_rounds,
|
|
128
|
+
messages=messages,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# Start or resume the conversation
|
|
132
|
+
if len(processed_messages) > 1:
|
|
133
|
+
last_agent, last_message = await manager.a_resume(messages=processed_messages)
|
|
134
|
+
clear_history = False
|
|
135
|
+
else:
|
|
136
|
+
last_message = processed_messages[0]
|
|
137
|
+
clear_history = True
|
|
138
|
+
|
|
139
|
+
if last_agent is None:
|
|
140
|
+
raise ValueError("No agent selected to start the conversation")
|
|
141
|
+
|
|
142
|
+
chat_result = await last_agent.a_initiate_chat(
|
|
143
|
+
manager,
|
|
144
|
+
message=last_message, # type: ignore[arg-type]
|
|
145
|
+
clear_history=clear_history,
|
|
146
|
+
summary_method=pattern.summary_method,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
cleanup_temp_user_messages(chat_result)
|
|
150
|
+
|
|
151
|
+
return chat_result, context_variables, manager.last_speaker
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
@export_module("autogen.agentchat")
|
|
155
|
+
def run_group_chat(
|
|
156
|
+
pattern: "Pattern",
|
|
157
|
+
messages: Union[list[dict[str, Any]], str],
|
|
158
|
+
max_rounds: int = 20,
|
|
159
|
+
) -> RunResponseProtocol:
|
|
160
|
+
iostream = ThreadIOStream()
|
|
161
|
+
# todo: add agents
|
|
162
|
+
response = RunResponse(iostream, agents=[])
|
|
163
|
+
|
|
164
|
+
def _initiate_group_chat(
|
|
165
|
+
pattern: "Pattern" = pattern,
|
|
166
|
+
messages: Union[list[dict[str, Any]], str] = messages,
|
|
167
|
+
max_rounds: int = max_rounds,
|
|
168
|
+
iostream: ThreadIOStream = iostream,
|
|
169
|
+
response: RunResponse = response,
|
|
170
|
+
) -> None:
|
|
171
|
+
with IOStream.set_default(iostream):
|
|
172
|
+
try:
|
|
173
|
+
chat_result, context_vars, agent = initiate_group_chat(
|
|
174
|
+
pattern=pattern,
|
|
175
|
+
messages=messages,
|
|
176
|
+
max_rounds=max_rounds,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
IOStream.get_default().send(
|
|
180
|
+
RunCompletionEvent( # type: ignore[call-arg]
|
|
181
|
+
history=chat_result.chat_history,
|
|
182
|
+
summary=chat_result.summary,
|
|
183
|
+
cost=chat_result.cost,
|
|
184
|
+
last_speaker=agent.name,
|
|
185
|
+
context_variables=context_vars,
|
|
186
|
+
)
|
|
187
|
+
)
|
|
188
|
+
except Exception as e:
|
|
189
|
+
response.iostream.send(ErrorEvent(error=e)) # type: ignore[call-arg]
|
|
190
|
+
|
|
191
|
+
threading.Thread(
|
|
192
|
+
target=_initiate_group_chat,
|
|
193
|
+
).start()
|
|
194
|
+
|
|
195
|
+
return response
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
@export_module("autogen.agentchat")
|
|
199
|
+
async def a_run_group_chat(
|
|
200
|
+
pattern: "Pattern",
|
|
201
|
+
messages: Union[list[dict[str, Any]], str],
|
|
202
|
+
max_rounds: int = 20,
|
|
203
|
+
) -> AsyncRunResponseProtocol:
|
|
204
|
+
iostream = AsyncThreadIOStream()
|
|
205
|
+
# todo: add agents
|
|
206
|
+
response = AsyncRunResponse(iostream, agents=[])
|
|
207
|
+
|
|
208
|
+
async def _initiate_group_chat(
|
|
209
|
+
pattern: "Pattern" = pattern,
|
|
210
|
+
messages: Union[list[dict[str, Any]], str] = messages,
|
|
211
|
+
max_rounds: int = max_rounds,
|
|
212
|
+
iostream: AsyncThreadIOStream = iostream,
|
|
213
|
+
response: AsyncRunResponse = response,
|
|
214
|
+
) -> None:
|
|
215
|
+
with IOStream.set_default(iostream):
|
|
216
|
+
try:
|
|
217
|
+
chat_result, context_vars, agent = await a_initiate_group_chat(
|
|
218
|
+
pattern=pattern,
|
|
219
|
+
messages=messages,
|
|
220
|
+
max_rounds=max_rounds,
|
|
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
|
+
asyncio.create_task(_initiate_group_chat())
|
|
236
|
+
|
|
237
|
+
return response
|
|
@@ -0,0 +1,58 @@
|
|
|
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 Optional
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from ...doc_utils import export_module
|
|
10
|
+
from .available_condition import AvailableCondition
|
|
11
|
+
from .llm_condition import LLMCondition
|
|
12
|
+
from .targets.transition_target import TransitionTarget
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"OnCondition",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@export_module("autogen")
|
|
20
|
+
class OnCondition(BaseModel): # noqa: N801
|
|
21
|
+
"""Defines a condition for transitioning to another agent or nested chats.
|
|
22
|
+
|
|
23
|
+
This is for LLM-based condition evaluation where these conditions are translated into tools and attached to the agent.
|
|
24
|
+
|
|
25
|
+
These are evaluated after the OnCondition conditions but before the after work condition.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
target (TransitionTarget): The transition (essentially an agent) to hand off to.
|
|
29
|
+
condition (LLMCondition): The condition for transitioning to the target agent, evaluated by the LLM.
|
|
30
|
+
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.
|
|
31
|
+
llm_function_name (Optional[str]): The name of the LLM function to use for this condition.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
target: TransitionTarget
|
|
35
|
+
condition: LLMCondition
|
|
36
|
+
available: Optional[AvailableCondition] = None
|
|
37
|
+
llm_function_name: Optional[str] = None
|
|
38
|
+
|
|
39
|
+
def has_target_type(self, target_type: type) -> bool:
|
|
40
|
+
"""
|
|
41
|
+
Check if the target type matches the specified type.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
target_type (type): The target type to check against, which should be a subclass of TransitionTarget
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
bool: True if the target type matches, False otherwise
|
|
48
|
+
"""
|
|
49
|
+
return isinstance(self.target, target_type)
|
|
50
|
+
|
|
51
|
+
def target_requires_wrapping(self) -> bool:
|
|
52
|
+
"""
|
|
53
|
+
Check if the target requires wrapping in an agent.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
bool: True if the target requires wrapping, False otherwise
|
|
57
|
+
"""
|
|
58
|
+
return self.target.needs_agent_wrapper()
|
|
@@ -0,0 +1,54 @@
|
|
|
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 Optional
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel
|
|
8
|
+
|
|
9
|
+
from .available_condition import AvailableCondition
|
|
10
|
+
from .context_condition import ContextCondition
|
|
11
|
+
from .targets.transition_target import TransitionTarget
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"OnContextCondition",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class OnContextCondition(BaseModel): # noqa: N801
|
|
19
|
+
"""Defines a condition for transitioning to another agent or nested chats using context variables and the ContextExpression class.
|
|
20
|
+
|
|
21
|
+
This is for context variable-based condition evaluation (does not use the agent's LLM).
|
|
22
|
+
|
|
23
|
+
These are evaluated before the OnCondition and after work conditions.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
target (TransitionTarget): The transition (essentially an agent) to hand off to.
|
|
27
|
+
condition (ContextCondition): The context variable based condition for transitioning to the target agent.
|
|
28
|
+
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.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
target: TransitionTarget
|
|
32
|
+
condition: ContextCondition
|
|
33
|
+
available: Optional[AvailableCondition] = None
|
|
34
|
+
|
|
35
|
+
def has_target_type(self, target_type: type) -> bool:
|
|
36
|
+
"""
|
|
37
|
+
Check if the target type matches the specified type.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
target_type (type): The target type to check against. Should be a subclass of TransitionTarget.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
bool: True if the target type matches, False otherwise
|
|
44
|
+
"""
|
|
45
|
+
return isinstance(self.target, target_type)
|
|
46
|
+
|
|
47
|
+
def target_requires_wrapping(self) -> bool:
|
|
48
|
+
"""
|
|
49
|
+
Check if the target requires wrapping in an agent.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
bool: True if the target requires wrapping, False otherwise
|
|
53
|
+
"""
|
|
54
|
+
return self.target.needs_agent_wrapper()
|