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
|
@@ -0,0 +1,75 @@
|
|
|
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 sys
|
|
8
|
+
from types import TracebackType
|
|
9
|
+
from typing import Any, Optional, Protocol
|
|
10
|
+
|
|
11
|
+
from ..doc_utils import export_module
|
|
12
|
+
|
|
13
|
+
if sys.version_info >= (3, 11):
|
|
14
|
+
from typing import Self
|
|
15
|
+
else:
|
|
16
|
+
from typing_extensions import Self
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@export_module("autogen.cache")
|
|
20
|
+
class AbstractCache(Protocol):
|
|
21
|
+
"""This protocol defines the basic interface for cache operations.
|
|
22
|
+
Implementing classes should provide concrete implementations for
|
|
23
|
+
these methods to handle caching mechanisms.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]:
|
|
27
|
+
"""Retrieve an item from the cache.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
key (str): The key identifying the item in the cache.
|
|
31
|
+
default (optional): The default value to return if the key is not found.
|
|
32
|
+
Defaults to None.
|
|
33
|
+
|
|
34
|
+
Returns:
|
|
35
|
+
The value associated with the key if found, else the default value.
|
|
36
|
+
"""
|
|
37
|
+
...
|
|
38
|
+
|
|
39
|
+
def set(self, key: str, value: Any) -> None:
|
|
40
|
+
"""Set an item in the cache.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
key (str): The key under which the item is to be stored.
|
|
44
|
+
value: The value to be stored in the cache.
|
|
45
|
+
"""
|
|
46
|
+
...
|
|
47
|
+
|
|
48
|
+
def close(self) -> None:
|
|
49
|
+
"""Close the cache. Perform any necessary cleanup, such as closing network connections or
|
|
50
|
+
releasing resources.
|
|
51
|
+
"""
|
|
52
|
+
...
|
|
53
|
+
|
|
54
|
+
def __enter__(self) -> Self:
|
|
55
|
+
"""Enter the runtime context related to this object.
|
|
56
|
+
|
|
57
|
+
The with statement will bind this method's return value to the target(s)
|
|
58
|
+
specified in the as clause of the statement, if any.
|
|
59
|
+
"""
|
|
60
|
+
...
|
|
61
|
+
|
|
62
|
+
def __exit__(
|
|
63
|
+
self,
|
|
64
|
+
exc_type: Optional[type[BaseException]],
|
|
65
|
+
exc_value: Optional[BaseException],
|
|
66
|
+
traceback: Optional[TracebackType],
|
|
67
|
+
) -> None:
|
|
68
|
+
"""Exit the runtime context and close the cache.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
exc_type: The exception type if an exception was raised in the context.
|
|
72
|
+
exc_value: The exception value if an exception was raised in the context.
|
|
73
|
+
traceback: The traceback if an exception was raised in the context.
|
|
74
|
+
"""
|
|
75
|
+
...
|
autogen/cache/cache.py
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
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
|
+
from contextvars import ContextVar
|
|
10
|
+
from types import TracebackType
|
|
11
|
+
from typing import Any, Optional, Union
|
|
12
|
+
|
|
13
|
+
from ..doc_utils import export_module
|
|
14
|
+
from .abstract_cache_base import AbstractCache
|
|
15
|
+
from .cache_factory import CacheFactory
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@export_module("autogen")
|
|
19
|
+
class Cache(AbstractCache):
|
|
20
|
+
"""A wrapper class for managing cache configuration and instances.
|
|
21
|
+
|
|
22
|
+
This class provides a unified interface for creating and interacting with
|
|
23
|
+
different types of cache (e.g., Redis, Disk). It abstracts the underlying
|
|
24
|
+
cache implementation details, providing methods for cache operations.
|
|
25
|
+
|
|
26
|
+
Attributes:
|
|
27
|
+
config (Dict[str, Any]): A dictionary containing cache configuration.
|
|
28
|
+
cache: The cache instance created based on the provided configuration.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
_current_cache: ContextVar[Cache] = ContextVar("current_cache", default=None)
|
|
32
|
+
|
|
33
|
+
ALLOWED_CONFIG_KEYS = [
|
|
34
|
+
"cache_seed",
|
|
35
|
+
"redis_url",
|
|
36
|
+
"cache_path_root",
|
|
37
|
+
"cosmos_db_config",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
@staticmethod
|
|
41
|
+
def redis(cache_seed: Union[str, int] = 42, redis_url: str = "redis://localhost:6379/0") -> Cache:
|
|
42
|
+
"""Create a Redis cache instance.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
cache_seed (Union[str, int], optional): A seed for the cache. Defaults to 42.
|
|
46
|
+
redis_url (str, optional): The URL for the Redis server. Defaults to "redis://localhost:6379/0".
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Cache: A Cache instance configured for Redis.
|
|
50
|
+
"""
|
|
51
|
+
return Cache({"cache_seed": cache_seed, "redis_url": redis_url})
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def disk(cache_seed: Union[str, int] = 42, cache_path_root: str = ".cache") -> Cache:
|
|
55
|
+
"""Create a Disk cache instance.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
cache_seed (Union[str, int], optional): A seed for the cache. Defaults to 42.
|
|
59
|
+
cache_path_root (str, optional): The root path for the disk cache. Defaults to ".cache".
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
Cache: A Cache instance configured for Disk caching.
|
|
63
|
+
"""
|
|
64
|
+
return Cache({"cache_seed": cache_seed, "cache_path_root": cache_path_root})
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
def cosmos_db(
|
|
68
|
+
connection_string: Optional[str] = None,
|
|
69
|
+
container_id: Optional[str] = None,
|
|
70
|
+
cache_seed: Union[str, int] = 42,
|
|
71
|
+
client: Optional[Any] = None,
|
|
72
|
+
) -> Cache:
|
|
73
|
+
"""Create a Cosmos DB cache instance with 'autogen_cache' as database ID.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
connection_string (str, optional): Connection string to the Cosmos DB account.
|
|
77
|
+
container_id (str, optional): The container ID for the Cosmos DB account.
|
|
78
|
+
cache_seed (Union[str, int], optional): A seed for the cache.
|
|
79
|
+
client: Optional[CosmosClient]: Pass an existing Cosmos DB client.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Cache: A Cache instance configured for Cosmos DB.
|
|
83
|
+
"""
|
|
84
|
+
cosmos_db_config = {
|
|
85
|
+
"connection_string": connection_string,
|
|
86
|
+
"database_id": "autogen_cache",
|
|
87
|
+
"container_id": container_id,
|
|
88
|
+
"client": client,
|
|
89
|
+
}
|
|
90
|
+
return Cache({"cache_seed": str(cache_seed), "cosmos_db_config": cosmos_db_config})
|
|
91
|
+
|
|
92
|
+
def __init__(self, config: dict[str, Any]):
|
|
93
|
+
"""Initialize the Cache with the given configuration.
|
|
94
|
+
|
|
95
|
+
Validates the configuration keys and creates the cache instance.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
config (Dict[str, Any]): A dictionary containing the cache configuration.
|
|
99
|
+
|
|
100
|
+
Raises:
|
|
101
|
+
ValueError: If an invalid configuration key is provided.
|
|
102
|
+
"""
|
|
103
|
+
self.config = config
|
|
104
|
+
# Ensure that the seed is always treated as a string before being passed to any cache factory or stored.
|
|
105
|
+
self.config["cache_seed"] = str(self.config.get("cache_seed", 42))
|
|
106
|
+
|
|
107
|
+
# validate config
|
|
108
|
+
for key in self.config:
|
|
109
|
+
if key not in self.ALLOWED_CONFIG_KEYS:
|
|
110
|
+
raise ValueError(f"Invalid config key: {key}")
|
|
111
|
+
# create cache instance
|
|
112
|
+
self.cache = CacheFactory.cache_factory(
|
|
113
|
+
seed=self.config["cache_seed"],
|
|
114
|
+
redis_url=self.config.get("redis_url"),
|
|
115
|
+
cache_path_root=self.config.get("cache_path_root"),
|
|
116
|
+
cosmosdb_config=self.config.get("cosmos_db_config"),
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def __enter__(self) -> Cache:
|
|
120
|
+
"""Enter the runtime context related to the cache object.
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
The cache instance for use within a context block.
|
|
124
|
+
"""
|
|
125
|
+
# Store the previous cache so we can restore it
|
|
126
|
+
self._previous_cache = self.__class__._current_cache.get(None)
|
|
127
|
+
# Set the current cache to this instance
|
|
128
|
+
self._token = self.__class__._current_cache.set(self)
|
|
129
|
+
# Call the underlying cache's __enter__ method
|
|
130
|
+
return self.cache.__enter__()
|
|
131
|
+
|
|
132
|
+
def __exit__(
|
|
133
|
+
self,
|
|
134
|
+
exc_type: Optional[type[BaseException]],
|
|
135
|
+
exc_value: Optional[BaseException],
|
|
136
|
+
traceback: Optional[TracebackType],
|
|
137
|
+
) -> None:
|
|
138
|
+
"""Exit the runtime context related to the cache object.
|
|
139
|
+
|
|
140
|
+
Cleans up the cache instance and handles any exceptions that occurred
|
|
141
|
+
within the context.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
exc_type: The exception type if an exception was raised in the context.
|
|
145
|
+
exc_value: The exception value if an exception was raised in the context.
|
|
146
|
+
traceback: The traceback if an exception was raised in the context.
|
|
147
|
+
"""
|
|
148
|
+
# First exit the underlying cache context
|
|
149
|
+
result = self.cache.__exit__(exc_type, exc_value, traceback)
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
# Then reset the context variable to previous value
|
|
153
|
+
self.__class__._current_cache.reset(self._token)
|
|
154
|
+
except RuntimeError:
|
|
155
|
+
# Token might have been reset by a nested context manager
|
|
156
|
+
# In this case, we just set it back to the previous value
|
|
157
|
+
if self._previous_cache is not None:
|
|
158
|
+
self.__class__._current_cache.set(self._previous_cache)
|
|
159
|
+
|
|
160
|
+
return result
|
|
161
|
+
|
|
162
|
+
def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]:
|
|
163
|
+
"""Retrieve an item from the cache.
|
|
164
|
+
|
|
165
|
+
Args:
|
|
166
|
+
key (str): The key identifying the item in the cache.
|
|
167
|
+
default (optional): The default value to return if the key is not found.
|
|
168
|
+
Defaults to None.
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
The value associated with the key if found, else the default value.
|
|
172
|
+
"""
|
|
173
|
+
return self.cache.get(key, default)
|
|
174
|
+
|
|
175
|
+
def set(self, key: str, value: Any) -> None:
|
|
176
|
+
"""Set an item in the cache.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
key (str): The key under which the item is to be stored.
|
|
180
|
+
value: The value to be stored in the cache.
|
|
181
|
+
"""
|
|
182
|
+
self.cache.set(key, value)
|
|
183
|
+
|
|
184
|
+
def close(self) -> None:
|
|
185
|
+
"""Close the cache.
|
|
186
|
+
|
|
187
|
+
Perform any necessary cleanup, such as closing connections or releasing resources.
|
|
188
|
+
"""
|
|
189
|
+
self.cache.close()
|
|
190
|
+
|
|
191
|
+
@classmethod
|
|
192
|
+
def get_current_cache(cls, cache: "Optional[Cache]" = None) -> "Optional[Cache]":
|
|
193
|
+
"""Get the current cache instance.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
Cache: The current cache instance.
|
|
197
|
+
"""
|
|
198
|
+
if cache is not None:
|
|
199
|
+
return cache
|
|
200
|
+
try:
|
|
201
|
+
return cls._current_cache.get()
|
|
202
|
+
except LookupError:
|
|
203
|
+
return None
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
#
|
|
5
|
+
# Portions derived from https://github.com/microsoft/autogen are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
import logging
|
|
8
|
+
import os
|
|
9
|
+
from typing import Any, Optional, Union
|
|
10
|
+
|
|
11
|
+
from ..import_utils import optional_import_block
|
|
12
|
+
from .abstract_cache_base import AbstractCache
|
|
13
|
+
from .disk_cache import DiskCache
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CacheFactory:
|
|
17
|
+
@staticmethod
|
|
18
|
+
def cache_factory(
|
|
19
|
+
seed: Union[str, int],
|
|
20
|
+
redis_url: Optional[str] = None,
|
|
21
|
+
cache_path_root: str = ".cache",
|
|
22
|
+
cosmosdb_config: Optional[dict[str, Any]] = None,
|
|
23
|
+
) -> AbstractCache:
|
|
24
|
+
"""Factory function for creating cache instances.
|
|
25
|
+
|
|
26
|
+
This function decides whether to create a RedisCache, DiskCache, or CosmosDBCache instance
|
|
27
|
+
based on the provided parameters. If RedisCache is available and a redis_url is provided,
|
|
28
|
+
a RedisCache instance is created. If connection_string, database_id, and container_id
|
|
29
|
+
are provided, a CosmosDBCache is created. Otherwise, a DiskCache instance is used.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
seed (Union[str, int]): Used as a seed or namespace for the cache.
|
|
33
|
+
redis_url (Optional[str]): URL for the Redis server.
|
|
34
|
+
cache_path_root (str): Root path for the disk cache.
|
|
35
|
+
cosmosdb_config (Optional[Dict[str, str]]): Dictionary containing 'connection_string',
|
|
36
|
+
'database_id', and 'container_id' for Cosmos DB cache.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
An instance of RedisCache, DiskCache, or CosmosDBCache.
|
|
40
|
+
|
|
41
|
+
Examples:
|
|
42
|
+
Creating a Redis cache
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
redis_cache = cache_factory("myseed", "redis://localhost:6379/0")
|
|
46
|
+
```
|
|
47
|
+
Creating a Disk cache
|
|
48
|
+
|
|
49
|
+
```python
|
|
50
|
+
disk_cache = cache_factory("myseed", None)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Creating a Cosmos DB cache:
|
|
54
|
+
```python
|
|
55
|
+
cosmos_cache = cache_factory(
|
|
56
|
+
"myseed",
|
|
57
|
+
cosmosdb_config={
|
|
58
|
+
"connection_string": "your_connection_string",
|
|
59
|
+
"database_id": "your_database_id",
|
|
60
|
+
"container_id": "your_container_id",
|
|
61
|
+
},
|
|
62
|
+
)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
"""
|
|
66
|
+
if redis_url:
|
|
67
|
+
with optional_import_block() as result:
|
|
68
|
+
from .redis_cache import RedisCache
|
|
69
|
+
|
|
70
|
+
if result.is_successful:
|
|
71
|
+
return RedisCache(seed, redis_url)
|
|
72
|
+
else:
|
|
73
|
+
logging.warning(
|
|
74
|
+
"RedisCache is not available. Checking other cache options. The last fallback is DiskCache."
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
if cosmosdb_config:
|
|
78
|
+
with optional_import_block() as result:
|
|
79
|
+
from .cosmos_db_cache import CosmosDBCache
|
|
80
|
+
|
|
81
|
+
if result.is_successful:
|
|
82
|
+
return CosmosDBCache.create_cache(seed, cosmosdb_config)
|
|
83
|
+
else:
|
|
84
|
+
logging.warning("CosmosDBCache is not available. Fallback to DiskCache.")
|
|
85
|
+
|
|
86
|
+
# Default to DiskCache if neither Redis nor Cosmos DB configurations are provided
|
|
87
|
+
path = os.path.join(cache_path_root, str(seed))
|
|
88
|
+
return DiskCache(os.path.join(".", path))
|
|
@@ -0,0 +1,144 @@
|
|
|
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
|
+
# Install Azure Cosmos DB SDK if not already
|
|
8
|
+
|
|
9
|
+
import pickle
|
|
10
|
+
from typing import Any, Optional, TypedDict, Union
|
|
11
|
+
|
|
12
|
+
from ..import_utils import optional_import_block, require_optional_import
|
|
13
|
+
from .abstract_cache_base import AbstractCache
|
|
14
|
+
|
|
15
|
+
with optional_import_block():
|
|
16
|
+
from azure.cosmos import CosmosClient, PartitionKey
|
|
17
|
+
from azure.cosmos.exceptions import CosmosResourceNotFoundError
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@require_optional_import("azure", "cosmosdb")
|
|
21
|
+
class CosmosDBConfig(TypedDict, total=False):
|
|
22
|
+
connection_string: str
|
|
23
|
+
database_id: str
|
|
24
|
+
container_id: str
|
|
25
|
+
cache_seed: Optional[Union[str, int]]
|
|
26
|
+
client: Optional["CosmosClient"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@require_optional_import("azure", "cosmosdb")
|
|
30
|
+
class CosmosDBCache(AbstractCache):
|
|
31
|
+
"""Synchronous implementation of AbstractCache using Azure Cosmos DB NoSQL API.
|
|
32
|
+
|
|
33
|
+
This class provides a concrete implementation of the AbstractCache
|
|
34
|
+
interface using Azure Cosmos DB for caching data, with synchronous operations.
|
|
35
|
+
|
|
36
|
+
Attributes:
|
|
37
|
+
seed (Union[str, int]): A seed or namespace used as a partition key.
|
|
38
|
+
client (CosmosClient): The Cosmos DB client used for caching.
|
|
39
|
+
container: The container instance used for caching.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self, seed: Union[str, int], cosmosdb_config: CosmosDBConfig):
|
|
43
|
+
"""Initialize the CosmosDBCache instance.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
seed: A seed or namespace for the cache, used as a partition key.
|
|
47
|
+
cosmosdb_config: The configuration for the Cosmos DB cache.
|
|
48
|
+
"""
|
|
49
|
+
self.seed = str(seed)
|
|
50
|
+
self.client = cosmosdb_config.get("client") or CosmosClient.from_connection_string(
|
|
51
|
+
cosmosdb_config["connection_string"]
|
|
52
|
+
)
|
|
53
|
+
database_id = cosmosdb_config.get("database_id", "autogen_cache")
|
|
54
|
+
self.database = self.client.get_database_client(database_id)
|
|
55
|
+
container_id = cosmosdb_config.get("container_id")
|
|
56
|
+
self.container = self.database.create_container_if_not_exists(
|
|
57
|
+
id=container_id, partition_key=PartitionKey(path="/partitionKey")
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def create_cache(cls, seed: Union[str, int], cosmosdb_config: CosmosDBConfig):
|
|
62
|
+
"""Factory method to create a CosmosDBCache instance based on the provided configuration.
|
|
63
|
+
This method decides whether to use an existing CosmosClient or create a new one.
|
|
64
|
+
"""
|
|
65
|
+
if "client" in cosmosdb_config and isinstance(cosmosdb_config["client"], CosmosClient):
|
|
66
|
+
return cls.from_existing_client(seed, **cosmosdb_config)
|
|
67
|
+
else:
|
|
68
|
+
return cls.from_config(seed, cosmosdb_config)
|
|
69
|
+
|
|
70
|
+
@classmethod
|
|
71
|
+
def from_config(cls, seed: Union[str, int], cosmosdb_config: CosmosDBConfig):
|
|
72
|
+
return cls(str(seed), cosmosdb_config)
|
|
73
|
+
|
|
74
|
+
@classmethod
|
|
75
|
+
def from_connection_string(cls, seed: Union[str, int], connection_string: str, database_id: str, container_id: str):
|
|
76
|
+
config = {"connection_string": connection_string, "database_id": database_id, "container_id": container_id}
|
|
77
|
+
return cls(str(seed), config)
|
|
78
|
+
|
|
79
|
+
@classmethod
|
|
80
|
+
def from_existing_client(cls, seed: Union[str, int], client: "CosmosClient", database_id: str, container_id: str):
|
|
81
|
+
config = {"client": client, "database_id": database_id, "container_id": container_id}
|
|
82
|
+
return cls(str(seed), config)
|
|
83
|
+
|
|
84
|
+
def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]:
|
|
85
|
+
"""Retrieve an item from the Cosmos DB cache.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
key (str): The key identifying the item in the cache.
|
|
89
|
+
default (optional): The default value to return if the key is not found.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
The deserialized value associated with the key if found, else the default value.
|
|
93
|
+
"""
|
|
94
|
+
try:
|
|
95
|
+
response = self.container.read_item(item=key, partition_key=str(self.seed))
|
|
96
|
+
return pickle.loads(response["data"])
|
|
97
|
+
except CosmosResourceNotFoundError:
|
|
98
|
+
return default
|
|
99
|
+
except Exception as e:
|
|
100
|
+
# Log the exception or rethrow after logging if needed
|
|
101
|
+
# Consider logging or handling the error appropriately here
|
|
102
|
+
raise e
|
|
103
|
+
|
|
104
|
+
def set(self, key: str, value: Any) -> None:
|
|
105
|
+
"""Set an item in the Cosmos DB cache.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
key (str): The key under which the item is to be stored.
|
|
109
|
+
value: The value to be stored in the cache.
|
|
110
|
+
|
|
111
|
+
Notes:
|
|
112
|
+
The value is serialized using pickle before being stored.
|
|
113
|
+
"""
|
|
114
|
+
try:
|
|
115
|
+
serialized_value = pickle.dumps(value)
|
|
116
|
+
item = {"id": key, "partitionKey": str(self.seed), "data": serialized_value}
|
|
117
|
+
self.container.upsert_item(item)
|
|
118
|
+
except Exception as e:
|
|
119
|
+
# Log or handle exception
|
|
120
|
+
raise e
|
|
121
|
+
|
|
122
|
+
def close(self) -> None:
|
|
123
|
+
"""Close the Cosmos DB client.
|
|
124
|
+
|
|
125
|
+
Perform any necessary cleanup, such as closing network connections.
|
|
126
|
+
"""
|
|
127
|
+
# CosmosClient doesn"t require explicit close in the current SDK
|
|
128
|
+
# If you created the client inside this class, you should close it if necessary
|
|
129
|
+
pass
|
|
130
|
+
|
|
131
|
+
def __enter__(self):
|
|
132
|
+
"""Context management entry.
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
self: The instance itself.
|
|
136
|
+
"""
|
|
137
|
+
return self
|
|
138
|
+
|
|
139
|
+
def __exit__(self, exc_type: Optional[type], exc_value: Optional[Exception], traceback: Optional[Any]) -> None:
|
|
140
|
+
"""Context management exit.
|
|
141
|
+
|
|
142
|
+
Perform cleanup actions such as closing the Cosmos DB client.
|
|
143
|
+
"""
|
|
144
|
+
self.close()
|
|
@@ -0,0 +1,102 @@
|
|
|
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 sys
|
|
8
|
+
from types import TracebackType
|
|
9
|
+
from typing import Any, Optional, Union
|
|
10
|
+
|
|
11
|
+
import diskcache
|
|
12
|
+
|
|
13
|
+
from .abstract_cache_base import AbstractCache
|
|
14
|
+
|
|
15
|
+
if sys.version_info >= (3, 11):
|
|
16
|
+
from typing import Self
|
|
17
|
+
else:
|
|
18
|
+
from typing_extensions import Self
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class DiskCache(AbstractCache):
|
|
22
|
+
"""Implementation of AbstractCache using the DiskCache library.
|
|
23
|
+
|
|
24
|
+
This class provides a concrete implementation of the AbstractCache
|
|
25
|
+
interface using the diskcache library for caching data on disk.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
cache (diskcache.Cache): The DiskCache instance used for caching.
|
|
29
|
+
|
|
30
|
+
Methods:
|
|
31
|
+
__init__(self, seed): Initializes the DiskCache with the given seed.
|
|
32
|
+
get(self, key, default=None): Retrieves an item from the cache.
|
|
33
|
+
set(self, key, value): Sets an item in the cache.
|
|
34
|
+
close(self): Closes the cache.
|
|
35
|
+
__enter__(self): Context management entry.
|
|
36
|
+
__exit__(self, exc_type, exc_value, traceback): Context management exit.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, seed: Union[str, int]):
|
|
40
|
+
"""Initialize the DiskCache instance.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
seed (Union[str, int]): A seed or namespace for the cache. This is used to create
|
|
44
|
+
a unique storage location for the cache data.
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
self.cache = diskcache.Cache(seed)
|
|
48
|
+
|
|
49
|
+
def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]:
|
|
50
|
+
"""Retrieve an item from the cache.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
key (str): The key identifying the item in the cache.
|
|
54
|
+
default (optional): The default value to return if the key is not found.
|
|
55
|
+
Defaults to None.
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
The value associated with the key if found, else the default value.
|
|
59
|
+
"""
|
|
60
|
+
return self.cache.get(key, default)
|
|
61
|
+
|
|
62
|
+
def set(self, key: str, value: Any) -> None:
|
|
63
|
+
"""Set an item in the cache.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
key (str): The key under which the item is to be stored.
|
|
67
|
+
value: The value to be stored in the cache.
|
|
68
|
+
"""
|
|
69
|
+
self.cache.set(key, value)
|
|
70
|
+
|
|
71
|
+
def close(self) -> None:
|
|
72
|
+
"""Close the cache.
|
|
73
|
+
|
|
74
|
+
Perform any necessary cleanup, such as closing file handles or
|
|
75
|
+
releasing resources.
|
|
76
|
+
"""
|
|
77
|
+
self.cache.close()
|
|
78
|
+
|
|
79
|
+
def __enter__(self) -> Self:
|
|
80
|
+
"""Enter the runtime context related to the object.
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
self: The instance itself.
|
|
84
|
+
"""
|
|
85
|
+
return self
|
|
86
|
+
|
|
87
|
+
def __exit__(
|
|
88
|
+
self,
|
|
89
|
+
exc_type: Optional[type[BaseException]],
|
|
90
|
+
exc_value: Optional[BaseException],
|
|
91
|
+
traceback: Optional[TracebackType],
|
|
92
|
+
) -> None:
|
|
93
|
+
"""Exit the runtime context related to the object.
|
|
94
|
+
|
|
95
|
+
Perform cleanup actions such as closing the cache.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
exc_type: The exception type if an exception was raised in the context.
|
|
99
|
+
exc_value: The exception value if an exception was raised in the context.
|
|
100
|
+
traceback: The traceback if an exception was raised in the context.
|
|
101
|
+
"""
|
|
102
|
+
self.close()
|
|
@@ -0,0 +1,58 @@
|
|
|
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 sys
|
|
8
|
+
from types import TracebackType
|
|
9
|
+
from typing import Any, Optional, Union
|
|
10
|
+
|
|
11
|
+
from .abstract_cache_base import AbstractCache
|
|
12
|
+
|
|
13
|
+
if sys.version_info >= (3, 11):
|
|
14
|
+
from typing import Self
|
|
15
|
+
else:
|
|
16
|
+
from typing_extensions import Self
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class InMemoryCache(AbstractCache):
|
|
20
|
+
def __init__(self, seed: Union[str, int] = ""):
|
|
21
|
+
self._seed = str(seed)
|
|
22
|
+
self._cache: dict[str, Any] = {}
|
|
23
|
+
|
|
24
|
+
def _prefixed_key(self, key: str) -> str:
|
|
25
|
+
separator = "_" if self._seed else ""
|
|
26
|
+
return f"{self._seed}{separator}{key}"
|
|
27
|
+
|
|
28
|
+
def get(self, key: str, default: Optional[Any] = None) -> Optional[Any]:
|
|
29
|
+
result = self._cache.get(self._prefixed_key(key))
|
|
30
|
+
if result is None:
|
|
31
|
+
return default
|
|
32
|
+
return result
|
|
33
|
+
|
|
34
|
+
def set(self, key: str, value: Any) -> None:
|
|
35
|
+
self._cache[self._prefixed_key(key)] = value
|
|
36
|
+
|
|
37
|
+
def close(self) -> None:
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
def __enter__(self) -> Self:
|
|
41
|
+
"""Enter the runtime context related to the object.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
self: The instance itself.
|
|
45
|
+
"""
|
|
46
|
+
return self
|
|
47
|
+
|
|
48
|
+
def __exit__(
|
|
49
|
+
self, exc_type: Optional[type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType]
|
|
50
|
+
) -> None:
|
|
51
|
+
"""Exit the runtime context related to the object.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
exc_type: The exception type if an exception was raised in the context.
|
|
55
|
+
exc_val: The exception value if an exception was raised in the context.
|
|
56
|
+
exc_tb: The traceback if an exception was raised in the context.
|
|
57
|
+
"""
|
|
58
|
+
self.close()
|