springbootAI 2.0.2__tar.gz → 2.1.0__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 (284) hide show
  1. springbootai-2.1.0/CHANGELOG.md +37 -0
  2. {springbootai-2.0.2 → springbootai-2.1.0}/MANIFEST.in +5 -0
  3. {springbootai-2.0.2/springbootAI.egg-info → springbootai-2.1.0}/PKG-INFO +200 -60
  4. {springbootai-2.0.2 → springbootai-2.1.0}/README.md +184 -57
  5. springbootai-2.1.0/SECURITY.md +27 -0
  6. {springbootai-2.0.2 → springbootai-2.1.0}/pyproject.toml +29 -3
  7. springbootai-2.1.0/requirements-ai.txt +49 -0
  8. springbootai-2.1.0/requirements-langgraph.txt +4 -0
  9. springbootai-2.1.0/requirements-mcp.txt +3 -0
  10. {springbootai-2.0.2 → springbootai-2.1.0}/requirements.txt +2 -1
  11. {springbootai-2.0.2 → springbootai-2.1.0}/spring/__init__.py +1 -1
  12. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/__init__.py +8 -3
  13. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/tools.py +112 -19
  14. {springbootai-2.0.2 → springbootai-2.1.0}/spring/annotations/__init__.py +28 -0
  15. springbootai-2.1.0/spring/annotations/langchain.py +225 -0
  16. springbootai-2.1.0/spring/annotations/langgraph.py +174 -0
  17. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/discovery.py +6 -1
  18. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/seata.py +39 -2
  19. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/seata_bridge.py +2 -1
  20. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/transaction_store.py +7 -6
  21. {springbootai-2.0.2 → springbootai-2.1.0}/spring/config/config_loader.py +4 -1
  22. {springbootai-2.0.2 → springbootai-2.1.0}/spring/csv/__init__.py +1 -1
  23. {springbootai-2.0.2 → springbootai-2.1.0}/spring/data/__init__.py +1 -1
  24. {springbootai-2.0.2 → springbootai-2.1.0}/spring/data/repository.py +17 -15
  25. {springbootai-2.0.2 → springbootai-2.1.0}/spring/datasource/__init__.py +1 -1
  26. {springbootai-2.0.2 → springbootai-2.1.0}/spring/excel/__init__.py +1 -1
  27. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/__init__.py +1 -1
  28. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/__init__.py +11 -1
  29. springbootai-2.1.0/spring/langchain/annotations.py +9 -0
  30. springbootai-2.1.0/spring/langgraph/__init__.py +48 -0
  31. springbootai-2.1.0/spring/langgraph/annotation_runtime.py +150 -0
  32. springbootai-2.1.0/spring/langgraph/annotations.py +11 -0
  33. springbootai-2.1.0/spring/langgraph/autoconfig.py +78 -0
  34. springbootai-2.1.0/spring/langgraph/checkpoint.py +49 -0
  35. springbootai-2.1.0/spring/langgraph/config.py +116 -0
  36. springbootai-2.1.0/spring/langgraph/runtime.py +329 -0
  37. {springbootai-2.0.2 → springbootai-2.1.0}/spring/main.py +3 -3
  38. springbootai-2.1.0/spring/mcp/__init__.py +61 -0
  39. springbootai-2.1.0/spring/mcp/annotation_runtime.py +142 -0
  40. springbootai-2.1.0/spring/mcp/annotations.py +211 -0
  41. springbootai-2.1.0/spring/mcp/autoconfig.py +119 -0
  42. springbootai-2.1.0/spring/mcp/client.py +458 -0
  43. springbootai-2.1.0/spring/mcp/config.py +298 -0
  44. springbootai-2.1.0/spring/mcp/server.py +254 -0
  45. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/ddl_auto.py +8 -7
  46. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/migration.py +10 -8
  47. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/__init__.py +1 -1
  48. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/cache/redis_cache.py +7 -6
  49. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/core/sql_session.py +1 -1
  50. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/dialect/dialect.py +27 -27
  51. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +94 -2
  52. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/pool/connection_pool.py +1 -1
  53. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/version.py +1 -1
  54. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/xml_parser/xml_parser.py +17 -7
  55. {springbootai-2.0.2 → springbootai-2.1.0}/spring/test/__init__.py +1 -1
  56. {springbootai-2.0.2 → springbootai-2.1.0}/spring/tx/__init__.py +1 -1
  57. {springbootai-2.0.2 → springbootai-2.1.0}/spring/utils/banner.py +1 -1
  58. {springbootai-2.0.2 → springbootai-2.1.0}/spring/validation/__init__.py +1 -1
  59. {springbootai-2.0.2 → springbootai-2.1.0}/spring/web/swagger.py +2 -2
  60. {springbootai-2.0.2 → springbootai-2.1.0}/spring/web/web_context.py +1 -1
  61. {springbootai-2.0.2 → springbootai-2.1.0}/spring/websocket/__init__.py +1 -1
  62. {springbootai-2.0.2 → springbootai-2.1.0/springbootAI.egg-info}/PKG-INFO +200 -60
  63. {springbootai-2.0.2 → springbootai-2.1.0}/springbootAI.egg-info/SOURCES.txt +29 -0
  64. {springbootai-2.0.2 → springbootai-2.1.0}/springbootAI.egg-info/requires.txt +12 -0
  65. springbootai-2.1.0/tests/test_ai_comprehensive.py +884 -0
  66. springbootai-2.1.0/tests/test_ai_declarative_annotations.py +219 -0
  67. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_di_config_event_full.py +1 -1
  68. springbootai-2.1.0/tests/test_langchain_comprehensive.py +568 -0
  69. springbootai-2.1.0/tests/test_langgraph_comprehensive.py +867 -0
  70. springbootai-2.1.0/tests/test_langgraph_module.py +154 -0
  71. springbootai-2.1.0/tests/test_mcp_module.py +471 -0
  72. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_seata_bridge.py +2 -0
  73. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_seata_durable_store.py +1 -0
  74. springbootai-2.1.0/tests/test_security_hardening.py +111 -0
  75. {springbootai-2.0.2 → springbootai-2.1.0}/LICENSE +0 -0
  76. {springbootai-2.0.2 → springbootai-2.1.0}/setup.cfg +0 -0
  77. {springbootai-2.0.2 → springbootai-2.1.0}/setup.py +0 -0
  78. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/advisors.py +0 -0
  79. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/annotations.py +0 -0
  80. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/autoconfig.py +0 -0
  81. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/core.py +0 -0
  82. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/etl.py +0 -0
  83. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/memory.py +0 -0
  84. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/observability.py +0 -0
  85. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/providers.py +0 -0
  86. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/resilience.py +0 -0
  87. {springbootai-2.0.2 → springbootai-2.1.0}/spring/ai/vectorstore.py +0 -0
  88. {springbootai-2.0.2 → springbootai-2.1.0}/spring/annotations/cache.py +0 -0
  89. {springbootai-2.0.2 → springbootai-2.1.0}/spring/annotations/cloud.py +0 -0
  90. {springbootai-2.0.2 → springbootai-2.1.0}/spring/annotations/conditional.py +0 -0
  91. {springbootai-2.0.2 → springbootai-2.1.0}/spring/annotations/core.py +0 -0
  92. {springbootai-2.0.2 → springbootai-2.1.0}/spring/annotations/messaging.py +0 -0
  93. {springbootai-2.0.2 → springbootai-2.1.0}/spring/aop/__init__.py +0 -0
  94. {springbootai-2.0.2 → springbootai-2.1.0}/spring/aop/cloud_aop.py +0 -0
  95. {springbootai-2.0.2 → springbootai-2.1.0}/spring/aop/comprehensive_aop.py +0 -0
  96. {springbootai-2.0.2 → springbootai-2.1.0}/spring/aop/method_interceptor.py +0 -0
  97. {springbootai-2.0.2 → springbootai-2.1.0}/spring/aop/proxy_factory.py +0 -0
  98. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/__init__.py +0 -0
  99. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/feign.py +0 -0
  100. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/gateway.py +0 -0
  101. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/load_balancer.py +0 -0
  102. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/sentinel.py +0 -0
  103. {springbootai-2.0.2 → springbootai-2.1.0}/spring/cloud/tracer.py +0 -0
  104. {springbootai-2.0.2 → springbootai-2.1.0}/spring/config/__init__.py +0 -0
  105. {springbootai-2.0.2 → springbootai-2.1.0}/spring/config/binding.py +0 -0
  106. {springbootai-2.0.2 → springbootai-2.1.0}/spring/context/__init__.py +0 -0
  107. {springbootai-2.0.2 → springbootai-2.1.0}/spring/context/application_context.py +0 -0
  108. {springbootai-2.0.2 → springbootai-2.1.0}/spring/context/bean_definition.py +0 -0
  109. {springbootai-2.0.2 → springbootai-2.1.0}/spring/context/bean_factory.py +0 -0
  110. {springbootai-2.0.2 → springbootai-2.1.0}/spring/context/registry.py +0 -0
  111. {springbootai-2.0.2 → springbootai-2.1.0}/spring/context/scanner.py +0 -0
  112. {springbootai-2.0.2 → springbootai-2.1.0}/spring/core/__init__.py +0 -0
  113. {springbootai-2.0.2 → springbootai-2.1.0}/spring/core/graceful_shutdown.py +0 -0
  114. {springbootai-2.0.2 → springbootai-2.1.0}/spring/core/typing_utils.py +0 -0
  115. {springbootai-2.0.2 → springbootai-2.1.0}/spring/csv/annotations.py +0 -0
  116. {springbootai-2.0.2 → springbootai-2.1.0}/spring/csv/converters.py +0 -0
  117. {springbootai-2.0.2 → springbootai-2.1.0}/spring/csv/easy_csv.py +0 -0
  118. {springbootai-2.0.2 → springbootai-2.1.0}/spring/csv/exceptions.py +0 -0
  119. {springbootai-2.0.2 → springbootai-2.1.0}/spring/csv/reader.py +0 -0
  120. {springbootai-2.0.2 → springbootai-2.1.0}/spring/csv/writer.py +0 -0
  121. {springbootai-2.0.2 → springbootai-2.1.0}/spring/data/page.py +0 -0
  122. {springbootai-2.0.2 → springbootai-2.1.0}/spring/data/specification.py +0 -0
  123. {springbootai-2.0.2 → springbootai-2.1.0}/spring/datasource/annotations.py +0 -0
  124. {springbootai-2.0.2 → springbootai-2.1.0}/spring/datasource/context.py +0 -0
  125. {springbootai-2.0.2 → springbootai-2.1.0}/spring/datasource/dynamic.py +0 -0
  126. {springbootai-2.0.2 → springbootai-2.1.0}/spring/event/__init__.py +0 -0
  127. {springbootai-2.0.2 → springbootai-2.1.0}/spring/event/publisher.py +0 -0
  128. {springbootai-2.0.2 → springbootai-2.1.0}/spring/excel/annotations.py +0 -0
  129. {springbootai-2.0.2 → springbootai-2.1.0}/spring/excel/converters.py +0 -0
  130. {springbootai-2.0.2 → springbootai-2.1.0}/spring/excel/easy_excel.py +0 -0
  131. {springbootai-2.0.2 → springbootai-2.1.0}/spring/excel/exceptions.py +0 -0
  132. {springbootai-2.0.2 → springbootai-2.1.0}/spring/excel/reader.py +0 -0
  133. {springbootai-2.0.2 → springbootai-2.1.0}/spring/excel/style.py +0 -0
  134. {springbootai-2.0.2 → springbootai-2.1.0}/spring/excel/writer.py +0 -0
  135. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/accessor.py +0 -0
  136. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/auto_config.py +0 -0
  137. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/holder.py +0 -0
  138. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/locale.py +0 -0
  139. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/locale_resolver.py +0 -0
  140. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/message_source.py +0 -0
  141. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/middleware.py +0 -0
  142. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/properties.py +0 -0
  143. {springbootai-2.0.2 → springbootai-2.1.0}/spring/i18n/sources.py +0 -0
  144. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/adapters.py +0 -0
  145. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/agents/__init__.py +0 -0
  146. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/agents/services.py +0 -0
  147. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/autoconfig.py +0 -0
  148. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/callbacks/__init__.py +0 -0
  149. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/callbacks/handlers.py +0 -0
  150. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/chains/__init__.py +0 -0
  151. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/chains/services.py +0 -0
  152. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/core.py +0 -0
  153. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/indexes/__init__.py +0 -0
  154. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/indexes/index.py +0 -0
  155. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/loaders/__init__.py +0 -0
  156. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/loaders/loaders.py +0 -0
  157. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/memory/__init__.py +0 -0
  158. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/memory/memory.py +0 -0
  159. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/parsers/__init__.py +0 -0
  160. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/parsers/parsers.py +0 -0
  161. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/partners.py +0 -0
  162. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/prompts/__init__.py +0 -0
  163. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/prompts/templates.py +0 -0
  164. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/retrievers/__init__.py +0 -0
  165. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/retrievers/retrievers.py +0 -0
  166. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/tools/__init__.py +0 -0
  167. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/tools/tools.py +0 -0
  168. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/utilities/__init__.py +0 -0
  169. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/utilities/utils.py +0 -0
  170. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/vectorstores/__init__.py +0 -0
  171. {springbootai-2.0.2 → springbootai-2.1.0}/spring/langchain/vectorstores/stores.py +0 -0
  172. {springbootai-2.0.2 → springbootai-2.1.0}/spring/logging/__init__.py +0 -0
  173. {springbootai-2.0.2 → springbootai-2.1.0}/spring/logging/loguru_logger.py +0 -0
  174. {springbootai-2.0.2 → springbootai-2.1.0}/spring/messaging/__init__.py +0 -0
  175. {springbootai-2.0.2 → springbootai-2.1.0}/spring/messaging/rabbitmq.py +0 -0
  176. {springbootai-2.0.2 → springbootai-2.1.0}/spring/monitoring/__init__.py +0 -0
  177. {springbootai-2.0.2 → springbootai-2.1.0}/spring/monitoring/prometheus.py +0 -0
  178. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/__init__.py +0 -0
  179. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/database.py +0 -0
  180. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/mybatis_integration.py +0 -0
  181. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/annotations/__init__.py +0 -0
  182. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/annotations/annotations.py +0 -0
  183. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/cache/__init__.py +0 -0
  184. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/cache/cache.py +0 -0
  185. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
  186. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
  187. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/configuration.py +0 -0
  188. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/core/__init__.py +0 -0
  189. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
  190. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/dialect/__init__.py +0 -0
  191. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
  192. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
  193. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
  194. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/mapper/__init__.py +0 -0
  195. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/mapper/mapper.py +0 -0
  196. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/metrics/__init__.py +0 -0
  197. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/metrics/metrics.py +0 -0
  198. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/pool/__init__.py +0 -0
  199. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/security/__init__.py +0 -0
  200. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/security/access_control.py +0 -0
  201. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/security/password_encoder.py +0 -0
  202. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
  203. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
  204. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/transaction/__init__.py +0 -0
  205. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/transaction/transaction.py +0 -0
  206. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
  207. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
  208. {springbootai-2.0.2 → springbootai-2.1.0}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
  209. {springbootai-2.0.2 → springbootai-2.1.0}/spring/retry/__init__.py +0 -0
  210. {springbootai-2.0.2 → springbootai-2.1.0}/spring/retry/retry_annotations.py +0 -0
  211. {springbootai-2.0.2 → springbootai-2.1.0}/spring/retry/retry_decorator.py +0 -0
  212. {springbootai-2.0.2 → springbootai-2.1.0}/spring/scheduling/__init__.py +0 -0
  213. {springbootai-2.0.2 → springbootai-2.1.0}/spring/scheduling/scheduler.py +0 -0
  214. {springbootai-2.0.2 → springbootai-2.1.0}/spring/security/__init__.py +0 -0
  215. {springbootai-2.0.2 → springbootai-2.1.0}/spring/security/jwt_utils.py +0 -0
  216. {springbootai-2.0.2 → springbootai-2.1.0}/spring/security/replay_protection.py +0 -0
  217. {springbootai-2.0.2 → springbootai-2.1.0}/spring/security/secret_manager.py +0 -0
  218. {springbootai-2.0.2 → springbootai-2.1.0}/spring/security/security_aop.py +0 -0
  219. {springbootai-2.0.2 → springbootai-2.1.0}/spring/security/security_context.py +0 -0
  220. {springbootai-2.0.2 → springbootai-2.1.0}/spring/test/slicing.py +0 -0
  221. {springbootai-2.0.2 → springbootai-2.1.0}/spring/tracing/__init__.py +0 -0
  222. {springbootai-2.0.2 → springbootai-2.1.0}/spring/tracing/skywalking.py +0 -0
  223. {springbootai-2.0.2 → springbootai-2.1.0}/spring/tx/events.py +0 -0
  224. {springbootai-2.0.2 → springbootai-2.1.0}/spring/tx/synchronization.py +0 -0
  225. {springbootai-2.0.2 → springbootai-2.1.0}/spring/utils/__init__.py +0 -0
  226. {springbootai-2.0.2 → springbootai-2.1.0}/spring/utils/bean_utils.py +0 -0
  227. {springbootai-2.0.2 → springbootai-2.1.0}/spring/utils/logger.py +0 -0
  228. {springbootai-2.0.2 → springbootai-2.1.0}/spring/utils/redis_client.py +0 -0
  229. {springbootai-2.0.2 → springbootai-2.1.0}/spring/validation/aop.py +0 -0
  230. {springbootai-2.0.2 → springbootai-2.1.0}/spring/validation/constraints.py +0 -0
  231. {springbootai-2.0.2 → springbootai-2.1.0}/spring/validation/exceptions.py +0 -0
  232. {springbootai-2.0.2 → springbootai-2.1.0}/spring/validation/validator.py +0 -0
  233. {springbootai-2.0.2 → springbootai-2.1.0}/spring/web/__init__.py +0 -0
  234. {springbootai-2.0.2 → springbootai-2.1.0}/spring/web/actuator.py +0 -0
  235. {springbootai-2.0.2 → springbootai-2.1.0}/spring/web/exception_handler.py +0 -0
  236. {springbootai-2.0.2 → springbootai-2.1.0}/spring/web/health.py +0 -0
  237. {springbootai-2.0.2 → springbootai-2.1.0}/spring/web/interceptor.py +0 -0
  238. {springbootai-2.0.2 → springbootai-2.1.0}/spring/web/result.py +0 -0
  239. {springbootai-2.0.2 → springbootai-2.1.0}/spring/websocket/annotations.py +0 -0
  240. {springbootai-2.0.2 → springbootai-2.1.0}/spring/websocket/broker.py +0 -0
  241. {springbootai-2.0.2 → springbootai-2.1.0}/spring/websocket/exceptions.py +0 -0
  242. {springbootai-2.0.2 → springbootai-2.1.0}/spring/websocket/handler.py +0 -0
  243. {springbootai-2.0.2 → springbootai-2.1.0}/spring/websocket/router.py +0 -0
  244. {springbootai-2.0.2 → springbootai-2.1.0}/spring/websocket/session.py +0 -0
  245. {springbootai-2.0.2 → springbootai-2.1.0}/springbootAI.egg-info/dependency_links.txt +0 -0
  246. {springbootai-2.0.2 → springbootai-2.1.0}/springbootAI.egg-info/entry_points.txt +0 -0
  247. {springbootai-2.0.2 → springbootai-2.1.0}/springbootAI.egg-info/top_level.txt +0 -0
  248. {springbootai-2.0.2 → springbootai-2.1.0}/sql/seata_undo_log.sql +0 -0
  249. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_actuator.py +0 -0
  250. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_ai_module.py +0 -0
  251. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_annotation_combinations.py +0 -0
  252. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_annotations_contract.py +0 -0
  253. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_aop_annotations_full.py +0 -0
  254. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_bean_utils.py +0 -0
  255. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_cache_annotations.py +0 -0
  256. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_cloud_embedded_full.py +0 -0
  257. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_component_init_error.py +0 -0
  258. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_conditional_annotations.py +0 -0
  259. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_config_binding.py +0 -0
  260. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_config_fixes_185.py +0 -0
  261. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_connection_resilience.py +0 -0
  262. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_core_annotations_full.py +0 -0
  263. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_csv_module.py +0 -0
  264. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_data_repository.py +0 -0
  265. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_datasource_routing.py +0 -0
  266. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_ddl_auto.py +0 -0
  267. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_excel_module.py +0 -0
  268. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_i18n_module.py +0 -0
  269. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_jpa_version_transient.py +0 -0
  270. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_langchain_ext.py +0 -0
  271. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_langchain_module.py +0 -0
  272. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_logging_config.py +0 -0
  273. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_new_features.py +0 -0
  274. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_orm_pymybatis_full.py +0 -0
  275. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_production_readiness.py +0 -0
  276. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_pymybatis_contract.py +0 -0
  277. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_security.py +0 -0
  278. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_security_full.py +0 -0
  279. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_swagger_module.py +0 -0
  280. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_test_slicing.py +0 -0
  281. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_transactional_events.py +0 -0
  282. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_validation_module.py +0 -0
  283. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_web_annotations_full.py +0 -0
  284. {springbootai-2.0.2 → springbootai-2.1.0}/tests/test_websocket_module.py +0 -0
