sycommon-python-lib 0.2.1b4__tar.gz → 0.2.1b5__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 (202) hide show
  1. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/PKG-INFO +13 -13
  2. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/pyproject.toml +14 -13
  3. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/cli.py +138 -11
  4. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/core/models.py +17 -1
  5. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/core/project.py +83 -22
  6. sycommon_python_lib-0.2.1b5/src/sycli/__init__.py +3 -0
  7. sycommon_python_lib-0.2.1b5/src/sycli/__main__.py +6 -0
  8. sycommon_python_lib-0.2.1b5/src/sycli/agents/__init__.py +1 -0
  9. sycommon_python_lib-0.2.1b5/src/sycli/agents/factory.py +245 -0
  10. sycommon_python_lib-0.2.1b5/src/sycli/agents/prompts.py +381 -0
  11. sycommon_python_lib-0.2.1b5/src/sycli/cli.py +506 -0
  12. sycommon_python_lib-0.2.1b5/src/sycli/commands/__init__.py +1 -0
  13. sycommon_python_lib-0.2.1b5/src/sycli/commands/chat_cmd.py +283 -0
  14. sycommon_python_lib-0.2.1b5/src/sycli/commands/create_cmd.py +122 -0
  15. sycommon_python_lib-0.2.1b5/src/sycli/commands/evaluate_cmd.py +180 -0
  16. sycommon_python_lib-0.2.1b5/src/sycli/commands/init_cmd.py +164 -0
  17. sycommon_python_lib-0.2.1b5/src/sycli/commands/memory_cmd.py +168 -0
  18. sycommon_python_lib-0.2.1b5/src/sycli/commands/resume_cmd.py +127 -0
  19. sycommon_python_lib-0.2.1b5/src/sycli/commands/rollback_cmd.py +52 -0
  20. sycommon_python_lib-0.2.1b5/src/sycli/commands/run_cmd.py +112 -0
  21. sycommon_python_lib-0.2.1b5/src/sycli/core/__init__.py +31 -0
  22. sycommon_python_lib-0.2.1b5/src/sycli/core/backend.py +36 -0
  23. sycommon_python_lib-0.2.1b5/src/sycli/core/config.py +4 -0
  24. sycommon_python_lib-0.2.1b5/src/sycli/core/display.py +96 -0
  25. sycommon_python_lib-0.2.1b5/src/sycli/core/git_integration.py +198 -0
  26. sycommon_python_lib-0.2.1b5/src/sycli/core/llm.py +63 -0
  27. sycommon_python_lib-0.2.1b5/src/sycli/core/state.py +40 -0
  28. sycommon_python_lib-0.2.1b5/src/sycli/evaluate/__init__.py +1 -0
  29. sycommon_python_lib-0.2.1b5/src/sycli/evaluate/api_evaluator.py +696 -0
  30. sycommon_python_lib-0.2.1b5/src/sycli/memory/__init__.py +1 -0
  31. sycommon_python_lib-0.2.1b5/src/sycli/memory/compressor.py +134 -0
  32. sycommon_python_lib-0.2.1b5/src/sycli/memory/full.py +74 -0
  33. sycommon_python_lib-0.2.1b5/src/sycli/memory/hot.py +92 -0
  34. sycommon_python_lib-0.2.1b5/src/sycli/memory/manager.py +253 -0
  35. sycommon_python_lib-0.2.1b5/src/sycli/memory/warm.py +85 -0
  36. sycommon_python_lib-0.2.1b5/src/sycli/mode/__init__.py +1 -0
  37. sycommon_python_lib-0.2.1b5/src/sycli/mode/create.py +501 -0
  38. sycommon_python_lib-0.2.1b5/src/sycli/mode/optimize.py +40 -0
  39. sycommon_python_lib-0.2.1b5/src/sycli/models/__init__.py +1 -0
  40. sycommon_python_lib-0.2.1b5/src/sycli/models/config_models.py +204 -0
  41. sycommon_python_lib-0.2.1b5/src/sycli/rl/__init__.py +1 -0
  42. sycommon_python_lib-0.2.1b5/src/sycli/rl/convergence.py +155 -0
  43. sycommon_python_lib-0.2.1b5/src/sycli/rl/diagnosis.py +188 -0
  44. sycommon_python_lib-0.2.1b5/src/sycli/rl/engine.py +1416 -0
  45. sycommon_python_lib-0.2.1b5/src/sycli/rl/environment.py +237 -0
  46. sycommon_python_lib-0.2.1b5/src/sycli/rl/experience.py +203 -0
  47. sycommon_python_lib-0.2.1b5/src/sycli/rl/harness_prompts.py +93 -0
  48. sycommon_python_lib-0.2.1b5/src/sycli/rl/history.py +136 -0
  49. sycommon_python_lib-0.2.1b5/src/sycli/rl/pre_validation.py +106 -0
  50. sycommon_python_lib-0.2.1b5/src/sycli/rl/reward.py +106 -0
  51. sycommon_python_lib-0.2.1b5/src/sycli/rl/strategy_bandit.py +218 -0
  52. sycommon_python_lib-0.2.1b5/src/sycli/rl/strategy_generator.py +201 -0
  53. sycommon_python_lib-0.2.1b5/src/sycli/rl/strategy_prompts.py +93 -0
  54. sycommon_python_lib-0.2.1b5/src/sycli/skills/__init__.py +5 -0
  55. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/__init__.py +1 -1
  56. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/agent_manager.py +97 -50
  57. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/chat_events.py +27 -11
  58. sycommon_python_lib-0.2.1b5/src/sycommon/agent/deep_agent.py +688 -0
  59. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/multi_agent_team.py +196 -146
  60. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/sandbox/__init__.py +4 -0
  61. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/sandbox/file_ops.py +215 -44
  62. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/sandbox/http_sandbox_backend.py +64 -11
  63. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/Config.py +42 -16
  64. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/LLMConfig.py +1 -0
  65. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/database/database_service.py +12 -0
  66. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/embedding.py +65 -68
  67. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/get_llm.py +6 -1
  68. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/llm_with_token_tracking.py +28 -3
  69. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/token_usage_mysql_service.py +238 -268
  70. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/logging/kafka_log.py +24 -8
  71. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/background_execution.py +76 -3
  72. sycommon_python_lib-0.2.1b5/src/sycommon/middleware/mq.py +8 -0
  73. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/sandbox.py +331 -121
  74. sycommon_python_lib-0.2.1b5/src/sycommon/middleware/token_tracking.py +173 -0
  75. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/sandbox.py +47 -0
  76. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/services.py +65 -18
  77. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/sse/sse.py +33 -22
  78. sycommon_python_lib-0.2.1b5/src/sycommon/synacos/nacos_client_base.py +171 -0
  79. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/nacos_config_manager.py +12 -0
  80. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/nacos_heartbeat_manager.py +4 -5
  81. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/nacos_service.py +25 -20
  82. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/nacos_service_discovery.py +19 -1
  83. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/nacos_service_registration.py +0 -7
  84. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon_python_lib.egg-info/PKG-INFO +13 -13
  85. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon_python_lib.egg-info/SOURCES.txt +52 -1
  86. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon_python_lib.egg-info/entry_points.txt +1 -0
  87. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon_python_lib.egg-info/requires.txt +12 -12
  88. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon_python_lib.egg-info/top_level.txt +1 -0
  89. sycommon_python_lib-0.2.1b5/tests/test_sycli.py +880 -0
  90. sycommon_python_lib-0.2.1b4/src/sycommon/agent/deep_agent.py +0 -451
  91. sycommon_python_lib-0.2.1b4/src/sycommon/middleware/mq.py +0 -9
  92. sycommon_python_lib-0.2.1b4/src/sycommon/synacos/nacos_client_base.py +0 -121
  93. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/README.md +0 -0
  94. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/setup.cfg +0 -0
  95. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/__init__.py +0 -0
  96. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/core/__init__.py +0 -0
  97. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/core/console.py +0 -0
  98. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/core/utils.py +0 -0
  99. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/templates/__init__.py +0 -0
  100. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/templates/agent/__init__.py +0 -0
  101. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/templates/base/__init__.py +0 -0
  102. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/command/templates/web/__init__.py +0 -0
  103. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/__init__.py +0 -0
  104. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/sandbox/sandbox_pool.py +0 -0
  105. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/sandbox/sandbox_recovery.py +0 -0
  106. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/agent/sandbox/session.py +0 -0
  107. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/auth/__init__.py +0 -0
  108. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/auth/ldap_service.py +0 -0
  109. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/DatabaseConfig.py +0 -0
  110. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/ElasticsearchConfig.py +0 -0
  111. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/EmbeddingConfig.py +0 -0
  112. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/LangfuseConfig.py +0 -0
  113. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/MQConfig.py +0 -0
  114. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/RedisConfig.py +0 -0
  115. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/RerankerConfig.py +0 -0
  116. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/SentryConfig.py +0 -0
  117. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/XxlJobConfig.py +0 -0
  118. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/config/__init__.py +0 -0
  119. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/database/async_base_db_service.py +0 -0
  120. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/database/async_database_service.py +0 -0
  121. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/database/base_db_service.py +0 -0
  122. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/database/elasticsearch_service.py +0 -0
  123. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/database/redis_service.py +0 -0
  124. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/database/token_usage_db_service.py +0 -0
  125. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/health/__init__.py +0 -0
  126. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/health/health_check.py +0 -0
  127. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/health/metrics.py +0 -0
  128. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/health/ping.py +0 -0
  129. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/heartbeat_process/__init__.py +0 -0
  130. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/heartbeat_process/heartbeat_config.py +0 -0
  131. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/heartbeat_process/heartbeat_process_manager.py +0 -0
  132. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/heartbeat_process/heartbeat_process_worker.py +0 -0
  133. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/__init__.py +0 -0
  134. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/llm_logger.py +0 -0
  135. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/llm_tokens.py +0 -0
  136. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/native_with_fallback_runnable.py +0 -0
  137. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/output_fixing_runnable.py +0 -0
  138. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/struct_token.py +0 -0
  139. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/sy_langfuse.py +0 -0
  140. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/token_usage_es_service.py +0 -0
  141. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/llm/usage_token.py +0 -0
  142. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/logging/__init__.py +0 -0
  143. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/logging/async_sql_logger.py +0 -0
  144. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/logging/logger_levels.py +0 -0
  145. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/logging/logger_wrapper.py +0 -0
  146. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/logging/process_logger.py +0 -0
  147. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/logging/sql_logger.py +0 -0
  148. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/__init__.py +0 -0
  149. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/context.py +0 -0
  150. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/cors.py +0 -0
  151. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/docs.py +0 -0
  152. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/exception.py +0 -0
  153. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/middleware.py +0 -0
  154. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/monitor_memory.py +0 -0
  155. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/timeout.py +0 -0
  156. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/middleware/traceid.py +0 -0
  157. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/__init__.py +0 -0
  158. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/base_http.py +0 -0
  159. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/log.py +0 -0
  160. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/mqlistener_config.py +0 -0
  161. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/mqmsg_model.py +0 -0
  162. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/mqsend_config.py +0 -0
  163. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/sso_user.py +0 -0
  164. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/token_usage.py +0 -0
  165. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/token_usage_mysql.py +0 -0
  166. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/models/xxljob_handler_config.py +0 -0
  167. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/notice/__init__.py +0 -0
  168. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/notice/uvicorn_monitor.py +0 -0
  169. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/rabbitmq/process_pool_consumer.py +0 -0
  170. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/rabbitmq/rabbitmq_client.py +0 -0
  171. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/rabbitmq/rabbitmq_pool.py +0 -0
  172. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/rabbitmq/rabbitmq_service.py +0 -0
  173. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/rabbitmq/rabbitmq_service_client_manager.py +0 -0
  174. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/rabbitmq/rabbitmq_service_connection_monitor.py +0 -0
  175. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/rabbitmq/rabbitmq_service_consumer_manager.py +0 -0
  176. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/rabbitmq/rabbitmq_service_core.py +0 -0
  177. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/rabbitmq/rabbitmq_service_producer_manager.py +0 -0
  178. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/sentry/__init__.py +0 -0
  179. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/sentry/sy_sentry.py +0 -0
  180. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/sse/__init__.py +0 -0
  181. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/sse/event.py +0 -0
  182. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/__init__.py +0 -0
  183. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/example.py +0 -0
  184. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/example2.py +0 -0
  185. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/feign.py +0 -0
  186. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/feign_client.py +0 -0
  187. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/synacos/param.py +0 -0
  188. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tests/deep_agent_server.py +0 -0
  189. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tests/test_deep_agent.py +0 -0
  190. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tests/test_email.py +0 -0
  191. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tests/test_mq.py +0 -0
  192. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tools/__init__.py +0 -0
  193. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tools/async_utils.py +0 -0
  194. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tools/docs.py +0 -0
  195. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tools/env.py +0 -0
  196. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tools/merge_headers.py +0 -0
  197. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tools/snowflake.py +0 -0
  198. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tools/syemail.py +0 -0
  199. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/tools/timing.py +0 -0
  200. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/xxljob/__init__.py +0 -0
  201. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon/xxljob/xxljob_service.py +0 -0
  202. {sycommon_python_lib-0.2.1b4 → sycommon_python_lib-0.2.1b5}/src/sycommon_python_lib.egg-info/dependency_links.txt +0 -0
