springbootAI 1.8.7__tar.gz → 1.8.9__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 (255) hide show
  1. {springbootai-1.8.7 → springbootai-1.8.9}/PKG-INFO +158 -22
  2. springbootai-1.8.7/springbootAI.egg-info/PKG-INFO → springbootai-1.8.9/README.md +117 -95
  3. {springbootai-1.8.7 → springbootai-1.8.9}/pyproject.toml +52 -11
  4. {springbootai-1.8.7 → springbootai-1.8.9}/spring/__init__.py +1 -1
  5. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/autoconfig.py +24 -10
  6. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/vectorstore.py +63 -1
  7. {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/cloud.py +9 -7
  8. {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/cloud_aop.py +19 -8
  9. {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/__init__.py +2 -1
  10. {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/gateway.py +93 -20
  11. {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/seata.py +145 -98
  12. springbootai-1.8.9/spring/cloud/seata_bridge.py +142 -0
  13. {springbootai-1.8.7 → springbootai-1.8.9}/spring/config/config_loader.py +59 -1
  14. {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/bean_factory.py +7 -0
  15. springbootai-1.8.9/spring/langchain/__init__.py +66 -0
  16. springbootai-1.8.9/spring/langchain/adapters.py +297 -0
  17. springbootai-1.8.9/spring/langchain/agents/__init__.py +4 -0
  18. springbootai-1.8.9/spring/langchain/agents/services.py +189 -0
  19. springbootai-1.8.9/spring/langchain/autoconfig.py +364 -0
  20. springbootai-1.8.9/spring/langchain/callbacks/__init__.py +4 -0
  21. springbootai-1.8.9/spring/langchain/callbacks/handlers.py +50 -0
  22. springbootai-1.8.9/spring/langchain/chains/__init__.py +4 -0
  23. springbootai-1.8.9/spring/langchain/chains/services.py +170 -0
  24. springbootai-1.8.9/spring/langchain/indexes/__init__.py +4 -0
  25. springbootai-1.8.9/spring/langchain/indexes/index.py +93 -0
  26. springbootai-1.8.9/spring/langchain/loaders/__init__.py +4 -0
  27. springbootai-1.8.9/spring/langchain/loaders/loaders.py +111 -0
  28. springbootai-1.8.9/spring/langchain/memory/__init__.py +4 -0
  29. springbootai-1.8.9/spring/langchain/memory/memory.py +74 -0
  30. springbootai-1.8.9/spring/langchain/parsers/__init__.py +4 -0
  31. springbootai-1.8.9/spring/langchain/parsers/parsers.py +84 -0
  32. springbootai-1.8.9/spring/langchain/partners.py +205 -0
  33. springbootai-1.8.9/spring/langchain/prompts/__init__.py +4 -0
  34. springbootai-1.8.9/spring/langchain/prompts/templates.py +105 -0
  35. springbootai-1.8.9/spring/langchain/retrievers/__init__.py +4 -0
  36. springbootai-1.8.9/spring/langchain/retrievers/retrievers.py +95 -0
  37. springbootai-1.8.9/spring/langchain/tools/__init__.py +4 -0
  38. springbootai-1.8.9/spring/langchain/tools/tools.py +94 -0
  39. springbootai-1.8.9/spring/langchain/utilities/__init__.py +4 -0
  40. springbootai-1.8.9/spring/langchain/utilities/utils.py +92 -0
  41. springbootai-1.8.9/spring/langchain/vectorstores/__init__.py +4 -0
  42. springbootai-1.8.9/spring/langchain/vectorstores/stores.py +143 -0
  43. {springbootai-1.8.7 → springbootai-1.8.9}/spring/logging/loguru_logger.py +99 -32
  44. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/cache/redis_cache.py +93 -42
  45. {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/jwt_utils.py +27 -13
  46. {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/actuator.py +115 -13
  47. {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/health.py +67 -46
  48. {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/web_context.py +6 -1
  49. springbootai-1.8.7/README.md → springbootai-1.8.9/springbootAI.egg-info/PKG-INFO +231 -11
  50. {springbootai-1.8.7 → springbootai-1.8.9}/springbootAI.egg-info/SOURCES.txt +32 -0
  51. springbootai-1.8.9/springbootAI.egg-info/requires.txt +105 -0
  52. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_actuator.py +7 -1
  53. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_ai_module.py +19 -6
  54. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_di_config_event_full.py +82 -0
  55. springbootai-1.8.9/tests/test_langchain_ext.py +3589 -0
  56. springbootai-1.8.9/tests/test_langchain_module.py +842 -0
  57. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_logging_config.py +128 -7
  58. springbootai-1.8.9/tests/test_seata_bridge.py +175 -0
  59. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_security.py +4 -1
  60. springbootai-1.8.7/springbootAI.egg-info/requires.txt +0 -74
  61. {springbootai-1.8.7 → springbootai-1.8.9}/LICENSE +0 -0
  62. {springbootai-1.8.7 → springbootai-1.8.9}/MANIFEST.in +0 -0
  63. {springbootai-1.8.7 → springbootai-1.8.9}/requirements.txt +0 -0
  64. {springbootai-1.8.7 → springbootai-1.8.9}/setup.cfg +0 -0
  65. {springbootai-1.8.7 → springbootai-1.8.9}/setup.py +0 -0
  66. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/__init__.py +0 -0
  67. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/advisors.py +0 -0
  68. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/annotations.py +0 -0
  69. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/core.py +0 -0
  70. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/etl.py +0 -0
  71. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/memory.py +0 -0
  72. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/observability.py +0 -0
  73. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/providers.py +0 -0
  74. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/resilience.py +0 -0
  75. {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/tools.py +0 -0
  76. {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/__init__.py +0 -0
  77. {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/cache.py +0 -0
  78. {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/conditional.py +0 -0
  79. {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/core.py +0 -0
  80. {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/messaging.py +0 -0
  81. {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/__init__.py +0 -0
  82. {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/comprehensive_aop.py +0 -0
  83. {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/method_interceptor.py +0 -0
  84. {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/proxy_factory.py +0 -0
  85. {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/discovery.py +0 -0
  86. {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/feign.py +0 -0
  87. {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/load_balancer.py +0 -0
  88. {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/sentinel.py +0 -0
  89. {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/tracer.py +0 -0
  90. {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/transaction_store.py +0 -0
  91. {springbootai-1.8.7 → springbootai-1.8.9}/spring/config/__init__.py +0 -0
  92. {springbootai-1.8.7 → springbootai-1.8.9}/spring/config/binding.py +0 -0
  93. {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/__init__.py +0 -0
  94. {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/application_context.py +0 -0
  95. {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/bean_definition.py +0 -0
  96. {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/registry.py +0 -0
  97. {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/scanner.py +0 -0
  98. {springbootai-1.8.7 → springbootai-1.8.9}/spring/core/__init__.py +0 -0
  99. {springbootai-1.8.7 → springbootai-1.8.9}/spring/core/graceful_shutdown.py +0 -0
  100. {springbootai-1.8.7 → springbootai-1.8.9}/spring/core/typing_utils.py +0 -0
  101. {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/__init__.py +0 -0
  102. {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/annotations.py +0 -0
  103. {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/converters.py +0 -0
  104. {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/easy_csv.py +0 -0
  105. {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/exceptions.py +0 -0
  106. {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/reader.py +0 -0
  107. {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/writer.py +0 -0
  108. {springbootai-1.8.7 → springbootai-1.8.9}/spring/data/__init__.py +0 -0
  109. {springbootai-1.8.7 → springbootai-1.8.9}/spring/data/page.py +0 -0
  110. {springbootai-1.8.7 → springbootai-1.8.9}/spring/data/repository.py +0 -0
  111. {springbootai-1.8.7 → springbootai-1.8.9}/spring/data/specification.py +0 -0
  112. {springbootai-1.8.7 → springbootai-1.8.9}/spring/datasource/__init__.py +0 -0
  113. {springbootai-1.8.7 → springbootai-1.8.9}/spring/datasource/annotations.py +0 -0
  114. {springbootai-1.8.7 → springbootai-1.8.9}/spring/datasource/context.py +0 -0
  115. {springbootai-1.8.7 → springbootai-1.8.9}/spring/datasource/dynamic.py +0 -0
  116. {springbootai-1.8.7 → springbootai-1.8.9}/spring/event/__init__.py +0 -0
  117. {springbootai-1.8.7 → springbootai-1.8.9}/spring/event/publisher.py +0 -0
  118. {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/__init__.py +0 -0
  119. {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/annotations.py +0 -0
  120. {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/converters.py +0 -0
  121. {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/easy_excel.py +0 -0
  122. {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/exceptions.py +0 -0
  123. {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/reader.py +0 -0
  124. {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/style.py +0 -0
  125. {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/writer.py +0 -0
  126. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/__init__.py +0 -0
  127. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/accessor.py +0 -0
  128. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/auto_config.py +0 -0
  129. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/holder.py +0 -0
  130. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/locale.py +0 -0
  131. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/locale_resolver.py +0 -0
  132. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/message_source.py +0 -0
  133. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/middleware.py +0 -0
  134. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/properties.py +0 -0
  135. {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/sources.py +0 -0
  136. {springbootai-1.8.7 → springbootai-1.8.9}/spring/logging/__init__.py +0 -0
  137. {springbootai-1.8.7 → springbootai-1.8.9}/spring/main.py +0 -0
  138. {springbootai-1.8.7 → springbootai-1.8.9}/spring/messaging/__init__.py +0 -0
  139. {springbootai-1.8.7 → springbootai-1.8.9}/spring/messaging/rabbitmq.py +0 -0
  140. {springbootai-1.8.7 → springbootai-1.8.9}/spring/monitoring/__init__.py +0 -0
  141. {springbootai-1.8.7 → springbootai-1.8.9}/spring/monitoring/prometheus.py +0 -0
  142. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/__init__.py +0 -0
  143. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/database.py +0 -0
  144. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/ddl_auto.py +0 -0
  145. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/migration.py +0 -0
  146. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/mybatis_integration.py +0 -0
  147. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/__init__.py +0 -0
  148. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/annotations/__init__.py +0 -0
  149. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/annotations/annotations.py +0 -0
  150. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/cache/__init__.py +0 -0
  151. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/cache/cache.py +0 -0
  152. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
  153. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
  154. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/configuration.py +0 -0
  155. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/core/__init__.py +0 -0
  156. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/core/sql_session.py +0 -0
  157. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
  158. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/dialect/__init__.py +0 -0
  159. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/dialect/dialect.py +0 -0
  160. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
  161. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
  162. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
  163. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
  164. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/mapper/__init__.py +0 -0
  165. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/mapper/mapper.py +0 -0
  166. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/metrics/__init__.py +0 -0
  167. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/metrics/metrics.py +0 -0
  168. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/pool/__init__.py +0 -0
  169. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/pool/connection_pool.py +0 -0
  170. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/__init__.py +0 -0
  171. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/access_control.py +0 -0
  172. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/password_encoder.py +0 -0
  173. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
  174. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
  175. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/transaction/__init__.py +0 -0
  176. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/transaction/transaction.py +0 -0
  177. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
  178. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
  179. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/version.py +0 -0
  180. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
  181. {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/xml_parser/xml_parser.py +0 -0
  182. {springbootai-1.8.7 → springbootai-1.8.9}/spring/retry/__init__.py +0 -0
  183. {springbootai-1.8.7 → springbootai-1.8.9}/spring/retry/retry_annotations.py +0 -0
  184. {springbootai-1.8.7 → springbootai-1.8.9}/spring/retry/retry_decorator.py +0 -0
  185. {springbootai-1.8.7 → springbootai-1.8.9}/spring/scheduling/__init__.py +0 -0
  186. {springbootai-1.8.7 → springbootai-1.8.9}/spring/scheduling/scheduler.py +0 -0
  187. {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/__init__.py +0 -0
  188. {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/replay_protection.py +0 -0
  189. {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/secret_manager.py +0 -0
  190. {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/security_aop.py +0 -0
  191. {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/security_context.py +0 -0
  192. {springbootai-1.8.7 → springbootai-1.8.9}/spring/test/__init__.py +0 -0
  193. {springbootai-1.8.7 → springbootai-1.8.9}/spring/test/slicing.py +0 -0
  194. {springbootai-1.8.7 → springbootai-1.8.9}/spring/tracing/__init__.py +0 -0
  195. {springbootai-1.8.7 → springbootai-1.8.9}/spring/tracing/skywalking.py +0 -0
  196. {springbootai-1.8.7 → springbootai-1.8.9}/spring/tx/__init__.py +0 -0
  197. {springbootai-1.8.7 → springbootai-1.8.9}/spring/tx/events.py +0 -0
  198. {springbootai-1.8.7 → springbootai-1.8.9}/spring/tx/synchronization.py +0 -0
  199. {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/__init__.py +0 -0
  200. {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/banner.py +0 -0
  201. {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/bean_utils.py +0 -0
  202. {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/logger.py +0 -0
  203. {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/redis_client.py +0 -0
  204. {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/__init__.py +0 -0
  205. {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/aop.py +0 -0
  206. {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/constraints.py +0 -0
  207. {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/exceptions.py +0 -0
  208. {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/validator.py +0 -0
  209. {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/__init__.py +0 -0
  210. {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/exception_handler.py +0 -0
  211. {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/interceptor.py +0 -0
  212. {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/result.py +0 -0
  213. {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/swagger.py +0 -0
  214. {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/__init__.py +0 -0
  215. {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/annotations.py +0 -0
  216. {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/broker.py +0 -0
  217. {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/exceptions.py +0 -0
  218. {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/handler.py +0 -0
  219. {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/router.py +0 -0
  220. {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/session.py +0 -0
  221. {springbootai-1.8.7 → springbootai-1.8.9}/springbootAI.egg-info/dependency_links.txt +0 -0
  222. {springbootai-1.8.7 → springbootai-1.8.9}/springbootAI.egg-info/entry_points.txt +0 -0
  223. {springbootai-1.8.7 → springbootai-1.8.9}/springbootAI.egg-info/top_level.txt +0 -0
  224. {springbootai-1.8.7 → springbootai-1.8.9}/sql/seata_undo_log.sql +0 -0
  225. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_annotation_combinations.py +0 -0
  226. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_annotations_contract.py +0 -0
  227. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_aop_annotations_full.py +0 -0
  228. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_bean_utils.py +0 -0
  229. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_cache_annotations.py +0 -0
  230. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_cloud_embedded_full.py +0 -0
  231. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_component_init_error.py +0 -0
  232. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_conditional_annotations.py +0 -0
  233. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_config_binding.py +0 -0
  234. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_config_fixes_185.py +0 -0
  235. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_connection_resilience.py +0 -0
  236. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_core_annotations_full.py +0 -0
  237. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_csv_module.py +0 -0
  238. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_data_repository.py +0 -0
  239. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_datasource_routing.py +0 -0
  240. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_ddl_auto.py +0 -0
  241. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_excel_module.py +0 -0
  242. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_i18n_module.py +0 -0
  243. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_jpa_version_transient.py +0 -0
  244. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_new_features.py +0 -0
  245. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_orm_pymybatis_full.py +0 -0
  246. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_production_readiness.py +0 -0
  247. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_pymybatis_contract.py +0 -0
  248. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_seata_durable_store.py +0 -0
  249. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_security_full.py +0 -0
  250. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_swagger_module.py +0 -0
  251. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_test_slicing.py +0 -0
  252. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_transactional_events.py +0 -0
  253. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_validation_module.py +0 -0
  254. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_web_annotations_full.py +0 -0
  255. {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_websocket_module.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: springbootAI
3
- Version: 1.8.7
3
+ Version: 1.8.9
4
4
  Summary: Python版Spring Boot框架,集成PyMyBatis ORM
5
5
  Author-email: YuConggen <1516933915@qq.com>
6
6
  License-Expression: MIT
@@ -52,11 +52,34 @@ Requires-Dist: sqlglot==27.28.1; extra == "ast"
52
52
  Provides-Extra: excel
53
53
  Requires-Dist: openpyxl==3.1.5; extra == "excel"
54
54
  Provides-Extra: ai
55
- Requires-Dist: langchain-openai==0.3.27; extra == "ai"
56
- Requires-Dist: langchain-core==0.3.51; extra == "ai"
57
- Requires-Dist: langchain-text-splitters==0.3.8; extra == "ai"
58
- Requires-Dist: langchain-community==0.3.24; extra == "ai"
59
- Requires-Dist: numpy==2.0.2; extra == "ai"
55
+ Requires-Dist: langchain-openai==1.4.1; extra == "ai"
56
+ Requires-Dist: langchain-core==1.5.1; extra == "ai"
57
+ Requires-Dist: langchain-classic==1.0.8; extra == "ai"
58
+ Requires-Dist: langchain-text-splitters==1.1.2; extra == "ai"
59
+ Requires-Dist: langchain-community==0.4.2; extra == "ai"
60
+ Requires-Dist: numpy==1.26.4; extra == "ai"
61
+ Requires-Dist: pydantic==2.13.4; extra == "ai"
62
+ Provides-Extra: langchain
63
+ Requires-Dist: langchain-openai==1.4.1; extra == "langchain"
64
+ Requires-Dist: langchain-core==1.5.1; extra == "langchain"
65
+ Requires-Dist: langchain-classic==1.0.8; extra == "langchain"
66
+ Requires-Dist: langchain-text-splitters==1.1.2; extra == "langchain"
67
+ Requires-Dist: langchain-community==0.4.2; extra == "langchain"
68
+ Requires-Dist: numpy==1.26.4; extra == "langchain"
69
+ Requires-Dist: pydantic==2.13.4; extra == "langchain"
70
+ Requires-Dist: faiss-cpu>=1.7.4; extra == "langchain"
71
+ Requires-Dist: pypdf>=4.0.0; extra == "langchain"
72
+ Requires-Dist: beautifulsoup4>=4.12.0; extra == "langchain"
73
+ Requires-Dist: sqlalchemy>=2.0.0; extra == "langchain"
74
+ Requires-Dist: langchain-anthropic>=0.2.0; extra == "langchain"
75
+ Requires-Dist: langchain-ollama>=0.2.0; extra == "langchain"
76
+ Requires-Dist: langchain-chroma>=0.1.0; extra == "langchain"
77
+ Requires-Dist: langchain-mistralai>=0.2.0; extra == "langchain"
78
+ Requires-Dist: langchain-cohere>=0.3.0; extra == "langchain"
79
+ Requires-Dist: langchain-google-vertexai>=2.0.0; extra == "langchain"
80
+ Requires-Dist: langchain-deepseek>=0.1.0; extra == "langchain"
81
+ Requires-Dist: langchain-zhipuai>=0.1.0; extra == "langchain"
82
+ Requires-Dist: langchain-experimental>=0.3.0; extra == "langchain"
60
83
  Provides-Extra: dev
61
84
  Requires-Dist: pytest==9.1.1; extra == "dev"
62
85
  Requires-Dist: pytest-cov==7.1.0; extra == "dev"
@@ -75,21 +98,28 @@ Requires-Dist: loguru==0.7.3; extra == "full"
75
98
  Requires-Dist: requests==2.33.0; extra == "full"
76
99
  Requires-Dist: httpx==0.28.1; extra == "full"
77
100
  Requires-Dist: openpyxl==3.1.5; extra == "full"
78
- Requires-Dist: langchain-openai==0.3.27; extra == "full"
79
- Requires-Dist: langchain-core==0.3.51; extra == "full"
80
- Requires-Dist: langchain-text-splitters==0.3.8; extra == "full"
81
- Requires-Dist: langchain-community==0.3.24; extra == "full"
82
- Requires-Dist: numpy==2.0.2; extra == "full"
101
+ Requires-Dist: langchain-openai==1.4.1; extra == "full"
102
+ Requires-Dist: langchain-core==1.5.1; extra == "full"
103
+ Requires-Dist: langchain-classic==1.0.8; extra == "full"
104
+ Requires-Dist: langchain-text-splitters==1.1.2; extra == "full"
105
+ Requires-Dist: langchain-community==0.4.2; extra == "full"
106
+ Requires-Dist: numpy==1.26.4; extra == "full"
107
+ Requires-Dist: pydantic==2.13.4; extra == "full"
108
+ Requires-Dist: faiss-cpu>=1.7.4; extra == "full"
109
+ Requires-Dist: pypdf>=4.0.0; extra == "full"
110
+ Requires-Dist: beautifulsoup4>=4.12.0; extra == "full"
111
+ Requires-Dist: sqlalchemy>=2.0.0; extra == "full"
112
+ Requires-Dist: langchain-experimental>=0.3.0; extra == "full"
83
113
  Dynamic: license-file
84
114
 
85
115
  # SpringBootAI 综合使用指南
86
116
 
87
117
  SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提供装饰器式组件扫描、依赖注入、FastAPI 路由、配置加载、安全能力、内嵌的 PyMyBatis ORM,以及企业级 AI 模块(对齐 Spring AI 2.0:ChatClient/Advisor/Tools/RAG/Function Calling)。本指南为框架核心综合使用文档;**AI / ORM / Cloud / Excel 等模块的完整注解与功能说明已分离为独立文档**(见下方“模块文档”),本指南相应章节保留概览与跳转链接。
88
118
 
89
- - SpringBootAI 版本:`1.8.4`
119
+ - SpringBootAI 版本:`1.8.8`
90
120
  - 内嵌 PyMyBatis 版本:`1.4.0`
91
121
  - Python:3.10+
92
- - 状态:Beta(企业试点)
122
+ - 状态:Beta(企业试点)0
93
123
  - 仓库:[GitHub - YUCONGGEN/springbootAI](https://github.com/YUCONGGEN/springbootAI)
94
124
  - License:MIT
95
125
 
@@ -102,6 +132,8 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
102
132
  | 新手入门 | [BEGINNER_GUIDE.md](doc/BEGINNER_GUIDE.md) | 随核心包 | 从零安装、创建项目、运行接口、打开 Swagger、选择后续模块 |
103
133
  | 常用注解模块 | [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md) | 随核心包 | Bean Validation / 条件装配 / 缓存增强 / CSV / `@Version` / `@Transient` |
104
134
  | AI(对齐 Spring AI 2.0) | [AI_MODULE.md](doc/AI_MODULE.md) | `pip install springbootAI[ai]` | ChatClient / Advisor / Tools / RAG / Function Calling / ETL / 多厂商 LangChain 化 / 韧性 / 观测 |
135
+ | LangChain(封装 langchain classic 全套) | [LANGCHAIN_MODULE.md](doc/LANGCHAIN_MODULE.md) | `pip install springbootAI[ai]` | Chains / Agents / Memory / Retrievers / VectorStores / Parsers / Loaders / 30+ Partner 提供商 / 双向适配器 / 一键 RAG |
136
+ | AI 与 LangChain 测试指南 | [AI_LANGCHAIN_TEST_GUIDE.md](doc/AI_LANGCHAIN_TEST_GUIDE.md) | — | 162 个测试用例详解(有什么用/怎么用/验证什么),覆盖核心抽象到端到端集成 |
105
137
  | 内嵌 PyMyBatis ORM 与 DDL | [ORM_MODULE.md](doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 |
106
138
  | Spring Cloud(对齐 Cloud Alibaba) | [CLOUD_MODULE.md](doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 负载均衡 / 分布式事务 |
107
139
  | Excel(对齐 alibaba EasyExcel) | [EXCEL_MODULE.md](doc/EXCEL_MODULE.md) | `pip install springbootAI[excel]` | `@ExcelProperty` / `@ExcelIgnore` / `@excel_sheet` 注解驱动读写 |
@@ -120,7 +152,7 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
120
152
  2. 阅读本页第 4、6、7 章,理解配置、依赖注入和 Controller。
121
153
  3. 做数据库 CRUD 时阅读 [ORM_MODULE.md](doc/ORM_MODULE.md)。
122
154
  4. 需要输入校验、缓存或条件开关时阅读 [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md)。
123
- 5. 最后再按业务需要选择安全、Cloud、AI、Excel、WebSocket 或性能测试文档。
155
+ 5. 最后再按业务需要选择安全、Cloud、AI、LangChain、Excel、WebSocket 或性能测试文档。
124
156
 
125
157
  ## 目录
126
158
 
@@ -135,7 +167,7 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
135
167
  9. [事务](#9-事务)
136
168
  10. [安全与权限](#10-安全与权限)
137
169
  11. [缓存、任务与高级 AOP](#11-缓存任务与高级-aop)
138
- 12. [SpringBootAI AI 模块](#12-springbootai-ai-模块)
170
+ 12. [SpringBootAI AI 与 LangChain 模块](#12-springbootai-ai-与-langchain-模块)
139
171
  13. [Java 迁移指南](#13-java-迁移指南)
140
172
  14. [生产部署](#14-生产部署)
141
173
  15. [项目结构](#15-项目结构)
@@ -153,8 +185,10 @@ SpringBootAI 借鉴了 Spring Boot 的注解和分层习惯,但运行时是 Py
153
185
 
154
186
  | 组件 | 当前版本 |
155
187
  |------|----------|
156
- | `spring` 框架 API | 1.8.4 |
188
+ | `spring` 框架 API | 1.8.8 |
157
189
  | `spring.orm.pymybatis` | 1.4.0 |
190
+ | `spring.ai` AI 模块 | 1.3.0 |
191
+ | `spring.langchain` LangChain 模块 | 1.0.0 |
158
192
  | Python | 3.10+ |
159
193
 
160
194
  ### 1.2 推荐使用范围
@@ -210,6 +244,7 @@ SpringBootAI 注解会先把元数据放到 `__spring_annotations__`。之后是
210
244
  | Feign 声明式 HTTP | ✅ 可用 | 声明式接口、Fallback 降级、自动传播 XID 和 trace 头 |
211
245
  | 高级 AOP | ✅ 可用 | 限流、熔断、幂等、审计、锁、指标、追踪、缓存 |
212
246
  | SpringBootAI AI 模块 | ✅ 可用 | 对齐 Spring AI 2.0:ChatClient/ChatModel/EmbeddingModel/Advisor/Tools,OpenAI/Ollama/DeepSeek/Moonshot 适配,Function Calling 闭环、RAG、会话记忆、Redis 向量存储、熔断重试、真流式 async、Prometheus 观测、类型化配置绑定 |
247
+ | LangChain 模块 | ✅ 可用 | 封装 langchain classic 全套:Chains/Agents(6 种)/Memory/Retrievers/VectorStores/Parsers/Loaders + 30+ Partner 提供商懒加载,双向适配器复用 spring.ai 模型 Bean,`configure_langchain()` 自动装配 14+ Bean |
213
248
 
214
249
  ---
215
250
 
@@ -264,6 +299,17 @@ AI 模块为可选依赖(未安装时降级原生 HTTP + FakeChatModel):
264
299
  pip install -r requirements-ai.txt # langchain-openai/langchain-community/numpy(==锁版本)
265
300
  ```
266
301
 
302
+ LangChain 模块复用 AI 模块的依赖,额外按需安装 partner 包(30+ 提供商懒加载,未安装的自动跳过):
303
+
304
+ ```bash
305
+ pip install langchain-anthropic # Anthropic Claude
306
+ pip install langchain-deepseek # DeepSeek
307
+ pip install langchain-ollama # Ollama 本地模型
308
+ pip install faiss-cpu # FAISS 向量库
309
+ pip install langchain-chroma # Chroma 向量库
310
+ # 完整 partner 列表见 spring.langchain.partners.PARTNER_REGISTRY
311
+ ```
312
+
267
313
  `requirements.txt` 是仓库的完整开发环境,包含多种数据库和中间件客户端。应用接入时优先按需安装 extras。
268
314
 
269
315
  ### 3.4 验证安装
@@ -442,7 +488,7 @@ CORS_ALLOW_ORIGINS CORS_ALLOW_CREDENTIALS
442
488
  LOG_LEVEL LOG_DIR
443
489
  ```
444
490
 
445
- 当前 `SPRING_PROFILES_ACTIVE` 用于 `@Profile` 组件筛选和生产安全校验,不会自动合并 `application-prod.yml`。需要多环境文件时,由部署流程生成最终 `application.yml` 或显式传入配置路径。
491
+ `SPRING_PROFILES_ACTIVE` 用于 `@Profile` 组件筛选、生产安全校验,以及**自动加载并深度合并** `application-{profile}.yml`(v1.8.5 起实现,对齐 Spring Boot 语义)。Profile 文件与主 `application.yml` 同目录,加载顺序为:主配置 → profile 配置深度合并(profile 覆盖主配置的同名键,未涉及的键保留),合并后再解析 `${ENV:default}` 占位符和环境变量覆盖。例如 `SPRING_PROFILES_ACTIVE=prod` 会自动合并 `application-prod.yml`,无需部署流程生成最终 `application.yml`。
446
492
 
447
493
  ### 4.4 Docker 容器 IP 自动检测(开发环境)
448
494
 
@@ -2033,10 +2079,68 @@ class CleanupJob:
2033
2079
 
2034
2080
  ---
2035
2081
 
2036
- ## 12. SpringBootAI AI 模块
2082
+ ## 12. SpringBootAI AI 与 LangChain 模块
2083
+
2084
+ ### 12.1 AI 模块(对齐 Spring AI 2.0)
2037
2085
 
2038
2086
  > 本节(新手入门、快速开始、配置、AI 注解、ChatClient 链式 API、Advisor、ETL、工具调用、自动装配、企业级能力、DeepSeek 全特性演示)已分离至独立文档:[AI_MODULE.md](doc/AI_MODULE.md)。安装:`pip install springbootAI[ai]`。
2039
2087
 
2088
+ ### 12.2 LangChain 模块(封装 langchain classic 全套能力)
2089
+
2090
+ > 把 LangChain classic 的 Chains / Agents / Memory / Retrievers / VectorStores / Parsers / Loaders 封装为 Spring 风格 `@Service` / `@Component` Bean,配合 30+ 第三方模型提供商(OpenAI / Anthropic / Ollama / DeepSeek / ZhipuAI / Tongyi …)开箱即用。
2091
+ > 完整文档:[LANGCHAIN_MODULE.md](doc/LANGCHAIN_MODULE.md)。安装:`pip install springbootAI[ai]`。
2092
+
2093
+ **核心能力**:
2094
+
2095
+ - **双向适配器**:springbootAI `ChatModel`/`EmbeddingModel` ↔ langchain `BaseChatModel`/`Embeddings`,复用 `spring.ai` 装配的模型 Bean
2096
+ - **30+ Partner 提供商**:按 `application.yml` 的 `spring.langchain.partners.<name>` 懒加载,未配置的不启动
2097
+ - **6 种 Agent**:react / chat-zero-shot-react / openai-functions / openai-tools / structured-chat / self-ask-with-search
2098
+ - **6 种 Chain**:LLMChain / ConversationChain / SequentialChain / RetrievalQA / 摘要 / LLMMath
2099
+ - **4 种 Memory**:buffer / summary / buffer-window / token-buffer
2100
+ - **7 种 VectorStore**:inmemory / faiss / chroma / pinecone / weaviate / pgvector / redis
2101
+ - **6 种 Retriever + 5 种 OutputParser + 6 种 DocumentLoader + 6 种 Utility + 3 种 Callback**
2102
+ - **一键 RAG**:`IndexService.create_from_texts()` + `query()` 三步完成知识库问答
2103
+ - **自动装配**:`configure_langchain()` 一次注册 14+ 个 `lc*` Bean,支持 `@Autowired` 注入
2104
+
2105
+ **最小示例**(无需 API Key,降级 FakeChatModel):
2106
+
2107
+ ```python
2108
+ from spring.context.registry import BeanRegistry
2109
+ from spring.ai.autoconfig import configure_ai
2110
+ from spring.langchain.autoconfig import configure_langchain
2111
+
2112
+ registry = BeanRegistry()
2113
+ configure_ai(registry=registry) # 1. 装配 spring.ai(降级 Fake)
2114
+ beans = configure_langchain(registry=registry) # 2. 装配 spring.langchain
2115
+
2116
+ chain = beans["lcChainService"] # 拿到 ChainService Bean
2117
+ print(chain.run_llm_chain("回答: {q}", q="你好"))
2118
+ ```
2119
+
2120
+ **配置**(`application.yml`):
2121
+
2122
+ ```yaml
2123
+ spring:
2124
+ langchain:
2125
+ enabled: ${LC_ENABLED:true}
2126
+ default-llm: ${LC_DEFAULT_LLM:auto} # auto=复用 spring.ai 的 aiChatModel
2127
+ agents:
2128
+ default-type: ${LC_AGENT_TYPE:react} # react|openai-tools|structured-chat|...
2129
+ max-iterations: ${LC_AGENT_MAX_ITER:10}
2130
+ vector-store:
2131
+ type: ${LC_VECTOR_STORE:faiss} # inmemory|faiss|chroma|redis|...
2132
+ memory:
2133
+ type: ${LC_MEMORY:buffer} # buffer|summary|buffer-window|token-buffer
2134
+ partners: # 按 name 启用 partner,未配置的不加载
2135
+ openai:
2136
+ api-key: ${OPENAI_API_KEY:}
2137
+ model: ${OPENAI_CHAT_MODEL:gpt-4o-mini}
2138
+ ```
2139
+
2140
+ **示例应用**:[example_langchain/](example_langchain/) 提供完整的 `@SpringBootApplication` + `@RestController` + `@Service` 分层演示,暴露 12 个 HTTP 接口(问答 / 翻译 / 摘要 / Agent / RAG 入库检索 / Memory / Math / Parser / Embed / Partner 列表 / 能力清单)。
2141
+
2142
+ **与 spring.ai 的关系**:两个模块互补——`spring.ai` 提供 `ChatClient`/`Advisor`/`Tools` 抽象(Spring AI 2.0 风格),`spring.langchain` 提供 `Chain`/`Agent`/`Memory` 抽象(LangChain 生态)。底层复用同一个 `aiChatModel` Bean,不会重复计费。
2143
+
2040
2144
  ## 13. Java 迁移指南
2041
2145
 
2042
2146
  本文说明如何把现有的 Java Spring Boot、Spring Cloud Alibaba 和 MyBatis 分层代码迁移到 SpringBootAI。目标是保留清晰的 Controller / Service / Mapper 边界、配置习惯和常用注解意图,而不是让 Python 运行 Java 代码。
@@ -2562,7 +2666,7 @@ curl http://127.0.0.1:8848/nacos/v1/console/health/readiness
2562
2666
 
2563
2667
  ## 15. 项目结构
2564
2668
 
2565
- `example`、`example1`、`example5` 是仓库级示例,不属于 `springbootAI` 安装包,不会被打包。实际项目应创建自己的应用包。
2669
+ `example`、`example1`、`example5`、`example_langchain` 是仓库级示例,不属于 `springbootAI` 安装包,不会被打包。实际项目应创建自己的应用包。`example_langchain` 演示了 LangChain 模块的完整分层用法(`@SpringBootApplication` + `@RestController` + `@Service` + `@Configuration`),可作为 AI 应用脚手架参考。
2566
2670
 
2567
2671
  推荐目录结构:
2568
2672
 
@@ -2622,6 +2726,7 @@ python -m pytest -q tests
2622
2726
  - JWT access/refresh、生产密钥校验。
2623
2727
  - 配置占位符类型和 CORS/HTTP 错误状态。
2624
2728
  - AI 模块 87 用例(LangChain 切片委托 + 向量库适配器),全量 707 用例 0 失败。
2729
+ - LangChain 模块 75 用例(适配器/配置/自动装配/Partner/Prompt/Chain/Agent 6 种类型/Memory/Parser/VectorStore/Retriever/Index/Tool/Utility/Callback/安全求值器/端到端 RAG),覆盖双向桥接、bind_tools 工具绑定、沙箱逃逸防护。
2625
2730
 
2626
2731
  ---
2627
2732
 
@@ -2667,7 +2772,19 @@ JWT_SECRET_KEY=<至少32字符随机密钥>
2667
2772
 
2668
2773
  **`ConfigLoader()` 与上下文读取不同文件:** 确认应用通过 `ApplicationContext` 启动,而不是只在不同工作目录直接实例化加载器。上下文启动后会绑定全局实例和默认配置目录;需要加载独立配置时显式传入 `config_path` 或 `base_path`。
2669
2774
 
2670
- ### 17.7 上线前清单
2775
+ ### 17.7 LangChain 模块排错
2776
+
2777
+ **`@Autowired` 注入 `lcChainService` 报 `Cannot resolve parameter`:** 确认 `@Configuration` 类的 `__init__` 中调用了 `configure_ai()` + `configure_langchain()`,且该 `@Configuration` 类在 `@Service` 之前被实例化(SpringBootAI 默认保证这个顺序)。
2778
+
2779
+ **`Partner 'xxx' 注册失败(跳过)`:** 该 partner 的依赖包未安装。按告警提示 `pip install langchain-<partner>`,或在 `application.yml` 的 `spring.langchain.partners` 下移除该 partner。未安装的 partner 不会阻塞启动。
2780
+
2781
+ **`bind_tools` / `openai-tools` / `structured-chat` Agent 无法调用工具:** 确认使用的是真实 OpenAI 模型(非 FakeChatModel)。FakeChatModel 不返回 `tool_calls`,只能走 `react` 文本解析路径。
2782
+
2783
+ **RAG 报 `嵌入模型未装配`:** `configure_ai` 默认会装 `aiEmbeddingModel`,但需要 `OPENAI_API_KEY` 或 `OLLAMA_BASE_URL`。无 Key 时设 `AI_ALLOW_FAKE=true` 会降级 `FakeEmbeddingModel(dim=16)`,RAG 可演示但不真实。
2784
+
2785
+ **`run_conversation` 不记忆前文:** 便捷方法每次不传 memory 时会创建新 buffer。要多轮记忆需自己持有 memory 实例:`mem = MemoryFactory.create("buffer"); svc.run_conversation("...", memory=mem)`。
2786
+
2787
+ ### 17.8 上线前清单
2671
2788
 
2672
2789
  - 使用实际 MySQL/PostgreSQL/Oracle 版本运行 CRUD、事务、断连恢复和池耗尽测试。
2673
2790
  - 使用迁移工具管理结构,不让应用运行账号执行 DDL。
@@ -2764,9 +2881,28 @@ export PROMETHEUS_PORT=8000
2764
2881
  # Logging
2765
2882
  export LOG_LEVEL=INFO
2766
2883
  export LOG_DIR=logs
2767
- ```
2768
2884
 
2769
- > Sentinel 限流熔断、OpenTelemetry 分布式追踪和 API Gateway 可内嵌实现;HTTP 补偿事务通过 `SEATA_HTTP_*` 配置。AI 模块环境变量见第 12.2 节。
2885
+ # AI 模块(spring.ai.*,详见 AI_MODULE.md)
2886
+ export AI_PROVIDER=openai # openai|ollama|deepseek|moonshot|zhipu
2887
+ export AI_ALLOW_FAKE=true # 无 API Key 时降级 FakeChatModel(开发/测试)
2888
+ export OPENAI_API_KEY=sk-xxx
2889
+ export OPENAI_CHAT_MODEL=gpt-4o-mini
2890
+ export OLLAMA_BASE_URL=http://localhost:11434
2891
+ export OLLAMA_CHAT_MODEL=llama3
2892
+
2893
+ # LangChain 模块(spring.langchain.*,详见 LANGCHAIN_MODULE.md)
2894
+ export LC_ENABLED=true
2895
+ export LC_DEFAULT_LLM=auto # auto=复用 spring.ai 的 aiChatModel;或 partner 名
2896
+ export LC_AGENT_TYPE=react # react|openai-tools|structured-chat|...
2897
+ export LC_AGENT_MAX_ITER=10
2898
+ export LC_VECTOR_STORE=faiss # inmemory|faiss|chroma|redis|pinecone|weaviate|pgvector
2899
+ export LC_RETRIEVER=similarity # similarity|multi-query|contextual-compression|...
2900
+ export LC_RETRIEVER_K=4
2901
+ export LC_MEMORY=buffer # buffer|summary|buffer-window|token-buffer
2902
+ export LC_MEMORY_MAX=20
2903
+ ```
2904
+
2905
+ > Sentinel 限流熔断、OpenTelemetry 分布式追踪和 API Gateway 可内嵌实现;HTTP 补偿事务通过 `SEATA_HTTP_*` 配置。AI 模块完整环境变量见 [AI_MODULE.md](doc/AI_MODULE.md),LangChain 模块完整环境变量见 [LANGCHAIN_MODULE.md](doc/LANGCHAIN_MODULE.md)。
2770
2906
 
2771
2907
  ## 附录 B:Docker Compose 示例
2772
2908
 
@@ -1,95 +1,11 @@
1
- Metadata-Version: 2.4
2
- Name: springbootAI
3
- Version: 1.8.7
4
- Summary: Python版Spring Boot框架,集成PyMyBatis ORM
5
- Author-email: YuConggen <1516933915@qq.com>
6
- License-Expression: MIT
7
- Project-URL: Homepage, https://github.com/YUCONGGEN/springbootAI
8
- Project-URL: Repository, https://github.com/YUCONGGEN/springbootAI.git
9
- Keywords: spring,springboot,mybatis,orm,web,framework,python
10
- Classifier: Development Status :: 4 - Beta
11
- Classifier: Intended Audience :: Developers
12
- Classifier: Programming Language :: Python :: 3
13
- Classifier: Programming Language :: Python :: 3.10
14
- Classifier: Programming Language :: Python :: 3.11
15
- Classifier: Programming Language :: Python :: 3.12
16
- Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
17
- Classifier: Topic :: Database
18
- Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
19
- Requires-Python: >=3.10
20
- Description-Content-Type: text/markdown
21
- License-File: LICENSE
22
- Requires-Dist: fastapi==0.141.1
23
- Requires-Dist: uvicorn==0.39.0
24
- Requires-Dist: websockets==15.0.1
25
- Requires-Dist: pyyaml==6.0.3
26
- Requires-Dist: python-dotenv==1.2.2
27
- Requires-Dist: DBUtils==3.1.2
28
- Requires-Dist: cryptography==50.0.0
29
- Requires-Dist: bcrypt==5.0.0
30
- Requires-Dist: pyjwt==2.13.0
31
- Requires-Dist: pydantic==2.13.4
32
- Requires-Dist: requests==2.33.0
33
- Requires-Dist: httpx==0.28.1
34
- Provides-Extra: mysql
35
- Requires-Dist: PyMySQL==1.2.0; extra == "mysql"
36
- Provides-Extra: postgresql
37
- Requires-Dist: psycopg2-binary==2.9.11; extra == "postgresql"
38
- Provides-Extra: sqlalchemy
39
- Requires-Dist: sqlalchemy==2.0.40; extra == "sqlalchemy"
40
- Provides-Extra: redis
41
- Requires-Dist: redis==7.0.1; extra == "redis"
42
- Provides-Extra: rabbitmq
43
- Requires-Dist: pika==1.4.4; extra == "rabbitmq"
44
- Provides-Extra: nacos
45
- Requires-Dist: nacos-sdk-python==2.0.11; extra == "nacos"
46
- Provides-Extra: prometheus
47
- Requires-Dist: prometheus-client==0.26.0; extra == "prometheus"
48
- Provides-Extra: logging
49
- Requires-Dist: loguru==0.7.3; extra == "logging"
50
- Provides-Extra: ast
51
- Requires-Dist: sqlglot==27.28.1; extra == "ast"
52
- Provides-Extra: excel
53
- Requires-Dist: openpyxl==3.1.5; extra == "excel"
54
- Provides-Extra: ai
55
- Requires-Dist: langchain-openai==0.3.27; extra == "ai"
56
- Requires-Dist: langchain-core==0.3.51; extra == "ai"
57
- Requires-Dist: langchain-text-splitters==0.3.8; extra == "ai"
58
- Requires-Dist: langchain-community==0.3.24; extra == "ai"
59
- Requires-Dist: numpy==2.0.2; extra == "ai"
60
- Provides-Extra: dev
61
- Requires-Dist: pytest==9.1.1; extra == "dev"
62
- Requires-Dist: pytest-cov==7.1.0; extra == "dev"
63
- Requires-Dist: redis==7.0.1; extra == "dev"
64
- Requires-Dist: sqlglot==27.28.1; extra == "dev"
65
- Provides-Extra: full
66
- Requires-Dist: PyMySQL==1.2.0; extra == "full"
67
- Requires-Dist: psycopg2-binary==2.9.11; extra == "full"
68
- Requires-Dist: sqlalchemy==2.0.40; extra == "full"
69
- Requires-Dist: redis==7.0.1; extra == "full"
70
- Requires-Dist: sqlglot==27.28.1; extra == "full"
71
- Requires-Dist: pika==1.4.4; extra == "full"
72
- Requires-Dist: nacos-sdk-python==2.0.11; extra == "full"
73
- Requires-Dist: prometheus-client==0.26.0; extra == "full"
74
- Requires-Dist: loguru==0.7.3; extra == "full"
75
- Requires-Dist: requests==2.33.0; extra == "full"
76
- Requires-Dist: httpx==0.28.1; extra == "full"
77
- Requires-Dist: openpyxl==3.1.5; extra == "full"
78
- Requires-Dist: langchain-openai==0.3.27; extra == "full"
79
- Requires-Dist: langchain-core==0.3.51; extra == "full"
80
- Requires-Dist: langchain-text-splitters==0.3.8; extra == "full"
81
- Requires-Dist: langchain-community==0.3.24; extra == "full"
82
- Requires-Dist: numpy==2.0.2; extra == "full"
83
- Dynamic: license-file
84
-
85
1
  # SpringBootAI 综合使用指南
86
2
 
87
3
  SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提供装饰器式组件扫描、依赖注入、FastAPI 路由、配置加载、安全能力、内嵌的 PyMyBatis ORM,以及企业级 AI 模块(对齐 Spring AI 2.0:ChatClient/Advisor/Tools/RAG/Function Calling)。本指南为框架核心综合使用文档;**AI / ORM / Cloud / Excel 等模块的完整注解与功能说明已分离为独立文档**(见下方“模块文档”),本指南相应章节保留概览与跳转链接。
88
4
 
89
- - SpringBootAI 版本:`1.8.4`
5
+ - SpringBootAI 版本:`1.8.8`
90
6
  - 内嵌 PyMyBatis 版本:`1.4.0`
91
7
  - Python:3.10+
92
- - 状态:Beta(企业试点)
8
+ - 状态:Beta(企业试点)0
93
9
  - 仓库:[GitHub - YUCONGGEN/springbootAI](https://github.com/YUCONGGEN/springbootAI)
94
10
  - License:MIT
95
11
 
@@ -102,6 +18,8 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
102
18
  | 新手入门 | [BEGINNER_GUIDE.md](doc/BEGINNER_GUIDE.md) | 随核心包 | 从零安装、创建项目、运行接口、打开 Swagger、选择后续模块 |
103
19
  | 常用注解模块 | [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md) | 随核心包 | Bean Validation / 条件装配 / 缓存增强 / CSV / `@Version` / `@Transient` |
104
20
  | AI(对齐 Spring AI 2.0) | [AI_MODULE.md](doc/AI_MODULE.md) | `pip install springbootAI[ai]` | ChatClient / Advisor / Tools / RAG / Function Calling / ETL / 多厂商 LangChain 化 / 韧性 / 观测 |
21
+ | LangChain(封装 langchain classic 全套) | [LANGCHAIN_MODULE.md](doc/LANGCHAIN_MODULE.md) | `pip install springbootAI[ai]` | Chains / Agents / Memory / Retrievers / VectorStores / Parsers / Loaders / 30+ Partner 提供商 / 双向适配器 / 一键 RAG |
22
+ | AI 与 LangChain 测试指南 | [AI_LANGCHAIN_TEST_GUIDE.md](doc/AI_LANGCHAIN_TEST_GUIDE.md) | — | 162 个测试用例详解(有什么用/怎么用/验证什么),覆盖核心抽象到端到端集成 |
105
23
  | 内嵌 PyMyBatis ORM 与 DDL | [ORM_MODULE.md](doc/ORM_MODULE.md) | 随核心包 | Mapper 注解 / XML Mapper / 分页 / SQL 安全 / DDL 自动建表 |
106
24
  | Spring Cloud(对齐 Cloud Alibaba) | [CLOUD_MODULE.md](doc/CLOUD_MODULE.md) | 随核心包 | 服务注册发现 / 配置刷新 / Feign / Sentinel / Gateway / 负载均衡 / 分布式事务 |
107
25
  | Excel(对齐 alibaba EasyExcel) | [EXCEL_MODULE.md](doc/EXCEL_MODULE.md) | `pip install springbootAI[excel]` | `@ExcelProperty` / `@ExcelIgnore` / `@excel_sheet` 注解驱动读写 |
@@ -120,7 +38,7 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
120
38
  2. 阅读本页第 4、6、7 章,理解配置、依赖注入和 Controller。
121
39
  3. 做数据库 CRUD 时阅读 [ORM_MODULE.md](doc/ORM_MODULE.md)。
122
40
  4. 需要输入校验、缓存或条件开关时阅读 [ANNOTATION_MODULES.md](doc/ANNOTATION_MODULES.md)。
123
- 5. 最后再按业务需要选择安全、Cloud、AI、Excel、WebSocket 或性能测试文档。
41
+ 5. 最后再按业务需要选择安全、Cloud、AI、LangChain、Excel、WebSocket 或性能测试文档。
124
42
 
125
43
  ## 目录
126
44
 
@@ -135,7 +53,7 @@ SpringBootAI 是一个借鉴 Spring Boot 编程模型的 Python Web 框架,提
135
53
  9. [事务](#9-事务)
136
54
  10. [安全与权限](#10-安全与权限)
137
55
  11. [缓存、任务与高级 AOP](#11-缓存任务与高级-aop)
138
- 12. [SpringBootAI AI 模块](#12-springbootai-ai-模块)
56
+ 12. [SpringBootAI AI 与 LangChain 模块](#12-springbootai-ai-与-langchain-模块)
139
57
  13. [Java 迁移指南](#13-java-迁移指南)
140
58
  14. [生产部署](#14-生产部署)
141
59
  15. [项目结构](#15-项目结构)
@@ -153,8 +71,10 @@ SpringBootAI 借鉴了 Spring Boot 的注解和分层习惯,但运行时是 Py
153
71
 
154
72
  | 组件 | 当前版本 |
155
73
  |------|----------|
156
- | `spring` 框架 API | 1.8.4 |
74
+ | `spring` 框架 API | 1.8.8 |
157
75
  | `spring.orm.pymybatis` | 1.4.0 |
76
+ | `spring.ai` AI 模块 | 1.3.0 |
77
+ | `spring.langchain` LangChain 模块 | 1.0.0 |
158
78
  | Python | 3.10+ |
159
79
 
160
80
  ### 1.2 推荐使用范围
@@ -210,6 +130,7 @@ SpringBootAI 注解会先把元数据放到 `__spring_annotations__`。之后是
210
130
  | Feign 声明式 HTTP | ✅ 可用 | 声明式接口、Fallback 降级、自动传播 XID 和 trace 头 |
211
131
  | 高级 AOP | ✅ 可用 | 限流、熔断、幂等、审计、锁、指标、追踪、缓存 |
212
132
  | SpringBootAI AI 模块 | ✅ 可用 | 对齐 Spring AI 2.0:ChatClient/ChatModel/EmbeddingModel/Advisor/Tools,OpenAI/Ollama/DeepSeek/Moonshot 适配,Function Calling 闭环、RAG、会话记忆、Redis 向量存储、熔断重试、真流式 async、Prometheus 观测、类型化配置绑定 |
133
+ | LangChain 模块 | ✅ 可用 | 封装 langchain classic 全套:Chains/Agents(6 种)/Memory/Retrievers/VectorStores/Parsers/Loaders + 30+ Partner 提供商懒加载,双向适配器复用 spring.ai 模型 Bean,`configure_langchain()` 自动装配 14+ Bean |
213
134
 
214
135
  ---
215
136
 
@@ -264,6 +185,17 @@ AI 模块为可选依赖(未安装时降级原生 HTTP + FakeChatModel):
264
185
  pip install -r requirements-ai.txt # langchain-openai/langchain-community/numpy(==锁版本)
265
186
  ```
266
187
 
188
+ LangChain 模块复用 AI 模块的依赖,额外按需安装 partner 包(30+ 提供商懒加载,未安装的自动跳过):
189
+
190
+ ```bash
191
+ pip install langchain-anthropic # Anthropic Claude
192
+ pip install langchain-deepseek # DeepSeek
193
+ pip install langchain-ollama # Ollama 本地模型
194
+ pip install faiss-cpu # FAISS 向量库
195
+ pip install langchain-chroma # Chroma 向量库
196
+ # 完整 partner 列表见 spring.langchain.partners.PARTNER_REGISTRY
197
+ ```
198
+
267
199
  `requirements.txt` 是仓库的完整开发环境,包含多种数据库和中间件客户端。应用接入时优先按需安装 extras。
268
200
 
269
201
  ### 3.4 验证安装
@@ -442,7 +374,7 @@ CORS_ALLOW_ORIGINS CORS_ALLOW_CREDENTIALS
442
374
  LOG_LEVEL LOG_DIR
443
375
  ```
444
376
 
445
- 当前 `SPRING_PROFILES_ACTIVE` 用于 `@Profile` 组件筛选和生产安全校验,不会自动合并 `application-prod.yml`。需要多环境文件时,由部署流程生成最终 `application.yml` 或显式传入配置路径。
377
+ `SPRING_PROFILES_ACTIVE` 用于 `@Profile` 组件筛选、生产安全校验,以及**自动加载并深度合并** `application-{profile}.yml`(v1.8.5 起实现,对齐 Spring Boot 语义)。Profile 文件与主 `application.yml` 同目录,加载顺序为:主配置 → profile 配置深度合并(profile 覆盖主配置的同名键,未涉及的键保留),合并后再解析 `${ENV:default}` 占位符和环境变量覆盖。例如 `SPRING_PROFILES_ACTIVE=prod` 会自动合并 `application-prod.yml`,无需部署流程生成最终 `application.yml`。
446
378
 
447
379
  ### 4.4 Docker 容器 IP 自动检测(开发环境)
448
380
 
@@ -2033,10 +1965,68 @@ class CleanupJob:
2033
1965
 
2034
1966
  ---
2035
1967
 
2036
- ## 12. SpringBootAI AI 模块
1968
+ ## 12. SpringBootAI AI 与 LangChain 模块
1969
+
1970
+ ### 12.1 AI 模块(对齐 Spring AI 2.0)
2037
1971
 
2038
1972
  > 本节(新手入门、快速开始、配置、AI 注解、ChatClient 链式 API、Advisor、ETL、工具调用、自动装配、企业级能力、DeepSeek 全特性演示)已分离至独立文档:[AI_MODULE.md](doc/AI_MODULE.md)。安装:`pip install springbootAI[ai]`。
2039
1973
 
1974
+ ### 12.2 LangChain 模块(封装 langchain classic 全套能力)
1975
+
1976
+ > 把 LangChain classic 的 Chains / Agents / Memory / Retrievers / VectorStores / Parsers / Loaders 封装为 Spring 风格 `@Service` / `@Component` Bean,配合 30+ 第三方模型提供商(OpenAI / Anthropic / Ollama / DeepSeek / ZhipuAI / Tongyi …)开箱即用。
1977
+ > 完整文档:[LANGCHAIN_MODULE.md](doc/LANGCHAIN_MODULE.md)。安装:`pip install springbootAI[ai]`。
1978
+
1979
+ **核心能力**:
1980
+
1981
+ - **双向适配器**:springbootAI `ChatModel`/`EmbeddingModel` ↔ langchain `BaseChatModel`/`Embeddings`,复用 `spring.ai` 装配的模型 Bean
1982
+ - **30+ Partner 提供商**:按 `application.yml` 的 `spring.langchain.partners.<name>` 懒加载,未配置的不启动
1983
+ - **6 种 Agent**:react / chat-zero-shot-react / openai-functions / openai-tools / structured-chat / self-ask-with-search
1984
+ - **6 种 Chain**:LLMChain / ConversationChain / SequentialChain / RetrievalQA / 摘要 / LLMMath
1985
+ - **4 种 Memory**:buffer / summary / buffer-window / token-buffer
1986
+ - **7 种 VectorStore**:inmemory / faiss / chroma / pinecone / weaviate / pgvector / redis
1987
+ - **6 种 Retriever + 5 种 OutputParser + 6 种 DocumentLoader + 6 种 Utility + 3 种 Callback**
1988
+ - **一键 RAG**:`IndexService.create_from_texts()` + `query()` 三步完成知识库问答
1989
+ - **自动装配**:`configure_langchain()` 一次注册 14+ 个 `lc*` Bean,支持 `@Autowired` 注入
1990
+
1991
+ **最小示例**(无需 API Key,降级 FakeChatModel):
1992
+
1993
+ ```python
1994
+ from spring.context.registry import BeanRegistry
1995
+ from spring.ai.autoconfig import configure_ai
1996
+ from spring.langchain.autoconfig import configure_langchain
1997
+
1998
+ registry = BeanRegistry()
1999
+ configure_ai(registry=registry) # 1. 装配 spring.ai(降级 Fake)
2000
+ beans = configure_langchain(registry=registry) # 2. 装配 spring.langchain
2001
+
2002
+ chain = beans["lcChainService"] # 拿到 ChainService Bean
2003
+ print(chain.run_llm_chain("回答: {q}", q="你好"))
2004
+ ```
2005
+
2006
+ **配置**(`application.yml`):
2007
+
2008
+ ```yaml
2009
+ spring:
2010
+ langchain:
2011
+ enabled: ${LC_ENABLED:true}
2012
+ default-llm: ${LC_DEFAULT_LLM:auto} # auto=复用 spring.ai 的 aiChatModel
2013
+ agents:
2014
+ default-type: ${LC_AGENT_TYPE:react} # react|openai-tools|structured-chat|...
2015
+ max-iterations: ${LC_AGENT_MAX_ITER:10}
2016
+ vector-store:
2017
+ type: ${LC_VECTOR_STORE:faiss} # inmemory|faiss|chroma|redis|...
2018
+ memory:
2019
+ type: ${LC_MEMORY:buffer} # buffer|summary|buffer-window|token-buffer
2020
+ partners: # 按 name 启用 partner,未配置的不加载
2021
+ openai:
2022
+ api-key: ${OPENAI_API_KEY:}
2023
+ model: ${OPENAI_CHAT_MODEL:gpt-4o-mini}
2024
+ ```
2025
+
2026
+ **示例应用**:[example_langchain/](example_langchain/) 提供完整的 `@SpringBootApplication` + `@RestController` + `@Service` 分层演示,暴露 12 个 HTTP 接口(问答 / 翻译 / 摘要 / Agent / RAG 入库检索 / Memory / Math / Parser / Embed / Partner 列表 / 能力清单)。
2027
+
2028
+ **与 spring.ai 的关系**:两个模块互补——`spring.ai` 提供 `ChatClient`/`Advisor`/`Tools` 抽象(Spring AI 2.0 风格),`spring.langchain` 提供 `Chain`/`Agent`/`Memory` 抽象(LangChain 生态)。底层复用同一个 `aiChatModel` Bean,不会重复计费。
2029
+
2040
2030
  ## 13. Java 迁移指南
2041
2031
 
2042
2032
  本文说明如何把现有的 Java Spring Boot、Spring Cloud Alibaba 和 MyBatis 分层代码迁移到 SpringBootAI。目标是保留清晰的 Controller / Service / Mapper 边界、配置习惯和常用注解意图,而不是让 Python 运行 Java 代码。
@@ -2562,7 +2552,7 @@ curl http://127.0.0.1:8848/nacos/v1/console/health/readiness
2562
2552
 
2563
2553
  ## 15. 项目结构
2564
2554
 
2565
- `example`、`example1`、`example5` 是仓库级示例,不属于 `springbootAI` 安装包,不会被打包。实际项目应创建自己的应用包。
2555
+ `example`、`example1`、`example5`、`example_langchain` 是仓库级示例,不属于 `springbootAI` 安装包,不会被打包。实际项目应创建自己的应用包。`example_langchain` 演示了 LangChain 模块的完整分层用法(`@SpringBootApplication` + `@RestController` + `@Service` + `@Configuration`),可作为 AI 应用脚手架参考。
2566
2556
 
2567
2557
  推荐目录结构:
2568
2558
 
@@ -2622,6 +2612,7 @@ python -m pytest -q tests
2622
2612
  - JWT access/refresh、生产密钥校验。
2623
2613
  - 配置占位符类型和 CORS/HTTP 错误状态。
2624
2614
  - AI 模块 87 用例(LangChain 切片委托 + 向量库适配器),全量 707 用例 0 失败。
2615
+ - LangChain 模块 75 用例(适配器/配置/自动装配/Partner/Prompt/Chain/Agent 6 种类型/Memory/Parser/VectorStore/Retriever/Index/Tool/Utility/Callback/安全求值器/端到端 RAG),覆盖双向桥接、bind_tools 工具绑定、沙箱逃逸防护。
2625
2616
 
2626
2617
  ---
2627
2618
 
@@ -2667,7 +2658,19 @@ JWT_SECRET_KEY=<至少32字符随机密钥>
2667
2658
 
2668
2659
  **`ConfigLoader()` 与上下文读取不同文件:** 确认应用通过 `ApplicationContext` 启动,而不是只在不同工作目录直接实例化加载器。上下文启动后会绑定全局实例和默认配置目录;需要加载独立配置时显式传入 `config_path` 或 `base_path`。
2669
2660
 
2670
- ### 17.7 上线前清单
2661
+ ### 17.7 LangChain 模块排错
2662
+
2663
+ **`@Autowired` 注入 `lcChainService` 报 `Cannot resolve parameter`:** 确认 `@Configuration` 类的 `__init__` 中调用了 `configure_ai()` + `configure_langchain()`,且该 `@Configuration` 类在 `@Service` 之前被实例化(SpringBootAI 默认保证这个顺序)。
2664
+
2665
+ **`Partner 'xxx' 注册失败(跳过)`:** 该 partner 的依赖包未安装。按告警提示 `pip install langchain-<partner>`,或在 `application.yml` 的 `spring.langchain.partners` 下移除该 partner。未安装的 partner 不会阻塞启动。
2666
+
2667
+ **`bind_tools` / `openai-tools` / `structured-chat` Agent 无法调用工具:** 确认使用的是真实 OpenAI 模型(非 FakeChatModel)。FakeChatModel 不返回 `tool_calls`,只能走 `react` 文本解析路径。
2668
+
2669
+ **RAG 报 `嵌入模型未装配`:** `configure_ai` 默认会装 `aiEmbeddingModel`,但需要 `OPENAI_API_KEY` 或 `OLLAMA_BASE_URL`。无 Key 时设 `AI_ALLOW_FAKE=true` 会降级 `FakeEmbeddingModel(dim=16)`,RAG 可演示但不真实。
2670
+
2671
+ **`run_conversation` 不记忆前文:** 便捷方法每次不传 memory 时会创建新 buffer。要多轮记忆需自己持有 memory 实例:`mem = MemoryFactory.create("buffer"); svc.run_conversation("...", memory=mem)`。
2672
+
2673
+ ### 17.8 上线前清单
2671
2674
 
2672
2675
  - 使用实际 MySQL/PostgreSQL/Oracle 版本运行 CRUD、事务、断连恢复和池耗尽测试。
2673
2676
  - 使用迁移工具管理结构,不让应用运行账号执行 DDL。
@@ -2764,9 +2767,28 @@ export PROMETHEUS_PORT=8000
2764
2767
  # Logging
2765
2768
  export LOG_LEVEL=INFO
2766
2769
  export LOG_DIR=logs
2767
- ```
2768
2770
 
2769
- > Sentinel 限流熔断、OpenTelemetry 分布式追踪和 API Gateway 可内嵌实现;HTTP 补偿事务通过 `SEATA_HTTP_*` 配置。AI 模块环境变量见第 12.2 节。
2771
+ # AI 模块(spring.ai.*,详见 AI_MODULE.md)
2772
+ export AI_PROVIDER=openai # openai|ollama|deepseek|moonshot|zhipu
2773
+ export AI_ALLOW_FAKE=true # 无 API Key 时降级 FakeChatModel(开发/测试)
2774
+ export OPENAI_API_KEY=sk-xxx
2775
+ export OPENAI_CHAT_MODEL=gpt-4o-mini
2776
+ export OLLAMA_BASE_URL=http://localhost:11434
2777
+ export OLLAMA_CHAT_MODEL=llama3
2778
+
2779
+ # LangChain 模块(spring.langchain.*,详见 LANGCHAIN_MODULE.md)
2780
+ export LC_ENABLED=true
2781
+ export LC_DEFAULT_LLM=auto # auto=复用 spring.ai 的 aiChatModel;或 partner 名
2782
+ export LC_AGENT_TYPE=react # react|openai-tools|structured-chat|...
2783
+ export LC_AGENT_MAX_ITER=10
2784
+ export LC_VECTOR_STORE=faiss # inmemory|faiss|chroma|redis|pinecone|weaviate|pgvector
2785
+ export LC_RETRIEVER=similarity # similarity|multi-query|contextual-compression|...
2786
+ export LC_RETRIEVER_K=4
2787
+ export LC_MEMORY=buffer # buffer|summary|buffer-window|token-buffer
2788
+ export LC_MEMORY_MAX=20
2789
+ ```
2790
+
2791
+ > Sentinel 限流熔断、OpenTelemetry 分布式追踪和 API Gateway 可内嵌实现;HTTP 补偿事务通过 `SEATA_HTTP_*` 配置。AI 模块完整环境变量见 [AI_MODULE.md](doc/AI_MODULE.md),LangChain 模块完整环境变量见 [LANGCHAIN_MODULE.md](doc/LANGCHAIN_MODULE.md)。
2770
2792
 
2771
2793
  ## 附录 B:Docker Compose 示例
2772
2794