sycommon-python-lib 0.2.5a25__tar.gz → 0.2.5a26__tar.gz

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 (294) hide show
  1. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/pyproject.toml +1 -1
  3. sycommon_python_lib-0.2.5a26/src/sycommon/database/async_base_db_service.py +114 -0
  4. sycommon_python_lib-0.2.5a26/src/sycommon/database/base_db_service.py +114 -0
  5. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/kafka_log.py +58 -0
  6. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/mqlistener_config.py +1 -1
  7. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_client.py +1 -1
  8. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/services.py +8 -0
  9. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  10. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
  11. sycommon_python_lib-0.2.5a26/tests/test_asyncio_logging.py +116 -0
  12. sycommon_python_lib-0.2.5a25/src/sycommon/database/async_base_db_service.py +0 -36
  13. sycommon_python_lib-0.2.5a25/src/sycommon/database/base_db_service.py +0 -30
  14. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/README.md +0 -0
  15. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/setup.cfg +0 -0
  16. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/__init__.py +0 -0
  17. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/cli.py +0 -0
  18. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/__init__.py +0 -0
  19. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/console.py +0 -0
  20. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/models.py +0 -0
  21. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/project.py +0 -0
  22. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/core/utils.py +0 -0
  23. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/__init__.py +0 -0
  24. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/README.md.tpl +0 -0
  25. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/__init__.py +0 -0
  26. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/api/query.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/app.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/db/service.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/model/parse.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  45. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  46. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/.env.tpl +0 -0
  47. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/.gitignore.tpl +0 -0
  48. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/Dockerfile.tpl +0 -0
  49. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/README.md.tpl +0 -0
  50. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/__init__.py +0 -0
  51. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/app.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/app.yaml.tpl +0 -0
  53. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/client/__init__.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/model/__init__.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/model/file_info.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/base/requirements.txt.tpl +0 -0
  58. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/README.md.tpl +0 -0
  59. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/__init__.py +0 -0
  60. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/app.py.tpl +0 -0
  61. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  62. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  64. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/README.md.tpl +0 -0
  66. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/__init__.py +0 -0
  67. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/api/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/api/echo.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/app.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/client/__init__.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/model/__init__.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  75. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/command/templates/web/tools/mq.py.tpl +0 -0
  76. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/nexus/__init__.py +0 -0
  77. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/__main__.py +0 -0
  79. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/agents/__init__.py +0 -0
  80. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/agents/factory.py +0 -0
  81. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/agents/prompts.py +0 -0
  82. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/__init__.py +0 -0
  83. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/browser.py +0 -0
  84. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/__init__.py +0 -0
  85. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/console.py +0 -0
  86. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/dom.py +0 -0
  87. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/network.py +0 -0
  88. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  89. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/performance.py +0 -0
  90. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  91. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/client.py +0 -0
  92. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/protocol.py +0 -0
  93. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cdp/repl.py +0 -0
  94. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/cli.py +0 -0
  95. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/__init__.py +0 -0
  96. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/cdp_cmd.py +0 -0
  97. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/chat_cmd.py +0 -0
  98. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/create_cmd.py +0 -0
  99. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/evaluate_cmd.py +0 -0
  100. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/init_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/memory_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/resume_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/rollback_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/commands/run_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/__init__.py +0 -0
  106. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/backend.py +0 -0
  107. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/config.py +0 -0
  108. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/display.py +0 -0
  109. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/git_integration.py +0 -0
  110. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/llm.py +0 -0
  111. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/core/state.py +0 -0
  112. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/evaluate/__init__.py +0 -0
  113. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/evaluate/api_evaluator.py +0 -0
  114. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/__init__.py +0 -0
  115. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/compressor.py +0 -0
  116. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/full.py +0 -0
  117. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/hot.py +0 -0
  118. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/manager.py +0 -0
  119. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/memory/warm.py +0 -0
  120. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/mode/__init__.py +0 -0
  121. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/mode/create.py +0 -0
  122. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/mode/optimize.py +0 -0
  123. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/models/__init__.py +0 -0
  124. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/models/config_models.py +0 -0
  125. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/__init__.py +0 -0
  126. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/baseline_tests.py +0 -0
  127. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/checkpoint.py +0 -0
  128. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/convergence.py +0 -0
  129. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/diagnosis.py +0 -0
  130. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/engine.py +0 -0
  131. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/environment.py +0 -0
  132. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/experience.py +0 -0
  133. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/harness_prompts.py +0 -0
  134. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/history.py +0 -0
  135. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/optimization_logger.py +0 -0
  136. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/pre_validation.py +0 -0
  137. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/reward.py +0 -0
  138. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/strategy_bandit.py +0 -0
  139. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/strategy_generator.py +0 -0
  140. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/rl/strategy_prompts.py +0 -0
  141. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycli/skills/__init__.py +0 -0
  142. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/__init__.py +0 -0
  143. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/__init__.py +0 -0
  144. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/agent_manager.py +0 -0
  145. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/chat_events.py +0 -0
  146. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/deep_agent.py +0 -0
  147. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/mcp/__init__.py +0 -0
  148. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/mcp/models.py +0 -0
  149. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  150. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/multi_agent_team.py +0 -0
  151. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/__init__.py +0 -0
  152. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  153. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  154. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  155. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  156. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  157. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/sandbox/session.py +0 -0
  158. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/agent/summarization_utils.py +0 -0
  159. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/__init__.py +0 -0
  160. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/ldap_service.py +0 -0
  161. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/oa_cache.py +0 -0
  162. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/oa_crypto.py +0 -0
  163. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/oa_service.py +0 -0
  164. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  165. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/Config.py +0 -0
  166. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/DatabaseConfig.py +0 -0
  167. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  168. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/EmbeddingConfig.py +0 -0
  169. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/LLMConfig.py +0 -0
  170. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/LangfuseConfig.py +0 -0
  171. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/MQConfig.py +0 -0
  172. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/PgConfig.py +0 -0
  173. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/RedisConfig.py +0 -0
  174. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/RerankerConfig.py +0 -0
  175. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/SentryConfig.py +0 -0
  176. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/XxlJobConfig.py +0 -0
  177. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/config/__init__.py +0 -0
  178. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/async_database_service.py +0 -0
  179. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/database_service.py +0 -0
  180. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/elasticsearch_service.py +0 -0
  181. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  182. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/redis_service.py +0 -0
  183. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/database/token_usage_db_service.py +0 -0
  184. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/health/__init__.py +0 -0
  185. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/health/health_check.py +0 -0
  186. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/health/metrics.py +0 -0
  187. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/health/ping.py +0 -0
  188. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/heartbeat_process/__init__.py +0 -0
  189. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  190. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  191. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  192. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/__init__.py +0 -0
  193. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/embedding.py +0 -0
  194. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/get_llm.py +0 -0
  195. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/llm_logger.py +0 -0
  196. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/llm_tokens.py +0 -0
  197. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  198. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  199. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  200. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/struct_token.py +0 -0
  201. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/sy_langfuse.py +0 -0
  202. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  203. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  204. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/token_usage_es_service.py +0 -0
  205. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  206. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/llm/usage_token.py +0 -0
  207. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/__init__.py +0 -0
  208. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/async_sql_logger.py +0 -0
  209. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/logger_levels.py +0 -0
  210. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/logger_wrapper.py +0 -0
  211. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/process_logger.py +0 -0
  212. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/logging/sql_logger.py +0 -0
  213. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/mcp_server/__init__.py +0 -0
  214. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/mcp_server/server.py +0 -0
  215. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/__init__.py +0 -0
  216. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/context.py +0 -0
  217. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/cors.py +0 -0
  218. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/docs.py +0 -0
  219. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/exception.py +0 -0
  220. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/middleware.py +0 -0
  221. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/monitor_memory.py +0 -0
  222. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/mq.py +0 -0
  223. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/sandbox.py +0 -0
  224. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/timeout.py +0 -0
  225. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/token_tracking.py +0 -0
  226. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  227. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/middleware/traceid.py +0 -0
  228. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/__init__.py +0 -0
  229. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/base_http.py +0 -0
  230. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/log.py +0 -0
  231. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/mcp_server_config.py +0 -0
  232. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/mqmsg_model.py +0 -0
  233. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/mqsend_config.py +0 -0
  234. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/sandbox.py +0 -0
  235. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/sso_user.py +0 -0
  236. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/token_usage.py +0 -0
  237. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/token_usage_mysql.py +0 -0
  238. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/models/xxljob_handler_config.py +0 -0
  239. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/notice/__init__.py +0 -0
  240. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  241. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/notice/wecom_message.py +0 -0
  242. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  243. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  244. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  245. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  246. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  247. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  248. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  249. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  250. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sentry/__init__.py +0 -0
  251. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sentry/sy_sentry.py +0 -0
  252. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sse/__init__.py +0 -0
  253. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sse/event.py +0 -0
  254. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/sse/sse.py +0 -0
  255. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/__init__.py +0 -0
  256. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/example.py +0 -0
  257. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/example2.py +0 -0
  258. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/feign.py +0 -0
  259. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/feign_client.py +0 -0
  260. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_client_base.py +0 -0
  261. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  262. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  263. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_service.py +0 -0
  264. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  265. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  266. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/synacos/param.py +0 -0
  267. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/deep_agent_server.py +0 -0
  268. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  269. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_deep_agent.py +0 -0
  270. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  271. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_email.py +0 -0
  272. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_encoding_cache.py +0 -0
  273. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_mcp_server.py +0 -0
  274. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  275. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_mq.py +0 -0
  276. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_oa_login.py +0 -0
  277. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_real_summarization.py +0 -0
  278. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_summarization_config.py +0 -0
  279. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tests/test_summarization_real.py +0 -0
  280. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/__init__.py +0 -0
  281. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/async_utils.py +0 -0
  282. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/docs.py +0 -0
  283. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/env.py +0 -0
  284. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/merge_headers.py +0 -0
  285. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/snowflake.py +0 -0
  286. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/syemail.py +0 -0
  287. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/tools/timing.py +0 -0
  288. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/xxljob/__init__.py +0 -0
  289. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon/xxljob/xxljob_service.py +0 -0
  290. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  291. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  292. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  293. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  294. {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a26}/tests/test_sycli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.5a25