@@ -1,41 +1,41 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sycommon-python-lib
3
- Version: 0.2.1b4
3
+ Version: 0.2.1b5
4
4
  Summary: Add your description here
5
5
  Requires-Python: >=3.11
6
6
  Description-Content-Type: text/markdown
7
7
  Requires-Dist: aio-pika>=9.6.2
8
- Requires-Dist: aiohttp>=3.13.3
8
+ Requires-Dist: aiohttp>=3.13.5
9
9
  Requires-Dist: aiomysql>=0.3.2
10
10
  Requires-Dist: anyio>=4.12.1
11
11
  Requires-Dist: decorator>=5.2.1
12
- Requires-Dist: deepagents>=0.5.0a2
12
+ Requires-Dist: deepagents>=0.5.1
13
13
  Requires-Dist: elasticsearch>=9.3.0
14
- Requires-Dist: fastapi>=0.135.1
14
+ Requires-Dist: fastapi>=0.135.3
15
15
  Requires-Dist: jinja2>=3.1.6
16
- Requires-Dist: kafka-python>=2.3.0
17
- Requires-Dist: langchain>=1.2.13
18
- Requires-Dist: langchain-core>=1.2.20
16
+ Requires-Dist: kafka-python>=2.3.1
17
+ Requires-Dist: langchain>=1.2.15
18
+ Requires-Dist: langchain-core>=1.2.28
19
19
  Requires-Dist: langchain-openai>=1.1.11
