ag2 0.10.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. ag2-0.10.2.dist-info/METADATA +819 -0
  2. ag2-0.10.2.dist-info/RECORD +423 -0
  3. ag2-0.10.2.dist-info/WHEEL +4 -0
  4. ag2-0.10.2.dist-info/licenses/LICENSE +201 -0
  5. ag2-0.10.2.dist-info/licenses/NOTICE.md +19 -0
  6. autogen/__init__.py +88 -0
  7. autogen/_website/__init__.py +3 -0
  8. autogen/_website/generate_api_references.py +426 -0
  9. autogen/_website/generate_mkdocs.py +1216 -0
  10. autogen/_website/notebook_processor.py +475 -0
  11. autogen/_website/process_notebooks.py +656 -0
  12. autogen/_website/utils.py +413 -0
  13. autogen/a2a/__init__.py +36 -0
  14. autogen/a2a/agent_executor.py +86 -0
  15. autogen/a2a/client.py +357 -0
  16. autogen/a2a/errors.py +18 -0
  17. autogen/a2a/httpx_client_factory.py +79 -0
  18. autogen/a2a/server.py +221 -0
  19. autogen/a2a/utils.py +207 -0
  20. autogen/agentchat/__init__.py +47 -0
  21. autogen/agentchat/agent.py +180 -0
  22. autogen/agentchat/assistant_agent.py +86 -0
  23. autogen/agentchat/chat.py +325 -0
  24. autogen/agentchat/contrib/__init__.py +5 -0
  25. autogen/agentchat/contrib/agent_eval/README.md +7 -0
  26. autogen/agentchat/contrib/agent_eval/agent_eval.py +108 -0
  27. autogen/agentchat/contrib/agent_eval/criterion.py +43 -0
  28. autogen/agentchat/contrib/agent_eval/critic_agent.py +44 -0
  29. autogen/agentchat/contrib/agent_eval/quantifier_agent.py +39 -0
  30. autogen/agentchat/contrib/agent_eval/subcritic_agent.py +45 -0
  31. autogen/agentchat/contrib/agent_eval/task.py +42 -0
  32. autogen/agentchat/contrib/agent_optimizer.py +432 -0
  33. autogen/agentchat/contrib/capabilities/__init__.py +5 -0
  34. autogen/agentchat/contrib/capabilities/agent_capability.py +20 -0
  35. autogen/agentchat/contrib/capabilities/generate_images.py +301 -0
  36. autogen/agentchat/contrib/capabilities/teachability.py +393 -0
  37. autogen/agentchat/contrib/capabilities/text_compressors.py +66 -0
  38. autogen/agentchat/contrib/capabilities/tools_capability.py +22 -0
  39. autogen/agentchat/contrib/capabilities/transform_messages.py +93 -0
  40. autogen/agentchat/contrib/capabilities/transforms.py +578 -0
  41. autogen/agentchat/contrib/capabilities/transforms_util.py +122 -0
  42. autogen/agentchat/contrib/capabilities/vision_capability.py +215 -0
  43. autogen/agentchat/contrib/captainagent/__init__.py +9 -0
  44. autogen/agentchat/contrib/captainagent/agent_builder.py +790 -0
  45. autogen/agentchat/contrib/captainagent/captainagent.py +514 -0
  46. autogen/agentchat/contrib/captainagent/tool_retriever.py +334 -0
  47. autogen/agentchat/contrib/captainagent/tools/README.md +44 -0
  48. autogen/agentchat/contrib/captainagent/tools/__init__.py +5 -0
  49. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_correlation.py +40 -0
  50. autogen/agentchat/contrib/captainagent/tools/data_analysis/calculate_skewness_and_kurtosis.py +28 -0
  51. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_iqr.py +28 -0
  52. autogen/agentchat/contrib/captainagent/tools/data_analysis/detect_outlier_zscore.py +28 -0
  53. autogen/agentchat/contrib/captainagent/tools/data_analysis/explore_csv.py +21 -0
  54. autogen/agentchat/contrib/captainagent/tools/data_analysis/shapiro_wilk_test.py +30 -0
  55. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_download.py +27 -0
  56. autogen/agentchat/contrib/captainagent/tools/information_retrieval/arxiv_search.py +53 -0
  57. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_image.py +53 -0
  58. autogen/agentchat/contrib/captainagent/tools/information_retrieval/extract_pdf_text.py +38 -0
  59. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_wikipedia_text.py +21 -0
  60. autogen/agentchat/contrib/captainagent/tools/information_retrieval/get_youtube_caption.py +34 -0
  61. autogen/agentchat/contrib/captainagent/tools/information_retrieval/image_qa.py +60 -0
  62. autogen/agentchat/contrib/captainagent/tools/information_retrieval/optical_character_recognition.py +61 -0
  63. autogen/agentchat/contrib/captainagent/tools/information_retrieval/perform_web_search.py +47 -0
  64. autogen/agentchat/contrib/captainagent/tools/information_retrieval/scrape_wikipedia_tables.py +33 -0
  65. autogen/agentchat/contrib/captainagent/tools/information_retrieval/transcribe_audio_file.py +21 -0
  66. autogen/agentchat/contrib/captainagent/tools/information_retrieval/youtube_download.py +35 -0
  67. autogen/agentchat/contrib/captainagent/tools/math/calculate_circle_area_from_diameter.py +21 -0
  68. autogen/agentchat/contrib/captainagent/tools/math/calculate_day_of_the_week.py +18 -0
  69. autogen/agentchat/contrib/captainagent/tools/math/calculate_fraction_sum.py +28 -0
  70. autogen/agentchat/contrib/captainagent/tools/math/calculate_matrix_power.py +31 -0
  71. autogen/agentchat/contrib/captainagent/tools/math/calculate_reflected_point.py +16 -0
  72. autogen/agentchat/contrib/captainagent/tools/math/complex_numbers_product.py +25 -0
  73. autogen/agentchat/contrib/captainagent/tools/math/compute_currency_conversion.py +23 -0
  74. autogen/agentchat/contrib/captainagent/tools/math/count_distinct_permutations.py +27 -0
  75. autogen/agentchat/contrib/captainagent/tools/math/evaluate_expression.py +28 -0
  76. autogen/agentchat/contrib/captainagent/tools/math/find_continuity_point.py +34 -0
  77. autogen/agentchat/contrib/captainagent/tools/math/fraction_to_mixed_numbers.py +39 -0
  78. autogen/agentchat/contrib/captainagent/tools/math/modular_inverse_sum.py +23 -0
  79. autogen/agentchat/contrib/captainagent/tools/math/simplify_mixed_numbers.py +36 -0
  80. autogen/agentchat/contrib/captainagent/tools/math/sum_of_digit_factorials.py +15 -0
  81. autogen/agentchat/contrib/captainagent/tools/math/sum_of_primes_below.py +15 -0
  82. autogen/agentchat/contrib/captainagent/tools/requirements.txt +10 -0
  83. autogen/agentchat/contrib/captainagent/tools/tool_description.tsv +34 -0
  84. autogen/agentchat/contrib/gpt_assistant_agent.py +526 -0
  85. autogen/agentchat/contrib/graph_rag/__init__.py +9 -0
  86. autogen/agentchat/contrib/graph_rag/document.py +29 -0
  87. autogen/agentchat/contrib/graph_rag/falkor_graph_query_engine.py +167 -0
  88. autogen/agentchat/contrib/graph_rag/falkor_graph_rag_capability.py +103 -0
  89. autogen/agentchat/contrib/graph_rag/graph_query_engine.py +53 -0
  90. autogen/agentchat/contrib/graph_rag/graph_rag_capability.py +63 -0
  91. autogen/agentchat/contrib/graph_rag/neo4j_graph_query_engine.py +263 -0
  92. autogen/agentchat/contrib/graph_rag/neo4j_graph_rag_capability.py +83 -0
  93. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_query_engine.py +210 -0
  94. autogen/agentchat/contrib/graph_rag/neo4j_native_graph_rag_capability.py +93 -0
  95. autogen/agentchat/contrib/img_utils.py +397 -0
  96. autogen/agentchat/contrib/llamaindex_conversable_agent.py +117 -0
  97. autogen/agentchat/contrib/llava_agent.py +189 -0
  98. autogen/agentchat/contrib/math_user_proxy_agent.py +464 -0
  99. autogen/agentchat/contrib/multimodal_conversable_agent.py +125 -0
  100. autogen/agentchat/contrib/qdrant_retrieve_user_proxy_agent.py +325 -0
  101. autogen/agentchat/contrib/rag/__init__.py +10 -0
  102. autogen/agentchat/contrib/rag/chromadb_query_engine.py +268 -0
  103. autogen/agentchat/contrib/rag/llamaindex_query_engine.py +195 -0
  104. autogen/agentchat/contrib/rag/mongodb_query_engine.py +319 -0
  105. autogen/agentchat/contrib/rag/query_engine.py +76 -0
  106. autogen/agentchat/contrib/retrieve_assistant_agent.py +59 -0
  107. autogen/agentchat/contrib/retrieve_user_proxy_agent.py +704 -0
  108. autogen/agentchat/contrib/society_of_mind_agent.py +200 -0
  109. autogen/agentchat/contrib/swarm_agent.py +1404 -0
  110. autogen/agentchat/contrib/text_analyzer_agent.py +79 -0
  111. autogen/agentchat/contrib/vectordb/__init__.py +5 -0
  112. autogen/agentchat/contrib/vectordb/base.py +224 -0
  113. autogen/agentchat/contrib/vectordb/chromadb.py +316 -0
  114. autogen/agentchat/contrib/vectordb/couchbase.py +405 -0
  115. autogen/agentchat/contrib/vectordb/mongodb.py +551 -0
  116. autogen/agentchat/contrib/vectordb/pgvectordb.py +927 -0
  117. autogen/agentchat/contrib/vectordb/qdrant.py +320 -0
  118. autogen/agentchat/contrib/vectordb/utils.py +126 -0
  119. autogen/agentchat/contrib/web_surfer.py +304 -0
  120. autogen/agentchat/conversable_agent.py +4307 -0
  121. autogen/agentchat/group/__init__.py +67 -0
  122. autogen/agentchat/group/available_condition.py +91 -0
  123. autogen/agentchat/group/context_condition.py +77 -0
  124. autogen/agentchat/group/context_expression.py +238 -0
  125. autogen/agentchat/group/context_str.py +39 -0
  126. autogen/agentchat/group/context_variables.py +182 -0
  127. autogen/agentchat/group/events/transition_events.py +111 -0
  128. autogen/agentchat/group/group_tool_executor.py +324 -0
  129. autogen/agentchat/group/group_utils.py +659 -0
  130. autogen/agentchat/group/guardrails.py +179 -0
  131. autogen/agentchat/group/handoffs.py +303 -0
  132. autogen/agentchat/group/llm_condition.py +93 -0
  133. autogen/agentchat/group/multi_agent_chat.py +291 -0
  134. autogen/agentchat/group/on_condition.py +55 -0
  135. autogen/agentchat/group/on_context_condition.py +51 -0
  136. autogen/agentchat/group/patterns/__init__.py +18 -0
  137. autogen/agentchat/group/patterns/auto.py +160 -0
  138. autogen/agentchat/group/patterns/manual.py +177 -0
  139. autogen/agentchat/group/patterns/pattern.py +295 -0
  140. autogen/agentchat/group/patterns/random.py +106 -0
  141. autogen/agentchat/group/patterns/round_robin.py +117 -0
  142. autogen/agentchat/group/reply_result.py +24 -0
  143. autogen/agentchat/group/safeguards/__init__.py +21 -0
  144. autogen/agentchat/group/safeguards/api.py +241 -0
  145. autogen/agentchat/group/safeguards/enforcer.py +1158 -0
  146. autogen/agentchat/group/safeguards/events.py +140 -0
  147. autogen/agentchat/group/safeguards/validator.py +435 -0
  148. autogen/agentchat/group/speaker_selection_result.py +41 -0
  149. autogen/agentchat/group/targets/__init__.py +4 -0
  150. autogen/agentchat/group/targets/function_target.py +245 -0
  151. autogen/agentchat/group/targets/group_chat_target.py +133 -0
  152. autogen/agentchat/group/targets/group_manager_target.py +151 -0
  153. autogen/agentchat/group/targets/transition_target.py +424 -0
  154. autogen/agentchat/group/targets/transition_utils.py +6 -0
  155. autogen/agentchat/groupchat.py +1832 -0
  156. autogen/agentchat/realtime/__init__.py +3 -0
  157. autogen/agentchat/realtime/experimental/__init__.py +20 -0
  158. autogen/agentchat/realtime/experimental/audio_adapters/__init__.py +8 -0
  159. autogen/agentchat/realtime/experimental/audio_adapters/twilio_audio_adapter.py +148 -0
  160. autogen/agentchat/realtime/experimental/audio_adapters/websocket_audio_adapter.py +139 -0
  161. autogen/agentchat/realtime/experimental/audio_observer.py +42 -0
  162. autogen/agentchat/realtime/experimental/clients/__init__.py +15 -0
  163. autogen/agentchat/realtime/experimental/clients/gemini/__init__.py +7 -0
  164. autogen/agentchat/realtime/experimental/clients/gemini/client.py +274 -0
  165. autogen/agentchat/realtime/experimental/clients/oai/__init__.py +8 -0
  166. autogen/agentchat/realtime/experimental/clients/oai/base_client.py +220 -0
  167. autogen/agentchat/realtime/experimental/clients/oai/rtc_client.py +243 -0
  168. autogen/agentchat/realtime/experimental/clients/oai/utils.py +48 -0
  169. autogen/agentchat/realtime/experimental/clients/realtime_client.py +191 -0
  170. autogen/agentchat/realtime/experimental/function_observer.py +84 -0
  171. autogen/agentchat/realtime/experimental/realtime_agent.py +158 -0
  172. autogen/agentchat/realtime/experimental/realtime_events.py +42 -0
  173. autogen/agentchat/realtime/experimental/realtime_observer.py +100 -0
  174. autogen/agentchat/realtime/experimental/realtime_swarm.py +533 -0
  175. autogen/agentchat/realtime/experimental/websockets.py +21 -0
  176. autogen/agentchat/realtime_agent/__init__.py +21 -0
  177. autogen/agentchat/user_proxy_agent.py +114 -0
  178. autogen/agentchat/utils.py +206 -0
  179. autogen/agents/__init__.py +3 -0
  180. autogen/agents/contrib/__init__.py +10 -0
  181. autogen/agents/contrib/time/__init__.py +8 -0
  182. autogen/agents/contrib/time/time_reply_agent.py +74 -0
  183. autogen/agents/contrib/time/time_tool_agent.py +52 -0
  184. autogen/agents/experimental/__init__.py +27 -0
  185. autogen/agents/experimental/deep_research/__init__.py +7 -0
  186. autogen/agents/experimental/deep_research/deep_research.py +52 -0
  187. autogen/agents/experimental/discord/__init__.py +7 -0
  188. autogen/agents/experimental/discord/discord.py +66 -0
  189. autogen/agents/experimental/document_agent/__init__.py +19 -0
  190. autogen/agents/experimental/document_agent/chroma_query_engine.py +301 -0
  191. autogen/agents/experimental/document_agent/docling_doc_ingest_agent.py +113 -0
  192. autogen/agents/experimental/document_agent/document_agent.py +643 -0
  193. autogen/agents/experimental/document_agent/document_conditions.py +50 -0
  194. autogen/agents/experimental/document_agent/document_utils.py +376 -0
  195. autogen/agents/experimental/document_agent/inmemory_query_engine.py +214 -0
  196. autogen/agents/experimental/document_agent/parser_utils.py +134 -0
  197. autogen/agents/experimental/document_agent/url_utils.py +417 -0
  198. autogen/agents/experimental/reasoning/__init__.py +7 -0
  199. autogen/agents/experimental/reasoning/reasoning_agent.py +1178 -0
  200. autogen/agents/experimental/slack/__init__.py +7 -0
  201. autogen/agents/experimental/slack/slack.py +73 -0
  202. autogen/agents/experimental/telegram/__init__.py +7 -0
  203. autogen/agents/experimental/telegram/telegram.py +76 -0
  204. autogen/agents/experimental/websurfer/__init__.py +7 -0
  205. autogen/agents/experimental/websurfer/websurfer.py +70 -0
  206. autogen/agents/experimental/wikipedia/__init__.py +7 -0
  207. autogen/agents/experimental/wikipedia/wikipedia.py +88 -0
  208. autogen/browser_utils.py +309 -0
  209. autogen/cache/__init__.py +10 -0
  210. autogen/cache/abstract_cache_base.py +71 -0
  211. autogen/cache/cache.py +203 -0
  212. autogen/cache/cache_factory.py +88 -0
  213. autogen/cache/cosmos_db_cache.py +144 -0
  214. autogen/cache/disk_cache.py +97 -0
  215. autogen/cache/in_memory_cache.py +54 -0
  216. autogen/cache/redis_cache.py +119 -0
  217. autogen/code_utils.py +598 -0
  218. autogen/coding/__init__.py +30 -0
  219. autogen/coding/base.py +120 -0
  220. autogen/coding/docker_commandline_code_executor.py +283 -0
  221. autogen/coding/factory.py +56 -0
  222. autogen/coding/func_with_reqs.py +203 -0
  223. autogen/coding/jupyter/__init__.py +23 -0
  224. autogen/coding/jupyter/base.py +36 -0
  225. autogen/coding/jupyter/docker_jupyter_server.py +160 -0
  226. autogen/coding/jupyter/embedded_ipython_code_executor.py +182 -0
  227. autogen/coding/jupyter/import_utils.py +82 -0
  228. autogen/coding/jupyter/jupyter_client.py +224 -0
  229. autogen/coding/jupyter/jupyter_code_executor.py +154 -0
  230. autogen/coding/jupyter/local_jupyter_server.py +164 -0
  231. autogen/coding/local_commandline_code_executor.py +341 -0
  232. autogen/coding/markdown_code_extractor.py +44 -0
  233. autogen/coding/utils.py +55 -0
  234. autogen/coding/yepcode_code_executor.py +197 -0
  235. autogen/doc_utils.py +35 -0
  236. autogen/environments/__init__.py +10 -0
  237. autogen/environments/docker_python_environment.py +365 -0
  238. autogen/environments/python_environment.py +125 -0
  239. autogen/environments/system_python_environment.py +85 -0
  240. autogen/environments/venv_python_environment.py +220 -0
  241. autogen/environments/working_directory.py +74 -0
  242. autogen/events/__init__.py +7 -0
  243. autogen/events/agent_events.py +1016 -0
  244. autogen/events/base_event.py +100 -0
  245. autogen/events/client_events.py +168 -0
  246. autogen/events/helpers.py +44 -0
  247. autogen/events/print_event.py +45 -0
  248. autogen/exception_utils.py +73 -0
  249. autogen/extensions/__init__.py +5 -0
  250. autogen/fast_depends/__init__.py +16 -0
  251. autogen/fast_depends/_compat.py +75 -0
  252. autogen/fast_depends/core/__init__.py +14 -0
  253. autogen/fast_depends/core/build.py +206 -0
  254. autogen/fast_depends/core/model.py +527 -0
  255. autogen/fast_depends/dependencies/__init__.py +15 -0
  256. autogen/fast_depends/dependencies/model.py +30 -0
  257. autogen/fast_depends/dependencies/provider.py +40 -0
  258. autogen/fast_depends/library/__init__.py +10 -0
  259. autogen/fast_depends/library/model.py +46 -0
  260. autogen/fast_depends/py.typed +6 -0
  261. autogen/fast_depends/schema.py +66 -0
  262. autogen/fast_depends/use.py +272 -0
  263. autogen/fast_depends/utils.py +177 -0
  264. autogen/formatting_utils.py +83 -0
  265. autogen/function_utils.py +13 -0
  266. autogen/graph_utils.py +173 -0
  267. autogen/import_utils.py +539 -0
  268. autogen/interop/__init__.py +22 -0
  269. autogen/interop/crewai/__init__.py +7 -0
  270. autogen/interop/crewai/crewai.py +88 -0
  271. autogen/interop/interoperability.py +71 -0
  272. autogen/interop/interoperable.py +46 -0
  273. autogen/interop/langchain/__init__.py +8 -0
  274. autogen/interop/langchain/langchain_chat_model_factory.py +156 -0
  275. autogen/interop/langchain/langchain_tool.py +78 -0
  276. autogen/interop/litellm/__init__.py +7 -0
  277. autogen/interop/litellm/litellm_config_factory.py +178 -0
  278. autogen/interop/pydantic_ai/__init__.py +7 -0
  279. autogen/interop/pydantic_ai/pydantic_ai.py +172 -0
  280. autogen/interop/registry.py +70 -0
  281. autogen/io/__init__.py +15 -0
  282. autogen/io/base.py +151 -0
  283. autogen/io/console.py +56 -0
  284. autogen/io/processors/__init__.py +12 -0
  285. autogen/io/processors/base.py +21 -0
  286. autogen/io/processors/console_event_processor.py +61 -0
  287. autogen/io/run_response.py +294 -0
  288. autogen/io/thread_io_stream.py +63 -0
  289. autogen/io/websockets.py +214 -0
  290. autogen/json_utils.py +42 -0
  291. autogen/llm_clients/MIGRATION_TO_V2.md +782 -0
  292. autogen/llm_clients/__init__.py +77 -0
  293. autogen/llm_clients/client_v2.py +122 -0
  294. autogen/llm_clients/models/__init__.py +55 -0
  295. autogen/llm_clients/models/content_blocks.py +389 -0
  296. autogen/llm_clients/models/unified_message.py +145 -0
  297. autogen/llm_clients/models/unified_response.py +83 -0
  298. autogen/llm_clients/openai_completions_client.py +444 -0
  299. autogen/llm_config/__init__.py +11 -0
  300. autogen/llm_config/client.py +59 -0
  301. autogen/llm_config/config.py +461 -0
  302. autogen/llm_config/entry.py +169 -0
  303. autogen/llm_config/types.py +37 -0
  304. autogen/llm_config/utils.py +223 -0
  305. autogen/logger/__init__.py +11 -0
  306. autogen/logger/base_logger.py +129 -0
  307. autogen/logger/file_logger.py +262 -0
  308. autogen/logger/logger_factory.py +42 -0
  309. autogen/logger/logger_utils.py +57 -0
  310. autogen/logger/sqlite_logger.py +524 -0
  311. autogen/math_utils.py +338 -0
  312. autogen/mcp/__init__.py +7 -0
  313. autogen/mcp/__main__.py +78 -0
  314. autogen/mcp/helpers.py +45 -0
  315. autogen/mcp/mcp_client.py +349 -0
  316. autogen/mcp/mcp_proxy/__init__.py +19 -0
  317. autogen/mcp/mcp_proxy/fastapi_code_generator_helpers.py +62 -0
  318. autogen/mcp/mcp_proxy/mcp_proxy.py +577 -0
  319. autogen/mcp/mcp_proxy/operation_grouping.py +166 -0
  320. autogen/mcp/mcp_proxy/operation_renaming.py +110 -0
  321. autogen/mcp/mcp_proxy/patch_fastapi_code_generator.py +98 -0
  322. autogen/mcp/mcp_proxy/security.py +399 -0
  323. autogen/mcp/mcp_proxy/security_schema_visitor.py +37 -0
  324. autogen/messages/__init__.py +7 -0
  325. autogen/messages/agent_messages.py +946 -0
  326. autogen/messages/base_message.py +108 -0
  327. autogen/messages/client_messages.py +172 -0
  328. autogen/messages/print_message.py +48 -0
  329. autogen/oai/__init__.py +61 -0
  330. autogen/oai/anthropic.py +1516 -0
  331. autogen/oai/bedrock.py +800 -0
  332. autogen/oai/cerebras.py +302 -0
  333. autogen/oai/client.py +1658 -0
  334. autogen/oai/client_utils.py +196 -0
  335. autogen/oai/cohere.py +494 -0
  336. autogen/oai/gemini.py +1045 -0
  337. autogen/oai/gemini_types.py +156 -0
  338. autogen/oai/groq.py +319 -0
  339. autogen/oai/mistral.py +311 -0
  340. autogen/oai/oai_models/__init__.py +23 -0
  341. autogen/oai/oai_models/_models.py +16 -0
  342. autogen/oai/oai_models/chat_completion.py +86 -0
  343. autogen/oai/oai_models/chat_completion_audio.py +32 -0
  344. autogen/oai/oai_models/chat_completion_message.py +97 -0
  345. autogen/oai/oai_models/chat_completion_message_tool_call.py +60 -0
  346. autogen/oai/oai_models/chat_completion_token_logprob.py +62 -0
  347. autogen/oai/oai_models/completion_usage.py +59 -0
  348. autogen/oai/ollama.py +657 -0
  349. autogen/oai/openai_responses.py +451 -0
  350. autogen/oai/openai_utils.py +897 -0
  351. autogen/oai/together.py +387 -0
  352. autogen/remote/__init__.py +18 -0
  353. autogen/remote/agent.py +199 -0
  354. autogen/remote/agent_service.py +197 -0
  355. autogen/remote/errors.py +17 -0
  356. autogen/remote/httpx_client_factory.py +131 -0
  357. autogen/remote/protocol.py +37 -0
  358. autogen/remote/retry.py +102 -0
  359. autogen/remote/runtime.py +96 -0
  360. autogen/retrieve_utils.py +490 -0
  361. autogen/runtime_logging.py +161 -0
  362. autogen/testing/__init__.py +12 -0
  363. autogen/testing/messages.py +45 -0
  364. autogen/testing/test_agent.py +111 -0
  365. autogen/token_count_utils.py +280 -0
  366. autogen/tools/__init__.py +20 -0
  367. autogen/tools/contrib/__init__.py +9 -0
  368. autogen/tools/contrib/time/__init__.py +7 -0
  369. autogen/tools/contrib/time/time.py +40 -0
  370. autogen/tools/dependency_injection.py +249 -0
  371. autogen/tools/experimental/__init__.py +54 -0
  372. autogen/tools/experimental/browser_use/__init__.py +7 -0
  373. autogen/tools/experimental/browser_use/browser_use.py +154 -0
  374. autogen/tools/experimental/code_execution/__init__.py +7 -0
  375. autogen/tools/experimental/code_execution/python_code_execution.py +86 -0
  376. autogen/tools/experimental/crawl4ai/__init__.py +7 -0
  377. autogen/tools/experimental/crawl4ai/crawl4ai.py +150 -0
  378. autogen/tools/experimental/deep_research/__init__.py +7 -0
  379. autogen/tools/experimental/deep_research/deep_research.py +329 -0
  380. autogen/tools/experimental/duckduckgo/__init__.py +7 -0
  381. autogen/tools/experimental/duckduckgo/duckduckgo_search.py +103 -0
  382. autogen/tools/experimental/firecrawl/__init__.py +7 -0
  383. autogen/tools/experimental/firecrawl/firecrawl_tool.py +836 -0
  384. autogen/tools/experimental/google/__init__.py +14 -0
  385. autogen/tools/experimental/google/authentication/__init__.py +11 -0
  386. autogen/tools/experimental/google/authentication/credentials_hosted_provider.py +43 -0
  387. autogen/tools/experimental/google/authentication/credentials_local_provider.py +91 -0
  388. autogen/tools/experimental/google/authentication/credentials_provider.py +35 -0
  389. autogen/tools/experimental/google/drive/__init__.py +9 -0
  390. autogen/tools/experimental/google/drive/drive_functions.py +124 -0
  391. autogen/tools/experimental/google/drive/toolkit.py +88 -0
  392. autogen/tools/experimental/google/model.py +17 -0
  393. autogen/tools/experimental/google/toolkit_protocol.py +19 -0
  394. autogen/tools/experimental/google_search/__init__.py +8 -0
  395. autogen/tools/experimental/google_search/google_search.py +93 -0
  396. autogen/tools/experimental/google_search/youtube_search.py +181 -0
  397. autogen/tools/experimental/messageplatform/__init__.py +17 -0
  398. autogen/tools/experimental/messageplatform/discord/__init__.py +7 -0
  399. autogen/tools/experimental/messageplatform/discord/discord.py +284 -0
  400. autogen/tools/experimental/messageplatform/slack/__init__.py +7 -0
  401. autogen/tools/experimental/messageplatform/slack/slack.py +385 -0
  402. autogen/tools/experimental/messageplatform/telegram/__init__.py +7 -0
  403. autogen/tools/experimental/messageplatform/telegram/telegram.py +271 -0
  404. autogen/tools/experimental/perplexity/__init__.py +7 -0
  405. autogen/tools/experimental/perplexity/perplexity_search.py +249 -0
  406. autogen/tools/experimental/reliable/__init__.py +10 -0
  407. autogen/tools/experimental/reliable/reliable.py +1311 -0
  408. autogen/tools/experimental/searxng/__init__.py +7 -0
  409. autogen/tools/experimental/searxng/searxng_search.py +142 -0
  410. autogen/tools/experimental/tavily/__init__.py +7 -0
  411. autogen/tools/experimental/tavily/tavily_search.py +176 -0
  412. autogen/tools/experimental/web_search_preview/__init__.py +7 -0
  413. autogen/tools/experimental/web_search_preview/web_search_preview.py +120 -0
  414. autogen/tools/experimental/wikipedia/__init__.py +7 -0
  415. autogen/tools/experimental/wikipedia/wikipedia.py +284 -0
  416. autogen/tools/function_utils.py +412 -0
  417. autogen/tools/tool.py +188 -0
  418. autogen/tools/toolkit.py +86 -0
  419. autogen/types.py +29 -0
  420. autogen/version.py +7 -0
  421. templates/client_template/main.jinja2 +72 -0
  422. templates/config_template/config.jinja2 +7 -0
  423. templates/main.jinja2 +61 -0
