sycommon-python-lib 0.2.5a13__tar.gz → 0.2.5a15__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 (290) hide show
  1. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/client.py +7 -0
  4. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/deep_agent.py +5 -1
  5. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/multi_agent_team.py +5 -1
  6. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/sandbox/http_sandbox_backend.py +89 -41
  7. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/sandbox.py +9 -2
  8. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/sandbox.py +3 -0
  9. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/services.py +6 -0
  10. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tools/snowflake.py +32 -76
  11. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  12. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/README.md +0 -0
  13. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/setup.cfg +0 -0
  14. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/__init__.py +0 -0
  15. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/cli.py +0 -0
  16. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/core/__init__.py +0 -0
  17. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/core/console.py +0 -0
  18. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/core/models.py +0 -0
  19. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/core/project.py +0 -0
  20. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/core/utils.py +0 -0
  21. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/__init__.py +0 -0
  22. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/README.md.tpl +0 -0
  23. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/__init__.py +0 -0
  24. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  25. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/api/query.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/app.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/db/service.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/model/parse.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/.env.tpl +0 -0
  45. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/.gitignore.tpl +0 -0
  46. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/Dockerfile.tpl +0 -0
  47. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/README.md.tpl +0 -0
  48. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/__init__.py +0 -0
  49. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/app.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/app.yaml.tpl +0 -0
  51. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/client/__init__.py.tpl +0 -0
  53. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/model/__init__.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/model/file_info.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/base/requirements.txt.tpl +0 -0
  56. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/cli/README.md.tpl +0 -0
  57. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/cli/__init__.py +0 -0
  58. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/cli/app.py.tpl +0 -0
  59. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  60. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  61. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  62. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/README.md.tpl +0 -0
  64. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/__init__.py +0 -0
  65. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/api/__init__.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/api/echo.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/app.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/client/__init__.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/model/__init__.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/command/templates/web/tools/mq.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/nexus/__init__.py +0 -0
  75. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/__init__.py +0 -0
  76. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/__main__.py +0 -0
  77. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/agents/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/agents/factory.py +0 -0
  79. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/agents/prompts.py +0 -0
  80. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/__init__.py +0 -0
  81. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/browser.py +0 -0
  82. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/capabilities/__init__.py +0 -0
  83. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/capabilities/console.py +0 -0
  84. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/capabilities/dom.py +0 -0
  85. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/capabilities/network.py +0 -0
  86. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  87. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/capabilities/performance.py +0 -0
  88. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  89. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/protocol.py +0 -0
  90. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cdp/repl.py +0 -0
  91. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/cli.py +0 -0
  92. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/__init__.py +0 -0
  93. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/cdp_cmd.py +0 -0
  94. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/chat_cmd.py +0 -0
  95. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/create_cmd.py +0 -0
  96. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/evaluate_cmd.py +0 -0
  97. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/init_cmd.py +0 -0
  98. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/memory_cmd.py +0 -0
  99. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/resume_cmd.py +0 -0
  100. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/rollback_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/commands/run_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/core/__init__.py +0 -0
  103. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/core/backend.py +0 -0
  104. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/core/config.py +0 -0
  105. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/core/display.py +0 -0
  106. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/core/git_integration.py +0 -0
  107. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/core/llm.py +0 -0
  108. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/core/state.py +0 -0
  109. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/evaluate/__init__.py +0 -0
  110. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/evaluate/api_evaluator.py +0 -0
  111. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/memory/__init__.py +0 -0
  112. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/memory/compressor.py +0 -0
  113. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/memory/full.py +0 -0
  114. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/memory/hot.py +0 -0
  115. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/memory/manager.py +0 -0
  116. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/memory/warm.py +0 -0
  117. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/mode/__init__.py +0 -0
  118. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/mode/create.py +0 -0
  119. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/mode/optimize.py +0 -0
  120. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/models/__init__.py +0 -0
  121. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/models/config_models.py +0 -0
  122. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/__init__.py +0 -0
  123. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/baseline_tests.py +0 -0
  124. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/checkpoint.py +0 -0
  125. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/convergence.py +0 -0
  126. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/diagnosis.py +0 -0
  127. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/engine.py +0 -0
  128. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/environment.py +0 -0
  129. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/experience.py +0 -0
  130. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/harness_prompts.py +0 -0
  131. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/history.py +0 -0
  132. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/optimization_logger.py +0 -0
  133. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/pre_validation.py +0 -0
  134. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/reward.py +0 -0
  135. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/strategy_bandit.py +0 -0
  136. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/strategy_generator.py +0 -0
  137. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/rl/strategy_prompts.py +0 -0
  138. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycli/skills/__init__.py +0 -0
  139. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/__init__.py +0 -0
  140. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/__init__.py +0 -0
  141. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/agent_manager.py +0 -0
  142. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/chat_events.py +0 -0
  143. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/mcp/__init__.py +0 -0
  144. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/mcp/models.py +0 -0
  145. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  146. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/sandbox/__init__.py +0 -0
  147. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  148. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
  149. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  150. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  151. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/sandbox/session.py +0 -0
  152. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/agent/summarization_utils.py +0 -0
  153. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/auth/__init__.py +0 -0
  154. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/auth/ldap_service.py +0 -0
  155. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/auth/oa_cache.py +0 -0
  156. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/auth/oa_crypto.py +0 -0
  157. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/auth/oa_service.py +0 -0
  158. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  159. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/Config.py +0 -0
  160. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/DatabaseConfig.py +0 -0
  161. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  162. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/EmbeddingConfig.py +0 -0
  163. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/LLMConfig.py +0 -0
  164. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/LangfuseConfig.py +0 -0
  165. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/MQConfig.py +0 -0
  166. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/PgConfig.py +0 -0
  167. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/RedisConfig.py +0 -0
  168. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/RerankerConfig.py +0 -0
  169. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/SentryConfig.py +0 -0
  170. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/XxlJobConfig.py +0 -0
  171. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/config/__init__.py +0 -0
  172. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/database/async_base_db_service.py +0 -0
  173. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/database/async_database_service.py +0 -0
  174. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/database/base_db_service.py +0 -0
  175. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/database/database_service.py +0 -0
  176. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/database/elasticsearch_service.py +0 -0
  177. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  178. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/database/redis_service.py +0 -0
  179. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/database/token_usage_db_service.py +0 -0
  180. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/health/__init__.py +0 -0
  181. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/health/health_check.py +0 -0
  182. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/health/metrics.py +0 -0
  183. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/health/ping.py +0 -0
  184. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/heartbeat_process/__init__.py +0 -0
  185. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  186. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  187. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  188. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/__init__.py +0 -0
  189. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/embedding.py +0 -0
  190. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/get_llm.py +0 -0
  191. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/llm_logger.py +0 -0
  192. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/llm_tokens.py +0 -0
  193. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  194. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  195. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  196. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/struct_token.py +0 -0
  197. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/sy_langfuse.py +0 -0
  198. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  199. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  200. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/token_usage_es_service.py +0 -0
  201. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  202. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/llm/usage_token.py +0 -0
  203. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/logging/__init__.py +0 -0
  204. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/logging/async_sql_logger.py +0 -0
  205. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/logging/kafka_log.py +0 -0
  206. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/logging/logger_levels.py +0 -0
  207. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/logging/logger_wrapper.py +0 -0
  208. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/logging/process_logger.py +0 -0
  209. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/logging/sql_logger.py +0 -0
  210. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/mcp_server/__init__.py +0 -0
  211. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/mcp_server/server.py +0 -0
  212. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/__init__.py +0 -0
  213. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/context.py +0 -0
  214. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/cors.py +0 -0
  215. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/docs.py +0 -0
  216. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/exception.py +0 -0
  217. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/middleware.py +0 -0
  218. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/monitor_memory.py +0 -0
  219. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/mq.py +0 -0
  220. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/timeout.py +0 -0
  221. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/token_tracking.py +0 -0
  222. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  223. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/middleware/traceid.py +0 -0
  224. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/__init__.py +0 -0
  225. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/base_http.py +0 -0
  226. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/log.py +0 -0
  227. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/mcp_server_config.py +0 -0
  228. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/mqlistener_config.py +0 -0
  229. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/mqmsg_model.py +0 -0
  230. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/mqsend_config.py +0 -0
  231. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/sso_user.py +0 -0
  232. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/token_usage.py +0 -0
  233. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/token_usage_mysql.py +0 -0
  234. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/models/xxljob_handler_config.py +0 -0
  235. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/notice/__init__.py +0 -0
  236. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  237. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/notice/wecom_message.py +0 -0
  238. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  239. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  240. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  241. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  242. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  243. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  244. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  245. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  246. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  247. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/sentry/__init__.py +0 -0
  248. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/sentry/sy_sentry.py +0 -0
  249. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/sse/__init__.py +0 -0
  250. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/sse/event.py +0 -0
  251. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/sse/sse.py +0 -0
  252. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/__init__.py +0 -0
  253. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/example.py +0 -0
  254. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/example2.py +0 -0
  255. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/feign.py +0 -0
  256. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/feign_client.py +0 -0
  257. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/nacos_client_base.py +0 -0
  258. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  259. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  260. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/nacos_service.py +0 -0
  261. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  262. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  263. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/synacos/param.py +0 -0
  264. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/deep_agent_server.py +0 -0
  265. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  266. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_deep_agent.py +0 -0
  267. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_email.py +0 -0
  268. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_encoding_cache.py +0 -0
  269. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_mcp_server.py +0 -0
  270. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  271. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_mq.py +0 -0
  272. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_oa_login.py +0 -0
  273. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_real_summarization.py +0 -0
  274. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_summarization_config.py +0 -0
  275. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tests/test_summarization_real.py +0 -0
  276. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tools/__init__.py +0 -0
  277. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tools/async_utils.py +0 -0
  278. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tools/docs.py +0 -0
  279. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tools/env.py +0 -0
  280. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tools/merge_headers.py +0 -0
  281. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tools/syemail.py +0 -0
  282. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/tools/timing.py +0 -0
  283. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/xxljob/__init__.py +0 -0
  284. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon/xxljob/xxljob_service.py +0 -0
  285. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
  286. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  287. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  288. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  289. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  290. {sycommon_python_lib-0.2.5a13 → sycommon_python_lib-0.2.5a15}/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.5a13