20
- Requires-Dist: langfuse>=4.0.1
21
- Requires-Dist: langgraph>=1.1.3
20
+ Requires-Dist: langfuse>=4.1.0
21
+ Requires-Dist: langgraph>=1.1.6
22
22
  Requires-Dist: langgraph-checkpoint-redis>=0.4.0
23
23
  Requires-Dist: ldap3>=2.9.1
24
24
  Requires-Dist: loguru>=0.7.3
25
25
  Requires-Dist: mysql-connector-python>=9.6.0
26
- Requires-Dist: nacos-sdk-python<3.0,>=2.0.9
26
+ Requires-Dist: nacos-sdk-python<3.0,>=2.0.11
27
27
  Requires-Dist: psutil>=7.2.2
28
28
  Requires-Dist: pyxxl>=0.4.6
29
29
  Requires-Dist: pydantic>=2.12.5
30
30
  Requires-Dist: python-dotenv>=1.2.2
31
- Requires-Dist: python-multipart>=0.0.22
31
+ Requires-Dist: python-multipart>=0.0.24
32
32
  Requires-Dist: pyyaml>=6.0.3
33
33
  Requires-Dist: redis>=7.3.0
34
- Requires-Dist: sentry-sdk[fastapi]>=2.55.0
34
+ Requires-Dist: sentry-sdk[fastapi]>=2.57.0
35
35
  Requires-Dist: sqlalchemy[asyncio]>=2.0.48
36
36
  Requires-Dist: starlette[full]>=1.0.0
37
37
  Requires-Dist: tiktoken>=0.12.0
38
- Requires-Dist: uvicorn>=0.42.0
38
+ Requires-Dist: uvicorn>=0.44.0
39
39
  Requires-Dist: wecom-aibot-python-sdk>=1.0.2
40
40
 
41
41
  # sycommon-python-lib
@@ -1,42 +1,42 @@
1
1
  [project]
2
2
  name = "sycommon-python-lib"
3
- version = "0.2.1b4"
3
+ version = "0.2.1b5"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  dependencies = [
8
8
  "aio-pika>=9.6.2",
9
- "aiohttp>=3.13.3",
9
+ "aiohttp>=3.13.5",
10
10
  "aiomysql>=0.3.2",
11
11
  "anyio>=4.12.1",
12
12
  "decorator>=5.2.1",
13
- "deepagents>=0.5.0a2",
13
+ "deepagents>=0.5.1",
14
14
  "elasticsearch>=9.3.0",
15
- "fastapi>=0.135.1",
15
+ "fastapi>=0.135.3",
16
16
  "jinja2>=3.1.6",
17
- "kafka-python>=2.3.0",
18
- "langchain>=1.2.13",
19
- "langchain-core>=1.2.20",
17
+ "kafka-python>=2.3.1",
18
+ "langchain>=1.2.15",
19
+ "langchain-core>=1.2.28",
20
20
  "langchain-openai>=1.1.11",
21
- "langfuse>=4.0.1",
22
- "langgraph>=1.1.3",
21
+ "langfuse>=4.1.0",
22
+ "langgraph>=1.1.6",
23
23
  "langgraph-checkpoint-redis>=0.4.0",
24
24
  "ldap3>=2.9.1",
25
25
  "loguru>=0.7.3",
26
26
  "mysql-connector-python>=9.6.0",
27
- "nacos-sdk-python>=2.0.9,<3.0",
27
+ "nacos-sdk-python>=2.0.11,<3.0",
28
28
  "psutil>=7.2.2",
29
29
  "pyxxl>=0.4.6",
30
30
  "pydantic>=2.12.5",
31
31
  "python-dotenv>=1.2.2",
32
- "python-multipart>=0.0.22",
32
+ "python-multipart>=0.0.24",
33
33
  "pyyaml>=6.0.3",
34
34
  "redis>=7.3.0",
35
- "sentry-sdk[fastapi]>=2.55.0",
35
+ "sentry-sdk[fastapi]>=2.57.0",
36
36
  "sqlalchemy[asyncio]>=2.0.48",
37
37
  "starlette[full]>=1.0.0",
38
38
  "tiktoken>=0.12.0",
39
- "uvicorn>=0.42.0",
39
+ "uvicorn>=0.44.0",
40
40
  "wecom-aibot-python-sdk>=1.0.2",
41
41
  ]
42
42
 
@@ -49,3 +49,4 @@ build-backend = "setuptools.build_meta"
49
49
 
50
50
  [project.scripts]
51
51
  sycommon = "command.cli:main"
52
+ sycli = "sycli.cli:main"
@@ -5,12 +5,15 @@ Usage:
5
5
  sycommon init web my_project # 交互式创建Web项目
6
6
  sycommon init agent my_project # 交互式创建Agent项目
7
7
  sycommon init web my_project --with-db # 命令行指定功能
8
- sycommon version # 显示版本
8
+ sycommon init agent my_project --port 9090
9
9
  sycommon doctor # 项目健康检查
