sycommon-python-lib 0.2.6a2__tar.gz → 0.2.6a3__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 (298) hide show
  1. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/pyproject.toml +1 -1
  3. sycommon_python_lib-0.2.6a3/src/sycommon/agent/sandbox/consistent_hash.py +175 -0
  4. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/sandbox/http_sandbox_backend.py +3 -6
  5. sycommon_python_lib-0.2.6a3/src/sycommon/tests/test_consistent_hash.py +279 -0
  6. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  7. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon_python_lib.egg-info/SOURCES.txt +2 -0
  8. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/README.md +0 -0
  9. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/setup.cfg +0 -0
  10. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/__init__.py +0 -0
  11. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/cli.py +0 -0
  12. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/core/__init__.py +0 -0
  13. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/core/console.py +0 -0
  14. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/core/models.py +0 -0
  15. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/core/project.py +0 -0
  16. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/core/utils.py +0 -0
  17. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/__init__.py +0 -0
  18. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/README.md.tpl +0 -0
  19. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/__init__.py +0 -0
  20. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  21. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  22. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  23. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  24. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  25. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/api/query.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/app.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/db/service.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/model/parse.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/.env.tpl +0 -0
  41. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/.gitignore.tpl +0 -0
  42. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/Dockerfile.tpl +0 -0
  43. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/README.md.tpl +0 -0
  44. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/__init__.py +0 -0
  45. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/app.py.tpl +0 -0
  46. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/app.yaml.tpl +0 -0
  47. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  48. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/client/__init__.py.tpl +0 -0
  49. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/model/__init__.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/model/file_info.py.tpl +0 -0
  51. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/base/requirements.txt.tpl +0 -0
  52. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/cli/README.md.tpl +0 -0
  53. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/cli/__init__.py +0 -0
  54. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/cli/app.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  56. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  57. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  58. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  59. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/README.md.tpl +0 -0
  60. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/__init__.py +0 -0
  61. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/api/__init__.py.tpl +0 -0
  62. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/api/echo.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  64. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  65. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/app.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/client/__init__.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/model/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/command/templates/web/tools/mq.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/nexus/__init__.py +0 -0
  71. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/__init__.py +0 -0
  72. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/__main__.py +0 -0
  73. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/agents/__init__.py +0 -0
  74. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/agents/factory.py +0 -0
  75. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/agents/prompts.py +0 -0
  76. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/__init__.py +0 -0
  77. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/browser.py +0 -0
  78. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/capabilities/__init__.py +0 -0
  79. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/capabilities/console.py +0 -0
  80. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/capabilities/dom.py +0 -0
  81. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/capabilities/network.py +0 -0
  82. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  83. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/capabilities/performance.py +0 -0
  84. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  85. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/client.py +0 -0
  86. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/protocol.py +0 -0
  87. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cdp/repl.py +0 -0
  88. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/cli.py +0 -0
  89. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/__init__.py +0 -0
  90. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/cdp_cmd.py +0 -0
  91. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/chat_cmd.py +0 -0
  92. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/create_cmd.py +0 -0
  93. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/evaluate_cmd.py +0 -0
  94. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/init_cmd.py +0 -0
  95. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/memory_cmd.py +0 -0
  96. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/resume_cmd.py +0 -0
  97. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/rollback_cmd.py +0 -0
  98. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/commands/run_cmd.py +0 -0
  99. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/core/__init__.py +0 -0
  100. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/core/backend.py +0 -0
  101. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/core/config.py +0 -0
  102. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/core/display.py +0 -0
  103. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/core/git_integration.py +0 -0
  104. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/core/llm.py +0 -0
  105. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/core/state.py +0 -0
  106. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/evaluate/__init__.py +0 -0
  107. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/evaluate/api_evaluator.py +0 -0
  108. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/memory/__init__.py +0 -0
  109. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/memory/compressor.py +0 -0
  110. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/memory/full.py +0 -0
  111. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/memory/hot.py +0 -0
  112. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/memory/manager.py +0 -0
  113. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/memory/warm.py +0 -0
  114. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/mode/__init__.py +0 -0
  115. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/mode/create.py +0 -0
  116. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/mode/optimize.py +0 -0
  117. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/models/__init__.py +0 -0
  118. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/models/config_models.py +0 -0
  119. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/__init__.py +0 -0
  120. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/baseline_tests.py +0 -0
  121. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/checkpoint.py +0 -0
  122. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/convergence.py +0 -0
  123. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/diagnosis.py +0 -0
  124. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/engine.py +0 -0
  125. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/environment.py +0 -0
  126. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/experience.py +0 -0
  127. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/harness_prompts.py +0 -0
  128. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/history.py +0 -0
  129. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/optimization_logger.py +0 -0
  130. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/pre_validation.py +0 -0
  131. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/reward.py +0 -0
  132. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/strategy_bandit.py +0 -0
  133. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/strategy_generator.py +0 -0
  134. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/rl/strategy_prompts.py +0 -0
  135. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycli/skills/__init__.py +0 -0
  136. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/__init__.py +0 -0
  137. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/__init__.py +0 -0
  138. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/agent_manager.py +0 -0
  139. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/chat_events.py +0 -0
  140. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/deep_agent.py +0 -0
  141. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/mcp/__init__.py +0 -0
  142. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/mcp/models.py +0 -0
  143. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  144. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/multi_agent_team.py +0 -0
  145. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/sandbox/__init__.py +0 -0
  146. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  147. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  148. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  149. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  150. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/sandbox/session.py +0 -0
  151. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/agent/summarization_utils.py +0 -0
  152. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/auth/__init__.py +0 -0
  153. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/auth/ldap_service.py +0 -0
  154. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/auth/oa_cache.py +0 -0
  155. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/auth/oa_crypto.py +0 -0
  156. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/auth/oa_service.py +0 -0
  157. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  158. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/Config.py +0 -0
  159. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/DatabaseConfig.py +0 -0
  160. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  161. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/EmbeddingConfig.py +0 -0
  162. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/LLMConfig.py +0 -0
  163. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/LangfuseConfig.py +0 -0
  164. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/MQConfig.py +0 -0
  165. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/PgConfig.py +0 -0
  166. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/RedisConfig.py +0 -0
  167. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/RerankerConfig.py +0 -0
  168. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/SentryConfig.py +0 -0
  169. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/XxlJobConfig.py +0 -0
  170. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/config/__init__.py +0 -0
  171. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/database/async_base_db_service.py +0 -0
  172. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/database/async_database_service.py +0 -0
  173. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/database/base_db_service.py +0 -0
  174. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/database/database_service.py +0 -0
  175. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/database/elasticsearch_service.py +0 -0
  176. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  177. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/database/redis_service.py +0 -0
  178. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/database/token_usage_db_service.py +0 -0
  179. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/health/__init__.py +0 -0
  180. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/health/health_check.py +0 -0
  181. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/health/metrics.py +0 -0
  182. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/health/ping.py +0 -0
  183. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/heartbeat_process/__init__.py +0 -0
  184. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  185. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  186. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  187. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/__init__.py +0 -0
  188. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/embedding.py +0 -0
  189. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/get_llm.py +0 -0
  190. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/llm_logger.py +0 -0
  191. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/llm_tokens.py +0 -0
  192. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  193. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  194. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  195. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/struct_token.py +0 -0
  196. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/sy_langfuse.py +0 -0
  197. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  198. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  199. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/token_usage_es_service.py +0 -0
  200. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  201. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/token_utils.py +0 -0
  202. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/llm/usage_token.py +0 -0
  203. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/logging/__init__.py +0 -0
  204. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/logging/async_sql_logger.py +0 -0
  205. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/logging/kafka_log.py +0 -0
  206. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/logging/logger_levels.py +0 -0
  207. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/logging/logger_wrapper.py +0 -0
  208. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/logging/process_logger.py +0 -0
  209. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/logging/sql_logger.py +0 -0
  210. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/mcp_server/__init__.py +0 -0
  211. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/mcp_server/server.py +0 -0
  212. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/__init__.py +0 -0
  213. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/context.py +0 -0
  214. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/cors.py +0 -0
  215. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/docs.py +0 -0
  216. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/exception.py +0 -0
  217. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/middleware.py +0 -0
  218. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/monitor_memory.py +0 -0
  219. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/mq.py +0 -0
  220. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/sandbox.py +0 -0
  221. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/timeout.py +0 -0
  222. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/token_tracking.py +0 -0
  223. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  224. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/middleware/traceid.py +0 -0
  225. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/__init__.py +0 -0
  226. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/base_http.py +0 -0
  227. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/log.py +0 -0
  228. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/mcp_server_config.py +0 -0
  229. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/mqlistener_config.py +0 -0
  230. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/mqmsg_model.py +0 -0
  231. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/mqsend_config.py +0 -0
  232. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/sandbox.py +0 -0
  233. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/sso_user.py +0 -0
  234. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/token_usage.py +0 -0
  235. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/token_usage_mysql.py +0 -0
  236. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/models/xxljob_handler_config.py +0 -0
  237. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/notice/__init__.py +0 -0
  238. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  239. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/notice/wecom_message.py +0 -0
  240. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  241. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  242. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  243. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  244. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  245. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  246. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  247. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  248. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  249. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/sentry/__init__.py +0 -0
  250. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/sentry/sy_sentry.py +0 -0
  251. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/services.py +0 -0
  252. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/sse/__init__.py +0 -0
  253. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/sse/event.py +0 -0
  254. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/sse/sse.py +0 -0
  255. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/__init__.py +0 -0
  256. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/example.py +0 -0
  257. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/example2.py +0 -0
  258. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/feign.py +0 -0
  259. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/feign_client.py +0 -0
  260. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/nacos_client_base.py +0 -0
  261. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  262. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  263. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/nacos_service.py +0 -0
  264. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  265. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  266. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/synacos/param.py +0 -0
  267. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/deep_agent_server.py +0 -0
  268. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  269. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  270. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_deep_agent.py +0 -0
  271. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  272. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_email.py +0 -0
  273. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_encoding_cache.py +0 -0
  274. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_fix_verification.py +0 -0
  275. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_mcp_server.py +0 -0
  276. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  277. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_mq.py +0 -0
  278. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_oa_login.py +0 -0
  279. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_real_summarization.py +0 -0
  280. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_summarization_config.py +0 -0
  281. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_summarization_real.py +0 -0
  282. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  283. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tools/__init__.py +0 -0
  284. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tools/async_utils.py +0 -0
  285. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tools/docs.py +0 -0
  286. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tools/env.py +0 -0
  287. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tools/merge_headers.py +0 -0
  288. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tools/snowflake.py +0 -0
  289. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tools/syemail.py +0 -0
  290. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/tools/timing.py +0 -0
  291. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/xxljob/__init__.py +0 -0
  292. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon/xxljob/xxljob_service.py +0 -0
  293. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  294. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  295. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  296. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  297. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/tests/test_asyncio_logging.py +0 -0
  298. {sycommon_python_lib-0.2.6a2 → sycommon_python_lib-0.2.6a3}/tests/test_sycli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.6a2
