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.
Files changed (371) hide show
  1. sycommon_python_lib-0.2.10a9/MANIFEST.in +8 -0
  2. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/PKG-INFO +1 -1
  3. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/pyproject.toml +2 -2
  4. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/nexus/__init__.py +10 -4
  5. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/deep_agent.py +95 -0
  6. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/middleware/model_request_prep.py +81 -3
  7. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/minio_sync.py +2 -1
  8. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/skills_retry_patch.py +93 -93
  9. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/ldap_service.py +110 -65
  10. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/async_database_service.py +5 -1
  11. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/database_service.py +5 -1
  12. sycommon_python_lib-0.2.10a9/src/sycommon/logging/bounded_kafka_sink.py +156 -0
  13. sycommon_python_lib-0.2.10a9/src/sycommon/logging/bounded_stdout_sink.py +126 -0
  14. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/kafka_log.py +75 -8
  15. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/sandbox.py +78 -6
  16. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/traceid.py +27 -4
  17. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_client.py +69 -28
  18. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_pool.py +183 -17
  19. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +9 -5
  20. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +57 -10
  21. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_core.py +36 -36
  22. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/services.py +51 -11
  23. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sse/sse.py +57 -14
  24. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  25. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/SOURCES.txt +4 -60
  26. sycommon_python_lib-0.2.10a5/src/sycommon/synacos/example.py +0 -248
  27. sycommon_python_lib-0.2.10a5/src/sycommon/tests/deep_agent_server.py +0 -536
  28. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_backend_factory_compat.py +0 -158
  29. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consistent_hash.py +0 -279
  30. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consume_dedup.py +0 -194
  31. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_broker_health.py +0 -495
  32. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_loss_rootcause.py +0 -399
  33. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_recovery.py +0 -283
  34. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_recovery_fix.py +0 -334
  35. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_consumer_tags_sync.py +0 -151
  36. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_db_keepalive.py +0 -178
  37. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_deep_agent.py +0 -161
  38. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_dynamic_max_tokens.py +0 -442
  39. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_email.py +0 -172
  40. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_encoding_cache.py +0 -148
  41. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_env_tenant_helper.py +0 -72
  42. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_exp_concurrent_migrate.py +0 -174
  43. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_exp_delete_queue_with_consumers.py +0 -145
  44. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_fault_injection_real.py +0 -502
  45. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_fix_verification.py +0 -404
  46. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_heartbeat_timeout.py +0 -282
  47. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_integration_real_broker.py +0 -381
  48. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_mcp_server.py +0 -401
  49. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_minimax_reasoning.py +0 -290
  50. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_mq.py +0 -128
  51. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_mq_config_driven.py +0 -238
  52. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_nacos_llm_real.py +0 -113
  53. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_oa_login.py +0 -229
  54. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_queue_priority_fallback.py +0 -259
  55. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_queue_priority_upgrade_timing.py +0 -257
  56. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_real_summarization.py +0 -166
  57. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_reconnect_scenarios.py +0 -336
  58. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_sandbox_glob_hardening.py +0 -292
  59. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_summarization_config.py +0 -463
  60. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_summarization_real.py +0 -329
  61. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_summary_leak_e2e.py +0 -872
  62. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_upgrade_aio_pika.py +0 -153
  63. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_upgrade_langgraph_stream.py +0 -140
  64. sycommon_python_lib-0.2.10a5/src/sycommon/tests/test_upgrade_verification.py +0 -161
  65. sycommon_python_lib-0.2.10a5/tests/test_acp_tool.py +0 -392
  66. sycommon_python_lib-0.2.10a5/tests/test_asyncio_logging.py +0 -116
  67. sycommon_python_lib-0.2.10a5/tests/test_config_change_notifier.py +0 -168
  68. sycommon_python_lib-0.2.10a5/tests/test_hotreload_snapshot.py +0 -223
  69. sycommon_python_lib-0.2.10a5/tests/test_llm_apikey_contextvar.py +0 -36
  70. sycommon_python_lib-0.2.10a5/tests/test_log_masker.py +0 -255
  71. sycommon_python_lib-0.2.10a5/tests/test_resilient_pg_saver.py +0 -259
  72. sycommon_python_lib-0.2.10a5/tests/test_sandbox_path_guard.py +0 -297
  73. sycommon_python_lib-0.2.10a5/tests/test_sensitive_guard.py +0 -466
  74. sycommon_python_lib-0.2.10a5/tests/test_simple_chat_agent.py +0 -126
  75. sycommon_python_lib-0.2.10a5/tests/test_skill_regex_upgrade.py +0 -85
  76. sycommon_python_lib-0.2.10a5/tests/test_skill_write_guard.py +0 -122
  77. sycommon_python_lib-0.2.10a5/tests/test_streaming_e2e.py +0 -238
  78. sycommon_python_lib-0.2.10a5/tests/test_sycli.py +0 -1873
  79. sycommon_python_lib-0.2.10a5/tests/test_sylogger_fixes.py +0 -278
  80. sycommon_python_lib-0.2.10a5/tests/test_sync_skills_to_sandbox.py +0 -207
  81. sycommon_python_lib-0.2.10a5/tests/test_time_utils.py +0 -88
  82. sycommon_python_lib-0.2.10a5/tests/test_traceid_omit_base64.py +0 -77
  83. sycommon_python_lib-0.2.10a5/tests/test_upload_concurrency.py +0 -207
  84. sycommon_python_lib-0.2.10a5/tests/test_upload_e2e_http.py +0 -224
  85. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/README.md +0 -0
  86. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/setup.cfg +0 -0
  87. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/__init__.py +0 -0
  88. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/cli.py +0 -0
  89. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/__init__.py +0 -0
  90. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/console.py +0 -0
  91. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/models.py +0 -0
  92. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/project.py +0 -0
  93. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/core/utils.py +0 -0
  94. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/__init__.py +0 -0
  95. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/README.md.tpl +0 -0
  96. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/__init__.py +0 -0
  97. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/__init__.py.tpl +0 -0
  98. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/main_agent.py.tpl +0 -0
  99. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/nodes/__init__.py.tpl +0 -0
  100. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/nodes/example_node.py.tpl +0 -0
  101. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/states/__init__.py.tpl +0 -0
  102. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/agent/states/agent_state.py.tpl +0 -0
  103. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/api/__init__.py.tpl +0 -0
  104. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/api/query.py.tpl +0 -0
  105. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/api/sse/__init__.py.tpl +0 -0
  106. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/api/sse/agent.py.tpl +0 -0
  107. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/app.py.tpl +0 -0
  108. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/client/__init__.py.tpl +0 -0
  109. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/db/__init__.py.tpl +0 -0
  110. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/db/model/__init__.py.tpl +0 -0
  111. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/db/model/entity.py.tpl +0 -0
  112. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/db/service.py.tpl +0 -0
  113. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/model/__init__.py.tpl +0 -0
  114. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/model/parse.py.tpl +0 -0
  115. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/tools/__init__.py.tpl +0 -0
  116. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/agent/tools/mq.py.tpl +0 -0
  117. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/.env.tpl +0 -0
  118. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/.gitignore.tpl +0 -0
  119. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/Dockerfile.tpl +0 -0
  120. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/README.md.tpl +0 -0
  121. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/__init__.py +0 -0
  122. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/app.py.tpl +0 -0
  123. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/app.yaml.tpl +0 -0
  124. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/client/FileServiceClient.py.tpl +0 -0
  125. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/client/__init__.py.tpl +0 -0
  126. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/model/__init__.py.tpl +0 -0
  127. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/model/file_info.py.tpl +0 -0
  128. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/base/requirements.txt.tpl +0 -0
  129. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/README.md.tpl +0 -0
  130. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/__init__.py +0 -0
  131. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/app.py.tpl +0 -0
  132. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/commands/__init__.py.tpl +0 -0
  133. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/commands/hello.py.tpl +0 -0
  134. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/pyproject.toml.tpl +0 -0
  135. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/cli/tools/__init__.py.tpl +0 -0
  136. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/README.md.tpl +0 -0
  137. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/__init__.py +0 -0
  138. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/api/__init__.py.tpl +0 -0
  139. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/api/echo.py.tpl +0 -0
  140. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/api/sse/__init__.py.tpl +0 -0
  141. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/api/sse/echo.py.tpl +0 -0
  142. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/app.py.tpl +0 -0
  143. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/client/__init__.py.tpl +0 -0
  144. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/model/__init__.py.tpl +0 -0
  145. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/tools/__init__.py.tpl +0 -0
  146. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/command/templates/web/tools/mq.py.tpl +0 -0
  147. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/__init__.py +0 -0
  148. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/__main__.py +0 -0
  149. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/__init__.py +0 -0
  150. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/config.py +0 -0
  151. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/executor.py +0 -0
  152. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/registry.py +0 -0
  153. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/acp/server.py +0 -0
  154. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/agents/__init__.py +0 -0
  155. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/agents/factory.py +0 -0
  156. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/agents/prompts.py +0 -0
  157. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/__init__.py +0 -0
  158. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/browser.py +0 -0
  159. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/__init__.py +0 -0
  160. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/console.py +0 -0
  161. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/dom.py +0 -0
  162. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/network.py +0 -0
  163. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/page_errors.py +0 -0
  164. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/performance.py +0 -0
  165. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/capabilities/screenshot.py +0 -0
  166. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/client.py +0 -0
  167. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/protocol.py +0 -0
  168. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cdp/repl.py +0 -0
  169. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/cli.py +0 -0
  170. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/__init__.py +0 -0
  171. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/acp_cmd.py +0 -0
  172. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/acp_serve_cmd.py +0 -0
  173. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/cdp_cmd.py +0 -0
  174. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/chat_cmd.py +0 -0
  175. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/create_cmd.py +0 -0
  176. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/evaluate_cmd.py +0 -0
  177. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/init_cmd.py +0 -0
  178. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/memory_cmd.py +0 -0
  179. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/resume_cmd.py +0 -0
  180. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/rollback_cmd.py +0 -0
  181. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/commands/run_cmd.py +0 -0
  182. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/__init__.py +0 -0
  183. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/backend.py +0 -0
  184. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/config.py +0 -0
  185. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/display.py +0 -0
  186. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/git_integration.py +0 -0
  187. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/llm.py +0 -0
  188. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/core/state.py +0 -0
  189. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/evaluate/__init__.py +0 -0
  190. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/evaluate/api_evaluator.py +0 -0
  191. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/__init__.py +0 -0
  192. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/compressor.py +0 -0
  193. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/full.py +0 -0
  194. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/hot.py +0 -0
  195. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/manager.py +0 -0
  196. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/memory/warm.py +0 -0
  197. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/mode/__init__.py +0 -0
  198. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/mode/create.py +0 -0
  199. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/mode/optimize.py +0 -0
  200. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/models/__init__.py +0 -0
  201. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/models/config_models.py +0 -0
  202. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/__init__.py +0 -0
  203. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/baseline_tests.py +0 -0
  204. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/checkpoint.py +0 -0
  205. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/convergence.py +0 -0
  206. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/diagnosis.py +0 -0
  207. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/engine.py +0 -0
  208. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/environment.py +0 -0
  209. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/experience.py +0 -0
  210. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/harness_prompts.py +0 -0
  211. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/history.py +0 -0
  212. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/optimization_logger.py +0 -0
  213. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/pre_validation.py +0 -0
  214. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/reward.py +0 -0
  215. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/strategy_bandit.py +0 -0
  216. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/strategy_generator.py +0 -0
  217. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/rl/strategy_prompts.py +0 -0
  218. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/simple_chat_agent.py +0 -0
  219. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycli/skills/__init__.py +0 -0
  220. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/__init__.py +0 -0
  221. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/__init__.py +0 -0
  222. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/__init__.py +0 -0
  223. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/client.py +0 -0
  224. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/fetch.py +0 -0
  225. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/server_adapter.py +0 -0
  226. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/ssh_init.py +0 -0
  227. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/acp/tool.py +0 -0
  228. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/agent_manager.py +0 -0
  229. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/chat_events.py +0 -0
  230. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/mcp/__init__.py +0 -0
  231. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/mcp/models.py +0 -0
  232. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/mcp/tool_loader.py +0 -0
  233. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/middleware/sandbox_path_guard.py +0 -0
  234. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/middleware/sensitive_guard.py +0 -0
  235. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/middleware/skill_write_guard.py +0 -0
  236. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/multi_agent_team.py +0 -0
  237. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/reasoning_content_patch.py +0 -0
  238. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/resume_compactor.py +0 -0
  239. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/__init__.py +0 -0
  240. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/consistent_hash.py +0 -0
  241. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  242. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/http_sandbox_backend.py +0 -0
  243. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  244. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  245. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/sandbox/session.py +0 -0
  246. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/agent/summarization_utils.py +0 -0
  247. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/__init__.py +0 -0
  248. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/oa_cache.py +0 -0
  249. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/oa_crypto.py +0 -0
  250. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/oa_service.py +0 -0
  251. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/auth/wecom_ldap_service.py +0 -0
  252. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/ACPAgentConfig.py +0 -0
  253. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/Config.py +0 -0
  254. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/DatabaseConfig.py +0 -0
  255. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/EgressPolicyConfig.py +0 -0
  256. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  257. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/EmbeddingConfig.py +0 -0
  258. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/LLMConfig.py +0 -0
  259. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/LangfuseConfig.py +0 -0
  260. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/MQConfig.py +0 -0
  261. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/PgConfig.py +0 -0
  262. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/RedisConfig.py +0 -0
  263. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/RerankerConfig.py +0 -0
  264. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/SentryConfig.py +0 -0
  265. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/XxlJobConfig.py +0 -0
  266. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/__init__.py +0 -0
  267. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/config/config_change_notifier.py +0 -0
  268. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/async_base_db_service.py +0 -0
  269. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/base_db_service.py +0 -0
  270. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/elasticsearch_service.py +0 -0
  271. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/pg_checkpoint_service.py +0 -0
  272. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/redis_service.py +0 -0
  273. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/resilient_pg_saver.py +0 -0
  274. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/database/token_usage_db_service.py +0 -0
  275. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/health/__init__.py +0 -0
  276. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/health/health_check.py +0 -0
  277. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/health/metrics.py +0 -0
  278. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/health/ping.py +0 -0
  279. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/heartbeat_process/__init__.py +0 -0
  280. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  281. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  282. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  283. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/__init__.py +0 -0
  284. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/embedding.py +0 -0
  285. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/get_llm.py +0 -0
  286. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/llm_logger.py +0 -0
  287. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/llm_tokens.py +0 -0
  288. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  289. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  290. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  291. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/struct_token.py +0 -0
  292. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/sy_langfuse.py +0 -0
  293. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/tiktoken_cache/9b5ad71b2ce5302211f9c61530b329a4922fc6a4 +0 -0
  294. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/tiktoken_cache/fb374d419588a4632f3f557e76b4b70aebbca790 +0 -0
  295. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/token_usage_es_service.py +0 -0
  296. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  297. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/token_utils.py +0 -0
  298. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/llm/usage_token.py +0 -0
  299. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/__init__.py +0 -0
  300. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/async_sql_logger.py +0 -0
  301. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/log_masker.py +0 -0
  302. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/logger_levels.py +0 -0
  303. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/logger_wrapper.py +0 -0
  304. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/process_logger.py +0 -0
  305. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/logging/sql_logger.py +0 -0
  306. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/mcp_server/__init__.py +0 -0
  307. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/mcp_server/server.py +0 -0
  308. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/__init__.py +0 -0
  309. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/context.py +0 -0
  310. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/cors.py +0 -0
  311. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/docs.py +0 -0
  312. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/egress_wall.py +0 -0
  313. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/exception.py +0 -0
  314. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/middleware.py +0 -0
  315. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/monitor_memory.py +0 -0
  316. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/mq.py +0 -0
  317. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/sandbox_gateway.py +0 -0
  318. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/timeout.py +0 -0
  319. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/token_tracking.py +0 -0
  320. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/middleware/tool_result_truncation.py +0 -0
  321. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/__init__.py +0 -0
  322. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/base_http.py +0 -0
  323. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/log.py +0 -0
  324. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/mcp_server_config.py +0 -0
  325. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/mqlistener_config.py +0 -0
  326. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/mqmsg_model.py +0 -0
  327. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/mqsend_config.py +0 -0
  328. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/sandbox.py +0 -0
  329. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/sso_user.py +0 -0
  330. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/token_usage.py +0 -0
  331. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/token_usage_mysql.py +0 -0
  332. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/models/xxljob_handler_config.py +0 -0
  333. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/notice/__init__.py +0 -0
  334. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  335. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/notice/wecom_message.py +0 -0
  336. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  337. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbit_management_client.py +0 -0
  338. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  339. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  340. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  341. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sentry/__init__.py +0 -0
  342. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sentry/sy_sentry.py +0 -0
  343. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sse/__init__.py +0 -0
  344. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/sse/event.py +0 -0
  345. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/__init__.py +0 -0
  346. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/example2.py +0 -0
  347. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/feign.py +0 -0
  348. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/feign_client.py +0 -0
  349. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_client_base.py +0 -0
  350. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  351. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  352. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_service.py +0 -0
  353. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  354. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  355. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/synacos/param.py +0 -0
  356. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/__init__.py +0 -0
  357. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/async_utils.py +0 -0
  358. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/docs.py +0 -0
  359. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/env.py +0 -0
  360. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/merge_headers.py +0 -0
  361. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/snowflake.py +0 -0
  362. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/syemail.py +0 -0
  363. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/time_utils.py +0 -0
  364. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/timing.py +0 -0
  365. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/tools/user_id.py +0 -0
  366. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/xxljob/__init__.py +0 -0
  367. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon/xxljob/xxljob_service.py +0 -0
  368. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  369. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  370. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  371. {sycommon_python_lib-0.2.10a5 → sycommon_python_lib-0.2.10a9}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
@@ -0,0 +1,8 @@
1
+ prune docs
2
+ prune test
3
+ prune tests
4
+ prune src/sycommon/tests
5
+ exclude src/sycommon/synacos/example.py
6
+ exclude Makefile
7
+ exclude publish-win.ps1
8
+ global-exclude __pycache__ *.py[cod]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.10a5
3
+ Version: 0.2.10a9
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.10a5"
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
- cmd = ["twine", "upload", "--repository-url", repo_url, file_path, "-u", USERNAME, "-p", PASSWORD]
36
- sys.exit(subprocess.call(cmd))
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__":
@@ -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
- """拦截模型调用:先做摘要重定位与 max_tokens 动态压,再交给 handler。"""
223
+ """拦截模型调用:摘要重定位(注入前去重)→ max_tokens 动态压 →
224
+ 响应剥回显(断环),再返回 handler 结果。"""
152
225
  request = self._relocate_summaries(request)
153
226
  self._clamp_max_tokens(request)
154
- return await handler(request)
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(5 * 1024 * 1024):
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()