sycommon-python-lib 0.2.7a31__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.7a31 → sycommon_python_lib-0.2.7a32}/PKG-INFO +7 -7
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/pyproject.toml +7 -7
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/deep_agent.py +7 -6
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/sensitive_guard.py +13 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/minio_sync.py +4 -4
- {sycommon_python_lib-0.2.7a31 → 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.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/PKG-INFO +7 -7
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/SOURCES.txt +3 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/requires.txt +6 -6
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/README.md +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/sitecustomize.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/skill_api_whitelist.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/skill_wl_check.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/SkillApiWhitelistConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.7a31 → sycommon_python_lib-0.2.7a32}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.7a31 → 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.7a31 → 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
|
|
@@ -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
|
|
|
@@ -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
|
|
@@ -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())
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"""验证本次依赖升级 + 补丁适配的正确性(纯离线,不依赖 RabbitMQ/真实 LLM)。
|
|
2
|
+
|
|
3
|
+
覆盖本次三处改动:
|
|
4
|
+
A. deep_agent.py 的 streaming 补丁白名单:_VERIFIED 已更新到 langchain==1.3.13,
|
|
5
|
+
且在 1.3.13 的真实 langchain.agents.factory 上能定位到 _execute_model_async
|
|
6
|
+
闭包(验证补丁在新版上仍生效、不跳过)。
|
|
7
|
+
B. summarization_utils.py 的 ContextOverflow 补丁:在 1.3.5 上成功替换
|
|
8
|
+
_handle_openai_bad_request / _handle_openai_api_error,且:
|
|
9
|
+
- MiniMax/vLLM 句式 "maximum context length is ..." 仍被正确转成
|
|
10
|
+
OpenAIContextOverflowError / OpenAIAPIContextOverflowError;
|
|
11
|
+
- 官方原生句式(context_length_exceeded / exceeds the context window)
|
|
12
|
+
通过回退 _orig 仍被识别(不被补丁截断)。
|
|
13
|
+
C. 依赖版本落地:langchain 1.3.13 / langchain_openai 1.3.5 / langchain_core 1.4.9。
|
|
14
|
+
"""
|
|
15
|
+
import sys
|
|
16
|
+
import pytest
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# ============================================================
|
|
20
|
+
# C. 依赖版本落地
|
|
21
|
+
# ============================================================
|
|
22
|
+
def test_installed_versions():
|
|
23
|
+
import langchain
|
|
24
|
+
import langchain_openai
|
|
25
|
+
import langchain_core
|
|
26
|
+
|
|
27
|
+
assert langchain.__version__ == "1.3.13", (
|
|
28
|
+
f"langchain 应为 1.3.13, 实际 {langchain.__version__}")
|
|
29
|
+
assert langchain_openai.__version__ == "1.3.5", (
|
|
30
|
+
f"langchain_openai 应为 1.3.5, 实际 {langchain_openai.__version__}")
|
|
31
|
+
assert langchain_core.__version__ == "1.4.9", (
|
|
32
|
+
f"langchain_core 应为 1.4.9, 实际 {langchain_core.__version__}")
|
|
33
|
+
print(f" [OK] langchain={langchain.__version__} "
|
|
34
|
+
f"langchain_openai={langchain_openai.__version__} "
|
|
35
|
+
f"langchain_core={langchain_core.__version__}")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# ============================================================
|
|
39
|
+
# A. streaming 补丁白名单 + 闭包定位(不创建真实 agent,直接验 langchain 源码结构)
|
|
40
|
+
# ============================================================
|
|
41
|
+
def test_streaming_patch_whitelist_updated():
|
|
42
|
+
"""_VERIFIED 白名单已更新到 1.3.13。"""
|
|
43
|
+
import inspect
|
|
44
|
+
from sycommon.agent import deep_agent
|
|
45
|
+
|
|
46
|
+
src = inspect.getsource(deep_agent._patch_agent_streaming)
|
|
47
|
+
assert '"langchain": "1.3.13"' in src, (
|
|
48
|
+
"_VERIFIED 白名单未更新到 langchain==1.3.13")
|
|
49
|
+
assert '"1.3.12"' not in src.split("_VERIFIED")[0].split("#")[-1] or \
|
|
50
|
+
True # 仅作存在性提示,真正断言在下一行
|
|
51
|
+
# 精确:_VERIFIED 字典行内应含 1.3.13
|
|
52
|
+
ver_line = [l for l in src.splitlines() if "_VERIFIED = " in l][0]
|
|
53
|
+
assert "1.3.13" in ver_line, f"_VERIFIED 行未指向 1.3.13: {ver_line.strip()}"
|
|
54
|
+
print(f" [OK] 白名单已更新: {ver_line.strip()}")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_factory_closure_locatable_on_1_3_13():
|
|
58
|
+
"""直接验证 langchain 1.3.13 的 factory.py 闭包结构,
|
|
59
|
+
确认 _patch_agent_streaming 的 cell 定位逻辑能成功命中。
|
|
60
|
+
|
|
61
|
+
复刻补丁里的 _cell_by_name 定位逻辑,对真实源码运行。
|
|
62
|
+
"""
|
|
63
|
+
# deepagents 的 create_deep_agent 在构建 agent 时才创建闭包,
|
|
64
|
+
# 这里直接 import factory 模块确认关键符号存在且未被官方改动。
|
|
65
|
+
from langchain.agents import factory as fac
|
|
66
|
+
|
|
67
|
+
src = inspect_getsource(fac)
|
|
68
|
+
# 1.3.13 官方仍是 ainvoke + 不传 config(子代理已用 sdiff 实证)
|
|
69
|
+
assert "output = await model_.ainvoke(messages)" in src, (
|
|
70
|
+
"1.3.13 的 _execute_model_async 未改用 astream —— 与补丁白名单注释一致, "
|
|
71
|
+
"补丁仍需保留")
|
|
72
|
+
assert "_execute_model_async" in src, "_execute_model_async 符号仍在"
|
|
73
|
+
assert "async def amodel_node" in src, "amodel_node 闭包仍在"
|
|
74
|
+
print(" [OK] langchain 1.3.13 factory.py 闭包结构确认: "
|
|
75
|
+
"_execute_model_async 仍存在、仍为 ainvoke+无config, 补丁替换点有效")
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def inspect_getsource(mod):
|
|
79
|
+
import inspect
|
|
80
|
+
return inspect.getsource(mod)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_cell_by_name_logic_on_real_amodel_node(monkeypatch):
|
|
84
|
+
"""实际构建一个 deep agent,触发 _patch_agent_streaming,断言它成功命中
|
|
85
|
+
闭包(而非打印 skip 警告)。这是补丁在 1.3.13 上是否真正生效的端到端验证。
|
|
86
|
+
"""
|
|
87
|
+
from sycommon.logging.kafka_log import SYLogger
|
|
88
|
+
|
|
89
|
+
# 收集补丁内部发出的日志(SYLogger 是自定义类, 静态方法 warning/info, monkeypatch 拦截)
|
|
90
|
+
captured: list[str] = []
|
|
91
|
+
monkeypatch.setattr(SYLogger, "warning",
|
|
92
|
+
staticmethod(lambda *a, **k: captured.append(" ".join(str(x) for x in a))))
|
|
93
|
+
monkeypatch.setattr(SYLogger, "info",
|
|
94
|
+
staticmethod(lambda *a, **k: captured.append(" ".join(str(x) for x in a))))
|
|
95
|
+
|
|
96
|
+
from langchain.chat_models import init_chat_model
|
|
97
|
+
from langchain_core.tools import tool as lc_tool
|
|
98
|
+
|
|
99
|
+
from deepagents import create_deep_agent
|
|
100
|
+
|
|
101
|
+
model = init_chat_model(
|
|
102
|
+
model="test", model_provider="openai",
|
|
103
|
+
base_url="http://localhost:1/v1",
|
|
104
|
+
api_key="sk-test", temperature=0.0)
|
|
105
|
+
|
|
106
|
+
@lc_tool
|
|
107
|
+
def dummy_tool() -> str:
|
|
108
|
+
"""dummy"""
|
|
109
|
+
return "ok"
|
|
110
|
+
|
|
111
|
+
agent = create_deep_agent(
|
|
112
|
+
model=model, tools=[dummy_tool],
|
|
113
|
+
middleware=(), checkpointer=None,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
from sycommon.agent.deep_agent import _patch_agent_streaming
|
|
117
|
+
_patch_agent_streaming(agent)
|
|
118
|
+
|
|
119
|
+
# 断言没有打出 "skip streaming patch"(即命中失败)警告
|
|
120
|
+
skip_warnings = [m for m in captured if "skip streaming patch" in m]
|
|
121
|
+
assert not skip_warnings, (
|
|
122
|
+
f"补丁在 1.3.13 上未命中闭包, 发出 skip 警告: {skip_warnings}")
|
|
123
|
+
# 应打出 patched 成功日志
|
|
124
|
+
patched_logs = [m for m in captured if "patched (astream + config)" in m]
|
|
125
|
+
assert patched_logs, (
|
|
126
|
+
"补丁未打印 patched 成功日志, 可能未替换 _execute_model_async")
|
|
127
|
+
print(f" [OK] 补丁在 langchain 1.3.13 上成功替换 _execute_model_async")
|
|
128
|
+
print(f" 成功日志: {patched_logs[0][:120]}")
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# ============================================================
|
|
132
|
+
# B. ContextOverflow 补丁
|
|
133
|
+
# ============================================================
|
|
134
|
+
def _make_bad_request(msg: str):
|
|
135
|
+
"""构造一个真实的 openai.BadRequestError(带 httpx.Response)。"""
|
|
136
|
+
import openai
|
|
137
|
+
import httpx
|
|
138
|
+
resp = httpx.Response(400, request=httpx.Request("POST", "http://localhost/v1"))
|
|
139
|
+
return openai.BadRequestError(msg, response=resp, body={})
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def _make_api_error(msg: str):
|
|
143
|
+
"""构造一个真实的 openai.APIError(带 request)。"""
|
|
144
|
+
import openai
|
|
145
|
+
import httpx
|
|
146
|
+
req = httpx.Request("POST", "http://localhost/v1")
|
|
147
|
+
# APIError 签名: (message, *, request, body=None)
|
|
148
|
+
return openai.APIError(msg, request=req, body={})
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def test_overflow_patch_replaces_handlers():
|
|
152
|
+
"""import summarization_utils 后, 两个 handler 已被替换为 patched 版本。"""
|
|
153
|
+
import sycommon.agent.summarization_utils # noqa: F401 触发补丁
|
|
154
|
+
import langchain_openai.chat_models.base as base
|
|
155
|
+
|
|
156
|
+
assert base._handle_openai_bad_request.__name__ == \
|
|
157
|
+
"_patched_handle_openai_bad_request", "bad_request handler 未被替换"
|
|
158
|
+
assert base._handle_openai_api_error.__name__ == \
|
|
159
|
+
"_patched_handle_openai_api_error", "api_error handler 未被替换"
|
|
160
|
+
print(" [OK] 两个 handler 均已被 patched 版本替换")
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def test_overflow_minimax_bad_request_recognized():
|
|
164
|
+
"""MiniMax/vLLM 句式 → OpenAIContextOverflowError。"""
|
|
165
|
+
import sycommon.agent.summarization_utils # noqa: F401 确保补丁已应用
|
|
166
|
+
import langchain_openai.chat_models.base as base
|
|
167
|
+
|
|
168
|
+
for msg in [
|
|
169
|
+
"This model's maximum context length is 8192 tokens. "
|
|
170
|
+
"However, your messages resulted in 9000 tokens.",
|
|
171
|
+
"Please reduce the length of the input prompt.",
|
|
172
|
+
]:
|
|
173
|
+
e = _make_bad_request(msg)
|
|
174
|
+
with pytest.raises(base.OpenAIContextOverflowError):
|
|
175
|
+
base._handle_openai_bad_request(e)
|
|
176
|
+
print(" [OK] MiniMax/vLLM bad_request 句式被正确识别")
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def test_overflow_minimax_api_error_recognized():
|
|
180
|
+
"""MiniMax/vLLM 句式经 APIError 路径 → OpenAIAPIContextOverflowError。"""
|
|
181
|
+
import sycommon.agent.summarization_utils # noqa: F401 确保补丁已应用
|
|
182
|
+
import langchain_openai.chat_models.base as base
|
|
183
|
+
|
|
184
|
+
e = _make_api_error(
|
|
185
|
+
"This model's maximum context length is 8192 tokens.")
|
|
186
|
+
with pytest.raises(base.OpenAIAPIContextOverflowError):
|
|
187
|
+
base._handle_openai_api_error(e)
|
|
188
|
+
print(" [OK] MiniMax/vLLM api_error 句式被正确识别")
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def test_overflow_native_unchanged_via_fallback():
|
|
192
|
+
"""官方原生句式通过 _orig 回退仍被识别(补丁没有截断官方逻辑)。
|
|
193
|
+
|
|
194
|
+
1.3.5 新增的 _handle_openai_api_error 识别 'exceeds the context window';
|
|
195
|
+
补丁对该句式应回退到官方 _orig 从而抛出 OpenAIAPIContextOverflowError。
|
|
196
|
+
"""
|
|
197
|
+
import sycommon.agent.summarization_utils # noqa: F401 确保补丁已应用
|
|
198
|
+
import langchain_openai.chat_models.base as base
|
|
199
|
+
|
|
200
|
+
# bad_request 原生: context_length_exceeded
|
|
201
|
+
e1 = _make_bad_request(
|
|
202
|
+
"This model's context_length_exceeded, too long")
|
|
203
|
+
with pytest.raises(base.OpenAIContextOverflowError):
|
|
204
|
+
base._handle_openai_bad_request(e1)
|
|
205
|
+
|
|
206
|
+
# api_error 1.3.5 原生: exceeds the context window
|
|
207
|
+
e2 = _make_api_error("input exceeds the context window")
|
|
208
|
+
with pytest.raises(base.OpenAIAPIContextOverflowError):
|
|
209
|
+
base._handle_openai_api_error(e2)
|
|
210
|
+
print(" [OK] 官方原生句式(context_length_exceeded / exceeds the context window)"
|
|
211
|
+
" 通过回退仍被识别")
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def test_overflow_unrelated_error_reraised():
|
|
215
|
+
"""非上下文溢出的错误应原样 re-raise,不被误转。"""
|
|
216
|
+
import sycommon.agent.summarization_utils # noqa: F401 确保补丁已应用
|
|
217
|
+
import openai
|
|
218
|
+
import langchain_openai.chat_models.base as base
|
|
219
|
+
|
|
220
|
+
# 一个与上下文无关的 BadRequestError(会落入官方源码末尾的 raise, re-raise)
|
|
221
|
+
# 官方 _handle_openai_bad_request 末尾是裸 `raise`, 需在 except 块内才有 active
|
|
222
|
+
# exception。这里用 try/except 包一层模拟 langchain 的真实调用上下文。
|
|
223
|
+
e = _make_bad_request("invalid api key format")
|
|
224
|
+
try:
|
|
225
|
+
raise e
|
|
226
|
+
except openai.BadRequestError:
|
|
227
|
+
with pytest.raises(openai.BadRequestError):
|
|
228
|
+
base._handle_openai_bad_request(e)
|
|
229
|
+
print(" [OK] 无关错误原样 re-raise, 未被误转")
|