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,99 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
from abc import ABC
|
|
7
|
+
from typing import Annotated, Any, Callable, Literal, Optional, Union
|
|
8
|
+
from uuid import UUID, uuid4
|
|
9
|
+
|
|
10
|
+
from pydantic import BaseModel, Field, create_model
|
|
11
|
+
|
|
12
|
+
from ..doc_utils import export_module
|
|
13
|
+
|
|
14
|
+
__all__ = ["BaseEvent", "get_annotated_type_for_event_classes", "get_event_classes", "wrap_event"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@export_module("autogen.events")
|
|
18
|
+
class BaseEvent(BaseModel, ABC):
|
|
19
|
+
uuid: UUID
|
|
20
|
+
|
|
21
|
+
def __init__(self, uuid: Optional[UUID] = None, **kwargs: Any) -> None:
|
|
22
|
+
uuid = uuid or uuid4()
|
|
23
|
+
super().__init__(uuid=uuid, **kwargs)
|
|
24
|
+
|
|
25
|
+
def print(self, f: Optional[Callable[..., Any]] = None) -> None:
|
|
26
|
+
"""Print event
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
f (Optional[Callable[..., Any]], optional): Print function. If none, python's default print will be used.
|
|
30
|
+
"""
|
|
31
|
+
...
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def camel2snake(name: str) -> str:
|
|
35
|
+
return "".join(["_" + i.lower() if i.isupper() else i for i in name]).lstrip("_")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
_event_classes: dict[str, type[BaseModel]] = {}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@export_module("autogen.events")
|
|
42
|
+
def wrap_event(event_cls: type[BaseEvent]) -> type[BaseModel]:
|
|
43
|
+
"""Wrap a event class with a type field to be used in a union type
|
|
44
|
+
|
|
45
|
+
This is needed for proper serialization and deserialization of events in a union type.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
event_cls (type[BaseEvent]): Event class to wrap
|
|
49
|
+
"""
|
|
50
|
+
global _event_classes
|
|
51
|
+
|
|
52
|
+
if not event_cls.__name__.endswith("Event"):
|
|
53
|
+
raise ValueError("Event class name must end with 'Event'")
|
|
54
|
+
|
|
55
|
+
type_name = camel2snake(event_cls.__name__)
|
|
56
|
+
type_name = type_name[: -len("_event")]
|
|
57
|
+
|
|
58
|
+
class WrapperBase(BaseModel):
|
|
59
|
+
# these types are generated dynamically so we need to disable the type checker
|
|
60
|
+
type: Literal[type_name] = type_name # type: ignore[valid-type]
|
|
61
|
+
content: event_cls # type: ignore[valid-type]
|
|
62
|
+
|
|
63
|
+
def __init__(self, *args: Any, **data: Any):
|
|
64
|
+
if set(data.keys()) == {"type", "content"} and "content" in data:
|
|
65
|
+
super().__init__(*args, **data)
|
|
66
|
+
else:
|
|
67
|
+
if "content" in data:
|
|
68
|
+
content = data.pop("content")
|
|
69
|
+
super().__init__(*args, content=event_cls(*args, **data, content=content), **data)
|
|
70
|
+
else:
|
|
71
|
+
super().__init__(content=event_cls(*args, **data), **data)
|
|
72
|
+
|
|
73
|
+
def print(self, f: Optional[Callable[..., Any]] = None) -> None:
|
|
74
|
+
self.content.print(f) # type: ignore[attr-defined]
|
|
75
|
+
|
|
76
|
+
wrapper_cls = create_model(event_cls.__name__, __base__=WrapperBase)
|
|
77
|
+
|
|
78
|
+
# Preserve the original class's docstring and other attributes
|
|
79
|
+
wrapper_cls.__doc__ = event_cls.__doc__
|
|
80
|
+
wrapper_cls.__module__ = event_cls.__module__
|
|
81
|
+
|
|
82
|
+
# Copy any other relevant attributes/metadata from the original class
|
|
83
|
+
if hasattr(event_cls, "__annotations__"):
|
|
84
|
+
wrapper_cls.__annotations__ = event_cls.__annotations__
|
|
85
|
+
|
|
86
|
+
_event_classes[type_name] = wrapper_cls
|
|
87
|
+
|
|
88
|
+
return wrapper_cls
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
@export_module("autogen.events")
|
|
92
|
+
def get_annotated_type_for_event_classes() -> type[Any]:
|
|
93
|
+
# this is a dynamic type so we need to disable the type checker
|
|
94
|
+
union_type = Union[tuple(_event_classes.values())] # type: ignore[valid-type]
|
|
95
|
+
return Annotated[union_type, Field(discriminator="type")] # type: ignore[return-value]
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def get_event_classes() -> dict[str, type[BaseModel]]:
|
|
99
|
+
return _event_classes
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
from typing import Any, Callable, Literal, Optional, Union
|
|
6
|
+
from uuid import UUID
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
from .base_event import BaseEvent, wrap_event
|
|
11
|
+
|
|
12
|
+
__all__ = ["UsageSummaryEvent"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ModelUsageSummary(BaseModel):
|
|
16
|
+
"""Model usage summary."""
|
|
17
|
+
|
|
18
|
+
model: str
|
|
19
|
+
"""Model name."""
|
|
20
|
+
completion_tokens: int
|
|
21
|
+
"""Number of tokens used for completion."""
|
|
22
|
+
cost: float
|
|
23
|
+
"""Cost of the completion."""
|
|
24
|
+
prompt_tokens: int
|
|
25
|
+
"""Number of tokens used for prompt."""
|
|
26
|
+
total_tokens: int
|
|
27
|
+
"""Total number of tokens used."""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ActualUsageSummary(BaseModel):
|
|
31
|
+
"""Actual usage summary."""
|
|
32
|
+
|
|
33
|
+
usages: Optional[list[ModelUsageSummary]] = None
|
|
34
|
+
"""List of model usage summaries."""
|
|
35
|
+
total_cost: Optional[float] = None
|
|
36
|
+
"""Total cost."""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class TotalUsageSummary(BaseModel):
|
|
40
|
+
"""Total usage summary."""
|
|
41
|
+
|
|
42
|
+
usages: Optional[list[ModelUsageSummary]] = None
|
|
43
|
+
"""List of model usage summaries."""
|
|
44
|
+
total_cost: Optional[float] = None
|
|
45
|
+
"""Total cost."""
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
Mode = Literal["both", "total", "actual"]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _change_usage_summary_format(
|
|
52
|
+
actual_usage_summary: Optional[dict[str, Any]] = None, total_usage_summary: Optional[dict[str, Any]] = None
|
|
53
|
+
) -> dict[str, dict[str, Any]]:
|
|
54
|
+
summary: dict[str, Any] = {}
|
|
55
|
+
|
|
56
|
+
for usage_type, usage_summary in {"actual": actual_usage_summary, "total": total_usage_summary}.items():
|
|
57
|
+
if usage_summary is None:
|
|
58
|
+
summary[usage_type] = {"usages": None, "total_cost": None}
|
|
59
|
+
continue
|
|
60
|
+
|
|
61
|
+
usage_summary_altered_format: dict[str, list[dict[str, Any]]] = {"usages": []}
|
|
62
|
+
for k, v in usage_summary.items():
|
|
63
|
+
if isinstance(k, str) and isinstance(v, dict):
|
|
64
|
+
current_usage = {key: value for key, value in v.items()}
|
|
65
|
+
current_usage["model"] = k
|
|
66
|
+
usage_summary_altered_format["usages"].append(current_usage)
|
|
67
|
+
else:
|
|
68
|
+
usage_summary_altered_format[k] = v
|
|
69
|
+
summary[usage_type] = usage_summary_altered_format
|
|
70
|
+
|
|
71
|
+
return summary
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@wrap_event
|
|
75
|
+
class UsageSummaryEvent(BaseEvent):
|
|
76
|
+
"""Usage summary message."""
|
|
77
|
+
|
|
78
|
+
actual: ActualUsageSummary
|
|
79
|
+
"""Actual usage summary."""
|
|
80
|
+
total: TotalUsageSummary
|
|
81
|
+
"""Total usage summary."""
|
|
82
|
+
mode: Mode
|
|
83
|
+
"""Mode to display the usage summary."""
|
|
84
|
+
|
|
85
|
+
def __init__(
|
|
86
|
+
self,
|
|
87
|
+
*,
|
|
88
|
+
uuid: Optional[UUID] = None,
|
|
89
|
+
actual_usage_summary: Optional[dict[str, Any]] = None,
|
|
90
|
+
total_usage_summary: Optional[dict[str, Any]] = None,
|
|
91
|
+
mode: Mode = "both",
|
|
92
|
+
):
|
|
93
|
+
# print(f"{actual_usage_summary=}")
|
|
94
|
+
# print(f"{total_usage_summary=}")
|
|
95
|
+
|
|
96
|
+
summary_dict = _change_usage_summary_format(actual_usage_summary, total_usage_summary)
|
|
97
|
+
|
|
98
|
+
super().__init__(uuid=uuid, **summary_dict, mode=mode)
|
|
99
|
+
|
|
100
|
+
def _print_usage(
|
|
101
|
+
self,
|
|
102
|
+
usage_summary: Union[ActualUsageSummary, TotalUsageSummary],
|
|
103
|
+
usage_type: str = "total",
|
|
104
|
+
f: Optional[Callable[..., Any]] = None,
|
|
105
|
+
) -> None:
|
|
106
|
+
f = f or print
|
|
107
|
+
word_from_type = "including" if usage_type == "total" else "excluding"
|
|
108
|
+
if usage_summary.usages is None or len(usage_summary.usages) == 0:
|
|
109
|
+
f("No actual cost incurred (all completions are using cache).", flush=True)
|
|
110
|
+
return
|
|
111
|
+
|
|
112
|
+
f(f"Usage summary {word_from_type} cached usage: ", flush=True)
|
|
113
|
+
f(f"Total cost: {round(usage_summary.total_cost, 5)}", flush=True) # type: ignore [arg-type]
|
|
114
|
+
|
|
115
|
+
for usage in usage_summary.usages:
|
|
116
|
+
f(
|
|
117
|
+
f"* Model '{usage.model}': cost: {round(usage.cost, 5)}, prompt_tokens: {usage.prompt_tokens}, completion_tokens: {usage.completion_tokens}, total_tokens: {usage.total_tokens}",
|
|
118
|
+
flush=True,
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
def print(self, f: Optional[Callable[..., Any]] = None) -> None:
|
|
122
|
+
f = f or print
|
|
123
|
+
|
|
124
|
+
if self.total.usages is None:
|
|
125
|
+
f('No usage summary. Please call "create" first.', flush=True)
|
|
126
|
+
return
|
|
127
|
+
|
|
128
|
+
f("-" * 100, flush=True)
|
|
129
|
+
if self.mode == "both":
|
|
130
|
+
self._print_usage(self.actual, "actual", f)
|
|
131
|
+
f()
|
|
132
|
+
if self.total.model_dump_json() != self.actual.model_dump_json():
|
|
133
|
+
self._print_usage(self.total, "total", f)
|
|
134
|
+
else:
|
|
135
|
+
f(
|
|
136
|
+
"All completions are non-cached: the total cost with cached completions is the same as actual cost.",
|
|
137
|
+
flush=True,
|
|
138
|
+
)
|
|
139
|
+
elif self.mode == "total":
|
|
140
|
+
self._print_usage(self.total, "total", f)
|
|
141
|
+
elif self.mode == "actual":
|
|
142
|
+
self._print_usage(self.actual, "actual", f)
|
|
143
|
+
else:
|
|
144
|
+
raise ValueError(f'Invalid mode: {self.mode}, choose from "actual", "total", ["actual", "total"]')
|
|
145
|
+
f("-" * 100, flush=True)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
@wrap_event
|
|
149
|
+
class StreamEvent(BaseEvent):
|
|
150
|
+
"""Stream event."""
|
|
151
|
+
|
|
152
|
+
content: str
|
|
153
|
+
"""Content of the event."""
|
|
154
|
+
|
|
155
|
+
def __init__(self, *, uuid: Optional[UUID] = None, content: str) -> None:
|
|
156
|
+
super().__init__(uuid=uuid, content=content)
|
|
157
|
+
|
|
158
|
+
def print(self, f: Optional[Callable[..., Any]] = None) -> None:
|
|
159
|
+
f = f or print
|
|
160
|
+
|
|
161
|
+
# Set the terminal text color to green
|
|
162
|
+
f("\033[32m", end="")
|
|
163
|
+
|
|
164
|
+
f(self.content, end="", flush=True)
|
|
165
|
+
|
|
166
|
+
# Reset the terminal text color
|
|
167
|
+
f("\033[0m\n")
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import logging
|
|
5
|
+
from functools import wraps
|
|
6
|
+
from typing import Callable
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def deprecated_by(
|
|
14
|
+
new_class: type[BaseModel],
|
|
15
|
+
param_mapping: dict[str, str] = None,
|
|
16
|
+
) -> Callable[[type[BaseModel]], Callable[..., BaseModel]]:
|
|
17
|
+
param_mapping = param_mapping or {}
|
|
18
|
+
|
|
19
|
+
def decorator(
|
|
20
|
+
old_class: type[BaseModel],
|
|
21
|
+
param_mapping: dict[str, str] = param_mapping,
|
|
22
|
+
) -> Callable[..., BaseModel]:
|
|
23
|
+
@wraps(old_class)
|
|
24
|
+
def wrapper(*args, **kwargs) -> BaseModel:
|
|
25
|
+
logger.warning(
|
|
26
|
+
f"{old_class.__name__} is deprecated by {new_class.__name__}. Please import it from {new_class.__module__} and use it instead."
|
|
27
|
+
)
|
|
28
|
+
# Translate old parameters to new parameters
|
|
29
|
+
new_kwargs = {param_mapping.get(k, k): v for k, v in kwargs.items()}
|
|
30
|
+
|
|
31
|
+
# Pass the translated parameters to the new class
|
|
32
|
+
return new_class(*args, **new_kwargs)
|
|
33
|
+
|
|
34
|
+
return wrapper
|
|
35
|
+
|
|
36
|
+
return decorator
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
|
|
2
|
+
#
|
|
3
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import json
|
|
7
|
+
from typing import Any, Callable, Optional
|
|
8
|
+
from uuid import UUID
|
|
9
|
+
|
|
10
|
+
from .base_event import BaseEvent, wrap_event
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@wrap_event
|
|
14
|
+
class PrintEvent(BaseEvent):
|
|
15
|
+
"""Print message"""
|
|
16
|
+
|
|
17
|
+
objects: list[str]
|
|
18
|
+
"""List of objects to print"""
|
|
19
|
+
sep: str
|
|
20
|
+
"""Separator between objects"""
|
|
21
|
+
end: str
|
|
22
|
+
"""End of the print"""
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self, *objects: Any, sep: str = " ", end: str = "\n", flush: bool = False, uuid: Optional[UUID] = None
|
|
26
|
+
):
|
|
27
|
+
objects_as_string = [self._to_json(x) for x in objects]
|
|
28
|
+
|
|
29
|
+
super().__init__(uuid=uuid, objects=objects_as_string, sep=sep, end=end)
|
|
30
|
+
|
|
31
|
+
def _to_json(self, obj: Any) -> str:
|
|
32
|
+
if isinstance(obj, str):
|
|
33
|
+
return obj
|
|
34
|
+
|
|
35
|
+
if hasattr(obj, "model_dump_json"):
|
|
36
|
+
return obj.model_dump_json() # type: ignore [no-any-return]
|
|
37
|
+
try:
|
|
38
|
+
return json.dumps(obj)
|
|
39
|
+
except Exception:
|
|
40
|
+
return str(obj)
|
|
41
|
+
# return repr(obj)
|
|
42
|
+
|
|
43
|
+
def print(self, f: Optional[Callable[..., Any]] = None) -> None:
|
|
44
|
+
f = f or print
|
|
45
|
+
|
|
46
|
+
f(*self.objects, sep=self.sep, end=self.end, flush=True)
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
|
8
|
+
|
|
9
|
+
from .doc_utils import export_module
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"AgentNameConflictError",
|
|
13
|
+
"InvalidCarryOverTypeError",
|
|
14
|
+
"ModelToolNotSupportedError",
|
|
15
|
+
"NoEligibleSpeakerError",
|
|
16
|
+
"SenderRequiredError",
|
|
17
|
+
"UndefinedNextAgentError",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@export_module("autogen")
|
|
22
|
+
class AgentNameConflictError(Exception): # noqa: N818
|
|
23
|
+
def __init__(self, msg: str = "Found multiple agents with the same name.", *args: Any, **kwargs: Any):
|
|
24
|
+
super().__init__(msg, *args, **kwargs)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@export_module("autogen")
|
|
28
|
+
class NoEligibleSpeakerError(Exception): # noqa: N818
|
|
29
|
+
"""Exception raised for early termination of a GroupChat."""
|
|
30
|
+
|
|
31
|
+
def __init__(self, message: str = "No eligible speakers."):
|
|
32
|
+
self.message = message
|
|
33
|
+
super().__init__(self.message)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@export_module("autogen")
|
|
37
|
+
class SenderRequiredError(Exception): # noqa: N818
|
|
38
|
+
"""Exception raised when the sender is required but not provided."""
|
|
39
|
+
|
|
40
|
+
def __init__(self, message: str = "Sender is required but not provided."):
|
|
41
|
+
self.message = message
|
|
42
|
+
super().__init__(self.message)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@export_module("autogen")
|
|
46
|
+
class InvalidCarryOverTypeError(Exception): # noqa: N818
|
|
47
|
+
"""Exception raised when the carryover type is invalid."""
|
|
48
|
+
|
|
49
|
+
def __init__(
|
|
50
|
+
self, message: str = "Carryover should be a string or a list of strings. Not adding carryover to the message."
|
|
51
|
+
):
|
|
52
|
+
self.message = message
|
|
53
|
+
super().__init__(self.message)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@export_module("autogen")
|
|
57
|
+
class UndefinedNextAgentError(Exception): # noqa: N818
|
|
58
|
+
"""Exception raised when the provided next agents list does not overlap with agents in the group."""
|
|
59
|
+
|
|
60
|
+
def __init__(self, message: str = "The provided agents list does not overlap with agents in the group."):
|
|
61
|
+
self.message = message
|
|
62
|
+
super().__init__(self.message)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class ModelToolNotSupportedError(Exception):
|
|
66
|
+
"""Exception raised when attempting to use tools with models that do not support them."""
|
|
67
|
+
|
|
68
|
+
def __init__(
|
|
69
|
+
self,
|
|
70
|
+
model: str,
|
|
71
|
+
):
|
|
72
|
+
self.message = f"Tools are not supported with {model} models. Refer to the documentation at https://platform.openai.com/docs/guides/reasoning#limitations"
|
|
73
|
+
super().__init__(self.message)
|
|
@@ -0,0 +1,16 @@
|
|
|
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
|
|
8
|
+
from .dependencies import Provider, dependency_provider
|
|
9
|
+
from .use import Depends, inject
|
|
10
|
+
|
|
11
|
+
__all__ = (
|
|
12
|
+
"Depends",
|
|
13
|
+
"Provider",
|
|
14
|
+
"dependency_provider",
|
|
15
|
+
"inject",
|
|
16
|
+
)
|
|
@@ -0,0 +1,80 @@
|
|
|
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
|
|
8
|
+
import sys
|
|
9
|
+
from importlib.metadata import version as get_version
|
|
10
|
+
from typing import Any, Dict, Optional, Tuple, Type
|
|
11
|
+
|
|
12
|
+
from pydantic import BaseModel, create_model
|
|
13
|
+
from pydantic.version import VERSION as PYDANTIC_VERSION
|
|
14
|
+
|
|
15
|
+
__all__ = (
|
|
16
|
+
"PYDANTIC_V2",
|
|
17
|
+
"BaseModel",
|
|
18
|
+
"ConfigDict",
|
|
19
|
+
"ExceptionGroup",
|
|
20
|
+
"create_model",
|
|
21
|
+
"evaluate_forwardref",
|
|
22
|
+
"get_config_base",
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
PYDANTIC_V2 = PYDANTIC_VERSION.startswith("2.")
|
|
27
|
+
|
|
28
|
+
default_pydantic_config = {"arbitrary_types_allowed": True}
|
|
29
|
+
|
|
30
|
+
evaluate_forwardref: Any
|
|
31
|
+
# isort: off
|
|
32
|
+
if PYDANTIC_V2:
|
|
33
|
+
from pydantic import ConfigDict
|
|
34
|
+
from pydantic._internal._typing_extra import ( # type: ignore[no-redef]
|
|
35
|
+
eval_type_lenient as evaluate_forwardref,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
def model_schema(model: Type[BaseModel]) -> Dict[str, Any]:
|
|
39
|
+
return model.model_json_schema()
|
|
40
|
+
|
|
41
|
+
def get_config_base(config_data: Optional[ConfigDict] = None) -> ConfigDict:
|
|
42
|
+
return config_data or ConfigDict(**default_pydantic_config) # type: ignore[typeddict-item]
|
|
43
|
+
|
|
44
|
+
def get_aliases(model: Type[BaseModel]) -> Tuple[str, ...]:
|
|
45
|
+
return tuple(f.alias or name for name, f in model.model_fields.items())
|
|
46
|
+
|
|
47
|
+
class CreateBaseModel(BaseModel):
|
|
48
|
+
"""Just to support FastStream < 0.3.7."""
|
|
49
|
+
|
|
50
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
51
|
+
|
|
52
|
+
else:
|
|
53
|
+
from pydantic.typing import evaluate_forwardref as evaluate_forwardref # type: ignore[no-redef]
|
|
54
|
+
from pydantic.config import get_config, ConfigDict, BaseConfig
|
|
55
|
+
|
|
56
|
+
def get_config_base(config_data: Optional[ConfigDict] = None) -> Type[BaseConfig]: # type: ignore[misc,no-any-unimported]
|
|
57
|
+
return get_config(config_data or ConfigDict(**default_pydantic_config)) # type: ignore[typeddict-item,no-any-unimported,no-any-return]
|
|
58
|
+
|
|
59
|
+
def model_schema(model: Type[BaseModel]) -> Dict[str, Any]:
|
|
60
|
+
return model.schema()
|
|
61
|
+
|
|
62
|
+
def get_aliases(model: Type[BaseModel]) -> Tuple[str, ...]:
|
|
63
|
+
return tuple(f.alias or name for name, f in model.__fields__.items()) # type: ignore[attr-defined]
|
|
64
|
+
|
|
65
|
+
class CreateBaseModel(BaseModel): # type: ignore[no-redef]
|
|
66
|
+
"""Just to support FastStream < 0.3.7."""
|
|
67
|
+
|
|
68
|
+
class Config:
|
|
69
|
+
arbitrary_types_allowed = True
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
ANYIO_V3 = get_version("anyio").startswith("3.")
|
|
73
|
+
|
|
74
|
+
if ANYIO_V3:
|
|
75
|
+
from anyio import ExceptionGroup as ExceptionGroup # type: ignore[attr-defined]
|
|
76
|
+
else:
|
|
77
|
+
if sys.version_info < (3, 11):
|
|
78
|
+
from exceptiongroup import ExceptionGroup as ExceptionGroup
|
|
79
|
+
else:
|
|
80
|
+
ExceptionGroup = ExceptionGroup
|
|
@@ -0,0 +1,14 @@
|
|
|
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/https://github.com/Lancetnik/FastDepends are under the MIT License.
|
|
6
|
+
# SPDX-License-Identifier: MIT
|
|
7
|
+
|
|
8
|
+
from .build import build_call_model
|
|
9
|
+
from .model import CallModel
|
|
10
|
+
|
|
11
|
+
__all__ = (
|
|
12
|
+
"CallModel",
|
|
13
|
+
"build_call_model",
|
|
14
|
+
)
|