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.
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/pyproject.toml +1 -1
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/deep_agent.py +22 -0
- sycommon_python_lib-0.2.7a46/src/sycommon/agent/reasoning_content_patch.py +88 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/file_ops.py +4 -5
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/http_sandbox_backend.py +180 -69
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/minio_sync.py +71 -14
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/sandbox.py +48 -18
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/sandbox.py +1 -8
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/README.md +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/resume_compactor.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tests/test_upgrade_verification.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/tests/test_sync_skills_to_sandbox.py +0 -0
{sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/deep_agent.py
RENAMED
|
@@ -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}")
|
{sycommon_python_lib-0.2.7a44 → sycommon_python_lib-0.2.7a46}/src/sycommon/agent/sandbox/file_ops.py
RENAMED
|
@@ -41,11 +41,10 @@ if TYPE_CHECKING:
|
|
|
41
41
|
# 沙箱 API 路径前缀
|
|
42
42
|
SANDBOX_API_PREFIX = "/v1/sandbox"
|
|
43
43
|
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
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
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
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
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
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
|
|
1200
|
-
"""
|
|
1298
|
+
async def adownload_to_file(self, path: str, dest: str, *, timeout: int = None) -> "FileDownloadResult":
|
|
1299
|
+
"""流式下载沙箱文件到本地 dest 路径(推荐用法,内存峰值≈单块)。
|
|
1201
1300
|
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1301
|
+
Args:
|
|
1302
|
+
path: 沙箱内文件路径
|
|
1303
|
+
dest: 本地目标文件路径(调用方负责清理;建议用 tempfile)
|
|
1304
|
+
timeout: 超时秒数
|
|
1305
|
+
|
|
1306
|
+
Returns:
|
|
1307
|
+
FileDownloadResult(path, dest, size, error)。error 非 None 即失败。
|
|
1205
1308
|
"""
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
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
|
-
|
|
1212
|
-
|
|
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
|
-
|
|
1237
|
-
|
|
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=
|
|
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
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
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
|
-
"""
|
|
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
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
SYLogger.warning(f"[MinIO]
|
|
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
|
-
|
|
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
|
-
|
|
627
|
-
|
|
628
|
-
|
|
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:不等会话结束扫描,免得沙箱中途崩溃丢文件。
|