3
+ Version: 0.2.5a26
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.5a25"
3
+ version = "0.2.5a26"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -0,0 +1,114 @@
1
+ import asyncio
2
+ from contextlib import asynccontextmanager
3
+ from sqlalchemy.exc import OperationalError, InterfaceError, InternalError
4
+ from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
5
+ from sycommon.config.Config import SingletonMeta
6
+ from sycommon.database.async_database_service import AsyncDatabaseService
7
+ from sycommon.logging.kafka_log import SYLogger
8
+
9
+ # 连接级错误:连接已断,事务必定已丢失,重试安全
10
+ _CONNECTION_ERROR_CODES = {2006, 2013}
11
+ # 事务级错误:死锁、锁等待超时,由调用方决定是否重试
12
+ _RETRYABLE_TX_ERROR_CODES = {1205, 1213, 1206}
13
+
14
+
15
+ def _is_connection_error(exc: Exception) -> bool:
16
+ """判断是否为连接级错误(断开、宕机),可安全重试"""
17
+ if isinstance(exc, (OperationalError, InterfaceError)):
18
+ if exc.orig and hasattr(exc.orig, 'errno'):
19
+ return exc.orig.errno in _CONNECTION_ERROR_CODES
20
+ return False
21
+
22
+
23
+ def _is_retryable_tx_error(exc: Exception) -> bool:
24
+ """判断是否为可重试的事务级错误(死锁、锁超时)"""
25
+ if isinstance(exc, (OperationalError, InternalError)):
26
+ if exc.orig and hasattr(exc.orig, 'errno'):
27
+ return exc.orig.errno in _RETRYABLE_TX_ERROR_CODES
28
+ return False
29
+
30
+
31
+ class AsyncBaseDBService(metaclass=SingletonMeta):
32
+ """数据库操作基础服务类,封装异步会话管理功能"""
33
+
34
+ def __init__(self):
35
+ self.engine = AsyncDatabaseService.engine()
36
+ self.Session = async_sessionmaker(
37
+ bind=self.engine,
38
+ class_=AsyncSession,
39
+ expire_on_commit=False
40
+ )
41
+
42
+ @asynccontextmanager
43
+ async def session(self):
44
+ """
45
+ 异步数据库会话上下文管理器
46
+ 自动处理会话的创建、提交、回滚和关闭
47
+ """
48
+ async with self.Session() as session:
49
+ try:
50
+ yield session
51
+ await session.commit()
52
+ except Exception as e:
53
+ await session.rollback()
54
+ SYLogger.error(f"Database operation failed: {str(e)}")
55
+ raise
56
+
57
+ async def execute(self, fn, retry: int = 0):
58
+ """
59
+ 执行异步数据库操作,支持自动重试
60
+
61
+ 连接级错误(连接断开 2006/2013)始终自动重试1次。
62
+ 事务级错误(死锁 1213、锁超时 1205)按 retry 参数重试。
63
+
64
+ Args:
65
+ fn: 接收 session 参数的异步可调用对象,例如:
66
+ async def query(session): return (await session.execute(select(User))).scalars().all()
67
+ retry: 事务级错误最大重试次数,默认0不重试
68
+
69
+ Returns:
70
+ fn 的返回值
71
+
72
+ Usage:
73
+ result = await self.execute(
74
+ lambda session: session.execute(select(User)),
75
+ retry=3
76
+ )
77
+ """
78
+ attempt = 0
79
+ max_attempts = 1 + max(retry, 0)
80
+ connection_retried = False
81
+ last_exc = None
82
+
83
+ while True:
84
+ async with self.Session() as session:
85
+ try:
86
+ result = await fn(session)
87
+ await session.commit()
88
+ return result
89
+ except Exception as e:
90
+ await session.rollback()
91
+ last_exc = e
92
+
93
+ # 连接级错误:始终自动重试1次(不计入 max_attempts)
94
+ if _is_connection_error(e) and not connection_retried:
95
+ connection_retried = True
96
+ SYLogger.warning(
97
+ f"DB connection lost (errno={getattr(e.orig, 'errno', None)}), retrying..."
98
+ )
99
+ attempt += 1
100
+ continue
101
+
102
+ # 事务级错误:按 retry 参数重试
103
+ if retry > 0 and _is_retryable_tx_error(e) and attempt < max_attempts - 1:
104
+ attempt += 1
105
+ backoff = min(0.5 * (2 ** (attempt - 1)), 2.0)
106
+ SYLogger.warning(
107
+ f"DB retryable error (errno={getattr(e.orig, 'errno', None)}), "
108
+ f"attempt {attempt}/{max_attempts}, backoff {backoff}s"
109
+ )
110
+ await asyncio.sleep(backoff)
111
+ continue
112
+
113
+ SYLogger.error(f"Database operation failed: {str(e)}")
114
+ raise
@@ -0,0 +1,114 @@
1
+ import time
2
+ from contextlib import contextmanager
3
+ from sqlalchemy.orm import sessionmaker
4
+ from sqlalchemy.exc import OperationalError, InterfaceError, InternalError
5
+ from sycommon.config.Config import SingletonMeta
6
+ from sycommon.database.database_service import DatabaseService
7
+ from sycommon.logging.kafka_log import SYLogger
8
+
9
+ # 连接级错误:连接已断,事务必定已丢失,重试安全
10
+ _CONNECTION_ERROR_CODES = {2006, 2013}
11
+ # 事务级错误:死锁、锁等待超时,由调用方决定是否重试
12
+ _RETRYABLE_TX_ERROR_CODES = {1205, 1213, 1206}
13
+
14
+
15
+ def _is_connection_error(exc: Exception) -> bool:
16
+ """判断是否为连接级错误(断开、宕机),可安全重试"""
17
+ if isinstance(exc, (OperationalError, InterfaceError)):
18
+ if exc.orig and hasattr(exc.orig, 'errno'):
19
+ return exc.orig.errno in _CONNECTION_ERROR_CODES
20
+ return False
21
+
22
+
23
+ def _is_retryable_tx_error(exc: Exception) -> bool:
24
+ """判断是否为可重试的事务级错误(死锁、锁超时)"""
25
+ if isinstance(exc, (OperationalError, InternalError)):
26
+ if exc.orig and hasattr(exc.orig, 'errno'):
27
+ return exc.orig.errno in _RETRYABLE_TX_ERROR_CODES
28
+ return False
29
+
30
+
31
+ class BaseDBService(metaclass=SingletonMeta):
32
+ """数据库操作基础服务类,封装会话管理功能"""
33
+
34
+ def __init__(self):
35
+ self.engine = DatabaseService.engine()
36
+ self.Session = sessionmaker(bind=self.engine)
37
+
38
+ @contextmanager
39
+ def session(self):
40
+ """
41
+ 数据库会话上下文管理器
42
+ 自动处理会话的创建、提交、回滚和关闭
43
+ """
44
+ session = self.Session()
45
+ try:
46
+ yield session
47
+ session.commit()
48
+ except Exception as e:
49
+ session.rollback()
50
+ SYLogger.error(f"Database operation failed: {str(e)}")
51
+ raise
52
+ finally:
53
+ session.close()
54
+
55
+ def execute(self, fn, retry: int = 0):
56
+ """
57
+ 执行数据库操作,支持自动重试
58
+
59
+ 连接级错误(连接断开 2006/2013)始终自动重试1次。
60
+ 事务级错误(死锁 1213、锁超时 1205)按 retry 参数重试。
61
+
62
+ Args:
63
+ fn: 接收 session 参数的可调用对象,例如:
64
+ lambda session: session.query(User).all()
65
+ retry: 事务级错误最大重试次数,默认0不重试
66
+
67
+ Returns:
68
+ fn 的返回值
69
+
70
+ Usage:
71
+ result = self.execute(
72
+ lambda session: session.query(User).all(),
73
+ retry=3
74
+ )
75
+ """
76
+ attempt = 0
77
+ max_attempts = 1 + max(retry, 0)
78
+ connection_retried = False
79
+ last_exc = None
80
+
81
+ while True:
82
+ session = self.Session()
83
+ try:
84
+ result = fn(session)
85
+ session.commit()
86
+ return result
87
+ except Exception as e:
88
+ session.rollback()
89
+ last_exc = e
90
+
91
+ # 连接级错误:始终自动重试1次(不计入 max_attempts)
92
+ if _is_connection_error(e) and not connection_retried:
93
+ connection_retried = True
94
+ SYLogger.warning(
95
+ f"DB connection lost (errno={getattr(e.orig, 'errno', None)}), retrying..."
96
+ )
97
+ attempt += 1
98
+ continue
99
+
100
+ # 事务级错误:按 retry 参数重试
101
+ if retry > 0 and _is_retryable_tx_error(e) and attempt < max_attempts - 1:
102
+ attempt += 1
103
+ backoff = min(0.5 * (2 ** (attempt - 1)), 2.0)
104
+ SYLogger.warning(
105
+ f"DB retryable error (errno={getattr(e.orig, 'errno', None)}), "
106
+ f"attempt {attempt}/{max_attempts}, backoff {backoff}s"
107
+ )
108
+ time.sleep(backoff)
109
+ continue
110
+
111
+ SYLogger.error(f"Database operation failed: {str(e)}")
112
+ raise
113
+ finally:
114
+ session.close()
@@ -1,6 +1,7 @@
1
1
  import os
