sycommon-python-lib 0.2.1a39__tar.gz → 0.2.1a41__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 (144) hide show
  1. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/PKG-INFO +2 -1
  2. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/pyproject.toml +2 -1
  3. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/http_sandbox_backend.py +75 -28
  4. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/sso_user.py +6 -1
  5. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +1 -1
  6. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/PKG-INFO +2 -1
  7. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/requires.txt +1 -0
  8. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/README.md +0 -0
  9. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/setup.cfg +0 -0
  10. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/__init__.py +0 -0
  11. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/cli.py +0 -0
  12. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/core/__init__.py +0 -0
  13. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/core/console.py +0 -0
  14. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/core/models.py +0 -0
  15. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/core/project.py +0 -0
  16. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/core/utils.py +0 -0
  17. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/templates/__init__.py +0 -0
  18. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/templates/agent/__init__.py +0 -0
  19. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/templates/base/__init__.py +0 -0
  20. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/command/templates/web/__init__.py +0 -0
  21. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/__init__.py +0 -0
  22. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/__init__.py +0 -0
  23. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/agent_manager.py +0 -0
  24. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/chat_events.py +0 -0
  25. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/deep_agent.py +0 -0
  26. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/multi_agent_team.py +0 -0
  27. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/__init__.py +0 -0
  28. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  29. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  30. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  31. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/agent/sandbox/session.py +0 -0
  32. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/auth/__init__.py +0 -0
  33. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/auth/ldap_service.py +0 -0
  34. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/Config.py +0 -0
  35. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/DatabaseConfig.py +0 -0
  36. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  37. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/EmbeddingConfig.py +0 -0
  38. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/LLMConfig.py +0 -0
  39. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/LangfuseConfig.py +0 -0
  40. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/MQConfig.py +0 -0
  41. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/RedisConfig.py +0 -0
  42. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/RerankerConfig.py +0 -0
  43. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/SentryConfig.py +0 -0
  44. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/config/__init__.py +0 -0
  45. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/async_base_db_service.py +0 -0
  46. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/async_database_service.py +0 -0
  47. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/base_db_service.py +0 -0
  48. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/database_service.py +0 -0
  49. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/elasticsearch_service.py +0 -0
  50. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/redis_service.py +0 -0
  51. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/database/token_usage_db_service.py +0 -0
  52. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/health/__init__.py +0 -0
  53. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/health/health_check.py +0 -0
  54. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/health/metrics.py +0 -0
  55. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/health/ping.py +0 -0
  56. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/heartbeat_process/__init__.py +0 -0
  57. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  58. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  59. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  60. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/__init__.py +0 -0
  61. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/embedding.py +0 -0
  62. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/get_llm.py +0 -0
  63. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/llm_logger.py +0 -0
  64. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/llm_tokens.py +0 -0
  65. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  66. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  67. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  68. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/struct_token.py +0 -0
  69. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/sy_langfuse.py +0 -0
  70. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/token_usage_es_service.py +0 -0
  71. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  72. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/llm/usage_token.py +0 -0
  73. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/__init__.py +0 -0
  74. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/async_sql_logger.py +0 -0
  75. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/kafka_log.py +0 -0
  76. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/logger_levels.py +0 -0
  77. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/logger_wrapper.py +0 -0
  78. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/process_logger.py +0 -0
  79. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/logging/sql_logger.py +0 -0
  80. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/__init__.py +0 -0
  81. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/background_execution.py +0 -0
  82. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/context.py +0 -0
  83. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/cors.py +0 -0
  84. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/docs.py +0 -0
  85. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/exception.py +0 -0
  86. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/middleware.py +0 -0
  87. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/monitor_memory.py +0 -0
  88. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/mq.py +0 -0
  89. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/sandbox.py +0 -0
  90. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/timeout.py +0 -0
  91. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/middleware/traceid.py +0 -0
  92. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/__init__.py +0 -0
  93. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/base_http.py +0 -0
  94. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/log.py +0 -0
  95. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/mqlistener_config.py +0 -0
  96. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/mqmsg_model.py +0 -0
  97. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/mqsend_config.py +0 -0
  98. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/sandbox.py +0 -0
  99. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/token_usage.py +0 -0
  100. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/models/token_usage_mysql.py +0 -0
  101. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/notice/__init__.py +0 -0
  102. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  103. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  104. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  105. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  106. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  107. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  108. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  109. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  110. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  111. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/sentry/__init__.py +0 -0
  112. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/sentry/sy_sentry.py +0 -0
  113. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/services.py +0 -0
  114. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/sse/__init__.py +0 -0
  115. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/sse/event.py +0 -0
  116. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/sse/sse.py +0 -0
  117. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/__init__.py +0 -0
  118. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/example.py +0 -0
  119. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/example2.py +0 -0
  120. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/feign.py +0 -0
  121. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/feign_client.py +0 -0
  122. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_client_base.py +0 -0
  123. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  124. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  125. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_service.py +0 -0
  126. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  127. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  128. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/synacos/param.py +0 -0
  129. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tests/deep_agent_server.py +0 -0
  130. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tests/test_deep_agent.py +0 -0
  131. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tests/test_email.py +0 -0
  132. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tests/test_mq.py +0 -0
  133. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/__init__.py +0 -0
  134. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/async_utils.py +0 -0
  135. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/docs.py +0 -0
  136. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/env.py +0 -0
  137. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/merge_headers.py +0 -0
  138. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/snowflake.py +0 -0
  139. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/syemail.py +0 -0
  140. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon/tools/timing.py +0 -0
  141. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/SOURCES.txt +0 -0
  142. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  143. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  144. {sycommon_python_lib-0.2.1a39 → sycommon_python_lib-0.2.1a41}/src/sycommon_python_lib.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.1a39
