ag2 0.9.1a1__py3-none-any.whl → 0.9.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.
Potentially problematic release.
This version of ag2 might be problematic. Click here for more details.
- {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info}/METADATA +272 -75
- ag2-0.9.2.dist-info/RECORD +406 -0
- {ag2-0.9.1a1.dist-info → ag2-0.9.2.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 +4023 -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 +1013 -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 +179 -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 +382 -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/__main__.py +78 -0
- autogen/mcp/mcp_client.py +208 -0
- autogen/mcp/mcp_proxy/__init__.py +19 -0
- autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +63 -0
- autogen/mcp/mcp_proxy/mcp_proxy.py +581 -0
- autogen/mcp/mcp_proxy/operation_grouping.py +158 -0
- autogen/mcp/mcp_proxy/operation_renaming.py +114 -0
- autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
- autogen/mcp/mcp_proxy/security.py +400 -0
- autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -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 +1444 -0
- autogen/oai/client_utils.py +169 -0
- autogen/oai/cohere.py +479 -0
- autogen/oai/gemini.py +998 -0
- autogen/oai/gemini_types.py +155 -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 +48 -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/reliable/__init__.py +10 -0
- autogen/tools/experimental/reliable/reliable.py +1316 -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
- templates/client_template/main.jinja2 +69 -0
- templates/config_template/config.jinja2 +7 -0
- templates/main.jinja2 +61 -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.2.dist-info/licenses}/LICENSE +0 -0
- {ag2-0.9.1a1.dist-info → ag2-0.9.2.dist-info/licenses}/NOTICE.md +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
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 .crewai import CrewAIInteroperability
|
|
6
|
+
from .interoperability import Interoperability
|
|
7
|
+
from .interoperable import Interoperable
|
|
8
|
+
from .langchain import LangChainChatModelFactory, LangChainInteroperability
|
|
9
|
+
from .litellm import LiteLLmConfigFactory
|
|
10
|
+
from .pydantic_ai import PydanticAIInteroperability
|
|
11
|
+
from .registry import register_interoperable_class
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"CrewAIInteroperability",
|
|
15
|
+
"Interoperability",
|
|
16
|
+
"Interoperable",
|
|
17
|
+
"LangChainChatModelFactory",
|
|
18
|
+
"LangChainInteroperability",
|
|
19
|
+
"LiteLLmConfigFactory",
|
|
20
|
+
"PydanticAIInteroperability",
|
|
21
|
+
"register_interoperable_class",
|
|
22
|
+
]
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
import sys
|
|
7
|
+
from typing import Any, Optional
|
|
8
|
+
|
|
9
|
+
from ...doc_utils import export_module
|
|
10
|
+
from ...import_utils import optional_import_block, require_optional_import
|
|
11
|
+
from ...tools import Tool
|
|
12
|
+
from ..registry import register_interoperable_class
|
|
13
|
+
|
|
14
|
+
__all__ = ["CrewAIInteroperability"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _sanitize_name(s: str) -> str:
|
|
18
|
+
return re.sub(r"\W|^(?=\d)", "_", s)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
with optional_import_block():
|
|
22
|
+
from crewai.tools import BaseTool as CrewAITool
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@register_interoperable_class("crewai")
|
|
26
|
+
@export_module("autogen.interop")
|
|
27
|
+
class CrewAIInteroperability:
|
|
28
|
+
"""A class implementing the `Interoperable` protocol for converting CrewAI tools
|
|
29
|
+
to a general `Tool` format.
|
|
30
|
+
|
|
31
|
+
This class takes a `CrewAITool` and converts it into a standard `Tool` object.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
@require_optional_import("crewai", "interop-crewai")
|
|
36
|
+
def convert_tool(cls, tool: Any, **kwargs: Any) -> Tool:
|
|
37
|
+
"""Converts a given CrewAI tool into a general `Tool` format.
|
|
38
|
+
|
|
39
|
+
This method ensures that the provided tool is a valid `CrewAITool`, sanitizes
|
|
40
|
+
the tool's name, processes its description, and prepares a function to interact
|
|
41
|
+
with the tool's arguments. It then returns a standardized `Tool` object.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
tool (Any): The tool to convert, expected to be an instance of `CrewAITool`.
|
|
45
|
+
**kwargs (Any): Additional arguments, which are not supported by this method.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Tool: A standardized `Tool` object converted from the CrewAI tool.
|
|
49
|
+
|
|
50
|
+
Raises:
|
|
51
|
+
ValueError: If the provided tool is not an instance of `CrewAITool`, or if
|
|
52
|
+
any additional arguments are passed.
|
|
53
|
+
"""
|
|
54
|
+
if not isinstance(tool, CrewAITool):
|
|
55
|
+
raise ValueError(f"Expected an instance of `crewai.tools.BaseTool`, got {type(tool)}")
|
|
56
|
+
if kwargs:
|
|
57
|
+
raise ValueError(f"The CrewAIInteroperability does not support any additional arguments, got {kwargs}")
|
|
58
|
+
|
|
59
|
+
# needed for type checking
|
|
60
|
+
crewai_tool: CrewAITool = tool # type: ignore[no-any-unimported]
|
|
61
|
+
|
|
62
|
+
name = _sanitize_name(crewai_tool.name)
|
|
63
|
+
description = (
|
|
64
|
+
crewai_tool.description.split("Tool Description: ")[-1]
|
|
65
|
+
+ " (IMPORTANT: When using arguments, put them all in an `args` dictionary)"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def func(args: crewai_tool.args_schema) -> Any: # type: ignore[no-any-unimported]
|
|
69
|
+
return crewai_tool.run(**args.model_dump())
|
|
70
|
+
|
|
71
|
+
return Tool(
|
|
72
|
+
name=name,
|
|
73
|
+
description=description,
|
|
74
|
+
func_or_tool=func,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
@classmethod
|
|
78
|
+
def get_unsupported_reason(cls) -> Optional[str]:
|
|
79
|
+
if sys.version_info < (3, 10) or sys.version_info >= (3, 13):
|
|
80
|
+
return "This submodule is only supported for Python versions 3.10, 3.11, and 3.12"
|
|
81
|
+
|
|
82
|
+
with optional_import_block() as result:
|
|
83
|
+
import crewai.tools # noqa: F401
|
|
84
|
+
|
|
85
|
+
if not result.is_successful:
|
|
86
|
+
return "Please install `interop-crewai` extra to use this module:\n\n\tpip install ag2[interop-crewai]"
|
|
87
|
+
|
|
88
|
+
return None
|
|
@@ -0,0 +1,71 @@
|
|
|
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 Any
|
|
5
|
+
|
|
6
|
+
from ..doc_utils import export_module
|
|
7
|
+
from ..tools import Tool
|
|
8
|
+
from .interoperable import Interoperable
|
|
9
|
+
from .registry import InteroperableRegistry
|
|
10
|
+
|
|
11
|
+
__all__ = ["Interoperable"]
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@export_module("autogen.interop")
|
|
15
|
+
class Interoperability:
|
|
16
|
+
"""A class to handle interoperability between different tool types.
|
|
17
|
+
|
|
18
|
+
This class allows the conversion of tools to various interoperability classes and provides functionality
|
|
19
|
+
for retrieving and registering interoperability classes.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
registry = InteroperableRegistry.get_instance()
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def convert_tool(cls, *, tool: Any, type: str, **kwargs: Any) -> Tool:
|
|
26
|
+
"""Converts a given tool to an instance of a specified interoperability type.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
tool (Any): The tool object to be converted.
|
|
30
|
+
type (str): The type of interoperability to convert the tool to.
|
|
31
|
+
**kwargs (Any): Additional arguments to be passed during conversion.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Tool: The converted tool.
|
|
35
|
+
|
|
36
|
+
Raises:
|
|
37
|
+
ValueError: If the interoperability class for the provided type is not found.
|
|
38
|
+
"""
|
|
39
|
+
interop = cls.get_interoperability_class(type)
|
|
40
|
+
return interop.convert_tool(tool, **kwargs)
|
|
41
|
+
|
|
42
|
+
@classmethod
|
|
43
|
+
def get_interoperability_class(cls, type: str) -> type[Interoperable]:
|
|
44
|
+
"""Retrieves the interoperability class corresponding to the specified type.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
type (str): The type of the interoperability class to retrieve.
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
type[Interoperable]: The interoperability class type.
|
|
51
|
+
|
|
52
|
+
Raises:
|
|
53
|
+
ValueError: If no interoperability class is found for the provided type.
|
|
54
|
+
"""
|
|
55
|
+
supported_types = cls.registry.get_supported_types()
|
|
56
|
+
if type not in supported_types:
|
|
57
|
+
supported_types_formatted = ", ".join(["'t'" for t in supported_types])
|
|
58
|
+
raise ValueError(
|
|
59
|
+
f"Interoperability class {type} is not supported, supported types: {supported_types_formatted}"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
return cls.registry.get_class(type)
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def get_supported_types(cls) -> list[str]:
|
|
66
|
+
"""Returns a sorted list of all supported interoperability types.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
List[str]: A sorted list of strings representing the supported interoperability types.
|
|
70
|
+
"""
|
|
71
|
+
return sorted(cls.registry.get_supported_types())
|
|
@@ -0,0 +1,46 @@
|
|
|
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 typing import Any, Optional, Protocol, runtime_checkable
|
|
6
|
+
|
|
7
|
+
from ..doc_utils import export_module
|
|
8
|
+
from ..tools import Tool
|
|
9
|
+
|
|
10
|
+
__all__ = ["Interoperable"]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@runtime_checkable
|
|
14
|
+
@export_module("autogen.interop")
|
|
15
|
+
class Interoperable(Protocol):
|
|
16
|
+
"""A Protocol defining the interoperability interface for tool conversion.
|
|
17
|
+
|
|
18
|
+
This protocol ensures that any class implementing it provides the method
|
|
19
|
+
`convert_tool` to convert a given tool into a desired format or type.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
@classmethod
|
|
23
|
+
def convert_tool(cls, tool: Any, **kwargs: Any) -> Tool:
|
|
24
|
+
"""Converts a given tool to a desired format or type.
|
|
25
|
+
|
|
26
|
+
This method should be implemented by any class adhering to the `Interoperable` protocol.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
tool (Any): The tool object to be converted.
|
|
30
|
+
**kwargs (Any): Additional parameters to pass during the conversion process.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Tool: The converted tool in the desired format or type.
|
|
34
|
+
"""
|
|
35
|
+
...
|
|
36
|
+
|
|
37
|
+
@classmethod
|
|
38
|
+
def get_unsupported_reason(cls) -> Optional[str]:
|
|
39
|
+
"""Returns the reason for the tool being unsupported.
|
|
40
|
+
|
|
41
|
+
This method should be implemented by any class adhering to the `Interoperable` protocol.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
str: The reason for the interoperability class being unsupported.
|
|
45
|
+
"""
|
|
46
|
+
...
|
|
@@ -0,0 +1,8 @@
|
|
|
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 .langchain_chat_model_factory import LangChainChatModelFactory
|
|
6
|
+
from .langchain_tool import LangChainInteroperability
|
|
7
|
+
|
|
8
|
+
__all__ = ["LangChainChatModelFactory", "LangChainInteroperability"]
|
|
@@ -0,0 +1,155 @@
|
|
|
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 abc import ABC, abstractmethod
|
|
6
|
+
from typing import Any, Callable, TypeVar, Union
|
|
7
|
+
|
|
8
|
+
from ...doc_utils import export_module
|
|
9
|
+
from ...import_utils import optional_import_block, require_optional_import
|
|
10
|
+
from ...llm_config import LLMConfig
|
|
11
|
+
from ...oai import get_first_llm_config
|
|
12
|
+
|
|
13
|
+
with optional_import_block():
|
|
14
|
+
from langchain_anthropic import ChatAnthropic
|
|
15
|
+
from langchain_core.language_models import BaseChatModel
|
|
16
|
+
from langchain_google_genai import ChatGoogleGenerativeAI
|
|
17
|
+
from langchain_ollama import ChatOllama
|
|
18
|
+
from langchain_openai import AzureChatOpenAI, ChatOpenAI
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
__all__ = ["LangChainChatModelFactory"]
|
|
22
|
+
|
|
23
|
+
T = TypeVar("T", bound="LangChainChatModelFactory")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@require_optional_import(
|
|
27
|
+
["langchain_anthropic", "langchain_google_genai", "langchain_ollama", "langchain_openai", "langchain_core"],
|
|
28
|
+
"browser-use",
|
|
29
|
+
except_for=["__init__", "register_factory"],
|
|
30
|
+
)
|
|
31
|
+
@export_module("autogen.interop")
|
|
32
|
+
class LangChainChatModelFactory(ABC):
|
|
33
|
+
_factories: set["LangChainChatModelFactory"] = set()
|
|
34
|
+
|
|
35
|
+
@classmethod
|
|
36
|
+
def create_base_chat_model(cls, llm_config: Union[LLMConfig, dict[str, Any]]) -> "BaseChatModel": # type: ignore [no-any-unimported]
|
|
37
|
+
first_llm_config = get_first_llm_config(llm_config)
|
|
38
|
+
for factory in LangChainChatModelFactory._factories:
|
|
39
|
+
if factory.accepts(first_llm_config):
|
|
40
|
+
return factory.create(first_llm_config)
|
|
41
|
+
|
|
42
|
+
raise ValueError("Could not find a factory for the given config.")
|
|
43
|
+
|
|
44
|
+
@classmethod
|
|
45
|
+
def register_factory(cls) -> Callable[[type[T]], type[T]]:
|
|
46
|
+
def decorator(factory: type[T]) -> type[T]:
|
|
47
|
+
cls._factories.add(factory())
|
|
48
|
+
return factory
|
|
49
|
+
|
|
50
|
+
return decorator
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def prepare_config(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
|
|
54
|
+
for pop_keys in ["api_type", "response_format"]:
|
|
55
|
+
first_llm_config.pop(pop_keys, None)
|
|
56
|
+
return first_llm_config
|
|
57
|
+
|
|
58
|
+
@classmethod
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def create(cls, first_llm_config: dict[str, Any]) -> "BaseChatModel": # type: ignore [no-any-unimported]
|
|
61
|
+
...
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
@abstractmethod
|
|
65
|
+
def get_api_type(cls) -> str: ...
|
|
66
|
+
|
|
67
|
+
@classmethod
|
|
68
|
+
def accepts(cls, first_llm_config: dict[str, Any]) -> bool:
|
|
69
|
+
return first_llm_config.get("api_type", "openai") == cls.get_api_type() # type: ignore [no-any-return]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@LangChainChatModelFactory.register_factory()
|
|
73
|
+
class ChatOpenAIFactory(LangChainChatModelFactory):
|
|
74
|
+
@classmethod
|
|
75
|
+
def create(cls, first_llm_config: dict[str, Any]) -> "ChatOpenAI": # type: ignore [no-any-unimported]
|
|
76
|
+
first_llm_config = cls.prepare_config(first_llm_config)
|
|
77
|
+
|
|
78
|
+
return ChatOpenAI(**first_llm_config)
|
|
79
|
+
|
|
80
|
+
@classmethod
|
|
81
|
+
def get_api_type(cls) -> str:
|
|
82
|
+
return "openai"
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@LangChainChatModelFactory.register_factory()
|
|
86
|
+
class DeepSeekFactory(ChatOpenAIFactory):
|
|
87
|
+
@classmethod
|
|
88
|
+
def create(cls, first_llm_config: dict[str, Any]) -> "ChatOpenAI": # type: ignore [no-any-unimported]
|
|
89
|
+
if "base_url" not in first_llm_config:
|
|
90
|
+
raise ValueError("base_url is required for deepseek api type.")
|
|
91
|
+
return super().create(first_llm_config)
|
|
92
|
+
|
|
93
|
+
@classmethod
|
|
94
|
+
def get_api_type(cls) -> str:
|
|
95
|
+
return "deepseek"
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
@LangChainChatModelFactory.register_factory()
|
|
99
|
+
class ChatAnthropicFactory(LangChainChatModelFactory):
|
|
100
|
+
@classmethod
|
|
101
|
+
def create(cls, first_llm_config: dict[str, Any]) -> "ChatAnthropic": # type: ignore [no-any-unimported]
|
|
102
|
+
first_llm_config = cls.prepare_config(first_llm_config)
|
|
103
|
+
|
|
104
|
+
return ChatAnthropic(**first_llm_config)
|
|
105
|
+
|
|
106
|
+
@classmethod
|
|
107
|
+
def get_api_type(cls) -> str:
|
|
108
|
+
return "anthropic"
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@LangChainChatModelFactory.register_factory()
|
|
112
|
+
class ChatGoogleGenerativeAIFactory(LangChainChatModelFactory):
|
|
113
|
+
@classmethod
|
|
114
|
+
def create(cls, first_llm_config: dict[str, Any]) -> "ChatGoogleGenerativeAI": # type: ignore [no-any-unimported]
|
|
115
|
+
first_llm_config = cls.prepare_config(first_llm_config)
|
|
116
|
+
|
|
117
|
+
return ChatGoogleGenerativeAI(**first_llm_config)
|
|
118
|
+
|
|
119
|
+
@classmethod
|
|
120
|
+
def get_api_type(cls) -> str:
|
|
121
|
+
return "google"
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@LangChainChatModelFactory.register_factory()
|
|
125
|
+
class AzureChatOpenAIFactory(LangChainChatModelFactory):
|
|
126
|
+
@classmethod
|
|
127
|
+
def create(cls, first_llm_config: dict[str, Any]) -> "AzureChatOpenAI": # type: ignore [no-any-unimported]
|
|
128
|
+
first_llm_config = cls.prepare_config(first_llm_config)
|
|
129
|
+
for param in ["base_url", "api_version"]:
|
|
130
|
+
if param not in first_llm_config:
|
|
131
|
+
raise ValueError(f"{param} is required for azure api type.")
|
|
132
|
+
first_llm_config["azure_endpoint"] = first_llm_config.pop("base_url")
|
|
133
|
+
|
|
134
|
+
return AzureChatOpenAI(**first_llm_config)
|
|
135
|
+
|
|
136
|
+
@classmethod
|
|
137
|
+
def get_api_type(cls) -> str:
|
|
138
|
+
return "azure"
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@LangChainChatModelFactory.register_factory()
|
|
142
|
+
class ChatOllamaFactory(LangChainChatModelFactory):
|
|
143
|
+
@classmethod
|
|
144
|
+
def create(cls, first_llm_config: dict[str, Any]) -> "ChatOllama": # type: ignore [no-any-unimported]
|
|
145
|
+
first_llm_config = cls.prepare_config(first_llm_config)
|
|
146
|
+
first_llm_config["base_url"] = first_llm_config.pop("client_host", None)
|
|
147
|
+
if "num_ctx" not in first_llm_config:
|
|
148
|
+
# In all Browser Use examples, num_ctx is set to 32000
|
|
149
|
+
first_llm_config["num_ctx"] = 32000
|
|
150
|
+
|
|
151
|
+
return ChatOllama(**first_llm_config)
|
|
152
|
+
|
|
153
|
+
@classmethod
|
|
154
|
+
def get_api_type(cls) -> str:
|
|
155
|
+
return "ollama"
|
|
@@ -0,0 +1,82 @@
|
|
|
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 sys
|
|
6
|
+
from typing import Any, Optional
|
|
7
|
+
|
|
8
|
+
from ...doc_utils import export_module
|
|
9
|
+
from ...import_utils import optional_import_block, require_optional_import
|
|
10
|
+
from ...tools import Tool
|
|
11
|
+
from ..registry import register_interoperable_class
|
|
12
|
+
|
|
13
|
+
__all__ = ["LangChainInteroperability"]
|
|
14
|
+
|
|
15
|
+
with optional_import_block():
|
|
16
|
+
from langchain_core.tools import BaseTool as LangchainTool
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@register_interoperable_class("langchain")
|
|
20
|
+
@export_module("autogen.interop")
|
|
21
|
+
class LangChainInteroperability:
|
|
22
|
+
"""A class implementing the `Interoperable` protocol for converting Langchain tools
|
|
23
|
+
into a general `Tool` format.
|
|
24
|
+
|
|
25
|
+
This class takes a `LangchainTool` and converts it into a standard `Tool` object,
|
|
26
|
+
ensuring compatibility between Langchain tools and other systems that expect
|
|
27
|
+
the `Tool` format.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
@require_optional_import("langchain_core", "interop-langchain")
|
|
32
|
+
def convert_tool(cls, tool: Any, **kwargs: Any) -> Tool:
|
|
33
|
+
"""Converts a given Langchain tool into a general `Tool` format.
|
|
34
|
+
|
|
35
|
+
This method verifies that the provided tool is a valid `LangchainTool`,
|
|
36
|
+
processes the tool's input and description, and returns a standardized
|
|
37
|
+
`Tool` object.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
tool (Any): The tool to convert, expected to be an instance of `LangchainTool`.
|
|
41
|
+
**kwargs (Any): Additional arguments, which are not supported by this method.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
Tool: A standardized `Tool` object converted from the Langchain tool.
|
|
45
|
+
|
|
46
|
+
Raises:
|
|
47
|
+
ValueError: If the provided tool is not an instance of `LangchainTool`, or if
|
|
48
|
+
any additional arguments are passed.
|
|
49
|
+
"""
|
|
50
|
+
if not isinstance(tool, LangchainTool):
|
|
51
|
+
raise ValueError(f"Expected an instance of `langchain_core.tools.BaseTool`, got {type(tool)}")
|
|
52
|
+
if kwargs:
|
|
53
|
+
raise ValueError(f"The LangchainInteroperability does not support any additional arguments, got {kwargs}")
|
|
54
|
+
|
|
55
|
+
# needed for type checking
|
|
56
|
+
langchain_tool: LangchainTool = tool # type: ignore[no-any-unimported]
|
|
57
|
+
|
|
58
|
+
model_type = langchain_tool.get_input_schema()
|
|
59
|
+
|
|
60
|
+
def func(tool_input: model_type) -> Any: # type: ignore[valid-type]
|
|
61
|
+
return langchain_tool.run(tool_input.model_dump()) # type: ignore[attr-defined]
|
|
62
|
+
|
|
63
|
+
return Tool(
|
|
64
|
+
name=langchain_tool.name,
|
|
65
|
+
description=langchain_tool.description,
|
|
66
|
+
func_or_tool=func,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def get_unsupported_reason(cls) -> Optional[str]:
|
|
71
|
+
if sys.version_info < (3, 9):
|
|
72
|
+
return "This submodule is only supported for Python versions 3.9 and above"
|
|
73
|
+
|
|
74
|
+
with optional_import_block() as result:
|
|
75
|
+
import langchain_core.tools # noqa: F401
|
|
76
|
+
|
|
77
|
+
if not result.is_successful:
|
|
78
|
+
return (
|
|
79
|
+
"Please install `interop-langchain` extra to use this module:\n\n\tpip install ag2[interop-langchain]"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
return None
|
|
@@ -0,0 +1,179 @@
|
|
|
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 os
|
|
6
|
+
from abc import ABC, abstractmethod
|
|
7
|
+
from typing import Any, Callable, Optional, TypeVar, Union
|
|
8
|
+
|
|
9
|
+
from ...doc_utils import export_module
|
|
10
|
+
from ...llm_config import LLMConfig
|
|
11
|
+
from ...oai import get_first_llm_config
|
|
12
|
+
|
|
13
|
+
__all__ = ["LiteLLmConfigFactory"]
|
|
14
|
+
|
|
15
|
+
T = TypeVar("T", bound="LiteLLmConfigFactory")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def get_crawl4ai_version() -> Optional[str]:
|
|
19
|
+
"""Get the installed crawl4ai version."""
|
|
20
|
+
try:
|
|
21
|
+
import crawl4ai
|
|
22
|
+
|
|
23
|
+
version = getattr(crawl4ai, "__version__", None)
|
|
24
|
+
return version if isinstance(version, str) else None
|
|
25
|
+
except (ImportError, AttributeError):
|
|
26
|
+
return None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def is_crawl4ai_v05_or_higher() -> bool:
|
|
30
|
+
"""Check if crawl4ai version is 0.5 or higher."""
|
|
31
|
+
version = get_crawl4ai_version()
|
|
32
|
+
if version is None:
|
|
33
|
+
return False
|
|
34
|
+
|
|
35
|
+
# Parse version string (e.g., "0.5.0" -> [0, 5, 0])
|
|
36
|
+
try:
|
|
37
|
+
version_parts = [int(x) for x in version.split(".")]
|
|
38
|
+
# Check if version >= 0.5.0
|
|
39
|
+
return version_parts >= [0, 5, 0]
|
|
40
|
+
except (ValueError, IndexError):
|
|
41
|
+
return False
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@export_module("autogen.interop")
|
|
45
|
+
class LiteLLmConfigFactory(ABC):
|
|
46
|
+
_factories: set["LiteLLmConfigFactory"] = set()
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def create_lite_llm_config(cls, llm_config: Union[LLMConfig, dict[str, Any]]) -> dict[str, Any]:
|
|
50
|
+
"""
|
|
51
|
+
Create a lite LLM config compatible with the installed crawl4ai version.
|
|
52
|
+
|
|
53
|
+
For crawl4ai >=0.5: Returns config with llmConfig parameter
|
|
54
|
+
For crawl4ai <0.5: Returns config with provider parameter (legacy)
|
|
55
|
+
"""
|
|
56
|
+
first_llm_config = get_first_llm_config(llm_config)
|
|
57
|
+
for factory in LiteLLmConfigFactory._factories:
|
|
58
|
+
if factory.accepts(first_llm_config):
|
|
59
|
+
base_config = factory.create(first_llm_config)
|
|
60
|
+
|
|
61
|
+
# Check crawl4ai version and adapt config accordingly
|
|
62
|
+
if is_crawl4ai_v05_or_higher():
|
|
63
|
+
return cls._adapt_for_crawl4ai_v05(base_config)
|
|
64
|
+
else:
|
|
65
|
+
return base_config # Use legacy format
|
|
66
|
+
|
|
67
|
+
raise ValueError("Could not find a factory for the given config.")
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def _adapt_for_crawl4ai_v05(cls, base_config: dict[str, Any]) -> dict[str, Any]:
|
|
71
|
+
"""
|
|
72
|
+
Adapt the config for crawl4ai >=0.5 by moving deprecated parameters
|
|
73
|
+
into an llmConfig object.
|
|
74
|
+
"""
|
|
75
|
+
adapted_config = base_config.copy()
|
|
76
|
+
|
|
77
|
+
# Extract deprecated parameters
|
|
78
|
+
llm_config_params = {}
|
|
79
|
+
|
|
80
|
+
if "provider" in adapted_config:
|
|
81
|
+
llm_config_params["provider"] = adapted_config.pop("provider")
|
|
82
|
+
|
|
83
|
+
if "api_token" in adapted_config:
|
|
84
|
+
llm_config_params["api_token"] = adapted_config.pop("api_token")
|
|
85
|
+
|
|
86
|
+
# Add other parameters that should be in llmConfig
|
|
87
|
+
for param in ["base_url", "api_base", "api_version"]:
|
|
88
|
+
if param in adapted_config:
|
|
89
|
+
llm_config_params[param] = adapted_config.pop(param)
|
|
90
|
+
|
|
91
|
+
# Create the llmConfig object if we have parameters for it
|
|
92
|
+
if llm_config_params:
|
|
93
|
+
adapted_config["llmConfig"] = llm_config_params
|
|
94
|
+
|
|
95
|
+
return adapted_config
|
|
96
|
+
|
|
97
|
+
@classmethod
|
|
98
|
+
def register_factory(cls) -> Callable[[type[T]], type[T]]:
|
|
99
|
+
def decorator(factory: type[T]) -> type[T]:
|
|
100
|
+
cls._factories.add(factory())
|
|
101
|
+
return factory
|
|
102
|
+
|
|
103
|
+
return decorator
|
|
104
|
+
|
|
105
|
+
@classmethod
|
|
106
|
+
def create(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
|
|
107
|
+
model = first_llm_config.pop("model")
|
|
108
|
+
api_type = first_llm_config.pop("api_type", "openai")
|
|
109
|
+
|
|
110
|
+
first_llm_config["provider"] = f"{api_type}/{model}"
|
|
111
|
+
return first_llm_config
|
|
112
|
+
|
|
113
|
+
@classmethod
|
|
114
|
+
@abstractmethod
|
|
115
|
+
def get_api_type(cls) -> str: ...
|
|
116
|
+
|
|
117
|
+
@classmethod
|
|
118
|
+
def accepts(cls, first_llm_config: dict[str, Any]) -> bool:
|
|
119
|
+
return first_llm_config.get("api_type", "openai") == cls.get_api_type() # type: ignore [no-any-return]
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@LiteLLmConfigFactory.register_factory()
|
|
123
|
+
class DefaultLiteLLmConfigFactory(LiteLLmConfigFactory):
|
|
124
|
+
@classmethod
|
|
125
|
+
def get_api_type(cls) -> str:
|
|
126
|
+
raise NotImplementedError("DefaultLiteLLmConfigFactory does not have an API type.")
|
|
127
|
+
|
|
128
|
+
@classmethod
|
|
129
|
+
def accepts(cls, first_llm_config: dict[str, Any]) -> bool:
|
|
130
|
+
non_base_api_types = ["google", "ollama"]
|
|
131
|
+
return first_llm_config.get("api_type", "openai") not in non_base_api_types
|
|
132
|
+
|
|
133
|
+
@classmethod
|
|
134
|
+
def create(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
|
|
135
|
+
api_type = first_llm_config.get("api_type", "openai")
|
|
136
|
+
if api_type != "openai" and "api_key" not in first_llm_config:
|
|
137
|
+
raise ValueError("API key is required.")
|
|
138
|
+
first_llm_config["api_token"] = first_llm_config.pop("api_key", os.getenv("OPENAI_API_KEY"))
|
|
139
|
+
|
|
140
|
+
first_llm_config = super().create(first_llm_config)
|
|
141
|
+
|
|
142
|
+
return first_llm_config
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
@LiteLLmConfigFactory.register_factory()
|
|
146
|
+
class GoogleLiteLLmConfigFactory(LiteLLmConfigFactory):
|
|
147
|
+
@classmethod
|
|
148
|
+
def get_api_type(cls) -> str:
|
|
149
|
+
return "google"
|
|
150
|
+
|
|
151
|
+
@classmethod
|
|
152
|
+
def create(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
|
|
153
|
+
# api type must be changed before calling super().create
|
|
154
|
+
# litellm uses gemini as the api type for google
|
|
155
|
+
first_llm_config["api_type"] = "gemini"
|
|
156
|
+
first_llm_config["api_token"] = first_llm_config.pop("api_key")
|
|
157
|
+
first_llm_config = super().create(first_llm_config)
|
|
158
|
+
|
|
159
|
+
return first_llm_config
|
|
160
|
+
|
|
161
|
+
@classmethod
|
|
162
|
+
def accepts(cls, first_llm_config: dict[str, Any]) -> bool:
|
|
163
|
+
api_type: str = first_llm_config.get("api_type", "")
|
|
164
|
+
return api_type == cls.get_api_type() or api_type == "gemini"
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
@LiteLLmConfigFactory.register_factory()
|
|
168
|
+
class OllamaLiteLLmConfigFactory(LiteLLmConfigFactory):
|
|
169
|
+
@classmethod
|
|
170
|
+
def get_api_type(cls) -> str:
|
|
171
|
+
return "ollama"
|
|
172
|
+
|
|
173
|
+
@classmethod
|
|
174
|
+
def create(cls, first_llm_config: dict[str, Any]) -> dict[str, Any]:
|
|
175
|
+
first_llm_config = super().create(first_llm_config)
|
|
176
|
+
if "client_host" in first_llm_config:
|
|
177
|
+
first_llm_config["api_base"] = first_llm_config.pop("client_host")
|
|
178
|
+
|
|
179
|
+
return first_llm_config
|