2
2
  import sys
3
3
  import json
4
+ import logging
4
5
  import socket
5
6
  import threading
6
7
  import traceback
@@ -176,6 +177,23 @@ class KafkaSink:
176
177
  pass
177
178
 
178
179
 
180
+ class _InterceptHandler(logging.Handler):
181
+ """将 stdlib logging 日志桥接到 Loguru,使 asyncio 等第三方库的日志进入 Kafka 管道"""
182
+
183
+ def emit(self, record: logging.LogRecord) -> None:
184
+ try:
185
+ level = logger.level(record.levelname).name
186
+ except ValueError:
187
+ level = record.levelno
188
+
189
+ frame, depth = logging.currentframe(), 2
190
+ while frame and frame.f_code.co_filename == logging.__file__:
191
+ frame = frame.f_back
192
+ depth += 1
193
+
194
+ logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())
195
+
196
+
179
197
  class KafkaLogger(metaclass=SingletonMeta):
180
198
  _sink_instance = None
181
199
 
@@ -206,8 +224,48 @@ class KafkaLogger(metaclass=SingletonMeta):
206
224
  diagnose=True
207
225
  )
208
226
 
227
+ # 桥接 stdlib logging → Loguru,捕获 asyncio 等第三方库的日志
228
+ intercept_handler = _InterceptHandler()
229
+ logging.root.handlers = [intercept_handler]
230
+ logging.root.setLevel(logging.WARNING)
231
+
209
232
  sys.excepthook = KafkaLogger._handle_exception
