sycommon-python-lib 0.2.1a28__tar.gz → 0.2.1a30__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 (168) hide show
  1. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/PKG-INFO +1 -1
  2. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/pyproject.toml +1 -1
  3. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/sandbox/http_sandbox_backend.py +104 -0
  4. sycommon_python_lib-0.2.1a30/src/sycommon/middleware/background_execution.py +449 -0
  5. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/sandbox.py +269 -146
  6. sycommon_python_lib-0.2.1a30/src/sycommon/models/sandbox.py +201 -0
  7. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon_python_lib.egg-info/PKG-INFO +1 -1
  8. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon_python_lib.egg-info/SOURCES.txt +2 -0
  9. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/README.md +0 -0
  10. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/setup.cfg +0 -0
  11. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/__init__.py +0 -0
  12. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/cli.py +0 -0
  13. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/core/__init__.py +0 -0
  14. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/core/console.py +0 -0
  15. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/core/models.py +0 -0
  16. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/core/project.py +0 -0
  17. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/core/utils.py +0 -0
  18. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/templates/__init__.py +0 -0
  19. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/templates/agent/__init__.py +0 -0
  20. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/templates/base/__init__.py +0 -0
  21. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/command/templates/web/__init__.py +0 -0
  22. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/__init__.py +0 -0
  23. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/__init__.py +0 -0
  24. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/01_basic_agent.py +0 -0
  25. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/02_tool_agent.py +0 -0
  26. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/03_structured_output.py +0 -0
  27. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/04_memory_agent.py +0 -0
  28. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/05_streaming.py +0 -0
  29. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/06_multi_agent.py +0 -0
  30. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/07_skills_agent.py +0 -0
  31. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/08_middleware.py +0 -0
  32. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/09_interrupt.py +0 -0
  33. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/10_custom_llm.py +0 -0
  34. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/11_complex_workflow.py +0 -0
  35. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/12_batch_processing.py +0 -0
  36. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/__init__.py +0 -0
  37. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/01_basic_monitoring.py +0 -0
  38. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/02_permission_control.py +0 -0
  39. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/03_tool_skill_filter.py +0 -0
  40. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/04_caching_retry.py +0 -0
  41. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/05_sanitization.py +0 -0
  42. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/06_tracking.py +0 -0
  43. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/07_advanced.py +0 -0
  44. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/08_progressive_skills.py +0 -0
  45. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/__init__.py +0 -0
  46. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/middleware/override_examples.py +0 -0
  47. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/examples/virtual_employee_demo.py +0 -0
  48. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/exports.py +0 -0
  49. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/get_agent.py +0 -0
  50. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/sandbox/__init__.py +0 -0
  51. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/sandbox/file_ops.py +0 -0
  52. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  53. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  54. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/sandbox/session.py +0 -0
  55. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/skills/__init__.py +0 -0
  56. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/skills/examples/faq_handler/scripts/search.py +0 -0
  57. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/skills/exports.py +0 -0
  58. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/agent/virtual_employee.py +0 -0
  59. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/Config.py +0 -0
  60. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/DatabaseConfig.py +0 -0
  61. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  62. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/EmbeddingConfig.py +0 -0
  63. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/LLMConfig.py +0 -0
  64. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/LangfuseConfig.py +0 -0
  65. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/MQConfig.py +0 -0
  66. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/RedisConfig.py +0 -0
  67. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/RerankerConfig.py +0 -0
  68. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/SentryConfig.py +0 -0
  69. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/config/__init__.py +0 -0
  70. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/database/async_base_db_service.py +0 -0
  71. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/database/async_database_service.py +0 -0
  72. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/database/base_db_service.py +0 -0
  73. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/database/database_service.py +0 -0
  74. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/database/elasticsearch_service.py +0 -0
  75. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/database/redis_service.py +0 -0
  76. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/database/token_usage_db_service.py +0 -0
  77. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/health/__init__.py +0 -0
  78. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/health/health_check.py +0 -0
  79. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/health/metrics.py +0 -0
  80. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/health/ping.py +0 -0
  81. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/heartbeat_process/__init__.py +0 -0
  82. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  83. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  84. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  85. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/__init__.py +0 -0
  86. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/embedding.py +0 -0
  87. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/get_llm.py +0 -0
  88. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/llm_logger.py +0 -0
  89. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/llm_tokens.py +0 -0
  90. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/llm_with_token_tracking.py +0 -0
  91. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  92. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  93. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/struct_token.py +0 -0
  94. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/sy_langfuse.py +0 -0
  95. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/token_usage_es_service.py +0 -0
  96. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/token_usage_mysql_service.py +0 -0
  97. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/llm/usage_token.py +0 -0
  98. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/logging/__init__.py +0 -0
  99. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/logging/async_sql_logger.py +0 -0
  100. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/logging/kafka_log.py +0 -0
  101. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/logging/logger_levels.py +0 -0
  102. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/logging/logger_wrapper.py +0 -0
  103. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/logging/process_logger.py +0 -0
  104. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/logging/sql_logger.py +0 -0
  105. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/__init__.py +0 -0
  106. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/context.py +0 -0
  107. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/cors.py +0 -0
  108. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/docs.py +0 -0
  109. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/exception.py +0 -0
  110. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/middleware.py +0 -0
  111. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/monitor_memory.py +0 -0
  112. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/mq.py +0 -0
  113. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/timeout.py +0 -0
  114. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/middleware/traceid.py +0 -0
  115. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/models/__init__.py +0 -0
  116. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/models/base_http.py +0 -0
  117. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/models/log.py +0 -0
  118. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/models/mqlistener_config.py +0 -0
  119. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/models/mqmsg_model.py +0 -0
  120. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/models/mqsend_config.py +0 -0
  121. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/models/sso_user.py +0 -0
  122. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/models/token_usage.py +0 -0
  123. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/models/token_usage_mysql.py +0 -0
  124. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/notice/__init__.py +0 -0
  125. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  126. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  127. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  128. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  129. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  130. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  131. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  132. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  133. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  134. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  135. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/sentry/__init__.py +0 -0
  136. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/sentry/sy_sentry.py +0 -0
  137. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/services.py +0 -0
  138. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/sse/__init__.py +0 -0
  139. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/sse/event.py +0 -0
  140. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/sse/sse.py +0 -0
  141. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/__init__.py +0 -0
  142. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/example.py +0 -0
  143. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/example2.py +0 -0
  144. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/feign.py +0 -0
  145. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/feign_client.py +0 -0
  146. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/nacos_client_base.py +0 -0
  147. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/nacos_config_manager.py +0 -0
  148. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/nacos_heartbeat_manager.py +0 -0
  149. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/nacos_service.py +0 -0
  150. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/nacos_service_discovery.py +0 -0
  151. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/nacos_service_registration.py +0 -0
  152. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/synacos/param.py +0 -0
  153. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tests/deep_agent_server.py +0 -0
  154. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tests/test_deep_agent.py +0 -0
  155. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tests/test_email.py +0 -0
  156. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tests/test_mq.py +0 -0
  157. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tools/__init__.py +0 -0
  158. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tools/async_utils.py +0 -0
  159. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tools/docs.py +0 -0
  160. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tools/env.py +0 -0
  161. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tools/merge_headers.py +0 -0
  162. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tools/snowflake.py +0 -0
  163. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tools/syemail.py +0 -0
  164. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon/tools/timing.py +0 -0
  165. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
  166. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon_python_lib.egg-info/entry_points.txt +0 -0
  167. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/src/sycommon_python_lib.egg-info/requires.txt +0 -0
  168. {sycommon_python_lib-0.2.1a28 → sycommon_python_lib-0.2.1a30}/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.1a28
