sycommon-python-lib 0.2.10a5__tar.gz → 0.2.10a9__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.10a9/MANIFEST.in +8 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/pyproject.toml +2 -2
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/nexus/__init__.py +10 -4
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/deep_agent.py +95 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/middleware/model_request_prep.py +81 -3
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/minio_sync.py +2 -1
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/skills_retry_patch.py +93 -93
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/ldap_service.py +110 -65
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/async_database_service.py +5 -1
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/database_service.py +5 -1
- sycommon_python_lib-0.2.10a9/src/sycommon/logging/bounded_kafka_sink.py +156 -0
- sycommon_python_lib-0.2.10a9/src/sycommon/logging/bounded_stdout_sink.py +126 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/kafka_log.py +75 -8
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/sandbox.py +78 -6
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/traceid.py +27 -4
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_client.py +69 -28
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_pool.py +183 -17
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +9 -5
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +57 -10
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_core.py +36 -36
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/services.py +51 -11
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sse/sse.py +57 -14
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/SOURCES.txt +4 -60
- sycommon_python_lib-0.2.10a5/src/sycommon/synacos/example.py +0 -248
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/deep_agent_server.py +0 -536
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_backend_factory_compat.py +0 -158
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consistent_hash.py +0 -279
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consume_dedup.py +0 -194
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_broker_health.py +0 -495
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -399
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_recovery.py +0 -283
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_recovery_fix.py +0 -334
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_tags_sync.py +0 -151
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_db_keepalive.py +0 -178
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_deep_agent.py +0 -161
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_dynamic_max_tokens.py +0 -442
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_email.py +0 -172
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_encoding_cache.py +0 -148
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_env_tenant_helper.py +0 -72
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -174
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -145
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_fault_injection_real.py +0 -502
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_fix_verification.py +0 -404
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_heartbeat_timeout.py +0 -282
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_integration_real_broker.py +0 -381
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_mcp_server.py +0 -401
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_minimax_reasoning.py +0 -290
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_mq.py +0 -128
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_mq_config_driven.py +0 -238
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_nacos_llm_real.py +0 -113
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_oa_login.py +0 -229
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_queue_priority_fallback.py +0 -259
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -257
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_real_summarization.py +0 -166
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_reconnect_scenarios.py +0 -336
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_sandbox_glob_hardening.py +0 -292
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_summarization_config.py +0 -463
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_summarization_real.py +0 -329
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_summary_leak_e2e.py +0 -872
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_upgrade_aio_pika.py +0 -153
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -140
- sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_upgrade_verification.py +0 -161
- sycommon_python_lib-0.2.10a5/tests/test_acp_tool.py +0 -392
- sycommon_python_lib-0.2.10a5/tests/test_asyncio_logging.py +0 -116
- sycommon_python_lib-0.2.10a5/tests/test_config_change_notifier.py +0 -168
- sycommon_python_lib-0.2.10a5/tests/test_hotreload_snapshot.py +0 -223
- sycommon_python_lib-0.2.10a5/tests/test_llm_apikey_contextvar.py +0 -36
- sycommon_python_lib-0.2.10a5/tests/test_log_masker.py +0 -255
- sycommon_python_lib-0.2.10a5/tests/test_resilient_pg_saver.py +0 -259
- sycommon_python_lib-0.2.10a5/tests/test_sandbox_path_guard.py +0 -297
- sycommon_python_lib-0.2.10a5/tests/test_sensitive_guard.py +0 -466
- sycommon_python_lib-0.2.10a5/tests/test_simple_chat_agent.py +0 -126
- sycommon_python_lib-0.2.10a5/tests/test_skill_regex_upgrade.py +0 -85
- sycommon_python_lib-0.2.10a5/tests/test_skill_write_guard.py +0 -122
- sycommon_python_lib-0.2.10a5/tests/test_streaming_e2e.py +0 -238
- sycommon_python_lib-0.2.10a5/tests/test_sycli.py +0 -1873
- sycommon_python_lib-0.2.10a5/tests/test_sylogger_fixes.py +0 -278
- sycommon_python_lib-0.2.10a5/tests/test_sync_skills_to_sandbox.py +0 -207
- sycommon_python_lib-0.2.10a5/tests/test_time_utils.py +0 -88
- sycommon_python_lib-0.2.10a5/tests/test_traceid_omit_base64.py +0 -77
- sycommon_python_lib-0.2.10a5/tests/test_upload_concurrency.py +0 -207
- sycommon_python_lib-0.2.10a5/tests/test_upload_e2e_http.py +0 -224
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/README.md +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/setup.cfg +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/cli.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/console.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/models.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/project.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/utils.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/api/query.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/db/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/db/service.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/model/parse.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/.env.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/.gitignore.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/Dockerfile.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/app.yaml.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/model/file_info.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/requirements.txt.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/commands/hello.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/pyproject.toml.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/README.md.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/api/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/api/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/app.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/client/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/model/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/tools/__init__.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/tools/mq.py.tpl +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/__main__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/config.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/executor.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/registry.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/server.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/agents/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/agents/factory.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/agents/prompts.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/browser.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/console.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/dom.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/network.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/page_errors.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/performance.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/screenshot.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/client.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/protocol.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/repl.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cli.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/acp_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/acp_serve_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/cdp_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/chat_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/create_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/evaluate_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/init_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/memory_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/resume_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/rollback_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/run_cmd.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/backend.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/config.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/display.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/git_integration.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/llm.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/state.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/evaluate/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/evaluate/api_evaluator.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/compressor.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/full.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/hot.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/manager.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/warm.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/mode/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/mode/create.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/mode/optimize.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/models/config_models.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/baseline_tests.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/checkpoint.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/convergence.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/diagnosis.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/engine.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/environment.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/experience.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/harness_prompts.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/history.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/optimization_logger.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/pre_validation.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/reward.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/strategy_bandit.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/strategy_generator.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/strategy_prompts.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/simple_chat_agent.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/skills/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/client.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/fetch.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/server_adapter.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/ssh_init.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/tool.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/agent_manager.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/chat_events.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/mcp/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/mcp/models.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/mcp/tool_loader.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/multi_agent_team.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/reasoning_content_patch.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/resume_compactor.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/file_ops.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/session.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/summarization_utils.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/oa_cache.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/oa_crypto.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/oa_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/wecom_ldap_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/ACPAgentConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/Config.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/DatabaseConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/EgressPolicyConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/ElasticsearchConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/EmbeddingConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/LLMConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/LangfuseConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/MQConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/PgConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/RedisConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/RerankerConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/SentryConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/XxlJobConfig.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/config_change_notifier.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/async_base_db_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/base_db_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/elasticsearch_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/pg_checkpoint_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/redis_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/resilient_pg_saver.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/token_usage_db_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/health/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/health/health_check.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/health/metrics.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/health/ping.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/heartbeat_process/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/embedding.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/get_llm.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/llm_logger.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/llm_tokens.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/output_fixing_runnable.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/struct_token.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/sy_langfuse.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/token_usage_es_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/token_utils.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/usage_token.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/async_sql_logger.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/log_masker.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/logger_levels.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/logger_wrapper.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/process_logger.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/sql_logger.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/mcp_server/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/mcp_server/server.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/context.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/cors.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/docs.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/egress_wall.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/exception.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/middleware.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/monitor_memory.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/mq.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/sandbox_gateway.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/timeout.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/token_tracking.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/tool_result_truncation.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/base_http.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/log.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/mcp_server_config.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/mqlistener_config.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/mqmsg_model.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/mqsend_config.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/sandbox.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/sso_user.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/token_usage.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/token_usage_mysql.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/xxljob_handler_config.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/notice/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/notice/uvicorn_monitor.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/notice/wecom_message.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbit_management_client.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sentry/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sentry/sy_sentry.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sse/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sse/event.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/example2.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/feign.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/feign_client.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_client_base.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_config_manager.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_service_registration.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/param.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/async_utils.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/docs.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/env.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/merge_headers.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/snowflake.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/syemail.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/time_utils.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/timing.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/user_id.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/xxljob/__init__.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/xxljob/xxljob_service.py +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
- {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "sycommon-python-lib"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.10a9"
|
|
4
4
|
description = "Add your description here"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -50,7 +50,7 @@ dependencies = [
|
|
|
50
50
|
]
|
|
51
51
|
|
|
52
52
|
[tool.setuptools]
|
|
53
|
-
packages = {find = {where = ["src"], exclude = ["*.__pycache__", "*.__pycache__.*"]}}
|
|
53
|
+
packages = {find = {where = ["src"], exclude = ["*.__pycache__", "*.__pycache__.*", "*.tests", "*.tests.*"]}}
|
|
54
54
|
package-data = {command = ["templates/**/*", "templates/**/.*"], sycommon = ["llm/tiktoken_cache/*"]}
|
|
55
55
|
|
|
56
56
|
[build-system]
|
|
@@ -6,8 +6,6 @@ import argparse
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
NEXUS_URL = "http://192.168.2.174:8081"
|
|
9
|
-
USERNAME = "Osulcode.xiao"
|
|
10
|
-
PASSWORD = "Osulcode.xiao@123"
|
|
11
9
|
REPOSITORY = "shengye"
|
|
12
10
|
|
|
13
11
|
|
|
@@ -32,8 +30,16 @@ def main():
|
|
|
32
30
|
sys.exit(1)
|
|
33
31
|
|
|
34
32
|
repo_url = f"{args.url}/repository/{args.repository}/"
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
username = os.environ.get("NEXUS_USERNAME") or os.environ.get("TWINE_USERNAME")
|
|
34
|
+
password = os.environ.get("NEXUS_PASSWORD") or os.environ.get("TWINE_PASSWORD")
|
|
35
|
+
if not username or not password:
|
|
36
|
+
parser.error("请设置 NEXUS_USERNAME/NEXUS_PASSWORD 或 TWINE_USERNAME/TWINE_PASSWORD")
|
|
37
|
+
upload_env = os.environ.copy()
|
|
38
|
+
upload_env["TWINE_USERNAME"] = username
|
|
39
|
+
upload_env["TWINE_PASSWORD"] = password
|
|
40
|
+
cmd = [sys.executable, "-m", "twine", "upload", "--non-interactive",
|
|
41
|
+
"--repository-url", repo_url, file_path]
|
|
42
|
+
sys.exit(subprocess.call(cmd, env=upload_env))
|
|
37
43
|
|
|
38
44
|
|
|
39
45
|
if __name__ == "__main__":
|
{sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/deep_agent.py
RENAMED
|
@@ -133,6 +133,52 @@ def _match_summary_prefix_overlap(text: str, summary: str,
|
|
|
133
133
|
return 0
|
|
134
134
|
|
|
135
135
|
|
|
136
|
+
# 🔑 复读尾部熔断(9/9 田甜事故最后一环):贪心解码锁死后输出退化成
|
|
137
|
+
# 「短单元无脑重复」(实测指令句连抄 1780 次直到 max_tokens)。只查
|
|
138
|
+
# 尾部 —— 重复段在中间而结尾正常是正常文本(引用/排比),交给回显剥离。
|
|
139
|
+
def _detect_repetition_tail(text: str, *, unit_min: int = 6) -> bool:
|
|
140
|
+
"""检测文本尾部是否陷入单元级复读。
|
|
141
|
+
|
|
142
|
+
取尾部 window 字符,对长度 >= unit_min 的所有候选单元,若该单元
|
|
143
|
+
连续重复出现在尾部且重复次数 >= repeat_min 即判定锁死。
|
|
144
|
+
unit_min=6 让 markdown 表格分隔线(|---|)、常见短语相邻复现不误伤;
|
|
145
|
+
超短单元(单字/两字词)复读用更小下限单独判定。
|
|
146
|
+
"""
|
|
147
|
+
if not text or len(text) < 40:
|
|
148
|
+
return False
|
|
149
|
+
window = text[-600:]
|
|
150
|
+
repeat_min = 4
|
|
151
|
+
# 1) 常规单元:长度 unit_min..64,从长到短,命中即报
|
|
152
|
+
for size in range(64, unit_min - 1, -1):
|
|
153
|
+
unit = window[-size:]
|
|
154
|
+
if unit.count("\n") > size // 2:
|
|
155
|
+
continue # 大半是换行的"单元"不可信
|
|
156
|
+
n = 0
|
|
157
|
+
i = len(window)
|
|
158
|
+
while i >= size and window[i - size:i] == unit:
|
|
159
|
+
n += 1
|
|
160
|
+
i -= size
|
|
161
|
+
if n >= repeat_min:
|
|
162
|
+
return True
|
|
163
|
+
# 2) 超短单元(2-5 字符)复读:需要更高重复次数(10+)才报,
|
|
164
|
+
# 避免「的地得」、缩进、表格线等正常高频短串误伤。
|
|
165
|
+
# 下限取 unit_min(调用方传 unit_min=2 即启用 2 字符判定)。
|
|
166
|
+
for size in range(5, unit_min - 1, -1):
|
|
167
|
+
if size < 2:
|
|
168
|
+
break
|
|
169
|
+
unit = window[-size:]
|
|
170
|
+
if unit.strip() == "":
|
|
171
|
+
continue
|
|
172
|
+
n = 0
|
|
173
|
+
i = len(window)
|
|
174
|
+
while i >= size and window[i - size:i] == unit:
|
|
175
|
+
n += 1
|
|
176
|
+
i -= size
|
|
177
|
+
if n >= 10:
|
|
178
|
+
return True
|
|
179
|
+
return False
|
|
180
|
+
|
|
181
|
+
|
|
136
182
|
@tool
|
|
137
183
|
def get_current_date() -> str:
|
|
138
184
|
"""获取当前日期时间(北京时间)"""
|
|
@@ -364,6 +410,9 @@ class DeepAgent:
|
|
|
364
410
|
# 兜底:累积流式 chunk 中的 usage_metadata(middleware 在流式场景可能拿不到)
|
|
365
411
|
total_input_tokens = 0
|
|
366
412
|
total_output_tokens = 0
|
|
413
|
+
# 🔑 复读尾部熔断状态:上次判定时的文本长度(100 字符节流)+ 熔断标记
|
|
414
|
+
_last_repetition_check = 0
|
|
415
|
+
_repetition_detected = False
|
|
367
416
|
|
|
368
417
|
# ── 设置 chat turn 级 trace_id ──
|
|
369
418
|
# 如果上层(HTTP 中间件等)已设置 trace_id 则沿用,否则生成新的。
|
|
@@ -847,6 +896,21 @@ class DeepAgent:
|
|
|
847
896
|
await on_event(event)
|
|
848
897
|
yield event
|
|
849
898
|
|
|
899
|
+
# 🔑 复读尾部熔断:累积文本尾部陷入单元级复读即中断流,
|
|
900
|
+
# 不再继续消费(后面全是复读垃圾,还会烧满 max_tokens)。
|
|
901
|
+
# 判定按 100 字符节流,避免每 token 全量比对。
|
|
902
|
+
if len(ai_text_content) - _last_repetition_check >= 100:
|
|
903
|
+
_last_repetition_check = len(ai_text_content)
|
|
904
|
+
if _detect_repetition_tail(ai_text_content):
|
|
905
|
+
SYLogger.warning(
|
|
906
|
+
f"[DeepAgent] 复读熔断: 检测到尾部单元级复读,中断本轮流 "
|
|
907
|
+
f"(ai_text_len={len(ai_text_content)}, stream_step={stream_step})")
|
|
908
|
+
_repetition_detected = True
|
|
909
|
+
break
|
|
910
|
+
elif _detect_repetition_tail(ai_text_content) and not _repetition_detected:
|
|
911
|
+
# content 为空但此前已判定复读(如续流 chunk),同样熔断
|
|
912
|
+
pass
|
|
913
|
+
|
|
850
914
|
elif msg_type == "ToolMessage":
|
|
851
915
|
if ai_chunk_buffer:
|
|
852
916
|
SYLogger.debug(
|
|
@@ -927,6 +991,37 @@ class DeepAgent:
|
|
|
927
991
|
f"stream_step={stream_step} | ai_text_len={len(ai_text_content)} | "
|
|
928
992
|
f"tool_calls={len(current_tool_calls)}")
|
|
929
993
|
|
|
994
|
+
# 🔑 复读熔断收尾:熔断发生时尾部截掉复读垃圾(保留正常前文),
|
|
995
|
+
# 追加一个 error 事件提示上层(与空响应同通道,可触发上层降级/重试)。
|
|
996
|
+
if _repetition_detected:
|
|
997
|
+
# 熔断发生时尾部截掉复读垃圾:去掉末尾最后一份完整复读单元
|
|
998
|
+
# (从尾部窗口反推最大重复单元),保留正常前文
|
|
999
|
+
cleaned_tail = ai_text_content
|
|
1000
|
+
window = ai_text_content[-600:]
|
|
1001
|
+
for size in range(64, 1, -1):
|
|
1002
|
+
unit = window[-size:]
|
|
1003
|
+
if size >= 6:
|
|
1004
|
+
n, i = 0, len(window)
|
|
1005
|
+
while i >= size and window[i - size:i] == unit:
|
|
1006
|
+
n += 1
|
|
1007
|
+
i -= size
|
|
1008
|
+
if n >= 4:
|
|
1009
|
+
cleaned_tail = ai_text_content[:-len(unit) * 1].rstrip()
|
|
1010
|
+
break
|
|
1011
|
+
elif unit.strip() and window[-(size * 10):] == unit * 10:
|
|
1012
|
+
cleaned_tail = ai_text_content[:-size].rstrip()
|
|
1013
|
+
break
|
|
1014
|
+
ai_text_content = cleaned_tail
|
|
1015
|
+
SYLogger.warning(
|
|
1016
|
+
f"[DeepAgent] 复读熔断生效: 本轮流提前结束,截断前长度 {len(ai_text_content)}")
|
|
1017
|
+
event = ChatEventBuilder.error(
|
|
1018
|
+
"模型输出陷入重复循环,已自动中断(repetition loop detected)",
|
|
1019
|
+
code="repetition_loop",
|
|
1020
|
+
)
|
|
1021
|
+
if on_event:
|
|
1022
|
+
await on_event(event)
|
|
1023
|
+
yield event
|
|
1024
|
+
|
|
930
1025
|
# 空响应检测:模型被调用但没有产出任何文本。
|
|
931
1026
|
# 🔑 治本修复:纯空响应(无文本且无工具调用,常见于用户派生 key 被网关拒、
|
|
932
1027
|
# 网关返回空壳 AIMessage 而非异常)不再静默只打 warning —— 把它翻译成
|
|
@@ -34,10 +34,55 @@ from langchain.agents.middleware.types import (
|
|
|
34
34
|
ModelResponse,
|
|
35
35
|
ResponseT,
|
|
36
36
|
)
|
|
37
|
-
from langchain_core.messages import BaseMessage, HumanMessage
|
|
37
|
+
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
|
|
38
38
|
|
|
39
39
|
from sycommon.logging.kafka_log import SYLogger
|
|
40
40
|
|
|
41
|
+
# 🔑 回显剥离(9/9 田甜复读事故):模型把注入的备忘块整块回显进输出,回显随
|
|
42
|
+
# ModelResponse 写入 checkpointer → 下轮上下文里旧回显+新注入并存 → 回显越滚
|
|
43
|
+
# 越多 → 贪心解码锁死成句级复读(实测单条 1780 次)。三层标签成对闭合整块删;
|
|
44
|
+
# 未闭合(复读到 max_tokens 等不到闭合)从开标签截断到结尾 —— 复读垃圾只会
|
|
45
|
+
# 出现在开标签之后,前文正常内容保留。
|
|
46
|
+
_ECHO_TAG_PATTERNS = tuple(re.compile(p, re.DOTALL) for p in (
|
|
47
|
+
r'<internal_context_data>.*?</internal_context_data>',
|
|
48
|
+
r'<compressed_history>.*?</compressed_history>',
|
|
49
|
+
r'<system_context>.*?</system_context>',
|
|
50
|
+
r'<internal_context_data>(?!.*</internal_context_data>).*',
|
|
51
|
+
r'<compressed_history>(?!.*</compressed_history>).*',
|
|
52
|
+
r'<system_context>(?!.*</system_context>).*',
|
|
53
|
+
))
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _strip_echo_text(text: str) -> str:
|
|
57
|
+
"""剥掉一段文本里的备忘回显块,返回清洗后文本。"""
|
|
58
|
+
for pat in _ECHO_TAG_PATTERNS:
|
|
59
|
+
if pat.search(text):
|
|
60
|
+
text = pat.sub('', text)
|
|
61
|
+
return text.strip()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def dedupe_memo_lines(summary_text: str) -> str:
|
|
65
|
+
"""备忘条目逐行去重(保持首现顺序与空行)。
|
|
66
|
+
|
|
67
|
+
多轮压缩时新备忘把旧备忘 + 历史回显一起总结,重复条目(实测「文件:
|
|
68
|
+
…」相邻出现两次、「事实: 需求大小分布…」逐轮翻倍)被原样折叠进备忘,
|
|
69
|
+
备忘自身开始自我复制——注入前去重断掉这一层。
|
|
70
|
+
"""
|
|
71
|
+
if not summary_text:
|
|
72
|
+
return summary_text
|
|
73
|
+
seen: set[str] = set()
|
|
74
|
+
out: list[str] = []
|
|
75
|
+
for line in summary_text.splitlines():
|
|
76
|
+
key = line.strip()
|
|
77
|
+
if not key:
|
|
78
|
+
out.append(line)
|
|
79
|
+
continue
|
|
80
|
+
if key in seen:
|
|
81
|
+
continue
|
|
82
|
+
seen.add(key)
|
|
83
|
+
out.append(line)
|
|
84
|
+
return "\n".join(out)
|
|
85
|
+
|
|
41
86
|
|
|
42
87
|
class ModelRequestPrepMiddleware(AgentMiddleware):
|
|
43
88
|
"""模型请求预处理:摘要重定位 + 动态压 max_tokens。
|
|
@@ -59,6 +104,30 @@ class ModelRequestPrepMiddleware(AgentMiddleware):
|
|
|
59
104
|
def name(self) -> str:
|
|
60
105
|
return "ModelRequestPrepMiddleware"
|
|
61
106
|
|
|
107
|
+
def _strip_summary_echo(self, response) -> "ModelResponse[Any]":
|
|
108
|
+
"""响应侧剥回显(断环点):ModelResponse.result 里每条 AIMessage 的
|
|
109
|
+
content 先剥回显块再随 checkpoint 持久化 —— 历史里不再躺回显,
|
|
110
|
+
正反馈环在写入侧断掉。无命中返回原对象(零开销);多模态 list
|
|
111
|
+
content 不动(无稳定文本形态,误伤风险大于收益)。
|
|
112
|
+
"""
|
|
113
|
+
result = getattr(response, "result", None)
|
|
114
|
+
if not result:
|
|
115
|
+
return response
|
|
116
|
+
for msg in result:
|
|
117
|
+
content = getattr(msg, "content", None)
|
|
118
|
+
if not isinstance(msg, AIMessage) or not isinstance(content, str):
|
|
119
|
+
continue
|
|
120
|
+
cleaned = _strip_echo_text(content)
|
|
121
|
+
if cleaned != content:
|
|
122
|
+
try:
|
|
123
|
+
msg.content = cleaned
|
|
124
|
+
SYLogger.warning(
|
|
125
|
+
"[ModelRequestPrep] 已剥除模型输出中的备忘回显 "
|
|
126
|
+
f"(len {len(content)} → {len(cleaned)})")
|
|
127
|
+
except Exception:
|
|
128
|
+
pass
|
|
129
|
+
return response
|
|
130
|
+
|
|
62
131
|
def _relocate_summaries(
|
|
63
132
|
self, request: ModelRequest[ContextT]
|
|
64
133
|
) -> ModelRequest[ContextT]:
|
|
@@ -84,6 +153,9 @@ class ModelRequestPrepMiddleware(AgentMiddleware):
|
|
|
84
153
|
if not _summary_text:
|
|
85
154
|
return request
|
|
86
155
|
|
|
156
|
+
# 🔑 注入前去重:多轮压缩的叠加重复条目不进 system(见 dedupe_memo_lines)
|
|
157
|
+
_summary_text = dedupe_memo_lines(_summary_text)
|
|
158
|
+
|
|
87
159
|
from deepagents.middleware._utils import append_to_system_message
|
|
88
160
|
# 🔑 注入形态 = 备忘在前、行为契约在后(recency:靠近对话末端的指令
|
|
89
161
|
# 遵循度最高),且用正向指令替代"不要复述"禁令 —— 负向禁令对
|
|
@@ -148,7 +220,13 @@ class ModelRequestPrepMiddleware(AgentMiddleware):
|
|
|
148
220
|
request: ModelRequest[ContextT],
|
|
149
221
|
handler: Callable[[ModelRequest[ContextT]], Awaitable[ModelResponse[ResponseT]]],
|
|
150
222
|
) -> ModelResponse[ResponseT]:
|
|
151
|
-
"""
|
|
223
|
+
"""拦截模型调用:摘要重定位(注入前去重)→ max_tokens 动态压 →
|
|
224
|
+
响应剥回显(断环),再返回 handler 结果。"""
|
|
152
225
|
request = self._relocate_summaries(request)
|
|
153
226
|
self._clamp_max_tokens(request)
|
|
154
|
-
|
|
227
|
+
response = await handler(request)
|
|
228
|
+
try:
|
|
229
|
+
return self._strip_summary_echo(response)
|
|
230
|
+
except Exception as e:
|
|
231
|
+
SYLogger.warning(f"[ModelRequestPrep] strip echo failed(放行): {e}")
|
|
232
|
+
return response
|
|
@@ -892,12 +892,13 @@ class MinioSyncService(metaclass=SingletonMeta):
|
|
|
892
892
|
替代旧 resp.read() 整文件进内存:大附件场景一批 5 路并发 × 全量驻留
|
|
893
893
|
= 数百 MB~GB 级 RSS 峰值(打爆内存的根因)。流式写盘后内存峰值 ≈ 单块,
|
|
894
894
|
与文件大小无关;与 _sync_one 的 adownload_to_file 落盘模式对称。
|
|
895
|
+
块大小 1MB(5 路并发 × 1MB = 常驻 ~5MB 级)。
|
|
895
896
|
"""
|
|
896
897
|
resp = self._client.get_object(self._bucket, key)
|
|
897
898
|
try:
|
|
898
899
|
total = 0
|
|
899
900
|
with open(dest, "wb") as f:
|
|
900
|
-
for chunk in resp.stream(
|
|
901
|
+
for chunk in resp.stream(1 * 1024 * 1024):
|
|
901
902
|
f.write(chunk)
|
|
902
903
|
total += len(chunk)
|
|
903
904
|
return total
|
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
"""deepagents SkillsMiddleware 的重试补丁。
|
|
3
|
-
|
|
4
|
-
修复「会话首轮沙箱 ls 失败 → skills_metadata=[] 被当已加载缓存进
|
|
5
|
-
checkpoint → 整个会话从此看不到技能」的问题。
|
|
6
|
-
|
|
7
|
-
背景(2026-09-01 线上案例):
|
|
8
|
-
- deepagents SkillsMiddleware.abefore_agent 每会话只加载一次技能:
|
|
9
|
-
`if "skills_metadata" in state: return None` —— 空列表也算"已加载"。
|
|
10
|
-
- 会话首条消息若撞上沙箱 /v1/sandbox/ls 500(发版恢复期/沙箱故障转移),
|
|
11
|
-
middleware 写入 skills_metadata=[] + skills_load_errors,并随 checkpoint
|
|
12
|
-
持久化。后续每一轮命中"in state"直接跳过,永不重试。
|
|
13
|
-
- 用户视角:该会话从此没有技能,直到新建会话。
|
|
14
|
-
|
|
15
|
-
修复语义:skills_metadata 为空**且**存在加载错误(或本应有 system 技能源)
|
|
16
|
-
→ 视为未加载成功,清除旧值后重新加载。真正的零技能(所有源都正常列空)
|
|
17
|
-
不重试,避免每轮白打一次 ls。
|
|
18
|
-
|
|
19
|
-
打补丁方式:替换 deepagents.graph 模块里的 SkillsMiddleware 符号(graph
|
|
20
|
-
在 create_deep_agent 内部 `SkillsMiddleware(backend=..., sources=...)`
|
|
21
|
-
引用的是模块全局名),子类化原类、只重载 abefore_agent,其余行为不动。
|
|
22
|
-
在 sycommon.agent.deep_agent 导入本模块即生效(幂等,可重复导入)。
|
|
23
|
-
"""
|
|
24
|
-
import logging
|
|
25
|
-
|
|
26
|
-
from deepagents.middleware import skills as _skills_module
|
|
27
|
-
|
|
28
|
-
logger = logging.getLogger("sycommon")
|
|
29
|
-
|
|
30
|
-
_ORIG_MIDDLEWARE = _skills_module.SkillsMiddleware
|
|
31
|
-
_PATCHED = getattr(_ORIG_MIDDLEWARE, "_sycommon_retry_patch", False)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class RetrySkillsMiddleware(_ORIG_MIDDLEWARE):
|
|
35
|
-
"""加载失败(空列表+错误)不缓存的 SkillsMiddleware。
|
|
36
|
-
|
|
37
|
-
上游缓存条件 `if "skills_metadata" in state: return None` 的漏洞:
|
|
38
|
-
空列表也是合法 dict key 存在,首轮 ls 失败写进去后永不再加载。
|
|
39
|
-
这里放宽为「空列表且带加载错误 → 重试」,其余行为与上游一致。
|
|
40
|
-
"""
|
|
41
|
-
|
|
42
|
-
async def abefore_agent(self, state, runtime, config):
|
|
43
|
-
# 未加载过 → 走上游逻辑(会 fall through 到正常加载)
|
|
44
|
-
if "skills_metadata" not in state:
|
|
45
|
-
return await super().abefore_agent(state, runtime, config)
|
|
46
|
-
|
|
47
|
-
cached = state.get("skills_metadata") or []
|
|
48
|
-
cached_errors = state.get("skills_load_errors") or []
|
|
49
|
-
|
|
50
|
-
if cached:
|
|
51
|
-
# 已有技能列表(哪怕部分源失败) → 尊重上游缓存语义,不重试
|
|
52
|
-
return None
|
|
53
|
-
|
|
54
|
-
# 空列表:两种可能——
|
|
55
|
-
# a) 曾加载失败(ls 500 等)带 errors → 需要重试
|
|
56
|
-
# b) 所有源正常但确实零技能(无 errors) → 不重试
|
|
57
|
-
if not cached_errors:
|
|
58
|
-
return None
|
|
59
|
-
|
|
60
|
-
logger.warning(
|
|
61
|
-
"[SkillsRetry] 检测到缓存为空的技能列表(加载曾失败),"
|
|
62
|
-
"本会话轮次重新加载 skills: %s", self.sources)
|
|
63
|
-
# 清掉旧值让上游 super() 不再命中 "skills_metadata" in state
|
|
64
|
-
# (dict 可变,删 key 即可;state 是 langgraph 传入的 dict 视图)
|
|
65
|
-
try:
|
|
66
|
-
state.pop("skills_metadata", None)
|
|
67
|
-
state.pop("skills_load_errors", None)
|
|
68
|
-
except Exception:
|
|
69
|
-
# state 不可变视图等极端情况:构造副本调 super 不可行,
|
|
70
|
-
# 退化为直接调用内部加载逻辑(与上游 for-source 循环等价)
|
|
71
|
-
pass
|
|
72
|
-
return await super().abefore_agent(state, runtime, config)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def _apply() -> None:
|
|
76
|
-
"""把 deepagents.graph 引用的 SkillsMiddleware 换成重试版(幂等)。"""
|
|
77
|
-
if _PATCHED:
|
|
78
|
-
return
|
|
79
|
-
import deepagents.graph as _graph
|
|
80
|
-
|
|
81
|
-
if getattr(_graph.SkillsMiddleware, "_sycommon_retry_patch", False):
|
|
82
|
-
# 已打过(例如热重载场景)——只补标记
|
|
83
|
-
_graph.SkillsMiddleware = RetrySkillsMiddleware
|
|
84
|
-
return
|
|
85
|
-
|
|
86
|
-
RetrySkillsMiddleware._sycommon_retry_patch = True
|
|
87
|
-
_graph.SkillsMiddleware = RetrySkillsMiddleware
|
|
88
|
-
logger.info(
|
|
89
|
-
"[SkillsRetry] SkillsMiddleware 已启用空列表重试补丁"
|
|
90
|
-
"(加载失败不再永久缓存空技能列表)")
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
_apply()
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""deepagents SkillsMiddleware 的重试补丁。
|
|
3
|
+
|
|
4
|
+
修复「会话首轮沙箱 ls 失败 → skills_metadata=[] 被当已加载缓存进
|
|
5
|
+
checkpoint → 整个会话从此看不到技能」的问题。
|
|
6
|
+
|
|
7
|
+
背景(2026-09-01 线上案例):
|
|
8
|
+
- deepagents SkillsMiddleware.abefore_agent 每会话只加载一次技能:
|
|
9
|
+
`if "skills_metadata" in state: return None` —— 空列表也算"已加载"。
|
|
10
|
+
- 会话首条消息若撞上沙箱 /v1/sandbox/ls 500(发版恢复期/沙箱故障转移),
|
|
11
|
+
middleware 写入 skills_metadata=[] + skills_load_errors,并随 checkpoint
|
|
12
|
+
持久化。后续每一轮命中"in state"直接跳过,永不重试。
|
|
13
|
+
- 用户视角:该会话从此没有技能,直到新建会话。
|
|
14
|
+
|
|
15
|
+
修复语义:skills_metadata 为空**且**存在加载错误(或本应有 system 技能源)
|
|
16
|
+
→ 视为未加载成功,清除旧值后重新加载。真正的零技能(所有源都正常列空)
|
|
17
|
+
不重试,避免每轮白打一次 ls。
|
|
18
|
+
|
|
19
|
+
打补丁方式:替换 deepagents.graph 模块里的 SkillsMiddleware 符号(graph
|
|
20
|
+
在 create_deep_agent 内部 `SkillsMiddleware(backend=..., sources=...)`
|
|
21
|
+
引用的是模块全局名),子类化原类、只重载 abefore_agent,其余行为不动。
|
|
22
|
+
在 sycommon.agent.deep_agent 导入本模块即生效(幂等,可重复导入)。
|
|
23
|
+
"""
|
|
24
|
+
import logging
|
|
25
|
+
|
|
26
|
+
from deepagents.middleware import skills as _skills_module
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger("sycommon")
|
|
29
|
+
|
|
30
|
+
_ORIG_MIDDLEWARE = _skills_module.SkillsMiddleware
|
|
31
|
+
_PATCHED = getattr(_ORIG_MIDDLEWARE, "_sycommon_retry_patch", False)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class RetrySkillsMiddleware(_ORIG_MIDDLEWARE):
|
|
35
|
+
"""加载失败(空列表+错误)不缓存的 SkillsMiddleware。
|
|
36
|
+
|
|
37
|
+
上游缓存条件 `if "skills_metadata" in state: return None` 的漏洞:
|
|
38
|
+
空列表也是合法 dict key 存在,首轮 ls 失败写进去后永不再加载。
|
|
39
|
+
这里放宽为「空列表且带加载错误 → 重试」,其余行为与上游一致。
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
async def abefore_agent(self, state, runtime, config):
|
|
43
|
+
# 未加载过 → 走上游逻辑(会 fall through 到正常加载)
|
|
44
|
+
if "skills_metadata" not in state:
|
|
45
|
+
return await super().abefore_agent(state, runtime, config)
|
|
46
|
+
|
|
47
|
+
cached = state.get("skills_metadata") or []
|
|
48
|
+
cached_errors = state.get("skills_load_errors") or []
|
|
49
|
+
|
|
50
|
+
if cached:
|
|
51
|
+
# 已有技能列表(哪怕部分源失败) → 尊重上游缓存语义,不重试
|
|
52
|
+
return None
|
|
53
|
+
|
|
54
|
+
# 空列表:两种可能——
|
|
55
|
+
# a) 曾加载失败(ls 500 等)带 errors → 需要重试
|
|
56
|
+
# b) 所有源正常但确实零技能(无 errors) → 不重试
|
|
57
|
+
if not cached_errors:
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
logger.warning(
|
|
61
|
+
"[SkillsRetry] 检测到缓存为空的技能列表(加载曾失败),"
|
|
62
|
+
"本会话轮次重新加载 skills: %s", self.sources)
|
|
63
|
+
# 清掉旧值让上游 super() 不再命中 "skills_metadata" in state
|
|
64
|
+
# (dict 可变,删 key 即可;state 是 langgraph 传入的 dict 视图)
|
|
65
|
+
try:
|
|
66
|
+
state.pop("skills_metadata", None)
|
|
67
|
+
state.pop("skills_load_errors", None)
|
|
68
|
+
except Exception:
|
|
69
|
+
# state 不可变视图等极端情况:构造副本调 super 不可行,
|
|
70
|
+
# 退化为直接调用内部加载逻辑(与上游 for-source 循环等价)
|
|
71
|
+
pass
|
|
72
|
+
return await super().abefore_agent(state, runtime, config)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _apply() -> None:
|
|
76
|
+
"""把 deepagents.graph 引用的 SkillsMiddleware 换成重试版(幂等)。"""
|
|
77
|
+
if _PATCHED:
|
|
78
|
+
return
|
|
79
|
+
import deepagents.graph as _graph
|
|
80
|
+
|
|
81
|
+
if getattr(_graph.SkillsMiddleware, "_sycommon_retry_patch", False):
|
|
82
|
+
# 已打过(例如热重载场景)——只补标记
|
|
83
|
+
_graph.SkillsMiddleware = RetrySkillsMiddleware
|
|
84
|
+
return
|
|
85
|
+
|
|
86
|
+
RetrySkillsMiddleware._sycommon_retry_patch = True
|
|
87
|
+
_graph.SkillsMiddleware = RetrySkillsMiddleware
|
|
88
|
+
logger.info(
|
|
89
|
+
"[SkillsRetry] SkillsMiddleware 已启用空列表重试补丁"
|
|
90
|
+
"(加载失败不再永久缓存空技能列表)")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
_apply()
|