210
233
 
234
+ # 注册 asyncio 异常处理器,捕获未处理的 Task 异常
235
+ KafkaLogger._setup_asyncio_exception_handler()
236
+
237
+ @staticmethod
238
+ def _setup_asyncio_exception_handler():
239
+ """注册 asyncio 事件循环异常处理器,将未处理的 Task 异常导入 Kafka"""
240
+ try:
241
+ loop = asyncio.get_running_loop()
242
+ loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
243
+ except RuntimeError:
244
+ pass
245
+
246
+ @staticmethod
247
+ def _asyncio_exception_handler(loop, context):
248
+ """asyncio 未处理异常回调,通过 SYLogger 记录到 Kafka"""
249
+ message = context.get("exception", context.get("message", "Unknown asyncio error"))
250
+ exception = context.get("exception")
251
+
252
+ if exception:
253
+ tb_str = "".join(traceback.format_exception(
254
+ type(exception), exception, exception.__traceback__
255
+ ))
256
+ else:
257
+ tb_str = str(message)
258
+
259
+ trace_id = current_trace_id.get() or str(Snowflake.id)
260
+ error_msg = json.dumps({
261
+ "trace_id": trace_id,
262
+ "message": f"asyncio unhandled: {message}",
263
+ "level": "ERROR",
264
+ "detail": tb_str,
265
+ }, ensure_ascii=False)
266
+
267
+ logger.opt(exception=True).error(error_msg)
268
+
211
269
  @staticmethod