@@ -0,0 +1,37 @@
1
+ # Changelog
2
+
3
+ 本项目从 `2.1.0` 开始按 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 记录面向使用者的变化,并使用语义化版本号。
4
+
5
+ ## [2.1.0] - 2026-08-12
6
+
7
+ ### 新增
8
+
9
+ - 新增独立 `spring.langgraph` 模块,锁定 `langgraph==1.2.9`,提供状态图、条件路由、人工中断、恢复、流式调用和注解式工作流。
10
+ - 新增官方 SQLite checkpointer 安全工厂;关闭 pickle fallback、限制反序列化类型,并验证连接关闭后重新打开仍能恢复流程。
11
+ - 新增 `spring.mcp` 客户端和服务端,基于官方 MCP Python SDK,支持 Tool、Resource、Prompt 及注解调用。
12
+ - 新增 LangChain 和 LangGraph 注解 API;注解只负责声明,执行继续委托官方框架。
13
+ - 压测新增 AI、LangChain、LangGraph、MCP workload,并纳入 9 小时 mixed 稳定性脚本。
14
+ - CI 新增真实 MySQL、Redis、RabbitMQ、Nacos、Seata TCC 集成测试和依赖停机测试。
15
+
16
+ ### 修复
17
+
18
+ - 同步 Controller 由有界线程池执行,避免阻塞 ASGI 事件循环。
19
+ - Gateway 支持正确的 ASGI 挂载和异步请求体/上游转发。
20
+ - Seata distributed 模式对接真实 Seata Server 与 Java bridge,并通过 TCC prepare/commit/rollback 合同测试。
21
+ - 健康检查会把 Nacos、RabbitMQ 和 Seata 状态纳入总体状态和 readiness。
22
+ - 修复动态 SQL/DDL 的不安全表达式求值、XML 外部实体、Redis pickle 反序列化、动态排序标识符和 callback SSRF 风险。
23
+ - 补齐 `requests`、`defusedxml`、LangGraph SQLite checkpoint 和 MCP 的发布依赖。
24
+
25
+ ### 安全与发布
26
+
27
+ - Bandit 所有中高危发现和四份 `pip-audit` 结果成为强制门禁,不再使用 `|| true` 放行。
28
+ - 发布工作流要求 git tag 与 `pyproject.toml` 版本完全一致,并在上传前执行全量测试、覆盖率、安全审计、wheel 内容和干净安装检查。
29
+ - `langgraph-checkpoint-sqlite` 使用已修复公开漏洞的 `3.1.1`,并启用严格反序列化策略。
30
+
31
+ ### 兼容性提醒
32
+
33
+ - Redis ORM 缓存不再接受 `pickle` 序列化。旧 pickle 缓存应在升级前清理,并改用 JSON。
34
+ - Seata `distributed` 提供真实 TC + TCC 协调,不是 Python AT 数据源代理,不会自动生成 `undo_log`。
35
+ - 内存 LangGraph checkpointer 仅用于测试;多 worker 生产环境必须注入共享存储后端。
36
+
37
+ [2.1.0]: https://github.com/YUCONGGEN/springbootAI/compare/v2.0.2...v2.1.0
@@ -1,6 +1,11 @@
1
1
  include README.md