10
+ sycommon list # 查看可用模板
11
+ sycommon version # 显示版本
10
12
  """
11
13
  import argparse
12
14
  import sys
13
15
  from importlib.metadata import version, PackageNotFoundError
16
+ from importlib.resources import files
14
17
 
15
18
  from .core.models import FeatureOptions
16
19
  from .core.project import init_project
@@ -39,6 +42,7 @@ def create_init_parser(subparsers) -> None:
39
42
  sycommon init web my_project --dry-run # 预览将要创建的文件
40
43
  sycommon init web my_project --force # 强制覆盖已存在的目录
41
44
  sycommon init web my_project -q # 静默模式(使用默认配置)
45
+ sycommon init agent my_project --port 9090
42
46
  sycommon init web my_project --with-db --with-mq --with-redis --with-es
43
47
 
44
48
  项目类型说明:
@@ -48,9 +52,10 @@ def create_init_parser(subparsers) -> None:
48
52
  Agent 项目结构:
49
53
  agent/ - Agent 核心 (main_agent, nodes, states, enums)
50
54
  api/sse/ - SSE 流式接口
55
+ api/query.py - 查询接口
51
56
  tools/ - 工具函数 (含 MQ 处理)
52
57
  db/ - 数据库服务
53
- model/ - 数据模型
58
+ model/ - 数据模型 (含 parse.py 请求模型)
54
59
 
55
60
  Web 项目结构:
56
61
  api/ - API 接口 (含 SSE)
@@ -116,6 +121,8 @@ Web 项目结构:
116
121
  "-q", "--quiet", action="store_true", help="静默模式")
117
122
  behavior_group.add_argument(
118
123
  "-v", "--verbose", action="store_true", help="详细输出")
124
+ behavior_group.add_argument(
125
+ "--port", type=int, default=8080, help="服务端口 (默认: 8080)")
119
126
 
120
127
 
121
128
  def handle_init_command(args) -> bool:
@@ -126,7 +133,29 @@ def handle_init_command(args) -> bool:
126
133
  args.no_nacos, args.no_kafka, args.no_llm, args.no_sentry
127
134
  ])
128
135
 
129
- if use_cli_mode or args.quiet:
136
+ # 静默模式使用项目类型推荐默认值
137
+ if args.quiet:
138
+ features = FeatureOptions.defaults_for(args.project_type)
139
+ # 覆盖命令行明确指定的选项
140
+ if args.with_db:
141
+ features.database = True
142
+ if args.with_mq:
143
+ features.rabbitmq = True
144
+ if args.with_sse:
145
+ features.sse = True
146
+ if args.with_redis:
147
+ features.redis = True
148
+ if args.with_es:
149
+ features.elasticsearch = True
150
+ if args.no_nacos:
151
+ features.nacos = False
152
+ if args.no_kafka:
153
+ features.kafka_log = False
154
+ if args.no_llm:
155
+ features.llm = False
156
+ if args.no_sentry:
157
+ features.sentry = False
158
+ elif use_cli_mode:
130
159
  features = FeatureOptions(
131
160
  database=args.with_db,
132
161
  rabbitmq=args.with_mq,
@@ -149,7 +178,8 @@ def handle_init_command(args) -> bool:
149
178
  features=features,
150
179
  dry_run=args.dry_run,
151
180
  force=args.force,
152
- verbose=verbose
181
+ verbose=verbose,
182
+ port=args.port,
153
183
  )
154
184
 
155
185
 
@@ -164,11 +194,12 @@ def create_doctor_parser(subparsers) -> None:
164
194
  sycommon doctor # 检查当前目录
165
195
  sycommon doctor /path/to/project # 检查指定目录
166
196
 
167
- 检查项目:
197
+ 检查项:
198
+ - 项目类型检测 (web / agent)
199
+ - 必要文件和目录完整性
168
200
  - 依赖安装状态
169
201
  - 配置文件完整性
170
- - 环境变量配置
171
- - 代码规范检查
202
+ - Python 版本
172
203
  """
173
204
  )
174
205
  doctor_parser.add_argument(
@@ -184,6 +215,17 @@ def create_doctor_parser(subparsers) -> None:
184
215
  )
185
216
 
186
217
 
218
+ def _detect_project_type(project_path) -> str | None:
219
+ """检测项目类型"""
220
+ from pathlib import Path
221
+ if (project_path / "agent" / "main_agent.py").exists() or \
222
+ (project_path / "agent" / "enums").is_dir():
223
+ return "agent"
224
+ if (project_path / "api").is_dir():
225
+ return "web"
226
+ return None
227
+
228
+
187
229
  def handle_doctor_command(args) -> bool:
188
230
  """处理 doctor 命令"""
189
231
  from pathlib import Path
@@ -197,6 +239,13 @@ def handle_doctor_command(args) -> bool:
197
239
  issues = []
198
240
  warnings = []
199
241
 
242
+ # 0. 检测项目类型
243
+ project_type = _detect_project_type(project_path)
244
+ if project_type:
245
+ print_success(f"项目类型: {project_type}")
246
+ else:
247
+ warnings.append("无法识别项目类型 (非 web / agent 标准结构)")
248
+
200
249
  # 1. 检查必要文件
201
250
  required_files = ["app.py", "requirements.txt"]
202
251
  for file in required_files:
@@ -209,10 +258,29 @@ def handle_doctor_command(args) -> bool:
209
258
  if not (project_path / file).exists():
210
259
  warnings.append(f"缺少配置文件: {file}")
211
260
 