3
+ Version: 0.2.6a3
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.6a2"
3
+ version = "0.2.6a3"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -0,0 +1,175 @@
1
+ """
2
+ 一致性哈希沙箱路由
3
+
4
+ 虚拟槽位层:将 0-10000 的虚拟槽位通过一致性哈希环映射到真实沙箱实例。
5
+ 用户到虚拟槽位的映射永久固定(只依赖 user_id),增减真实沙箱只影响槽位到实例的映射。
6
+
7
+ 架构:
8
+ ┌────────────────────────────────────────────────────────────┐
9
+ │ 用户请求 │
10
+ │ │
11
+ │ user_id ──MD5──▶ 虚拟槽位号 (0-10000) │
12
+ │ │ │
13
+ │ ▼ │
14
+ │ ┌─────────────────────────────────────────────────────┐ │
15
+ │ │ 一致性哈希环 │ │
16
+ │ │ │ │
17
+ │ │ 每个真实实例在环上占 150 个虚拟节点 │ │
18
+ │ │ 槽位号顺时针找到最近的虚拟节点 → 真实实例 │ │
19
+ │ └─────────────────────────────────────────────────────┘ │
20
+ │ │ │
21
+ │ ▼ │
22
+ │ ┌─────────────────────────────────────────────────────┐ │
23
+ │ │ 真实沙箱实例 │ │
24
+ │ │ 192.168.1.100:8080 (实例1) │ │
25
+ │ │ 192.168.1.101:8080 (实例2) │ │
26
+ │ │ 192.168.1.102:8080 (实例3) │ │
27
+ │ └─────────────────────────────────────────────────────┘ │
28
+ │ │
29
+ │ 增减实例时:仅相邻槽位重新分配,绝大部分用户不受影响 │
30
+ └────────────────────────────────────────────────────────────┘
31
+ """
32
+
33
+ import hashlib
34
+ from bisect import bisect_right
35
+ from typing import Optional
36
+
37
+ from sycommon.logging.kafka_log import SYLogger
38
+
39
+ # 虚拟槽位数量:0 到 VIRTUAL_SLOT_COUNT-1
40
+ VIRTUAL_SLOT_COUNT = 10001 # 0-10000
41
+
42
+ # 每个真实实例在哈希环上的虚拟节点数(越多分布越均匀)
43
+ DEFAULT_VIRTUAL_NODES_PER_INSTANCE = 500
44
+
45
+
46
+ class ConsistentHashMap:
47
+ """一致性哈希环,将虚拟槽位号映射到真实沙箱实例。
48
+
49
+ 使用虚拟节点技术保证负载均衡均匀。
50
+ 线程安全:build() 后 ring 为不可变结构,get_instance() 无需加锁。
51
+ """
52
+
53
+ def __init__(self, virtual_nodes_per_instance: int = DEFAULT_VIRTUAL_NODES_PER_INSTANCE):
54
+ self._ring: list[int] = [] # 排序的哈希环(虚拟节点的哈希值)
55
+ self._node_map: dict[int, str] = {} # ring_hash -> instance_key (ip:port)
56
+ self._virtual_nodes = virtual_nodes_per_instance
57
+
58
+ def build(self, instances: list[dict]) -> None:
59
+ """从 Nacos 实例列表构建一致性哈希环。
60
+
61
+ Args:
62
+ instances: Nacos 实例列表,每个元素包含 'ip' 和 'port' 字段
63
+ """
64
+ self._ring = []
65
+ self._node_map = {}
66
+
67
+ for ins in instances:
68
+ key = f"{ins['ip']}:{ins['port']}"
69
+ for i in range(self._virtual_nodes):
70
+ # 虚拟节点标识
71
+ vnode_key = f"{key}#vn{i}"
72
+ h = self._hash(vnode_key)
73
+ self._ring.append(h)
74
+ self._node_map[h] = key
75
+
76
+ self._ring.sort()
77
+ SYLogger.info(
78
+ f"[ConsistentHash] 哈希环构建完成: "
79
+ f"{len(instances)} 个实例, {len(self._ring)} 个虚拟节点"
80
+ )
81
+
82
+ def get_instance(self, slot: int) -> Optional[str]:
83
+ """虚拟槽位号 → 最近的真实实例 key (ip:port)。
84
+
85
+ 在哈希环上顺时针查找最近的虚拟节点。
86
+ 如果 slot 对应的位置之后没有节点,回到环首。
87
+
88
+ Args:
89
+ slot: 虚拟槽位号 (0 ~ VIRTUAL_SLOT_COUNT-1)
90
+
91
+ Returns:
92
+ 实例 key "ip:port",环为空时返回 None
93
+ """
94
+ if not self._ring:
95
+ return None
96
+
97
+ # 将 slot 映射到哈希环上的一个位置
98
+ h = self._hash(str(slot))
99
+ # 顺时针找到第一个 >= h 的节点
100
+ idx = bisect_right(self._ring, h)
101
+ if idx >= len(self._ring):
102
+ idx = 0 # 回到环首
103
+ return self._node_map[self._ring[idx]]
104
+
105
+ @staticmethod
106
+ def _hash(key: str) -> int:
107
+ """将字符串映射到 0 ~ 2^64-1 的哈希空间"""
108
+ return int(hashlib.md5(key.encode()).hexdigest(), 16) % (2 ** 64)
109
+
110
+
111
+ def user_to_slot(user_id: str) -> int:
112
+ """用户 ID → 固定虚拟槽位号。
113
+
114
+ 同一 user_id 永远返回相同的槽位号。
115
+ 槽位号范围: 0 ~ VIRTUAL_SLOT_COUNT-1
116
+
117
+ Args:
118
+ user_id: 用户 ID
119
+
120
+ Returns:
121
+ 虚拟槽位号 (int)
122
+ """
123
+ hash_value = int(hashlib.md5(user_id.encode()).hexdigest(), 16)
124
+ return hash_value % VIRTUAL_SLOT_COUNT
125
+
126
+
127
+ def resolve_user_instance(user_id: str, instances: list[dict]) -> dict:
128
+ """用户 ID + 可用实例列表 → 目标真实实例。
129
+
130
+ 完整路由流程:
131
+ 1. user_id → 虚拟槽位号(永久固定)
132
+ 2. 构建一致性哈希环
133
+ 3. 槽位号 → 真实实例
134
+
135
+ Args:
136
+ user_id: 用户 ID
137
+ instances: Nacos 可用实例列表,每个元素包含 'ip' 和 'port'
138
+
139
+ Returns:
140
+ 目标实例 dict(含 'ip', 'port' 等字段)
141
+
142
+ Raises:
143
+ RuntimeError: 实例列表为空
144
+ """
145
+ if not instances:
146
+ raise RuntimeError("实例列表为空,无法路由")
147
+
148
+ # 单实例直接返回,无需哈希
149
+ if len(instances) == 1:
150
+ return instances[0]
151
+
152
+ slot = user_to_slot(user_id)
153
+ ring = ConsistentHashMap()
154
+ ring.build(instances)
155
+ target_key = ring.get_instance(slot)
156
+
157
+ if target_key is None:
158
+ # 兜底:环构建失败时取第一个实例
159
+ SYLogger.warning(
160
+ f"[ConsistentHash] 哈希环为空,回退到第一个实例")
161
+ return instances[0]
162
+
163
+ # 查找目标实例
164
+ for ins in instances:
165
+ if f"{ins['ip']}:{ins['port']}" == target_key:
166
+ SYLogger.info(
167
+ f"[ConsistentHash] 路由: user_id={user_id} -> "
168
+ f"slot={slot} -> instance={target_key}"
169
+ )
170
+ return ins
171
+
172
+ # 未匹配(理论上不会发生),兜底
173
+ SYLogger.warning(
174
+ f"[ConsistentHash] 未找到匹配实例 key={target_key},回退到第一个实例")
175
+ return instances[0]
@@ -316,13 +316,10 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
316
316
  if not instances:
