ag2 0.10.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ag2-0.10.2.dist-info/METADATA +819 -0
- ag2-0.10.2.dist-info/RECORD +423 -0
- ag2-0.10.2.dist-info/WHEEL +4 -0
- ag2-0.10.2.dist-info/licenses/LICENSE +201 -0
- ag2-0.10.2.dist-info/licenses/NOTICE.md +19 -0
- autogen/__init__.py +88 -0
- autogen/_website/__init__.py +3 -0
- autogen/_website/generate_api_references.py +426 -0
- autogen/_website/generate_mkdocs.py +1216 -0
- autogen/_website/notebook_processor.py +475 -0
- autogen/_website/process_notebooks.py +656 -0
- autogen/_website/utils.py +413 -0
- autogen/a2a/__init__.py +36 -0
- autogen/a2a/agent_executor.py +86 -0
- autogen/a2a/client.py +357 -0
- autogen/a2a/errors.py +18 -0
- autogen/a2a/httpx_client_factory.py +79 -0
- autogen/a2a/server.py +221 -0
- autogen/a2a/utils.py +207 -0
- autogen/agentchat/__init__.py +47 -0
- autogen/agentchat/agent.py +180 -0
- autogen/agentchat/assistant_agent.py +86 -0
- autogen/agentchat/chat.py +325 -0
- autogen/agentchat/contrib/__init__.py +5 -0
- autogen/agentchat/contrib/agent_eval/README.md +7 -0
- autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
- autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
- autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
- autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
- autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
- autogen/agentchat/contrib/agent_eval/task.py +42 -0
- autogen/agentchat/contrib/agent_optimizer.py +432 -0
- autogen/agentchat/contrib/capabilities/__init__.py +5 -0
- autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
- autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
- autogen/agentchat/contrib/capabilities/teachability.py +393 -0
- autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
- autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
- autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
- autogen/agentchat/contrib/capabilities/transforms.py +578 -0
- autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
- autogen/agentchat/contrib/capabilities/vision_capability.py +215 -0
- autogen/agentchat/contrib/captainagent/__init__.py +9 -0
- autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
- autogen/agentchat/contrib/captainagent/captainagent.py +514 -0
- autogen/agentchat/contrib/captainagent/tool_retriever.py +334 -0
- autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
- autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
- autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
- autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
- autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
- autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
- autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
- autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
- autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
- autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
- autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
- autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
- autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
- autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
- autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
- autogen/agentchat/contrib/graph_rag/document.py +29 -0
- autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +167 -0
- autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
- autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
- autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
- autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +263 -0
- autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
- autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
- autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
- autogen/agentchat/contrib/img_utils.py +397 -0
- autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
- autogen/agentchat/contrib/llava_agent.py +189 -0
- autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
- autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
- autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +325 -0
- autogen/agentchat/contrib/rag/__init__.py +10 -0
- autogen/agentchat/contrib/rag/chromadb_query_engine.py +268 -0
- autogen/agentchat/contrib/rag/llamaindex_query_engine.py +195 -0
- autogen/agentchat/contrib/rag/mongodb_query_engine.py +319 -0
- autogen/agentchat/contrib/rag/query_engine.py +76 -0
- autogen/agentchat/contrib/retrieve_assistant_agent.py +59 -0
- autogen/agentchat/contrib/retrieve_user_proxy_agent.py +704 -0
- autogen/agentchat/contrib/society_of_mind_agent.py +200 -0
- autogen/agentchat/contrib/swarm_agent.py +1404 -0
- autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
- autogen/agentchat/contrib/vectordb/__init__.py +5 -0
- autogen/agentchat/contrib/vectordb/base.py +224 -0
- autogen/agentchat/contrib/vectordb/chromadb.py +316 -0
- autogen/agentchat/contrib/vectordb/couchbase.py +405 -0
- autogen/agentchat/contrib/vectordb/mongodb.py +551 -0
- autogen/agentchat/contrib/vectordb/pgvectordb.py +927 -0
- autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
- autogen/agentchat/contrib/vectordb/utils.py +126 -0
- autogen/agentchat/contrib/web_surfer.py +304 -0
- autogen/agentchat/conversable_agent.py +4307 -0
- autogen/agentchat/group/__init__.py +67 -0
- autogen/agentchat/group/available_condition.py +91 -0
- autogen/agentchat/group/context_condition.py +77 -0
- autogen/agentchat/group/context_expression.py +238 -0
- autogen/agentchat/group/context_str.py +39 -0
- autogen/agentchat/group/context_variables.py +182 -0
- autogen/agentchat/group/events/transition_events.py +111 -0
- autogen/agentchat/group/group_tool_executor.py +324 -0
- autogen/agentchat/group/group_utils.py +659 -0
- autogen/agentchat/group/guardrails.py +179 -0
- autogen/agentchat/group/handoffs.py +303 -0
- autogen/agentchat/group/llm_condition.py +93 -0
- autogen/agentchat/group/multi_agent_chat.py +291 -0
- autogen/agentchat/group/on_condition.py +55 -0
- autogen/agentchat/group/on_context_condition.py +51 -0
- autogen/agentchat/group/patterns/__init__.py +18 -0
- autogen/agentchat/group/patterns/auto.py +160 -0
- autogen/agentchat/group/patterns/manual.py +177 -0
- autogen/agentchat/group/patterns/pattern.py +295 -0
- autogen/agentchat/group/patterns/random.py +106 -0
- autogen/agentchat/group/patterns/round_robin.py +117 -0
- autogen/agentchat/group/reply_result.py +24 -0
- autogen/agentchat/group/safeguards/__init__.py +21 -0
- autogen/agentchat/group/safeguards/api.py +241 -0
- autogen/agentchat/group/safeguards/enforcer.py +1158 -0
- autogen/agentchat/group/safeguards/events.py +140 -0
- autogen/agentchat/group/safeguards/validator.py +435 -0
- autogen/agentchat/group/speaker_selection_result.py +41 -0
- autogen/agentchat/group/targets/__init__.py +4 -0
- autogen/agentchat/group/targets/function_target.py +245 -0
- autogen/agentchat/group/targets/group_chat_target.py +133 -0
- autogen/agentchat/group/targets/group_manager_target.py +151 -0
- autogen/agentchat/group/targets/transition_target.py +424 -0
- autogen/agentchat/group/targets/transition_utils.py +6 -0
- autogen/agentchat/groupchat.py +1832 -0
- autogen/agentchat/realtime/__init__.py +3 -0
- autogen/agentchat/realtime/experimental/__init__.py +20 -0
- autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
- autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
- autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
- autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
- autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
- autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
- autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
- autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
- autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
- autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
- autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
- autogen/agentchat/realtime/experimental/clients/realtime_client.py +191 -0
- autogen/agentchat/realtime/experimental/function_observer.py +84 -0
- autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
- autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
- autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
- autogen/agentchat/realtime/experimental/realtime_swarm.py +533 -0
- autogen/agentchat/realtime/experimental/websockets.py +21 -0
- autogen/agentchat/realtime_agent/__init__.py +21 -0
- autogen/agentchat/user_proxy_agent.py +114 -0
- autogen/agentchat/utils.py +206 -0
- autogen/agents/__init__.py +3 -0
- autogen/agents/contrib/__init__.py +10 -0
- autogen/agents/contrib/time/__init__.py +8 -0
- autogen/agents/contrib/time/time_reply_agent.py +74 -0
- autogen/agents/contrib/time/time_tool_agent.py +52 -0
- autogen/agents/experimental/__init__.py +27 -0
- autogen/agents/experimental/deep_research/__init__.py +7 -0
- autogen/agents/experimental/deep_research/deep_research.py +52 -0
- autogen/agents/experimental/discord/__init__.py +7 -0
- autogen/agents/experimental/discord/discord.py +66 -0
- autogen/agents/experimental/document_agent/__init__.py +19 -0
- autogen/agents/experimental/document_agent/chroma_query_engine.py +301 -0
- autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +113 -0
- autogen/agents/experimental/document_agent/document_agent.py +643 -0
- autogen/agents/experimental/document_agent/document_conditions.py +50 -0
- autogen/agents/experimental/document_agent/document_utils.py +376 -0
- autogen/agents/experimental/document_agent/inmemory_query_engine.py +214 -0
- autogen/agents/experimental/document_agent/parser_utils.py +134 -0
- autogen/agents/experimental/document_agent/url_utils.py +417 -0
- autogen/agents/experimental/reasoning/__init__.py +7 -0
- autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
- autogen/agents/experimental/slack/__init__.py +7 -0
- autogen/agents/experimental/slack/slack.py +73 -0
- autogen/agents/experimental/telegram/__init__.py +7 -0
- autogen/agents/experimental/telegram/telegram.py +76 -0
- autogen/agents/experimental/websurfer/__init__.py +7 -0
- autogen/agents/experimental/websurfer/websurfer.py +70 -0
- autogen/agents/experimental/wikipedia/__init__.py +7 -0
- autogen/agents/experimental/wikipedia/wikipedia.py +88 -0
- autogen/browser_utils.py +309 -0
- autogen/cache/__init__.py +10 -0
- autogen/cache/abstract_cache_base.py +71 -0
- autogen/cache/cache.py +203 -0
- autogen/cache/cache_factory.py +88 -0
- autogen/cache/cosmos_db_cache.py +144 -0
- autogen/cache/disk_cache.py +97 -0
- autogen/cache/in_memory_cache.py +54 -0
- autogen/cache/redis_cache.py +119 -0
- autogen/code_utils.py +598 -0
- autogen/coding/__init__.py +30 -0
- autogen/coding/base.py +120 -0
- autogen/coding/docker_commandline_code_executor.py +283 -0
- autogen/coding/factory.py +56 -0
- autogen/coding/func_with_reqs.py +203 -0
- autogen/coding/jupyter/__init__.py +23 -0
- autogen/coding/jupyter/base.py +36 -0
- autogen/coding/jupyter/docker_jupyter_server.py +160 -0
- autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
- autogen/coding/jupyter/import_utils.py +82 -0
- autogen/coding/jupyter/jupyter_client.py +224 -0
- autogen/coding/jupyter/jupyter_code_executor.py +154 -0
- autogen/coding/jupyter/local_jupyter_server.py +164 -0
- autogen/coding/local_commandline_code_executor.py +341 -0
- autogen/coding/markdown_code_extractor.py +44 -0
- autogen/coding/utils.py +55 -0
- autogen/coding/yepcode_code_executor.py +197 -0
- autogen/doc_utils.py +35 -0
- autogen/environments/__init__.py +10 -0
- autogen/environments/docker_python_environment.py +365 -0
- autogen/environments/python_environment.py +125 -0
- autogen/environments/system_python_environment.py +85 -0
- autogen/environments/venv_python_environment.py +220 -0
- autogen/environments/working_directory.py +74 -0
- autogen/events/__init__.py +7 -0
- autogen/events/agent_events.py +1016 -0
- autogen/events/base_event.py +100 -0
- autogen/events/client_events.py +168 -0
- autogen/events/helpers.py +44 -0
- autogen/events/print_event.py +45 -0
- autogen/exception_utils.py +73 -0
- autogen/extensions/__init__.py +5 -0
- autogen/fast_depends/__init__.py +16 -0
- autogen/fast_depends/_compat.py +75 -0
- autogen/fast_depends/core/__init__.py +14 -0
- autogen/fast_depends/core/build.py +206 -0
- autogen/fast_depends/core/model.py +527 -0
- autogen/fast_depends/dependencies/__init__.py +15 -0
- autogen/fast_depends/dependencies/model.py +30 -0
- autogen/fast_depends/dependencies/provider.py +40 -0
- autogen/fast_depends/library/__init__.py +10 -0
- autogen/fast_depends/library/model.py +46 -0
- autogen/fast_depends/py.typed +6 -0
- autogen/fast_depends/schema.py +66 -0
- autogen/fast_depends/use.py +272 -0
- autogen/fast_depends/utils.py +177 -0
- autogen/formatting_utils.py +83 -0
- autogen/function_utils.py +13 -0
- autogen/graph_utils.py +173 -0
- autogen/import_utils.py +539 -0
- autogen/interop/__init__.py +22 -0
- autogen/interop/crewai/__init__.py +7 -0
- autogen/interop/crewai/crewai.py +88 -0
- autogen/interop/interoperability.py +71 -0
- autogen/interop/interoperable.py +46 -0
- autogen/interop/langchain/__init__.py +8 -0
- autogen/interop/langchain/langchain_chat_model_factory.py +156 -0
- autogen/interop/langchain/langchain_tool.py +78 -0
- autogen/interop/litellm/__init__.py +7 -0
- autogen/interop/litellm/litellm_config_factory.py +178 -0
- autogen/interop/pydantic_ai/__init__.py +7 -0
- autogen/interop/pydantic_ai/pydantic_ai.py +172 -0
- autogen/interop/registry.py +70 -0
- autogen/io/__init__.py +15 -0
- autogen/io/base.py +151 -0
- autogen/io/console.py +56 -0
- autogen/io/processors/__init__.py +12 -0
- autogen/io/processors/base.py +21 -0
- autogen/io/processors/console_event_processor.py +61 -0
- autogen/io/run_response.py +294 -0
- autogen/io/thread_io_stream.py +63 -0
- autogen/io/websockets.py +214 -0
- autogen/json_utils.py +42 -0
- autogen/llm_clients/MIGRATION_TO_V2.md +782 -0
- autogen/llm_clients/__init__.py +77 -0
- autogen/llm_clients/client_v2.py +122 -0
- autogen/llm_clients/models/__init__.py +55 -0
- autogen/llm_clients/models/content_blocks.py +389 -0
- autogen/llm_clients/models/unified_message.py +145 -0
- autogen/llm_clients/models/unified_response.py +83 -0
- autogen/llm_clients/openai_completions_client.py +444 -0
- autogen/llm_config/__init__.py +11 -0
- autogen/llm_config/client.py +59 -0
- autogen/llm_config/config.py +461 -0
- autogen/llm_config/entry.py +169 -0
- autogen/llm_config/types.py +37 -0
- autogen/llm_config/utils.py +223 -0
- autogen/logger/__init__.py +11 -0
- autogen/logger/base_logger.py +129 -0
- autogen/logger/file_logger.py +262 -0
- autogen/logger/logger_factory.py +42 -0
- autogen/logger/logger_utils.py +57 -0
- autogen/logger/sqlite_logger.py +524 -0
- autogen/math_utils.py +338 -0
- autogen/mcp/__init__.py +7 -0
- autogen/mcp/__main__.py +78 -0
- autogen/mcp/helpers.py +45 -0
- autogen/mcp/mcp_client.py +349 -0
- autogen/mcp/mcp_proxy/__init__.py +19 -0
- autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +62 -0
- autogen/mcp/mcp_proxy/mcp_proxy.py +577 -0
- autogen/mcp/mcp_proxy/operation_grouping.py +166 -0
- autogen/mcp/mcp_proxy/operation_renaming.py +110 -0
- autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
- autogen/mcp/mcp_proxy/security.py +399 -0
- autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -0
- autogen/messages/__init__.py +7 -0
- autogen/messages/agent_messages.py +946 -0
- autogen/messages/base_message.py +108 -0
- autogen/messages/client_messages.py +172 -0
- autogen/messages/print_message.py +48 -0
- autogen/oai/__init__.py +61 -0
- autogen/oai/anthropic.py +1516 -0
- autogen/oai/bedrock.py +800 -0
- autogen/oai/cerebras.py +302 -0
- autogen/oai/client.py +1658 -0
- autogen/oai/client_utils.py +196 -0
- autogen/oai/cohere.py +494 -0
- autogen/oai/gemini.py +1045 -0
- autogen/oai/gemini_types.py +156 -0
- autogen/oai/groq.py +319 -0
- autogen/oai/mistral.py +311 -0
- autogen/oai/oai_models/__init__.py +23 -0
- autogen/oai/oai_models/_models.py +16 -0
- autogen/oai/oai_models/chat_completion.py +86 -0
- autogen/oai/oai_models/chat_completion_audio.py +32 -0
- autogen/oai/oai_models/chat_completion_message.py +97 -0
- autogen/oai/oai_models/chat_completion_message_tool_call.py +60 -0
- autogen/oai/oai_models/chat_completion_token_logprob.py +62 -0
- autogen/oai/oai_models/completion_usage.py +59 -0
- autogen/oai/ollama.py +657 -0
- autogen/oai/openai_responses.py +451 -0
- autogen/oai/openai_utils.py +897 -0
- autogen/oai/together.py +387 -0
- autogen/remote/__init__.py +18 -0
- autogen/remote/agent.py +199 -0
- autogen/remote/agent_service.py +197 -0
- autogen/remote/errors.py +17 -0
- autogen/remote/httpx_client_factory.py +131 -0
- autogen/remote/protocol.py +37 -0
- autogen/remote/retry.py +102 -0
- autogen/remote/runtime.py +96 -0
- autogen/retrieve_utils.py +490 -0
- autogen/runtime_logging.py +161 -0
- autogen/testing/__init__.py +12 -0
- autogen/testing/messages.py +45 -0
- autogen/testing/test_agent.py +111 -0
- autogen/token_count_utils.py +280 -0
- autogen/tools/__init__.py +20 -0
- autogen/tools/contrib/__init__.py +9 -0
- autogen/tools/contrib/time/__init__.py +7 -0
- autogen/tools/contrib/time/time.py +40 -0
- autogen/tools/dependency_injection.py +249 -0
- autogen/tools/experimental/__init__.py +54 -0
- autogen/tools/experimental/browser_use/__init__.py +7 -0
- autogen/tools/experimental/browser_use/browser_use.py +154 -0
- autogen/tools/experimental/code_execution/__init__.py +7 -0
- autogen/tools/experimental/code_execution/python_code_execution.py +86 -0
- autogen/tools/experimental/crawl4ai/__init__.py +7 -0
- autogen/tools/experimental/crawl4ai/crawl4ai.py +150 -0
- autogen/tools/experimental/deep_research/__init__.py +7 -0
- autogen/tools/experimental/deep_research/deep_research.py +329 -0
- autogen/tools/experimental/duckduckgo/__init__.py +7 -0
- autogen/tools/experimental/duckduckgo/duckduckgo_search.py +103 -0
- autogen/tools/experimental/firecrawl/__init__.py +7 -0
- autogen/tools/experimental/firecrawl/firecrawl_tool.py +836 -0
- autogen/tools/experimental/google/__init__.py +14 -0
- autogen/tools/experimental/google/authentication/__init__.py +11 -0
- autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
- autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
- autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
- autogen/tools/experimental/google/drive/__init__.py +9 -0
- autogen/tools/experimental/google/drive/drive_functions.py +124 -0
- autogen/tools/experimental/google/drive/toolkit.py +88 -0
- autogen/tools/experimental/google/model.py +17 -0
- autogen/tools/experimental/google/toolkit_protocol.py +19 -0
- autogen/tools/experimental/google_search/__init__.py +8 -0
- autogen/tools/experimental/google_search/google_search.py +93 -0
- autogen/tools/experimental/google_search/youtube_search.py +181 -0
- autogen/tools/experimental/messageplatform/__init__.py +17 -0
- autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/discord/discord.py +284 -0
- autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/slack/slack.py +385 -0
- autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/telegram/telegram.py +271 -0
- autogen/tools/experimental/perplexity/__init__.py +7 -0
- autogen/tools/experimental/perplexity/perplexity_search.py +249 -0
- autogen/tools/experimental/reliable/__init__.py +10 -0
- autogen/tools/experimental/reliable/reliable.py +1311 -0
- autogen/tools/experimental/searxng/__init__.py +7 -0
- autogen/tools/experimental/searxng/searxng_search.py +142 -0
- autogen/tools/experimental/tavily/__init__.py +7 -0
- autogen/tools/experimental/tavily/tavily_search.py +176 -0
- autogen/tools/experimental/web_search_preview/__init__.py +7 -0
- autogen/tools/experimental/web_search_preview/web_search_preview.py +120 -0
- autogen/tools/experimental/wikipedia/__init__.py +7 -0
- autogen/tools/experimental/wikipedia/wikipedia.py +284 -0
- autogen/tools/function_utils.py +412 -0
- autogen/tools/tool.py +188 -0
- autogen/tools/toolkit.py +86 -0
- autogen/types.py +29 -0
- autogen/version.py +7 -0
- templates/client_template/main.jinja2 +72 -0
- templates/config_template/config.jinja2 +7 -0
- templates/main.jinja2 +61 -0
|
@@ -0,0 +1,249 @@
|
|
|
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 functools
|
|
6
|
+
import inspect
|
|
7
|
+
import sys
|
|
8
|
+
from abc import ABC
|
|
9
|
+
from collections.abc import Callable, Iterable
|
|
10
|
+
from functools import wraps
|
|
11
|
+
from typing import TYPE_CHECKING, Any, TypeVar, get_type_hints
|
|
12
|
+
|
|
13
|
+
from ..agentchat import Agent
|
|
14
|
+
from ..doc_utils import export_module
|
|
15
|
+
from ..fast_depends import Depends as FastDepends
|
|
16
|
+
from ..fast_depends import inject
|
|
17
|
+
from ..fast_depends.dependencies import model
|
|
18
|
+
from ..fast_depends.utils import is_coroutine_callable
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from ..agentchat.conversable_agent import ConversableAgent
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"BaseContext",
|
|
25
|
+
"ChatContext",
|
|
26
|
+
"Depends",
|
|
27
|
+
"Field",
|
|
28
|
+
"get_context_params",
|
|
29
|
+
"inject_params",
|
|
30
|
+
"on",
|
|
31
|
+
"remove_params",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@export_module("autogen.tools")
|
|
36
|
+
class BaseContext(ABC):
|
|
37
|
+
"""Base class for context classes.
|
|
38
|
+
|
|
39
|
+
This is the base class for defining various context types that may be used
|
|
40
|
+
throughout the application. It serves as a parent for specific context classes.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@export_module("autogen.tools")
|
|
47
|
+
class ChatContext(BaseContext):
|
|
48
|
+
"""ChatContext class that extends BaseContext.
|
|
49
|
+
|
|
50
|
+
This class is used to represent a chat context that holds a list of messages.
|
|
51
|
+
It inherits from `BaseContext` and adds the `messages` attribute.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def __init__(self, agent: "ConversableAgent") -> None:
|
|
55
|
+
"""Initializes the ChatContext with an agent.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
agent: The agent to use for retrieving chat messages.
|
|
59
|
+
"""
|
|
60
|
+
self._agent = agent
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def chat_messages(self) -> dict[Agent, list[dict[Any, Any]]]:
|
|
64
|
+
"""The messages in the chat.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
A dictionary of agents and their messages.
|
|
68
|
+
"""
|
|
69
|
+
return self._agent.chat_messages
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def last_message(self) -> dict[str, Any] | None:
|
|
73
|
+
"""The last message in the chat.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
The last message in the chat.
|
|
77
|
+
"""
|
|
78
|
+
return self._agent.last_message()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
T = TypeVar("T")
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def on(x: T) -> Callable[[], T]:
|
|
85
|
+
def inner(ag2_x: T = x) -> T:
|
|
86
|
+
return ag2_x
|
|
87
|
+
|
|
88
|
+
return inner
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@export_module("autogen.tools")
|
|
92
|
+
def Depends(x: Any) -> Any: # noqa: N802
|
|
93
|
+
"""Creates a dependency for injection based on the provided context or type.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
x: The context or dependency to be injected.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
A FastDepends object that will resolve the dependency for injection.
|
|
100
|
+
"""
|
|
101
|
+
if isinstance(x, BaseContext):
|
|
102
|
+
return FastDepends(lambda: x)
|
|
103
|
+
|
|
104
|
+
return FastDepends(x)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def get_context_params(func: Callable[..., Any], subclass: type[BaseContext] | type[ChatContext]) -> list[str]:
|
|
108
|
+
"""Gets the names of the context parameters in a function signature.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
func: The function to inspect for context parameters.
|
|
112
|
+
subclass: The subclass to search for.
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
A list of parameter names that are instances of the specified subclass.
|
|
116
|
+
"""
|
|
117
|
+
sig = inspect.signature(func)
|
|
118
|
+
return [p.name for p in sig.parameters.values() if _is_context_param(p, subclass=subclass)]
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _is_context_param(param: inspect.Parameter, subclass: type[BaseContext] | type[ChatContext] = BaseContext) -> bool:
|
|
122
|
+
# param.annotation.__args__[0] is used to handle Annotated[MyContext, Depends(MyContext(b=2))]
|
|
123
|
+
param_annotation = param.annotation.__args__[0] if hasattr(param.annotation, "__args__") else param.annotation
|
|
124
|
+
try:
|
|
125
|
+
return isinstance(param_annotation, type) and issubclass(param_annotation, subclass)
|
|
126
|
+
except TypeError:
|
|
127
|
+
return False
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _is_depends_param(param: inspect.Parameter) -> bool:
|
|
131
|
+
return isinstance(param.default, model.Depends) or (
|
|
132
|
+
hasattr(param.annotation, "__metadata__")
|
|
133
|
+
and type(param.annotation.__metadata__) == tuple
|
|
134
|
+
and isinstance(param.annotation.__metadata__[0], model.Depends)
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def remove_params(func: Callable[..., Any], sig: inspect.Signature, params: Iterable[str]) -> None:
|
|
139
|
+
new_signature = sig.replace(parameters=[p for p in sig.parameters.values() if p.name not in params])
|
|
140
|
+
func.__signature__ = new_signature # type: ignore[attr-defined]
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _remove_injected_params_from_signature(func: Callable[..., Any]) -> Callable[..., Any]:
|
|
144
|
+
func = _fix_staticmethod(func)
|
|
145
|
+
sig = inspect.signature(func)
|
|
146
|
+
params_to_remove = [p.name for p in sig.parameters.values() if _is_context_param(p) or _is_depends_param(p)]
|
|
147
|
+
remove_params(func, sig, params_to_remove)
|
|
148
|
+
return func
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class Field:
|
|
152
|
+
"""Represents a description field for use in type annotations.
|
|
153
|
+
|
|
154
|
+
This class is used to store a description for an annotated field, often used for
|
|
155
|
+
documenting or validating fields in a context or data model.
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
def __init__(self, description: str) -> None:
|
|
159
|
+
"""Initializes the Field with a description.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
description: The description text for the field.
|
|
163
|
+
"""
|
|
164
|
+
self._description = description
|
|
165
|
+
|
|
166
|
+
@property
|
|
167
|
+
def description(self) -> str:
|
|
168
|
+
return self._description
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _string_metadata_to_description_field(func: Callable[..., Any]) -> Callable[..., Any]:
|
|
172
|
+
type_hints = get_type_hints(func, include_extras=True)
|
|
173
|
+
|
|
174
|
+
for _, annotation in type_hints.items():
|
|
175
|
+
# Check if the annotation itself has metadata (using __metadata__)
|
|
176
|
+
if hasattr(annotation, "__metadata__"):
|
|
177
|
+
metadata = annotation.__metadata__
|
|
178
|
+
if metadata and isinstance(metadata[0], str):
|
|
179
|
+
# Replace string metadata with Field
|
|
180
|
+
annotation.__metadata__ = (Field(description=metadata[0]),)
|
|
181
|
+
# For Python < 3.11, annotations like `Optional` are stored as `Union`, so metadata
|
|
182
|
+
# would be in the first element of __args__ (e.g., `__args__[0]` for `int` in `Optional[int]`)
|
|
183
|
+
elif hasattr(annotation, "__args__") and hasattr(annotation.__args__[0], "__metadata__"):
|
|
184
|
+
metadata = annotation.__args__[0].__metadata__
|
|
185
|
+
if metadata and isinstance(metadata[0], str):
|
|
186
|
+
# Replace string metadata with Field
|
|
187
|
+
annotation.__args__[0].__metadata__ = (Field(description=metadata[0]),)
|
|
188
|
+
return func
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def _fix_staticmethod(f: Callable[..., Any]) -> Callable[..., Any]:
|
|
192
|
+
# This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
|
|
193
|
+
if sys.version_info >= (3, 9) and isinstance(f, staticmethod) and hasattr(f, "__func__"):
|
|
194
|
+
|
|
195
|
+
@wraps(f.__func__)
|
|
196
|
+
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
197
|
+
return f.__func__(*args, **kwargs) # type: ignore[attr-defined]
|
|
198
|
+
|
|
199
|
+
wrapper.__name__ = f.__func__.__name__
|
|
200
|
+
|
|
201
|
+
f = wrapper
|
|
202
|
+
return f
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def _set_return_annotation_to_any(f: Callable[..., Any]) -> Callable[..., Any]:
|
|
206
|
+
if is_coroutine_callable(f):
|
|
207
|
+
|
|
208
|
+
@functools.wraps(f)
|
|
209
|
+
async def _a_wrapped_func(*args: Any, **kwargs: Any) -> Any:
|
|
210
|
+
return await f(*args, **kwargs)
|
|
211
|
+
|
|
212
|
+
wrapped_func = _a_wrapped_func
|
|
213
|
+
|
|
214
|
+
else:
|
|
215
|
+
|
|
216
|
+
@functools.wraps(f)
|
|
217
|
+
def _wrapped_func(*args: Any, **kwargs: Any) -> Any:
|
|
218
|
+
return f(*args, **kwargs)
|
|
219
|
+
|
|
220
|
+
wrapped_func = _wrapped_func
|
|
221
|
+
|
|
222
|
+
sig = inspect.signature(f)
|
|
223
|
+
|
|
224
|
+
# Change the return annotation directly on the signature of the wrapper
|
|
225
|
+
wrapped_func.__signature__ = sig.replace(return_annotation=Any) # type: ignore[attr-defined]
|
|
226
|
+
|
|
227
|
+
return wrapped_func
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def inject_params(f: Callable[..., Any]) -> Callable[..., Any]:
|
|
231
|
+
"""Injects parameters into a function, removing injected dependencies from its signature.
|
|
232
|
+
|
|
233
|
+
This function is used to modify a function by injecting dependencies and removing
|
|
234
|
+
injected parameters from the function's signature.
|
|
235
|
+
|
|
236
|
+
Args:
|
|
237
|
+
f: The function to modify with dependency injection.
|
|
238
|
+
|
|
239
|
+
Returns:
|
|
240
|
+
The modified function with injected dependencies and updated signature.
|
|
241
|
+
"""
|
|
242
|
+
# This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
|
|
243
|
+
f = _fix_staticmethod(f)
|
|
244
|
+
f = _string_metadata_to_description_field(f)
|
|
245
|
+
f = _set_return_annotation_to_any(f)
|
|
246
|
+
f = inject(f)
|
|
247
|
+
f = _remove_injected_params_from_signature(f)
|
|
248
|
+
|
|
249
|
+
return f
|
|
@@ -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 .browser_use import BrowserUseTool
|
|
6
|
+
from .code_execution import PythonCodeExecutionTool
|
|
7
|
+
from .crawl4ai import Crawl4AITool
|
|
8
|
+
from .deep_research import DeepResearchTool
|
|
9
|
+
from .duckduckgo import DuckDuckGoSearchTool
|
|
10
|
+
from .firecrawl import FirecrawlTool
|
|
11
|
+
from .google_search import GoogleSearchTool, YoutubeSearchTool
|
|
12
|
+
from .messageplatform import (
|
|
13
|
+
DiscordRetrieveTool,
|
|
14
|
+
DiscordSendTool,
|
|
15
|
+
SlackRetrieveRepliesTool,
|
|
16
|
+
SlackRetrieveTool,
|
|
17
|
+
SlackSendTool,
|
|
18
|
+
TelegramRetrieveTool,
|
|
19
|
+
TelegramSendTool,
|
|
20
|
+
)
|
|
21
|
+
from .perplexity import PerplexitySearchTool
|
|
22
|
+
from .reliable import ReliableTool, ReliableToolError, SuccessfulExecutionParameters, ToolExecutionDetails
|
|
23
|
+
from .searxng import SearxngSearchTool
|
|
24
|
+
from .tavily import TavilySearchTool
|
|
25
|
+
from .web_search_preview import WebSearchPreviewTool
|
|
26
|
+
from .wikipedia import WikipediaPageLoadTool, WikipediaQueryRunTool
|
|
27
|
+
|
|
28
|
+
__all__ = [
|
|
29
|
+
"BrowserUseTool",
|
|
30
|
+
"Crawl4AITool",
|
|
31
|
+
"DeepResearchTool",
|
|
32
|
+
"DiscordRetrieveTool",
|
|
33
|
+
"DiscordSendTool",
|
|
34
|
+
"DuckDuckGoSearchTool",
|
|
35
|
+
"FirecrawlTool",
|
|
36
|
+
"GoogleSearchTool",
|
|
37
|
+
"PerplexitySearchTool",
|
|
38
|
+
"PythonCodeExecutionTool",
|
|
39
|
+
"ReliableTool",
|
|
40
|
+
"ReliableToolError",
|
|
41
|
+
"SearxngSearchTool",
|
|
42
|
+
"SlackRetrieveRepliesTool",
|
|
43
|
+
"SlackRetrieveTool",
|
|
44
|
+
"SlackSendTool",
|
|
45
|
+
"SuccessfulExecutionParameters",
|
|
46
|
+
"TavilySearchTool",
|
|
47
|
+
"TelegramRetrieveTool",
|
|
48
|
+
"TelegramSendTool",
|
|
49
|
+
"ToolExecutionDetails",
|
|
50
|
+
"WebSearchPreviewTool",
|
|
51
|
+
"WikipediaPageLoadTool",
|
|
52
|
+
"WikipediaQueryRunTool",
|
|
53
|
+
"YoutubeSearchTool",
|
|
54
|
+
]
|
|
@@ -0,0 +1,7 @@
|
|
|
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 .browser_use import BrowserUseResult, BrowserUseTool, ExtractedContent
|
|
6
|
+
|
|
7
|
+
__all__ = ["BrowserUseResult", "BrowserUseTool", "ExtractedContent"]
|
|
@@ -0,0 +1,154 @@
|
|
|
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 Annotated, Any, Optional
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, field_validator
|
|
8
|
+
|
|
9
|
+
from ....doc_utils import export_module
|
|
10
|
+
from ....import_utils import optional_import_block, require_optional_import
|
|
11
|
+
from ....llm_config import LLMConfig
|
|
12
|
+
from ... import Depends, Tool
|
|
13
|
+
from ...dependency_injection import on
|
|
14
|
+
|
|
15
|
+
with optional_import_block():
|
|
16
|
+
from browser_use import Agent, Controller
|
|
17
|
+
from browser_use.browser.browser import Browser, BrowserConfig
|
|
18
|
+
|
|
19
|
+
from ....interop.langchain.langchain_chat_model_factory import LangChainChatModelFactory
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
__all__ = ["BrowserUseResult", "BrowserUseTool", "ExtractedContent"]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@export_module("autogen.tools.experimental.browser_use")
|
|
26
|
+
class ExtractedContent(BaseModel):
|
|
27
|
+
"""Extracted content from the browser.
|
|
28
|
+
|
|
29
|
+
Attributes:
|
|
30
|
+
content: The extracted content.
|
|
31
|
+
url: The URL of the extracted content
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
content: str
|
|
35
|
+
url: str | None
|
|
36
|
+
|
|
37
|
+
@field_validator("url")
|
|
38
|
+
@classmethod
|
|
39
|
+
def check_url(cls, v: str) -> str | None:
|
|
40
|
+
"""Check if the URL is about:blank and return None if it is.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
v: The URL to check.
|
|
44
|
+
"""
|
|
45
|
+
if v == "about:blank":
|
|
46
|
+
return None
|
|
47
|
+
return v
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@export_module("autogen.tools.experimental.browser_use")
|
|
51
|
+
class BrowserUseResult(BaseModel):
|
|
52
|
+
"""The result of using the browser to perform a task.
|
|
53
|
+
|
|
54
|
+
Attributes:
|
|
55
|
+
extracted_content: List of extracted content.
|
|
56
|
+
final_result: The final result.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
extracted_content: list[ExtractedContent]
|
|
60
|
+
final_result: str | None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@require_optional_import(
|
|
64
|
+
[
|
|
65
|
+
"langchain_anthropic",
|
|
66
|
+
"langchain_google_genai",
|
|
67
|
+
"langchain_ollama",
|
|
68
|
+
"langchain_openai",
|
|
69
|
+
"langchain_core",
|
|
70
|
+
"browser_use",
|
|
71
|
+
],
|
|
72
|
+
"browser-use",
|
|
73
|
+
)
|
|
74
|
+
@export_module("autogen.tools.experimental")
|
|
75
|
+
class BrowserUseTool(Tool):
|
|
76
|
+
"""BrowserUseTool is a tool that uses the browser to perform a task."""
|
|
77
|
+
|
|
78
|
+
def __init__( # type: ignore[no-any-unimported]
|
|
79
|
+
self,
|
|
80
|
+
*,
|
|
81
|
+
llm_config: LLMConfig | dict[str, Any] | None = None,
|
|
82
|
+
browser: Optional["Browser"] = None,
|
|
83
|
+
agent_kwargs: dict[str, Any] | None = None,
|
|
84
|
+
browser_config: dict[str, Any] | None = None,
|
|
85
|
+
):
|
|
86
|
+
"""Use the browser to perform a task.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
llm_config: The LLM configuration. If None, the current LLMConfig from context is used.
|
|
90
|
+
browser: The browser to use. If defined, browser_config must be None
|
|
91
|
+
agent_kwargs: Additional keyword arguments to pass to the Agent
|
|
92
|
+
browser_config: The browser configuration to use. If defined, browser must be None
|
|
93
|
+
"""
|
|
94
|
+
if llm_config is None:
|
|
95
|
+
llm_config = LLMConfig.current
|
|
96
|
+
if agent_kwargs is None:
|
|
97
|
+
agent_kwargs = {}
|
|
98
|
+
if browser_config is None:
|
|
99
|
+
browser_config = {}
|
|
100
|
+
if browser is not None and browser_config:
|
|
101
|
+
raise ValueError(
|
|
102
|
+
f"Cannot provide both browser and additional keyword parameters: {browser=}, {browser_config=}"
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
async def browser_use( # type: ignore[no-any-unimported]
|
|
106
|
+
task: Annotated[str, "The task to perform."],
|
|
107
|
+
llm_config: Annotated[LLMConfig | dict[str, Any], Depends(on(llm_config))],
|
|
108
|
+
browser: Annotated[Browser | None, Depends(on(browser))],
|
|
109
|
+
agent_kwargs: Annotated[dict[str, Any], Depends(on(agent_kwargs))],
|
|
110
|
+
browser_config: Annotated[dict[str, Any], Depends(on(browser_config))],
|
|
111
|
+
) -> BrowserUseResult:
|
|
112
|
+
agent_kwargs = agent_kwargs.copy()
|
|
113
|
+
browser_config = browser_config.copy()
|
|
114
|
+
if browser is None:
|
|
115
|
+
# set default value for headless
|
|
116
|
+
headless = browser_config.pop("headless", True)
|
|
117
|
+
browser_config = BrowserConfig(headless=headless, **browser_config)
|
|
118
|
+
browser = Browser(config=browser_config)
|
|
119
|
+
# set default value for generate_gif
|
|
120
|
+
if "generate_gif" not in agent_kwargs:
|
|
121
|
+
agent_kwargs["generate_gif"] = False
|
|
122
|
+
llm = LangChainChatModelFactory.create_base_chat_model(llm_config)
|
|
123
|
+
max_steps = agent_kwargs.pop("max_steps", 100)
|
|
124
|
+
agent = Agent(
|
|
125
|
+
task=task,
|
|
126
|
+
llm=llm,
|
|
127
|
+
browser=browser,
|
|
128
|
+
controller=BrowserUseTool._get_controller(llm_config),
|
|
129
|
+
**agent_kwargs,
|
|
130
|
+
)
|
|
131
|
+
result = await agent.run(max_steps=max_steps)
|
|
132
|
+
extracted_content = [
|
|
133
|
+
ExtractedContent(content=content, url=url)
|
|
134
|
+
for content, url in zip(result.extracted_content(), result.urls())
|
|
135
|
+
]
|
|
136
|
+
return BrowserUseResult(
|
|
137
|
+
extracted_content=extracted_content,
|
|
138
|
+
final_result=result.final_result(),
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
super().__init__(
|
|
142
|
+
name="browser_use",
|
|
143
|
+
description="Use the browser to perform a task.",
|
|
144
|
+
func_or_tool=browser_use,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
@staticmethod
|
|
148
|
+
def _get_controller(llm_config: LLMConfig | dict[str, Any]) -> Any:
|
|
149
|
+
response_format = (
|
|
150
|
+
llm_config["config_list"][0].get("response_format", None)
|
|
151
|
+
if "config_list" in llm_config
|
|
152
|
+
else llm_config.get("response_format")
|
|
153
|
+
)
|
|
154
|
+
return Controller(output_model=response_format)
|
|
@@ -0,0 +1,86 @@
|
|
|
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 os
|
|
6
|
+
import tempfile
|
|
7
|
+
from typing import Annotated, Any
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, Field
|
|
10
|
+
|
|
11
|
+
from ....doc_utils import export_module
|
|
12
|
+
from ....environments import WorkingDirectory
|
|
13
|
+
from ....environments.python_environment import PythonEnvironment
|
|
14
|
+
from ... import Tool
|
|
15
|
+
|
|
16
|
+
__all__ = ["PythonCodeExecutionTool"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@export_module("autogen.tools.experimental")
|
|
20
|
+
class PythonCodeExecutionTool(Tool):
|
|
21
|
+
"""Executes Python code in a given environment and returns the result."""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
*,
|
|
26
|
+
timeout: int = 30,
|
|
27
|
+
working_directory: WorkingDirectory | None = None,
|
|
28
|
+
python_environment: PythonEnvironment | None = None,
|
|
29
|
+
) -> None:
|
|
30
|
+
"""Initialize the PythonCodeExecutionTool.
|
|
31
|
+
|
|
32
|
+
**CAUTION**: If provided a local environment, this tool will execute code in your local environment, which can be dangerous if the code is untrusted.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
timeout: Maximum execution time allowed in seconds, will raise a TimeoutError exception if exceeded.
|
|
36
|
+
working_directory: Optional WorkingDirectory context manager to use.
|
|
37
|
+
python_environment: Optional PythonEnvironment to use. If None, will auto-detect or create based on other parameters.
|
|
38
|
+
"""
|
|
39
|
+
# Store configuration parameters
|
|
40
|
+
self.timeout = timeout
|
|
41
|
+
self.working_directory = WorkingDirectory.get_current_working_directory(working_directory)
|
|
42
|
+
tool_python_environment = PythonEnvironment.get_current_python_environment(python_environment)
|
|
43
|
+
|
|
44
|
+
assert self.working_directory, "No Working directory found"
|
|
45
|
+
assert tool_python_environment, "No Python environment found"
|
|
46
|
+
|
|
47
|
+
self.python_environment = tool_python_environment
|
|
48
|
+
|
|
49
|
+
# Pydantic model to contain the code and list of libraries to execute
|
|
50
|
+
class CodeExecutionRequest(BaseModel):
|
|
51
|
+
code: Annotated[str, Field(description="Python code to execute")]
|
|
52
|
+
libraries: Annotated[list[str], Field(description="List of libraries to install before execution")]
|
|
53
|
+
|
|
54
|
+
# The tool function, this is what goes to the LLM
|
|
55
|
+
async def execute_python_code(
|
|
56
|
+
code_execution_request: Annotated[CodeExecutionRequest, "Python code and the libraries required"],
|
|
57
|
+
) -> dict[str, Any]:
|
|
58
|
+
"""Executes Python code in the attached environment and returns the result.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
code_execution_request (CodeExecutionRequest): The Python code and libraries to execute
|
|
62
|
+
"""
|
|
63
|
+
code = code_execution_request.code
|
|
64
|
+
|
|
65
|
+
# NOTE: Libraries are not installed (something to consider for future versions)
|
|
66
|
+
|
|
67
|
+
# Prepare a script file path
|
|
68
|
+
script_dir = self._get_script_directory()
|
|
69
|
+
script_path = os.path.join(script_dir, "script.py")
|
|
70
|
+
|
|
71
|
+
# Execute the code
|
|
72
|
+
return await self.python_environment.execute_code(code=code, script_path=script_path, timeout=self.timeout)
|
|
73
|
+
|
|
74
|
+
super().__init__(
|
|
75
|
+
name="python_execute_code",
|
|
76
|
+
description="Executes Python code and returns the result.",
|
|
77
|
+
func_or_tool=execute_python_code,
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
def _get_script_directory(self) -> str:
|
|
81
|
+
"""Get the directory to use for scripts."""
|
|
82
|
+
if self.working_directory and hasattr(self.working_directory, "path") and self.working_directory.path:
|
|
83
|
+
path = self.working_directory.path
|
|
84
|
+
os.makedirs(path, exist_ok=True)
|
|
85
|
+
return path
|
|
86
|
+
return tempfile.mkdtemp(prefix="ag2_script_dir_")
|