sycommon-python-lib 0.2.5a34__tar.gz → 0.2.5a36__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.5a34 → sycommon_python_lib-0.2.5a36}/PKG-INFO +4 -4
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/pyproject.toml +4 -4
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/deep_agent.py +40 -19
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/mcp/tool_loader.py +25 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/multi_agent_team.py +4 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/sandbox/file_ops.py +4 -4
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/summarization_utils.py +104 -20
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/tool_result_truncation.py +40 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/traceid.py +0 -3
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/rabbitmq/rabbitmq_client.py +14 -94
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +3 -24
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +35 -14
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +2 -20
- sycommon_python_lib-0.2.5a36/src/sycommon/tests/test_consumer_loss_rootcause.py +399 -0
- sycommon_python_lib-0.2.5a36/src/sycommon/tests/test_fix_verification.py +404 -0
- sycommon_python_lib-0.2.5a36/src/sycommon/tests/test_summary_leak_e2e.py +872 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon_python_lib.egg-info/PKG-INFO +4 -4
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon_python_lib.egg-info/SOURCES.txt +3 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon_python_lib.egg-info/requires.txt +3 -3
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/README.md +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/tests/test_sycli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5a36
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -9,16 +9,16 @@ Requires-Dist: aiohttp==3.13.5
|
|
|
9
9
|
Requires-Dist: aiomysql==0.3.2
|
|
10
10
|
Requires-Dist: anyio==4.13.0
|
|
11
11
|
Requires-Dist: decorator==5.3.1
|
|
12
|
-
Requires-Dist: deepagents==0.6.
|
|
12
|
+
Requires-Dist: deepagents==0.6.8
|
|
13
13
|
Requires-Dist: elasticsearch==9.4.1
|
|
14
14
|
Requires-Dist: fastapi==0.136.3
|
|
15
15
|
Requires-Dist: jinja2==3.1.6
|
|
16
16
|
Requires-Dist: kafka-python==2.3.1
|
|
17
|
-
Requires-Dist: langchain==1.3.
|
|
17
|
+
Requires-Dist: langchain==1.3.4
|
|
18
18
|
Requires-Dist: langchain-core==1.4.0
|
|
19
19
|
Requires-Dist: langchain-openai==1.2.2
|
|
20
20
|
Requires-Dist: langfuse==4.7.1
|
|
21
|
-
Requires-Dist: langgraph==1.2.
|
|
21
|
+
Requires-Dist: langgraph==1.2.4
|
|
22
22
|
Requires-Dist: langgraph-checkpoint-postgres==3.1.0
|
|
23
23
|
Requires-Dist: langgraph-checkpoint-redis==0.4.1
|
|
24
24
|
Requires-Dist: ldap3==2.9.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sycommon-python-lib"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.5a36"
|
|
4
4
|
description = "Add your description here"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -10,16 +10,16 @@ dependencies = [
|
|
|
10
10
|
"aiomysql==0.3.2",
|
|
11
11
|
"anyio==4.13.0",
|
|
12
12
|
"decorator==5.3.1",
|
|
13
|
-
"deepagents==0.6.
|
|
13
|
+
"deepagents==0.6.8",
|
|
14
14
|
"elasticsearch==9.4.1",
|
|
15
15
|
"fastapi==0.136.3",
|
|
16
16
|
"jinja2==3.1.6",
|
|
17
17
|
"kafka-python==2.3.1",
|
|
18
|
-
"langchain==1.3.
|
|
18
|
+
"langchain==1.3.4",
|
|
19
19
|
"langchain-core==1.4.0",
|
|
20
20
|
"langchain-openai==1.2.2",
|
|
21
21
|
"langfuse==4.7.1",
|
|
22
|
-
"langgraph==1.2.
|
|
22
|
+
"langgraph==1.2.4",
|
|
23
23
|
"langgraph-checkpoint-postgres==3.1.0",
|
|
24
24
|
"langgraph-checkpoint-redis==0.4.1",
|
|
25
25
|
"ldap3==2.9.1",
|
{sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/deep_agent.py
RENAMED
|
@@ -201,34 +201,42 @@ def _patch_agent_streaming(agent):
|
|
|
201
201
|
model_, effective_response_format = _get_bound_model(request)
|
|
202
202
|
messages = request.messages
|
|
203
203
|
|
|
204
|
-
# 🔑 根治摘要泄漏:将 lc_source="summarization" 的 HumanMessage
|
|
205
|
-
#
|
|
206
|
-
#
|
|
207
|
-
#
|
|
208
|
-
#
|
|
209
|
-
|
|
204
|
+
# 🔑 根治摘要泄漏:将 lc_source="summarization" 的 HumanMessage 内容
|
|
205
|
+
# 注入到 system_message 而非直接丢弃,保持记忆连续性。
|
|
206
|
+
# 根因分析(2026-06-06 端到端测试确认):
|
|
207
|
+
# 1. SummarizationMiddleware 将摘要注入为 HumanMessage
|
|
208
|
+
# 2. 模型看到 HumanMessage 后容易将其作为对话内容回显/复述
|
|
209
|
+
# 3. 之前完全移除摘要导致压缩后模型丢失所有记忆
|
|
210
|
+
# 修复策略:提取摘要内容 → 注入 SystemMessage(模型视其为指令/背景知识,
|
|
211
|
+
# 回显概率远低于 HumanMessage)→ 从 messages 中移除原始 HumanMessage
|
|
212
|
+
_summary_text = None
|
|
210
213
|
_filtered_messages = []
|
|
211
214
|
for _msg in messages:
|
|
212
215
|
if (isinstance(_msg, HumanMessage)
|
|
213
216
|
and getattr(_msg, "additional_kwargs", {}).get("lc_source") == "summarization"):
|
|
214
|
-
|
|
215
|
-
|
|
217
|
+
_raw = _msg.content or ""
|
|
218
|
+
# 去掉 <internal_context_data> 包装标签,提取纯摘要
|
|
219
|
+
_summary_text = re.sub(
|
|
220
|
+
r'</?internal_context_data>', '', _raw, flags=re.DOTALL
|
|
221
|
+
).strip()
|
|
222
|
+
SYLogger.debug("[DeepAgent] 摘要已从 HumanMessage 提取,将注入 system_message")
|
|
216
223
|
else:
|
|
217
224
|
_filtered_messages.append(_msg)
|
|
218
225
|
messages = _filtered_messages
|
|
219
226
|
|
|
220
|
-
if
|
|
221
|
-
from
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
227
|
+
if _summary_text and request.system_message:
|
|
228
|
+
from deepagents.middleware._utils import append_to_system_message
|
|
229
|
+
_summary_directive = (
|
|
230
|
+
"\n\n<system_context>\n"
|
|
231
|
+
"以下是之前对话历史的压缩摘要,作为你的内部记忆使用。"
|
|
232
|
+
"把它当作你自己的回忆,绝对不要在回复中重复、复述或引用此内容的任何部分。\n"
|
|
233
|
+
f"{_summary_text}\n"
|
|
234
|
+
"</system_context>"
|
|
225
235
|
)
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
SYLogger.debug(f"[DeepAgent] 已将 {len(_summary_parts)} 条摘要转为 SystemMessage")
|
|
231
|
-
elif request.system_message:
|
|
236
|
+
_new_sys = append_to_system_message(request.system_message, _summary_directive)
|
|
237
|
+
request = request.override(system_message=_new_sys)
|
|
238
|
+
|
|
239
|
+
if request.system_message:
|
|
232
240
|
messages = [request.system_message, *messages]
|
|
233
241
|
|
|
234
242
|
# 动态调整 max_tokens,防止 input + max_output 超过上下文窗口
|
|
@@ -628,6 +636,19 @@ class DeepAgent:
|
|
|
628
636
|
else:
|
|
629
637
|
content = raw_content or ""
|
|
630
638
|
|
|
639
|
+
# 🔑 Defense 3: 清理 AI 输出中的摘要泄漏标签(安全网)
|
|
640
|
+
# 即使摘要已注入 SystemMessage,模型仍可能在极少数情况下回显标签
|
|
641
|
+
if msg_type in ("AIMessage", "AIMessageChunk") and content:
|
|
642
|
+
for _pat in [
|
|
643
|
+
r'<internal_context_data>.*?</internal_context_data>',
|
|
644
|
+
r'<compressed_history>.*?</compressed_history>',
|
|
645
|
+
r'<system_context>.*?</system_context>',
|
|
646
|
+
]:
|
|
647
|
+
if re.search(_pat, content, re.DOTALL):
|
|
648
|
+
content = re.sub(_pat, '', content, flags=re.DOTALL)
|
|
649
|
+
SYLogger.warning("[DeepAgent] AI 输出包含摘要泄漏标签,已清理")
|
|
650
|
+
content = content.strip()
|
|
651
|
+
|
|
631
652
|
if msg_type in ("AIMessage", "AIMessageChunk"):
|
|
632
653
|
# 🔑 提取 reasoning_content(思考/推理内容)
|
|
633
654
|
# 模型在 thinking 模式下会将推理过程放在 reasoning_content 字段,
|
{sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/mcp/tool_loader.py
RENAMED
|
@@ -27,6 +27,27 @@ def sanitize_name(name: str) -> str:
|
|
|
27
27
|
return sanitized
|
|
28
28
|
|
|
29
29
|
|
|
30
|
+
def _contains_auth_error(err_msg: str) -> bool:
|
|
31
|
+
"""检查错误信息中是否包含认证相关关键词"""
|
|
32
|
+
auth_keywords = [
|
|
33
|
+
"401", "unauthorized", "token expired", "authentication failed",
|
|
34
|
+
"440", "login timeout", "403", "forbidden",
|
|
35
|
+
"认证失败", "登录过期", "token无效", "token过期",
|
|
36
|
+
"syt_token", "SYT_TOKEN",
|
|
37
|
+
]
|
|
38
|
+
msg_lower = err_msg.lower()
|
|
39
|
+
return any(kw.lower() in msg_lower for kw in auth_keywords)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _auth_error_hint() -> str:
|
|
43
|
+
"""返回认证错误时的 authorize 工具调用提示"""
|
|
44
|
+
return (
|
|
45
|
+
"\n\n⚠️ **检测到认证错误**:这可能是 SYT_TOKEN 过期或未设置导致的。"
|
|
46
|
+
"请立即调用 `authorize` 工具(传入失败原因和待重试的命令),"
|
|
47
|
+
"让用户重新授权后再自动重试。不要只是告知用户有问题。"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
30
51
|
def wrap_tool_with_error_handler(
|
|
31
52
|
tool: BaseTool,
|
|
32
53
|
server_config_id: str,
|
|
@@ -97,6 +118,10 @@ def wrap_tool_with_error_handler(
|
|
|
97
118
|
f"可能原因: MCP 服务器未启动、网络不可达或连接超时。\n"
|
|
98
119
|
f"请尝试不使用该工具继续完成任务,或联系管理员检查 MCP 服务 '{server_name}'。"
|
|
99
120
|
)
|
|
121
|
+
|
|
122
|
+
# 检测认证错误,追加 authorize 工具提示
|
|
123
|
+
if _contains_auth_error(err_msg):
|
|
124
|
+
friendly_msg += _auth_error_hint()
|
|
100
125
|
if is_content_and_artifact:
|
|
101
126
|
return friendly_msg, None
|
|
102
127
|
return [friendly_msg]
|
{sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/multi_agent_team.py
RENAMED
|
@@ -408,6 +408,10 @@ class MultiAgentTeam:
|
|
|
408
408
|
parent_agent_map.pop(tool_call_id, None)
|
|
409
409
|
|
|
410
410
|
elif msg_type == "HumanMessage":
|
|
411
|
+
# 🔑 跳过上下文压缩产生的摘要消息,不发送给前端
|
|
412
|
+
if getattr(msg, "additional_kwargs", {}).get("lc_source") == "summarization":
|
|
413
|
+
SYLogger.debug("[MultiAgentTeam] 跳过摘要消息 (lc_source=summarization)")
|
|
414
|
+
continue
|
|
411
415
|
if ai_chunk_buffer:
|
|
412
416
|
SYLogger.debug(f"[ai_message] {repr(ai_chunk_buffer[:100])}...")
|
|
413
417
|
ai_chunk_buffer = ""
|
{sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/agent/sandbox/file_ops.py
RENAMED
|
@@ -421,13 +421,13 @@ class FileOperationsMixin:
|
|
|
421
421
|
|
|
422
422
|
# ============== 搜索 ==============
|
|
423
423
|
|
|
424
|
-
def glob(self: "HTTPSandboxBackend", pattern: str, path: str =
|
|
424
|
+
def glob(self: "HTTPSandboxBackend", pattern: str, path: str | None = None) -> GlobResult:
|
|
425
425
|
"""glob 搜索文件"""
|
|
426
426
|
try:
|
|
427
427
|
self._ensure_synced_sync()
|
|
428
428
|
result = self._post_sync(f"{SANDBOX_API_PREFIX}/glob", {
|
|
429
429
|
"pattern": pattern,
|
|
430
|
-
"path": path,
|
|
430
|
+
"path": path or "/",
|
|
431
431
|
"user_id": self.user_id
|
|
432
432
|
})
|
|
433
433
|
matches = [FileInfo(**item) for item in result]
|
|
@@ -436,13 +436,13 @@ class FileOperationsMixin:
|
|
|
436
436
|
SYLogger.error(f"[Sandbox] glob 搜索失败: {e}")
|
|
437
437
|
return GlobResult(error=str(e))
|
|
438
438
|
|
|
439
|
-
async def aglob(self: "HTTPSandboxBackend", pattern: str, path: str =
|
|
439
|
+
async def aglob(self: "HTTPSandboxBackend", pattern: str, path: str | None = None, *, timeout: int = None) -> GlobResult:
|
|
440
440
|
"""异步 glob 搜索文件"""
|
|
441
441
|
try:
|
|
442
442
|
await self._ensure_synced_async()
|
|
443
443
|
result = await self._post_async_with_failover(f"{SANDBOX_API_PREFIX}/glob", {
|
|
444
444
|
"pattern": pattern,
|
|
445
|
-
"path": path,
|
|
445
|
+
"path": path or "/",
|
|
446
446
|
"user_id": self.user_id
|
|
447
447
|
}, timeout=timeout)
|
|
448
448
|
matches = [FileInfo(**item) for item in result]
|
|
@@ -26,7 +26,7 @@ if TYPE_CHECKING:
|
|
|
26
26
|
logger = logging.getLogger(__name__)
|
|
27
27
|
|
|
28
28
|
# 中文摘要提示词,替代 langchain DEFAULT_SUMMARY_PROMPT
|
|
29
|
-
#
|
|
29
|
+
# 使用纯自然段落格式(无标题/小标题/列表标记),避免结构化标题被模型回显到用户输出
|
|
30
30
|
CUSTOM_SUMMARY_PROMPT = """<role>
|
|
31
31
|
上下文提取助手
|
|
32
32
|
</role>
|
|
@@ -44,19 +44,15 @@ CUSTOM_SUMMARY_PROMPT = """<role>
|
|
|
44
44
|
下面的对话历史将被你在此步骤中提取的上下文替换。
|
|
45
45
|
你需要确保不会重复任何已完成的操作,因此你从对话历史中提取的上下文应集中于对整体目标最重要的信息。
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
请用纯自然段落格式提取上下文。不要使用任何标题、小标题、编号列表或【】括号标记。
|
|
48
|
+
用连贯的叙述方式,在段落中自然地包含以下四类信息:
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
第一段:用户的整体目标、主要请求和意图。
|
|
51
|
+
第二段:对话中做出的关键决策、重要结论、选择的策略及原因,以及被拒绝的选项。
|
|
52
|
+
第三段:涉及的重要文件路径、创建或修改过的资源。
|
|
53
|
+
第四段:仍需完成的待办事项和接下来的步骤。
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
提取并记录对话历史中所有最重要的上下文信息,包括重要选择、结论或策略,以及关键决策背后的推理。记录被拒绝的选项及其原因。
|
|
54
|
-
|
|
55
|
-
【相关文件】
|
|
56
|
-
列出在本次对话中创建、修改或访问的文件、资源或工件。对于文件修改,列出具体文件路径并简要描述每个文件的变更。
|
|
57
|
-
|
|
58
|
-
【待办事项】
|
|
59
|
-
列出为达成用户意图仍需完成的具体任务,以及接下来应该做什么。
|
|
55
|
+
重要:每段直接以内容开始,不要添加「用户意图」「关键上下文」等任何前缀标签。
|
|
60
56
|
</instructions>
|
|
61
57
|
|
|
62
58
|
用户将向你发送完整的消息历史,你需要从中提取上下文以创建替换内容。请仔细阅读所有内容,并深入思考哪些信息对整体目标最重要且应该被保存:
|
|
@@ -184,22 +180,110 @@ _orig_build_new_messages = _OrigDeepAgentsSumm._build_new_messages_with_path
|
|
|
184
180
|
|
|
185
181
|
|
|
186
182
|
def _patched_build_new_messages(self, summary, file_path):
|
|
183
|
+
content = (
|
|
184
|
+
"<internal_context_data>\n"
|
|
185
|
+
"[系统内部记忆]\n"
|
|
186
|
+
"这是你的内部记忆,帮助你回忆之前的对话。"
|
|
187
|
+
"把它当作你自己的回忆,而不是要输出的内容。"
|
|
188
|
+
"绝对不要在回复中提及、复述或引用此内容的任何部分。\n\n"
|
|
189
|
+
)
|
|
187
190
|
if file_path is not None:
|
|
188
|
-
content
|
|
189
|
-
"
|
|
190
|
-
"你正在一个已经被压缩的对话中继续回复用户。\n\n"
|
|
191
|
-
f"完整的对话历史已保存到 {file_path},如需查阅细节可以读取该文件。\n\n"
|
|
192
|
-
"以下是压缩后的对话摘要(直接基于此摘要理解上下文并正常回复用户,不要提及摘要的存在):\n\n"
|
|
193
|
-
f"<summary>\n{summary}\n</summary>"
|
|
191
|
+
content += (
|
|
192
|
+
f"Previous conversation history archived at: {file_path}\n\n"
|
|
194
193
|
)
|
|
195
|
-
|
|
196
|
-
|
|
194
|
+
content += (
|
|
195
|
+
f"<compressed_history>\n{summary}\n</compressed_history>\n"
|
|
196
|
+
"</internal_context_data>"
|
|
197
|
+
)
|
|
197
198
|
from langchain_core.messages import HumanMessage
|
|
198
199
|
return [HumanMessage(content=content, additional_kwargs={"lc_source": "summarization"})]
|
|
199
200
|
|
|
200
201
|
|
|
201
202
|
_OrigDeepAgentsSumm._build_new_messages_with_path = _patched_build_new_messages
|
|
202
203
|
|
|
204
|
+
# monkey-patch:覆盖 create_summarization_middleware,强制注入中文 summary_prompt
|
|
205
|
+
# deepagents graph.py:608 的 create_deep_agent 会自动调用此函数注入自动压缩 middleware,
|
|
206
|
+
# 但默认不传 summary_prompt,导致用英文 DEFAULT_SUMMARY_PROMPT(含 SESSION INTENT 等标题)。
|
|
207
|
+
def _patched_create_summarization_middleware(model, backend):
|
|
208
|
+
defaults = _patched_compute_summarization_defaults(model)
|
|
209
|
+
return _summ_mod.SummarizationMiddleware(
|
|
210
|
+
model=model,
|
|
211
|
+
backend=backend,
|
|
212
|
+
trigger=defaults["trigger"],
|
|
213
|
+
keep=defaults["keep"],
|
|
214
|
+
trim_tokens_to_summarize=None,
|
|
215
|
+
truncate_args_settings=defaults["truncate_args_settings"],
|
|
216
|
+
summary_prompt=CUSTOM_SUMMARY_PROMPT,
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
_summ_mod.create_summarization_middleware = _patched_create_summarization_middleware
|
|
221
|
+
# graph.py 在模块加载时 from import 了旧引用,需要同步 patch
|
|
222
|
+
try:
|
|
223
|
+
import deepagents.graph as _graph_mod
|
|
224
|
+
_graph_mod.create_summarization_middleware = _patched_create_summarization_middleware
|
|
225
|
+
except ImportError:
|
|
226
|
+
pass
|
|
227
|
+
|
|
228
|
+
# ==================== 防御性补丁 ====================
|
|
229
|
+
# 以下补丁确保即使某些代码路径绕过了 _patched_create_summarization_middleware,
|
|
230
|
+
# DEFAULT_SUMMARY_PROMPT 的英文标题(SESSION INTENT/SUMMARY/ARTIFACTS/NEXT STEPS)
|
|
231
|
+
# 也不会出现在模型生成的摘要中。
|
|
232
|
+
|
|
233
|
+
# 防御 1: 替换模块级 DEFAULT_SUMMARY_PROMPT 常量
|
|
234
|
+
# 虽然不能改变 __init__ 的默认参数(Python 在定义时求值),
|
|
235
|
+
# 但可以防止任何运行时读取 DEFAULT_SUMMARY_PROMPT 的代码拿到英文版。
|
|
236
|
+
_summ_mod.DEFAULT_SUMMARY_PROMPT = CUSTOM_SUMMARY_PROMPT
|
|
237
|
+
try:
|
|
238
|
+
import langchain.agents.middleware.summarization as _lc_summ_mod
|
|
239
|
+
_lc_summ_mod.DEFAULT_SUMMARY_PROMPT = CUSTOM_SUMMARY_PROMPT
|
|
240
|
+
except ImportError:
|
|
241
|
+
pass
|
|
242
|
+
|
|
243
|
+
# 防御 2: 包装 __init__,强制 summary_prompt 默认值为 CUSTOM_SUMMARY_PROMPT
|
|
244
|
+
# 即使调用方不传 summary_prompt,也会使用中文版。
|
|
245
|
+
_orig_da_init = _OrigDeepAgentsSumm.__init__
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _patched_da_init(self, model, *, backend, trigger=None,
|
|
249
|
+
keep=("messages", 20),
|
|
250
|
+
token_counter=count_tokens_approximately,
|
|
251
|
+
summary_prompt=CUSTOM_SUMMARY_PROMPT, # ← 关键:改为中文默认值
|
|
252
|
+
trim_tokens_to_summarize=4000,
|
|
253
|
+
truncate_args_settings=None, **kwargs):
|
|
254
|
+
_orig_da_init(self, model, backend=backend, trigger=trigger, keep=keep,
|
|
255
|
+
token_counter=token_counter, summary_prompt=summary_prompt,
|
|
256
|
+
trim_tokens_to_summarize=trim_tokens_to_summarize,
|
|
257
|
+
truncate_args_settings=truncate_args_settings, **kwargs)
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
_OrigDeepAgentsSumm.__init__ = _patched_da_init
|
|
261
|
+
|
|
262
|
+
# 防御 3: patch create_summarization_tool_middleware(deepagents 同模块本地调用绕过)
|
|
263
|
+
# deepagents summarization.py 中 create_summarization_tool_middleware 内部调用
|
|
264
|
+
# create_summarization_middleware 用的是同模块本地名称绑定,
|
|
265
|
+
# 不会走 _summ_mod.create_summarization_middleware 的模块属性替换。
|
|
266
|
+
if hasattr(_summ_mod, 'create_summarization_tool_middleware'):
|
|
267
|
+
_orig_create_tool_mw = _summ_mod.create_summarization_tool_middleware
|
|
268
|
+
|
|
269
|
+
def _patched_create_summarization_tool_middleware(model, backend, *, system_prompt=None):
|
|
270
|
+
"""强制使用 CUSTOM_SUMMARY_PROMPT 创建 SummarizationToolMiddleware。"""
|
|
271
|
+
defaults = _patched_compute_summarization_defaults(model)
|
|
272
|
+
summ = _summ_mod.SummarizationMiddleware(
|
|
273
|
+
model=model,
|
|
274
|
+
backend=backend,
|
|
275
|
+
trigger=defaults["trigger"],
|
|
276
|
+
keep=defaults["keep"],
|
|
277
|
+
summary_prompt=CUSTOM_SUMMARY_PROMPT,
|
|
278
|
+
trim_tokens_to_summarize=None,
|
|
279
|
+
truncate_args_settings=defaults["truncate_args_settings"],
|
|
280
|
+
)
|
|
281
|
+
return _summ_mod.SummarizationToolMiddleware(summ, system_prompt=system_prompt)
|
|
282
|
+
|
|
283
|
+
_summ_mod.create_summarization_tool_middleware = _patched_create_summarization_tool_middleware
|
|
284
|
+
|
|
285
|
+
logger.info("[SummarizationUtils] 防御性补丁已应用: DEFAULT_SUMMARY_PROMPT 替换 + __init__ 默认值覆盖 + create_summarization_tool_middleware 覆盖")
|
|
286
|
+
|
|
203
287
|
|
|
204
288
|
def build_summarization_middleware(
|
|
205
289
|
model: BaseChatModel,
|
|
@@ -40,6 +40,21 @@ DEFAULT_PASSTHROUGH_TOOLS: FrozenSet[str] = frozenset({
|
|
|
40
40
|
"web_search", # web_search 已在工具内部自行截断
|
|
41
41
|
})
|
|
42
42
|
|
|
43
|
+
# 认证错误关键词(用于检测工具结果中的 SYT_TOKEN 相关错误)
|
|
44
|
+
_AUTH_ERROR_KEYWORDS = [
|
|
45
|
+
"401", "unauthorized", "token expired", "authentication failed",
|
|
46
|
+
"440", "login timeout", "403", "forbidden",
|
|
47
|
+
"认证失败", "登录过期", "token无效", "token过期",
|
|
48
|
+
"syt_token", "SYT_TOKEN",
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
# 认证错误追加提示
|
|
52
|
+
_AUTH_ERROR_HINT = (
|
|
53
|
+
"\n\n⚠️ **检测到认证错误**:这可能是 SYT_TOKEN 过期或未设置导致的。"
|
|
54
|
+
"请立即调用 `authorize` 工具(传入失败原因和待重试的命令),"
|
|
55
|
+
"让用户重新授权后再自动重试。不要只是告知用户有问题。"
|
|
56
|
+
)
|
|
57
|
+
|
|
43
58
|
# head+tail 预览截断模板(对齐 deepagents 0.6.3 TOO_LARGE_TOOL_MSG 风格)
|
|
44
59
|
HEAD_TAIL_TRUNCATION_TEMPLATE = (
|
|
45
60
|
"[输出已截断,原始长度 {original} 字符 / {original_lines} 行。]"
|
|
@@ -216,6 +231,28 @@ class ToolResultTruncationMiddleware(AgentMiddleware):
|
|
|
216
231
|
)
|
|
217
232
|
return truncated
|
|
218
233
|
|
|
234
|
+
def _inject_auth_hint(self, content: str, tool_name: str) -> str:
|
|
235
|
+
"""检测工具结果中的认证错误,追加 authorize 工具调用提示。
|
|
236
|
+
|
|
237
|
+
仅对 execute 工具和 MCP 工具生效(这些是可能触发认证问题的工具),
|
|
238
|
+
跳过 authorize 工具本身避免循环。
|
|
239
|
+
"""
|
|
240
|
+
if tool_name == "authorize":
|
|
241
|
+
return content
|
|
242
|
+
# 仅对可能触发认证错误的工具检测(execute、mcp__、read_file 等)
|
|
243
|
+
is_relevant_tool = (
|
|
244
|
+
tool_name == "execute"
|
|
245
|
+
or tool_name.startswith("mcp__")
|
|
246
|
+
or tool_name in ("read_file", "write_file", "edit_file")
|
|
247
|
+
)
|
|
248
|
+
if not is_relevant_tool:
|
|
249
|
+
return content
|
|
250
|
+
|
|
251
|
+
content_lower = content.lower()
|
|
252
|
+
if any(kw.lower() in content_lower for kw in _AUTH_ERROR_KEYWORDS):
|
|
253
|
+
return content + _AUTH_ERROR_HINT
|
|
254
|
+
return content
|
|
255
|
+
|
|
219
256
|
def _process_result(
|
|
220
257
|
self,
|
|
221
258
|
result: Any,
|
|
@@ -254,6 +291,9 @@ class ToolResultTruncationMiddleware(AgentMiddleware):
|
|
|
254
291
|
if not isinstance(content, str):
|
|
255
292
|
return result
|
|
256
293
|
|
|
294
|
+
# 注入认证错误提示(在截断之前检测,避免被截断丢失)
|
|
295
|
+
content = self._inject_auth_hint(content, tool_name)
|
|
296
|
+
|
|
257
297
|
new_content = self._truncate(content, tool_name)
|
|
258
298
|
if new_content is content:
|
|
259
299
|
return result
|
{sycommon_python_lib-0.2.5a34 → sycommon_python_lib-0.2.5a36}/src/sycommon/middleware/traceid.py
RENAMED
|
@@ -40,10 +40,7 @@ def setup_trace_id_handler(app):
|
|
|
40
40
|
request_body = json.loads(raw_text)
|
|
41
41
|
else:
|
|
42
42
|
request_body = await request.json()
|
|
43
|
-
# 截断过大的 JSON body(如包含 base64 文件内容的请求)
|
|
44
43
|
body_str = json.dumps(request_body, ensure_ascii=False)
|
|
45
|
-
if len(body_str) > 5000:
|
|
46
|
-
request_body = {"_truncated": f"请求体 {len(body_str)} 字节,已省略"}
|
|
47
44
|
except Exception:
|
|
48
45
|
try:
|
|
49
46
|
request_body = await request.json()
|
|
@@ -74,7 +74,6 @@ class RabbitMQClient:
|
|
|
74
74
|
|
|
75
75
|
# 并发控制
|
|
76
76
|
self._connect_lock = asyncio.Lock()
|
|
77
|
-
self._reconnect_semaphore = asyncio.Semaphore(1)
|
|
78
77
|
|
|
79
78
|
# 异步任务并发控制(方案C:收到即ACK + create_task,复用 prefetch_count)
|
|
80
79
|
self.prefetch_count = kwargs.get('prefetch_count', 2)
|
|
@@ -235,9 +234,8 @@ class RabbitMQClient:
|
|
|
235
234
|
# 不符合命名规范或无队列名,清空队列引用
|
|
236
235
|
self._queue = None
|
|
237
236
|
|
|
238
|
-
async def
|
|
239
|
-
"""
|
|
240
|
-
# 1. 取消正在运行的后台 handler 任务
|
|
237
|
+
async def _cleanup_running_tasks(self) -> None:
|
|
238
|
+
"""仅清理后台 handler 任务(不做任何破坏性清理,不调 queue.cancel、不关通道)"""
|
|
241
239
|
if self._running_tasks:
|
|
242
240
|
for t in list(self._running_tasks):
|
|
243
241
|
if not t.done():
|
|
@@ -252,37 +250,8 @@ class RabbitMQClient:
|
|
|
252
250
|
pass
|
|
253
251
|
self._running_tasks.clear()
|
|
254
252
|
|
|
255
|
-
# 2. 清理连接关闭回调(移除对 self/loop 的引用)
|
|
256
|
-
if self._channel_conn:
|
|
257
|
-
try:
|
|
258
|
-
if self._channel_conn.close_callbacks:
|
|
259
|
-
self._channel_conn.close_callbacks.clear()
|
|
260
|
-
except Exception:
|
|
261
|
-
pass
|
|
262
|
-
|
|
263
|
-
# 3. 停止消费
|
|
264
|
-
try:
|
|
265
|
-
if self._consumer_tag and self._queue:
|
|
266
|
-
await self._queue.cancel(self._consumer_tag)
|
|
267
|
-
except Exception:
|
|
268
|
-
pass
|
|
269
|
-
|
|
270
|
-
# 4. 关闭旧通道
|
|
271
|
-
if self._channel and not self._channel.is_closed:
|
|
272
|
-
try:
|
|
273
|
-
await self._channel.close()
|
|
274
|
-
except Exception:
|
|
275
|
-
pass
|
|
276
|
-
|
|
277
|
-
# 5. 置空所有引用
|
|
278
|
-
self._channel = None
|
|
279
|
-
self._channel_conn = None
|
|
280
|
-
self._exchange = None
|
|
281
|
-
self._queue = None
|
|
282
|
-
self._consumer_tag = None
|
|
283
|
-
|
|
284
253
|
async def connect(self) -> None:
|
|
285
|
-
"""连接方法"""
|
|
254
|
+
"""连接方法 — 信任 aio-pika Robust 自动恢复,不注册 on_conn_closed"""
|
|
286
255
|
if self._closed:
|
|
287
256
|
raise RuntimeError("客户端已关闭,无法重新连接")
|
|
288
257
|
|
|
@@ -296,31 +265,17 @@ class RabbitMQClient:
|
|
|
296
265
|
was_consuming = self._consumer_tag is not None
|
|
297
266
|
|
|
298
267
|
try:
|
|
299
|
-
#
|
|
300
|
-
await self.
|
|
301
|
-
|
|
302
|
-
# 2. 获取新资源
|
|
303
|
-
self._channel, self._channel_conn = await self.connection_pool.acquire_channel()
|
|
304
|
-
|
|
305
|
-
# 3. 设置连接关闭回调
|
|
306
|
-
loop = asyncio.get_running_loop()
|
|
268
|
+
# 仅清理后台 handler 任务(不调 queue.cancel、不关通道、不清回调)
|
|
269
|
+
await self._cleanup_running_tasks()
|
|
307
270
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
except RuntimeError:
|
|
317
|
-
pass
|
|
318
|
-
|
|
319
|
-
if self._channel_conn:
|
|
320
|
-
self._channel_conn.close_callbacks.add(on_conn_closed)
|
|
321
|
-
|
|
322
|
-
# 4. 重建 Exchange/Queue
|
|
323
|
-
await self._rebuild_resources()
|
|
271
|
+
# 如果已有通道且未关闭,直接复用(aio-pika Robust 自动恢复的)
|
|
272
|
+
if self._channel and not self._channel.is_closed:
|
|
273
|
+
# 通道还活着,只需重建 exchange/queue 绑定
|
|
274
|
+
await self._rebuild_resources()
|
|
275
|
+
else:
|
|
276
|
+
# 通道不可用,从连接池获取新通道
|
|
277
|
+
self._channel, self._channel_conn = await self.connection_pool.acquire_channel()
|
|
278
|
+
await self._rebuild_resources()
|
|
324
279
|
|
|
325
280
|
except Exception as e:
|
|
326
281
|
logger.error(f"客户端连接失败: {str(e)}", exc_info=True)
|
|
@@ -329,7 +284,7 @@ class RabbitMQClient:
|
|
|
329
284
|
self._queue = None
|
|
330
285
|
raise
|
|
331
286
|
|
|
332
|
-
#
|
|
287
|
+
# 恢复消费
|
|
333
288
|
if was_consuming and self._message_handler:
|
|
334
289
|
if self._queue:
|
|
335
290
|
logger.info("🔄 检测到重连前处于消费状态,尝试自动恢复消费...")
|
|
@@ -341,41 +296,6 @@ class RabbitMQClient:
|
|
|
341
296
|
else:
|
|
342
297
|
logger.warning("⚠️ 队列对象无效,暂缓恢复消费,等待监控器兜底")
|
|
343
298
|
|
|
344
|
-
async def _safe_reconnect(self):
|
|
345
|
-
"""安全重连任务(不限制重试次数,由连接监控器兜底)
|
|
346
|
-
|
|
347
|
-
内存安全保证:
|
|
348
|
-
- 每次重试前通过 connect() -> _cleanup_before_reconnect() 彻底清理旧资源
|
|
349
|
-
- _cleanup_before_reconnect 会取消后台任务、关闭旧通道、清除回调引用
|
|
350
|
-
- connect() 持有 _connect_lock 保证不会并发创建重复资源
|
|
351
|
-
- 拉长失败间隔,避免频繁重连累积未清理的资源
|
|
352
|
-
"""
|
|
353
|
-
async with self._reconnect_semaphore:
|
|
354
|
-
if self._closed or await self.is_connected:
|
|
355
|
-
return
|
|
356
|
-
logger.info("触发后台安全重连...")
|
|
357
|
-
attempt = 0
|
|
358
|
-
while not self._closed:
|
|
359
|
-
if await self.is_connected:
|
|
360
|
-
return
|
|
361
|
-
attempt += 1
|
|
362
|
-
try:
|
|
363
|
-
# 前5次间隔5秒,之后每5次拉长到30秒,避免频繁创建/销毁资源
|
|
364
|
-
if attempt <= 5:
|
|
365
|
-
await asyncio.sleep(5)
|
|
366
|
-
else:
|
|
367
|
-
logger.info(f"已连续失败 {attempt} 次,等待30秒后继续...")
|
|
368
|
-
await asyncio.sleep(30)
|
|
369
|
-
|
|
370
|
-
# connect() 内部会先调用 _cleanup_before_reconnect() 清理旧资源
|
|
371
|
-
# 确保不会累积未关闭的通道/回调/任务
|
|
372
|
-
await self.connect()
|
|
373
|
-
if await self.is_connected:
|
|
374
|
-
return
|
|
375
|
-
except Exception as e:
|
|
376
|
-
logger.warning(
|
|
377
|
-
f"后台重连尝试 {attempt} 失败: {e}")
|
|
378
|
-
|
|
379
299
|
async def set_message_handler(self, handler: Callable) -> None:
|
|
380
300
|
if not callable(handler):
|
|
381
301
|
raise TypeError("消息处理器必须是可调用对象")
|
|
@@ -28,7 +28,8 @@ class RabbitMQClientManager(RabbitMQCoreService):
|
|
|
28
28
|
|
|
29
29
|
@classmethod
|
|
30
30
|
async def _clean_client_resources(cls, client: RabbitMQClient) -> None:
|
|
31
|
-
"""
|
|
31
|
+
"""清理客户端资源 — 不做破坏性清理(不调 stop_consuming/queue.cancel、不清 close_callbacks)
|
|
32
|
+
信任 aio-pika Robust 自动恢复机制,只清理后台任务和置空引用。"""
|
|
32
33
|
# 1. 取消正在运行的后台 handler 任务
|
|
33
34
|
if client._running_tasks:
|
|
34
35
|
for t in list(client._running_tasks):
|
|
@@ -43,29 +44,7 @@ class RabbitMQClientManager(RabbitMQCoreService):
|
|
|
43
44
|
pass
|
|
44
45
|
client._running_tasks.clear()
|
|
45
46
|
|
|
46
|
-
# 2.
|
|
47
|
-
if client._channel_conn:
|
|
48
|
-
try:
|
|
49
|
-
if client._channel_conn.close_callbacks:
|
|
50
|
-
client._channel_conn.close_callbacks.clear()
|
|
51
|
-
except Exception:
|
|
52
|
-
pass
|
|
53
|
-
|
|
54
|
-
# 3. 停止消费
|
|
55
|
-
try:
|
|
56
|
-
if client._consumer_tag:
|
|
57
|
-
await client.stop_consuming()
|
|
58
|
-
except Exception as e:
|
|
59
|
-
logger.warning(f"停止消费逻辑异常: {str(e)}")
|
|
60
|
-
|
|
61
|
-
# 4. 关闭通道
|
|
62
|
-
if client._channel and not client._channel.is_closed:
|
|
63
|
-
try:
|
|
64
|
-
await client._channel.close()
|
|
65
|
-
except Exception as e:
|
|
66
|
-
logger.warning(f"关闭通道异常: {str(e)}")
|
|
67
|
-
|
|
68
|
-
# 5. 置空所有引用
|
|
47
|
+
# 2. 置空引用(不调 queue.cancel、不关通道、不清 close_callbacks)
|
|
69
48
|
client._channel = None
|
|
70
49
|
client._channel_conn = None
|
|
71
50
|
client._exchange = None
|