317
317
  raise RuntimeError(f"服务 [{service_name}] 无可用实例(已过滤非所有者本地沙箱)")
318
318
 
319
- # 基于用户ID的负载均衡:使用哈希选择实例
319
+ # 基于用户ID的一致性哈希负载均衡:用户固定映射到虚拟槽位,槽位映射到真实实例
320
320
  if load_balance and len(instances) > 1:
321
- hash_value = int(hashlib.md5(user_id.encode()).hexdigest(), 16)
322
- instance_index = hash_value % len(instances)
323
- instance = instances[instance_index]
324
- SYLogger.info(
325
- f"[Sandbox] 负载均衡: user_id={user_id} -> instance[{instance_index}/{len(instances)}]")
321
+ from sycommon.agent.sandbox.consistent_hash import resolve_user_instance
322
+ instance = resolve_user_instance(user_id, instances)
326
323
  else:
327
324
  instance = instances[0]
328
325
 
@@ -0,0 +1,279 @@
1
+ """
2
+ 一致性哈希沙箱路由 - 验证测试
3
+
4
+ 验证内容:
5
+ 1. 用户粘性:同一 user_id 多次调用返回相同实例
6
+ 2. 增实例:新增沙箱后只有部分用户迁移
7
+ 3. 删实例:删除沙箱后受影响用户被分散
8
+ 4. 均匀分布:10000 虚拟槽位均匀分配到各实例
9
+ 5. 虚拟槽位固定:user_id 到槽位号永久不变
10
+ """
11
+
12
+ import sys
13
+ import os
14
+ import random
15
+ import hashlib
16
+ from collections import Counter
17
+
18
+ # 抑制 SYLogger 日志
19
+ os.environ["LOG_LEVEL"] = "ERROR"
20
+
21
+ # 添加路径
22
+ sys.path.insert(0, "/Users/osulcode.xiao/miniconda3/lib/python3.11/site-packages")
23
+
24
+ from sycommon.agent.sandbox.consistent_hash import (
25
+ ConsistentHashMap,
26
+ VIRTUAL_SLOT_COUNT,
27
+ user_to_slot,
28
+ resolve_user_instance,
29
+ )
30
+
31
+
32
+ def make_instances(n: int) -> list[dict]:
33
+ """生成 n 个模拟沙箱实例"""
34
+ return [{"ip": f"10.0.0.{i+1}", "port": 8080} for i in range(n)]
35
+
36
+
37
+ def instance_key(ins: dict) -> str:
38
+ return f"{ins['ip']}:{ins['port']}"
39
+
40
+
41
+ def test_slot_stability():
42
+ """测试 1: user_id 到虚拟槽位的映射永久固定"""
43
+ print("=" * 60)
44
+ print("测试 1: user_id → 虚拟槽位 永久固定")
45
+ print("=" * 60)
46
+
47
+ users = [f"user_{i}" for i in range(100)]
48
+ slots_round1 = {u: user_to_slot(u) for u in users}
49
+ slots_round2 = {u: user_to_slot(u) for u in users}
50
+
51
+ assert slots_round1 == slots_round2, "槽位映射不稳定!"
52
+ print(f"✅ {len(users)} 个用户的槽位映射在两次调用中完全一致")
53
+
54
+ # 验证槽位范围
55
+ for u, s in slots_round1.items():
56
+ assert 0 <= s < VIRTUAL_SLOT_COUNT, f"槽位 {s} 超出范围"
57
+ print(f"✅ 所有槽位号在 [0, {VIRTUAL_SLOT_COUNT-1}] 范围内")
58
+
59
+ # 显示几个示例
60
+ print("\n示例映射:")
61
+ for u in users[:5]:
62
+ print(f" {u} → 槽位 {user_to_slot(u)}")
63
+ print()
64
+
65
+
66
+ def test_user_stickiness():
67
+ """测试 2: 同一用户在相同实例列表下始终路由到同一实例"""
68
+ print("=" * 60)
69
+ print("测试 2: 用户粘性 - 相同实例列表,路由不变")
70
+ print("=" * 60)
71
+
72
+ instances = make_instances(3)
73
+ users = [f"user_{i}" for i in range(200)]
74
+
75
+ results = []
76
+ for _ in range(5): # 调用 5 次
77
+ round_result = {u: instance_key(resolve_user_instance(u, instances)) for u in users}
78
+ results.append(round_result)
79
+
80
+ # 所有轮次的结果应该完全一致
81
+ for i in range(1, len(results)):
82
+ assert results[0] == results[i], f"第 {i} 轮结果不一致!"
83
+
84
+ print(f"✅ {len(users)} 个用户在 5 次调用中路由完全一致")
85
+
86
+ # 统计分布
87
+ counter = Counter(results[0].values())
88
+ print(f"\n分布: {dict(counter)}")
89
+ print()
90
+
91
+
92
+ def test_add_instance_minimal_migration():
93
+ """测试 3: 新增实例时最少迁移"""
94
+ print("=" * 60)
95
+ print("测试 3: 新增沙箱 - 只有部分用户迁移")
96
+ print("=" * 60)
97
+
98
+ users = [f"user_{i}" for i in range(1000)]
99
+
100
+ # 3 个实例
101
+ instances_3 = make_instances(3)
102
+ mapping_3 = {u: instance_key(resolve_user_instance(u, instances_3)) for u in users}
103
+
104
+ # 扩到 4 个实例
105
+ instances_4 = make_instances(4)
106
+ mapping_4 = {u: instance_key(resolve_user_instance(u, instances_4)) for u in users}
107
+
108
+ # 计算迁移数
109
+ migrated = sum(1 for u in users if mapping_3[u] != mapping_4[u])
110
+ migration_rate = migrated / len(users) * 100
111
+
112
+ print(f"3 → 4 实例: {migrated}/{len(users)} 用户迁移 ({migration_rate:.1f}%)")
113
+ print(f"理论最优迁移率: ~{100/4:.1f}% (1/4 的用户应被重新分配到新实例)")
114
+
115
+ # 迁移率应接近 1/N(新增第 4 个实例,理论 ~25% 的用户迁移)
116
+ assert migration_rate < 40, f"迁移率 {migration_rate:.1f}% 过高!"
117
+ print(f"✅ 迁移率 {migration_rate:.1f}% 在合理范围内")
118
+
119
+ # 验证未迁移的用户保持不变
120
+ unchanged = sum(1 for u in users if mapping_3[u] == mapping_4[u])
121
+ print(f"✅ {unchanged}/{len(users)} 用户保持原有沙箱不变")
122
+
123
+ # 扩到 5 个实例
124
+ instances_5 = make_instances(5)
125
+ mapping_5 = {u: instance_key(resolve_user_instance(u, instances_5)) for u in users}
126
+ migrated_4_to_5 = sum(1 for u in users if mapping_4[u] != mapping_5[u])
127
+ rate_4_to_5 = migrated_4_to_5 / len(users) * 100
128
+ print(f"4 → 5 实例: {migrated_4_to_5}/{len(users)} 用户迁移 ({rate_4_to_5:.1f}%)")
129
+ assert rate_4_to_5 < 30, f"迁移率 {rate_4_to_5:.1f}% 过高!"
130
+ print(f"✅ 迁移率 {rate_4_to_5:.1f}% 在合理范围内")
131
+ print()
132
+
133
+
134
+ def test_remove_instance():
135
+ """测试 4: 删除实例时受影响用户被分散"""
136
+ print("=" * 60)
137
+ print("测试 4: 删除沙箱 - 受影响用户被分散到其他实例")
138
+ print("=" * 60)
139
+
140
+ users = [f"user_{i}" for i in range(1000)]
141
+
142
+ # 4 个实例
143
+ instances_4 = make_instances(4)
144
+ mapping_4 = {u: instance_key(resolve_user_instance(u, instances_4)) for u in users}
145
+
146
+ # 减到 3 个(删除最后一个)
147
+ instances_3 = make_instances(3)
148
+ mapping_3 = {u: instance_key(resolve_user_instance(u, instances_3)) for u in users}
149
+
150
+ # 被删除实例的用户
151
+ removed_key = "10.0.0.4:8080"
152
+ affected_users = [u for u in users if mapping_4[u] == removed_key]
153
+ print(f"被删除实例 {removed_key} 上有 {len(affected_users)} 个用户")
154
+
155
+ # 这些用户在 3 实例下应该被分散到其余实例
156
+ if affected_users:
157
+ new_destinations = Counter(mapping_3[u] for u in affected_users)
158
+ print(f"迁移分布: {dict(new_destinations)}")
159
+
160
+ # 不应该有任何用户还路由到已删除的实例
161
+ for u in affected_users:
162
+ assert mapping_3[u] != removed_key, f"用户 {u} 仍路由到已删除实例!"
163
+ print(f"✅ 所有受影响用户已迁移到其他实例")
164
+
165
+ # 未受影响的用户保持不变
166
+ unaffected = [u for u in users if mapping_4[u] != removed_key]
167
+ unchanged = sum(1 for u in unaffected if mapping_4[u] == mapping_3[u])
168
+ print(f"✅ {unchanged}/{len(unaffected)} 未受影响用户保持原有沙箱")
169
+ print()
170
+
171
+
172
+ def test_uniform_distribution():
173
+ """测试 5: 虚拟槽位均匀分布到各实例"""
174
+ print("=" * 60)
175
+ print("测试 5: 均匀分布 - 虚拟槽位到实例的分配")
176
+ print("=" * 60)
177
+
178
+ for n_instances in [2, 3, 5, 10]:
179
+ instances = make_instances(n_instances)
180
+ ring = ConsistentHashMap()
181
+ ring.build(instances)
182
+
183
+ # 统计所有虚拟槽位的分配
184
+ counter = Counter()
185
+ for slot in range(VIRTUAL_SLOT_COUNT):
186
+ key = ring.get_instance(slot)
187
+ if key:
188
+ counter[key] += 1
189
+
190
+ total = sum(counter.values())
191
+ expected = total / n_instances
192
+ max_deviation = max(abs(v - expected) / expected * 100 for v in counter.values())
193
+
194
+ print(f" {n_instances} 个实例: 每实例期望 {expected:.0f} 槽位, "
195
+ f"最大偏差 {max_deviation:.1f}%")
196
+ print(f" 实际分布: {dict(counter)}")
197
+
198
+ # 偏差应小于 15%
199
+ assert max_deviation < 15, f"偏差 {max_deviation:.1f}% 过大!"
200
+ print(f" ✅ 偏差在合理范围内")
201
+ print()
202
+
203
+
204
+ def test_large_scale_user_distribution():
205
+ """测试 6: 大规模用户分布"""
206
+ print("=" * 60)
207
+ print("测试 6: 10000 用户在 5 个沙箱上的分布")
208
+ print("=" * 60)
209
+
210
+ instances = make_instances(5)
211
+ users = [f"user_{i:05d}" for i in range(10000)]
212
+
213
+ counter = Counter()
214
+ for u in users:
215
+ ins = resolve_user_instance(u, instances)
216
+ counter[instance_key(ins)] += 1
217
+
218
+ expected = len(users) / len(instances)
219
+ max_deviation = max(abs(v - expected) / expected * 100 for v in counter.values())
220
+
221
+ print(f"每实例期望: {expected:.0f} 用户")
222
+ print(f"实际分布: {dict(counter)}")
223
+ print(f"最大偏差: {max_deviation:.1f}%")
224
+ assert max_deviation < 15, f"偏差 {max_deviation:.1f}% 过大!"
225
+ print(f"✅ 10000 用户在 5 个沙箱上分布均匀")
226
+ print()
227
+
228
+
229
+ def test_comparison_with_old_method():
230
+ """测试 7: 对比新旧方法在增减实例时的迁移率"""
231
+ print("=" * 60)
232
+ print("测试 7: 新(一致性哈希) vs 旧(取模) 方法迁移率对比")
233
+ print("=" * 60)
234
+
235
+ users = [f"user_{i}" for i in range(1000)]
236
+
237
+ def old_method(user_id, instances):
238
+ hash_value = int(hashlib.md5(user_id.encode()).hexdigest(), 16)
239
+ idx = hash_value % len(instances)
240
+ return instance_key(instances[idx])
241
+
242
+ def new_method(user_id, instances):
243
+ return instance_key(resolve_user_instance(user_id, instances))
244
+
245
+ for old_n, new_n in [(3, 4), (4, 5), (5, 6), (10, 11)]:
246
+ old_ins = make_instances(old_n)
247
+ new_ins = make_instances(new_n)
248
+
249
+ # 旧方法迁移率
250
+ old_mapping_before = {u: old_method(u, old_ins) for u in users}
251
+ old_mapping_after = {u: old_method(u, new_ins) for u in users}
252
+ old_migrated = sum(1 for u in users if old_mapping_before[u] != old_mapping_after[u])
253
+
254
+ # 新方法迁移率
255
+ new_mapping_before = {u: new_method(u, old_ins) for u in users}
256
+ new_mapping_after = {u: new_method(u, new_ins) for u in users}
257
+ new_migrated = sum(1 for u in users if new_mapping_before[u] != new_mapping_after[u])
258
+
259
+ print(f" {old_n} → {new_n} 实例:")
260
+ print(f" 旧方法(取模): {old_migrated}/{len(users)} 迁移 ({old_migrated/len(users)*100:.1f}%)")
261
+ print(f" 新方法(一致性): {new_migrated}/{len(users)} 迁移 ({new_migrated/len(users)*100:.1f}%)")
262
+ print(f" 改善: {old_migrated - new_migrated} 个用户免于迁移")
263
+ print()
264
+
265
+
266
+ if __name__ == "__main__":
267
+ print("\n🚀 一致性哈希沙箱路由 - 验证测试\n")
268
+
269
+ test_slot_stability()
270
+ test_user_stickiness()
271
+ test_add_instance_minimal_migration()
272
+ test_remove_instance()
273
+ test_uniform_distribution()
274
+ test_large_scale_user_distribution()
275
+ test_comparison_with_old_method()
276
+
277
+ print("=" * 60)
278
+ print("🎉 所有测试通过!")
279
+ print("=" * 60)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.6a2
3
+ Version: 0.2.6a3
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -138,6 +138,7 @@ src/sycommon/agent/mcp/__init__.py
138
138
  src/sycommon/agent/mcp/models.py
139
139
  src/sycommon/agent/mcp/tool_loader.py
140
140
  src/sycommon/agent/sandbox/__init__.py
141
+ src/sycommon/agent/sandbox/consistent_hash.py
141
142
  src/sycommon/agent/sandbox/file_ops.py
142
143
  src/sycommon/agent/sandbox/http_sandbox_backend.py
143
144
  src/sycommon/agent/sandbox/minio_sync.py
@@ -259,6 +260,7 @@ src/sycommon/synacos/nacos_service_discovery.py
259
260
  src/sycommon/synacos/nacos_service_registration.py
260
261
  src/sycommon/synacos/param.py
261
262
  src/sycommon/tests/deep_agent_server.py
263
+ src/sycommon/tests/test_consistent_hash.py
262
264
  src/sycommon/tests/test_consumer_loss_rootcause.py
263
265
  src/sycommon/tests/test_consumer_recovery.py
264
266
  src/sycommon/tests/test_deep_agent.py