ag2 0.10.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ag2-0.10.2.dist-info/METADATA +819 -0
- ag2-0.10.2.dist-info/RECORD +423 -0
- ag2-0.10.2.dist-info/WHEEL +4 -0
- ag2-0.10.2.dist-info/licenses/LICENSE +201 -0
- ag2-0.10.2.dist-info/licenses/NOTICE.md +19 -0
- autogen/__init__.py +88 -0
- autogen/_website/__init__.py +3 -0
- autogen/_website/generate_api_references.py +426 -0
- autogen/_website/generate_mkdocs.py +1216 -0
- autogen/_website/notebook_processor.py +475 -0
- autogen/_website/process_notebooks.py +656 -0
- autogen/_website/utils.py +413 -0
- autogen/a2a/__init__.py +36 -0
- autogen/a2a/agent_executor.py +86 -0
- autogen/a2a/client.py +357 -0
- autogen/a2a/errors.py +18 -0
- autogen/a2a/httpx_client_factory.py +79 -0
- autogen/a2a/server.py +221 -0
- autogen/a2a/utils.py +207 -0
- autogen/agentchat/__init__.py +47 -0
- autogen/agentchat/agent.py +180 -0
- autogen/agentchat/assistant_agent.py +86 -0
- autogen/agentchat/chat.py +325 -0
- autogen/agentchat/contrib/__init__.py +5 -0
- autogen/agentchat/contrib/agent_eval/README.md +7 -0
- autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
- autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
- autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
- autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
- autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
- autogen/agentchat/contrib/agent_eval/task.py +42 -0
- autogen/agentchat/contrib/agent_optimizer.py +432 -0
- autogen/agentchat/contrib/capabilities/__init__.py +5 -0
- autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
- autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
- autogen/agentchat/contrib/capabilities/teachability.py +393 -0
- autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
- autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
- autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
- autogen/agentchat/contrib/capabilities/transforms.py +578 -0
- autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
- autogen/agentchat/contrib/capabilities/vision_capability.py +215 -0
- autogen/agentchat/contrib/captainagent/__init__.py +9 -0
- autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
- autogen/agentchat/contrib/captainagent/captainagent.py +514 -0
- autogen/agentchat/contrib/captainagent/tool_retriever.py +334 -0
- autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
- autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
- autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
- autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
- autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
- autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
- autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
- autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
- autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
- autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
- autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
- autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
- autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
- autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
- autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
- autogen/agentchat/contrib/graph_rag/document.py +29 -0
- autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +167 -0
- autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
- autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
- autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
- autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +263 -0
- autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
- autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
- autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
- autogen/agentchat/contrib/img_utils.py +397 -0
- autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
- autogen/agentchat/contrib/llava_agent.py +189 -0
- autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
- autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
- autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +325 -0
- autogen/agentchat/contrib/rag/__init__.py +10 -0
- autogen/agentchat/contrib/rag/chromadb_query_engine.py +268 -0
- autogen/agentchat/contrib/rag/llamaindex_query_engine.py +195 -0
- autogen/agentchat/contrib/rag/mongodb_query_engine.py +319 -0
- autogen/agentchat/contrib/rag/query_engine.py +76 -0
- autogen/agentchat/contrib/retrieve_assistant_agent.py +59 -0
- autogen/agentchat/contrib/retrieve_user_proxy_agent.py +704 -0
- autogen/agentchat/contrib/society_of_mind_agent.py +200 -0
- autogen/agentchat/contrib/swarm_agent.py +1404 -0
- autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
- autogen/agentchat/contrib/vectordb/__init__.py +5 -0
- autogen/agentchat/contrib/vectordb/base.py +224 -0
- autogen/agentchat/contrib/vectordb/chromadb.py +316 -0
- autogen/agentchat/contrib/vectordb/couchbase.py +405 -0
- autogen/agentchat/contrib/vectordb/mongodb.py +551 -0
- autogen/agentchat/contrib/vectordb/pgvectordb.py +927 -0
- autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
- autogen/agentchat/contrib/vectordb/utils.py +126 -0
- autogen/agentchat/contrib/web_surfer.py +304 -0
- autogen/agentchat/conversable_agent.py +4307 -0
- autogen/agentchat/group/__init__.py +67 -0
- autogen/agentchat/group/available_condition.py +91 -0
- autogen/agentchat/group/context_condition.py +77 -0
- autogen/agentchat/group/context_expression.py +238 -0
- autogen/agentchat/group/context_str.py +39 -0
- autogen/agentchat/group/context_variables.py +182 -0
- autogen/agentchat/group/events/transition_events.py +111 -0
- autogen/agentchat/group/group_tool_executor.py +324 -0
- autogen/agentchat/group/group_utils.py +659 -0
- autogen/agentchat/group/guardrails.py +179 -0
- autogen/agentchat/group/handoffs.py +303 -0
- autogen/agentchat/group/llm_condition.py +93 -0
- autogen/agentchat/group/multi_agent_chat.py +291 -0
- autogen/agentchat/group/on_condition.py +55 -0
- autogen/agentchat/group/on_context_condition.py +51 -0
- autogen/agentchat/group/patterns/__init__.py +18 -0
- autogen/agentchat/group/patterns/auto.py +160 -0
- autogen/agentchat/group/patterns/manual.py +177 -0
- autogen/agentchat/group/patterns/pattern.py +295 -0
- autogen/agentchat/group/patterns/random.py +106 -0
- autogen/agentchat/group/patterns/round_robin.py +117 -0
- autogen/agentchat/group/reply_result.py +24 -0
- autogen/agentchat/group/safeguards/__init__.py +21 -0
- autogen/agentchat/group/safeguards/api.py +241 -0
- autogen/agentchat/group/safeguards/enforcer.py +1158 -0
- autogen/agentchat/group/safeguards/events.py +140 -0
- autogen/agentchat/group/safeguards/validator.py +435 -0
- autogen/agentchat/group/speaker_selection_result.py +41 -0
- autogen/agentchat/group/targets/__init__.py +4 -0
- autogen/agentchat/group/targets/function_target.py +245 -0
- autogen/agentchat/group/targets/group_chat_target.py +133 -0
- autogen/agentchat/group/targets/group_manager_target.py +151 -0
- autogen/agentchat/group/targets/transition_target.py +424 -0
- autogen/agentchat/group/targets/transition_utils.py +6 -0
- autogen/agentchat/groupchat.py +1832 -0
- autogen/agentchat/realtime/__init__.py +3 -0
- autogen/agentchat/realtime/experimental/__init__.py +20 -0
- autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
- autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
- autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
- autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
- autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
- autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
- autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
- autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
- autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
- autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
- autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
- autogen/agentchat/realtime/experimental/clients/realtime_client.py +191 -0
- autogen/agentchat/realtime/experimental/function_observer.py +84 -0
- autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
- autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
- autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
- autogen/agentchat/realtime/experimental/realtime_swarm.py +533 -0
- autogen/agentchat/realtime/experimental/websockets.py +21 -0
- autogen/agentchat/realtime_agent/__init__.py +21 -0
- autogen/agentchat/user_proxy_agent.py +114 -0
- autogen/agentchat/utils.py +206 -0
- autogen/agents/__init__.py +3 -0
- autogen/agents/contrib/__init__.py +10 -0
- autogen/agents/contrib/time/__init__.py +8 -0
- autogen/agents/contrib/time/time_reply_agent.py +74 -0
- autogen/agents/contrib/time/time_tool_agent.py +52 -0
- autogen/agents/experimental/__init__.py +27 -0
- autogen/agents/experimental/deep_research/__init__.py +7 -0
- autogen/agents/experimental/deep_research/deep_research.py +52 -0
- autogen/agents/experimental/discord/__init__.py +7 -0
- autogen/agents/experimental/discord/discord.py +66 -0
- autogen/agents/experimental/document_agent/__init__.py +19 -0
- autogen/agents/experimental/document_agent/chroma_query_engine.py +301 -0
- autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +113 -0
- autogen/agents/experimental/document_agent/document_agent.py +643 -0
- autogen/agents/experimental/document_agent/document_conditions.py +50 -0
- autogen/agents/experimental/document_agent/document_utils.py +376 -0
- autogen/agents/experimental/document_agent/inmemory_query_engine.py +214 -0
- autogen/agents/experimental/document_agent/parser_utils.py +134 -0
- autogen/agents/experimental/document_agent/url_utils.py +417 -0
- autogen/agents/experimental/reasoning/__init__.py +7 -0
- autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
- autogen/agents/experimental/slack/__init__.py +7 -0
- autogen/agents/experimental/slack/slack.py +73 -0
- autogen/agents/experimental/telegram/__init__.py +7 -0
- autogen/agents/experimental/telegram/telegram.py +76 -0
- autogen/agents/experimental/websurfer/__init__.py +7 -0
- autogen/agents/experimental/websurfer/websurfer.py +70 -0
- autogen/agents/experimental/wikipedia/__init__.py +7 -0
- autogen/agents/experimental/wikipedia/wikipedia.py +88 -0
- autogen/browser_utils.py +309 -0
- autogen/cache/__init__.py +10 -0
- autogen/cache/abstract_cache_base.py +71 -0
- autogen/cache/cache.py +203 -0
- autogen/cache/cache_factory.py +88 -0
- autogen/cache/cosmos_db_cache.py +144 -0
- autogen/cache/disk_cache.py +97 -0
- autogen/cache/in_memory_cache.py +54 -0
- autogen/cache/redis_cache.py +119 -0
- autogen/code_utils.py +598 -0
- autogen/coding/__init__.py +30 -0
- autogen/coding/base.py +120 -0
- autogen/coding/docker_commandline_code_executor.py +283 -0
- autogen/coding/factory.py +56 -0
- autogen/coding/func_with_reqs.py +203 -0
- autogen/coding/jupyter/__init__.py +23 -0
- autogen/coding/jupyter/base.py +36 -0
- autogen/coding/jupyter/docker_jupyter_server.py +160 -0
- autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
- autogen/coding/jupyter/import_utils.py +82 -0
- autogen/coding/jupyter/jupyter_client.py +224 -0
- autogen/coding/jupyter/jupyter_code_executor.py +154 -0
- autogen/coding/jupyter/local_jupyter_server.py +164 -0
- autogen/coding/local_commandline_code_executor.py +341 -0
- autogen/coding/markdown_code_extractor.py +44 -0
- autogen/coding/utils.py +55 -0
- autogen/coding/yepcode_code_executor.py +197 -0
- autogen/doc_utils.py +35 -0
- autogen/environments/__init__.py +10 -0
- autogen/environments/docker_python_environment.py +365 -0
- autogen/environments/python_environment.py +125 -0
- autogen/environments/system_python_environment.py +85 -0
- autogen/environments/venv_python_environment.py +220 -0
- autogen/environments/working_directory.py +74 -0
- autogen/events/__init__.py +7 -0
- autogen/events/agent_events.py +1016 -0
- autogen/events/base_event.py +100 -0
- autogen/events/client_events.py +168 -0
- autogen/events/helpers.py +44 -0
- autogen/events/print_event.py +45 -0
- autogen/exception_utils.py +73 -0
- autogen/extensions/__init__.py +5 -0
- autogen/fast_depends/__init__.py +16 -0
- autogen/fast_depends/_compat.py +75 -0
- autogen/fast_depends/core/__init__.py +14 -0
- autogen/fast_depends/core/build.py +206 -0
- autogen/fast_depends/core/model.py +527 -0
- autogen/fast_depends/dependencies/__init__.py +15 -0
- autogen/fast_depends/dependencies/model.py +30 -0
- autogen/fast_depends/dependencies/provider.py +40 -0
- autogen/fast_depends/library/__init__.py +10 -0
- autogen/fast_depends/library/model.py +46 -0
- autogen/fast_depends/py.typed +6 -0
- autogen/fast_depends/schema.py +66 -0
- autogen/fast_depends/use.py +272 -0
- autogen/fast_depends/utils.py +177 -0
- autogen/formatting_utils.py +83 -0
- autogen/function_utils.py +13 -0
- autogen/graph_utils.py +173 -0
- autogen/import_utils.py +539 -0
- autogen/interop/__init__.py +22 -0
- autogen/interop/crewai/__init__.py +7 -0
- autogen/interop/crewai/crewai.py +88 -0
- autogen/interop/interoperability.py +71 -0
- autogen/interop/interoperable.py +46 -0
- autogen/interop/langchain/__init__.py +8 -0
- autogen/interop/langchain/langchain_chat_model_factory.py +156 -0
- autogen/interop/langchain/langchain_tool.py +78 -0
- autogen/interop/litellm/__init__.py +7 -0
- autogen/interop/litellm/litellm_config_factory.py +178 -0
- autogen/interop/pydantic_ai/__init__.py +7 -0
- autogen/interop/pydantic_ai/pydantic_ai.py +172 -0
- autogen/interop/registry.py +70 -0
- autogen/io/__init__.py +15 -0
- autogen/io/base.py +151 -0
- autogen/io/console.py +56 -0
- autogen/io/processors/__init__.py +12 -0
- autogen/io/processors/base.py +21 -0
- autogen/io/processors/console_event_processor.py +61 -0
- autogen/io/run_response.py +294 -0
- autogen/io/thread_io_stream.py +63 -0
- autogen/io/websockets.py +214 -0
- autogen/json_utils.py +42 -0
- autogen/llm_clients/MIGRATION_TO_V2.md +782 -0
- autogen/llm_clients/__init__.py +77 -0
- autogen/llm_clients/client_v2.py +122 -0
- autogen/llm_clients/models/__init__.py +55 -0
- autogen/llm_clients/models/content_blocks.py +389 -0
- autogen/llm_clients/models/unified_message.py +145 -0
- autogen/llm_clients/models/unified_response.py +83 -0
- autogen/llm_clients/openai_completions_client.py +444 -0
- autogen/llm_config/__init__.py +11 -0
- autogen/llm_config/client.py +59 -0
- autogen/llm_config/config.py +461 -0
- autogen/llm_config/entry.py +169 -0
- autogen/llm_config/types.py +37 -0
- autogen/llm_config/utils.py +223 -0
- autogen/logger/__init__.py +11 -0
- autogen/logger/base_logger.py +129 -0
- autogen/logger/file_logger.py +262 -0
- autogen/logger/logger_factory.py +42 -0
- autogen/logger/logger_utils.py +57 -0
- autogen/logger/sqlite_logger.py +524 -0
- autogen/math_utils.py +338 -0
- autogen/mcp/__init__.py +7 -0
- autogen/mcp/__main__.py +78 -0
- autogen/mcp/helpers.py +45 -0
- autogen/mcp/mcp_client.py +349 -0
- autogen/mcp/mcp_proxy/__init__.py +19 -0
- autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +62 -0
- autogen/mcp/mcp_proxy/mcp_proxy.py +577 -0
- autogen/mcp/mcp_proxy/operation_grouping.py +166 -0
- autogen/mcp/mcp_proxy/operation_renaming.py +110 -0
- autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
- autogen/mcp/mcp_proxy/security.py +399 -0
- autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -0
- autogen/messages/__init__.py +7 -0
- autogen/messages/agent_messages.py +946 -0
- autogen/messages/base_message.py +108 -0
- autogen/messages/client_messages.py +172 -0
- autogen/messages/print_message.py +48 -0
- autogen/oai/__init__.py +61 -0
- autogen/oai/anthropic.py +1516 -0
- autogen/oai/bedrock.py +800 -0
- autogen/oai/cerebras.py +302 -0
- autogen/oai/client.py +1658 -0
- autogen/oai/client_utils.py +196 -0
- autogen/oai/cohere.py +494 -0
- autogen/oai/gemini.py +1045 -0
- autogen/oai/gemini_types.py +156 -0
- autogen/oai/groq.py +319 -0
- autogen/oai/mistral.py +311 -0
- autogen/oai/oai_models/__init__.py +23 -0
- autogen/oai/oai_models/_models.py +16 -0
- autogen/oai/oai_models/chat_completion.py +86 -0
- autogen/oai/oai_models/chat_completion_audio.py +32 -0
- autogen/oai/oai_models/chat_completion_message.py +97 -0
- autogen/oai/oai_models/chat_completion_message_tool_call.py +60 -0
- autogen/oai/oai_models/chat_completion_token_logprob.py +62 -0
- autogen/oai/oai_models/completion_usage.py +59 -0
- autogen/oai/ollama.py +657 -0
- autogen/oai/openai_responses.py +451 -0
- autogen/oai/openai_utils.py +897 -0
- autogen/oai/together.py +387 -0
- autogen/remote/__init__.py +18 -0
- autogen/remote/agent.py +199 -0
- autogen/remote/agent_service.py +197 -0
- autogen/remote/errors.py +17 -0
- autogen/remote/httpx_client_factory.py +131 -0
- autogen/remote/protocol.py +37 -0
- autogen/remote/retry.py +102 -0
- autogen/remote/runtime.py +96 -0
- autogen/retrieve_utils.py +490 -0
- autogen/runtime_logging.py +161 -0
- autogen/testing/__init__.py +12 -0
- autogen/testing/messages.py +45 -0
- autogen/testing/test_agent.py +111 -0
- autogen/token_count_utils.py +280 -0
- autogen/tools/__init__.py +20 -0
- autogen/tools/contrib/__init__.py +9 -0
- autogen/tools/contrib/time/__init__.py +7 -0
- autogen/tools/contrib/time/time.py +40 -0
- autogen/tools/dependency_injection.py +249 -0
- autogen/tools/experimental/__init__.py +54 -0
- autogen/tools/experimental/browser_use/__init__.py +7 -0
- autogen/tools/experimental/browser_use/browser_use.py +154 -0
- autogen/tools/experimental/code_execution/__init__.py +7 -0
- autogen/tools/experimental/code_execution/python_code_execution.py +86 -0
- autogen/tools/experimental/crawl4ai/__init__.py +7 -0
- autogen/tools/experimental/crawl4ai/crawl4ai.py +150 -0
- autogen/tools/experimental/deep_research/__init__.py +7 -0
- autogen/tools/experimental/deep_research/deep_research.py +329 -0
- autogen/tools/experimental/duckduckgo/__init__.py +7 -0
- autogen/tools/experimental/duckduckgo/duckduckgo_search.py +103 -0
- autogen/tools/experimental/firecrawl/__init__.py +7 -0
- autogen/tools/experimental/firecrawl/firecrawl_tool.py +836 -0
- autogen/tools/experimental/google/__init__.py +14 -0
- autogen/tools/experimental/google/authentication/__init__.py +11 -0
- autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
- autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
- autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
- autogen/tools/experimental/google/drive/__init__.py +9 -0
- autogen/tools/experimental/google/drive/drive_functions.py +124 -0
- autogen/tools/experimental/google/drive/toolkit.py +88 -0
- autogen/tools/experimental/google/model.py +17 -0
- autogen/tools/experimental/google/toolkit_protocol.py +19 -0
- autogen/tools/experimental/google_search/__init__.py +8 -0
- autogen/tools/experimental/google_search/google_search.py +93 -0
- autogen/tools/experimental/google_search/youtube_search.py +181 -0
- autogen/tools/experimental/messageplatform/__init__.py +17 -0
- autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/discord/discord.py +284 -0
- autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/slack/slack.py +385 -0
- autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/telegram/telegram.py +271 -0
- autogen/tools/experimental/perplexity/__init__.py +7 -0
- autogen/tools/experimental/perplexity/perplexity_search.py +249 -0
- autogen/tools/experimental/reliable/__init__.py +10 -0
- autogen/tools/experimental/reliable/reliable.py +1311 -0
- autogen/tools/experimental/searxng/__init__.py +7 -0
- autogen/tools/experimental/searxng/searxng_search.py +142 -0
- autogen/tools/experimental/tavily/__init__.py +7 -0
- autogen/tools/experimental/tavily/tavily_search.py +176 -0
- autogen/tools/experimental/web_search_preview/__init__.py +7 -0
- autogen/tools/experimental/web_search_preview/web_search_preview.py +120 -0
- autogen/tools/experimental/wikipedia/__init__.py +7 -0
- autogen/tools/experimental/wikipedia/wikipedia.py +284 -0
- autogen/tools/function_utils.py +412 -0
- autogen/tools/tool.py +188 -0
- autogen/tools/toolkit.py +86 -0
- autogen/types.py +29 -0
- autogen/version.py +7 -0
- templates/client_template/main.jinja2 +72 -0
- templates/config_template/config.jinja2 +7 -0
- templates/main.jinja2 +61 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
#
|
|
5
|
+
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
import copy
|
|
8
|
+
import json
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from ... import OpenAIWrapper, filter_config
|
|
12
|
+
from ...code_utils import execute_code
|
|
13
|
+
from ...llm_config import LLMConfig
|
|
14
|
+
|
|
15
|
+
ADD_FUNC = {
|
|
16
|
+
"type": "function",
|
|
17
|
+
"function": {
|
|
18
|
+
"name": "add_function",
|
|
19
|
+
"description": "Add a function in the context of the conversation. Necessary Python packages must be declared. The name of the function MUST be the same with the function name in the code you generated.",
|
|
20
|
+
"parameters": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"properties": {
|
|
23
|
+
"name": {"type": "string", "description": "The name of the function in the code implementation."},
|
|
24
|
+
"description": {"type": "string", "description": "A short description of the function."},
|
|
25
|
+
"arguments": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": 'JSON schema of arguments encoded as a string. Please note that the JSON schema only supports specific types including string, integer, object, array, boolean. (do not have float type) For example: { "url": { "type": "string", "description": "The URL", }}. Please avoid the error \'array schema missing items\' when using array type.',
|
|
28
|
+
},
|
|
29
|
+
"packages": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"description": "A list of package names imported by the function, and that need to be installed with pip prior to invoking the function. This solves ModuleNotFoundError. It should be string, not list.",
|
|
32
|
+
},
|
|
33
|
+
"code": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"description": "The implementation in Python. Do not include the function declaration.",
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
"required": ["name", "description", "arguments", "packages", "code"],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
REVISE_FUNC = {
|
|
44
|
+
"type": "function",
|
|
45
|
+
"function": {
|
|
46
|
+
"name": "revise_function",
|
|
47
|
+
"description": "Revise a function in the context of the conversation. Necessary Python packages must be declared. The name of the function MUST be the same with the function name in the code you generated.",
|
|
48
|
+
"parameters": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"properties": {
|
|
51
|
+
"name": {"type": "string", "description": "The name of the function in the code implementation."},
|
|
52
|
+
"description": {"type": "string", "description": "A short description of the function."},
|
|
53
|
+
"arguments": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"description": 'JSON schema of arguments encoded as a string. Please note that the JSON schema only supports specific types including string, integer, object, array, boolean. (do not have float type) For example: { "url": { "type": "string", "description": "The URL", }}. Please avoid the error \'array schema missing items\' when using array type.',
|
|
56
|
+
},
|
|
57
|
+
"packages": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"description": "A list of package names imported by the function, and that need to be installed with pip prior to invoking the function. This solves ModuleNotFoundError. It should be string, not list.",
|
|
60
|
+
},
|
|
61
|
+
"code": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"description": "The implementation in Python. Do not include the function declaration.",
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
"required": ["name", "description", "arguments", "packages", "code"],
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
REMOVE_FUNC = {
|
|
72
|
+
"type": "function",
|
|
73
|
+
"function": {
|
|
74
|
+
"name": "remove_function",
|
|
75
|
+
"description": "Remove one function in the context of the conversation. Once remove one function, the assistant will not use this function in future conversation.",
|
|
76
|
+
"parameters": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"properties": {
|
|
79
|
+
"name": {"type": "string", "description": "The name of the function in the code implementation."}
|
|
80
|
+
},
|
|
81
|
+
"required": ["name"],
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
OPT_PROMPT = """You are a function optimizer. Your task is to maintain a list of functions for the assistant according to the existing function list and conversation history that happens between the assistant and the user.
|
|
87
|
+
You can perform one of the following four actions to manipulate the function list using the functions you have:
|
|
88
|
+
1. Revise one existing function (using revise_function).
|
|
89
|
+
2. Remove one existing function (using remove_function).
|
|
90
|
+
3. Add one new function (using add_function).
|
|
91
|
+
4. Directly return "TERMINATE" to me if no more actions are needed for the current function list.
|
|
92
|
+
|
|
93
|
+
Below are the principles that you need to follow for taking these four actions.
|
|
94
|
+
(1) Revise one existing function:
|
|
95
|
+
1. Pay more attention to the failed tasks and corresponding error information, and optimize the function used in these tasks according to the conversation history if needed.
|
|
96
|
+
2. A failed function call can occur due to incorrect input arguments (missing arguments) or an incorrect function code implementation. You should focus more on the function code implementation and make it easy to get success function call.
|
|
97
|
+
3. Do not revise the function that you think works well and plays a critical role in solving the problems according to the conversation history. Only making revisions if needed.
|
|
98
|
+
4. Sometimes, a NameError may occur. To fix this error, you can either revise the name of the function in the code implementation or revise the name of the function call to make these two names consistent.
|
|
99
|
+
(2) Remove one existing function:
|
|
100
|
+
1. Only remove the function that you think is not needed anymore in future tasks.
|
|
101
|
+
(3) Add one new function:
|
|
102
|
+
1. The added function should be general enough to be used in future tasks. For instance, if you encounter a problem that this function can solve, or one step of it, you can use the generated function directly instead of starting from scratch
|
|
103
|
+
2. The added new function should solve a higher-level question that encompasses the original query and extend the code's functionality to make it more versatile and widely applicable.
|
|
104
|
+
3. Replace specific strings or variable names with general variables to enhance the tool's applicability to various queries. All names used inside the function should be passed in as arguments.
|
|
105
|
+
Below is an example of a function that potentially deserves to be added in solving MATH problems, which can be used to solve a higher-level question:
|
|
106
|
+
{{
|
|
107
|
+
\"name\": \"evaluate_expression\",
|
|
108
|
+
\"description\": \"Evaluate arithmetic or mathematical expressions provided as strings.\",
|
|
109
|
+
\"arguments\": {{
|
|
110
|
+
\"expression\": {{
|
|
111
|
+
\"type\": \"string\",
|
|
112
|
+
\"description\": \"The mathematical expression to evaluate.\"
|
|
113
|
+
}}
|
|
114
|
+
}},
|
|
115
|
+
\"packages\": \"sympy\",
|
|
116
|
+
\"code\": \"from sympy import sympify, SympifyError\\n\\ndef evaluate_expression(expression):\\n try:\\n result = sympify(expression)\\n if result.is_number:\\n result = float(result)\\n else:\\n result = str(result)\\n return result\\n except SympifyError as e:\\n return str(e)\"
|
|
117
|
+
}}
|
|
118
|
+
(4) Directly return "TERMINATE":
|
|
119
|
+
If you think there is no need to perform any other actions for the current function list since the current list is optimal more actions will harm the performance in future tasks. Please directly reply to me with "TERMINATE".
|
|
120
|
+
|
|
121
|
+
One function signature includes the following five elements:
|
|
122
|
+
1. Function name
|
|
123
|
+
2. Function description
|
|
124
|
+
3. JSON schema of arguments encoded as a string
|
|
125
|
+
4. A list of package names imported by the function packages
|
|
126
|
+
5. The code implementation
|
|
127
|
+
|
|
128
|
+
Below are the signatures of the current functions:
|
|
129
|
+
List A: {best_functions}.
|
|
130
|
+
The following list are the function signatures that you have after taking {actions_num} actions to manipulate List A:
|
|
131
|
+
List B: {incumbent_functions}.
|
|
132
|
+
|
|
133
|
+
{accumulated_experience}
|
|
134
|
+
|
|
135
|
+
Here are {best_conversations_num} conversation histories of solving {best_conversations_num} tasks using List A.
|
|
136
|
+
History:
|
|
137
|
+
{best_conversations_history}
|
|
138
|
+
|
|
139
|
+
{statistic_informations}
|
|
140
|
+
|
|
141
|
+
According to the information I provide, please take one of four actions to manipulate list B using the functions you know.
|
|
142
|
+
Instead of returning TERMINATE directly or taking no action, you should try your best to optimize the function list. Only take no action if you really think the current list is optimal, as more actions will harm performance in future tasks.
|
|
143
|
+
Even adding a general function that can substitute the assistant's repeated suggestions of Python code with the same functionality could also be helpful.
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def execute_func(name, packages, code, **args):
|
|
148
|
+
"""The wrapper for generated functions."""
|
|
149
|
+
pip_install = (
|
|
150
|
+
f"""print("Installing package: {packages}")\nsubprocess.run(["pip", "-qq", "install", "{packages}"])"""
|
|
151
|
+
if packages
|
|
152
|
+
else ""
|
|
153
|
+
)
|
|
154
|
+
str = f"""
|
|
155
|
+
import subprocess
|
|
156
|
+
{pip_install}
|
|
157
|
+
print("Result of {name} function execution:")
|
|
158
|
+
{code}
|
|
159
|
+
args={args}
|
|
160
|
+
result={name}(**args)
|
|
161
|
+
if result is not None: print(result)
|
|
162
|
+
"""
|
|
163
|
+
print(f"execute_code:\n{str}")
|
|
164
|
+
result = execute_code(str, use_docker="shaokun529/evoagent:v1")
|
|
165
|
+
if result[0] != 0:
|
|
166
|
+
raise Exception("Error in executing function:" + result[1])
|
|
167
|
+
print(f"Result: {result[1]}")
|
|
168
|
+
return result[1]
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
class AgentOptimizer:
|
|
172
|
+
"""Base class for optimizing AG2 agents. Specifically, it is used to optimize the functions used in the agent.
|
|
173
|
+
More information could be found in the following paper: https://arxiv.org/abs/2402.11359.
|
|
174
|
+
"""
|
|
175
|
+
|
|
176
|
+
def __init__(
|
|
177
|
+
self,
|
|
178
|
+
max_actions_per_step: int,
|
|
179
|
+
llm_config: LLMConfig | dict[str, Any] | None = None,
|
|
180
|
+
optimizer_model: str | None = "gpt-4-1106-preview",
|
|
181
|
+
):
|
|
182
|
+
"""(These APIs are experimental and may change in the future.)
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
max_actions_per_step (int): the maximum number of actions that the optimizer can take in one step.
|
|
186
|
+
llm_config (LLMConfig or dict or None): llm inference configuration.
|
|
187
|
+
If None, the current LLMConfig from context is used.
|
|
188
|
+
Please refer to [OpenAIWrapper.create](https://docs.ag2.ai/latest/docs/api-reference/autogen/OpenAIWrapper/#autogen.OpenAIWrapper.create) for available options.
|
|
189
|
+
When using OpenAI or Azure OpenAI endpoints, please specify a non-empty 'model' either in `llm_config` or in each config of 'config_list' in `llm_config`.
|
|
190
|
+
optimizer_model: the model used for the optimizer.
|
|
191
|
+
"""
|
|
192
|
+
self.max_actions_per_step = max_actions_per_step
|
|
193
|
+
self._max_trials = 3
|
|
194
|
+
self.optimizer_model = optimizer_model
|
|
195
|
+
|
|
196
|
+
self._trial_conversations_history = []
|
|
197
|
+
self._trial_conversations_performance = []
|
|
198
|
+
self._trial_functions = []
|
|
199
|
+
|
|
200
|
+
self._best_conversations_history = []
|
|
201
|
+
self._best_conversations_performance = []
|
|
202
|
+
self._best_functions = []
|
|
203
|
+
|
|
204
|
+
self._failure_functions_performance = []
|
|
205
|
+
self._best_performance = -1
|
|
206
|
+
|
|
207
|
+
if llm_config is None:
|
|
208
|
+
llm_config = LLMConfig.current
|
|
209
|
+
assert isinstance(llm_config, (dict, LLMConfig)), "llm_config must be a dict or LLMConfig"
|
|
210
|
+
llm_config = copy.deepcopy(llm_config)
|
|
211
|
+
self.llm_config = llm_config
|
|
212
|
+
if self.llm_config in [{}, {"config_list": []}, {"config_list": [{"model": ""}]}]:
|
|
213
|
+
raise ValueError(
|
|
214
|
+
"When using OpenAI or Azure OpenAI endpoints, specify a non-empty 'model' either in 'llm_config' or in each config of 'config_list'."
|
|
215
|
+
)
|
|
216
|
+
self.llm_config["config_list"] = filter_config(llm_config["config_list"], {"model": [self.optimizer_model]})
|
|
217
|
+
self._client = OpenAIWrapper(**self.llm_config)
|
|
218
|
+
|
|
219
|
+
def record_one_conversation(self, conversation_history: list[dict[str, Any]], is_satisfied: bool = None):
|
|
220
|
+
"""Record one conversation history.
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
conversation_history (List[Dict]): the chat messages of the conversation.
|
|
224
|
+
is_satisfied (bool): whether the user is satisfied with the solution. If it is none, the user will be asked to input the satisfaction.
|
|
225
|
+
"""
|
|
226
|
+
if is_satisfied is None:
|
|
227
|
+
reply = input(
|
|
228
|
+
"Please provide whether the user is satisfied with the solution. 1 represents satisfied. 0 represents not satisfied. Press enter to submit. \n"
|
|
229
|
+
)
|
|
230
|
+
assert reply in [
|
|
231
|
+
"0",
|
|
232
|
+
"1",
|
|
233
|
+
], "The input is invalid. Please input 1 or 0. 1 represents satisfied. 0 represents not satisfied."
|
|
234
|
+
is_satisfied = reply == "1"
|
|
235
|
+
self._trial_conversations_history.append({
|
|
236
|
+
f"Conversation {len(self._trial_conversations_history)}": conversation_history
|
|
237
|
+
})
|
|
238
|
+
self._trial_conversations_performance.append({
|
|
239
|
+
f"Conversation {len(self._trial_conversations_performance)}": 1 if is_satisfied else 0
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
def step(self):
|
|
243
|
+
"""One step of training. It will return register_for_llm and register_for_executor at each iteration,
|
|
244
|
+
which are subsequently utilized to update the assistant and executor agents, respectively.
|
|
245
|
+
See example: https://github.com/ag2ai/ag2/blob/main/notebook/agentchat_agentoptimizer.ipynb
|
|
246
|
+
"""
|
|
247
|
+
performance = sum(sum(d.values()) for d in self._trial_conversations_performance) / len(
|
|
248
|
+
self._trial_conversations_performance
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
if performance < self._best_performance:
|
|
252
|
+
self._failure_functions_performance.append({"functions": self._trial_functions, "performance": performance})
|
|
253
|
+
self._failure_functions_performance = sorted(
|
|
254
|
+
self._failure_functions_performance, key=lambda x: x["performance"]
|
|
255
|
+
)
|
|
256
|
+
else:
|
|
257
|
+
self._failure_functions_performance = []
|
|
258
|
+
self._best_performance = performance
|
|
259
|
+
self._best_functions = copy.deepcopy(self._trial_functions)
|
|
260
|
+
self._best_conversations_history = copy.deepcopy(self._trial_conversations_history)
|
|
261
|
+
self._best_conversations_performance = copy.deepcopy(self._trial_conversations_performance)
|
|
262
|
+
self._trial_conversations_history = []
|
|
263
|
+
self._trial_conversations_performance = []
|
|
264
|
+
|
|
265
|
+
best_functions = copy.deepcopy(self._best_functions)
|
|
266
|
+
incumbent_functions = copy.deepcopy(self._best_functions)
|
|
267
|
+
failure_experience_prompt, statistic_prompt = self._construct_intermediate_prompt()
|
|
268
|
+
|
|
269
|
+
for action_index in range(self.max_actions_per_step):
|
|
270
|
+
prompt = OPT_PROMPT.format(
|
|
271
|
+
best_conversations_history=self._best_conversations_history,
|
|
272
|
+
best_conversations_num=len(self._best_conversations_history),
|
|
273
|
+
actions_num=action_index,
|
|
274
|
+
best_functions=best_functions,
|
|
275
|
+
incumbent_functions=incumbent_functions,
|
|
276
|
+
accumulated_experience=failure_experience_prompt,
|
|
277
|
+
statistic_informations=statistic_prompt,
|
|
278
|
+
)
|
|
279
|
+
messages = [{"role": "user", "content": prompt}]
|
|
280
|
+
for _ in range(self._max_trials):
|
|
281
|
+
response = self._client.create(
|
|
282
|
+
messages=messages, tools=[ADD_FUNC, REVISE_FUNC, REMOVE_FUNC], tool_choice="auto"
|
|
283
|
+
)
|
|
284
|
+
actions = response.choices[0].message.tool_calls
|
|
285
|
+
if self._validate_actions(actions, incumbent_functions):
|
|
286
|
+
break
|
|
287
|
+
if actions is not None and self._validate_actions(actions, incumbent_functions):
|
|
288
|
+
incumbent_functions = self._update_function_call(incumbent_functions, actions)
|
|
289
|
+
|
|
290
|
+
remove_functions = list(
|
|
291
|
+
{key for dictionary in self._trial_functions for key in dictionary}
|
|
292
|
+
- {key for dictionary in incumbent_functions for key in dictionary}
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
register_for_llm = []
|
|
296
|
+
register_for_exector = {}
|
|
297
|
+
for name in remove_functions:
|
|
298
|
+
register_for_llm.append({"func_sig": {"name": name}, "is_remove": True})
|
|
299
|
+
register_for_exector.update({name: None})
|
|
300
|
+
for func in incumbent_functions:
|
|
301
|
+
register_for_llm.append({
|
|
302
|
+
"func_sig": {
|
|
303
|
+
"name": func.get("name"),
|
|
304
|
+
"description": func.get("description"),
|
|
305
|
+
"parameters": {"type": "object", "properties": func.get("arguments")},
|
|
306
|
+
},
|
|
307
|
+
"is_remove": False,
|
|
308
|
+
})
|
|
309
|
+
register_for_exector.update({
|
|
310
|
+
func.get("name"): lambda **args: execute_func(
|
|
311
|
+
func.get("name"), func.get("packages"), func.get("code"), **args
|
|
312
|
+
)
|
|
313
|
+
})
|
|
314
|
+
|
|
315
|
+
self._trial_functions = incumbent_functions
|
|
316
|
+
return register_for_llm, register_for_exector
|
|
317
|
+
|
|
318
|
+
def reset_optimizer(self):
|
|
319
|
+
"""Reset the optimizer."""
|
|
320
|
+
self._trial_conversations_history = []
|
|
321
|
+
self._trial_conversations_performance = []
|
|
322
|
+
self._trial_functions = []
|
|
323
|
+
|
|
324
|
+
self._best_conversations_history = []
|
|
325
|
+
self._best_conversations_performance = []
|
|
326
|
+
self._best_functions = []
|
|
327
|
+
|
|
328
|
+
self._best_performance = -1
|
|
329
|
+
self._failure_functions_performance = []
|
|
330
|
+
|
|
331
|
+
def _update_function_call(self, incumbent_functions, actions):
|
|
332
|
+
"""Update function call."""
|
|
333
|
+
formatted_actions = []
|
|
334
|
+
for action in actions:
|
|
335
|
+
func = json.loads(action.function.arguments.strip('"'))
|
|
336
|
+
func["action_name"] = action.function.name
|
|
337
|
+
|
|
338
|
+
if func.get("action_name") == "remove_function":
|
|
339
|
+
item = {
|
|
340
|
+
"action_name": func.get("action_name"),
|
|
341
|
+
"name": func.get("name"),
|
|
342
|
+
}
|
|
343
|
+
else:
|
|
344
|
+
item = {
|
|
345
|
+
"action_name": func.get("action_name"),
|
|
346
|
+
"name": func.get("name"),
|
|
347
|
+
"description": func.get("description"),
|
|
348
|
+
"arguments": json.loads(func.get("arguments").strip('"')),
|
|
349
|
+
"packages": func.get("packages"),
|
|
350
|
+
"code": func.get("code"),
|
|
351
|
+
}
|
|
352
|
+
formatted_actions.append(item)
|
|
353
|
+
actions = formatted_actions
|
|
354
|
+
|
|
355
|
+
for action in actions:
|
|
356
|
+
name, description, arguments, packages, code, action_name = (
|
|
357
|
+
action.get("name"),
|
|
358
|
+
action.get("description"),
|
|
359
|
+
action.get("arguments"),
|
|
360
|
+
action.get("packages"),
|
|
361
|
+
action.get("code"),
|
|
362
|
+
action.get("action_name"),
|
|
363
|
+
)
|
|
364
|
+
if action_name == "remove_function":
|
|
365
|
+
incumbent_functions = [item for item in incumbent_functions if item["name"] != name]
|
|
366
|
+
else:
|
|
367
|
+
incumbent_functions = [item for item in incumbent_functions if item["name"] != name]
|
|
368
|
+
incumbent_functions.append({
|
|
369
|
+
"name": name,
|
|
370
|
+
"description": description,
|
|
371
|
+
"arguments": arguments,
|
|
372
|
+
"packages": packages,
|
|
373
|
+
"code": code,
|
|
374
|
+
})
|
|
375
|
+
|
|
376
|
+
return incumbent_functions
|
|
377
|
+
|
|
378
|
+
def _construct_intermediate_prompt(self):
|
|
379
|
+
"""Construct intermediate prompts."""
|
|
380
|
+
if len(self._failure_functions_performance) != 0:
|
|
381
|
+
failure_experience_prompt = "We also provide more examples for different functions and their corresponding performance (0-100).\n The following function signatures are arranged in ascending order based on their performance, where higher performance indicate better quality."
|
|
382
|
+
failure_experience_prompt += "\n"
|
|
383
|
+
for item in self._failure_functions_performance:
|
|
384
|
+
failure_experience_prompt += "Function: \n" + str(item["functions"]) + "\n"
|
|
385
|
+
failure_experience_prompt += "Performance: \n" + str(item["performance"]) + "\n"
|
|
386
|
+
else:
|
|
387
|
+
failure_experience_prompt = "\n"
|
|
388
|
+
|
|
389
|
+
if len(self._best_conversations_performance) != 0:
|
|
390
|
+
statistic_prompt = "The following table shows the statistical information for solving each task in each conversation and indicates, whether the result is satisfied by the users. 1 represents satisfied. 0 represents not satisfied."
|
|
391
|
+
statistic_prompt += "\n"
|
|
392
|
+
for item in self._best_conversations_performance:
|
|
393
|
+
statistic_prompt += str(item) + "\n"
|
|
394
|
+
else:
|
|
395
|
+
statistic_prompt = "\n"
|
|
396
|
+
|
|
397
|
+
return failure_experience_prompt, statistic_prompt
|
|
398
|
+
|
|
399
|
+
def _validate_actions(self, actions, incumbent_functions):
|
|
400
|
+
"""Validate whether the proposed actions are feasible."""
|
|
401
|
+
if actions is None:
|
|
402
|
+
return True
|
|
403
|
+
else:
|
|
404
|
+
# val json format
|
|
405
|
+
for action in actions:
|
|
406
|
+
function_args = action.function.arguments
|
|
407
|
+
try:
|
|
408
|
+
function_args = json.loads(function_args.strip('"'))
|
|
409
|
+
if "arguments" in function_args:
|
|
410
|
+
json.loads(function_args.get("arguments").strip('"'))
|
|
411
|
+
except Exception as e:
|
|
412
|
+
print("JSON is invalid:", e)
|
|
413
|
+
return False
|
|
414
|
+
# val syntax
|
|
415
|
+
for action in actions:
|
|
416
|
+
if action.function.name != "remove_function":
|
|
417
|
+
function_args = json.loads(action.function.arguments.strip('"'))
|
|
418
|
+
code = function_args.get("code")
|
|
419
|
+
try:
|
|
420
|
+
compile(code, "<string>", "exec")
|
|
421
|
+
print("successfully compiled")
|
|
422
|
+
except Exception as e:
|
|
423
|
+
print("Syntax is invalid:", e)
|
|
424
|
+
return False
|
|
425
|
+
for action in actions:
|
|
426
|
+
action_name = action.function.name
|
|
427
|
+
if action_name == "remove_function":
|
|
428
|
+
function_args = json.loads(action.function.arguments.strip('"'))
|
|
429
|
+
if function_args.get("name") not in [item["name"] for item in incumbent_functions]:
|
|
430
|
+
print("The function you want to remove does not exist.")
|
|
431
|
+
return False
|
|
432
|
+
return True
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
#
|
|
5
|
+
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
from ...assistant_agent import ConversableAgent
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AgentCapability:
|
|
11
|
+
"""Base class for composable capabilities that can be added to an agent."""
|
|
12
|
+
|
|
13
|
+
def __init__(self):
|
|
14
|
+
pass
|
|
15
|
+
|
|
16
|
+
def add_to_agent(self, agent: ConversableAgent):
|
|
17
|
+
"""Adds a particular capability to the given agent. Must be implemented by the capability subclass.
|
|
18
|
+
An implementation will typically call agent.register_hook() one or more times. See teachability.py as an example.
|
|
19
|
+
"""
|
|
20
|
+
raise NotImplementedError
|