3
+ Version: 0.2.1a41
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -19,6 +19,7 @@ Requires-Dist: langchain-core>=1.2.20
19
19
  Requires-Dist: langchain-openai>=1.1.11
20
20
  Requires-Dist: langfuse>=4.0.1
21
21
  Requires-Dist: langgraph>=1.1.3
22
+ Requires-Dist: langgraph-checkpoint-redis>=0.4.0
22
23
  Requires-Dist: ldap3>=2.9.1
23
24
  Requires-Dist: loguru>=0.7.3
24
25
  Requires-Dist: mysql-connector-python>=9.6.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.1a39"
3
+ version = "0.2.1a41"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -20,6 +20,7 @@ dependencies = [
20
20
  "langchain-openai>=1.1.11",
21
21
  "langfuse>=4.0.1",
22
22
  "langgraph>=1.1.3",
23
+ "langgraph-checkpoint-redis>=0.4.0",
23
24
  "ldap3>=2.9.1",
24
25
  "loguru>=0.7.3",
25
26
  "mysql-connector-python>=9.6.0",
@@ -485,15 +485,22 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
485
485
  return False
486
486
 
487
487
  async def _sync_async(self) -> dict:
488
- """同步目录(异步版本)"""
488
+ """同步目录(异步版本)
489
+
490
+ sync_dirs 条目支持两种格式:
491
+ (local_path, remote_path) -> 全量覆盖
492
+ (local_path, remote_path, mode) -> mode="full" 全量覆盖, mode="partial" 跳过已有子目录
493
+ """
489
494
  if not self._sync_dirs:
490
495
  SYLogger.info("[Sandbox] 没有配置同步目录")
491
496
  return {}
492
497
 
493
498
  SYLogger.info(f"[Sandbox] _sync_async 开始, 共 {len(self._sync_dirs)} 个目录")
494
499
  results = {}
495
- for idx, (local_path, remote_path) in enumerate(self._sync_dirs):
496
- SYLogger.info(f"[Sandbox] 同步目录 [{idx+1}/{len(self._sync_dirs)}]: {local_path} -> {remote_path}")
500
+ for idx, entry in enumerate(self._sync_dirs):
501
+ local_path, remote_path = entry[0], entry[1]
502
+ mode = entry[2] if len(entry) > 2 else "full"
503
+ SYLogger.info(f"[Sandbox] 同步目录 [{idx+1}/{len(self._sync_dirs)}]: {local_path} -> {remote_path} (mode={mode})")
497
504
  local_dir = Path(local_path)
498
505
 
499
506
  if not local_dir.exists():
@@ -503,7 +510,7 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
503
510
 
504
511
  if local_dir.is_dir():
505
512
  SYLogger.info(f"[Sandbox] 开始上传目录: {local_path}")
506
- result = await self._upload_directory_async(str(local_dir), remote_path)
513
+ result = await self._upload_directory_async(str(local_dir), remote_path, mode=mode)
507
514
  results[local_path] = result
508
515
  SYLogger.info(f"[Sandbox] 目录上传完成: {local_path}, 成功={result['success']}, 失败={result['failed']}")
509
516
  else:
@@ -520,8 +527,16 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
520
527
  SYLogger.info("[Sandbox] _sync_async 完成")
521
528
  return results
522
529
 
523
- async def _upload_directory_async(self, local_dir: str, remote_path: str = "/") -> dict:
524
- """上传整个目录到沙箱(异步版本)"""
530
+ async def _upload_directory_async(self, local_dir: str, remote_path: str = "/", *, mode: str = "full") -> dict:
531
+ """上传整个目录到沙箱(异步版本)
532
+
533
+ Args:
534
+ local_dir: 本地目录路径
535
+ remote_path: 沙箱目标路径
536
+ mode: 同步模式
537
+ - "full": 全量覆盖(默认),上传所有文件
538
+ - "partial": 部分覆盖,查询沙箱已有子目录并跳过同名目录
539
+ """
525
540
  local_path = Path(local_dir)
526
541
  if not local_path.exists():
527
542
  raise FileNotFoundError(f"本地目录不存在: {local_dir}")
@@ -529,7 +544,24 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
529
544
  if not local_path.is_dir():
530
545
  raise NotADirectoryError(f"路径不是目录: {local_dir}")
531
546
 
532
- SYLogger.info(f"[Sandbox] _upload_directory_async 开始: {local_dir} -> {remote_path}")
547
+ SYLogger.info(f"[Sandbox] _upload_directory_async 开始: {local_dir} -> {remote_path} (mode={mode})")
548
+
549
+ # partial 模式:查询沙箱已有子目录并跳过
550
+ existing_subdirs = set()
551
+ if mode == "partial":
552
+ try:
553
+ ls_result = await self._post_async(f"{SANDBOX_API_PREFIX}/ls", {
554
+ "path": remote_path,
555
+ "user_id": self._user_id
556
+ })
557
+ if ls_result and not ls_result.get("error"):
558
+ for item in ls_result.get("files", ls_result.get("children", [])):
559
+ if item.get("is_dir", False):
560
+ existing_subdirs.add(item.get("name", ""))
561
+ if existing_subdirs:
562
+ SYLogger.info(f"[Sandbox] partial 模式,跳过已有子目录: {existing_subdirs}")
563
+ except Exception as e:
564
+ SYLogger.warning(f"[Sandbox] 查询沙箱目录失败,将全量同步: {e}")
533
565
 
534
566
  exclude_patterns = [".git", "__pycache__", ".pyc", ".DS_Store", "node_modules"]
535
567
 
@@ -547,6 +579,19 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
547
579
  for root, dirs, files in os.walk(local_path):
548
580
  dirs[:] = [d for d in dirs if not should_exclude(d)]
549
581
 
582
+ # 对于 /skills 目录,跳过沙箱中已存在的子目录(只检查最外层)
583
+ if existing_subdirs:
584
+ try:
585
+ rel = Path(root).relative_to(local_path)
586
+ if str(rel) == ".":
587
+ before = len(dirs)
588
+ skipped_names = [d for d in dirs if d in existing_subdirs]
589
+ dirs[:] = [d for d in dirs if d not in existing_subdirs]
590
+ if skipped_names:
591
+ SYLogger.info(f"[Sandbox] 跳过已有技能目录: {skipped_names}")
592
+ except ValueError:
593
+ pass
594
+
550
595
  for file in files:
551
596
  if should_exclude(file):
552
597
  continue
@@ -558,32 +603,34 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
558
603
 
559
604
  SYLogger.info(f"[Sandbox] 准备上传 {len(files_to_upload)} 个文件到沙箱")
560
605
 
561
- success_count = 0
562
- failed_count = 0
563
- errors = []
606
+ semaphore = asyncio.Semaphore(10)
564
607
 
565
- for idx, (sandbox_path, local_file) in enumerate(files_to_upload):
566
- try:
608
+ async def _upload_one(idx, sandbox_path, local_file):
609
+ async with semaphore:
567
610
  if idx % 10 == 0:
568
611
  SYLogger.info(f"[Sandbox] 上传进度: {idx}/{len(files_to_upload)}")
612
+ try:
613
+ content = await asyncio.to_thread(lambda f=local_file: open(f, "rb").read())
614
+ result = await self._post_async(f"{SANDBOX_API_PREFIX}/upload", {
615
+ "path": sandbox_path,
616
+ "content": base64.b64encode(content).decode(),
617
+ "user_id": self._user_id
618
+ })
619
+ if result.get("error"):
620
+ return {"ok": False, "path": sandbox_path, "error": result["error"]}
621
+ return {"ok": True}
622
+ except Exception as e:
623
+ return {"ok": False, "path": sandbox_path, "error": str(e)}
569
624
 
570
- content = await asyncio.to_thread(lambda f=local_file: open(f, "rb").read())
625
+ upload_tasks = [
626
+ _upload_one(idx, sandbox_path, local_file)
627
+ for idx, (sandbox_path, local_file) in enumerate(files_to_upload)
628
+ ]
629
+ upload_results = await asyncio.gather(*upload_tasks)
571
630
 
572
- result = await self._post_async(f"{SANDBOX_API_PREFIX}/upload", {
573
- "path": sandbox_path,
574
- "content": base64.b64encode(content).decode(),
575
- "user_id": self._user_id
576
- })
577
-
578
- if result.get("error"):
579
- failed_count += 1
580
- errors.append({"path": sandbox_path, "error": result["error"]})
581
- else:
582
- success_count += 1
583
-
584
- except Exception as e:
585
- failed_count += 1
586
- errors.append({"path": sandbox_path, "error": str(e)})
631
+ success_count = sum(1 for r in upload_results if r["ok"])
632
+ failed_count = sum(1 for r in upload_results if not r["ok"])
633
+ errors = [{"path": r["path"], "error": r["error"]} for r in upload_results if not r["ok"]]
587
634
 
588
635
  SYLogger.info(f"[Sandbox] _upload_directory_async 完成: 成功={success_count}, 失败={failed_count}")
589
636
  return {"success": success_count, "failed": failed_count, "errors": errors}
@@ -1,11 +1,16 @@
1
1
  from pydantic import BaseModel, ConfigDict
2
+ from pydantic.alias_generators import to_camel
2
3
  from typing import List, Optional
3
4
  from datetime import datetime
4
5
 
5
6
 
6
7
  class SsoUser(BaseModel):
7
8
  """SSO用户模型,对应Java的SsoUser类"""
8
- model_config = ConfigDict(protected_namespaces=())
9
+ model_config = ConfigDict(
10
+ protected_namespaces=(),
11
+ alias_generator=to_camel,
12
+ populate_by_name=True,
13
+ )
9
14
  tenant_id: Optional[str] = None
10
15
  customer_id: Optional[str] = None
11
16
  customer_name: Optional[str] = None
@@ -209,7 +209,7 @@ class RabbitMQProducerManager(RabbitMQClientManager):
209
209
  request_path="/",
210
210
  req_type="SYSTEM",
211
211
  trace_id=logger.get_trace_id(),
212
- ).model_dump_json(),
212
+ ).model_dump_json(by_alias=True),
213
213
  "trace-id": logger.get_trace_id(),
214
214
  "createTime": str(int(time.time() * 1000)),
215
215
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.1a39
3
+ Version: 0.2.1a41
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
@@ -19,6 +19,7 @@ Requires-Dist: langchain-core>=1.2.20
19
19
  Requires-Dist: langchain-openai>=1.1.11
20
20
  Requires-Dist: langfuse>=4.0.1
21
21
  Requires-Dist: langgraph>=1.1.3
22
+ Requires-Dist: langgraph-checkpoint-redis>=0.4.0
22
23
  Requires-Dist: ldap3>=2.9.1
23
24
  Requires-Dist: loguru>=0.7.3
24
25
  Requires-Dist: mysql-connector-python>=9.6.0
@@ -13,6 +13,7 @@ langchain-core>=1.2.20
13
13
  langchain-openai>=1.1.11
14
14
  langfuse>=4.0.1
15
15
  langgraph>=1.1.3
16
+ langgraph-checkpoint-redis>=0.4.0
16
17
  ldap3>=2.9.1
17
18
  loguru>=0.7.3
18
19
  mysql-connector-python>=9.6.0