sycommon-python-lib 0.2.5a25__tar.gz → 0.2.5a27__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.5a25 → sycommon_python_lib-0.2.5a27}/PKG-INFO +2 -2
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/pyproject.toml +7 -2
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/chat_events.py +36 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/deep_agent.py +51 -6
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/sandbox/file_ops.py +12 -2
- sycommon_python_lib-0.2.5a27/src/sycommon/database/async_base_db_service.py +114 -0
- sycommon_python_lib-0.2.5a27/src/sycommon/database/base_db_service.py +114 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/llm_with_token_tracking.py +0 -9
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/logging/kafka_log.py +58 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/mqlistener_config.py +1 -1
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/rabbitmq/rabbitmq_client.py +1 -1
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/services.py +8 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon_python_lib.egg-info/PKG-INFO +2 -2
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon_python_lib.egg-info/SOURCES.txt +1 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon_python_lib.egg-info/requires.txt +1 -1
- sycommon_python_lib-0.2.5a27/tests/test_asyncio_logging.py +116 -0
- sycommon_python_lib-0.2.5a25/src/sycommon/database/async_base_db_service.py +0 -36
- sycommon_python_lib-0.2.5a25/src/sycommon/database/base_db_service.py +0 -30
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/README.md +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/nexus/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/sandbox/minio_sync.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/auth/ldap_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/database/async_database_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/database/database_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/sandbox.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/middleware/traceid.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/sse/sse.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/example.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/deep_agent_server.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_consumer_recovery.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_deep_agent.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_dynamic_max_tokens.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_email.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_encoding_cache.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_mcp_server.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_minimax_reasoning.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_mq.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_oa_login.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_real_summarization.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_summarization_config.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tests/test_summarization_real.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
- {sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/tests/test_sycli.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5a27
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -9,7 +9,7 @@ Requires-Dist: aiohttp==3.13.5
|
|
|
9
9
|
Requires-Dist: aiomysql==0.3.2
|
|
10
10
|
Requires-Dist: anyio==4.13.0
|
|
11
11
|
Requires-Dist: decorator==5.3.1
|
|
12
|
-
Requires-Dist: deepagents==0.6.
|
|
12
|
+
Requires-Dist: deepagents==0.6.6
|
|
13
13
|
Requires-Dist: elasticsearch==9.4.1
|
|
14
14
|
Requires-Dist: fastapi==0.136.3
|
|
15
15
|
Requires-Dist: jinja2==3.1.6
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sycommon-python-lib"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.5a27"
|
|
4
4
|
description = "Add your description here"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -10,7 +10,7 @@ dependencies = [
|
|
|
10
10
|
"aiomysql==0.3.2",
|
|
11
11
|
"anyio==4.13.0",
|
|
12
12
|
"decorator==5.3.1",
|
|
13
|
-
"deepagents==0.6.
|
|
13
|
+
"deepagents==0.6.6",
|
|
14
14
|
"elasticsearch==9.4.1",
|
|
15
15
|
"fastapi==0.136.3",
|
|
16
16
|
"jinja2==3.1.6",
|
|
@@ -54,6 +54,11 @@ package-data = {command = ["templates/**/*", "templates/**/.*"], sycommon = ["ll
|
|
|
54
54
|
requires = ["setuptools"]
|
|
55
55
|
build-backend = "setuptools.build_meta"
|
|
56
56
|
|
|
57
|
+
[dependency-groups]
|
|
58
|
+
dev = [
|
|
59
|
+
"pytest>=9.0.3",
|
|
60
|
+
]
|
|
61
|
+
|
|
57
62
|
[project.scripts]
|
|
58
63
|
sycommon = "command.cli:main"
|
|
59
64
|
sycli = "sycli.cli:main"
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/chat_events.py
RENAMED
|
@@ -62,6 +62,9 @@ class EventType(str, Enum):
|
|
|
62
62
|
PARALLEL_AGENTS = "parallel_agents" # 并行 Agent
|
|
63
63
|
AGENT_COMPLETE = "agent_complete" # Agent 任务完成
|
|
64
64
|
|
|
65
|
+
# 评分相关
|
|
66
|
+
RUBRIC_EVALUATION = "rubric_evaluation" # Rubric 评估结果
|
|
67
|
+
|
|
65
68
|
# 生命周期
|
|
66
69
|
DONE = "done" # 完成
|
|
67
70
|
ERROR = "error" # 错误
|
|
@@ -368,6 +371,39 @@ class ChatEventBuilder:
|
|
|
368
371
|
"""
|
|
369
372
|
return ChatEvent(EventType.CANCELLED, {"message": message})
|
|
370
373
|
|
|
374
|
+
# ============== 评分相关 ==============
|
|
375
|
+
|
|
376
|
+
@staticmethod
|
|
377
|
+
def rubric_evaluation(
|
|
378
|
+
iteration: int,
|
|
379
|
+
result: str,
|
|
380
|
+
criteria: list,
|
|
381
|
+
explanation: str = "",
|
|
382
|
+
agent: str = DEFAULT_AGENT_NAME,
|
|
383
|
+
) -> ChatEvent:
|
|
384
|
+
"""
|
|
385
|
+
构建 Rubric 评估事件
|
|
386
|
+
|
|
387
|
+
Args:
|
|
388
|
+
iteration: 评估迭代次数
|
|
389
|
+
result: 评估结果(satisfied / needs_revision / failed / max_iterations_reached / grader_error)
|
|
390
|
+
criteria: 各评分标准的判定列表
|
|
391
|
+
explanation: 评估说明
|
|
392
|
+
agent: Agent 名称
|
|
393
|
+
|
|
394
|
+
Returns:
|
|
395
|
+
ChatEvent: 评估事件
|
|
396
|
+
"""
|
|
397
|
+
data = {
|
|
398
|
+
"iteration": iteration,
|
|
399
|
+
"result": result,
|
|
400
|
+
"criteria": criteria,
|
|
401
|
+
"agent": agent,
|
|
402
|
+
}
|
|
403
|
+
if explanation:
|
|
404
|
+
data["explanation"] = explanation
|
|
405
|
+
return ChatEvent(EventType.RUBRIC_EVALUATION, data)
|
|
406
|
+
|
|
371
407
|
|
|
372
408
|
# ============== 便捷函数(直接返回字典,兼容旧代码) ==============
|
|
373
409
|
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/deep_agent.py
RENAMED
|
@@ -117,10 +117,28 @@ class AgentConfig(BaseModel):
|
|
|
117
117
|
# 调试模式
|
|
118
118
|
debug: bool = False
|
|
119
119
|
|
|
120
|
+
# Rubric 评分配置
|
|
121
|
+
rubric_max_iterations: int = 3 # rubric 评估最大迭代次数(0 = 不启用)
|
|
122
|
+
|
|
120
123
|
class Config:
|
|
121
124
|
arbitrary_types_allowed = True
|
|
122
125
|
|
|
123
126
|
|
|
127
|
+
class _RubricEvalCollector:
|
|
128
|
+
"""收集 RubricMiddleware 通过 on_evaluation 回调产生的评估结果"""
|
|
129
|
+
|
|
130
|
+
def __init__(self):
|
|
131
|
+
self.evaluations: list = []
|
|
132
|
+
|
|
133
|
+
def on_evaluation(self, evaluation):
|
|
134
|
+
"""RubricMiddleware 每次评估完成后调用"""
|
|
135
|
+
self.evaluations.append(evaluation)
|
|
136
|
+
|
|
137
|
+
@property
|
|
138
|
+
def latest(self):
|
|
139
|
+
return self.evaluations[-1] if self.evaluations else None
|
|
140
|
+
|
|
141
|
+
|
|
124
142
|
class DeepAgent:
|
|
125
143
|
"""数字员工封装类"""
|
|
126
144
|
|
|
@@ -131,12 +149,14 @@ class DeepAgent:
|
|
|
131
149
|
config: Dict[str, Any],
|
|
132
150
|
sandbox_backend: HTTPSandboxBackend,
|
|
133
151
|
recovery_manager: Optional[SandboxRecoveryManager] = None,
|
|
152
|
+
rubric_eval_collector: Optional[_RubricEvalCollector] = None,
|
|
134
153
|
):
|
|
135
154
|
self.user_id = user_id
|
|
136
155
|
self.agent = agent
|
|
137
156
|
self.config = config
|
|
138
157
|
self.sandbox_backend = sandbox_backend
|
|
139
158
|
self.recovery_manager = recovery_manager
|
|
159
|
+
self.rubric_eval_collector = rubric_eval_collector
|
|
140
160
|
|
|
141
161
|
async def cleanup(self):
|
|
142
162
|
"""清理资源"""
|
|
@@ -149,6 +169,7 @@ class DeepAgent:
|
|
|
149
169
|
async def chat(
|
|
150
170
|
self,
|
|
151
171
|
message: str,
|
|
172
|
+
rubric: Optional[str] = None,
|
|
152
173
|
cancel_event: Optional[asyncio.Event] = None,
|
|
153
174
|
on_event: Optional[Callable[[ChatEvent], Awaitable[None]]] = None,
|
|
154
175
|
) -> AsyncGenerator[ChatEvent, None]:
|
|
@@ -156,6 +177,7 @@ class DeepAgent:
|
|
|
156
177
|
|
|
157
178
|
Args:
|
|
158
179
|
message: 用户消息
|
|
180
|
+
rubric: 评分标准(可选),传入后 agent 完成时会自动评估是否满足标准
|
|
159
181
|
cancel_event: 取消事件(用于取消当前任务)
|
|
160
182
|
on_event: 事件回调,每个事件触发后调用(可用于 DB 持久化等)
|
|
161
183
|
|
|
@@ -172,8 +194,11 @@ class DeepAgent:
|
|
|
172
194
|
total_output_tokens = 0
|
|
173
195
|
|
|
174
196
|
try:
|
|
197
|
+
input_state = {"messages": [HumanMessage(content=message)]}
|
|
198
|
+
if rubric:
|
|
199
|
+
input_state["rubric"] = rubric
|
|
175
200
|
async for chunk in self._astream_with_retry(
|
|
176
|
-
|
|
201
|
+
input_state,
|
|
177
202
|
max_retries=3,
|
|
178
203
|
base_delay=1.0,
|
|
179
204
|
):
|
|
@@ -650,6 +675,8 @@ async def create_deep_agent(
|
|
|
650
675
|
|
|
651
676
|
# 创建 agent
|
|
652
677
|
from deepagents import create_deep_agent as _create_deep_agent
|
|
678
|
+
from deepagents import RubricMiddleware
|
|
679
|
+
from deepagents.middleware.filesystem import FilesystemMiddleware
|
|
653
680
|
|
|
654
681
|
# 创建 compact_conversation 工具 middleware
|
|
655
682
|
# 自动压缩由 deepagents 内置的 SummarizationMiddleware 处理(通过 model.profile 获取阈值)
|
|
@@ -657,6 +684,27 @@ async def create_deep_agent(
|
|
|
657
684
|
model, config.model_name, sandbox_backend,
|
|
658
685
|
)
|
|
659
686
|
|
|
687
|
+
# 🔑 Rubric 评估收集器:通过 on_evaluation 回调收集评估结果
|
|
688
|
+
rubric_eval_collector = None
|
|
689
|
+
|
|
690
|
+
# 构建 middleware 列表
|
|
691
|
+
middleware_list = [
|
|
692
|
+
ToolResultTruncationMiddleware(),
|
|
693
|
+
TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
|
|
694
|
+
summarization_mw,
|
|
695
|
+
]
|
|
696
|
+
|
|
697
|
+
# RubricMiddleware:复用 FilesystemMiddleware 的工具(底层走 HTTPSandboxBackend HTTP 远程调用)
|
|
698
|
+
if config.rubric_max_iterations > 0 and sandbox_backend:
|
|
699
|
+
rubric_eval_collector = _RubricEvalCollector()
|
|
700
|
+
_rubric_fs_middleware = FilesystemMiddleware(backend=sandbox_backend)
|
|
701
|
+
middleware_list.append(RubricMiddleware(
|
|
702
|
+
model=model,
|
|
703
|
+
tools=_rubric_fs_middleware.tools,
|
|
704
|
+
max_iterations=config.rubric_max_iterations,
|
|
705
|
+
on_evaluation=rubric_eval_collector.on_evaluation,
|
|
706
|
+
))
|
|
707
|
+
|
|
660
708
|
agent_kwargs = {
|
|
661
709
|
"model": model,
|
|
662
710
|
"tools": config.tools or [get_current_date],
|
|
@@ -664,11 +712,7 @@ async def create_deep_agent(
|
|
|
664
712
|
"checkpointer": checkpointer,
|
|
665
713
|
"system_prompt": config.system_prompt,
|
|
666
714
|
"debug": config.debug,
|
|
667
|
-
"middleware":
|
|
668
|
-
ToolResultTruncationMiddleware(),
|
|
669
|
-
TokenTrackingMiddleware(model_name=config.model_name, user_id=user_id),
|
|
670
|
-
summarization_mw,
|
|
671
|
-
],
|
|
715
|
+
"middleware": middleware_list,
|
|
672
716
|
}
|
|
673
717
|
if skills_path:
|
|
674
718
|
agent_kwargs["skills"] = [skills_path]
|
|
@@ -685,6 +729,7 @@ async def create_deep_agent(
|
|
|
685
729
|
config=agent_config,
|
|
686
730
|
sandbox_backend=sandbox_backend,
|
|
687
731
|
recovery_manager=recovery_manager,
|
|
732
|
+
rubric_eval_collector=rubric_eval_collector,
|
|
688
733
|
)
|
|
689
734
|
|
|
690
735
|
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/agent/sandbox/file_ops.py
RENAMED
|
@@ -510,9 +510,15 @@ class FileOperationsMixin:
|
|
|
510
510
|
})
|
|
511
511
|
# GrepResponse: {"matches": [...], "partial_error": "...", "error": "..."}
|
|
512
512
|
matches = [GrepMatch(**item) for item in result.get("matches", [])]
|
|
513
|
+
# deepagents GrepResult 只有 error 和 matches 字段,
|
|
514
|
+
# 将 partial_error 合并到 error 中(部分失败但有结果时不设 error)
|
|
515
|
+
partial_error = result.get("partial_error")
|
|
516
|
+
error = result.get("error")
|
|
517
|
+
if not error and partial_error and not matches:
|
|
518
|
+
error = partial_error
|
|
513
519
|
return GrepResult(
|
|
514
520
|
matches=matches,
|
|
515
|
-
error=
|
|
521
|
+
error=error,
|
|
516
522
|
)
|
|
517
523
|
except Exception as e:
|
|
518
524
|
SYLogger.error(f"[Sandbox] grep 搜索失败: {e}")
|
|
@@ -537,9 +543,13 @@ class FileOperationsMixin:
|
|
|
537
543
|
}, timeout=timeout)
|
|
538
544
|
# GrepResponse: {"matches": [...], "partial_error": "...", "error": "..."}
|
|
539
545
|
matches = [GrepMatch(**item) for item in result.get("matches", [])]
|
|
546
|
+
partial_error = result.get("partial_error")
|
|
547
|
+
error = result.get("error")
|
|
548
|
+
if not error and partial_error and not matches:
|
|
549
|
+
error = partial_error
|
|
540
550
|
return GrepResult(
|
|
541
551
|
matches=matches,
|
|
542
|
-
error=
|
|
552
|
+
error=error,
|
|
543
553
|
)
|
|
544
554
|
except Exception as e:
|
|
545
555
|
SYLogger.error(f"[Sandbox] 异步 grep 搜索失败: {e}")
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
from contextlib import asynccontextmanager
|
|
3
|
+
from sqlalchemy.exc import OperationalError, InterfaceError, InternalError
|
|
4
|
+
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
|
|
5
|
+
from sycommon.config.Config import SingletonMeta
|
|
6
|
+
from sycommon.database.async_database_service import AsyncDatabaseService
|
|
7
|
+
from sycommon.logging.kafka_log import SYLogger
|
|
8
|
+
|
|
9
|
+
# 连接级错误:连接已断,事务必定已丢失,重试安全
|
|
10
|
+
_CONNECTION_ERROR_CODES = {2006, 2013}
|
|
11
|
+
# 事务级错误:死锁、锁等待超时,由调用方决定是否重试
|
|
12
|
+
_RETRYABLE_TX_ERROR_CODES = {1205, 1213, 1206}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _is_connection_error(exc: Exception) -> bool:
|
|
16
|
+
"""判断是否为连接级错误(断开、宕机),可安全重试"""
|
|
17
|
+
if isinstance(exc, (OperationalError, InterfaceError)):
|
|
18
|
+
if exc.orig and hasattr(exc.orig, 'errno'):
|
|
19
|
+
return exc.orig.errno in _CONNECTION_ERROR_CODES
|
|
20
|
+
return False
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _is_retryable_tx_error(exc: Exception) -> bool:
|
|
24
|
+
"""判断是否为可重试的事务级错误(死锁、锁超时)"""
|
|
25
|
+
if isinstance(exc, (OperationalError, InternalError)):
|
|
26
|
+
if exc.orig and hasattr(exc.orig, 'errno'):
|
|
27
|
+
return exc.orig.errno in _RETRYABLE_TX_ERROR_CODES
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class AsyncBaseDBService(metaclass=SingletonMeta):
|
|
32
|
+
"""数据库操作基础服务类,封装异步会话管理功能"""
|
|
33
|
+
|
|
34
|
+
def __init__(self):
|
|
35
|
+
self.engine = AsyncDatabaseService.engine()
|
|
36
|
+
self.Session = async_sessionmaker(
|
|
37
|
+
bind=self.engine,
|
|
38
|
+
class_=AsyncSession,
|
|
39
|
+
expire_on_commit=False
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
@asynccontextmanager
|
|
43
|
+
async def session(self):
|
|
44
|
+
"""
|
|
45
|
+
异步数据库会话上下文管理器
|
|
46
|
+
自动处理会话的创建、提交、回滚和关闭
|
|
47
|
+
"""
|
|
48
|
+
async with self.Session() as session:
|
|
49
|
+
try:
|
|
50
|
+
yield session
|
|
51
|
+
await session.commit()
|
|
52
|
+
except Exception as e:
|
|
53
|
+
await session.rollback()
|
|
54
|
+
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
55
|
+
raise
|
|
56
|
+
|
|
57
|
+
async def execute(self, fn, retry: int = 0):
|
|
58
|
+
"""
|
|
59
|
+
执行异步数据库操作,支持自动重试
|
|
60
|
+
|
|
61
|
+
连接级错误(连接断开 2006/2013)始终自动重试1次。
|
|
62
|
+
事务级错误(死锁 1213、锁超时 1205)按 retry 参数重试。
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
fn: 接收 session 参数的异步可调用对象,例如:
|
|
66
|
+
async def query(session): return (await session.execute(select(User))).scalars().all()
|
|
67
|
+
retry: 事务级错误最大重试次数,默认0不重试
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
fn 的返回值
|
|
71
|
+
|
|
72
|
+
Usage:
|
|
73
|
+
result = await self.execute(
|
|
74
|
+
lambda session: session.execute(select(User)),
|
|
75
|
+
retry=3
|
|
76
|
+
)
|
|
77
|
+
"""
|
|
78
|
+
attempt = 0
|
|
79
|
+
max_attempts = 1 + max(retry, 0)
|
|
80
|
+
connection_retried = False
|
|
81
|
+
last_exc = None
|
|
82
|
+
|
|
83
|
+
while True:
|
|
84
|
+
async with self.Session() as session:
|
|
85
|
+
try:
|
|
86
|
+
result = await fn(session)
|
|
87
|
+
await session.commit()
|
|
88
|
+
return result
|
|
89
|
+
except Exception as e:
|
|
90
|
+
await session.rollback()
|
|
91
|
+
last_exc = e
|
|
92
|
+
|
|
93
|
+
# 连接级错误:始终自动重试1次(不计入 max_attempts)
|
|
94
|
+
if _is_connection_error(e) and not connection_retried:
|
|
95
|
+
connection_retried = True
|
|
96
|
+
SYLogger.warning(
|
|
97
|
+
f"DB connection lost (errno={getattr(e.orig, 'errno', None)}), retrying..."
|
|
98
|
+
)
|
|
99
|
+
attempt += 1
|
|
100
|
+
continue
|
|
101
|
+
|
|
102
|
+
# 事务级错误:按 retry 参数重试
|
|
103
|
+
if retry > 0 and _is_retryable_tx_error(e) and attempt < max_attempts - 1:
|
|
104
|
+
attempt += 1
|
|
105
|
+
backoff = min(0.5 * (2 ** (attempt - 1)), 2.0)
|
|
106
|
+
SYLogger.warning(
|
|
107
|
+
f"DB retryable error (errno={getattr(e.orig, 'errno', None)}), "
|
|
108
|
+
f"attempt {attempt}/{max_attempts}, backoff {backoff}s"
|
|
109
|
+
)
|
|
110
|
+
await asyncio.sleep(backoff)
|
|
111
|
+
continue
|
|
112
|
+
|
|
113
|
+
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
114
|
+
raise
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from contextlib import contextmanager
|
|
3
|
+
from sqlalchemy.orm import sessionmaker
|
|
4
|
+
from sqlalchemy.exc import OperationalError, InterfaceError, InternalError
|
|
5
|
+
from sycommon.config.Config import SingletonMeta
|
|
6
|
+
from sycommon.database.database_service import DatabaseService
|
|
7
|
+
from sycommon.logging.kafka_log import SYLogger
|
|
8
|
+
|
|
9
|
+
# 连接级错误:连接已断,事务必定已丢失,重试安全
|
|
10
|
+
_CONNECTION_ERROR_CODES = {2006, 2013}
|
|
11
|
+
# 事务级错误:死锁、锁等待超时,由调用方决定是否重试
|
|
12
|
+
_RETRYABLE_TX_ERROR_CODES = {1205, 1213, 1206}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _is_connection_error(exc: Exception) -> bool:
|
|
16
|
+
"""判断是否为连接级错误(断开、宕机),可安全重试"""
|
|
17
|
+
if isinstance(exc, (OperationalError, InterfaceError)):
|
|
18
|
+
if exc.orig and hasattr(exc.orig, 'errno'):
|
|
19
|
+
return exc.orig.errno in _CONNECTION_ERROR_CODES
|
|
20
|
+
return False
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _is_retryable_tx_error(exc: Exception) -> bool:
|
|
24
|
+
"""判断是否为可重试的事务级错误(死锁、锁超时)"""
|
|
25
|
+
if isinstance(exc, (OperationalError, InternalError)):
|
|
26
|
+
if exc.orig and hasattr(exc.orig, 'errno'):
|
|
27
|
+
return exc.orig.errno in _RETRYABLE_TX_ERROR_CODES
|
|
28
|
+
return False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class BaseDBService(metaclass=SingletonMeta):
|
|
32
|
+
"""数据库操作基础服务类,封装会话管理功能"""
|
|
33
|
+
|
|
34
|
+
def __init__(self):
|
|
35
|
+
self.engine = DatabaseService.engine()
|
|
36
|
+
self.Session = sessionmaker(bind=self.engine)
|
|
37
|
+
|
|
38
|
+
@contextmanager
|
|
39
|
+
def session(self):
|
|
40
|
+
"""
|
|
41
|
+
数据库会话上下文管理器
|
|
42
|
+
自动处理会话的创建、提交、回滚和关闭
|
|
43
|
+
"""
|
|
44
|
+
session = self.Session()
|
|
45
|
+
try:
|
|
46
|
+
yield session
|
|
47
|
+
session.commit()
|
|
48
|
+
except Exception as e:
|
|
49
|
+
session.rollback()
|
|
50
|
+
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
51
|
+
raise
|
|
52
|
+
finally:
|
|
53
|
+
session.close()
|
|
54
|
+
|
|
55
|
+
def execute(self, fn, retry: int = 0):
|
|
56
|
+
"""
|
|
57
|
+
执行数据库操作,支持自动重试
|
|
58
|
+
|
|
59
|
+
连接级错误(连接断开 2006/2013)始终自动重试1次。
|
|
60
|
+
事务级错误(死锁 1213、锁超时 1205)按 retry 参数重试。
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
fn: 接收 session 参数的可调用对象,例如:
|
|
64
|
+
lambda session: session.query(User).all()
|
|
65
|
+
retry: 事务级错误最大重试次数,默认0不重试
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
fn 的返回值
|
|
69
|
+
|
|
70
|
+
Usage:
|
|
71
|
+
result = self.execute(
|
|
72
|
+
lambda session: session.query(User).all(),
|
|
73
|
+
retry=3
|
|
74
|
+
)
|
|
75
|
+
"""
|
|
76
|
+
attempt = 0
|
|
77
|
+
max_attempts = 1 + max(retry, 0)
|
|
78
|
+
connection_retried = False
|
|
79
|
+
last_exc = None
|
|
80
|
+
|
|
81
|
+
while True:
|
|
82
|
+
session = self.Session()
|
|
83
|
+
try:
|
|
84
|
+
result = fn(session)
|
|
85
|
+
session.commit()
|
|
86
|
+
return result
|
|
87
|
+
except Exception as e:
|
|
88
|
+
session.rollback()
|
|
89
|
+
last_exc = e
|
|
90
|
+
|
|
91
|
+
# 连接级错误:始终自动重试1次(不计入 max_attempts)
|
|
92
|
+
if _is_connection_error(e) and not connection_retried:
|
|
93
|
+
connection_retried = True
|
|
94
|
+
SYLogger.warning(
|
|
95
|
+
f"DB connection lost (errno={getattr(e.orig, 'errno', None)}), retrying..."
|
|
96
|
+
)
|
|
97
|
+
attempt += 1
|
|
98
|
+
continue
|
|
99
|
+
|
|
100
|
+
# 事务级错误:按 retry 参数重试
|
|
101
|
+
if retry > 0 and _is_retryable_tx_error(e) and attempt < max_attempts - 1:
|
|
102
|
+
attempt += 1
|
|
103
|
+
backoff = min(0.5 * (2 ** (attempt - 1)), 2.0)
|
|
104
|
+
SYLogger.warning(
|
|
105
|
+
f"DB retryable error (errno={getattr(e.orig, 'errno', None)}), "
|
|
106
|
+
f"attempt {attempt}/{max_attempts}, backoff {backoff}s"
|
|
107
|
+
)
|
|
108
|
+
time.sleep(backoff)
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
SYLogger.error(f"Database operation failed: {str(e)}")
|
|
112
|
+
raise
|
|
113
|
+
finally:
|
|
114
|
+
session.close()
|
|
@@ -312,15 +312,6 @@ class LLMWithTokenTracking(BaseChatModel):
|
|
|
312
312
|
return self.llm.profile
|
|
313
313
|
return None
|
|
314
314
|
|
|
315
|
-
@property
|
|
316
|
-
def profile(self):
|
|
317
|
-
p = self._resolve_model_profile()
|
|
318
|
-
return p
|
|
319
|
-
|
|
320
|
-
@profile.setter
|
|
321
|
-
def profile(self, value):
|
|
322
|
-
pass
|
|
323
|
-
|
|
324
315
|
def bind_tools(self, tools, *, tool_choice=None, **kwargs):
|
|
325
316
|
"""绑定工具 - 委托给底层 LLM,返回绑定后的 Runnable"""
|
|
326
317
|
return self.llm.bind_tools(tools, tool_choice=tool_choice, **kwargs)
|
{sycommon_python_lib-0.2.5a25 → sycommon_python_lib-0.2.5a27}/src/sycommon/logging/kafka_log.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import sys
|
|
3
3
|
import json
|
|
4
|
+
import logging
|
|
4
5
|
import socket
|
|
5
6
|
import threading
|
|
6
7
|
import traceback
|
|
@@ -176,6 +177,23 @@ class KafkaSink:
|
|
|
176
177
|
pass
|
|
177
178
|
|
|
178
179
|
|
|
180
|
+
class _InterceptHandler(logging.Handler):
|
|
181
|
+
"""将 stdlib logging 日志桥接到 Loguru,使 asyncio 等第三方库的日志进入 Kafka 管道"""
|
|
182
|
+
|
|
183
|
+
def emit(self, record: logging.LogRecord) -> None:
|
|
184
|
+
try:
|
|
185
|
+
level = logger.level(record.levelname).name
|
|
186
|
+
except ValueError:
|
|
187
|
+
level = record.levelno
|
|
188
|
+
|
|
189
|
+
frame, depth = logging.currentframe(), 2
|
|
190
|
+
while frame and frame.f_code.co_filename == logging.__file__:
|
|
191
|
+
frame = frame.f_back
|
|
192
|
+
depth += 1
|
|
193
|
+
|
|
194
|
+
logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())
|
|
195
|
+
|
|
196
|
+
|
|
179
197
|
class KafkaLogger(metaclass=SingletonMeta):
|
|
180
198
|
_sink_instance = None
|
|
181
199
|
|
|
@@ -206,8 +224,48 @@ class KafkaLogger(metaclass=SingletonMeta):
|
|
|
206
224
|
diagnose=True
|
|
207
225
|
)
|
|
208
226
|
|
|
227
|
+
# 桥接 stdlib logging → Loguru,捕获 asyncio 等第三方库的日志
|
|
228
|
+
intercept_handler = _InterceptHandler()
|
|
229
|
+
logging.root.handlers = [intercept_handler]
|
|
230
|
+
logging.root.setLevel(logging.WARNING)
|
|
231
|
+
|
|
209
232
|
sys.excepthook = KafkaLogger._handle_exception
|
|
210
233
|
|
|
234
|
+
# 注册 asyncio 异常处理器,捕获未处理的 Task 异常
|
|
235
|
+
KafkaLogger._setup_asyncio_exception_handler()
|
|
236
|
+
|
|
237
|
+
@staticmethod
|
|
238
|
+
def _setup_asyncio_exception_handler():
|
|
239
|
+
"""注册 asyncio 事件循环异常处理器,将未处理的 Task 异常导入 Kafka"""
|
|
240
|
+
try:
|
|
241
|
+
loop = asyncio.get_running_loop()
|
|
242
|
+
loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
|
|
243
|
+
except RuntimeError:
|
|
244
|
+
pass
|
|
245
|
+
|
|
246
|
+
@staticmethod
|
|
247
|
+
def _asyncio_exception_handler(loop, context):
|
|
248
|
+
"""asyncio 未处理异常回调,通过 SYLogger 记录到 Kafka"""
|
|
249
|
+
message = context.get("exception", context.get("message", "Unknown asyncio error"))
|
|
250
|
+
exception = context.get("exception")
|
|
251
|
+
|
|
252
|
+
if exception:
|
|
253
|
+
tb_str = "".join(traceback.format_exception(
|
|
254
|
+
type(exception), exception, exception.__traceback__
|
|
255
|
+
))
|
|
256
|
+
else:
|
|
257
|
+
tb_str = str(message)
|
|
258
|
+
|
|
259
|
+
trace_id = current_trace_id.get() or str(Snowflake.id)
|
|
260
|
+
error_msg = json.dumps({
|
|
261
|
+
"trace_id": trace_id,
|
|
262
|
+
"message": f"asyncio unhandled: {message}",
|
|
263
|
+
"level": "ERROR",
|
|
264
|
+
"detail": tb_str,
|
|
265
|
+
}, ensure_ascii=False)
|
|
266
|
+
|
|
267
|
+
logger.opt(exception=True).error(error_msg)
|
|
268
|
+
|
|
211
269
|
@staticmethod
|
|
212
270
|
def _handle_exception(exc_type, exc_value, exc_traceback):
|
|
213
271
|
if issubclass(exc_type, KeyboardInterrupt):
|
|
@@ -33,7 +33,7 @@ class RabbitMQListenerConfig(BaseModel):
|
|
|
33
33
|
auto_parse_json: bool = Field(True, description="是否自动解析JSON消息")
|
|
34
34
|
prefetch_count: int = Field(2, description="同时消费并发数(控制MQ预取与handler并发上限)")
|
|
35
35
|
max_priority: Optional[int] = Field(
|
|
36
|
-
|
|
36
|
+
10, description="队列支持的最大优先级(对应 x-max-priority)")
|
|
37
37
|
|
|
38
38
|
class Config:
|
|
39
39
|
"""模型配置"""
|
|
@@ -265,6 +265,14 @@ class Services(metaclass=SingletonMeta):
|
|
|
265
265
|
sandbox_cleanup_task = None
|
|
266
266
|
|
|
267
267
|
try:
|
|
268
|
+
# 注册 asyncio 异常处理器(需在事件循环运行后)
|
|
269
|
+
try:
|
|
270
|
+
from sycommon.logging.kafka_log import KafkaLogger
|
|
271
|
+
loop = asyncio.get_running_loop()
|
|
272
|
+
loop.set_exception_handler(KafkaLogger._asyncio_exception_handler)
|
|
273
|
+
except Exception as e:
|
|
274
|
+
logging.debug(f"注册 asyncio 异常处理器失败: {e}")
|
|
275
|
+
|
|
268
276
|
# 1. 处理数据库服务
|
|
269
277
|
if database_service:
|
|
270
278
|
instance._pending_async_db_setup = []
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sycommon-python-lib
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.5a27
|
|
4
4
|
Summary: Add your description here
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -9,7 +9,7 @@ Requires-Dist: aiohttp==3.13.5
|
|
|
9
9
|
Requires-Dist: aiomysql==0.3.2
|
|
10
10
|
Requires-Dist: anyio==4.13.0
|
|
11
11
|
Requires-Dist: decorator==5.3.1
|
|
12
|
-
Requires-Dist: deepagents==0.6.
|
|
12
|
+
Requires-Dist: deepagents==0.6.6
|
|
13
13
|
Requires-Dist: elasticsearch==9.4.1
|
|
14
14
|
Requires-Dist: fastapi==0.136.3
|
|
15
15
|
Requires-Dist: jinja2==3.1.6
|
|
@@ -286,4 +286,5 @@ src/sycommon_python_lib.egg-info/dependency_links.txt
|
|
|
286
286
|
src/sycommon_python_lib.egg-info/entry_points.txt
|
|
287
287
|
src/sycommon_python_lib.egg-info/requires.txt
|
|
288
288
|
src/sycommon_python_lib.egg-info/top_level.txt
|
|
289
|
+
tests/test_asyncio_logging.py
|
|
289
290
|
tests/test_sycli.py
|