@@ -0,0 +1,42 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ #
5
+ # Portions derived from https://github.com/microsoft/autogen are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+ from typing import Any, Literal
8
+
9
+ from ..doc_utils import export_module
10
+ from .base_logger import BaseLogger
11
+ from .file_logger import FileLogger
12
+ from .sqlite_logger import SqliteLogger
13
+
14
+ __all__ = ("LoggerFactory",)
15
+
16
+
17
+ @export_module("autogen.logger")
18
+ class LoggerFactory:
19
+ """Factory class to create logger objects."""
20
+
21
+ @staticmethod
22
+ def get_logger(
23
+ logger_type: Literal["sqlite", "file"] = "sqlite", config: dict[str, Any] | None = None
24
+ ) -> BaseLogger:
25
+ """Factory method to create logger objects.
26
+
27
+ Args:
28
+ logger_type (Literal["sqlite", "file"], optional): Type of logger. Defaults to "sqlite".
29
+ config (Optional[dict[str, Any]], optional): Configuration for logger. Defaults to None.
30
+
31
+ Returns:
32
+ BaseLogger: Logger object
33
+ """
34
+ if config is None:
35
+ config = {}
36
+
37
+ if logger_type == "sqlite":
38
+ return SqliteLogger(config)
39
+ elif logger_type == "file":
40
+ return FileLogger(config)
41
+ else:
42
+ raise ValueError(f"[logger_factory] Unknown logger type: {logger_type}")
@@ -0,0 +1,57 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ #
5
+ # Portions derived from https://github.com/microsoft/autogen are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+ import inspect
8
+ from datetime import datetime, timezone
9
+ from pathlib import Path, PurePath
10
+ from typing import Any
11
+
12
+ __all__ = ("get_current_ts", "to_dict")
13
+
14
+
15
+ def get_current_ts() -> str:
16
+ """Get current timestamp in UTC timezone.
17
+
18
+ Returns:
19
+ str: Current timestamp in UTC timezone
20
+ """
21
+ return datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S.%f")
22
+
23
+
24
+ def to_dict(
25
+ obj: int | float | str | bool | dict[Any, Any] | list[Any] | tuple[Any, ...] | Any,
26
+ exclude: tuple[str, ...] = (),
27
+ no_recursive: tuple[Any, ...] = (),
28
+ ) -> Any:
29
+ """Convert object to dictionary.
30
+
31
+ Args:
32
+ obj (Union[int, float, str, bool, dict[Any, Any], list[Any], tuple[Any, ...], Any]): Object to convert
33
+ exclude (tuple[str, ...], optional): Keys to exclude. Defaults to ().
34
+ no_recursive (tuple[Any, ...], optional): Types to exclude from recursive conversion. Defaults to ().
35
+ """
36
+ if isinstance(obj, (int, float, str, bool)):
37
+ return obj
38
+ elif isinstance(obj, (Path, PurePath)):
39
+ return str(obj)
40
+ elif callable(obj):
41
+ return inspect.getsource(obj).strip()
42
+ elif isinstance(obj, dict):
43
+ return {
44
+ str(k): to_dict(str(v)) if isinstance(v, no_recursive) else to_dict(v, exclude, no_recursive)
45
+ for k, v in obj.items()
46
+ if k not in exclude
47
+ }
48
+ elif isinstance(obj, (list, tuple)):
49
+ return [to_dict(str(v)) if isinstance(v, no_recursive) else to_dict(v, exclude, no_recursive) for v in obj]
50
+ elif hasattr(obj, "__dict__"):
51
+ return {
52
+ str(k): to_dict(str(v)) if isinstance(v, no_recursive) else to_dict(v, exclude, no_recursive)
53
+ for k, v in vars(obj).items()
54
+ if k not in exclude
55
+ }
56
+ else:
57
+ return obj
@@ -0,0 +1,524 @@
1
+ # Copyright (c) 2023 - 2025, AG2ai, Inc., AG2ai open-source projects maintainers and core contributors
2
+ #
3
+ # SPDX-License-Identifier: Apache-2.0
4
+ #
5
+ # Portions derived from https://github.com/microsoft/autogen are under the MIT License.
6
+ # SPDX-License-Identifier: MIT
7
+ from __future__ import annotations
8
+
9
+ import json
10
+ import logging
11
+ import os
12
+ import sqlite3
13
+ import threading
14
+ import uuid
15
+ from collections.abc import Callable
16
+ from typing import TYPE_CHECKING, Any, TypeVar
17
+
18
+ from ..doc_utils import export_module
19
+ from .base_logger import BaseLogger, LLMConfig
20
+ from .logger_utils import get_current_ts, to_dict
21
+
22
+ if TYPE_CHECKING:
23
+ from openai import AzureOpenAI, OpenAI
24
+ from openai.types.chat import ChatCompletion
25
+
26
+ from .. import Agent, ConversableAgent, OpenAIWrapper
27
+ from ..oai.anthropic import AnthropicClient
28
+ from ..oai.bedrock import BedrockClient
29
+ from ..oai.cerebras import CerebrasClient
30
+ from ..oai.cohere import CohereClient
31
+ from ..oai.gemini import GeminiClient
32
+ from ..oai.groq import GroqClient
33
+ from ..oai.mistral import MistralAIClient
34
+ from ..oai.ollama import OllamaClient
35
+ from ..oai.together import TogetherClient
36
+
37
+ logger = logging.getLogger(__name__)
38
+ lock = threading.Lock()
39
+
40
+ __all__ = ("SqliteLogger",)
41
+
42
+ F = TypeVar("F", bound=Callable[..., Any])
43
+
44
+
45
+ def safe_serialize(obj: Any) -> str:
46
+ """Safely serialize an object to JSON.
47
+
48
+ Args:
49
+ obj (Any): Object to serialize.
50
+
51
+ Returns:
52
+ str: Serialized object.
53
+ """
54
+
55
+ def default(o: Any) -> str:
56
+ if hasattr(o, "to_json"):
57
+ return str(o.to_json())
58
+ else:
59
+ return f"<<non-serializable: {type(o).__qualname__}>>"
60
+
61
+ return json.dumps(obj, default=default)
62
+
63
+
64
+ @export_module("autogen.logger")
65
+ class SqliteLogger(BaseLogger):
66
+ """Sqlite logger class."""
67
+
68
+ schema_version = 1
69
+
70
+ def __init__(self, config: dict[str, Any]):
71
+ """Initialize the SqliteLogger.
72
+
73
+ Args:
74
+ config (dict[str, Any]): Configuration for the logger.
75
+ """
76
+ self.config = config
77
+
78
+ try:
79
+ self.dbname = self.config.get("dbname", "logs.db")
80
+ self.con = sqlite3.connect(self.dbname, check_same_thread=False)
81
+ self.cur = self.con.cursor()
82
+ self.session_id = str(uuid.uuid4())
83
+ except sqlite3.Error as e:
84
+ logger.error(f"[SqliteLogger] Failed to connect to database {self.dbname}: {e}")
85
+
86
+ def start(self) -> str:
87
+ try:
88
+ query = """
89
+ CREATE TABLE IF NOT EXISTS chat_completions(
90
+ id INTEGER PRIMARY KEY,
91
+ invocation_id TEXT,
92
+ client_id INTEGER,
93
+ wrapper_id INTEGER,
94
+ session_id TEXT,
95
+ source_name TEXT,
96
+ request TEXT,
97
+ response TEXT,
98
+ is_cached INEGER,
99
+ cost REAL,
100
+ start_time DATETIME DEFAULT CURRENT_TIMESTAMP,
101
+ end_time DATETIME DEFAULT CURRENT_TIMESTAMP)
102
+ """
103
+ self._run_query(query=query)
104
+
105
+ query = """
106
+ CREATE TABLE IF NOT EXISTS agents (
107
+ id INTEGER PRIMARY KEY, -- Key assigned by the database
108
+ agent_id INTEGER, -- result of python id(agent)
109
+ wrapper_id INTEGER, -- result of python id(agent.client)
110
+ session_id TEXT,
111
+ name TEXT, -- agent.name
112
+ class TEXT, -- type or class name of agent
113
+ init_args TEXT, -- JSON serialization of constructor
114
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
115
+ UNIQUE(agent_id, session_id))
116
+ """
117
+ self._run_query(query=query)
118
+
119
+ query = """
120
+ CREATE TABLE IF NOT EXISTS oai_wrappers (
121
+ id INTEGER PRIMARY KEY, -- Key assigned by the database
122
+ wrapper_id INTEGER, -- result of python id(wrapper)
123
+ session_id TEXT,
124
+ init_args TEXT, -- JSON serialization of constructor
125
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
126
+ UNIQUE(wrapper_id, session_id))
127
+ """
128
+ self._run_query(query=query)
129
+
130
+ query = """
131
+ CREATE TABLE IF NOT EXISTS oai_clients (
132
+ id INTEGER PRIMARY KEY, -- Key assigned by the database
133
+ client_id INTEGER, -- result of python id(client)
134
+ wrapper_id INTEGER, -- result of python id(wrapper)
135
+ session_id TEXT,
136
+ class TEXT, -- type or class name of client
137
+ init_args TEXT, -- JSON serialization of constructor
138
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
139
+ UNIQUE(client_id, session_id))
140
+ """
141
+ self._run_query(query=query)
142
+
143
+ query = """
144
+ CREATE TABLE IF NOT EXISTS version (
145
+ id INTEGER PRIMARY KEY CHECK (id = 1), -- id of the logging database
146
+ version_number INTEGER NOT NULL -- version of the logging database
147
+ );
148
+ """
149
+ self._run_query(query=query)
150
+
151
+ query = """
152
+ CREATE TABLE IF NOT EXISTS events (
153
+ event_name TEXT,
154
+ source_id INTEGER,
155
+ source_name TEXT,
156
+ agent_module TEXT DEFAULT NULL,
157
+ agent_class_name TEXT DEFAULT NULL,
158
+ id INTEGER PRIMARY KEY,
159
+ json_state TEXT,
160
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
161
+ );
162
+ """
163
+ self._run_query(query=query)
164
+
165
+ query = """
166
+ CREATE TABLE IF NOT EXISTS function_calls (
167
+ source_id INTEGER,
168
+ source_name TEXT,
169
+ function_name TEXT,
170
+ args TEXT DEFAULT NULL,
171
+ returns TEXT DEFAULT NULL,
172
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
173
+ );
174
+ """
175
+ self._run_query(query=query)
176
+
177
+ current_version = self._get_current_db_version()
178
+ if current_version is None:
179
+ self._run_query(
180
+ query="INSERT INTO version (id, version_number) VALUES (1, ?);", args=(SqliteLogger.schema_version,)
181
+ )
182
+ self._apply_migration()
183
+
184
+ except sqlite3.Error as e:
185
+ logger.error(f"[SqliteLogger] start logging error: {e}")
186
+ finally:
187
+ return self.session_id
188
+
189
+ def _get_current_db_version(self) -> None | int:
190
+ self.cur.execute("SELECT version_number FROM version ORDER BY id DESC LIMIT 1")
191
+ result = self.cur.fetchone()
192
+ return result[0] if result is not None else None
193
+
194
+ # Example migration script name format: 002_update_agents_table.sql
195
+ def _apply_migration(self, migrations_dir: str = "./migrations") -> None:
196
+ current_version = self._get_current_db_version()
197
+ current_version = SqliteLogger.schema_version if current_version is None else current_version
198
+
199
+ if os.path.isdir(migrations_dir):
200
+ migrations = sorted(os.listdir(migrations_dir))
201
+ else:
202
+ logger.info("no migration scripts, skip...")
203
+ return
204
+
205
+ migrations_to_apply = [m for m in migrations if int(m.split("_")[0]) > current_version]
206
+
207
+ for script in migrations_to_apply:
208
+ with open(script) as f:
209
+ migration_sql = f.read()
210
+ self._run_query_script(script=migration_sql)
211
+
212
+ latest_version = int(script.split("_")[0])
213
+ query = "UPDATE version SET version_number = ? WHERE id = 1"
214
+ args = (latest_version,)
215
+ self._run_query(query=query, args=args)
216
+
217
+ def _run_query(self, query: str, args: tuple[Any, ...] = ()) -> None:
218
+ """Executes a given SQL query.
219
+
220
+ Args:
221
+ query (str): The SQL query to execute.
222
+ args (Tuple): The arguments to pass to the SQL query.
223
+ """
224
+ try:
225
+ with lock:
226
+ self.cur.execute(query, args)
227
+ self.con.commit()
228
+ except Exception as e:
229
+ logger.error("[sqlite logger]Error running query with query %s and args %s: %s", query, args, e)
230
+
231
+ def _run_query_script(self, script: str) -> None:
232
+ """Executes SQL script.
233
+
234
+ Args:
235
+ script (str): SQL script to execute.
236
+ """
237
+ try:
238
+ with lock:
239
+ self.cur.executescript(script)
240
+ self.con.commit()
241
+ except Exception as e:
242
+ logger.error("[sqlite logger]Error running query script %s: %s", script, e)
243
+
244
+ def log_chat_completion(
245
+ self,
246
+ invocation_id: uuid.UUID,
247
+ client_id: int,
248
+ wrapper_id: int,
249
+ source: str | Agent,
250
+ request: dict[str, float | str | list[dict[str, str]]],
251
+ response: str | ChatCompletion,
252
+ is_cached: int,
253
+ cost: float,
254
+ start_time: str,
255
+ ) -> None:
256
+ """Log chat completion.
257
+
258
+ Args:
259
+ invocation_id (uuid.UUID): Invocation ID.
260
+ client_id (int): Client ID.
261
+ wrapper_id (int): Wrapper ID.
262
+ source (str | Agent): Source of the chat completion.
263
+ request (dict[str, float | str | list[dict[str, str]]]): Request for the chat completion.
264
+ response (str | ChatCompletion): Response for the chat completion.
265
+ is_cached (int): Whether the response is cached.
266
+ cost (float): Cost of the chat completion.
267
+ start_time (str): Start time of the chat completion.
268
+ """
269
+ if self.con is None:
270
+ return
271
+
272
+ end_time = get_current_ts()
273
+
274
+ if response is None or isinstance(response, str):
275
+ response_messages = json.dumps({"response": response})
276
+ else:
277
+ response_messages = json.dumps(to_dict(response), indent=4)
278
+
279
+ source_name = (
280
+ source
281
+ if isinstance(source, str)
282
+ else source.name
283
+ if hasattr(source, "name") and source.name is not None
284
+ else ""
285
+ )
286
+
287
+ query = """
288
+ INSERT INTO chat_completions (
289
+ invocation_id, client_id, wrapper_id, session_id, request, response, is_cached, cost, start_time, end_time, source_name
290
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
291
+ """
292
+ args = (
293
+ invocation_id,
294
+ client_id,
295
+ wrapper_id,
296
+ self.session_id,
297
+ json.dumps(to_dict(request)),
298
+ response_messages,
299
+ is_cached,
300
+ cost,
301
+ start_time,
302
+ end_time,
303
+ source_name,
304
+ )
305
+
306
+ self._run_query(query=query, args=args)
307
+
308
+ def log_new_agent(self, agent: ConversableAgent, init_args: dict[str, Any]) -> None:
309
+ """Log new agent.
310
+
311
+ Args:
312
+ agent (ConversableAgent): Agent to log.
313
+ init_args (dict[str, Any]): Initialization arguments of the agent
314
+ """
315
+ from .. import Agent
316
+
317
+ if self.con is None:
318
+ return
319
+
320
+ args = to_dict(
321
+ init_args,
322
+ exclude=(
323
+ "self",
324
+ "__class__",
325
+ "api_key",
326
+ "organization",
327
+ "base_url",
328
+ "azure_endpoint",
329
+ "azure_ad_token",
330
+ "azure_ad_token_provider",
331
+ ),
332
+ no_recursive=(Agent,),
333
+ )
334
+
335
+ # We do an upsert since both the superclass and subclass may call this method (in that order)
336
+ query = """
337
+ INSERT INTO agents (agent_id, wrapper_id, session_id, name, class, init_args, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?)
338
+ ON CONFLICT (agent_id, session_id) DO UPDATE SET
339
+ wrapper_id = excluded.wrapper_id,
340
+ name = excluded.name,
341
+ class = excluded.class,
342
+ init_args = excluded.init_args,
343
+ timestamp = excluded.timestamp
344
+ """
345
+ args = (
346
+ id(agent),
347
+ agent.client.wrapper_id if hasattr(agent, "client") and agent.client is not None else "",
348
+ self.session_id,
349
+ agent.name if hasattr(agent, "name") and agent.name is not None else "",
350
+ type(agent).__name__,
351
+ json.dumps(args),
352
+ get_current_ts(),
353
+ )
354
+ self._run_query(query=query, args=args)
355
+
356
+ def log_event(self, source: str | Agent, name: str, **kwargs: dict[str, Any]) -> None:
357
+ """Log event.
358
+
359
+ Args:
360
+ source (str | Agent): Source of the event.
361
+ name (str): Name of the event.
362
+ **kwargs (dict[str, Any]): Additional arguments for the event.
363
+ """
364
+ from autogen import Agent
365
+
366
+ if self.con is None:
367
+ return
368
+
369
+ json_args = json.dumps(kwargs, default=lambda o: f"<<non-serializable: {type(o).__qualname__}>>")
370
+
371
+ if isinstance(source, Agent):
372
+ query = """
373
+ INSERT INTO events (source_id, source_name, event_name, agent_module, agent_class_name, json_state, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?)
374
+ """
375
+ args = (
376
+ id(source),
377
+ source.name if hasattr(source, "name") else source,
378
+ name,
379
+ source.__module__,
380
+ source.__class__.__name__,
381
+ json_args,
382
+ get_current_ts(),
383
+ )
384
+ self._run_query(query=query, args=args)
385
+ else:
386
+ query = """
387
+ INSERT INTO events (source_id, source_name, event_name, json_state, timestamp) VALUES (?, ?, ?, ?, ?)
388
+ """
389
+ args_str_based = (
390
+ id(source),
391
+ source.name if hasattr(source, "name") else source,
392
+ name,
393
+ json_args,
394
+ get_current_ts(),
395
+ )
396
+ self._run_query(query=query, args=args_str_based)
397
+
398
+ def log_new_wrapper(self, wrapper: OpenAIWrapper, init_args: dict[str, LLMConfig | list[LLMConfig]]) -> None:
399
+ """Log new wrapper.
400
+
401
+ Args:
402
+ wrapper (OpenAIWrapper): Wrapper to log.
403
+ init_args (dict[str, LLMConfig | list[LLMConfig]]): Initialization arguments of the wrapper
404
+ """
405
+ if self.con is None:
406
+ return
407
+
408
+ args = to_dict(
409
+ init_args,
410
+ exclude=(
411
+ "self",
412
+ "__class__",
413
+ "api_key",
414
+ "organization",
415
+ "base_url",
416
+ "azure_endpoint",
417
+ "azure_ad_token",
418
+ "azure_ad_token_provider",
419
+ ),
420
+ )
421
+
422
+ query = """
423
+ INSERT INTO oai_wrappers (wrapper_id, session_id, init_args, timestamp) VALUES (?, ?, ?, ?)
424
+ ON CONFLICT (wrapper_id, session_id) DO NOTHING;
425
+ """
426
+ args = (
427
+ id(wrapper),
428
+ self.session_id,
429
+ json.dumps(args),
430
+ get_current_ts(),
431
+ )
432
+ self._run_query(query=query, args=args)
433
+
434
+ def log_function_use(self, source: str | Agent, function: F, args: dict[str, Any], returns: Any) -> None:
435
+ """Log function use.
436
+
437
+ Args:
438
+ source (str | Agent): Source of the function use.
439
+ function (F): Function to log.
440
+ args (dict[str, Any]): Arguments of the function.
441
+ returns (Any): Returns of the function.
442
+ """
443
+ if self.con is None:
444
+ return
445
+
446
+ query = """
447
+ INSERT INTO function_calls (source_id, source_name, function_name, args, returns, timestamp) VALUES (?, ?, ?, ?, ?, ?)
448
+ """
449
+ query_args: tuple[Any, ...] = (
450
+ id(source),
451
+ source.name if hasattr(source, "name") else source,
452
+ function.__name__,
453
+ safe_serialize(args),
454
+ safe_serialize(returns),
455
+ get_current_ts(),
456
+ )
457
+ self._run_query(query=query, args=query_args)
458
+
459
+ def log_new_client(
460
+ self,
461
+ client: (
462
+ AzureOpenAI
463
+ | OpenAI
464
+ | CerebrasClient
465
+ | GeminiClient
466
+ | AnthropicClient
467
+ | MistralAIClient
468
+ | TogetherClient
469
+ | GroqClient
470
+ | CohereClient
471
+ | OllamaClient
472
+ | BedrockClient
473
+ ),
474
+ wrapper: OpenAIWrapper,
475
+ init_args: dict[str, Any],
476
+ ) -> None:
477
+ """Log new client.
478
+
479
+ Args:
480
+ client (AzureOpenAI | OpenAI | CerebrasClient | GeminiClient | AnthropicClient | MistralAIClient | TogetherClient | GroqClient | CohereClient | OllamaClient | BedrockClient): Client to log.
481
+ wrapper (OpenAIWrapper): Wrapper of the client.
482
+ init_args (dict[str, Any]): Initialization arguments of the client.
483
+ """
484
+ if self.con is None:
485
+ return
486
+
487
+ args = to_dict(
488
+ init_args,
489
+ exclude=(
490
+ "self",
491
+ "__class__",
492
+ "api_key",
493
+ "organization",
494
+ "base_url",
495
+ "azure_endpoint",
496
+ "azure_ad_token",
497
+ "azure_ad_token_provider",
498
+ ),
499
+ )
500
+
501
+ query = """
502
+ INSERT INTO oai_clients (client_id, wrapper_id, session_id, class, init_args, timestamp) VALUES (?, ?, ?, ?, ?, ?)
503
+ ON CONFLICT (client_id, session_id) DO NOTHING;
504
+ """
505
+ args = (
506
+ id(client),
507
+ id(wrapper),
508
+ self.session_id,
509
+ type(client).__name__,
510
+ json.dumps(args),
511
+ get_current_ts(),
512
+ )
513
+ self._run_query(query=query, args=args)
514
+
515
+ def stop(self) -> None:
516
+ """Stop the logger"""
517
+ if self.con:
518
+ self.con.close()
519
+
520
+ def get_connection(self) -> None | sqlite3.Connection:
521
+ """Get connection."""
522
+ if self.con:
523
+ return self.con
524
+ return None