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,172 @@
|
|
|
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 warnings
|
|
7
|
+
from collections.abc import Callable
|
|
8
|
+
from functools import wraps
|
|
9
|
+
from inspect import signature
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from ...doc_utils import export_module
|
|
13
|
+
from ...import_utils import optional_import_block, require_optional_import
|
|
14
|
+
from ...tools import Tool
|
|
15
|
+
from ..registry import register_interoperable_class
|
|
16
|
+
|
|
17
|
+
__all__ = ["PydanticAIInteroperability"]
|
|
18
|
+
|
|
19
|
+
with optional_import_block():
|
|
20
|
+
from pydantic_ai import RunContext
|
|
21
|
+
from pydantic_ai.tools import Tool as PydanticAITool
|
|
22
|
+
from pydantic_ai.usage import Usage
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@register_interoperable_class("pydanticai")
|
|
26
|
+
@export_module("autogen.interop")
|
|
27
|
+
class PydanticAIInteroperability:
|
|
28
|
+
"""A class implementing the `Interoperable` protocol for converting Pydantic AI tools
|
|
29
|
+
into a general `Tool` format.
|
|
30
|
+
|
|
31
|
+
This class takes a `PydanticAITool` and converts it into a standard `Tool` object,
|
|
32
|
+
ensuring compatibility between Pydantic AI tools and other systems that expect
|
|
33
|
+
the `Tool` format. It also provides a mechanism for injecting context parameters
|
|
34
|
+
into the tool's function.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
@require_optional_import("pydantic_ai", "interop-pydantic-ai")
|
|
39
|
+
def inject_params(
|
|
40
|
+
ctx: Any,
|
|
41
|
+
tool: Any,
|
|
42
|
+
) -> Callable[..., Any]:
|
|
43
|
+
"""Wraps the tool's function to inject context parameters and handle retries.
|
|
44
|
+
|
|
45
|
+
This method ensures that context parameters are properly passed to the tool
|
|
46
|
+
when invoked and that retries are managed according to the tool's settings.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
ctx (Optional[RunContext[Any]]): The run context, which may include dependencies and retry information.
|
|
50
|
+
tool (PydanticAITool): The Pydantic AI tool whose function is to be wrapped.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
Callable[..., Any]: A wrapped function that includes context injection and retry handling.
|
|
54
|
+
|
|
55
|
+
Raises:
|
|
56
|
+
ValueError: If the tool fails after the maximum number of retries.
|
|
57
|
+
"""
|
|
58
|
+
ctx_typed: RunContext[Any] | None = ctx # type: ignore[no-any-unimported]
|
|
59
|
+
tool_typed: PydanticAITool[Any] = tool # type: ignore[no-any-unimported]
|
|
60
|
+
|
|
61
|
+
max_retries = tool_typed.max_retries if tool_typed.max_retries is not None else 1
|
|
62
|
+
f = tool_typed.function
|
|
63
|
+
|
|
64
|
+
@wraps(f)
|
|
65
|
+
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
66
|
+
current_retry = 0 if ctx_typed is None else ctx_typed.retries.get(tool_typed.name, 0) # type: ignore[attr-defined]
|
|
67
|
+
|
|
68
|
+
if current_retry >= max_retries:
|
|
69
|
+
raise ValueError(f"{tool_typed.name} failed after {max_retries} retries")
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
if ctx_typed is not None:
|
|
73
|
+
kwargs.pop("ctx", None)
|
|
74
|
+
ctx_typed.retry = current_retry
|
|
75
|
+
result = f(**kwargs, ctx=ctx_typed) # type: ignore[call-arg]
|
|
76
|
+
ctx_typed.retries[tool_typed.name] = 0 # type: ignore[attr-defined]
|
|
77
|
+
else:
|
|
78
|
+
result = f(**kwargs) # type: ignore[call-arg]
|
|
79
|
+
except Exception as e:
|
|
80
|
+
if ctx_typed is not None:
|
|
81
|
+
ctx_typed.retries[tool_typed.name] = ctx_typed.retries.get(tool_typed.name, 0) + 1 # type: ignore[attr-defined]
|
|
82
|
+
raise e
|
|
83
|
+
|
|
84
|
+
return result
|
|
85
|
+
|
|
86
|
+
sig = signature(f)
|
|
87
|
+
if ctx_typed is not None:
|
|
88
|
+
new_params = [param for name, param in sig.parameters.items() if name != "ctx"]
|
|
89
|
+
else:
|
|
90
|
+
new_params = list(sig.parameters.values())
|
|
91
|
+
|
|
92
|
+
wrapper.__signature__ = sig.replace(parameters=new_params) # type: ignore[attr-defined]
|
|
93
|
+
|
|
94
|
+
return wrapper
|
|
95
|
+
|
|
96
|
+
@classmethod
|
|
97
|
+
@require_optional_import("pydantic_ai", "interop-pydantic-ai")
|
|
98
|
+
def convert_tool(cls, tool: Any, deps: Any = None, **kwargs: Any) -> Tool:
|
|
99
|
+
"""Converts a given Pydantic AI tool into a general `Tool` format.
|
|
100
|
+
|
|
101
|
+
This method verifies that the provided tool is a valid `PydanticAITool`,
|
|
102
|
+
handles context dependencies if necessary, and returns a standardized `Tool` object.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
tool (Any): The tool to convert, expected to be an instance of `PydanticAITool`.
|
|
106
|
+
deps (Any, optional): The dependencies to inject into the context, required if
|
|
107
|
+
the tool takes a context. Defaults to None.
|
|
108
|
+
**kwargs (Any): Additional arguments that are not used in this method.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Tool: A standardized `Tool` object converted from the Pydantic AI tool.
|
|
112
|
+
|
|
113
|
+
Raises:
|
|
114
|
+
ValueError: If the provided tool is not an instance of `PydanticAITool`, or if
|
|
115
|
+
dependencies are missing for tools that require a context.
|
|
116
|
+
UserWarning: If the `deps` argument is provided for a tool that does not take a context.
|
|
117
|
+
"""
|
|
118
|
+
if not isinstance(tool, PydanticAITool):
|
|
119
|
+
raise ValueError(f"Expected an instance of `pydantic_ai.tools.Tool`, got {type(tool)}")
|
|
120
|
+
|
|
121
|
+
# needed for type checking
|
|
122
|
+
pydantic_ai_tool: PydanticAITool[Any] = tool # type: ignore[no-any-unimported]
|
|
123
|
+
|
|
124
|
+
if tool.takes_ctx and deps is None:
|
|
125
|
+
raise ValueError("If the tool takes a context, the `deps` argument must be provided")
|
|
126
|
+
if not tool.takes_ctx and deps is not None:
|
|
127
|
+
warnings.warn(
|
|
128
|
+
"The `deps` argument is provided but will be ignored because the tool does not take a context.",
|
|
129
|
+
UserWarning,
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
ctx = (
|
|
133
|
+
RunContext(
|
|
134
|
+
model=None, # type: ignore [arg-type]
|
|
135
|
+
usage=Usage(),
|
|
136
|
+
prompt="",
|
|
137
|
+
deps=deps,
|
|
138
|
+
retry=0,
|
|
139
|
+
# All messages send to or returned by a model.
|
|
140
|
+
# This is mostly used on pydantic_ai Agent level.
|
|
141
|
+
messages=[], # TODO: check in the future if this is needed on Tool level
|
|
142
|
+
tool_name=pydantic_ai_tool.name,
|
|
143
|
+
)
|
|
144
|
+
if tool.takes_ctx
|
|
145
|
+
else None
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Initialize retries dict for tracking retry counts per tool
|
|
149
|
+
if ctx is not None:
|
|
150
|
+
ctx.retries = {} # type: ignore[attr-defined]
|
|
151
|
+
|
|
152
|
+
func = PydanticAIInteroperability.inject_params(
|
|
153
|
+
ctx=ctx,
|
|
154
|
+
tool=pydantic_ai_tool,
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
return Tool(
|
|
158
|
+
name=pydantic_ai_tool.name,
|
|
159
|
+
description=pydantic_ai_tool.description,
|
|
160
|
+
func_or_tool=func,
|
|
161
|
+
parameters_json_schema=pydantic_ai_tool.function_schema.json_schema, # type: ignore[attr-defined]
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
@classmethod
|
|
165
|
+
def get_unsupported_reason(cls) -> str | None:
|
|
166
|
+
with optional_import_block() as result:
|
|
167
|
+
import pydantic_ai.tools # noqa: F401
|
|
168
|
+
|
|
169
|
+
if not result.is_successful:
|
|
170
|
+
return "Please install `interop-pydantic-ai` extra to use this module:\n\n\tpip install ag2[interop-pydantic-ai]"
|
|
171
|
+
|
|
172
|
+
return None
|
|
@@ -0,0 +1,70 @@
|
|
|
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 collections.abc import Callable
|
|
6
|
+
from typing import TypeVar
|
|
7
|
+
|
|
8
|
+
from ..doc_utils import export_module
|
|
9
|
+
from .interoperable import Interoperable
|
|
10
|
+
|
|
11
|
+
__all__ = ["InteroperableRegistry", "register_interoperable_class"]
|
|
12
|
+
|
|
13
|
+
InteroperableClass = TypeVar("InteroperableClass", bound=type[Interoperable])
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class InteroperableRegistry:
|
|
17
|
+
def __init__(self) -> None:
|
|
18
|
+
self._registry: dict[str, type[Interoperable]] = {}
|
|
19
|
+
|
|
20
|
+
def register(self, short_name: str, cls: InteroperableClass) -> InteroperableClass:
|
|
21
|
+
if short_name in self._registry:
|
|
22
|
+
raise ValueError(f"Duplicate registration for {short_name}")
|
|
23
|
+
|
|
24
|
+
self._registry[short_name] = cls
|
|
25
|
+
|
|
26
|
+
return cls
|
|
27
|
+
|
|
28
|
+
def get_short_names(self) -> list[str]:
|
|
29
|
+
return sorted(self._registry.keys())
|
|
30
|
+
|
|
31
|
+
def get_supported_types(self) -> list[str]:
|
|
32
|
+
short_names = self.get_short_names()
|
|
33
|
+
supported_types = [name for name in short_names if self._registry[name].get_unsupported_reason() is None]
|
|
34
|
+
return supported_types
|
|
35
|
+
|
|
36
|
+
def get_class(self, short_name: str) -> type[Interoperable]:
|
|
37
|
+
return self._registry[short_name]
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def get_instance(cls) -> "InteroperableRegistry":
|
|
41
|
+
return _register
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# global registry
|
|
45
|
+
_register = InteroperableRegistry()
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# register decorator
|
|
49
|
+
@export_module("autogen.interop")
|
|
50
|
+
def register_interoperable_class(short_name: str) -> Callable[[InteroperableClass], InteroperableClass]:
|
|
51
|
+
"""Register an Interoperable class in the global registry.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
Callable[[InteroperableClass], InteroperableClass]: Decorator function
|
|
55
|
+
|
|
56
|
+
Example:
|
|
57
|
+
```python
|
|
58
|
+
@register_interoperable_class("myinterop")
|
|
59
|
+
class MyInteroperability(Interoperable):
|
|
60
|
+
def convert_tool(self, tool: Any) -> Tool:
|
|
61
|
+
# implementation
|
|
62
|
+
...
|
|
63
|
+
```
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
def inner(cls: InteroperableClass) -> InteroperableClass:
|
|
67
|
+
global _register
|
|
68
|
+
return _register.register(short_name, cls)
|
|
69
|
+
|
|
70
|
+
return inner
|
autogen/io/__init__.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
from .base import IOStream, InputStream, OutputStream
|
|
8
|
+
from .console import IOConsole
|
|
9
|
+
from .websockets import IOWebsockets
|
|
10
|
+
|
|
11
|
+
# Set the default input/output stream to the console
|
|
12
|
+
IOStream.set_global_default(IOConsole())
|
|
13
|
+
IOStream.set_default(IOConsole())
|
|
14
|
+
|
|
15
|
+
__all__ = ("IOConsole", "IOStream", "IOWebsockets", "InputStream", "OutputStream")
|
autogen/io/base.py
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
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
|
+
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
import logging
|
|
8
|
+
from collections.abc import Iterator
|
|
9
|
+
from contextlib import contextmanager
|
|
10
|
+
from contextvars import ContextVar
|
|
11
|
+
from typing import Any, Protocol, runtime_checkable
|
|
12
|
+
|
|
13
|
+
from ..doc_utils import export_module
|
|
14
|
+
from ..events.base_event import BaseEvent
|
|
15
|
+
|
|
16
|
+
__all__ = ("IOStream", "InputStream", "OutputStream")
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@runtime_checkable
|
|
22
|
+
@export_module("autogen.io")
|
|
23
|
+
class OutputStream(Protocol):
|
|
24
|
+
def print(self, *objects: Any, sep: str = " ", end: str = "\n", flush: bool = False) -> None:
|
|
25
|
+
"""Print data to the output stream.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
objects (any): The data to print.
|
|
29
|
+
sep (str, optional): The separator between objects. Defaults to " ".
|
|
30
|
+
end (str, optional): The end of the output. Defaults to "\n".
|
|
31
|
+
flush (bool, optional): Whether to flush the output. Defaults to False.
|
|
32
|
+
"""
|
|
33
|
+
... # pragma: no cover
|
|
34
|
+
|
|
35
|
+
def send(self, message: BaseEvent) -> None:
|
|
36
|
+
"""Send data to the output stream.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
message (BaseEvent): BaseEvent from autogen.messages.base_message
|
|
40
|
+
"""
|
|
41
|
+
...
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@runtime_checkable
|
|
45
|
+
@export_module("autogen.io")
|
|
46
|
+
class InputStream(Protocol):
|
|
47
|
+
def input(self, prompt: str = "", *, password: bool = False) -> str:
|
|
48
|
+
"""Read a line from the input stream.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
prompt (str, optional): The prompt to display. Defaults to "".
|
|
52
|
+
password (bool, optional): Whether to read a password. Defaults to False.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
str: The line read from the input stream.
|
|
56
|
+
|
|
57
|
+
"""
|
|
58
|
+
... # pragma: no cover
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@runtime_checkable
|
|
62
|
+
@export_module("autogen.io")
|
|
63
|
+
class AsyncInputStream(Protocol):
|
|
64
|
+
async def input(self, prompt: str = "", *, password: bool = False) -> str:
|
|
65
|
+
"""Read a line from the input stream.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
prompt (str, optional): The prompt to display. Defaults to "".
|
|
69
|
+
password (bool, optional): Whether to read a password. Defaults to False.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
str: The line read from the input stream.
|
|
73
|
+
|
|
74
|
+
"""
|
|
75
|
+
... # pragma: no cover
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
@runtime_checkable
|
|
79
|
+
@export_module("autogen.io")
|
|
80
|
+
class IOStreamProtocol(InputStream, OutputStream, Protocol):
|
|
81
|
+
"""A protocol for input/output streams."""
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@runtime_checkable
|
|
85
|
+
@export_module("autogen.io")
|
|
86
|
+
class AsyncIOStreamProtocol(AsyncInputStream, OutputStream, Protocol):
|
|
87
|
+
"""A protocol for input/output streams."""
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
iostream_union = IOStreamProtocol | AsyncIOStreamProtocol
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
@export_module("autogen.io")
|
|
94
|
+
class IOStream:
|
|
95
|
+
"""A protocol for input/output streams."""
|
|
96
|
+
|
|
97
|
+
# ContextVar must be used in multithreaded or async environments
|
|
98
|
+
_default_io_stream: ContextVar[iostream_union | None] = ContextVar("default_iostream", default=None)
|
|
99
|
+
_default_io_stream.set(None)
|
|
100
|
+
_global_default: iostream_union | None = None
|
|
101
|
+
|
|
102
|
+
@staticmethod
|
|
103
|
+
def set_global_default(stream: iostream_union) -> None:
|
|
104
|
+
"""Set the default input/output stream.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
stream (IOStream): The input/output stream to set as the default.
|
|
108
|
+
"""
|
|
109
|
+
IOStream._global_default = stream
|
|
110
|
+
|
|
111
|
+
@staticmethod
|
|
112
|
+
def get_global_default() -> iostream_union:
|
|
113
|
+
"""Get the default input/output stream.
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
IOStream: The default input/output stream.
|
|
117
|
+
"""
|
|
118
|
+
if IOStream._global_default is None:
|
|
119
|
+
raise RuntimeError("No global default IOStream has been set")
|
|
120
|
+
return IOStream._global_default
|
|
121
|
+
|
|
122
|
+
@staticmethod
|
|
123
|
+
def get_default() -> iostream_union:
|
|
124
|
+
"""Get the default input/output stream.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
IOStream: The default input/output stream.
|
|
128
|
+
"""
|
|
129
|
+
iostream = IOStream._default_io_stream.get()
|
|
130
|
+
if iostream is None:
|
|
131
|
+
iostream = IOStream.get_global_default()
|
|
132
|
+
# Set the default IOStream of the current context (thread/cooroutine)
|
|
133
|
+
IOStream.set_default(iostream)
|
|
134
|
+
return iostream
|
|
135
|
+
|
|
136
|
+
@staticmethod
|
|
137
|
+
@contextmanager
|
|
138
|
+
def set_default(stream: iostream_union | None) -> Iterator[None]:
|
|
139
|
+
"""Set the default input/output stream.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
stream (IOStream): The input/output stream to set as the default.
|
|
143
|
+
"""
|
|
144
|
+
global _default_io_stream
|
|
145
|
+
try:
|
|
146
|
+
token = IOStream._default_io_stream.set(stream)
|
|
147
|
+
yield
|
|
148
|
+
finally:
|
|
149
|
+
IOStream._default_io_stream.reset(token)
|
|
150
|
+
|
|
151
|
+
return
|
autogen/io/console.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
import getpass
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
from ..doc_utils import export_module
|
|
11
|
+
from ..events.base_event import BaseEvent
|
|
12
|
+
from ..events.print_event import PrintEvent
|
|
13
|
+
from .base import IOStream
|
|
14
|
+
|
|
15
|
+
__all__ = ("IOConsole",)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@export_module("autogen.io")
|
|
19
|
+
class IOConsole(IOStream):
|
|
20
|
+
"""A console input/output stream."""
|
|
21
|
+
|
|
22
|
+
def print(self, *objects: Any, sep: str = " ", end: str = "\n", flush: bool = False) -> None:
|
|
23
|
+
"""Print data to the output stream.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
objects (any): The data to print.
|
|
27
|
+
sep (str, optional): The separator between objects. Defaults to " ".
|
|
28
|
+
end (str, optional): The end of the output. Defaults to "\n".
|
|
29
|
+
flush (bool, optional): Whether to flush the output. Defaults to False.
|
|
30
|
+
"""
|
|
31
|
+
print_message = PrintEvent(*objects, sep=sep, end=end)
|
|
32
|
+
self.send(print_message)
|
|
33
|
+
# print(*objects, sep=sep, end=end, flush=flush)
|
|
34
|
+
|
|
35
|
+
def send(self, message: BaseEvent) -> None:
|
|
36
|
+
"""Send a message to the output stream.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
message (Any): The message to send.
|
|
40
|
+
"""
|
|
41
|
+
message.print()
|
|
42
|
+
|
|
43
|
+
def input(self, prompt: str = "", *, password: bool = False) -> str:
|
|
44
|
+
"""Read a line from the input stream.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
prompt (str, optional): The prompt to display. Defaults to "".
|
|
48
|
+
password (bool, optional): Whether to read a password. Defaults to False.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
str: The line read from the input stream.
|
|
52
|
+
|
|
53
|
+
"""
|
|
54
|
+
if password:
|
|
55
|
+
return getpass.getpass(prompt if prompt != "" else "Password: ")
|
|
56
|
+
return input(prompt)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
from .base import AsyncEventProcessorProtocol, EventProcessorProtocol
|
|
5
|
+
from .console_event_processor import AsyncConsoleEventProcessor, ConsoleEventProcessor
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"AsyncConsoleEventProcessor",
|
|
9
|
+
"AsyncEventProcessorProtocol",
|
|
10
|
+
"ConsoleEventProcessor",
|
|
11
|
+
"EventProcessorProtocol",
|
|
12
|
+
]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
from typing import TYPE_CHECKING, Protocol
|
|
5
|
+
|
|
6
|
+
from ...doc_utils import export_module
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from ..run_response import AsyncRunResponseProtocol, RunResponseProtocol
|
|
10
|
+
|
|
11
|
+
__all__ = ["AsyncEventProcessorProtocol", "EventProcessorProtocol"]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@export_module("autogen.io")
|
|
15
|
+
class EventProcessorProtocol(Protocol):
|
|
16
|
+
def process(self, response: "RunResponseProtocol") -> None: ...
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@export_module("autogen.io")
|
|
20
|
+
class AsyncEventProcessorProtocol(Protocol):
|
|
21
|
+
async def process(self, response: "AsyncRunResponseProtocol") -> None: ...
|
|
@@ -0,0 +1,61 @@
|
|
|
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 asyncio
|
|
5
|
+
import getpass
|
|
6
|
+
from typing import TYPE_CHECKING
|
|
7
|
+
|
|
8
|
+
from ...doc_utils import export_module
|
|
9
|
+
from ...events.agent_events import InputRequestEvent
|
|
10
|
+
from ...events.base_event import BaseEvent
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from ..run_response import AsyncRunResponseProtocol, RunResponseProtocol
|
|
14
|
+
from .base import AsyncEventProcessorProtocol, EventProcessorProtocol
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@export_module("autogen.io")
|
|
18
|
+
class ConsoleEventProcessor:
|
|
19
|
+
def process(self, response: "RunResponseProtocol") -> None:
|
|
20
|
+
for event in response.events:
|
|
21
|
+
self.process_event(event)
|
|
22
|
+
|
|
23
|
+
def process_event(self, event: BaseEvent) -> None:
|
|
24
|
+
if isinstance(event, InputRequestEvent):
|
|
25
|
+
prompt = event.content.prompt # type: ignore[attr-defined]
|
|
26
|
+
if event.content.password: # type: ignore[attr-defined]
|
|
27
|
+
result = getpass.getpass(prompt if prompt != "" else "Password: ")
|
|
28
|
+
else:
|
|
29
|
+
result = input(prompt)
|
|
30
|
+
event.content.respond(result) # type: ignore[attr-defined]
|
|
31
|
+
else:
|
|
32
|
+
event.print()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@export_module("autogen.io")
|
|
36
|
+
class AsyncConsoleEventProcessor:
|
|
37
|
+
async def process(self, response: "AsyncRunResponseProtocol") -> None:
|
|
38
|
+
async for event in response.events:
|
|
39
|
+
await self.process_event(event)
|
|
40
|
+
|
|
41
|
+
async def process_event(self, event: BaseEvent) -> None:
|
|
42
|
+
if isinstance(event, InputRequestEvent):
|
|
43
|
+
prompt = event.content.prompt # type: ignore[attr-defined]
|
|
44
|
+
|
|
45
|
+
if event.content.password: # type: ignore[attr-defined]
|
|
46
|
+
result = await asyncio.to_thread(getpass.getpass, prompt if prompt != "" else "Password: ")
|
|
47
|
+
else:
|
|
48
|
+
result = await asyncio.to_thread(input, prompt)
|
|
49
|
+
|
|
50
|
+
await event.content.respond(result) # type: ignore[attr-defined]
|
|
51
|
+
else:
|
|
52
|
+
event.print()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if TYPE_CHECKING:
|
|
56
|
+
|
|
57
|
+
def check_type_1(x: ConsoleEventProcessor) -> EventProcessorProtocol:
|
|
58
|
+
return x
|
|
59
|
+
|
|
60
|
+
def check_type_2(x: AsyncConsoleEventProcessor) -> AsyncEventProcessorProtocol:
|
|
61
|
+
return x
|