sycommon-python-lib 0.2.7a30__tar.gz → 0.2.7a32__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.7a30 → sycommon_python_lib-0.2.7a32}/PKG-INFO +7 -7
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/pyproject.toml +7 -7
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/deep_agent.py +7 -6
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/mcp/tool_loader.py +5 -9
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/sensitive_guard.py +13 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/minio_sync.py +30 -12
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/summarization_utils.py +9 -4
- sycommon_python_lib-0.2.7a32/src/sycommon/tests/test_upgrade_aio_pika.py +153 -0
- sycommon_python_lib-0.2.7a32/src/sycommon/tests/test_upgrade_langgraph_stream.py +131 -0
- sycommon_python_lib-0.2.7a32/src/sycommon/tests/test_upgrade_verification.py +229 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/PKG-INFO +7 -7
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/SOURCES.txt +3 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/requires.txt +6 -6
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/README.md +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/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.7a32
|
|
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.7a32"
|
|
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.7a30 → sycommon_python_lib-0.2.7a32}/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
|
{sycommon_python_lib-0.2.7a30 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/mcp/tool_loader.py
RENAMED
|
@@ -350,15 +350,11 @@ async def _load_one_server(
|
|
|
350
350
|
pass
|
|
351
351
|
return []
|
|
352
352
|
except asyncio.CancelledError:
|
|
353
|
-
#
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
await on_server_failure(config.id, "发现失败")
|
|
359
|
-
except Exception:
|
|
360
|
-
pass
|
|
361
|
-
return []
|
|
353
|
+
# 外层取消(如会话重置 cancel 后台 _mcp_task)→ 必须向上传播,不能吞。
|
|
354
|
+
# 吞掉会让 load_mcp_tools_background 的 `except CancelledError: raise` 守卫失效、
|
|
355
|
+
# 任务被标记为正常完成而非已取消。单飞失败的哨兵是 RuntimeError(走下方 except Exception),
|
|
356
|
+
# 不会进这个分支,故这里只需 raise。
|
|
357
|
+
raise
|
|
362
358
|
except Exception as e:
|
|
363
359
|
SYLogger.warning(
|
|
364
360
|
f"[MCP] 服务器 '{config.name}' ({config.server_url}) 连接失败,跳过: {e}")
|
|
@@ -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
|
|
|
@@ -24,9 +24,24 @@ from sycommon.logging.kafka_log import SYLogger
|
|
|
24
24
|
# 日期快照功能预留,当前暂不启用
|
|
25
25
|
_SNAPSHOT_ENABLED = False
|
|
26
26
|
|
|
27
|
-
# restore_from_minio 的 MinIO
|
|
28
|
-
#
|
|
29
|
-
|
|
27
|
+
# restore_from_minio 的 MinIO 下载并发度。
|
|
28
|
+
# 两层信号量:
|
|
29
|
+
# - 单用户层 _RESTORE_PER_USER:每个用户恢复时最多 5 路并发下载(单用户恢复够快);
|
|
30
|
+
# - 全局层 _RESTORE_GLOBAL_CAP:全进程最多 100 路下载,多用户同时恢复时全局封顶,
|
|
31
|
+
# 避免无限放大压垮 MinIO/网络,又留足并发让多用户恢复不互相拖慢。
|
|
32
|
+
# 单用户独享 5 槽 + 全局封顶 100。
|
|
33
|
+
_RESTORE_PER_USER = 5
|
|
34
|
+
_RESTORE_GLOBAL_CAP = 100
|
|
35
|
+
# 全局信号量惰性创建(绑定到首次调用时的 event loop;单 loop 部署下不变)。
|
|
36
|
+
_RESTORE_DOWNLOAD_SEM: "asyncio.Semaphore | None" = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _get_restore_download_sem() -> "asyncio.Semaphore":
|
|
40
|
+
"""惰性创建全局下载信号量。"""
|
|
41
|
+
global _RESTORE_DOWNLOAD_SEM
|
|
42
|
+
if _RESTORE_DOWNLOAD_SEM is None:
|
|
43
|
+
_RESTORE_DOWNLOAD_SEM = asyncio.Semaphore(_RESTORE_GLOBAL_CAP)
|
|
44
|
+
return _RESTORE_DOWNLOAD_SEM
|
|
30
45
|
|
|
31
46
|
|
|
32
47
|
class MinioSyncService(metaclass=SingletonMeta):
|
|
@@ -763,15 +778,18 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
763
778
|
|
|
764
779
|
SYLogger.info(f"[MinIO] 需恢复 {len(to_restore)} 个文件到沙箱: user={user_id}")
|
|
765
780
|
|
|
766
|
-
# 4.
|
|
767
|
-
#
|
|
768
|
-
#
|
|
781
|
+
# 4. 并发恢复:两层限流。
|
|
782
|
+
# - per_user_sem(每次 restore 新建,本用户独享 5 槽):单用户恢复够快;
|
|
783
|
+
# - global_sem(进程级 15 槽):多用户同时恢复时全局封顶,防 N×5 路下载
|
|
784
|
+
# 打满线程池、挤占主请求路径的沙箱操作。
|
|
785
|
+
# 下载协程先抢本用户 5 槽、再抢全局 15 槽,故实际并发 = min(本用户待下载, 全局剩余)。
|
|
769
786
|
restored = 0
|
|
770
|
-
|
|
787
|
+
global_sem = _get_restore_download_sem()
|
|
788
|
+
per_user_sem = asyncio.Semaphore(_RESTORE_PER_USER)
|
|
771
789
|
|
|
772
790
|
async def _download_one(rel_path: str):
|
|
773
791
|
"""下载单个 MinIO 对象到内存,返回 (沙箱绝对路径, 内容) 或 None。"""
|
|
774
|
-
async with
|
|
792
|
+
async with per_user_sem, global_sem:
|
|
775
793
|
try:
|
|
776
794
|
def _download_object(bucket, key):
|
|
777
795
|
resp = self._client.get_object(bucket, key)
|
|
@@ -786,18 +804,18 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
786
804
|
)
|
|
787
805
|
return (f"/{rel_path}", content)
|
|
788
806
|
except Exception as e:
|
|
789
|
-
SYLogger.warning(f"[MinIO] 下载文件失败: {rel_path}, error
|
|
807
|
+
SYLogger.warning(f"[MinIO] 下载文件失败: {rel_path}, error: {e}")
|
|
790
808
|
return None
|
|
791
809
|
|
|
792
|
-
# 全量并发下载(
|
|
810
|
+
# 全量并发下载(受两层 Semaphore 限流),比按批串行快得多
|
|
793
811
|
download_results = await asyncio.gather(
|
|
794
812
|
*[_download_one(rp) for rp in to_restore]
|
|
795
813
|
)
|
|
796
814
|
downloaded = [r for r in download_results if r is not None]
|
|
797
815
|
|
|
798
816
|
# 上传仍走 batch_upload(服务端并发),按 5 个一批发(沙箱端点对超大批量可能限流)
|
|
799
|
-
for i in range(0, len(downloaded),
|
|
800
|
-
batch = downloaded[i:i +
|
|
817
|
+
for i in range(0, len(downloaded), _RESTORE_PER_USER):
|
|
818
|
+
batch = downloaded[i:i + _RESTORE_PER_USER]
|
|
801
819
|
if not batch:
|
|
802
820
|
continue
|
|
803
821
|
try:
|
|
@@ -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
|
|
@@ -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())
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""langgraph agent 流式升级端到端验证(真实 LLM)。
|
|
2
|
+
|
|
3
|
+
验证 langchain 1.2.12→1.3.13 + langgraph 1.2.8→1.2.9 + streaming 补丁
|
|
4
|
+
在真实 LLM 网关下,stream_mode="messages" 逐 token 触发 on_llm_new_token。
|
|
5
|
+
|
|
6
|
+
覆盖升级核心风险点:
|
|
7
|
+
1. 底层 ChatOpenAI.astream() 能逐 token 触发 on_llm_new_token
|
|
8
|
+
2. deepagents 的 model node(_execute_model_async)经补丁替换为 astream+config 后,
|
|
9
|
+
agent.astream(stream_mode="messages") 正常产出消息片段
|
|
10
|
+
|
|
11
|
+
连接配置取自 nacos-data llm 配置(10.10.6.132:3000 网关)。
|
|
12
|
+
|
|
13
|
+
CI/无内网环境默认跳过;连接到内网网关时显式开启:
|
|
14
|
+
SYCOMMON_E2E_LLM=1 uv run python -m pytest src/sycommon/tests/test_upgrade_langgraph_stream.py -v -s
|
|
15
|
+
python src/sycommon/tests/test_upgrade_langgraph_stream.py
|
|
16
|
+
"""
|
|
17
|
+
import asyncio
|
|
18
|
+
import os
|
|
19
|
+
import sys
|
|
20
|
+
|
|
21
|
+
import pytest
|
|
22
|
+
|
|
23
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
|
|
24
|
+
|
|
25
|
+
from langchain_openai import ChatOpenAI
|
|
26
|
+
from langchain_core.messages import HumanMessage
|
|
27
|
+
from langchain_core.callbacks import BaseCallbackHandler
|
|
28
|
+
|
|
29
|
+
# nacos llm 配置
|
|
30
|
+
BASE_URL = "http://10.10.6.132:3000/v1"
|
|
31
|
+
API_KEY = "sk-gbDkgZb3JD6i2Mrwf0RfYJf8YuEiby7nozQmv99E2fxEdUIh"
|
|
32
|
+
MODEL = "glm-5-turbo"
|
|
33
|
+
|
|
34
|
+
# 无内网网关访问时跳过真实集成(pytest 收集仍可用)
|
|
35
|
+
_E2E_ENABLED = os.environ.get("SYCOMMON_E2E_LLM") == "1"
|
|
36
|
+
_skip_no_intranet = pytest.mark.skipif(
|
|
37
|
+
not _E2E_ENABLED,
|
|
38
|
+
reason="需要内网 LLM 网关访问;设置 SYCOMMON_E2E_LLM=1 启用",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class _TokenCollector(BaseCallbackHandler):
|
|
43
|
+
"""统计 on_llm_new_token 触发次数。"""
|
|
44
|
+
|
|
45
|
+
def __init__(self):
|
|
46
|
+
self.tokens = 0
|
|
47
|
+
|
|
48
|
+
def on_llm_new_token(self, token, **kwargs): # noqa: D401
|
|
49
|
+
self.tokens += 1
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _make_model(max_tokens: int = 50) -> ChatOpenAI:
|
|
53
|
+
return ChatOpenAI(
|
|
54
|
+
model=MODEL, base_url=BASE_URL, api_key=API_KEY,
|
|
55
|
+
streaming=True, temperature=0.0, max_tokens=max_tokens,
|
|
56
|
+
extra_body={"stream_options": {"include_usage": True}},
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@_skip_no_intranet
|
|
61
|
+
def test_underlying_astream_triggers_token_callbacks():
|
|
62
|
+
"""底层 model.astream() 逐 token 触发 on_llm_new_token。"""
|
|
63
|
+
async def go():
|
|
64
|
+
model = _make_model()
|
|
65
|
+
collector = _TokenCollector()
|
|
66
|
+
chunks = 0
|
|
67
|
+
async for _chunk in model.astream(
|
|
68
|
+
[HumanMessage(content="用一句话介绍你自己")],
|
|
69
|
+
config={"callbacks": [collector]},
|
|
70
|
+
):
|
|
71
|
+
chunks += 1
|
|
72
|
+
return chunks, collector.tokens
|
|
73
|
+
|
|
74
|
+
chunks, tokens = asyncio.run(go())
|
|
75
|
+
assert chunks > 0, "astream 无产出"
|
|
76
|
+
assert tokens > 0, "on_llm_new_token 未触发 —— 流式回调链路断了"
|
|
77
|
+
print(f" [OK] astream chunks={chunks}, on_llm_new_token 触发 {tokens} 次")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@_skip_no_intranet
|
|
81
|
+
def test_agent_stream_mode_messages(monkeypatch):
|
|
82
|
+
"""端到端:deepagents agent + streaming 补丁 → stream_mode='messages' 产出。
|
|
83
|
+
|
|
84
|
+
这是 streaming 补丁(deep_agent.py:_patch_agent_streaming)要修复的核心场景:
|
|
85
|
+
官方 factory._execute_model_async 用 ainvoke 且不传 config,导致回调不触发;
|
|
86
|
+
补丁替换为 astream + 从 ContextVar 读 config,使 on_llm_new_token 透传到
|
|
87
|
+
stream_mode="messages" 消费者。
|
|
88
|
+
"""
|
|
89
|
+
from deepagents import create_deep_agent
|
|
90
|
+
from langgraph.checkpoint.memory import MemorySaver
|
|
91
|
+
|
|
92
|
+
agent = create_deep_agent(
|
|
93
|
+
model=_make_model(), tools=[], middleware=(), checkpointer=MemorySaver(),
|
|
94
|
+
)
|
|
95
|
+
from sycommon.agent.deep_agent import _patch_agent_streaming
|
|
96
|
+
_patch_agent_streaming(agent)
|
|
97
|
+
|
|
98
|
+
async def go():
|
|
99
|
+
config = {"configurable": {"thread_id": "upgrade-stream-test"}}
|
|
100
|
+
message_chunks = 0
|
|
101
|
+
async for _stream_mode, _chunk in agent.astream(
|
|
102
|
+
{"messages": [HumanMessage(content="用一个词回答:你好")]},
|
|
103
|
+
config=config,
|
|
104
|
+
stream_mode="messages",
|
|
105
|
+
):
|
|
106
|
+
message_chunks += 1
|
|
107
|
+
if message_chunks > 200: # 防御性截断
|
|
108
|
+
break
|
|
109
|
+
return message_chunks
|
|
110
|
+
|
|
111
|
+
message_chunks = asyncio.run(go())
|
|
112
|
+
assert message_chunks > 0, (
|
|
113
|
+
"stream_mode='messages' 无产出 —— 补丁未生效或流式链路断了")
|
|
114
|
+
print(f" [OK] agent stream_mode='messages' 产出 {message_chunks} 个消息片段")
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
if __name__ == "__main__":
|
|
118
|
+
async def main():
|
|
119
|
+
print("=" * 70)
|
|
120
|
+
print(" langgraph agent 流式升级端到端验证")
|
|
121
|
+
print("=" * 70)
|
|
122
|
+
if not _E2E_ENABLED:
|
|
123
|
+
print(" [SKIP] 未设置 SYCOMMON_E2E_LLM=1,跳过(需内网 LLM 网关)")
|
|
124
|
+
return
|
|
125
|
+
test_underlying_astream_triggers_token_callbacks()
|
|
126
|
+
test_agent_stream_mode_messages(None)
|
|
127
|
+
print("=" * 70)
|
|
128
|
+
print(" 全部通过")
|
|
129
|
+
print("=" * 70)
|
|
130
|
+
|
|
131
|
+
asyncio.run(main())
|