sycommon-python-lib 0.2.10a11__tar.gz → 0.2.10a12__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.10a11 → sycommon_python_lib-0.2.10a12}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/pyproject.toml +1 -1
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/kafka_log.py +42 -5
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/logger_levels.py +9 -3
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
- sycommon_python_lib-0.2.10a12/tests/test_kafka_upie_fix.py +401 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/README.md +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/acp_serve_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/server_adapter.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/deep_agent.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/middleware/model_request_prep.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/reasoning_content_patch.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/resume_compactor.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/skills_retry_patch.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/EgressPolicyConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/health/readiness.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/bounded_kafka_sink.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/bounded_stdout_sink.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/egress_wall.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/sandbox_gateway.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbit_management_client.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/services.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_backend_factory_compat.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consume_dedup.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_broker_health.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_recovery_fix.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_consumer_tags_sync.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_db_keepalive.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_env_tenant_helper.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_fault_injection_real.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_fix_verification.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_heartbeat_timeout.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_integration_real_broker.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_mq_config_driven.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_nacos_llm_real.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_queue_priority_fallback.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_reconnect_scenarios.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_sandbox_glob_hardening.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_services_plugin_defaults.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_summary_leak_e2e.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_upgrade_aio_pika.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tests/test_upgrade_verification.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/time_utils.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/tools/user_id.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_acp_tool.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_asyncio_logging.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_hotreload_snapshot.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_llm_apikey_contextvar.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_log_masker.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_skill_regex_upgrade.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_streaming_e2e.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_summary_echo_break_loop.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sycli.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sylogger_fixes.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_sync_skills_to_sandbox.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_time_utils.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_traceid_omit_base64.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_upload_concurrency.py +0 -0
- {sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/tests/test_upload_e2e_http.py +0 -0
{sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/sycommon/logging/kafka_log.py
RENAMED
|
@@ -220,6 +220,20 @@ class KafkaSink:
|
|
|
220
220
|
bootstrap_timeout_ms=10000:
|
|
221
221
|
api_version 默认为 None,__init__ 会 eager bootstrap 拉取版本信息,
|
|
222
222
|
broker 不可达时默认 30s 才超时。重建/惰性补建路径下 30s 太长,收到 10s。
|
|
223
|
+
enable_idempotence=False 的理由(2026-10-14 netsearch 生产事故复盘):
|
|
224
|
+
kafka-python 3.x 把 enable_idempotence 默认从 False 静默改为 True,
|
|
225
|
+
日志 producer 被动卷进 PID/序列号/muted 整套幂等机制,触发两个库缺陷:
|
|
226
|
+
1. retention 型 UnknownProducerIdError 活锁:broker 因 retention 清掉
|
|
227
|
+
producer state 后持续回 UPIE,客户端 KAFKA-5793 分支每次都重置序列号
|
|
228
|
+
重试(该分支在 _can_retry 之前、不受 retries 约束),且
|
|
229
|
+
reset_sequence_for_partition 把 last_acked 一并弹掉(此后永远 -1),
|
|
230
|
+
导致每次都判成 retention-based → 无限重试(现场转了 2 分钟)。
|
|
231
|
+
2. muted.remove KeyError:幂等下 guarantee_message_order=True,批次被
|
|
232
|
+
双重完成(本地 delivery timeout 一次 + broker 迟到响应一次)时
|
|
233
|
+
_dispatch_error 尾部裸 muted.remove(tp) 第二次抛 KeyError,直接炸
|
|
234
|
+
出 "Uncaught error in kafka producer I/O thread"。
|
|
235
|
+
日志管道不需要 exactly-once(可容忍重复/丢失),关掉幂等后 UPIE 走
|
|
236
|
+
非重试分支直接 fail 进 errback(自愈信号),muted 集合彻底不用。
|
|
223
237
|
"""
|
|
224
238
|
return KafkaProducer(
|
|
225
239
|
bootstrap_servers=self._bootstrap_servers,
|
|
@@ -229,6 +243,7 @@ class KafkaSink:
|
|
|
229
243
|
max_block_ms=5000,
|
|
230
244
|
retries=5,
|
|
231
245
|
request_timeout_ms=30000,
|
|
246
|
+
enable_idempotence=False,
|
|
232
247
|
# delivery_timeout 由默认 120s 收紧到 45s:断网时批次最多积压 45s 就过期并触发
|
|
233
248
|
# errback(自愈信号),而不是静默积压 2 分钟后才批量报错。约束:必须大于
|
|
234
249
|
# linger_ms + request_timeout_ms(5 + 30000),45s 满足。
|
|
@@ -575,11 +590,16 @@ class KafkaSink:
|
|
|
575
590
|
引用,故全程用 _rebuild_lock 保护,并置 _rebuild_in_progress 让 write()
|
|
576
591
|
在此期间跳过惰性建 producer,避免重复构造。
|
|
577
592
|
|
|
578
|
-
|
|
593
|
+
关键一:close() 内部会 join sender 线程(sender.join(timeout)),而本方法
|
|
579
594
|
正是从 sender 线程的 errback 链调进来的——若在锁内直接 close 旧 producer
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
595
|
+
会触发"在自己线程里 join 自己"的死锁。所以 flush/close 必须放在锁外。
|
|
596
|
+
|
|
597
|
+
关键二(2026-10-14 生产事故复盘):只放锁外还不够——errback 同步执行
|
|
598
|
+
flush(5s)+close(10s) 会让 kafka 的 IO 线程卡 15s(现场 14.9s,selector
|
|
599
|
+
慢任务看门狗连报 blocking the event loop),期间网络收发全部停摆。因此
|
|
600
|
+
整个 关旧/建新 挪到独立 daemon 线程执行,errback 立即返回。_rebuild_
|
|
601
|
+
in_progress 维持到新 producer 就位,期间 write() 跳过(日志丢弃语义与
|
|
602
|
+
原重建窗口一致)。"""
|
|
583
603
|
with self._rebuild_lock:
|
|
584
604
|
if self._rebuild_in_progress:
|
|
585
605
|
return # 已有重建在进行,不重入
|
|
@@ -588,7 +608,17 @@ class KafkaSink:
|
|
|
588
608
|
# 摘引用:write() 见到 _producer is None 且 _rebuild_in_progress 会跳过
|
|
589
609
|
self._producer = None
|
|
590
610
|
self._producer_obj = None
|
|
591
|
-
#
|
|
611
|
+
# 关旧/建新全在独立线程:绝不阻塞 kafka IO 线程(errback 调用方)与 loguru 线程
|
|
612
|
+
threading.Thread(
|
|
613
|
+
target=self._rebuild_worker, args=(old,),
|
|
614
|
+
name="kafka-sink-rebuild", daemon=True).start()
|
|
615
|
+
|
|
616
|
+
def _rebuild_worker(self, old):
|
|
617
|
+
"""重建工作体(独立 daemon 线程内执行)。
|
|
618
|
+
|
|
619
|
+
close() 会 join sender 线程,绝不能在 sender 线程里做;bootstrap 不可达
|
|
620
|
+
会抛,吞掉,下次失败计数还会再触发。"""
|
|
621
|
+
# flush/close 放锁外且放本线程:join sender 线程最长 ~15s,别拖任何人
|
|
592
622
|
if old is not None:
|
|
593
623
|
try:
|
|
594
624
|
old.flush(timeout=5)
|
|
@@ -735,6 +765,13 @@ class KafkaLogger(metaclass=SingletonMeta):
|
|
|
735
765
|
intercept_handler = _InterceptHandler()
|
|
736
766
|
logging.root.handlers = [intercept_handler]
|
|
737
767
|
logging.root.setLevel(logging.WARNING)
|
|
768
|
+
# kafka-python 内部日志降噪兜底(正常由 services.setup_logger_levels()
|
|
769
|
+
# 在插件链更早处设置;此处幂等重申):故障期间库的 WARNING 风暴
|
|
770
|
+
# (UnknownProducerIdError 重试/selector 慢任务/批次过期)经 root 桥接
|
|
771
|
+
# 回灌 loguru 后又要发往同一故障 topic,形成放大回路(2026-10-14 复盘)。
|
|
772
|
+
for _name in ("kafka", "kafka.net", "kafka.net.selector",
|
|
773
|
+
"kafka.net.connection", "kafka.producer"):
|
|
774
|
+
logging.getLogger(_name).setLevel(logging.ERROR)
|
|
738
775
|
|
|
739
776
|
sys.excepthook = KafkaLogger._handle_exception
|
|
740
777
|
# sys.excepthook 只管主线程;工作线程的未捕获异常走 threading.excepthook
|
|
@@ -6,9 +6,15 @@ def setup_logger_levels():
|
|
|
6
6
|
# Nacos 客户端:仅输出WARNING及以上(屏蔽INFO级的心跳/注册日志)
|
|
7
7
|
logging.getLogger("nacos.client").setLevel(logging.WARNING)
|
|
8
8
|
|
|
9
|
-
# Kafka Python客户端:屏蔽INFO
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
# Kafka Python客户端:屏蔽INFO级的连接/版本检测日志。
|
|
10
|
+
# kafka.* 整族压到 ERROR(2026-10-14 生产事故复盘):故障期间库自身持续打
|
|
11
|
+
# WARNING——retention 型 UnknownProducerIdError 风暴(每秒多条)、selector
|
|
12
|
+
# 慢任务看门狗(kafka.net.selector)、批次过期——经 stdlib root 桥接回灌
|
|
13
|
+
# loguru 后又要发往同一个正在故障的 topic,形成放大回路。这些 WARNING 的
|
|
14
|
+
# 价值在 ERR 都有(sender 线程崩溃/批次最终失败),全部静音。
|
|
15
|
+
for _name in ("kafka", "kafka.net", "kafka.net.selector",
|
|
16
|
+
"kafka.net.connection", "kafka.producer"):
|
|
17
|
+
logging.getLogger(_name).setLevel(logging.ERROR)
|
|
12
18
|
|
|
13
19
|
# Uvicorn/FastAPI:屏蔽启动/应用初始化的INFO日志(保留ERROR/WARNING)
|
|
14
20
|
# logging.getLogger("uvicorn").setLevel(logging.WARNING)
|
|
@@ -352,6 +352,7 @@ tests/test_acp_tool.py
|
|
|
352
352
|
tests/test_asyncio_logging.py
|
|
353
353
|
tests/test_config_change_notifier.py
|
|
354
354
|
tests/test_hotreload_snapshot.py
|
|
355
|
+
tests/test_kafka_upie_fix.py
|
|
355
356
|
tests/test_llm_apikey_contextvar.py
|
|
356
357
|
tests/test_log_masker.py
|
|
357
358
|
tests/test_resilient_pg_saver.py
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
"""KafkaSink 幂等 producer 事故修复的模拟验证(无真实 broker)。
|
|
2
|
+
|
|
3
|
+
复现 2026-10-14 netsearch 生产事故链,并验证三处修复:
|
|
4
|
+
事故链(修复前):
|
|
5
|
+
a. retention 型 UnknownProducerIdError(UPIE)活锁:broker 持续回 UPIE,
|
|
6
|
+
KAFKA-5793 分支每次重置序列号重试,不受 retries 约束 → 无限循环
|
|
7
|
+
b. muted.remove KeyError:批次双重完成(本地过期 + broker 迟到响应)时
|
|
8
|
+
_dispatch_error 尾部裸 remove 第二次抛 KeyError → 炸 sender IO 线程
|
|
9
|
+
c. _rebuild_producer 在 IO 线程同步 flush+close → selector 看门狗报
|
|
10
|
+
"ran for 14.9s blocking the event loop"
|
|
11
|
+
修复:
|
|
12
|
+
1. enable_idempotence=False —— UPIE 走非重试分支直接 fail;muted 不再使用
|
|
13
|
+
2. _rebuild_producer 挪独立 daemon 线程 —— errback 立即返回
|
|
14
|
+
3. kafka.* logger 压 ERROR —— UPIE/慢任务 WARNING 风暴不再回灌放大
|
|
15
|
+
|
|
16
|
+
验证手段:
|
|
17
|
+
- A/B 对照:同一套 Sender._dispatch_error 驱动逻辑,分别构造
|
|
18
|
+
幂等(tm)/非幂等 producer 配置,数重试次数与 muted 状态
|
|
19
|
+
- 双重完成复现:同一 batch 先 timeout-fail 再 broker-err,
|
|
20
|
+
断言幂等路径 KeyError、非幂等路径无异常
|
|
21
|
+
- 真实 KafkaSink._rebuild_producer:假 producer 的 flush 计 1.5s,
|
|
22
|
+
断言 errback 调用线程不再被阻塞
|
|
23
|
+
- logger 级别:setup 后 kafka.* 均为 ERROR
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
import contextlib
|
|
27
|
+
import io
|
|
28
|
+
import logging
|
|
29
|
+
import sys
|
|
30
|
+
import threading
|
|
31
|
+
import time
|
|
32
|
+
|
|
33
|
+
sys.path.insert(0, "src")
|
|
34
|
+
|
|
35
|
+
from kafka.errors import UnknownProducerIdError # noqa: E402
|
|
36
|
+
from kafka.protocol.producer import ProduceResponse # noqa: E402
|
|
37
|
+
from kafka.producer.record_accumulator import RecordAccumulator # noqa: E402
|
|
38
|
+
from kafka.producer.sender import Sender # noqa: E402
|
|
39
|
+
from kafka.structs import TopicPartition # noqa: E402
|
|
40
|
+
|
|
41
|
+
from sycommon.logging.kafka_log import KafkaSink, KafkaLogger # noqa: E402
|
|
42
|
+
from sycommon.logging.logger_levels import setup_logger_levels # noqa: E402
|
|
43
|
+
|
|
44
|
+
PASS, FAIL = [], []
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def check(name, cond, detail=""):
|
|
48
|
+
(PASS if cond else FAIL).append(name)
|
|
49
|
+
print(f" {'✅' if cond else '❌'} {name}" + (f" [{detail}]" if detail and not cond else ""))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
_PartitionProduceResponse = \
|
|
53
|
+
ProduceResponse.TopicProduceResponse.PartitionProduceResponse
|
|
54
|
+
TP = TopicPartition("shengye-json-log", 2)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# ─── 测试基建 ────────────────────────────────────────────────────────────
|
|
58
|
+
class _NullClient:
|
|
59
|
+
"""最小 client 替身:Sender 只用到 poll/in_flight_request_count 等。"""
|
|
60
|
+
|
|
61
|
+
class _Cluster:
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
cluster = _Cluster()
|
|
65
|
+
|
|
66
|
+
def poll(self, timeout_ms=0):
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
def in_flight_request_count(self):
|
|
70
|
+
return 0
|
|
71
|
+
|
|
72
|
+
def is_ready(self, node):
|
|
73
|
+
return False
|
|
74
|
+
|
|
75
|
+
def connection_delay(self, node):
|
|
76
|
+
return 1.0
|
|
77
|
+
|
|
78
|
+
def maybe_connect(self, node, wakeup=False):
|
|
79
|
+
pass
|
|
80
|
+
|
|
81
|
+
def close(self):
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _make_batch(accum):
|
|
86
|
+
"""向 accumulator 塞一条记录,返回 (batch, future)。"""
|
|
87
|
+
future, _, _, _ = accum.append(
|
|
88
|
+
TP, 0, None, b"{}", [], now=time.monotonic())
|
|
89
|
+
dq = accum._batches[TP]
|
|
90
|
+
return dq[0], future
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _make_sender(idempotent):
|
|
94
|
+
"""构造 Sender + RecordAccumulator,模拟幂等/非幂等两种配置。"""
|
|
95
|
+
# 非幂等路径 transaction_manager 为 None(kafka.py 的真实行为:
|
|
96
|
+
# enable_idempotence=False 时不创建 TransactionManager)
|
|
97
|
+
tm = None if not idempotent else _make_tm()
|
|
98
|
+
accum = RecordAccumulator(
|
|
99
|
+
transaction_manager=tm,
|
|
100
|
+
message_version=2,
|
|
101
|
+
delivery_timeout_ms=45000,
|
|
102
|
+
request_timeout_ms=30000,
|
|
103
|
+
linger_ms=5,
|
|
104
|
+
batch_size=16384,
|
|
105
|
+
retry_backoff_ms=0, # 消除重试退避,让活锁循环紧凑
|
|
106
|
+
)
|
|
107
|
+
sender = Sender(
|
|
108
|
+
_NullClient(), None, accum,
|
|
109
|
+
transaction_manager=tm,
|
|
110
|
+
guarantee_message_order=idempotent, # kafka.py: 幂等 => True
|
|
111
|
+
retries=5,
|
|
112
|
+
acks=-1,
|
|
113
|
+
)
|
|
114
|
+
sender._metadata = _NullMetadata()
|
|
115
|
+
return sender, accum
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _make_tm():
|
|
119
|
+
"""构造最小可用 TransactionManager(绕过需要 metadata 的 __init__)。"""
|
|
120
|
+
from kafka.producer.transaction_manager import (
|
|
121
|
+
NO_PRODUCER_EPOCH, ProducerIdAndEpoch, TransactionManager,
|
|
122
|
+
TransactionState)
|
|
123
|
+
tm = TransactionManager.__new__(TransactionManager)
|
|
124
|
+
import collections as _c
|
|
125
|
+
tm._sequence_numbers = _c.defaultdict(lambda: 0)
|
|
126
|
+
tm._last_acked_offset = {}
|
|
127
|
+
tm.producer_id_and_epoch = ProducerIdAndEpoch(-1, NO_PRODUCER_EPOCH)
|
|
128
|
+
tm._current_state = TransactionState.READY # 已拿到 PID 的运行态
|
|
129
|
+
tm._transaction_started = False
|
|
130
|
+
tm._partitions_in_transaction = set()
|
|
131
|
+
tm._new_partitions_in_transaction = set()
|
|
132
|
+
tm._pending_partitions_in_transaction = set()
|
|
133
|
+
tm._pending_requests_sort_id = 0
|
|
134
|
+
tm._in_flight_request_correlation_id = \
|
|
135
|
+
TransactionManager.NO_INFLIGHT_REQUEST_CORRELATION_ID
|
|
136
|
+
tm.transaction_timeout_ms = 60000
|
|
137
|
+
tm._last_error = None
|
|
138
|
+
tm.transactional_id = None
|
|
139
|
+
tm._pending_requests = []
|
|
140
|
+
tm.retry_backoff_ms = 0
|
|
141
|
+
import threading as _t
|
|
142
|
+
tm._lock = _t.Condition()
|
|
143
|
+
tm._api_version = (2, 8) # 支持 epoch bump,对齐现代 broker
|
|
144
|
+
return tm
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class _NullMetadata:
|
|
148
|
+
"""leader_for_partition 返回 1,让 ready() 认为分区可发。"""
|
|
149
|
+
|
|
150
|
+
def leader_for_partition(self, tp):
|
|
151
|
+
return 1
|
|
152
|
+
|
|
153
|
+
def partitions_for_broker(self, node_id):
|
|
154
|
+
return [TP]
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _upie_response(log_start=2337150726):
|
|
158
|
+
# 现场:log_start_offset=2337150726, last_acked=-1
|
|
159
|
+
return _PartitionProduceResponse(
|
|
160
|
+
index=TP.partition, error_code=59,
|
|
161
|
+
base_offset=-1, log_append_time_ms=-1,
|
|
162
|
+
log_start_offset=log_start, record_errors=[], error_message=None)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
# ─── 1. UPIE 活锁 A/B 对照 ───────────────────────────────────────────────
|
|
166
|
+
def test_upie_livelock_ab():
|
|
167
|
+
print("\n[1] retention 型 UPIE:幂等=无限重试 vs 非幂等=立即失败")
|
|
168
|
+
|
|
169
|
+
# — 幂等(旧行为):每次 dispatch 都判 retention-based → reenqueue 无限转 —
|
|
170
|
+
sender, accum = _make_sender(idempotent=True)
|
|
171
|
+
tm = sender._transaction_manager
|
|
172
|
+
batch, fut = _make_batch(accum)
|
|
173
|
+
# 给 batch 打上与 tm 匹配的 producer state(drain 时由 accumulator 做,这里手动)
|
|
174
|
+
from kafka.producer.transaction_manager import ProducerIdAndEpoch
|
|
175
|
+
pid = ProducerIdAndEpoch(5000, 0)
|
|
176
|
+
tm.producer_id_and_epoch = pid
|
|
177
|
+
batch.records.set_producer_state(pid.producer_id, pid.epoch, 0, False)
|
|
178
|
+
|
|
179
|
+
resp = _upie_response()
|
|
180
|
+
retries = 0
|
|
181
|
+
t0 = time.monotonic()
|
|
182
|
+
while time.monotonic() - t0 < 1.0: # 最多转 1s
|
|
183
|
+
retries += 1
|
|
184
|
+
accum.muted.add(TP) # 模拟 drain:幂等路径会 muted.add
|
|
185
|
+
try:
|
|
186
|
+
sender._complete_batch(batch, resp) # broker 又回 UPIE
|
|
187
|
+
except KeyError:
|
|
188
|
+
# retention 分支 reenqueue 后走尾部 unmute,第二次 drain->complete
|
|
189
|
+
# 时 muted 已被弹掉 → 这正是现场的 KeyError。这里吞掉以继续跑
|
|
190
|
+
# 活锁计数(生产路径它直接炸 IO 线程)。
|
|
191
|
+
pass
|
|
192
|
+
if batch.final_state is not None:
|
|
193
|
+
break # 终于 fail 了
|
|
194
|
+
# 模拟 drain 重新赋序列号(活锁下每轮如此)
|
|
195
|
+
if not batch.in_retry():
|
|
196
|
+
break
|
|
197
|
+
tm.set_sequence_number(TP, 0)
|
|
198
|
+
if retries > 500:
|
|
199
|
+
break
|
|
200
|
+
check("幂等路径 1s 内仍在重试(复现活锁)",
|
|
201
|
+
retries > 5 and batch.final_state is None,
|
|
202
|
+
f"retries={retries} final={batch.final_state}")
|
|
203
|
+
|
|
204
|
+
# — 非幂等(新行为 enable_idempotence=False):UPIE 非重试 → 直接 fail —
|
|
205
|
+
sender2, accum2 = _make_sender(idempotent=False)
|
|
206
|
+
batch2, fut2 = _make_batch(accum2)
|
|
207
|
+
sender2._complete_batch(batch2, resp)
|
|
208
|
+
check("非幂等路径第一次 UPIE 即 fail",
|
|
209
|
+
batch2.final_state is not None and fut2.is_done and fut2.exception is not None,
|
|
210
|
+
f"final={batch2.final_state}")
|
|
211
|
+
check("errback 收到 UnknownProducerIdError(自愈信号可达)",
|
|
212
|
+
isinstance(fut2.exception, UnknownProducerIdError),
|
|
213
|
+
repr(fut2.exception))
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
# ─── 2. muted KeyError 双重完成复现 ──────────────────────────────────────
|
|
217
|
+
def test_double_completion_keyerror():
|
|
218
|
+
print("\n[2] 批次双重完成:幂等裸 muted.remove 抛 KeyError vs 非幂等无 muted")
|
|
219
|
+
|
|
220
|
+
# — 幂等:timeout 先 fail(unmute 一次)→ broker 迟到 UPIE 再走 error 尾部
|
|
221
|
+
# muted.remove(第二次)→ KeyError 炸 IO 线程 —
|
|
222
|
+
sender, accum = _make_sender(idempotent=True)
|
|
223
|
+
tm = sender._transaction_manager
|
|
224
|
+
from kafka.producer.transaction_manager import ProducerIdAndEpoch
|
|
225
|
+
pid = ProducerIdAndEpoch(5000, 0)
|
|
226
|
+
tm.producer_id_and_epoch = pid
|
|
227
|
+
batch, fut = _make_batch(accum)
|
|
228
|
+
batch.records.set_producer_state(pid.producer_id, pid.epoch, 0, False)
|
|
229
|
+
|
|
230
|
+
accum.muted.add(TP) # drain 时幂等路径会 add
|
|
231
|
+
sender._dispatch_error(batch, UnknownProducerIdError("x"), _upie_response())
|
|
232
|
+
# retention 分支 reenqueue 并走尾部 unmute
|
|
233
|
+
key_error_raised = False
|
|
234
|
+
try:
|
|
235
|
+
# 模拟本地 delivery timeout 先把同一批次 fail 掉(第二次完成)
|
|
236
|
+
sender._dispatch_error(batch, UnknownProducerIdError("timeout"),
|
|
237
|
+
partition_response=None)
|
|
238
|
+
except KeyError as e:
|
|
239
|
+
key_error_raised = True
|
|
240
|
+
detail = repr(e)
|
|
241
|
+
check("幂等路径双重完成复现 KeyError(库 bug 在案)", key_error_raised,
|
|
242
|
+
"" if key_error_raised else "未抛 KeyError")
|
|
243
|
+
|
|
244
|
+
# — 非幂等:guarantee_message_order=False → muted 分支根本不进 —
|
|
245
|
+
sender2, accum2 = _make_sender(idempotent=False)
|
|
246
|
+
batch2, fut2 = _make_batch(accum2)
|
|
247
|
+
sender2._dispatch_error(batch2, UnknownProducerIdError("x"), _upie_response())
|
|
248
|
+
no_exc = True
|
|
249
|
+
try:
|
|
250
|
+
sender2._dispatch_error(batch2, UnknownProducerIdError("timeout"),
|
|
251
|
+
partition_response=None)
|
|
252
|
+
except KeyError:
|
|
253
|
+
no_exc = False
|
|
254
|
+
check("非幂等路径双重完成无 KeyError", no_exc)
|
|
255
|
+
check("非幂等 muted 集合未使用", TP not in accum2.muted)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
# ─── 3. 重建不阻塞调用线程 ───────────────────────────────────────────────
|
|
259
|
+
class _SlowFakeProducer:
|
|
260
|
+
"""flush 故意睡 1.5s,模拟旧 producer close 慢(现场 5+10s)。"""
|
|
261
|
+
|
|
262
|
+
def __init__(self):
|
|
263
|
+
self.flushed = threading.Event()
|
|
264
|
+
|
|
265
|
+
def flush(self, timeout=None):
|
|
266
|
+
time.sleep(1.5)
|
|
267
|
+
self.flushed.set()
|
|
268
|
+
|
|
269
|
+
def close(self, timeout=None):
|
|
270
|
+
pass
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
class _FakeNacos:
|
|
274
|
+
def __init__(self, cfg):
|
|
275
|
+
pass
|
|
276
|
+
service_name = "test-svc"
|
|
277
|
+
share_configs = {"common.yml": {}}
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def test_rebuild_off_io_thread():
|
|
281
|
+
print("\n[3] _rebuild_producer 不再阻塞调用(kafka IO)线程")
|
|
282
|
+
import sycommon.synacos.nacos_service as ns
|
|
283
|
+
ns.NacosService = _FakeNacos
|
|
284
|
+
|
|
285
|
+
sink = KafkaSink.__new__(KafkaSink) # 跳过 __init__(不建真 producer)
|
|
286
|
+
sink.service_id = "t"
|
|
287
|
+
sink._bootstrap_servers = "localhost:9092"
|
|
288
|
+
sink._closed = False
|
|
289
|
+
sink._enabled = True
|
|
290
|
+
sink._rebuild_lock = threading.Lock()
|
|
291
|
+
sink._consecutive_failures = 0
|
|
292
|
+
sink._last_rebuild_ts = 0.0
|
|
293
|
+
sink._rebuild_in_progress = False
|
|
294
|
+
old = _SlowFakeProducer()
|
|
295
|
+
sink._producer = old
|
|
296
|
+
sink._producer_obj = old
|
|
297
|
+
built = []
|
|
298
|
+
sink._build_producer = lambda: (built.append(1), _SlowFakeProducer())[1]
|
|
299
|
+
|
|
300
|
+
t0 = time.monotonic()
|
|
301
|
+
sink._rebuild_producer() # 旧实现这里会同步卡 1.5s+
|
|
302
|
+
elapsed_call = time.monotonic() - t0
|
|
303
|
+
check("调用线程立即返回(<0.5s,旧实现 ~1.5s)", elapsed_call < 0.5,
|
|
304
|
+
f"{elapsed_call:.3f}s")
|
|
305
|
+
|
|
306
|
+
done = threading.Event()
|
|
307
|
+
|
|
308
|
+
def _wait():
|
|
309
|
+
# 等新 producer 就位
|
|
310
|
+
for _ in range(100):
|
|
311
|
+
if sink._producer is not None and sink._producer is not old:
|
|
312
|
+
done.set()
|
|
313
|
+
return
|
|
314
|
+
time.sleep(0.05)
|
|
315
|
+
threading.Thread(target=_wait, daemon=True).start()
|
|
316
|
+
check("后台线程完成重建(flush+build)", done.wait(6.0),
|
|
317
|
+
"6s 内新 producer 未就位")
|
|
318
|
+
check("旧 producer flush 已在后台执行", old.flushed.wait(6.0))
|
|
319
|
+
check("重建后 _rebuild_in_progress 已复位", sink._rebuild_in_progress is False)
|
|
320
|
+
# 清理:等后台线程自然结束,避免 daemon 线程睡到测试尾
|
|
321
|
+
time.sleep(0.1)
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
# ─── 4. kafka.* 日志静音 ──────────────────────────────────────────────────
|
|
325
|
+
def test_kafka_loggers_muted():
|
|
326
|
+
print("\n[4] kafka.* 内部日志压到 ERROR(切断回灌放大)")
|
|
327
|
+
setup_logger_levels()
|
|
328
|
+
ok = True
|
|
329
|
+
names = ["kafka", "kafka.net", "kafka.net.selector",
|
|
330
|
+
"kafka.net.connection", "kafka.producer"]
|
|
331
|
+
for n in names:
|
|
332
|
+
lv = logging.getLogger(n).level
|
|
333
|
+
if lv != logging.ERROR:
|
|
334
|
+
ok = False
|
|
335
|
+
print(f" {n} -> {logging.getLevelName(lv)}")
|
|
336
|
+
check("logger_levels.setup_logger_levels 后全部 ERROR", ok)
|
|
337
|
+
|
|
338
|
+
# setup_logger 里也重申(防止 services 未走 setup_logger_levels 的接入方)
|
|
339
|
+
buf = io.StringIO()
|
|
340
|
+
with contextlib.redirect_stdout(buf):
|
|
341
|
+
pass
|
|
342
|
+
for n in names:
|
|
343
|
+
logging.getLogger(n).setLevel(logging.WARNING) # 先破坏
|
|
344
|
+
from sycommon.logging.kafka_log import KafkaSink as _KS
|
|
345
|
+
# setup_logger 真实跑一遍(_build_producer 打桩 + Config 单例打桩:
|
|
346
|
+
# setup 会经 _global_log_enabled/_safe_namespace_id 读 Config().config,
|
|
347
|
+
# 本地无 app.yaml,注入最小假配置)
|
|
348
|
+
orig_bp = _KS._build_producer
|
|
349
|
+
_KS._build_producer = lambda self: _SlowFakeProducer()
|
|
350
|
+
from sycommon.config.Config import Config as _Cfg
|
|
351
|
+
from sycommon.config.Config import SingletonMeta as _SM
|
|
352
|
+
class _FakeCfg:
|
|
353
|
+
config = {"common.yml": {}}
|
|
354
|
+
MaxBytes = 0
|
|
355
|
+
Timeout = 0
|
|
356
|
+
MaxRetries = 0
|
|
357
|
+
|
|
358
|
+
def get_namespace_id(self, _):
|
|
359
|
+
return ""
|
|
360
|
+
|
|
361
|
+
_orig_instances = dict(_SM._instances)
|
|
362
|
+
_SM._instances[_Cfg] = _FakeCfg()
|
|
363
|
+
try:
|
|
364
|
+
import sycommon.synacos.nacos_service as ns2
|
|
365
|
+
ns2.NacosService = _FakeNacos
|
|
366
|
+
with contextlib.redirect_stdout(io.StringIO()):
|
|
367
|
+
KafkaLogger.setup_logger({})
|
|
368
|
+
ok2 = all(logging.getLogger(n).level == logging.ERROR for n in names)
|
|
369
|
+
check("KafkaLogger.setup_logger 后全部 ERROR", ok2)
|
|
370
|
+
finally:
|
|
371
|
+
_SM._instances.clear()
|
|
372
|
+
_SM._instances.update(_orig_instances)
|
|
373
|
+
_KS._build_producer = orig_bp
|
|
374
|
+
with contextlib.suppress(Exception):
|
|
375
|
+
with contextlib.redirect_stdout(io.StringIO()):
|
|
376
|
+
KafkaLogger.close()
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
# ─── 5. producer 配置回归:enable_idempotence=False 真正生效 ─────────────
|
|
380
|
+
def test_producer_config():
|
|
381
|
+
print("\n[5] _build_producer 配置断言(构造参数级,不连 broker)")
|
|
382
|
+
src = io.StringIO()
|
|
383
|
+
import inspect
|
|
384
|
+
from sycommon.logging import kafka_log as kl
|
|
385
|
+
code = inspect.getsource(kl.KafkaSink._build_producer)
|
|
386
|
+
check("显式传入 enable_idempotence=False",
|
|
387
|
+
"enable_idempotence=False" in code)
|
|
388
|
+
check("delivery_timeout_ms=45000 仍在", "delivery_timeout_ms=45000" in code)
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
if __name__ == "__main__":
|
|
392
|
+
test_upie_livelock_ab()
|
|
393
|
+
test_double_completion_keyerror()
|
|
394
|
+
test_rebuild_off_io_thread()
|
|
395
|
+
test_kafka_loggers_muted()
|
|
396
|
+
test_producer_config()
|
|
397
|
+
print(f"\n{'='*50}\n通过 {len(PASS)} / 失败 {len(FAIL)}")
|
|
398
|
+
if FAIL:
|
|
399
|
+
print("失败项:", FAIL)
|
|
400
|
+
sys.exit(1)
|
|
401
|
+
print("全部通过 ✅")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sycommon_python_lib-0.2.10a11 → sycommon_python_lib-0.2.10a12}/src/command/templates/base/.env.tpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|