2
2
  include LICENSE
3
+ include CHANGELOG.md
4
+ include SECURITY.md
3
5
  include requirements.txt
6
+ include requirements-ai.txt
7
+ include requirements-langgraph.txt
8
+ include requirements-mcp.txt
4
9
  include pyproject.toml
5
10
 
6
11
  graft spring
@@ -1,12 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: springbootAI
3
- Version: 2.0.2
4
- Summary: Python版Spring Boot框架,集成PyMyBatis ORM
3
+ Version: 2.1.0
4
+ Summary: Spring-style Python framework with Web, ORM, Cloud and AI integrations
5
5
  Author-email: YuConggen <1516933915@qq.com>
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://github.com/YUCONGGEN/springbootAI
8
8
  Project-URL: Repository, https://github.com/YUCONGGEN/springbootAI.git
9
- Keywords: spring,springboot,mybatis,orm,web,framework,python
9
+ Project-URL: Documentation, https://github.com/YUCONGGEN/springbootAI#readme
10
+ Project-URL: Changelog, https://github.com/YUCONGGEN/springbootAI/blob/master/CHANGELOG.md
11
+ Project-URL: Issues, https://github.com/YUCONGGEN/springbootAI/issues
12
+ Keywords: spring,springboot,mybatis,orm,web,framework,python,ai,langchain,langgraph,mcp
10
13
  Classifier: Development Status :: 4 - Beta
