sycommon-python-lib 0.2.7a44__tar.gz → 0.2.7a46__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 (339) hide show
  1. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/deep_agent.py +22 -0
  4. sycommon_python_lib-0.2.7a46/src/sycommon/agent/reasoning_content_patch.py +88 -0
  5. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/file_ops.py +4 -5
  6. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/http_sandbox_backend.py +180 -69
  7. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/minio_sync.py +71 -14
  8. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/sandbox.py +48 -18
  9. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/sandbox.py +1 -8
  10. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  11. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
  12. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/README.md +0 -0
  13. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/setup.cfg +0 -0
  14. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/__init__.py +0 -0
  15. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/cli.py +0 -0
  16. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/__init__.py +0 -0
  17. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/console.py +0 -0
  18. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/models.py +0 -0
  19. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/project.py +0 -0
  20. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/utils.py +0 -0
  21. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/__init__.py +0 -0
  22. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/README.md.tpl +0 -0
  23. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/__init__.py +0 -0
  24. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  25. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  26. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  27. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  28. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  29. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  30. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  31. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/api/query.py.tpl +0 -0
  32. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  33. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  34. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/app.py.tpl +0 -0
  35. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  36. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  37. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  38. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  39. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/db/service.py.tpl +0 -0
  40. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  41. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/model/parse.py.tpl +0 -0
  42. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  43. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  44. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/.env.tpl +0 -0
  45. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/.gitignore.tpl +0 -0
  46. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/Dockerfile.tpl +0 -0
  47. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/README.md.tpl +0 -0
  48. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/__init__.py +0 -0
  49. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/app.py.tpl +0 -0
  50. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/app.yaml.tpl +0 -0
  51. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  52. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/client/__init__.py.tpl +0 -0
  53. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/model/__init__.py.tpl +0 -0
  54. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/model/file_info.py.tpl +0 -0
  55. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/requirements.txt.tpl +0 -0
  56. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/README.md.tpl +0 -0
  57. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/__init__.py +0 -0
  58. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/app.py.tpl +0 -0
  59. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  60. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  61. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  62. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  63. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/README.md.tpl +0 -0
  64. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/__init__.py +0 -0
  65. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/api/__init__.py.tpl +0 -0
  66. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/api/echo.py.tpl +0 -0
  67. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  68. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  69. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/app.py.tpl +0 -0
  70. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/client/__init__.py.tpl +0 -0
  71. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/model/__init__.py.tpl +0 -0
  72. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  73. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/tools/mq.py.tpl +0 -0
  74. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/nexus/__init__.py +0 -0
  75. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/__init__.py +0 -0
  76. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/__main__.py +0 -0
  77. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/config.py +0 -0
  79. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/executor.py +0 -0
  80. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/registry.py +0 -0
  81. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/server.py +0 -0
  82. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/agents/__init__.py +0 -0
  83. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/agents/factory.py +0 -0
  84. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/agents/prompts.py +0 -0
  85. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/__init__.py +0 -0
  86. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/browser.py +0 -0
  87. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/__init__.py +0 -0
  88. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/console.py +0 -0
  89. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/dom.py +0 -0
  90. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/network.py +0 -0
  91. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  92. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/performance.py +0 -0
  93. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  94. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/client.py +0 -0
  95. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/protocol.py +0 -0
  96. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/repl.py +0 -0
  97. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cli.py +0 -0
  98. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/__init__.py +0 -0
  99. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/acp_cmd.py +0 -0
  100. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/cdp_cmd.py +0 -0
  101. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/chat_cmd.py +0 -0
  102. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/create_cmd.py +0 -0
  103. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/evaluate_cmd.py +0 -0
  104. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/init_cmd.py +0 -0
  105. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/memory_cmd.py +0 -0
  106. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/resume_cmd.py +0 -0
  107. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/rollback_cmd.py +0 -0
  108. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/run_cmd.py +0 -0
  109. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/__init__.py +0 -0
  110. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/backend.py +0 -0
  111. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/config.py +0 -0
  112. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/display.py +0 -0
  113. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/git_integration.py +0 -0
  114. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/llm.py +0 -0
  115. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/state.py +0 -0
  116. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/evaluate/__init__.py +0 -0
  117. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/evaluate/api_evaluator.py +0 -0
  118. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/__init__.py +0 -0
  119. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/compressor.py +0 -0
  120. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/full.py +0 -0
  121. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/hot.py +0 -0
  122. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/manager.py +0 -0
  123. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/warm.py +0 -0
  124. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/mode/__init__.py +0 -0
  125. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/mode/create.py +0 -0
  126. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/mode/optimize.py +0 -0
  127. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/models/__init__.py +0 -0
  128. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/models/config_models.py +0 -0
  129. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/__init__.py +0 -0
  130. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/baseline_tests.py +0 -0
  131. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/checkpoint.py +0 -0
  132. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/convergence.py +0 -0
  133. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/diagnosis.py +0 -0
  134. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/engine.py +0 -0
  135. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/environment.py +0 -0
  136. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/experience.py +0 -0
  137. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/harness_prompts.py +0 -0
  138. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/history.py +0 -0
  139. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/optimization_logger.py +0 -0
  140. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/pre_validation.py +0 -0
  141. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/reward.py +0 -0
  142. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/strategy_bandit.py +0 -0
  143. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/strategy_generator.py +0 -0
  144. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/strategy_prompts.py +0 -0
  145. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/simple_chat_agent.py +0 -0
  146. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/skills/__init__.py +0 -0
  147. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/__init__.py +0 -0
  148. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/__init__.py +0 -0
  149. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/__init__.py +0 -0
  150. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/client.py +0 -0
  151. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/fetch.py +0 -0
  152. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/ssh_init.py +0 -0
  153. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/tool.py +0 -0
  154. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/agent_manager.py +0 -0
  155. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/chat_events.py +0 -0
  156. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/mcp/__init__.py +0 -0
  157. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/mcp/models.py +0 -0
  158. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  159. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  160. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  161. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
  162. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
  163. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
  164. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  165. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/multi_agent_team.py +0 -0
  166. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/resume_compactor.py +0 -0
  167. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/__init__.py +0 -0
  168. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  169. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  170. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  171. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/session.py +0 -0
  172. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/summarization_utils.py +0 -0
  173. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/__init__.py +0 -0
  174. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/ldap_service.py +0 -0
  175. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/oa_cache.py +0 -0
  176. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/oa_crypto.py +0 -0
  177. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/oa_service.py +0 -0
  178. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  179. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/ACPAgentConfig.py +0 -0
  180. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/Config.py +0 -0
  181. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/DatabaseConfig.py +0 -0
  182. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  183. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/EmbeddingConfig.py +0 -0
  184. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/LLMConfig.py +0 -0
  185. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/LangfuseConfig.py +0 -0
  186. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/MQConfig.py +0 -0
  187. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/PgConfig.py +0 -0
  188. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/RedisConfig.py +0 -0
  189. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/RerankerConfig.py +0 -0
  190. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/SentryConfig.py +0 -0
  191. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
  192. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/XxlJobConfig.py +0 -0
  193. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/__init__.py +0 -0
  194. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/config_change_notifier.py +0 -0
  195. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/async_base_db_service.py +0 -0
  196. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/async_database_service.py +0 -0
  197. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/base_db_service.py +0 -0
  198. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/database_service.py +0 -0
  199. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/elasticsearch_service.py +0 -0
  200. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  201. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/redis_service.py +0 -0
  202. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/resilient_pg_saver.py +0 -0
  203. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/token_usage_db_service.py +0 -0
  204. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/health/__init__.py +0 -0
  205. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/health/health_check.py +0 -0
  206. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/health/metrics.py +0 -0
  207. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/health/ping.py +0 -0
  208. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/heartbeat_process/__init__.py +0 -0
  209. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  210. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  211. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  212. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/__init__.py +0 -0
  213. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/embedding.py +0 -0
  214. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/get_llm.py +0 -0
  215. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/llm_logger.py +0 -0
  216. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/llm_tokens.py +0 -0
  217. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  218. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  219. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  220. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/struct_token.py +0 -0
  221. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/sy_langfuse.py +0 -0
  222. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  223. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  224. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/token_usage_es_service.py +0 -0
  225. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  226. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/token_utils.py +0 -0
  227. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/usage_token.py +0 -0
  228. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/__init__.py +0 -0
  229. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/async_sql_logger.py +0 -0
  230. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/kafka_log.py +0 -0
  231. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/log_masker.py +0 -0
  232. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/logger_levels.py +0 -0
  233. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/logger_wrapper.py +0 -0
  234. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/process_logger.py +0 -0
  235. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/sql_logger.py +0 -0
  236. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/mcp_server/__init__.py +0 -0
  237. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/mcp_server/server.py +0 -0
  238. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/__init__.py +0 -0
  239. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/context.py +0 -0
  240. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/cors.py +0 -0
  241. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/docs.py +0 -0
  242. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/exception.py +0 -0
  243. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/middleware.py +0 -0
  244. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/monitor_memory.py +0 -0
  245. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/mq.py +0 -0
  246. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/timeout.py +0 -0
  247. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/token_tracking.py +0 -0
  248. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  249. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/traceid.py +0 -0
  250. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/__init__.py +0 -0
  251. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/base_http.py +0 -0
  252. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/log.py +0 -0
  253. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/mcp_server_config.py +0 -0
  254. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/mqlistener_config.py +0 -0
  255. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/mqmsg_model.py +0 -0
  256. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/mqsend_config.py +0 -0
  257. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/sso_user.py +0 -0
  258. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/token_usage.py +0 -0
  259. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/token_usage_mysql.py +0 -0
  260. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/xxljob_handler_config.py +0 -0
  261. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/notice/__init__.py +0 -0
  262. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  263. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/notice/wecom_message.py +0 -0
  264. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  265. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  266. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  267. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  268. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  269. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  270. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  271. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  272. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  273. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sentry/__init__.py +0 -0
  274. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sentry/sy_sentry.py +0 -0
  275. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/services.py +0 -0
  276. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sse/__init__.py +0 -0
  277. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sse/event.py +0 -0
  278. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sse/sse.py +0 -0
  279. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/__init__.py +0 -0
  280. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/example.py +0 -0
  281. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/example2.py +0 -0
  282. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/feign.py +0 -0
  283. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/feign_client.py +0 -0
  284. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_client_base.py +0 -0
  285. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  286. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  287. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_service.py +0 -0
  288. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  289. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  290. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/param.py +0 -0
  291. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/deep_agent_server.py +0 -0
  292. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_consistent_hash.py +0 -0
  293. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
  294. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_consumer_recovery.py +0 -0
  295. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_deep_agent.py +0 -0
  296. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
  297. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_email.py +0 -0
  298. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_encoding_cache.py +0 -0
  299. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_fix_verification.py +0 -0
  300. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_mcp_server.py +0 -0
  301. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
  302. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_mq.py +0 -0
  303. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_oa_login.py +0 -0
  304. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
  305. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_real_summarization.py +0 -0
  306. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_summarization_config.py +0 -0
  307. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_summarization_real.py +0 -0
  308. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
  309. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
  310. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
  311. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_upgrade_verification.py +0 -0
  312. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/__init__.py +0 -0
  313. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/async_utils.py +0 -0
  314. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/docs.py +0 -0
  315. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/env.py +0 -0
  316. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/merge_headers.py +0 -0
  317. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/snowflake.py +0 -0
  318. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/syemail.py +0 -0
  319. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/timing.py +0 -0
  320. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/xxljob/__init__.py +0 -0
  321. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/xxljob/xxljob_service.py +0 -0
  322. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  323. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  324. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  325. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
  326. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_acp_tool.py +0 -0
  327. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_asyncio_logging.py +0 -0
  328. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_config_change_notifier.py +0 -0
  329. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_hotreload_snapshot.py +0 -0
  330. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_llm_apikey_contextvar.py +0 -0
  331. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_log_masker.py +0 -0
  332. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_resilient_pg_saver.py +0 -0
  333. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_sandbox_path_guard.py +0 -0
  334. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_sensitive_guard.py +0 -0
  335. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_simple_chat_agent.py +0 -0
  336. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_skill_regex_upgrade.py +0 -0
  337. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_skill_write_guard.py +0 -0
  338. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_sycli.py +0 -0
  339. {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_sync_skills_to_sandbox.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.7a44
3
+ Version: 0.2.7a46
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.7a44"
3
+ version = "0.2.7a46"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -63,6 +63,7 @@ from sycommon.agent.middleware.sensitive_guard import SensitiveGuardMiddleware
63
63
  from deepagents.middleware.summarization import create_summarization_tool_middleware # noqa: F401 保留 re-export
64
64
  from sycommon.agent.summarization_utils import build_summarization_middleware
65
65
  from sycommon.agent.resume_compactor import maybe_compact_before_resume
66
+ import sycommon.agent.reasoning_content_patch # noqa: F401 提取 reasoning_content/reasoning 字段,避免思考型模型被判空响应
66
67
 
67
68
  # 流式逐 token 诊断日志开关(默认关)。开启后每个 chunk 都打印
68
69
  # chunk_type/content 等(仅供排障)。LLM 最终结果已由 LLMLogger.on_llm_end
@@ -219,6 +220,10 @@ def _patch_agent_streaming(agent):
219
220
  """替代 factory._execute_model_async: 用 astream + config 实现流式回调。"""
220
221
  from langchain.agents.middleware.types import ModelResponse
221
222
 
223
+ SYLogger.warning(
224
+ f"[STREAM-DEBUG] _patched_execute_model_async ENTERED | "
225
+ f"messages={len(request.messages)} 条 | "
226
+ f"has_system={bool(request.system_message)}")
222
227
  model_, effective_response_format = _get_bound_model(request)
223
228
  messages = request.messages
224
229
 
@@ -558,12 +563,24 @@ class DeepAgent:
558
563
  if _STREAM_DEBUG:
559
564
  print(
560
565
  f"[DeepAgent] chat() starting stream, message={repr(message[:80])}", flush=True)
566
+ SYLogger.warning(
567
+ f"[STREAM-DEBUG] agent.astream ABOUT TO START | "
568
+ f"thread={getattr(self, 'thread_id', '?')} | "
569
+ f"checkpoint_type={type(getattr(self, 'agent', None).__class__).__name__}")
570
+ _astream_chunk_count = 0
561
571
  async for chunk in self._astream_with_retry(
562
572
  input_state,
563
573
  max_retries=3,
564
574
  base_delay=1.0,
565
575
  ):
566
576
  # 🔑 逐 token 诊断日志:仅在 DEEP_AGENT_STREAM_DEBUG=true 时打印
577
+ _astream_chunk_count += 1
578
+ if _astream_chunk_count == 1:
579
+ _first = chunk
580
+ _first_type = type(chunk).__name__
581
+ SYLogger.warning(
582
+ f"[STREAM-DEBUG] agent.astream FIRST CHUNK received | "
583
+ f"type={_first_type}")
567
584
  if _STREAM_DEBUG:
568
585
  _chunk_len = len(chunk) if isinstance(
569
586
  chunk, tuple) else '?'
@@ -1011,6 +1028,11 @@ class DeepAgent:
1011
1028
  print(
1012
1029
  f"[DeepAgent] FOR LOOP ENDED. stream_step={stream_step}, ai_text_content={repr(ai_text_content[:100])}, tool_calls={len(current_tool_calls)}", flush=True)
1013
1030
 
1031
+ SYLogger.warning(
1032
+ f"[STREAM-DEBUG] FOR LOOP ENDED | _astream_chunk_count={_astream_chunk_count} | "
1033
+ f"stream_step={stream_step} | ai_text_len={len(ai_text_content)} | "
1034
+ f"tool_calls={len(current_tool_calls)}")
1035
+
1014
1036
  # 空响应检测:模型被调用但没有产出任何文本。
1015
1037
  # 🔑 治本修复:纯空响应(无文本且无工具调用,常见于用户派生 key 被网关拒、
1016
1038
  # 网关返回空壳 AIMessage 而非异常)不再静默只打 warning —— 把它翻译成
@@ -0,0 +1,88 @@
1
+ """langchain_openai reasoning_content / reasoning 字段提取补丁。
2
+
3
+ 根因:
4
+ langchain_openai 1.3.5 的 ChatOpenAI 只针对官方 OpenAI 规范,源码
5
+ (base.py:7) 明确声明:第三方 provider 的非标准字段(reasoning_content /
6
+ reasoning_details)**不解析**。思考型模型(Qwen3.5 的 reasoning、
7
+ LongCat-2.0 的 reasoning_content、DeepSeek-R1 等)把推理过程放在这些字段,
8
+ 被 _convert_delta_to_message_chunk(流式 chunk)/ _convert_dict_to_message
9
+ (非流式整包)直接丢弃。
10
+
11
+ deep_agent 的空响应判定(deep_agent.py:806-813, 1022)依赖
12
+ reasoning_content:模型把内容全放进 reasoning 字段时,content 为空,
13
+ langchain 又把 reasoning 字段丢了 → deep_agent 拿到既无 content 又无
14
+ reasoning_content 的空 AIMessage → 误判「空响应」触发三级降级,
15
+ 最终给用户空气泡。
16
+
17
+ 修复:
18
+ wrap 上述两个转换函数,把 delta/message 里的 reasoning_content / reasoning
19
+ 捞进 message.additional_kwargs["reasoning_content"](按字符串累加)。
20
+ AIMessageChunk 累加(+)时会自动拼接同名字符串,deep_agent 既有逻辑
21
+ (additional_kwargs.get("reasoning_content")) 即可正常读取,无需改 deep_agent。
22
+
23
+ 填 additional_kwargs 而非 content:reasoning 是推理过程,不应混进正文
24
+ content(否则会直接展示给用户 / 喂给工具解析)。deep_agent 已有专门分支
25
+ 把它作为 reasoning 事件单独 yield(带 data["reasoning"]=True)。
26
+
27
+ 等 langchain 官方支持 reasoning_content(>1.3.5)后删除本模块即可。
28
+ """
29
+ from __future__ import annotations
30
+
31
+ import logging
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+ # 不同 provider 的思考字段名:
36
+ # reasoning_content —— LongCat / DeepSeek-R1 / 智谱 GLM 等
37
+ # reasoning —— 部分 vLLM 部署的 Qwen
38
+ _REASONING_KEYS = ("reasoning_content", "reasoning")
39
+
40
+
41
+ def _extract_reasoning(d) -> str:
42
+ """从 delta/message dict 里提取思考内容(字符串拼接,兼容 str/dict 两种值形态)。"""
43
+ if not isinstance(d, dict):
44
+ return ""
45
+ for k in _REASONING_KEYS:
46
+ v = d.get(k)
47
+ if isinstance(v, str) and v:
48
+ return v
49
+ if isinstance(v, dict): # 个别 provider 包成 {"content": "..."}
50
+ inner = v.get("content") or v.get("text")
51
+ if isinstance(inner, str) and inner:
52
+ return inner
53
+ return ""
54
+
55
+
56
+ try:
57
+ import langchain_openai.chat_models.base as _lc_oai_base
58
+
59
+ _orig_delta = _lc_oai_base._convert_delta_to_message_chunk
60
+ _orig_dict = _lc_oai_base._convert_dict_to_message
61
+
62
+ def _with_reasoning(msg, rc: str):
63
+ """把 reasoning 追加到 message.additional_kwargs(不改原 dict,新构造)。"""
64
+ ak = dict(getattr(msg, "additional_kwargs", None) or {})
65
+ existing = ak.get("reasoning_content", "")
66
+ ak["reasoning_content"] = (existing + rc) if existing else rc
67
+ msg.additional_kwargs = ak
68
+ return msg
69
+
70
+ def _patched_convert_delta(_dict, default_class):
71
+ msg = _orig_delta(_dict, default_class)
72
+ rc = _extract_reasoning(_dict)
73
+ return _with_reasoning(msg, rc) if rc else msg
74
+
75
+ def _patched_convert_dict(_dict):
76
+ msg = _orig_dict(_dict)
77
+ rc = _extract_reasoning(_dict)
78
+ return _with_reasoning(msg, rc) if rc else msg
79
+
80
+ _lc_oai_base._convert_delta_to_message_chunk = _patched_convert_delta
81
+ _lc_oai_base._convert_dict_to_message = _patched_convert_dict
82
+ logger.info(
83
+ "[ReasoningContentPatch] 已 wrap _convert_delta_to_message_chunk / "
84
+ "_convert_dict_to_message,提取 reasoning_content/reasoning 字段")
85
+ except ImportError:
86
+ logger.debug("[ReasoningContentPatch] langchain_openai 不可用,跳过补丁")
87
+ except Exception as _patch_err: # pragma: no cover
88
+ logger.warning(f"[ReasoningContentPatch] 补丁应用失败: {_patch_err}")
@@ -41,11 +41,10 @@ if TYPE_CHECKING:
41
41
  # 沙箱 API 路径前缀
42
42
  SANDBOX_API_PREFIX = "/v1/sandbox"
43
43
 
44
- # 下载/读取的文件大小预检上限(OOM 兜底,env 可调)。
45
- # adownload_files 整包读 + base64 解码,agent 调 download 工具读大文件会把全量拉进内存;
46
- # aread 有行数 limit 但无字节上限。下载/读取前先 astat size,超限返回 error 让 agent
47
- # 改用 head/grep/offset+limit 读。astat 异常 fail-open(warning 后继续,避免额外 RPC 失败阻断)。
48
- MAX_DOWNLOAD_BYTES = int(os.environ.get("SANDBOX_DOWNLOAD_MAX_BYTES", 100 * 1024 * 1024))
44
+ # aread 读取的文件大小预检上限(OOM 兜底,env 可调)。
45
+ # aread /v1/sandbox/read,服务端另有 500KiB 截断(_READ_MAX_OUTPUT_BYTES),客户端 10MB
46
+ # 是早死早超生的预检,防 agent 把大文件读进 LLM 上下文。astat 异常 fail-open。
47
+ # 注:文件搬运(下载/分享/同步)已全部改走流式 adownload_to_file,无大小闸。
49
48
  MAX_READ_BYTES = int(os.environ.get("SANDBOX_READ_MAX_BYTES", 10 * 1024 * 1024))
50
49
 
51
50
 
@@ -15,11 +15,48 @@ import sys
15
15
  import tempfile
16
16
  import threading
17
17
  import requests
18
+ from dataclasses import dataclass
18
19
  from pathlib import Path, PurePosixPath
19
20
  from typing import Optional, List
20
21
 
21
22
  import aiohttp
22
23
 
24
+
25
+ def _run_coro_sync(coro):
26
+ """在当前线程同步跑一个 coroutine(供同步方法调用异步实现)。
27
+
28
+ 已在事件循环里则新起线程跑(避免嵌套 loop);否则 new_event_loop 跑。
29
+ 注意:coro 必须是「在任意线程新 loop 里都能跑」的——不要捕获外层 loop。
30
+ """
31
+ def _run_in_fresh_loop(c):
32
+ loop = asyncio.new_event_loop()
33
+ try:
34
+ return loop.run_until_complete(c)
35
+ finally:
36
+ loop.close()
37
+
38
+ try:
39
+ asyncio.get_running_loop()
40
+ in_loop = True
41
+ except RuntimeError:
42
+ in_loop = False
43
+
44
+ if in_loop:
45
+ import concurrent.futures
46
+ with concurrent.futures.ThreadPoolExecutor(max_workers=1) as ex:
47
+ return ex.submit(_run_in_fresh_loop, coro).result()
48
+ return _run_in_fresh_loop(coro)
49
+
50
+
51
+ @dataclass
52
+ class FileDownloadResult:
53
+ """流式下载结果(adownload_to_file 返回)。不含 content bytes——文件已落盘到 dest。"""
54
+ path: str
55
+ dest: Optional[str] = None
56
+ size: int = 0
57
+ error: Optional[str] = None
58
+
59
+
23
60
  from sycommon.logging.kafka_log import SYLogger
24
61
  from sycommon.agent.sandbox.file_ops import FileOperationsMixin, SANDBOX_API_PREFIX
25
62
 
@@ -29,6 +66,9 @@ from deepagents.backends.protocol import (
29
66
  FileDownloadResponse,
30
67
  FileUploadResponse,
31
68
  )
69
+ # FileDownloadResponse: 框架兼容(deepagents SkillsMiddleware/MemoryMiddleware 内部调
70
+ # backend.adownload_files 批量下载 SKILL.md/memory,需此类型)。流式下载用 FileDownloadResult。
71
+
32
72
 
33
73
  # SSL 上下文
34
74
  try:
@@ -44,6 +84,28 @@ _SKILL_PATH_RE = re.compile(
44
84
  )
45
85
 
46
86
 
87
+ def _extract_sandbox_error_code(body: str) -> Optional[str]:
88
+ """从沙箱错误响应体里提取规范 error 码(如 "file_not_found")。
89
+
90
+ 沙箱 4xx 错误体形如 {"error": "file_not_found", ...}。deepagents 的
91
+ MemoryMiddleware/SkillsMiddleware 约定 response.error == "file_not_found"
92
+ 时视为「缺失文件正常跳过」;其它值才 raise。故本函数把 body 里的 error
93
+ 字段原码提取出来,透传给上层;解析失败返回 None(调用方回退到整串)。
94
+ """
95
+ if not body:
96
+ return None
97
+ try:
98
+ import json as _json
99
+ obj = _json.loads(body)
100
+ if isinstance(obj, dict):
101
+ err = obj.get("error")
102
+ if isinstance(err, str) and err:
103
+ return err
104
+ except Exception:
105
+ pass
106
+ return None
107
+
108
+
47
109
  def _read_file_safe(path: str) -> bytes:
48
110
  with open(path, "rb") as f:
49
111
  return f.read()
@@ -1174,72 +1236,113 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
1174
1236
  path=path, error=str(ex)))
