ag2 0.9.1__py3-none-any.whl → 0.9.1.post0__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.
Potentially problematic release.
This version of ag2 might be problematic. Click here for more details.
- {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info}/METADATA +264 -73
- ag2-0.9.1.post0.dist-info/RECORD +392 -0
- {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info}/WHEEL +1 -2
- autogen/__init__.py +89 -0
- autogen/_website/__init__.py +3 -0
- autogen/_website/generate_api_references.py +427 -0
- autogen/_website/generate_mkdocs.py +1174 -0
- autogen/_website/notebook_processor.py +476 -0
- autogen/_website/process_notebooks.py +656 -0
- autogen/_website/utils.py +412 -0
- autogen/agentchat/__init__.py +44 -0
- autogen/agentchat/agent.py +182 -0
- autogen/agentchat/assistant_agent.py +85 -0
- autogen/agentchat/chat.py +309 -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 +429 -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 +566 -0
- autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
- autogen/agentchat/contrib/capabilities/vision_capability.py +214 -0
- autogen/agentchat/contrib/captainagent/__init__.py +9 -0
- autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
- autogen/agentchat/contrib/captainagent/captainagent.py +512 -0
- autogen/agentchat/contrib/captainagent/tool_retriever.py +335 -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 +170 -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 +268 -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 +187 -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 +324 -0
- autogen/agentchat/contrib/rag/__init__.py +10 -0
- autogen/agentchat/contrib/rag/chromadb_query_engine.py +272 -0
- autogen/agentchat/contrib/rag/llamaindex_query_engine.py +198 -0
- autogen/agentchat/contrib/rag/mongodb_query_engine.py +329 -0
- autogen/agentchat/contrib/rag/query_engine.py +74 -0
- autogen/agentchat/contrib/retrieve_assistant_agent.py +56 -0
- autogen/agentchat/contrib/retrieve_user_proxy_agent.py +703 -0
- autogen/agentchat/contrib/society_of_mind_agent.py +199 -0
- autogen/agentchat/contrib/swarm_agent.py +1425 -0
- autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
- autogen/agentchat/contrib/vectordb/__init__.py +5 -0
- autogen/agentchat/contrib/vectordb/base.py +232 -0
- autogen/agentchat/contrib/vectordb/chromadb.py +315 -0
- autogen/agentchat/contrib/vectordb/couchbase.py +407 -0
- autogen/agentchat/contrib/vectordb/mongodb.py +550 -0
- autogen/agentchat/contrib/vectordb/pgvectordb.py +928 -0
- autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
- autogen/agentchat/contrib/vectordb/utils.py +126 -0
- autogen/agentchat/contrib/web_surfer.py +303 -0
- autogen/agentchat/conversable_agent.py +4020 -0
- autogen/agentchat/group/__init__.py +64 -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 +41 -0
- autogen/agentchat/group/context_variables.py +192 -0
- autogen/agentchat/group/group_tool_executor.py +202 -0
- autogen/agentchat/group/group_utils.py +591 -0
- autogen/agentchat/group/handoffs.py +244 -0
- autogen/agentchat/group/llm_condition.py +93 -0
- autogen/agentchat/group/multi_agent_chat.py +237 -0
- autogen/agentchat/group/on_condition.py +58 -0
- autogen/agentchat/group/on_context_condition.py +54 -0
- autogen/agentchat/group/patterns/__init__.py +18 -0
- autogen/agentchat/group/patterns/auto.py +159 -0
- autogen/agentchat/group/patterns/manual.py +176 -0
- autogen/agentchat/group/patterns/pattern.py +288 -0
- autogen/agentchat/group/patterns/random.py +106 -0
- autogen/agentchat/group/patterns/round_robin.py +117 -0
- autogen/agentchat/group/reply_result.py +26 -0
- autogen/agentchat/group/speaker_selection_result.py +41 -0
- autogen/agentchat/group/targets/__init__.py +4 -0
- autogen/agentchat/group/targets/group_chat_target.py +132 -0
- autogen/agentchat/group/targets/group_manager_target.py +151 -0
- autogen/agentchat/group/targets/transition_target.py +413 -0
- autogen/agentchat/group/targets/transition_utils.py +6 -0
- autogen/agentchat/groupchat.py +1694 -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 +190 -0
- autogen/agentchat/realtime/experimental/function_observer.py +85 -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 +475 -0
- autogen/agentchat/realtime/experimental/websockets.py +21 -0
- autogen/agentchat/realtime_agent/__init__.py +21 -0
- autogen/agentchat/user_proxy_agent.py +111 -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 +73 -0
- autogen/agents/contrib/time/time_tool_agent.py +51 -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 +316 -0
- autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +118 -0
- autogen/agents/experimental/document_agent/document_agent.py +461 -0
- autogen/agents/experimental/document_agent/document_conditions.py +50 -0
- autogen/agents/experimental/document_agent/document_utils.py +380 -0
- autogen/agents/experimental/document_agent/inmemory_query_engine.py +220 -0
- autogen/agents/experimental/document_agent/parser_utils.py +130 -0
- autogen/agents/experimental/document_agent/url_utils.py +426 -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 +77 -0
- autogen/agents/experimental/websurfer/__init__.py +7 -0
- autogen/agents/experimental/websurfer/websurfer.py +62 -0
- autogen/agents/experimental/wikipedia/__init__.py +7 -0
- autogen/agents/experimental/wikipedia/wikipedia.py +90 -0
- autogen/browser_utils.py +309 -0
- autogen/cache/__init__.py +10 -0
- autogen/cache/abstract_cache_base.py +75 -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 +102 -0
- autogen/cache/in_memory_cache.py +58 -0
- autogen/cache/redis_cache.py +123 -0
- autogen/code_utils.py +596 -0
- autogen/coding/__init__.py +22 -0
- autogen/coding/base.py +119 -0
- autogen/coding/docker_commandline_code_executor.py +268 -0
- autogen/coding/factory.py +47 -0
- autogen/coding/func_with_reqs.py +202 -0
- autogen/coding/jupyter/__init__.py +23 -0
- autogen/coding/jupyter/base.py +36 -0
- autogen/coding/jupyter/docker_jupyter_server.py +167 -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 +231 -0
- autogen/coding/jupyter/jupyter_code_executor.py +160 -0
- autogen/coding/jupyter/local_jupyter_server.py +172 -0
- autogen/coding/local_commandline_code_executor.py +405 -0
- autogen/coding/markdown_code_extractor.py +45 -0
- autogen/coding/utils.py +56 -0
- autogen/doc_utils.py +34 -0
- autogen/events/__init__.py +7 -0
- autogen/events/agent_events.py +1010 -0
- autogen/events/base_event.py +99 -0
- autogen/events/client_events.py +167 -0
- autogen/events/helpers.py +36 -0
- autogen/events/print_event.py +46 -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 +80 -0
- autogen/fast_depends/core/__init__.py +14 -0
- autogen/fast_depends/core/build.py +225 -0
- autogen/fast_depends/core/model.py +576 -0
- autogen/fast_depends/dependencies/__init__.py +15 -0
- autogen/fast_depends/dependencies/model.py +29 -0
- autogen/fast_depends/dependencies/provider.py +39 -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 +280 -0
- autogen/fast_depends/utils.py +187 -0
- autogen/formatting_utils.py +83 -0
- autogen/function_utils.py +13 -0
- autogen/graph_utils.py +178 -0
- autogen/import_utils.py +526 -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 +155 -0
- autogen/interop/langchain/langchain_tool.py +82 -0
- autogen/interop/litellm/__init__.py +7 -0
- autogen/interop/litellm/litellm_config_factory.py +113 -0
- autogen/interop/pydantic_ai/__init__.py +7 -0
- autogen/interop/pydantic_ai/pydantic_ai.py +168 -0
- autogen/interop/registry.py +69 -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 +56 -0
- autogen/io/run_response.py +293 -0
- autogen/io/thread_io_stream.py +63 -0
- autogen/io/websockets.py +213 -0
- autogen/json_utils.py +43 -0
- autogen/llm_config.py +379 -0
- autogen/logger/__init__.py +11 -0
- autogen/logger/base_logger.py +128 -0
- autogen/logger/file_logger.py +261 -0
- autogen/logger/logger_factory.py +42 -0
- autogen/logger/logger_utils.py +57 -0
- autogen/logger/sqlite_logger.py +523 -0
- autogen/math_utils.py +339 -0
- autogen/mcp/__init__.py +7 -0
- autogen/mcp/mcp_client.py +208 -0
- autogen/messages/__init__.py +7 -0
- autogen/messages/agent_messages.py +948 -0
- autogen/messages/base_message.py +107 -0
- autogen/messages/client_messages.py +171 -0
- autogen/messages/print_message.py +49 -0
- autogen/oai/__init__.py +53 -0
- autogen/oai/anthropic.py +714 -0
- autogen/oai/bedrock.py +628 -0
- autogen/oai/cerebras.py +299 -0
- autogen/oai/client.py +1435 -0
- autogen/oai/client_utils.py +169 -0
- autogen/oai/cohere.py +479 -0
- autogen/oai/gemini.py +990 -0
- autogen/oai/gemini_types.py +129 -0
- autogen/oai/groq.py +305 -0
- autogen/oai/mistral.py +303 -0
- autogen/oai/oai_models/__init__.py +11 -0
- autogen/oai/oai_models/_models.py +16 -0
- autogen/oai/oai_models/chat_completion.py +87 -0
- autogen/oai/oai_models/chat_completion_audio.py +32 -0
- autogen/oai/oai_models/chat_completion_message.py +86 -0
- autogen/oai/oai_models/chat_completion_message_tool_call.py +37 -0
- autogen/oai/oai_models/chat_completion_token_logprob.py +63 -0
- autogen/oai/oai_models/completion_usage.py +60 -0
- autogen/oai/ollama.py +643 -0
- autogen/oai/openai_utils.py +881 -0
- autogen/oai/together.py +370 -0
- autogen/retrieve_utils.py +491 -0
- autogen/runtime_logging.py +160 -0
- autogen/token_count_utils.py +267 -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 +41 -0
- autogen/tools/dependency_injection.py +254 -0
- autogen/tools/experimental/__init__.py +43 -0
- autogen/tools/experimental/browser_use/__init__.py +7 -0
- autogen/tools/experimental/browser_use/browser_use.py +161 -0
- autogen/tools/experimental/crawl4ai/__init__.py +7 -0
- autogen/tools/experimental/crawl4ai/crawl4ai.py +153 -0
- autogen/tools/experimental/deep_research/__init__.py +7 -0
- autogen/tools/experimental/deep_research/deep_research.py +328 -0
- autogen/tools/experimental/duckduckgo/__init__.py +7 -0
- autogen/tools/experimental/duckduckgo/duckduckgo_search.py +109 -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 +288 -0
- autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/slack/slack.py +391 -0
- autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/telegram/telegram.py +275 -0
- autogen/tools/experimental/perplexity/__init__.py +7 -0
- autogen/tools/experimental/perplexity/perplexity_search.py +260 -0
- autogen/tools/experimental/tavily/__init__.py +7 -0
- autogen/tools/experimental/tavily/tavily_search.py +183 -0
- autogen/tools/experimental/web_search_preview/__init__.py +7 -0
- autogen/tools/experimental/web_search_preview/web_search_preview.py +114 -0
- autogen/tools/experimental/wikipedia/__init__.py +7 -0
- autogen/tools/experimental/wikipedia/wikipedia.py +287 -0
- autogen/tools/function_utils.py +411 -0
- autogen/tools/tool.py +187 -0
- autogen/tools/toolkit.py +86 -0
- autogen/types.py +29 -0
- autogen/version.py +7 -0
- ag2-0.9.1.dist-info/RECORD +0 -6
- ag2-0.9.1.dist-info/top_level.txt +0 -1
- {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
- {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
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 base64
|
|
8
|
+
import json
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
import uuid
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from types import TracebackType
|
|
14
|
+
from typing import Optional, Union
|
|
15
|
+
|
|
16
|
+
from ...doc_utils import export_module
|
|
17
|
+
|
|
18
|
+
if sys.version_info >= (3, 11):
|
|
19
|
+
from typing import Self
|
|
20
|
+
else:
|
|
21
|
+
from typing_extensions import Self
|
|
22
|
+
|
|
23
|
+
from ..base import CodeBlock, CodeExecutor, CodeExtractor, IPythonCodeResult
|
|
24
|
+
from ..markdown_code_extractor import MarkdownCodeExtractor
|
|
25
|
+
from ..utils import silence_pip
|
|
26
|
+
from .base import JupyterConnectable, JupyterConnectionInfo
|
|
27
|
+
from .jupyter_client import JupyterClient
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@export_module("autogen.coding.jupyter")
|
|
31
|
+
class JupyterCodeExecutor(CodeExecutor):
|
|
32
|
+
def __init__(
|
|
33
|
+
self,
|
|
34
|
+
jupyter_server: Union[JupyterConnectable, JupyterConnectionInfo],
|
|
35
|
+
kernel_name: str = "python3",
|
|
36
|
+
timeout: int = 60,
|
|
37
|
+
output_dir: Union[Path, str] = Path(),
|
|
38
|
+
):
|
|
39
|
+
"""(Experimental) A code executor class that executes code statefully using
|
|
40
|
+
a Jupyter server supplied to this class.
|
|
41
|
+
|
|
42
|
+
Each execution is stateful and can access variables created from previous
|
|
43
|
+
executions in the same session.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
jupyter_server (Union[JupyterConnectable, JupyterConnectionInfo]): The Jupyter server to use.
|
|
47
|
+
timeout (int): The timeout for code execution, by default 60.
|
|
48
|
+
kernel_name (str): The kernel name to use. Make sure it is installed.
|
|
49
|
+
By default, it is "python3".
|
|
50
|
+
output_dir (str): The directory to save output files, by default ".".
|
|
51
|
+
"""
|
|
52
|
+
if timeout < 1:
|
|
53
|
+
raise ValueError("Timeout must be greater than or equal to 1.")
|
|
54
|
+
|
|
55
|
+
if isinstance(output_dir, str):
|
|
56
|
+
output_dir = Path(output_dir)
|
|
57
|
+
|
|
58
|
+
if not output_dir.exists():
|
|
59
|
+
raise ValueError(f"Output directory {output_dir} does not exist.")
|
|
60
|
+
|
|
61
|
+
if isinstance(jupyter_server, JupyterConnectable):
|
|
62
|
+
self._connection_info = jupyter_server.connection_info
|
|
63
|
+
elif isinstance(jupyter_server, JupyterConnectionInfo):
|
|
64
|
+
self._connection_info = jupyter_server
|
|
65
|
+
else:
|
|
66
|
+
raise ValueError("jupyter_server must be a JupyterConnectable or JupyterConnectionInfo.")
|
|
67
|
+
|
|
68
|
+
self._jupyter_client = JupyterClient(self._connection_info)
|
|
69
|
+
available_kernels = self._jupyter_client.list_kernel_specs()
|
|
70
|
+
if kernel_name not in available_kernels["kernelspecs"]:
|
|
71
|
+
raise ValueError(f"Kernel {kernel_name} is not installed.")
|
|
72
|
+
|
|
73
|
+
self._kernel_id = self._jupyter_client.start_kernel(kernel_name)
|
|
74
|
+
self._kernel_name = kernel_name
|
|
75
|
+
self._jupyter_kernel_client = self._jupyter_client.get_kernel_client(self._kernel_id)
|
|
76
|
+
self._timeout = timeout
|
|
77
|
+
self._output_dir = output_dir
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def code_extractor(self) -> CodeExtractor:
|
|
81
|
+
"""(Experimental) Export a code extractor that can be used by an agent."""
|
|
82
|
+
return MarkdownCodeExtractor()
|
|
83
|
+
|
|
84
|
+
def execute_code_blocks(self, code_blocks: list[CodeBlock]) -> IPythonCodeResult:
|
|
85
|
+
"""(Experimental) Execute a list of code blocks and return the result.
|
|
86
|
+
|
|
87
|
+
This method executes a list of code blocks as cells in the Jupyter kernel.
|
|
88
|
+
See: https://jupyter-client.readthedocs.io/en/stable/messaging.html
|
|
89
|
+
for the message protocol.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
code_blocks (List[CodeBlock]): A list of code blocks to execute.
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
IPythonCodeResult: The result of the code execution.
|
|
96
|
+
"""
|
|
97
|
+
self._jupyter_kernel_client.wait_for_ready()
|
|
98
|
+
outputs = []
|
|
99
|
+
output_files = []
|
|
100
|
+
for code_block in code_blocks:
|
|
101
|
+
code = silence_pip(code_block.code, code_block.language)
|
|
102
|
+
result = self._jupyter_kernel_client.execute(code, timeout_seconds=self._timeout)
|
|
103
|
+
if result.is_ok:
|
|
104
|
+
outputs.append(result.output)
|
|
105
|
+
for data in result.data_items:
|
|
106
|
+
if data.mime_type == "image/png":
|
|
107
|
+
path = self._save_image(data.data)
|
|
108
|
+
outputs.append(f"Image data saved to {path}")
|
|
109
|
+
output_files.append(path)
|
|
110
|
+
elif data.mime_type == "text/html":
|
|
111
|
+
path = self._save_html(data.data)
|
|
112
|
+
outputs.append(f"HTML data saved to {path}")
|
|
113
|
+
output_files.append(path)
|
|
114
|
+
else:
|
|
115
|
+
outputs.append(json.dumps(data.data))
|
|
116
|
+
else:
|
|
117
|
+
return IPythonCodeResult(
|
|
118
|
+
exit_code=1,
|
|
119
|
+
output=f"ERROR: {result.output}",
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
return IPythonCodeResult(
|
|
123
|
+
exit_code=0, output="\n".join([str(output) for output in outputs]), output_files=output_files
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def restart(self) -> None:
|
|
127
|
+
"""(Experimental) Restart a new session."""
|
|
128
|
+
self._jupyter_client.restart_kernel(self._kernel_id)
|
|
129
|
+
self._jupyter_kernel_client = self._jupyter_client.get_kernel_client(self._kernel_id)
|
|
130
|
+
|
|
131
|
+
def _save_image(self, image_data_base64: str) -> str:
|
|
132
|
+
"""Save image data to a file."""
|
|
133
|
+
image_data = base64.b64decode(image_data_base64)
|
|
134
|
+
# Randomly generate a filename.
|
|
135
|
+
filename = f"{uuid.uuid4().hex}.png"
|
|
136
|
+
path = os.path.join(self._output_dir, filename)
|
|
137
|
+
with open(path, "wb") as f:
|
|
138
|
+
f.write(image_data)
|
|
139
|
+
return os.path.abspath(path)
|
|
140
|
+
|
|
141
|
+
def _save_html(self, html_data: str) -> str:
|
|
142
|
+
"""Save html data to a file."""
|
|
143
|
+
# Randomly generate a filename.
|
|
144
|
+
filename = f"{uuid.uuid4().hex}.html"
|
|
145
|
+
path = os.path.join(self._output_dir, filename)
|
|
146
|
+
with open(path, "w") as f:
|
|
147
|
+
f.write(html_data)
|
|
148
|
+
return os.path.abspath(path)
|
|
149
|
+
|
|
150
|
+
def stop(self) -> None:
|
|
151
|
+
"""Stop the kernel."""
|
|
152
|
+
self._jupyter_client.delete_kernel(self._kernel_id)
|
|
153
|
+
|
|
154
|
+
def __enter__(self) -> Self:
|
|
155
|
+
return self
|
|
156
|
+
|
|
157
|
+
def __exit__(
|
|
158
|
+
self, exc_type: Optional[type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType]
|
|
159
|
+
) -> None:
|
|
160
|
+
self.stop()
|
|
@@ -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
|
+
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import atexit
|
|
10
|
+
import json
|
|
11
|
+
import secrets
|
|
12
|
+
import signal
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
from types import TracebackType
|
|
16
|
+
from typing import Optional
|
|
17
|
+
|
|
18
|
+
from ...doc_utils import export_module
|
|
19
|
+
|
|
20
|
+
if sys.version_info >= (3, 11):
|
|
21
|
+
from typing import Self
|
|
22
|
+
else:
|
|
23
|
+
from typing_extensions import Self
|
|
24
|
+
|
|
25
|
+
from .base import JupyterConnectable, JupyterConnectionInfo
|
|
26
|
+
from .import_utils import require_jupyter_kernel_gateway_installed
|
|
27
|
+
from .jupyter_client import JupyterClient
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@require_jupyter_kernel_gateway_installed()
|
|
31
|
+
@export_module("autogen.coding.jupyter")
|
|
32
|
+
class LocalJupyterServer(JupyterConnectable):
|
|
33
|
+
class GenerateToken:
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
ip: str = "127.0.0.1",
|
|
39
|
+
port: Optional[int] = None,
|
|
40
|
+
token: str | GenerateToken = GenerateToken(),
|
|
41
|
+
log_file: str = "jupyter_gateway.log",
|
|
42
|
+
log_level: str = "INFO",
|
|
43
|
+
log_max_bytes: int = 1048576,
|
|
44
|
+
log_backup_count: int = 3,
|
|
45
|
+
):
|
|
46
|
+
"""Runs a Jupyter Kernel Gateway server locally.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
ip (str, optional): IP address to bind to. Defaults to "127.0.0.1".
|
|
50
|
+
port (Optional[int], optional): Port to use, if None it automatically selects a port. Defaults to None.
|
|
51
|
+
token (Union[str, GenerateToken], optional): Token to use for Jupyter server. By default will generate a token. Using None will use no token for authentication. Defaults to GenerateToken().
|
|
52
|
+
log_file (str, optional): File for Jupyter Kernel Gateway logs. Defaults to "jupyter_gateway.log".
|
|
53
|
+
log_level (str, optional): Level for Jupyter Kernel Gateway logs. Defaults to "INFO".
|
|
54
|
+
log_max_bytes (int, optional): Max logfile size. Defaults to 1048576.
|
|
55
|
+
log_backup_count (int, optional): Number of backups for rotating log. Defaults to 3.
|
|
56
|
+
"""
|
|
57
|
+
# Remove as soon as https://github.com/jupyter-server/kernel_gateway/issues/398 is fixed
|
|
58
|
+
if sys.platform == "win32":
|
|
59
|
+
raise ValueError("LocalJupyterServer is not supported on Windows due to kernelgateway bug.")
|
|
60
|
+
|
|
61
|
+
# Check Jupyter gateway server is installed
|
|
62
|
+
try:
|
|
63
|
+
subprocess.run(
|
|
64
|
+
[sys.executable, "-m", "jupyter", "kernelgateway", "--version"],
|
|
65
|
+
check=True,
|
|
66
|
+
capture_output=True,
|
|
67
|
+
text=True,
|
|
68
|
+
)
|
|
69
|
+
except subprocess.CalledProcessError:
|
|
70
|
+
raise ValueError(
|
|
71
|
+
"Jupyter gateway server is not installed. Please install it with `pip install jupyter_kernel_gateway`."
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
self.ip: str = ip
|
|
75
|
+
|
|
76
|
+
if isinstance(token, LocalJupyterServer.GenerateToken):
|
|
77
|
+
token = secrets.token_hex(32)
|
|
78
|
+
|
|
79
|
+
self.token: str = token
|
|
80
|
+
self._subprocess: subprocess.Popen[str]
|
|
81
|
+
logging_config = {
|
|
82
|
+
"handlers": {
|
|
83
|
+
"file": {
|
|
84
|
+
"class": "logging.handlers.RotatingFileHandler",
|
|
85
|
+
"level": log_level,
|
|
86
|
+
"maxBytes": log_max_bytes,
|
|
87
|
+
"backupCount": log_backup_count,
|
|
88
|
+
"filename": log_file,
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"loggers": {"KernelGatewayApp": {"level": log_level, "handlers": ["file", "console"]}},
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
# Run Jupyter gateway server with detached subprocess
|
|
95
|
+
args = [
|
|
96
|
+
sys.executable,
|
|
97
|
+
"-m",
|
|
98
|
+
"jupyter",
|
|
99
|
+
"kernelgateway",
|
|
100
|
+
"--KernelGatewayApp.ip",
|
|
101
|
+
ip,
|
|
102
|
+
"--KernelGatewayApp.auth_token",
|
|
103
|
+
token,
|
|
104
|
+
"--JupyterApp.answer_yes",
|
|
105
|
+
"true",
|
|
106
|
+
"--JupyterApp.logging_config",
|
|
107
|
+
json.dumps(logging_config),
|
|
108
|
+
"--JupyterWebsocketPersonality.list_kernels",
|
|
109
|
+
"true",
|
|
110
|
+
]
|
|
111
|
+
if port is not None:
|
|
112
|
+
args.extend(["--KernelGatewayApp.port", str(port)])
|
|
113
|
+
args.extend(["--KernelGatewayApp.port_retries", "0"])
|
|
114
|
+
self._subprocess = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
|
|
115
|
+
|
|
116
|
+
# Satisfy mypy, we know this is not None because we passed PIPE
|
|
117
|
+
assert self._subprocess.stderr is not None
|
|
118
|
+
# Read stderr until we see "is available at" or the process has exited with an error
|
|
119
|
+
stderr = ""
|
|
120
|
+
while True:
|
|
121
|
+
result = self._subprocess.poll()
|
|
122
|
+
if result is not None:
|
|
123
|
+
stderr += self._subprocess.stderr.read()
|
|
124
|
+
raise ValueError(f"Jupyter gateway server failed to start with exit code: {result}. stderr:\n{stderr}")
|
|
125
|
+
line = self._subprocess.stderr.readline()
|
|
126
|
+
stderr += line
|
|
127
|
+
|
|
128
|
+
if "ERROR:" in line:
|
|
129
|
+
error_info = line.split("ERROR:")[1]
|
|
130
|
+
raise ValueError(f"Jupyter gateway server failed to start. {error_info}")
|
|
131
|
+
|
|
132
|
+
if "is available at" in line:
|
|
133
|
+
# We need to extract what port it settled on
|
|
134
|
+
# Example output:
|
|
135
|
+
# Jupyter Kernel Gateway 3.0.0 is available at http://127.0.0.1:8890
|
|
136
|
+
if port is None:
|
|
137
|
+
port = int(line.split(":")[-1])
|
|
138
|
+
self.port: int = port
|
|
139
|
+
|
|
140
|
+
break
|
|
141
|
+
|
|
142
|
+
# Poll the subprocess to check if it is still running
|
|
143
|
+
result = self._subprocess.poll()
|
|
144
|
+
if result is not None:
|
|
145
|
+
raise ValueError(
|
|
146
|
+
f"Jupyter gateway server failed to start. Please check the logs ({log_file}) for more information."
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
atexit.register(self.stop)
|
|
150
|
+
|
|
151
|
+
def stop(self) -> None:
|
|
152
|
+
if self._subprocess.poll() is None:
|
|
153
|
+
if sys.platform == "win32":
|
|
154
|
+
self._subprocess.send_signal(signal.CTRL_C_EVENT)
|
|
155
|
+
else:
|
|
156
|
+
self._subprocess.send_signal(signal.SIGINT)
|
|
157
|
+
self._subprocess.wait()
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def connection_info(self) -> JupyterConnectionInfo:
|
|
161
|
+
return JupyterConnectionInfo(host=self.ip, use_https=False, port=self.port, token=self.token)
|
|
162
|
+
|
|
163
|
+
def get_client(self) -> JupyterClient:
|
|
164
|
+
return JupyterClient(self.connection_info)
|
|
165
|
+
|
|
166
|
+
def __enter__(self) -> Self:
|
|
167
|
+
return self
|
|
168
|
+
|
|
169
|
+
def __exit__(
|
|
170
|
+
self, exc_type: Optional[type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType]
|
|
171
|
+
) -> None:
|
|
172
|
+
self.stop()
|