ag2 0.9.1a1__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.1a1.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.1a1.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.1a1.dist-info/RECORD +0 -6
- ag2-0.9.1a1.dist-info/top_level.txt +0 -1
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
|
@@ -0,0 +1,267 @@
|
|
|
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
|
+
|
|
8
|
+
import json
|
|
9
|
+
import logging
|
|
10
|
+
import re
|
|
11
|
+
from typing import Any, Union
|
|
12
|
+
|
|
13
|
+
import tiktoken
|
|
14
|
+
|
|
15
|
+
from .agentchat.contrib.img_utils import num_tokens_from_gpt_image
|
|
16
|
+
from .import_utils import optional_import_block
|
|
17
|
+
|
|
18
|
+
# if PIL is not imported, we will redefine num_tokens_from_gpt_image to return 0 tokens for images
|
|
19
|
+
# Otherwise, it would raise an ImportError
|
|
20
|
+
with optional_import_block() as result:
|
|
21
|
+
import PIL # noqa: F401
|
|
22
|
+
|
|
23
|
+
pil_imported = result.is_successful
|
|
24
|
+
if not pil_imported:
|
|
25
|
+
|
|
26
|
+
def num_tokens_from_gpt_image(*args, **kwargs):
|
|
27
|
+
return 0
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
logger = logging.getLogger(__name__)
|
|
31
|
+
logger.img_dependency_warned = False # member variable to track if the warning has been logged
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def get_max_token_limit(model: str = "gpt-3.5-turbo-0613") -> int:
|
|
35
|
+
# Handle common azure model names/aliases
|
|
36
|
+
model = re.sub(r"^gpt\-?35", "gpt-3.5", model)
|
|
37
|
+
model = re.sub(r"^gpt4", "gpt-4", model)
|
|
38
|
+
|
|
39
|
+
max_token_limit = {
|
|
40
|
+
"gpt-3.5-turbo": 16385,
|
|
41
|
+
"gpt-3.5-turbo-0125": 16385,
|
|
42
|
+
"gpt-3.5-turbo-0301": 4096,
|
|
43
|
+
"gpt-3.5-turbo-0613": 4096,
|
|
44
|
+
"gpt-3.5-turbo-instruct": 4096,
|
|
45
|
+
"gpt-3.5-turbo-16k": 16385,
|
|
46
|
+
"gpt-3.5-turbo-16k-0613": 16385,
|
|
47
|
+
"gpt-3.5-turbo-1106": 16385,
|
|
48
|
+
"gpt-4": 8192,
|
|
49
|
+
"gpt-4-turbo": 128000,
|
|
50
|
+
"gpt-4-turbo-2024-04-09": 128000,
|
|
51
|
+
"gpt-4-32k": 32768,
|
|
52
|
+
"gpt-4-32k-0314": 32768, # deprecate in Sep
|
|
53
|
+
"gpt-4-0314": 8192, # deprecate in Sep
|
|
54
|
+
"gpt-4-0613": 8192,
|
|
55
|
+
"gpt-4-32k-0613": 32768,
|
|
56
|
+
"gpt-4-1106-preview": 128000,
|
|
57
|
+
"gpt-4-0125-preview": 128000,
|
|
58
|
+
"gpt-4-turbo-preview": 128000,
|
|
59
|
+
"gpt-4-vision-preview": 128000,
|
|
60
|
+
"gpt-4o": 128000,
|
|
61
|
+
"gpt-4o-2024-05-13": 128000,
|
|
62
|
+
"gpt-4o-2024-08-06": 128000,
|
|
63
|
+
"gpt-4o-2024-11-20": 128000,
|
|
64
|
+
"gpt-4o-mini": 128000,
|
|
65
|
+
"gpt-4o-mini-2024-07-18": 128000,
|
|
66
|
+
}
|
|
67
|
+
return max_token_limit[model]
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def percentile_used(input, model="gpt-3.5-turbo-0613"):
|
|
71
|
+
return count_token(input) / get_max_token_limit(model)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def token_left(input: Union[str, list[str], dict[str, Any]], model="gpt-3.5-turbo-0613") -> int:
|
|
75
|
+
"""Count number of tokens left for an OpenAI model.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
input: (str, list, dict): Input to the model.
|
|
79
|
+
model: (str): Model name.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
int: Number of tokens left that the model can use for completion.
|
|
83
|
+
"""
|
|
84
|
+
return get_max_token_limit(model) - count_token(input, model=model)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def count_token(input: Union[str, list[str], dict[str, Any]], model: str = "gpt-3.5-turbo-0613") -> int:
|
|
88
|
+
"""Count number of tokens used by an OpenAI model.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
input: (str, list, dict): Input to the model.
|
|
92
|
+
model: (str): Model name.
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
int: Number of tokens from the input.
|
|
96
|
+
"""
|
|
97
|
+
if isinstance(input, str):
|
|
98
|
+
return _num_token_from_text(input, model=model)
|
|
99
|
+
elif isinstance(input, (list, dict)):
|
|
100
|
+
return _num_token_from_messages(input, model=model)
|
|
101
|
+
else:
|
|
102
|
+
raise ValueError(f"input must be str, list or dict, but we got {type(input)}")
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _num_token_from_text(text: str, model: str = "gpt-3.5-turbo-0613"):
|
|
106
|
+
"""Return the number of tokens used by a string."""
|
|
107
|
+
try:
|
|
108
|
+
encoding = tiktoken.encoding_for_model(model)
|
|
109
|
+
except KeyError:
|
|
110
|
+
logger.warning(f"Model {model} not found. Using cl100k_base encoding.")
|
|
111
|
+
encoding = tiktoken.get_encoding("cl100k_base")
|
|
112
|
+
return len(encoding.encode(text))
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _num_token_from_messages(messages: Union[list[str], dict[str, Any]], model="gpt-3.5-turbo-0613"):
|
|
116
|
+
"""Return the number of tokens used by a list of messages.
|
|
117
|
+
|
|
118
|
+
retrieved from https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb/
|
|
119
|
+
"""
|
|
120
|
+
if isinstance(messages, dict):
|
|
121
|
+
messages = [messages]
|
|
122
|
+
|
|
123
|
+
try:
|
|
124
|
+
encoding = tiktoken.encoding_for_model(model)
|
|
125
|
+
except KeyError:
|
|
126
|
+
logger.warning(f"Model {model} not found. Using cl100k_base encoding.")
|
|
127
|
+
encoding = tiktoken.get_encoding("cl100k_base")
|
|
128
|
+
if model in {
|
|
129
|
+
"gpt-3.5-turbo-0613",
|
|
130
|
+
"gpt-3.5-turbo-16k-0613",
|
|
131
|
+
"gpt-4-0314",
|
|
132
|
+
"gpt-4-32k-0314",
|
|
133
|
+
"gpt-4-0613",
|
|
134
|
+
"gpt-4-32k-0613",
|
|
135
|
+
"gpt-4-turbo-preview",
|
|
136
|
+
"gpt-4-vision-preview",
|
|
137
|
+
"gpt-4o",
|
|
138
|
+
"gpt-4o-2024-05-13",
|
|
139
|
+
"gpt-4o-2024-08-06",
|
|
140
|
+
"gpt-4o-2024-11-20",
|
|
141
|
+
"gpt-4o-mini",
|
|
142
|
+
"gpt-4o-mini-2024-07-18",
|
|
143
|
+
}:
|
|
144
|
+
tokens_per_message = 3
|
|
145
|
+
tokens_per_name = 1
|
|
146
|
+
elif model == "gpt-3.5-turbo-0301":
|
|
147
|
+
tokens_per_message = 4 # every message follows <|start|>{role/name}\n{content}<|end|>\n
|
|
148
|
+
tokens_per_name = -1 # if there's a name, the role is omitted
|
|
149
|
+
elif "gpt-3.5-turbo" in model:
|
|
150
|
+
logger.info("gpt-3.5-turbo may update over time. Returning num tokens assuming gpt-3.5-turbo-0613.")
|
|
151
|
+
return _num_token_from_messages(messages, model="gpt-3.5-turbo-0613")
|
|
152
|
+
elif "gpt-4" in model:
|
|
153
|
+
logger.info("gpt-4 may update over time. Returning num tokens assuming gpt-4-0613.")
|
|
154
|
+
return _num_token_from_messages(messages, model="gpt-4-0613")
|
|
155
|
+
elif "gemini" in model:
|
|
156
|
+
logger.info("Gemini is not supported in tiktoken. Returning num tokens assuming gpt-4-0613.")
|
|
157
|
+
return _num_token_from_messages(messages, model="gpt-4-0613")
|
|
158
|
+
elif "claude" in model:
|
|
159
|
+
logger.info("Claude is not supported in tiktoken. Returning num tokens assuming gpt-4-0613.")
|
|
160
|
+
return _num_token_from_messages(messages, model="gpt-4-0613")
|
|
161
|
+
elif "mistral-" in model or "mixtral-" in model:
|
|
162
|
+
logger.info("Mistral.AI models are not supported in tiktoken. Returning num tokens assuming gpt-4-0613.")
|
|
163
|
+
return _num_token_from_messages(messages, model="gpt-4-0613")
|
|
164
|
+
elif "deepseek" in model:
|
|
165
|
+
logger.info("Deepseek models are not supported in tiktoken. Returning num tokens assuming gpt-4-0613.")
|
|
166
|
+
return _num_token_from_messages(messages, model="gpt-4-0613")
|
|
167
|
+
else:
|
|
168
|
+
raise NotImplementedError(
|
|
169
|
+
f"""_num_token_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens."""
|
|
170
|
+
)
|
|
171
|
+
num_tokens = 0
|
|
172
|
+
for message in messages:
|
|
173
|
+
num_tokens += tokens_per_message
|
|
174
|
+
for key, value in message.items():
|
|
175
|
+
if value is None:
|
|
176
|
+
continue
|
|
177
|
+
|
|
178
|
+
# handle content if images are in GPT-4-vision
|
|
179
|
+
if key == "content" and isinstance(value, list):
|
|
180
|
+
for part in value:
|
|
181
|
+
if not isinstance(part, dict) or "type" not in part:
|
|
182
|
+
continue
|
|
183
|
+
if part["type"] == "text":
|
|
184
|
+
num_tokens += len(encoding.encode(part["text"]))
|
|
185
|
+
if "image_url" in part:
|
|
186
|
+
assert "url" in part["image_url"]
|
|
187
|
+
if not pil_imported and not logger.img_dependency_warned:
|
|
188
|
+
logger.warning(
|
|
189
|
+
"img_utils or PIL not imported. Skipping image token count."
|
|
190
|
+
"Please install autogen with [lmm] option.",
|
|
191
|
+
)
|
|
192
|
+
logger.img_dependency_warned = True
|
|
193
|
+
is_low_quality = "detail" in part["image_url"] and part["image_url"]["detail"] == "low"
|
|
194
|
+
try:
|
|
195
|
+
num_tokens += num_tokens_from_gpt_image(
|
|
196
|
+
image_data=part["image_url"]["url"], model=model, low_quality=is_low_quality
|
|
197
|
+
)
|
|
198
|
+
except ValueError as e:
|
|
199
|
+
logger.warning(f"Error in num_tokens_from_gpt_image: {e}")
|
|
200
|
+
continue
|
|
201
|
+
|
|
202
|
+
# function calls
|
|
203
|
+
if not isinstance(value, str):
|
|
204
|
+
try:
|
|
205
|
+
value = json.dumps(value)
|
|
206
|
+
except TypeError:
|
|
207
|
+
logger.warning(
|
|
208
|
+
f"Value {value} is not a string and cannot be converted to json. It is a type: {type(value)} Skipping."
|
|
209
|
+
)
|
|
210
|
+
continue
|
|
211
|
+
|
|
212
|
+
num_tokens += len(encoding.encode(value))
|
|
213
|
+
if key == "name":
|
|
214
|
+
num_tokens += tokens_per_name
|
|
215
|
+
num_tokens += 3 # every reply is primed with <|start|>assistant<|message|>
|
|
216
|
+
return num_tokens
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def num_tokens_from_functions(functions, model="gpt-3.5-turbo-0613") -> int:
|
|
220
|
+
"""Return the number of tokens used by a list of functions.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
functions: (list): List of function descriptions that will be passed in model.
|
|
224
|
+
model: (str): Model name.
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
int: Number of tokens from the function descriptions.
|
|
228
|
+
"""
|
|
229
|
+
try:
|
|
230
|
+
encoding = tiktoken.encoding_for_model(model)
|
|
231
|
+
except KeyError:
|
|
232
|
+
logger.warning(f"Model {model} not found. Using cl100k_base encoding.")
|
|
233
|
+
encoding = tiktoken.get_encoding("cl100k_base")
|
|
234
|
+
|
|
235
|
+
num_tokens = 0
|
|
236
|
+
for function in functions:
|
|
237
|
+
function_tokens = len(encoding.encode(function["name"]))
|
|
238
|
+
function_tokens += len(encoding.encode(function["description"]))
|
|
239
|
+
function_tokens -= 2
|
|
240
|
+
if "parameters" in function:
|
|
241
|
+
parameters = function["parameters"]
|
|
242
|
+
if "properties" in parameters:
|
|
243
|
+
for properties_key in parameters["properties"]:
|
|
244
|
+
function_tokens += len(encoding.encode(properties_key))
|
|
245
|
+
v = parameters["properties"][properties_key]
|
|
246
|
+
for field in v:
|
|
247
|
+
if field == "type":
|
|
248
|
+
function_tokens += 2
|
|
249
|
+
function_tokens += len(encoding.encode(v["type"]))
|
|
250
|
+
elif field == "description":
|
|
251
|
+
function_tokens += 2
|
|
252
|
+
function_tokens += len(encoding.encode(v["description"]))
|
|
253
|
+
elif field == "enum":
|
|
254
|
+
function_tokens -= 3
|
|
255
|
+
for o in v["enum"]:
|
|
256
|
+
function_tokens += 3
|
|
257
|
+
function_tokens += len(encoding.encode(o))
|
|
258
|
+
else:
|
|
259
|
+
logger.warning(f"Not supported field {field}")
|
|
260
|
+
function_tokens += 11
|
|
261
|
+
if len(parameters["properties"]) == 0:
|
|
262
|
+
function_tokens -= 2
|
|
263
|
+
|
|
264
|
+
num_tokens += function_tokens
|
|
265
|
+
|
|
266
|
+
num_tokens += 12
|
|
267
|
+
return num_tokens
|
|
@@ -0,0 +1,20 @@
|
|
|
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 .dependency_injection import BaseContext, ChatContext, Depends
|
|
6
|
+
from .function_utils import get_function_schema, load_basemodels_if_needed, serialize_to_str
|
|
7
|
+
from .tool import Tool, tool
|
|
8
|
+
from .toolkit import Toolkit
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"BaseContext",
|
|
12
|
+
"ChatContext",
|
|
13
|
+
"Depends",
|
|
14
|
+
"Tool",
|
|
15
|
+
"Toolkit",
|
|
16
|
+
"get_function_schema",
|
|
17
|
+
"load_basemodels_if_needed",
|
|
18
|
+
"serialize_to_str",
|
|
19
|
+
"tool",
|
|
20
|
+
]
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
|
6
|
+
from typing import Annotated
|
|
7
|
+
|
|
8
|
+
from autogen.tools import Tool
|
|
9
|
+
|
|
10
|
+
from ....doc_utils import export_module
|
|
11
|
+
|
|
12
|
+
__all__ = ["TimeTool"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@export_module("autogen.tools.contrib") # API Reference: autogen > tools > contrib > TimeAgent
|
|
16
|
+
class TimeTool(Tool):
|
|
17
|
+
"""Outputs the current date and time of the computer."""
|
|
18
|
+
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
*,
|
|
22
|
+
date_time_format: str = "%Y-%m-%d %H:%M:%S", # This is a parameter that is unique to this tool
|
|
23
|
+
):
|
|
24
|
+
"""Get the date and time of the computer.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
date_time_format (str, optional): The format of the date and time. Defaults to "%Y-%m-%d %H:%M:%S".
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
self._date_time_format = date_time_format
|
|
31
|
+
|
|
32
|
+
async def get_date_and_time(
|
|
33
|
+
date_time_format: Annotated[str, "date/time Python format"] = self._date_time_format,
|
|
34
|
+
) -> str:
|
|
35
|
+
return datetime.now().strftime(date_time_format)
|
|
36
|
+
|
|
37
|
+
super().__init__(
|
|
38
|
+
name="date_time",
|
|
39
|
+
description="Get the current computer's date and time.",
|
|
40
|
+
func_or_tool=get_date_and_time,
|
|
41
|
+
)
|
|
@@ -0,0 +1,254 @@
|
|
|
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 functools
|
|
6
|
+
import inspect
|
|
7
|
+
import sys
|
|
8
|
+
from abc import ABC
|
|
9
|
+
from functools import wraps
|
|
10
|
+
from typing import TYPE_CHECKING, Any, Callable, Iterable, Optional, TypeVar, Union, get_type_hints
|
|
11
|
+
|
|
12
|
+
from ..agentchat import Agent
|
|
13
|
+
from ..doc_utils import export_module
|
|
14
|
+
from ..fast_depends import Depends as FastDepends
|
|
15
|
+
from ..fast_depends import inject
|
|
16
|
+
from ..fast_depends.dependencies import model
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from ..agentchat.conversable_agent import ConversableAgent
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"BaseContext",
|
|
23
|
+
"ChatContext",
|
|
24
|
+
"Depends",
|
|
25
|
+
"Field",
|
|
26
|
+
"get_context_params",
|
|
27
|
+
"inject_params",
|
|
28
|
+
"on",
|
|
29
|
+
"remove_params",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@export_module("autogen.tools")
|
|
34
|
+
class BaseContext(ABC):
|
|
35
|
+
"""Base class for context classes.
|
|
36
|
+
|
|
37
|
+
This is the base class for defining various context types that may be used
|
|
38
|
+
throughout the application. It serves as a parent for specific context classes.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@export_module("autogen.tools")
|
|
45
|
+
class ChatContext(BaseContext):
|
|
46
|
+
"""ChatContext class that extends BaseContext.
|
|
47
|
+
|
|
48
|
+
This class is used to represent a chat context that holds a list of messages.
|
|
49
|
+
It inherits from `BaseContext` and adds the `messages` attribute.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(self, agent: "ConversableAgent") -> None:
|
|
53
|
+
"""Initializes the ChatContext with an agent.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
agent: The agent to use for retrieving chat messages.
|
|
57
|
+
"""
|
|
58
|
+
self._agent = agent
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def chat_messages(self) -> dict[Agent, list[dict[Any, Any]]]:
|
|
62
|
+
"""The messages in the chat.
|
|
63
|
+
|
|
64
|
+
Returns:
|
|
65
|
+
A dictionary of agents and their messages.
|
|
66
|
+
"""
|
|
67
|
+
return self._agent.chat_messages
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def last_message(self) -> Optional[dict[str, Any]]:
|
|
71
|
+
"""The last message in the chat.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
The last message in the chat.
|
|
75
|
+
"""
|
|
76
|
+
return self._agent.last_message()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
T = TypeVar("T")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def on(x: T) -> Callable[[], T]:
|
|
83
|
+
def inner(ag2_x: T = x) -> T:
|
|
84
|
+
return ag2_x
|
|
85
|
+
|
|
86
|
+
return inner
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@export_module("autogen.tools")
|
|
90
|
+
def Depends(x: Any) -> Any: # noqa: N802
|
|
91
|
+
"""Creates a dependency for injection based on the provided context or type.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
x: The context or dependency to be injected.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
A FastDepends object that will resolve the dependency for injection.
|
|
98
|
+
"""
|
|
99
|
+
if isinstance(x, BaseContext):
|
|
100
|
+
return FastDepends(lambda: x)
|
|
101
|
+
|
|
102
|
+
return FastDepends(x)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def get_context_params(func: Callable[..., Any], subclass: Union[type[BaseContext], type[ChatContext]]) -> list[str]:
|
|
106
|
+
"""Gets the names of the context parameters in a function signature.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
func: The function to inspect for context parameters.
|
|
110
|
+
subclass: The subclass to search for.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
A list of parameter names that are instances of the specified subclass.
|
|
114
|
+
"""
|
|
115
|
+
sig = inspect.signature(func)
|
|
116
|
+
return [p.name for p in sig.parameters.values() if _is_context_param(p, subclass=subclass)]
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def _is_context_param(
|
|
120
|
+
param: inspect.Parameter, subclass: Union[type[BaseContext], type[ChatContext]] = BaseContext
|
|
121
|
+
) -> bool:
|
|
122
|
+
# param.annotation.__args__[0] is used to handle Annotated[MyContext, Depends(MyContext(b=2))]
|
|
123
|
+
param_annotation = param.annotation.__args__[0] if hasattr(param.annotation, "__args__") else param.annotation
|
|
124
|
+
try:
|
|
125
|
+
return isinstance(param_annotation, type) and issubclass(param_annotation, subclass)
|
|
126
|
+
except TypeError:
|
|
127
|
+
return False
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _is_depends_param(param: inspect.Parameter) -> bool:
|
|
131
|
+
return isinstance(param.default, model.Depends) or (
|
|
132
|
+
hasattr(param.annotation, "__metadata__")
|
|
133
|
+
and type(param.annotation.__metadata__) == tuple
|
|
134
|
+
and isinstance(param.annotation.__metadata__[0], model.Depends)
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def remove_params(func: Callable[..., Any], sig: inspect.Signature, params: Iterable[str]) -> None:
|
|
139
|
+
new_signature = sig.replace(parameters=[p for p in sig.parameters.values() if p.name not in params])
|
|
140
|
+
func.__signature__ = new_signature # type: ignore[attr-defined]
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _remove_injected_params_from_signature(func: Callable[..., Any]) -> Callable[..., Any]:
|
|
144
|
+
# This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
|
|
145
|
+
if sys.version_info >= (3, 9) and isinstance(func, staticmethod) and hasattr(func, "__func__"):
|
|
146
|
+
func = _fix_staticmethod(func)
|
|
147
|
+
|
|
148
|
+
sig = inspect.signature(func)
|
|
149
|
+
params_to_remove = [p.name for p in sig.parameters.values() if _is_context_param(p) or _is_depends_param(p)]
|
|
150
|
+
remove_params(func, sig, params_to_remove)
|
|
151
|
+
return func
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class Field:
|
|
155
|
+
"""Represents a description field for use in type annotations.
|
|
156
|
+
|
|
157
|
+
This class is used to store a description for an annotated field, often used for
|
|
158
|
+
documenting or validating fields in a context or data model.
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
def __init__(self, description: str) -> None:
|
|
162
|
+
"""Initializes the Field with a description.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
description: The description text for the field.
|
|
166
|
+
"""
|
|
167
|
+
self._description = description
|
|
168
|
+
|
|
169
|
+
@property
|
|
170
|
+
def description(self) -> str:
|
|
171
|
+
return self._description
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _string_metadata_to_description_field(func: Callable[..., Any]) -> Callable[..., Any]:
|
|
175
|
+
type_hints = get_type_hints(func, include_extras=True)
|
|
176
|
+
|
|
177
|
+
for _, annotation in type_hints.items():
|
|
178
|
+
# Check if the annotation itself has metadata (using __metadata__)
|
|
179
|
+
if hasattr(annotation, "__metadata__"):
|
|
180
|
+
metadata = annotation.__metadata__
|
|
181
|
+
if metadata and isinstance(metadata[0], str):
|
|
182
|
+
# Replace string metadata with Field
|
|
183
|
+
annotation.__metadata__ = (Field(description=metadata[0]),)
|
|
184
|
+
# For Python < 3.11, annotations like `Optional` are stored as `Union`, so metadata
|
|
185
|
+
# would be in the first element of __args__ (e.g., `__args__[0]` for `int` in `Optional[int]`)
|
|
186
|
+
elif hasattr(annotation, "__args__") and hasattr(annotation.__args__[0], "__metadata__"):
|
|
187
|
+
metadata = annotation.__args__[0].__metadata__
|
|
188
|
+
if metadata and isinstance(metadata[0], str):
|
|
189
|
+
# Replace string metadata with Field
|
|
190
|
+
annotation.__args__[0].__metadata__ = (Field(description=metadata[0]),)
|
|
191
|
+
return func
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _fix_staticmethod(f: Callable[..., Any]) -> Callable[..., Any]:
|
|
195
|
+
# This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
|
|
196
|
+
if sys.version_info >= (3, 9) and isinstance(f, staticmethod) and hasattr(f, "__func__"):
|
|
197
|
+
|
|
198
|
+
@wraps(f.__func__)
|
|
199
|
+
def wrapper(*args: Any, **kwargs: Any) -> Any:
|
|
200
|
+
return f.__func__(*args, **kwargs) # type: ignore[attr-defined]
|
|
201
|
+
|
|
202
|
+
wrapper.__name__ = f.__func__.__name__
|
|
203
|
+
|
|
204
|
+
f = wrapper
|
|
205
|
+
return f
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _set_return_annotation_to_any(f: Callable[..., Any]) -> Callable[..., Any]:
|
|
209
|
+
if inspect.iscoroutinefunction(f):
|
|
210
|
+
|
|
211
|
+
@functools.wraps(f)
|
|
212
|
+
async def _a_wrapped_func(*args: Any, **kwargs: Any) -> Any:
|
|
213
|
+
return await f(*args, **kwargs)
|
|
214
|
+
|
|
215
|
+
wrapped_func = _a_wrapped_func
|
|
216
|
+
|
|
217
|
+
else:
|
|
218
|
+
|
|
219
|
+
@functools.wraps(f)
|
|
220
|
+
def _wrapped_func(*args: Any, **kwargs: Any) -> Any:
|
|
221
|
+
return f(*args, **kwargs)
|
|
222
|
+
|
|
223
|
+
wrapped_func = _wrapped_func
|
|
224
|
+
|
|
225
|
+
sig = inspect.signature(f)
|
|
226
|
+
|
|
227
|
+
# Change the return annotation directly on the signature of the wrapper
|
|
228
|
+
wrapped_func.__signature__ = sig.replace(return_annotation=Any) # type: ignore[attr-defined]
|
|
229
|
+
|
|
230
|
+
return wrapped_func
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def inject_params(f: Callable[..., Any]) -> Callable[..., Any]:
|
|
234
|
+
"""Injects parameters into a function, removing injected dependencies from its signature.
|
|
235
|
+
|
|
236
|
+
This function is used to modify a function by injecting dependencies and removing
|
|
237
|
+
injected parameters from the function's signature.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
f: The function to modify with dependency injection.
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
The modified function with injected dependencies and updated signature.
|
|
244
|
+
"""
|
|
245
|
+
# This is a workaround for Python 3.9+ where staticmethod.__func__ is accessible
|
|
246
|
+
if sys.version_info >= (3, 9) and isinstance(f, staticmethod) and hasattr(f, "__func__"):
|
|
247
|
+
f = _fix_staticmethod(f)
|
|
248
|
+
|
|
249
|
+
f = _string_metadata_to_description_field(f)
|
|
250
|
+
f = _set_return_annotation_to_any(f)
|
|
251
|
+
f = inject(f)
|
|
252
|
+
f = _remove_injected_params_from_signature(f)
|
|
253
|
+
|
|
254
|
+
return f
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from .browser_use import BrowserUseTool
|
|
6
|
+
from .crawl4ai import Crawl4AITool
|
|
7
|
+
from .deep_research import DeepResearchTool
|
|
8
|
+
from .duckduckgo import DuckDuckGoSearchTool
|
|
9
|
+
from .google_search import GoogleSearchTool, YoutubeSearchTool
|
|
10
|
+
from .messageplatform import (
|
|
11
|
+
DiscordRetrieveTool,
|
|
12
|
+
DiscordSendTool,
|
|
13
|
+
SlackRetrieveRepliesTool,
|
|
14
|
+
SlackRetrieveTool,
|
|
15
|
+
SlackSendTool,
|
|
16
|
+
TelegramRetrieveTool,
|
|
17
|
+
TelegramSendTool,
|
|
18
|
+
)
|
|
19
|
+
from .perplexity import PerplexitySearchTool
|
|
20
|
+
from .tavily import TavilySearchTool
|
|
21
|
+
from .web_search_preview import WebSearchPreviewTool
|
|
22
|
+
from .wikipedia import WikipediaPageLoadTool, WikipediaQueryRunTool
|
|
23
|
+
|
|
24
|
+
__all__ = [
|
|
25
|
+
"BrowserUseTool",
|
|
26
|
+
"Crawl4AITool",
|
|
27
|
+
"DeepResearchTool",
|
|
28
|
+
"DiscordRetrieveTool",
|
|
29
|
+
"DiscordSendTool",
|
|
30
|
+
"DuckDuckGoSearchTool",
|
|
31
|
+
"GoogleSearchTool",
|
|
32
|
+
"PerplexitySearchTool",
|
|
33
|
+
"SlackRetrieveRepliesTool",
|
|
34
|
+
"SlackRetrieveTool",
|
|
35
|
+
"SlackSendTool",
|
|
36
|
+
"TavilySearchTool",
|
|
37
|
+
"TelegramRetrieveTool",
|
|
38
|
+
"TelegramSendTool",
|
|
39
|
+
"WebSearchPreviewTool",
|
|
40
|
+
"WikipediaPageLoadTool",
|
|
41
|
+
"WikipediaQueryRunTool",
|
|
42
|
+
"YoutubeSearchTool",
|
|
43
|
+
]
|
|
@@ -0,0 +1,7 @@
|
|
|
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 .browser_use import BrowserUseResult, BrowserUseTool, ExtractedContent
|
|
6
|
+
|
|
7
|
+
__all__ = ["BrowserUseResult", "BrowserUseTool", "ExtractedContent"]
|