1175
1237
  return results
1176
1238
 
1177
- def download_files(self, paths: List[str]) -> List[FileDownloadResponse]:
1178
- """下载多个文件"""
1179
- results = []
1180
- for path in paths:
1239
+ # 流式下载块大小(与服务端 _STREAM_CHUNK 对齐)。客户端按此尺寸从 HTTP 响应流读块、
1240
+ # 写盘,内存峰值 ≈ 单块,与文件总大小无关。替代旧整包 download_files(base64 全量进内存)。
1241
+ _STREAM_CHUNK = int(os.environ.get("SANDBOX_STREAM_CHUNK", 1024 * 1024))
1242
+
1243
+ async def _download_stream_to_file(self, path: str, dest: str, *, timeout: int = None) -> "FileDownloadResult":
1244
+ """流式下载单个沙箱文件到本地 dest(内部实现,含 failover)。
1245
+
1246
+ 打 POST /v1/sandbox/download/stream,按 _STREAM_CHUNK 流式写盘,不进进程大内存。
1247
+ 失败时(瞬时网络抖动)原地重试一次,再切实例一次,策略对齐 _post_async_with_failover。
1248
+ """
1249
+ headers = self._build_headers()
1250
+ http_timeout = (timeout or self._timeout) + 30
1251
+ timeout_obj = aiohttp.ClientTimeout(total=http_timeout)
1252
+
1253
+ async def _do(base_url: str) -> "FileDownloadResult":
1254
+ session = await self._get_async_session()
1255
+ u = f"{base_url}{SANDBOX_API_PREFIX}/download/stream"
1256
+ async with session.post(u, json={"path": path, "user_id": self._user_id},
1257
+ headers=headers, timeout=timeout_obj) as resp:
1258
+ if resp.status >= 400:
1259
+ text = await resp.text()
1260
+ # 🔑 对齐 deepagents 约定:沙箱错误体里的 error 码必须原样透传
1261
+ # (如 "file_not_found")。MemoryMiddleware/SkillsMiddleware 据此
1262
+ # 判断「缺失文件 → 正常跳过 continue」;若包成 "HTTP 404: {...}"
1263
+ # 整串,框架匹配不上就会 raise ValueError,被上层当沙箱故障恢复 3 次,
1264
+ # 耗尽后 graph 产 0 chunk → 最终给用户「模型返回空响应」。
1265
+ _code = _extract_sandbox_error_code(text)
1266
+ return FileDownloadResult(
1267
+ path=path, error=_code or f"HTTP {resp.status}: {text[:200]}")
1268
+ with open(dest, "wb") as f:
1269
+ async for chunk in resp.content.iter_chunked(self._STREAM_CHUNK):
1270
+ f.write(chunk)
1271
+ return FileDownloadResult(path=path, dest=dest,
1272
+ size=os.path.getsize(dest))
1273
+
1274
+ last_exc: Optional[Exception] = None
1275
+ for attempt in range(2):
1181
1276
  try:
