sycommon-python-lib 0.2.10a11__tar.gz → 0.2.10a12__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 (374) hide show
  1. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/kafka_log.py +42 -5
  4. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/logger_levels.py +9 -3
  5. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  6. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
  7. sycommon_python_lib-0.2.10a12/tests/test_kafka_upie_fix.py +401 -0
  8. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/README.md +0 -0
  9. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/setup.cfg +0 -0
  10. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/__init__.py +0 -0
  11. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/cli.py +0 -0
  12. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/__init__.py +0 -0
  13. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/console.py +0 -0
  14. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/models.py +0 -0
  15. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/project.py +0 -0
  16. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/utils.py +0 -0
  17. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/__init__.py +0 -0
  18. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/README.md.tpl +0 -0
  19. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/__init__.py +0 -0
  20. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  21. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  22. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  23. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  24. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  25. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/api/query.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/app.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/db/service.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/model/parse.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/.env.tpl +0 -0
  41. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/.gitignore.tpl +0 -0
  42. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/Dockerfile.tpl +0 -0
  43. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/README.md.tpl +0 -0
  44. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/__init__.py +0 -0
  45. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/app.py.tpl +0 -0
  46. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/app.yaml.tpl +0 -0
  47. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  48. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/client/__init__.py.tpl +0 -0
  49. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/model/__init__.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/model/file_info.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/requirements.txt.tpl +0 -0
  52. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/README.md.tpl +0 -0
  53. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/__init__.py +0 -0
  54. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/app.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  58. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  59. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/README.md.tpl +0 -0
  60. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/__init__.py +0 -0
  61. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/api/__init__.py.tpl +0 -0
  62. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/api/echo.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/app.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/client/__init__.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/model/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/tools/mq.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/nexus/__init__.py +0 -0
  71. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/__init__.py +0 -0
  72. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/__main__.py +0 -0
  73. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/__init__.py +0 -0
  74. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/config.py +0 -0
  75. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/executor.py +0 -0
  76. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/registry.py +0 -0
  77. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/server.py +0 -0
  78. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/agents/__init__.py +0 -0
  79. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/agents/factory.py +0 -0
  80. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/agents/prompts.py +0 -0
  81. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/__init__.py +0 -0
  82. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/browser.py +0 -0
  83. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/__init__.py +0 -0
  84. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/console.py +0 -0
  85. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/dom.py +0 -0
  86. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/network.py +0 -0
  87. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  88. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/performance.py +0 -0
  89. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  90. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/client.py +0 -0
  91. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/protocol.py +0 -0
  92. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/repl.py +0 -0
  93. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cli.py +0 -0
  94. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/__init__.py +0 -0
  95. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/acp_cmd.py +0 -0
  96. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/acp_serve_cmd.py +0 -0
  97. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/cdp_cmd.py +0 -0
  98. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/chat_cmd.py +0 -0
  99. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/create_cmd.py +0 -0
  100. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/evaluate_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/init_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/memory_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/resume_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/rollback_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/run_cmd.py +0 -0
  106. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/__init__.py +0 -0
  107. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/backend.py +0 -0
  108. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/config.py +0 -0
  109. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/display.py +0 -0
  110. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/git_integration.py +0 -0
  111. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/llm.py +0 -0
  112. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/state.py +0 -0
  113. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/evaluate/__init__.py +0 -0
  114. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/evaluate/api_evaluator.py +0 -0
  115. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/__init__.py +0 -0
  116. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/compressor.py +0 -0
  117. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/full.py +0 -0
  118. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/hot.py +0 -0
  119. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/manager.py +0 -0
  120. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/warm.py +0 -0
  121. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/mode/__init__.py +0 -0
  122. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/mode/create.py +0 -0
  123. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/mode/optimize.py +0 -0
  124. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/models/__init__.py +0 -0
  125. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/models/config_models.py +0 -0
  126. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/__init__.py +0 -0
  127. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/baseline_tests.py +0 -0
  128. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/checkpoint.py +0 -0
  129. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/convergence.py +0 -0
  130. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/diagnosis.py +0 -0
  131. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/engine.py +0 -0
  132. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/environment.py +0 -0
  133. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/experience.py +0 -0
  134. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/harness_prompts.py +0 -0
  135. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/history.py +0 -0
  136. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/optimization_logger.py +0 -0
  137. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/pre_validation.py +0 -0
  138. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/reward.py +0 -0
  139. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/strategy_bandit.py +0 -0
  140. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/strategy_generator.py +0 -0
  141. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/strategy_prompts.py +0 -0
  142. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/simple_chat_agent.py +0 -0
  143. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/skills/__init__.py +0 -0
  144. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/__init__.py +0 -0
  145. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/__init__.py +0 -0
  146. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/__init__.py +0 -0
  147. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/client.py +0 -0
  148. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/fetch.py +0 -0
  149. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/server_adapter.py +0 -0
  150. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/ssh_init.py +0 -0
  151. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/tool.py +0 -0
  152. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/agent_manager.py +0 -0
  153. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/chat_events.py +0 -0
  154. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/deep_agent.py +0 -0
  155. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/mcp/__init__.py +0 -0
  156. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/mcp/models.py +0 -0
  157. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  158. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
  159. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  160. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  161. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  162. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/multi_agent_team.py +0 -0
  163. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/reasoning_content_patch.py +0 -0
  164. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/resume_compactor.py +0 -0
  165. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/__init__.py +0 -0
  166. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  167. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  168. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  169. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  170. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  171. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  172. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/session.py +0 -0
  173. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/skills_retry_patch.py +0 -0
  174. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/summarization_utils.py +0 -0
  175. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/__init__.py +0 -0
  176. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/ldap_service.py +0 -0
  177. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/oa_cache.py +0 -0
  178. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/oa_crypto.py +0 -0
  179. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/oa_service.py +0 -0
  180. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  181. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/ACPAgentConfig.py +0 -0
  182. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/Config.py +0 -0
  183. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/DatabaseConfig.py +0 -0
  184. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/EgressPolicyConfig.py +0 -0
  185. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  186. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/EmbeddingConfig.py +0 -0
  187. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/LLMConfig.py +0 -0
  188. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/LangfuseConfig.py +0 -0
  189. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/MQConfig.py +0 -0
  190. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/PgConfig.py +0 -0
  191. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/RedisConfig.py +0 -0
  192. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/RerankerConfig.py +0 -0
  193. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/SentryConfig.py +0 -0
  194. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/XxlJobConfig.py +0 -0
  195. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/__init__.py +0 -0
  196. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/config_change_notifier.py +0 -0
  197. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/async_base_db_service.py +0 -0
  198. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/async_database_service.py +0 -0
  199. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/base_db_service.py +0 -0
  200. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/database_service.py +0 -0
  201. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/elasticsearch_service.py +0 -0
  202. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  203. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/redis_service.py +0 -0
  204. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/resilient_pg_saver.py +0 -0
  205. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/token_usage_db_service.py +0 -0
  206. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/__init__.py +0 -0
  207. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/health_check.py +0 -0
  208. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/metrics.py +0 -0
  209. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/ping.py +0 -0
  210. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/readiness.py +0 -0
  211. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/heartbeat_process/__init__.py +0 -0
  212. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  213. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  214. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  215. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/__init__.py +0 -0
  216. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/embedding.py +0 -0
  217. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/get_llm.py +0 -0
  218. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/llm_logger.py +0 -0
  219. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/llm_tokens.py +0 -0
  220. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  221. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  222. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  223. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/struct_token.py +0 -0
  224. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/sy_langfuse.py +0 -0
  225. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  226. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  227. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/token_usage_es_service.py +0 -0
  228. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  229. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/token_utils.py +0 -0
  230. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/usage_token.py +0 -0
  231. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/__init__.py +0 -0
  232. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/async_sql_logger.py +0 -0
  233. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/bounded_kafka_sink.py +0 -0
  234. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/bounded_stdout_sink.py +0 -0
  235. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/log_masker.py +0 -0
  236. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/logger_wrapper.py +0 -0
  237. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/process_logger.py +0 -0
  238. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/sql_logger.py +0 -0
  239. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/mcp_server/__init__.py +0 -0
  240. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/mcp_server/server.py +0 -0
  241. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/__init__.py +0 -0
  242. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/context.py +0 -0
  243. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/cors.py +0 -0
  244. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/docs.py +0 -0
  245. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/egress_wall.py +0 -0
  246. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/exception.py +0 -0
  247. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/middleware.py +0 -0
  248. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/monitor_memory.py +0 -0
  249. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/mq.py +0 -0
  250. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/sandbox.py +0 -0
  251. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/sandbox_gateway.py +0 -0
  252. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/timeout.py +0 -0
  253. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/token_tracking.py +0 -0
  254. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  255. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/traceid.py +0 -0
  256. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/__init__.py +0 -0
  257. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/base_http.py +0 -0
  258. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/log.py +0 -0
  259. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/mcp_server_config.py +0 -0
  260. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/mqlistener_config.py +0 -0
  261. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/mqmsg_model.py +0 -0
  262. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/mqsend_config.py +0 -0
  263. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/sandbox.py +0 -0
  264. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/sso_user.py +0 -0
  265. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/token_usage.py +0 -0
  266. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/token_usage_mysql.py +0 -0
  267. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/xxljob_handler_config.py +0 -0
  268. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/notice/__init__.py +0 -0
  269. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  270. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/notice/wecom_message.py +0 -0
  271. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  272. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbit_management_client.py +0 -0
  273. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  274. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  275. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  276. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  277. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  278. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  279. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  280. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  281. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sentry/__init__.py +0 -0
  282. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sentry/sy_sentry.py +0 -0
  283. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/services.py +0 -0
  284. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sse/__init__.py +0 -0
  285. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sse/event.py +0 -0
  286. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sse/sse.py +0 -0
  287. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/__init__.py +0 -0
  288. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/example.py +0 -0
  289. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/example2.py +0 -0
  290. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/feign.py +0 -0
  291. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/feign_client.py +0 -0
  292. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_client_base.py +0 -0
  293. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  294. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  295. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_service.py +0 -0
  296. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  297. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  298. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/param.py +0 -0
  299. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/deep_agent_server.py +0 -0
  300. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_backend_factory_compat.py +0 -0
  301. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consistent_hash.py +0 -0
  302. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consume_dedup.py +0 -0
  303. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_broker_health.py +0 -0
  304. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  305. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  306. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_recovery_fix.py +0 -0
  307. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
  308. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_db_keepalive.py +0 -0
  309. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_deep_agent.py +0 -0
  310. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  311. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_email.py +0 -0
  312. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_encoding_cache.py +0 -0
  313. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_env_tenant_helper.py +0 -0
  314. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
  315. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
  316. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_fault_injection_real.py +0 -0
  317. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_fix_verification.py +0 -0
  318. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
  319. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_integration_real_broker.py +0 -0
  320. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_mcp_server.py +0 -0
  321. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  322. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_mq.py +0 -0
  323. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_mq_config_driven.py +0 -0
  324. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_nacos_llm_real.py +0 -0
  325. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_oa_login.py +0 -0
  326. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  327. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
  328. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_real_summarization.py +0 -0
  329. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
  330. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_sandbox_glob_hardening.py +0 -0
  331. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_services_plugin_defaults.py +0 -0
  332. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_summarization_config.py +0 -0
  333. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_summarization_real.py +0 -0
  334. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  335. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
  336. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
  337. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_upgrade_verification.py +0 -0
  338. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/__init__.py +0 -0
  339. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/async_utils.py +0 -0
  340. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/docs.py +0 -0
  341. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/env.py +0 -0
  342. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/merge_headers.py +0 -0
  343. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/snowflake.py +0 -0
  344. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/syemail.py +0 -0
  345. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/time_utils.py +0 -0
  346. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/timing.py +0 -0
  347. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/user_id.py +0 -0
  348. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/xxljob/__init__.py +0 -0
  349. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/xxljob/xxljob_service.py +0 -0
  350. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  351. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  352. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  353. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  354. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_acp_tool.py +0 -0
  355. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_asyncio_logging.py +0 -0
  356. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_config_change_notifier.py +0 -0
  357. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_hotreload_snapshot.py +0 -0
  358. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_llm_apikey_contextvar.py +0 -0
  359. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_log_masker.py +0 -0
  360. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_resilient_pg_saver.py +0 -0
  361. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sandbox_path_guard.py +0 -0
  362. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sensitive_guard.py +0 -0
  363. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_simple_chat_agent.py +0 -0
  364. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_skill_regex_upgrade.py +0 -0
  365. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_skill_write_guard.py +0 -0
  366. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_streaming_e2e.py +0 -0
  367. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_summary_echo_break_loop.py +0 -0
  368. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sycli.py +0 -0
  369. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sylogger_fixes.py +0 -0
  370. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sync_skills_to_sandbox.py +0 -0
  371. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_time_utils.py +0 -0
  372. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_traceid_omit_base64.py +0 -0
  373. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_upload_concurrency.py +0 -0
  374. {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/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.10a11
3
+ Version: 0.2.10a12
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.10a11"
3
+ version = "0.2.10a12"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -220,6 +220,20 @@ class KafkaSink:
220
220
  bootstrap_timeout_ms=10000:
221
221
  api_version 默认为 None,__init__ 会 eager bootstrap 拉取版本信息,
222
222
  broker 不可达时默认 30s 才超时。重建/惰性补建路径下 30s 太长,收到 10s。
223
+ enable_idempotence=False 的理由(2026-10-14 netsearch 生产事故复盘):
224
+ kafka-python 3.x 把 enable_idempotence 默认从 False 静默改为 True,
225
+ 日志 producer 被动卷进 PID/序列号/muted 整套幂等机制,触发两个库缺陷:
226
+ 1. retention 型 UnknownProducerIdError 活锁:broker 因 retention 清掉
227
+ producer state 后持续回 UPIE,客户端 KAFKA-5793 分支每次都重置序列号
228
+ 重试(该分支在 _can_retry 之前、不受 retries 约束),且
229
+ reset_sequence_for_partition 把 last_acked 一并弹掉(此后永远 -1),
230
+ 导致每次都判成 retention-based → 无限重试(现场转了 2 分钟)。
231
+ 2. muted.remove KeyError:幂等下 guarantee_message_order=True,批次被
232
+ 双重完成(本地 delivery timeout 一次 + broker 迟到响应一次)时
233
+ _dispatch_error 尾部裸 muted.remove(tp) 第二次抛 KeyError,直接炸
234
+ 出 "Uncaught error in kafka producer I/O thread"。
235
+ 日志管道不需要 exactly-once(可容忍重复/丢失),关掉幂等后 UPIE 走
236
+ 非重试分支直接 fail 进 errback(自愈信号),muted 集合彻底不用。
223
237
  """
224
238
  return KafkaProducer(
225
239
  bootstrap_servers=self._bootstrap_servers,
@@ -229,6 +243,7 @@ class KafkaSink:
229
243
  max_block_ms=5000,
230
244
  retries=5,
231
245
  request_timeout_ms=30000,
246
+ enable_idempotence=False,
232
247
  # delivery_timeout 由默认 120s 收紧到 45s:断网时批次最多积压 45s 就过期并触发
233
248
  # errback(自愈信号),而不是静默积压 2 分钟后才批量报错。约束:必须大于
234
249
  # linger_ms + request_timeout_ms(5 + 30000),45s 满足。
@@ -575,11 +590,16 @@ class KafkaSink:
575
590
  引用,故全程用 _rebuild_lock 保护,并置 _rebuild_in_progress 让 write()
576
591
  在此期间跳过惰性建 producer,避免重复构造。
577
592
 
578
- 关键:close() 内部会 join sender 线程(sender.join(timeout)),而本方法
593
+ 关键一:close() 内部会 join sender 线程(sender.join(timeout)),而本方法
579
594
  正是从 sender 线程的 errback 链调进来的——若在锁内直接 close 旧 producer
580
- 会触发“在自己线程里 join 自己”的死锁。所以 flush/close 必须放在锁外,
581
- 且把 _rebuild_in_progress 始终维持到新 producer 就位,避免 join 期间又有
582
- write() 介入。绝不在锁内做 close 这种长阻塞。"""
595
+ 会触发"在自己线程里 join 自己"的死锁。所以 flush/close 必须放在锁外。
596
+
597
+ 关键二(2026-10-14 生产事故复盘):只放锁外还不够——errback 同步执行
598
+ flush(5s)+close(10s) 会让 kafka 的 IO 线程卡 15s(现场 14.9s,selector
599
+ 慢任务看门狗连报 blocking the event loop),期间网络收发全部停摆。因此
600
+ 整个 关旧/建新 挪到独立 daemon 线程执行,errback 立即返回。_rebuild_
601
+ in_progress 维持到新 producer 就位,期间 write() 跳过(日志丢弃语义与
602
+ 原重建窗口一致)。"""
583
603
  with self._rebuild_lock:
584
604
  if self._rebuild_in_progress:
585
605
  return # 已有重建在进行,不重入
@@ -588,7 +608,17 @@ class KafkaSink:
588
608
  # 摘引用:write() 见到 _producer is None 且 _rebuild_in_progress 会跳过
589
609
  self._producer = None
590
610
  self._producer_obj = None
591
- # flush/close 放锁外:close() 会 join sender 线程,绝不能在 sender 线程里持锁做
611
+ # 关旧/建新全在独立线程:绝不阻塞 kafka IO 线程(errback 调用方)与 loguru 线程
612
+ threading.Thread(
613
+ target=self._rebuild_worker, args=(old,),
614
+ name="kafka-sink-rebuild", daemon=True).start()
615
+
616
+ def _rebuild_worker(self, old):
617
+ """重建工作体(独立 daemon 线程内执行)。
618
+
619
+ close() 会 join sender 线程,绝不能在 sender 线程里做;bootstrap 不可达
620
+ 会抛,吞掉,下次失败计数还会再触发。"""
621
+ # flush/close 放锁外且放本线程:join sender 线程最长 ~15s,别拖任何人
592
622
  if old is not None:
593
623
  try:
594
624
  old.flush(timeout=5)
@@ -735,6 +765,13 @@ class KafkaLogger(metaclass=SingletonMeta):
735
765
  intercept_handler = _InterceptHandler()
736
766
  logging.root.handlers = [intercept_handler]
737
767
  logging.root.setLevel(logging.WARNING)
768
+ # kafka-python 内部日志降噪兜底(正常由 services.setup_logger_levels()
769
+ # 在插件链更早处设置;此处幂等重申):故障期间库的 WARNING 风暴
770
+ # (UnknownProducerIdError 重试/selector 慢任务/批次过期)经 root 桥接
771
+ # 回灌 loguru 后又要发往同一故障 topic,形成放大回路(2026-10-14 复盘)。
772
+ for _name in ("kafka", "kafka.net", "kafka.net.selector",
773
+ "kafka.net.connection", "kafka.producer"):
774
+ logging.getLogger(_name).setLevel(logging.ERROR)
738
775
 
739
776
  sys.excepthook = KafkaLogger._handle_exception
740
777
  # sys.excepthook 只管主线程;工作线程的未捕获异常走 threading.excepthook
@@ -6,9 +6,15 @@ def setup_logger_levels():
6
6
  # Nacos 客户端:仅输出WARNING及以上(屏蔽INFO级的心跳/注册日志)
7
7
  logging.getLogger("nacos.client").setLevel(logging.WARNING)
8
8
 
9
- # Kafka Python客户端:屏蔽INFO级的连接/版本检测日志
10
- logging.getLogger("kafka.net.connection").setLevel(logging.WARNING)
11
- logging.getLogger("kafka.producer").setLevel(logging.WARNING)
9
+ # Kafka Python客户端:屏蔽INFO级的连接/版本检测日志。
10
+ # kafka.* 整族压到 ERROR(2026-10-14 生产事故复盘):故障期间库自身持续打
11
+ # WARNING——retention 型 UnknownProducerIdError 风暴(每秒多条)、selector
12
+ # 慢任务看门狗(kafka.net.selector)、批次过期——经 stdlib root 桥接回灌
13
+ # loguru 后又要发往同一个正在故障的 topic,形成放大回路。这些 WARNING 的
14
+ # 价值在 ERR 都有(sender 线程崩溃/批次最终失败),全部静音。
15
+ for _name in ("kafka", "kafka.net", "kafka.net.selector",
16
+ "kafka.net.connection", "kafka.producer"):
17
+ logging.getLogger(_name).setLevel(logging.ERROR)
12
18
 
13
19
  # Uvicorn/FastAPI:屏蔽启动/应用初始化的INFO日志(保留ERROR/WARNING)
14
20
  # logging.getLogger("uvicorn").setLevel(logging.WARNING)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.10a11
3
+ Version: 0.2.10a12
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -352,6 +352,7 @@ tests/test_acp_tool.py
352
352
  tests/test_asyncio_logging.py
353
353
  tests/test_config_change_notifier.py
354
354
  tests/test_hotreload_snapshot.py
355
+ tests/test_kafka_upie_fix.py
355
356
  tests/test_llm_apikey_contextvar.py
356
357
  tests/test_log_masker.py
357
358
  tests/test_resilient_pg_saver.py
@@ -0,0 +1,401 @@
1
+ """KafkaSink 幂等 producer 事故修复的模拟验证(无真实 broker)。
2
+
3
+ 复现 2026-10-14 netsearch 生产事故链,并验证三处修复:
4
+ 事故链(修复前):
5
+ a. retention 型 UnknownProducerIdError(UPIE)活锁:broker 持续回 UPIE,
6
+ KAFKA-5793 分支每次重置序列号重试,不受 retries 约束 → 无限循环
7
+ b. muted.remove KeyError:批次双重完成(本地过期 + broker 迟到响应)时
8
+ _dispatch_error 尾部裸 remove 第二次抛 KeyError → 炸 sender IO 线程
9
+ c. _rebuild_producer 在 IO 线程同步 flush+close → selector 看门狗报
10
+ "ran for 14.9s blocking the event loop"
11
+ 修复:
12
+ 1. enable_idempotence=False —— UPIE 走非重试分支直接 fail;muted 不再使用
13
+ 2. _rebuild_producer 挪独立 daemon 线程 —— errback 立即返回
14
+ 3. kafka.* logger 压 ERROR —— UPIE/慢任务 WARNING 风暴不再回灌放大
15
+
16
+ 验证手段:
17
+ - A/B 对照:同一套 Sender._dispatch_error 驱动逻辑,分别构造
18
+ 幂等(tm)/非幂等 producer 配置,数重试次数与 muted 状态
19
+ - 双重完成复现:同一 batch 先 timeout-fail 再 broker-err,
20
+ 断言幂等路径 KeyError、非幂等路径无异常
21
+ - 真实 KafkaSink._rebuild_producer:假 producer 的 flush 计 1.5s,
22
+ 断言 errback 调用线程不再被阻塞
23
+ - logger 级别:setup 后 kafka.* 均为 ERROR
24
+ """
25
+
26
+ import contextlib
27
+ import io
28
+ import logging
29
+ import sys
30
+ import threading
31
+ import time
32
+
33
+ sys.path.insert(0, "src")
34
+
35
+ from kafka.errors import UnknownProducerIdError # noqa: E402
36
+ from kafka.protocol.producer import ProduceResponse # noqa: E402
37
+ from kafka.producer.record_accumulator import RecordAccumulator # noqa: E402
38
+ from kafka.producer.sender import Sender # noqa: E402
39
+ from kafka.structs import TopicPartition # noqa: E402
40
+
41
+ from sycommon.logging.kafka_log import KafkaSink, KafkaLogger # noqa: E402
42
+ from sycommon.logging.logger_levels import setup_logger_levels # noqa: E402
43
+
44
+ PASS, FAIL = [], []
45
+
46
+
47
+ def check(name, cond, detail=""):
48
+ (PASS if cond else FAIL).append(name)
49
+ print(f" {'✅' if cond else '❌'} {name}" + (f" [{detail}]" if detail and not cond else ""))
50
+
51
+
52
+ _PartitionProduceResponse = \
53
+ ProduceResponse.TopicProduceResponse.PartitionProduceResponse
54
+ TP = TopicPartition("shengye-json-log", 2)
55
+
56
+
57
+ # ─── 测试基建 ────────────────────────────────────────────────────────────
58
+ class _NullClient:
59
+ """最小 client 替身:Sender 只用到 poll/in_flight_request_count 等。"""
60
+
61
+ class _Cluster:
62
+ pass
63
+
64
+ cluster = _Cluster()
65
+
66
+ def poll(self, timeout_ms=0):
67
+ return None
68
+
69
+ def in_flight_request_count(self):
70
+ return 0
71
+
72
+ def is_ready(self, node):
73
+ return False
74
+
75
+ def connection_delay(self, node):
76
+ return 1.0
77
+
78
+ def maybe_connect(self, node, wakeup=False):
79
+ pass
80
+
81
+ def close(self):
82
+ pass
83
+
84
+
85
+ def _make_batch(accum):
86
+ """向 accumulator 塞一条记录,返回 (batch, future)。"""
87
+ future, _, _, _ = accum.append(
88
+ TP, 0, None, b"{}", [], now=time.monotonic())
89
+ dq = accum._batches[TP]
90
+ return dq[0], future
91
+
92
+
93
+ def _make_sender(idempotent):
94
+ """构造 Sender + RecordAccumulator,模拟幂等/非幂等两种配置。"""
95
+ # 非幂等路径 transaction_manager 为 None(kafka.py 的真实行为:
96
+ # enable_idempotence=False 时不创建 TransactionManager)
97
+ tm = None if not idempotent else _make_tm()
98
+ accum = RecordAccumulator(
99
+ transaction_manager=tm,
100
+ message_version=2,
101
+ delivery_timeout_ms=45000,
102
+ request_timeout_ms=30000,
103
+ linger_ms=5,
104
+ batch_size=16384,
105
+ retry_backoff_ms=0, # 消除重试退避,让活锁循环紧凑
106
+ )
107
+ sender = Sender(
108
+ _NullClient(), None, accum,
109
+ transaction_manager=tm,
110
+ guarantee_message_order=idempotent, # kafka.py: 幂等 => True
111
+ retries=5,
112
+ acks=-1,
113
+ )
114
+ sender._metadata = _NullMetadata()
115
+ return sender, accum
116
+
117
+
118
+ def _make_tm():
119
+ """构造最小可用 TransactionManager(绕过需要 metadata 的 __init__)。"""
120
+ from kafka.producer.transaction_manager import (
121
+ NO_PRODUCER_EPOCH, ProducerIdAndEpoch, TransactionManager,
122
+ TransactionState)
123
+ tm = TransactionManager.__new__(TransactionManager)
124
+ import collections as _c
125
+ tm._sequence_numbers = _c.defaultdict(lambda: 0)
126
+ tm._last_acked_offset = {}
127
+ tm.producer_id_and_epoch = ProducerIdAndEpoch(-1, NO_PRODUCER_EPOCH)
128
+ tm._current_state = TransactionState.READY # 已拿到 PID 的运行态
129
+ tm._transaction_started = False
130
+ tm._partitions_in_transaction = set()
131
+ tm._new_partitions_in_transaction = set()
132
+ tm._pending_partitions_in_transaction = set()
133
+ tm._pending_requests_sort_id = 0
134
+ tm._in_flight_request_correlation_id = \
135
+ TransactionManager.NO_INFLIGHT_REQUEST_CORRELATION_ID
136
+ tm.transaction_timeout_ms = 60000
137
+ tm._last_error = None
138
+ tm.transactional_id = None
139
+ tm._pending_requests = []
140
+ tm.retry_backoff_ms = 0
141
+ import threading as _t
142
+ tm._lock = _t.Condition()
143
+ tm._api_version = (2, 8) # 支持 epoch bump,对齐现代 broker
144
+ return tm
145
+
146
+
147
+ class _NullMetadata:
148
+ """leader_for_partition 返回 1,让 ready() 认为分区可发。"""
149
+
150
+ def leader_for_partition(self, tp):
151
+ return 1
152
+
153
+ def partitions_for_broker(self, node_id):
154
+ return [TP]
155
+
156
+
157
+ def _upie_response(log_start=2337150726):
158
+ # 现场:log_start_offset=2337150726, last_acked=-1
159
+ return _PartitionProduceResponse(
160
+ index=TP.partition, error_code=59,
161
+ base_offset=-1, log_append_time_ms=-1,
162
+ log_start_offset=log_start, record_errors=[], error_message=None)
163
+
164
+
165
+ # ─── 1. UPIE 活锁 A/B 对照 ───────────────────────────────────────────────
166
+ def test_upie_livelock_ab():
167
+ print("\n[1] retention 型 UPIE:幂等=无限重试 vs 非幂等=立即失败")
168
+
169
+ # — 幂等(旧行为):每次 dispatch 都判 retention-based → reenqueue 无限转 —
170
+ sender, accum = _make_sender(idempotent=True)
171
+ tm = sender._transaction_manager
172
+ batch, fut = _make_batch(accum)
173
+ # 给 batch 打上与 tm 匹配的 producer state(drain 时由 accumulator 做,这里手动)
174
+ from kafka.producer.transaction_manager import ProducerIdAndEpoch
175
+ pid = ProducerIdAndEpoch(5000, 0)
176
+ tm.producer_id_and_epoch = pid
177
+ batch.records.set_producer_state(pid.producer_id, pid.epoch, 0, False)
178
+
179
+ resp = _upie_response()
180
+ retries = 0
181
+ t0 = time.monotonic()
182
+ while time.monotonic() - t0 < 1.0: # 最多转 1s
183
+ retries += 1
184
+ accum.muted.add(TP) # 模拟 drain:幂等路径会 muted.add
185
+ try:
186
+ sender._complete_batch(batch, resp) # broker 又回 UPIE
187
+ except KeyError:
188
+ # retention 分支 reenqueue 后走尾部 unmute,第二次 drain->complete
189
+ # 时 muted 已被弹掉 → 这正是现场的 KeyError。这里吞掉以继续跑
190
+ # 活锁计数(生产路径它直接炸 IO 线程)。
191
+ pass
192
+ if batch.final_state is not None:
193
+ break # 终于 fail 了
194
+ # 模拟 drain 重新赋序列号(活锁下每轮如此)
195
+ if not batch.in_retry():
196
+ break
197
+ tm.set_sequence_number(TP, 0)
198
+ if retries > 500:
199
+ break
200
+ check("幂等路径 1s 内仍在重试(复现活锁)",
201
+ retries > 5 and batch.final_state is None,
202
+ f"retries={retries} final={batch.final_state}")
203
+
204
+ # — 非幂等(新行为 enable_idempotence=False):UPIE 非重试 → 直接 fail —
205
+ sender2, accum2 = _make_sender(idempotent=False)
206
+ batch2, fut2 = _make_batch(accum2)
207
+ sender2._complete_batch(batch2, resp)
208
+ check("非幂等路径第一次 UPIE 即 fail",
209
+ batch2.final_state is not None and fut2.is_done and fut2.exception is not None,
210
+ f"final={batch2.final_state}")
211
+ check("errback 收到 UnknownProducerIdError(自愈信号可达)",
212
+ isinstance(fut2.exception, UnknownProducerIdError),
213
+ repr(fut2.exception))
214
+
215
+
216
+ # ─── 2. muted KeyError 双重完成复现 ──────────────────────────────────────
217
+ def test_double_completion_keyerror():
218
+ print("\n[2] 批次双重完成:幂等裸 muted.remove 抛 KeyError vs 非幂等无 muted")
219
+
220
+ # — 幂等:timeout 先 fail(unmute 一次)→ broker 迟到 UPIE 再走 error 尾部
221
+ # muted.remove(第二次)→ KeyError 炸 IO 线程 —
222
+ sender, accum = _make_sender(idempotent=True)
223
+ tm = sender._transaction_manager
224
+ from kafka.producer.transaction_manager import ProducerIdAndEpoch
225
+ pid = ProducerIdAndEpoch(5000, 0)
226
+ tm.producer_id_and_epoch = pid
227
+ batch, fut = _make_batch(accum)
228
+ batch.records.set_producer_state(pid.producer_id, pid.epoch, 0, False)
229
+
230
+ accum.muted.add(TP) # drain 时幂等路径会 add
231
+ sender._dispatch_error(batch, UnknownProducerIdError("x"), _upie_response())
232
+ # retention 分支 reenqueue 并走尾部 unmute
233
+ key_error_raised = False
234
+ try:
235
+ # 模拟本地 delivery timeout 先把同一批次 fail 掉(第二次完成)
236
+ sender._dispatch_error(batch, UnknownProducerIdError("timeout"),
237
+ partition_response=None)
238
+ except KeyError as e:
239
+ key_error_raised = True
240
+ detail = repr(e)
241
+ check("幂等路径双重完成复现 KeyError(库 bug 在案)", key_error_raised,
242
+ "" if key_error_raised else "未抛 KeyError")
243
+
244
+ # — 非幂等:guarantee_message_order=False → muted 分支根本不进 —
245
+ sender2, accum2 = _make_sender(idempotent=False)
246
+ batch2, fut2 = _make_batch(accum2)
247
+ sender2._dispatch_error(batch2, UnknownProducerIdError("x"), _upie_response())
248
+ no_exc = True
249
+ try:
250
+ sender2._dispatch_error(batch2, UnknownProducerIdError("timeout"),
251
+ partition_response=None)
252
+ except KeyError:
253
+ no_exc = False
254
+ check("非幂等路径双重完成无 KeyError", no_exc)
255
+ check("非幂等 muted 集合未使用", TP not in accum2.muted)
256
+
257
+
258
+ # ─── 3. 重建不阻塞调用线程 ───────────────────────────────────────────────
259
+ class _SlowFakeProducer:
260
+ """flush 故意睡 1.5s,模拟旧 producer close 慢(现场 5+10s)。"""
261
+
262
+ def __init__(self):
263
+ self.flushed = threading.Event()
264
+
265
+ def flush(self, timeout=None):
266
+ time.sleep(1.5)
267
+ self.flushed.set()
268
+
269
+ def close(self, timeout=None):
270
+ pass
271
+
272
+
273
+ class _FakeNacos:
274
+ def __init__(self, cfg):
275
+ pass
276
+ service_name = "test-svc"
277
+ share_configs = {"common.yml": {}}
278
+
279
+
280
+ def test_rebuild_off_io_thread():
281
+ print("\n[3] _rebuild_producer 不再阻塞调用(kafka IO)线程")
282
+ import sycommon.synacos.nacos_service as ns
283
+ ns.NacosService = _FakeNacos
284
+
285
+ sink = KafkaSink.__new__(KafkaSink) # 跳过 __init__(不建真 producer)
286
+ sink.service_id = "t"
287
+ sink._bootstrap_servers = "localhost:9092"
288
+ sink._closed = False
289
+ sink._enabled = True
290
+ sink._rebuild_lock = threading.Lock()
291
+ sink._consecutive_failures = 0
292
+ sink._last_rebuild_ts = 0.0
293
+ sink._rebuild_in_progress = False
294
+ old = _SlowFakeProducer()
295
+ sink._producer = old
296
+ sink._producer_obj = old
297
+ built = []
298
+ sink._build_producer = lambda: (built.append(1), _SlowFakeProducer())[1]
299
+
300
+ t0 = time.monotonic()
301
+ sink._rebuild_producer() # 旧实现这里会同步卡 1.5s+
302
+ elapsed_call = time.monotonic() - t0
303
+ check("调用线程立即返回(<0.5s,旧实现 ~1.5s)", elapsed_call < 0.5,
304
+ f"{elapsed_call:.3f}s")
305
+
306
+ done = threading.Event()
307
+
308
+ def _wait():
309
+ # 等新 producer 就位
310
+ for _ in range(100):
311
+ if sink._producer is not None and sink._producer is not old:
312
+ done.set()
313
+ return
314
+ time.sleep(0.05)
315
+ threading.Thread(target=_wait, daemon=True).start()
316
+ check("后台线程完成重建(flush+build)", done.wait(6.0),
317
+ "6s 内新 producer 未就位")
318
+ check("旧 producer flush 已在后台执行", old.flushed.wait(6.0))
319
+ check("重建后 _rebuild_in_progress 已复位", sink._rebuild_in_progress is False)
320
+ # 清理:等后台线程自然结束,避免 daemon 线程睡到测试尾
321
+ time.sleep(0.1)
322
+
323
+
324
+ # ─── 4. kafka.* 日志静音 ──────────────────────────────────────────────────
325
+ def test_kafka_loggers_muted():
326
+ print("\n[4] kafka.* 内部日志压到 ERROR(切断回灌放大)")
327
+ setup_logger_levels()
328
+ ok = True
329
+ names = ["kafka", "kafka.net", "kafka.net.selector",
330
+ "kafka.net.connection", "kafka.producer"]
331
+ for n in names:
332
+ lv = logging.getLogger(n).level
333
+ if lv != logging.ERROR:
334
+ ok = False
335
+ print(f" {n} -> {logging.getLevelName(lv)}")
336
+ check("logger_levels.setup_logger_levels 后全部 ERROR", ok)
337
+
338
+ # setup_logger 里也重申(防止 services 未走 setup_logger_levels 的接入方)
339
+ buf = io.StringIO()
340
+ with contextlib.redirect_stdout(buf):
341
+ pass
342
+ for n in names:
343
+ logging.getLogger(n).setLevel(logging.WARNING) # 先破坏
344
+ from sycommon.logging.kafka_log import KafkaSink as _KS
345
+ # setup_logger 真实跑一遍(_build_producer 打桩 + Config 单例打桩:
346
+ # setup 会经 _global_log_enabled/_safe_namespace_id 读 Config().config,
347
+ # 本地无 app.yaml,注入最小假配置)
348
+ orig_bp = _KS._build_producer
349
+ _KS._build_producer = lambda self: _SlowFakeProducer()
350
+ from sycommon.config.Config import Config as _Cfg
351
+ from sycommon.config.Config import SingletonMeta as _SM
352
+ class _FakeCfg:
353
+ config = {"common.yml": {}}
354
+ MaxBytes = 0
355
+ Timeout = 0
356
+ MaxRetries = 0
357
+
358
+ def get_namespace_id(self, _):
359
+ return ""
360
+
361
+ _orig_instances = dict(_SM._instances)
362
+ _SM._instances[_Cfg] = _FakeCfg()
363
+ try:
364
+ import sycommon.synacos.nacos_service as ns2
365
+ ns2.NacosService = _FakeNacos
366
+ with contextlib.redirect_stdout(io.StringIO()):
367
+ KafkaLogger.setup_logger({})
368
+ ok2 = all(logging.getLogger(n).level == logging.ERROR for n in names)
369
+ check("KafkaLogger.setup_logger 后全部 ERROR", ok2)
370
+ finally:
371
+ _SM._instances.clear()
372
+ _SM._instances.update(_orig_instances)
373
+ _KS._build_producer = orig_bp
374
+ with contextlib.suppress(Exception):
375
+ with contextlib.redirect_stdout(io.StringIO()):
376
+ KafkaLogger.close()
377
+
378
+
379
+ # ─── 5. producer 配置回归:enable_idempotence=False 真正生效 ─────────────
380
+ def test_producer_config():
381
+ print("\n[5] _build_producer 配置断言(构造参数级,不连 broker)")
382
+ src = io.StringIO()
383
+ import inspect
384
+ from sycommon.logging import kafka_log as kl
385
+ code = inspect.getsource(kl.KafkaSink._build_producer)
386
+ check("显式传入 enable_idempotence=False",
387
+ "enable_idempotence=False" in code)
388
+ check("delivery_timeout_ms=45000 仍在", "delivery_timeout_ms=45000" in code)
389
+
390
+
391
+ if __name__ == "__main__":
392
+ test_upie_livelock_ab()
393
+ test_double_completion_keyerror()
394
+ test_rebuild_off_io_thread()
395
+ test_kafka_loggers_muted()
396
+ test_producer_config()
397
+ print(f"\n{'='*50}\n通过 {len(PASS)} / 失败 {len(FAIL)}")
398
+ if FAIL:
399
+ print("失败项:", FAIL)
400
+ sys.exit(1)
401
+ print("全部通过 ✅")