sycommon-python-lib 0.2.7a7__tar.gz → 0.2.7a8__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.7a7 → sycommon_python_lib-0.2.7a8}/PKG-INFO +2 -2
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/pyproject.toml +2 -2
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/deep_agent.py +84 -32
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/middleware/skill_api_whitelist.py +7 -9
- sycommon_python_lib-0.2.7a8/src/sycommon/agent/middleware/skill_write_guard.py +61 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/multi_agent_team.py +34 -5
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/http_sandbox_backend.py +27 -27
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/minio_sync.py +20 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/summarization_utils.py +8 -4
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/kafka_log.py +121 -4
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/sandbox.py +6 -3
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/PKG-INFO +2 -2
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/SOURCES.txt +3 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/requires.txt +1 -1
- sycommon_python_lib-0.2.7a8/tests/test_skill_regex_upgrade.py +85 -0
- sycommon_python_lib-0.2.7a8/tests/test_skill_write_guard.py +122 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/README.md +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/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.7a8
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -9,7 +9,7 @@ Requires-Dist: aiohttp==3.14.1
|
|
|
9
9
|
Requires-Dist: aiomysql==0.3.2
|
|
10
10
|
Requires-Dist: anyio==4.14.1
|
|
11
11
|
Requires-Dist: decorator==5.3.1
|
|
12
|
-
Requires-Dist: deepagents==0.6.
|
|
12
|
+
Requires-Dist: deepagents==0.6.12
|
|
13
13
|
Requires-Dist: elasticsearch==9.4.1
|
|
14
14
|
Requires-Dist: fastapi==0.138.1
|
|
15
15
|
Requires-Dist: jinja2==3.1.6
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sycommon-python-lib"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.7a8"
|
|
4
4
|
description = "Add your description here"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -10,7 +10,7 @@ dependencies = [
|
|
|
10
10
|
"aiomysql==0.3.2",
|
|
11
11
|
"anyio==4.14.1",
|
|
12
12
|
"decorator==5.3.1",
|
|
13
|
-
"deepagents==0.6.
|
|
13
|
+
"deepagents==0.6.12",
|
|
14
14
|
"elasticsearch==9.4.1",
|
|
15
15
|
"fastapi==0.138.1",
|
|
16
16
|
"jinja2==3.1.6",
|
{sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/deep_agent.py
RENAMED
|
@@ -44,7 +44,7 @@ from typing import Any, AsyncGenerator, Dict, List, Optional, Tuple, TYPE_CHECKI
|
|
|
44
44
|
|
|
45
45
|
import yaml
|
|
46
46
|
|
|
47
|
-
from pydantic import BaseModel, Field
|
|
47
|
+
from pydantic import BaseModel, Field, model_validator
|
|
48
48
|
from langchain_core.messages import HumanMessage, BaseMessage, AIMessageChunk, AIMessage, SystemMessage
|
|
49
49
|
from langchain_core.tools import BaseTool, tool
|
|
50
50
|
|
|
@@ -57,6 +57,7 @@ from sycommon.agent.sandbox.sandbox_recovery import SandboxRecoveryManager
|
|
|
57
57
|
from sycommon.agent.chat_events import ChatEvent, ChatEventBuilder, DEFAULT_AGENT_NAME
|
|
58
58
|
from sycommon.middleware.token_tracking import TokenTrackingMiddleware
|
|
59
59
|
from sycommon.middleware.tool_result_truncation import ToolResultTruncationMiddleware
|
|
60
|
+
from sycommon.agent.middleware.skill_write_guard import SkillWriteGuardMiddleware
|
|
60
61
|
from deepagents.middleware.summarization import create_summarization_tool_middleware # noqa: F401 保留 re-export
|
|
61
62
|
from sycommon.agent.summarization_utils import build_summarization_middleware
|
|
62
63
|
|
|
@@ -373,13 +374,42 @@ class AgentConfig(BaseModel):
|
|
|
373
374
|
# 沙箱配置
|
|
374
375
|
sandbox_service_name: str = "shengye-platform-sandbox"
|
|
375
376
|
sandbox_timeout: int = 300
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
#
|
|
379
|
-
#
|
|
377
|
+
# system 技能:本地仓库目录路径 → 同步到沙箱 /skills/system(只读)
|
|
378
|
+
system_skills_dir: Optional[str] = None
|
|
379
|
+
# user 技能:标记启用沙箱 /skills/user(可写,内容由 MinIO 按 user 灌入);
|
|
380
|
+
# 本地兜底路径仅当目录存在时用于开发期同步,生产期为 None。
|
|
381
|
+
user_skills_dir: Optional[str] = None
|
|
382
|
+
# 技能是否已同步到沙箱:True 时跳过 _sync_skills_to_sandbox 的 atree 检查,
|
|
383
|
+
# 但 skills 注入(SkillsMiddleware)不受影响。
|
|
380
384
|
skills_already_synced: bool = False
|
|
381
385
|
memory_dir: Optional[str] = None
|
|
382
386
|
|
|
387
|
+
@property
|
|
388
|
+
def skills_dir(self) -> Optional[str]:
|
|
389
|
+
"""兼容旧字段:取 system_skills_dir(迁移期防外部调用崩)。"""
|
|
390
|
+
return self.system_skills_dir
|
|
391
|
+
|
|
392
|
+
@model_validator(mode="before")
|
|
393
|
+
@classmethod
|
|
394
|
+
def _map_legacy_skills_dir(cls, data: Any) -> Any:
|
|
395
|
+
"""旧 skills_dir=... 映射到 system_skills_dir 并告警(修 I3)。
|
|
396
|
+
|
|
397
|
+
pydantic v2 默认 ignore 未知字段,而 skills_dir 现在是只读 property
|
|
398
|
+
(非字段)——直接传 skills_dir=... 会被静默丢弃,导致 agent 无技能却无报错。
|
|
399
|
+
这里在解析前拦截:若仍用旧 kwarg,映射到 system_skills_dir + DeprecationWarning。
|
|
400
|
+
"""
|
|
401
|
+
if isinstance(data, dict) and "skills_dir" in data \
|
|
402
|
+
and "system_skills_dir" not in data:
|
|
403
|
+
import warnings
|
|
404
|
+
warnings.warn(
|
|
405
|
+
"AgentConfig(skills_dir=...) 已弃用,请改用 system_skills_dir="
|
|
406
|
+
"(system 只读)+ user_skills_dir=(user 可写)。本次按 system 处理。",
|
|
407
|
+
DeprecationWarning,
|
|
408
|
+
stacklevel=2,
|
|
409
|
+
)
|
|
410
|
+
data = {**data, "system_skills_dir": data.pop("skills_dir")}
|
|
411
|
+
return data
|
|
412
|
+
|
|
383
413
|
# 工具
|
|
384
414
|
tools: List[BaseTool] = Field(default_factory=list)
|
|
385
415
|
|
|
@@ -1165,17 +1195,16 @@ async def create_deep_agent(
|
|
|
1165
1195
|
tid = thread_id or user_id
|
|
1166
1196
|
agent_config = {"configurable": {"thread_id": tid}}
|
|
1167
1197
|
|
|
1168
|
-
#
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
skills_path = "/skills" if config.skills_dir else None
|
|
1198
|
+
# 沙箱 skills 双层结构:/skills/system(只读,仓库源)+ /skills/user(可写,MinIO 按 user 灌入)
|
|
1199
|
+
system_path = "/skills/system" if config.system_skills_dir else None
|
|
1200
|
+
user_path = "/skills/user" if config.user_skills_dir else None
|
|
1172
1201
|
memory_path = "/memory/AGENTS.md" if config.memory_dir else None
|
|
1173
1202
|
|
|
1174
|
-
# 同步
|
|
1175
|
-
#
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1203
|
+
# 同步 system 技能到沙箱(按版本检查,已同步则跳过)+ chmod 只读保护
|
|
1204
|
+
# skills_already_synced=True 时跳过同步,但 system_path/user_path 注入不受影响。
|
|
1205
|
+
if config.system_skills_dir and sandbox_backend and not config.skills_already_synced:
|
|
1206
|
+
await _sync_skills_to_sandbox(config.system_skills_dir, sandbox_backend,
|
|
1207
|
+
sandbox_dest="/skills/system", chmod_readonly=True)
|
|
1179
1208
|
|
|
1180
1209
|
# 创建 agent
|
|
1181
1210
|
from deepagents import create_deep_agent as _create_deep_agent
|
|
@@ -1196,6 +1225,7 @@ async def create_deep_agent(
|
|
|
1196
1225
|
ToolResultTruncationMiddleware(),
|
|
1197
1226
|
TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
|
|
1198
1227
|
summarization_mw,
|
|
1228
|
+
SkillWriteGuardMiddleware(), # 系统 /skills/system 只读守卫(先于白名单)
|
|
1199
1229
|
]
|
|
1200
1230
|
|
|
1201
1231
|
# RubricMiddleware:复用 FilesystemMiddleware 的工具(底层走 HTTPSandboxBackend HTTP 远程调用)
|
|
@@ -1228,8 +1258,15 @@ async def create_deep_agent(
|
|
|
1228
1258
|
"debug": config.debug,
|
|
1229
1259
|
"middleware": middleware_list,
|
|
1230
1260
|
}
|
|
1231
|
-
|
|
1232
|
-
|
|
1261
|
+
# deepagents SkillsMiddleware 支持多 source (path, label),后 source 覆盖先 source
|
|
1262
|
+
# → user 在后,user 同名技能优先于 system
|
|
1263
|
+
_sources = []
|
|
1264
|
+
if system_path:
|
|
1265
|
+
_sources.append((system_path, "系统"))
|
|
1266
|
+
if user_path:
|
|
1267
|
+
_sources.append((user_path, "用户"))
|
|
1268
|
+
if _sources:
|
|
1269
|
+
agent_kwargs["skills"] = _sources
|
|
1233
1270
|
if memory_path:
|
|
1234
1271
|
agent_kwargs["memory"] = [memory_path]
|
|
1235
1272
|
|
|
@@ -1299,21 +1336,24 @@ def _parse_skill_version(content: str) -> str:
|
|
|
1299
1336
|
async def _sync_skills_to_sandbox(
|
|
1300
1337
|
skills_dir: str,
|
|
1301
1338
|
backend: HTTPSandboxBackend,
|
|
1339
|
+
*,
|
|
1340
|
+
sandbox_dest: str = "/skills",
|
|
1341
|
+
chmod_readonly: bool = False,
|
|
1302
1342
|
) -> None:
|
|
1303
|
-
"""
|
|
1343
|
+
"""同步技能目录到沙箱(按版本检查,版本不一致则全量覆盖)
|
|
1304
1344
|
|
|
1305
|
-
技能来源是仓库内的 skills/
|
|
1306
|
-
版本比较只看沙箱 /
|
|
1345
|
+
技能来源是仓库内的 skills/ 目录(随部署持久,不随 Pod 重启丢失),
|
|
1346
|
+
版本比较只看沙箱 sandbox_dest/{name}/SKILL.md,无需 MinIO 锚点:
|
|
1307
1347
|
- 沙箱有该技能且 version 一致 → 跳过
|
|
1308
|
-
- 沙箱没有 /
|
|
1348
|
+
- 沙箱没有 / 版本不一致 → 从本地 skills/ 全量上传到沙箱
|
|
1309
1349
|
"""
|
|
1310
1350
|
if not os.path.isdir(skills_dir):
|
|
1311
1351
|
return
|
|
1312
1352
|
|
|
1313
1353
|
try:
|
|
1314
|
-
# 获取沙箱
|
|
1354
|
+
# 获取沙箱 sandbox_dest 下已有的目录列表
|
|
1315
1355
|
existing_dirs = set()
|
|
1316
|
-
tree_result = await backend.atree(
|
|
1356
|
+
tree_result = await backend.atree(sandbox_dest, max_depth=1)
|
|
1317
1357
|
if tree_result and tree_result.tree and tree_result.tree.children:
|
|
1318
1358
|
for child in tree_result.tree.children:
|
|
1319
1359
|
if child.is_dir:
|
|
@@ -1336,12 +1376,12 @@ async def _sync_skills_to_sandbox(
|
|
|
1336
1376
|
except Exception:
|
|
1337
1377
|
pass
|
|
1338
1378
|
|
|
1339
|
-
#
|
|
1379
|
+
# 比较版本:只从沙箱 sandbox_dest/{name}/SKILL.md 读取
|
|
1340
1380
|
remote_version = ""
|
|
1341
1381
|
if skill_name in existing_dirs:
|
|
1342
1382
|
try:
|
|
1343
1383
|
remote_content = await backend.aread(
|
|
1344
|
-
f"/
|
|
1384
|
+
f"{sandbox_dest}/{skill_name}/SKILL.md")
|
|
1345
1385
|
if remote_content:
|
|
1346
1386
|
remote_version = _parse_skill_version(remote_content)
|
|
1347
1387
|
except Exception:
|
|
@@ -1349,29 +1389,39 @@ async def _sync_skills_to_sandbox(
|
|
|
1349
1389
|
|
|
1350
1390
|
if remote_version and remote_version == local_version:
|
|
1351
1391
|
SYLogger.debug(
|
|
1352
|
-
f"[DeepAgent]
|
|
1392
|
+
f"[DeepAgent] 技能版本一致,跳过: {skill_name} v{local_version}")
|
|
1353
1393
|
backend._synced_skills.add(skill_name)
|
|
1354
1394
|
skip_count += 1
|
|
1355
1395
|
continue
|
|
1356
1396
|
|
|
1357
|
-
#
|
|
1397
|
+
# 版本不一致或无版本,删除旧目录后全量覆盖
|
|
1358
1398
|
if skill_name in existing_dirs:
|
|
1359
1399
|
try:
|
|
1360
|
-
await backend.aexecute(f"rm -rf /
|
|
1400
|
+
await backend.aexecute(f"rm -rf {sandbox_dest}/{skill_name}")
|
|
1361
1401
|
SYLogger.info(
|
|
1362
|
-
f"[DeepAgent]
|
|
1402
|
+
f"[DeepAgent] 技能版本不一致,覆盖: {skill_name} "
|
|
1363
1403
|
f"({remote_version or '无版本'} → {local_version})")
|
|
1364
1404
|
except Exception as e:
|
|
1365
1405
|
SYLogger.warning(
|
|
1366
1406
|
f"[DeepAgent] 删除旧版技能失败: {skill_name}, {e}")
|
|
1367
1407
|
|
|
1368
1408
|
# 全量上传整个技能目录到沙箱
|
|
1369
|
-
await backend.async_sync_dirs([(src, f"/
|
|
1409
|
+
await backend.async_sync_dirs([(src, f"{sandbox_dest}/{skill_name}")])
|
|
1370
1410
|
backend._synced_skills.add(skill_name)
|
|
1371
1411
|
skill_count += 1
|
|
1372
1412
|
SYLogger.info(
|
|
1373
1413
|
f"[DeepAgent] 全量同步技能到沙箱: {skill_name} v{local_version}")
|
|
1374
1414
|
|
|
1415
|
+
if chmod_readonly:
|
|
1416
|
+
try:
|
|
1417
|
+
# sandbox_dest 是虚拟绝对路径(/skills/system),沙箱 shell 不重映射裸绝对路径,
|
|
1418
|
+
# 须拼 $_SANDBOX_WORKSPACE 指向真实 workspace 才能命中。否则 chmod 静默失败。
|
|
1419
|
+
await backend.aexecute(
|
|
1420
|
+
f'chmod -R 555 "$_SANDBOX_WORKSPACE{sandbox_dest}"')
|
|
1421
|
+
SYLogger.info(f"[DeepAgent] 已设只读: chmod -R 555 {sandbox_dest}")
|
|
1422
|
+
except Exception as e:
|
|
1423
|
+
SYLogger.warning(f"[DeepAgent] chmod 只读失败(忽略): {e}")
|
|
1424
|
+
|
|
1375
1425
|
SYLogger.info(
|
|
1376
1426
|
f"[DeepAgent] 技能同步完成: 同步 {skill_count} 个, 跳过 {skip_count} 个")
|
|
1377
1427
|
except Exception as e:
|
|
@@ -1398,9 +1448,11 @@ async def _create_sandbox_backend(
|
|
|
1398
1448
|
memory_dir.mkdir(parents=True, exist_ok=True)
|
|
1399
1449
|
sync_dirs.append((str(memory_dir), "/memory"))
|
|
1400
1450
|
|
|
1401
|
-
# 确定 skills_dir
|
|
1402
|
-
|
|
1403
|
-
|
|
1451
|
+
# 确定 skills_dir,传递给沙箱后端用于懒同步。
|
|
1452
|
+
# 懒同步按 os.path.join(_skills_dir, scope, skill_name) 解析本地源(system/user/<域>),
|
|
1453
|
+
# 故 _skills_dir 须是 system/ 与 user/ 的【父目录】(<repo>/skills),而非 system_skills_dir 本身。
|
|
1454
|
+
if config.system_skills_dir:
|
|
1455
|
+
skills_dir_for_backend = str(Path(config.system_skills_dir).parent)
|
|
1404
1456
|
else:
|
|
1405
1457
|
skills_dir_for_backend = str(project_root / "skills")
|
|
1406
1458
|
|
|
@@ -30,15 +30,13 @@ from langgraph.prebuilt.tool_node import ToolCallRequest
|
|
|
30
30
|
|
|
31
31
|
from sycommon.logging.kafka_log import SYLogger
|
|
32
32
|
|
|
33
|
-
# 命令路径形如 skills/sy-oa-skill/workflow-todo/scripts/x.py
|
|
34
|
-
# skills/sy-
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
# theskills/ 等含 skills 子串的路径(行首、空格、引号、/ 后均成立)。
|
|
41
|
-
_SKILL_TOP_RE = re.compile(r'(?<![\w])skills/([A-Za-z0-9_\-]+)(?:/|$)')
|
|
33
|
+
# 命令路径形如 skills/system/sy-oa-skill/workflow-todo/scripts/x.py
|
|
34
|
+
# skills/user/sy-oa-skill/SKILL.md
|
|
35
|
+
# 拆为 system/user 双层后,顶层段是 system|user,需跳过它取【第二段】作域级技能名
|
|
36
|
+
# (如 sy-oa-skill),配合 SkillApiWhitelist 按顶级域配置。
|
|
37
|
+
# (?<![\w]) 否定左查找:要求 skills 前不是单词字符,避免误匹配 myskills/。
|
|
38
|
+
_SKILL_TOP_RE = re.compile(
|
|
39
|
+
r'(?<![\w])skills/(?:system|user)/([A-Za-z0-9_\-]+)(?:/|$)')
|
|
42
40
|
|
|
43
41
|
# BASE_URL 占位符 ${VAR}
|
|
44
42
|
_PLACEHOLDER_RE = re.compile(r'\$\{([A-Z_][A-Z0-9_]*)\}')
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""系统技能只读守卫中间件。
|
|
2
|
+
|
|
3
|
+
拦 write_file / edit_file / execute 三类写操作对 /skills/system 的命中,
|
|
4
|
+
返回 error ToolMessage(不调 handler,短路)。/skills/user 不拦。
|
|
5
|
+
|
|
6
|
+
双层防护之一(另一层是沙箱 chmod -R 555 /skills/system):
|
|
7
|
+
本中间件负责给 agent 清晰错误反馈并 fail-closed,chmod 负责兜底防 shell 绕过。
|
|
8
|
+
"""
|
|
9
|
+
import re
|
|
10
|
+
from langchain.agents.middleware.types import AgentMiddleware
|
|
11
|
+
from langchain_core.messages import ToolMessage
|
|
12
|
+
from langgraph.prebuilt.tool_node import ToolCallRequest
|
|
13
|
+
|
|
14
|
+
# /skills/system 或 /skills/system/... (行尾/引号/空白/斜杠均可作边界,防匹配 /skills/systembackup)
|
|
15
|
+
_PROTECTED_PATH_RE = re.compile(r'/skills/system(?:/|\s|"|\'|$)')
|
|
16
|
+
|
|
17
|
+
# 写动作动词(命令首或分号/管道/空格后)
|
|
18
|
+
_WRITE_VERB_RE = re.compile(
|
|
19
|
+
r'(^|[\s;&|])(rm|rmdir|mv|cp|chmod|chown|tee|truncate|install|rsync|scp|dd)\b')
|
|
20
|
+
# 输出重定向 > 或 >>
|
|
21
|
+
_REDIRECT_RE = re.compile(r'>>?')
|
|
22
|
+
|
|
23
|
+
_WRITE_TOOLS = {"write_file", "edit_file"}
|
|
24
|
+
_DENIED_MSG = ("Error: 系统技能 /skills/system 为只读,禁止修改/删除。"
|
|
25
|
+
"如需定制,请复制到用户技能 /skills/user/ 后编辑。")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _is_protected_path(p: str) -> bool:
|
|
29
|
+
s = (p or "").strip().replace("\\", "/")
|
|
30
|
+
return s == "/skills/system" or s.startswith("/skills/system/")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _command_writes_system(cmd: str) -> bool:
|
|
34
|
+
if not _PROTECTED_PATH_RE.search(cmd or ""):
|
|
35
|
+
return False
|
|
36
|
+
return bool(_WRITE_VERB_RE.search(cmd) or _REDIRECT_RE.search(cmd))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class SkillWriteGuardMiddleware(AgentMiddleware):
|
|
40
|
+
"""拦对 /skills/system 的写。仅实现 awrap_tool_call(异步链路)。"""
|
|
41
|
+
|
|
42
|
+
async def awrap_tool_call(self, request: ToolCallRequest, handler):
|
|
43
|
+
tc = request.tool_call
|
|
44
|
+
name = tc.get("name")
|
|
45
|
+
args = tc.get("args", {}) or {}
|
|
46
|
+
|
|
47
|
+
if name in _WRITE_TOOLS:
|
|
48
|
+
fp = args.get("file_path") if isinstance(args, dict) else ""
|
|
49
|
+
if _is_protected_path(fp):
|
|
50
|
+
return ToolMessage(content=_DENIED_MSG, name=name,
|
|
51
|
+
tool_call_id=tc.get("id", ""), status="error")
|
|
52
|
+
return await handler(request)
|
|
53
|
+
|
|
54
|
+
if name == "execute":
|
|
55
|
+
command = args.get("command", "") if isinstance(args, dict) else ""
|
|
56
|
+
if _command_writes_system(command):
|
|
57
|
+
return ToolMessage(content=_DENIED_MSG, name="execute",
|
|
58
|
+
tool_call_id=tc.get("id", ""), status="error")
|
|
59
|
+
return await handler(request)
|
|
60
|
+
|
|
61
|
+
return await handler(request)
|
{sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/multi_agent_team.py
RENAMED
|
@@ -45,6 +45,7 @@ from sycommon.agent.sandbox.sandbox_recovery import SandboxRecoveryManager
|
|
|
45
45
|
from sycommon.agent.chat_events import ChatEvent, ChatEventBuilder, DEFAULT_AGENT_NAME
|
|
46
46
|
from sycommon.middleware.token_tracking import TokenTrackingMiddleware
|
|
47
47
|
from sycommon.middleware.tool_result_truncation import ToolResultTruncationMiddleware
|
|
48
|
+
from sycommon.agent.middleware.skill_write_guard import SkillWriteGuardMiddleware
|
|
48
49
|
from deepagents.middleware.summarization import create_summarization_tool_middleware # noqa: F401 保留 re-export
|
|
49
50
|
from sycommon.agent.summarization_utils import build_summarization_middleware
|
|
50
51
|
|
|
@@ -131,9 +132,19 @@ class TeamConfig(BaseModel):
|
|
|
131
132
|
|
|
132
133
|
sandbox_service_name: str = "shengye-platform-sandbox"
|
|
133
134
|
sandbox_timeout: int = 300
|
|
134
|
-
|
|
135
|
+
# system 技能:本地仓库目录 → 同步到沙箱 /skills/system(只读)
|
|
136
|
+
system_skills_dir: Optional[str] = None
|
|
137
|
+
# user 技能:标记启用沙箱 /skills/user(可写,内容由 MinIO 灌入)
|
|
138
|
+
user_skills_dir: Optional[str] = None
|
|
139
|
+
# 技能是否已同步到沙箱:True 时跳过 _sync_skills_to_sandbox
|
|
140
|
+
skills_already_synced: bool = False
|
|
135
141
|
memory_dir: Optional[str] = None
|
|
136
142
|
|
|
143
|
+
@property
|
|
144
|
+
def skills_dir(self) -> Optional[str]:
|
|
145
|
+
"""兼容旧字段:取 system_skills_dir。"""
|
|
146
|
+
return self.system_skills_dir
|
|
147
|
+
|
|
137
148
|
shared_tools: List[BaseTool] = Field(default_factory=list)
|
|
138
149
|
|
|
139
150
|
debug: bool = False
|
|
@@ -578,6 +589,21 @@ async def create_multi_agent_team(
|
|
|
578
589
|
tid = thread_id or user_id
|
|
579
590
|
agent_config = {"configurable": {"thread_id": tid}}
|
|
580
591
|
|
|
592
|
+
# 同步 system 技能到沙箱(按版本检查)+ chmod 只读保护(与单 Agent 路径对齐)
|
|
593
|
+
if config.system_skills_dir and sandbox_backend and not config.skills_already_synced:
|
|
594
|
+
from sycommon.agent.deep_agent import _sync_skills_to_sandbox
|
|
595
|
+
await _sync_skills_to_sandbox(config.system_skills_dir, sandbox_backend,
|
|
596
|
+
sandbox_dest="/skills/system", chmod_readonly=True)
|
|
597
|
+
|
|
598
|
+
# 沙箱 skills 双层路径(用于 SkillsMiddleware 双 source)
|
|
599
|
+
system_path = "/skills/system" if config.system_skills_dir else None
|
|
600
|
+
user_path = "/skills/user" if config.user_skills_dir else None
|
|
601
|
+
skill_sources = []
|
|
602
|
+
if system_path:
|
|
603
|
+
skill_sources.append((system_path, "系统"))
|
|
604
|
+
if user_path:
|
|
605
|
+
skill_sources.append((user_path, "用户")) # user 在后 → 同名优先
|
|
606
|
+
|
|
581
607
|
# 创建子 agents(递归支持嵌套团队)
|
|
582
608
|
from deepagents import create_deep_agent
|
|
583
609
|
from deepagents.middleware.subagents import CompiledSubAgent
|
|
@@ -587,6 +613,7 @@ async def create_multi_agent_team(
|
|
|
587
613
|
ToolResultTruncationMiddleware(),
|
|
588
614
|
TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
|
|
589
615
|
summarization_mw,
|
|
616
|
+
SkillWriteGuardMiddleware(),
|
|
590
617
|
]
|
|
591
618
|
shared = config.shared_tools or [get_current_date]
|
|
592
619
|
|
|
@@ -632,7 +659,7 @@ async def create_multi_agent_team(
|
|
|
632
659
|
model=model,
|
|
633
660
|
tools=config.shared_tools or [get_current_date],
|
|
634
661
|
backend=sandbox_backend,
|
|
635
|
-
skills=
|
|
662
|
+
skills=skill_sources or None,
|
|
636
663
|
memory=["/memory/AGENTS.md"],
|
|
637
664
|
checkpointer=checkpointer,
|
|
638
665
|
system_prompt=config.coordinator_prompt,
|
|
@@ -643,6 +670,7 @@ async def create_multi_agent_team(
|
|
|
643
670
|
ToolResultTruncationMiddleware(),
|
|
644
671
|
TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
|
|
645
672
|
coord_summarization_mw,
|
|
673
|
+
SkillWriteGuardMiddleware(),
|
|
646
674
|
],
|
|
647
675
|
)
|
|
648
676
|
|
|
@@ -679,9 +707,10 @@ async def _create_sandbox_backend_for_team(
|
|
|
679
707
|
memory_dir.mkdir(parents=True, exist_ok=True)
|
|
680
708
|
sync_dirs.append((str(memory_dir), "/memory"))
|
|
681
709
|
|
|
682
|
-
#
|
|
683
|
-
|
|
684
|
-
|
|
710
|
+
# 懒同步按 os.path.join(_skills_dir, scope, skill_name) 解析本地源(system/<域>),
|
|
711
|
+
# 故 _skills_dir 须是 system/ 与 user/ 的【父目录】。
|
|
712
|
+
if config.system_skills_dir:
|
|
713
|
+
skills_dir_for_backend = str(Path(config.system_skills_dir).parent)
|
|
685
714
|
else:
|
|
686
715
|
skills_dir_for_backend = str(project_root / "skills")
|
|
687
716
|
|
|
@@ -9,6 +9,7 @@ HTTP 客户端沙箱后端
|
|
|
9
9
|
import asyncio
|
|
10
10
|
import base64
|
|
11
11
|
import os
|
|
12
|
+
import re
|
|
12
13
|
import ssl
|
|
13
14
|
import sys
|
|
14
15
|
import tempfile
|
|
@@ -36,6 +37,12 @@ try:
|
|
|
36
37
|
except ImportError:
|
|
37
38
|
_SSL_CONTEXT = ssl.create_default_context()
|
|
38
39
|
|
|
40
|
+
# 技能访问路径解析:/skills/(system|user)/<域>/...
|
|
41
|
+
# 前导斜杠可选(命令里可能是 cd skills/system/x),(?<![\w]) 防误匹配 myskills/
|
|
42
|
+
_SKILL_PATH_RE = re.compile(
|
|
43
|
+
r'(?:^|[\s/\'"])skills/(system|user)/([a-zA-Z0-9_\-]+)/'
|
|
44
|
+
)
|
|
45
|
+
|
|
39
46
|
|
|
40
47
|
def _read_file_safe(path: str) -> bytes:
|
|
41
48
|
with open(path, "rb") as f:
|
|
@@ -851,33 +858,29 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
|
|
|
851
858
|
if not self._skills_dir:
|
|
852
859
|
return
|
|
853
860
|
|
|
854
|
-
|
|
855
|
-
# 匹配 /skills/<skill_name>/ 或 skills/<skill_name>/
|
|
856
|
-
match = re.search(r'/skills/([a-zA-Z0-9_\-]+)/', path)
|
|
857
|
-
if not match:
|
|
858
|
-
match = re.search(r'(?:^|\s|")skills/([a-zA-Z0-9_\-]+)/', path)
|
|
861
|
+
match = _SKILL_PATH_RE.search(path)
|
|
859
862
|
if not match:
|
|
860
863
|
return
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
if
|
|
864
|
+
scope, skill_name = match.group(1), match.group(2)
|
|
865
|
+
cache_key = f"{scope}/{skill_name}"
|
|
866
|
+
if cache_key in self._synced_skills:
|
|
864
867
|
return
|
|
865
868
|
|
|
866
|
-
skill_dir = os.path.join(self._skills_dir, skill_name)
|
|
869
|
+
skill_dir = os.path.join(self._skills_dir, scope, skill_name)
|
|
867
870
|
if not os.path.isdir(skill_dir):
|
|
868
|
-
self._synced_skills.add(
|
|
871
|
+
self._synced_skills.add(cache_key)
|
|
869
872
|
return
|
|
870
873
|
|
|
871
874
|
try:
|
|
872
875
|
await self.async_sync_dirs([
|
|
873
|
-
(skill_dir, f"/skills/{skill_name}")
|
|
876
|
+
(skill_dir, f"/skills/{scope}/{skill_name}")
|
|
874
877
|
])
|
|
875
|
-
self._synced_skills.add(
|
|
878
|
+
self._synced_skills.add(cache_key)
|
|
876
879
|
SYLogger.info(
|
|
877
|
-
f"[Sandbox] 懒同步技能目录: {
|
|
880
|
+
f"[Sandbox] 懒同步技能目录: {cache_key}/")
|
|
878
881
|
except Exception as e:
|
|
879
882
|
SYLogger.warning(
|
|
880
|
-
f"[Sandbox] 懒同步技能目录失败: {
|
|
883
|
+
f"[Sandbox] 懒同步技能目录失败: {cache_key}, {e}")
|
|
881
884
|
|
|
882
885
|
def _lazy_sync_skill_from_path_sync(self, path: str) -> None:
|
|
883
886
|
"""同步版本的懒同步(在同步文件操作中调用)
|
|
@@ -887,32 +890,29 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
|
|
|
887
890
|
if not self._skills_dir:
|
|
888
891
|
return
|
|
889
892
|
|
|
890
|
-
|
|
891
|
-
match = re.search(r'/skills/([a-zA-Z0-9_\-]+)/', path)
|
|
892
|
-
if not match:
|
|
893
|
-
match = re.search(r'(?:^|\s|")skills/([a-zA-Z0-9_\-]+)/', path)
|
|
893
|
+
match = _SKILL_PATH_RE.search(path)
|
|
894
894
|
if not match:
|
|
895
895
|
return
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
if
|
|
896
|
+
scope, skill_name = match.group(1), match.group(2)
|
|
897
|
+
cache_key = f"{scope}/{skill_name}"
|
|
898
|
+
if cache_key in self._synced_skills:
|
|
899
899
|
return
|
|
900
900
|
|
|
901
|
-
skill_dir = os.path.join(self._skills_dir, skill_name)
|
|
901
|
+
skill_dir = os.path.join(self._skills_dir, scope, skill_name)
|
|
902
902
|
if not os.path.isdir(skill_dir):
|
|
903
|
-
self._synced_skills.add(
|
|
903
|
+
self._synced_skills.add(cache_key)
|
|
904
904
|
return
|
|
905
905
|
|
|
906
906
|
try:
|
|
907
907
|
# 同步版本直接调用同步上传方法
|
|
908
908
|
self._upload_directory_sync(
|
|
909
|
-
skill_dir, f"/skills/{skill_name}", mode="full")
|
|
910
|
-
self._synced_skills.add(
|
|
909
|
+
skill_dir, f"/skills/{scope}/{skill_name}", mode="full")
|
|
910
|
+
self._synced_skills.add(cache_key)
|
|
911
911
|
SYLogger.info(
|
|
912
|
-
f"[Sandbox] 懒同步技能目录(sync): {
|
|
912
|
+
f"[Sandbox] 懒同步技能目录(sync): {cache_key}/")
|
|
913
913
|
except Exception as e:
|
|
914
914
|
SYLogger.warning(
|
|
915
|
-
f"[Sandbox] 懒同步技能目录失败(sync): {
|
|
915
|
+
f"[Sandbox] 懒同步技能目录失败(sync): {cache_key}, {e}")
|
|
916
916
|
|
|
917
917
|
async def _sync_async(self, *, timeout: int = None) -> dict:
|
|
918
918
|
"""同步目录(异步版本)
|
{sycommon_python_lib-0.2.7a7 → sycommon_python_lib-0.2.7a8}/src/sycommon/agent/sandbox/minio_sync.py
RENAMED
|
@@ -326,6 +326,20 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
326
326
|
else:
|
|
327
327
|
files.append(path)
|
|
328
328
|
|
|
329
|
+
def _exclude_system_skills(self, files: list[str]) -> list[str]:
|
|
330
|
+
"""过滤掉 /skills/system/ 前缀文件——system 是只读仓库产物,不进 MinIO。
|
|
331
|
+
|
|
332
|
+
路径形如 skills/system/sy-oa-skill/...(collect_sandbox_files 已 strip 根 user_id
|
|
333
|
+
前缀,根盘符 / 由调用方拼接)。兼容带不带前导斜杠。
|
|
334
|
+
"""
|
|
335
|
+
out = []
|
|
336
|
+
for fp in files:
|
|
337
|
+
norm = fp.replace("\\", "/").lstrip("/")
|
|
338
|
+
if norm == "skills/system" or norm.startswith("skills/system/"):
|
|
339
|
+
continue
|
|
340
|
+
out.append(fp)
|
|
341
|
+
return out
|
|
342
|
+
|
|
329
343
|
async def sync_sandbox_to_minio(self, sandbox_backend, user_id: str) -> int:
|
|
330
344
|
"""扫描沙箱目录,增量同步文件到 MinIO
|
|
331
345
|
|
|
@@ -357,6 +371,7 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
357
371
|
return 0
|
|
358
372
|
|
|
359
373
|
sandbox_files = self.collect_sandbox_files(tree_result)
|
|
374
|
+
sandbox_files = self._exclude_system_skills(sandbox_files)
|
|
360
375
|
if not sandbox_files:
|
|
361
376
|
# 沙箱为空,清理 MinIO 中该用户的所有文件
|
|
362
377
|
try:
|
|
@@ -523,6 +538,11 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
523
538
|
if rel_path and rel_path not in existing_files:
|
|
524
539
|
to_restore.append(rel_path)
|
|
525
540
|
|
|
541
|
+
# 排除 /skills/system —— system 是只读仓库产物,由本地仓库注入,
|
|
542
|
+
# 绝不从 MinIO 恢复(否则旧的/遗留 system 副本会落回用户沙箱,污染只读区)。
|
|
543
|
+
# 与 sync_sandbox_to_minio 的排除对称,守住「system 不进 MinIO」不变式。
|
|
544
|
+
to_restore = self._exclude_system_skills(to_restore)
|
|
545
|
+
|
|
526
546
|
if not to_restore:
|
|
527
547
|
SYLogger.info(f"[MinIO] 沙箱文件完整,无需恢复: user={user_id}")
|
|
528
548
|
return 0
|
|
@@ -206,10 +206,9 @@ async def _patched_awrap_model_call(self, request, handler):
|
|
|
206
206
|
real_tokens = _extract_last_usage_total_tokens(effective_messages)
|
|
207
207
|
|
|
208
208
|
# 估算值(用于日志对比)
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
estimated = _approx_counter(counted_messages)
|
|
209
|
+
# langchain-core>=1.4.8 的 count_tokens_approximately 原生支持 tools=,
|
|
210
|
+
# 不再需要 try/except TypeError 兜底。
|
|
211
|
+
estimated = _approx_counter(counted_messages, tools=request.tools)
|
|
213
212
|
|
|
214
213
|
# 如果有真实 token,临时替换 token_counter 使 _orig 内部判断也用真实值
|
|
215
214
|
# 这样 _should_summarize 和 _determine_cutoff_index 都能拿到正确的 token 数
|
|
@@ -301,6 +300,11 @@ except ImportError:
|
|
|
301
300
|
# 虽然不能改变 __init__ 的默认参数(Python 在定义时求值),
|
|
302
301
|
# 但可以防止任何运行时读取 DEFAULT_SUMMARY_PROMPT 的代码拿到英文版。
|
|
303
302
|
_summ_mod.DEFAULT_SUMMARY_PROMPT = CUSTOM_SUMMARY_PROMPT
|
|
303
|
+
# deepagents 0.6.12 起 SummarizationMiddleware 的默认 prompt 改读
|
|
304
|
+
# DEEPAGENTS_DEFAULT_SUMMARY_PROMPT(在模块加载时由 DEFAULT_SUMMARY_PROMPT 派生),
|
|
305
|
+
# 因此只替换 DEFAULT_SUMMARY_PROMPT 已无法阻断新链路,需同步覆盖派生常量。
|
|
306
|
+
if hasattr(_summ_mod, "DEEPAGENTS_DEFAULT_SUMMARY_PROMPT"):
|
|
307
|
+
_summ_mod.DEEPAGENTS_DEFAULT_SUMMARY_PROMPT = CUSTOM_SUMMARY_PROMPT
|
|
304
308
|
try:
|
|
305
309
|
import langchain.agents.middleware.summarization as _lc_summ_mod
|
|
306
310
|
_lc_summ_mod.DEFAULT_SUMMARY_PROMPT = CUSTOM_SUMMARY_PROMPT
|