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,413 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
import shutil
|
|
7
|
+
import subprocess
|
|
8
|
+
import sys
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from textwrap import dedent, indent
|
|
12
|
+
from typing import Literal, TypedDict, Union
|
|
13
|
+
|
|
14
|
+
from ..import_utils import optional_import_block, require_optional_import
|
|
15
|
+
|
|
16
|
+
with optional_import_block():
|
|
17
|
+
import yaml
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
EDIT_URL_HTML = """
|
|
21
|
+
<div className="edit-url-container">
|
|
22
|
+
<a className="edit-url" href="https://github.com/ag2ai/ag2/edit/main/{file_path}" target='_blank'><Icon icon="pen" iconType="solid" size="13px"/> Edit this page</a>
|
|
23
|
+
</div>
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
build_system = Literal["mkdocs", "mintlify"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class NavigationGroup(TypedDict):
|
|
30
|
+
group: str
|
|
31
|
+
pages: list[Union[str, "NavigationGroup"]]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def get_git_tracked_and_untracked_files_in_directory(directory: Path) -> list[Path]:
|
|
35
|
+
"""Get all files in the directory that are tracked by git or newly added."""
|
|
36
|
+
proc = subprocess.run(
|
|
37
|
+
["git", "-C", str(directory), "ls-files", "--others", "--exclude-standard", "--cached"],
|
|
38
|
+
capture_output=True,
|
|
39
|
+
text=True,
|
|
40
|
+
check=True,
|
|
41
|
+
)
|
|
42
|
+
return list({directory / p for p in proc.stdout.splitlines()})
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def copy_files(src_dir: Path, dst_dir: Path, files_to_copy: list[Path]) -> None:
|
|
46
|
+
"""Copy files from src_dir to dst_dir."""
|
|
47
|
+
for file in files_to_copy:
|
|
48
|
+
if file.is_file():
|
|
49
|
+
dst = dst_dir / file.relative_to(src_dir)
|
|
50
|
+
dst.parent.mkdir(parents=True, exist_ok=True)
|
|
51
|
+
shutil.copy2(file, dst)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def copy_only_git_tracked_and_untracked_files(src_dir: Path, dst_dir: Path, ignore_dir: str | None = None) -> None:
|
|
55
|
+
"""Copy only the files that are tracked by git or newly added from src_dir to dst_dir."""
|
|
56
|
+
tracked_and_new_files = get_git_tracked_and_untracked_files_in_directory(src_dir)
|
|
57
|
+
|
|
58
|
+
if ignore_dir:
|
|
59
|
+
ignore_dir_rel_path = src_dir / ignore_dir
|
|
60
|
+
|
|
61
|
+
tracked_and_new_files = list({
|
|
62
|
+
file for file in tracked_and_new_files if not any(parent == ignore_dir_rel_path for parent in file.parents)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
copy_files(src_dir, dst_dir, tracked_and_new_files)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def remove_marker_blocks(content: str, marker_prefix: str) -> str:
|
|
69
|
+
"""Remove marker blocks from the content.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
content: The source content to process
|
|
73
|
+
marker_prefix: The marker prefix to identify blocks to remove (without the START/END suffix)
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Processed content with appropriate blocks handled
|
|
77
|
+
"""
|
|
78
|
+
# First, remove blocks with the specified marker completely
|
|
79
|
+
if f"{{/* {marker_prefix}-START */}}" in content:
|
|
80
|
+
pattern = rf"\{{/\* {re.escape(marker_prefix)}-START \*/\}}.*?\{{/\* {re.escape(marker_prefix)}-END \*/\}}"
|
|
81
|
+
content = re.sub(pattern, "", content, flags=re.DOTALL)
|
|
82
|
+
|
|
83
|
+
# Now, remove markers but keep content for the other marker type
|
|
84
|
+
other_prefix = (
|
|
85
|
+
"DELETE-ME-WHILE-BUILDING-MKDOCS"
|
|
86
|
+
if marker_prefix == "DELETE-ME-WHILE-BUILDING-MINTLIFY"
|
|
87
|
+
else "DELETE-ME-WHILE-BUILDING-MINTLIFY"
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Remove start markers
|
|
91
|
+
start_pattern = rf"\{{/\* {re.escape(other_prefix)}-START \*/\}}\s*"
|
|
92
|
+
content = re.sub(start_pattern, "", content)
|
|
93
|
+
|
|
94
|
+
# Remove end markers
|
|
95
|
+
end_pattern = rf"\s*\{{/\* {re.escape(other_prefix)}-END \*/\}}"
|
|
96
|
+
content = re.sub(end_pattern, "", content)
|
|
97
|
+
|
|
98
|
+
# Fix any double newlines that might have been created
|
|
99
|
+
content = re.sub(r"\n\s*\n\s*\n", "\n\n", content)
|
|
100
|
+
|
|
101
|
+
return content
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
# Sort files by parent directory date (if exists) and name
|
|
105
|
+
def sort_files_by_date(file_path: Path) -> tuple[datetime, str]:
|
|
106
|
+
dirname = file_path.parent.name
|
|
107
|
+
try:
|
|
108
|
+
# Extract date from directory name (first 3 parts)
|
|
109
|
+
date_str = "-".join(dirname.split("-")[:3])
|
|
110
|
+
date = datetime.strptime(date_str, "%Y-%m-%d")
|
|
111
|
+
except ValueError:
|
|
112
|
+
date = datetime.min
|
|
113
|
+
return (date, dirname)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def construct_authors_html(authors_list: list[str], authors_dict: dict[str, dict[str, str]], build_system: str) -> str:
|
|
117
|
+
"""Constructs HTML for displaying author cards in a blog.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
authors_list: list of author identifiers
|
|
121
|
+
authors_dict: Dictionary containing author information keyed by author identifier
|
|
122
|
+
build_system: The build system being used (mkdocs or mintlify)
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
str: Formatted HTML string containing author cards
|
|
126
|
+
"""
|
|
127
|
+
if not authors_list:
|
|
128
|
+
return ""
|
|
129
|
+
|
|
130
|
+
card_template_mintlify = """
|
|
131
|
+
<Card href="{url}">
|
|
132
|
+
<div class="col card">
|
|
133
|
+
<div class="img-placeholder">
|
|
134
|
+
<img noZoom src="{avatar}" />
|
|
135
|
+
</div>
|
|
136
|
+
<div>
|
|
137
|
+
<p class="name">{name}</p>
|
|
138
|
+
<p>{description}</p>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</Card>"""
|
|
142
|
+
|
|
143
|
+
card_template_mkdocs = """
|
|
144
|
+
<div class="card">
|
|
145
|
+
<div class="col card">
|
|
146
|
+
<div class="img-placeholder">
|
|
147
|
+
<img noZoom src="{avatar}" />
|
|
148
|
+
</div>
|
|
149
|
+
<div>
|
|
150
|
+
<p class="name">{name}</p>
|
|
151
|
+
<p>{description}</p>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
154
|
+
</div>
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
card_template = card_template_mintlify if build_system == "mintlify" else card_template_mkdocs
|
|
158
|
+
|
|
159
|
+
authors_html = [card_template.format(**authors_dict[author]) for author in authors_list]
|
|
160
|
+
|
|
161
|
+
author_label = "Author:" if len(authors_list) == 1 else "Authors:"
|
|
162
|
+
authors_html_str = indent("".join(authors_html), " ")
|
|
163
|
+
|
|
164
|
+
retval = ""
|
|
165
|
+
if build_system == "mintlify":
|
|
166
|
+
retval = dedent(
|
|
167
|
+
f"""
|
|
168
|
+
<div class="blog-authors">
|
|
169
|
+
<p class="authors">{author_label}</p>
|
|
170
|
+
<CardGroup cols={{2}}>{authors_html_str}
|
|
171
|
+
</CardGroup>
|
|
172
|
+
</div>
|
|
173
|
+
"""
|
|
174
|
+
)
|
|
175
|
+
else:
|
|
176
|
+
retval = dedent(
|
|
177
|
+
f"""
|
|
178
|
+
<div class="blog-authors">
|
|
179
|
+
<p class="authors">{author_label}</p>
|
|
180
|
+
<div class="card-group">
|
|
181
|
+
{authors_html_str}
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
"""
|
|
185
|
+
)
|
|
186
|
+
return retval
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def separate_front_matter_and_content(file_path: Path) -> tuple[str, str]:
|
|
190
|
+
"""Separate front matter and content from a markdown file.
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
file_path (Path): Path to the mdx file
|
|
194
|
+
"""
|
|
195
|
+
content = file_path.read_text(encoding="utf-8")
|
|
196
|
+
|
|
197
|
+
if content.startswith("---"):
|
|
198
|
+
front_matter_end = content.find("---", 3)
|
|
199
|
+
front_matter = content[0 : front_matter_end + 3]
|
|
200
|
+
content = content[front_matter_end + 3 :].strip()
|
|
201
|
+
return front_matter, content
|
|
202
|
+
|
|
203
|
+
return "", content
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def ensure_edit_url(content: str, file_path: Path) -> str:
|
|
207
|
+
"""Ensure editUrl is present in the content.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
content (str): Content of the file
|
|
211
|
+
file_path (Path): Path to the file
|
|
212
|
+
"""
|
|
213
|
+
html_placeholder = [line for line in EDIT_URL_HTML.splitlines() if line.strip() != ""][0]
|
|
214
|
+
if html_placeholder in content:
|
|
215
|
+
return content
|
|
216
|
+
|
|
217
|
+
return content + EDIT_URL_HTML.format(file_path=file_path)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
@require_optional_import("yaml", "docs")
|
|
221
|
+
def add_authors_and_social_preview(
|
|
222
|
+
website_build_dir: Path,
|
|
223
|
+
target_dir: Path,
|
|
224
|
+
all_authors_info: dict[str, dict[str, str]],
|
|
225
|
+
build_system: build_system = "mintlify",
|
|
226
|
+
) -> None:
|
|
227
|
+
"""Add authors info and social share image to mdx files in the target directory."""
|
|
228
|
+
social_img_html = (
|
|
229
|
+
"""\n<div>
|
|
230
|
+
<img noZoom className="social-share-img"
|
|
231
|
+
src="https://media.githubusercontent.com/media/ag2ai/ag2/refs/heads/main/website/static/img/cover.png"
|
|
232
|
+
alt="social preview"
|
|
233
|
+
style={{ position: 'absolute', left: '-9999px' }}
|
|
234
|
+
/>
|
|
235
|
+
</div>"""
|
|
236
|
+
if build_system == "mintlify"
|
|
237
|
+
else ""
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
target_file_extension = "mdx" if build_system == "mintlify" else "md"
|
|
241
|
+
for file_path in target_dir.glob(f"**/*.{target_file_extension}"):
|
|
242
|
+
try:
|
|
243
|
+
front_matter_string, content = separate_front_matter_and_content(file_path)
|
|
244
|
+
|
|
245
|
+
# Convert single author to list and handle authors
|
|
246
|
+
front_matter = yaml.safe_load(front_matter_string[4:-3])
|
|
247
|
+
authors = front_matter.get("authors", [])
|
|
248
|
+
authors_list = [authors] if isinstance(authors, str) else authors
|
|
249
|
+
|
|
250
|
+
# Generate authors HTML
|
|
251
|
+
authors_html = (
|
|
252
|
+
construct_authors_html(authors_list, all_authors_info, build_system)
|
|
253
|
+
if '<div class="blog-authors">' not in content
|
|
254
|
+
else ""
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
# Combine content
|
|
258
|
+
new_content = f"{front_matter_string}\n{social_img_html}\n{authors_html}\n{content}"
|
|
259
|
+
|
|
260
|
+
# ensure editUrl is present
|
|
261
|
+
|
|
262
|
+
if build_system == "mintlify":
|
|
263
|
+
rel_file_path = (
|
|
264
|
+
str(file_path.relative_to(website_build_dir.parent))
|
|
265
|
+
.replace("build/docs/", "website/docs/")
|
|
266
|
+
.replace("website/docs/blog/", "website/docs/_blogs/")
|
|
267
|
+
)
|
|
268
|
+
content_with_edit_url = ensure_edit_url(new_content, Path(rel_file_path))
|
|
269
|
+
|
|
270
|
+
# replace the mkdocs excerpt marker
|
|
271
|
+
content_with_edit_url = content_with_edit_url.replace(r"\<!-- more -->", "")
|
|
272
|
+
|
|
273
|
+
file_path.write_text(f"{content_with_edit_url}\n", encoding="utf-8")
|
|
274
|
+
|
|
275
|
+
else:
|
|
276
|
+
file_path.write_text(f"{new_content}\n", encoding="utf-8")
|
|
277
|
+
|
|
278
|
+
except Exception as e:
|
|
279
|
+
print(f"Error processing {file_path}: {e}")
|
|
280
|
+
continue
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
@require_optional_import("yaml", "docs")
|
|
284
|
+
def get_authors_info(authors_yml: Path) -> dict[str, dict[str, str]]:
|
|
285
|
+
try:
|
|
286
|
+
all_authors_info = yaml.safe_load(authors_yml.read_text(encoding="utf-8"))["authors"]
|
|
287
|
+
except (yaml.YAMLError, OSError) as e:
|
|
288
|
+
print(f"Error reading authors file: {e}")
|
|
289
|
+
sys.exit(1)
|
|
290
|
+
|
|
291
|
+
return all_authors_info # type: ignore [no-any-return]
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
@require_optional_import("yaml", "docs")
|
|
295
|
+
def render_gallery_html(gallery_file_path: Path) -> str:
|
|
296
|
+
"""Renders a gallery of items with tag filtering
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
gallery_file_path: Path to the YAML file containing gallery items
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
HTML string for the gallery
|
|
303
|
+
"""
|
|
304
|
+
try:
|
|
305
|
+
# Load gallery items from YAML file
|
|
306
|
+
with open(gallery_file_path) as file:
|
|
307
|
+
gallery_items = yaml.safe_load(file)
|
|
308
|
+
|
|
309
|
+
# Ensure gallery_items is a list
|
|
310
|
+
if not isinstance(gallery_items, list):
|
|
311
|
+
return f"<div class='error'>Error: YAML file did not contain a list, but a {type(gallery_items)}</div>"
|
|
312
|
+
|
|
313
|
+
# Extract all unique tags from gallery items
|
|
314
|
+
all_tags = []
|
|
315
|
+
for item in gallery_items:
|
|
316
|
+
if not isinstance(item, dict):
|
|
317
|
+
continue
|
|
318
|
+
|
|
319
|
+
if "tags" in item and item["tags"]:
|
|
320
|
+
all_tags.extend(item["tags"])
|
|
321
|
+
all_tags = sorted(set(all_tags))
|
|
322
|
+
|
|
323
|
+
# Generate HTML directly
|
|
324
|
+
html = '<div class="examples-gallery-container">'
|
|
325
|
+
|
|
326
|
+
# Generate tag filter select
|
|
327
|
+
html += '<select multiple class="tag-filter" data-placeholder="Filter by tags">'
|
|
328
|
+
for tag in all_tags:
|
|
329
|
+
html += f'<option value="{tag}">{tag}</option>'
|
|
330
|
+
html += "</select>"
|
|
331
|
+
|
|
332
|
+
# Generate gallery cards
|
|
333
|
+
html += '<div class="gallery-cards">'
|
|
334
|
+
|
|
335
|
+
for item in gallery_items:
|
|
336
|
+
# Skip if item is not a dictionary
|
|
337
|
+
if not isinstance(item, dict):
|
|
338
|
+
continue
|
|
339
|
+
|
|
340
|
+
image_url = item.get("image", "default.png")
|
|
341
|
+
if image_url and not isinstance(image_url, str):
|
|
342
|
+
# Handle case where image is not a string
|
|
343
|
+
image_url = "default.png"
|
|
344
|
+
|
|
345
|
+
if image_url and not image_url.startswith("http"):
|
|
346
|
+
image_url = f"../../../../assets/img/gallery/{image_url}"
|
|
347
|
+
|
|
348
|
+
# Handle default image
|
|
349
|
+
if not image_url:
|
|
350
|
+
image_url = "../../../../assets/img/gallery/default.png"
|
|
351
|
+
|
|
352
|
+
# Tags HTML
|
|
353
|
+
tags_html = ""
|
|
354
|
+
if "tags" in item and item["tags"]:
|
|
355
|
+
tags_html = '<div class="tags-container">'
|
|
356
|
+
for tag in item["tags"]:
|
|
357
|
+
tags_html += f'<span class="tag" data-tag="{tag}">{tag}</span>'
|
|
358
|
+
tags_html += "</div>"
|
|
359
|
+
|
|
360
|
+
# Badges HTML
|
|
361
|
+
badges_html = ""
|
|
362
|
+
notebook_src = item.get("source", None)
|
|
363
|
+
|
|
364
|
+
if notebook_src:
|
|
365
|
+
colab_href = f"https://colab.research.google.com/github/ag2ai/ag2/blob/main/{notebook_src}"
|
|
366
|
+
github_href = f"https://github.com/ag2ai/ag2/blob/main/{notebook_src}"
|
|
367
|
+
badges_html = f"""
|
|
368
|
+
<div class="badges">
|
|
369
|
+
<a style="margin-right: 5px" href="{colab_href}" target="_blank">
|
|
370
|
+
<img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/>
|
|
371
|
+
</a>
|
|
372
|
+
<p class="hidden">{item.get("title", "")}</p>
|
|
373
|
+
<a href="{github_href}" target="_blank">
|
|
374
|
+
<img alt="GitHub" src="https://img.shields.io/badge/Open%20on%20GitHub-grey?logo=github"/>
|
|
375
|
+
</a>
|
|
376
|
+
</div>
|
|
377
|
+
"""
|
|
378
|
+
|
|
379
|
+
# Generate card HTML with safer access to attributes
|
|
380
|
+
tags_str = ",".join(item.get("tags", [])) if isinstance(item.get("tags"), list) else ""
|
|
381
|
+
|
|
382
|
+
# Generate HTML for image tag
|
|
383
|
+
img_tag = (
|
|
384
|
+
f'<img src="{image_url}" alt="{item.get("title", "")}" class="card-image">' if not notebook_src else ""
|
|
385
|
+
)
|
|
386
|
+
|
|
387
|
+
data_link_target = "_self" if notebook_src else "_blank"
|
|
388
|
+
html += f"""
|
|
389
|
+
<div class="card" data-link="{item.get("link", "#")}" data-rel-link="{item.get("rel_link", "#")}" data-tags="{tags_str}" data-link-target="{data_link_target}">
|
|
390
|
+
<div class="card-container">
|
|
391
|
+
{img_tag}
|
|
392
|
+
<p class="card-title">{item.get("title", "")}</p>
|
|
393
|
+
{badges_html}
|
|
394
|
+
<p class="card-description">{item.get("description", item.get("title", ""))}</p>
|
|
395
|
+
{tags_html}
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
"""
|
|
399
|
+
|
|
400
|
+
# Close containers
|
|
401
|
+
html += """
|
|
402
|
+
</div>
|
|
403
|
+
</div>
|
|
404
|
+
"""
|
|
405
|
+
|
|
406
|
+
return html
|
|
407
|
+
|
|
408
|
+
except FileNotFoundError:
|
|
409
|
+
return f"<div class='error'>Error: YAML file not found at path: {gallery_file_path}</div>"
|
|
410
|
+
except yaml.YAMLError:
|
|
411
|
+
return f"<div class='error'>Error: Invalid YAML format in file: {gallery_file_path}</div>"
|
|
412
|
+
except Exception as e:
|
|
413
|
+
return f"<div class='error'>Error: {str(e)}</div>"
|
autogen/a2a/__init__.py
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
try:
|
|
5
|
+
from a2a.types import AgentCard
|
|
6
|
+
except ImportError as e:
|
|
7
|
+
raise ImportError("a2a-sdk is not installed. Please install it with:\npip install ag2[a2a]") from e
|
|
8
|
+
|
|
9
|
+
import warnings
|
|
10
|
+
|
|
11
|
+
warnings.warn(
|
|
12
|
+
(
|
|
13
|
+
"AG2 Implementation for A2A support is in experimental mode "
|
|
14
|
+
"and is subjected to breaking changes. Once it's stable enough the "
|
|
15
|
+
"experimental mode will be removed. Your feedback is welcome."
|
|
16
|
+
),
|
|
17
|
+
ImportWarning,
|
|
18
|
+
stacklevel=2,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
from autogen.remote.httpx_client_factory import HttpxClientFactory
|
|
22
|
+
|
|
23
|
+
from .agent_executor import AutogenAgentExecutor
|
|
24
|
+
from .client import A2aRemoteAgent
|
|
25
|
+
from .httpx_client_factory import MockClient
|
|
26
|
+
from .server import A2aAgentServer, CardSettings
|
|
27
|
+
|
|
28
|
+
__all__ = (
|
|
29
|
+
"A2aAgentServer",
|
|
30
|
+
"A2aRemoteAgent",
|
|
31
|
+
"AgentCard",
|
|
32
|
+
"AutogenAgentExecutor",
|
|
33
|
+
"CardSettings",
|
|
34
|
+
"HttpxClientFactory",
|
|
35
|
+
"MockClient",
|
|
36
|
+
)
|
|
@@ -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
|
+
from datetime import datetime, timezone
|
|
6
|
+
from uuid import uuid4
|
|
7
|
+
|
|
8
|
+
from a2a.server.agent_execution import AgentExecutor, RequestContext
|
|
9
|
+
from a2a.server.events import EventQueue
|
|
10
|
+
from a2a.server.tasks import TaskUpdater
|
|
11
|
+
from a2a.types import InternalError, Task, TaskState, TaskStatus
|
|
12
|
+
from a2a.utils.errors import ServerError
|
|
13
|
+
|
|
14
|
+
from autogen import ConversableAgent
|
|
15
|
+
from autogen.doc_utils import export_module
|
|
16
|
+
from autogen.remote.agent_service import AgentService
|
|
17
|
+
|
|
18
|
+
from .utils import request_message_from_a2a, response_message_to_a2a
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@export_module("autogen.a2a")
|
|
22
|
+
class AutogenAgentExecutor(AgentExecutor):
|
|
23
|
+
"""An agent executor that bridges Autogen ConversableAgents with A2A protocols.
|
|
24
|
+
|
|
25
|
+
This class wraps an Autogen ConversableAgent to enable it to be executed within
|
|
26
|
+
the A2A framework, handling message processing, task management, and event publishing.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self, agent: ConversableAgent) -> None:
|
|
30
|
+
self.agent = AgentService(agent)
|
|
31
|
+
|
|
32
|
+
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
33
|
+
assert context.message
|
|
34
|
+
|
|
35
|
+
task = context.current_task
|
|
36
|
+
if not task:
|
|
37
|
+
request = context.message
|
|
38
|
+
# build task object manually to allow empty messages
|
|
39
|
+
task = Task(
|
|
40
|
+
status=TaskStatus(
|
|
41
|
+
state=TaskState.submitted,
|
|
42
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
43
|
+
),
|
|
44
|
+
id=request.task_id or str(uuid4()),
|
|
45
|
+
context_id=request.context_id or str(uuid4()),
|
|
46
|
+
history=[request],
|
|
47
|
+
)
|
|
48
|
+
# publish the task status submitted event
|
|
49
|
+
await event_queue.enqueue_event(task)
|
|
50
|
+
|
|
51
|
+
updater = TaskUpdater(event_queue, task.id, task.context_id)
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
result = await self.agent(request_message_from_a2a(context.message))
|
|
55
|
+
|
|
56
|
+
except Exception as e:
|
|
57
|
+
raise ServerError(error=InternalError()) from e
|
|
58
|
+
|
|
59
|
+
artifact, messages, input_required_msg = response_message_to_a2a(result, context.context_id, task.id)
|
|
60
|
+
|
|
61
|
+
# publish local chat history events
|
|
62
|
+
for message in messages:
|
|
63
|
+
await updater.update_status(
|
|
64
|
+
state=TaskState.working,
|
|
65
|
+
message=message,
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
# publish input required event
|
|
69
|
+
if input_required_msg:
|
|
70
|
+
await updater.requires_input(message=input_required_msg, final=True)
|
|
71
|
+
return
|
|
72
|
+
|
|
73
|
+
# publish the task final result event
|
|
74
|
+
if artifact:
|
|
75
|
+
await updater.add_artifact(
|
|
76
|
+
artifact_id=artifact.artifact_id,
|
|
77
|
+
name=artifact.name,
|
|
78
|
+
parts=artifact.parts,
|
|
79
|
+
metadata=artifact.metadata,
|
|
80
|
+
extensions=artifact.extensions,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
await updater.complete()
|
|
84
|
+
|
|
85
|
+
async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
86
|
+
pass
|