212
270
  def _handle_exception(exc_type, exc_value, exc_traceback):
213
271
  if issubclass(exc_type, KeyboardInterrupt):
@@ -33,7 +33,7 @@ class RabbitMQListenerConfig(BaseModel):
33
33
  auto_parse_json: bool = Field(True, description="是否自动解析JSON消息")
34
34
  prefetch_count: int = Field(2, description="同时消费并发数(控制MQ预取与handler并发上限)")
35
35
  max_priority: Optional[int] = Field(
36
- None, description="队列支持的最大优先级(对应 x-max-priority)")
36
+ 10, description="队列支持的最大优先级(对应 x-max-priority)")
37
37
 
38
38
  class Config:
39
39
  """模型配置"""
@@ -42,7 +42,7 @@ class RabbitMQClient:
42
42
  auto_delete: bool = False,
43
43
  auto_parse_json: bool = True,
44
44
  create_if_not_exists: bool = True,
45
- max_priority: Optional[int] = None,
45
+ max_priority: Optional[int] = 10,
46
46
  **kwargs,
47
47
  ):
48
48
  self.connection_pool = connection_pool
@@ -265,6 +265,14 @@ class Services(metaclass=SingletonMeta):
265
265
  sandbox_cleanup_task = None
266
266
 
267
267
  try:
