sycommon-python-lib 0.2.10a17__tar.gz → 0.2.10a18__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.10a17 → sycommon_python_lib-0.2.10a18}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/pyproject.toml +1 -1
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/api.py +11 -5
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/bridge.py +14 -5
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/guard.py +7 -4
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/monitor.py +25 -12
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/queue.py +16 -8
- sycommon_python_lib-0.2.10a18/src/sycommon/alert/ratelimit.py +82 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/sdk.py +28 -6
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/sdk_selfcheck.py +42 -20
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/agent/loop.py +1013 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/agent/types.py +233 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/coding/__init__.py +5 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/coding/mcpserver.py +253 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/json_parse.py +243 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/message.py +349 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/model.py +251 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/retry.py +175 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/transcript.py +404 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/transform.py +185 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/usage.py +105 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/core/validation.py +308 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/mcp/__init__.py +6 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/mcp/client.py +467 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/mcp/jsonrpc.py +191 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/mcp/transport.py +668 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/__init__.py +15 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/anthropic_client.py +791 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/bedrock_client.py +834 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/faux.py +247 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/google_client.py +619 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/kimi_client.py +152 -0
- sycommon_python_lib-0.2.10a18/src/sycommon/pi/providers/openai_client.py +1190 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/SOURCES.txt +24 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/README.md +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/acp_serve_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/server_adapter.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/deep_agent.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/reasoning_content_patch.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/resume_compactor.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/skills_retry_patch.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/alert_sdk.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/ao.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/env.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/EgressPolicyConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/health/readiness.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/bounded_kafka_sink.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/bounded_stdout_sink.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/kafka_log.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/egress_wall.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/sandbox_gateway.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/delay_queue.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/mq_store.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbit_management_client.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/rabbitmq/topic_registry.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_backend_factory_compat.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consume_dedup.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_broker_health.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_recovery_fix.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_db_keepalive.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_env_tenant_helper.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_fault_injection_real.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_integration_real_broker.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_mq_config_driven.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_nacos_llm_real.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_sandbox_glob_hardening.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_services_plugin_defaults.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tests/test_upgrade_verification.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/sso_token.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/time_utils.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/tools/user_id.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_frame_alignment.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_kafka_upie_fix.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_print_capture.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sql_params_full.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_streaming_e2e.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_summary_echo_break_loop.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sylogger_fixes.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_sync_skills_to_sandbox.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_time_utils.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_traceid_omit_base64.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_unicode_decode_regress.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_upload_concurrency.py +0 -0
- {sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/tests/test_upload_e2e_http.py +0 -0
|
@@ -10,6 +10,7 @@ from __future__ import annotations
|
|
|
10
10
|
from typing import Optional
|
|
11
11
|
|
|
12
12
|
from sycommon.alert.ao import AlertAo
|
|
13
|
+
from sycommon.alert.ratelimit import safe_invoke
|
|
13
14
|
from sycommon.alert.sdk import alert
|
|
14
15
|
from sycommon.alert.sdk_selfcheck import get_msg
|
|
15
16
|
|
|
@@ -21,11 +22,16 @@ LEVEL_FATAL = AlertAo.LEVEL_FATAL
|
|
|
21
22
|
|
|
22
23
|
def _alert_inner(level: str, template_no: str, title: str, detail: str,
|
|
23
24
|
err: Optional[Exception]) -> None:
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
ao
|
|
28
|
-
|
|
25
|
+
# send_alert 已有 try/except 红线;此处 safe_invoke 为门面层的第二道闸
|
|
26
|
+
# (未来实现变化也不外漏)。
|
|
27
|
+
def _send() -> None:
|
|
28
|
+
ao = AlertAo(level=level, templateNo=template_no or None,
|
|
29
|
+
title=title or None, detail=detail or None)
|
|
30
|
+
if err is not None:
|
|
31
|
+
ao.errorMsg = get_msg(err)
|
|
32
|
+
alert(ao)
|
|
33
|
+
|
|
34
|
+
safe_invoke("alert_inner", _send)
|
|
29
35
|
|
|
30
36
|
|
|
31
37
|
# ---------------- AlertSdk ----------------
|
{sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/bridge.py
RENAMED
|
@@ -11,6 +11,7 @@ import asyncio
|
|
|
11
11
|
import re
|
|
12
12
|
|
|
13
13
|
from sycommon.alert.monitor import register_db_stats, start_monitors
|
|
14
|
+
from sycommon.alert.ratelimit import safe_invoke
|
|
14
15
|
from sycommon.logging.kafka_log import SYLogger
|
|
15
16
|
|
|
16
17
|
|
|
@@ -39,11 +40,19 @@ def _sqlalchemy_pool_stats() -> dict:
|
|
|
39
40
|
|
|
40
41
|
|
|
41
42
|
async def init_alert_monitors() -> None:
|
|
42
|
-
"""启动默认监控(GC + 连接池饱和度)。engine 未初始化时跳过池监控。
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
"""启动默认监控(GC + 连接池饱和度)。engine 未初始化时跳过池监控。
|
|
44
|
+
|
|
45
|
+
隔离红线:接线过程任何异常只打日志,绝不带崩宿主启动。
|
|
46
|
+
(start_monitors 内部 asyncio.get_running_loop 要求在事件循环线程上
|
|
47
|
+
调用 — 不能丢 executor,直接同步执行 + safe_invoke 兜底。)
|
|
48
|
+
"""
|
|
49
|
+
def _wire() -> None:
|
|
50
|
+
stats = _sqlalchemy_pool_stats()
|
|
51
|
+
if stats:
|
|
52
|
+
register_db_stats(_sqlalchemy_pool_stats)
|
|
53
|
+
start_monitors()
|
|
54
|
+
|
|
55
|
+
safe_invoke("init_alert_monitors", _wire)
|
|
47
56
|
|
|
48
57
|
|
|
49
58
|
__all__ = ["init_alert_monitors", "register_db_stats"]
|
|
@@ -17,6 +17,7 @@ from typing import Callable, TypeVar
|
|
|
17
17
|
from sycommon.alert import api
|
|
18
18
|
from sycommon.alert.api import (LEVEL_CRITICAL, LEVEL_FATAL, LEVEL_INFO,
|
|
19
19
|
LEVEL_WARN)
|
|
20
|
+
from sycommon.alert.ratelimit import safe_invoke
|
|
20
21
|
|
|
21
22
|
T = TypeVar('T')
|
|
22
23
|
|
|
@@ -25,7 +26,8 @@ def alert_on_exception(level: str, title: str, template_no: str = "") -> Callabl
|
|
|
25
26
|
"""方法异常告警装饰器(@XxxAlert 切面等价)。
|
|
26
27
|
|
|
27
28
|
detail 为 "执行方法 模块.函数"(Java buildDetail 的
|
|
28
|
-
"执行方法 %s:%s" — declaringClass:method)
|
|
29
|
+
"执行方法 %s:%s" — declaringClass:method)。告警发送异常被 safe_invoke
|
|
30
|
+
吞掉,raise 的是业务原始异常。
|
|
29
31
|
"""
|
|
30
32
|
|
|
31
33
|
def deco(fn: Callable) -> Callable:
|
|
@@ -37,8 +39,8 @@ def alert_on_exception(level: str, title: str, template_no: str = "") -> Callabl
|
|
|
37
39
|
try:
|
|
38
40
|
return await fn(*args, **kwargs)
|
|
39
41
|
except Exception as e: # noqa: BLE001
|
|
40
|
-
api._alert_inner(
|
|
41
|
-
|
|
42
|
+
safe_invoke("guard alert", lambda: api._alert_inner(
|
|
43
|
+
level, template_no, title, f"执行方法 {where}", e))
|
|
42
44
|
raise
|
|
43
45
|
return async_wrapper
|
|
44
46
|
|
|
@@ -47,7 +49,8 @@ def alert_on_exception(level: str, title: str, template_no: str = "") -> Callabl
|
|
|
47
49
|
try:
|
|
48
50
|
return fn(*args, **kwargs)
|
|
49
51
|
except Exception as e: # noqa: BLE001
|
|
50
|
-
|
|
52
|
+
safe_invoke("guard alert", lambda: api._alert_inner(
|
|
53
|
+
level, template_no, title, f"执行方法 {where}", e))
|
|
51
54
|
raise
|
|
52
55
|
return wrapper
|
|
53
56
|
|
{sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/monitor.py
RENAMED
|
@@ -57,14 +57,24 @@ def start_monitors() -> None:
|
|
|
57
57
|
if _started:
|
|
58
58
|
return
|
|
59
59
|
_started = True
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
60
|
+
# 隔离红线:挂载阶段任何异常(取配置/建任务)只打日志,绝不带崩宿主启动。
|
|
61
|
+
try:
|
|
62
|
+
loop = asyncio.get_running_loop()
|
|
63
|
+
except RuntimeError:
|
|
64
|
+
SYLogger.error("[alert] 监控件挂载失败(无运行中事件循环,不影响服务)")
|
|
65
|
+
_started = False
|
|
66
|
+
return
|
|
67
|
+
try:
|
|
68
|
+
interval = get_int("sy-alert.gc-monitor.scan-interval-seconds", 10)
|
|
69
|
+
SYLogger.info(f"GC监控开启, 扫描间隔为: {interval} 秒")
|
|
70
|
+
loop.create_task(_gc_monitor_loop(interval))
|
|
71
|
+
if _db_stats_func is not None:
|
|
72
|
+
ds_interval = get_int("sy-alert.datasource.scan-interval-seconds", 10)
|
|
73
|
+
SYLogger.info(f"数据库连接池饱和度监控启动, 每 {ds_interval} 秒执行一次")
|
|
74
|
+
loop.create_task(_db_monitor_loop(ds_interval))
|
|
75
|
+
except Exception as e: # noqa: BLE001
|
|
76
|
+
SYLogger.error(f"[alert] 监控件挂载失败(不影响服务): {e}")
|
|
77
|
+
_started = False
|
|
68
78
|
|
|
69
79
|
|
|
70
80
|
async def _gc_monitor_loop(interval_s: int) -> None:
|
|
@@ -138,10 +148,13 @@ async def _db_monitor_loop(interval_s: int) -> None:
|
|
|
138
148
|
continue
|
|
139
149
|
rate = in_use / max_open
|
|
140
150
|
title = "数据库连接池"
|
|
141
|
-
# Java PoolMonitor:detail = name+"饱和:"+desc;
|
|
142
|
-
#
|
|
143
|
-
#
|
|
144
|
-
|
|
151
|
+
# Java PoolMonitor:detail = name+"饱和:"+PoolStatus.desc();
|
|
152
|
+
# desc 按 totalSize 分流(PoolStatus.desc 字节码 4:ifeq):
|
|
153
|
+
# totalSize==0 用 4 字段 "活跃数: %d, 等待数: %d, 最大数: %d,
|
|
154
|
+
# 名称: %s",非 0 用 5 字段版。SQLAlchemy pool 无 total 暴露 →
|
|
155
|
+
# 4 字段版(此前误用 5 字段版硬填 0,按 jar 纠正)。
|
|
156
|
+
# max<=5 且无等待 → 忽略告警。
|
|
157
|
+
desc = (f"活跃数: {in_use}, 等待数: 0, "
|
|
145
158
|
f"最大数: {max_open}, 名称: {title}")
|
|
146
159
|
detail = title + "饱和:" + desc
|
|
147
160
|
if max_open <= 5:
|
|
@@ -23,6 +23,7 @@ import time
|
|
|
23
23
|
from typing import List
|
|
24
24
|
|
|
25
25
|
from sycommon.alert.ao import AlertAo
|
|
26
|
+
from sycommon.alert.ratelimit import safe_invoke
|
|
26
27
|
from sycommon.alert.sdk_selfcheck import self_check_alert
|
|
27
28
|
|
|
28
29
|
|
|
@@ -39,7 +40,11 @@ class BoundedAlarmQueue:
|
|
|
39
40
|
self._cond = asyncio.Condition()
|
|
40
41
|
|
|
41
42
|
async def offer(self, item: AlertAo) -> bool:
|
|
42
|
-
"""对齐 Java offer(T):返回是否入队成功。
|
|
43
|
+
"""对齐 Java offer(T):返回是否入队成功。
|
|
44
|
+
|
|
45
|
+
隔离红线:丢弃分支的自检发送经 safe_invoke — 自检通道异常绝不带崩
|
|
46
|
+
入队调用方(业务线程)。
|
|
47
|
+
"""
|
|
43
48
|
async with self._cond:
|
|
44
49
|
# 分支 1:队头(最低最旧)堆积超时自检(仅 is_check 且队列非空)。
|
|
45
50
|
if self.is_check and self._items:
|
|
@@ -47,10 +52,10 @@ class BoundedAlarmQueue:
|
|
|
47
52
|
if first is not None and first.time and first.time > 0:
|
|
48
53
|
stuck_ms = int(time.time() * 1000) - first.time
|
|
49
54
|
if stuck_ms > self.block_timeout_ms:
|
|
50
|
-
self_check_alert(
|
|
55
|
+
safe_invoke("queue backlog self-check", lambda: self_check_alert(
|
|
51
56
|
f"{self.name}-消息堆积",
|
|
52
57
|
f"堆积时间={stuck_ms} ms 队列大小={len(self._items)}, "
|
|
53
|
-
f"告警详情:{first.get_key_msg()}")
|
|
58
|
+
f"告警详情:{first.get_key_msg()}"))
|
|
54
59
|
|
|
55
60
|
# 分支 2:未满直接有序插入。
|
|
56
61
|
if len(self._items) < self.capacity:
|
|
@@ -59,19 +64,22 @@ class BoundedAlarmQueue:
|
|
|
59
64
|
return True
|
|
60
65
|
|
|
61
66
|
# 分支 3:满且新条优先级高于队头最低者 → 驱逐队头,入新。
|
|
62
|
-
|
|
67
|
+
# 空列表守卫:capacity<=0 且队空时 items[0] 会 IndexError
|
|
68
|
+
# (九审探针;Go 侧 len>0 守卫同款 — Java 此处裸 first() 会
|
|
69
|
+
# NoSuchElementException,属 Java 自身缺陷,不复制)。
|
|
70
|
+
if self._items and item.compare_to(self._items[0]) > 0:
|
|
63
71
|
evicted = self._items.pop(0)
|
|
64
72
|
self._insert(item)
|
|
65
73
|
if self.is_check:
|
|
66
|
-
self_check_alert(
|
|
67
|
-
f"{self.name}-队列已满,丢弃队列消息", evicted.get_key_msg())
|
|
74
|
+
safe_invoke("queue evict self-check", lambda: self_check_alert(
|
|
75
|
+
f"{self.name}-队列已满,丢弃队列消息", evicted.get_key_msg()))
|
|
68
76
|
self._cond.notify()
|
|
69
77
|
return True
|
|
70
78
|
|
|
71
79
|
# 分支 4:满且新条不高于最低者 → 丢弃新消息。
|
|
72
80
|
if self.is_check:
|
|
73
|
-
self_check_alert(
|
|
74
|
-
f"{self.name}-队列已满,丢弃新消息", item.get_key_msg())
|
|
81
|
+
safe_invoke("queue drop self-check", lambda: self_check_alert(
|
|
82
|
+
f"{self.name}-队列已满,丢弃新消息", item.get_key_msg()))
|
|
75
83
|
return False
|
|
76
84
|
|
|
77
85
|
def _insert(self, item: AlertAo) -> None:
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""ratelimit.py — 发送侧限频(消费 pacing)+ 隔离红线 safe_invoke。
|
|
2
|
+
|
|
3
|
+
对齐 Go infra/alert/ratelimit.go(Java SDK 无发送限频,两库同为补强):
|
|
4
|
+
- sy-alert.rate-limit.max-per-second:每秒最多发送的告警【条数】(默认 100),
|
|
5
|
+
<=0 = 不限(回到 Java 行为,逃生口);
|
|
6
|
+
- 令牌桶按条计数:一批 N 条消耗 N 个令牌;不足则阻塞【专用消费线程】
|
|
7
|
+
(阻塞不影响业务线程;停机 cancel 优先于限率等待);
|
|
8
|
+
- 桶容量(突发额度)= rate;rate<单批上限(100)时抬到 100 — 允许一次
|
|
9
|
+
整批,防止 rate<batch 永等死锁。
|
|
10
|
+
|
|
11
|
+
配置读取时点:start()(含懒启动)一次性读入;改配置需重启进程生效。
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
import threading
|
|
17
|
+
import time
|
|
18
|
+
|
|
19
|
+
from sycommon.logging.kafka_log import SYLogger
|
|
20
|
+
|
|
21
|
+
SEND_RATE_KEY = "sy-alert.rate-limit.max-per-second"
|
|
22
|
+
DEFAULT_SEND_RATE_PS = 100
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SendRateLimiter:
|
|
26
|
+
"""单实例令牌桶(仅消费线程使用;加锁为测试与复用安全)。
|
|
27
|
+
|
|
28
|
+
burst(桶容量/突发额度)= rate;rate<单批上限(MAX_BATCH_SIZE=100)时抬到
|
|
29
|
+
100 — 允许一次整批,防止 rate<batch 永等死锁(与 Go ratelimit.go 同款)。
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
def __init__(self, rate_per_sec: int, max_batch: int = 100):
|
|
33
|
+
self.rate = float(rate_per_sec)
|
|
34
|
+
self._max_batch = float(max_batch)
|
|
35
|
+
self._burst = self.rate
|
|
36
|
+
if 0 < self._burst < self._max_batch:
|
|
37
|
+
self._burst = self._max_batch
|
|
38
|
+
self._tokens = self._burst
|
|
39
|
+
self._last = time.monotonic()
|
|
40
|
+
self._lock = threading.Lock()
|
|
41
|
+
|
|
42
|
+
async def acquire(self, n: int) -> None:
|
|
43
|
+
"""等到 n 个令牌才返回。不限速(n<=0)立即返回;CancelledError(停机)
|
|
44
|
+
传播给消费循环既有 except 分支处理 — 不因限率卡停机。"""
|
|
45
|
+
if self.rate <= 0 or n <= 0:
|
|
46
|
+
return
|
|
47
|
+
while True:
|
|
48
|
+
with self._lock:
|
|
49
|
+
now = time.monotonic()
|
|
50
|
+
self._tokens = min(self._burst,
|
|
51
|
+
self._tokens + (now - self._last) * self.rate)
|
|
52
|
+
self._last = now
|
|
53
|
+
if self._tokens >= n:
|
|
54
|
+
self._tokens -= n
|
|
55
|
+
return
|
|
56
|
+
wait = (n - self._tokens) / self.rate
|
|
57
|
+
await asyncio.sleep(wait + 0.001) # +1ms 防浮点取整自旋
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def send_rate_per_sec(read_cfg=None) -> int:
|
|
61
|
+
"""读限频配置(env relaxed binding:SY_ALERT_RATE_LIMIT_MAX_PER_SECOND 自动命中)。
|
|
62
|
+
|
|
63
|
+
read_cfg:测试注入 (key, default) -> int;缺省走 alert.env.get_int。
|
|
64
|
+
"""
|
|
65
|
+
if read_cfg is not None:
|
|
66
|
+
return read_cfg(SEND_RATE_KEY, DEFAULT_SEND_RATE_PS)
|
|
67
|
+
from sycommon.alert.env import get_int
|
|
68
|
+
return get_int(SEND_RATE_KEY, DEFAULT_SEND_RATE_PS)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def safe_invoke(what: str, fn) -> None:
|
|
72
|
+
"""隔离红线:alert 模块自身的异常只转 error 日志,绝不传播到宿主调用栈
|
|
73
|
+
("alert 自身报错不能引发集成项目报错")。"""
|
|
74
|
+
try:
|
|
75
|
+
fn()
|
|
76
|
+
except asyncio.CancelledError:
|
|
77
|
+
raise # 停机信号必须穿透,不能当 alert 自身错误吞掉
|
|
78
|
+
except Exception as e: # noqa: BLE001
|
|
79
|
+
try:
|
|
80
|
+
SYLogger.error(f"[alert] {what} failed (isolated, host unaffected): {e}")
|
|
81
|
+
except Exception: # noqa: BLE001 日志器本身也炸的终极兜底
|
|
82
|
+
pass
|
|
@@ -33,6 +33,7 @@ import aiohttp
|
|
|
33
33
|
from sycommon.alert.ao import AlertAo, get_count_string
|
|
34
34
|
from sycommon.alert.env import active_profile, app_name_of_sdk, get_property, local_ip
|
|
35
35
|
from sycommon.alert.queue import BoundedAlarmQueue
|
|
36
|
+
from sycommon.alert.ratelimit import SendRateLimiter, safe_invoke, send_rate_per_sec
|
|
36
37
|
from sycommon.alert.sdk_selfcheck import get_msg, self_check_alert_err
|
|
37
38
|
from sycommon.logging.kafka_log import SYLogger
|
|
38
39
|
from sycommon.tools.snowflake import Snowflake
|
|
@@ -73,6 +74,7 @@ class _InnerSDK:
|
|
|
73
74
|
self._thread: Optional[threading.Thread] = None
|
|
74
75
|
self._started = False
|
|
75
76
|
self._lock = threading.Lock()
|
|
77
|
+
self.limiter: Optional[SendRateLimiter] = None # _ensure_started 时按配置建
|
|
76
78
|
|
|
77
79
|
# ---------------- 专用线程生命周期 ----------------
|
|
78
80
|
|
|
@@ -90,6 +92,8 @@ class _InnerSDK:
|
|
|
90
92
|
return self._loop, self.queue
|
|
91
93
|
self.queue = BoundedAlarmQueue("告警SDK", QUEUE_CAPACITY,
|
|
92
94
|
QUEUE_BLOCK_TIMEOUT_MS, is_check=True)
|
|
95
|
+
# 发送限频(消费线程专用 pacing;见 ratelimit.py)— 启动时一次读配置。
|
|
96
|
+
self.limiter = SendRateLimiter(send_rate_per_sec(), MAX_BATCH_SIZE)
|
|
93
97
|
self._loop = asyncio.new_event_loop()
|
|
94
98
|
self._thread = threading.Thread(
|
|
95
99
|
target=self._run, args=(self._loop, self.queue),
|
|
@@ -111,14 +115,22 @@ class _InnerSDK:
|
|
|
111
115
|
except Exception as e: # noqa: BLE001 线程兜底:消费线程永不带崩进程
|
|
112
116
|
SYLogger.error(f"告警SDK消费线程异常退出: {e}")
|
|
113
117
|
finally:
|
|
114
|
-
self.
|
|
118
|
+
# 代际判定:仅当 self._loop 仍是本代 loop 时才清 started —
|
|
119
|
+
# stop() join 超时后新一代可能已启动,旧线程收尾不得抹掉新代
|
|
120
|
+
# 标志(否则下一条告警再拉一代,孤儿线程空转)。
|
|
121
|
+
# 判定+写必须同锁,与 _ensure_started 的启动序列互斥。
|
|
122
|
+
with self._lock:
|
|
123
|
+
if self._loop is loop:
|
|
124
|
+
self._started = False
|
|
115
125
|
if main_task is not None:
|
|
116
126
|
# stop() 经 loop.stop() 退出 run_forever — cancel 后给
|
|
117
127
|
# session.close 清理一次收尾机会(限时,不拖停机)。
|
|
118
128
|
main_task.cancel()
|
|
119
129
|
try:
|
|
120
130
|
loop.run_until_complete(main_task)
|
|
121
|
-
except
|
|
131
|
+
except BaseException: # noqa: BLE001 收尾兜底:消费协程被
|
|
132
|
+
# cancel 后仍可能从 finally 段抛任意异常(含 session.close
|
|
133
|
+
# 的 CancelledError 重入);吞掉只为收尾,不影响任何语义。
|
|
122
134
|
pass
|
|
123
135
|
try:
|
|
124
136
|
loop.close()
|
|
@@ -144,6 +156,10 @@ class _InnerSDK:
|
|
|
144
156
|
continue
|
|
145
157
|
if len(batch) == 1 and batch[0].traceId:
|
|
146
158
|
trace_id = batch[0].traceId
|
|
159
|
+
# 发送限频(消费线程专用 pacing):一批 N 条消耗 N 个令牌,
|
|
160
|
+
# 不足则等待(停机 cancel 优先)。见 ratelimit.py。
|
|
161
|
+
if self.limiter is not None:
|
|
162
|
+
await self.limiter.acquire(len(batch))
|
|
147
163
|
await self.send_to_alert_gateway(session, batch, trace_id, queue)
|
|
148
164
|
except asyncio.CancelledError:
|
|
149
165
|
SYLogger.error("应用系统停机,停止消费")
|
|
@@ -162,11 +178,12 @@ class _InnerSDK:
|
|
|
162
178
|
offer 本身非阻塞(Java offer 同款),等待上限 OFFER_TIMEOUT_S。
|
|
163
179
|
异常对齐 Java sendAlert 的 catch:warn("发送告警失败")+
|
|
164
180
|
SelfCheck("告警SDK-发送系统告警失败",null,e)。
|
|
181
|
+
隔离红线:任何 alert 内部异常到此为止,绝不传播到调用方栈。
|
|
165
182
|
"""
|
|
166
183
|
if ao is None:
|
|
167
184
|
return False
|
|
168
185
|
try:
|
|
169
|
-
self.init_alert_env(ao)
|
|
186
|
+
safe_invoke("init_alert_env", lambda: self.init_alert_env(ao))
|
|
170
187
|
ao.calc_priority()
|
|
171
188
|
loop, queue = self._ensure_started()
|
|
172
189
|
fut = asyncio.run_coroutine_threadsafe(queue.offer(ao), loop)
|
|
@@ -181,7 +198,7 @@ class _InnerSDK:
|
|
|
181
198
|
if ao is None:
|
|
182
199
|
return False
|
|
183
200
|
try:
|
|
184
|
-
self.init_alert_env(ao)
|
|
201
|
+
safe_invoke("init_alert_env", lambda: self.init_alert_env(ao))
|
|
185
202
|
ao.calc_priority()
|
|
186
203
|
loop, queue = self._ensure_started()
|
|
187
204
|
fut = asyncio.run_coroutine_threadsafe(queue.offer(ao), loop)
|
|
@@ -236,6 +253,11 @@ class _InnerSDK:
|
|
|
236
253
|
) as resp:
|
|
237
254
|
text = await resp.text()
|
|
238
255
|
SYLogger.info(f"send result status={resp.status}, body={text}")
|
|
256
|
+
# 非 2xx 不再静默当成功:抛错由消费循环对齐 Java 的
|
|
257
|
+
# SelfCheck+sleep 语义(此前网关 5xx 会被当"发送完成"吞掉)。
|
|
258
|
+
if not 200 <= resp.status < 300:
|
|
259
|
+
raise RuntimeError(
|
|
260
|
+
f"网关返回非 2xx: status={resp.status} body={text[:256]}")
|
|
239
261
|
SYLogger.info(f"批量发送 {len(batch)} 条告警完成")
|
|
240
262
|
|
|
241
263
|
async def stop(self) -> None:
|
|
@@ -297,10 +319,10 @@ async def stop() -> None:
|
|
|
297
319
|
|
|
298
320
|
|
|
299
321
|
def alert(ao: AlertAo) -> None:
|
|
300
|
-
"""对齐 Java InnerSdk.alert(AlertAo)
|
|
322
|
+
"""对齐 Java InnerSdk.alert(AlertAo)。隔离红线:alert 内部异常不外漏。"""
|
|
301
323
|
if ao is None:
|
|
302
324
|
return
|
|
303
|
-
_get_inner().send_alert(ao)
|
|
325
|
+
safe_invoke("alert", lambda: _get_inner().send_alert(ao))
|
|
304
326
|
|
|
305
327
|
|
|
306
328
|
async def alert_async(ao: AlertAo) -> bool:
|
{sycommon_python_lib-0.2.10a17 → sycommon_python_lib-0.2.10a18}/src/sycommon/alert/sdk_selfcheck.py
RENAMED
|
@@ -197,25 +197,42 @@ def self_check_alert(msg: str, detail: str = "") -> None:
|
|
|
197
197
|
|
|
198
198
|
|
|
199
199
|
def self_check_alert_err(msg: str, detail: str, err: Optional[Exception]) -> None:
|
|
200
|
-
"""对齐 Java SelfCheckAlert.alert(String, String, Exception)。
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
200
|
+
"""对齐 Java SelfCheckAlert.alert(String, String, Exception)。
|
|
201
|
+
|
|
202
|
+
markdown 异常信息段用 stack 前 256;日志第三参用 ex.getMessage()(仅消息)。
|
|
203
|
+
"""
|
|
204
|
+
_self_check_inner(msg, detail, get_msg(err),
|
|
205
|
+
err_log=str(err) if err is not None else "")
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _self_check_inner(msg: str, detail: str, err_stack: str,
|
|
209
|
+
err_log: str = "") -> None:
|
|
210
|
+
# 隔离红线:自检通道自身任何异常到此为止(队列 offer/监控循环等业务栈
|
|
211
|
+
# 上的调用点绝不被自检带崩)。
|
|
212
212
|
try:
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
213
|
+
if _UNITTEST:
|
|
214
|
+
return # 单测静默:不自检、不外发(含 warn 日志噪音)
|
|
215
|
+
# Java alert 首行第三参 = ex.getMessage()(字节码 33),非 stack。
|
|
216
|
+
SYLogger.warning(f"系统自检告警: {msg} {detail} {err_log}")
|
|
217
|
+
if not _limiter.try_acquire():
|
|
218
|
+
SYLogger.warning(f"系统自检异常频率过高 不发送告警 {msg}")
|
|
219
|
+
return
|
|
220
|
+
trace_id = ""
|
|
221
|
+
try:
|
|
222
|
+
from sycommon.middleware.context import current_trace_id
|
|
223
|
+
trace_id = current_trace_id.get() or ""
|
|
224
|
+
except Exception:
|
|
225
|
+
trace_id = SYLogger.get_trace_id() or ""
|
|
226
|
+
# Java lambda 捕获 alert() 调用时刻(now)与 traceId 一起入队 —
|
|
227
|
+
# markdown 展示的是【检测时刻】而非实际 HTTP 发出时刻。
|
|
228
|
+
_get_worker().submit({"msg": msg, "detail": detail, "err": err_stack,
|
|
229
|
+
"trace_id": trace_id,
|
|
230
|
+
"sent_at": datetime.now()})
|
|
231
|
+
except Exception as e: # noqa: BLE001
|
|
232
|
+
try:
|
|
233
|
+
SYLogger.error(f"[alert] self-check failed (isolated, host unaffected): {e}")
|
|
234
|
+
except Exception: # noqa: BLE001
|
|
235
|
+
pass
|
|
219
236
|
|
|
220
237
|
|
|
221
238
|
def _iso_local_date_time(dt: datetime) -> str:
|
|
@@ -239,15 +256,20 @@ def _iso_local_date_time(dt: datetime) -> str:
|
|
|
239
256
|
|
|
240
257
|
def build_self_check_markdown(item: dict) -> str:
|
|
241
258
|
"""对齐 Java alertInner 的 markdown 组装。"""
|
|
242
|
-
|
|
259
|
+
# Java lambda 捕获 alert() 时刻的 now;入队项携带 sent_at(缺省回退当前)。
|
|
260
|
+
now = _iso_local_date_time(item.get('sent_at') or datetime.now())
|
|
243
261
|
md = (
|
|
244
262
|
f"`{_t256(item.get('msg'))}` \n>应用:{_t256(app_name_of_sdk())}"
|
|
245
263
|
f" \n>IP:{_t256(local_ip())}"
|
|
246
264
|
f" \n>环境:{_t256(active_profile())}"
|
|
247
265
|
f" \n>时间:<font color=\"comment\">{now}</font>"
|
|
248
266
|
f" \n>traceId:<font color=\"comment\">{_t256(item.get('trace_id'))}</font> \n"
|
|
249
|
-
f">详情:{_t256(item.get('detail'))}\n"
|
|
250
267
|
)
|
|
268
|
+
# Java 字节码 117-121:StringUtils.isNotEmpty(detail) 才追加详情段 —
|
|
269
|
+
# 空 detail 不产生 ">详情:" 行(此前无条件写,已按 jar 复核对齐)。
|
|
270
|
+
detail = item.get('detail')
|
|
271
|
+
if detail:
|
|
272
|
+
md += f">详情:{_t256(detail)}\n"
|
|
251
273
|
if item.get('err'):
|
|
252
274
|
md += f">异常信息:\n{_t256(item['err'])}"
|
|
253
275
|
return md
|