1182
- result = self._post_sync(
1183
- f"{SANDBOX_API_PREFIX}/download",
1184
- {"path": path, "user_id": self._user_id}
1185
- )
1186
- if result.get("error"):
1187
- results.append(FileDownloadResponse(
1188
- path=path,
1189
- error=result["error"]
1190
- ))
1191
- else:
1192
- content = base64.b64decode(result["content"])
1193
- results.append(FileDownloadResponse(
1194
- path=path, content=content))
1195
- except Exception as e:
1196
- results.append(FileDownloadResponse(path=path, error=str(e)))
1197
- return results
1277
+ return await _do(self._base_url)
1278
+ except (aiohttp.ClientError, asyncio.TimeoutError, OSError) as e:
1279
+ last_exc = e
1280
+ SYLogger.warning(
1281
+ f"[Sandbox] 流式下载失败 (尝试 {attempt+1}/2): "
1282
+ f"{self._base_url} path={path} - {e}")
1283
+ if attempt == 0:
1284
+ await asyncio.sleep(1)
1285
+ switched = await asyncio.to_thread(self._refresh_from_nacos_and_switch_sync)
1286
+ if switched:
1287
+ try:
1288
+ return await _do(self._base_url)
1289
+ except (aiohttp.ClientError, asyncio.TimeoutError, OSError) as e:
1290
+ last_exc = e
1291
+ SYLogger.warning(f"[Sandbox] 切实例后流式下载仍失败: {self._base_url} - {e}")
1292
+ try:
1293
+ os.unlink(dest)
1294
+ except OSError:
1295
+ pass
1296
+ return FileDownloadResult(path=path, error=f"流式下载失败: {last_exc}")
1198
1297
 
