sycommon-python-lib 0.2.7a10__tar.gz → 0.2.7a12__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.7a10 → sycommon_python_lib-0.2.7a12}/PKG-INFO +6 -6
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/pyproject.toml +6 -6
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/deep_agent.py +52 -27
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/file_ops.py +16 -4
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/http_sandbox_backend.py +6 -2
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/get_llm.py +11 -1
- sycommon_python_lib-0.2.7a12/src/sycommon/middleware/context.py +16 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/PKG-INFO +6 -6
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/SOURCES.txt +2 -1
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/requires.txt +5 -5
- sycommon_python_lib-0.2.7a12/tests/test_sync_skills_to_sandbox.py +207 -0
- sycommon_python_lib-0.2.7a10/src/sycommon/middleware/context.py +0 -9
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/README.md +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/tests/test_sycli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7a12
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -11,14 +11,14 @@ Requires-Dist: anyio==4.14.1
|
|
|
11
11
|
Requires-Dist: decorator==5.3.1
|
|
12
12
|
Requires-Dist: deepagents==0.6.12
|
|
13
13
|
Requires-Dist: elasticsearch==9.4.1
|
|
14
|
-
Requires-Dist: fastapi==0.
|
|
14
|
+
Requires-Dist: fastapi==0.139.0
|
|
15
15
|
Requires-Dist: jinja2==3.1.6
|
|
16
|
-
Requires-Dist: kafka-python==3.0.
|
|
16
|
+
Requires-Dist: kafka-python==3.0.7
|
|
17
17
|
Requires-Dist: langchain==1.3.11
|
|
18
18
|
Requires-Dist: langchain-core==1.4.8
|
|
19
19
|
Requires-Dist: langchain-openai==1.3.3
|
|
20
|
-
Requires-Dist: langfuse==4.
|
|
21
|
-
Requires-Dist: langgraph==1.2.
|
|
20
|
+
Requires-Dist: langfuse==4.13.0
|
|
21
|
+
Requires-Dist: langgraph==1.2.7
|
|
22
22
|
Requires-Dist: langgraph-checkpoint-postgres==3.1.0
|
|
23
23
|
Requires-Dist: langgraph-checkpoint-redis==0.5.0
|
|
24
24
|
Requires-Dist: ldap3==2.9.1
|
|
@@ -32,7 +32,7 @@ Requires-Dist: python-dotenv==1.2.2
|
|
|
32
32
|
Requires-Dist: python-multipart==0.0.32
|
|
33
33
|
Requires-Dist: pyyaml==6.0.3
|
|
34
34
|
Requires-Dist: redis==7.4.0
|
|
35
|
-
Requires-Dist: sentry-sdk[fastapi]==2.
|
|
35
|
+
Requires-Dist: sentry-sdk[fastapi]==2.64.0
|
|
36
36
|
Requires-Dist: sqlalchemy[asyncio]==2.0.51
|
|
37
37
|
Requires-Dist: starlette[full]==1.3.1
|
|
38
38
|
Requires-Dist: tiktoken==0.13.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sycommon-python-lib"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.7a12"
|
|
4
4
|
description = "Add your description here"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -12,14 +12,14 @@ dependencies = [
|
|
|
12
12
|
"decorator==5.3.1",
|
|
13
13
|
"deepagents==0.6.12",
|
|
14
14
|
"elasticsearch==9.4.1",
|
|
15
|
-
"fastapi==0.
|
|
15
|
+
"fastapi==0.139.0",
|
|
16
16
|
"jinja2==3.1.6",
|
|
17
|
-
"kafka-python==3.0.
|
|
17
|
+
"kafka-python==3.0.7",
|
|
18
18
|
"langchain==1.3.11",
|
|
19
19
|
"langchain-core==1.4.8",
|
|
20
20
|
"langchain-openai==1.3.3",
|
|
21
|
-
"langfuse==4.
|
|
22
|
-
"langgraph==1.2.
|
|
21
|
+
"langfuse==4.13.0",
|
|
22
|
+
"langgraph==1.2.7",
|
|
23
23
|
"langgraph-checkpoint-postgres==3.1.0",
|
|
24
24
|
"langgraph-checkpoint-redis==0.5.0",
|
|
25
25
|
"ldap3==2.9.1",
|
|
@@ -33,7 +33,7 @@ dependencies = [
|
|
|
33
33
|
"python-multipart==0.0.32",
|
|
34
34
|
"pyyaml==6.0.3",
|
|
35
35
|
"redis==7.4.0",
|
|
36
|
-
"sentry-sdk[fastapi]==2.
|
|
36
|
+
"sentry-sdk[fastapi]==2.64.0",
|
|
37
37
|
"sqlalchemy[asyncio]==2.0.51",
|
|
38
38
|
"starlette[full]==1.3.1",
|
|
39
39
|
"tiktoken==0.13.0",
|
{sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/deep_agent.py
RENAMED
|
@@ -1346,46 +1346,67 @@ async def _sync_skills_to_sandbox(
|
|
|
1346
1346
|
版本比较只看沙箱 sandbox_dest/{name}/SKILL.md,无需 MinIO 锚点:
|
|
1347
1347
|
- 沙箱有该技能且 version 一致 → 跳过
|
|
1348
1348
|
- 沙箱没有 / 版本不一致 → 从本地 skills/ 全量上传到沙箱
|
|
1349
|
+
|
|
1350
|
+
性能: 比对与上传均绕过 backend 的懒同步(_skip_lazy_sync=True),
|
|
1351
|
+
避免「比对 read SKILL.md 前先整目录上传」「删除前先上传再删」的往返浪费。
|
|
1352
|
+
多技能的 SKILL.md 比对用 gather 并发; batch_upload 服务端无条件覆盖,
|
|
1353
|
+
无需先删(删除仅在版本不一致时做,用 adelete 走 /delete 而非 /execute)。
|
|
1349
1354
|
"""
|
|
1350
1355
|
if not os.path.isdir(skills_dir):
|
|
1351
1356
|
return
|
|
1352
1357
|
|
|
1353
1358
|
try:
|
|
1354
|
-
#
|
|
1355
|
-
|
|
1356
|
-
tree_result = await backend.atree(sandbox_dest, max_depth=1)
|
|
1357
|
-
if tree_result and tree_result.tree and tree_result.tree.children:
|
|
1358
|
-
for child in tree_result.tree.children:
|
|
1359
|
-
if child.is_dir:
|
|
1360
|
-
existing_dirs.add(child.name)
|
|
1361
|
-
|
|
1362
|
-
skill_count = 0
|
|
1363
|
-
skip_count = 0
|
|
1359
|
+
# 收集本地技能名 + 本地版本(纯本地读,快)
|
|
1360
|
+
local_skills = [] # [(skill_name, local_version, src_path)]
|
|
1364
1361
|
for skill_name in sorted(os.listdir(skills_dir)):
|
|
1365
1362
|
src = os.path.join(skills_dir, skill_name)
|
|
1366
1363
|
if not os.path.isdir(src):
|
|
1367
1364
|
continue
|
|
1368
|
-
|
|
1369
|
-
# 读取本地版本
|
|
1370
|
-
local_skill_md = os.path.join(src, "SKILL.md")
|
|
1371
1365
|
local_version = ""
|
|
1366
|
+
local_skill_md = os.path.join(src, "SKILL.md")
|
|
1372
1367
|
if os.path.isfile(local_skill_md):
|
|
1373
1368
|
try:
|
|
1374
1369
|
with open(local_skill_md, "r", encoding="utf-8") as f:
|
|
1375
1370
|
local_version = _parse_skill_version(f.read())
|
|
1376
1371
|
except Exception:
|
|
1377
1372
|
pass
|
|
1373
|
+
local_skills.append((skill_name, local_version, src))
|
|
1378
1374
|
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1375
|
+
# 获取沙箱 sandbox_dest 下已有的目录列表(一次 atree)
|
|
1376
|
+
existing_dirs = set()
|
|
1377
|
+
tree_result = await backend.atree(sandbox_dest, max_depth=1)
|
|
1378
|
+
if tree_result and tree_result.tree and tree_result.tree.children:
|
|
1379
|
+
for child in tree_result.tree.children:
|
|
1380
|
+
if child.is_dir:
|
|
1381
|
+
existing_dirs.add(child.name)
|
|
1382
|
+
|
|
1383
|
+
# 并发读取所有已存在技能的沙箱 SKILL.md 比对版本(跳过懒同步)
|
|
1384
|
+
async def _read_remote_version(skill_name: str) -> str:
|
|
1385
|
+
if skill_name not in existing_dirs:
|
|
1386
|
+
return ""
|
|
1387
|
+
try:
|
|
1388
|
+
remote_content = await backend.aread(
|
|
1389
|
+
f"{sandbox_dest}/{skill_name}/SKILL.md",
|
|
1390
|
+
_skip_lazy_sync=True)
|
|
1391
|
+
if remote_content and remote_content.file_data:
|
|
1392
|
+
# FileData 是 TypedDict(dict), 用键访问而非属性
|
|
1393
|
+
return _parse_skill_version(
|
|
1394
|
+
remote_content.file_data.get("content", "") or "")
|
|
1395
|
+
except Exception:
|
|
1396
|
+
pass
|
|
1397
|
+
return ""
|
|
1398
|
+
|
|
1399
|
+
remote_versions = await asyncio.gather(
|
|
1400
|
+
*[_read_remote_version(name) for name, _, _ in local_skills]
|
|
1401
|
+
)
|
|
1402
|
+
remote_version_map = {
|
|
1403
|
+
name: rv for (name, _, _), rv in zip(local_skills, remote_versions)
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
skill_count = 0
|
|
1407
|
+
skip_count = 0
|
|
1408
|
+
for skill_name, local_version, src in local_skills:
|
|
1409
|
+
remote_version = remote_version_map.get(skill_name, "")
|
|
1389
1410
|
|
|
1390
1411
|
if remote_version and remote_version == local_version:
|
|
1391
1412
|
SYLogger.debug(
|
|
@@ -1394,10 +1415,13 @@ async def _sync_skills_to_sandbox(
|
|
|
1394
1415
|
skip_count += 1
|
|
1395
1416
|
continue
|
|
1396
1417
|
|
|
1397
|
-
#
|
|
1418
|
+
# 版本不一致或无版本,删除旧目录(走 /delete,跳过懒同步,毫秒级)
|
|
1398
1419
|
if skill_name in existing_dirs:
|
|
1399
1420
|
try:
|
|
1400
|
-
await backend.
|
|
1421
|
+
await backend.adelete(
|
|
1422
|
+
f"{sandbox_dest}/{skill_name}",
|
|
1423
|
+
recursive=True,
|
|
1424
|
+
_skip_lazy_sync=True)
|
|
1401
1425
|
SYLogger.info(
|
|
1402
1426
|
f"[DeepAgent] 技能版本不一致,覆盖: {skill_name} "
|
|
1403
1427
|
f"({remote_version or '无版本'} → {local_version})")
|
|
@@ -1405,7 +1429,7 @@ async def _sync_skills_to_sandbox(
|
|
|
1405
1429
|
SYLogger.warning(
|
|
1406
1430
|
f"[DeepAgent] 删除旧版技能失败: {skill_name}, {e}")
|
|
1407
1431
|
|
|
1408
|
-
# 全量上传整个技能目录到沙箱
|
|
1432
|
+
# 全量上传整个技能目录到沙箱(batch_upload 服务端无条件覆盖)
|
|
1409
1433
|
await backend.async_sync_dirs([(src, f"{sandbox_dest}/{skill_name}")])
|
|
1410
1434
|
backend._synced_skills.add(skill_name)
|
|
1411
1435
|
skill_count += 1
|
|
@@ -1417,7 +1441,8 @@ async def _sync_skills_to_sandbox(
|
|
|
1417
1441
|
# sandbox_dest 是虚拟绝对路径(/skills/system),沙箱 shell 不重映射裸绝对路径,
|
|
1418
1442
|
# 须拼 $_SANDBOX_WORKSPACE 指向真实 workspace 才能命中。否则 chmod 静默失败。
|
|
1419
1443
|
await backend.aexecute(
|
|
1420
|
-
f'chmod -R 555 "$_SANDBOX_WORKSPACE{sandbox_dest}"'
|
|
1444
|
+
f'chmod -R 555 "$_SANDBOX_WORKSPACE{sandbox_dest}"',
|
|
1445
|
+
_skip_lazy_sync=True)
|
|
1421
1446
|
SYLogger.info(f"[DeepAgent] 已设只读: chmod -R 555 {sandbox_dest}")
|
|
1422
1447
|
except Exception as e:
|
|
1423
1448
|
SYLogger.warning(f"[DeepAgent] chmod 只读失败(忽略): {e}")
|
{sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/sycommon/agent/sandbox/file_ops.py
RENAMED
|
@@ -333,11 +333,17 @@ class FileOperationsMixin:
|
|
|
333
333
|
limit: int = 2000,
|
|
334
334
|
*,
|
|
335
335
|
timeout: int = None,
|
|
336
|
+
_skip_lazy_sync: bool = False,
|
|
336
337
|
) -> ReadResult:
|
|
337
|
-
"""异步读取文件内容
|
|
338
|
+
"""异步读取文件内容
|
|
339
|
+
|
|
340
|
+
_skip_lazy_sync=True 时跳过懒同步(供内部技能版本比对用,
|
|
341
|
+
避免 read SKILL.md 触发整目录上传)。
|
|
342
|
+
"""
|
|
338
343
|
try:
|
|
339
344
|
# 按需懒同步:检测是否读取 skill 资源
|
|
340
|
-
|
|
345
|
+
if not _skip_lazy_sync:
|
|
346
|
+
await self._lazy_sync_skill_from_path(file_path)
|
|
341
347
|
|
|
342
348
|
await self._ensure_synced_async()
|
|
343
349
|
SYLogger.info(
|
|
@@ -738,10 +744,16 @@ class FileOperationsMixin:
|
|
|
738
744
|
recursive: bool = False,
|
|
739
745
|
*,
|
|
740
746
|
timeout: int = None,
|
|
747
|
+
_skip_lazy_sync: bool = False,
|
|
741
748
|
) -> DeleteResult:
|
|
742
|
-
"""异步删除文件或文件夹
|
|
749
|
+
"""异步删除文件或文件夹
|
|
750
|
+
|
|
751
|
+
_skip_lazy_sync=True 时跳过懒同步(供内部技能覆盖删除用,
|
|
752
|
+
避免「删之前先把要删的技能上传一遍」的浪费)。
|
|
753
|
+
"""
|
|
743
754
|
try:
|
|
744
|
-
|
|
755
|
+
if not _skip_lazy_sync:
|
|
756
|
+
await self._lazy_sync_skill_from_path(path)
|
|
745
757
|
await self._ensure_synced_async()
|
|
746
758
|
SYLogger.info(f"[Sandbox] 异步删除: {path} (recursive={recursive})")
|
|
747
759
|
result = await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/delete", {
|
|
@@ -813,17 +813,21 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
|
|
|
813
813
|
truncated=False
|
|
814
814
|
)
|
|
815
815
|
|
|
816
|
-
async def aexecute(self, command: str, *, timeout: int = None) -> ExecuteResponse:
|
|
816
|
+
async def aexecute(self, command: str, *, timeout: int = None, _skip_lazy_sync: bool = False) -> ExecuteResponse:
|
|
817
817
|
"""异步执行 shell 命令(服务端负责路径隔离和目录初始化)
|
|
818
818
|
|
|
819
819
|
如果命令引用了 /skills/<name>/ 下的资源,
|
|
820
820
|
会自动按需同步该 skill 的整个目录到沙箱。
|
|
821
|
+
|
|
822
|
+
_skip_lazy_sync=True 时跳过懒同步(仅供内部技能同步/删除使用,
|
|
823
|
+
避免删前先传、比对前先传的往返浪费)。
|
|
821
824
|
"""
|
|
822
825
|
command = self._inject_env(command)
|
|
823
826
|
SYLogger.info(f"[Sandbox] aexecute 开始: command={command}")
|
|
824
827
|
|
|
825
828
|
# 按需懒同步:检测命令中是否引用了 skill 资源
|
|
826
|
-
|
|
829
|
+
if not _skip_lazy_sync:
|
|
830
|
+
await self._lazy_sync_skill_from_path(command)
|
|
827
831
|
|
|
828
832
|
await self._ensure_synced_async()
|
|
829
833
|
SYLogger.info(f"[Sandbox] _ensure_synced_async 完成,开始执行命令: {command}")
|
|
@@ -10,7 +10,17 @@ from sycommon.middleware.context import current_llm_api_key
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def resolve_api_key(config_apikey: Optional[str]) -> str:
|
|
13
|
-
"""LLM 网关 apiKey 取值:per-user
|
|
13
|
+
"""LLM 网关 apiKey 取值:override → per-user 派生 key → 配置全局 key → "-" 兜底。
|
|
14
|
+
|
|
15
|
+
llm_key_override 优先级最高:stream_chat 在 LLM 报错降级时 set="global" 强制
|
|
16
|
+
走 nacos 全局 apiKey,或 set 成显式 key。默认 None 时走 per-user 派生 key。
|
|
17
|
+
"""
|
|
18
|
+
from sycommon.middleware.context import llm_key_override
|
|
19
|
+
ov = llm_key_override.get()
|
|
20
|
+
if ov == "global":
|
|
21
|
+
return config_apikey or "-"
|
|
22
|
+
if ov: # 显式指定 key
|
|
23
|
+
return ov
|
|
14
24
|
return current_llm_api_key.get() or config_apikey or "-"
|
|
15
25
|
|
|
16
26
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import contextvars
|
|
2
|
+
|
|
3
|
+
current_trace_id = contextvars.ContextVar("trace_id", default=None)
|
|
4
|
+
|
|
5
|
+
current_headers = contextvars.ContextVar("headers", default=None)
|
|
6
|
+
|
|
7
|
+
# per-user LLM 网关 apiKey:agent 创建入口 set,get_llm 读取,沿 task 树传播。
|
|
8
|
+
# 为 None 时 get_llm 回退到 LLMConfig.apiKey 全局 key。
|
|
9
|
+
current_llm_api_key = contextvars.ContextVar("llm_api_key", default=None)
|
|
10
|
+
|
|
11
|
+
# LLM 网关 apiKey 降级开关(resolve_api_key 最先检查,优先级高于派生 key):
|
|
12
|
+
# "global" = 强制用 nacos 全局 LLMConfig.apiKey(派生 key 失败时兜底)
|
|
13
|
+
# 其它非空字符串 = 直接用该 key
|
|
14
|
+
# None = 走 per-user 派生 key(默认,正常路径)
|
|
15
|
+
# 沿 asyncio task 树传播,请求结束自动重置 → 每次新请求仍优先派生 key。
|
|
16
|
+
llm_key_override = contextvars.ContextVar("llm_key_override", default=None)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7a12
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -11,14 +11,14 @@ Requires-Dist: anyio==4.14.1
|
|
|
11
11
|
Requires-Dist: decorator==5.3.1
|
|
12
12
|
Requires-Dist: deepagents==0.6.12
|
|
13
13
|
Requires-Dist: elasticsearch==9.4.1
|
|
14
|
-
Requires-Dist: fastapi==0.
|
|
14
|
+
Requires-Dist: fastapi==0.139.0
|
|
15
15
|
Requires-Dist: jinja2==3.1.6
|
|
16
|
-
Requires-Dist: kafka-python==3.0.
|
|
16
|
+
Requires-Dist: kafka-python==3.0.7
|
|
17
17
|
Requires-Dist: langchain==1.3.11
|
|
18
18
|
Requires-Dist: langchain-core==1.4.8
|
|
19
19
|
Requires-Dist: langchain-openai==1.3.3
|
|
20
|
-
Requires-Dist: langfuse==4.
|
|
21
|
-
Requires-Dist: langgraph==1.2.
|
|
20
|
+
Requires-Dist: langfuse==4.13.0
|
|
21
|
+
Requires-Dist: langgraph==1.2.7
|
|
22
22
|
Requires-Dist: langgraph-checkpoint-postgres==3.1.0
|
|
23
23
|
Requires-Dist: langgraph-checkpoint-redis==0.5.0
|
|
24
24
|
Requires-Dist: ldap3==2.9.1
|
|
@@ -32,7 +32,7 @@ Requires-Dist: python-dotenv==1.2.2
|
|
|
32
32
|
Requires-Dist: python-multipart==0.0.32
|
|
33
33
|
Requires-Dist: pyyaml==6.0.3
|
|
34
34
|
Requires-Dist: redis==7.4.0
|
|
35
|
-
Requires-Dist: sentry-sdk[fastapi]==2.
|
|
35
|
+
Requires-Dist: sentry-sdk[fastapi]==2.64.0
|
|
36
36
|
Requires-Dist: sqlalchemy[asyncio]==2.0.51
|
|
37
37
|
Requires-Dist: starlette[full]==1.3.1
|
|
38
38
|
Requires-Dist: tiktoken==0.13.0
|
|
@@ -5,14 +5,14 @@ anyio==4.14.1
|
|
|
5
5
|
decorator==5.3.1
|
|
6
6
|
deepagents==0.6.12
|
|
7
7
|
elasticsearch==9.4.1
|
|
8
|
-
fastapi==0.
|
|
8
|
+
fastapi==0.139.0
|
|
9
9
|
jinja2==3.1.6
|
|
10
|
-
kafka-python==3.0.
|
|
10
|
+
kafka-python==3.0.7
|
|
11
11
|
langchain==1.3.11
|
|
12
12
|
langchain-core==1.4.8
|
|
13
13
|
langchain-openai==1.3.3
|
|
14
|
-
langfuse==4.
|
|
15
|
-
langgraph==1.2.
|
|
14
|
+
langfuse==4.13.0
|
|
15
|
+
langgraph==1.2.7
|
|
16
16
|
langgraph-checkpoint-postgres==3.1.0
|
|
17
17
|
langgraph-checkpoint-redis==0.5.0
|
|
18
18
|
ldap3==2.9.1
|
|
@@ -26,7 +26,7 @@ python-dotenv==1.2.2
|
|
|
26
26
|
python-multipart==0.0.32
|
|
27
27
|
pyyaml==6.0.3
|
|
28
28
|
redis==7.4.0
|
|
29
|
-
sentry-sdk[fastapi]==2.
|
|
29
|
+
sentry-sdk[fastapi]==2.64.0
|
|
30
30
|
sqlalchemy[asyncio]==2.0.51
|
|
31
31
|
starlette[full]==1.3.1
|
|
32
32
|
tiktoken==0.13.0
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"""_sync_skills_to_sandbox 性能优化单测。
|
|
2
|
+
|
|
3
|
+
验证三点:
|
|
4
|
+
1. 比对/删除/上传全程不触发 backend 的懒同步(_skip_lazy_sync=True 生效)
|
|
5
|
+
2. 版本不一致时用 adelete(recursive=True) 删除(替代 aexecute rm -rf)
|
|
6
|
+
3. 多技能的 SKILL.md 比对是并发发出的(gather)
|
|
7
|
+
"""
|
|
8
|
+
import asyncio
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
import tempfile
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "src"))
|
|
16
|
+
|
|
17
|
+
from sycommon.models.sandbox import TreeNode # noqa: E402
|
|
18
|
+
from sycommon.agent.sandbox.file_ops import TreeResult # noqa: E402
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _skill_md(version: str) -> str:
|
|
22
|
+
return f"---\nname: x\ndescription: y\nversion: {version}\n---\nbody\n"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class FakeBackend:
|
|
26
|
+
"""记录所有调用 + 计数懒同步的假沙箱后端。
|
|
27
|
+
|
|
28
|
+
aread/adelete/aexecute 接受 _skip_lazy_sync 形参;
|
|
29
|
+
若该参数为 False, 计入 lazy_sync_calls(模拟真实 backend 的懒同步副作用)。
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self, remote_versions: dict[str, str], remote_exists: set[str]):
|
|
33
|
+
# remote_versions: {skill_name: version} ("" 表示无 version 字段)
|
|
34
|
+
# remote_exists: {skill_name, ...} atree 返回的已存在目录
|
|
35
|
+
self._remote_versions = remote_versions
|
|
36
|
+
self._remote_exists = remote_exists
|
|
37
|
+
self.lazy_sync_calls = 0 # 懒同步触发次数(应始终为 0)
|
|
38
|
+
self.aread_calls = [] # [(path, skip_lazy)]
|
|
39
|
+
self.adelete_calls = [] # [(path, recursive, skip_lazy)]
|
|
40
|
+
self.aexecute_calls = [] # [(command, skip_lazy)]
|
|
41
|
+
self.sync_dirs_calls = [] # [(src, dest)]
|
|
42
|
+
self._synced_skills = set()
|
|
43
|
+
self._aread_gate = asyncio.Event()
|
|
44
|
+
self._aread_gate.set() # 默认不阻塞; 个别 case 主动 clear 制造串行检测
|
|
45
|
+
|
|
46
|
+
# --- tree ---
|
|
47
|
+
async def atree(self, path, max_depth=1):
|
|
48
|
+
children = [TreeNode(path=f"/skills/system/{n}", name=n, is_dir=True)
|
|
49
|
+
for n in self._remote_exists]
|
|
50
|
+
return TreeResult(tree=TreeNode(path="/skills/system", name="system",
|
|
51
|
+
is_dir=True, children=children))
|
|
52
|
+
|
|
53
|
+
# --- read ---
|
|
54
|
+
async def aread(self, file_path, offset=0, limit=2000, *, timeout=None,
|
|
55
|
+
_skip_lazy_sync=False):
|
|
56
|
+
if not _skip_lazy_sync:
|
|
57
|
+
self.lazy_sync_calls += 1
|
|
58
|
+
self.aread_calls.append((file_path, _skip_lazy_sync))
|
|
59
|
+
await self._aread_gate.wait() # 用于并发性断言
|
|
60
|
+
# 解析 /skills/system/<name>/SKILL.md
|
|
61
|
+
parts = file_path.split("/")
|
|
62
|
+
name = parts[-2] if len(parts) >= 2 else ""
|
|
63
|
+
ver = self._remote_versions.get(name, None)
|
|
64
|
+
if ver is None:
|
|
65
|
+
return ReadResult(error=f"File '{file_path}': not found")
|
|
66
|
+
content = _skill_md(ver) if ver else "---\nname: x\n---\nbody\n"
|
|
67
|
+
from deepagents.backends.protocol import ReadResult
|
|
68
|
+
# FileData 是 TypedDict(dict)
|
|
69
|
+
return ReadResult(file_data={"content": content, "encoding": "utf-8"})
|
|
70
|
+
|
|
71
|
+
# --- delete ---
|
|
72
|
+
async def adelete(self, path, recursive=False, *, timeout=None,
|
|
73
|
+
_skip_lazy_sync=False):
|
|
74
|
+
if not _skip_lazy_sync:
|
|
75
|
+
self.lazy_sync_calls += 1
|
|
76
|
+
self.adelete_calls.append((path, recursive, _skip_lazy_sync))
|
|
77
|
+
from sycommon.agent.sandbox.file_ops import DeleteResult
|
|
78
|
+
return DeleteResult(path=path)
|
|
79
|
+
|
|
80
|
+
# --- execute (chmod 用) ---
|
|
81
|
+
async def aexecute(self, command, *, timeout=None, _skip_lazy_sync=False):
|
|
82
|
+
if not _skip_lazy_sync:
|
|
83
|
+
self.lazy_sync_calls += 1
|
|
84
|
+
self.aexecute_calls.append((command, _skip_lazy_sync))
|
|
85
|
+
from sycommon.agent.sandbox.http_sandbox_backend import ExecuteResponse
|
|
86
|
+
return ExecuteResponse(output="", exit_code=0, truncated=False)
|
|
87
|
+
|
|
88
|
+
# --- 上传整目录 ---
|
|
89
|
+
async def async_sync_dirs(self, dirs, *, timeout=None):
|
|
90
|
+
for src, dest in dirs:
|
|
91
|
+
self.sync_dirs_calls.append((src, dest))
|
|
92
|
+
return {src: {"success": 1, "failed": 0, "errors": []} for src, _ in dirs}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _make_skills_dir(specs):
|
|
96
|
+
"""specs: [(name, version_or_None)] -> 临时目录, 每技能含 SKILL.md"""
|
|
97
|
+
d = tempfile.mkdtemp()
|
|
98
|
+
for name, ver in specs:
|
|
99
|
+
sd = os.path.join(d, name)
|
|
100
|
+
os.makedirs(sd)
|
|
101
|
+
md = os.path.join(sd, "SKILL.md")
|
|
102
|
+
with open(md, "w") as f:
|
|
103
|
+
f.write(_skill_md(ver) if ver else "---\nname: x\n---\nbody\n")
|
|
104
|
+
# 加一个脚本文件, 让 async_sync_dirs 有东西传
|
|
105
|
+
with open(os.path.join(sd, "script.py"), "w") as f:
|
|
106
|
+
f.write("# x\n")
|
|
107
|
+
return d
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@pytest.mark.asyncio
|
|
111
|
+
async def test_versions_match_skips_all_upload_and_delete():
|
|
112
|
+
from sycommon.agent.deep_agent import _sync_skills_to_sandbox
|
|
113
|
+
skills = _make_skills_dir([("sy-a", "1.0.0"), ("sy-b", "2.0.0")])
|
|
114
|
+
backend = FakeBackend(
|
|
115
|
+
remote_versions={"sy-a": "1.0.0", "sy-b": "2.0.0"},
|
|
116
|
+
remote_exists={"sy-a", "sy-b"},
|
|
117
|
+
)
|
|
118
|
+
await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
|
|
119
|
+
chmod_readonly=False)
|
|
120
|
+
# 版本一致: 不传文件、不删
|
|
121
|
+
assert backend.sync_dirs_calls == []
|
|
122
|
+
assert backend.adelete_calls == []
|
|
123
|
+
# 全程不触发懒同步
|
|
124
|
+
assert backend.lazy_sync_calls == 0
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@pytest.mark.asyncio
|
|
128
|
+
async def test_version_mismatch_uses_adelete_recursive_no_lazy():
|
|
129
|
+
from sycommon.agent.deep_agent import _sync_skills_to_sandbox
|
|
130
|
+
skills = _make_skills_dir([("sy-a", "1.0.0")])
|
|
131
|
+
backend = FakeBackend(remote_versions={"sy-a": "0.9.0"}, # 沙箱旧版本
|
|
132
|
+
remote_exists={"sy-a"})
|
|
133
|
+
await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
|
|
134
|
+
chmod_readonly=False)
|
|
135
|
+
# 删除走 adelete(recursive=True), 而非 aexecute rm -rf
|
|
136
|
+
assert len(backend.adelete_calls) == 1
|
|
137
|
+
path, recursive, skip = backend.adelete_calls[0]
|
|
138
|
+
assert path == "/skills/system/sy-a"
|
|
139
|
+
assert recursive is True
|
|
140
|
+
assert skip is True
|
|
141
|
+
# 没有用 aexecute 删(rm -rf), chmod 也走 _skip_lazy_sync=True
|
|
142
|
+
for cmd, skip in backend.aexecute_calls:
|
|
143
|
+
assert skip is True
|
|
144
|
+
assert "rm -rf" not in cmd
|
|
145
|
+
# 上传了一次
|
|
146
|
+
assert len(backend.sync_dirs_calls) == 1
|
|
147
|
+
# 全程不触发懒同步
|
|
148
|
+
assert backend.lazy_sync_calls == 0
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@pytest.mark.asyncio
|
|
152
|
+
async def test_remote_no_version_triggers_overwrite():
|
|
153
|
+
"""沙箱旧副本无 version 字段(remote_version=="")→ 视为不一致 → 覆盖。"""
|
|
154
|
+
from sycommon.agent.deep_agent import _sync_skills_to_sandbox
|
|
155
|
+
skills = _make_skills_dir([("sy-a", "1.0.0")])
|
|
156
|
+
backend = FakeBackend(remote_versions={"sy-a": ""}, # 无 version
|
|
157
|
+
remote_exists={"sy-a"})
|
|
158
|
+
await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
|
|
159
|
+
chmod_readonly=False)
|
|
160
|
+
assert len(backend.adelete_calls) == 1 # 删旧
|
|
161
|
+
assert len(backend.sync_dirs_calls) == 1 # 重传
|
|
162
|
+
assert backend.lazy_sync_calls == 0
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
@pytest.mark.asyncio
|
|
166
|
+
async def test_remote_missing_skill_uploaded_without_delete():
|
|
167
|
+
"""沙箱里没有该技能(不在 existing_dirs)→ 直接传, 不删。"""
|
|
168
|
+
from sycommon.agent.deep_agent import _sync_skills_to_sandbox
|
|
169
|
+
skills = _make_skills_dir([("sy-new", "1.0.0")])
|
|
170
|
+
backend = FakeBackend(remote_versions={}, remote_exists=set())
|
|
171
|
+
await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
|
|
172
|
+
chmod_readonly=False)
|
|
173
|
+
assert backend.adelete_calls == [] # 没有旧目录可删
|
|
174
|
+
assert len(backend.sync_dirs_calls) == 1 # 直接传
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
@pytest.mark.asyncio
|
|
178
|
+
async def test_comparison_is_concurrent():
|
|
179
|
+
"""多技能的 aread 比对是 gather 并发, 不是串行。
|
|
180
|
+
|
|
181
|
+
用 gate 让每个 aread 阻塞; 串行下总耗时 ≈ N * delay, 并发下 ≈ delay。
|
|
182
|
+
"""
|
|
183
|
+
from sycommon.agent.deep_agent import _sync_skills_to_sandbox
|
|
184
|
+
skills = _make_skills_dir([("s1", "1.0.0"), ("s2", "1.0.0"), ("s3", "1.0.0")])
|
|
185
|
+
backend = FakeBackend(
|
|
186
|
+
remote_versions={"s1": "1.0.0", "s2": "1.0.0", "s3": "1.0.0"},
|
|
187
|
+
remote_exists={"s1", "s2", "s3"},
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
delay = 0.15
|
|
191
|
+
orig_aread = backend.aread
|
|
192
|
+
|
|
193
|
+
async def slow_aread(*a, **kw):
|
|
194
|
+
await asyncio.sleep(delay)
|
|
195
|
+
return await orig_aread(*a, **kw)
|
|
196
|
+
backend.aread = slow_aread
|
|
197
|
+
|
|
198
|
+
loop = asyncio.get_event_loop()
|
|
199
|
+
t0 = loop.time()
|
|
200
|
+
await _sync_skills_to_sandbox(skills, backend, sandbox_dest="/skills/system",
|
|
201
|
+
chmod_readonly=False)
|
|
202
|
+
elapsed = loop.time() - t0
|
|
203
|
+
|
|
204
|
+
# 并发: 3 个 aread 应在 ~delay 内完成; 串行至少 3*delay
|
|
205
|
+
assert elapsed < 3 * delay, (
|
|
206
|
+
f"比对疑似串行: elapsed={elapsed:.2f}s, delay={delay}s (并发应<{delay*2:.2f}s)")
|
|
207
|
+
assert backend.lazy_sync_calls == 0
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import contextvars
|
|
2
|
-
|
|
3
|
-
current_trace_id = contextvars.ContextVar("trace_id", default=None)
|
|
4
|
-
|
|
5
|
-
current_headers = contextvars.ContextVar("headers", default=None)
|
|
6
|
-
|
|
7
|
-
# per-user LLM 网关 apiKey:agent 创建入口 set,get_llm 读取,沿 task 树传播。
|
|
8
|
-
# 为 None 时 get_llm 回退到 LLMConfig.apiKey 全局 key。
|
|
9
|
-
current_llm_api_key = contextvars.ContextVar("llm_api_key", default=None)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.7a10 → sycommon_python_lib-0.2.7a12}/src/command/templates/agent/app.py.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|