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,183 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import os
|
|
5
|
+
from typing import Annotated, Any, Optional, Union
|
|
6
|
+
|
|
7
|
+
from ....doc_utils import export_module
|
|
8
|
+
from ....import_utils import optional_import_block, require_optional_import
|
|
9
|
+
from ....llm_config import LLMConfig
|
|
10
|
+
from ... import Depends, Tool
|
|
11
|
+
from ...dependency_injection import on
|
|
12
|
+
|
|
13
|
+
with optional_import_block():
|
|
14
|
+
from tavily import TavilyClient
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@require_optional_import(
|
|
18
|
+
[
|
|
19
|
+
"tavily",
|
|
20
|
+
],
|
|
21
|
+
"tavily",
|
|
22
|
+
)
|
|
23
|
+
def _execute_tavily_query(
|
|
24
|
+
query: str,
|
|
25
|
+
tavily_api_key: str,
|
|
26
|
+
search_depth: str = "basic",
|
|
27
|
+
topic: str = "general",
|
|
28
|
+
include_answer: str = "basic",
|
|
29
|
+
include_raw_content: bool = False,
|
|
30
|
+
include_domains: list[str] = [],
|
|
31
|
+
num_results: int = 5,
|
|
32
|
+
) -> Any:
|
|
33
|
+
"""
|
|
34
|
+
Execute a search query using the Tavily API.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
query (str): The search query string.
|
|
38
|
+
tavily_api_key (str): The API key for Tavily.
|
|
39
|
+
search_depth (str, optional): The depth of the search ('basic' or 'advanced'). Defaults to "basic".
|
|
40
|
+
topic (str, optional): The topic of the search. Defaults to "general".
|
|
41
|
+
include_answer (str, optional): Whether to include an AI-generated answer ('basic' or 'advanced'). Defaults to "basic".
|
|
42
|
+
include_raw_content (bool, optional): Whether to include raw content in the results. Defaults to False.
|
|
43
|
+
include_domains (list[str], optional): A list of domains to include in the search. Defaults to [].
|
|
44
|
+
num_results (int, optional): The maximum number of results to return. Defaults to 5.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
Any: The raw response object from the Tavily API client.
|
|
48
|
+
"""
|
|
49
|
+
tavily_client = TavilyClient(api_key=tavily_api_key)
|
|
50
|
+
return tavily_client.search(
|
|
51
|
+
query=query,
|
|
52
|
+
search_depth=search_depth,
|
|
53
|
+
topic=topic,
|
|
54
|
+
include_answer=include_answer,
|
|
55
|
+
include_raw_content=include_raw_content,
|
|
56
|
+
include_domains=include_domains,
|
|
57
|
+
max_results=num_results,
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _tavily_search(
|
|
62
|
+
query: str,
|
|
63
|
+
tavily_api_key: str,
|
|
64
|
+
search_depth: str = "basic",
|
|
65
|
+
topic: str = "general",
|
|
66
|
+
include_answer: str = "basic",
|
|
67
|
+
include_raw_content: bool = False,
|
|
68
|
+
include_domains: list[str] = [],
|
|
69
|
+
num_results: int = 5,
|
|
70
|
+
) -> list[dict[str, Any]]:
|
|
71
|
+
"""
|
|
72
|
+
Perform a Tavily search and format the results.
|
|
73
|
+
|
|
74
|
+
This function takes search parameters, executes the query using `_execute_tavily_query`,
|
|
75
|
+
and formats the results into a list of dictionaries containing title, link, and snippet.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
query (str): The search query string.
|
|
79
|
+
tavily_api_key (str): The API key for Tavily.
|
|
80
|
+
search_depth (str, optional): The depth of the search ('basic' or 'advanced'). Defaults to "basic".
|
|
81
|
+
topic (str, optional): The topic of the search. Defaults to "general".
|
|
82
|
+
include_answer (str, optional): Whether to include an AI-generated answer ('basic' or 'advanced'). Defaults to "basic".
|
|
83
|
+
include_raw_content (bool, optional): Whether to include raw content in the results. Defaults to False.
|
|
84
|
+
include_domains (list[str], optional): A list of domains to include in the search. Defaults to [].
|
|
85
|
+
num_results (int, optional): The maximum number of results to return. Defaults to 5.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
list[dict[str, Any]]: A list of dictionaries, where each dictionary represents a search result
|
|
89
|
+
with keys 'title', 'link', and 'snippet'. Returns an empty list if no results are found.
|
|
90
|
+
"""
|
|
91
|
+
res = _execute_tavily_query(
|
|
92
|
+
query=query,
|
|
93
|
+
tavily_api_key=tavily_api_key,
|
|
94
|
+
search_depth=search_depth,
|
|
95
|
+
topic=topic,
|
|
96
|
+
include_answer=include_answer,
|
|
97
|
+
include_raw_content=include_raw_content,
|
|
98
|
+
include_domains=include_domains,
|
|
99
|
+
num_results=num_results,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
return [
|
|
103
|
+
{"title": item.get("title", ""), "link": item.get("url", ""), "snippet": item.get("content", "")}
|
|
104
|
+
for item in res.get("results", [])
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
@export_module("autogen.tools.experimental")
|
|
109
|
+
class TavilySearchTool(Tool):
|
|
110
|
+
"""
|
|
111
|
+
TavilySearchTool is a tool that uses the Tavily Search API to perform a search.
|
|
112
|
+
|
|
113
|
+
This tool allows agents to leverage the Tavily search engine for information retrieval.
|
|
114
|
+
It requires a Tavily API key, which can be provided during initialization or set as
|
|
115
|
+
an environment variable `TAVILY_API_KEY`.
|
|
116
|
+
|
|
117
|
+
Attributes:
|
|
118
|
+
tavily_api_key (str): The API key used for authenticating with the Tavily API.
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
def __init__(
|
|
122
|
+
self, *, llm_config: Optional[Union[LLMConfig, dict[str, Any]]] = None, tavily_api_key: Optional[str] = None
|
|
123
|
+
):
|
|
124
|
+
"""
|
|
125
|
+
Initializes the TavilySearchTool.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
llm_config (Optional[Union[LLMConfig, dict[str, Any]]]): LLM configuration. (Currently unused but kept for potential future integration).
|
|
129
|
+
tavily_api_key (Optional[str]): The API key for the Tavily Search API. If not provided,
|
|
130
|
+
it attempts to read from the `TAVILY_API_KEY` environment variable.
|
|
131
|
+
|
|
132
|
+
Raises:
|
|
133
|
+
ValueError: If `tavily_api_key` is not provided either directly or via the environment variable.
|
|
134
|
+
"""
|
|
135
|
+
self.tavily_api_key = tavily_api_key or os.getenv("TAVILY_API_KEY")
|
|
136
|
+
|
|
137
|
+
if self.tavily_api_key is None:
|
|
138
|
+
raise ValueError("tavily_api_key must be provided either as an argument or via TAVILY_API_KEY env var")
|
|
139
|
+
|
|
140
|
+
def tavily_search(
|
|
141
|
+
query: Annotated[str, "The search query."],
|
|
142
|
+
tavily_api_key: Annotated[Optional[str], Depends(on(self.tavily_api_key))],
|
|
143
|
+
search_depth: Annotated[Optional[str], "Either 'advanced' or 'basic'"] = "basic",
|
|
144
|
+
include_answer: Annotated[Optional[str], "Either 'advanced' or 'basic'"] = "basic",
|
|
145
|
+
include_raw_content: Annotated[Optional[bool], "Include the raw contents"] = False,
|
|
146
|
+
include_domains: Annotated[Optional[list[str]], "Specific web domains to search"] = [],
|
|
147
|
+
num_results: Annotated[int, "The number of results to return."] = 5,
|
|
148
|
+
) -> list[dict[str, Any]]:
|
|
149
|
+
"""
|
|
150
|
+
Performs a search using the Tavily API and returns formatted results.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
query: The search query string.
|
|
154
|
+
tavily_api_key: The API key for Tavily (injected dependency).
|
|
155
|
+
search_depth: The depth of the search ('basic' or 'advanced'). Defaults to "basic".
|
|
156
|
+
include_answer: Whether to include an AI-generated answer ('basic' or 'advanced'). Defaults to "basic".
|
|
157
|
+
include_raw_content: Whether to include raw content in the results. Defaults to False.
|
|
158
|
+
include_domains: A list of domains to include in the search. Defaults to [].
|
|
159
|
+
num_results: The maximum number of results to return. Defaults to 5.
|
|
160
|
+
|
|
161
|
+
Returns:
|
|
162
|
+
A list of dictionaries, each containing 'title', 'link', and 'snippet' of a search result.
|
|
163
|
+
|
|
164
|
+
Raises:
|
|
165
|
+
ValueError: If the Tavily API key is not available.
|
|
166
|
+
"""
|
|
167
|
+
if tavily_api_key is None:
|
|
168
|
+
raise ValueError("Tavily API key is missing.")
|
|
169
|
+
return _tavily_search(
|
|
170
|
+
query=query,
|
|
171
|
+
tavily_api_key=tavily_api_key,
|
|
172
|
+
search_depth=search_depth or "basic",
|
|
173
|
+
include_answer=include_answer or "basic",
|
|
174
|
+
include_raw_content=include_raw_content or False,
|
|
175
|
+
include_domains=include_domains or [],
|
|
176
|
+
num_results=num_results,
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
super().__init__(
|
|
180
|
+
name="tavily_search",
|
|
181
|
+
description="Use the Tavily Search API to perform a search.",
|
|
182
|
+
func_or_tool=tavily_search,
|
|
183
|
+
)
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import copy
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
from typing import Annotated, Any, Literal, Optional, Type, Union
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel
|
|
12
|
+
|
|
13
|
+
from ....doc_utils import export_module
|
|
14
|
+
from ....import_utils import optional_import_block, require_optional_import
|
|
15
|
+
from ....llm_config import LLMConfig
|
|
16
|
+
from ... import Tool
|
|
17
|
+
|
|
18
|
+
with optional_import_block():
|
|
19
|
+
from openai import OpenAI
|
|
20
|
+
from openai.types.responses import WebSearchToolParam
|
|
21
|
+
from openai.types.responses.web_search_tool import UserLocation
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@require_optional_import("openai>=1.66.2", "openai")
|
|
25
|
+
@export_module("autogen.tools.experimental")
|
|
26
|
+
class WebSearchPreviewTool(Tool):
|
|
27
|
+
"""WebSearchPreviewTool is a tool that uses OpenAI's web_search_preview tool to perform a search."""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
*,
|
|
32
|
+
llm_config: Union[LLMConfig, dict[str, Any]],
|
|
33
|
+
search_context_size: Literal["low", "medium", "high"] = "medium",
|
|
34
|
+
user_location: Optional[dict[str, str]] = None,
|
|
35
|
+
instructions: Optional[str] = None,
|
|
36
|
+
text_format: Optional[Type[BaseModel]] = None,
|
|
37
|
+
):
|
|
38
|
+
"""Initialize the WebSearchPreviewTool.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
llm_config: The LLM configuration to use. This should be a dictionary
|
|
42
|
+
containing the model name and other parameters.
|
|
43
|
+
search_context_size: The size of the search context. One of `low`, `medium`, or `high`.
|
|
44
|
+
`medium` is the default.
|
|
45
|
+
user_location: The location of the user. This should be a dictionary containing
|
|
46
|
+
the city, country, region, and timezone.
|
|
47
|
+
instructions: Inserts a system (or developer) message as the first item in the model's context.
|
|
48
|
+
text_format: The format of the text to be returned. This should be a subclass of `BaseModel`.
|
|
49
|
+
The default is `None`, which means the text will be returned as a string.
|
|
50
|
+
"""
|
|
51
|
+
self.web_search_tool_param = WebSearchToolParam(
|
|
52
|
+
type="web_search_preview",
|
|
53
|
+
search_context_size=search_context_size,
|
|
54
|
+
user_location=UserLocation(**user_location) if user_location else None, # type: ignore[typeddict-item]
|
|
55
|
+
)
|
|
56
|
+
self.instructions = instructions
|
|
57
|
+
self.text_format = text_format
|
|
58
|
+
|
|
59
|
+
if isinstance(llm_config, LLMConfig):
|
|
60
|
+
llm_config = llm_config.model_dump()
|
|
61
|
+
|
|
62
|
+
llm_config = copy.deepcopy(llm_config)
|
|
63
|
+
|
|
64
|
+
if "config_list" not in llm_config:
|
|
65
|
+
raise ValueError("llm_config must contain 'config_list' key")
|
|
66
|
+
|
|
67
|
+
# Find first OpenAI model which starts with "gpt-4"
|
|
68
|
+
self.model = None
|
|
69
|
+
self.api_key = None
|
|
70
|
+
for model in llm_config["config_list"]:
|
|
71
|
+
if model["model"].startswith("gpt-4") and model.get("api_type", "openai") == "openai":
|
|
72
|
+
self.model = model["model"]
|
|
73
|
+
self.api_key = model.get("api_key", os.getenv("OPENAI_API_KEY"))
|
|
74
|
+
break
|
|
75
|
+
if self.model is None:
|
|
76
|
+
raise ValueError(
|
|
77
|
+
"No OpenAI model starting with 'gpt-4' found in llm_config, other models do not support web_search_preview"
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
if not self.model.startswith("gpt-4.1") and not self.model.startswith("gpt-4o-search-preview"):
|
|
81
|
+
logging.warning(
|
|
82
|
+
f"We recommend using a model starting with 'gpt-4.1' or 'gpt-4o-search-preview' for web_search_preview, but found {self.model}. "
|
|
83
|
+
"This may result in suboptimal performance."
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
def web_search_preview(
|
|
87
|
+
query: Annotated[str, "The search query. Add all relevant context to the query."],
|
|
88
|
+
) -> Union[str, Optional[BaseModel]]:
|
|
89
|
+
client = OpenAI()
|
|
90
|
+
|
|
91
|
+
if not self.text_format:
|
|
92
|
+
response = client.responses.create(
|
|
93
|
+
model=self.model, # type: ignore[arg-type]
|
|
94
|
+
tools=[self.web_search_tool_param],
|
|
95
|
+
input=query,
|
|
96
|
+
instructions=self.instructions,
|
|
97
|
+
)
|
|
98
|
+
return response.output_text
|
|
99
|
+
|
|
100
|
+
else:
|
|
101
|
+
response = client.responses.parse(
|
|
102
|
+
model=self.model, # type: ignore[arg-type]
|
|
103
|
+
tools=[self.web_search_tool_param],
|
|
104
|
+
input=query,
|
|
105
|
+
instructions=self.instructions,
|
|
106
|
+
text_format=self.text_format,
|
|
107
|
+
)
|
|
108
|
+
return response.output_parsed
|
|
109
|
+
|
|
110
|
+
super().__init__(
|
|
111
|
+
name="web_search_preview",
|
|
112
|
+
description="Tool used to perform a web search. It can be used as google search or directly searching a specific website.",
|
|
113
|
+
func_or_tool=web_search_preview,
|
|
114
|
+
)
|
|
@@ -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 .wikipedia import WikipediaPageLoadTool, WikipediaQueryRunTool
|
|
6
|
+
|
|
7
|
+
__all__ = ["WikipediaPageLoadTool", "WikipediaQueryRunTool"]
|
|
@@ -0,0 +1,287 @@
|
|
|
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, Union
|
|
6
|
+
|
|
7
|
+
import requests
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
from autogen.import_utils import optional_import_block, require_optional_import
|
|
11
|
+
from autogen.tools import Tool
|
|
12
|
+
|
|
13
|
+
with optional_import_block():
|
|
14
|
+
import wikipediaapi
|
|
15
|
+
|
|
16
|
+
# Maximum allowed length for a query string.
|
|
17
|
+
MAX_QUERY_LENGTH = 300
|
|
18
|
+
# Maximum number of pages to retrieve from a search.
|
|
19
|
+
MAX_PAGE_RETRIEVE = 100
|
|
20
|
+
# Maximum number of characters to return from a Wikipedia page.
|
|
21
|
+
MAX_ARTICLE_LENGTH = 10000
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Document(BaseModel):
|
|
25
|
+
"""Pydantic model representing a Wikipedia document.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
page_content (str): Textual content of the Wikipedia page
|
|
29
|
+
(possibly truncated).
|
|
30
|
+
metadata (dict[str, str]): Additional info, including:
|
|
31
|
+
- source URL
|
|
32
|
+
- title
|
|
33
|
+
- pageid
|
|
34
|
+
- timestamp
|
|
35
|
+
- word count
|
|
36
|
+
- size
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
page_content: str
|
|
40
|
+
metadata: dict[str, str]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class WikipediaClient:
|
|
44
|
+
"""Client for interacting with the Wikipedia API.
|
|
45
|
+
|
|
46
|
+
Supports searching and page retrieval on a specified language edition.
|
|
47
|
+
|
|
48
|
+
Public methods:
|
|
49
|
+
search(query: str, limit: int) -> list[dict[str, Any]]
|
|
50
|
+
get_page(title: str) -> Optional[wikipediaapi.WikipediaPage]
|
|
51
|
+
|
|
52
|
+
Attributes:
|
|
53
|
+
base_url (str): URL of the MediaWiki API endpoint.
|
|
54
|
+
headers (dict[str, str]): HTTP headers, including User-Agent.
|
|
55
|
+
wiki (wikipediaapi.Wikipedia): Low-level Wikipedia API client.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
def __init__(self, language: str = "en", tool_name: str = "wikipedia-client") -> None:
|
|
59
|
+
"""Initialize the WikipediaClient.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
language (str): ISO code of the Wikipedia edition (e.g., 'en', 'es').
|
|
63
|
+
tool_name (str): Identifier for User-Agent header.
|
|
64
|
+
"""
|
|
65
|
+
self.base_url = f"https://{language}.wikipedia.org/w/api.php"
|
|
66
|
+
self.headers = {"User-Agent": f"autogen.Agent ({tool_name})"}
|
|
67
|
+
self.wiki = wikipediaapi.Wikipedia(
|
|
68
|
+
language=language,
|
|
69
|
+
extract_format=wikipediaapi.ExtractFormat.WIKI,
|
|
70
|
+
user_agent=f"autogen.Agent ({tool_name})",
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def search(self, query: str, limit: int = 3) -> Any:
|
|
74
|
+
"""Search Wikipedia for pages matching a query string.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
query (str): The search keywords.
|
|
78
|
+
limit (int): Max number of results to return.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
list[dict[str, Any]]: Each dict has keys:
|
|
82
|
+
- 'title' (str)
|
|
83
|
+
- 'size' (int)
|
|
84
|
+
- 'wordcount' (int)
|
|
85
|
+
- 'timestamp' (str)
|
|
86
|
+
|
|
87
|
+
Raises:
|
|
88
|
+
requests.HTTPError: If the HTTP request to the API fails.
|
|
89
|
+
"""
|
|
90
|
+
params = {
|
|
91
|
+
"action": "query",
|
|
92
|
+
"format": "json",
|
|
93
|
+
"list": "search",
|
|
94
|
+
"srsearch": query,
|
|
95
|
+
"srlimit": str(limit),
|
|
96
|
+
"srprop": "size|wordcount|timestamp",
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
response = requests.get(url=self.base_url, params=params, headers=self.headers)
|
|
100
|
+
response.raise_for_status()
|
|
101
|
+
data = response.json()
|
|
102
|
+
search_data = data.get("query", {}).get("search", [])
|
|
103
|
+
return search_data
|
|
104
|
+
|
|
105
|
+
def get_page(self, title: str) -> Optional[Any]:
|
|
106
|
+
"""Retrieve a WikipediaPage object by title.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
title (str): Title of the Wikipedia page.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
wikipediaapi.WikipediaPage | None: The page object if it exists,
|
|
113
|
+
otherwise None.
|
|
114
|
+
|
|
115
|
+
Raises:
|
|
116
|
+
wikipediaapi.WikipediaException: On lower‑level API errors.
|
|
117
|
+
"""
|
|
118
|
+
page = self.wiki.page(title)
|
|
119
|
+
if not page.exists():
|
|
120
|
+
return None
|
|
121
|
+
return page
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@require_optional_import(["wikipediaapi"], "wikipedia")
|
|
125
|
+
class WikipediaQueryRunTool(Tool):
|
|
126
|
+
"""Tool for querying Wikipedia and returning summarized page results.
|
|
127
|
+
|
|
128
|
+
This tool uses the `wikipediaapi` package to perform searches
|
|
129
|
+
against a specified language edition of Wikipedia and returns
|
|
130
|
+
up to `top_k` page summaries.
|
|
131
|
+
|
|
132
|
+
Public methods:
|
|
133
|
+
query_run(query: str) -> list[str] | str
|
|
134
|
+
|
|
135
|
+
Attributes:
|
|
136
|
+
language (str): Language code for the Wikipedia edition (e.g., 'en', 'es').
|
|
137
|
+
top_k (int): Max number of page summaries returned (≤ MAX_PAGE_RETRIEVE).
|
|
138
|
+
verbose (bool): If True, enables debug logging to stdout.
|
|
139
|
+
wiki_cli (WikipediaClient): Internal client for Wikipedia API calls.
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
def __init__(self, language: str = "en", top_k: int = 3, verbose: bool = False) -> None:
|
|
143
|
+
"""Initialize the WikipediaQueryRunTool.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
language (str): ISO code of the Wikipedia edition to query.
|
|
147
|
+
top_k (int): Desired number of summaries (capped by MAX_PAGE_RETRIEVE).
|
|
148
|
+
verbose (bool): If True, print debug information during searches.
|
|
149
|
+
"""
|
|
150
|
+
self.language = language
|
|
151
|
+
self.tool_name = "wikipedia-query-run"
|
|
152
|
+
self.wiki_cli = WikipediaClient(language, self.tool_name)
|
|
153
|
+
self.top_k = min(top_k, MAX_PAGE_RETRIEVE)
|
|
154
|
+
self.verbose = verbose
|
|
155
|
+
super().__init__(
|
|
156
|
+
name=self.tool_name,
|
|
157
|
+
description="Run a Wikipedia query and return page summaries.",
|
|
158
|
+
func_or_tool=self.query_run,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
def query_run(self, query: str) -> Union[list[str], str]:
|
|
162
|
+
"""Search Wikipedia and return formatted page summaries.
|
|
163
|
+
|
|
164
|
+
Truncates `query` to MAX_QUERY_LENGTH before searching.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
query (str): Search term(s) to look up in Wikipedia.
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
list[str]: Each element is "Page: <title>\nSummary: <text>".
|
|
171
|
+
str: Error message if no results are found or on exception.
|
|
172
|
+
|
|
173
|
+
Note:
|
|
174
|
+
Automatically handles API exceptions and returns error strings for robust operation
|
|
175
|
+
"""
|
|
176
|
+
try:
|
|
177
|
+
if self.verbose:
|
|
178
|
+
print(f"INFO\t [{self.tool_name}] search query='{query[:MAX_QUERY_LENGTH]}' top_k={self.top_k}")
|
|
179
|
+
search_results = self.wiki_cli.search(query[:MAX_QUERY_LENGTH], limit=self.top_k)
|
|
180
|
+
summaries: list[str] = []
|
|
181
|
+
for item in search_results:
|
|
182
|
+
title = item["title"]
|
|
183
|
+
page = self.wiki_cli.get_page(title)
|
|
184
|
+
# Only format the summary if the page exists and has a summary.
|
|
185
|
+
if page is not None and page.summary:
|
|
186
|
+
summary = f"Page: {title}\nSummary: {page.summary}"
|
|
187
|
+
summaries.append(summary)
|
|
188
|
+
if not summaries:
|
|
189
|
+
return "No good Wikipedia Search Result was found"
|
|
190
|
+
return summaries
|
|
191
|
+
except Exception as e:
|
|
192
|
+
return f"wikipedia search failed: {str(e)}"
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@require_optional_import(["wikipediaapi"], "wikipedia")
|
|
196
|
+
class WikipediaPageLoadTool(Tool):
|
|
197
|
+
"""
|
|
198
|
+
A tool to load up to N characters of Wikipedia page content along with metadata.
|
|
199
|
+
|
|
200
|
+
This tool uses a language-specific Wikipedia client to search for relevant articles
|
|
201
|
+
and returns a list of Document objects containing truncated page content and metadata
|
|
202
|
+
(source URL, title, page ID, timestamp, word count, and size). Ideal for agents
|
|
203
|
+
requiring structured Wikipedia data for research, summarization, or contextual enrichment.
|
|
204
|
+
|
|
205
|
+
Attributes:
|
|
206
|
+
language (str): Wikipedia language code (default: "en").
|
|
207
|
+
top_k (int): Maximum number of pages to retrieve per query (default: 3).
|
|
208
|
+
truncate (int): Maximum number of characters of content per page (default: 4000).
|
|
209
|
+
verbose (bool): If True, prints debug information (default: False).
|
|
210
|
+
tool_name (str): Identifier used in User-Agent header.
|
|
211
|
+
wiki_cli (WikipediaClient): Client for interacting with the Wikipedia API.
|
|
212
|
+
"""
|
|
213
|
+
|
|
214
|
+
def __init__(self, language: str = "en", top_k: int = 3, truncate: int = 4000, verbose: bool = False) -> None:
|
|
215
|
+
"""
|
|
216
|
+
Initializes the WikipediaPageLoadTool with configurable language, result count, and content length.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
language (str): The language code for the Wikipedia edition (default is "en").
|
|
220
|
+
top_k (int): The maximum number of pages to retrieve per query (default is 3;
|
|
221
|
+
capped at MAX_PAGE_RETRIEVE).
|
|
222
|
+
truncate (int): The maximum number of characters to extract from each page (default is 4000;
|
|
223
|
+
capped at MAX_ARTICLE_LENGTH).
|
|
224
|
+
verbose (bool): If True, enables verbose/debug logging (default is False).
|
|
225
|
+
"""
|
|
226
|
+
self.language = language
|
|
227
|
+
self.top_k = min(top_k, MAX_PAGE_RETRIEVE)
|
|
228
|
+
self.truncate = min(truncate, MAX_ARTICLE_LENGTH)
|
|
229
|
+
self.verbose = verbose
|
|
230
|
+
self.tool_name = "wikipedia-page-load"
|
|
231
|
+
self.wiki_cli = WikipediaClient(language, self.tool_name)
|
|
232
|
+
super().__init__(
|
|
233
|
+
name=self.tool_name,
|
|
234
|
+
description=(
|
|
235
|
+
"Search Wikipedia for relevant pages using a language-specific client. "
|
|
236
|
+
"Returns a list of documents with truncated content and metadata including title, URL, "
|
|
237
|
+
"page ID, timestamp, word count, and page size. Configure number of results with the 'top_k' parameter "
|
|
238
|
+
"and content length with 'truncate'. Useful for research, summarization, or contextual enrichment."
|
|
239
|
+
),
|
|
240
|
+
func_or_tool=self.content_search,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
def content_search(self, query: str) -> Union[list[Document], str]:
|
|
244
|
+
"""
|
|
245
|
+
Executes a Wikipedia search and returns page content plus metadata.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
query (str): The search term to query Wikipedia.
|
|
249
|
+
|
|
250
|
+
Returns:
|
|
251
|
+
Union[list[Document], str]:
|
|
252
|
+
- list[Document]: Documents with up to `truncate` characters of page text
|
|
253
|
+
and metadata if pages are found.
|
|
254
|
+
- str: Error message if the search fails or no pages are found.
|
|
255
|
+
|
|
256
|
+
Notes:
|
|
257
|
+
- Errors are caught internally and returned as strings.
|
|
258
|
+
- If no matching pages have text content, returns
|
|
259
|
+
"No good Wikipedia Search Result was found".
|
|
260
|
+
"""
|
|
261
|
+
try:
|
|
262
|
+
if self.verbose:
|
|
263
|
+
print(f"INFO\t [{self.tool_name}] search query='{query[:MAX_QUERY_LENGTH]}' top_k={self.top_k}")
|
|
264
|
+
search_results = self.wiki_cli.search(query[:MAX_QUERY_LENGTH], limit=self.top_k)
|
|
265
|
+
docs: list[Document] = []
|
|
266
|
+
for item in search_results:
|
|
267
|
+
page = self.wiki_cli.get_page(item["title"])
|
|
268
|
+
# Only process pages that exist and have text content.
|
|
269
|
+
if page is not None and page.text:
|
|
270
|
+
document = Document(
|
|
271
|
+
page_content=page.text[: self.truncate],
|
|
272
|
+
metadata={
|
|
273
|
+
"source": f"https://{self.language}.wikipedia.org/?curid={item['pageid']}",
|
|
274
|
+
"title": item["title"],
|
|
275
|
+
"pageid": str(item["pageid"]),
|
|
276
|
+
"timestamp": str(item["timestamp"]),
|
|
277
|
+
"wordcount": str(item["wordcount"]),
|
|
278
|
+
"size": str(item["size"]),
|
|
279
|
+
},
|
|
280
|
+
)
|
|
281
|
+
docs.append(document)
|
|
282
|
+
if not docs:
|
|
283
|
+
return "No good Wikipedia Search Result was found"
|
|
284
|
+
return docs
|
|
285
|
+
|
|
286
|
+
except Exception as e:
|
|
287
|
+
return f"wikipedia search failed: {str(e)}"
|