3
+ Version: 0.2.1a30
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.1a28"
3
+ version = "0.2.1a30"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -342,6 +342,110 @@ class HTTPSandboxBackend(FileOperationsMixin, SandboxBackendProtocol):
342
342
  """异步执行 shell 命令"""
343
343
  return await asyncio.to_thread(self.execute, command, timeout=timeout)
344
344
 
345
+ # ============== 后台进程执行 ==============
346
+
347
+ def execute_background(self, command: str, *, timeout: int = 600) -> dict:
348
+ """后台执行 shell 命令(不阻塞,立即返回 process_id)
349
+
350
+ 适用于长时间运行的服务(如 uvicorn、FastAPI 等)
351
+
352
+ Args:
353
+ command: 要执行的命令
354
+ timeout: 命令超时时间(秒),默认 600 秒
355
+
356
+ Returns:
357
+ dict: {"process_id": str, "status": "started"}
358
+
359
+ Example:
360
+ # 启动后台服务
361
+ result = backend.execute_background("uvicorn main:app --host 0.0.0.0 --port 8000")
362
+ process_id = result["process_id"]
363
+
364
+ # 稍后检查状态
365
+ status = backend.check_process(process_id)
366
+ if status["status"] == "running":
367
+ print("服务正在运行...")
368
+
369
+ # 需要时终止进程
370
+ backend.kill_process(process_id)
371
+ """
372
+ self._ensure_synced_sync()
373
+ SYLogger.info(f"[Sandbox] 后台执行: {command}")
374
+ try:
375
+ result = self._post_sync(f"{SANDBOX_API_PREFIX}/execute_background", {
376
+ "command": command,
377
+ "user_id": self._user_id,
378
+ "timeout": timeout
379
+ })
380
+ SYLogger.info(f"[Sandbox] 后台进程已启动: process_id={result['process_id']}")
381
+ return result
382
+ except Exception as e:
383
+ SYLogger.error(f"[Sandbox] 后台执行失败: {e}")
384
+ return {"process_id": None, "status": "error", "error": str(e)}
385
+
386
+ async def aexecute_background(self, command: str, *, timeout: int = 600) -> dict:
387
+ """异步后台执行 shell 命令"""
388
+ return await asyncio.to_thread(self.execute_background, command, timeout=timeout)
389
+
390
+ def check_process(self, process_id: str) -> dict:
391
+ """检查后台进程状态
392
+
393
+ Args:
394
+ process_id: execute_background 返回的进程 ID
395
+
396
+ Returns:
397
+ dict: {
398
+ "process_id": str,
399
+ "status": "running" | "completed" | "timeout" | "error" | "not_found",
400
+ "exit_code": int | None,
401
+ "output": str | None, # 仅在进程结束时返回
402
+ "truncated": bool,
403
+ "command": str | None,
404
+ "started_at": str | None
405
+ }
406
+ """
407
+ try:
408
+ result = self._post_sync(f"{SANDBOX_API_PREFIX}/process_status", {
409
+ "process_id": process_id,
410
+ "user_id": self._user_id
411
+ })
412
+ return result
413
+ except Exception as e:
414
+ SYLogger.error(f"[Sandbox] 检查进程失败: {e}")
415
+ return {"process_id": process_id, "status": "error", "error": str(e)}
416
+
417
+ async def acheck_process(self, process_id: str) -> dict:
418
+ """异步检查后台进程状态"""
419
+ return await asyncio.to_thread(self.check_process, process_id)
420
+
421
+ def kill_process(self, process_id: str) -> dict:
422
+ """终止后台进程
423
+
424
+ Args:
425
+ process_id: execute_background 返回的进程 ID
426
+
427
+ Returns:
428
+ dict: {
429
+ "process_id": str,
430
+ "status": "killed" | "not_found" | "already_completed",
431
+ "output": str | None # 进程截止到被杀死时的输出
432
+ }
433
+ """
434
+ try:
435
+ result = self._post_sync(f"{SANDBOX_API_PREFIX}/kill_process", {
436
+ "process_id": process_id,
437
+ "user_id": self._user_id
438
+ })
439
+ SYLogger.info(f"[Sandbox] 进程终止: {process_id}, status={result['status']}")
440
+ return result
441
+ except Exception as e:
442
+ SYLogger.error(f"[Sandbox] 终止进程失败: {e}")
443
+ return {"process_id": process_id, "status": "error", "error": str(e)}
444
+
445
+ async def akill_process(self, process_id: str) -> dict:
446
+ """异步终止后台进程"""
447
+ return await asyncio.to_thread(self.kill_process, process_id)
448
+
345
449
  # ============== 批量操作 ==============
