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.
- {springbootai-1.8.7 → springbootai-1.8.9}/PKG-INFO +158 -22
- springbootai-1.8.7/springbootAI.egg-info/PKG-INFO → springbootai-1.8.9/README.md +117 -95
- {springbootai-1.8.7 → springbootai-1.8.9}/pyproject.toml +52 -11
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/__init__.py +1 -1
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/autoconfig.py +24 -10
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/vectorstore.py +63 -1
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/cloud.py +9 -7
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/cloud_aop.py +19 -8
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/__init__.py +2 -1
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/gateway.py +93 -20
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/seata.py +145 -98
- springbootai-1.8.9/spring/cloud/seata_bridge.py +142 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/config/config_loader.py +59 -1
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/bean_factory.py +7 -0
- springbootai-1.8.9/spring/langchain/__init__.py +66 -0
- springbootai-1.8.9/spring/langchain/adapters.py +297 -0
- springbootai-1.8.9/spring/langchain/agents/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/agents/services.py +189 -0
- springbootai-1.8.9/spring/langchain/autoconfig.py +364 -0
- springbootai-1.8.9/spring/langchain/callbacks/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/callbacks/handlers.py +50 -0
- springbootai-1.8.9/spring/langchain/chains/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/chains/services.py +170 -0
- springbootai-1.8.9/spring/langchain/indexes/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/indexes/index.py +93 -0
- springbootai-1.8.9/spring/langchain/loaders/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/loaders/loaders.py +111 -0
- springbootai-1.8.9/spring/langchain/memory/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/memory/memory.py +74 -0
- springbootai-1.8.9/spring/langchain/parsers/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/parsers/parsers.py +84 -0
- springbootai-1.8.9/spring/langchain/partners.py +205 -0
- springbootai-1.8.9/spring/langchain/prompts/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/prompts/templates.py +105 -0
- springbootai-1.8.9/spring/langchain/retrievers/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/retrievers/retrievers.py +95 -0
- springbootai-1.8.9/spring/langchain/tools/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/tools/tools.py +94 -0
- springbootai-1.8.9/spring/langchain/utilities/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/utilities/utils.py +92 -0
- springbootai-1.8.9/spring/langchain/vectorstores/__init__.py +4 -0
- springbootai-1.8.9/spring/langchain/vectorstores/stores.py +143 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/logging/loguru_logger.py +99 -32
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/cache/redis_cache.py +93 -42
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/jwt_utils.py +27 -13
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/actuator.py +115 -13
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/health.py +67 -46
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/web_context.py +6 -1
- springbootai-1.8.7/README.md → springbootai-1.8.9/springbootAI.egg-info/PKG-INFO +231 -11
- {springbootai-1.8.7 → springbootai-1.8.9}/springbootAI.egg-info/SOURCES.txt +32 -0
- springbootai-1.8.9/springbootAI.egg-info/requires.txt +105 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_actuator.py +7 -1
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_ai_module.py +19 -6
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_di_config_event_full.py +82 -0
- springbootai-1.8.9/tests/test_langchain_ext.py +3589 -0
- springbootai-1.8.9/tests/test_langchain_module.py +842 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_logging_config.py +128 -7
- springbootai-1.8.9/tests/test_seata_bridge.py +175 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_security.py +4 -1
- springbootai-1.8.7/springbootAI.egg-info/requires.txt +0 -74
- {springbootai-1.8.7 → springbootai-1.8.9}/LICENSE +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/MANIFEST.in +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/requirements.txt +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/setup.cfg +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/setup.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/advisors.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/annotations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/core.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/etl.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/memory.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/observability.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/providers.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/resilience.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/ai/tools.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/cache.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/conditional.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/core.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/annotations/messaging.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/comprehensive_aop.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/method_interceptor.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/aop/proxy_factory.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/discovery.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/feign.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/load_balancer.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/sentinel.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/tracer.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/cloud/transaction_store.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/config/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/config/binding.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/application_context.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/bean_definition.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/registry.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/context/scanner.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/core/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/core/graceful_shutdown.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/core/typing_utils.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/annotations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/converters.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/easy_csv.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/exceptions.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/reader.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/csv/writer.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/data/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/data/page.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/data/repository.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/data/specification.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/datasource/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/datasource/annotations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/datasource/context.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/datasource/dynamic.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/event/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/event/publisher.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/annotations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/converters.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/easy_excel.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/exceptions.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/reader.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/style.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/excel/writer.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/accessor.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/auto_config.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/holder.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/locale.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/locale_resolver.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/message_source.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/middleware.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/properties.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/i18n/sources.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/logging/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/main.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/messaging/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/messaging/rabbitmq.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/monitoring/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/monitoring/prometheus.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/database.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/ddl_auto.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/migration.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/mybatis_integration.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/annotations/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/annotations/annotations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/cache/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/cache/cache.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/circuit_breaker/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/configuration.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/core/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/core/sql_session.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/core/sql_session_factory.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/dialect/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/dialect/dialect.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/dynamic_sql/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/dynamic_sql/dynamic_sql.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/interceptor/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/interceptor/interceptor.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/mapper/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/mapper/mapper.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/metrics/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/metrics/metrics.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/pool/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/pool/connection_pool.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/access_control.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/password_encoder.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/sensitive_data_masker.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/security/sql_injection_detector.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/transaction/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/transaction/transaction.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/type_handler/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/type_handler/type_handler.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/version.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/xml_parser/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/orm/pymybatis/xml_parser/xml_parser.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/retry/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/retry/retry_annotations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/retry/retry_decorator.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/scheduling/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/scheduling/scheduler.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/replay_protection.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/secret_manager.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/security_aop.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/security/security_context.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/test/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/test/slicing.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/tracing/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/tracing/skywalking.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/tx/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/tx/events.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/tx/synchronization.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/banner.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/bean_utils.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/logger.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/utils/redis_client.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/aop.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/constraints.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/exceptions.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/validation/validator.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/exception_handler.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/interceptor.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/result.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/web/swagger.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/__init__.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/annotations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/broker.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/exceptions.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/handler.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/router.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/spring/websocket/session.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/springbootAI.egg-info/dependency_links.txt +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/springbootAI.egg-info/entry_points.txt +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/springbootAI.egg-info/top_level.txt +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/sql/seata_undo_log.sql +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_annotation_combinations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_annotations_contract.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_aop_annotations_full.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_bean_utils.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_cache_annotations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_cloud_embedded_full.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_component_init_error.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_conditional_annotations.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_config_binding.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_config_fixes_185.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_connection_resilience.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_core_annotations_full.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_csv_module.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_data_repository.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_datasource_routing.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_ddl_auto.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_excel_module.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_i18n_module.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_jpa_version_transient.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_new_features.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_orm_pymybatis_full.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_production_readiness.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_pymybatis_contract.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_seata_durable_store.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_security_full.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_swagger_module.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_test_slicing.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_transactional_events.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_validation_module.py +0 -0
- {springbootai-1.8.7 → springbootai-1.8.9}/tests/test_web_annotations_full.py +0 -0
- {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.
|
|
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==
|
|
56
|
-
Requires-Dist: langchain-core==
|
|
57
|
-
Requires-Dist: langchain-
|
|
58
|
-
Requires-Dist: langchain-
|
|
59
|
-
Requires-Dist:
|
|
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==
|
|
79
|
-
Requires-Dist: langchain-core==
|
|
80
|
-
Requires-Dist: langchain-
|
|
81
|
-
Requires-Dist: langchain-
|
|
82
|
-
Requires-Dist:
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|