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