346
450
 
347
451
  def upload_files(self, files: List[tuple[str, bytes]]) -> List[FileUploadResponse]:
@@ -0,0 +1,449 @@
1
+ """
2
+ 后台执行中间件
3
+
4
+ 为 deepagents 添加后台进程执行工具:
5
+ - execute_background: 后台启动进程,立即返回 process_id
6
+ - check_process: 检查进程状态
7
+ - kill_process: 终止进程
8
+
9
+ 使用方式:
10
+ from deepagents import create_deep_agent
11
+ from sycommon.middleware.background_execution import BackgroundExecutionMiddleware
12
+
13
+ agent = create_deep_agent(
14
+ model=model,
15
+ backend=sandbox_backend,
16
+ middleware=[BackgroundExecutionMiddleware()],
17
+ )
18
+ """
19
+
20
+ from collections.abc import Awaitable, Callable
21
+ from typing import Annotated, Any, NotRequired
22
+
23
+ from langchain.agents.middleware.types import (
24
+ AgentMiddleware,
25
+ AgentState,
26
+ ContextT,
27
+ ModelRequest,
28
+ ModelResponse,
29
+ ResponseT,
30
+ )
31
+ from langchain_core.tools import BaseTool, StructuredTool
32
+ from langchain.tools import ToolRuntime
33
+
34
+ from deepagents.backends.protocol import BackendProtocol, SandboxBackendProtocol
35
+
36
+
37
+ class BackgroundExecutionState(AgentState):
38
+ """后台执行中间件的状态"""
39
+ pass
40
+
41
+
42
+ # 工具描述
43
+ EXECUTE_BACKGROUND_DESCRIPTION = """在后台启动一个长时间运行的命令(不阻塞)。
44
+
45
+ 适用于启动需要持续运行的服务,如 Web 服务器、数据库等。
46
+
47
+ 使用方式:
48
+ - command: 要执行的 shell 命令
49
+ - timeout: 命令最大运行时间(秒),默认 600 秒
50
+
51
+ 返回:
52
+ - process_id: 进程 ID,用于后续检查状态或终止进程
53
+ - status: "started" 表示启动成功
54
+
55
+ 示例:
56
+ # 后台启动 FastAPI 服务
57
+ result = execute_background(command="uvicorn main:app --host 0.0.0.0 --port 8000")
58
+ process_id = result["process_id"]
59
+
60
+ # 等待服务启动后测试
61
+ execute(command="sleep 3 && curl http://localhost:8000/health")
62
+
63
+ # 完成后终止进程
64
+ kill_process(process_id=process_id)
65
+
66
+ 注意:启动服务后务必记住 process_id,并在完成后调用 kill_process 终止进程。"""
67
+
68
+
69
+ CHECK_PROCESS_DESCRIPTION = """检查后台进程的运行状态。
70
+
71
+ 参数:
72
+ - process_id: execute_background 返回的进程 ID
73
+
74
+ 返回:
75
+ - status: "running"(运行中)、"completed"(已完成)、"timeout"(超时)、"not_found"(未找到)
76
+ - exit_code: 退出码(仅进程结束时)
77
+ - output: 进程输出(仅进程结束时)
78
+
79
+ 示例:
80
+ status = check_process(process_id="abc123")
81
+ if status["status"] == "running":
82
+ print("服务正在运行...")
83
+ elif status["status"] == "completed":
84
+ print(f"服务已结束,退出码: {status['exit_code']}")
85
+ print(f"输出: {status['output']}")"""
86
+
87
+
88
+ KILL_PROCESS_DESCRIPTION = """终止一个后台进程。
89
+
90
+ 参数:
91
+ - process_id: 要终止的进程 ID
92
+
93
+ 返回:
94
+ - status: "killed"(已终止)、"not_found"(未找到)、"already_completed"(已完成)
95
+ - output: 进程截止到被终止时的输出
96
+
97
+ 示例:
98
+ result = kill_process(process_id="abc123")
99
+ if result["status"] == "killed":
100
+ print("进程已终止")
101
+ print(f"最终输出: {result['output']}")"""
102
+
103
+
104
+ BACKGROUND_EXECUTION_SYSTEM_PROMPT = """## 后台执行工具
105
+
106
+ 你可以使用以下工具来管理长时间运行的进程:
107
+
108
+ - execute_background: 在后台启动命令(不阻塞),返回 process_id
109
+ - check_process: 检查后台进程的状态
110
+ - kill_process: 终止后台进程
111
+
112
+ ### 使用场景
113
+
114
+ 当需要启动长时间运行的服务(如 Web 服务器、数据库)时:
115
+ 1. 使用 execute_background 启动服务,获取 process_id
116
+ 2. 使用 check_process 检查服务状态
117
+ 3. 完成后使用 kill_process 终止服务
118
+
119
+ ### 重要提示
120
+
121
+ - 每次启动服务都会产生新的 process_id,请务必记住它
122
+ - 服务会持续运行直到被终止或超时
123
+ - 测试完成后必须调用 kill_process 清理资源"""
124
+
125
+
126
+ def _supports_background_execution(backend: BackendProtocol) -> bool:
127
+ """检查 backend 是否支持后台执行"""
128
+ return (
129
+ isinstance(backend, SandboxBackendProtocol)
130
+ and hasattr(backend, 'execute_background')
131
+ and hasattr(backend, 'check_process')
132
+ and hasattr(backend, 'kill_process')
133
+ )
134
+
135
+
136
+ class BackgroundExecutionMiddleware(AgentMiddleware[BackgroundExecutionState, ContextT, ResponseT]):
137
+ """后台执行中间件
138
+
139
+ 为 deepagents 添加后台进程管理工具。如果 backend 实现了
140
+ execute_background、check_process、kill_process 方法,则添加这些工具。
141
+
142
+ Args:
143
+ backend: 后端实例或工厂函数。如果为 None,则从 runtime 获取。
144
+
145
+ Example:
146
+ ```python
147
+ from sycommon.middleware.background_execution import BackgroundExecutionMiddleware
148
+ from deepagents import create_deep_agent
149
+
150
+ agent = create_deep_agent(
151
+ model=model,
152
+ backend=sandbox_backend,
153
+ middleware=[BackgroundExecutionMiddleware()],
154
+ )
155
+ ```
156
+ """
157
+
158
+ state_schema = BackgroundExecutionState
159
+
160
+ def __init__(
161
+ self,
162
+ *,
163
+ backend: Any = None,
164
+ ) -> None:
165
+ """初始化后台执行中间件
166
+
167
+ Args:
168
+ backend: 后端实例或工厂函数。如果为 None,从 ToolRuntime 获取。
169
+ """
170
+ self._backend = backend
171
+
172
+ # 预创建工具(会在 wrap_model_call 中根据 backend 能力过滤)
173
+ self.tools = [
174
+ self._create_execute_background_tool(),
175
+ self._create_check_process_tool(),
176
+ self._create_kill_process_tool(),
177
+ ]
178
+
179
+ def _get_backend(self, runtime: ToolRuntime) -> BackendProtocol:
180
+ """获取 backend 实例"""
181
+ if self._backend is None:
182
+ # 从 runtime 获取 backend
183
+ return runtime.config.get("configurable", {}).get("backend")
184
+ if callable(self._backend):
185
+ return self._backend(runtime)
186
+ return self._backend
187
+
188
+ def _create_execute_background_tool(self) -> BaseTool:
189
+ """创建 execute_background 工具"""
190
+
191
+ def sync_execute_background(
192
+ command: Annotated[str, "要在后台执行的 shell 命令"],
193
+ runtime: ToolRuntime[None, BackgroundExecutionState],
194
+ timeout: Annotated[int, "命令最大运行时间(秒),默认 600 秒"] = 600,
195
+ ) -> str:
196
+ backend = self._get_backend(runtime)
197
+
198
+ if not _supports_background_execution(backend):
199
+ return "Error: 后台执行不可用。请确保 backend 实现了 execute_background 方法。"
200
+
201
+ try:
202
+ result = backend.execute_background(command, timeout=timeout)
203
+ process_id = result.get("process_id", "")
204
+ status = result.get("status", "unknown")
205
+
206
+ if result.get("error"):
207
+ return f"Error: {result['error']}"
208
+
209
+ return f"进程已启动\nprocess_id: {process_id}\nstatus: {status}"
210
+ except Exception as e:
211
+ return f"Error: {type(e).__name__}: {e}"
212
+
213
+ async def async_execute_background(
214
+ command: Annotated[str, "要在后台执行的 shell 命令"],
215
+ runtime: ToolRuntime[None, BackgroundExecutionState],
216
+ timeout: Annotated[int, "命令最大运行时间(秒),默认 600 秒"] = 600,
217
+ ) -> str:
218
+ backend = self._get_backend(runtime)
219
+
220
+ if not _supports_background_execution(backend):
221
+ return "Error: 后台执行不可用。请确保 backend 实现了 execute_background 方法。"
222
+
223
+ try:
224
+ result = await backend.aexecute_background(command, timeout=timeout)
225
+ process_id = result.get("process_id", "")
226
+ status = result.get("status", "unknown")
227
+
228
+ if result.get("error"):
229
+ return f"Error: {result['error']}"
230
+
231
+ return f"进程已启动\nprocess_id: {process_id}\nstatus: {status}"
232
+ except Exception as e:
233
+ return f"Error: {type(e).__name__}: {e}"
234
+
235
+ return StructuredTool.from_function(
236
+ name="execute_background",
237
+ description=EXECUTE_BACKGROUND_DESCRIPTION,
238
+ func=sync_execute_background,
239
+ coroutine=async_execute_background,
240
+ )
241
+
242
+ def _create_check_process_tool(self) -> BaseTool:
243
+ """创建 check_process 工具"""
244
+
245
+ def sync_check_process(
246
+ process_id: Annotated[str, "要检查的进程 ID"],
247
+ runtime: ToolRuntime[None, BackgroundExecutionState],
248
+ ) -> str:
249
+ backend = self._get_backend(runtime)
250
+
251
+ if not _supports_background_execution(backend):
252
+ return "Error: 后台执行不可用。"
253
+
254
+ try:
255
+ result = backend.check_process(process_id)
256
+ status = result.get("status", "unknown")
257
+
258
+ output_lines = [f"进程状态: {status}"]
259
+
260
+ if result.get("exit_code") is not None:
261
+ output_lines.append(f"退出码: {result['exit_code']}")
262
+
263
+ if result.get("command"):
264
+ output_lines.append(f"命令: {result['command']}")
265
+
266
+ if result.get("started_at"):
267
+ output_lines.append(f"启动时间: {result['started_at']}")
268
+
269
+ if result.get("output"):
270
+ output = result["output"]
271
+ if len(output) > 2000:
272
+ output = output[:2000] + "\n... [输出已截断]"
273
+ output_lines.append(f"输出:\n{output}")
274
+
275
+ return "\n".join(output_lines)
276
+ except Exception as e:
277
+ return f"Error: {type(e).__name__}: {e}"
278
+
279
+ async def async_check_process(
280
+ process_id: Annotated[str, "要检查的进程 ID"],
281
+ runtime: ToolRuntime[None, BackgroundExecutionState],
282
+ ) -> str:
283
+ backend = self._get_backend(runtime)
284
+
285
+ if not _supports_background_execution(backend):
286
+ return "Error: 后台执行不可用。"
287
+
288
+ try:
289
+ result = await backend.acheck_process(process_id)
290
+ status = result.get("status", "unknown")
291
+
292
+ output_lines = [f"进程状态: {status}"]
293
+
294
+ if result.get("exit_code") is not None:
295
+ output_lines.append(f"退出码: {result['exit_code']}")
296
+
297
+ if result.get("command"):
298
+ output_lines.append(f"命令: {result['command']}")
299
+
300
+ if result.get("started_at"):
301
+ output_lines.append(f"启动时间: {result['started_at']}")
302
+
303
+ if result.get("output"):
304
+ output = result["output"]
305
+ if len(output) > 2000:
306
+ output = output[:2000] + "\n... [输出已截断]"
307
+ output_lines.append(f"输出:\n{output}")
308
+
309
+ return "\n".join(output_lines)
310
+ except Exception as e:
311
+ return f"Error: {type(e).__name__}: {e}"
312
+
313
+ return StructuredTool.from_function(
314
+ name="check_process",
315
+ description=CHECK_PROCESS_DESCRIPTION,
316
+ func=sync_check_process,
317
+ coroutine=async_check_process,
318
+ )
319
+
320
+ def _create_kill_process_tool(self) -> BaseTool:
321
+ """创建 kill_process 工具"""
322
+
323
+ def sync_kill_process(
324
+ process_id: Annotated[str, "要终止的进程 ID"],
325
+ runtime: ToolRuntime[None, BackgroundExecutionState],
326
+ ) -> str:
327
+ backend = self._get_backend(runtime)
328
+
329
+ if not _supports_background_execution(backend):
330
+ return "Error: 后台执行不可用。"
331
+
332
+ try:
333
+ result = backend.kill_process(process_id)
334
+ status = result.get("status", "unknown")
335
+
336
+ output_lines = [f"进程终止结果: {status}"]
337
+
338
+ if result.get("output"):
339
+ output = result["output"]
340
+ if len(output) > 1000:
341
+ output = output[:1000] + "\n... [输出已截断]"
342
+ output_lines.append(f"最终输出:\n{output}")
343
+
344
+ return "\n".join(output_lines)
345
+ except Exception as e:
346
+ return f"Error: {type(e).__name__}: {e}"
347
+
348
+ async def async_kill_process(
349
+ process_id: Annotated[str, "要终止的进程 ID"],
350
+ runtime: ToolRuntime[None, BackgroundExecutionState],
351
+ ) -> str:
352
+ backend = self._get_backend(runtime)
353
+
354
+ if not _supports_background_execution(backend):
355
+ return "Error: 后台执行不可用。"
356
+
357
+ try:
358
+ result = await backend.akill_process(process_id)
359
+ status = result.get("status", "unknown")
360
+
361
+ output_lines = [f"进程终止结果: {status}"]
362
+
363
+ if result.get("output"):
364
+ output = result["output"]
365
+ if len(output) > 1000:
366
+ output = output[:1000] + "\n... [输出已截断]"
367
+ output_lines.append(f"最终输出:\n{output}")
368
+
369
+ return "\n".join(output_lines)
370
+ except Exception as e:
371
+ return f"Error: {type(e).__name__}: {e}"
372
+
373
+ return StructuredTool.from_function(
374
+ name="kill_process",
375
+ description=KILL_PROCESS_DESCRIPTION,
376
+ func=sync_kill_process,
377
+ coroutine=async_kill_process,
378
+ )
379
+
380
+ def wrap_model_call(
381
+ self,
382
+ request: ModelRequest[ContextT],
383
+ handler: Callable[[ModelRequest[ContextT]], ModelResponse[ResponseT]],
384
+ ) -> ModelResponse[ResponseT]:
385
+ """在 model call 前添加工具和系统提示"""
386
+ # 检查 backend 是否支持后台执行
387
+ backend = self._get_backend(request.runtime) # type: ignore
388
+ if not _supports_background_execution(backend):
389
+ # 不支持则直接透传
390
+ return handler(request)
391
+
392
+ # 添加工具
393
+ existing_tool_names = {
394
+ tool.name if hasattr(tool, "name") else tool.get("name")
395
+ for tool in request.tools
396
+ }
397
+
398
+ new_tools = list(request.tools)
399
+ for tool in self.tools:
400
+ tool_name = tool.name if hasattr(tool, "name") else tool.get("name")
401
+ if tool_name not in existing_tool_names:
402
+ new_tools.append(tool)
403
+
404
+ request = request.override(tools=new_tools)
405
+
406
+ # 添加系统提示
407
+ from deepagents.middleware._utils import append_to_system_message
408
+ new_system_message = append_to_system_message(
409
+ request.system_message,
410
+ BACKGROUND_EXECUTION_SYSTEM_PROMPT
411
+ )
412
+ request = request.override(system_message=new_system_message)
413
+
414
+ return handler(request)
415
+
416
+ async def awrap_model_call(
417
+ self,
418
+ request: ModelRequest[ContextT],
419
+ handler: Callable[[ModelRequest[ContextT]], Awaitable[ModelResponse[ResponseT]]],
420
+ ) -> ModelResponse[ResponseT]:
421
+ """(async) 在 model call 前添加工具和系统提示"""
422
+ # 检查 backend 是否支持后台执行
423
+ backend = self._get_backend(request.runtime) # type: ignore
424
+ if not _supports_background_execution(backend):
425
+ return await handler(request)
426
+
427
+ # 添加工具
428
+ existing_tool_names = {
429
+ tool.name if hasattr(tool, "name") else tool.get("name")
430
+ for tool in request.tools
431
+ }
432
+
433
+ new_tools = list(request.tools)
434
+ for tool in self.tools:
435
+ tool_name = tool.name if hasattr(tool, "name") else tool.get("name")
436
+ if tool_name not in existing_tool_names:
437
+ new_tools.append(tool)
438
+
439
+ request = request.override(tools=new_tools)
440
+
441
+ # 添加系统提示
442
+ from deepagents.middleware._utils import append_to_system_message
443
+ new_system_message = append_to_system_message(
444
+ request.system_message,
445
+ BACKGROUND_EXECUTION_SYSTEM_PROMPT
446
+ )
447
+ request = request.override(system_message=new_system_message)
448
+
449
+ return await handler(request)