3
+ Version: 0.2.5a15
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.5a13"
3
+ version = "0.2.5a15"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -29,6 +29,13 @@ class CDPClient:
29
29
 
30
30
  # ── Connection lifecycle ──────────────────────────────────────
31
31
 
32
+ async def __aenter__(self) -> CDPClient:
33
+ await self.connect()
34
+ return self
35
+
36
+ async def __aexit__(self, *exc) -> None:
37
+ await self.close()
38
+
32
39
  async def connect(self) -> None:
33
40
  self._session = aiohttp.ClientSession()
34
41
  self._ws = await self._session.ws_connect(
@@ -140,7 +140,11 @@ class DeepAgent:
140
140
 
141
141
  async def cleanup(self):
142
142
  """清理资源"""
143
- pass
143
+ if self.sandbox_backend:
144
+ try:
145
+ await self.sandbox_backend.acleanup()
146
+ except Exception:
147
+ pass
144
148
 
145
149
  async def chat(
146
150
  self,
@@ -192,7 +192,11 @@ class MultiAgentTeam:
192
192
 
193
193
  async def cleanup(self):
194
194
  """清理资源"""
195
- pass
195
+ if self.sandbox_backend:
196
+ try:
197
+ await self.sandbox_backend.acleanup()
198
+ except Exception:
199
+ pass
196
200
 
197
201
  async def chat(
198
202
  self,
@@ -120,6 +120,10 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
120
120
  self._nacos_service_name = nacos_service_name
121
121
  self._nacos_group = nacos_group
122
122
 
123
+ # 共享异步 HTTP 会话(连接池复用,惰性初始化)
124
+ self._async_session: Optional[aiohttp.ClientSession] = None
125
+ self._session_loop_id: Optional[int] = None # track which loop created the session
126
+
123
127
  # 生成 ID
124
128
  self._id = self._base_url.replace(
125
129
  "http://", ""
@@ -131,6 +135,55 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
131
135
  "/", "-"
132
136
  )
133
137
 
138
+ async def _get_async_session(self) -> aiohttp.ClientSession:
139
+ """获取或创建共享的 aiohttp ClientSession(连接池复用)
140
+
141
+ Handles the case where the backend was created in a different thread
142
+ (e.g. via asyncio.to_thread) by detecting loop mismatch and resetting.
143
+ """
144
+ try:
145
+ current_loop = asyncio.get_running_loop()
146
+ except RuntimeError:
147
+ current_loop = None
148
+
149
+ # If session was created on a different event loop, discard it
150
+ if self._async_session is not None and self._session_loop_id != id(current_loop):
151
+ try:
152
+ await self._async_session.close()
153
+ except Exception:
154
+ pass
155
+ self._async_session = None
156
+
157
+ if self._async_session is None or self._async_session.closed:
158
+ connector = aiohttp.TCPConnector(
159
+ ssl=_SSL_CONTEXT,
160
+ limit=10,
161
+ limit_per_host=10,
162
+ keepalive_timeout=30,
163
+ enable_cleanup_closed=True,
164
+ )
165
+ self._async_session = aiohttp.ClientSession(connector=connector)
166
+ self._session_loop_id = id(current_loop)
167
+ return self._async_session
168
+
169
+ async def acleanup(self):
170
+ """关闭共享的异步 HTTP 会话,释放连接池资源"""
171
+ if self._async_session and not self._async_session.closed:
172
+ await self._async_session.close()
173
+ self._async_session = None
174
+
175
+ def cleanup(self):
176
+ """同步方式关闭共享会话(供非 async 上下文使用)"""
177
+ if self._async_session and not self._async_session.closed:
178
+ try:
179
+ loop = asyncio.get_running_loop()
180
+ loop.create_task(self._async_session.close())
181
+ except RuntimeError:
182
+ loop = asyncio.new_event_loop()
183
+ loop.run_until_complete(self._async_session.close())
184
+ loop.close()
185
+ self._async_session = None
186
+
134
187
  @classmethod
135
188
  def from_nacos(
136
189
  cls,
@@ -361,10 +414,11 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
361
414
  SYLogger.warning(f"[Sandbox] 请求失败 (尝试 {attempt + 1}/{max_retries}): {self._base_url} - {e}")
362
415
 
363
416
  if attempt < max_retries - 1:
417
+ backoff = 2 ** attempt
364
418
  switched = self._refresh_from_nacos_and_switch_sync()
365
419
  if not switched:
366
420
  import time
367
- time.sleep(1)
421
+ time.sleep(backoff)
368
422
  else:
369
423
  raise RuntimeError(f"沙箱服务不可用: {e}")
370
424
 
@@ -377,38 +431,32 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
377
431
  # ============== 内部方法 - 异步版本 ==============
378
432
 
379
433
  async def _post_async(self, endpoint: str, data: dict, timeout: int = None) -> dict:
380
- """异步 POST 请求(每次创建独立 session,避免跨 Task 共享导致超时上下文错误)"""
434
+ """异步 POST 请求(使用共享连接池)"""
381
435
  actual_timeout = timeout if timeout is not None else self._timeout
382
436
  if "/execute" in endpoint:
383
437
  http_timeout = actual_timeout + 60
384
438
  else:
385
439
  http_timeout = actual_timeout + 30
386
440
 
387
- trace_id = SYLogger.get_trace_id()
388
- headers = {"Content-Type": "application/json"}
389
- if trace_id:
390
- headers["x-traceid-header"] = str(trace_id)
391
- if self._token:
392
- headers["X-Sandbox-Token"] = self._token
441
+ headers = self._build_headers()
393
442
 
394
443
  url = f"{self._base_url}{endpoint}"
395
444
  SYLogger.info(f"[Sandbox] Async POST 请求开始: {url}, timeout={http_timeout}s")
396
445
 
397
446
  timeout_obj = aiohttp.ClientTimeout(total=http_timeout)
398
- connector = aiohttp.TCPConnector(ssl=_SSL_CONTEXT)
399
- async with aiohttp.ClientSession(connector=connector) as session:
400
- async with session.post(url, json=data, headers=headers, timeout=timeout_obj) as resp:
401
- SYLogger.info(f"[Sandbox] Async POST 响应状态码: {resp.status}")
402
- if resp.status >= 400:
403
- text = await resp.text()
404
- SYLogger.error(f"[Sandbox] HTTP 错误 {resp.status}: {text}")
405
- resp.raise_for_status()
406
- result = await resp.json()
407
- SYLogger.info(f"[Sandbox] Async POST 成功: {url}")
408
- return result
447
+ session = await self._get_async_session()
448
+ async with session.post(url, json=data, headers=headers, timeout=timeout_obj) as resp:
449
+ SYLogger.info(f"[Sandbox] Async POST 响应状态码: {resp.status}")
450
+ if resp.status >= 400:
451
+ text = await resp.text()
452
+ SYLogger.error(f"[Sandbox] HTTP 错误 {resp.status}: {text}")
453
+ resp.raise_for_status()
454
+ result = await resp.json()
455
+ SYLogger.info(f"[Sandbox] Async POST 成功: {url}")
456
+ return result
409
457
 
410
458
  async def _post_async_with_failover(self, endpoint: str, data: dict, timeout: int = None) -> dict:
411
- """带故障转移的异步 POST 请求"""
459
+ """带故障转移和指数退避的异步 POST 请求"""
412
460
  max_retries = 3
413
461
 
414
462
  for attempt in range(max_retries):
@@ -418,10 +466,12 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
418
466
  SYLogger.warning(f"[Sandbox] Async 请求失败 (尝试 {attempt + 1}/{max_retries}): {self._base_url} - {e}")
419
467
 
420
468
  if attempt < max_retries - 1:
469
+ # 指数退避: 1s, 2s
470
+ backoff = 2 ** attempt
421
471
  # 尝试故障转移
422
472
  switched = await asyncio.to_thread(self._refresh_from_nacos_and_switch_sync)
423
473
  if not switched:
424
- await asyncio.sleep(1)
474
+ await asyncio.sleep(backoff)
425
475
  else:
426
476
  raise RuntimeError(f"沙箱服务不可用: {e}")
427
477
 
@@ -490,20 +540,19 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
490
540
  SYLogger.info(f"[Sandbox] 使用环境变量 SANDBOX_WORKSPACE={env_workspace}")
491
541
  return self._workspace_root
492
542
 
493
- # 从沙箱服务端 health 接口获取(aiohttp 异步)
543
+ # 从沙箱服务端 health 接口获取(使用共享连接池)
494
544
  try:
495
545
  url = f"{self._base_url}{SANDBOX_API_PREFIX}/health"
496
- connector = aiohttp.TCPConnector(ssl=_SSL_CONTEXT)
497
546
  timeout_obj = aiohttp.ClientTimeout(total=10)
498
- async with aiohttp.ClientSession(connector=connector) as session:
499
- async with session.get(url, timeout=timeout_obj) as resp:
500
- if resp.status == 200:
501
- data = await resp.json()
502
- workspace = data.get("workspace", "")
503
- if workspace:
504
- self._workspace_root = workspace
505
- SYLogger.info(f"[Sandbox] 从沙箱服务端获取 WORKSPACE_ROOT={workspace}")
506
- return self._workspace_root
547
+ session = await self._get_async_session()
548
+ async with session.get(url, timeout=timeout_obj) as resp:
549
+ if resp.status == 200:
550
+ data = await resp.json()
551
+ workspace = data.get("workspace", "")
552
+ if workspace:
553
+ self._workspace_root = workspace
554
+ SYLogger.info(f"[Sandbox] 从沙箱服务端获取 WORKSPACE_ROOT={workspace}")
555
+ return self._workspace_root
507
556
  except Exception as e:
508
557
  SYLogger.warning(f"[Sandbox] 异步获取沙箱 workspace 失败: {e}")
509
558
 
@@ -1071,7 +1120,7 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
1071
1120
  failed_count += 1
1072
1121
  errors.append({"path": sandbox_path, "error": str(e)})
1073
1122
 
1074
- max_workers = min(8, len(files_to_upload)) if files_to_upload else 1
1123
+ max_workers = min(4, len(files_to_upload)) if files_to_upload else 1
1075
1124
  with ThreadPoolExecutor(max_workers=max_workers) as executor:
1076
1125
  futures = [
1077
1126
  executor.submit(_upload_one, idx, sandbox_path, local_file)
@@ -1185,18 +1234,17 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
1185
1234
  raise
1186
1235
 
1187
1236
  async def ahealth_check(self, timeout: int = 10) -> dict:
1188
- """异步健康检查"""
1237
+ """异步健康检查(使用共享连接池)"""
1189
1238
  try:
1190
1239
  headers = self._build_headers()
1191
1240
  url = f"{self._base_url}{SANDBOX_API_PREFIX}/health"
1192
1241
  timeout_obj = aiohttp.ClientTimeout(total=timeout)
1193
- connector = aiohttp.TCPConnector(ssl=_SSL_CONTEXT)
1194
- async with aiohttp.ClientSession(connector=connector) as session:
1195
- async with session.get(url, headers=headers, timeout=timeout_obj) as resp:
1196
- resp.raise_for_status()
1197
- result = await resp.json()
1198
- SYLogger.info(f"[Sandbox] 异步健康检查成功: {result}")
1199
- return result
1242
+ session = await self._get_async_session()
1243
+ async with session.get(url, headers=headers, timeout=timeout_obj) as resp:
1244
+ resp.raise_for_status()
1245
+ result = await resp.json()
1246
+ SYLogger.info(f"[Sandbox] 异步健康检查成功: {result}")
1247
+ return result
1200
1248
  except Exception as e:
1201
1249
  SYLogger.error(f"[Sandbox] 异步健康检查失败: {e}")
1202
1250
  raise
@@ -67,7 +67,8 @@ from sycommon.models.sandbox import (
67
67
  _WORKER_ID = f"{os.getpid()}-{uuid.uuid4().hex[:8]}"
68
68
 
69
69
  # 进程存储: process_id -> {process: Popen, command: str, user_id: str, started_at: datetime, workspace: str}
70
-
70
+ _background_processes: Dict = {}
71
+ _process_lock = None
71
72
 
72
73
 
73
74
  def _get_process_lock() -> asyncio.Lock:
@@ -403,7 +404,13 @@ def setup_sandbox_handler(app: FastAPI, config: dict = None):
403
404
  @sandbox_router.get("/health", response_model=HealthResponse)
404
405
  async def health():
405
406
  """健康检查,返回 worker_id 用于多 worker 部署下的路由定位"""
406
- return HealthResponse(status="ok", workspace=WORKSPACE_BASE)
407
+ return HealthResponse(
408
+ status="ok",
409
+ workspace=WORKSPACE_BASE,
410
+ name=os.environ.get("SANDBOX_NAME", "远程沙箱"),
411
+ description=os.environ.get("SANDBOX_DESCRIPTION", ""),
412
+ type="remote",
413
+ )
407
414
 
408
415
  @sandbox_router.post("/execute", response_model=ExecuteResponse)
409
416
  async def execute(req: ExecuteRequest):
@@ -182,6 +182,9 @@ class HealthResponse(BaseModel):
182
182
  """健康检查响应"""
183
183
  status: str
184
184
  workspace: str
185
+ name: str = ""
186
+ description: str = ""
187
+ type: str = "remote"
185
188
 
186
189
 
187
190
  class ResetRequest(BaseModel):
@@ -19,6 +19,7 @@ from sycommon.sentry.sy_sentry import sy_sentry_init
19
19
  from sycommon.llm.embedding import Embedding
20
20
  from sycommon.synacos.feign import close_all_feign_sessions
21
21
  from sycommon.synacos.feign_client import close_all_feign_client_sessions
22
+ from sycommon.agent.sandbox.session import close_all_async_sessions
22
23
  from sycommon.database.elasticsearch_service import ElasticsearchService
23
24
  from sycommon.database.redis_service import RedisService
24
25
  from sycommon.database.pg_checkpoint_service import PgCheckpointService
@@ -497,6 +498,11 @@ class Services(metaclass=SingletonMeta):
497
498
  except Exception as e:
498
499
  logging.debug(f"关闭 feign_client session 时发生异常: {e}")
499
500
 
501
+ try:
502
+ await close_all_async_sessions()
503
+ except Exception as e:
504
+ logging.debug(f"关闭 sandbox async session 时发生异常: {e}")
505
+
500
506
  try:
501
507
  await Embedding().close_session()
502
508
  except Exception as e:
@@ -4,44 +4,37 @@ import socket
4
4
  import hashlib
5
5
  import random
6
6
  import os
7
- from typing import Optional, Type, Any
8
- from os import environ
9
7
  import psutil
8
+ from typing import Optional, Any
10
9
 
11
10
 
12
11
  class ClassProperty:
13
- """支持通过 类.属性 的方式访问,无需实例化"""
14
-
15
12
  def __init__(self, func):
16
13
  self.func = func
17
14
 
18
- def __get__(self, instance: Any, cls: Type) -> str:
15
+ def __get__(self, instance: Any, cls: type) -> str:
19
16
  return self.func(cls)
20
17
 
21
18
 
22
19
  class Snowflake:
23
20
  """
24
- 雪花算法生成器(高并发终极优化版 - 修复语法错误)
21
+ 雪花算法生成器
25
22
 
26
- 终极优化点:
27
- 1. 解决溢出死锁:当序列号溢出时,释放锁自旋等待,避免阻塞其他线程。
28
- 2. 锁内原子更新:确保时钟回拨判断与状态更新的原子性。
29
- 3. 移除 sleep:全流程无休眠,纯自旋保证极致吞吐。
30
- 4. 机器ID分段:Python服务使用0-511,避免与Java服务(512-1023)冲突
23
+ - 序列号溢出时释放锁自旋等待,避免阻塞其他线程
24
+ - 机器ID分段:Python服务使用4096~5119,避免与Java服务(0~4095)冲突
31
25
  """
26
+
32
27
  START_TIMESTAMP = 1388534400000 # 2014-01-01 00:00:00
33
- SEQUENCE_BITS = 12
34
- MACHINE_ID_BITS = 10
35
- MAX_MACHINE_ID = (1 << MACHINE_ID_BITS) - 1 # 0~1023
36
- MAX_SEQUENCE = (1 << SEQUENCE_BITS) - 1 # 4095
28
+ SEQUENCE_BITS = 9
29
+ MACHINE_ID_BITS = 13
30
+ MAX_MACHINE_ID = (1 << MACHINE_ID_BITS) - 1 # 0~8191
31
+ MAX_SEQUENCE = (1 << SEQUENCE_BITS) - 1 # 511
37
32
  MACHINE_ID_SHIFT = SEQUENCE_BITS
38
33
  TIMESTAMP_SHIFT = SEQUENCE_BITS + MACHINE_ID_BITS
39
34
  CLOCK_BACKWARD_THRESHOLD = 5
40
35
  _MAX_JAVA_LONG = 9223372036854775807
41
36
 
42
- # 机器ID分段配置(避免不同语言服务ID冲突)
43
- # Python服务: 512-1023, Java服务: 0-511
44
- PYTHON_MACHINE_ID_MIN = 512
37
+ PYTHON_MACHINE_ID_MIN = 4096
45
38
 
46
39
  _instance = None
47
40
  _instance_lock = threading.Lock()
@@ -51,12 +44,9 @@ class Snowflake:
51
44
  if machine_id is None:
52
45
  machine_id = self._get_k8s_machine_id()
53
46
 
54
- # Python服务机器ID限制在512-1023范围,避免与Java服务(0-511)冲突
47
+ # Python服务机器ID限制在4096~5119范围,避免与Java服务(0~4095)冲突
55
48
  machine_id = self.PYTHON_MACHINE_ID_MIN + \
56
- (machine_id % (self.MAX_MACHINE_ID - self.PYTHON_MACHINE_ID_MIN + 1))
57
-
58
- if not (0 <= machine_id <= self.MAX_MACHINE_ID):
59
- raise ValueError(f"机器ID必须在0~{self.MAX_MACHINE_ID}之间")
49
+ (machine_id % (5120 - self.PYTHON_MACHINE_ID_MIN))
60
50
 
61
51
  self.machine_id = machine_id
62
52
  self.last_timestamp = -1
@@ -66,15 +56,14 @@ class Snowflake:
66
56
  def _validate_timestamp_range(self):
67
57
  max_support_timestamp = self.START_TIMESTAMP + \
68
58
  (1 << (64 - self.TIMESTAMP_SHIFT)) - 1
69
- current_timestamp = self._get_current_timestamp()
70
- if current_timestamp > max_support_timestamp:
71
- raise RuntimeError(f"当前时间戳({current_timestamp})超过支持范围")
59
+ if self._get_current_timestamp() > max_support_timestamp:
60
+ raise RuntimeError("当前时间戳超过支持范围")
72
61
 
73
62
  def _get_k8s_machine_id(self) -> int:
74
- pod_name = environ.get("POD_NAME")
63
+ pod_name = os.environ.get("POD_NAME")
75
64
  if pod_name:
76
65
  return self._hash_to_machine_id(pod_name)
77
- pod_ip = environ.get("POD_IP")
66
+ pod_ip = os.environ.get("POD_IP")
78
67
  if pod_ip:
79
68
  return self._hash_to_machine_id(pod_ip)
80
69
  try:
@@ -117,8 +106,7 @@ class Snowflake:
117
106
  pass
118
107
  try:
119
108
  hostname = socket.gethostname()
120
- ip_list = socket.gethostbyname_ex(hostname)[2]
121
- for ip in ip_list:
109
+ for ip in socket.gethostbyname_ex(hostname)[2]:
122
110
  if not ip.startswith('127.') and not ip.startswith('0.'):
123
111
  return ip
124
112
  except Exception:
@@ -133,69 +121,39 @@ class Snowflake:
133
121
  return int(time.time() * 1000)
134
122
 
135
123
  def generate_id(self) -> int:
136
- """
137
- 生成雪花ID(高并发优化版)
138
- 使用 while True 循环来处理序列号溢出时的重试逻辑
139
- """
140
124
  while True:
141
- # 1. 快速获取当前时间
142
125
  current_timestamp = self._get_current_timestamp()
143
126
 
144
- # 2. 加锁,保证状态更新的原子性
145
127
  with self.lock:
146
- # 读取当前状态(快照)
147
128
  last_timestamp = self.last_timestamp
148
- sequence = self.sequence
149
129
 
150
- # 2.1 处理时钟回拨
130
+ # 时钟回拨处理
151
131
  time_diff = last_timestamp - current_timestamp
152
132
  if time_diff > 0:
153
133
  if time_diff > self.CLOCK_BACKWARD_THRESHOLD:
154
- # 大幅回拨:直接“借用”未来1ms
155
134
  current_timestamp = last_timestamp + 1
156
135
  else:
157
- # 微小回拨:锁内自旋等待追上(通常很快)
158
136
  while current_timestamp <= last_timestamp:
159
137
  current_timestamp = self._get_current_timestamp()
160
138
 
161
- # 2.2 计算序列号
162
139
  if current_timestamp == last_timestamp:
163
- # 同一毫秒内
164
- sequence = (sequence + 1) & self.MAX_SEQUENCE
165
- if sequence == 0:
166
- self.lock.release() # 手动释放锁
167
-
168
- # 锁外自旋等待下一毫秒
140
+ self.sequence = (self.sequence + 1) & self.MAX_SEQUENCE
141
+ if self.sequence == 0:
142
+ # 序列号溢出:自旋等待下一毫秒(锁内等待,保证状态一致)
169
143
  while current_timestamp <= last_timestamp:
170
144
  current_timestamp = self._get_current_timestamp()
145
+ # else: sequence 正常递增,继续往下生成
146
+ elif current_timestamp > last_timestamp:
147
+ self.sequence = 0
171
148
 
172
- # 等待到了新毫秒,进入下一轮循环(continue 默认行为),重新抢锁竞争
173
- continue
149
+ self.last_timestamp = current_timestamp
174
150
 
175
- elif current_timestamp > last_timestamp:
176
- # 时间推进,重置序列号
177
- sequence = 0
178
- self.last_timestamp = current_timestamp
179
- self.sequence = sequence
180
- else:
181
- # current < last 的情况通常已被回拨逻辑处理
182
- pass
183
-
184
- # 2.4 生成 ID
185
- snowflake_id = (
186
- ((current_timestamp - self.START_TIMESTAMP)
187
- << self.TIMESTAMP_SHIFT)
151
+ return (
152
+ ((current_timestamp - self.START_TIMESTAMP) << self.TIMESTAMP_SHIFT)
188
153
  | (self.machine_id << self.MACHINE_ID_SHIFT)
189
- | sequence
154
+ | self.sequence
190
155
  )
191
156
 
192
- # 更新全局状态(如果是同一毫秒)
193
- if current_timestamp == self.last_timestamp:
194
- self.sequence = sequence
195
-
196
- # 成功生成 ID,退出循环
197
- return snowflake_id
198
-
199
157
  @staticmethod
200
158
  def parse_id(snowflake_id: int) -> dict:
201
159
  from datetime import datetime
@@ -206,8 +164,6 @@ class Snowflake:
206
164
  Snowflake.START_TIMESTAMP
207
165
  generate_time = datetime.fromtimestamp(
208
166
  timestamp / 1000).strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
209
-
210
- # 判断服务来源(Python: 512-1023, Java: 0-511)
211
167
  service_type = "python" if machine_id >= Snowflake.PYTHON_MACHINE_ID_MIN else "java"
212
168
 
213
169
  return {
@@ -235,7 +191,7 @@ class Snowflake:
235
191
  if __name__ == "__main__":
236
192
  import concurrent.futures
237
193
 
238
- print("=== 高并发终极版 Snowflake 性能测试 ===")
194
+ print("=== Snowflake 性能测试 ===")
239
195
  count = 100000
240
196
  workers = 100
241
197
 
@@ -245,7 +201,7 @@ if __name__ == "__main__":
245
201
  def task():
246
202
  return Snowflake.id
247
203
 
248
- with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
204
+ with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
249
205
  futures = [executor.submit(task) for _ in range(count)]
250
206
  for future in concurrent.futures.as_completed(futures):
251
207
  ids.append(future.result())
@@ -256,7 +212,7 @@ if __name__ == "__main__":
256
212
  unique_count = len(set(ids))
257
213
  print(f"生成数量: {len(ids)}")
258
214
  print(f"唯一ID数量: {unique_count}")
259
- print(f"是否有重复: {'是' if unique_count != len(ids) else '否'}")
215
+ print(f"是否有重复: {'是' if unique_count != len(ids) else '否'}")
260
216
  print(f"总耗时: {duration:.4f} 秒")
261
217
  print(f"吞吐量 (QPS): {len(ids) / duration:,.2f}")
262
218
  print("\n最后一个ID解析:")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.5a13
3
+ Version: 0.2.5a15
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown