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,166 @@
|
|
|
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 json
|
|
6
|
+
import logging
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from autogen.import_utils import optional_import_block
|
|
10
|
+
|
|
11
|
+
with optional_import_block() as result:
|
|
12
|
+
from fastapi_code_generator.parser import OpenAPIParser, Operation
|
|
13
|
+
from fastapi_code_generator.visitor import Visitor
|
|
14
|
+
|
|
15
|
+
from pydantic import BaseModel
|
|
16
|
+
|
|
17
|
+
from autogen.agentchat.conversable_agent import ConversableAgent
|
|
18
|
+
from autogen.llm_config import LLMConfig
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Group(BaseModel):
|
|
22
|
+
name: str
|
|
23
|
+
description: str
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class GroupSuggestions(BaseModel):
|
|
27
|
+
groups: list[Group]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class GroupNames(BaseModel):
|
|
31
|
+
groups: list[str]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
logger = logging.getLogger(__name__)
|
|
35
|
+
|
|
36
|
+
GROUP_DISCOVERY_MESSAGE = (
|
|
37
|
+
"You are a senior Python engineer. You will be shown a batch of API functions. "
|
|
38
|
+
"These functions are not guaranteed to be related — your task is to analyze them individually and find meaningful groups *within the batch*.\n\n"
|
|
39
|
+
"You should propose a list of group names, and for each group, provide a short description of the kind of functions it contains.\n\n"
|
|
40
|
+
"How to group:\n"
|
|
41
|
+
"- Focus on what the function operates on — e.g., functions that manipulate a board go in 'board_operations', functions related to users in 'user_management', etc.\n"
|
|
42
|
+
"- Do NOT assume the entire batch forms a single group.\n"
|
|
43
|
+
"- Do NOT use generic categories like 'misc', 'utils', or 'general'.\n"
|
|
44
|
+
"- Favor *granular but meaningful* groups. For instance, 'user_profile_handling' and 'user_authentication' could be separate if their purposes are distinct.\n\n"
|
|
45
|
+
"Formatting:\n"
|
|
46
|
+
"- Group names must be short, descriptive, and in snake_case.\n"
|
|
47
|
+
"- Return a list of group names and a 1-2 sentence description of what each group includes.\n"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
GROUP_ASSIGNMENT_MESSAGE = (
|
|
52
|
+
"You are a senior Python engineer. You will be given a function description "
|
|
53
|
+
"and a list of possible groups. Choose the most suitable groups for the function.\n"
|
|
54
|
+
"- A function can belong to multiple groups.\n"
|
|
55
|
+
"- The groups should be relevant to the function's purpose and functionality.\n"
|
|
56
|
+
"- You MUST choose a group from the possible groups, you cannot respond with empty grouping any equivalent.\n"
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def chunk_list(items: list, size: int) -> list[list]:
|
|
61
|
+
return [items[i : i + size] for i in range(0, len(items), size)]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def discover_groups(operations: list["Operation"], chunk_size: int = 30) -> dict[str, str]:
|
|
65
|
+
llm_config = LLMConfig.get_current_llm_config().copy()
|
|
66
|
+
|
|
67
|
+
for config in llm_config.config_list:
|
|
68
|
+
config.response_format = GroupSuggestions
|
|
69
|
+
|
|
70
|
+
agent = ConversableAgent(
|
|
71
|
+
name="group_discovery_agent",
|
|
72
|
+
system_message=GROUP_DISCOVERY_MESSAGE,
|
|
73
|
+
llm_config=llm_config,
|
|
74
|
+
)
|
|
75
|
+
groups = {}
|
|
76
|
+
|
|
77
|
+
for chunk in chunk_list(operations, chunk_size):
|
|
78
|
+
func_descriptions = [f"- {op.function_name}: {op.summary} (args: {op.arguments})" for op in chunk]
|
|
79
|
+
message = "Here are some functions:\n" + "\n".join(func_descriptions)
|
|
80
|
+
|
|
81
|
+
response = agent.run(message=message, max_turns=1, user_input=False)
|
|
82
|
+
|
|
83
|
+
for event in response.events:
|
|
84
|
+
if event.type == "text" and event.content.sender == "group_discovery_agent":
|
|
85
|
+
# Naively parse "group_name: description" from text block
|
|
86
|
+
new_groups = GroupSuggestions.model_validate_json(event.content.content).groups
|
|
87
|
+
groups.update(new_groups)
|
|
88
|
+
|
|
89
|
+
logger.warning("Discovered groups: %s", groups)
|
|
90
|
+
|
|
91
|
+
# Remove duplicates
|
|
92
|
+
agent = ConversableAgent(
|
|
93
|
+
name="group_refining_agent",
|
|
94
|
+
system_message=GROUP_DISCOVERY_MESSAGE,
|
|
95
|
+
llm_config=llm_config,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
message = (
|
|
99
|
+
"You need to refine the group names and descriptions to ensure they are unique.\n"
|
|
100
|
+
"Here are the groups:\n" + "\n".join([f"- {name}: {desc}" for name, desc in groups.items()])
|
|
101
|
+
)
|
|
102
|
+
response = agent.run(message=message, max_turns=1, user_input=False)
|
|
103
|
+
for event in response.events:
|
|
104
|
+
if event.type == "text" and event.content.sender == "group_refining_agent":
|
|
105
|
+
# Naively parse "group_name: description" from text block
|
|
106
|
+
refined_groups = json.loads(event.content.content)
|
|
107
|
+
|
|
108
|
+
return refined_groups
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def assign_operation_to_group(operation: "Operation", groups: dict[str, str]) -> str:
|
|
112
|
+
llm_config = LLMConfig.get_current_llm_config().copy()
|
|
113
|
+
|
|
114
|
+
for config in llm_config.config_list:
|
|
115
|
+
config.response_format = GroupNames
|
|
116
|
+
|
|
117
|
+
agent = ConversableAgent(
|
|
118
|
+
name="group_assignment_agent",
|
|
119
|
+
system_message=GROUP_ASSIGNMENT_MESSAGE,
|
|
120
|
+
llm_config=llm_config,
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
message = (
|
|
124
|
+
"Function summary:\n"
|
|
125
|
+
f"{operation.summary}\n\n"
|
|
126
|
+
f"Arguments: {operation.arguments}\n\n"
|
|
127
|
+
f"Available groups: {json.dumps(groups)}\n\n"
|
|
128
|
+
"What group should this function go in?"
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
response = agent.run(message=message, max_turns=1, user_input=True)
|
|
132
|
+
|
|
133
|
+
groups = []
|
|
134
|
+
for event in response.events:
|
|
135
|
+
if event.type == "text" and event.content.sender == "group_assignment_agent":
|
|
136
|
+
groups = GroupNames.model_validate_json(event.content.content).groups
|
|
137
|
+
|
|
138
|
+
return groups
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def refine_group_names(groups: dict[str, str]) -> dict[str, str]:
|
|
142
|
+
# Optional: normalize names, merge similar ones (e.g., using embeddings or string similarity)
|
|
143
|
+
# Placeholder for now:
|
|
144
|
+
return groups
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def custom_visitor(parser: "OpenAPIParser", model_path: Path) -> dict[str, object]:
|
|
148
|
+
operations = sorted(parser.operations.values(), key=lambda op: op.path)
|
|
149
|
+
|
|
150
|
+
# ---- PASS 1: DISCOVER GROUPS ----
|
|
151
|
+
logger.warning("Discovering groups...")
|
|
152
|
+
discovered_groups = discover_groups(operations)
|
|
153
|
+
logger.warning("Discovered groups: %s", discovered_groups)
|
|
154
|
+
|
|
155
|
+
# ---- PASS 2: ASSIGN OPERATIONS TO GROUPS ----
|
|
156
|
+
logger.warning("Assigning operations to groups...")
|
|
157
|
+
for op in operations:
|
|
158
|
+
logger.warning("Assigning operation %s to groups...", op.function_name)
|
|
159
|
+
groups = assign_operation_to_group(op, discovered_groups)
|
|
160
|
+
op.tags = groups
|
|
161
|
+
logger.warning("Assigned groups: %s", groups)
|
|
162
|
+
|
|
163
|
+
return {"operations": operations}
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
visit: "Visitor" = custom_visitor
|
|
@@ -0,0 +1,110 @@
|
|
|
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 logging
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
from autogen.import_utils import optional_import_block
|
|
9
|
+
|
|
10
|
+
with optional_import_block() as result:
|
|
11
|
+
from fastapi_code_generator.parser import OpenAPIParser, Operation
|
|
12
|
+
from fastapi_code_generator.visitor import Visitor
|
|
13
|
+
|
|
14
|
+
from autogen.agentchat.conversable_agent import ConversableAgent
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
# System prompt to guide the AI agent in naming functions
|
|
19
|
+
SYSTEM_MESSAGE = (
|
|
20
|
+
"You are a helpful expert Python programmer. Your task is to generate a clear, concise, "
|
|
21
|
+
"and descriptive name for a Python function based on a user-provided summary.\n"
|
|
22
|
+
"- Only return the new function name.\n"
|
|
23
|
+
"- The name must be fewer than 64 characters.\n"
|
|
24
|
+
"- It should reflect the purpose of the function as described.\n"
|
|
25
|
+
"- You will be provided with a list of already-taken names, which must not be reused.\n"
|
|
26
|
+
"- The function name should be in snake_case.\n"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def validate_function_name(name: str, taken_names: list[str]) -> str:
|
|
31
|
+
"""Validate the generated function name against length, format, and uniqueness constraints.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
'exit' if the name is valid, or an error message string otherwise.
|
|
35
|
+
"""
|
|
36
|
+
if len(name) > 64:
|
|
37
|
+
return "Function name is too long. Please provide a shorter name."
|
|
38
|
+
if not name.islower() or " " in name:
|
|
39
|
+
return "Function name must be in snake_case."
|
|
40
|
+
if name in taken_names:
|
|
41
|
+
return f"Function name is already taken. Please provide a different name. Taken names: {', '.join(taken_names)}"
|
|
42
|
+
return "exit"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def get_new_function_name(operation: "Operation", taken_names: list[str]) -> str:
|
|
46
|
+
"""Ask an AI agent to generate a new function name for a given OpenAPI operation.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
operation: The OpenAPI operation that needs renaming.
|
|
50
|
+
taken_names: A list of names already used, to avoid collisions.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
A new, validated function name.
|
|
54
|
+
"""
|
|
55
|
+
agent = ConversableAgent(
|
|
56
|
+
name="helpful_agent",
|
|
57
|
+
system_message=SYSTEM_MESSAGE,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
response = agent.run(
|
|
61
|
+
message=(
|
|
62
|
+
"How would you name this function? \n"
|
|
63
|
+
f"Info:\n"
|
|
64
|
+
f"- old function name: {operation.function_name}\n"
|
|
65
|
+
f"- function summary: {operation.summary}\n"
|
|
66
|
+
f"- function arguments: {operation.arguments}\n"
|
|
67
|
+
),
|
|
68
|
+
user_input=True,
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
proposed_name = None
|
|
72
|
+
|
|
73
|
+
for event in response.events:
|
|
74
|
+
if event.type == "text" and event.content.sender == "helpful_agent":
|
|
75
|
+
proposed_name = event.content.content.strip()
|
|
76
|
+
elif event.type == "input_request":
|
|
77
|
+
reply = (
|
|
78
|
+
validate_function_name(proposed_name, taken_names)
|
|
79
|
+
if proposed_name
|
|
80
|
+
else "Please provide a function name."
|
|
81
|
+
)
|
|
82
|
+
event.content.respond(reply)
|
|
83
|
+
|
|
84
|
+
logger.warning(f"Renamed operation '{operation.function_name}' to '{response.summary}'.")
|
|
85
|
+
return response.summary
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def custom_visitor(parser: "OpenAPIParser", model_path: Path) -> dict[str, object]:
|
|
89
|
+
"""Visits and optionally renames operations in the OpenAPI parser.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
parser: An OpenAPIParser instance containing API operations.
|
|
93
|
+
model_path: Path to the model (not used in this implementation).
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
A dictionary containing the updated list of operations.
|
|
97
|
+
"""
|
|
98
|
+
operations = sorted(parser.operations.values(), key=lambda op: op.path)
|
|
99
|
+
taken_names = []
|
|
100
|
+
|
|
101
|
+
for op in operations:
|
|
102
|
+
if len(op.function_name) > 64:
|
|
103
|
+
new_name = get_new_function_name(op, taken_names)
|
|
104
|
+
op.function_name = new_name
|
|
105
|
+
taken_names.append(op.function_name)
|
|
106
|
+
|
|
107
|
+
return {"operations": operations}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
visit: "Visitor" = custom_visitor
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import logging
|
|
5
|
+
import re
|
|
6
|
+
from functools import cached_property, wraps
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
from ...import_utils import optional_import_block, require_optional_import
|
|
10
|
+
|
|
11
|
+
with optional_import_block():
|
|
12
|
+
import yaml
|
|
13
|
+
|
|
14
|
+
from autogen.import_utils import optional_import_block
|
|
15
|
+
|
|
16
|
+
with optional_import_block() as result:
|
|
17
|
+
from fastapi_code_generator import __main__ as fastapi_code_generator_main
|
|
18
|
+
from fastapi_code_generator.parser import OpenAPIParser, Operation
|
|
19
|
+
|
|
20
|
+
SUCCESFUL_IMPORT = result.is_successful
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def patch_parse_schema() -> None:
|
|
26
|
+
org_parse_schema = OpenAPIParser.parse_schema
|
|
27
|
+
|
|
28
|
+
@wraps(org_parse_schema)
|
|
29
|
+
def my_parse_schema(*args: Any, **kwargs: Any) -> Any:
|
|
30
|
+
data_type = org_parse_schema(*args, **kwargs)
|
|
31
|
+
if data_type.reference and data_type.reference.duplicate_name:
|
|
32
|
+
data_type.reference.name = data_type.reference.duplicate_name
|
|
33
|
+
return data_type
|
|
34
|
+
|
|
35
|
+
OpenAPIParser.parse_schema = my_parse_schema
|
|
36
|
+
logger.info("Patched OpenAPIParser.parse_schema")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def snakecase(string: str) -> str:
|
|
40
|
+
string = re.sub(r"[\-\.\s]", "_", str(string))
|
|
41
|
+
if not string:
|
|
42
|
+
return string
|
|
43
|
+
return string[0].lower() + re.sub(r"[A-Z]", lambda matched: "_" + (matched.group(0)), string[1:]).lower()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def patch_function_name_parsing() -> None:
|
|
47
|
+
def function_name(self: Operation) -> str:
|
|
48
|
+
if self.operationId:
|
|
49
|
+
name: str = re.sub(r"[/{=}]", "_", self.operationId)
|
|
50
|
+
else:
|
|
51
|
+
path = re.sub(r"[/{=]", "_", self.snake_case_path).replace("}", "")
|
|
52
|
+
name = f"{self.type}{path}"
|
|
53
|
+
|
|
54
|
+
return snakecase(name) # type: ignore[no-any-return]
|
|
55
|
+
|
|
56
|
+
Operation.function_name = cached_property(function_name)
|
|
57
|
+
Operation.function_name.__set_name__(Operation, "function_name")
|
|
58
|
+
|
|
59
|
+
logger.info("Patched Operation.function_name")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@require_optional_import(["yaml"], "mcp-proxy-gen")
|
|
63
|
+
def patch_generate_code() -> None:
|
|
64
|
+
# Save reference to the original generate_code function
|
|
65
|
+
org_generate_code = fastapi_code_generator_main.generate_code
|
|
66
|
+
|
|
67
|
+
@wraps(org_generate_code)
|
|
68
|
+
def patched_generate_code(*args: Any, **kwargs: Any) -> Any:
|
|
69
|
+
try:
|
|
70
|
+
input_text: str = kwargs["input_text"]
|
|
71
|
+
|
|
72
|
+
json_spec = yaml.safe_load(input_text)
|
|
73
|
+
|
|
74
|
+
schemas_with_dots = sorted(
|
|
75
|
+
[name for name in json_spec.get("components", {}).get("schemas", {}) if "." in name],
|
|
76
|
+
key=len,
|
|
77
|
+
reverse=True, # Sort by length in descending order
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
for schema_name in schemas_with_dots:
|
|
81
|
+
new_schema_name = schema_name.replace(".", "_")
|
|
82
|
+
input_text = input_text.replace(schema_name, new_schema_name)
|
|
83
|
+
|
|
84
|
+
kwargs["input_text"] = input_text
|
|
85
|
+
|
|
86
|
+
except Exception as e:
|
|
87
|
+
print(
|
|
88
|
+
f"Patched fastapi_code_generator.__main__.generate_code raised: {e}, passing untouched arguments to original generate_code"
|
|
89
|
+
)
|
|
90
|
+
logger.info(
|
|
91
|
+
f"Patched fastapi_code_generator.__main__.generate_code raised: {e}, passing untouched arguments to original generate_code"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
return org_generate_code(*args, **kwargs)
|
|
95
|
+
|
|
96
|
+
fastapi_code_generator_main.generate_code = patched_generate_code
|
|
97
|
+
|
|
98
|
+
logger.info("Patched fastapi_code_generator.__main__.generate_code")
|