ag2 0.9.1a1__py3-none-any.whl → 0.9.1.post0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ag2 might be problematic. Click here for more details.
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info}/METADATA +264 -73
- ag2-0.9.1.post0.dist-info/RECORD +392 -0
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info}/WHEEL +1 -2
- autogen/__init__.py +89 -0
- autogen/_website/__init__.py +3 -0
- autogen/_website/generate_api_references.py +427 -0
- autogen/_website/generate_mkdocs.py +1174 -0
- autogen/_website/notebook_processor.py +476 -0
- autogen/_website/process_notebooks.py +656 -0
- autogen/_website/utils.py +412 -0
- autogen/agentchat/__init__.py +44 -0
- autogen/agentchat/agent.py +182 -0
- autogen/agentchat/assistant_agent.py +85 -0
- autogen/agentchat/chat.py +309 -0
- autogen/agentchat/contrib/__init__.py +5 -0
- autogen/agentchat/contrib/agent_eval/README.md +7 -0
- autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
- autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
- autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
- autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
- autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
- autogen/agentchat/contrib/agent_eval/task.py +42 -0
- autogen/agentchat/contrib/agent_optimizer.py +429 -0
- autogen/agentchat/contrib/capabilities/__init__.py +5 -0
- autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
- autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
- autogen/agentchat/contrib/capabilities/teachability.py +393 -0
- autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
- autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
- autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
- autogen/agentchat/contrib/capabilities/transforms.py +566 -0
- autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
- autogen/agentchat/contrib/capabilities/vision_capability.py +214 -0
- autogen/agentchat/contrib/captainagent/__init__.py +9 -0
- autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
- autogen/agentchat/contrib/captainagent/captainagent.py +512 -0
- autogen/agentchat/contrib/captainagent/tool_retriever.py +335 -0
- autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
- autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
- autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
- autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
- autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
- autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
- autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
- autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
- autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
- autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
- autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
- autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
- autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
- autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
- autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
- autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
- autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
- autogen/agentchat/contrib/graph_rag/document.py +29 -0
- autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +170 -0
- autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
- autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
- autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
- autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +268 -0
- autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
- autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
- autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
- autogen/agentchat/contrib/img_utils.py +397 -0
- autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
- autogen/agentchat/contrib/llava_agent.py +187 -0
- autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
- autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
- autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +324 -0
- autogen/agentchat/contrib/rag/__init__.py +10 -0
- autogen/agentchat/contrib/rag/chromadb_query_engine.py +272 -0
- autogen/agentchat/contrib/rag/llamaindex_query_engine.py +198 -0
- autogen/agentchat/contrib/rag/mongodb_query_engine.py +329 -0
- autogen/agentchat/contrib/rag/query_engine.py +74 -0
- autogen/agentchat/contrib/retrieve_assistant_agent.py +56 -0
- autogen/agentchat/contrib/retrieve_user_proxy_agent.py +703 -0
- autogen/agentchat/contrib/society_of_mind_agent.py +199 -0
- autogen/agentchat/contrib/swarm_agent.py +1425 -0
- autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
- autogen/agentchat/contrib/vectordb/__init__.py +5 -0
- autogen/agentchat/contrib/vectordb/base.py +232 -0
- autogen/agentchat/contrib/vectordb/chromadb.py +315 -0
- autogen/agentchat/contrib/vectordb/couchbase.py +407 -0
- autogen/agentchat/contrib/vectordb/mongodb.py +550 -0
- autogen/agentchat/contrib/vectordb/pgvectordb.py +928 -0
- autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
- autogen/agentchat/contrib/vectordb/utils.py +126 -0
- autogen/agentchat/contrib/web_surfer.py +303 -0
- autogen/agentchat/conversable_agent.py +4020 -0
- autogen/agentchat/group/__init__.py +64 -0
- autogen/agentchat/group/available_condition.py +91 -0
- autogen/agentchat/group/context_condition.py +77 -0
- autogen/agentchat/group/context_expression.py +238 -0
- autogen/agentchat/group/context_str.py +41 -0
- autogen/agentchat/group/context_variables.py +192 -0
- autogen/agentchat/group/group_tool_executor.py +202 -0
- autogen/agentchat/group/group_utils.py +591 -0
- autogen/agentchat/group/handoffs.py +244 -0
- autogen/agentchat/group/llm_condition.py +93 -0
- autogen/agentchat/group/multi_agent_chat.py +237 -0
- autogen/agentchat/group/on_condition.py +58 -0
- autogen/agentchat/group/on_context_condition.py +54 -0
- autogen/agentchat/group/patterns/__init__.py +18 -0
- autogen/agentchat/group/patterns/auto.py +159 -0
- autogen/agentchat/group/patterns/manual.py +176 -0
- autogen/agentchat/group/patterns/pattern.py +288 -0
- autogen/agentchat/group/patterns/random.py +106 -0
- autogen/agentchat/group/patterns/round_robin.py +117 -0
- autogen/agentchat/group/reply_result.py +26 -0
- autogen/agentchat/group/speaker_selection_result.py +41 -0
- autogen/agentchat/group/targets/__init__.py +4 -0
- autogen/agentchat/group/targets/group_chat_target.py +132 -0
- autogen/agentchat/group/targets/group_manager_target.py +151 -0
- autogen/agentchat/group/targets/transition_target.py +413 -0
- autogen/agentchat/group/targets/transition_utils.py +6 -0
- autogen/agentchat/groupchat.py +1694 -0
- autogen/agentchat/realtime/__init__.py +3 -0
- autogen/agentchat/realtime/experimental/__init__.py +20 -0
- autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
- autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
- autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
- autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
- autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
- autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
- autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
- autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
- autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
- autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
- autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
- autogen/agentchat/realtime/experimental/clients/realtime_client.py +190 -0
- autogen/agentchat/realtime/experimental/function_observer.py +85 -0
- autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
- autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
- autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
- autogen/agentchat/realtime/experimental/realtime_swarm.py +475 -0
- autogen/agentchat/realtime/experimental/websockets.py +21 -0
- autogen/agentchat/realtime_agent/__init__.py +21 -0
- autogen/agentchat/user_proxy_agent.py +111 -0
- autogen/agentchat/utils.py +206 -0
- autogen/agents/__init__.py +3 -0
- autogen/agents/contrib/__init__.py +10 -0
- autogen/agents/contrib/time/__init__.py +8 -0
- autogen/agents/contrib/time/time_reply_agent.py +73 -0
- autogen/agents/contrib/time/time_tool_agent.py +51 -0
- autogen/agents/experimental/__init__.py +27 -0
- autogen/agents/experimental/deep_research/__init__.py +7 -0
- autogen/agents/experimental/deep_research/deep_research.py +52 -0
- autogen/agents/experimental/discord/__init__.py +7 -0
- autogen/agents/experimental/discord/discord.py +66 -0
- autogen/agents/experimental/document_agent/__init__.py +19 -0
- autogen/agents/experimental/document_agent/chroma_query_engine.py +316 -0
- autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +118 -0
- autogen/agents/experimental/document_agent/document_agent.py +461 -0
- autogen/agents/experimental/document_agent/document_conditions.py +50 -0
- autogen/agents/experimental/document_agent/document_utils.py +380 -0
- autogen/agents/experimental/document_agent/inmemory_query_engine.py +220 -0
- autogen/agents/experimental/document_agent/parser_utils.py +130 -0
- autogen/agents/experimental/document_agent/url_utils.py +426 -0
- autogen/agents/experimental/reasoning/__init__.py +7 -0
- autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
- autogen/agents/experimental/slack/__init__.py +7 -0
- autogen/agents/experimental/slack/slack.py +73 -0
- autogen/agents/experimental/telegram/__init__.py +7 -0
- autogen/agents/experimental/telegram/telegram.py +77 -0
- autogen/agents/experimental/websurfer/__init__.py +7 -0
- autogen/agents/experimental/websurfer/websurfer.py +62 -0
- autogen/agents/experimental/wikipedia/__init__.py +7 -0
- autogen/agents/experimental/wikipedia/wikipedia.py +90 -0
- autogen/browser_utils.py +309 -0
- autogen/cache/__init__.py +10 -0
- autogen/cache/abstract_cache_base.py +75 -0
- autogen/cache/cache.py +203 -0
- autogen/cache/cache_factory.py +88 -0
- autogen/cache/cosmos_db_cache.py +144 -0
- autogen/cache/disk_cache.py +102 -0
- autogen/cache/in_memory_cache.py +58 -0
- autogen/cache/redis_cache.py +123 -0
- autogen/code_utils.py +596 -0
- autogen/coding/__init__.py +22 -0
- autogen/coding/base.py +119 -0
- autogen/coding/docker_commandline_code_executor.py +268 -0
- autogen/coding/factory.py +47 -0
- autogen/coding/func_with_reqs.py +202 -0
- autogen/coding/jupyter/__init__.py +23 -0
- autogen/coding/jupyter/base.py +36 -0
- autogen/coding/jupyter/docker_jupyter_server.py +167 -0
- autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
- autogen/coding/jupyter/import_utils.py +82 -0
- autogen/coding/jupyter/jupyter_client.py +231 -0
- autogen/coding/jupyter/jupyter_code_executor.py +160 -0
- autogen/coding/jupyter/local_jupyter_server.py +172 -0
- autogen/coding/local_commandline_code_executor.py +405 -0
- autogen/coding/markdown_code_extractor.py +45 -0
- autogen/coding/utils.py +56 -0
- autogen/doc_utils.py +34 -0
- autogen/events/__init__.py +7 -0
- autogen/events/agent_events.py +1010 -0
- autogen/events/base_event.py +99 -0
- autogen/events/client_events.py +167 -0
- autogen/events/helpers.py +36 -0
- autogen/events/print_event.py +46 -0
- autogen/exception_utils.py +73 -0
- autogen/extensions/__init__.py +5 -0
- autogen/fast_depends/__init__.py +16 -0
- autogen/fast_depends/_compat.py +80 -0
- autogen/fast_depends/core/__init__.py +14 -0
- autogen/fast_depends/core/build.py +225 -0
- autogen/fast_depends/core/model.py +576 -0
- autogen/fast_depends/dependencies/__init__.py +15 -0
- autogen/fast_depends/dependencies/model.py +29 -0
- autogen/fast_depends/dependencies/provider.py +39 -0
- autogen/fast_depends/library/__init__.py +10 -0
- autogen/fast_depends/library/model.py +46 -0
- autogen/fast_depends/py.typed +6 -0
- autogen/fast_depends/schema.py +66 -0
- autogen/fast_depends/use.py +280 -0
- autogen/fast_depends/utils.py +187 -0
- autogen/formatting_utils.py +83 -0
- autogen/function_utils.py +13 -0
- autogen/graph_utils.py +178 -0
- autogen/import_utils.py +526 -0
- autogen/interop/__init__.py +22 -0
- autogen/interop/crewai/__init__.py +7 -0
- autogen/interop/crewai/crewai.py +88 -0
- autogen/interop/interoperability.py +71 -0
- autogen/interop/interoperable.py +46 -0
- autogen/interop/langchain/__init__.py +8 -0
- autogen/interop/langchain/langchain_chat_model_factory.py +155 -0
- autogen/interop/langchain/langchain_tool.py +82 -0
- autogen/interop/litellm/__init__.py +7 -0
- autogen/interop/litellm/litellm_config_factory.py +113 -0
- autogen/interop/pydantic_ai/__init__.py +7 -0
- autogen/interop/pydantic_ai/pydantic_ai.py +168 -0
- autogen/interop/registry.py +69 -0
- autogen/io/__init__.py +15 -0
- autogen/io/base.py +151 -0
- autogen/io/console.py +56 -0
- autogen/io/processors/__init__.py +12 -0
- autogen/io/processors/base.py +21 -0
- autogen/io/processors/console_event_processor.py +56 -0
- autogen/io/run_response.py +293 -0
- autogen/io/thread_io_stream.py +63 -0
- autogen/io/websockets.py +213 -0
- autogen/json_utils.py +43 -0
- autogen/llm_config.py +379 -0
- autogen/logger/__init__.py +11 -0
- autogen/logger/base_logger.py +128 -0
- autogen/logger/file_logger.py +261 -0
- autogen/logger/logger_factory.py +42 -0
- autogen/logger/logger_utils.py +57 -0
- autogen/logger/sqlite_logger.py +523 -0
- autogen/math_utils.py +339 -0
- autogen/mcp/__init__.py +7 -0
- autogen/mcp/mcp_client.py +208 -0
- autogen/messages/__init__.py +7 -0
- autogen/messages/agent_messages.py +948 -0
- autogen/messages/base_message.py +107 -0
- autogen/messages/client_messages.py +171 -0
- autogen/messages/print_message.py +49 -0
- autogen/oai/__init__.py +53 -0
- autogen/oai/anthropic.py +714 -0
- autogen/oai/bedrock.py +628 -0
- autogen/oai/cerebras.py +299 -0
- autogen/oai/client.py +1435 -0
- autogen/oai/client_utils.py +169 -0
- autogen/oai/cohere.py +479 -0
- autogen/oai/gemini.py +990 -0
- autogen/oai/gemini_types.py +129 -0
- autogen/oai/groq.py +305 -0
- autogen/oai/mistral.py +303 -0
- autogen/oai/oai_models/__init__.py +11 -0
- autogen/oai/oai_models/_models.py +16 -0
- autogen/oai/oai_models/chat_completion.py +87 -0
- autogen/oai/oai_models/chat_completion_audio.py +32 -0
- autogen/oai/oai_models/chat_completion_message.py +86 -0
- autogen/oai/oai_models/chat_completion_message_tool_call.py +37 -0
- autogen/oai/oai_models/chat_completion_token_logprob.py +63 -0
- autogen/oai/oai_models/completion_usage.py +60 -0
- autogen/oai/ollama.py +643 -0
- autogen/oai/openai_utils.py +881 -0
- autogen/oai/together.py +370 -0
- autogen/retrieve_utils.py +491 -0
- autogen/runtime_logging.py +160 -0
- autogen/token_count_utils.py +267 -0
- autogen/tools/__init__.py +20 -0
- autogen/tools/contrib/__init__.py +9 -0
- autogen/tools/contrib/time/__init__.py +7 -0
- autogen/tools/contrib/time/time.py +41 -0
- autogen/tools/dependency_injection.py +254 -0
- autogen/tools/experimental/__init__.py +43 -0
- autogen/tools/experimental/browser_use/__init__.py +7 -0
- autogen/tools/experimental/browser_use/browser_use.py +161 -0
- autogen/tools/experimental/crawl4ai/__init__.py +7 -0
- autogen/tools/experimental/crawl4ai/crawl4ai.py +153 -0
- autogen/tools/experimental/deep_research/__init__.py +7 -0
- autogen/tools/experimental/deep_research/deep_research.py +328 -0
- autogen/tools/experimental/duckduckgo/__init__.py +7 -0
- autogen/tools/experimental/duckduckgo/duckduckgo_search.py +109 -0
- autogen/tools/experimental/google/__init__.py +14 -0
- autogen/tools/experimental/google/authentication/__init__.py +11 -0
- autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
- autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
- autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
- autogen/tools/experimental/google/drive/__init__.py +9 -0
- autogen/tools/experimental/google/drive/drive_functions.py +124 -0
- autogen/tools/experimental/google/drive/toolkit.py +88 -0
- autogen/tools/experimental/google/model.py +17 -0
- autogen/tools/experimental/google/toolkit_protocol.py +19 -0
- autogen/tools/experimental/google_search/__init__.py +8 -0
- autogen/tools/experimental/google_search/google_search.py +93 -0
- autogen/tools/experimental/google_search/youtube_search.py +181 -0
- autogen/tools/experimental/messageplatform/__init__.py +17 -0
- autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/discord/discord.py +288 -0
- autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/slack/slack.py +391 -0
- autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
- autogen/tools/experimental/messageplatform/telegram/telegram.py +275 -0
- autogen/tools/experimental/perplexity/__init__.py +7 -0
- autogen/tools/experimental/perplexity/perplexity_search.py +260 -0
- autogen/tools/experimental/tavily/__init__.py +7 -0
- autogen/tools/experimental/tavily/tavily_search.py +183 -0
- autogen/tools/experimental/web_search_preview/__init__.py +7 -0
- autogen/tools/experimental/web_search_preview/web_search_preview.py +114 -0
- autogen/tools/experimental/wikipedia/__init__.py +7 -0
- autogen/tools/experimental/wikipedia/wikipedia.py +287 -0
- autogen/tools/function_utils.py +411 -0
- autogen/tools/tool.py +187 -0
- autogen/tools/toolkit.py +86 -0
- autogen/types.py +29 -0
- autogen/version.py +7 -0
- ag2-0.9.1a1.dist-info/RECORD +0 -6
- ag2-0.9.1a1.dist-info/top_level.txt +0 -1
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
- {ag2-0.9.1a1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
#
|
|
5
|
+
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import json
|
|
10
|
+
import logging
|
|
11
|
+
import os
|
|
12
|
+
import threading
|
|
13
|
+
import uuid
|
|
14
|
+
from typing import TYPE_CHECKING, Any, Callable, TypeVar
|
|
15
|
+
|
|
16
|
+
from ..doc_utils import export_module
|
|
17
|
+
from .base_logger import BaseLogger, LLMConfig
|
|
18
|
+
from .logger_utils import get_current_ts, to_dict
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from openai import AzureOpenAI, OpenAI
|
|
22
|
+
from openai.types.chat import ChatCompletion
|
|
23
|
+
|
|
24
|
+
from .. import Agent, ConversableAgent, OpenAIWrapper
|
|
25
|
+
from ..oai.anthropic import AnthropicClient
|
|
26
|
+
from ..oai.bedrock import BedrockClient
|
|
27
|
+
from ..oai.cerebras import CerebrasClient
|
|
28
|
+
from ..oai.cohere import CohereClient
|
|
29
|
+
from ..oai.gemini import GeminiClient
|
|
30
|
+
from ..oai.groq import GroqClient
|
|
31
|
+
from ..oai.mistral import MistralAIClient
|
|
32
|
+
from ..oai.ollama import OllamaClient
|
|
33
|
+
from ..oai.together import TogetherClient
|
|
34
|
+
|
|
35
|
+
logger = logging.getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
|
38
|
+
|
|
39
|
+
__all__ = ("FileLogger",)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def safe_serialize(obj: Any) -> str:
|
|
43
|
+
def default(o: Any) -> str:
|
|
44
|
+
if hasattr(o, "to_json"):
|
|
45
|
+
return str(o.to_json())
|
|
46
|
+
else:
|
|
47
|
+
return f"<<non-serializable: {type(o).__qualname__}>>"
|
|
48
|
+
|
|
49
|
+
return json.dumps(obj, default=default)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@export_module("autogen.logger")
|
|
53
|
+
class FileLogger(BaseLogger):
|
|
54
|
+
def __init__(self, config: dict[str, Any]):
|
|
55
|
+
self.config = config
|
|
56
|
+
self.session_id = str(uuid.uuid4())
|
|
57
|
+
|
|
58
|
+
curr_dir = os.getcwd()
|
|
59
|
+
self.log_dir = os.path.join(curr_dir, "autogen_logs")
|
|
60
|
+
os.makedirs(self.log_dir, exist_ok=True)
|
|
61
|
+
|
|
62
|
+
self.log_file = os.path.join(self.log_dir, self.config.get("filename", "runtime.log"))
|
|
63
|
+
try:
|
|
64
|
+
with open(self.log_file, "a"):
|
|
65
|
+
pass
|
|
66
|
+
except Exception as e:
|
|
67
|
+
logger.error(f"[file_logger] Failed to create logging file: {e}")
|
|
68
|
+
|
|
69
|
+
self.logger = logging.getLogger(__name__)
|
|
70
|
+
self.logger.setLevel(logging.INFO)
|
|
71
|
+
file_handler = logging.FileHandler(self.log_file)
|
|
72
|
+
self.logger.addHandler(file_handler)
|
|
73
|
+
|
|
74
|
+
def start(self) -> str:
|
|
75
|
+
"""Start the logger and return the session_id."""
|
|
76
|
+
try:
|
|
77
|
+
self.logger.info(f"Started new session with Session ID: {self.session_id}")
|
|
78
|
+
except Exception as e:
|
|
79
|
+
logger.error(f"[file_logger] Failed to create logging file: {e}")
|
|
80
|
+
finally:
|
|
81
|
+
return self.session_id
|
|
82
|
+
|
|
83
|
+
def log_chat_completion(
|
|
84
|
+
self,
|
|
85
|
+
invocation_id: uuid.UUID,
|
|
86
|
+
client_id: int,
|
|
87
|
+
wrapper_id: int,
|
|
88
|
+
source: str | Agent,
|
|
89
|
+
request: dict[str, float | str | list[dict[str, str]]],
|
|
90
|
+
response: str | ChatCompletion,
|
|
91
|
+
is_cached: int,
|
|
92
|
+
cost: float,
|
|
93
|
+
start_time: str,
|
|
94
|
+
) -> None:
|
|
95
|
+
"""Log a chat completion."""
|
|
96
|
+
thread_id = threading.get_ident()
|
|
97
|
+
source_name = (
|
|
98
|
+
source
|
|
99
|
+
if isinstance(source, str)
|
|
100
|
+
else source.name
|
|
101
|
+
if hasattr(source, "name") and source.name is not None
|
|
102
|
+
else ""
|
|
103
|
+
)
|
|
104
|
+
try:
|
|
105
|
+
log_data = json.dumps({
|
|
106
|
+
"invocation_id": str(invocation_id),
|
|
107
|
+
"client_id": client_id,
|
|
108
|
+
"wrapper_id": wrapper_id,
|
|
109
|
+
"request": to_dict(request),
|
|
110
|
+
"response": str(response),
|
|
111
|
+
"is_cached": is_cached,
|
|
112
|
+
"cost": cost,
|
|
113
|
+
"start_time": start_time,
|
|
114
|
+
"end_time": get_current_ts(),
|
|
115
|
+
"thread_id": thread_id,
|
|
116
|
+
"source_name": source_name,
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
self.logger.info(log_data)
|
|
120
|
+
except Exception as e:
|
|
121
|
+
self.logger.error(f"[file_logger] Failed to log chat completion: {e}")
|
|
122
|
+
|
|
123
|
+
def log_new_agent(self, agent: ConversableAgent, init_args: dict[str, Any] = {}) -> None:
|
|
124
|
+
"""Log a new agent instance."""
|
|
125
|
+
thread_id = threading.get_ident()
|
|
126
|
+
|
|
127
|
+
try:
|
|
128
|
+
log_data = json.dumps({
|
|
129
|
+
"id": id(agent),
|
|
130
|
+
"agent_name": agent.name if hasattr(agent, "name") and agent.name is not None else "",
|
|
131
|
+
"wrapper_id": to_dict(
|
|
132
|
+
agent.client.wrapper_id if hasattr(agent, "client") and agent.client is not None else ""
|
|
133
|
+
),
|
|
134
|
+
"session_id": self.session_id,
|
|
135
|
+
"current_time": get_current_ts(),
|
|
136
|
+
"agent_type": type(agent).__name__,
|
|
137
|
+
"args": to_dict(init_args),
|
|
138
|
+
"thread_id": thread_id,
|
|
139
|
+
})
|
|
140
|
+
self.logger.info(log_data)
|
|
141
|
+
except Exception as e:
|
|
142
|
+
self.logger.error(f"[file_logger] Failed to log new agent: {e}")
|
|
143
|
+
|
|
144
|
+
def log_event(self, source: str | Agent, name: str, **kwargs: dict[str, Any]) -> None:
|
|
145
|
+
"""Log an event from an agent or a string source."""
|
|
146
|
+
from .. import Agent
|
|
147
|
+
|
|
148
|
+
# This takes an object o as input and returns a string. If the object o cannot be serialized, instead of raising an error,
|
|
149
|
+
# it returns a string indicating that the object is non-serializable, along with its type's qualified name obtained using __qualname__.
|
|
150
|
+
json_args = json.dumps(kwargs, default=lambda o: f"<<non-serializable: {type(o).__qualname__}>>")
|
|
151
|
+
thread_id = threading.get_ident()
|
|
152
|
+
|
|
153
|
+
if isinstance(source, Agent):
|
|
154
|
+
try:
|
|
155
|
+
log_data = json.dumps({
|
|
156
|
+
"source_id": id(source),
|
|
157
|
+
"source_name": str(source.name) if hasattr(source, "name") else source,
|
|
158
|
+
"event_name": name,
|
|
159
|
+
"agent_module": source.__module__,
|
|
160
|
+
"agent_class": source.__class__.__name__,
|
|
161
|
+
"json_state": json_args,
|
|
162
|
+
"timestamp": get_current_ts(),
|
|
163
|
+
"thread_id": thread_id,
|
|
164
|
+
})
|
|
165
|
+
self.logger.info(log_data)
|
|
166
|
+
except Exception as e:
|
|
167
|
+
self.logger.error(f"[file_logger] Failed to log event {e}")
|
|
168
|
+
else:
|
|
169
|
+
try:
|
|
170
|
+
log_data = json.dumps({
|
|
171
|
+
"source_id": id(source),
|
|
172
|
+
"source_name": str(source.name) if hasattr(source, "name") else source,
|
|
173
|
+
"event_name": name,
|
|
174
|
+
"json_state": json_args,
|
|
175
|
+
"timestamp": get_current_ts(),
|
|
176
|
+
"thread_id": thread_id,
|
|
177
|
+
})
|
|
178
|
+
self.logger.info(log_data)
|
|
179
|
+
except Exception as e:
|
|
180
|
+
self.logger.error(f"[file_logger] Failed to log event {e}")
|
|
181
|
+
|
|
182
|
+
def log_new_wrapper(self, wrapper: OpenAIWrapper, init_args: dict[str, LLMConfig | list[LLMConfig]] = {}) -> None:
|
|
183
|
+
"""Log a new wrapper instance."""
|
|
184
|
+
thread_id = threading.get_ident()
|
|
185
|
+
|
|
186
|
+
try:
|
|
187
|
+
log_data = json.dumps({
|
|
188
|
+
"wrapper_id": id(wrapper),
|
|
189
|
+
"session_id": self.session_id,
|
|
190
|
+
"json_state": json.dumps(init_args),
|
|
191
|
+
"timestamp": get_current_ts(),
|
|
192
|
+
"thread_id": thread_id,
|
|
193
|
+
})
|
|
194
|
+
self.logger.info(log_data)
|
|
195
|
+
except Exception as e:
|
|
196
|
+
self.logger.error(f"[file_logger] Failed to log event {e}")
|
|
197
|
+
|
|
198
|
+
def log_new_client(
|
|
199
|
+
self,
|
|
200
|
+
client: (
|
|
201
|
+
AzureOpenAI
|
|
202
|
+
| OpenAI
|
|
203
|
+
| CerebrasClient
|
|
204
|
+
| GeminiClient
|
|
205
|
+
| AnthropicClient
|
|
206
|
+
| MistralAIClient
|
|
207
|
+
| TogetherClient
|
|
208
|
+
| GroqClient
|
|
209
|
+
| CohereClient
|
|
210
|
+
| OllamaClient
|
|
211
|
+
| BedrockClient
|
|
212
|
+
),
|
|
213
|
+
wrapper: OpenAIWrapper,
|
|
214
|
+
init_args: dict[str, Any],
|
|
215
|
+
) -> None:
|
|
216
|
+
"""Log a new client instance."""
|
|
217
|
+
thread_id = threading.get_ident()
|
|
218
|
+
|
|
219
|
+
try:
|
|
220
|
+
log_data = json.dumps({
|
|
221
|
+
"client_id": id(client),
|
|
222
|
+
"wrapper_id": id(wrapper),
|
|
223
|
+
"session_id": self.session_id,
|
|
224
|
+
"class": type(client).__name__,
|
|
225
|
+
"json_state": json.dumps(init_args),
|
|
226
|
+
"timestamp": get_current_ts(),
|
|
227
|
+
"thread_id": thread_id,
|
|
228
|
+
})
|
|
229
|
+
self.logger.info(log_data)
|
|
230
|
+
except Exception as e:
|
|
231
|
+
self.logger.error(f"[file_logger] Failed to log event {e}")
|
|
232
|
+
|
|
233
|
+
def log_function_use(self, source: str | Agent, function: F, args: dict[str, Any], returns: Any) -> None:
|
|
234
|
+
"""Log a registered function(can be a tool) use from an agent or a string source."""
|
|
235
|
+
thread_id = threading.get_ident()
|
|
236
|
+
|
|
237
|
+
try:
|
|
238
|
+
log_data = json.dumps({
|
|
239
|
+
"source_id": id(source),
|
|
240
|
+
"source_name": str(source.name) if hasattr(source, "name") else source,
|
|
241
|
+
"agent_module": source.__module__,
|
|
242
|
+
"agent_class": source.__class__.__name__,
|
|
243
|
+
"timestamp": get_current_ts(),
|
|
244
|
+
"thread_id": thread_id,
|
|
245
|
+
"input_args": safe_serialize(args),
|
|
246
|
+
"returns": safe_serialize(returns),
|
|
247
|
+
})
|
|
248
|
+
self.logger.info(log_data)
|
|
249
|
+
except Exception as e:
|
|
250
|
+
self.logger.error(f"[file_logger] Failed to log event {e}")
|
|
251
|
+
|
|
252
|
+
def get_connection(self) -> None:
|
|
253
|
+
"""Method is intentionally left blank because there is no specific connection needed for the FileLogger."""
|
|
254
|
+
pass
|
|
255
|
+
|
|
256
|
+
def stop(self) -> None:
|
|
257
|
+
"""Close the file handler and remove it from the logger."""
|
|
258
|
+
for handler in self.logger.handlers:
|
|
259
|
+
if isinstance(handler, logging.FileHandler):
|
|
260
|
+
handler.close()
|
|
261
|
+
self.logger.removeHandler(handler)
|
|
@@ -0,0 +1,42 @@
|
|
|
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 typing import Any, Literal, Optional
|
|
8
|
+
|
|
9
|
+
from ..doc_utils import export_module
|
|
10
|
+
from .base_logger import BaseLogger
|
|
11
|
+
from .file_logger import FileLogger
|
|
12
|
+
from .sqlite_logger import SqliteLogger
|
|
13
|
+
|
|
14
|
+
__all__ = ("LoggerFactory",)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@export_module("autogen.logger")
|
|
18
|
+
class LoggerFactory:
|
|
19
|
+
"""Factory class to create logger objects."""
|
|
20
|
+
|
|
21
|
+
@staticmethod
|
|
22
|
+
def get_logger(
|
|
23
|
+
logger_type: Literal["sqlite", "file"] = "sqlite", config: Optional[dict[str, Any]] = None
|
|
24
|
+
) -> BaseLogger:
|
|
25
|
+
"""Factory method to create logger objects.
|
|
26
|
+
|
|
27
|
+
Args:
|
|
28
|
+
logger_type (Literal["sqlite", "file"], optional): Type of logger. Defaults to "sqlite".
|
|
29
|
+
config (Optional[dict[str, Any]], optional): Configuration for logger. Defaults to None.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
BaseLogger: Logger object
|
|
33
|
+
"""
|
|
34
|
+
if config is None:
|
|
35
|
+
config = {}
|
|
36
|
+
|
|
37
|
+
if logger_type == "sqlite":
|
|
38
|
+
return SqliteLogger(config)
|
|
39
|
+
elif logger_type == "file":
|
|
40
|
+
return FileLogger(config)
|
|
41
|
+
else:
|
|
42
|
+
raise ValueError(f"[logger_factory] Unknown logger type: {logger_type}")
|
|
@@ -0,0 +1,57 @@
|
|
|
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 inspect
|
|
8
|
+
from datetime import datetime, timezone
|
|
9
|
+
from pathlib import Path, PurePath
|
|
10
|
+
from typing import Any, Union
|
|
11
|
+
|
|
12
|
+
__all__ = ("get_current_ts", "to_dict")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_current_ts() -> str:
|
|
16
|
+
"""Get current timestamp in UTC timezone.
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
str: Current timestamp in UTC timezone
|
|
20
|
+
"""
|
|
21
|
+
return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S.%f")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def to_dict(
|
|
25
|
+
obj: Union[int, float, str, bool, dict[Any, Any], list[Any], tuple[Any, ...], Any],
|
|
26
|
+
exclude: tuple[str, ...] = (),
|
|
27
|
+
no_recursive: tuple[Any, ...] = (),
|
|
28
|
+
) -> Any:
|
|
29
|
+
"""Convert object to dictionary.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
obj (Union[int, float, str, bool, dict[Any, Any], list[Any], tuple[Any, ...], Any]): Object to convert
|
|
33
|
+
exclude (tuple[str, ...], optional): Keys to exclude. Defaults to ().
|
|
34
|
+
no_recursive (tuple[Any, ...], optional): Types to exclude from recursive conversion. Defaults to ().
|
|
35
|
+
"""
|
|
36
|
+
if isinstance(obj, (int, float, str, bool)):
|
|
37
|
+
return obj
|
|
38
|
+
elif isinstance(obj, (Path, PurePath)):
|
|
39
|
+
return str(obj)
|
|
40
|
+
elif callable(obj):
|
|
41
|
+
return inspect.getsource(obj).strip()
|
|
42
|
+
elif isinstance(obj, dict):
|
|
43
|
+
return {
|
|
44
|
+
str(k): to_dict(str(v)) if isinstance(v, no_recursive) else to_dict(v, exclude, no_recursive)
|
|
45
|
+
for k, v in obj.items()
|
|
46
|
+
if k not in exclude
|
|
47
|
+
}
|
|
48
|
+
elif isinstance(obj, (list, tuple)):
|
|
49
|
+
return [to_dict(str(v)) if isinstance(v, no_recursive) else to_dict(v, exclude, no_recursive) for v in obj]
|
|
50
|
+
elif hasattr(obj, "__dict__"):
|
|
51
|
+
return {
|
|
52
|
+
str(k): to_dict(str(v)) if isinstance(v, no_recursive) else to_dict(v, exclude, no_recursive)
|
|
53
|
+
for k, v in vars(obj).items()
|
|
54
|
+
if k not in exclude
|
|
55
|
+
}
|
|
56
|
+
else:
|
|
57
|
+
return obj
|