sycommon-python-lib 0.2.10a17__tar.gz → 0.2.10a18__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 (417) hide show
  1. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/api.py +11 -5
  4. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/bridge.py +14 -5
  5. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/guard.py +7 -4
  6. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/monitor.py +25 -12
  7. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/queue.py +16 -8
  8. sycommon_python_lib-0.2.10a18/src/sycommon/alert/ratelimit.py +82 -0
  9. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/sdk.py +28 -6
  10. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/sdk_selfcheck.py +42 -20
  11. sycommon_python_lib-0.2.10a18/src/sycommon/pi/agent/loop.py +1013 -0
  12. sycommon_python_lib-0.2.10a18/src/sycommon/pi/agent/types.py +233 -0
  13. sycommon_python_lib-0.2.10a18/src/sycommon/pi/coding/__init__.py +5 -0
  14. sycommon_python_lib-0.2.10a18/src/sycommon/pi/coding/mcpserver.py +253 -0
  15. sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/json_parse.py +243 -0
  16. sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/message.py +349 -0
  17. sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/model.py +251 -0
  18. sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/retry.py +175 -0
  19. sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/transcript.py +404 -0
  20. sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/transform.py +185 -0
  21. sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/usage.py +105 -0
  22. sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/validation.py +308 -0
  23. sycommon_python_lib-0.2.10a18/src/sycommon/pi/mcp/__init__.py +6 -0
  24. sycommon_python_lib-0.2.10a18/src/sycommon/pi/mcp/client.py +467 -0
  25. sycommon_python_lib-0.2.10a18/src/sycommon/pi/mcp/jsonrpc.py +191 -0
  26. sycommon_python_lib-0.2.10a18/src/sycommon/pi/mcp/transport.py +668 -0
  27. sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/__init__.py +15 -0
  28. sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/anthropic_client.py +791 -0
  29. sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/bedrock_client.py +834 -0
  30. sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/faux.py +247 -0
  31. sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/google_client.py +619 -0
  32. sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/kimi_client.py +152 -0
  33. sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/openai_client.py +1190 -0
  34. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  35. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/SOURCES.txt +24 -0
  36. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/README.md +0 -0
  37. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/setup.cfg +0 -0
  38. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/__init__.py +0 -0
  39. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/cli.py +0 -0
  40. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/__init__.py +0 -0
  41. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/console.py +0 -0
  42. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/models.py +0 -0
  43. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/project.py +0 -0
  44. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/utils.py +0 -0
  45. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/__init__.py +0 -0
  46. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/README.md.tpl +0 -0
  47. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/__init__.py +0 -0
  48. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  49. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  53. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/api/query.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  58. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/app.py.tpl +0 -0
  59. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  60. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  61. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  62. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/db/service.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/model/parse.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/.env.tpl +0 -0
  69. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/.gitignore.tpl +0 -0
  70. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/Dockerfile.tpl +0 -0
  71. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/README.md.tpl +0 -0
  72. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/__init__.py +0 -0
  73. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/app.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/app.yaml.tpl +0 -0
  75. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  76. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/client/__init__.py.tpl +0 -0
  77. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/model/__init__.py.tpl +0 -0
  78. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/model/file_info.py.tpl +0 -0
  79. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/requirements.txt.tpl +0 -0
  80. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/README.md.tpl +0 -0
  81. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/__init__.py +0 -0
  82. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/app.py.tpl +0 -0
  83. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  84. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  85. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  86. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  87. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/README.md.tpl +0 -0
  88. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/__init__.py +0 -0
  89. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/api/__init__.py.tpl +0 -0
  90. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/api/echo.py.tpl +0 -0
  91. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  92. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  93. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/app.py.tpl +0 -0
  94. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/client/__init__.py.tpl +0 -0
  95. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/model/__init__.py.tpl +0 -0
  96. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  97. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/tools/mq.py.tpl +0 -0
  98. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/nexus/__init__.py +0 -0
  99. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/__init__.py +0 -0
  100. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/__main__.py +0 -0
  101. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/__init__.py +0 -0
  102. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/config.py +0 -0
  103. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/executor.py +0 -0
  104. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/registry.py +0 -0
  105. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/server.py +0 -0
  106. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/agents/__init__.py +0 -0
  107. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/agents/factory.py +0 -0
  108. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/agents/prompts.py +0 -0
  109. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/__init__.py +0 -0
  110. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/browser.py +0 -0
  111. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/__init__.py +0 -0
  112. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/console.py +0 -0
  113. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/dom.py +0 -0
  114. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/network.py +0 -0
  115. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  116. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/performance.py +0 -0
  117. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  118. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/client.py +0 -0
  119. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/protocol.py +0 -0
  120. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/repl.py +0 -0
  121. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cli.py +0 -0
  122. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/__init__.py +0 -0
  123. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/acp_cmd.py +0 -0
  124. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/acp_serve_cmd.py +0 -0
  125. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/cdp_cmd.py +0 -0
  126. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/chat_cmd.py +0 -0
  127. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/create_cmd.py +0 -0
  128. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/evaluate_cmd.py +0 -0
  129. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/init_cmd.py +0 -0
  130. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/memory_cmd.py +0 -0
  131. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/resume_cmd.py +0 -0
  132. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/rollback_cmd.py +0 -0
  133. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/run_cmd.py +0 -0
  134. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/__init__.py +0 -0
  135. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/backend.py +0 -0
  136. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/config.py +0 -0
  137. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/display.py +0 -0
  138. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/git_integration.py +0 -0
  139. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/llm.py +0 -0
  140. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/state.py +0 -0
  141. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/evaluate/__init__.py +0 -0
  142. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/evaluate/api_evaluator.py +0 -0
  143. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/__init__.py +0 -0
  144. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/compressor.py +0 -0
  145. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/full.py +0 -0
  146. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/hot.py +0 -0
  147. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/manager.py +0 -0
  148. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/warm.py +0 -0
  149. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/mode/__init__.py +0 -0
  150. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/mode/create.py +0 -0
  151. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/mode/optimize.py +0 -0
  152. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/models/__init__.py +0 -0
  153. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/models/config_models.py +0 -0
  154. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/__init__.py +0 -0
  155. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/baseline_tests.py +0 -0
  156. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/checkpoint.py +0 -0
  157. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/convergence.py +0 -0
  158. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/diagnosis.py +0 -0
  159. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/engine.py +0 -0
  160. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/environment.py +0 -0
  161. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/experience.py +0 -0
  162. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/harness_prompts.py +0 -0
  163. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/history.py +0 -0
  164. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/optimization_logger.py +0 -0
  165. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/pre_validation.py +0 -0
  166. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/reward.py +0 -0
  167. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/strategy_bandit.py +0 -0
  168. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/strategy_generator.py +0 -0
  169. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/strategy_prompts.py +0 -0
  170. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/simple_chat_agent.py +0 -0
  171. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/skills/__init__.py +0 -0
  172. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/__init__.py +0 -0
  173. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/__init__.py +0 -0
  174. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/__init__.py +0 -0
  175. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/client.py +0 -0
  176. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/fetch.py +0 -0
  177. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/server_adapter.py +0 -0
  178. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/ssh_init.py +0 -0
  179. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/tool.py +0 -0
  180. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/agent_manager.py +0 -0
  181. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/chat_events.py +0 -0
  182. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/deep_agent.py +0 -0
  183. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/mcp/__init__.py +0 -0
  184. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/mcp/models.py +0 -0
  185. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  186. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
  187. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  188. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  189. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  190. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/multi_agent_team.py +0 -0
  191. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/reasoning_content_patch.py +0 -0
  192. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/resume_compactor.py +0 -0
  193. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/__init__.py +0 -0
  194. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  195. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  196. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  197. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  198. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  199. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  200. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/session.py +0 -0
  201. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/skills_retry_patch.py +0 -0
  202. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/summarization_utils.py +0 -0
  203. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/__init__.py +0 -0
  204. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/alert_sdk.py +0 -0
  205. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/ao.py +0 -0
  206. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/env.py +0 -0
  207. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/__init__.py +0 -0
  208. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/ldap_service.py +0 -0
  209. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/oa_cache.py +0 -0
  210. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/oa_crypto.py +0 -0
  211. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/oa_service.py +0 -0
  212. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  213. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/ACPAgentConfig.py +0 -0
  214. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/Config.py +0 -0
  215. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/DatabaseConfig.py +0 -0
  216. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/EgressPolicyConfig.py +0 -0
  217. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  218. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/EmbeddingConfig.py +0 -0
  219. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/LLMConfig.py +0 -0
  220. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/LangfuseConfig.py +0 -0
  221. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/MQConfig.py +0 -0
  222. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/PgConfig.py +0 -0
  223. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/RedisConfig.py +0 -0
  224. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/RerankerConfig.py +0 -0
  225. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/SentryConfig.py +0 -0
  226. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/XxlJobConfig.py +0 -0
  227. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/__init__.py +0 -0
  228. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/config_change_notifier.py +0 -0
  229. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/async_base_db_service.py +0 -0
  230. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/async_database_service.py +0 -0
  231. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/base_db_service.py +0 -0
  232. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/database_service.py +0 -0
  233. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/elasticsearch_service.py +0 -0
  234. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  235. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/redis_service.py +0 -0
  236. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/resilient_pg_saver.py +0 -0
  237. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/token_usage_db_service.py +0 -0
  238. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/__init__.py +0 -0
  239. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/health_check.py +0 -0
  240. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/metrics.py +0 -0
  241. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/ping.py +0 -0
  242. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/readiness.py +0 -0
  243. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/heartbeat_process/__init__.py +0 -0
  244. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  245. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  246. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  247. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/__init__.py +0 -0
  248. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/embedding.py +0 -0
  249. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/get_llm.py +0 -0
  250. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/llm_logger.py +0 -0
  251. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/llm_tokens.py +0 -0
  252. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  253. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  254. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  255. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/struct_token.py +0 -0
  256. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/sy_langfuse.py +0 -0
  257. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  258. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  259. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/token_usage_es_service.py +0 -0
  260. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  261. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/token_utils.py +0 -0
  262. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/usage_token.py +0 -0
  263. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/__init__.py +0 -0
  264. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/async_sql_logger.py +0 -0
  265. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/bounded_kafka_sink.py +0 -0
  266. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/bounded_stdout_sink.py +0 -0
  267. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/kafka_log.py +0 -0
  268. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/log_masker.py +0 -0
  269. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/logger_levels.py +0 -0
  270. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/logger_wrapper.py +0 -0
  271. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/process_logger.py +0 -0
  272. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/sql_logger.py +0 -0
  273. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/mcp_server/__init__.py +0 -0
  274. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/mcp_server/server.py +0 -0
  275. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/__init__.py +0 -0
  276. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/context.py +0 -0
  277. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/cors.py +0 -0
  278. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/docs.py +0 -0
  279. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/egress_wall.py +0 -0
  280. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/exception.py +0 -0
  281. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/middleware.py +0 -0
  282. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/monitor_memory.py +0 -0
  283. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/mq.py +0 -0
  284. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/sandbox.py +0 -0
  285. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/sandbox_gateway.py +0 -0
  286. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/timeout.py +0 -0
  287. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/token_tracking.py +0 -0
  288. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  289. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/traceid.py +0 -0
  290. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/__init__.py +0 -0
  291. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/base_http.py +0 -0
  292. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/log.py +0 -0
  293. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/mcp_server_config.py +0 -0
  294. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/mqlistener_config.py +0 -0
  295. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/mqmsg_model.py +0 -0
  296. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/mqsend_config.py +0 -0
  297. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/sandbox.py +0 -0
  298. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/sso_user.py +0 -0
  299. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/token_usage.py +0 -0
  300. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/token_usage_mysql.py +0 -0
  301. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/xxljob_handler_config.py +0 -0
  302. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/notice/__init__.py +0 -0
  303. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  304. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/notice/wecom_message.py +0 -0
  305. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/delay_queue.py +0 -0
  306. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/mq_store.py +0 -0
  307. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  308. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbit_management_client.py +0 -0
  309. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  310. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  311. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  312. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  313. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  314. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  315. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  316. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  317. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/topic_registry.py +0 -0
  318. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sentry/__init__.py +0 -0
  319. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sentry/sy_sentry.py +0 -0
  320. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/services.py +0 -0
  321. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sse/__init__.py +0 -0
  322. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sse/event.py +0 -0
  323. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sse/sse.py +0 -0
  324. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/__init__.py +0 -0
  325. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/example.py +0 -0
  326. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/example2.py +0 -0
  327. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/feign.py +0 -0
  328. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/feign_client.py +0 -0
  329. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_client_base.py +0 -0
  330. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  331. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  332. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_service.py +0 -0
  333. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  334. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  335. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/param.py +0 -0
  336. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/deep_agent_server.py +0 -0
  337. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_backend_factory_compat.py +0 -0
  338. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consistent_hash.py +0 -0
  339. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consume_dedup.py +0 -0
  340. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_broker_health.py +0 -0
  341. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  342. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  343. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_recovery_fix.py +0 -0
  344. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
  345. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_db_keepalive.py +0 -0
  346. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_deep_agent.py +0 -0
  347. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  348. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_email.py +0 -0
  349. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_encoding_cache.py +0 -0
  350. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_env_tenant_helper.py +0 -0
  351. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
  352. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
  353. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_fault_injection_real.py +0 -0
  354. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_fix_verification.py +0 -0
  355. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
  356. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_integration_real_broker.py +0 -0
  357. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_mcp_server.py +0 -0
  358. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  359. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_mq.py +0 -0
  360. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_mq_config_driven.py +0 -0
  361. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_nacos_llm_real.py +0 -0
  362. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_oa_login.py +0 -0
  363. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  364. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
  365. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_real_summarization.py +0 -0
  366. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
  367. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_sandbox_glob_hardening.py +0 -0
  368. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_services_plugin_defaults.py +0 -0
  369. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_summarization_config.py +0 -0
  370. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_summarization_real.py +0 -0
  371. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  372. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
  373. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
  374. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_upgrade_verification.py +0 -0
  375. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/__init__.py +0 -0
  376. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/async_utils.py +0 -0
  377. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/docs.py +0 -0
  378. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/env.py +0 -0
  379. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/merge_headers.py +0 -0
  380. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/snowflake.py +0 -0
  381. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/sso_token.py +0 -0
  382. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/syemail.py +0 -0
  383. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/time_utils.py +0 -0
  384. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/timing.py +0 -0
  385. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/user_id.py +0 -0
  386. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/xxljob/__init__.py +0 -0
  387. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/xxljob/xxljob_service.py +0 -0
  388. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  389. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  390. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  391. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  392. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_acp_tool.py +0 -0
  393. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_asyncio_logging.py +0 -0
  394. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_config_change_notifier.py +0 -0
  395. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_frame_alignment.py +0 -0
  396. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_hotreload_snapshot.py +0 -0
  397. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_kafka_upie_fix.py +0 -0
  398. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_llm_apikey_contextvar.py +0 -0
  399. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_log_masker.py +0 -0
  400. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_print_capture.py +0 -0
  401. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_resilient_pg_saver.py +0 -0
  402. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sandbox_path_guard.py +0 -0
  403. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sensitive_guard.py +0 -0
  404. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_simple_chat_agent.py +0 -0
  405. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_skill_regex_upgrade.py +0 -0
  406. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_skill_write_guard.py +0 -0
  407. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sql_params_full.py +0 -0
  408. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_streaming_e2e.py +0 -0
  409. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_summary_echo_break_loop.py +0 -0
  410. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sycli.py +0 -0
  411. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sylogger_fixes.py +0 -0
  412. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sync_skills_to_sandbox.py +0 -0
  413. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_time_utils.py +0 -0
  414. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_traceid_omit_base64.py +0 -0
  415. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_unicode_decode_regress.py +0 -0
  416. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_upload_concurrency.py +0 -0
  417. {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_upload_e2e_http.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.10a17
3
+ Version: 0.2.10a18
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.10a17"
3
+ version = "0.2.10a18"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -10,6 +10,7 @@ from __future__ import annotations
10
10
  from typing import Optional
11
11
 
12
12
  from sycommon.alert.ao import AlertAo
13
+ from sycommon.alert.ratelimit import safe_invoke
13
14
  from sycommon.alert.sdk import alert
14
15
  from sycommon.alert.sdk_selfcheck import get_msg
15
16
 
@@ -21,11 +22,16 @@ LEVEL_FATAL = AlertAo.LEVEL_FATAL
21
22
 
22
23
  def _alert_inner(level: str, template_no: str, title: str, detail: str,
23
24
  err: Optional[Exception]) -> None:
24
- ao = AlertAo(level=level, templateNo=template_no or None,
25
- title=title or None, detail=detail or None)
26
- if err is not None:
27
- ao.errorMsg = get_msg(err)
28
- alert(ao)
25
+ # send_alert 已有 try/except 红线;此处 safe_invoke 为门面层的第二道闸
26
+ # (未来实现变化也不外漏)。
27
+ def _send() -> None:
28
+ ao = AlertAo(level=level, templateNo=template_no or None,
29
+ title=title or None, detail=detail or None)
30
+ if err is not None:
31
+ ao.errorMsg = get_msg(err)
32
+ alert(ao)
33
+
34
+ safe_invoke("alert_inner", _send)
29
35
 
30
36
 
31
37
  # ---------------- AlertSdk ----------------
@@ -11,6 +11,7 @@ import asyncio
11
11
  import re
12
12
 
13
13
  from sycommon.alert.monitor import register_db_stats, start_monitors
14
+ from sycommon.alert.ratelimit import safe_invoke
14
15
  from sycommon.logging.kafka_log import SYLogger
15
16
 
16
17
 
@@ -39,11 +40,19 @@ def _sqlalchemy_pool_stats() -> dict:
39
40
 
40
41
 
41
42
  async def init_alert_monitors() -> None:
42
- """启动默认监控(GC + 连接池饱和度)。engine 未初始化时跳过池监控。"""
43
- stats = _sqlalchemy_pool_stats()
44
- if stats:
45
- register_db_stats(_sqlalchemy_pool_stats)
46
- start_monitors()
43
+ """启动默认监控(GC + 连接池饱和度)。engine 未初始化时跳过池监控。
44
+
45
+ 隔离红线:接线过程任何异常只打日志,绝不带崩宿主启动。
46
+ (start_monitors 内部 asyncio.get_running_loop 要求在事件循环线程上
47
+ 调用 — 不能丢 executor,直接同步执行 + safe_invoke 兜底。)
48
+ """
49
+ def _wire() -> None:
50
+ stats = _sqlalchemy_pool_stats()
51
+ if stats:
52
+ register_db_stats(_sqlalchemy_pool_stats)
53
+ start_monitors()
54
+
55
+ safe_invoke("init_alert_monitors", _wire)
47
56
 
48
57
 
49
58
  __all__ = ["init_alert_monitors", "register_db_stats"]
@@ -17,6 +17,7 @@ from typing import Callable, TypeVar
17
17
  from sycommon.alert import api
18
18
  from sycommon.alert.api import (LEVEL_CRITICAL, LEVEL_FATAL, LEVEL_INFO,
19
19
  LEVEL_WARN)
20
+ from sycommon.alert.ratelimit import safe_invoke
20
21
 
21
22
  T = TypeVar('T')
22
23
 
@@ -25,7 +26,8 @@ def alert_on_exception(level: str, title: str, template_no: str = "") -> Callabl
25
26
  """方法异常告警装饰器(@XxxAlert 切面等价)。
26
27
 
27
28
  detail 为 "执行方法 模块.函数"(Java buildDetail 的
28
- "执行方法 %s:%s" — declaringClass:method)。
29
+ "执行方法 %s:%s" — declaringClass:method)。告警发送异常被 safe_invoke
30
+ 吞掉,raise 的是业务原始异常。
29
31
  """
30
32
 
31
33
  def deco(fn: Callable) -> Callable:
@@ -37,8 +39,8 @@ def alert_on_exception(level: str, title: str, template_no: str = "") -> Callabl
37
39
  try:
38
40
  return await fn(*args, **kwargs)
39
41
  except Exception as e: # noqa: BLE001
40
- api._alert_inner(level, template_no, title,
41
- f"执行方法 {where}", e)
42
+ safe_invoke("guard alert", lambda: api._alert_inner(
43
+ level, template_no, title, f"执行方法 {where}", e))
42
44
  raise
43
45
  return async_wrapper
44
46
 
@@ -47,7 +49,8 @@ def alert_on_exception(level: str, title: str, template_no: str = "") -> Callabl
47
49
  try:
48
50
  return fn(*args, **kwargs)
49
51
  except Exception as e: # noqa: BLE001
50
- api._alert_inner(level, template_no, title, f"执行方法 {where}", e)
52
+ safe_invoke("guard alert", lambda: api._alert_inner(
53
+ level, template_no, title, f"执行方法 {where}", e))
51
54
  raise
52
55
  return wrapper
53
56
 
@@ -57,14 +57,24 @@ def start_monitors() -> None:
57
57
  if _started:
58
58
  return
59
59
  _started = True
60
- loop = asyncio.get_running_loop()
61
- interval = get_int("sy-alert.gc-monitor.scan-interval-seconds", 10)
62
- SYLogger.info(f"GC监控开启, 扫描间隔为: {interval} 秒")
63
- loop.create_task(_gc_monitor_loop(interval))
64
- if _db_stats_func is not None:
65
- ds_interval = get_int("sy-alert.datasource.scan-interval-seconds", 10)
66
- SYLogger.info(f"数据库连接池饱和度监控启动, 每 {ds_interval} 秒执行一次")
67
- loop.create_task(_db_monitor_loop(ds_interval))
60
+ # 隔离红线:挂载阶段任何异常(取配置/建任务)只打日志,绝不带崩宿主启动。
61
+ try:
62
+ loop = asyncio.get_running_loop()
63
+ except RuntimeError:
64
+ SYLogger.error("[alert] 监控件挂载失败(无运行中事件循环,不影响服务)")
65
+ _started = False
66
+ return
67
+ try:
68
+ interval = get_int("sy-alert.gc-monitor.scan-interval-seconds", 10)
69
+ SYLogger.info(f"GC监控开启, 扫描间隔为: {interval} 秒")
70
+ loop.create_task(_gc_monitor_loop(interval))
71
+ if _db_stats_func is not None:
72
+ ds_interval = get_int("sy-alert.datasource.scan-interval-seconds", 10)
73
+ SYLogger.info(f"数据库连接池饱和度监控启动, 每 {ds_interval} 秒执行一次")
74
+ loop.create_task(_db_monitor_loop(ds_interval))
75
+ except Exception as e: # noqa: BLE001
76
+ SYLogger.error(f"[alert] 监控件挂载失败(不影响服务): {e}")
77
+ _started = False
68
78
 
69
79
 
70
80
  async def _gc_monitor_loop(interval_s: int) -> None:
@@ -138,10 +148,13 @@ async def _db_monitor_loop(interval_s: int) -> None:
138
148
  continue
139
149
  rate = in_use / max_open
140
150
  title = "数据库连接池"
141
- # Java PoolMonitor:detail = name+"饱和:"+desc;desc 形态
142
- # "活跃数: %d, 等待数: %d, 总数: %d, 最大数: %d, 名称: %s"(4 轮
143
- # 审核对齐 — 此前是自造的使用率文案)。max<=5 且无等待 → 忽略告警。
144
- desc = (f"活跃数: {in_use}, 等待数: 0, 总数: 0, "
151
+ # Java PoolMonitor:detail = name+"饱和:"+PoolStatus.desc();
152
+ # desc 按 totalSize 分流(PoolStatus.desc 字节码 4:ifeq):
153
+ # totalSize==0 用 4 字段 "活跃数: %d, 等待数: %d, 最大数: %d,
154
+ # 名称: %s",非 0 用 5 字段版。SQLAlchemy pool 无 total 暴露 →
155
+ # 4 字段版(此前误用 5 字段版硬填 0,按 jar 纠正)。
156
+ # max<=5 且无等待 → 忽略告警。
157
+ desc = (f"活跃数: {in_use}, 等待数: 0, "
145
158
  f"最大数: {max_open}, 名称: {title}")
146
159
  detail = title + "饱和:" + desc
147
160
  if max_open <= 5:
@@ -23,6 +23,7 @@ import time
23
23
  from typing import List
24
24
 
25
25
  from sycommon.alert.ao import AlertAo
26
+ from sycommon.alert.ratelimit import safe_invoke
26
27
  from sycommon.alert.sdk_selfcheck import self_check_alert
27
28
 
28
29
 
@@ -39,7 +40,11 @@ class BoundedAlarmQueue:
39
40
  self._cond = asyncio.Condition()
40
41
 
41
42
  async def offer(self, item: AlertAo) -> bool:
42
- """对齐 Java offer(T):返回是否入队成功。"""
43
+ """对齐 Java offer(T):返回是否入队成功。
44
+
45
+ 隔离红线:丢弃分支的自检发送经 safe_invoke — 自检通道异常绝不带崩
46
+ 入队调用方(业务线程)。
47
+ """
43
48
  async with self._cond:
44
49
  # 分支 1:队头(最低最旧)堆积超时自检(仅 is_check 且队列非空)。
45
50
  if self.is_check and self._items:
@@ -47,10 +52,10 @@ class BoundedAlarmQueue:
47
52
  if first is not None and first.time and first.time > 0:
48
53
  stuck_ms = int(time.time() * 1000) - first.time
49
54
  if stuck_ms > self.block_timeout_ms:
50
- self_check_alert(
55
+ safe_invoke("queue backlog self-check", lambda: self_check_alert(
51
56
  f"{self.name}-消息堆积",
52
57
  f"堆积时间={stuck_ms} ms 队列大小={len(self._items)}, "
53
- f"告警详情:{first.get_key_msg()}")
58
+ f"告警详情:{first.get_key_msg()}"))
54
59
 
55
60
  # 分支 2:未满直接有序插入。
56
61
  if len(self._items) < self.capacity:
@@ -59,19 +64,22 @@ class BoundedAlarmQueue:
59
64
  return True
60
65
 
61
66
  # 分支 3:满且新条优先级高于队头最低者 → 驱逐队头,入新。
62
- if item.compare_to(self._items[0]) > 0:
67
+ # 空列表守卫:capacity<=0 且队空时 items[0] 会 IndexError
68
+ # (九审探针;Go 侧 len>0 守卫同款 — Java 此处裸 first() 会
69
+ # NoSuchElementException,属 Java 自身缺陷,不复制)。
70
+ if self._items and item.compare_to(self._items[0]) > 0:
63
71
  evicted = self._items.pop(0)
64
72
  self._insert(item)
65
73
  if self.is_check:
66
- self_check_alert(
67
- f"{self.name}-队列已满,丢弃队列消息", evicted.get_key_msg())
74
+ safe_invoke("queue evict self-check", lambda: self_check_alert(
75
+ f"{self.name}-队列已满,丢弃队列消息", evicted.get_key_msg()))
68
76
  self._cond.notify()
69
77
  return True
70
78
 
71
79
  # 分支 4:满且新条不高于最低者 → 丢弃新消息。
72
80
  if self.is_check:
73
- self_check_alert(
74
- f"{self.name}-队列已满,丢弃新消息", item.get_key_msg())
81
+ safe_invoke("queue drop self-check", lambda: self_check_alert(
82
+ f"{self.name}-队列已满,丢弃新消息", item.get_key_msg()))
75
83
  return False
76
84
 
77
85
  def _insert(self, item: AlertAo) -> None:
@@ -0,0 +1,82 @@
1
+ """ratelimit.py — 发送侧限频(消费 pacing)+ 隔离红线 safe_invoke。
2
+
3
+ 对齐 Go infra/alert/ratelimit.go(Java SDK 无发送限频,两库同为补强):
4
+ - sy-alert.rate-limit.max-per-second:每秒最多发送的告警【条数】(默认 100),
5
+ <=0 = 不限(回到 Java 行为,逃生口);
6
+ - 令牌桶按条计数:一批 N 条消耗 N 个令牌;不足则阻塞【专用消费线程】
7
+ (阻塞不影响业务线程;停机 cancel 优先于限率等待);
8
+ - 桶容量(突发额度)= rate;rate<单批上限(100)时抬到 100 — 允许一次
9
+ 整批,防止 rate<batch 永等死锁。
10
+
11
+ 配置读取时点:start()(含懒启动)一次性读入;改配置需重启进程生效。
12
+ """
13
+ from __future__ import annotations
14
+
15
+ import asyncio
16
+ import threading
17
+ import time
18
+
19
+ from sycommon.logging.kafka_log import SYLogger
20
+
21
+ SEND_RATE_KEY = "sy-alert.rate-limit.max-per-second"
22
+ DEFAULT_SEND_RATE_PS = 100
23
+
24
+
25
+ class SendRateLimiter:
26
+ """单实例令牌桶(仅消费线程使用;加锁为测试与复用安全)。
27
+
28
+ burst(桶容量/突发额度)= rate;rate<单批上限(MAX_BATCH_SIZE=100)时抬到
29
+ 100 — 允许一次整批,防止 rate<batch 永等死锁(与 Go ratelimit.go 同款)。
30
+ """
31
+
32
+ def __init__(self, rate_per_sec: int, max_batch: int = 100):
33
+ self.rate = float(rate_per_sec)
34
+ self._max_batch = float(max_batch)
35
+ self._burst = self.rate
36
+ if 0 < self._burst < self._max_batch:
37
+ self._burst = self._max_batch
38
+ self._tokens = self._burst
39
+ self._last = time.monotonic()
40
+ self._lock = threading.Lock()
41
+
42
+ async def acquire(self, n: int) -> None:
43
+ """等到 n 个令牌才返回。不限速(n<=0)立即返回;CancelledError(停机)
44
+ 传播给消费循环既有 except 分支处理 — 不因限率卡停机。"""
45
+ if self.rate <= 0 or n <= 0:
46
+ return
47
+ while True:
48
+ with self._lock:
49
+ now = time.monotonic()
50
+ self._tokens = min(self._burst,
51
+ self._tokens + (now - self._last) * self.rate)
52
+ self._last = now
53
+ if self._tokens >= n:
54
+ self._tokens -= n
55
+ return
56
+ wait = (n - self._tokens) / self.rate
57
+ await asyncio.sleep(wait + 0.001) # +1ms 防浮点取整自旋
58
+
59
+
60
+ def send_rate_per_sec(read_cfg=None) -> int:
61
+ """读限频配置(env relaxed binding:SY_ALERT_RATE_LIMIT_MAX_PER_SECOND 自动命中)。
62
+
63
+ read_cfg:测试注入 (key, default) -> int;缺省走 alert.env.get_int。
64
+ """
65
+ if read_cfg is not None:
66
+ return read_cfg(SEND_RATE_KEY, DEFAULT_SEND_RATE_PS)
67
+ from sycommon.alert.env import get_int
68
+ return get_int(SEND_RATE_KEY, DEFAULT_SEND_RATE_PS)
69
+
70
+
71
+ def safe_invoke(what: str, fn) -> None:
72
+ """隔离红线:alert 模块自身的异常只转 error 日志,绝不传播到宿主调用栈
73
+ ("alert 自身报错不能引发集成项目报错")。"""
74
+ try:
75
+ fn()
76
+ except asyncio.CancelledError:
77
+ raise # 停机信号必须穿透,不能当 alert 自身错误吞掉
78
+ except Exception as e: # noqa: BLE001
79
+ try:
80
+ SYLogger.error(f"[alert] {what} failed (isolated, host unaffected): {e}")
81
+ except Exception: # noqa: BLE001 日志器本身也炸的终极兜底
82
+ pass
@@ -33,6 +33,7 @@ import aiohttp
33
33
  from sycommon.alert.ao import AlertAo, get_count_string
34
34
  from sycommon.alert.env import active_profile, app_name_of_sdk, get_property, local_ip
35
35
  from sycommon.alert.queue import BoundedAlarmQueue
36
+ from sycommon.alert.ratelimit import SendRateLimiter, safe_invoke, send_rate_per_sec
36
37
  from sycommon.alert.sdk_selfcheck import get_msg, self_check_alert_err
37
38
  from sycommon.logging.kafka_log import SYLogger
38
39
  from sycommon.tools.snowflake import Snowflake
@@ -73,6 +74,7 @@ class _InnerSDK:
73
74
  self._thread: Optional[threading.Thread] = None
74
75
  self._started = False
75
76
  self._lock = threading.Lock()
77
+ self.limiter: Optional[SendRateLimiter] = None # _ensure_started 时按配置建
76
78
 
77
79
  # ---------------- 专用线程生命周期 ----------------
78
80
 
@@ -90,6 +92,8 @@ class _InnerSDK:
90
92
  return self._loop, self.queue
91
93
  self.queue = BoundedAlarmQueue("告警SDK", QUEUE_CAPACITY,
92
94
  QUEUE_BLOCK_TIMEOUT_MS, is_check=True)
95
+ # 发送限频(消费线程专用 pacing;见 ratelimit.py)— 启动时一次读配置。
96
+ self.limiter = SendRateLimiter(send_rate_per_sec(), MAX_BATCH_SIZE)
93
97
  self._loop = asyncio.new_event_loop()
94
98
  self._thread = threading.Thread(
95
99
  target=self._run, args=(self._loop, self.queue),
@@ -111,14 +115,22 @@ class _InnerSDK:
111
115
  except Exception as e: # noqa: BLE001 线程兜底:消费线程永不带崩进程
112
116
  SYLogger.error(f"告警SDK消费线程异常退出: {e}")
113
117
  finally:
114
- self._started = False
118
+ # 代际判定:仅当 self._loop 仍是本代 loop 时才清 started —
119
+ # stop() join 超时后新一代可能已启动,旧线程收尾不得抹掉新代
120
+ # 标志(否则下一条告警再拉一代,孤儿线程空转)。
121
+ # 判定+写必须同锁,与 _ensure_started 的启动序列互斥。
122
+ with self._lock:
123
+ if self._loop is loop:
124
+ self._started = False
115
125
  if main_task is not None:
116
126
  # stop() 经 loop.stop() 退出 run_forever — cancel 后给
117
127
  # session.close 清理一次收尾机会(限时,不拖停机)。
118
128
  main_task.cancel()
119
129
  try:
120
130
  loop.run_until_complete(main_task)
121
- except (asyncio.CancelledError, Exception): # noqa: BLE001
131
+ except BaseException: # noqa: BLE001 收尾兜底:消费协程被
132
+ # cancel 后仍可能从 finally 段抛任意异常(含 session.close
133
+ # 的 CancelledError 重入);吞掉只为收尾,不影响任何语义。
122
134
  pass
123
135
  try:
124
136
  loop.close()
@@ -144,6 +156,10 @@ class _InnerSDK:
144
156
  continue
145
157
  if len(batch) == 1 and batch[0].traceId:
146
158
  trace_id = batch[0].traceId
159
+ # 发送限频(消费线程专用 pacing):一批 N 条消耗 N 个令牌,
160
+ # 不足则等待(停机 cancel 优先)。见 ratelimit.py。
161
+ if self.limiter is not None:
162
+ await self.limiter.acquire(len(batch))
147
163
  await self.send_to_alert_gateway(session, batch, trace_id, queue)
148
164
  except asyncio.CancelledError:
149
165
  SYLogger.error("应用系统停机,停止消费")
@@ -162,11 +178,12 @@ class _InnerSDK:
162
178
  offer 本身非阻塞(Java offer 同款),等待上限 OFFER_TIMEOUT_S。
163
179
  异常对齐 Java sendAlert 的 catch:warn("发送告警失败")+
164
180
  SelfCheck("告警SDK-发送系统告警失败",null,e)。
181
+ 隔离红线:任何 alert 内部异常到此为止,绝不传播到调用方栈。
165
182
  """
166
183
  if ao is None:
167
184
  return False
168
185
  try:
169
- self.init_alert_env(ao)
186
+ safe_invoke("init_alert_env", lambda: self.init_alert_env(ao))
170
187
  ao.calc_priority()
171
188
  loop, queue = self._ensure_started()
172
189
  fut = asyncio.run_coroutine_threadsafe(queue.offer(ao), loop)
@@ -181,7 +198,7 @@ class _InnerSDK:
181
198
  if ao is None:
182
199
  return False
183
200
  try:
184
- self.init_alert_env(ao)
201
+ safe_invoke("init_alert_env", lambda: self.init_alert_env(ao))
185
202
  ao.calc_priority()
186
203
  loop, queue = self._ensure_started()
187
204
  fut = asyncio.run_coroutine_threadsafe(queue.offer(ao), loop)
@@ -236,6 +253,11 @@ class _InnerSDK:
236
253
  ) as resp:
237
254
  text = await resp.text()
238
255
  SYLogger.info(f"send result status={resp.status}, body={text}")
256
+ # 非 2xx 不再静默当成功:抛错由消费循环对齐 Java 的
257
+ # SelfCheck+sleep 语义(此前网关 5xx 会被当"发送完成"吞掉)。
258
+ if not 200 <= resp.status < 300:
259
+ raise RuntimeError(
260
+ f"网关返回非 2xx: status={resp.status} body={text[:256]}")
239
261
  SYLogger.info(f"批量发送 {len(batch)} 条告警完成")
240
262
 
241
263
  async def stop(self) -> None:
@@ -297,10 +319,10 @@ async def stop() -> None:
297
319
 
298
320
 
299
321
  def alert(ao: AlertAo) -> None:
300
- """对齐 Java InnerSdk.alert(AlertAo)。"""
322
+ """对齐 Java InnerSdk.alert(AlertAo)。隔离红线:alert 内部异常不外漏。"""
301
323
  if ao is None:
302
324
  return
303
- _get_inner().send_alert(ao)
325
+ safe_invoke("alert", lambda: _get_inner().send_alert(ao))
304
326
 
305
327
 
306
328
  async def alert_async(ao: AlertAo) -> bool:
@@ -197,25 +197,42 @@ def self_check_alert(msg: str, detail: str = "") -> None:
197
197
 
198
198
 
199
199
  def self_check_alert_err(msg: str, detail: str, err: Optional[Exception]) -> None:
200
- """对齐 Java SelfCheckAlert.alert(String, String, Exception)。"""
201
- _self_check_inner(msg, detail, get_msg(err))
202
-
203
-
204
- def _self_check_inner(msg: str, detail: str, err_stack: str) -> None:
205
- if _UNITTEST:
206
- return # 单测静默:不自检、不外发(含 warn 日志噪音)
207
- SYLogger.warning(f"系统自检告警: {msg} {detail} {err_stack}")
208
- if not _limiter.try_acquire():
209
- SYLogger.warning(f"系统自检异常频率过高 不发送告警 {msg}")
210
- return
211
- trace_id = ""
200
+ """对齐 Java SelfCheckAlert.alert(String, String, Exception)。
201
+
202
+ markdown 异常信息段用 stack 前 256;日志第三参用 ex.getMessage()(仅消息)。
203
+ """
204
+ _self_check_inner(msg, detail, get_msg(err),
205
+ err_log=str(err) if err is not None else "")
206
+
207
+
208
+ def _self_check_inner(msg: str, detail: str, err_stack: str,
209
+ err_log: str = "") -> None:
210
+ # 隔离红线:自检通道自身任何异常到此为止(队列 offer/监控循环等业务栈
211
+ # 上的调用点绝不被自检带崩)。
212
212
  try:
213
- from sycommon.middleware.context import current_trace_id
214
- trace_id = current_trace_id.get() or ""
215
- except Exception:
216
- trace_id = SYLogger.get_trace_id() or ""
217
- _get_worker().submit({"msg": msg, "detail": detail, "err": err_stack,
218
- "trace_id": trace_id})
213
+ if _UNITTEST:
214
+ return # 单测静默:不自检、不外发(含 warn 日志噪音)
215
+ # Java alert 首行第三参 = ex.getMessage()(字节码 33),非 stack。
216
+ SYLogger.warning(f"系统自检告警: {msg} {detail} {err_log}")
217
+ if not _limiter.try_acquire():
218
+ SYLogger.warning(f"系统自检异常频率过高 不发送告警 {msg}")
219
+ return
220
+ trace_id = ""
221
+ try:
222
+ from sycommon.middleware.context import current_trace_id
223
+ trace_id = current_trace_id.get() or ""
224
+ except Exception:
225
+ trace_id = SYLogger.get_trace_id() or ""
226
+ # Java lambda 捕获 alert() 调用时刻(now)与 traceId 一起入队 —
227
+ # markdown 展示的是【检测时刻】而非实际 HTTP 发出时刻。
228
+ _get_worker().submit({"msg": msg, "detail": detail, "err": err_stack,
229
+ "trace_id": trace_id,
230
+ "sent_at": datetime.now()})
231
+ except Exception as e: # noqa: BLE001
232
+ try:
233
+ SYLogger.error(f"[alert] self-check failed (isolated, host unaffected): {e}")
234
+ except Exception: # noqa: BLE001
235
+ pass
219
236
 
220
237
 
221
238
  def _iso_local_date_time(dt: datetime) -> str:
@@ -239,15 +256,20 @@ def _iso_local_date_time(dt: datetime) -> str:
239
256
 
240
257
  def build_self_check_markdown(item: dict) -> str:
241
258
  """对齐 Java alertInner 的 markdown 组装。"""
242
- now = _iso_local_date_time(datetime.now())
259
+ # Java lambda 捕获 alert() 时刻的 now;入队项携带 sent_at(缺省回退当前)。
260
+ now = _iso_local_date_time(item.get('sent_at') or datetime.now())
243
261
  md = (
244
262
  f"`{_t256(item.get('msg'))}` \n>应用:{_t256(app_name_of_sdk())}"
245
263
  f" \n>IP:{_t256(local_ip())}"
246
264
  f" \n>环境:{_t256(active_profile())}"
247
265
  f" \n>时间:<font color=\"comment\">{now}</font>"
248
266
  f" \n>traceId:<font color=\"comment\">{_t256(item.get('trace_id'))}</font> \n"
249
- f">详情:{_t256(item.get('detail'))}\n"
250
267
  )
268
+ # Java 字节码 117-121:StringUtils.isNotEmpty(detail) 才追加详情段 —
269
+ # 空 detail 不产生 ">详情:" 行(此前无条件写,已按 jar 复核对齐)。
270
+ detail = item.get('detail')
271
+ if detail:
272
+ md += f">详情:{_t256(detail)}\n"
251
273
  if item.get('err'):
252
274
  md += f">异常信息:\n{_t256(item['err'])}"
253
275
  return md