1199
- async def adownload_files(self, paths: List[str], *, timeout: int = None) -> List[FileDownloadResponse]:
1200
- """异步下载多个文件(真正的异步实现)
1298
+ async def adownload_to_file(self, path: str, dest: str, *, timeout: int = None) -> "FileDownloadResult":
1299
+ """流式下载沙箱文件到本地 dest 路径(推荐用法,内存峰值≈单块)。
1201
1300
 
1202
- 🔑 OOM 兜底:每个文件下载前先 astat 拿 size(只查 size 不读内容),
1203
- MAX_DOWNLOAD_BYTES 直接返回 error,避免整包读 + base64 解码把全量拉进内存。
1204
- astat 异常 fail-open(warning 后继续下载)。
1301
+ Args:
1302
+ path: 沙箱内文件路径
1303
+ dest: 本地目标文件路径(调用方负责清理;建议用 tempfile)
1304
+ timeout: 超时秒数
1305
+
1306
+ Returns:
1307
+ FileDownloadResult(path, dest, size, error)。error 非 None 即失败。
1205
1308
  """
1206
- from sycommon.agent.sandbox.file_ops import MAX_DOWNLOAD_BYTES
1207
- results = []
1208
- for path in paths:
1309
+ return await self._download_stream_to_file(path, dest, timeout=timeout)
1310
+
1311
+ # ---- 框架兼容:deepagents SkillsMiddleware/MemoryMiddleware 内部调
1312
+ # backend.adownload_files(paths) 批量下载 SKILL.md/memory(第三方代码,无法改)。
1313
+ # 这里保留 adownload_files/download_files 签名,内部走流式下载到临时文件再读 bytes,
1314
+ # 内存安全。业务代码(get_share_url/minio_sync 等)应优先用 adownload_to_file 不读回。
1315
+ async def adownload_files(self, paths: List[str], *, timeout: int = None) -> List[FileDownloadResponse]:
1316
+ """批量下载(框架兼容)。内部流式落临时文件再读 bytes。"""
1317
+ results: List[FileDownloadResponse] = []
1318
+ for p in paths:
1319
+ import tempfile as _tf
1320
+ with _tf.NamedTemporaryFile(delete=False) as _tmp:
1321
+ tmp_path = _tmp.name
1209
1322
  try:
1210
- # 大小预检:超限直接拒绝,不下载
1211
- try:
1212
- st = await self.astat(path=path)
1213
- if st and not getattr(st, "error", None) and getattr(st, "exists", False):
1214
- fsize = getattr(st, "size", 0) or 0
1215
- if fsize > MAX_DOWNLOAD_BYTES:
1216
- cap_mb = MAX_DOWNLOAD_BYTES // (1024 * 1024)
1217
- SYLogger.warning(f"[Sandbox] 文件过大拒绝下载: {path}, size={fsize}")
1218
- results.append(FileDownloadResponse(
1219
- path=path,
1220
- error=f"file too large ({fsize // (1024*1024)}MB > {cap_mb}MB)"))
1221
- continue
1222
- except Exception as se:
1223
- SYLogger.warning(f"[Sandbox] astat 预检失败(继续下载): {se}")
1224
-
1225
- result = await self._post_async_with_failover(
1226
- f"{SANDBOX_API_PREFIX}/download",
1227
- {"path": path, "user_id": self._user_id},
1228
- timeout=timeout
1229
- )
1230
- if result.get("error"):
1231
- results.append(FileDownloadResponse(
1232
- path=path,
1233
- error=result["error"]
1234
- ))
1323
+ r = await self.adownload_to_file(p, tmp_path, timeout=timeout)
1324
+ if r.error:
1325
+ results.append(FileDownloadResponse(path=p, error=r.error))
1235
1326
  else:
1236
- content = base64.b64decode(result["content"])
1237
- results.append(FileDownloadResponse(
1238
- path=path, content=content))
1327
+ with open(tmp_path, "rb") as _f:
1328
+ results.append(FileDownloadResponse(path=p, content=_f.read()))
1239
1329
  except Exception as e:
1240
- results.append(FileDownloadResponse(path=path, error=str(e)))
1330
+ results.append(FileDownloadResponse(path=p, error=str(e)))
1331
+ finally:
1332
+ try:
1333
+ os.unlink(tmp_path)
1334
+ except OSError:
1335
+ pass
1241
1336
  return results
1242
1337
 
1338
+ def download_files(self, paths: List[str]) -> List[FileDownloadResponse]:
1339
+ """批量下载(同步包装,框架兼容)。"""
1340
+ return _run_coro_sync(self.adownload_files(paths))
1341
+
1342
+ def download_to_file(self, path: str, dest: str, *, timeout: int = None) -> "FileDownloadResult":
1343
+ """流式下载(同步包装)。在线程池独立 loop 里跑 adownload_to_file。"""
1344
+ return _run_coro_sync(self.adownload_to_file(path, dest, timeout=timeout))
1345
+
1243
1346
  # ============== 目录同步 ==============
1244
1347
 
1245
1348
  def _sync_sync(self) -> dict:
@@ -1552,18 +1655,26 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
1552
1655
  continue
1553
1656
  file_path = file_info["path"]
1554
1657
  try:
1555
- download_result = self._post_sync(
1556
- f"{SANDBOX_API_PREFIX}/download",
1557
- {"path": file_path, "user_id": self._user_id}
1558
- )
1559
- if download_result.get("error"):
1560
- failed_count += 1
1561
- errors.append(
1562
- {"path": file_path, "error": download_result["error"]})
1563
- else:
1564
- content = base64.b64decode(download_result["content"])
1565
- files_to_sync.append((file_path, content))
1566
- success_count += 1
1658
+ # 流式下载到临时文件再读 bytes(旧实现走整包 /download base64 全量进内存)。
1659
+ # 同步上下文:在线程池里跑 adownload_to_file。文件通常为技能/memory/历史小文件,
1660
+ # 落盘读回可接受;大文件也不爆内存。
1661
+ import tempfile as _tf
1662
+ with _tf.NamedTemporaryFile(delete=False) as _tmp:
1663
+ tmp_path = _tmp.name
1664
+ try:
1665
+ r = _run_coro_sync(self.adownload_to_file(file_path, tmp_path))
1666
+ if r.error:
1667
+ failed_count += 1
1668
+ errors.append({"path": file_path, "error": r.error})
1669
+ else:
1670
+ with open(tmp_path, "rb") as _f:
1671
+ files_to_sync.append((file_path, _f.read()))
1672
+ success_count += 1
1673
+ finally:
1674
+ try:
1675
+ os.unlink(tmp_path)
1676
+ except OSError:
1677
+ pass
1567
1678
  except Exception as e:
1568
1679
  failed_count += 1
1569
1680
  errors.append({"path": file_path, "error": str(e)})
@@ -196,6 +196,44 @@ class MinioSyncService(metaclass=SingletonMeta):
196
196
  SYLogger.error(f"[MinIO] Upload failed: {object_key}, error={e}")
197
197
  return False
198
198
 
199
+ def upload_stream(self, object_key: str, file_obj, length: int,
200
+ content_type: str = "application/octet-stream") -> bool:
201
+ """从 file-like 对象流式分片上传(大文件专用,内存峰值≈5MB)。
202
+
203
+ MinIO put_object(length=size, part_size=0) 自动按 5MB 分片读 file_obj,
204
+ 不一次性 read 全文件。已验证 50/100/200MB 上传内存峰值恒定 5MB。
205
+
206
+ Args:
207
+ object_key: MinIO 对象 key
208
+ file_obj: 有 read() 的二进制文件对象(如 open(path,'rb'))
209
+ length: 文件总字节数(必传,决定分片数)
210
+ content_type: MIME
211
+ """
212
+ if not self._client:
213
+ return False
214
+ try:
215
+ self._client.put_object(
216
+ bucket_name=self._bucket,
217
+ object_name=object_key,
218
+ data=file_obj,
219
+ length=length,
220
+ content_type=content_type,
221
+ # part_size=0 → minio 按 length 自动算 5MB 分片
222
+ )
223
+ SYLogger.info(
224
+ f"[MinIO] Stream upload success: {object_key}, size={length}")
225
+ return True
226
+ except Exception as e:
227
+ SYLogger.error(f"[MinIO] Stream upload failed: {object_key}, error={e}")
228
+ return False
229
+
230
+ async def aupload_stream(self, object_key: str, file_obj, length: int,
231
+ content_type: str = "application/octet-stream") -> bool:
232
+ """异步流式分片上传"""
233
+ return await asyncio.to_thread(
234
+ self.upload_stream, object_key, file_obj, length, content_type)
235
+
236
+
199
237
  async def aupload_bytes(self, object_key: str, content: bytes,
200
238
  content_type: str = "application/octet-stream") -> bool:
201
239
  """异步上传文件到 MinIO"""
@@ -606,30 +644,49 @@ class MinioSyncService(metaclass=SingletonMeta):
606
644
 
607
645
  async def _sync_one(self, sandbox_backend, fp: str,
608
646
  existing_objects: dict, prefix: str) -> bool:
609
- """同步单个文件:下载 + 上传,成功返回 True"""
647
+ """同步单个文件:流式下载到临时文件 + 流式上传 MinIO,成功返回 True
648
+
649
+ 内存峰值≈5MB(沙箱流式落盘 + MinIO 5MB 分片),与文件大小无关。
650
+ 替代旧实现(adownload_files 整包读 + upload_bytes 全量进内存)。
651
+ """
652
+ import tempfile as _tf
653
+ tmp_path = None
610
654
  try:
611
- results = await sandbox_backend.adownload_files([f"/{fp}"])
612
- if not results or results[0].error or not results[0].content:
613
- error = results[0].error if results else "unknown"
614
- SYLogger.warning(f"[MinIO] 下载沙箱文件失败: {fp}, error={error}")
655
+ # MinIO 已有且 size 相同时,用 astat 的 size 先判跳过(省一次下载)
656
+ st = await sandbox_backend.astat(path=f"/{fp}")
657
+ if not st or getattr(st, "error", None) or not getattr(st, "exists", False):
658
+ SYLogger.warning(f"[MinIO] astat 沙箱文件失败/不存在: {fp}")
615
659
  return False
616
-
617
- content = results[0].content
618
-
619
- # 如果 MinIO 已有且 size 相同,跳过
620
- if fp in existing_objects and existing_objects[fp].size == len(content):
660
+ fsize = getattr(st, "size", 0) or 0
661
+ if fp in existing_objects and existing_objects[fp].size == fsize:
621
662
  return False
622
663
 
623
664
  mime_type, _ = mimetypes.guess_type(fp)
624
665
  object_key = f"{prefix}{fp}"
625
666
 
626
- return await self.aupload_bytes(
627
- object_key, content,
628
- content_type=mime_type or "application/octet-stream",
629
- )
667
+ # 流式下载到临时文件
668
+ with _tf.NamedTemporaryFile(delete=False) as tmp:
669
+ tmp_path = tmp.name
670
+ r = await sandbox_backend.adownload_to_file(f"/{fp}", tmp_path)
671
+ if r.error or r.size == 0:
672
+ SYLogger.warning(f"[MinIO] 流式下载沙箱文件失败: {fp}, error={r.error}")
673
+ return False
674
+ # 流式分片上传 MinIO(open 后由 minio 内部 5MB 分片读,不进大内存)
675
+ with open(tmp_path, "rb") as f:
676
+ return await self.aupload_stream(
677
+ object_key, f, r.size,
678
+ content_type=mime_type or "application/octet-stream",
679
+ )
630
680
  except Exception as e:
631
681
  SYLogger.warning(f"[MinIO] 同步文件异常: {fp}, error={e}")
632
682
  return False
683
+ finally:
684
+ if tmp_path:
685
+ try:
686
+ os.unlink(tmp_path)
687
+ except OSError:
688
+ pass
689
+
633
690
 
634
691
  # ============== 用户上传文件直推(fire-and-forget 后台)==============
635
692
  # 用户刚传上来的文件优先落 MinIO:不等会话结束扫描,免得沙箱中途崩溃丢文件。