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,14 @@
|
|
|
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 .authentication import GoogleCredentialsLocalProvider, GoogleCredentialsProvider
|
|
6
|
+
from .drive import GoogleDriveToolkit
|
|
7
|
+
from .toolkit_protocol import GoogleToolkitProtocol
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"GoogleCredentialsLocalProvider",
|
|
11
|
+
"GoogleCredentialsProvider",
|
|
12
|
+
"GoogleDriveToolkit",
|
|
13
|
+
"GoogleToolkitProtocol",
|
|
14
|
+
]
|
|
@@ -0,0 +1,11 @@
|
|
|
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 .credentials_local_provider import GoogleCredentialsLocalProvider
|
|
6
|
+
from .credentials_provider import GoogleCredentialsProvider
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"GoogleCredentialsLocalProvider",
|
|
10
|
+
"GoogleCredentialsProvider",
|
|
11
|
+
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
from .....doc_utils import export_module
|
|
7
|
+
from .....import_utils import optional_import_block
|
|
8
|
+
from .credentials_provider import GoogleCredentialsProvider
|
|
9
|
+
|
|
10
|
+
with optional_import_block():
|
|
11
|
+
from google.oauth2.credentials import Credentials
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = ["GoogleCredenentialsHostedProvider"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@export_module("autogen.tools.experimental.google.authentication")
|
|
18
|
+
class GoogleCredenentialsHostedProvider(GoogleCredentialsProvider):
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
host: str,
|
|
22
|
+
port: int = 8080,
|
|
23
|
+
*,
|
|
24
|
+
kwargs: dict[str, str],
|
|
25
|
+
) -> None:
|
|
26
|
+
self._host = host
|
|
27
|
+
self._port = port
|
|
28
|
+
self._kwargs = kwargs
|
|
29
|
+
|
|
30
|
+
raise NotImplementedError("This class is not implemented yet.")
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def host(self) -> str:
|
|
34
|
+
"""The host from which to get the credentials."""
|
|
35
|
+
return self._host
|
|
36
|
+
|
|
37
|
+
@property
|
|
38
|
+
def port(self) -> int:
|
|
39
|
+
"""The port from which to get the credentials."""
|
|
40
|
+
return self._port
|
|
41
|
+
|
|
42
|
+
def get_credentials(self) -> "Credentials": # type: ignore[no-any-unimported]
|
|
43
|
+
raise NotImplementedError("This class is not implemented yet.")
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
from typing import Optional
|
|
8
|
+
|
|
9
|
+
from .....doc_utils import export_module
|
|
10
|
+
from .....import_utils import optional_import_block, require_optional_import
|
|
11
|
+
from .credentials_provider import GoogleCredentialsProvider
|
|
12
|
+
|
|
13
|
+
with optional_import_block():
|
|
14
|
+
from google.auth.transport.requests import Request
|
|
15
|
+
from google.oauth2.credentials import Credentials
|
|
16
|
+
from google_auth_oauthlib.flow import InstalledAppFlow
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
__all__ = ["GoogleCredentialsLocalProvider"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@export_module("autogen.tools.experimental.google.authentication")
|
|
23
|
+
class GoogleCredentialsLocalProvider(GoogleCredentialsProvider):
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
client_secret_file: str,
|
|
27
|
+
scopes: list[str], # e.g. ['https://www.googleapis.com/auth/drive/readonly']
|
|
28
|
+
token_file: str | None = None,
|
|
29
|
+
port: int = 8080,
|
|
30
|
+
) -> None:
|
|
31
|
+
"""A Google credentials provider that gets the credentials locally.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
client_secret_file (str): The path to the client secret file.
|
|
35
|
+
scopes (list[str]): The scopes to request.
|
|
36
|
+
token_file (str): Optional path to the token file. If not provided, the token will not be saved.
|
|
37
|
+
port (int): The port from which to get the credentials.
|
|
38
|
+
"""
|
|
39
|
+
self.client_secret_file = client_secret_file
|
|
40
|
+
self.scopes = scopes
|
|
41
|
+
self.token_file = token_file
|
|
42
|
+
self._port = port
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
def host(self) -> str:
|
|
46
|
+
"""Localhost is the default host."""
|
|
47
|
+
return "localhost"
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
def port(self) -> int:
|
|
51
|
+
"""The port from which to get the credentials."""
|
|
52
|
+
return self._port
|
|
53
|
+
|
|
54
|
+
@require_optional_import(
|
|
55
|
+
[
|
|
56
|
+
"google_auth_httplib2",
|
|
57
|
+
"google_auth_oauthlib",
|
|
58
|
+
],
|
|
59
|
+
"google-api",
|
|
60
|
+
)
|
|
61
|
+
def _refresh_or_get_new_credentials(self, creds: Optional["Credentials"]) -> "Credentials": # type: ignore[no-any-unimported]
|
|
62
|
+
if creds and creds.expired and creds.refresh_token:
|
|
63
|
+
creds.refresh(Request()) # type: ignore[no-untyped-call]
|
|
64
|
+
else:
|
|
65
|
+
flow = InstalledAppFlow.from_client_secrets_file(self.client_secret_file, self.scopes)
|
|
66
|
+
creds = flow.run_local_server(host=self.host, port=self.port)
|
|
67
|
+
return creds # type: ignore[return-value]
|
|
68
|
+
|
|
69
|
+
@require_optional_import(
|
|
70
|
+
[
|
|
71
|
+
"google_auth_httplib2",
|
|
72
|
+
"google_auth_oauthlib",
|
|
73
|
+
],
|
|
74
|
+
"google-api",
|
|
75
|
+
)
|
|
76
|
+
def get_credentials(self) -> "Credentials": # type: ignore[no-any-unimported]
|
|
77
|
+
"""Get the Google credentials."""
|
|
78
|
+
creds = None
|
|
79
|
+
if self.token_file and os.path.exists(self.token_file):
|
|
80
|
+
creds = Credentials.from_authorized_user_file(self.token_file) # type: ignore[no-untyped-call]
|
|
81
|
+
|
|
82
|
+
# If there are no (valid) credentials available, let the user log in.
|
|
83
|
+
if not creds or not creds.valid:
|
|
84
|
+
creds = self._refresh_or_get_new_credentials(creds)
|
|
85
|
+
|
|
86
|
+
if self.token_file:
|
|
87
|
+
# Save the credentials for the next run
|
|
88
|
+
with open(self.token_file, "w") as token:
|
|
89
|
+
token.write(creds.to_json()) # type: ignore[no-untyped-call]
|
|
90
|
+
|
|
91
|
+
return creds # type: ignore[no-any-return]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
from typing import Optional, Protocol, runtime_checkable
|
|
7
|
+
|
|
8
|
+
from .....doc_utils import export_module
|
|
9
|
+
from .....import_utils import optional_import_block
|
|
10
|
+
|
|
11
|
+
with optional_import_block():
|
|
12
|
+
from google.oauth2.credentials import Credentials
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__all__ = ["GoogleCredentialsProvider"]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@runtime_checkable
|
|
19
|
+
@export_module("autogen.tools.experimental.google.authentication")
|
|
20
|
+
class GoogleCredentialsProvider(Protocol):
|
|
21
|
+
"""A protocol for Google credentials provider."""
|
|
22
|
+
|
|
23
|
+
def get_credentials(self) -> Optional["Credentials"]: # type: ignore[no-any-unimported]
|
|
24
|
+
"""Get the Google credentials."""
|
|
25
|
+
...
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def host(self) -> str:
|
|
29
|
+
"""The host from which to get the credentials."""
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def port(self) -> int:
|
|
34
|
+
"""The port from which to get the credentials."""
|
|
35
|
+
...
|
|
@@ -0,0 +1,124 @@
|
|
|
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 io
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from .....import_utils import optional_import_block, require_optional_import
|
|
10
|
+
from ..model import GoogleFileInfo
|
|
11
|
+
|
|
12
|
+
with optional_import_block():
|
|
13
|
+
from googleapiclient.http import MediaIoBaseDownload
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"download_file",
|
|
18
|
+
"list_files_and_folders",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@require_optional_import(
|
|
23
|
+
[
|
|
24
|
+
"googleapiclient",
|
|
25
|
+
],
|
|
26
|
+
"google-api",
|
|
27
|
+
)
|
|
28
|
+
def list_files_and_folders(service: Any, page_size: int, folder_id: str | None) -> list[GoogleFileInfo]:
|
|
29
|
+
kwargs = {
|
|
30
|
+
"pageSize": page_size,
|
|
31
|
+
"fields": "nextPageToken, files(id, name, mimeType)",
|
|
32
|
+
}
|
|
33
|
+
if folder_id:
|
|
34
|
+
kwargs["q"] = f"'{folder_id}' in parents and trashed=false" # Search for files in the folder
|
|
35
|
+
response = service.files().list(**kwargs).execute()
|
|
36
|
+
result = response.get("files", [])
|
|
37
|
+
if not isinstance(result, list):
|
|
38
|
+
raise ValueError(f"Expected a list of files, but got {result}")
|
|
39
|
+
result = [GoogleFileInfo(**file_info) for file_info in result]
|
|
40
|
+
return result
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _get_file_extension(mime_type: str) -> str | None:
|
|
44
|
+
"""Returns the correct file extension for a given MIME type."""
|
|
45
|
+
mime_extensions = {
|
|
46
|
+
"application/vnd.google-apps.document": "docx", # Google Docs → Word
|
|
47
|
+
"application/vnd.google-apps.spreadsheet": "csv", # Google Sheets → CSV
|
|
48
|
+
"application/vnd.google-apps.presentation": "pptx", # Google Slides → PowerPoint
|
|
49
|
+
"video/quicktime": "mov",
|
|
50
|
+
"application/vnd.google.colaboratory": "ipynb",
|
|
51
|
+
"application/pdf": "pdf",
|
|
52
|
+
"image/jpeg": "jpg",
|
|
53
|
+
"image/png": "png",
|
|
54
|
+
"text/plain": "txt",
|
|
55
|
+
"application/zip": "zip",
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return mime_extensions.get(mime_type)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@require_optional_import(
|
|
62
|
+
[
|
|
63
|
+
"googleapiclient",
|
|
64
|
+
],
|
|
65
|
+
"google-api",
|
|
66
|
+
)
|
|
67
|
+
def download_file(
|
|
68
|
+
service: Any,
|
|
69
|
+
file_id: str,
|
|
70
|
+
file_name: str,
|
|
71
|
+
mime_type: str,
|
|
72
|
+
download_folder: Path,
|
|
73
|
+
subfolder_path: str | None = None,
|
|
74
|
+
) -> str:
|
|
75
|
+
"""Download or export file based on its MIME type, optionally saving to a subfolder."""
|
|
76
|
+
file_extension = _get_file_extension(mime_type)
|
|
77
|
+
if file_extension and (not file_name.lower().endswith(file_extension.lower())):
|
|
78
|
+
file_name = f"{file_name}.{file_extension}"
|
|
79
|
+
|
|
80
|
+
# Define export formats for Google Docs, Sheets, and Slides
|
|
81
|
+
export_mime_types = {
|
|
82
|
+
"application/vnd.google-apps.document": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", # Google Docs → Word
|
|
83
|
+
"application/vnd.google-apps.spreadsheet": "text/csv", # Google Sheets → CSV
|
|
84
|
+
"application/vnd.google-apps.presentation": "application/vnd.openxmlformats-officedocument.presentationml.presentation", # Google Slides → PowerPoint
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
# Google Docs, Sheets, and Slides cannot be downloaded directly using service.files().get_media() because they are Google-native files
|
|
88
|
+
if mime_type in export_mime_types:
|
|
89
|
+
request = service.files().export(fileId=file_id, mimeType=export_mime_types[mime_type])
|
|
90
|
+
else:
|
|
91
|
+
# Download normal files (videos, images, etc.)
|
|
92
|
+
request = service.files().get_media(fileId=file_id)
|
|
93
|
+
|
|
94
|
+
# Determine the final destination directory
|
|
95
|
+
destination_dir = download_folder
|
|
96
|
+
if subfolder_path:
|
|
97
|
+
destination_dir = download_folder / subfolder_path
|
|
98
|
+
# Ensure the subfolder exists, create it if necessary
|
|
99
|
+
destination_dir.mkdir(parents=True, exist_ok=True)
|
|
100
|
+
|
|
101
|
+
# Construct the full path for the file
|
|
102
|
+
file_path = destination_dir / file_name
|
|
103
|
+
|
|
104
|
+
# Save file
|
|
105
|
+
try:
|
|
106
|
+
with io.BytesIO() as buffer:
|
|
107
|
+
downloader = MediaIoBaseDownload(buffer, request)
|
|
108
|
+
done = False
|
|
109
|
+
while not done:
|
|
110
|
+
_, done = downloader.next_chunk()
|
|
111
|
+
|
|
112
|
+
buffer.seek(0)
|
|
113
|
+
|
|
114
|
+
with open(file_path, "wb") as f:
|
|
115
|
+
f.write(buffer.getvalue())
|
|
116
|
+
|
|
117
|
+
# Print out the relative path of the downloaded file
|
|
118
|
+
relative_path = Path(subfolder_path) / file_name if subfolder_path else Path(file_name)
|
|
119
|
+
return f"✅ Downloaded: {relative_path}"
|
|
120
|
+
|
|
121
|
+
except Exception as e:
|
|
122
|
+
# Error message if unable to download
|
|
123
|
+
relative_path = Path(subfolder_path) / file_name if subfolder_path else Path(file_name)
|
|
124
|
+
return f"❌ FAILED to download {relative_path}: {e}"
|
|
@@ -0,0 +1,88 @@
|
|
|
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 pathlib import Path
|
|
6
|
+
from typing import Annotated, Literal
|
|
7
|
+
|
|
8
|
+
from .....doc_utils import export_module
|
|
9
|
+
from .....import_utils import optional_import_block
|
|
10
|
+
from .... import Toolkit, tool
|
|
11
|
+
from ..model import GoogleFileInfo
|
|
12
|
+
from ..toolkit_protocol import GoogleToolkitProtocol
|
|
13
|
+
from .drive_functions import download_file, list_files_and_folders
|
|
14
|
+
|
|
15
|
+
with optional_import_block():
|
|
16
|
+
from google.oauth2.credentials import Credentials
|
|
17
|
+
from googleapiclient.discovery import build
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"GoogleDriveToolkit",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@export_module("autogen.tools.experimental.google.drive")
|
|
25
|
+
class GoogleDriveToolkit(Toolkit, GoogleToolkitProtocol):
|
|
26
|
+
"""A tool map for Google Drive."""
|
|
27
|
+
|
|
28
|
+
def __init__( # type: ignore[no-any-unimported]
|
|
29
|
+
self,
|
|
30
|
+
*,
|
|
31
|
+
credentials: "Credentials",
|
|
32
|
+
download_folder: Path | str,
|
|
33
|
+
exclude: list[Literal["list_drive_files_and_folders", "download_file_from_drive"]] | None = None,
|
|
34
|
+
api_version: str = "v3",
|
|
35
|
+
) -> None:
|
|
36
|
+
"""Initialize the Google Drive tool map.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
credentials: The Google OAuth2 credentials.
|
|
40
|
+
download_folder: The folder to download files to.
|
|
41
|
+
exclude: The tool names to exclude.
|
|
42
|
+
api_version: The Google Drive API version to use."
|
|
43
|
+
"""
|
|
44
|
+
self.service = build(serviceName="drive", version=api_version, credentials=credentials)
|
|
45
|
+
|
|
46
|
+
if isinstance(download_folder, str):
|
|
47
|
+
download_folder = Path(download_folder)
|
|
48
|
+
download_folder.mkdir(parents=True, exist_ok=True)
|
|
49
|
+
|
|
50
|
+
@tool(description="List files and folders in a Google Drive")
|
|
51
|
+
def list_drive_files_and_folders(
|
|
52
|
+
page_size: Annotated[int, "The number of files to list per page."] = 10,
|
|
53
|
+
folder_id: Annotated[
|
|
54
|
+
str | None,
|
|
55
|
+
"The ID of the folder to list files from. If not provided, lists all files in the root folder.",
|
|
56
|
+
] = None,
|
|
57
|
+
) -> list[GoogleFileInfo]:
|
|
58
|
+
return list_files_and_folders(service=self.service, page_size=page_size, folder_id=folder_id)
|
|
59
|
+
|
|
60
|
+
@tool(description="download a file from Google Drive")
|
|
61
|
+
def download_file_from_drive(
|
|
62
|
+
file_info: Annotated[GoogleFileInfo, "The file info to download."],
|
|
63
|
+
subfolder_path: Annotated[
|
|
64
|
+
str | None,
|
|
65
|
+
"The subfolder path to save the file in. If not provided, saves in the main download folder.",
|
|
66
|
+
] = None,
|
|
67
|
+
) -> str:
|
|
68
|
+
return download_file(
|
|
69
|
+
service=self.service,
|
|
70
|
+
file_id=file_info.id,
|
|
71
|
+
file_name=file_info.name,
|
|
72
|
+
mime_type=file_info.mime_type,
|
|
73
|
+
download_folder=download_folder,
|
|
74
|
+
subfolder_path=subfolder_path,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if exclude is None:
|
|
78
|
+
exclude = []
|
|
79
|
+
|
|
80
|
+
tools = [tool for tool in [list_drive_files_and_folders, download_file_from_drive] if tool.name not in exclude]
|
|
81
|
+
super().__init__(tools=tools)
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def recommended_scopes(cls) -> list[str]:
|
|
85
|
+
"""Return the recommended scopes manatory for using tools from this tool map."""
|
|
86
|
+
return [
|
|
87
|
+
"https://www.googleapis.com/auth/drive.readonly",
|
|
88
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, Field
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"GoogleFileInfo",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class GoogleFileInfo(BaseModel):
|
|
15
|
+
name: Annotated[str, Field(description="The name of the file.")]
|
|
16
|
+
id: Annotated[str, Field(description="The ID of the file.")]
|
|
17
|
+
mime_type: Annotated[str, Field(alias="mimeType", description="The MIME type of the file.")]
|
|
@@ -0,0 +1,19 @@
|
|
|
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 Protocol, runtime_checkable
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"GoogleToolkitProtocol",
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@runtime_checkable
|
|
13
|
+
class GoogleToolkitProtocol(Protocol):
|
|
14
|
+
"""A protocol for Google tool maps."""
|
|
15
|
+
|
|
16
|
+
@classmethod
|
|
17
|
+
def recommended_scopes(cls) -> list[str]:
|
|
18
|
+
"""Defines a required static method without implementation."""
|
|
19
|
+
...
|
|
@@ -0,0 +1,8 @@
|
|
|
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 .google_search import GoogleSearchTool
|
|
6
|
+
from .youtube_search import YoutubeSearchTool
|
|
7
|
+
|
|
8
|
+
__all__ = ["GoogleSearchTool", "YoutubeSearchTool"]
|
|
@@ -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
|
+
|
|
6
|
+
import logging
|
|
7
|
+
from typing import Annotated, Any
|
|
8
|
+
|
|
9
|
+
from ....doc_utils import export_module
|
|
10
|
+
from ....import_utils import optional_import_block, require_optional_import
|
|
11
|
+
from ... import Depends, Tool
|
|
12
|
+
from ...dependency_injection import on
|
|
13
|
+
|
|
14
|
+
with optional_import_block():
|
|
15
|
+
from googleapiclient.discovery import build
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@require_optional_import(
|
|
19
|
+
[
|
|
20
|
+
"googleapiclient",
|
|
21
|
+
],
|
|
22
|
+
"google-search",
|
|
23
|
+
)
|
|
24
|
+
def _execute_query(query: str, search_api_key: str, search_engine_id: str, num_results: int) -> Any:
|
|
25
|
+
service = build("customsearch", "v1", developerKey=search_api_key)
|
|
26
|
+
return service.cse().list(q=query, cx=search_engine_id, num=num_results).execute()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _google_search(
|
|
30
|
+
query: str,
|
|
31
|
+
search_api_key: str,
|
|
32
|
+
search_engine_id: str,
|
|
33
|
+
num_results: int,
|
|
34
|
+
) -> list[dict[str, Any]]:
|
|
35
|
+
res = _execute_query(
|
|
36
|
+
query=query, search_api_key=search_api_key, search_engine_id=search_engine_id, num_results=num_results
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
return [
|
|
40
|
+
{"title": item.get("title", ""), "link": item.get("link", ""), "snippet": item.get("snippet", "")}
|
|
41
|
+
for item in res.get("items", [])
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@export_module("autogen.tools.experimental")
|
|
46
|
+
class GoogleSearchTool(Tool):
|
|
47
|
+
"""GoogleSearchTool is a tool that uses the Google Search API to perform a search."""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self,
|
|
51
|
+
*,
|
|
52
|
+
search_api_key: str | None = None,
|
|
53
|
+
search_engine_id: str | None = None,
|
|
54
|
+
use_internal_llm_tool_if_available: bool = True,
|
|
55
|
+
):
|
|
56
|
+
"""GoogleSearchTool is a tool that uses the Google Search API to perform a search.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
search_api_key: The API key for the Google Search API.
|
|
60
|
+
search_engine_id: The search engine ID for the Google Search API.
|
|
61
|
+
use_internal_llm_tool_if_available: Whether to use the predefined (e.g. Gemini GenaAI) search tool. Currently, this can only be used for agents with the Gemini (GenAI) configuration.
|
|
62
|
+
"""
|
|
63
|
+
self.search_api_key = search_api_key
|
|
64
|
+
self.search_engine_id = search_engine_id
|
|
65
|
+
self.use_internal_llm_tool_if_available = use_internal_llm_tool_if_available
|
|
66
|
+
|
|
67
|
+
if not use_internal_llm_tool_if_available and (search_api_key is None or search_engine_id is None):
|
|
68
|
+
raise ValueError(
|
|
69
|
+
"search_api_key and search_engine_id must be provided if use_internal_llm_tool_if_available is False"
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
if use_internal_llm_tool_if_available and (search_api_key is not None or search_engine_id is not None):
|
|
73
|
+
logging.warning("search_api_key and search_engine_id will be ignored if internal LLM tool is available")
|
|
74
|
+
|
|
75
|
+
def google_search(
|
|
76
|
+
query: Annotated[str, "The search query."],
|
|
77
|
+
search_api_key: Annotated[str | None, Depends(on(search_api_key))],
|
|
78
|
+
search_engine_id: Annotated[str | None, Depends(on(search_engine_id))],
|
|
79
|
+
num_results: Annotated[int, "The number of results to return."] = 10,
|
|
80
|
+
) -> list[dict[str, Any]]:
|
|
81
|
+
if search_api_key is None or search_engine_id is None:
|
|
82
|
+
raise ValueError(
|
|
83
|
+
"Your LLM is not configured to use prebuilt google-search tool.\n"
|
|
84
|
+
"Please provide search_api_key and search_engine_id.\n"
|
|
85
|
+
)
|
|
86
|
+
return _google_search(query, search_api_key, search_engine_id, num_results)
|
|
87
|
+
|
|
88
|
+
super().__init__(
|
|
89
|
+
# GeminiClient will look for a tool with the name "prebuilt_google_search"
|
|
90
|
+
name="prebuilt_google_search" if use_internal_llm_tool_if_available else "google_search",
|
|
91
|
+
description="Use the Google Search API to perform a search.",
|
|
92
|
+
func_or_tool=google_search,
|
|
93
|
+
)
|