212
- # 3. 检查目录结构
213
- recommended_dirs = ["api", "model", "tools", "client"]
214
- for dir_name in recommended_dirs:
215
- if not (project_path / dir_name).exists():
261
+ # 3. 根据项目类型检查目录结构
262
+ if project_type == "agent":
263
+ required_dirs = ["agent", "api", "model", "tools"]
264
+ agent_subdirs = ["agent/nodes", "agent/states", "agent/enums"]
265
+ for dir_name in agent_subdirs:
266
+ if not (project_path / dir_name).is_dir():
267
+ warnings.append(f"缺少 Agent 目录: {dir_name}/")
268
+ # 检查 agent 关键文件
269
+ agent_files = [
270
+ "agent/main_agent.py",
271
+ "agent/enums/node_type.py",
272
+ "agent/states/agent_state.py",
273
+ ]
274
+ for file in agent_files:
275
+ if not (project_path / file).exists():
276
+ issues.append(f"缺少 Agent 核心文件: {file}")
277
+ elif project_type == "web":
278
+ required_dirs = ["api", "model", "tools", "client"]
279
+ else:
280
+ required_dirs = ["api", "model", "tools"]
281
+
282
+ for dir_name in required_dirs:
283
+ if not (project_path / dir_name).is_dir():
216
284
  warnings.append(f"缺少推荐目录: {dir_name}/")
217
285
 
218
286
  # 4. 检查 Python 版本
@@ -244,6 +312,8 @@ def handle_doctor_command(args) -> bool:
244
312
  ("uvicorn", "Uvicorn"),
245
313
  ("sycommon", "sycommon-python-lib"),
246
314
  ]
315
+ if project_type == "agent":
316
+ packages.append(("langgraph", "LangGraph"))
247
317
  for module, name in packages:
248
318
  spec = importlib.util.find_spec(module)
249
319
  if spec:
@@ -262,6 +332,59 @@ def handle_doctor_command(args) -> bool:
262
332
  return True
263
333
 
264
334
 
335
+ def handle_list_command(args) -> bool:
336
+ """处理 list 命令 - 显示可用模板"""
337
+ template_root = files("command.templates")
338
+
339
+ print(f"\n{Colors.HEADER}📋 可用项目模板{Colors.ENDC}")
340
+ print("-" * 50)
341
+
342
+ templates = {
343
+ "web": {
344
+ "desc": "标准 FastAPI Web 服务",
345
+ "dirs": ["api/", "api/sse/", "tools/", "model/", "client/"],
346
+ "features": "nacos, kafka_log, llm, sentry (默认启用)",
347
+ },
348
+ "agent": {
349
+ "desc": "AI Agent 服务 (LangGraph 状态图)",
350
+ "dirs": ["agent/", "agent/nodes/", "agent/states/", "agent/enums/",
351
+ "api/sse/", "api/query.py", "tools/", "model/", "db/"],
352
+ "features": "nacos, kafka_log, llm, sentry (默认启用)",
353
+ },
354
+ }
355
+
356
+ for name, info in templates.items():
357
+ print(f"\n{Colors.OKGREEN}{name}{Colors.ENDC} - {info['desc']}")
358
+ print(f" 目录结构:")
359
+ for d in info["dirs"]:
360
+ exists = (template_root / name / d.replace("/", "")).exists() if d.endswith("/") else True
361
+ marker = "✓" if exists else "?"
362
+ print(f" {marker} {d}")
363
+ print(f" 默认功能: {info['features']}")
364
+
365
+ # 列出所有功能选项
366
+ print(f"\n{Colors.HEADER}功能模块{Colors.ENDC}")
367
+ print("-" * 50)
368
+ features = [
369
+ ("database", "MySQL 数据库 (SQLAlchemy)", False),
370
+ ("rabbitmq", "RabbitMQ 消息队列", False),
371
+ ("nacos", "Nacos 服务注册与配置中心", True),
372
+ ("kafka_log", "Kafka 日志收集", True),
373
+ ("sse", "Server-Sent Events 流式响应", False),
374
+ ("llm", "LLM 大模型 (LangChain/LangGraph)", True),
375
+ ("redis", "Redis 缓存服务", False),
376
+ ("elasticsearch", "Elasticsearch 搜索/日志", False),
377
+ ("sentry", "Sentry 错误监控", True),
378
+ ]
379
+ for name, desc, default in features:
380
+ status = "默认启用" if default else "默认禁用"
381
+ flag = f"--with-{name.replace('_', '-')}" if not default else f"--no-{name.replace('_', '-')}"
382
+ print(f" {name:20s} {desc:30s} [{status}] ({flag})")
383
+
384
+ print(f"\n{Colors.OKCYAN}使用 sycommon init <type> <name> 创建项目{Colors.ENDC}")
385
+ return True
386
+
387
+
265
388
  def main() -> None:
266
389
  """CLI 主入口"""
