sycommon-python-lib 0.2.7a31__tar.gz → 0.2.7a33__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.7a31 → sycommon_python_lib-0.2.7a33}/PKG-INFO +7 -7
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/pyproject.toml +7 -7
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/deep_agent.py +9 -7
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/middleware/sensitive_guard.py +102 -15
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/multi_agent_team.py +17 -4
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/sandbox/minio_sync.py +4 -4
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/summarization_utils.py +9 -4
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/Config.py +2 -1
- sycommon_python_lib-0.2.7a33/src/sycommon/tests/test_upgrade_aio_pika.py +153 -0
- sycommon_python_lib-0.2.7a33/src/sycommon/tests/test_upgrade_langgraph_stream.py +131 -0
- sycommon_python_lib-0.2.7a33/src/sycommon/tests/test_upgrade_verification.py +229 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon_python_lib.egg-info/PKG-INFO +7 -7
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon_python_lib.egg-info/SOURCES.txt +3 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon_python_lib.egg-info/requires.txt +6 -6
- sycommon_python_lib-0.2.7a33/tests/test_sensitive_guard.py +466 -0
- sycommon_python_lib-0.2.7a31/tests/test_sensitive_guard.py +0 -231
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/README.md +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/tests/test_sync_skills_to_sandbox.py +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.7a33
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
|
-
Requires-Dist: aio-pika==
|
|
7
|
+
Requires-Dist: aio-pika==10.0.1
|
|
8
8
|
Requires-Dist: aiohttp==3.14.1
|
|
9
9
|
Requires-Dist: aiomysql==0.3.2
|
|
10
10
|
Requires-Dist: anyio==4.14.1
|
|
@@ -13,12 +13,12 @@ Requires-Dist: deepagents==0.6.12
|
|
|
13
13
|
Requires-Dist: elasticsearch==9.4.1
|
|
14
14
|
Requires-Dist: fastapi==0.139.0
|
|
15
15
|
Requires-Dist: jinja2==3.1.6
|
|
16
|
-
Requires-Dist: kafka-python==3.0.
|
|
17
|
-
Requires-Dist: langchain==1.3.
|
|
16
|
+
Requires-Dist: kafka-python==3.0.8
|
|
17
|
+
Requires-Dist: langchain==1.3.13
|
|
18
18
|
Requires-Dist: langchain-core==1.4.9
|
|
19
|
-
Requires-Dist: langchain-openai==1.3.
|
|
20
|
-
Requires-Dist: langfuse==4.
|
|
21
|
-
Requires-Dist: langgraph==1.2.
|
|
19
|
+
Requires-Dist: langchain-openai==1.3.5
|
|
20
|
+
Requires-Dist: langfuse==4.14.0
|
|
21
|
+
Requires-Dist: langgraph==1.2.9
|
|
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
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sycommon-python-lib"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.7a33"
|
|
4
4
|
description = "Add your description here"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
7
7
|
dependencies = [
|
|
8
|
-
"aio-pika==
|
|
8
|
+
"aio-pika==10.0.1",
|
|
9
9
|
"aiohttp==3.14.1",
|
|
10
10
|
"aiomysql==0.3.2",
|
|
11
11
|
"anyio==4.14.1",
|
|
@@ -14,12 +14,12 @@ dependencies = [
|
|
|
14
14
|
"elasticsearch==9.4.1",
|
|
15
15
|
"fastapi==0.139.0",
|
|
16
16
|
"jinja2==3.1.6",
|
|
17
|
-
"kafka-python==3.0.
|
|
18
|
-
"langchain==1.3.
|
|
17
|
+
"kafka-python==3.0.8",
|
|
18
|
+
"langchain==1.3.13",
|
|
19
19
|
"langchain-core==1.4.9",
|
|
20
|
-
"langchain-openai==1.3.
|
|
21
|
-
"langfuse==4.
|
|
22
|
-
"langgraph==1.2.
|
|
20
|
+
"langchain-openai==1.3.5",
|
|
21
|
+
"langfuse==4.14.0",
|
|
22
|
+
"langgraph==1.2.9",
|
|
23
23
|
"langgraph-checkpoint-postgres==3.1.0",
|
|
24
24
|
"langgraph-checkpoint-redis==0.5.0",
|
|
25
25
|
"ldap3==2.9.1",
|
{sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/deep_agent.py
RENAMED
|
@@ -98,12 +98,13 @@ def _patch_agent_streaming(agent):
|
|
|
98
98
|
删除此函数及调用即可。
|
|
99
99
|
"""
|
|
100
100
|
# 已验证兼容的版本范围(超出仅警告, 不阻断 —— 闭包强校验是真正的安全网)
|
|
101
|
-
# 1.3.10/1.3.11/1.3.12 + langchain_core 1.4.8/1.4.9
|
|
102
|
-
# (factory.py 在 1.3.
|
|
103
|
-
# _execute_model_async, 内层 freevars 含
|
|
104
|
-
# patch 正常生效。
|
|
105
|
-
#
|
|
106
|
-
|
|
101
|
+
# 1.3.10/1.3.11/1.3.12/1.3.13 + langchain_core 1.4.8/1.4.9 确认闭包结构兼容
|
|
102
|
+
# (factory.py 在 1.3.12→1.3.13 逐字节无变化 —— PyPI sdist diff 实证;
|
|
103
|
+
# amodel_node freevars 含 _execute_model_async, 内层 freevars 含
|
|
104
|
+
# _get_bound_model/_handle_model_output), patch 正常生效。
|
|
105
|
+
# 1.3.13 的 _execute_model_async 仍为 ainvoke + 不传 config (factory.py:1467),
|
|
106
|
+
# 官方仍未修复, 补丁仍需保留。
|
|
107
|
+
_VERIFIED = {"langchain": "1.3.13", "langchain_core": "1.4.9"}
|
|
107
108
|
try:
|
|
108
109
|
import langchain as _lc
|
|
109
110
|
import langchain_core as _lcc
|
|
@@ -377,7 +378,8 @@ class AgentConfig(BaseModel):
|
|
|
377
378
|
internal_model_name: Optional[str] = None
|
|
378
379
|
# 敏感检测提示词(应用层可覆盖);未传(None)用基础库 DEFAULT_DETECT_PROMPT
|
|
379
380
|
sensitive_detect_prompt: Optional[str] = None
|
|
380
|
-
# 命中敏感后的动作:"allow"=不检测放行;"downgrade"=降级内部模型继续;
|
|
381
|
+
# 命中敏感后的动作:"allow"=不检测放行;"downgrade"=降级内部模型继续;
|
|
382
|
+
# "block"=直接阻断不执行(检测整段上下文);"block_user_input"=阻断(仅检测最后一条 HumanMessage)。
|
|
381
383
|
sensitive_action: str = "allow"
|
|
382
384
|
|
|
383
385
|
# 系统提示词
|
|
@@ -72,6 +72,19 @@ class DowngradeState:
|
|
|
72
72
|
self.last_source = source
|
|
73
73
|
return True
|
|
74
74
|
|
|
75
|
+
async def reset(self, source: str = "user_input") -> None:
|
|
76
|
+
"""清除降级标记(带锁,CAS 契约一致)。
|
|
77
|
+
|
|
78
|
+
应用层在「命中敏感后想放行下一轮重检」场景(如 block 模式阻断后,
|
|
79
|
+
用户切走/换 thread 重建 agent)应调本方法,而不是直接写
|
|
80
|
+
`state.downgraded = False`(无锁、绕过 CAS)。单 agent 下两者等价,
|
|
81
|
+
但 multi-agent 共享状态或未来跨 task 重置时,无锁直写会与
|
|
82
|
+
mark_downgraded 的 CAS 真竞态——本方法是唯一安全的重置入口。
|
|
83
|
+
"""
|
|
84
|
+
async with self._lock:
|
|
85
|
+
self.downgraded = False
|
|
86
|
+
self.last_source = source
|
|
87
|
+
|
|
75
88
|
|
|
76
89
|
DEFAULT_DETECT_PROMPT = """你是数据脱敏分类器。判断以下「即将发送给外部云模型」的对话上下文是否包含不宜外流的敏感数据,只回答结构化字段(is_sensitive + reason + source)。
|
|
77
90
|
|
|
@@ -237,13 +250,19 @@ class SensitiveGuardMiddleware(AgentMiddleware):
|
|
|
237
250
|
state: Optional[DowngradeState] = None,
|
|
238
251
|
# 应用层可覆盖检测提示词;未传(None)用 DEFAULT_DETECT_PROMPT
|
|
239
252
|
detect_prompt: Optional[str] = None,
|
|
240
|
-
# 命中敏感后的动作:"allow"=不检测放行;"downgrade"=降级内部模型继续;
|
|
253
|
+
# 命中敏感后的动作:"allow"=不检测放行;"downgrade"=降级内部模型继续;
|
|
254
|
+
# "block"=直接阻断(不调任何模型),检测整段上下文;
|
|
255
|
+
# "block_user_input"=直接阻断,但只检测最后一条 HumanMessage(用户本轮输入)。
|
|
241
256
|
action: str = "allow",
|
|
242
257
|
# 阻断模式下的异步提示回调(与 on_downgrade 区分文案);downgrade 模式不用
|
|
243
258
|
on_block: Optional[Callable[[], Awaitable[None]]] = None,
|
|
244
259
|
# 测试注入:绕过懒加载的真实 get_llm
|
|
245
260
|
_detector: Any = None,
|
|
246
261
|
_internal_raw: Any = None,
|
|
262
|
+
# 是否执行检测。多 agent 子 agent 传 False:它看到的「最后一条 HumanMessage」
|
|
263
|
+
# 多是协调者委派指令而非用户原文,重复判易误命中;改由协调者检测、子 agent 只靠
|
|
264
|
+
# 共享 DowngradeState 短路阻断。单 agent 始终 True(默认)。
|
|
265
|
+
detect: bool = True,
|
|
247
266
|
):
|
|
248
267
|
self._model_tier = model_tier
|
|
249
268
|
# None 时检测器/降级目标都用 get_llm() 读 nacos default 模型,不写死模型名
|
|
@@ -251,7 +270,13 @@ class SensitiveGuardMiddleware(AgentMiddleware):
|
|
|
251
270
|
self._on_downgrade = on_downgrade
|
|
252
271
|
self._on_block = on_block
|
|
253
272
|
# 默认 allow(不检测):应用层未显式指定时按"放行"处理,避免误伤。
|
|
254
|
-
self._action = action if action in ("downgrade", "block", "allow") else "allow"
|
|
273
|
+
self._action = action if action in ("downgrade", "block", "block_user_input", "allow") else "allow"
|
|
274
|
+
self._detect_enabled = detect
|
|
275
|
+
# 单轮「有附件降 block」标志:仅 block_user_input 模式下,应用层每轮 chat 前按
|
|
276
|
+
# has_file 刷新。True → 本轮按 block 行为检测(整段上下文,含工具结果/附件正文);
|
|
277
|
+
# False → 按 block_user_input(仅最后一条 HumanMessage)。绝不改 _action,避免
|
|
278
|
+
# 与用户配的真 block 混淆(set_file_turn_degrade 在非 block_user_input 上为 no-op)。
|
|
279
|
+
self._file_turn_degrade = False
|
|
255
280
|
self._enabled = enabled
|
|
256
281
|
self._state = state or DowngradeState()
|
|
257
282
|
self._detect_prompt = detect_prompt or DEFAULT_DETECT_PROMPT
|
|
@@ -263,15 +288,50 @@ class SensitiveGuardMiddleware(AgentMiddleware):
|
|
|
263
288
|
def is_downgraded(self) -> bool:
|
|
264
289
|
return self._state.is_downgraded
|
|
265
290
|
|
|
291
|
+
@property
|
|
292
|
+
def _is_block_turn(self) -> bool:
|
|
293
|
+
"""本轮是否走阻断路径(命中即返空响应、不调任何模型)。
|
|
294
|
+
|
|
295
|
+
block 和 block_user_input 都是阻断型 action;降级标志只改「检测范围」
|
|
296
|
+
(effective_detect_messages: last_human vs all),不改「是否阻断」。
|
|
297
|
+
is_blocked 与 awrap_model_call 的 (b)(d) 共用本判定。
|
|
298
|
+
"""
|
|
299
|
+
return self._action in ("block", "block_user_input")
|
|
300
|
+
|
|
266
301
|
@property
|
|
267
302
|
def is_blocked(self) -> bool:
|
|
268
|
-
"""
|
|
269
|
-
|
|
303
|
+
"""本会话是否已阻断(命中过敏感且本轮 action 是阻断型)。
|
|
304
|
+
action ∈ {block, block_user_input} 时为 True(两者都是阻断型 action)。
|
|
305
|
+
降级标志只改检测范围(effective_detect_messages),不改是否阻断。"""
|
|
306
|
+
return self._state.is_downgraded and self._is_block_turn
|
|
270
307
|
|
|
271
308
|
@property
|
|
272
309
|
def action(self) -> str:
|
|
273
310
|
return self._action
|
|
274
311
|
|
|
312
|
+
def set_file_turn_degrade(self, on: bool) -> None:
|
|
313
|
+
"""单轮「有附件降 block」标志开关(仅对 base=block_user_input 生效)。
|
|
314
|
+
|
|
315
|
+
应用层每轮 agent.chat 开始前按本轮 has_file 调用:
|
|
316
|
+
- has_file=True → on=True 本轮按 block 行为检测(整段上下文)
|
|
317
|
+
- has_file=False → on=False 本轮按 block_user_input 行为检测(仅用户输入)
|
|
318
|
+
只在 self._action == "block_user_input" 时生效;其它 base(allow/downgrade/block)
|
|
319
|
+
调本方法为 no-op(且强制清标志防残留),绝不改 _action。
|
|
320
|
+
"""
|
|
321
|
+
if self._action == "block_user_input":
|
|
322
|
+
self._file_turn_degrade = bool(on)
|
|
323
|
+
else:
|
|
324
|
+
self._file_turn_degrade = False
|
|
325
|
+
|
|
326
|
+
@property
|
|
327
|
+
def effective_detect_messages(self) -> str:
|
|
328
|
+
"""本轮检测范围标识:'all'(整段上下文)/ 'last_human'(仅最后一条 HumanMessage)。
|
|
329
|
+
block_user_input + 降级标志 → 'all';block_user_input 无标志 → 'last_human';
|
|
330
|
+
block/downgrade → 'all';allow 由 (a) 短路不检测。"""
|
|
331
|
+
if self._action == "block_user_input" and not self._file_turn_degrade:
|
|
332
|
+
return "last_human"
|
|
333
|
+
return "all"
|
|
334
|
+
|
|
275
335
|
@property
|
|
276
336
|
def last_notice_source(self) -> str:
|
|
277
337
|
"""首次命中时的敏感来源(user_input/tool_result/history),供应用层选文案。"""
|
|
@@ -281,6 +341,18 @@ class SensitiveGuardMiddleware(AgentMiddleware):
|
|
|
281
341
|
def state(self) -> DowngradeState:
|
|
282
342
|
return self._state
|
|
283
343
|
|
|
344
|
+
@staticmethod
|
|
345
|
+
def _last_human(messages: List[BaseMessage]) -> Optional[List[BaseMessage]]:
|
|
346
|
+
"""取最后一条 HumanMessage,包装成单元素列表供 _detect 使用。
|
|
347
|
+
|
|
348
|
+
block_user_input 模式只检测用户本轮输入(含附件正文),工具结果/历史不进检测。
|
|
349
|
+
无 HumanMessage 返回 None(调用方放行)。
|
|
350
|
+
"""
|
|
351
|
+
for m in reversed(messages):
|
|
352
|
+
if isinstance(m, HumanMessage):
|
|
353
|
+
return [m]
|
|
354
|
+
return None
|
|
355
|
+
|
|
284
356
|
async def _get_detector(self):
|
|
285
357
|
if self._detector is None:
|
|
286
358
|
async with self._init_lock:
|
|
@@ -364,27 +436,42 @@ class SensitiveGuardMiddleware(AgentMiddleware):
|
|
|
364
436
|
if not self._enabled or self._model_tier == "internal" or self._action == "allow":
|
|
365
437
|
return await handler(request)
|
|
366
438
|
|
|
367
|
-
# (b)
|
|
439
|
+
# (b) 本会话已命中敏感(共享 state 已 downgraded)
|
|
368
440
|
if self._state.is_downgraded:
|
|
369
|
-
#
|
|
370
|
-
|
|
371
|
-
# 不进工具循环(无 tool_calls),干净结束。
|
|
372
|
-
if self._action == "block":
|
|
441
|
+
# 阻断路径(真 block 或 block_user_input+降级标志):返回空响应,不再调模型。
|
|
442
|
+
if self._is_block_turn:
|
|
373
443
|
return ModelResponse(result=[AIMessage(content="")])
|
|
374
|
-
#
|
|
444
|
+
# 降级模式(downgrade,或 block_user_input 非降级轮——后者理论不会到这因 (c) 只判用户输入):
|
|
445
|
+
# 路由内部模型继续;本次输入若非敏感(来自历史记忆)刷新 source=history
|
|
375
446
|
await self._refresh_source_if_history(request.messages)
|
|
376
447
|
return await handler(request.override(model=await self._get_internal_raw()))
|
|
377
448
|
|
|
378
|
-
# (
|
|
379
|
-
|
|
449
|
+
# (b') detect=False 且尚未命中:放行(多 agent 子 agent 不主动检测,
|
|
450
|
+
# 等协调者命中后由共享 state 在 (b) 短路阻断)。
|
|
451
|
+
if not self._detect_enabled:
|
|
452
|
+
return await handler(request)
|
|
453
|
+
|
|
454
|
+
# (c) 检测:按 effective_detect_messages 选喂给 detector 的消息范围
|
|
455
|
+
# block_user_input 无降级标志 → 仅最后一条 HumanMessage;其余(block/downgrade/
|
|
456
|
+
# block_user_input+降级;allow 已在 (a) 短路不会到这)→ 整段上下文
|
|
457
|
+
if self.effective_detect_messages == "last_human":
|
|
458
|
+
detect_messages = self._last_human(request.messages)
|
|
459
|
+
if detect_messages is None:
|
|
460
|
+
# 无用户输入(理论上不会发生)→ 无从检测,放行
|
|
461
|
+
return await handler(request)
|
|
462
|
+
else:
|
|
463
|
+
# block / downgrade / block_user_input+降级:整段上下文
|
|
464
|
+
detect_messages = request.messages
|
|
465
|
+
|
|
466
|
+
check = await self._detect(detect_messages)
|
|
380
467
|
if not check.is_sensitive:
|
|
381
468
|
return await handler(request)
|
|
382
469
|
|
|
383
|
-
# (d) 命中 → CAS
|
|
470
|
+
# (d) 命中 → CAS 抢占;按本轮是否阻断路径分流
|
|
384
471
|
is_first = await self._state.mark_downgraded(check.source)
|
|
385
|
-
if self.
|
|
472
|
+
if self._is_block_turn:
|
|
386
473
|
SYLogger.info(
|
|
387
|
-
f"[SensitiveGuard] 命中敏感信息,阻断执行: {check.reason} (source={check.source})")
|
|
474
|
+
f"[SensitiveGuard] 命中敏感信息,阻断执行: {check.reason} (source={check.source}, action={self._action})")
|
|
388
475
|
if is_first and self._on_block:
|
|
389
476
|
try:
|
|
390
477
|
await self._on_block()
|
{sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a33}/src/sycommon/agent/multi_agent_team.py
RENAMED
|
@@ -134,7 +134,7 @@ class TeamConfig(BaseModel):
|
|
|
134
134
|
sensitive_guard: bool = True # 是否启用敏感信息检测守卫
|
|
135
135
|
internal_model_name: Optional[str] = None # 敏感降级目标内部模型名(应用层透传)
|
|
136
136
|
sensitive_detect_prompt: Optional[str] = None # 敏感检测提示词(应用层覆盖)
|
|
137
|
-
sensitive_action: str = "allow" # "allow"=不检测放行;"downgrade"=降级继续;"block"=阻断
|
|
137
|
+
sensitive_action: str = "allow" # "allow"=不检测放行;"downgrade"=降级继续;"block"=阻断(整段上下文);"block_user_input"=阻断(仅检测用户输入)
|
|
138
138
|
|
|
139
139
|
coordinator_prompt: str = ""
|
|
140
140
|
coordinator_name: str = "项目经理"
|
|
@@ -200,6 +200,7 @@ class MultiAgentTeam:
|
|
|
200
200
|
coordinator_name: str = "项目经理",
|
|
201
201
|
recovery_manager: Optional[SandboxRecoveryManager] = None,
|
|
202
202
|
downgrade_state: Optional[DowngradeState] = None,
|
|
203
|
+
sensitive_guard: Optional["SensitiveGuardMiddleware"] = None,
|
|
203
204
|
):
|
|
204
205
|
self.user_id = user_id
|
|
205
206
|
self.agent = agent
|
|
@@ -210,6 +211,10 @@ class MultiAgentTeam:
|
|
|
210
211
|
self.sandbox_backend = sandbox_backend
|
|
211
212
|
self.recovery_manager = recovery_manager
|
|
212
213
|
self.downgrade_state = downgrade_state
|
|
214
|
+
# 协调者的敏感检测 guard 实例(build 时传入)。暴露给应用层读 guard 状态
|
|
215
|
+
# (is_downgraded / last_notice_source / set_file_turn_degrade 等),
|
|
216
|
+
# 让单 agent 与 multi-agent 的应用层代码统一走 `getattr(agent, "sensitive_guard", None)`。
|
|
217
|
+
self.sensitive_guard = sensitive_guard
|
|
213
218
|
|
|
214
219
|
@property
|
|
215
220
|
def is_downgraded(self) -> bool:
|
|
@@ -628,7 +633,9 @@ async def create_multi_agent_team(
|
|
|
628
633
|
# 任一命中 → 全员降级(敏感数据会经委派链流动,独立 state 会漏)。
|
|
629
634
|
shared_downgrade_state = DowngradeState()
|
|
630
635
|
|
|
631
|
-
def _make_guard():
|
|
636
|
+
def _make_guard(detect: bool = True):
|
|
637
|
+
"""协调者 detect=True(检测用户输入);子 agent detect=False
|
|
638
|
+
(只靠共享 state 短路阻断,不把委派指令当用户输入重复判)。"""
|
|
632
639
|
return SensitiveGuardMiddleware(
|
|
633
640
|
model_tier=config.model_tier,
|
|
634
641
|
enabled=config.sensitive_guard,
|
|
@@ -636,10 +643,11 @@ async def create_multi_agent_team(
|
|
|
636
643
|
internal_model_name=config.internal_model_name,
|
|
637
644
|
detect_prompt=config.sensitive_detect_prompt,
|
|
638
645
|
action=config.sensitive_action,
|
|
646
|
+
detect=detect,
|
|
639
647
|
)
|
|
640
648
|
|
|
641
649
|
middleware = [
|
|
642
|
-
_make_guard(),
|
|
650
|
+
_make_guard(detect=False),
|
|
643
651
|
ToolResultTruncationMiddleware(),
|
|
644
652
|
TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
|
|
645
653
|
summarization_mw,
|
|
@@ -686,6 +694,10 @@ async def create_multi_agent_team(
|
|
|
686
694
|
# 创建协调者 Agent
|
|
687
695
|
coord_name = config.coordinator_name
|
|
688
696
|
coord_summarization_mw = build_summarization_middleware(model, config.model_name, sandbox_backend)
|
|
697
|
+
# 协调者 guard 实例:单独构造,传给 MultiAgentTeam.sensitive_guard 供应用层读取
|
|
698
|
+
# (与单 agent 的 agent.sensitive_guard 对齐)。
|
|
699
|
+
coord_guard = _make_guard(detect=True)
|
|
700
|
+
|
|
689
701
|
coordinator_agent = create_deep_agent(
|
|
690
702
|
model=model,
|
|
691
703
|
tools=config.shared_tools or [get_current_date],
|
|
@@ -698,7 +710,7 @@ async def create_multi_agent_team(
|
|
|
698
710
|
debug=config.debug,
|
|
699
711
|
name=coord_name,
|
|
700
712
|
middleware=[
|
|
701
|
-
|
|
713
|
+
coord_guard,
|
|
702
714
|
ToolResultTruncationMiddleware(),
|
|
703
715
|
TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
|
|
704
716
|
coord_summarization_mw,
|
|
@@ -718,6 +730,7 @@ async def create_multi_agent_team(
|
|
|
718
730
|
coordinator_name=coord_name,
|
|
719
731
|
recovery_manager=recovery_manager,
|
|
720
732
|
downgrade_state=shared_downgrade_state,
|
|
733
|
+
sensitive_guard=coord_guard,
|
|
721
734
|
)
|
|
722
735
|
|
|
723
736
|
|
|
@@ -27,11 +27,11 @@ _SNAPSHOT_ENABLED = False
|
|
|
27
27
|
# restore_from_minio 的 MinIO 下载并发度。
|
|
28
28
|
# 两层信号量:
|
|
29
29
|
# - 单用户层 _RESTORE_PER_USER:每个用户恢复时最多 5 路并发下载(单用户恢复够快);
|
|
30
|
-
# - 全局层 _RESTORE_GLOBAL_CAP:全进程最多
|
|
31
|
-
#
|
|
32
|
-
# 单用户独享 5 槽 + 全局封顶
|
|
30
|
+
# - 全局层 _RESTORE_GLOBAL_CAP:全进程最多 100 路下载,多用户同时恢复时全局封顶,
|
|
31
|
+
# 避免无限放大压垮 MinIO/网络,又留足并发让多用户恢复不互相拖慢。
|
|
32
|
+
# 单用户独享 5 槽 + 全局封顶 100。
|
|
33
33
|
_RESTORE_PER_USER = 5
|
|
34
|
-
_RESTORE_GLOBAL_CAP =
|
|
34
|
+
_RESTORE_GLOBAL_CAP = 100
|
|
35
35
|
# 全局信号量惰性创建(绑定到首次调用时的 event loop;单 loop 部署下不变)。
|
|
36
36
|
_RESTORE_DOWNLOAD_SEM: "asyncio.Semaphore | None" = None
|
|
37
37
|
|
|
@@ -42,6 +42,13 @@ try:
|
|
|
42
42
|
from langchain_core.exceptions import ContextOverflowError
|
|
43
43
|
|
|
44
44
|
_orig_handle_bad_request = _lc_oai_base._handle_openai_bad_request
|
|
45
|
+
_orig_handle_api_error = _lc_oai_base._handle_openai_api_error
|
|
46
|
+
|
|
47
|
+
# langchain_openai 原生识别的上下文溢出模式(1.3.5 起 bad_request/api_error 各有):
|
|
48
|
+
# bad_request: "context_length_exceeded" / "Input tokens exceed the configured
|
|
49
|
+
# limit" / "prompt is too long"
|
|
50
|
+
# api_error : "exceeds the context window" ← 1.3.5 新增
|
|
51
|
+
# 这些都不覆盖 MiniMax/vLLM 的 "maximum context length is ..." 句式, 下方扩展补上。
|
|
45
52
|
|
|
46
53
|
def _patched_handle_openai_bad_request(e: openai.BadRequestError) -> None:
|
|
47
54
|
"""扩展版 _handle_openai_bad_request,识别更多上下文溢出错误格式。"""
|
|
@@ -58,14 +65,11 @@ try:
|
|
|
58
65
|
message=e.message, response=e.response, body=e.body
|
|
59
66
|
) from e
|
|
60
67
|
|
|
61
|
-
#
|
|
68
|
+
# 回退到原始处理逻辑(含官方的 context_length_exceeded 等识别)
|
|
62
69
|
_orig_handle_bad_request(e)
|
|
63
70
|
|
|
64
71
|
_lc_oai_base._handle_openai_bad_request = _patched_handle_openai_bad_request
|
|
65
72
|
|
|
66
|
-
# 同步 patch _handle_openai_api_error
|
|
67
|
-
_orig_handle_api_error = _lc_oai_base._handle_openai_api_error
|
|
68
|
-
|
|
69
73
|
def _patched_handle_openai_api_error(e: openai.APIError) -> None:
|
|
70
74
|
"""扩展版 _handle_openai_api_error,识别更多上下文溢出错误格式。"""
|
|
71
75
|
error_str = str(e)
|
|
@@ -73,6 +77,7 @@ try:
|
|
|
73
77
|
raise _lc_oai_base.OpenAIAPIContextOverflowError(
|
|
74
78
|
message=e.message, request=e.request, body=e.body
|
|
75
79
|
) from e
|
|
80
|
+
# 回退到原始处理逻辑(含官方 1.3.5 新增的 "exceeds the context window" 识别)
|
|
76
81
|
_orig_handle_api_error(e)
|
|
77
82
|
|
|
78
83
|
_lc_oai_base._handle_openai_api_error = _patched_handle_openai_api_error
|
|
@@ -186,7 +186,8 @@ class Config(metaclass=SingletonMeta):
|
|
|
186
186
|
# 但消费方按顶层 key 读取(LLMConfig 等)——提升到顶层,免得每个调用方都得知道嵌套路径。
|
|
187
187
|
override_keys = ['LLMConfig', 'EmbeddingConfig', 'RerankerConfig',
|
|
188
188
|
'ACPAgentConfig',
|
|
189
|
-
'SkillApiWhitelist'
|
|
189
|
+
'SkillApiWhitelist',
|
|
190
|
+
'SensitiveConfig']
|
|
190
191
|
for k in override_keys:
|
|
191
192
|
if k in project_cfg:
|
|
192
193
|
self.config[k] = project_cfg[k]
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""aio-pika 10 升级端到端验证(真实 RabbitMQ)。
|
|
2
|
+
|
|
3
|
+
验证 aio-pika 9.6.2 → 10.0.1(aiormq 6→7)升级的核心风险点:
|
|
4
|
+
1. 普通连接 connect() 的 connect+channel+publish+consume 全链路
|
|
5
|
+
2. connect_robust() + RobustConnection(robust 模块在 v10 仍保留)
|
|
6
|
+
3. Connection.Close 帧解析能力(用于诊断 vhost 权限等问题)
|
|
7
|
+
|
|
8
|
+
连接配置取自 shengye-platform-digital-work 的 nacos-data 快照(mq.yml)。
|
|
9
|
+
rabbit 用户对 /uat 无权限(broker ACL),对 / 有权限;本测试用 / 验证连通性,
|
|
10
|
+
/uat 的权限问题与本次升级无关,仅在 e2e 验证时记录为已知差异。
|
|
11
|
+
|
|
12
|
+
运行方式(pytest 或直接 python):
|
|
13
|
+
uv run python -m pytest src/sycommon/tests/test_upgrade_aio_pika.py -v -s
|
|
14
|
+
python src/sycommon/tests/test_upgrade_aio_pika.py
|
|
15
|
+
"""
|
|
16
|
+
import asyncio
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
|
|
20
|
+
import pytest
|
|
21
|
+
|
|
22
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
|
|
23
|
+
|
|
24
|
+
import aio_pika
|
|
25
|
+
from importlib.metadata import version
|
|
26
|
+
|
|
27
|
+
# nacos mq.yml 配置
|
|
28
|
+
MQ_HOST = "rabbitmq.test1.svc.k8s.syf.com"
|
|
29
|
+
MQ_PORT = 5672
|
|
30
|
+
MQ_USER = "rabbit"
|
|
31
|
+
MQ_PASS = "SU7BrhDfbGbH"
|
|
32
|
+
# rabbit 用户对 / 有权限;mq.yml 里的 /uat 是另一套授权用户才能访问的 vhost
|
|
33
|
+
MQ_VHOST_OK = "/"
|
|
34
|
+
MQ_VHOST_UAT = "uat"
|
|
35
|
+
|
|
36
|
+
TEST_QUEUE = "sycommon_upgrade_test"
|
|
37
|
+
TEST_MSG = b"upgrade-test"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _url(vhost: str) -> str:
|
|
41
|
+
return f"amqp://{MQ_USER}:{MQ_PASS}@{MQ_HOST}:{MQ_PORT}/{vhost}"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_aio_pika_versions_pinned():
|
|
45
|
+
"""v10 依赖链:aio-pika 10 / aiormq 7 / pamqp 4。"""
|
|
46
|
+
assert aio_pika.__version__ == "10.0.1", (
|
|
47
|
+
f"aio-pika 应为 10.0.1, 实际 {aio_pika.__version__}")
|
|
48
|
+
assert version("aiormq").split(".")[0] == "7", (
|
|
49
|
+
f"aiormq 主版本应为 7, 实际 {version('aiormq')}")
|
|
50
|
+
assert version("pamqp").split(".")[0] == "4", (
|
|
51
|
+
f"pamqp 主版本应为 4, 实际 {version('pamqp')}")
|
|
52
|
+
print(f" [OK] aio-pika={aio_pika.__version__} "
|
|
53
|
+
f"aiormq={version('aiormq')} pamqp={version('pamqp')}")
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def test_roundtrip_plain_connection():
|
|
57
|
+
"""普通连接:connect + channel + declare_queue + publish + get 全链路。"""
|
|
58
|
+
async def go():
|
|
59
|
+
conn = await aio_pika.connect(_url(MQ_VHOST_OK), timeout=10)
|
|
60
|
+
async with conn:
|
|
61
|
+
ch = await conn.channel()
|
|
62
|
+
q = await ch.declare_queue(TEST_QUEUE, auto_delete=True)
|
|
63
|
+
await ch.default_exchange.publish(
|
|
64
|
+
aio_pika.Message(body=TEST_MSG), routing_key=TEST_QUEUE)
|
|
65
|
+
msg = await q.get(timeout=5, no_ack=True)
|
|
66
|
+
return msg.body
|
|
67
|
+
|
|
68
|
+
body = asyncio.run(go())
|
|
69
|
+
assert body == TEST_MSG, f"收发不一致: {body!r}"
|
|
70
|
+
print(f" [OK] 普通连接 roundtrip: body={body!r}")
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_robust_connection_roundtrip():
|
|
74
|
+
"""connect_robust 返回 RobustConnection,robust 模块在 v10 仍存在且工作。"""
|
|
75
|
+
async def go():
|
|
76
|
+
conn: aio_pika.RobustConnection = await aio_pika.connect_robust(
|
|
77
|
+
_url(MQ_VHOST_OK), timeout=10)
|
|
78
|
+
info = {
|
|
79
|
+
"type": type(conn).__name__,
|
|
80
|
+
"is_robust": issubclass(type(conn), aio_pika.RobustConnection),
|
|
81
|
+
"reconnect_interval": conn.reconnect_interval,
|
|
82
|
+
}
|
|
83
|
+
async with conn:
|
|
84
|
+
ch = await conn.channel()
|
|
85
|
+
info["channel_type"] = type(ch).__name__
|
|
86
|
+
q = await ch.declare_queue(TEST_QUEUE, auto_delete=True)
|
|
87
|
+
got = asyncio.Event()
|
|
88
|
+
received = []
|
|
89
|
+
|
|
90
|
+
async def consumer(message: aio_pika.IncomingMessage):
|
|
91
|
+
received.append(message.body)
|
|
92
|
+
got.set()
|
|
93
|
+
|
|
94
|
+
await q.consume(consumer, no_ack=True)
|
|
95
|
+
await ch.default_exchange.publish(
|
|
96
|
+
aio_pika.Message(body=TEST_MSG), routing_key=TEST_QUEUE)
|
|
97
|
+
await asyncio.wait_for(got.wait(), timeout=5)
|
|
98
|
+
info["body"] = received[0]
|
|
99
|
+
return info
|
|
100
|
+
|
|
101
|
+
info = asyncio.run(go())
|
|
102
|
+
assert info["is_robust"], "connect_robust 未返回 RobustConnection 子类"
|
|
103
|
+
assert info["type"] == "RobustConnection", f"连接类型异常: {info['type']}"
|
|
104
|
+
assert info["channel_type"] == "RobustChannel", (
|
|
105
|
+
f"channel 非鲁棒类型: {info['channel_type']}")
|
|
106
|
+
assert info["body"] == TEST_MSG, f"robust 收发不一致: {info['body']!r}"
|
|
107
|
+
print(f" [OK] RobustConnection roundtrip: "
|
|
108
|
+
f"type={info['type']} channel={info['channel_type']} "
|
|
109
|
+
f"reconnect_interval={info['reconnect_interval']} body={info['body']!r}")
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def test_uat_vhost_permission_known_issue():
|
|
113
|
+
"""记录已知差异:rabbit 用户对 /uat 无权限(broker ACL,与升级无关)。
|
|
114
|
+
|
|
115
|
+
断言它确实被 broker 拒绝(reply_text 含 NOT_ALLOWED),以便未来
|
|
116
|
+
broker 授权变更时本测试会主动失败提醒复核。
|
|
117
|
+
"""
|
|
118
|
+
async def go():
|
|
119
|
+
conn = await aio_pika.connect(_url(MQ_VHOST_UAT), timeout=10)
|
|
120
|
+
async with conn:
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
try:
|
|
124
|
+
asyncio.run(go())
|
|
125
|
+
# 如果将来 /uat 对 rabbit 开放了权限,连接会成功 —— 提示复核
|
|
126
|
+
pytest.fail(
|
|
127
|
+
"/uat 现在可连了:broker 可能已给 rabbit 授权,请复核 mq.yml 配置")
|
|
128
|
+
except Exception as e: # noqa: BLE001
|
|
129
|
+
cl = e.args[1] if len(getattr(e, "args", ())) > 1 else None
|
|
130
|
+
detail = ""
|
|
131
|
+
if cl is not None and hasattr(cl, "marshal"):
|
|
132
|
+
detail = cl.marshal().decode("latin1", "replace")
|
|
133
|
+
assert "NOT_ALLOWED" in detail, (
|
|
134
|
+
f"/uat 被拒但原因非权限问题,请复核: {detail!r}")
|
|
135
|
+
print(f" [OK] /uat 确实因权限被拒(已知差异,与升级无关): "
|
|
136
|
+
f"{detail[:60]!r}")
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
if __name__ == "__main__":
|
|
140
|
+
# 直接运行模式(与 test_consumer_recovery.py 一致的 __main__ 风格)
|
|
141
|
+
async def main():
|
|
142
|
+
print("=" * 70)
|
|
143
|
+
print(" aio-pika 10 升级端到端验证")
|
|
144
|
+
print("=" * 70)
|
|
145
|
+
test_aio_pika_versions_pinned()
|
|
146
|
+
test_roundtrip_plain_connection()
|
|
147
|
+
test_robust_connection_roundtrip()
|
|
148
|
+
test_uat_vhost_permission_known_issue()
|
|
149
|
+
print("=" * 70)
|
|
150
|
+
print(" 全部通过")
|
|
151
|
+
print("=" * 70)
|
|
152
|
+
|
|
153
|
+
asyncio.run(main())
|