11
14
  Classifier: Intended Audience :: Developers
12
15
  Classifier: Programming Language :: Python :: 3
@@ -31,6 +34,7 @@ Requires-Dist: pyjwt==2.13.0
31
34
  Requires-Dist: pydantic==2.13.4
32
35
  Requires-Dist: requests==2.34.2
33
36
  Requires-Dist: httpx==0.28.1
37
+ Requires-Dist: defusedxml==0.7.1
34
38
  Provides-Extra: mysql
35
39
  Requires-Dist: PyMySQL==1.2.0; extra == "mysql"
36
40
  Provides-Extra: postgresql
@@ -80,6 +84,11 @@ Requires-Dist: langchain-google-vertexai<3,>=2.0.0; extra == "langchain"
80
84
  Requires-Dist: langchain-deepseek<2,>=0.1.0; extra == "langchain"
81
85
  Requires-Dist: langchain-zhipuai<2,>=0.0.1; extra == "langchain"
82
86
  Requires-Dist: langchain-experimental<2,>=0.3.0; extra == "langchain"
87
+ Provides-Extra: langgraph
88
+ Requires-Dist: langgraph==1.2.9; extra == "langgraph"
89
+ Requires-Dist: langgraph-checkpoint-sqlite==3.1.1; extra == "langgraph"
90
+ Provides-Extra: mcp
91
+ Requires-Dist: mcp==2.0.0; extra == "mcp"
83
92
  Provides-Extra: dev
84
93
  Requires-Dist: pytest==9.1.1; extra == "dev"
85
94
  Requires-Dist: pytest-cov==7.1.0; extra == "dev"
@@ -95,6 +104,7 @@ Requires-Dist: nacos-sdk-python==2.0.11; extra == "full"
95
104
  Requires-Dist: prometheus-client==0.26.0; extra == "full"
96
105
  Requires-Dist: loguru==0.7.3; extra == "full"
97
106
  Requires-Dist: sqlglot==27.28.1; extra == "full"
107
+ Requires-Dist: defusedxml==0.7.1; extra == "full"
98
108
  Requires-Dist: requests==2.34.2; extra == "full"
99
109
  Requires-Dist: httpx==0.28.1; extra == "full"
100
110
  Requires-Dist: openpyxl==3.1.5; extra == "full"
@@ -117,82 +127,150 @@ Requires-Dist: langchain-cohere<2,>=0.3.0; extra == "full"
117
127
  Requires-Dist: langchain-google-vertexai<3,>=2.0.0; extra == "full"
118
128
  Requires-Dist: langchain-deepseek<2,>=0.1.0; extra == "full"
119
129
  Requires-Dist: langchain-zhipuai<2,>=0.0.1; extra == "full"
130
+ Requires-Dist: langgraph==1.2.9; extra == "full"
131
+ Requires-Dist: langgraph-checkpoint-sqlite==3.1.1; extra == "full"
132
+ Requires-Dist: mcp==2.0.0; extra == "full"
120
133
  Dynamic: license-file
121
134
 
122
- # SpringBootAI 综合使用指南
135
+ # SpringBootAI
123
136
 
