ag2 0.9.1__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.1.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.1.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.1.dist-info/RECORD +0 -6
- ag2-0.9.1.dist-info/top_level.txt +0 -1
- {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/LICENSE +0 -0
- {ag2-0.9.1.dist-info → ag2-0.9.1.post0.dist-info/licenses}/NOTICE.md +0 -0
autogen/llm_config.py
ADDED
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
import functools
|
|
6
|
+
import json
|
|
7
|
+
import re
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
|
+
from collections.abc import Iterable
|
|
10
|
+
from contextvars import ContextVar
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import TYPE_CHECKING, Annotated, Any, Mapping, Optional, Type, TypeVar, Union
|
|
13
|
+
|
|
14
|
+
from httpx import Client as httpxClient
|
|
15
|
+
from pydantic import BaseModel, ConfigDict, Field, HttpUrl, SecretStr, ValidationInfo, field_serializer, field_validator
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from .oai.client import ModelClient
|
|
19
|
+
|
|
20
|
+
_KT = TypeVar("_KT")
|
|
21
|
+
_VT = TypeVar("_VT")
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"LLMConfig",
|
|
25
|
+
"LLMConfigEntry",
|
|
26
|
+
"register_llm_config",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _add_default_api_type(d: dict[str, Any]) -> dict[str, Any]:
|
|
31
|
+
if "api_type" not in d:
|
|
32
|
+
d["api_type"] = "openai"
|
|
33
|
+
return d
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# Meta class to allow LLMConfig.current and LLMConfig.default to be used as class properties
|
|
37
|
+
class MetaLLMConfig(type):
|
|
38
|
+
def __init__(cls, *args: Any, **kwargs: Any) -> None:
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
@property
|
|
42
|
+
def current(cls) -> "LLMConfig":
|
|
43
|
+
current_llm_config = LLMConfig.get_current_llm_config(llm_config=None)
|
|
44
|
+
if current_llm_config is None:
|
|
45
|
+
raise ValueError("No current LLMConfig set. Are you inside a context block?")
|
|
46
|
+
return current_llm_config # type: ignore[return-value]
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def default(cls) -> "LLMConfig":
|
|
50
|
+
return cls.current
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class LLMConfig(metaclass=MetaLLMConfig):
|
|
54
|
+
_current_llm_config: ContextVar["LLMConfig"] = ContextVar("current_llm_config")
|
|
55
|
+
|
|
56
|
+
def __init__(self, **kwargs: Any) -> None:
|
|
57
|
+
outside_properties = list((self._get_base_model_class()).model_json_schema()["properties"].keys())
|
|
58
|
+
outside_properties.remove("config_list")
|
|
59
|
+
|
|
60
|
+
if "config_list" in kwargs and isinstance(kwargs["config_list"], dict):
|
|
61
|
+
kwargs["config_list"] = [kwargs["config_list"]]
|
|
62
|
+
|
|
63
|
+
modified_kwargs = (
|
|
64
|
+
kwargs
|
|
65
|
+
if "config_list" in kwargs
|
|
66
|
+
else {
|
|
67
|
+
**{
|
|
68
|
+
"config_list": [
|
|
69
|
+
{k: v for k, v in kwargs.items() if k not in outside_properties},
|
|
70
|
+
]
|
|
71
|
+
},
|
|
72
|
+
**{k: v for k, v in kwargs.items() if k in outside_properties},
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
modified_kwargs["config_list"] = [
|
|
77
|
+
_add_default_api_type(v) if isinstance(v, dict) else v for v in modified_kwargs["config_list"]
|
|
78
|
+
]
|
|
79
|
+
for x in ["max_tokens", "top_p"]:
|
|
80
|
+
if x in modified_kwargs:
|
|
81
|
+
modified_kwargs["config_list"] = [{**v, x: modified_kwargs[x]} for v in modified_kwargs["config_list"]]
|
|
82
|
+
modified_kwargs.pop(x)
|
|
83
|
+
|
|
84
|
+
self._model = self._get_base_model_class()(**modified_kwargs)
|
|
85
|
+
|
|
86
|
+
# used by BaseModel to create instance variables
|
|
87
|
+
def __enter__(self) -> "LLMConfig":
|
|
88
|
+
# Store previous context and set self as current
|
|
89
|
+
self._token = LLMConfig._current_llm_config.set(self)
|
|
90
|
+
return self
|
|
91
|
+
|
|
92
|
+
def __exit__(self, exc_type: Type[Exception], exc_val: Exception, exc_tb: Any) -> None:
|
|
93
|
+
LLMConfig._current_llm_config.reset(self._token)
|
|
94
|
+
|
|
95
|
+
@classmethod
|
|
96
|
+
def get_current_llm_config(cls, llm_config: "Optional[LLMConfig]" = None) -> "Optional[LLMConfig]":
|
|
97
|
+
if llm_config is not None:
|
|
98
|
+
return llm_config
|
|
99
|
+
try:
|
|
100
|
+
return (LLMConfig._current_llm_config.get()).copy()
|
|
101
|
+
except LookupError:
|
|
102
|
+
return None
|
|
103
|
+
|
|
104
|
+
def _satisfies_criteria(self, value: Any, criteria_values: Any) -> bool:
|
|
105
|
+
if value is None:
|
|
106
|
+
return False
|
|
107
|
+
|
|
108
|
+
if isinstance(value, list):
|
|
109
|
+
return bool(set(value) & set(criteria_values)) # Non-empty intersection
|
|
110
|
+
else:
|
|
111
|
+
return value in criteria_values
|
|
112
|
+
|
|
113
|
+
@classmethod
|
|
114
|
+
def from_json(
|
|
115
|
+
cls,
|
|
116
|
+
*,
|
|
117
|
+
env: Optional[str] = None,
|
|
118
|
+
path: Optional[Union[str, Path]] = None,
|
|
119
|
+
file_location: Optional[str] = None,
|
|
120
|
+
**kwargs: Any,
|
|
121
|
+
) -> "LLMConfig":
|
|
122
|
+
from .oai.openai_utils import config_list_from_json
|
|
123
|
+
|
|
124
|
+
if env is None and path is None:
|
|
125
|
+
raise ValueError("Either 'env' or 'path' must be provided")
|
|
126
|
+
if env is not None and path is not None:
|
|
127
|
+
raise ValueError("Only one of 'env' or 'path' can be provided")
|
|
128
|
+
|
|
129
|
+
config_list = config_list_from_json(
|
|
130
|
+
env_or_file=env if env is not None else str(path), file_location=file_location
|
|
131
|
+
)
|
|
132
|
+
return LLMConfig(config_list=config_list, **kwargs)
|
|
133
|
+
|
|
134
|
+
def where(self, *, exclude: bool = False, **kwargs: Any) -> "LLMConfig":
|
|
135
|
+
from .oai.openai_utils import filter_config
|
|
136
|
+
|
|
137
|
+
filtered_config_list = filter_config(config_list=self.config_list, filter_dict=kwargs, exclude=exclude)
|
|
138
|
+
if len(filtered_config_list) == 0:
|
|
139
|
+
raise ValueError(f"No config found that satisfies the filter criteria: {kwargs}")
|
|
140
|
+
|
|
141
|
+
return LLMConfig(config_list=filtered_config_list)
|
|
142
|
+
|
|
143
|
+
# @functools.wraps(BaseModel.model_dump)
|
|
144
|
+
def model_dump(self, *args: Any, exclude_none: bool = True, **kwargs: Any) -> dict[str, Any]:
|
|
145
|
+
d = self._model.model_dump(*args, exclude_none=exclude_none, **kwargs)
|
|
146
|
+
return {k: v for k, v in d.items() if not (isinstance(v, list) and len(v) == 0)}
|
|
147
|
+
|
|
148
|
+
# @functools.wraps(BaseModel.model_dump_json)
|
|
149
|
+
def model_dump_json(self, *args: Any, exclude_none: bool = True, **kwargs: Any) -> str:
|
|
150
|
+
# return self._model.model_dump_json(*args, exclude_none=exclude_none, **kwargs)
|
|
151
|
+
d = self.model_dump(*args, exclude_none=exclude_none, **kwargs)
|
|
152
|
+
return json.dumps(d)
|
|
153
|
+
|
|
154
|
+
# @functools.wraps(BaseModel.model_validate)
|
|
155
|
+
def model_validate(self, *args: Any, **kwargs: Any) -> Any:
|
|
156
|
+
return self._model.model_validate(*args, **kwargs)
|
|
157
|
+
|
|
158
|
+
@functools.wraps(BaseModel.model_validate_json)
|
|
159
|
+
def model_validate_json(self, *args: Any, **kwargs: Any) -> Any:
|
|
160
|
+
return self._model.model_validate_json(*args, **kwargs)
|
|
161
|
+
|
|
162
|
+
@functools.wraps(BaseModel.model_validate_strings)
|
|
163
|
+
def model_validate_strings(self, *args: Any, **kwargs: Any) -> Any:
|
|
164
|
+
return self._model.model_validate_strings(*args, **kwargs)
|
|
165
|
+
|
|
166
|
+
def __eq__(self, value: Any) -> bool:
|
|
167
|
+
return hasattr(value, "_model") and self._model == value._model
|
|
168
|
+
|
|
169
|
+
def _getattr(self, o: object, name: str) -> Any:
|
|
170
|
+
val = getattr(o, name)
|
|
171
|
+
return val
|
|
172
|
+
|
|
173
|
+
def get(self, key: str, default: Optional[Any] = None) -> Any:
|
|
174
|
+
val = getattr(self._model, key, default)
|
|
175
|
+
return val
|
|
176
|
+
|
|
177
|
+
def __getitem__(self, key: str) -> Any:
|
|
178
|
+
try:
|
|
179
|
+
return self._getattr(self._model, key)
|
|
180
|
+
except AttributeError:
|
|
181
|
+
raise KeyError(f"Key '{key}' not found in {self.__class__.__name__}")
|
|
182
|
+
|
|
183
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
184
|
+
try:
|
|
185
|
+
setattr(self._model, key, value)
|
|
186
|
+
except ValueError:
|
|
187
|
+
raise ValueError(f"'{self.__class__.__name__}' object has no field '{key}'")
|
|
188
|
+
|
|
189
|
+
def __getattr__(self, name: Any) -> Any:
|
|
190
|
+
try:
|
|
191
|
+
return self._getattr(self._model, name)
|
|
192
|
+
except AttributeError:
|
|
193
|
+
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
|
|
194
|
+
|
|
195
|
+
def __setattr__(self, name: str, value: Any) -> None:
|
|
196
|
+
if name == "_model":
|
|
197
|
+
object.__setattr__(self, name, value)
|
|
198
|
+
else:
|
|
199
|
+
setattr(self._model, name, value)
|
|
200
|
+
|
|
201
|
+
def __contains__(self, key: str) -> bool:
|
|
202
|
+
return hasattr(self._model, key)
|
|
203
|
+
|
|
204
|
+
def __repr__(self) -> str:
|
|
205
|
+
d = self.model_dump()
|
|
206
|
+
r = [f"{k}={repr(v)}" for k, v in d.items()]
|
|
207
|
+
|
|
208
|
+
s = f"LLMConfig({', '.join(r)})"
|
|
209
|
+
# Replace any keys ending with 'key' or 'token' values with stars for security
|
|
210
|
+
s = re.sub(
|
|
211
|
+
r"(['\"])(\w*(key|token))\1:\s*(['\"])([^'\"]*)(?:\4)", r"\1\2\1: \4**********\4", s, flags=re.IGNORECASE
|
|
212
|
+
)
|
|
213
|
+
return s
|
|
214
|
+
|
|
215
|
+
def __copy__(self) -> "LLMConfig":
|
|
216
|
+
return LLMConfig(**self.model_dump())
|
|
217
|
+
|
|
218
|
+
def __deepcopy__(self, memo: Optional[dict[int, Any]] = None) -> "LLMConfig":
|
|
219
|
+
return self.__copy__()
|
|
220
|
+
|
|
221
|
+
def copy(self) -> "LLMConfig":
|
|
222
|
+
return self.__copy__()
|
|
223
|
+
|
|
224
|
+
def deepcopy(self, memo: Optional[dict[int, Any]] = None) -> "LLMConfig":
|
|
225
|
+
return self.__deepcopy__(memo)
|
|
226
|
+
|
|
227
|
+
def __str__(self) -> str:
|
|
228
|
+
return repr(self)
|
|
229
|
+
|
|
230
|
+
def items(self) -> Iterable[tuple[str, Any]]:
|
|
231
|
+
d = self.model_dump()
|
|
232
|
+
return d.items()
|
|
233
|
+
|
|
234
|
+
def keys(self) -> Iterable[str]:
|
|
235
|
+
d = self.model_dump()
|
|
236
|
+
return d.keys()
|
|
237
|
+
|
|
238
|
+
def values(self) -> Iterable[Any]:
|
|
239
|
+
d = self.model_dump()
|
|
240
|
+
return d.values()
|
|
241
|
+
|
|
242
|
+
_base_model_classes: dict[tuple[Type["LLMConfigEntry"], ...], Type[BaseModel]] = {}
|
|
243
|
+
|
|
244
|
+
@classmethod
|
|
245
|
+
def _get_base_model_class(cls) -> Type["BaseModel"]:
|
|
246
|
+
def _get_cls(llm_config_classes: tuple[Type[LLMConfigEntry], ...]) -> Type[BaseModel]:
|
|
247
|
+
if llm_config_classes in LLMConfig._base_model_classes:
|
|
248
|
+
return LLMConfig._base_model_classes[llm_config_classes]
|
|
249
|
+
|
|
250
|
+
class _LLMConfig(BaseModel):
|
|
251
|
+
temperature: Optional[float] = None
|
|
252
|
+
check_every_ms: Optional[int] = None
|
|
253
|
+
max_new_tokens: Optional[int] = None
|
|
254
|
+
seed: Optional[int] = None
|
|
255
|
+
allow_format_str_template: Optional[bool] = None
|
|
256
|
+
response_format: Optional[Union[str, dict[str, Any], BaseModel, Type[BaseModel]]] = None
|
|
257
|
+
timeout: Optional[int] = None
|
|
258
|
+
cache_seed: Optional[int] = None
|
|
259
|
+
|
|
260
|
+
tools: list[Any] = Field(default_factory=list)
|
|
261
|
+
functions: list[Any] = Field(default_factory=list)
|
|
262
|
+
parallel_tool_calls: Optional[bool] = None
|
|
263
|
+
|
|
264
|
+
config_list: Annotated[ # type: ignore[valid-type]
|
|
265
|
+
list[Annotated[Union[llm_config_classes], Field(discriminator="api_type")]],
|
|
266
|
+
Field(default_factory=list, min_length=1),
|
|
267
|
+
]
|
|
268
|
+
|
|
269
|
+
# Following field is configuration for pydantic to disallow extra fields
|
|
270
|
+
model_config = ConfigDict(extra="forbid")
|
|
271
|
+
|
|
272
|
+
LLMConfig._base_model_classes[llm_config_classes] = _LLMConfig
|
|
273
|
+
|
|
274
|
+
return _LLMConfig
|
|
275
|
+
|
|
276
|
+
return _get_cls(tuple(_llm_config_classes))
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class LLMConfigEntry(BaseModel, ABC):
|
|
280
|
+
api_type: str
|
|
281
|
+
model: str = Field(..., min_length=1)
|
|
282
|
+
api_key: Optional[SecretStr] = None
|
|
283
|
+
api_version: Optional[str] = None
|
|
284
|
+
max_tokens: Optional[int] = None
|
|
285
|
+
base_url: Optional[HttpUrl] = None
|
|
286
|
+
voice: Optional[str] = None
|
|
287
|
+
model_client_cls: Optional[str] = None
|
|
288
|
+
http_client: Optional[httpxClient] = None
|
|
289
|
+
response_format: Optional[Union[str, dict[str, Any], BaseModel, Type[BaseModel]]] = None
|
|
290
|
+
default_headers: Optional[Mapping[str, Any]] = None
|
|
291
|
+
tags: list[str] = Field(default_factory=list)
|
|
292
|
+
|
|
293
|
+
# Following field is configuration for pydantic to disallow extra fields
|
|
294
|
+
model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True)
|
|
295
|
+
|
|
296
|
+
@abstractmethod
|
|
297
|
+
def create_client(self) -> "ModelClient": ...
|
|
298
|
+
|
|
299
|
+
@field_validator("base_url", mode="before")
|
|
300
|
+
@classmethod
|
|
301
|
+
def check_base_url(cls, v: Any, info: ValidationInfo) -> Any:
|
|
302
|
+
if not str(v).startswith("https://") and not str(v).startswith("http://"):
|
|
303
|
+
v = f"http://{str(v)}"
|
|
304
|
+
return v
|
|
305
|
+
|
|
306
|
+
@field_serializer("base_url")
|
|
307
|
+
def serialize_base_url(self, v: Any) -> Any:
|
|
308
|
+
return str(v)
|
|
309
|
+
|
|
310
|
+
@field_serializer("api_key", when_used="unless-none")
|
|
311
|
+
def serialize_api_key(self, v: SecretStr) -> Any:
|
|
312
|
+
return v.get_secret_value()
|
|
313
|
+
|
|
314
|
+
def model_dump(self, *args: Any, exclude_none: bool = True, **kwargs: Any) -> dict[str, Any]:
|
|
315
|
+
return BaseModel.model_dump(self, exclude_none=exclude_none, *args, **kwargs)
|
|
316
|
+
|
|
317
|
+
def model_dump_json(self, *args: Any, exclude_none: bool = True, **kwargs: Any) -> str:
|
|
318
|
+
return BaseModel.model_dump_json(self, exclude_none=exclude_none, *args, **kwargs)
|
|
319
|
+
|
|
320
|
+
def get(self, key: str, default: Optional[Any] = None) -> Any:
|
|
321
|
+
val = getattr(self, key, default)
|
|
322
|
+
if isinstance(val, SecretStr):
|
|
323
|
+
return val.get_secret_value()
|
|
324
|
+
return val
|
|
325
|
+
|
|
326
|
+
def __getitem__(self, key: str) -> Any:
|
|
327
|
+
try:
|
|
328
|
+
val = getattr(self, key)
|
|
329
|
+
if isinstance(val, SecretStr):
|
|
330
|
+
return val.get_secret_value()
|
|
331
|
+
return val
|
|
332
|
+
except AttributeError:
|
|
333
|
+
raise KeyError(f"Key '{key}' not found in {self.__class__.__name__}")
|
|
334
|
+
|
|
335
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
336
|
+
setattr(self, key, value)
|
|
337
|
+
|
|
338
|
+
def __contains__(self, key: str) -> bool:
|
|
339
|
+
return hasattr(self, key)
|
|
340
|
+
|
|
341
|
+
def items(self) -> Iterable[tuple[str, Any]]:
|
|
342
|
+
d = self.model_dump()
|
|
343
|
+
return d.items()
|
|
344
|
+
|
|
345
|
+
def keys(self) -> Iterable[str]:
|
|
346
|
+
d = self.model_dump()
|
|
347
|
+
return d.keys()
|
|
348
|
+
|
|
349
|
+
def values(self) -> Iterable[Any]:
|
|
350
|
+
d = self.model_dump()
|
|
351
|
+
return d.values()
|
|
352
|
+
|
|
353
|
+
def __repr__(self) -> str:
|
|
354
|
+
# Override to eliminate none values from the repr
|
|
355
|
+
d = self.model_dump()
|
|
356
|
+
r = [f"{k}={repr(v)}" for k, v in d.items()]
|
|
357
|
+
|
|
358
|
+
s = f"{self.__class__.__name__}({', '.join(r)})"
|
|
359
|
+
|
|
360
|
+
# Replace any keys ending with '_key' or '_token' values with stars for security
|
|
361
|
+
# This regex will match any key ending with '_key' or '_token' and its value, and replace the value with stars
|
|
362
|
+
# It also captures the type of quote used (single or double) and reuses it in the replacement
|
|
363
|
+
s = re.sub(r'(\w+_(key|token)\s*=\s*)([\'"]).*?\3', r"\1\3**********\3", s, flags=re.IGNORECASE)
|
|
364
|
+
|
|
365
|
+
return s
|
|
366
|
+
|
|
367
|
+
def __str__(self) -> str:
|
|
368
|
+
return repr(self)
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
_llm_config_classes: list[Type[LLMConfigEntry]] = []
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def register_llm_config(cls: Type[LLMConfigEntry]) -> Type[LLMConfigEntry]:
|
|
375
|
+
if isinstance(cls, type) and issubclass(cls, LLMConfigEntry):
|
|
376
|
+
_llm_config_classes.append(cls)
|
|
377
|
+
else:
|
|
378
|
+
raise TypeError(f"Expected a subclass of LLMConfigEntry, got {cls}")
|
|
379
|
+
return cls
|
|
@@ -0,0 +1,11 @@
|
|
|
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 .file_logger import FileLogger
|
|
8
|
+
from .logger_factory import LoggerFactory
|
|
9
|
+
from .sqlite_logger import SqliteLogger
|
|
10
|
+
|
|
11
|
+
__all__ = ("FileLogger", "LoggerFactory", "SqliteLogger")
|
|
@@ -0,0 +1,128 @@
|
|
|
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 sqlite3
|
|
10
|
+
import uuid
|
|
11
|
+
from abc import ABC, abstractmethod
|
|
12
|
+
from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from openai import AzureOpenAI, OpenAI
|
|
16
|
+
from openai.types.chat import ChatCompletion
|
|
17
|
+
|
|
18
|
+
from .. import Agent, ConversableAgent, OpenAIWrapper
|
|
19
|
+
|
|
20
|
+
F = TypeVar("F", bound=Callable[..., Any])
|
|
21
|
+
ConfigItem = dict[str, Union[str, list[str]]]
|
|
22
|
+
LLMConfig = dict[str, Union[None, float, int, ConfigItem, list[ConfigItem]]]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class BaseLogger(ABC):
|
|
26
|
+
@abstractmethod
|
|
27
|
+
def start(self) -> str:
|
|
28
|
+
"""Open a connection to the logging database, and start recording.
|
|
29
|
+
|
|
30
|
+
Returns:
|
|
31
|
+
session_id (str): a unique id for the logging session
|
|
32
|
+
"""
|
|
33
|
+
...
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def log_chat_completion(
|
|
37
|
+
self,
|
|
38
|
+
invocation_id: uuid.UUID,
|
|
39
|
+
client_id: int,
|
|
40
|
+
wrapper_id: int,
|
|
41
|
+
source: str | Agent,
|
|
42
|
+
request: dict[str, float | str | list[dict[str, str]]],
|
|
43
|
+
response: str | ChatCompletion,
|
|
44
|
+
is_cached: int,
|
|
45
|
+
cost: float,
|
|
46
|
+
start_time: str,
|
|
47
|
+
) -> None:
|
|
48
|
+
"""Log a chat completion to database.
|
|
49
|
+
|
|
50
|
+
In AG2, chat completions are somewhat complicated because they are handled by the `autogen.oai.OpenAIWrapper` class.
|
|
51
|
+
One invocation to `create` can lead to multiple underlying OpenAI calls, depending on the llm_config list used, and
|
|
52
|
+
any errors or retries.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
invocation_id (uuid): A unique identifier for the invocation to the OpenAIWrapper.create method call
|
|
56
|
+
client_id (int): A unique identifier for the underlying OpenAI client instance
|
|
57
|
+
wrapper_id (int): A unique identifier for the OpenAIWrapper instance
|
|
58
|
+
source (str or Agent): The source/creator of the event as a string name or an Agent instance
|
|
59
|
+
request (dict): A dictionary representing the request or call to the OpenAI client endpoint
|
|
60
|
+
response (str or ChatCompletion): The response from OpenAI
|
|
61
|
+
is_cached (int): 1 if the response was a cache hit, 0 otherwise
|
|
62
|
+
cost(float): The cost for OpenAI response
|
|
63
|
+
start_time (str): A string representing the moment the request was initiated
|
|
64
|
+
"""
|
|
65
|
+
...
|
|
66
|
+
|
|
67
|
+
@abstractmethod
|
|
68
|
+
def log_new_agent(self, agent: ConversableAgent, init_args: dict[str, Any]) -> None:
|
|
69
|
+
"""Log the birth of a new agent.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
agent (ConversableAgent): The agent to log.
|
|
73
|
+
init_args (dict): The arguments passed to the construct the conversable agent
|
|
74
|
+
"""
|
|
75
|
+
...
|
|
76
|
+
|
|
77
|
+
@abstractmethod
|
|
78
|
+
def log_event(self, source: str | Agent, name: str, **kwargs: dict[str, Any]) -> None:
|
|
79
|
+
"""Log an event for an agent.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
source (str or Agent): The source/creator of the event as a string name or an Agent instance
|
|
83
|
+
name (str): The name of the event
|
|
84
|
+
kwargs (dict): The event information to log
|
|
85
|
+
"""
|
|
86
|
+
...
|
|
87
|
+
|
|
88
|
+
@abstractmethod
|
|
89
|
+
def log_new_wrapper(self, wrapper: OpenAIWrapper, init_args: dict[str, LLMConfig | list[LLMConfig]]) -> None:
|
|
90
|
+
"""Log the birth of a new OpenAIWrapper.
|
|
91
|
+
|
|
92
|
+
Args:
|
|
93
|
+
wrapper (OpenAIWrapper): The wrapper to log.
|
|
94
|
+
init_args (dict): The arguments passed to the construct the wrapper
|
|
95
|
+
"""
|
|
96
|
+
...
|
|
97
|
+
|
|
98
|
+
@abstractmethod
|
|
99
|
+
def log_new_client(self, client: AzureOpenAI | OpenAI, wrapper: OpenAIWrapper, init_args: dict[str, Any]) -> None:
|
|
100
|
+
"""Log the birth of a new OpenAIWrapper.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
client: The client to log.
|
|
104
|
+
wrapper: The wrapper that created the client.
|
|
105
|
+
init_args: The arguments passed to the construct the client.
|
|
106
|
+
"""
|
|
107
|
+
...
|
|
108
|
+
|
|
109
|
+
@abstractmethod
|
|
110
|
+
def log_function_use(self, source: str | Agent, function: F, args: dict[str, Any], returns: Any) -> None:
|
|
111
|
+
"""Log the use of a registered function (could be a tool)
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
source (str or Agent): The source/creator of the event as a string name or an Agent instance
|
|
115
|
+
function (F): The function information
|
|
116
|
+
args (dict): The function args to log
|
|
117
|
+
returns (any): The return
|
|
118
|
+
"""
|
|
119
|
+
|
|
120
|
+
@abstractmethod
|
|
121
|
+
def stop(self) -> None:
|
|
122
|
+
"""Close the connection to the logging database, and stop logging."""
|
|
123
|
+
...
|
|
124
|
+
|
|
125
|
+
@abstractmethod
|
|
126
|
+
def get_connection(self) -> None | sqlite3.Connection:
|
|
127
|
+
"""Return a connection to the logging database."""
|
|
128
|
+
...
|