268
+ # 注册 asyncio 异常处理器(需在事件循环运行后)
269
+ try:
270
+ from sycommon.logging.kafka_log import KafkaLogger
271
+ loop = asyncio.get_running_loop()
272
+ loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
273
+ except Exception as e:
274
+ logging.debug(f"注册 asyncio 异常处理器失败: {e}")
275
+
268
276
  # 1. 处理数据库服务
269
277
  if database_service:
270
278
  instance._pending_async_db_setup = []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.5a25
3
+ Version: 0.2.5a26
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -286,4 +286,5 @@ src/sycommon_python_lib.egg-info/dependency_links.txt
286
286
  src/sycommon_python_lib.egg-info/entry_points.txt
287
287
  src/sycommon_python_lib.egg-info/requires.txt
288
288
  src/sycommon_python_lib.egg-info/top_level.txt
289
+ tests/test_asyncio_logging.py
289
290
  tests/test_sycli.py
@@ -0,0 +1,116 @@
1
+ """
2
+ 验证 asyncio 错误能被 Kafka 日志管道捕获。
3
+
4
+ 覆盖两类场景:
5
+ 1. stdlib logging 输出的 asyncio 错误 (如 Unclosed client session)
6
+ 2. 未处理的 Task 异常 (Task exception was never retrieved)
7
+
8
+ 直接从已安装的包导入,绕过外部服务依赖。
9
+ """
10
+ import asyncio
11
+ import logging
12
+
13
+ import pytest
14
+ from loguru import logger
15
+
16
+
17
+ @pytest.fixture(autouse=True)
18
+ def _reset_loguru():
19
+ logger.remove()
20
+ yield
21
+ logger.remove()
22
+
23
+
24
+ def _setup_loguru_spy():
25
+ captured = []
26
+ logger.add(lambda msg: captured.append(str(msg)), level="DEBUG", format="{message}")
27
+ return captured
28
+
29
+
30
+ # 直接从已安装的 sycommon 包导入(需要 nacos 等服务可用)
31
+ # 这些类不依赖外部连接,可以直接实例化/使用
32
+ from sycommon.logging.kafka_log import _InterceptHandler, KafkaLogger
33
+
34
+
35
+ def test_intercept_handler_bridges_stdlib_logging():
36
+ """_InterceptHandler 能将 stdlib logging 的 ERROR 桥接到 loguru"""
37
+ captured = _setup_loguru_spy()
38
+
39
+ handler = _InterceptHandler()
40
+ old_handlers = logging.root.handlers[:]
41
+ old_level = logging.root.level
42
+ logging.root.handlers = [handler]
43
+ logging.root.setLevel(logging.WARNING)
44
+
45
+ logging.getLogger("asyncio").error("Unclosed client session")
46
+
47
+ logging.root.handlers = old_handlers
48
+ logging.root.setLevel(old_level)
49
+
50
+ assert any("Unclosed client session" in msg for msg in captured), \
51
+ f"InterceptHandler 未捕获 asyncio stdlib 日志, captured: {captured}"
52
+
53
+
54
+ def test_asyncio_exception_handler_captures_task_error():
55
+ """_asyncio_exception_handler 能捕获未处理的 Task 异常"""
56
+ captured = _setup_loguru_spy()
57
+
58
+ loop = asyncio.new_event_loop()
59
+ loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
60
+
61
+ async def _fail():
62
+ raise RuntimeError("boom from task")
63
+
64
+ loop.create_task(_fail())
65
+ loop.run_until_complete(asyncio.sleep(0.1))
66
+ loop.close()
67
+
68
+ assert any("asyncio unhandled" in msg and "boom from task" in msg for msg in captured), \
69
+ f"asyncio exception handler 未捕获 Task 异常, captured: {captured}"
70
+
71
+
72
+ def test_asyncio_exception_handler_captures_non_exception_context():
73
+ """_asyncio_exception_handler 处理无 exception 的 context"""
74
+ captured = _setup_loguru_spy()
75
+
76
+ loop = asyncio.new_event_loop()
77
+ loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
78
+ KafkaLogger._asyncio_exception_handler(loop, {"message": "something went wrong"})
79
+ loop.close()
80
+
81
+ assert any("asyncio unhandled" in msg and "something went wrong" in msg for msg in captured), \
82
+ f"asyncio exception handler 未处理纯 message context, captured: {captured}"
83
+
84
+
85
+ def test_full_pipeline_both_error_types():
86
+ """完整管道:stdlib 和 Task 两类 asyncio 错误都能进入 loguru"""
87
+ captured = _setup_loguru_spy()
88
+
89
+ handler = _InterceptHandler()
90
+ old_handlers = logging.root.handlers[:]
91
+ old_level = logging.root.level
92
+ logging.root.handlers = [handler]
93
+ logging.root.setLevel(logging.WARNING)
94
+
95
+ loop = asyncio.new_event_loop()
96
+ loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
97
+
98
+ async def _scenario():
99
+ # 场景1: stdlib logging 输出的 asyncio 错误
100
+ logging.getLogger("asyncio").error("Unclosed connector")
101
+ # 场景2: 未处理的 Task 异常
102
+ async def _fail():
103
+ raise AttributeError("'NoneType' object has no attribute 'get'")
104
+ loop.create_task(_fail())
105
+ await asyncio.sleep(0.1)
106
+
107
+ loop.run_until_complete(_scenario())
108
+ loop.close()
109
+
110
+ logging.root.handlers = old_handlers
111
+ logging.root.setLevel(old_level)
112
+
113
+ assert any("Unclosed connector" in msg for msg in captured), \
114
+ f"stdlib asyncio 错误未进入 loguru, captured: {captured}"
115
+ assert any("asyncio unhandled" in msg and "NoneType" in msg for msg in captured), \
116
+ f"Task 异常未进入 loguru, captured: {captured}"
@@ -1,36 +0,0 @@
1
- from contextlib import asynccontextmanager
2
- from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
3
- from sycommon.config.Config import SingletonMeta
4
- from sycommon.database.async_database_service import AsyncDatabaseService
5
- from sycommon.logging.kafka_log import SYLogger
6
-
7
-
8
- class AsyncBaseDBService(metaclass=SingletonMeta):
9
- """数据库操作基础服务类,封装异步会话管理功能"""
10
-
11
- def __init__(self):
12
- # 获取异步引擎 (假设 DatabaseService.engine() 返回的是 AsyncEngine)
13
- self.engine = AsyncDatabaseService.engine()
14
-
15
- # 创建异步 Session 工厂
16
- # class_=AsyncSession 是必须的,用于指定生成的是异步会话
17
- self.Session = async_sessionmaker(
18
- bind=self.engine,
19
- class_=AsyncSession,
20
- expire_on_commit=False
21
- )
22
-
23
- @asynccontextmanager
24
- async def session(self):
25
- """
26
- 异步数据库会话上下文管理器
27
- 自动处理会话的创建、提交、回滚和关闭
28
- """
29
- async with self.Session() as session:
30
- try:
31
- yield session
32
- await session.commit()
33
- except Exception as e:
34
- await session.rollback()
35
- SYLogger.error(f"Database operation failed: {str(e)}")
36
- raise
@@ -1,30 +0,0 @@
1
- from contextlib import contextmanager
2
- from sqlalchemy.orm import sessionmaker
3
- from sycommon.config.Config import SingletonMeta
4
- from sycommon.database.database_service import DatabaseService
5
- from sycommon.logging.kafka_log import SYLogger
6
-
7
-
8
- class BaseDBService(metaclass=SingletonMeta):
9
- """数据库操作基础服务类,封装会话管理功能"""
10
-
11
- def __init__(self):
12
- self.engine = DatabaseService.engine()
13
- self.Session = sessionmaker(bind=self.engine)
14
-
15
- @contextmanager
16
- def session(self):
17
- """
18
- 数据库会话上下文管理器
19
- 自动处理会话的创建、提交、回滚和关闭
20
- """
21
- session = self.Session()
22
- try:
23
- yield session
24
- session.commit()
25
- except Exception as e:
26
- session.rollback()
27
- SYLogger.error(f"Database operation failed: {str(e)}")
28
- raise
29
- finally:
30
- session.close()