124
- > **🐣 三句话搞懂这是什么**:SpringBootAI 就像一个"网站后台乐高套装"——你想写个网站接口?拼上 `@RestController` 积木。想操作数据库?拼上 `@Mapper` 积木。想加登录验证?拼上 `@Authenticate` 积木。所有的积木都有一套统一的拼法(注解),不需要自己从零搭轮子。它底层跑的是 Python + FastAPI,但写法上借鉴了 Java Spring Boot 的分层思路,让你用 `@Service`、`@Autowired` 这些熟悉的标签来组织代码。
137
+ [![PyPI](https://img.shields.io/pypi/v/springbootAI)](https://pypi.org/project/springbootAI/)
138
+ [![Python](https://img.shields.io/pypi/pyversions/springbootAI)](https://pypi.org/project/springbootAI/)
139
+ [![CI](https://github.com/YUCONGGEN/springbootAI/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/YUCONGGEN/springbootAI/actions/workflows/ci.yml)
140
+ [![Security](https://github.com/YUCONGGEN/springbootAI/actions/workflows/security.yml/badge.svg?branch=master)](https://github.com/YUCONGGEN/springbootAI/actions/workflows/security.yml)
141
+ [![License](https://img.shields.io/pypi/l/springbootAI)](https://github.com/YUCONGGEN/springbootAI/blob/master/LICENSE)
125
142
 
126
- - SpringBootAI 版本:`2.0.0`
127
- - 内嵌 PyMyBatis 版本:`1.4.0`
128
- - Python:3.10+
129
- - 仓库:[GitHub - YUCONGGEN/springbootAI](https://github.com/YUCONGGEN/springbootAI)
130
- - License:MIT
143
+ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用框架。你使用 Python 编写 `@RestController`、`@Service`、`@Mapper` 和 `@Autowired`,框架负责组件扫描、依赖注入、Web 路由、事务切面及生命周期;Web 运行时建立在 FastAPI/Starlette/Uvicorn 之上。
131
144
 
132
- ---
145
+ 它不是 Java Spring Boot 的 Python 绑定,也不是 Spring 官方项目。它适合熟悉 Controller/Service/Mapper 分层的团队,用统一写法开发 Web API、内部管理系统、数据服务和 AI 应用。
146
+
147
+ | 能力 | 解决什么问题 | 底层复用 |
148
+ |---|---|---|
149
+ | Web 与 IoC | 路由、参数绑定、组件扫描、依赖注入 | FastAPI / Starlette / Uvicorn |
150
+ | 数据与中间件 | PyMyBatis、事务、缓存、RabbitMQ、Nacos、Feign | DBUtils / Redis / pika / Nacos SDK / requests |
151
+ | AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
152
+ | 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
133
153
 
134
- ## 🚀 10 分钟快速体验
154
+ 当前版本是 `2.1.0`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 当前验证的是官方 TC + TCC 回调,不会为 Python 数据库操作自动生成 AT `undo_log`。
135
155
 
136
- 想在 10 分钟内跑通第一个接口?按以下步骤来:
156
+ [新手指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | [全部文档](https://github.com/YUCONGGEN/springbootAI/tree/master/doc) | [变更日志](https://github.com/YUCONGGEN/springbootAI/blob/master/CHANGELOG.md) | [安全报告](https://github.com/YUCONGGEN/springbootAI/blob/master/SECURITY.md) | [发布检查](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/RELEASE_CHECKLIST.md)
157
+
158
+ ## 10 分钟跑通第一个接口
159
+
160
+ 以下示例不需要数据库、Redis 或大模型 API Key。先创建项目和虚拟环境:
137
161
 
138
162
  ```powershell
139
- # 1. 创建项目并安装框架(如果还没装过)
140
163
  mkdir my-first-app
141
164
  cd my-first-app
142
165
  python -m venv .venv
143
166
  .\.venv\Scripts\Activate.ps1
167
+ python -m pip install --upgrade pip
144
168
  python -m pip install springbootAI
145
169
 
146
- # 2. 创建目录结构
147
170
  mkdir demo
148
171
  mkdir demo\controller
149
- New-Item -Path "demo\__init__.py" -ItemType File -Force
150
- New-Item -Path "demo\controller\__init__.py" -ItemType File -Force
172
+ New-Item demo\__init__.py -ItemType File
173
+ New-Item demo\controller\__init__.py -ItemType File
174
+ ```
175
+
176
+ Linux/macOS 激活命令是 `source .venv/bin/activate`,其余 Python 命令相同。
177
+
178
+ 创建 `demo/Application.py`:
179
+
180
+ ```python
181
+ from spring.annotations import SpringBootApplication
182
+ from spring.main import run
151
183
 
152
- # 3. 启动应用(先创建以下三份代码文件:demo/Application.py、demo/controller/HelloController.py、demo/application.yml)
184
+
185
+ @SpringBootApplication(scan_base_packages=["demo"])
186
+ class Application:
187
+ pass
188
+
189
+
190
+ if __name__ == "__main__":
191
+ run(Application)
192
+ ```
193
+
194
+ 创建 `demo/controller/HelloController.py`:
195
+
196
+ ```python
197
+ from spring.annotations import GetMapping, RequestMapping, RestController
198
+ from spring.web.swagger import Operation, Tag
199
+
200
+
201
+ @Tag(name="入门接口", description="确认应用已经正常运行")
202
+ @RequestMapping("/api")
203
+ @RestController
204
+ class HelloController:
205
+ @Operation(summary="打招呼")
206
+ @GetMapping("/hello/{name}")
207
+ def hello(self, name: str):
208
+ return {"message": f"Hello, {name}"}
209
+ ```
210
+
211
+ 创建 `demo/application.yml`。这里显式关闭暂时用不到的外部资源,避免新手第一次启动就连接数据库:
212
+
213
+ ```yaml
214
+ server:
215
+ host: 127.0.0.1
216
+ port: 8080
217
+
218
+ database:
219
+ enabled: false
220
+
221
+ redis:
222
+ enabled: false
223
+ ```
224
+
225
+ 在 `demo` 目录的上一层启动:
226
+
227
+ ```powershell
153
228
  python -m demo.Application
154
- # 看到 "Uvicorn running on http://127.0.0.1:8080" 就成功了!
229
+ ```
155
230
 
156
- # 4. 测试(另开一个终端)
231
+ 另开终端验证:
232
+
233
+ ```powershell
157
234
  curl http://127.0.0.1:8080/api/hello/Alice
158
- # 返回:{"code":200,"message":"success","data":{"message":"Hello, Alice"}}
159
235
  ```
160
236
 
161
- > 完整的代码文件内容和详细解释,请看 [新手入门指南](doc/BEGINNER_GUIDE.md) 第 4 节"快速开始"。这份入门指南从安装到验证,每一步都写好了,代码可以直接复制粘贴。
237
+ 返回数据中应包含 `"message":"Hello, Alice"`。浏览器访问 `http://127.0.0.1:8080/docs` 可以看到 Swagger 页面。遇到目录、虚拟环境或启动错误时,按[新手入门指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md)逐步排查。
162
238
 
163
239
  ---
164
240
 
165
241
  ## 模块文档导航
166
242
 
167
- 第一次使用请先读 [新手入门指南](doc/BEGINNER_GUIDE.md)。它从安装开始,带你创建第一个接口,并解释 Controller、Service、Bean、依赖注入和配置文件是什么。各模块文档统一按 **① 这解决什么问题?→ ② 怎么用?(贴代码)→ ③ 怎么验证?** 三步走模式组织,按需查阅即可。
243
+ 第一次使用请先读 [新手入门指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md)。它从安装开始,带你创建第一个接口,并解释 Controller、Service、Bean、依赖注入和配置文件是什么。各模块文档统一按 **① 这解决什么问题?→ ② 怎么用?(贴代码)→ ③ 怎么验证?** 三步走模式组织,按需查阅即可。
168
244
 
169
245
  | 模块 | 文档 | 安装方式 | 一句话说明 |
170
246
  |------|------|----------|-----------|
171
- | ✅ 新手入门 | [BEGINNER_GUIDE.md](doc/BEGINNER_GUIDE.md) | 随核心包 | 从零安装、创建项目、运行接口、打开 Swagger |
172
- | ✅ 常用注解模块 | [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md) | 随核心包 | Bean Validation / 条件装配 / 缓存增强 / CSV / `@Version` / `@Transient` |
173
- | 📦 AI(对接大模型) | [AI_MODULE.md](doc/AI_MODULE.md) | `pip install springbootAI[ai]` | ChatClient / Advisor / Tools / RAG / Function Calling / 多厂商适配 |
174
- | 📦 LangChain | [LANGCHAIN_MODULE.md](doc/LANGCHAIN_MODULE.md) | `pip install springbootAI[langchain]` | Chains / Agents / Memory / Retrievers / VectorStores / 30+ 提供商 |
175
- | 内嵌 PyMyBatis ORM | [ORM_MODULE.md](doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 |
176
- | Cloud 微服务 | [CLOUD_MODULE.md](doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 分布式事务 |
177
- | 📦 Excel 读写 | [EXCEL_MODULE.md](doc/EXCEL_MODULE.md) | `pip install springbootAI[excel]` | `@ExcelProperty` / `@ExcelIgnore` 注解驱动读写 |
178
- | 📦 CSV 读写 | [CSV_MODULE.md](doc/CSV_MODULE.md) | `pip install springbootAI[csv]` | `@CsvProperty` / `@CsvIgnore` 注解驱动读写 |
179
- | Swagger 文档 | [SWAGGER_MODULE.md](doc/SWAGGER_MODULE.md) | 随核心包 | `@Tag` / `@Operation` 注解驱动 API 文档 |
180
- | 八大模块 | [EIGHT_MODULES.md](doc/EIGHT_MODULES.md) | 随核心包 | 分页 / Actuator / 多数据源 / i18n / WebSocket 等 |
181
- | ✅ 安全 | [SECURITY.md](doc/SECURITY.md) | 随核心包 | JWT 生成校验 / 密码加密 / SQL 注入防护 / 访问控制 |
182
- | ✅ BeanUtils | [BEAN_UTILS.md](doc/BEAN_UTILS.md) | 随核心包 | `copy_properties` / `clone` 属性复制工具 |
183
- | AI 与 LangChain 测试 | [AI_LANGCHAIN_TEST_GUIDE.md](doc/AI_LANGCHAIN_TEST_GUIDE.md) | | 162 个测试用例详解 |
184
- | 测试报告 | [TEST_REPORT.md](doc/TEST_REPORT.md) | | 全量测试用例与覆盖范围 |
247
+ | ✅ 新手入门 | [BEGINNER_GUIDE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) | 随核心包 | 从零安装、创建项目、运行接口、打开 Swagger |
248
+ | ✅ 常用注解模块 | [ANNOTATION_MODULES.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ANNOTATION_MODULES.md) | 随核心包 | Bean Validation / 条件装配 / 缓存增强 / CSV / `@Version` / `@Transient` |
249
+ | 📦 AI(对接大模型) | [AI_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_MODULE.md) | `pip install springbootAI[ai]` | ChatClient / Advisor / Tools / RAG / Function Calling / 多厂商适配 |
250
+ | 📦 LangChain | [LANGCHAIN_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGCHAIN_MODULE.md) | `pip install springbootAI[langchain]` | Chains / Agents / Memory / Retrievers / VectorStores / 30+ 提供商 |
251
+ | 📦 LangGraph | [LANGGRAPH_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGGRAPH_MODULE.md) | `pip install springbootAI[langgraph]` | 状态图 / 条件路由 / 人工中断 / 注解式工作流 |
252
+ | 📦 MCP | [MCP_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_MODULE.md) | `pip install springbootAI[mcp]` | MCP Client / Server / Tool / Resource / Prompt / 注解调用 |
253
+ | 内嵌 PyMyBatis ORM | [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 |
254
+ | Cloud 微服务 | [CLOUD_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 分布式事务 |
255
+ | 📦 Excel 读写 | [EXCEL_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/EXCEL_MODULE.md) | `pip install springbootAI[excel]` | `@ExcelProperty` / `@ExcelIgnore` 注解驱动读写 |
256
+ | 📦 CSV 读写 | [CSV_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CSV_MODULE.md) | `pip install springbootAI[csv]` | `@CsvProperty` / `@CsvIgnore` 注解驱动读写 |
257
+ | ✅ Swagger 文档 | [SWAGGER_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SWAGGER_MODULE.md) | 随核心包 | `@Tag` / `@Operation` 注解驱动 API 文档 |
258
+ | ✅ 八大模块 | [EIGHT_MODULES.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/EIGHT_MODULES.md) | 随核心包 | 分页 / Actuator / 多数据源 / i18n / WebSocket 等 |
259
+ | 安全 | [SECURITY.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/SECURITY.md) | 随核心包 | JWT 生成校验 / 密码加密 / SQL 注入防护 / 访问控制 |
260
+ | BeanUtils | [BEAN_UTILS.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEAN_UTILS.md) | 随核心包 | `copy_properties` / `clone` 属性复制工具 |
261
+ | — AI 与 LangChain 测试 | [AI_LANGCHAIN_TEST_GUIDE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_LANGCHAIN_TEST_GUIDE.md) | — | AI 与 LangChain 测试说明 |
262
+ | — 测试报告 | [TEST_REPORT.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_REPORT.md) | — | 全量测试用例与覆盖范围 |
185
263
 
186
264
  > 图例:✅ = 随核心包自带,不需要额外安装 | 📦 = 需要单独安装 extras | — = 参考文档,不是功能模块
187
265
 
188
- 所有模块文档统一存放于 [`doc/`](doc/) 目录。
266
+ 所有模块文档统一存放于 [GitHub `doc/` 目录](https://github.com/YUCONGGEN/springbootAI/tree/master/doc)
189
267
 
190
268
  ### 🎯 新手推荐阅读顺序
191
269
 
192
- 1. 先按 [新手入门指南](doc/BEGINNER_GUIDE.md) 跑通 `/api/hello/{name}`。
270
+ 1. 先按 [新手入门指南](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/BEGINNER_GUIDE.md) 跑通 `/api/hello/{name}`。
193
271
  2. 阅读本页第 4、6、7 章,理解配置、依赖注入和 Controller。
194
- 3. 做数据库 CRUD 时阅读 [ORM_MODULE.md](doc/ORM_MODULE.md)。
195
- 4. 需要输入校验、缓存或条件开关时阅读 [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md)。
272
+ 3. 做数据库 CRUD 时阅读 [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md)。
273
+ 4. 需要输入校验、缓存或条件开关时阅读 [ANNOTATION_MODULES.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ANNOTATION_MODULES.md)。
196
274
  5. 最后再按业务需要选择安全、Cloud、AI、LangChain、Excel、WebSocket 等文档。
197
275
 
198
276
  ---
@@ -236,10 +314,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
236
314
 
237
315
  | 组件 | 当前版本 |
238
316
  |------|----------|
239
- | `spring` 框架 API | 2.0.0 |
240
- | `spring.orm.pymybatis` | 1.4.0 |
241
- | `spring.ai` AI 模块 | 1.3.0 |
242
- | `spring.langchain` LangChain 模块 | 1.0.0 |
317
+ | `spring` 框架 API | 2.1.0 |
318
+ | `spring.orm.pymybatis` | 2.1.0 |
319
+ | `spring.ai` AI 模块 | 2.1.0 |
320
+ | `spring.langchain` LangChain 模块 | 2.1.0 |
243
321
  | Python | 3.10+ |
244
322
 
245
323
  ### 1.4 适合什么场景
@@ -247,16 +325,16 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
247
325
  - 内部管理接口、轻量业务服务、教学和原型验证。
248
326
  - 希望用 Controller/Service/Mapper 分层方式写 Python 的团队。
249
327
  - SQLite 本地工具,或经过目标数据库集成测试的服务。
250
- - 微服务架构(内置服务发现、限流熔断、分布式追踪、分布式事务)。
328
+ - 经过容量和故障验证的微服务组件组合;外部入口和核心事务仍使用专业基础设施。
251
329
 
252
330
  ### 1.5 能力边界(使用前必读)
253
331
 
254
- - 自动化 ORM 测试使用 SQLite;MySQL、PostgreSQL、Oracle 需单独验证。
332
+ - 自动化套件包含真实 MySQL 8 集成测试;PostgreSQL、Oracle 及业务实际版本仍需单独验证。
255
333
  - `@Transactional` 支持七种 Spring 传播模式;`REQUIRES_NEW` 和 `NOT_SUPPORTED` 需要连接池有额外可用连接。
256
- - Profile 会筛选 `@Profile` Bean,但不会自动合并 `application-{profile}.yml`。
334
+ - Profile 会筛选 `@Profile` Bean,并深度合并同目录的 `application-{profile}.yml`。
257
335
  - Nacos、RabbitMQ、Prometheus 依赖外部服务;Sentinel 限流熔断和 OpenTelemetry 追踪可内嵌运行。
258
- - HTTP 事务模式是持久化补偿协调器,不提供 Seata AT 强一致性;生产强一致场景必须使用真实 Seata Server。
259
- - 限流、分布式锁、幂等和缓存语义依赖 Redis 等后端,Redis 不可用时有本地降级路径。
336
+ - HTTP 事务模式是持久化补偿协调器,不提供 Seata AT 一致性;`distributed` 模式当前提供真实 Seata TC + TCC 回调,不会自动代理 Python 数据源或生成 `undo_log`。
337
+ - 限流、分布式锁、幂等和缓存语义依赖 Redis 等后端;核心业务必须选择 fail-closed,不能依赖进程内降级继续提供分布式语义。
260
338
 
261
339
  ### 1.6 注解使用总览
262
340
 
@@ -290,13 +368,15 @@ SpringBootAI 注解会先把元数据放到 `__spring_annotations__`。之后是
290
368
  | Nacos 服务发现 | ✅ 可用 | 服务注册/发现/订阅 |
291
369
  | Sentinel 限流熔断 | ✅ 可用 | 内嵌引擎,QPS 限流、异常比例熔断、热点参数限流,无需 Dashboard |
292
370
  | 分布式追踪 | ✅ 可用 | 原生 OpenTelemetry(W3C traceparent),自动 HTTP/Feign 注入 |
293
- | Seata 分布式事务 | ⚠️ 有边界 | `distributed` 对接真实 Seata SDK;`http` 仅提供持久化补偿,不等同 AT |
371
+ | Seata 分布式事务 | ⚠️ 有边界 | `distributed` 对接真实 Seata TC 并执行 TCC 回调;`http` 仅提供持久化补偿;均不等同 Python AT 数据源代理 |
294
372
  | API Gateway | ✅ 可用 | 轻量 ASGI/WSGI 网关,路由转发、路径重写、过滤器链、负载均衡 |
295
373
  | Prometheus 监控 | ✅ 可用 | Counter/Gauge/Histogram 指标暴露 |
296
374
  | Feign 声明式 HTTP | ✅ 可用 | 声明式接口、Fallback 降级、自动传播 XID 和 trace 头 |
297
375
  | 高级 AOP | ✅ 可用 | 限流、熔断、幂等、审计、锁、指标、追踪、缓存 |
298
376
  | AI 模块 | ✅ 可用 | ChatClient/ChatModel/EmbeddingModel/Advisor/Tools,OpenAI/Ollama/DeepSeek/Moonshot 适配 |
299
377
  | LangChain 模块 | ✅ 可用 | Chains/Agents(6 种)/Memory/Retrievers/VectorStores + 30+ 提供商,双向适配器 |
378
+ | LangGraph 模块 | ✅ 可选 | 官方 LangGraph 状态图、条件路由、人工中断、持久化 checkpointer 和注解工作流 |
379
+ | MCP 模块 | ✅ 可选 | 官方 MCP SDK 的 client/server、Tool/Resource/Prompt 与注解调用 |
300
380
 
301
381
  ---
302
382
 
@@ -304,8 +384,11 @@ SpringBootAI 注解会先把元数据放到 `__spring_annotations__`。之后是
304
384
 
305
385
  ### 3.1 环境准备
306
386
 
307
- ```bash
308
- cd springboot
387
+ 需要 Python 3.10、3.11 或 3.12。先进入你自己的空项目目录,再创建虚拟环境:
388
+
389
+ ```powershell
390
+ mkdir my-springbootai-app
391
+ cd my-springbootai-app
309
392
  python -m venv .venv
310
393
  ```
311
394
 
@@ -323,15 +406,32 @@ source .venv/bin/activate
323
406
 
324
407
  ### 3.2 安装框架
325
408
 
409
+ 普通使用者直接从 PyPI 安装:
410
+
326
411
  ```bash
327
412
  python -m pip install --upgrade pip
328
- python -m pip install -e .
413
+ python -m pip install springbootAI
329
414
  ```
330
415
 
416
+ 只有准备修改框架源码的贡献者,才需要先 `git clone`,进入仓库后执行 `python -m pip install -e .`。
417
+
331
418
  核心依赖包含 FastAPI、Uvicorn、PyYAML、python-dotenv、DBUtils、PyJWT、cryptography、bcrypt 和 Pydantic。**核心安装已包含内嵌 `spring.orm.pymybatis`,使用 Mapper 模式不需要再安装独立 `pymybatis`。**
332
419
 
333
420
  ### 3.3 可选 extras
334
421
 
422
+ 从 PyPI 按需安装:
423
+
424
+ ```bash
425
+ python -m pip install "springbootAI[mysql]"
426
+ python -m pip install "springbootAI[redis,rabbitmq,nacos]"
427
+ python -m pip install "springbootAI[ai]"
428
+ python -m pip install "springbootAI[langchain]"
429
+ python -m pip install "springbootAI[langgraph]"
430
+ python -m pip install "springbootAI[mcp]"
431
+ ```
432
+
433
+ 在源码仓库开发时,对应命令是:
434
+
335
435
  ```bash
336
436
  python -m pip install -e ".[mysql]" # PyMySQL
337
437
  python -m pip install -e ".[postgresql]" # psycopg2-binary
@@ -343,6 +443,9 @@ python -m pip install -e ".[rabbitmq]" # pika
343
443
  python -m pip install -e ".[nacos]" # Nacos 客户端
344
444
  python -m pip install -e ".[prometheus,logging]" # 指标和 loguru
345
445
  python -m pip install -e ".[dev]" # 测试和静态工具
446
+ python -m pip install -e ".[ai]" # Spring AI + LangChain 基础适配
447
+ python -m pip install -e ".[langgraph]" # LangGraph + 官方 SQLite checkpointer
448
+ python -m pip install -e ".[mcp]" # 官方 MCP client/server SDK
346
449
  ```
347
450
 
348
451
  AI 模块为可选依赖:
@@ -915,7 +1018,7 @@ class ScheduledTasks:
915
1018
  | `@GlobalTransactional` | 通过 Seata 管理全局事务 | 受管 Bean 方法调用 Seata manager |
916
1019
  | `@RabbitListener` | 注册 RabbitMQ 消费者 | 可直接装饰受管 Bean 方法 |
917
1020
 
918
- > Cloud 注解完整参数已分离至:[CLOUD_MODULE.md](doc/CLOUD_MODULE.md)。MyBatis 注解已分离至:[ORM_MODULE.md](doc/ORM_MODULE.md)。
1021
+ > Cloud 注解完整参数见 [CLOUD_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/CLOUD_MODULE.md)。MyBatis 注解见 [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md)。
919
1022
 
920
1023
  ### 5.13 注解组合使用与执行顺序
921
1024
 
@@ -1123,7 +1226,7 @@ server:
1123
1226
 
1124
1227
  > 🍽️ **厨房比喻**:数据库就是仓库,Mapper 就是仓库管理员。厨师说要什么食材,管理员去仓库精准取货。你不用自己写繁琐的库存查询,只要告诉管理员"我要用户 ID 为 1 的信息"。
1125
1228
 
1126
- > 本节(Mapper 注解、XML Mapper、分页、SQL 安全、DDL 自动建表等)已分离至:[ORM_MODULE.md](doc/ORM_MODULE.md)。
1229
+ > 本节(Mapper 注解、XML Mapper、分页、SQL 安全、DDL 自动建表等)详细说明见 [ORM_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/ORM_MODULE.md)。
1127
1230
 
1128
1231
  ---
1129
1232
 
@@ -1298,13 +1401,13 @@ class CleanupJob:
1298
1401
 
1299
1402
  ### 12.1 AI 模块(对接大模型)
1300
1403
 
1301
- > 完整文档:[AI_MODULE.md](doc/AI_MODULE.md)。安装:`pip install springbootAI[ai]`。
1404
+ > 完整文档:[AI_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_MODULE.md)。安装:`pip install springbootAI[ai]`。
1302
1405
  >
1303
1406
  > 提供 ChatClient(链式对话)、Advisor(对话顾问)、Tools(工具调用)、RAG(知识库检索增强生成)、Function Calling 等能力。支持 OpenAI / Ollama / DeepSeek / Moonshot 等多家大模型。
1304
1407
 
1305
1408
  ### 12.2 LangChain 模块
1306
1409
 
1307
- > 完整文档:[LANGCHAIN_MODULE.md](doc/LANGCHAIN_MODULE.md)。安装:`pip install springbootAI[langchain]`。
1410
+ > 完整文档:[LANGCHAIN_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGCHAIN_MODULE.md)。安装:`pip install springbootAI[langchain]`。
1308
1411
  >
1309
1412
  > 封装 langchain classic 全套:Chains / Agents(6 种) / Memory / Retrievers / VectorStores / Parsers / Loaders + 30+ 提供商。双向适配器复用 `spring.ai` 的模型 Bean。
1310
1413
 
@@ -1570,7 +1673,7 @@ python -m pytest -q tests
1570
1673
  - JWT access/refresh、生产密钥校验。
1571
1674
  - AI 模块 87 用例,LangChain 模块 75 用例,全量 707 用例 0 失败。
1572
1675
 
1573
- > 详细测试环境、套件覆盖和集成测试结果,见 [TEST_REPORT.md](doc/TEST_REPORT.md)。
1676
+ > 详细测试环境、套件覆盖和集成测试结果,见 [TEST_REPORT.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/TEST_REPORT.md)。
1574
1677
 
1575
1678
  ---
1576
1679
 
@@ -1633,7 +1736,20 @@ python -m pytest -q tests
1633
1736
  .\scripts\run-load-test.ps1 -Profile smoke
1634
1737
  ```
1635
1738
 
1636
- 完整参数和说明见 [`tests_performance/README.md`](tests_performance/README.md)。
1739
+ 完整参数和说明见 [性能测试指南](https://github.com/YUCONGGEN/springbootAI/blob/master/tests_performance/README.md)。
1740
+
1741
+ AI、LangChain、LangGraph 和 MCP 已提供独立 workload,并已加入 9 小时 `mixed` 长稳测试。默认使用 Fake 模型和进程内 MCP Server,不访问外部模型、不会产生 Token 费用:
1742
+
1743
+ ```powershell
1744
+ .\scripts\run-load-test.ps1 -Profile smoke -Workload ai
1745
+ .\scripts\run-load-test.ps1 -Profile smoke -Workload langchain
1746
+ .\scripts\run-load-test.ps1 -Profile smoke -Workload langgraph
1747
+ .\scripts\run-load-test.ps1 -Profile smoke -Workload mcp
1748
+ .\scripts\run-9h-soak-test.ps1 -Rate 100 -Workers 4 -MaxVus 1000
1749
+ .\scripts\run-9h-soak-test.ps1 -Duration 24h -Rate 100 -Workers 4 -MaxVus 1000
1750
+ ```
1751
+
1752
+ 真实模型压测必须使用隔离账号、费用预算和供应商限流配置;Fake 模型结果只能说明框架路径稳定,不能代表真实模型响应时间。
1637
1753
 
1638
1754
  ---
1639
1755
 
@@ -1763,3 +1879,27 @@ volumes:
1763
1879
  redis_data:
1764
1880
  mysql_data:
1765
1881
  ```
1882
+
1883
+ ## LangGraph 独立模块
1884
+
1885
+ LangGraph 不会随核心包或 LangChain classic 自动安装。需要状态图、条件路由、流式执行或人工审核时,单独安装:
1886
+
1887
+ ```bash
1888
+ pip install springbootAI[langgraph]
1889
+ # 源码仓库也可以使用:
1890
+ pip install -r requirements-langgraph.txt
1891
+ ```
1892
+
1893
+ 完整的小白入门、配置说明、`spring.ai` 模型复用、持久化 checkpointer、异步调用和测试命令请阅读 [LANGGRAPH_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGGRAPH_MODULE.md)。可选依赖已包含官方 SQLite checkpointer,适合本地单进程恢复测试;多 worker 生产环境必须注入共享数据库后端。无 LangGraph 依赖时保持 `spring.langgraph.enabled=false`,不会影响其他模块。
1894
+
1895
+ ## MCP 客户端与服务端
1896
+
1897
+ MCP 模块同时支持客户端和服务端,并提供可执行注解:客户端使用 `@MCPClient` + `@MCPCall` 把方法调用转换成真实 MCP 请求;服务端使用 `@MCPServer` + `@MCPTool` / `@MCPResource` / `@MCPPrompt` 发布能力。安装:
1898
+
1899
+ ```bash
1900
+ pip install springbootAI[mcp]
1901
+ ```
1902
+
1903
+ 完整配置、FastAPI 挂载、stdio、认证、白名单、Spring AI/LangChain/LangGraph 组合方式和测试命令见 [MCP_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_MODULE.md)。
1904
+
1905
+ LangChain 也支持 `@LangChainClient` + `@LangChainCall`,LangGraph 支持 `@LangGraph` + `@GraphNode` + `@GraphEdge` + `@GraphRoute` + `@GraphInvoke`。这些注解复用现有运行时,不会重新实现 LangChain、LangGraph 或 MCP 协议。