267
390
  parser = argparse.ArgumentParser(
@@ -276,6 +399,7 @@ def main() -> None:
276
399
  create_init_parser(subparsers)
277
400
  create_doctor_parser(subparsers)
278
401
  subparsers.add_parser("version", help="显示版本信息")
402
+ subparsers.add_parser("list", help="显示可用模板和功能模块")
279
403
 
280
404
  try:
281
405
  args = parser.parse_args()
@@ -294,6 +418,9 @@ def main() -> None:
294
418
  if not success:
295
419
  sys.exit(1)
296
420
 
421
+ if args.command == "list":
422
+ handle_list_command(args)
423
+
297
424
  except argparse.ArgumentError as e:
298
425
  print_error(str(e))
299
426
  cmd = args.command if 'args' in locals() and hasattr(args, 'command') else ''
@@ -1,10 +1,19 @@
1
1
  """
2
2
  CLI 数据模型
3
3
  """
4
- from dataclasses import dataclass, field
4
+ from dataclasses import dataclass
5
5
  from typing import Dict
6
6
 
7
7
 
8
+ # Agent 项目默认启用的功能
9
+ AGENT_DEFAULTS = {
10
+ "database": True,
11
+ "rabbitmq": True,
12
+ "sse": True,
13
+ "llm": True,
14
+ }
15
+
16
+
8
17
  @dataclass
9
18
  class FeatureOptions:
10
19
  """功能模块选项"""
@@ -18,6 +27,13 @@ class FeatureOptions:
18
27
  elasticsearch: bool = False # Elasticsearch 日志/Token记录
19
28
  sentry: bool = True # Sentry 错误监控,默认开启
20
29
 
30
+ @classmethod
31
+ def defaults_for(cls, project_type: str) -> "FeatureOptions":
32
+ """根据项目类型返回推荐默认配置"""
33
+ if project_type == "agent":
34
+ return cls(**AGENT_DEFAULTS)
35
+ return cls()
36
+
21
37
  def to_template_vars(self) -> dict:
22
38
  """转换为模板变量"""
23
39
  return {
@@ -17,8 +17,25 @@ from .console import (
17
17
  from .utils import get_all_files_in_directory
18
18
 
19
19
 
20
- def interactive_feature_selection() -> FeatureOptions:
21
- """交互式功能选择"""
20
+ def _get_current_user() -> str:
21
+ """获取当前用户名,兼容容器/CI 等无 tty 环境。"""
22
+ try:
23
+ return os.getlogin()
24
+ except OSError:
25
+ # 容器、CI、非交互式 shell 等环境下 os.getlogin() 会失败
26
+ import getpass
27
+ return getpass.getuser() or "unknown"
28
+
29
+
30
+ def interactive_feature_selection(project_type: str = "web") -> FeatureOptions:
31
+ """交互式功能选择
32
+
33
+ 提示默认值从 FeatureOptions 数据类获取,保证 --quiet 模式和
34
+ 交互模式使用完全一致的默认值。
35
+ """
36
+ # 根据项目类型获取推荐默认值
37
+ defaults = FeatureOptions.defaults_for(project_type)
38
+
22
39
  print(f"\n{Colors.HEADER}🔧 功能模块配置{Colors.ENDC}")
23
40
  print("-" * 40)
24
41
 
@@ -35,15 +52,15 @@ def interactive_feature_selection() -> FeatureOptions:
35
52
  print_warning("请输入 y/n")
36
53
 
37
54
  return FeatureOptions(
38
- database=ask_yes_no("启用数据库 (MySQL)?", default=True),
39
- rabbitmq=ask_yes_no("启用 RabbitMQ 消息队列?", default=True),
40
- nacos=ask_yes_no("启用 Nacos 服务注册?", default=True),
41
- kafka_log=ask_yes_no("启用 Kafka 日志?", default=True),
42
- sse=ask_yes_no("启用 SSE 流式响应?", default=True),
43
- llm=ask_yes_no("启用 LLM 大模型支持?", default=True),
44
- redis=ask_yes_no("启用 Redis 缓存?", default=True),
45
- elasticsearch=ask_yes_no("启用 Elasticsearch?", default=True),
46
- sentry=ask_yes_no("启用 Sentry 错误监控?", default=True),
55
+ database=ask_yes_no("启用数据库 (MySQL)?", default=defaults.database),
56
+ rabbitmq=ask_yes_no("启用 RabbitMQ 消息队列?", default=defaults.rabbitmq),
57
+ nacos=ask_yes_no("启用 Nacos 服务注册?", default=defaults.nacos),
58
+ kafka_log=ask_yes_no("启用 Kafka 日志?", default=defaults.kafka_log),
59
+ sse=ask_yes_no("启用 SSE 流式响应?", default=defaults.sse),
60
+ llm=ask_yes_no("启用 LLM 大模型支持?", default=defaults.llm),
61
+ redis=ask_yes_no("启用 Redis 缓存?", default=defaults.redis),
62
+ elasticsearch=ask_yes_no("启用 Elasticsearch?", default=defaults.elasticsearch),
63
+ sentry=ask_yes_no("启用 Sentry 错误监控?", default=defaults.sentry),
47
64
  )
48
65
 
49
66
 
@@ -53,7 +70,8 @@ def init_project(
53
70
  features: Optional[FeatureOptions] = None,
54
71
  dry_run: bool = False,
55
72
  force: bool = False,
56
- verbose: bool = True
73
+ verbose: bool = True,
74
+ port: int = 8080
57
75
  ) -> bool:
58
76
  """
59
77
  初始化项目,自动读取模板文件并替换占位符
@@ -65,6 +83,7 @@ def init_project(
65
83
  dry_run: 仅预览,不实际创建文件
66
84
  force: 强制覆盖已存在的目录
67
85
  verbose: 显示详细输出
86
+ port: 服务端口
68
87
 
69
88
  Returns:
70
89
  是否成功
@@ -85,7 +104,7 @@ def init_project(
85
104
  # 交互式功能选择
86
105
  if features is None:
87
106
  try:
88
- features = interactive_feature_selection()
107
+ features = interactive_feature_selection(project_type)
89
108
  except KeyboardInterrupt:
90
109
  print("\n")
91
110
  print_info("操作已取消")
@@ -100,26 +119,65 @@ def init_project(
100
119
  # 处理项目名称
101
120
  short_project_name = project_name.replace("shengye-platform-", "")
102
121
  short_project_name_upper = short_project_name.upper()
122
+ # 生成合法的 Python 标识符(用于类名、变量名)
123
+ # "goodsprice-parse" -> "GoodspriceParse", "GOODSPRICE_PARSE"
124
+ safe_identifier = re.sub(r'[^a-zA-Z0-9]', '_', short_project_name)
125
+ safe_class_name = "".join(part.capitalize() for part in safe_identifier.split("_") if part)
126
+ safe_upper_name = safe_identifier.upper()
127
+
103
128
 
104
129
  # 定义模板变量
105
130
  context = {
106
131
  "project_name": project_name,
107
132
  "short_project_name": short_project_name,
108
133
  "short_project_name_upper": short_project_name_upper,
134
+ "safe_class_name": safe_class_name,
135
+ "safe_upper_name": safe_upper_name,
136
+ "safe_identifier": safe_identifier,
109
137
  "project_type": project_type,
110
138
  "create_time": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
111
- "author": os.getlogin(),
112
- "default_port": 8080,
139
+ "author": _get_current_user(),
140
+ "default_port": port,
113
141
  }
114
142
  context.update(features.to_template_vars())
115
143
 
144
+ # 文件过滤:跳过不需要的模块
145
+ feature_map = {
146
+ 'feature_rabbitmq': [
147
+ 'tools/mq.py', 'tools/mq.py.tpl',
148
+ ],
149
+ 'feature_sse': [
150
+ 'api/sse/', 'sse/',
151
+ ],
152
+ 'feature_database': [
153
+ 'db/', 'db/service.py', 'db/model/', 'db/model/entity.py',
154
+ ],
155
+ }
156
+ disabled_features = {
157
+ key for key, flag_val in features.to_template_vars().items()
158
+ if flag_val == 'false' and key in feature_map
159
+ }
160
+
161
+ def _should_skip(rel_path: str) -> bool:
162
+ """检查文件是否因功能关闭而应跳过"""
163
+ for feat_key in disabled_features:
164
+ for pattern in feature_map[feat_key]:
165
+ if pattern in rel_path:
166
+ return True
167
+ return False
168
+
116
169
  # 获取模板文件
117
170
  base_dir = template_root / "base"
118
171
  type_dir = template_root / project_type
119
172
 
120
173
  base_files = get_all_files_in_directory(base_dir)
121
174
  type_specific_files = get_all_files_in_directory(type_dir)
122
- file_mappings = base_files + type_specific_files
175
+
176
+ # 过滤掉不需要的文件
177
+ file_mappings = []
178
+ for abs_path, rel_path in base_files + type_specific_files:
179
+ if not _should_skip(rel_path):
180
+ file_mappings.append((abs_path, rel_path))
123
181
 
124
182
  # Dry run 模式
125
183
  if dry_run:
@@ -197,12 +255,13 @@ def _render_files(
197
255
  pattern = re.compile(rf'{{\s*{re.escape(key)}\s*}}')
198
256
  rendered_content = pattern.sub(str(value), rendered_content)
199
257
 
200
- # 清理引号
201
- rendered_content = re.sub(
202
- r'(\w+)\s*:\s*["\']([^"\']+)["\']',
203
- r'\1: \2',
204
- rendered_content
205
- )
258
+ # 清理引号(仅对 .py 文件,避免破坏 YAML/JSON/Dockerfile 等格式)
259
+ if target_rel_path.endswith('.py') or target_rel_path.endswith('.py.tpl'):
260
+ rendered_content = re.sub(
261
+ r'(\w+)\s*:\s*["\']([^"\']+)["\']',
262
+ r'\1: \2',
263
+ rendered_content
264
+ )
206
265
 
207
266
  # 处理文件后缀
208
267
  if target_rel_path.endswith('.tpl'):
@@ -234,5 +293,7 @@ def _print_success_message(
234
293
  print()
235
294
  print_info("下一步操作:")
236
295
  print(f" cd {project_name}")
296
+ print(f" # 建议先创建虚拟环境")
297
+ print(f" python -m venv .venv && source .venv/bin/activate")
237
298
  print(f" pip install -r requirements.txt")
238
299
  print(f" python app.py")
@@ -0,0 +1,3 @@
1
+ """sycli - RL-based multi-agent code optimization CLI."""
2
+
3
+ __version__ = "0.1.0"
@@ -0,0 +1,6 @@
1
+ """Allow running sycli as `python -m sycli`."""
2
+
3
+ from sycli.cli import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -0,0 +1 @@
1
+ """Agent factory for sycli."""