springbootAI 2.3.10__tar.gz → 2.3.12__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.10 → springbootai-2.3.12}/CHANGELOG.md +39 -0
- {springbootai-2.3.10/springbootAI.egg-info → springbootai-2.3.12}/PKG-INFO +39 -8
- {springbootai-2.3.10 → springbootai-2.3.12}/README.md +32 -5
- {springbootai-2.3.10 → springbootai-2.3.12}/pyproject.toml +45 -5
- springbootai-2.3.12/requirements-ai.txt +44 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/requirements.txt +3 -6
- {springbootai-2.3.10 → springbootai-2.3.12/springbootAI.egg-info}/PKG-INFO +39 -8
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootAI.egg-info/SOURCES.txt +9 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootAI.egg-info/requires.txt +5 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/__init__.py +4 -3
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/advisors.py +102 -10
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/annotation_runtime.py +221 -31
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/annotations.py +53 -15
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/autoconfig.py +118 -30
- springbootai-2.3.12/springbootai/ai/core.py +1144 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/memory.py +79 -15
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/observability.py +5 -3
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/providers.py +211 -49
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/resilience.py +186 -8
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/tools.py +268 -20
- springbootai-2.3.12/springbootai/ai/vectorstore.py +719 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/cache.py +2 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/core.py +5 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/aop/cloud_aop.py +62 -4
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/aop/comprehensive_aop.py +264 -129
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cli/scaffold.py +5 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/__init__.py +3 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/bus.py +226 -59
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/discovery.py +39 -21
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/feign.py +28 -2
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/gateway.py +328 -108
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/nacos_config.py +6 -2
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/tracer.py +103 -56
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/config/binding.py +3 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/config/spring-configuration-metadata.json +25 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/context/application_context.py +42 -7
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/context/bean_factory.py +201 -141
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/core/graceful_shutdown.py +3 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/csv/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/data/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/data/repository.py +113 -27
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/datasource/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/datasource/dynamic.py +5 -1
- springbootai-2.3.12/springbootai/event/publisher.py +103 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/excel/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/adapters.py +6 -2
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/autoconfig.py +10 -4
- springbootai-2.3.12/springbootai/langchain/loaders/loaders.py +440 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/partners.py +3 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/tools/tools.py +32 -4
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langgraph/autoconfig.py +10 -4
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langgraph/config.py +36 -3
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langgraph/runtime.py +302 -51
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/logging/context.py +8 -3
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/main.py +28 -17
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/mcp/autoconfig.py +3 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/mcp/client.py +295 -38
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/mcp/config.py +37 -0
- springbootai-2.3.12/springbootai/messaging/kafka.py +552 -0
- springbootai-2.3.12/springbootai/messaging/rabbitmq.py +925 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/monitoring/prometheus.py +24 -7
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/__init__.py +2 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/database.py +190 -50
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/migration.py +330 -224
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/mybatis_integration.py +3 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/__init__.py +4 -3
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/cache/redis_cache.py +226 -160
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/circuit_breaker/circuit_breaker.py +73 -23
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/configuration.py +3 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/core/sql_session.py +1030 -28
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/dynamic_sql/dynamic_sql.py +6 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/pool/connection_pool.py +29 -86
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/security/__init__.py +7 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/security/access_control.py +120 -47
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/security/sql_injection_detector.py +35 -10
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/transaction/transaction.py +41 -7
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/version.py +1 -1
- springbootai-2.3.12/springbootai/py.typed +1 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/retry/retry_decorator.py +55 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/scheduling/scheduler.py +230 -125
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/security/jwt_utils.py +2 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/security/oauth2.py +141 -35
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/security/replay_protection.py +94 -26
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/security/security_aop.py +7 -2
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/security/security_context.py +24 -6
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/test/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/tx/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/tx/events.py +28 -2
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/tx/synchronization.py +34 -13
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/utils/banner.py +2 -2
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/utils/redis_client.py +123 -68
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/validation/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/actuator.py +140 -47
- springbootai-2.3.12/springbootai/web/exception_handler.py +101 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/health.py +108 -88
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/interceptor.py +33 -15
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/request_metrics.py +23 -5
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/swagger.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/web_context.py +186 -16
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/websocket/__init__.py +1 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/websocket/broker.py +108 -16
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/websocket/handler.py +8 -4
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/websocket/router.py +207 -20
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/websocket/session.py +92 -39
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_actuator_prometheus_admin.py +12 -8
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_ai_comprehensive.py +105 -0
- springbootai-2.3.12/tests/test_ai_convenience.py +574 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_ai_module.py +42 -7
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_ai_stream_hardening.py +59 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_cloud_embedded_full.py +32 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_config_fixes_185.py +24 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_di_config_event_full.py +32 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_enterprise_safety_regressions.py +68 -0
- springbootai-2.3.12/tests/test_final_enterprise_hardening.py +452 -0
- springbootai-2.3.12/tests/test_followup_enterprise_fixes.py +422 -0
- springbootai-2.3.12/tests/test_framework_audit_regressions.py +353 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_io_http_logging_hardening.py +153 -5
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_langchain_comprehensive.py +3 -1
- springbootai-2.3.12/tests/test_latest_enterprise_audit_fixes.py +267 -0
- springbootai-2.3.12/tests/test_mcp_agent_example.py +98 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_mcp_module.py +52 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_oauth2.py +36 -1
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_optional_component_timeouts.py +95 -5
- springbootai-2.3.12/tests/test_post_audit_enterprise_fixes.py +425 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_production_readiness.py +4 -3
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_pymybatis_contract.py +37 -0
- springbootai-2.3.12/tests/test_remaining_enterprise_hardening.py +684 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_scheduling.py +25 -12
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_security.py +3 -2
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_security_full.py +12 -5
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_websocket_module.py +40 -2
- springbootai-2.3.10/requirements-ai.txt +0 -50
- springbootai-2.3.10/springbootai/ai/core.py +0 -526
- springbootai-2.3.10/springbootai/ai/vectorstore.py +0 -428
- springbootai-2.3.10/springbootai/event/publisher.py +0 -69
- springbootai-2.3.10/springbootai/langchain/loaders/loaders.py +0 -207
- springbootai-2.3.10/springbootai/messaging/kafka.py +0 -275
- springbootai-2.3.10/springbootai/messaging/rabbitmq.py +0 -506
- springbootai-2.3.10/springbootai/web/exception_handler.py +0 -60
- {springbootai-2.3.10 → springbootai-2.3.12}/LICENSE +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/MANIFEST.in +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/SECURITY.md +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/requirements-langgraph.txt +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/requirements-mcp.txt +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/setup.cfg +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/setup.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootAI.egg-info/dependency_links.txt +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootAI.egg-info/entry_points.txt +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootAI.egg-info/top_level.txt +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/ai/etl.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/batch.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/cloud.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/conditional.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/data.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/enterprise.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/langchain.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/langgraph.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/lombok.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/messaging.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/annotations/security.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/aop/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/aop/aspect.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/aop/method_interceptor.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/aop/proxy_factory.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/batch/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cli/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cli/main.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/config_center.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/load_balancer.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/seata.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/seata_at_proxy.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/seata_bridge.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/sentinel.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/cloud/transaction_store.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/config/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/config/config_loader.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/config/config_monitor.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/context/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/context/bean_definition.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/context/lifecycle.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/context/registry.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/context/scanner.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/core/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/core/typing_utils.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/csv/annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/csv/converters.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/csv/easy_csv.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/csv/exceptions.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/csv/reader.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/csv/writer.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/data/page.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/data/rest.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/data/specification.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/datasource/annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/datasource/context.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/devtools.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/event/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/excel/annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/excel/converters.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/excel/easy_excel.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/excel/exceptions.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/excel/reader.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/excel/style.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/excel/writer.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/accessor.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/auto_config.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/holder.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/locale.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/locale_resolver.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/message_source.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/middleware.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/properties.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/i18n/sources.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/agents/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/agents/services.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/callbacks/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/callbacks/handlers.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/chains/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/chains/services.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/core.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/indexes/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/indexes/index.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/loaders/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/memory/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/memory/memory.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/parsers/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/parsers/parsers.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/prompts/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/prompts/templates.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/retrievers/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/retrievers/retrievers.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/tools/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/utilities/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/utilities/utils.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/vectorstores/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langchain/vectorstores/stores.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langgraph/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langgraph/annotation_runtime.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langgraph/annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/langgraph/checkpoint.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/logging/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/logging/loguru_logger.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/mcp/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/mcp/annotation_runtime.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/mcp/annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/mcp/server.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/messaging/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/monitoring/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/monitoring/admin_client.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/ddl_auto.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/annotations/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/annotations/annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/cache/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/cache/cache.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/circuit_breaker/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/core/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/core/sql_session_factory.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/dialect/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/dialect/dialect.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/dynamic_sql/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/interceptor/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/interceptor/interceptor.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/mapper/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/mapper/mapper.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/metrics/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/metrics/metrics.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/pool/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/security/password_encoder.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/security/sensitive_data_masker.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/transaction/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/type_handler/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/type_handler/type_handler.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/xml_parser/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/orm/pymybatis/xml_parser/xml_parser.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/retry/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/retry/recovery.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/retry/retry_annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/scheduling/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/security/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/security/secret_manager.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/test/slicing.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/tracing/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/tracing/skywalking.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/utils/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/utils/bean_utils.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/utils/logger.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/validation/aop.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/validation/constraints.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/validation/exceptions.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/validation/validator.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/__init__.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/csrf.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/hateoas.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/web/result.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/websocket/annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/springbootai/websocket/exceptions.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/sql/seata_undo_log.sql +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_actuator.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_ai_annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_ai_declarative_annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_ai_enterprise_hardening.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_annotation_combinations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_annotations_contract.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_aop_annotations_full.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_aop_pointcut_enhancements.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_audit_time.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_batch.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_bean_utils.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_bus.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_cache_annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_cli.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_cloud_log_safety.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_component_init_error.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_compositional_annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_conditional_annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_config_admin_hardening.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_config_binding.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_config_center.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_config_center_hardening.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_config_monitor.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_connection_resilience.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_core.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_core_annotations_full.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_csrf.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_csv_module.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_data_repository.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_data_rest.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_datasource_routing.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_ddl_auto.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_declarative_aop_post_authorize_recover.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_devtools.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_devtools_lifecycle_hardening.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_excel_module.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_hateoas.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_i18n_module.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_ioc_lifecycle_enhancements.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_jpa_version_transient.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_kafka.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_langchain_ext.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_langchain_module.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_langgraph_comprehensive.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_langgraph_module.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_logging_config.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_lombok_annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_metadata.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_migration.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_nacos_config.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_new_annotations.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_new_features.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_orm_pymybatis_full.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_pymybatis_configuration_hardening.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_request_metrics.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_retry.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_runtime_configuration_fixes.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_scaffold_hardening.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_seata_at_proxy.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_seata_bridge.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_seata_durable_store.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_security_hardening.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_select_page.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_starter.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_startup_lifecycle.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_swagger_module.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_test_slicing.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_tracing.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_transactional_events.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_validation_module.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_web_annotations_full.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_web_file_upload.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_web_root_mapping.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_web_security_responses.py +0 -0
- {springbootai-2.3.10 → springbootai-2.3.12}/tests/test_web_static_files.py +0 -0
|
@@ -1,5 +1,44 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [Unreleased]
|
|
4
|
+
|
|
5
|
+
## [2.3.12] - 2026-10-08
|
|
6
|
+
|
|
7
|
+
- 修复 Python 3.10 类型解析将默认值为 None 的 dict 参数包装为 Optional 后误识别为查询参数的问题;可空及带类型参数的 dict 统一按 JSON 请求体绑定,保留原始校验类型。
|
|
8
|
+
- 修复压测 Compose 和脚本仍引用旧 `tests_performance` 目录的问题,统一为仓库实际的 `tests/performance` 路径,恢复压测构建、k6 挂载和基准模块启动。
|
|
9
|
+
- 修复显式空扫描包列表仍回退扫描整个入口包的问题;`scan_base_packages=[]` / `base_packages=[]` 现在禁用扫描,避免测试切片导入无关集成测试后被意外跳过,未指定列表时仍自动扫描入口包。
|
|
10
|
+
- 修复 Docker 集成环境中 Kafka 发布 `localhost` 地址导致客户端尝试不可达 IPv6 地址的问题,统一公布测试客户端使用的 `127.0.0.1` 地址。
|
|
11
|
+
- 新增订单查询 Agent + MCP 完整案例:自动启动 stdio 子进程或连接独立 HTTP 服务,发现查询工具、根据订单返回值查物流并汇总;提供离线固定步骤模型、真实 Provider 入口、生命周期关闭和集成测试。
|
|
12
|
+
- 校正文档与源码行为的差异:修复示例导入、组件注册、路由前缀、Excel 类型声明、事务示例、重复 YAML 键及章节链接;明确 AI 元数据注解的实现范围、记忆身份要求、RAG 数据发送范围、Redis 故障行为、异步取消限制及迁移回滚语义。
|
|
13
|
+
- 同步 2.3.12 的 AI 便捷功能说明,移除无法据当前验证记录支持的真实 API 全部验证承诺,并修正 Fake 模型、ETL 切片和工具 Schema 示例。
|
|
14
|
+
- 应用显式启用 AI 时,在 Service 创建前自动装配默认组件并注册到 BeanFactory;已有自定义 `aiChatClient` 时保留其配置,省去手工 Configuration/Bean 注册。
|
|
15
|
+
- 修复构造器延迟类型注解导致按类型注入失败的问题;解析原始构造器的类型命名空间,并支持已解析的 BeanDefinition 依赖信息。
|
|
16
|
+
- 新增 `ChatClient.chat/achat/stream_text/astream_text` 快捷入口,复用默认 Advisor/工具配置并自动传递安全上下文身份和会话;关闭异步文本流会向底层流传播关闭请求,同步网络调用仍受其超时控制。
|
|
17
|
+
- 简化 `@Prompt` / `@RAG`:方法体可写 `...`,无模板时自动选择明确的输入;具体 Pydantic 返回类型自动提示 JSON Schema 并绑定、校验输出,显式 `@StructuredOutput` 优先。
|
|
18
|
+
- 修复 `@Prompt` 模板与 `@RAG` 组合时检索被跳过的问题,同步和异步路径均执行检索并保留 system 提示。
|
|
19
|
+
- 修复 `@AiCache` 跨用户/租户共享缓存和进行中请求的问题,自定义 key 也自动包含可信身份与会话作用域。
|
|
20
|
+
- 修复基础 `ChatModel.acall` 取消后过早释放并发名额及 LangGraph 异步排队取消后泄漏名额的问题。
|
|
21
|
+
- 补充 AI 简化用法文档、可运行示例及回归测试。
|
|
22
|
+
- 修复依赖审计发现的 PyJWT、urllib3、multidict 已知漏洞,分别升级至 `2.15.0`、`2.8.0`、`6.9.1`,同步核心/可选依赖声明与锁文件。
|
|
23
|
+
- 修复安全上下文更新时修改父/兄弟协程共享对象的问题;认证信息和角色、权限列表现在复制后绑定到当前上下文。
|
|
24
|
+
- 修复 JWT 字符串角色、权限按子串匹配的问题(例如 `ADMIN` 错误匹配 `SUPERADMIN`);字符串按单个完整权限处理,非法集合返回认证失败。
|
|
25
|
+
- 修复 `@PathVariable(name=...)` 别名未传给 FastAPI 的问题,URL 占位符名称与 Python 参数名可以不同。
|
|
26
|
+
- 修复 Controller 延迟类型注解在 Web 适配器的模块中解析失败的问题;请求模型现在使用原始方法的命名空间解析,包括 AOP 包装的方法。
|
|
27
|
+
- 支持 Controller 和异常 Advice 返回原生 `Response`(含 JSON、文件与 SSE 流式响应),保留状态码、响应头和响应体;显式 `HTTPException` 交给 FastAPI 处理。
|
|
28
|
+
- 修复 `@Transactional` 配置异常筛选时取消任务仍提交数据的问题;取消和进程控制信号始终回滚,普通业务异常的筛选规则保持生效。
|
|
29
|
+
- 修复 SqlSession 提交失败后遗留物理事务的问题;提交失败立即回滚,回滚失败交由连接池清理,关闭会话时仍能释放失效连接。
|
|
30
|
+
- 新增请求绑定、安全上下文及数据库故障路径回归测试。
|
|
31
|
+
|
|
32
|
+
## [2.3.11] - 2026-09-01
|
|
33
|
+
|
|
34
|
+
- 修复 PyMyBatis 访问控制仅覆盖查询、行级条件直接拼接及 SQL 尾部条件位置错误,写操作和字段权限现在失败关闭,动态租户值必须使用绑定参数。
|
|
35
|
+
- 修复事务提交前监听器异常被吞掉及 `REQUIRES_NEW`/`NOT_SUPPORTED` 同步上下文错误,提交否决会触发回滚并恢复外层上下文。
|
|
36
|
+
- 修复 Spring Cloud Bus RabbitMQ API 调用错误和缺失消费者,增加 Broker 确认、广播消费者、去重、消息大小限制及明确的失败状态。
|
|
37
|
+
- 加固 MCP/AI 工具边界:限制 HTTP 响应、队列、集合和 Schema 深度,拒绝压缩炸弹及高风险正则表达式。
|
|
38
|
+
- 修复 Prometheus Summary 创建失败、Tracer 已结束 Span 无界增长以及 Actuator/启动日志暴露原始异常的问题。
|
|
39
|
+
- 修复 CI 在 AI 测试切片后提前执行总覆盖率门槛的问题,覆盖率阈值现在只在全部测试切片完成后统一校验。
|
|
40
|
+
- 修复 LangChain 完整演示未声明文档加载根目录的问题,并为临时文件自动清理及 Windows 重定向控制台增加 UTF-8 输出兼容。
|
|
41
|
+
|
|
3
42
|
## [2.3.10] - 2026-08-29
|
|
4
43
|
|
|
5
44
|
- 修复 AI 代理上下游消息被 SQL 注入检测误报:`#{...}` 绑定值始终按数据处理,不再扫描消息内容;`${...}` 原始替换仍默认拒绝,只有配置允许且值完整匹配严格白名单时才能使用。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: springbootAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.12
|
|
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
|
|
@@ -19,7 +19,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
19
19
|
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
20
20
|
Classifier: Topic :: Database
|
|
21
21
|
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
22
|
-
Requires-Python:
|
|
22
|
+
Requires-Python: <3.13,>=3.10
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
License-File: LICENSE
|
|
25
25
|
Requires-Dist: fastapi==0.141.1
|
|
@@ -30,9 +30,10 @@ Requires-Dist: python-dotenv==1.2.2
|
|
|
30
30
|
Requires-Dist: DBUtils==3.1.2
|
|
31
31
|
Requires-Dist: cryptography==50.0.0
|
|
32
32
|
Requires-Dist: bcrypt==5.0.0
|
|
33
|
-
Requires-Dist: pyjwt==2.
|
|
33
|
+
Requires-Dist: pyjwt==2.15.0
|
|
34
34
|
Requires-Dist: pydantic==2.13.4
|
|
35
35
|
Requires-Dist: requests==2.34.2
|
|
36
|
+
Requires-Dist: urllib3==2.8.0
|
|
36
37
|
Requires-Dist: httpx==0.28.1
|
|
37
38
|
Requires-Dist: defusedxml==0.7.1
|
|
38
39
|
Provides-Extra: mysql
|
|
@@ -49,6 +50,7 @@ Provides-Extra: kafka
|
|
|
49
50
|
Requires-Dist: kafka-python==2.0.2; extra == "kafka"
|
|
50
51
|
Provides-Extra: nacos
|
|
51
52
|
Requires-Dist: nacos-sdk-python==2.0.11; extra == "nacos"
|
|
53
|
+
Requires-Dist: multidict==6.9.1; extra == "nacos"
|
|
52
54
|
Provides-Extra: prometheus
|
|
53
55
|
Requires-Dist: prometheus-client==0.26.0; extra == "prometheus"
|
|
54
56
|
Provides-Extra: logging
|
|
@@ -120,6 +122,7 @@ Requires-Dist: psutil==6.1.1; extra == "all"
|
|
|
120
122
|
Provides-Extra: dev
|
|
121
123
|
Requires-Dist: pytest==9.1.1; extra == "dev"
|
|
122
124
|
Requires-Dist: pytest-cov==7.1.0; extra == "dev"
|
|
125
|
+
Requires-Dist: mypy==1.18.2; extra == "dev"
|
|
123
126
|
Requires-Dist: redis==8.1.0; extra == "dev"
|
|
124
127
|
Requires-Dist: sqlglot==27.28.1; extra == "dev"
|
|
125
128
|
Provides-Extra: full
|
|
@@ -129,6 +132,7 @@ Requires-Dist: sqlalchemy==2.0.40; extra == "full"
|
|
|
129
132
|
Requires-Dist: redis==8.1.0; extra == "full"
|
|
130
133
|
Requires-Dist: pika==1.4.4; extra == "full"
|
|
131
134
|
Requires-Dist: nacos-sdk-python==2.0.11; extra == "full"
|
|
135
|
+
Requires-Dist: multidict==6.9.1; extra == "full"
|
|
132
136
|
Requires-Dist: prometheus-client==0.26.0; extra == "full"
|
|
133
137
|
Requires-Dist: loguru==0.7.3; extra == "full"
|
|
134
138
|
Requires-Dist: sqlglot==27.28.1; extra == "full"
|
|
@@ -218,7 +222,7 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
218
222
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
219
223
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
220
224
|
|
|
221
|
-
当前版本是 `2.3.
|
|
225
|
+
当前版本是 `2.3.12`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 是无 TC 全局锁的单进程受限补偿模式,不应当作跨服务强一致方案。
|
|
222
226
|
|
|
223
227
|
[新手指南](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)
|
|
224
228
|
|
|
@@ -349,10 +353,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
349
353
|
|
|
350
354
|
| 组件 | 当前版本 |
|
|
351
355
|
|------|----------|
|
|
352
|
-
| `springbootai` 框架 API | 2.3.
|
|
353
|
-
| `springbootai.orm.pymybatis` | 2.3.
|
|
354
|
-
| `springbootai.ai` AI 模块 | 2.3.
|
|
355
|
-
| `springbootai.langchain` LangChain 模块 | 2.3.
|
|
356
|
+
| `springbootai` 框架 API | 2.3.12 |
|
|
357
|
+
| `springbootai.orm.pymybatis` | 2.3.12 |
|
|
358
|
+
| `springbootai.ai` AI 模块 | 2.3.12 |
|
|
359
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.12 |
|
|
356
360
|
| Python | 3.10+ |
|
|
357
361
|
|
|
358
362
|
### 1.4 适合什么场景
|
|
@@ -1326,7 +1330,12 @@ class RegistrationService:
|
|
|
1326
1330
|
|
|
1327
1331
|
```python
|
|
1328
1332
|
@Transactional(propagation="REQUIRED")
|
|
1333
|
+
def required_operation():
|
|
1334
|
+
...
|
|
1335
|
+
|
|
1329
1336
|
@Transactional(propagation="NESTED")
|
|
1337
|
+
def nested_operation():
|
|
1338
|
+
...
|
|
1330
1339
|
```
|
|
1331
1340
|
|
|
1332
1341
|
`NESTED` 在已有事务中创建 savepoint;`REQUIRES_NEW` 使用独立 Session/连接,连接池 `max_size` 至少应能容纳并发的外层和内层连接。
|
|
@@ -1487,6 +1496,26 @@ class CleanupJob:
|
|
|
1487
1496
|
>
|
|
1488
1497
|
> 提供 ChatClient(链式对话)、Advisor(对话顾问)、Tools(工具调用)、RAG(知识库检索增强生成)、Function Calling 等能力。支持 OpenAI / Ollama / DeepSeek / Moonshot 等多家大模型。
|
|
1489
1498
|
|
|
1499
|
+
以下便捷功能自 **2.3.12** 起提供,安装时运行 `pip install -U "springbootAI[ai]>=2.3.12"`。普通聊天只需 `client.chat("你好")`,异步使用 `await client.achat("你好")`;文本流使用 `client.stream_text(...)` / `client.astream_text(...)`。
|
|
1500
|
+
|
|
1501
|
+
容器管理的 Service 可以只写提示词和签名:
|
|
1502
|
+
|
|
1503
|
+
```python
|
|
1504
|
+
from springbootai.annotations import Prompt, RAG, Service
|
|
1505
|
+
|
|
1506
|
+
@Service
|
|
1507
|
+
class Assistant:
|
|
1508
|
+
@Prompt("用三句话总结:{text}")
|
|
1509
|
+
def summarize(self, text: str) -> str:
|
|
1510
|
+
...
|
|
1511
|
+
|
|
1512
|
+
@RAG(top_k=3)
|
|
1513
|
+
def answer(self, question: str) -> str:
|
|
1514
|
+
...
|
|
1515
|
+
```
|
|
1516
|
+
|
|
1517
|
+
应用显式设置 `spring.ai.enabled: true` 并配置 Provider 后,框架自动调用模型、执行检索;RAG 数据先用向量库的 `add_texts(...)` 入库。返回类型声明为 Pydantic 模型时,自动生成 JSON 格式要求并校验结果,无需另写 `@StructuredOutput`。详见 [最少代码用法](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_MODULE.md#常用功能最少代码写法)。
|
|
1518
|
+
|
|
1490
1519
|
### 12.2 LangChain 模块
|
|
1491
1520
|
|
|
1492
1521
|
> 完整文档:[LANGCHAIN_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGCHAIN_MODULE.md)。安装:`pip install springbootAI[langchain]`。
|
|
@@ -1992,4 +2021,6 @@ pip install springbootAI[mcp]
|
|
|
1992
2021
|
|
|
1993
2022
|
完整配置、FastAPI 挂载、stdio、认证、白名单、Spring AI/LangChain/LangGraph 组合方式和测试命令见 [MCP_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_MODULE.md)。
|
|
1994
2023
|
|
|
2024
|
+
可运行的 [Agent 调用 MCP 案例](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_AGENT_EXAMPLE.md) 演示订单与物流查询,支持一条命令启动本地 MCP 服务、连接 HTTP 服务和切换真实模型。
|
|
2025
|
+
|
|
1995
2026
|
LangChain 也支持 `@LangChainClient` + `@LangChainCall`,LangGraph 支持 `@LangGraph` + `@GraphNode` + `@GraphEdge` + `@GraphRoute` + `@GraphInvoke`。这些注解复用现有运行时,不会重新实现 LangChain、LangGraph 或 MCP 协议。
|
|
@@ -56,7 +56,7 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
56
56
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
57
57
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
58
58
|
|
|
59
|
-
当前版本是 `2.3.
|
|
59
|
+
当前版本是 `2.3.12`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 是无 TC 全局锁的单进程受限补偿模式,不应当作跨服务强一致方案。
|
|
60
60
|
|
|
61
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)
|
|
62
62
|
|
|
@@ -187,10 +187,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
187
187
|
|
|
188
188
|
| 组件 | 当前版本 |
|
|
189
189
|
|------|----------|
|
|
190
|
-
| `springbootai` 框架 API | 2.3.
|
|
191
|
-
| `springbootai.orm.pymybatis` | 2.3.
|
|
192
|
-
| `springbootai.ai` AI 模块 | 2.3.
|
|
193
|
-
| `springbootai.langchain` LangChain 模块 | 2.3.
|
|
190
|
+
| `springbootai` 框架 API | 2.3.12 |
|
|
191
|
+
| `springbootai.orm.pymybatis` | 2.3.12 |
|
|
192
|
+
| `springbootai.ai` AI 模块 | 2.3.12 |
|
|
193
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.12 |
|
|
194
194
|
| Python | 3.10+ |
|
|
195
195
|
|
|
196
196
|
### 1.4 适合什么场景
|
|
@@ -1164,7 +1164,12 @@ class RegistrationService:
|
|
|
1164
1164
|
|
|
1165
1165
|
```python
|
|
1166
1166
|
@Transactional(propagation="REQUIRED")
|
|
1167
|
+
def required_operation():
|
|
1168
|
+
...
|
|
1169
|
+
|
|
1167
1170
|
@Transactional(propagation="NESTED")
|
|
1171
|
+
def nested_operation():
|
|
1172
|
+
...
|
|
1168
1173
|
```
|
|
1169
1174
|
|
|
1170
1175
|
`NESTED` 在已有事务中创建 savepoint;`REQUIRES_NEW` 使用独立 Session/连接,连接池 `max_size` 至少应能容纳并发的外层和内层连接。
|
|
@@ -1325,6 +1330,26 @@ class CleanupJob:
|
|
|
1325
1330
|
>
|
|
1326
1331
|
> 提供 ChatClient(链式对话)、Advisor(对话顾问)、Tools(工具调用)、RAG(知识库检索增强生成)、Function Calling 等能力。支持 OpenAI / Ollama / DeepSeek / Moonshot 等多家大模型。
|
|
1327
1332
|
|
|
1333
|
+
以下便捷功能自 **2.3.12** 起提供,安装时运行 `pip install -U "springbootAI[ai]>=2.3.12"`。普通聊天只需 `client.chat("你好")`,异步使用 `await client.achat("你好")`;文本流使用 `client.stream_text(...)` / `client.astream_text(...)`。
|
|
1334
|
+
|
|
1335
|
+
容器管理的 Service 可以只写提示词和签名:
|
|
1336
|
+
|
|
1337
|
+
```python
|
|
1338
|
+
from springbootai.annotations import Prompt, RAG, Service
|
|
1339
|
+
|
|
1340
|
+
@Service
|
|
1341
|
+
class Assistant:
|
|
1342
|
+
@Prompt("用三句话总结:{text}")
|
|
1343
|
+
def summarize(self, text: str) -> str:
|
|
1344
|
+
...
|
|
1345
|
+
|
|
1346
|
+
@RAG(top_k=3)
|
|
1347
|
+
def answer(self, question: str) -> str:
|
|
1348
|
+
...
|
|
1349
|
+
```
|
|
1350
|
+
|
|
1351
|
+
应用显式设置 `spring.ai.enabled: true` 并配置 Provider 后,框架自动调用模型、执行检索;RAG 数据先用向量库的 `add_texts(...)` 入库。返回类型声明为 Pydantic 模型时,自动生成 JSON 格式要求并校验结果,无需另写 `@StructuredOutput`。详见 [最少代码用法](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_MODULE.md#常用功能最少代码写法)。
|
|
1352
|
+
|
|
1328
1353
|
### 12.2 LangChain 模块
|
|
1329
1354
|
|
|
1330
1355
|
> 完整文档:[LANGCHAIN_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGCHAIN_MODULE.md)。安装:`pip install springbootAI[langchain]`。
|
|
@@ -1830,4 +1855,6 @@ pip install springbootAI[mcp]
|
|
|
1830
1855
|
|
|
1831
1856
|
完整配置、FastAPI 挂载、stdio、认证、白名单、Spring AI/LangChain/LangGraph 组合方式和测试命令见 [MCP_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_MODULE.md)。
|
|
1832
1857
|
|
|
1858
|
+
可运行的 [Agent 调用 MCP 案例](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_AGENT_EXAMPLE.md) 演示订单与物流查询,支持一条命令启动本地 MCP 服务、连接 HTTP 服务和切换真实模型。
|
|
1859
|
+
|
|
1833
1860
|
LangChain 也支持 `@LangChainClient` + `@LangChainCall`,LangGraph 支持 `@LangGraph` + `@GraphNode` + `@GraphEdge` + `@GraphRoute` + `@GraphInvoke`。这些注解复用现有运行时,不会重新实现 LangChain、LangGraph 或 MCP 协议。
|
|
@@ -12,7 +12,7 @@ build-backend = "setuptools.build_meta"
|
|
|
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.12"
|
|
16
16
|
description = "Spring-style Python framework with Web, ORM, Cloud and AI integrations"
|
|
17
17
|
readme = "README.md"
|
|
18
18
|
license = "MIT"
|
|
@@ -32,7 +32,7 @@ classifiers = [
|
|
|
32
32
|
"Topic :: Database",
|
|
33
33
|
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
|
|
34
34
|
]
|
|
35
|
-
requires-python = ">=3.10"
|
|
35
|
+
requires-python = ">=3.10,<3.13"
|
|
36
36
|
|
|
37
37
|
# ========================================
|
|
38
38
|
# 核心依赖——类似 Spring Boot Starter Web/Core
|
|
@@ -47,9 +47,10 @@ dependencies = [
|
|
|
47
47
|
"DBUtils==3.1.2",
|
|
48
48
|
"cryptography==50.0.0",
|
|
49
49
|
"bcrypt==5.0.0",
|
|
50
|
-
"pyjwt==2.
|
|
50
|
+
"pyjwt==2.15.0",
|
|
51
51
|
"pydantic==2.13.4",
|
|
52
52
|
"requests==2.34.2",
|
|
53
|
+
"urllib3==2.8.0",
|
|
53
54
|
"httpx==0.28.1",
|
|
54
55
|
"defusedxml==0.7.1",
|
|
55
56
|
]
|
|
@@ -76,7 +77,7 @@ kafka = ["kafka-python==2.0.2"]
|
|
|
76
77
|
# ========================================
|
|
77
78
|
# 服务发现——类似 Spring Cloud Alibaba Nacos
|
|
78
79
|
# ========================================
|
|
79
|
-
nacos = ["nacos-sdk-python==2.0.11"]
|
|
80
|
+
nacos = ["nacos-sdk-python==2.0.11", "multidict==6.9.1"]
|
|
80
81
|
|
|
81
82
|
# ========================================
|
|
82
83
|
# 监控和日志——类似 Spring Boot Actuator + Micrometer
|
|
@@ -199,6 +200,7 @@ all = [
|
|
|
199
200
|
dev = [
|
|
200
201
|
"pytest==9.1.1",
|
|
201
202
|
"pytest-cov==7.1.0",
|
|
203
|
+
"mypy==1.18.2",
|
|
202
204
|
"redis==8.1.0",
|
|
203
205
|
"sqlglot==27.28.1",
|
|
204
206
|
]
|
|
@@ -215,6 +217,7 @@ full = [
|
|
|
215
217
|
"redis==8.1.0",
|
|
216
218
|
"pika==1.4.4",
|
|
217
219
|
"nacos-sdk-python==2.0.11",
|
|
220
|
+
"multidict==6.9.1",
|
|
218
221
|
# 监控 / 日志 / 安全
|
|
219
222
|
"prometheus-client==0.26.0",
|
|
220
223
|
"loguru==0.7.3",
|
|
@@ -278,6 +281,43 @@ markers = [
|
|
|
278
281
|
"seata_integration: requires a compatible Seata SDK and real Seata Server",
|
|
279
282
|
]
|
|
280
283
|
|
|
284
|
+
[tool.coverage.run]
|
|
285
|
+
branch = true
|
|
286
|
+
source = ["springbootai"]
|
|
287
|
+
|
|
288
|
+
[tool.coverage.report]
|
|
289
|
+
fail_under = 68
|
|
290
|
+
show_missing = true
|
|
291
|
+
|
|
292
|
+
[tool.mypy]
|
|
293
|
+
python_version = "3.10"
|
|
294
|
+
files = [
|
|
295
|
+
"springbootai/ai/annotation_runtime.py",
|
|
296
|
+
"springbootai/ai/advisors.py",
|
|
297
|
+
"springbootai/ai/vectorstore.py",
|
|
298
|
+
"springbootai/cloud/gateway.py",
|
|
299
|
+
"springbootai/websocket/router.py",
|
|
300
|
+
"springbootai/messaging/kafka.py",
|
|
301
|
+
"springbootai/messaging/rabbitmq.py",
|
|
302
|
+
"springbootai/data/repository.py",
|
|
303
|
+
"springbootai/retry/retry_decorator.py",
|
|
304
|
+
"springbootai/ai/tools.py",
|
|
305
|
+
"springbootai/cloud/bus.py",
|
|
306
|
+
"springbootai/cloud/tracer.py",
|
|
307
|
+
"springbootai/mcp/client.py",
|
|
308
|
+
"springbootai/mcp/config.py",
|
|
309
|
+
"springbootai/monitoring/prometheus.py",
|
|
310
|
+
"springbootai/orm/pymybatis/core/sql_session.py",
|
|
311
|
+
"springbootai/orm/pymybatis/security/access_control.py",
|
|
312
|
+
"springbootai/tx/synchronization.py",
|
|
313
|
+
]
|
|
314
|
+
ignore_missing_imports = true
|
|
315
|
+
follow_imports = "skip"
|
|
316
|
+
allow_untyped_defs = true
|
|
317
|
+
allow_incomplete_defs = true
|
|
318
|
+
check_untyped_defs = true
|
|
319
|
+
show_error_codes = true
|
|
320
|
+
|
|
281
321
|
[project.urls]
|
|
282
322
|
Homepage = "https://github.com/YUCONGGEN/springbootAI"
|
|
283
323
|
Repository = "https://github.com/YUCONGGEN/springbootAI.git"
|
|
@@ -296,4 +336,4 @@ include = ["springbootai*"]
|
|
|
296
336
|
namespaces = false
|
|
297
337
|
|
|
298
338
|
[tool.setuptools.package-data]
|
|
299
|
-
springbootai = ["*.py", "**/*.py", "**/*.xml", "**/*.yml", "**/*.yaml"]
|
|
339
|
+
springbootai = ["*.py", "py.typed", "**/*.py", "**/*.xml", "**/*.yml", "**/*.yaml"]
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# ========================================
|
|
2
|
+
# SpringBootAI optional AI/LangChain dependencies (exact versions)
|
|
3
|
+
# ========================================
|
|
4
|
+
# The AI module uses optional dependencies with a built-in fallback:
|
|
5
|
+
# - Without this file, native HTTP providers and FakeChatModel remain usable.
|
|
6
|
+
# - Installing it enables LangChain adapters detected by ai/providers.py.
|
|
7
|
+
#
|
|
8
|
+
# Install examples:
|
|
9
|
+
# pip install -r requirements-ai.txt
|
|
10
|
+
# pip install langchain-openai==1.4.2
|
|
11
|
+
#
|
|
12
|
+
# Recommended Python: 3.10+ (CI covers 3.10, 3.11 and 3.12).
|
|
13
|
+
# Every pinned version is covered by tests and dependency auditing.
|
|
14
|
+
# Keep this file ASCII-only: pip-audit may use the Windows system encoding.
|
|
15
|
+
# ========================================
|
|
16
|
+
|
|
17
|
+
# LangChain core (BaseChatModel, Embeddings and Runnable APIs).
|
|
18
|
+
langchain-core==1.5.4
|
|
19
|
+
|
|
20
|
+
# Classic APIs including LLMChain, ConversationChain and initialize_agent.
|
|
21
|
+
langchain-classic==1.0.8
|
|
22
|
+
|
|
23
|
+
# OpenAI-compatible providers (OpenAI, Azure, DeepSeek and Moonshot).
|
|
24
|
+
langchain-openai==1.4.2
|
|
25
|
+
|
|
26
|
+
# RecursiveCharacterTextSplitter and CharacterTextSplitter.
|
|
27
|
+
langchain-text-splitters==1.1.2
|
|
28
|
+
|
|
29
|
+
# Community integrations including FAISS, Chroma, DuckDuckGo and Wikipedia.
|
|
30
|
+
langchain-community==0.4.2
|
|
31
|
+
|
|
32
|
+
# Vector similarity calculations; 2.2.6 retains Python 3.10 compatibility.
|
|
33
|
+
numpy==2.2.6
|
|
34
|
+
|
|
35
|
+
# Pydantic v2 for validation and structured output parsing.
|
|
36
|
+
pydantic==2.13.4
|
|
37
|
+
|
|
38
|
+
# ========================================
|
|
39
|
+
# Additional optional packages (install only when needed)
|
|
40
|
+
# ========================================
|
|
41
|
+
|
|
42
|
+
# Vector database: faiss-cpu
|
|
43
|
+
# PDF document loading: pypdf
|
|
44
|
+
# HTML parsing: beautifulsoup4
|
|
@@ -29,7 +29,7 @@ sqlglot==27.28.1
|
|
|
29
29
|
defusedxml==0.7.1
|
|
30
30
|
|
|
31
31
|
# 认证授权
|
|
32
|
-
pyjwt==2.
|
|
32
|
+
pyjwt==2.15.0
|
|
33
33
|
cryptography==50.0.0
|
|
34
34
|
bcrypt==5.0.0
|
|
35
35
|
|
|
@@ -41,6 +41,7 @@ loguru==0.7.3
|
|
|
41
41
|
|
|
42
42
|
# HTTP 客户端(Feign)
|
|
43
43
|
requests==2.34.2
|
|
44
|
+
urllib3==2.8.0
|
|
44
45
|
httpx==0.28.1
|
|
45
46
|
|
|
46
47
|
# RabbitMQ 消息队列
|
|
@@ -48,6 +49,7 @@ pika==1.4.4
|
|
|
48
49
|
|
|
49
50
|
# Nacos 服务注册发现
|
|
50
51
|
nacos-sdk-python==2.0.11
|
|
52
|
+
multidict==6.9.1
|
|
51
53
|
|
|
52
54
|
# 参数校验
|
|
53
55
|
pydantic==2.13.4
|
|
@@ -56,8 +58,3 @@ pydantic==2.13.4
|
|
|
56
58
|
pytest==9.1.1
|
|
57
59
|
pytest-cov==7.1.0
|
|
58
60
|
openpyxl==3.1.5
|
|
59
|
-
|
|
60
|
-
bcrypt
|
|
61
|
-
springbootai
|
|
62
|
-
springbootai
|
|
63
|
-
springbootai
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: springbootAI
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.12
|
|
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
|
|
@@ -19,7 +19,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
19
19
|
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
20
20
|
Classifier: Topic :: Database
|
|
21
21
|
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
22
|
-
Requires-Python:
|
|
22
|
+
Requires-Python: <3.13,>=3.10
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
License-File: LICENSE
|
|
25
25
|
Requires-Dist: fastapi==0.141.1
|
|
@@ -30,9 +30,10 @@ Requires-Dist: python-dotenv==1.2.2
|
|
|
30
30
|
Requires-Dist: DBUtils==3.1.2
|
|
31
31
|
Requires-Dist: cryptography==50.0.0
|
|
32
32
|
Requires-Dist: bcrypt==5.0.0
|
|
33
|
-
Requires-Dist: pyjwt==2.
|
|
33
|
+
Requires-Dist: pyjwt==2.15.0
|
|
34
34
|
Requires-Dist: pydantic==2.13.4
|
|
35
35
|
Requires-Dist: requests==2.34.2
|
|
36
|
+
Requires-Dist: urllib3==2.8.0
|
|
36
37
|
Requires-Dist: httpx==0.28.1
|
|
37
38
|
Requires-Dist: defusedxml==0.7.1
|
|
38
39
|
Provides-Extra: mysql
|
|
@@ -49,6 +50,7 @@ Provides-Extra: kafka
|
|
|
49
50
|
Requires-Dist: kafka-python==2.0.2; extra == "kafka"
|
|
50
51
|
Provides-Extra: nacos
|
|
51
52
|
Requires-Dist: nacos-sdk-python==2.0.11; extra == "nacos"
|
|
53
|
+
Requires-Dist: multidict==6.9.1; extra == "nacos"
|
|
52
54
|
Provides-Extra: prometheus
|
|
53
55
|
Requires-Dist: prometheus-client==0.26.0; extra == "prometheus"
|
|
54
56
|
Provides-Extra: logging
|
|
@@ -120,6 +122,7 @@ Requires-Dist: psutil==6.1.1; extra == "all"
|
|
|
120
122
|
Provides-Extra: dev
|
|
121
123
|
Requires-Dist: pytest==9.1.1; extra == "dev"
|
|
122
124
|
Requires-Dist: pytest-cov==7.1.0; extra == "dev"
|
|
125
|
+
Requires-Dist: mypy==1.18.2; extra == "dev"
|
|
123
126
|
Requires-Dist: redis==8.1.0; extra == "dev"
|
|
124
127
|
Requires-Dist: sqlglot==27.28.1; extra == "dev"
|
|
125
128
|
Provides-Extra: full
|
|
@@ -129,6 +132,7 @@ Requires-Dist: sqlalchemy==2.0.40; extra == "full"
|
|
|
129
132
|
Requires-Dist: redis==8.1.0; extra == "full"
|
|
130
133
|
Requires-Dist: pika==1.4.4; extra == "full"
|
|
131
134
|
Requires-Dist: nacos-sdk-python==2.0.11; extra == "full"
|
|
135
|
+
Requires-Dist: multidict==6.9.1; extra == "full"
|
|
132
136
|
Requires-Dist: prometheus-client==0.26.0; extra == "full"
|
|
133
137
|
Requires-Dist: loguru==0.7.3; extra == "full"
|
|
134
138
|
Requires-Dist: sqlglot==27.28.1; extra == "full"
|
|
@@ -218,7 +222,7 @@ SpringBootAI 是一个采用 Spring 风格注解和分层结构的 Python 应用
|
|
|
218
222
|
| AI 与编排 | 模型调用、Tools、RAG、Chain、状态图、MCP client/server | LangChain / LangGraph / 官方 MCP SDK |
|
|
219
223
|
| 生产治理 | 健康检查、Prometheus、限流熔断、追踪、Swagger | prometheus-client / OpenTelemetry / OpenAPI |
|
|
220
224
|
|
|
221
|
-
当前版本是 `2.3.
|
|
225
|
+
当前版本是 `2.3.12`;支持 Python 3.10、3.11 和 3.12,许可证为 MIT。项目仍标记为 Beta。用于公网高并发、合规敏感或支付/订单/库存等核心系统前,必须完成目标数据库、流量模型、故障恢复和安全基线验证。内嵌 Gateway 适合内部路由,不替代公网 Nginx/Kong/WAF;Seata `distributed` 对接官方 TC + TCC 回调;`at` 是无 TC 全局锁的单进程受限补偿模式,不应当作跨服务强一致方案。
|
|
222
226
|
|
|
223
227
|
[新手指南](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)
|
|
224
228
|
|
|
@@ -349,10 +353,10 @@ SpringBootAI 是一个 **Python Web 框架**。它把 Java Spring Boot 的"注
|
|
|
349
353
|
|
|
350
354
|
| 组件 | 当前版本 |
|
|
351
355
|
|------|----------|
|
|
352
|
-
| `springbootai` 框架 API | 2.3.
|
|
353
|
-
| `springbootai.orm.pymybatis` | 2.3.
|
|
354
|
-
| `springbootai.ai` AI 模块 | 2.3.
|
|
355
|
-
| `springbootai.langchain` LangChain 模块 | 2.3.
|
|
356
|
+
| `springbootai` 框架 API | 2.3.12 |
|
|
357
|
+
| `springbootai.orm.pymybatis` | 2.3.12 |
|
|
358
|
+
| `springbootai.ai` AI 模块 | 2.3.12 |
|
|
359
|
+
| `springbootai.langchain` LangChain 模块 | 2.3.12 |
|
|
356
360
|
| Python | 3.10+ |
|
|
357
361
|
|
|
358
362
|
### 1.4 适合什么场景
|
|
@@ -1326,7 +1330,12 @@ class RegistrationService:
|
|
|
1326
1330
|
|
|
1327
1331
|
```python
|
|
1328
1332
|
@Transactional(propagation="REQUIRED")
|
|
1333
|
+
def required_operation():
|
|
1334
|
+
...
|
|
1335
|
+
|
|
1329
1336
|
@Transactional(propagation="NESTED")
|
|
1337
|
+
def nested_operation():
|
|
1338
|
+
...
|
|
1330
1339
|
```
|
|
1331
1340
|
|
|
1332
1341
|
`NESTED` 在已有事务中创建 savepoint;`REQUIRES_NEW` 使用独立 Session/连接,连接池 `max_size` 至少应能容纳并发的外层和内层连接。
|
|
@@ -1487,6 +1496,26 @@ class CleanupJob:
|
|
|
1487
1496
|
>
|
|
1488
1497
|
> 提供 ChatClient(链式对话)、Advisor(对话顾问)、Tools(工具调用)、RAG(知识库检索增强生成)、Function Calling 等能力。支持 OpenAI / Ollama / DeepSeek / Moonshot 等多家大模型。
|
|
1489
1498
|
|
|
1499
|
+
以下便捷功能自 **2.3.12** 起提供,安装时运行 `pip install -U "springbootAI[ai]>=2.3.12"`。普通聊天只需 `client.chat("你好")`,异步使用 `await client.achat("你好")`;文本流使用 `client.stream_text(...)` / `client.astream_text(...)`。
|
|
1500
|
+
|
|
1501
|
+
容器管理的 Service 可以只写提示词和签名:
|
|
1502
|
+
|
|
1503
|
+
```python
|
|
1504
|
+
from springbootai.annotations import Prompt, RAG, Service
|
|
1505
|
+
|
|
1506
|
+
@Service
|
|
1507
|
+
class Assistant:
|
|
1508
|
+
@Prompt("用三句话总结:{text}")
|
|
1509
|
+
def summarize(self, text: str) -> str:
|
|
1510
|
+
...
|
|
1511
|
+
|
|
1512
|
+
@RAG(top_k=3)
|
|
1513
|
+
def answer(self, question: str) -> str:
|
|
1514
|
+
...
|
|
1515
|
+
```
|
|
1516
|
+
|
|
1517
|
+
应用显式设置 `spring.ai.enabled: true` 并配置 Provider 后,框架自动调用模型、执行检索;RAG 数据先用向量库的 `add_texts(...)` 入库。返回类型声明为 Pydantic 模型时,自动生成 JSON 格式要求并校验结果,无需另写 `@StructuredOutput`。详见 [最少代码用法](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/AI_MODULE.md#常用功能最少代码写法)。
|
|
1518
|
+
|
|
1490
1519
|
### 12.2 LangChain 模块
|
|
1491
1520
|
|
|
1492
1521
|
> 完整文档:[LANGCHAIN_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/LANGCHAIN_MODULE.md)。安装:`pip install springbootAI[langchain]`。
|
|
@@ -1992,4 +2021,6 @@ pip install springbootAI[mcp]
|
|
|
1992
2021
|
|
|
1993
2022
|
完整配置、FastAPI 挂载、stdio、认证、白名单、Spring AI/LangChain/LangGraph 组合方式和测试命令见 [MCP_MODULE.md](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_MODULE.md)。
|
|
1994
2023
|
|
|
2024
|
+
可运行的 [Agent 调用 MCP 案例](https://github.com/YUCONGGEN/springbootAI/blob/master/doc/MCP_AGENT_EXAMPLE.md) 演示订单与物流查询,支持一条命令启动本地 MCP 服务、连接 HTTP 服务和切换真实模型。
|
|
2025
|
+
|
|
1995
2026
|
LangChain 也支持 `@LangChainClient` + `@LangChainCall`,LangGraph 支持 `@LangGraph` + `@GraphNode` + `@GraphEdge` + `@GraphRoute` + `@GraphInvoke`。这些注解复用现有运行时,不会重新实现 LangChain、LangGraph 或 MCP 协议。
|
|
@@ -18,6 +18,7 @@ springbootAI.egg-info/top_level.txt
|
|
|
18
18
|
springbootai/__init__.py
|
|
19
19
|
springbootai/devtools.py
|
|
20
20
|
springbootai/main.py
|
|
21
|
+
springbootai/py.typed
|
|
21
22
|
springbootai/ai/__init__.py
|
|
22
23
|
springbootai/ai/advisors.py
|
|
23
24
|
springbootai/ai/annotation_runtime.py
|
|
@@ -266,6 +267,7 @@ tests/test_actuator.py
|
|
|
266
267
|
tests/test_actuator_prometheus_admin.py
|
|
267
268
|
tests/test_ai_annotations.py
|
|
268
269
|
tests/test_ai_comprehensive.py
|
|
270
|
+
tests/test_ai_convenience.py
|
|
269
271
|
tests/test_ai_declarative_annotations.py
|
|
270
272
|
tests/test_ai_enterprise_hardening.py
|
|
271
273
|
tests/test_ai_module.py
|
|
@@ -306,6 +308,9 @@ tests/test_devtools_lifecycle_hardening.py
|
|
|
306
308
|
tests/test_di_config_event_full.py
|
|
307
309
|
tests/test_enterprise_safety_regressions.py
|
|
308
310
|
tests/test_excel_module.py
|
|
311
|
+
tests/test_final_enterprise_hardening.py
|
|
312
|
+
tests/test_followup_enterprise_fixes.py
|
|
313
|
+
tests/test_framework_audit_regressions.py
|
|
309
314
|
tests/test_hateoas.py
|
|
310
315
|
tests/test_i18n_module.py
|
|
311
316
|
tests/test_io_http_logging_hardening.py
|
|
@@ -317,8 +322,10 @@ tests/test_langchain_ext.py
|
|
|
317
322
|
tests/test_langchain_module.py
|
|
318
323
|
tests/test_langgraph_comprehensive.py
|
|
319
324
|
tests/test_langgraph_module.py
|
|
325
|
+
tests/test_latest_enterprise_audit_fixes.py
|
|
320
326
|
tests/test_logging_config.py
|
|
321
327
|
tests/test_lombok_annotations.py
|
|
328
|
+
tests/test_mcp_agent_example.py
|
|
322
329
|
tests/test_mcp_module.py
|
|
323
330
|
tests/test_metadata.py
|
|
324
331
|
tests/test_migration.py
|
|
@@ -328,9 +335,11 @@ tests/test_new_features.py
|
|
|
328
335
|
tests/test_oauth2.py
|
|
329
336
|
tests/test_optional_component_timeouts.py
|
|
330
337
|
tests/test_orm_pymybatis_full.py
|
|
338
|
+
tests/test_post_audit_enterprise_fixes.py
|
|
331
339
|
tests/test_production_readiness.py
|
|
332
340
|
tests/test_pymybatis_configuration_hardening.py
|
|
333
341
|
tests/test_pymybatis_contract.py
|
|
342
|
+
tests/test_remaining_enterprise_hardening.py
|
|
334
343
|
tests/test_request_metrics.py
|
|
335
344
|
tests/test_retry.py
|
|
336
345
|
tests/test_runtime_configuration_fixes.py
|
|
@@ -6,9 +6,10 @@ python-dotenv==1.2.2
|
|
|
6
6
|
DBUtils==3.1.2
|
|
7
7
|
cryptography==50.0.0
|
|
8
8
|
bcrypt==5.0.0
|
|
9
|
-
pyjwt==2.
|
|
9
|
+
pyjwt==2.15.0
|
|
10
10
|
pydantic==2.13.4
|
|
11
11
|
requests==2.34.2
|
|
12
|
+
urllib3==2.8.0
|
|
12
13
|
httpx==0.28.1
|
|
13
14
|
defusedxml==0.7.1
|
|
14
15
|
|
|
@@ -50,6 +51,7 @@ httpx==0.28.1
|
|
|
50
51
|
[dev]
|
|
51
52
|
pytest==9.1.1
|
|
52
53
|
pytest-cov==7.1.0
|
|
54
|
+
mypy==1.18.2
|
|
53
55
|
redis==8.1.0
|
|
54
56
|
sqlglot==27.28.1
|
|
55
57
|
|
|
@@ -63,6 +65,7 @@ sqlalchemy==2.0.40
|
|
|
63
65
|
redis==8.1.0
|
|
64
66
|
pika==1.4.4
|
|
65
67
|
nacos-sdk-python==2.0.11
|
|
68
|
+
multidict==6.9.1
|
|
66
69
|
prometheus-client==0.26.0
|
|
67
70
|
loguru==0.7.3
|
|
68
71
|
sqlglot==27.28.1
|
|
@@ -133,6 +136,7 @@ PyMySQL==1.2.0
|
|
|
133
136
|
|
|
134
137
|
[nacos]
|
|
135
138
|
nacos-sdk-python==2.0.11
|
|
139
|
+
multidict==6.9.1
|
|
136
140
|
|
|
137
141
|
[postgresql]
|
|
138
142
|
psycopg2-binary==2.9.12
|