springbootAI 2.3.8__tar.gz → 2.3.10__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.3.8 → springbootai-2.3.10}/CHANGELOG.md +18 -0
- {springbootai-2.3.8/springbootAI.egg-info → springbootai-2.3.10}/PKG-INFO +26 -10
- {springbootai-2.3.8 → springbootai-2.3.10}/README.md +25 -9
- {springbootai-2.3.8 → springbootai-2.3.10}/pyproject.toml +46 -47
- {springbootai-2.3.8 → springbootai-2.3.10/springbootAI.egg-info}/PKG-INFO +26 -10
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootAI.egg-info/SOURCES.txt +8 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/__init__.py +16 -8
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/advisors.py +55 -10
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/annotation_runtime.py +18 -6
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/annotations.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/autoconfig.py +63 -14
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/core.py +154 -30
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/etl.py +73 -12
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/memory.py +50 -26
- springbootai-2.3.10/springbootai/ai/providers.py +1521 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/resilience.py +22 -9
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/tools.py +100 -10
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/vectorstore.py +41 -3
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/core.py +4 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/data.py +13 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/enterprise.py +7 -7
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/security.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/aop/comprehensive_aop.py +394 -309
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cli/main.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cli/scaffold.py +33 -4
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/__init__.py +11 -2
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/bus.py +64 -12
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/config_center.py +218 -40
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/discovery.py +102 -23
- springbootai-2.3.10/springbootai/cloud/feign.py +608 -0
- springbootai-2.3.10/springbootai/cloud/gateway.py +880 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/seata.py +224 -48
- springbootai-2.3.10/springbootai/cloud/seata_at_proxy.py +847 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/config/config_loader.py +3 -3
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/config/spring-configuration-metadata.json +31 -21
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/csv/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/data/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/data/rest.py +140 -39
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/datasource/__init__.py +1 -1
- springbootai-2.3.10/springbootai/devtools.py +243 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/excel/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/__init__.py +2 -2
- springbootai-2.3.10/springbootai/logging/__init__.py +13 -0
- springbootai-2.3.10/springbootai/logging/context.py +213 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/logging/loguru_logger.py +107 -13
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/main.py +237 -73
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/mcp/client.py +11 -1
- springbootai-2.3.10/springbootai/monitoring/admin_client.py +266 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/core/sql_session.py +11 -28
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/dynamic_sql/dynamic_sql.py +19 -19
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/interceptor/interceptor.py +17 -12
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/security/sql_injection_detector.py +17 -12
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/version.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/security/jwt_utils.py +2 -2
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/security/oauth2.py +39 -8
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/security/security_aop.py +7 -2
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/test/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/tracing/skywalking.py +72 -27
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/tx/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/utils/banner.py +3 -3
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/validation/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/csrf.py +40 -11
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/request_metrics.py +4 -4
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/swagger.py +5 -5
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/web_context.py +67 -11
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/websocket/__init__.py +1 -1
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_ai_comprehensive.py +9 -5
- springbootai-2.3.10/tests/test_ai_enterprise_hardening.py +349 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_ai_module.py +7 -8
- springbootai-2.3.10/tests/test_ai_stream_hardening.py +461 -0
- springbootai-2.3.10/tests/test_cloud_log_safety.py +260 -0
- springbootai-2.3.10/tests/test_config_admin_hardening.py +207 -0
- springbootai-2.3.10/tests/test_devtools_lifecycle_hardening.py +193 -0
- springbootai-2.3.10/tests/test_enterprise_safety_regressions.py +318 -0
- springbootai-2.3.10/tests/test_io_http_logging_hardening.py +847 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_metadata.py +2 -2
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_seata_at_proxy.py +73 -4
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_security_hardening.py +88 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_tracing.py +3 -6
- springbootai-2.3.8/springbootai/ai/providers.py +0 -881
- springbootai-2.3.8/springbootai/cloud/feign.py +0 -469
- springbootai-2.3.8/springbootai/cloud/gateway.py +0 -542
- springbootai-2.3.8/springbootai/cloud/seata_at_proxy.py +0 -534
- springbootai-2.3.8/springbootai/devtools.py +0 -153
- springbootai-2.3.8/springbootai/logging/__init__.py +0 -1
- springbootai-2.3.8/springbootai/monitoring/admin_client.py +0 -77
- {springbootai-2.3.8 → springbootai-2.3.10}/LICENSE +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/MANIFEST.in +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/SECURITY.md +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/requirements-ai.txt +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/requirements-langgraph.txt +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/requirements-mcp.txt +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/requirements.txt +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/setup.cfg +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/setup.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootAI.egg-info/dependency_links.txt +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootAI.egg-info/entry_points.txt +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootAI.egg-info/requires.txt +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootAI.egg-info/top_level.txt +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/ai/observability.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/batch.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/cache.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/cloud.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/conditional.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/langchain.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/langgraph.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/lombok.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/annotations/messaging.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/aop/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/aop/aspect.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/aop/cloud_aop.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/aop/method_interceptor.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/aop/proxy_factory.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/batch/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cli/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/load_balancer.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/nacos_config.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/seata_bridge.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/sentinel.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/tracer.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/cloud/transaction_store.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/config/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/config/binding.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/config/config_monitor.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/context/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/context/application_context.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/context/bean_definition.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/context/bean_factory.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/context/lifecycle.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/context/registry.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/context/scanner.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/core/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/core/graceful_shutdown.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/core/typing_utils.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/csv/annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/csv/converters.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/csv/easy_csv.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/csv/exceptions.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/csv/reader.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/csv/writer.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/data/page.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/data/repository.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/data/specification.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/datasource/annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/datasource/context.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/datasource/dynamic.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/event/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/event/publisher.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/excel/annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/excel/converters.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/excel/easy_excel.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/excel/exceptions.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/excel/reader.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/excel/style.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/excel/writer.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/accessor.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/auto_config.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/holder.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/locale.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/locale_resolver.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/message_source.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/middleware.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/properties.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/i18n/sources.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/adapters.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/agents/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/agents/services.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/autoconfig.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/callbacks/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/callbacks/handlers.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/chains/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/chains/services.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/core.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/indexes/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/indexes/index.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/loaders/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/loaders/loaders.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/memory/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/memory/memory.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/parsers/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/parsers/parsers.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/partners.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/prompts/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/prompts/templates.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/retrievers/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/retrievers/retrievers.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/tools/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/tools/tools.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/utilities/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/utilities/utils.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/vectorstores/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langchain/vectorstores/stores.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langgraph/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langgraph/annotation_runtime.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langgraph/annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langgraph/autoconfig.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langgraph/checkpoint.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langgraph/config.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/langgraph/runtime.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/mcp/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/mcp/annotation_runtime.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/mcp/annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/mcp/autoconfig.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/mcp/config.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/mcp/server.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/messaging/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/messaging/kafka.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/messaging/rabbitmq.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/monitoring/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/monitoring/prometheus.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/database.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/ddl_auto.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/migration.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/mybatis_integration.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/annotations/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/annotations/annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/cache/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/cache/cache.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/cache/redis_cache.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/circuit_breaker/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/circuit_breaker/circuit_breaker.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/configuration.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/core/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/core/sql_session_factory.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/dialect/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/dialect/dialect.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/dynamic_sql/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/interceptor/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/mapper/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/mapper/mapper.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/metrics/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/metrics/metrics.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/pool/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/pool/connection_pool.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/security/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/security/access_control.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/security/password_encoder.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/security/sensitive_data_masker.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/transaction/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/transaction/transaction.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/type_handler/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/type_handler/type_handler.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/xml_parser/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/orm/pymybatis/xml_parser/xml_parser.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/retry/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/retry/recovery.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/retry/retry_annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/retry/retry_decorator.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/scheduling/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/scheduling/scheduler.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/security/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/security/replay_protection.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/security/secret_manager.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/security/security_context.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/test/slicing.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/tracing/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/tx/events.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/tx/synchronization.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/utils/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/utils/bean_utils.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/utils/logger.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/utils/redis_client.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/validation/aop.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/validation/constraints.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/validation/exceptions.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/validation/validator.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/__init__.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/actuator.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/exception_handler.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/hateoas.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/health.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/interceptor.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/web/result.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/websocket/annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/websocket/broker.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/websocket/exceptions.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/websocket/handler.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/websocket/router.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/springbootai/websocket/session.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/sql/seata_undo_log.sql +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_actuator.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_actuator_prometheus_admin.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_ai_annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_ai_declarative_annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_annotation_combinations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_annotations_contract.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_aop_annotations_full.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_aop_pointcut_enhancements.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_audit_time.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_batch.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_bean_utils.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_bus.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_cache_annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_cli.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_cloud_embedded_full.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_component_init_error.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_compositional_annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_conditional_annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_config_binding.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_config_center.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_config_center_hardening.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_config_fixes_185.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_config_monitor.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_connection_resilience.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_core.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_core_annotations_full.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_csrf.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_csv_module.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_data_repository.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_data_rest.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_datasource_routing.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_ddl_auto.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_declarative_aop_post_authorize_recover.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_devtools.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_di_config_event_full.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_excel_module.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_hateoas.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_i18n_module.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_ioc_lifecycle_enhancements.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_jpa_version_transient.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_kafka.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_langchain_comprehensive.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_langchain_ext.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_langchain_module.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_langgraph_comprehensive.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_langgraph_module.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_logging_config.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_lombok_annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_mcp_module.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_migration.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_nacos_config.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_new_annotations.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_new_features.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_oauth2.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_optional_component_timeouts.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_orm_pymybatis_full.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_production_readiness.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_pymybatis_configuration_hardening.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_pymybatis_contract.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_request_metrics.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_retry.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_runtime_configuration_fixes.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_scaffold_hardening.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_scheduling.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_seata_bridge.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_seata_durable_store.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_security.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_security_full.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_select_page.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_starter.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_startup_lifecycle.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_swagger_module.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_test_slicing.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_transactional_events.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_validation_module.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_web_annotations_full.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_web_file_upload.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_web_root_mapping.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_web_security_responses.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_web_static_files.py +0 -0
- {springbootai-2.3.8 → springbootai-2.3.10}/tests/test_websocket_module.py +0 -0
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.3.10] - 2026-08-29
|
|
4
|
+
|
|
5
|
+
- 修复 AI 代理上下游消息被 SQL 注入检测误报:`#{...}` 绑定值始终按数据处理,不再扫描消息内容;`${...}` 原始替换仍默认拒绝,只有配置允许且值完整匹配严格白名单时才能使用。
|
|
6
|
+
- 加固企业级 AOP 注解:完善限流、熔断、幂等和分布式锁的共享后端、失败关闭与异步语义,并补充企业安全回归测试。
|
|
7
|
+
- 加固 OAuth2、CSRF 与 Data REST:完善 JWKS/issuer/audience/algorithm 校验、签名 CSRF Token、默认鉴权以及读写字段白名单。
|
|
8
|
+
- 完善受限 Seata AT 补偿模式:限制可解析 SQL 子集,使用绑定参数采集快照,原子写入 undo_log,增加冲突检测、自动安装代理和恢复线程生命周期管理;该模式仍不提供官方 TC 全局锁或跨服务强一致性。
|
|
9
|
+
- 审计并修正文档:统一当前版本号,修复 Starter 损坏的依赖示例、无效 Spring 官方链接、不可运行的 ChatClient 示例、过期改进记录、配置元数据偏差、Sphinx 包名及乱码注释。
|
|
10
|
+
- README 开头增加对阿里、华为、讯飞、心之声、字节、OpenAI、DeepSeek 等公司支持的致谢,不声明其使用或官方背书。
|
|
11
|
+
|
|
12
|
+
## [2.3.9] - 2026-08-28
|
|
13
|
+
|
|
14
|
+
- 加固 OpenAI 兼容接口与 Ollama 的同步/异步流式协议:校验终止帧、错误信封和畸形响应,限制事件与响应大小,并完善超时、有限重试、重定向拒绝及 SDK 重试边界。
|
|
15
|
+
- 修复 AI 异步流阻塞事件循环、请求参数覆盖受保护字段、输出 Token 上限绕过、工具调用闭环和多租户 Memory/RAG 隔离等问题。
|
|
16
|
+
- 加固 Feign、Gateway、Config Center、Admin 与 Discovery:正确释放响应、执行路由谓词和过滤器、过滤逐跳头、传播请求 ID,并增加路径、响应大小、故障回退与生命周期保护。
|
|
17
|
+
- 新增统一日志脱敏和日志注入防护,覆盖异常链、Bearer/Basic/Cookie、云事件、Nacos、Seata 与 SkyWalking,避免敏感负载进入日志或健康响应。
|
|
18
|
+
- 修复原子脚手架写入、TextReader 文件边界、DevTools 停止/重启语义、SkyWalking 显式初始化和 Banner 版本读取错误。
|
|
19
|
+
- 新增企业加固回归测试;完整测试结果为 3170 passed、11 skipped、0 failed,Bandit 中高危扫描为 0。
|
|
20
|
+
|
|
3
21
|
## [2.3.8] - 2026-08-24
|
|
4
22
|
|
|
5
23
|
- 修复配置加载的原子性与数据库 URL 优先级:请求监控不再误落到根目录 `test.db`,SQLite 运行目录会自动创建,显式 URL/驱动/数据库名称按统一优先级生效。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: springbootAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.10
|
|
4
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
|
|
@@ -172,6 +172,8 @@ Dynamic: license-file
|
|
|
172
172
|
[](https://github.com/YUCONGGEN/springbootAI/actions/workflows/security.yml)
|
|
173
173
|
[](https://github.com/YUCONGGEN/springbootAI/blob/master/LICENSE)
|
|
174
174
|
|
|
175
|
+
> 感谢阿里、华为、讯飞、心之声、字节、OpenAI、DeepSeek 等公司的支持。
|
|
176
|
+
|
|
175
177
|
## SpringBootAI 考试认证与证书
|
|
176
178
|
|
|
177
179
|
SpringBootAI 已提供配套的在线考试认证平台,学习者、团队成员和项目使用方可以通过认证考试检验自己对框架核心能力的掌握情况,并在通过考试后获得对应证书。
|
|
@@ -216,7 +218,7 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
216
218
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
217
219
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
218
220
|
|
|
219
|
-
当前版本是 `2.3.
|
|
221
|
+
当前版本是 `2.3.10`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 是无 TC 全局锁的单进程受限补偿模式,不应当作跨服务强一致方案。
|
|
220
222
|
|
|
221
223
|
[新手指南](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)
|
|
222
224
|
|
|
@@ -347,10 +349,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
347
349
|
|
|
348
350
|
| 组件 | 当前版本 |
|
|
349
351
|
|------|----------|
|
|
350
|
-
| `springbootai` 框架 API | 2.3.
|
|
351
|
-
| `springbootai.orm.pymybatis` | 2.3.
|
|
352
|
-
| `springbootai.ai` AI 模块 | 2.3.
|
|
353
|
-
| `springbootai.langchain` LangChain 模块 | 2.3.
|
|
352
|
+
| `springbootai` 框架 API | 2.3.10 |
|
|
353
|
+
| `springbootai.orm.pymybatis` | 2.3.10 |
|
|
354
|
+
| `springbootai.ai` AI 模块 | 2.3.10 |
|
|
355
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.10 |
|
|
354
356
|
| Python | 3.10+ |
|
|
355
357
|
|
|
356
358
|
### 1.4 适合什么场景
|
|
@@ -366,7 +368,7 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
366
368
|
- `@Transactional` 支持七种 Spring 传播模式;`REQUIRES_NEW` 和 `NOT_SUPPORTED` 需要连接池有额外可用连接。
|
|
367
369
|
- Profile 会筛选 `@Profile` Bean,并深度合并同目录的 `application-{profile}.yml`。
|
|
368
370
|
- Nacos、RabbitMQ、Prometheus 依赖外部服务;Sentinel 限流熔断和 OpenTelemetry 追踪可内嵌运行。
|
|
369
|
-
- HTTP 事务模式是持久化补偿协调器;`distributed` 模式提供真实 Seata TC + TCC 回调;`at` 模式通过 ORM
|
|
371
|
+
- HTTP 事务模式是持久化补偿协调器;`distributed` 模式提供真实 Seata TC + TCC 回调;`at` 模式通过 ORM 拦截器记录 undo_log,但仅提供单进程、单数据库的受限补偿。
|
|
370
372
|
- 限流、分布式锁、幂等和缓存语义依赖 Redis 等后端;核心业务必须选择 fail-closed,不能依赖进程内降级继续提供分布式语义。
|
|
371
373
|
|
|
372
374
|
### 1.6 注解使用总览
|
|
@@ -401,7 +403,7 @@ SpringBootAI 注解会先把元数据放到 `__spring_annotations__`。之后是
|
|
|
401
403
|
| Nacos 服务发现 | ✅ 可用 | 服务注册/发现/订阅 |
|
|
402
404
|
| Sentinel 限流熔断 | ✅ 可用 | 内嵌引擎,QPS 限流、异常比例熔断、热点参数限流,无需 Dashboard |
|
|
403
405
|
| 分布式追踪 | ✅ 可用 | 原生 OpenTelemetry(W3C traceparent),自动 HTTP/Feign 注入 |
|
|
404
|
-
| Seata 分布式事务 | ✅
|
|
406
|
+
| Seata 分布式事务 | ✅ 有条件可用 | `distributed` 对接真实 Seata TC 执行 TCC 回调;`at` 仅为无全局锁的单进程受限补偿;`http` 提供持久化补偿 |
|
|
405
407
|
| API Gateway | ✅ 可用 | 轻量 ASGI/WSGI 网关,路由转发、路径重写、过滤器链、负载均衡 |
|
|
406
408
|
| Prometheus 监控 | ✅ 可用 | Counter/Gauge/Histogram 指标暴露 |
|
|
407
409
|
| Feign 声明式 HTTP | ✅ 可用 | 声明式接口、Fallback 降级、自动传播 XID 和 trace 头 |
|
|
@@ -905,7 +907,7 @@ class AppService:
|
|
|
905
907
|
self.app_name = value
|
|
906
908
|
|
|
907
909
|
@Component
|
|
908
|
-
@ConfigurationProperties(prefix="
|
|
910
|
+
@ConfigurationProperties(prefix="database")
|
|
909
911
|
class DataSourceProperties:
|
|
910
912
|
def __init__(self):
|
|
911
913
|
self.url = ""
|
|
@@ -937,6 +939,16 @@ class InitService:
|
|
|
937
939
|
self.connection.close()
|
|
938
940
|
```
|
|
939
941
|
|
|
942
|
+
每个 HTTP 请求都会获得 `X-Request-ID`(可通过
|
|
943
|
+
`server.request-id.header` 修改),该值会写回响应并自动进入框架日志,Feign
|
|
944
|
+
和 Gateway 也会向下游透传。日志会遮蔽 Bearer Token、API Key、密码、Cookie
|
|
945
|
+
等常见敏感字段;`logging.diagnose` 默认关闭,避免异常帧局部变量泄密。
|
|
946
|
+
|
|
947
|
+
声明式 Feign 客户端默认复用连接池,对幂等请求执行有限退避重试,并支持连接/
|
|
948
|
+
读取超时与响应大小限制。直接读取 RAG 文本文件时建议使用
|
|
949
|
+
`TextReader.from_file(path, max_bytes=...)`,文件不存在或超限会明确失败,不会把
|
|
950
|
+
错误路径误当成内联文本。
|
|
951
|
+
|
|
940
952
|
### 5.7 应用事件
|
|
941
953
|
|
|
942
954
|
```python
|
|
@@ -1895,9 +1907,13 @@ export LOG_DIR=logs
|
|
|
1895
1907
|
|
|
1896
1908
|
# AI 模块
|
|
1897
1909
|
export AI_PROVIDER=openai
|
|
1898
|
-
export AI_ALLOW_FAKE=
|
|
1910
|
+
export AI_ALLOW_FAKE=false
|
|
1899
1911
|
export OPENAI_API_KEY=sk-xxx
|
|
1900
1912
|
export OPENAI_CHAT_MODEL=gpt-4o-mini
|
|
1913
|
+
export AI_REQUEST_TIMEOUT_SECONDS=60
|
|
1914
|
+
export AI_MAX_OUTPUT_TOKENS=4096
|
|
1915
|
+
export AI_MAX_TOTAL_TOKENS=100000
|
|
1916
|
+
export AI_MAX_TOOL_ITERATIONS=5
|
|
1901
1917
|
export OLLAMA_BASE_URL=http://localhost:11434
|
|
1902
1918
|
export OLLAMA_CHAT_MODEL=llama3
|
|
1903
1919
|
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
[](https://github.com/YUCONGGEN/springbootAI/actions/workflows/security.yml)
|
|
11
11
|
[](https://github.com/YUCONGGEN/springbootAI/blob/master/LICENSE)
|
|
12
12
|
|
|
13
|
+
> 感谢阿里、华为、讯飞、心之声、字节、OpenAI、DeepSeek 等公司的支持。
|
|
14
|
+
|
|
13
15
|
## SpringBootAI 考试认证与证书
|
|
14
16
|
|
|
15
17
|
SpringBootAI 已提供配套的在线考试认证平台,学习者、团队成员和项目使用方可以通过认证考试检验自己对框架核心能力的掌握情况,并在通过考试后获得对应证书。
|
|
@@ -54,7 +56,7 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
54
56
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
55
57
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
56
58
|
|
|
57
|
-
当前版本是 `2.3.
|
|
59
|
+
当前版本是 `2.3.10`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 是无 TC 全局锁的单进程受限补偿模式,不应当作跨服务强一致方案。
|
|
58
60
|
|
|
59
61
|
[新手指南](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)
|
|
60
62
|
|
|
@@ -185,10 +187,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
185
187
|
|
|
186
188
|
| 组件 | 当前版本 |
|
|
187
189
|
|------|----------|
|
|
188
|
-
| `springbootai` 框架 API | 2.3.
|
|
189
|
-
| `springbootai.orm.pymybatis` | 2.3.
|
|
190
|
-
| `springbootai.ai` AI 模块 | 2.3.
|
|
191
|
-
| `springbootai.langchain` LangChain 模块 | 2.3.
|
|
190
|
+
| `springbootai` 框架 API | 2.3.10 |
|
|
191
|
+
| `springbootai.orm.pymybatis` | 2.3.10 |
|
|
192
|
+
| `springbootai.ai` AI 模块 | 2.3.10 |
|
|
193
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.10 |
|
|
192
194
|
| Python | 3.10+ |
|
|
193
195
|
|
|
194
196
|
### 1.4 适合什么场景
|
|
@@ -204,7 +206,7 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
204
206
|
- `@Transactional` 支持七种 Spring 传播模式;`REQUIRES_NEW` 和 `NOT_SUPPORTED` 需要连接池有额外可用连接。
|
|
205
207
|
- Profile 会筛选 `@Profile` Bean,并深度合并同目录的 `application-{profile}.yml`。
|
|
206
208
|
- Nacos、RabbitMQ、Prometheus 依赖外部服务;Sentinel 限流熔断和 OpenTelemetry 追踪可内嵌运行。
|
|
207
|
-
- HTTP 事务模式是持久化补偿协调器;`distributed` 模式提供真实 Seata TC + TCC 回调;`at` 模式通过 ORM
|
|
209
|
+
- HTTP 事务模式是持久化补偿协调器;`distributed` 模式提供真实 Seata TC + TCC 回调;`at` 模式通过 ORM 拦截器记录 undo_log,但仅提供单进程、单数据库的受限补偿。
|
|
208
210
|
- 限流、分布式锁、幂等和缓存语义依赖 Redis 等后端;核心业务必须选择 fail-closed,不能依赖进程内降级继续提供分布式语义。
|
|
209
211
|
|
|
210
212
|
### 1.6 注解使用总览
|
|
@@ -239,7 +241,7 @@ SpringBootAI 注解会先把元数据放到 `__spring_annotations__`。之后是
|
|
|
239
241
|
| Nacos 服务发现 | ✅ 可用 | 服务注册/发现/订阅 |
|
|
240
242
|
| Sentinel 限流熔断 | ✅ 可用 | 内嵌引擎,QPS 限流、异常比例熔断、热点参数限流,无需 Dashboard |
|
|
241
243
|
| 分布式追踪 | ✅ 可用 | 原生 OpenTelemetry(W3C traceparent),自动 HTTP/Feign 注入 |
|
|
242
|
-
| Seata 分布式事务 | ✅
|
|
244
|
+
| Seata 分布式事务 | ✅ 有条件可用 | `distributed` 对接真实 Seata TC 执行 TCC 回调;`at` 仅为无全局锁的单进程受限补偿;`http` 提供持久化补偿 |
|
|
243
245
|
| API Gateway | ✅ 可用 | 轻量 ASGI/WSGI 网关,路由转发、路径重写、过滤器链、负载均衡 |
|
|
244
246
|
| Prometheus 监控 | ✅ 可用 | Counter/Gauge/Histogram 指标暴露 |
|
|
245
247
|
| Feign 声明式 HTTP | ✅ 可用 | 声明式接口、Fallback 降级、自动传播 XID 和 trace 头 |
|
|
@@ -743,7 +745,7 @@ class AppService:
|
|
|
743
745
|
self.app_name = value
|
|
744
746
|
|
|
745
747
|
@Component
|
|
746
|
-
@ConfigurationProperties(prefix="
|
|
748
|
+
@ConfigurationProperties(prefix="database")
|
|
747
749
|
class DataSourceProperties:
|
|
748
750
|
def __init__(self):
|
|
749
751
|
self.url = ""
|
|
@@ -775,6 +777,16 @@ class InitService:
|
|
|
775
777
|
self.connection.close()
|
|
776
778
|
```
|
|
777
779
|
|
|
780
|
+
每个 HTTP 请求都会获得 `X-Request-ID`(可通过
|
|
781
|
+
`server.request-id.header` 修改),该值会写回响应并自动进入框架日志,Feign
|
|
782
|
+
和 Gateway 也会向下游透传。日志会遮蔽 Bearer Token、API Key、密码、Cookie
|
|
783
|
+
等常见敏感字段;`logging.diagnose` 默认关闭,避免异常帧局部变量泄密。
|
|
784
|
+
|
|
785
|
+
声明式 Feign 客户端默认复用连接池,对幂等请求执行有限退避重试,并支持连接/
|
|
786
|
+
读取超时与响应大小限制。直接读取 RAG 文本文件时建议使用
|
|
787
|
+
`TextReader.from_file(path, max_bytes=...)`,文件不存在或超限会明确失败,不会把
|
|
788
|
+
错误路径误当成内联文本。
|
|
789
|
+
|
|
778
790
|
### 5.7 应用事件
|
|
779
791
|
|
|
780
792
|
```python
|
|
@@ -1733,9 +1745,13 @@ export LOG_DIR=logs
|
|
|
1733
1745
|
|
|
1734
1746
|
# AI 模块
|
|
1735
1747
|
export AI_PROVIDER=openai
|
|
1736
|
-
export AI_ALLOW_FAKE=
|
|
1748
|
+
export AI_ALLOW_FAKE=false
|
|
1737
1749
|
export OPENAI_API_KEY=sk-xxx
|
|
1738
1750
|
export OPENAI_CHAT_MODEL=gpt-4o-mini
|
|
1751
|
+
export AI_REQUEST_TIMEOUT_SECONDS=60
|
|
1752
|
+
export AI_MAX_OUTPUT_TOKENS=4096
|
|
1753
|
+
export AI_MAX_TOTAL_TOKENS=100000
|
|
1754
|
+
export AI_MAX_TOOL_ITERATIONS=5
|
|
1739
1755
|
export OLLAMA_BASE_URL=http://localhost:11434
|
|
1740
1756
|
export OLLAMA_CHAT_MODEL=llama3
|
|
1741
1757
|
|
|
@@ -3,16 +3,16 @@ requires = ["setuptools>=77", "wheel>=0.37"]
|
|
|
3
3
|
build-backend = "setuptools.build_meta"
|
|
4
4
|
|
|
5
5
|
# ========================================
|
|
6
|
-
# SpringBootAI
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
6
|
+
# SpringBootAI 项目元数据与依赖声明(PEP 621)
|
|
7
|
+
# 本文件是依赖的唯一真实来源,类似 Spring Boot 的 pom.xml。
|
|
8
|
+
# 核心依赖使用精确版本;LangChain partner 包使用带上限的兼容范围。
|
|
9
|
+
# 内置 HTTP/AT 模式是受限补偿机制;生产分布式事务需要真实协调器和业务幂等。
|
|
10
10
|
# ========================================
|
|
11
11
|
|
|
12
12
|
[project]
|
|
13
13
|
# Distribution name: springbootAI (pip install springbootAI); import package: springbootai.
|
|
14
14
|
name = "springbootAI"
|
|
15
|
-
version = "2.3.
|
|
15
|
+
version = "2.3.10"
|
|
16
16
|
description = "Spring-style Python framework with Web, ORM, Cloud and AI integrations"
|
|
17
17
|
readme = "README.md"
|
|
18
18
|
license = "MIT"
|
|
@@ -35,8 +35,8 @@ classifiers = [
|
|
|
35
35
|
requires-python = ">=3.10"
|
|
36
36
|
|
|
37
37
|
# ========================================
|
|
38
|
-
#
|
|
39
|
-
#
|
|
38
|
+
# 核心依赖——类似 Spring Boot Starter Web/Core
|
|
39
|
+
# 安装:pip install springbootAI
|
|
40
40
|
# ========================================
|
|
41
41
|
dependencies = [
|
|
42
42
|
"fastapi==0.141.1",
|
|
@@ -56,50 +56,50 @@ dependencies = [
|
|
|
56
56
|
|
|
57
57
|
[project.optional-dependencies]
|
|
58
58
|
# ========================================
|
|
59
|
-
#
|
|
59
|
+
# 数据库驱动——类似 Spring Boot Starter JDBC/Data JPA
|
|
60
60
|
# ========================================
|
|
61
61
|
mysql = ["PyMySQL==1.2.0"]
|
|
62
62
|
postgresql = ["psycopg2-binary==2.9.12"]
|
|
63
63
|
sqlalchemy = ["sqlalchemy==2.0.40"]
|
|
64
64
|
|
|
65
65
|
# ========================================
|
|
66
|
-
# Redis
|
|
66
|
+
# Redis——类似 Spring Boot Starter Data Redis
|
|
67
67
|
# ========================================
|
|
68
68
|
redis = ["redis==8.1.0"]
|
|
69
69
|
|
|
70
70
|
# ========================================
|
|
71
|
-
#
|
|
71
|
+
# 消息队列——类似 Spring Boot Starter AMQP
|
|
72
72
|
# ========================================
|
|
73
73
|
rabbitmq = ["pika==1.4.4"]
|
|
74
74
|
kafka = ["kafka-python==2.0.2"]
|
|
75
75
|
|
|
76
76
|
# ========================================
|
|
77
|
-
#
|
|
77
|
+
# 服务发现——类似 Spring Cloud Alibaba Nacos
|
|
78
78
|
# ========================================
|
|
79
79
|
nacos = ["nacos-sdk-python==2.0.11"]
|
|
80
80
|
|
|
81
81
|
# ========================================
|
|
82
|
-
#
|
|
82
|
+
# 监控和日志——类似 Spring Boot Actuator + Micrometer
|
|
83
83
|
# ========================================
|
|
84
84
|
prometheus = ["prometheus-client==0.26.0"]
|
|
85
85
|
logging = ["loguru==0.7.3"]
|
|
86
86
|
|
|
87
87
|
# ========================================
|
|
88
|
-
# SQL
|
|
88
|
+
# SQL 结构分析(可选 AST 校验)
|
|
89
89
|
# ========================================
|
|
90
90
|
ast = ["sqlglot==27.28.1"]
|
|
91
91
|
|
|
92
92
|
# ========================================
|
|
93
|
-
# Excel
|
|
94
|
-
#
|
|
93
|
+
# Excel 注解驱动读写——类似 Alibaba EasyExcel
|
|
94
|
+
# 安装:pip install springbootAI[excel]
|
|
95
95
|
# ========================================
|
|
96
96
|
excel = ["openpyxl==3.1.5"]
|
|
97
97
|
|
|
98
98
|
# ========================================
|
|
99
|
-
# SpringBootAI AI
|
|
100
|
-
#
|
|
101
|
-
#
|
|
102
|
-
#
|
|
99
|
+
# SpringBootAI AI 模块——对齐 Spring AI(ChatClient/Advisor/ETL/Tools)
|
|
100
|
+
# 安装:pip install springbootAI[ai]
|
|
101
|
+
# 可选依赖未安装时核心包仍可导入;真实模型能力需安装对应 extra。
|
|
102
|
+
# 依赖清单与 requirements-ai.txt 保持同步。
|
|
103
103
|
# ========================================
|
|
104
104
|
ai = [
|
|
105
105
|
"langchain-openai==1.4.2",
|
|
@@ -112,10 +112,10 @@ ai = [
|
|
|
112
112
|
]
|
|
113
113
|
|
|
114
114
|
# ========================================
|
|
115
|
-
# SpringBootAI LangChain
|
|
116
|
-
#
|
|
117
|
-
#
|
|
118
|
-
#
|
|
115
|
+
# SpringBootAI LangChain 模块——封装 langchain classic 与常用 partner
|
|
116
|
+
# 安装:pip install springbootAI[langchain]
|
|
117
|
+
# partner 包按需启用;未安装的 provider 会跳过并给出明确提示。
|
|
118
|
+
# 详见 doc/LANGCHAIN_MODULE.md
|
|
119
119
|
# ========================================
|
|
120
120
|
langchain = [
|
|
121
121
|
"langchain-openai==1.4.2",
|
|
@@ -125,13 +125,13 @@ langchain = [
|
|
|
125
125
|
"langchain-community==0.4.2",
|
|
126
126
|
"numpy==2.2.6",
|
|
127
127
|
"pydantic==2.13.4",
|
|
128
|
-
#
|
|
128
|
+
# 默认安装的向量库、文档和工具依赖
|
|
129
129
|
"faiss-cpu>=1.7.4,<2",
|
|
130
130
|
"pypdf>=4.0.0,<6",
|
|
131
131
|
"beautifulsoup4>=4.12.0,<5",
|
|
132
132
|
"sqlalchemy>=2.0.0,<3",
|
|
133
|
-
# partner
|
|
134
|
-
#
|
|
133
|
+
# 常用 partner 包;其他 provider 见 PARTNER_REGISTRY,按需安装。
|
|
134
|
+
# 所有兼容范围均设置上限,并由 CI 持续执行依赖审计。
|
|
135
135
|
"langchain-anthropic>=0.2.0,<2",
|
|
136
136
|
"langchain-ollama>=0.2.0,<2",
|
|
137
137
|
"langchain-chroma>=0.1.0,<2",
|
|
@@ -144,9 +144,9 @@ langchain = [
|
|
|
144
144
|
]
|
|
145
145
|
|
|
146
146
|
# ========================================
|
|
147
|
-
# SpringBootAI LangGraph
|
|
148
|
-
#
|
|
149
|
-
#
|
|
147
|
+
# SpringBootAI LangGraph 模块——状态图、持久化检查点与工作流编排
|
|
148
|
+
# 安装:pip install springbootAI[langgraph]
|
|
149
|
+
# 版本与 langchain-core 1.x 兼容矩阵保持一致。
|
|
150
150
|
# ========================================
|
|
151
151
|
langgraph = [
|
|
152
152
|
"langgraph==1.2.9",
|
|
@@ -160,8 +160,8 @@ mcp = [
|
|
|
160
160
|
]
|
|
161
161
|
|
|
162
162
|
# ========================================
|
|
163
|
-
#
|
|
164
|
-
#
|
|
163
|
+
# 组合 Starter——类似 Spring Boot Starter Web/Cloud/All
|
|
164
|
+
# 安装:pip install springbootAI[web] / springbootAI[cloud] / springbootAI[all]
|
|
165
165
|
# ========================================
|
|
166
166
|
web = [
|
|
167
167
|
"fastapi==0.141.1",
|
|
@@ -194,7 +194,7 @@ all = [
|
|
|
194
194
|
]
|
|
195
195
|
|
|
196
196
|
# ========================================
|
|
197
|
-
#
|
|
197
|
+
# 开发依赖
|
|
198
198
|
# ========================================
|
|
199
199
|
dev = [
|
|
200
200
|
"pytest==9.1.1",
|
|
@@ -204,28 +204,28 @@ dev = [
|
|
|
204
204
|
]
|
|
205
205
|
|
|
206
206
|
# ========================================
|
|
207
|
-
#
|
|
207
|
+
# 全部依赖(一键安装)
|
|
208
208
|
# ========================================
|
|
209
209
|
full = [
|
|
210
|
-
#
|
|
210
|
+
# 数据库驱动
|
|
211
211
|
"PyMySQL==1.2.0",
|
|
212
212
|
"psycopg2-binary==2.9.12",
|
|
213
213
|
"sqlalchemy==2.0.40",
|
|
214
|
-
#
|
|
214
|
+
# 缓存 / 消息 / 服务发现
|
|
215
215
|
"redis==8.1.0",
|
|
216
216
|
"pika==1.4.4",
|
|
217
217
|
"nacos-sdk-python==2.0.11",
|
|
218
|
-
#
|
|
218
|
+
# 监控 / 日志 / 安全
|
|
219
219
|
"prometheus-client==0.26.0",
|
|
220
220
|
"loguru==0.7.3",
|
|
221
221
|
"sqlglot==27.28.1",
|
|
222
222
|
"defusedxml==0.7.1",
|
|
223
|
-
# HTTP
|
|
223
|
+
# HTTP 客户端
|
|
224
224
|
"requests==2.34.2",
|
|
225
225
|
"httpx==0.28.1",
|
|
226
226
|
# Excel
|
|
227
227
|
"openpyxl==3.1.5",
|
|
228
|
-
# AI
|
|
228
|
+
# AI 模块(对齐 springbootAI[ai])
|
|
229
229
|
"langchain-openai==1.4.2",
|
|
230
230
|
"langchain-core==1.5.4",
|
|
231
231
|
"langchain-classic==1.0.8",
|
|
@@ -233,12 +233,12 @@ full = [
|
|
|
233
233
|
"langchain-community==0.4.2",
|
|
234
234
|
"numpy==2.2.6",
|
|
235
235
|
"pydantic==2.13.4",
|
|
236
|
-
# LangChain
|
|
236
|
+
# LangChain 模块增强(对齐 springbootAI[langchain])
|
|
237
237
|
"faiss-cpu>=1.7.4,<2",
|
|
238
238
|
"pypdf>=4.0.0,<6",
|
|
239
239
|
"beautifulsoup4>=4.12.0,<5",
|
|
240
240
|
"langchain-experimental>=0.3.0,<2",
|
|
241
|
-
#
|
|
241
|
+
# 常用 partner 包;其他 provider 可按需安装对应包。
|
|
242
242
|
"langchain-anthropic>=0.2.0,<2",
|
|
243
243
|
"langchain-ollama>=0.2.0,<2",
|
|
244
244
|
"langchain-chroma>=0.1.0,<2",
|
|
@@ -256,12 +256,11 @@ full = [
|
|
|
256
256
|
|
|
257
257
|
[tool.pytest.ini_options]
|
|
258
258
|
pythonpath = [".", "examples"]
|
|
259
|
+
testpaths = ["tests"]
|
|
259
260
|
filterwarnings = [
|
|
260
|
-
#
|
|
261
|
-
#
|
|
262
|
-
#
|
|
263
|
-
# pytest 鐨?default::DeprecationWarning 浼氳鐩?simplefilter锛?
|
|
264
|
-
# 鍥犳蹇呴』鍦ㄦ閰嶇疆涓槑纭拷鐣ャ€?
|
|
261
|
+
# 静默 langchain_classic 弃用告警和 community sunset 告警。
|
|
262
|
+
# 项目当前有意兼容 classic 1.x API,这些属于已知的框架级告警。
|
|
263
|
+
# LangChainDeprecationWarning 是 DeprecationWarning 子类,因此在这里精确过滤。
|
|
265
264
|
"ignore:.*LLMChain.*:DeprecationWarning",
|
|
266
265
|
"ignore:.*ConversationChain.*:DeprecationWarning",
|
|
267
266
|
"ignore:.*ConversationBufferMemory.*:DeprecationWarning",
|
|
@@ -288,8 +287,8 @@ Issues = "https://github.com/YUCONGGEN/springbootAI/issues"
|
|
|
288
287
|
|
|
289
288
|
[project.scripts]
|
|
290
289
|
springbootai = "springbootai.main:run_cli"
|
|
291
|
-
#
|
|
292
|
-
# CI
|
|
290
|
+
# 项目脚手架工具(类似 Spring Initializr)。真实终端默认使用中文问答;
|
|
291
|
+
# CI/脚本请显式使用:springbootai-init my-project --modules web,orm --non-interactive
|
|
293
292
|
springbootai-init = "springbootai.cli.scaffold:main"
|
|
294
293
|
|
|
295
294
|
[tool.setuptools.packages.find]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: springbootAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.10
|
|
4
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
|
|
@@ -172,6 +172,8 @@ Dynamic: license-file
|
|
|
172
172
|
[](https://github.com/YUCONGGEN/springbootAI/actions/workflows/security.yml)
|
|
173
173
|
[](https://github.com/YUCONGGEN/springbootAI/blob/master/LICENSE)
|
|
174
174
|
|
|
175
|
+
> 感谢阿里、华为、讯飞、心之声、字节、OpenAI、DeepSeek 等公司的支持。
|
|
176
|
+
|
|
175
177
|
## SpringBootAI 考试认证与证书
|
|
176
178
|
|
|
177
179
|
SpringBootAI 已提供配套的在线考试认证平台,学习者、团队成员和项目使用方可以通过认证考试检验自己对框架核心能力的掌握情况,并在通过考试后获得对应证书。
|
|
@@ -216,7 +218,7 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
216
218
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
217
219
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
218
220
|
|
|
219
|
-
当前版本是 `2.3.
|
|
221
|
+
当前版本是 `2.3.10`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 是无 TC 全局锁的单进程受限补偿模式,不应当作跨服务强一致方案。
|
|
220
222
|
|
|
221
223
|
[新手指南](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)
|
|
222
224
|
|
|
@@ -347,10 +349,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
347
349
|
|
|
348
350
|
| 组件 | 当前版本 |
|
|
349
351
|
|------|----------|
|
|
350
|
-
| `springbootai` 框架 API | 2.3.
|
|
351
|
-
| `springbootai.orm.pymybatis` | 2.3.
|
|
352
|
-
| `springbootai.ai` AI 模块 | 2.3.
|
|
353
|
-
| `springbootai.langchain` LangChain 模块 | 2.3.
|
|
352
|
+
| `springbootai` 框架 API | 2.3.10 |
|
|
353
|
+
| `springbootai.orm.pymybatis` | 2.3.10 |
|
|
354
|
+
| `springbootai.ai` AI 模块 | 2.3.10 |
|
|
355
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.10 |
|
|
354
356
|
| Python | 3.10+ |
|
|
355
357
|
|
|
356
358
|
### 1.4 适合什么场景
|
|
@@ -366,7 +368,7 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
366
368
|
- `@Transactional` 支持七种 Spring 传播模式;`REQUIRES_NEW` 和 `NOT_SUPPORTED` 需要连接池有额外可用连接。
|
|
367
369
|
- Profile 会筛选 `@Profile` Bean,并深度合并同目录的 `application-{profile}.yml`。
|
|
368
370
|
- Nacos、RabbitMQ、Prometheus 依赖外部服务;Sentinel 限流熔断和 OpenTelemetry 追踪可内嵌运行。
|
|
369
|
-
- HTTP 事务模式是持久化补偿协调器;`distributed` 模式提供真实 Seata TC + TCC 回调;`at` 模式通过 ORM
|
|
371
|
+
- HTTP 事务模式是持久化补偿协调器;`distributed` 模式提供真实 Seata TC + TCC 回调;`at` 模式通过 ORM 拦截器记录 undo_log,但仅提供单进程、单数据库的受限补偿。
|
|
370
372
|
- 限流、分布式锁、幂等和缓存语义依赖 Redis 等后端;核心业务必须选择 fail-closed,不能依赖进程内降级继续提供分布式语义。
|
|
371
373
|
|
|
372
374
|
### 1.6 注解使用总览
|
|
@@ -401,7 +403,7 @@ SpringBootAI 注解会先把元数据放到 `__spring_annotations__`。之后是
|
|
|
401
403
|
| Nacos 服务发现 | ✅ 可用 | 服务注册/发现/订阅 |
|
|
402
404
|
| Sentinel 限流熔断 | ✅ 可用 | 内嵌引擎,QPS 限流、异常比例熔断、热点参数限流,无需 Dashboard |
|
|
403
405
|
| 分布式追踪 | ✅ 可用 | 原生 OpenTelemetry(W3C traceparent),自动 HTTP/Feign 注入 |
|
|
404
|
-
| Seata 分布式事务 | ✅
|
|
406
|
+
| Seata 分布式事务 | ✅ 有条件可用 | `distributed` 对接真实 Seata TC 执行 TCC 回调;`at` 仅为无全局锁的单进程受限补偿;`http` 提供持久化补偿 |
|
|
405
407
|
| API Gateway | ✅ 可用 | 轻量 ASGI/WSGI 网关,路由转发、路径重写、过滤器链、负载均衡 |
|
|
406
408
|
| Prometheus 监控 | ✅ 可用 | Counter/Gauge/Histogram 指标暴露 |
|
|
407
409
|
| Feign 声明式 HTTP | ✅ 可用 | 声明式接口、Fallback 降级、自动传播 XID 和 trace 头 |
|
|
@@ -905,7 +907,7 @@ class AppService:
|
|
|
905
907
|
self.app_name = value
|
|
906
908
|
|
|
907
909
|
@Component
|
|
908
|
-
@ConfigurationProperties(prefix="
|
|
910
|
+
@ConfigurationProperties(prefix="database")
|
|
909
911
|
class DataSourceProperties:
|
|
910
912
|
def __init__(self):
|
|
911
913
|
self.url = ""
|
|
@@ -937,6 +939,16 @@ class InitService:
|
|
|
937
939
|
self.connection.close()
|
|
938
940
|
```
|
|
939
941
|
|
|
942
|
+
每个 HTTP 请求都会获得 `X-Request-ID`(可通过
|
|
943
|
+
`server.request-id.header` 修改),该值会写回响应并自动进入框架日志,Feign
|
|
944
|
+
和 Gateway 也会向下游透传。日志会遮蔽 Bearer Token、API Key、密码、Cookie
|
|
945
|
+
等常见敏感字段;`logging.diagnose` 默认关闭,避免异常帧局部变量泄密。
|
|
946
|
+
|
|
947
|
+
声明式 Feign 客户端默认复用连接池,对幂等请求执行有限退避重试,并支持连接/
|
|
948
|
+
读取超时与响应大小限制。直接读取 RAG 文本文件时建议使用
|
|
949
|
+
`TextReader.from_file(path, max_bytes=...)`,文件不存在或超限会明确失败,不会把
|
|
950
|
+
错误路径误当成内联文本。
|
|
951
|
+
|
|
940
952
|
### 5.7 应用事件
|
|
941
953
|
|
|
942
954
|
```python
|
|
@@ -1895,9 +1907,13 @@ export LOG_DIR=logs
|
|
|
1895
1907
|
|
|
1896
1908
|
# AI 模块
|
|
1897
1909
|
export AI_PROVIDER=openai
|
|
1898
|
-
export AI_ALLOW_FAKE=
|
|
1910
|
+
export AI_ALLOW_FAKE=false
|
|
1899
1911
|
export OPENAI_API_KEY=sk-xxx
|
|
1900
1912
|
export OPENAI_CHAT_MODEL=gpt-4o-mini
|
|
1913
|
+
export AI_REQUEST_TIMEOUT_SECONDS=60
|
|
1914
|
+
export AI_MAX_OUTPUT_TOKENS=4096
|
|
1915
|
+
export AI_MAX_TOTAL_TOKENS=100000
|
|
1916
|
+
export AI_MAX_TOOL_ITERATIONS=5
|
|
1901
1917
|
export OLLAMA_BASE_URL=http://localhost:11434
|
|
1902
1918
|
export OLLAMA_CHAT_MODEL=llama3
|
|
1903
1919
|
|
|
@@ -157,6 +157,7 @@ springbootai/langgraph/checkpoint.py
|
|
|
157
157
|
springbootai/langgraph/config.py
|
|
158
158
|
springbootai/langgraph/runtime.py
|
|
159
159
|
springbootai/logging/__init__.py
|
|
160
|
+
springbootai/logging/context.py
|
|
160
161
|
springbootai/logging/loguru_logger.py
|
|
161
162
|
springbootai/mcp/__init__.py
|
|
162
163
|
springbootai/mcp/annotation_runtime.py
|
|
@@ -266,7 +267,9 @@ tests/test_actuator_prometheus_admin.py
|
|
|
266
267
|
tests/test_ai_annotations.py
|
|
267
268
|
tests/test_ai_comprehensive.py
|
|
268
269
|
tests/test_ai_declarative_annotations.py
|
|
270
|
+
tests/test_ai_enterprise_hardening.py
|
|
269
271
|
tests/test_ai_module.py
|
|
272
|
+
tests/test_ai_stream_hardening.py
|
|
270
273
|
tests/test_annotation_combinations.py
|
|
271
274
|
tests/test_annotations_contract.py
|
|
272
275
|
tests/test_aop_annotations_full.py
|
|
@@ -278,9 +281,11 @@ tests/test_bus.py
|
|
|
278
281
|
tests/test_cache_annotations.py
|
|
279
282
|
tests/test_cli.py
|
|
280
283
|
tests/test_cloud_embedded_full.py
|
|
284
|
+
tests/test_cloud_log_safety.py
|
|
281
285
|
tests/test_component_init_error.py
|
|
282
286
|
tests/test_compositional_annotations.py
|
|
283
287
|
tests/test_conditional_annotations.py
|
|
288
|
+
tests/test_config_admin_hardening.py
|
|
284
289
|
tests/test_config_binding.py
|
|
285
290
|
tests/test_config_center.py
|
|
286
291
|
tests/test_config_center_hardening.py
|
|
@@ -297,10 +302,13 @@ tests/test_datasource_routing.py
|
|
|
297
302
|
tests/test_ddl_auto.py
|
|
298
303
|
tests/test_declarative_aop_post_authorize_recover.py
|
|
299
304
|
tests/test_devtools.py
|
|
305
|
+
tests/test_devtools_lifecycle_hardening.py
|
|
300
306
|
tests/test_di_config_event_full.py
|
|
307
|
+
tests/test_enterprise_safety_regressions.py
|
|
301
308
|
tests/test_excel_module.py
|
|
302
309
|
tests/test_hateoas.py
|
|
303
310
|
tests/test_i18n_module.py
|
|
311
|
+
tests/test_io_http_logging_hardening.py
|
|
304
312
|
tests/test_ioc_lifecycle_enhancements.py
|
|
305
313
|
tests/test_jpa_version_transient.py
|
|
306
314
|
tests/test_kafka.py
|