Copy disabled (too large)
Download .txt
Showing preview only (18,762K chars total). Download the full file to get everything.
Repository: spring-projects-experimental/spring-ai
Branch: main
Commit: 7cfad4559be4
Files: 2792
Total size: 16.9 MB
Directory structure:
gitextract_2jlwg2th/
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ ├── feature_request.md
│ │ └── miscellaneous.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dco.yml
│ ├── release-files-spec.json
│ └── workflows/
│ ├── artifactory-milestone-release.yml
│ ├── auto-cherry-pick.yml
│ ├── backport-issue.yml
│ ├── continuous-integration.yml
│ ├── dependency-ci-dashboard.yml
│ ├── deploy-docs.yml
│ ├── documentation-upload.yml
│ ├── maven-central-release.yml
│ ├── mcp-integration-tests.yml
│ └── pr-check.yml
├── .gitignore
├── .mvn/
│ ├── extensions.xml
│ ├── jvm.config
│ ├── maven-build-cache-config.xml
│ └── wrapper/
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── .sdkmanrc
├── CONTRIBUTING.adoc
├── LICENSE.txt
├── README.md
├── advisors/
│ └── spring-ai-advisors-vector-store/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── chat/
│ │ └── client/
│ │ └── advisor/
│ │ └── vectorstore/
│ │ ├── QuestionAnswerAdvisor.java
│ │ ├── VectorStoreChatMemoryAdvisor.java
│ │ └── package-info.java
│ └── test/
│ └── java/
│ └── org/
│ └── springframework/
│ └── ai/
│ └── chat/
│ └── client/
│ └── advisor/
│ └── vectorstore/
│ ├── QuestionAnswerAdvisorTests.java
│ └── VectorStoreChatMemoryAdvisorTests.java
├── auto-configurations/
│ ├── common/
│ │ └── spring-ai-autoconfigure-retry/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── retry/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── SpringAiRetryAutoConfiguration.java
│ │ │ │ ├── SpringAiRetryProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── retry/
│ │ └── autoconfigure/
│ │ ├── SpringAiRetryAutoConfigurationIT.java
│ │ └── SpringAiRetryPropertiesTests.java
│ ├── mcp/
│ │ ├── spring-ai-autoconfigure-mcp-client-common/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── mcp/
│ │ │ │ │ └── client/
│ │ │ │ │ └── common/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── McpAsyncToolsChangeEventEmmiter.java
│ │ │ │ │ ├── McpClientAutoConfiguration.java
│ │ │ │ │ ├── McpSseClientConnectionDetails.java
│ │ │ │ │ ├── McpSyncToolsChangeEventEmmiter.java
│ │ │ │ │ ├── McpToolCallbackAutoConfiguration.java
│ │ │ │ │ ├── NamedClientMcpTransport.java
│ │ │ │ │ ├── PropertiesMcpSseClientConnectionDetails.java
│ │ │ │ │ ├── StdioTransportAutoConfiguration.java
│ │ │ │ │ ├── annotations/
│ │ │ │ │ │ ├── McpClientAnnotationScannerAutoConfiguration.java
│ │ │ │ │ │ ├── McpClientAnnotationScannerProperties.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── aot/
│ │ │ │ │ │ ├── McpClientAutoConfigurationRuntimeHints.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── configurer/
│ │ │ │ │ │ ├── McpAsyncClientConfigurer.java
│ │ │ │ │ │ ├── McpSyncClientConfigurer.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── package-info.java
│ │ │ │ │ └── properties/
│ │ │ │ │ ├── McpClientCommonProperties.java
│ │ │ │ │ ├── McpSseClientProperties.java
│ │ │ │ │ ├── McpStdioClientProperties.java
│ │ │ │ │ ├── McpStreamableHttpClientProperties.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ ├── aot.factories
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── mcp/
│ │ │ │ └── client/
│ │ │ │ └── common/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── McpClientAutoConfigurationIT.java
│ │ │ │ ├── McpClientAutoConfigurationRuntimeHintsTests.java
│ │ │ │ ├── McpToolCallbackAutoConfigurationConditionTests.java
│ │ │ │ ├── McpToolCallbackAutoConfigurationTests.java
│ │ │ │ ├── annotations/
│ │ │ │ │ └── McpClientListChangedAnnotationsScanningIT.java
│ │ │ │ └── properties/
│ │ │ │ ├── McpClientCommonPropertiesTests.java
│ │ │ │ └── McpSseClientPropertiesTests.java
│ │ │ └── resources/
│ │ │ ├── application-test.properties
│ │ │ ├── nested/
│ │ │ │ └── nested-config.json
│ │ │ └── test-config.json
│ │ ├── spring-ai-autoconfigure-mcp-client-httpclient/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── mcp/
│ │ │ │ │ └── client/
│ │ │ │ │ └── httpclient/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── SseHttpClientTransportAutoConfiguration.java
│ │ │ │ │ ├── StreamableHttpHttpClientTransportAutoConfiguration.java
│ │ │ │ │ ├── aot/
│ │ │ │ │ │ ├── McpClientAutoConfigurationRuntimeHints.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ ├── aot.factories
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── mcp/
│ │ │ │ └── client/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── SseHttpClientTransportAutoConfigurationIT.java
│ │ │ │ ├── SseHttpClientTransportAutoConfigurationTests.java
│ │ │ │ ├── StreamableHttpHttpClientTransportAutoConfigurationIT.java
│ │ │ │ └── StreamableHttpHttpClientTransportAutoConfigurationTests.java
│ │ │ └── resources/
│ │ │ ├── application-test.properties
│ │ │ ├── nested/
│ │ │ │ └── nested-config.json
│ │ │ └── test-config.json
│ │ ├── spring-ai-autoconfigure-mcp-client-webflux/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── mcp/
│ │ │ │ │ └── client/
│ │ │ │ │ └── webflux/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── SseWebFluxTransportAutoConfiguration.java
│ │ │ │ │ ├── StreamableHttpWebFluxTransportAutoConfiguration.java
│ │ │ │ │ ├── aot/
│ │ │ │ │ │ ├── McpClientAutoConfigurationRuntimeHints.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ ├── aot.factories
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── mcp/
│ │ │ │ └── client/
│ │ │ │ └── webflux/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── McpToolsConfigurationTests.java
│ │ │ │ ├── SseWebFluxTransportAutoConfigurationIT.java
│ │ │ │ ├── SseWebFluxTransportAutoConfigurationTests.java
│ │ │ │ ├── StreamableHttpHttpClientTransportAutoConfigurationIT.java
│ │ │ │ └── StreamableHttpWebFluxTransportAutoConfigurationTests.java
│ │ │ └── resources/
│ │ │ ├── application-test.properties
│ │ │ ├── nested/
│ │ │ │ └── nested-config.json
│ │ │ └── test-config.json
│ │ ├── spring-ai-autoconfigure-mcp-server-common/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── mcp/
│ │ │ │ │ └── server/
│ │ │ │ │ └── common/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── McpServerAutoConfiguration.java
│ │ │ │ │ ├── McpServerJsonMapperAutoConfiguration.java
│ │ │ │ │ ├── McpServerStatelessAutoConfiguration.java
│ │ │ │ │ ├── McpServerStdioDisabledCondition.java
│ │ │ │ │ ├── StatelessToolCallbackConverterAutoConfiguration.java
│ │ │ │ │ ├── ToolCallbackConverterAutoConfiguration.java
│ │ │ │ │ ├── ToolCallbackUtils.java
│ │ │ │ │ ├── annotations/
│ │ │ │ │ │ ├── McpServerAnnotationScannerAutoConfiguration.java
│ │ │ │ │ │ ├── McpServerAnnotationScannerProperties.java
│ │ │ │ │ │ ├── McpServerSpecificationFactoryAutoConfiguration.java
│ │ │ │ │ │ ├── StatelessServerSpecificationFactoryAutoConfiguration.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── package-info.java
│ │ │ │ │ └── properties/
│ │ │ │ │ ├── McpServerChangeNotificationProperties.java
│ │ │ │ │ ├── McpServerProperties.java
│ │ │ │ │ ├── McpServerSseProperties.java
│ │ │ │ │ ├── McpServerStreamableHttpProperties.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── mcp/
│ │ │ └── server/
│ │ │ └── common/
│ │ │ └── autoconfigure/
│ │ │ ├── McpServerAutoConfigurationIT.java
│ │ │ ├── McpServerJsonMapperAutoConfigurationIT.java
│ │ │ ├── McpStatelessServerAutoConfigurationIT.java
│ │ │ ├── McpToolWithStdioIT.java
│ │ │ ├── StatelessToolCallbackConverterAutoConfigurationIT.java
│ │ │ └── ToolCallbackConverterAutoConfigurationIT.java
│ │ ├── spring-ai-autoconfigure-mcp-server-webflux/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── mcp/
│ │ │ │ │ └── server/
│ │ │ │ │ └── webflux/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── McpServerSseWebFluxAutoConfiguration.java
│ │ │ │ │ ├── McpServerStatelessWebFluxAutoConfiguration.java
│ │ │ │ │ ├── McpServerStreamableHttpWebFluxAutoConfiguration.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── mcp/
│ │ │ └── server/
│ │ │ └── webflux/
│ │ │ └── autoconfigure/
│ │ │ ├── McpServerSseWebFluxAutoConfigurationIT.java
│ │ │ ├── McpServerSseWebFluxAutoConfigurationTests.java
│ │ │ ├── McpServerStatelessWebFluxAutoConfigurationIT.java
│ │ │ ├── McpServerStreamableHttpWebFluxAutoConfigurationIT.java
│ │ │ ├── McpToolCallProviderCachingIT.java
│ │ │ ├── McpToolCallbackParameterlessToolIT.java
│ │ │ ├── SseWebClientWebFluxServerIT.java
│ │ │ ├── StatelessWebClientWebFluxServerIT.java
│ │ │ ├── StreamableMcpAnnotations2IT.java
│ │ │ ├── StreamableMcpAnnotationsIT.java
│ │ │ ├── StreamableMcpAnnotationsManualIT.java
│ │ │ ├── StreamableMcpAnnotationsWithLLMIT.java
│ │ │ ├── StreamableWebClientWebFluxServerIT.java
│ │ │ └── capabilities/
│ │ │ ├── McpHandlerConfiguration.java
│ │ │ └── McpHandlerService.java
│ │ └── spring-ai-autoconfigure-mcp-server-webmvc/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── mcp/
│ │ │ │ └── server/
│ │ │ │ └── webmvc/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── McpServerSseWebMvcAutoConfiguration.java
│ │ │ │ ├── McpServerStatelessWebMvcAutoConfiguration.java
│ │ │ │ ├── McpServerStreamableHttpWebMvcAutoConfiguration.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── mcp/
│ │ └── server/
│ │ └── webmvc/
│ │ └── autoconfigure/
│ │ ├── McpServerSseWebMvcAutoConfigurationIT.java
│ │ ├── McpServerStatelessWebMvcAutoConfigurationIT.java
│ │ └── McpServerStreamableHttpWebMvcAutoConfigurationIT.java
│ ├── models/
│ │ ├── chat/
│ │ │ ├── client/
│ │ │ │ └── spring-ai-autoconfigure-model-chat-client/
│ │ │ │ ├── pom.xml
│ │ │ │ └── src/
│ │ │ │ ├── main/
│ │ │ │ │ ├── java/
│ │ │ │ │ │ └── org/
│ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ └── ai/
│ │ │ │ │ │ └── model/
│ │ │ │ │ │ └── chat/
│ │ │ │ │ │ └── client/
│ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ ├── ChatClientAutoConfiguration.java
│ │ │ │ │ │ ├── ChatClientBuilderConfigurer.java
│ │ │ │ │ │ ├── ChatClientBuilderProperties.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ └── resources/
│ │ │ │ │ └── META-INF/
│ │ │ │ │ ├── additional-spring-configuration-metadata.json
│ │ │ │ │ └── spring/
│ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ │ └── test/
│ │ │ │ └── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── model/
│ │ │ │ └── chat/
│ │ │ │ └── client/
│ │ │ │ └── autoconfigure/
│ │ │ │ └── ChatClientObservationAutoConfigurationTests.java
│ │ │ ├── memory/
│ │ │ │ ├── repository/
│ │ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory-repository-cassandra/
│ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ │ └── org/
│ │ │ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ │ │ └── ai/
│ │ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ │ └── chat/
│ │ │ │ │ │ │ │ └── memory/
│ │ │ │ │ │ │ │ └── repository/
│ │ │ │ │ │ │ │ └── cassandra/
│ │ │ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ │ │ ├── CassandraChatMemoryRepositoryAutoConfiguration.java
│ │ │ │ │ │ │ │ ├── CassandraChatMemoryRepositoryProperties.java
│ │ │ │ │ │ │ │ └── package-info.java
│ │ │ │ │ │ │ └── resources/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ └── spring/
│ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ │ │ │ └── test/
│ │ │ │ │ │ └── java/
│ │ │ │ │ │ └── org/
│ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ └── ai/
│ │ │ │ │ │ └── model/
│ │ │ │ │ │ └── chat/
│ │ │ │ │ │ └── memory/
│ │ │ │ │ │ └── repository/
│ │ │ │ │ │ └── cassandra/
│ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ ├── CassandraChatMemoryRepositoryAutoConfigurationIT.java
│ │ │ │ │ │ └── CassandraChatMemoryRepositoryPropertiesTest.java
│ │ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory-repository-cosmos-db/
│ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ │ └── org/
│ │ │ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ │ │ └── ai/
│ │ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ │ └── chat/
│ │ │ │ │ │ │ │ └── memory/
│ │ │ │ │ │ │ │ └── repository/
│ │ │ │ │ │ │ │ └── cosmosdb/
│ │ │ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ │ │ ├── CosmosDBChatMemoryRepositoryAutoConfiguration.java
│ │ │ │ │ │ │ │ ├── CosmosDBChatMemoryRepositoryProperties.java
│ │ │ │ │ │ │ │ └── package-info.java
│ │ │ │ │ │ │ └── resources/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ └── spring/
│ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ │ │ │ └── test/
│ │ │ │ │ │ └── java/
│ │ │ │ │ │ └── org/
│ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ └── ai/
│ │ │ │ │ │ └── model/
│ │ │ │ │ │ └── chat/
│ │ │ │ │ │ └── memory/
│ │ │ │ │ │ └── repository/
│ │ │ │ │ │ └── cosmosdb/
│ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ ├── CosmosDBChatMemoryRepositoryAutoConfigurationIT.java
│ │ │ │ │ │ └── CosmosDBChatMemoryRepositoryPropertiesTest.java
│ │ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory-repository-jdbc/
│ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ │ └── org/
│ │ │ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ │ │ └── ai/
│ │ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ │ └── chat/
│ │ │ │ │ │ │ │ └── memory/
│ │ │ │ │ │ │ │ └── repository/
│ │ │ │ │ │ │ │ └── jdbc/
│ │ │ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryAutoConfiguration.java
│ │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryProperties.java
│ │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositorySchemaInitializer.java
│ │ │ │ │ │ │ │ └── package-info.java
│ │ │ │ │ │ │ └── resources/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ └── spring/
│ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ │ │ │ └── test/
│ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ └── org/
│ │ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ │ └── ai/
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ └── chat/
│ │ │ │ │ │ │ └── memory/
│ │ │ │ │ │ │ └── repository/
│ │ │ │ │ │ │ └── jdbc/
│ │ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryHsqldbAutoConfigurationIT.java
│ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryPostgresqlAutoConfigurationIT.java
│ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryPropertiesTests.java
│ │ │ │ │ │ │ ├── JdbcChatMemoryRepositorySchemaInitializerPostgresqlTests.java
│ │ │ │ │ │ │ └── JdbcChatMemoryRepositorySqlServerAutoConfigurationIT.java
│ │ │ │ │ │ └── resources/
│ │ │ │ │ │ └── schema.sql
│ │ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory-repository-mongodb/
│ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ │ └── org/
│ │ │ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ │ │ └── ai/
│ │ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ │ └── chat/
│ │ │ │ │ │ │ │ └── memory/
│ │ │ │ │ │ │ │ └── repository/
│ │ │ │ │ │ │ │ └── mongo/
│ │ │ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ │ │ ├── MongoChatMemoryAutoConfiguration.java
│ │ │ │ │ │ │ │ ├── MongoChatMemoryIndexCreatorAutoConfiguration.java
│ │ │ │ │ │ │ │ ├── MongoChatMemoryProperties.java
│ │ │ │ │ │ │ │ └── package-info.java
│ │ │ │ │ │ │ └── resources/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ └── spring/
│ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ │ │ │ └── test/
│ │ │ │ │ │ └── java/
│ │ │ │ │ │ └── org/
│ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ └── ai/
│ │ │ │ │ │ └── model/
│ │ │ │ │ │ └── chat/
│ │ │ │ │ │ └── memory/
│ │ │ │ │ │ └── repository/
│ │ │ │ │ │ └── mongo/
│ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ ├── MongoChatMemoryAutoConfigurationIT.java
│ │ │ │ │ │ └── MongoChatMemoryPropertiesTests.java
│ │ │ │ │ └── spring-ai-autoconfigure-model-chat-memory-repository-neo4j/
│ │ │ │ │ ├── pom.xml
│ │ │ │ │ └── src/
│ │ │ │ │ ├── main/
│ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ └── org/
│ │ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ │ └── ai/
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ └── chat/
│ │ │ │ │ │ │ └── memory/
│ │ │ │ │ │ │ └── repository/
│ │ │ │ │ │ │ └── neo4j/
│ │ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ │ ├── Neo4jChatMemoryRepositoryAutoConfiguration.java
│ │ │ │ │ │ │ ├── Neo4jChatMemoryRepositoryProperties.java
│ │ │ │ │ │ │ └── package-info.java
│ │ │ │ │ │ └── resources/
│ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ └── spring/
│ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ │ │ └── test/
│ │ │ │ │ └── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── chat/
│ │ │ │ │ └── memory/
│ │ │ │ │ └── repository/
│ │ │ │ │ └── neo4j/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── Neo4JChatMemoryRepositoryPropertiesTest.java
│ │ │ │ │ └── Neo4jChatMemoryRepositoryAutoConfigurationIT.java
│ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory/
│ │ │ │ │ ├── pom.xml
│ │ │ │ │ └── src/
│ │ │ │ │ ├── main/
│ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ └── org/
│ │ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ │ └── ai/
│ │ │ │ │ │ │ └── model/
│ │ │ │ │ │ │ └── chat/
│ │ │ │ │ │ │ └── memory/
│ │ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ │ ├── ChatMemoryAutoConfiguration.java
│ │ │ │ │ │ │ └── package-info.java
│ │ │ │ │ │ └── resources/
│ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ └── spring/
│ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ │ │ └── test/
│ │ │ │ │ └── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── chat/
│ │ │ │ │ └── memory/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ └── ChatMemoryAutoConfigurationTests.java
│ │ │ │ └── spring-ai-autoconfigure-model-chat-memory-redis/
│ │ │ │ ├── pom.xml
│ │ │ │ └── src/
│ │ │ │ ├── main/
│ │ │ │ │ ├── java/
│ │ │ │ │ │ └── org/
│ │ │ │ │ │ └── springframework/
│ │ │ │ │ │ └── ai/
│ │ │ │ │ │ └── model/
│ │ │ │ │ │ └── chat/
│ │ │ │ │ │ └── memory/
│ │ │ │ │ │ └── redis/
│ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ ├── RedisChatMemoryAutoConfiguration.java
│ │ │ │ │ │ ├── RedisChatMemoryProperties.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ └── resources/
│ │ │ │ │ └── META-INF/
│ │ │ │ │ └── spring/
│ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ │ └── test/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── chat/
│ │ │ │ │ └── memory/
│ │ │ │ │ └── redis/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ └── RedisChatMemoryAutoConfigurationIT.java
│ │ │ │ └── resources/
│ │ │ │ └── logback-test.xml
│ │ │ └── observation/
│ │ │ └── spring-ai-autoconfigure-model-chat-observation/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── chat/
│ │ │ │ │ └── observation/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── ChatObservationAutoConfiguration.java
│ │ │ │ │ ├── ChatObservationProperties.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── chat/
│ │ │ └── observation/
│ │ │ └── autoconfigure/
│ │ │ ├── ChatObservationAutoConfigurationOrderingTests.java
│ │ │ └── ChatObservationAutoConfigurationTests.java
│ │ ├── embedding/
│ │ │ └── observation/
│ │ │ └── spring-ai-autoconfigure-model-embedding-observation/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── embedding/
│ │ │ │ │ └── observation/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── EmbeddingObservationAutoConfiguration.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── embedding/
│ │ │ └── observation/
│ │ │ └── autoconfigure/
│ │ │ └── EmbeddingObservationAutoConfigurationTests.java
│ │ ├── image/
│ │ │ └── observation/
│ │ │ └── spring-ai-autoconfigure-model-image-observation/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── image/
│ │ │ │ │ └── observation/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── ImageObservationAutoConfiguration.java
│ │ │ │ │ ├── ImageObservationProperties.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── image/
│ │ │ └── observation/
│ │ │ └── autoconfigure/
│ │ │ └── ImageObservationAutoConfigurationTests.java
│ │ ├── spring-ai-autoconfigure-model-anthropic/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── anthropic/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── AnthropicChatAutoConfiguration.java
│ │ │ │ │ ├── AnthropicChatProperties.java
│ │ │ │ │ ├── AnthropicConnectionProperties.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── anthropic/
│ │ │ └── autoconfigure/
│ │ │ ├── AnthropicChatAutoConfigurationIT.java
│ │ │ ├── AnthropicModelConfigurationTests.java
│ │ │ ├── AnthropicPropertiesTests.java
│ │ │ └── tool/
│ │ │ ├── FunctionCallWithFunctionBeanIT.java
│ │ │ ├── FunctionCallWithPromptFunctionIT.java
│ │ │ └── MockWeatherService.java
│ │ ├── spring-ai-autoconfigure-model-azure-openai/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── azure/
│ │ │ │ │ └── openai/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── AzureOpenAIClientBuilderCustomizer.java
│ │ │ │ │ ├── AzureOpenAiAudioTranscriptionAutoConfiguration.java
│ │ │ │ │ ├── AzureOpenAiAudioTranscriptionProperties.java
│ │ │ │ │ ├── AzureOpenAiChatAutoConfiguration.java
│ │ │ │ │ ├── AzureOpenAiChatProperties.java
│ │ │ │ │ ├── AzureOpenAiClientBuilderConfiguration.java
│ │ │ │ │ ├── AzureOpenAiConnectionProperties.java
│ │ │ │ │ ├── AzureOpenAiEmbeddingAutoConfiguration.java
│ │ │ │ │ ├── AzureOpenAiEmbeddingProperties.java
│ │ │ │ │ ├── AzureOpenAiImageAutoConfiguration.java
│ │ │ │ │ └── AzureOpenAiImageOptionsProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ ├── additional-spring-configuration-metadata.json
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── model/
│ │ │ │ └── azure/
│ │ │ │ └── openai/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── AzureOpenAiAutoConfigurationEntraIT.java
│ │ │ │ ├── AzureOpenAiAutoConfigurationIT.java
│ │ │ │ ├── AzureOpenAiAutoConfigurationPropertyTests.java
│ │ │ │ ├── AzureOpenAiDirectOpenAiAutoConfigurationIT.java
│ │ │ │ ├── AzureOpenAiModelConfigurationTests.java
│ │ │ │ └── tool/
│ │ │ │ ├── DeploymentNameUtil.java
│ │ │ │ ├── FunctionCallWithFunctionBeanIT.java
│ │ │ │ ├── FunctionCallWithFunctionWrapperIT.java
│ │ │ │ ├── FunctionCallWithPromptFunctionIT.java
│ │ │ │ └── MockWeatherService.java
│ │ │ └── resources/
│ │ │ └── speech/
│ │ │ └── jfk.flac
│ │ ├── spring-ai-autoconfigure-model-bedrock-ai/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── bedrock/
│ │ │ │ │ ├── autoconfigure/
│ │ │ │ │ │ ├── BedrockAwsConnectionConfiguration.java
│ │ │ │ │ │ ├── BedrockAwsConnectionProperties.java
│ │ │ │ │ │ └── ProfileProperties.java
│ │ │ │ │ ├── cohere/
│ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ ├── BedrockCohereEmbeddingAutoConfiguration.java
│ │ │ │ │ │ └── BedrockCohereEmbeddingProperties.java
│ │ │ │ │ ├── converse/
│ │ │ │ │ │ └── autoconfigure/
│ │ │ │ │ │ ├── BedrockConverseProxyChatAutoConfiguration.java
│ │ │ │ │ │ └── BedrockConverseProxyChatProperties.java
│ │ │ │ │ └── titan/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── BedrockTitanEmbeddingAutoConfiguration.java
│ │ │ │ │ └── BedrockTitanEmbeddingProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── bedrock/
│ │ │ ├── autoconfigure/
│ │ │ │ ├── BedrockAwsConnectionConfigurationIT.java
│ │ │ │ ├── BedrockTestUtils.java
│ │ │ │ └── RequiresAwsCredentials.java
│ │ │ ├── cohere/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── BedrockCohereEmbeddingAutoConfigurationIT.java
│ │ │ │ └── BedrockCohereModelConfigurationTests.java
│ │ │ ├── converse/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── BedrockConverseModelConfigurationTests.java
│ │ │ │ ├── BedrockConverseProxyChatAutoConfigurationIT.java
│ │ │ │ ├── BedrockConverseProxyChatPropertiesTests.java
│ │ │ │ └── tool/
│ │ │ │ ├── FunctionCallWithFunctionBeanIT.java
│ │ │ │ ├── FunctionCallWithPromptFunctionIT.java
│ │ │ │ └── MockWeatherService.java
│ │ │ └── titan/
│ │ │ └── autoconfigure/
│ │ │ ├── BedrockTitanEmbeddingAutoConfigurationIT.java
│ │ │ └── BedrockTitanModelConfigurationTests.java
│ │ ├── spring-ai-autoconfigure-model-deepseek/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── deepseek/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── DeepSeekChatAutoConfiguration.java
│ │ │ │ │ ├── DeepSeekChatProperties.java
│ │ │ │ │ ├── DeepSeekConnectionProperties.java
│ │ │ │ │ └── DeepSeekParentProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── deepseek/
│ │ │ └── autoconfigure/
│ │ │ ├── BaseDeepSeekIT.java
│ │ │ ├── DeepSeekAutoConfigurationIT.java
│ │ │ ├── DeepSeekPropertiesTests.java
│ │ │ └── tool/
│ │ │ ├── DeepSeekFunctionCallbackIT.java
│ │ │ ├── FunctionCallbackInPromptIT.java
│ │ │ ├── FunctionCallbackWithPlainFunctionBeanIT.java
│ │ │ └── MockWeatherService.java
│ │ ├── spring-ai-autoconfigure-model-elevenlabs/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── elevenlabs/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── ElevenLabsAutoConfiguration.java
│ │ │ │ │ ├── ElevenLabsConnectionProperties.java
│ │ │ │ │ └── ElevenLabsSpeechProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── elevenlabs/
│ │ │ └── autoconfigure/
│ │ │ ├── ElevenLabsAutoConfigurationIT.java
│ │ │ ├── ElevenLabsITUtil.java
│ │ │ └── ElevenLabsPropertiesTests.java
│ │ ├── spring-ai-autoconfigure-model-google-genai/
│ │ │ ├── MIGRATION_GUIDE.md
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── google/
│ │ │ │ │ └── genai/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── CachedContentServiceCondition.java
│ │ │ │ │ │ ├── GoogleGenAiChatAutoConfiguration.java
│ │ │ │ │ │ ├── GoogleGenAiChatProperties.java
│ │ │ │ │ │ └── GoogleGenAiConnectionProperties.java
│ │ │ │ │ └── embedding/
│ │ │ │ │ ├── GoogleGenAiEmbeddingConnectionAutoConfiguration.java
│ │ │ │ │ ├── GoogleGenAiEmbeddingConnectionProperties.java
│ │ │ │ │ ├── GoogleGenAiTextEmbeddingAutoConfiguration.java
│ │ │ │ │ └── GoogleGenAiTextEmbeddingProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── google/
│ │ │ └── genai/
│ │ │ └── autoconfigure/
│ │ │ ├── chat/
│ │ │ │ ├── GoogleGenAiCachedContentServiceAutoConfigurationTests.java
│ │ │ │ ├── GoogleGenAiChatAutoConfigurationIT.java
│ │ │ │ ├── GoogleGenAiModelConfigurationTests.java
│ │ │ │ ├── GoogleGenAiPropertiesTests.java
│ │ │ │ └── tool/
│ │ │ │ ├── FunctionCallWithFunctionBeanIT.java
│ │ │ │ ├── FunctionCallWithFunctionWrapperIT.java
│ │ │ │ ├── FunctionCallWithPromptFunctionIT.java
│ │ │ │ └── MockWeatherService.java
│ │ │ └── embedding/
│ │ │ └── GoogleGenAiTextEmbeddingAutoConfigurationIT.java
│ │ ├── spring-ai-autoconfigure-model-minimax/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── minimax/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── MiniMaxChatAutoConfiguration.java
│ │ │ │ │ ├── MiniMaxChatProperties.java
│ │ │ │ │ ├── MiniMaxConnectionProperties.java
│ │ │ │ │ ├── MiniMaxEmbeddingAutoConfiguration.java
│ │ │ │ │ ├── MiniMaxEmbeddingProperties.java
│ │ │ │ │ └── MiniMaxParentProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── minimax/
│ │ │ └── autoconfigure/
│ │ │ ├── FunctionCallbackInPromptIT.java
│ │ │ ├── FunctionCallbackWithPlainFunctionBeanIT.java
│ │ │ ├── MiniMaxAutoConfigurationIT.java
│ │ │ ├── MiniMaxFunctionCallbackIT.java
│ │ │ ├── MiniMaxPropertiesTests.java
│ │ │ ├── MinimaxModelConfigurationTests.java
│ │ │ └── MockWeatherService.java
│ │ ├── spring-ai-autoconfigure-model-mistral-ai/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── mistralai/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── MistralAiChatAutoConfiguration.java
│ │ │ │ │ ├── MistralAiChatProperties.java
│ │ │ │ │ ├── MistralAiCommonProperties.java
│ │ │ │ │ ├── MistralAiEmbeddingAutoConfiguration.java
│ │ │ │ │ ├── MistralAiEmbeddingProperties.java
│ │ │ │ │ ├── MistralAiModerationAutoConfiguration.java
│ │ │ │ │ ├── MistralAiModerationProperties.java
│ │ │ │ │ ├── MistralAiOcrAutoConfiguration.java
│ │ │ │ │ ├── MistralAiOcrProperties.java
│ │ │ │ │ └── MistralAiParentProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ ├── additional-spring-configuration-metadata.json
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── mistralai/
│ │ │ └── autoconfigure/
│ │ │ ├── MistralAiAutoConfigurationIT.java
│ │ │ ├── MistralAiOcrAutoConfigurationIT.java
│ │ │ ├── MistralAiOcrPropertiesTests.java
│ │ │ ├── MistralAiPropertiesTests.java
│ │ │ ├── MistralModelConfigurationTests.java
│ │ │ └── tool/
│ │ │ ├── PaymentStatusBeanIT.java
│ │ │ ├── PaymentStatusBeanOpenAiIT.java
│ │ │ ├── PaymentStatusPromptIT.java
│ │ │ └── WeatherServicePromptIT.java
│ │ ├── spring-ai-autoconfigure-model-ollama/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── ollama/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── OllamaApiAutoConfiguration.java
│ │ │ │ │ ├── OllamaChatAutoConfiguration.java
│ │ │ │ │ ├── OllamaChatProperties.java
│ │ │ │ │ ├── OllamaConnectionDetails.java
│ │ │ │ │ ├── OllamaConnectionProperties.java
│ │ │ │ │ ├── OllamaEmbeddingAutoConfiguration.java
│ │ │ │ │ ├── OllamaEmbeddingProperties.java
│ │ │ │ │ └── OllamaInitializationProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── model/
│ │ │ │ └── ollama/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── BaseOllamaIT.java
│ │ │ │ ├── OllamaChatAutoConfigurationIT.java
│ │ │ │ ├── OllamaChatAutoConfigurationTests.java
│ │ │ │ ├── OllamaEmbeddingAutoConfigurationIT.java
│ │ │ │ ├── OllamaEmbeddingAutoConfigurationTests.java
│ │ │ │ ├── OllamaImage.java
│ │ │ │ ├── OllamaModelConfigurationTests.java
│ │ │ │ └── tool/
│ │ │ │ ├── FunctionCallbackInPromptIT.java
│ │ │ │ ├── MockWeatherService.java
│ │ │ │ ├── OllamaFunctionCallbackIT.java
│ │ │ │ └── OllamaFunctionToolBeanIT.java
│ │ │ └── kotlin/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── ollama/
│ │ │ └── autoconfigure/
│ │ │ └── tool/
│ │ │ ├── FunctionCallbackContextKotlinIT.kt
│ │ │ ├── MockKotlinWeatherService.kt
│ │ │ └── ToolCallbackKotlinIT.kt
│ │ ├── spring-ai-autoconfigure-model-openai/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── openai/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── OpenAiAudioSpeechAutoConfiguration.java
│ │ │ │ │ ├── OpenAiAudioSpeechProperties.java
│ │ │ │ │ ├── OpenAiAudioTranscriptionAutoConfiguration.java
│ │ │ │ │ ├── OpenAiAudioTranscriptionProperties.java
│ │ │ │ │ ├── OpenAiAutoConfigurationUtil.java
│ │ │ │ │ ├── OpenAiChatAutoConfiguration.java
│ │ │ │ │ ├── OpenAiChatProperties.java
│ │ │ │ │ ├── OpenAiConnectionProperties.java
│ │ │ │ │ ├── OpenAiEmbeddingAutoConfiguration.java
│ │ │ │ │ ├── OpenAiEmbeddingProperties.java
│ │ │ │ │ ├── OpenAiImageAutoConfiguration.java
│ │ │ │ │ ├── OpenAiImageProperties.java
│ │ │ │ │ ├── OpenAiModerationAutoConfiguration.java
│ │ │ │ │ ├── OpenAiModerationProperties.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ ├── additional-spring-configuration-metadata.json
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── model/
│ │ │ │ └── openai/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── ChatClientAutoConfigurationIT.java
│ │ │ │ ├── MockWeatherService.java
│ │ │ │ ├── OpenAiAudioSpeechAutoConfigurationIT.java
│ │ │ │ ├── OpenAiAudioTranscriptionAutoConfigurationIT.java
│ │ │ │ ├── OpenAiAudioTranscriptionPropertiesTests.java
│ │ │ │ ├── OpenAiChatAutoConfigurationIT.java
│ │ │ │ ├── OpenAiChatPropertiesTests.java
│ │ │ │ ├── OpenAiEmbeddingAutoConfigurationIT.java
│ │ │ │ ├── OpenAiEmbeddingPropertiesTests.java
│ │ │ │ ├── OpenAiFunctionCallback2IT.java
│ │ │ │ ├── OpenAiImageAutoConfigurationIT.java
│ │ │ │ ├── OpenAiImagePropertiesTests.java
│ │ │ │ └── tool/
│ │ │ │ ├── FunctionCallbackInPrompt2IT.java
│ │ │ │ ├── FunctionCallbackInPromptIT.java
│ │ │ │ ├── FunctionCallbackWithPlainFunctionBeanIT.java
│ │ │ │ ├── MockWeatherService.java
│ │ │ │ ├── OpenAiFunctionCallback2IT.java
│ │ │ │ └── OpenAiFunctionCallbackIT.java
│ │ │ └── resources/
│ │ │ ├── speech/
│ │ │ │ └── jfk.flac
│ │ │ └── speech.flac
│ │ ├── spring-ai-autoconfigure-model-postgresml-embedding/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── postgresml/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── PostgresMlEmbeddingAutoConfiguration.java
│ │ │ │ │ ├── PostgresMlEmbeddingProperties.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── postgresml/
│ │ │ └── autoconfigure/
│ │ │ ├── PostgresMlEmbeddingAutoConfigurationIT.java
│ │ │ └── PostgresMlEmbeddingPropertiesTests.java
│ │ ├── spring-ai-autoconfigure-model-stability-ai/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── stabilityai/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── StabilityAiConnectionProperties.java
│ │ │ │ │ ├── StabilityAiImageAutoConfiguration.java
│ │ │ │ │ ├── StabilityAiImageProperties.java
│ │ │ │ │ └── StabilityAiParentProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── stabilityai/
│ │ │ └── autoconfigure/
│ │ │ ├── StabilityAiAutoConfigurationIT.java
│ │ │ └── StabilityAiImagePropertiesTests.java
│ │ ├── spring-ai-autoconfigure-model-transformers/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── transformers/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ ├── TransformersEmbeddingModelAutoConfiguration.java
│ │ │ │ │ └── TransformersEmbeddingModelProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── transformers/
│ │ │ └── autoconfigure/
│ │ │ └── TransformersEmbeddingModelAutoConfigurationIT.java
│ │ ├── spring-ai-autoconfigure-model-vertex-ai/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ ├── main/
│ │ │ │ ├── java/
│ │ │ │ │ └── org/
│ │ │ │ │ └── springframework/
│ │ │ │ │ └── ai/
│ │ │ │ │ └── model/
│ │ │ │ │ └── vertexai/
│ │ │ │ │ └── autoconfigure/
│ │ │ │ │ └── embedding/
│ │ │ │ │ ├── VertexAiEmbeddingConnectionAutoConfiguration.java
│ │ │ │ │ ├── VertexAiEmbeddingConnectionProperties.java
│ │ │ │ │ ├── VertexAiMultiModalEmbeddingAutoConfiguration.java
│ │ │ │ │ ├── VertexAiMultimodalEmbeddingProperties.java
│ │ │ │ │ ├── VertexAiTextEmbeddingAutoConfiguration.java
│ │ │ │ │ └── VertexAiTextEmbeddingProperties.java
│ │ │ │ └── resources/
│ │ │ │ └── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ │ └── test/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── model/
│ │ │ └── vertexai/
│ │ │ └── autoconfigure/
│ │ │ └── embedding/
│ │ │ └── VertexAiTextEmbeddingModelAutoConfigurationIT.java
│ │ └── tool/
│ │ └── spring-ai-autoconfigure-model-tool/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── model/
│ │ │ │ └── tool/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── ToolCallingAutoConfiguration.java
│ │ │ │ ├── ToolCallingProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── model/
│ │ └── tool/
│ │ └── autoconfigure/
│ │ └── ToolCallingAutoConfigurationTests.java
│ └── vector-stores/
│ ├── spring-ai-autoconfigure-vector-store-azure/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── azure/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── AzureVectorStoreAutoConfiguration.java
│ │ │ │ ├── AzureVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── azure/
│ │ └── autoconfigure/
│ │ └── AzureVectorStoreAutoConfigurationIT.java
│ ├── spring-ai-autoconfigure-vector-store-azure-cosmos-db/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── cosmosdb/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── CosmosDBVectorStoreAutoConfiguration.java
│ │ │ │ ├── CosmosDBVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── cosmosdb/
│ │ └── autoconfigure/
│ │ └── CosmosDBVectorStoreAutoConfigurationIT.java
│ ├── spring-ai-autoconfigure-vector-store-bedrock-knowledgebase/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── vectorstore/
│ │ │ └── bedrockknowledgebase/
│ │ │ └── autoconfigure/
│ │ │ ├── BedrockKnowledgeBaseVectorStoreAutoConfiguration.java
│ │ │ ├── BedrockKnowledgeBaseVectorStoreProperties.java
│ │ │ └── package-info.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── spring/
│ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ ├── spring-ai-autoconfigure-vector-store-cassandra/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── cassandra/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── CassandraVectorStoreAutoConfiguration.java
│ │ │ │ ├── CassandraVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── cassandra/
│ │ └── autoconfigure/
│ │ ├── CassandraVectorStoreAutoConfigurationIT.java
│ │ └── CassandraVectorStorePropertiesTests.java
│ ├── spring-ai-autoconfigure-vector-store-chroma/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── chroma/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── ChromaApiProperties.java
│ │ │ │ ├── ChromaConnectionDetails.java
│ │ │ │ ├── ChromaVectorStoreAutoConfiguration.java
│ │ │ │ ├── ChromaVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── chroma/
│ │ └── autoconfigure/
│ │ └── ChromaVectorStoreAutoConfigurationIT.java
│ ├── spring-ai-autoconfigure-vector-store-couchbase/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── couchbase/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── CouchbaseSearchVectorStoreAutoConfiguration.java
│ │ │ │ ├── CouchbaseSearchVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── couchbase/
│ │ └── autoconfigure/
│ │ ├── CouchbaseContainerMetadata.java
│ │ └── CouchbaseSearchVectorStoreAutoConfigurationIT.java
│ ├── spring-ai-autoconfigure-vector-store-elasticsearch/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── elasticsearch/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── ElasticsearchVectorStoreAutoConfiguration.java
│ │ │ │ ├── ElasticsearchVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── elasticsearch/
│ │ └── autoconfigure/
│ │ └── ElasticsearchVectorStoreAutoConfigurationIT.java
│ ├── spring-ai-autoconfigure-vector-store-gemfire/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── gemfire/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── GemFireConnectionDetails.java
│ │ │ │ ├── GemFireVectorStoreAutoConfiguration.java
│ │ │ │ ├── GemFireVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ ├── springframework/
│ │ │ └── ai/
│ │ │ └── vectorstore/
│ │ │ └── gemfire/
│ │ │ └── autoconfigure/
│ │ │ ├── GemFireVectorStoreAutoConfigurationAuthenticationIT.java
│ │ │ ├── GemFireVectorStoreAutoConfigurationIT.java
│ │ │ └── GemFireVectorStorePropertiesTests.java
│ │ └── testcontainers/
│ │ └── containers/
│ │ └── FailureDetectingExternalResource.java
│ ├── spring-ai-autoconfigure-vector-store-infinispan/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── infinispan/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── InfinispanVectorStoreAutoConfiguration.java
│ │ │ │ ├── InfinispanVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── infinispan/
│ │ └── autoconfigure/
│ │ └── InfinispanVectorStoreAutoConfigurationIT.java
│ ├── spring-ai-autoconfigure-vector-store-mariadb/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── mariadb/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── MariaDbStoreAutoConfiguration.java
│ │ │ │ ├── MariaDbStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── mariadb/
│ │ └── autoconfigure/
│ │ ├── MariaDbStoreAutoConfigurationIT.java
│ │ └── MariaDbStorePropertiesTests.java
│ ├── spring-ai-autoconfigure-vector-store-milvus/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── milvus/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── MilvusServiceClientConnectionDetails.java
│ │ │ │ ├── MilvusServiceClientProperties.java
│ │ │ │ ├── MilvusVectorStoreAutoConfiguration.java
│ │ │ │ ├── MilvusVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── milvus/
│ │ └── autoconfigure/
│ │ └── MilvusVectorStoreAutoConfigurationIT.java
│ ├── spring-ai-autoconfigure-vector-store-mongodb-atlas/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── mongodb/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── MongoDBAtlasVectorStoreAutoConfiguration.java
│ │ │ │ ├── MongoDBAtlasVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── mongodb/
│ │ └── autoconfigure/
│ │ └── MongoDBAtlasVectorStoreAutoConfigurationIT.java
│ ├── spring-ai-autoconfigure-vector-store-neo4j/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── neo4j/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── Neo4jVectorStoreAutoConfiguration.java
│ │ │ │ ├── Neo4jVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── neo4j/
│ │ └── autoconfigure/
│ │ └── Neo4jVectorStoreAutoConfigurationIT.java
│ ├── spring-ai-autoconfigure-vector-store-observation/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── observation/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── VectorStoreObservationAutoConfiguration.java
│ │ │ │ ├── VectorStoreObservationProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── observation/
│ │ └── autoconfigure/
│ │ └── VectorStoreObservationAutoConfigurationTests.java
│ ├── spring-ai-autoconfigure-vector-store-opensearch/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── opensearch/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── AwsOpenSearchConnectionDetails.java
│ │ │ │ ├── OpenSearchConnectionDetails.java
│ │ │ │ ├── OpenSearchNonAwsCondition.java
│ │ │ │ ├── OpenSearchVectorStoreAutoConfiguration.java
│ │ │ │ ├── OpenSearchVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── opensearch/
│ │ └── autoconfigure/
│ │ ├── AwsOpenSearchVectorStoreAutoConfigurationIT.java
│ │ ├── OpenSearchVectorStoreAutoConfigurationIT.java
│ │ └── OpenSearchVectorStoreNonAwsFallbackIT.java
│ ├── spring-ai-autoconfigure-vector-store-oracle/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── oracle/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── OracleVectorStoreAutoConfiguration.java
│ │ │ │ ├── OracleVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── vectorstore/
│ │ │ └── oracle/
│ │ │ └── autoconfigure/
│ │ │ ├── OracleVectorStoreAutoConfigurationIT.java
│ │ │ └── OracleVectorStorePropertiesTests.java
│ │ └── resources/
│ │ └── oracle/
│ │ └── initialize.sql
│ ├── spring-ai-autoconfigure-vector-store-pgvector/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── pgvector/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── PgVectorStoreAutoConfiguration.java
│ │ │ │ ├── PgVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── pgvector/
│ │ └── autoconfigure/
│ │ ├── PgVectorStoreAutoConfigurationIT.java
│ │ └── PgVectorStorePropertiesTests.java
│ ├── spring-ai-autoconfigure-vector-store-pinecone/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── pinecone/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── PineconeVectorStoreAutoConfiguration.java
│ │ │ │ ├── PineconeVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── pinecone/
│ │ └── autoconfigure/
│ │ ├── PineconeVectorStoreAutoConfigurationIT.java
│ │ └── PineconeVectorStorePropertiesTests.java
│ ├── spring-ai-autoconfigure-vector-store-qdrant/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── qdrant/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── QdrantConnectionDetails.java
│ │ │ │ ├── QdrantVectorStoreAutoConfiguration.java
│ │ │ │ ├── QdrantVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── qdrant/
│ │ └── autoconfigure/
│ │ ├── QdrantVectorStoreAutoConfigurationIT.java
│ │ ├── QdrantVectorStoreCloudAutoConfigurationIT.java
│ │ └── QdrantVectorStorePropertiesTests.java
│ ├── spring-ai-autoconfigure-vector-store-redis/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── redis/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── RedisVectorStoreAutoConfiguration.java
│ │ │ │ ├── RedisVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── redis/
│ │ └── autoconfigure/
│ │ ├── RedisVectorStoreAutoConfigurationIT.java
│ │ └── RedisVectorStorePropertiesTests.java
│ ├── spring-ai-autoconfigure-vector-store-redis-semantic-cache/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── redis/
│ │ │ │ └── cache/
│ │ │ │ └── semantic/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── RedisSemanticCacheAutoConfiguration.java
│ │ │ │ ├── RedisSemanticCacheProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── vectorstore/
│ │ │ └── redis/
│ │ │ └── cache/
│ │ │ └── semantic/
│ │ │ └── autoconfigure/
│ │ │ └── RedisSemanticCacheAutoConfigurationIT.java
│ │ └── resources/
│ │ └── logback-test.xml
│ ├── spring-ai-autoconfigure-vector-store-s3/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── s3/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── S3VectorStoreAutoConfiguration.java
│ │ │ │ ├── S3VectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── azure/
│ │ └── autoconfigure/
│ │ └── S3VectorStoreAutoConfigurationTest.java
│ ├── spring-ai-autoconfigure-vector-store-typesense/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── vectorstore/
│ │ │ │ └── typesense/
│ │ │ │ └── autoconfigure/
│ │ │ │ ├── TypesenseConnectionDetails.java
│ │ │ │ ├── TypesenseServiceClientProperties.java
│ │ │ │ ├── TypesenseVectorStoreAutoConfiguration.java
│ │ │ │ ├── TypesenseVectorStoreProperties.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── vectorstore/
│ │ └── typesense/
│ │ └── autoconfigure/
│ │ └── TypesenseVectorStoreAutoConfigurationIT.java
│ └── spring-ai-autoconfigure-vector-store-weaviate/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── vectorstore/
│ │ │ └── weaviate/
│ │ │ └── autoconfigure/
│ │ │ ├── WeaviateConnectionDetails.java
│ │ │ ├── WeaviateVectorStoreAutoConfiguration.java
│ │ │ ├── WeaviateVectorStoreProperties.java
│ │ │ └── package-info.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── spring/
│ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│ └── test/
│ └── java/
│ └── org/
│ └── springframework/
│ └── ai/
│ └── vectorstore/
│ └── weaviate/
│ └── autoconfigure/
│ └── WeaviateVectorStoreAutoConfigurationIT.java
├── design/
│ ├── 00-template.adoc
│ └── 01-null-safety.adoc
├── document-readers/
│ ├── jsoup-reader/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── reader/
│ │ │ └── jsoup/
│ │ │ ├── JsoupDocumentReader.java
│ │ │ ├── config/
│ │ │ │ ├── JsoupDocumentReaderConfig.java
│ │ │ │ └── package-info.java
│ │ │ └── package-info.java
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── reader/
│ │ │ └── jsoup/
│ │ │ └── JsoupDocumentReaderTests.java
│ │ └── resources/
│ │ ├── test-group-by.html
│ │ └── test.html
│ ├── markdown-reader/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── reader/
│ │ │ └── markdown/
│ │ │ ├── MarkdownDocumentReader.java
│ │ │ ├── config/
│ │ │ │ ├── MarkdownDocumentReaderConfig.java
│ │ │ │ └── package-info.java
│ │ │ └── package-info.java
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── reader/
│ │ │ └── markdown/
│ │ │ └── MarkdownDocumentReaderTest.java
│ │ └── resources/
│ │ ├── blockquote.md
│ │ ├── code.md
│ │ ├── dir-test-1/
│ │ │ ├── blockquote.md
│ │ │ └── blockquote.txt
│ │ ├── dir-test-2/
│ │ │ ├── only-headers.md
│ │ │ └── with-formatting.md
│ │ ├── horizontal-rules.md
│ │ ├── lists.md
│ │ ├── only-headers.md
│ │ ├── simple.md
│ │ └── with-formatting.md
│ ├── pdf-reader/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── reader/
│ │ │ │ └── pdf/
│ │ │ │ ├── PagePdfDocumentReader.java
│ │ │ │ ├── ParagraphPdfDocumentReader.java
│ │ │ │ ├── aot/
│ │ │ │ │ ├── PdfReaderRuntimeHints.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── ParagraphManager.java
│ │ │ │ │ ├── PdfDocumentReaderConfig.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── layout/
│ │ │ │ │ ├── Character.java
│ │ │ │ │ ├── CharacterFactory.java
│ │ │ │ │ ├── ForkPDFLayoutTextStripper.java
│ │ │ │ │ ├── PDFLayoutTextStripperByArea.java
│ │ │ │ │ ├── TextLine.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── reader/
│ │ └── pdf/
│ │ ├── PagePdfDocumentReaderTests.java
│ │ ├── ParagraphPdfDocumentReaderTests.java
│ │ ├── aot/
│ │ │ └── PdfReaderRuntimeHintsTests.java
│ │ └── layout/
│ │ └── TextLineTest.java
│ └── tika-reader/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── reader/
│ │ └── tika/
│ │ ├── TikaDocumentReader.java
│ │ └── package-info.java
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── reader/
│ │ └── tika/
│ │ └── TikaDocumentReaderTests.java
│ └── resources/
│ ├── sample.ppt
│ ├── sample.pptx
│ ├── word-sample.doc
│ └── word-sample.docx
├── mcp/
│ ├── common/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── mcp/
│ │ │ │ ├── AsyncMcpToolCallback.java
│ │ │ │ ├── AsyncMcpToolCallbackProvider.java
│ │ │ │ ├── DefaultMcpToolNamePrefixGenerator.java
│ │ │ │ ├── McpConnectionInfo.java
│ │ │ │ ├── McpToolFilter.java
│ │ │ │ ├── McpToolNamePrefixGenerator.java
│ │ │ │ ├── McpToolUtils.java
│ │ │ │ ├── McpToolsChangedEvent.java
│ │ │ │ ├── SyncMcpToolCallback.java
│ │ │ │ ├── SyncMcpToolCallbackProvider.java
│ │ │ │ ├── ToolContextToMcpMetaConverter.java
│ │ │ │ ├── aot/
│ │ │ │ │ ├── McpHints.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── customizer/
│ │ │ │ │ ├── McpAsyncServerCustomizer.java
│ │ │ │ │ ├── McpClientCustomizer.java
│ │ │ │ │ ├── McpSyncServerCustomizer.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── mcp/
│ │ ├── AsyncMcpToolCallbackProviderTests.java
│ │ ├── AsyncMcpToolCallbackTest.java
│ │ ├── SyncMcpToolCallbackBuilderTest.java
│ │ ├── SyncMcpToolCallbackProviderBuilderTest.java
│ │ ├── SyncMcpToolCallbackProviderTests.java
│ │ ├── SyncMcpToolCallbackTests.java
│ │ ├── ToolContextToMcpMetaConverterTest.java
│ │ └── ToolUtilsTests.java
│ ├── mcp-annotations/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── mcp/
│ │ │ └── annotation/
│ │ │ ├── McpArg.java
│ │ │ ├── McpComplete.java
│ │ │ ├── McpElicitation.java
│ │ │ ├── McpLogging.java
│ │ │ ├── McpMeta.java
│ │ │ ├── McpProgress.java
│ │ │ ├── McpProgressToken.java
│ │ │ ├── McpPrompt.java
│ │ │ ├── McpPromptListChanged.java
│ │ │ ├── McpResource.java
│ │ │ ├── McpResourceListChanged.java
│ │ │ ├── McpSampling.java
│ │ │ ├── McpTool.java
│ │ │ ├── McpToolListChanged.java
│ │ │ ├── McpToolParam.java
│ │ │ ├── adapter/
│ │ │ │ ├── CompleteAdapter.java
│ │ │ │ ├── PromptAdapter.java
│ │ │ │ ├── ResourceAdapter.java
│ │ │ │ └── package-info.java
│ │ │ ├── common/
│ │ │ │ ├── ErrorUtils.java
│ │ │ │ ├── McpPredicates.java
│ │ │ │ ├── MetaUtils.java
│ │ │ │ └── package-info.java
│ │ │ ├── context/
│ │ │ │ ├── DefaultElicitationSpec.java
│ │ │ │ ├── DefaultLoggingSpec.java
│ │ │ │ ├── DefaultMcpAsyncRequestContext.java
│ │ │ │ ├── DefaultMcpSyncRequestContext.java
│ │ │ │ ├── DefaultMetaProvider.java
│ │ │ │ ├── DefaultProgressSpec.java
│ │ │ │ ├── DefaultSamplingSpec.java
│ │ │ │ ├── McpAsyncRequestContext.java
│ │ │ │ ├── McpRequestContextTypes.java
│ │ │ │ ├── McpSyncRequestContext.java
│ │ │ │ ├── MetaProvider.java
│ │ │ │ ├── StructuredElicitResult.java
│ │ │ │ └── package-info.java
│ │ │ ├── method/
│ │ │ │ ├── changed/
│ │ │ │ │ ├── prompt/
│ │ │ │ │ │ ├── AbstractMcpPromptListChangedMethodCallback.java
│ │ │ │ │ │ ├── AsyncMcpPromptListChangedMethodCallback.java
│ │ │ │ │ │ ├── AsyncPromptListChangedSpecification.java
│ │ │ │ │ │ ├── SyncMcpPromptListChangedMethodCallback.java
│ │ │ │ │ │ ├── SyncPromptListChangedSpecification.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── resource/
│ │ │ │ │ │ ├── AbstractMcpResourceListChangedMethodCallback.java
│ │ │ │ │ │ ├── AsyncMcpResourceListChangedMethodCallback.java
│ │ │ │ │ │ ├── AsyncResourceListChangedSpecification.java
│ │ │ │ │ │ ├── SyncMcpResourceListChangedMethodCallback.java
│ │ │ │ │ │ ├── SyncResourceListChangedSpecification.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ └── tool/
│ │ │ │ │ ├── AbstractMcpToolListChangedMethodCallback.java
│ │ │ │ │ ├── AsyncMcpToolListChangedMethodCallback.java
│ │ │ │ │ ├── AsyncToolListChangedSpecification.java
│ │ │ │ │ ├── SyncMcpToolListChangedMethodCallback.java
│ │ │ │ │ ├── SyncToolListChangedSpecification.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── complete/
│ │ │ │ │ ├── AbstractMcpCompleteMethodCallback.java
│ │ │ │ │ ├── AsyncMcpCompleteMethodCallback.java
│ │ │ │ │ ├── AsyncStatelessMcpCompleteMethodCallback.java
│ │ │ │ │ ├── SyncMcpCompleteMethodCallback.java
│ │ │ │ │ ├── SyncStatelessMcpCompleteMethodCallback.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── elicitation/
│ │ │ │ │ ├── AbstractMcpElicitationMethodCallback.java
│ │ │ │ │ ├── AsyncElicitationSpecification.java
│ │ │ │ │ ├── AsyncMcpElicitationMethodCallback.java
│ │ │ │ │ ├── SyncElicitationSpecification.java
│ │ │ │ │ ├── SyncMcpElicitationMethodCallback.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── logging/
│ │ │ │ │ ├── AbstractMcpLoggingMethodCallback.java
│ │ │ │ │ ├── AsyncLoggingSpecification.java
│ │ │ │ │ ├── AsyncMcpLoggingMethodCallback.java
│ │ │ │ │ ├── SyncLoggingSpecification.java
│ │ │ │ │ ├── SyncMcpLoggingMethodCallback.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── progress/
│ │ │ │ │ ├── AbstractMcpProgressMethodCallback.java
│ │ │ │ │ ├── AsyncMcpProgressMethodCallback.java
│ │ │ │ │ ├── AsyncProgressSpecification.java
│ │ │ │ │ ├── SyncMcpProgressMethodCallback.java
│ │ │ │ │ ├── SyncProgressSpecification.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── prompt/
│ │ │ │ │ ├── AbstractMcpPromptMethodCallback.java
│ │ │ │ │ ├── AsyncMcpPromptMethodCallback.java
│ │ │ │ │ ├── AsyncStatelessMcpPromptMethodCallback.java
│ │ │ │ │ ├── SyncMcpPromptMethodCallback.java
│ │ │ │ │ ├── SyncStatelessMcpPromptMethodCallback.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── resource/
│ │ │ │ │ ├── AbstractMcpResourceMethodCallback.java
│ │ │ │ │ ├── AsyncMcpResourceMethodCallback.java
│ │ │ │ │ ├── AsyncStatelessMcpResourceMethodCallback.java
│ │ │ │ │ ├── DefaultMcpReadResourceResultConverter.java
│ │ │ │ │ ├── McpReadResourceResultConverter.java
│ │ │ │ │ ├── SyncMcpResourceMethodCallback.java
│ │ │ │ │ ├── SyncStatelessMcpResourceMethodCallback.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── sampling/
│ │ │ │ │ ├── AbstractMcpSamplingMethodCallback.java
│ │ │ │ │ ├── AsyncMcpSamplingMethodCallback.java
│ │ │ │ │ ├── AsyncSamplingSpecification.java
│ │ │ │ │ ├── SyncMcpSamplingMethodCallback.java
│ │ │ │ │ ├── SyncSamplingSpecification.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── tool/
│ │ │ │ ├── AbstractAsyncMcpToolMethodCallback.java
│ │ │ │ ├── AbstractMcpToolMethodCallback.java
│ │ │ │ ├── AbstractSyncMcpToolMethodCallback.java
│ │ │ │ ├── AsyncMcpToolMethodCallback.java
│ │ │ │ ├── AsyncStatelessMcpToolMethodCallback.java
│ │ │ │ ├── ReactiveUtils.java
│ │ │ │ ├── ReturnMode.java
│ │ │ │ ├── SyncMcpToolMethodCallback.java
│ │ │ │ ├── SyncStatelessMcpToolMethodCallback.java
│ │ │ │ ├── package-info.java
│ │ │ │ └── utils/
│ │ │ │ ├── McpJsonParser.java
│ │ │ │ ├── McpJsonSchemaGenerator.java
│ │ │ │ ├── SpringAiSchemaModule.java
│ │ │ │ └── package-info.java
│ │ │ ├── package-info.java
│ │ │ ├── provider/
│ │ │ │ ├── changed/
│ │ │ │ │ ├── prompt/
│ │ │ │ │ │ ├── AsyncMcpPromptListChangedProvider.java
│ │ │ │ │ │ ├── SyncMcpPromptListChangedProvider.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── resource/
│ │ │ │ │ │ ├── AsyncMcpResourceListChangedProvider.java
│ │ │ │ │ │ ├── SyncMcpResourceListChangedProvider.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ └── tool/
│ │ │ │ │ ├── AsyncMcpToolListChangedProvider.java
│ │ │ │ │ ├── SyncMcpToolListChangedProvider.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── complete/
│ │ │ │ │ ├── AsyncMcpCompleteProvider.java
│ │ │ │ │ ├── AsyncStatelessMcpCompleteProvider.java
│ │ │ │ │ ├── SyncMcpCompleteProvider.java
│ │ │ │ │ ├── SyncStatelessMcpCompleteProvider.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── elicitation/
│ │ │ │ │ ├── AsyncMcpElicitationProvider.java
│ │ │ │ │ ├── SyncMcpElicitationProvider.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── logging/
│ │ │ │ │ ├── AsyncMcpLoggingProvider.java
│ │ │ │ │ ├── SyncMcpLogginProvider.java
│ │ │ │ │ ├── SyncMcpLoggingProvider.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── progress/
│ │ │ │ │ ├── AsyncMcpProgressProvider.java
│ │ │ │ │ ├── SyncMcpProgressProvider.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── prompt/
│ │ │ │ │ ├── AsyncMcpPromptProvider.java
│ │ │ │ │ ├── AsyncStatelessMcpPromptProvider.java
│ │ │ │ │ ├── SyncMcpPromptProvider.java
│ │ │ │ │ ├── SyncStatelessMcpPromptProvider.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── resource/
│ │ │ │ │ ├── AsyncMcpResourceProvider.java
│ │ │ │ │ ├── AsyncStatelessMcpResourceProvider.java
│ │ │ │ │ ├── SyncMcpResourceProvider.java
│ │ │ │ │ ├── SyncStatelessMcpResourceProvider.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── sampling/
│ │ │ │ │ ├── AsyncMcpSamplingProvider.java
│ │ │ │ │ ├── SyncMcpSamplingProvider.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── tool/
│ │ │ │ ├── AbstractMcpToolProvider.java
│ │ │ │ ├── AsyncMcpToolProvider.java
│ │ │ │ ├── AsyncStatelessMcpToolProvider.java
│ │ │ │ ├── SyncMcpToolProvider.java
│ │ │ │ ├── SyncStatelessMcpToolProvider.java
│ │ │ │ └── package-info.java
│ │ │ └── spring/
│ │ │ ├── AbstractClientMcpHandlerRegistry.java
│ │ │ ├── AnnotationProviderUtil.java
│ │ │ ├── AsyncMcpAnnotationProviders.java
│ │ │ ├── ClientMcpAsyncHandlersRegistry.java
│ │ │ ├── ClientMcpSyncHandlersRegistry.java
│ │ │ ├── SyncMcpAnnotationProviders.java
│ │ │ ├── package-info.java
│ │ │ └── scan/
│ │ │ ├── AbstractAnnotatedMethodBeanFactoryInitializationAotProcessor.java
│ │ │ ├── AbstractAnnotatedMethodBeanPostProcessor.java
│ │ │ ├── AbstractMcpAnnotatedBeans.java
│ │ │ ├── AnnotatedMethodDiscovery.java
│ │ │ └── package-info.java
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── mcp/
│ │ └── annotation/
│ │ ├── common/
│ │ │ ├── McpPredicatesTests.java
│ │ │ └── MetaUtilsTest.java
│ │ ├── context/
│ │ │ ├── DefaultLoggingSpecTests.java
│ │ │ ├── DefaultMcpAsyncRequestContextTests.java
│ │ │ ├── DefaultMcpSyncRequestContextTests.java
│ │ │ ├── DefaultMetaProviderTest.java
│ │ │ ├── DefaultProgressSpecTests.java
│ │ │ └── DefaultSamplingSpecTests.java
│ │ ├── method/
│ │ │ ├── changed/
│ │ │ │ ├── prompt/
│ │ │ │ │ ├── AsyncMcpPromptListChangedMethodCallbackTests.java
│ │ │ │ │ └── SyncMcpPromptListChangedMethodCallbackTests.java
│ │ │ │ ├── resource/
│ │ │ │ │ ├── AsyncMcpResourceListChangedMethodCallbackTests.java
│ │ │ │ │ └── SyncMcpResourceListChangedMethodCallbackTests.java
│ │ │ │ └── tool/
│ │ │ │ ├── AsyncMcpToolListChangedMethodCallbackTests.java
│ │ │ │ └── SyncMcpToolListChangedMethodCallbackTests.java
│ │ │ ├── complete/
│ │ │ │ ├── AsyncMcpCompleteMethodCallbackExample.java
│ │ │ │ ├── AsyncMcpCompleteMethodCallbackTests.java
│ │ │ │ ├── AsyncStatelessMcpCompleteMethodCallbackTests.java
│ │ │ │ ├── SyncMcpCompleteMethodCallbackExample.java
│ │ │ │ ├── SyncMcpCompleteMethodCallbackTests.java
│ │ │ │ └── SyncStatelessMcpCompleteMethodCallbackTests.java
│ │ │ ├── elicitation/
│ │ │ │ ├── AsyncMcpElicitationMethodCallbackExample.java
│ │ │ │ ├── AsyncMcpElicitationMethodCallbackTests.java
│ │ │ │ ├── ElicitationSpecificationTests.java
│ │ │ │ ├── ElicitationTestHelper.java
│ │ │ │ ├── SyncMcpElicitationMethodCallbackExample.java
│ │ │ │ └── SyncMcpElicitationMethodCallbackTests.java
│ │ │ ├── logging/
│ │ │ │ ├── AsyncMcpLoggingMethodCallbackExample.java
│ │ │ │ ├── AsyncMcpLoggingMethodCallbackTests.java
│ │ │ │ ├── SyncMcpLoggingMethodCallbackExample.java
│ │ │ │ └── SyncMcpLoggingMethodCallbackTests.java
│ │ │ ├── progress/
│ │ │ │ ├── AsyncMcpProgressMethodCallbackExample.java
│ │ │ │ ├── AsyncMcpProgressMethodCallbackTests.java
│ │ │ │ ├── SyncMcpProgressMethodCallbackExample.java
│ │ │ │ └── SyncMcpProgressMethodCallbackTests.java
│ │ │ ├── prompt/
│ │ │ │ ├── AsyncMcpPromptMethodCallbackExample.java
│ │ │ │ ├── AsyncMcpPromptMethodCallbackTests.java
│ │ │ │ ├── AsyncStatelessMcpPromptMethodCallbackTests.java
│ │ │ │ ├── SyncMcpPromptMethodCallbackExample.java
│ │ │ │ ├── SyncMcpPromptMethodCallbackTests.java
│ │ │ │ └── SyncStatelessMcpPromptMethodCallbackTests.java
│ │ │ ├── resource/
│ │ │ │ ├── AsyncMcpResourceMethodCallbackTests.java
│ │ │ │ ├── AsyncStatelessMcpResourceMethodCallbackTests.java
│ │ │ │ ├── DefaultMcpReadResourceResultConverterTests.java
│ │ │ │ ├── McpResourceUriValidationTest.java
│ │ │ │ ├── SyncMcpResourceMethodCallbackExample.java
│ │ │ │ ├── SyncMcpResourceMethodCallbackTests.java
│ │ │ │ └── SyncStatelessMcpResourceMethodCallbackTests.java
│ │ │ ├── sampling/
│ │ │ │ ├── AsyncMcpSamplingMethodCallbackExample.java
│ │ │ │ ├── AsyncMcpSamplingMethodCallbackTests.java
│ │ │ │ ├── SamplingTestHelper.java
│ │ │ │ ├── SyncMcpSamplingMethodCallbackExample.java
│ │ │ │ └── SyncMcpSamplingMethodCallbackTests.java
│ │ │ └── tool/
│ │ │ ├── AsyncCallToolRequestSupportTests.java
│ │ │ ├── AsyncMcpToolMethodCallbackTests.java
│ │ │ ├── AsyncStatelessMcpToolMethodCallbackTests.java
│ │ │ ├── CallToolRequestSupportTests.java
│ │ │ ├── SyncMcpToolMethodCallbackExceptionHandlingTests.java
│ │ │ ├── SyncMcpToolMethodCallbackTests.java
│ │ │ └── SyncStatelessMcpToolMethodCallbackTests.java
│ │ ├── provider/
│ │ │ ├── changed/
│ │ │ │ ├── prompt/
│ │ │ │ │ ├── AsyncMcpPromptListChangedProviderTests.java
│ │ │ │ │ └── SyncMcpPromptListChangedProviderTests.java
│ │ │ │ ├── resource/
│ │ │ │ │ ├── AsyncMcpResourceListChangedProviderTests.java
│ │ │ │ │ └── SyncMcpResourceListChangedProviderTests.java
│ │ │ │ └── tool/
│ │ │ │ ├── AsyncMcpToolListChangedProviderTests.java
│ │ │ │ └── SyncMcpToolListChangedProviderTests.java
│ │ │ ├── complete/
│ │ │ │ ├── AsyncMcpCompletionProviderTests.java
│ │ │ │ ├── AsyncStatelessMcpCompleteProviderTests.java
│ │ │ │ ├── SyncMcpCompletionProviderTests.java
│ │ │ │ └── SyncStatelessMcpCompleteProviderTests.java
│ │ │ ├── elicitation/
│ │ │ │ ├── AsyncMcpElicitationProviderTests.java
│ │ │ │ └── SyncMcpElicitationProviderTests.java
│ │ │ ├── logging/
│ │ │ │ ├── AsyncMcpLoggingProviderTests.java
│ │ │ │ └── SyncMcpLoggingProviderTests.java
│ │ │ ├── progress/
│ │ │ │ ├── AsyncMcpProgressProviderTests.java
│ │ │ │ └── SyncMcpProgressProviderTests.java
│ │ │ ├── prompt/
│ │ │ │ ├── AsyncMcpPromptProviderTests.java
│ │ │ │ ├── AsyncStatelessMcpPromptProviderTests.java
│ │ │ │ ├── SyncMcpPromptProviderTests.java
│ │ │ │ └── SyncStatelessMcpPromptProviderTests.java
│ │ │ ├── resource/
│ │ │ │ ├── AsyncMcpResourceProviderTests.java
│ │ │ │ ├── AsyncStatelessMcpResourceProviderTests.java
│ │ │ │ ├── SyncMcpResourceProviderTests.java
│ │ │ │ └── SyncStatelessMcpResourceProviderTests.java
│ │ │ ├── sampling/
│ │ │ │ ├── AsyncMcpSamplingProviderTests.java
│ │ │ │ └── SyncMcpSamplingProviderTests.java
│ │ │ └── tool/
│ │ │ ├── AsyncMcpToolProviderTests.java
│ │ │ ├── AsyncStatelessMcpToolProviderTests.java
│ │ │ ├── SyncMcpToolProviderTests.java
│ │ │ └── SyncStatelessMcpToolProviderTests.java
│ │ └── spring/
│ │ ├── AnnotationProviderUtilTests.java
│ │ ├── AsyncMcpAnnotationProvidersTests.java
│ │ ├── ClientMcpAsyncHandlersRegistryTests.java
│ │ ├── ClientMcpSyncHandlersRegistryTests.java
│ │ ├── SyncMcpAnnotationProvidersTests.java
│ │ └── scan/
│ │ ├── AbstractAnnotatedMethodBeanFactoryInitializationAotProcessorTests.java
│ │ ├── AbstractAnnotatedMethodBeanPostProcessorTests.java
│ │ ├── AbstractMcpAnnotatedBeansTests.java
│ │ └── AnnotatedMethodDiscoveryTests.java
│ └── transport/
│ ├── mcp-spring-webflux/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── mcp/
│ │ │ ├── client/
│ │ │ │ └── webflux/
│ │ │ │ └── transport/
│ │ │ │ ├── WebClientStreamableHttpTransport.java
│ │ │ │ ├── WebFluxSseClientTransport.java
│ │ │ │ └── package-info.java
│ │ │ └── server/
│ │ │ └── webflux/
│ │ │ └── transport/
│ │ │ ├── WebFluxSseServerTransportProvider.java
│ │ │ ├── WebFluxStatelessServerTransport.java
│ │ │ ├── WebFluxStreamableServerTransportProvider.java
│ │ │ └── package-info.java
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── mcp/
│ │ │ ├── WebFluxSseIT.java
│ │ │ ├── WebFluxStatelessIT.java
│ │ │ ├── WebFluxStreamableHttpVersionNegotiationIT.java
│ │ │ ├── WebFluxStreamableIT.java
│ │ │ ├── client/
│ │ │ │ ├── WebClientStreamableHttpAsyncClientIT.java
│ │ │ │ ├── WebClientStreamableHttpSyncClientIT.java
│ │ │ │ ├── WebFluxSseMcpAsyncClientIT.java
│ │ │ │ ├── WebFluxSseMcpSyncClientIT.java
│ │ │ │ ├── _WebClientStreamableHttpAsyncClientResiliencyTests.java_
│ │ │ │ └── webflux/
│ │ │ │ └── transport/
│ │ │ │ ├── WebClientStreamableHttpTransportErrorHandlingIT.java
│ │ │ │ ├── WebClientStreamableHttpTransportIT.java
│ │ │ │ └── WebFluxSseClientTransportIT.java
│ │ │ ├── common/
│ │ │ │ ├── AsyncServerMcpTransportContextIT.java
│ │ │ │ └── SyncServerMcpTransportContextIT.java
│ │ │ ├── security/
│ │ │ │ └── WebFluxServerTransportSecurityIT.java
│ │ │ ├── server/
│ │ │ │ └── webflux/
│ │ │ │ └── transport/
│ │ │ │ ├── WebFluxSseMcpAsyncServerIT.java
│ │ │ │ ├── WebFluxSseMcpSyncServerIT.java
│ │ │ │ ├── WebFluxStreamableMcpAsyncServerIT.java
│ │ │ │ └── WebFluxStreamableMcpSyncServerIT.java
│ │ │ └── utils/
│ │ │ ├── McpJsonMapperUtils.java
│ │ │ └── McpTestRequestRecordingExchangeFilterFunction.java
│ │ └── resources/
│ │ └── logback.xml
│ └── mcp-spring-webmvc/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── mcp/
│ │ └── server/
│ │ └── webmvc/
│ │ └── transport/
│ │ ├── HeaderUtils.java
│ │ ├── WebMvcSseServerTransportProvider.java
│ │ ├── WebMvcStatelessServerTransport.java
│ │ ├── WebMvcStreamableServerTransportProvider.java
│ │ └── package-info.java
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── mcp/
│ │ ├── common/
│ │ │ └── McpTransportContextIT.java
│ │ ├── security/
│ │ │ └── ServerTransportSecurityIT.java
│ │ └── server/
│ │ ├── TomcatTestUtil.java
│ │ ├── WebMcpStreamableAsyncServerTransportIT.java
│ │ ├── WebMcpStreamableSyncServerTransportIT.java
│ │ ├── WebMvcSseAsyncServerTransportIT.java
│ │ ├── WebMvcSseCustomContextPathIT.java
│ │ ├── WebMvcSseIT.java
│ │ ├── WebMvcSseSyncServerTransportIT.java
│ │ ├── WebMvcStatelessIT.java
│ │ ├── WebMvcStreamableIT.java
│ │ └── webmvc/
│ │ └── transport/
│ │ ├── HeaderUtilsTests.java
│ │ └── WebMvcSseServerTransportProviderIT.java
│ └── resources/
│ └── logback.xml
├── mcp-spring-migration-guide.md
├── memory/
│ └── repository/
│ ├── spring-ai-model-chat-memory-repository-cassandra/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── chat/
│ │ │ └── memory/
│ │ │ └── repository/
│ │ │ └── cassandra/
│ │ │ ├── CassandraChatMemoryRepository.java
│ │ │ ├── CassandraChatMemoryRepositoryConfig.java
│ │ │ ├── SchemaUtil.java
│ │ │ └── package-info.java
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── chat/
│ │ └── memory/
│ │ └── repository/
│ │ └── cassandra/
│ │ ├── CassandraChatMemoryRepositoryIT.java
│ │ └── CassandraImage.java
│ ├── spring-ai-model-chat-memory-repository-cosmos-db/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── chat/
│ │ │ └── memory/
│ │ │ └── repository/
│ │ │ └── cosmosdb/
│ │ │ ├── CosmosDBChatMemoryRepository.java
│ │ │ ├── CosmosDBChatMemoryRepositoryConfig.java
│ │ │ └── package-info.java
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── chat/
│ │ └── memory/
│ │ └── repository/
│ │ └── cosmosdb/
│ │ └── CosmosDBChatMemoryRepositoryIT.java
│ ├── spring-ai-model-chat-memory-repository-jdbc/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── chat/
│ │ │ │ └── memory/
│ │ │ │ └── repository/
│ │ │ │ └── jdbc/
│ │ │ │ ├── H2ChatMemoryRepositoryDialect.java
│ │ │ │ ├── HsqldbChatMemoryRepositoryDialect.java
│ │ │ │ ├── JdbcChatMemoryRepository.java
│ │ │ │ ├── JdbcChatMemoryRepositoryDialect.java
│ │ │ │ ├── MysqlChatMemoryRepositoryDialect.java
│ │ │ │ ├── OracleChatMemoryRepositoryDialect.java
│ │ │ │ ├── PostgresChatMemoryRepositoryDialect.java
│ │ │ │ ├── SqlServerChatMemoryRepositoryDialect.java
│ │ │ │ ├── SqliteChatMemoryRepositoryDialect.java
│ │ │ │ ├── aot/
│ │ │ │ │ └── hint/
│ │ │ │ │ ├── JdbcChatMemoryRepositoryRuntimeHints.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ ├── META-INF/
│ │ │ │ └── spring/
│ │ │ │ └── aot.factories
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── chat/
│ │ │ └── memory/
│ │ │ └── repository/
│ │ │ └── jdbc/
│ │ │ ├── schema-h2.sql
│ │ │ ├── schema-hsqldb.sql
│ │ │ ├── schema-mariadb.sql
│ │ │ ├── schema-mysql.sql
│ │ │ ├── schema-oracle.sql
│ │ │ ├── schema-postgresql.sql
│ │ │ ├── schema-sqlite.sql
│ │ │ └── schema-sqlserver.sql
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── chat/
│ │ │ └── memory/
│ │ │ └── repository/
│ │ │ └── jdbc/
│ │ │ ├── AbstractJdbcChatMemoryRepositoryIT.java
│ │ │ ├── JdbcChatMemoryRepositoryBuilderTests.java
│ │ │ ├── JdbcChatMemoryRepositoryH2IT.java
│ │ │ ├── JdbcChatMemoryRepositoryMariaDbIT.java
│ │ │ ├── JdbcChatMemoryRepositoryMysqlIT.java
│ │ │ ├── JdbcChatMemoryRepositoryOracleIT.java
│ │ │ ├── JdbcChatMemoryRepositoryPostgresqlIT.java
│ │ │ ├── JdbcChatMemoryRepositorySqlServerIT.java
│ │ │ ├── JdbcChatMemoryRepositorySqliteIT.java
│ │ │ └── aot/
│ │ │ └── hint/
│ │ │ └── JdbcChatMemoryRepositoryRuntimeHintsTest.java
│ │ └── resources/
│ │ └── container-license-acceptance.txt
│ ├── spring-ai-model-chat-memory-repository-mongodb/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── chat/
│ │ │ └── memory/
│ │ │ └── repository/
│ │ │ └── mongo/
│ │ │ ├── Conversation.java
│ │ │ ├── MongoChatMemoryRepository.java
│ │ │ └── package-info.java
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── chat/
│ │ └── memory/
│ │ └── repository/
│ │ └── mongo/
│ │ └── MongoChatMemoryRepositoryIT.java
│ ├── spring-ai-model-chat-memory-repository-neo4j/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── chat/
│ │ │ └── memory/
│ │ │ └── repository/
│ │ │ └── neo4j/
│ │ │ ├── AttributeGetter.java
│ │ │ ├── MediaAttributes.java
│ │ │ ├── MessageAttributes.java
│ │ │ ├── Neo4jChatMemoryRepository.java
│ │ │ ├── Neo4jChatMemoryRepositoryConfig.java
│ │ │ ├── ToolCallAttributes.java
│ │ │ ├── ToolResponseAttributes.java
│ │ │ └── package-info.java
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── chat/
│ │ └── memory/
│ │ └── repository/
│ │ └── neo4j/
│ │ ├── Neo4JChatMemoryRepositoryConfigIT.java
│ │ └── Neo4jChatMemoryRepositoryIT.java
│ └── spring-ai-model-chat-memory-repository-redis/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── chat/
│ │ └── memory/
│ │ └── repository/
│ │ └── redis/
│ │ ├── AdvancedRedisChatMemoryRepository.java
│ │ ├── RedisChatMemoryConfig.java
│ │ ├── RedisChatMemoryRepository.java
│ │ └── package-info.java
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── chat/
│ │ └── memory/
│ │ └── repository/
│ │ └── redis/
│ │ ├── RedisChatMemoryAdvancedQueryIT.java
│ │ ├── RedisChatMemoryErrorHandlingIT.java
│ │ ├── RedisChatMemoryIT.java
│ │ ├── RedisChatMemoryMediaIT.java
│ │ ├── RedisChatMemoryMessageTypesIT.java
│ │ ├── RedisChatMemoryRepositoryIT.java
│ │ └── RedisChatMemoryWithSchemaIT.java
│ └── resources/
│ ├── application-metadata-schema.yml
│ └── logback-test.xml
├── models/
│ ├── spring-ai-anthropic/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── anthropic/
│ │ │ ├── AbstractAnthropicOptions.java
│ │ │ ├── AnthropicCacheOptions.java
│ │ │ ├── AnthropicCacheStrategy.java
│ │ │ ├── AnthropicCacheTtl.java
│ │ │ ├── AnthropicChatModel.java
│ │ │ ├── AnthropicChatOptions.java
│ │ │ ├── AnthropicCitationDocument.java
│ │ │ ├── AnthropicServiceTier.java
│ │ │ ├── AnthropicSetup.java
│ │ │ ├── AnthropicSkill.java
│ │ │ ├── AnthropicSkillContainer.java
│ │ │ ├── AnthropicSkillRecord.java
│ │ │ ├── AnthropicSkillType.java
│ │ │ ├── AnthropicSkillsResponseHelper.java
│ │ │ ├── AnthropicWebSearchResult.java
│ │ │ ├── AnthropicWebSearchTool.java
│ │ │ ├── CacheBreakpointTracker.java
│ │ │ ├── CacheEligibilityResolver.java
│ │ │ ├── Citation.java
│ │ │ └── package-info.java
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── anthropic/
│ │ │ ├── AnthropicCacheOptionsTests.java
│ │ │ ├── AnthropicChatModelTests.java
│ │ │ ├── AnthropicChatOptionsTests.java
│ │ │ ├── AnthropicSkillsIT.java
│ │ │ ├── AnthropicSkillsResponseHelperTests.java
│ │ │ ├── AnthropicTestConfiguration.java
│ │ │ ├── CacheEligibilityResolverTests.java
│ │ │ └── chat/
│ │ │ ├── AnthropicChatClientIT.java
│ │ │ ├── AnthropicChatModelIT.java
│ │ │ ├── AnthropicChatModelObservationIT.java
│ │ │ ├── AnthropicPromptCachingIT.java
│ │ │ └── MockWeatherService.java
│ │ └── resources/
│ │ └── prompts/
│ │ ├── conversation-history-cache-prompt.txt
│ │ ├── extended-ttl-cache-prompt.txt
│ │ ├── system-and-tools-cache-prompt.txt
│ │ ├── system-message.st
│ │ └── system-only-cache-prompt.txt
│ ├── spring-ai-azure-openai/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── azure/
│ │ │ │ └── openai/
│ │ │ │ ├── AzureOpenAiAudioTranscriptionModel.java
│ │ │ │ ├── AzureOpenAiAudioTranscriptionOptions.java
│ │ │ │ ├── AzureOpenAiChatModel.java
│ │ │ │ ├── AzureOpenAiChatOptions.java
│ │ │ │ ├── AzureOpenAiEmbeddingModel.java
│ │ │ │ ├── AzureOpenAiEmbeddingOptions.java
│ │ │ │ ├── AzureOpenAiImageModel.java
│ │ │ │ ├── AzureOpenAiImageOptions.java
│ │ │ │ ├── AzureOpenAiResponseFormat.java
│ │ │ │ ├── MergeUtils.java
│ │ │ │ ├── aot/
│ │ │ │ │ └── AzureOpenAiRuntimeHints.java
│ │ │ │ └── metadata/
│ │ │ │ ├── AzureOpenAiAudioTranscriptionResponseMetadata.java
│ │ │ │ ├── AzureOpenAiImageGenerationMetadata.java
│ │ │ │ └── AzureOpenAiImageResponseMetadata.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── azure/
│ │ │ └── openai/
│ │ │ ├── AzureChatCompletionsOptionsTests.java
│ │ │ ├── AzureEmbeddingsOptionsTests.java
│ │ │ ├── AzureOpenAiAudioTranscriptionModelIT.java
│ │ │ ├── AzureOpenAiChatClientIT.java
│ │ │ ├── AzureOpenAiChatModelIT.java
│ │ │ ├── AzureOpenAiChatModelObservationIT.java
│ │ │ ├── AzureOpenAiChatOptionsTests.java
│ │ │ ├── AzureOpenAiEmbeddingModelIT.java
│ │ │ ├── AzureOpenAiEmbeddingModelObservationIT.java
│ │ │ ├── MockAiTestConfiguration.java
│ │ │ ├── MockAzureOpenAiTestConfiguration.java
│ │ │ ├── RequiresAzureCredentials.java
│ │ │ ├── aot/
│ │ │ │ └── AzureOpenAiRuntimeHintsTests.java
│ │ │ ├── function/
│ │ │ │ ├── AzureOpenAiChatModelFunctionCallIT.java
│ │ │ │ └── MockWeatherService.java
│ │ │ ├── image/
│ │ │ │ └── AzureOpenAiImageModelIT.java
│ │ │ └── metadata/
│ │ │ └── AzureOpenAiChatModelMetadataTests.java
│ │ └── resources/
│ │ ├── prompts/
│ │ │ └── system-message.st
│ │ └── speech/
│ │ └── jfk.flac
│ ├── spring-ai-bedrock/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── bedrock/
│ │ │ │ ├── MessageToPromptConverter.java
│ │ │ │ ├── aot/
│ │ │ │ │ └── BedrockRuntimeHints.java
│ │ │ │ ├── api/
│ │ │ │ │ └── AbstractBedrockApi.java
│ │ │ │ ├── cohere/
│ │ │ │ │ ├── BedrockCohereEmbeddingModel.java
│ │ │ │ │ ├── BedrockCohereEmbeddingOptions.java
│ │ │ │ │ └── api/
│ │ │ │ │ └── CohereEmbeddingBedrockApi.java
│ │ │ │ └── titan/
│ │ │ │ ├── BedrockTitanEmbeddingModel.java
│ │ │ │ ├── BedrockTitanEmbeddingOptions.java
│ │ │ │ └── api/
│ │ │ │ └── TitanEmbeddingBedrockApi.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── bedrock/
│ │ │ ├── RequiresAwsCredentials.java
│ │ │ ├── aot/
│ │ │ │ └── BedrockRuntimeHintsTests.java
│ │ │ ├── api/
│ │ │ │ └── AbstractBedrockApiTest.java
│ │ │ ├── cohere/
│ │ │ │ ├── BedrockCohereEmbeddingModelIT.java
│ │ │ │ └── api/
│ │ │ │ └── CohereEmbeddingBedrockApiIT.java
│ │ │ └── titan/
│ │ │ ├── BedrockTitanEmbeddingModelIT.java
│ │ │ └── api/
│ │ │ └── TitanEmbeddingBedrockApiIT.java
│ │ └── resources/
│ │ └── prompts/
│ │ └── system-message.st
│ ├── spring-ai-bedrock-converse/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── bedrock/
│ │ │ └── converse/
│ │ │ ├── BedrockChatOptions.java
│ │ │ ├── BedrockProxyChatModel.java
│ │ │ └── api/
│ │ │ ├── BedrockCacheOptions.java
│ │ │ ├── BedrockCacheStrategy.java
│ │ │ ├── BedrockMediaFormat.java
│ │ │ ├── ConverseApiUtils.java
│ │ │ ├── ConverseChatResponseStream.java
│ │ │ ├── MediaFetcher.java
│ │ │ ├── StreamingToolCallBuilder.java
│ │ │ └── URLValidator.java
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── bedrock/
│ │ │ └── converse/
│ │ │ ├── BedrockChatOptionsTests.java
│ │ │ ├── BedrockConverseTestConfiguration.java
│ │ │ ├── BedrockConverseUsageAggregationTests.java
│ │ │ ├── BedrockProxyChatModelIT.java
│ │ │ ├── BedrockProxyChatModelObservationIT.java
│ │ │ ├── BedrockProxyChatModelTest.java
│ │ │ ├── MockWeatherService.java
│ │ │ ├── RequiresAwsCredentials.java
│ │ │ ├── api/
│ │ │ │ ├── BedrockMediaFormatTest.java
│ │ │ │ ├── MediaFetcherTest.java
│ │ │ │ └── URLValidatorTest.java
│ │ │ ├── client/
│ │ │ │ ├── BedrockConverseChatClientIT.java
│ │ │ │ ├── BedrockNovaChatClientIT.java
│ │ │ │ └── BedrockNovaToolCallAdvisorIT.java
│ │ │ └── experiments/
│ │ │ ├── BedrockConverseChatModelMain.java
│ │ │ └── BedrockConverseChatModelMain3.java
│ │ └── resources/
│ │ └── prompts/
│ │ └── system-message.st
│ ├── spring-ai-deepseek/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── deepseek/
│ │ │ │ ├── DeepSeekAssistantMessage.java
│ │ │ │ ├── DeepSeekChatModel.java
│ │ │ │ ├── DeepSeekChatOptions.java
│ │ │ │ ├── aot/
│ │ │ │ │ ├── DeepSeekRuntimeHints.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── api/
│ │ │ │ │ ├── DeepSeekApi.java
│ │ │ │ │ ├── DeepSeekStreamFunctionCallingHelper.java
│ │ │ │ │ ├── ResponseFormat.java
│ │ │ │ │ ├── common/
│ │ │ │ │ │ ├── DeepSeekConstants.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── deepseek/
│ │ │ ├── DeepSeekAssistantMessageTests.java
│ │ │ ├── DeepSeekChatCompletionRequestTests.java
│ │ │ ├── DeepSeekChatOptionsTests.java
│ │ │ ├── DeepSeekRetryTests.java
│ │ │ ├── DeepSeekTestConfiguration.java
│ │ │ ├── aot/
│ │ │ │ └── DeepSeekRuntimeHintsTests.java
│ │ │ ├── api/
│ │ │ │ ├── DeepSeekApiIT.java
│ │ │ │ ├── DeepSeekStreamFunctionCallingHelperTest.java
│ │ │ │ └── MockWeatherService.java
│ │ │ └── chat/
│ │ │ ├── ActorsFilms.java
│ │ │ ├── DeepSeekChatModelFunctionCallingIT.java
│ │ │ ├── DeepSeekChatModelIT.java
│ │ │ └── DeepSeekChatModelObservationIT.java
│ │ └── resources/
│ │ └── prompts/
│ │ └── system-message.st
│ ├── spring-ai-elevenlabs/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── elevenlabs/
│ │ │ │ ├── ElevenLabsTextToSpeechModel.java
│ │ │ │ ├── ElevenLabsTextToSpeechOptions.java
│ │ │ │ ├── aot/
│ │ │ │ │ └── ElevenLabsRuntimeHints.java
│ │ │ │ └── api/
│ │ │ │ ├── ElevenLabsApi.java
│ │ │ │ └── ElevenLabsVoicesApi.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── elevenlabs/
│ │ │ ├── ElevenLabsTestConfiguration.java
│ │ │ ├── ElevenLabsTextToSpeechModelIT.java
│ │ │ ├── ElevenLabsTextToSpeechOptionsTests.java
│ │ │ └── api/
│ │ │ ├── ElevenLabsApiIT.java
│ │ │ └── ElevenLabsVoicesApiIT.java
│ │ └── resources/
│ │ └── voices.json
│ ├── spring-ai-google-genai/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── google/
│ │ │ │ └── genai/
│ │ │ │ ├── GoogleGenAiChatModel.java
│ │ │ │ ├── GoogleGenAiChatOptions.java
│ │ │ │ ├── MimeTypeDetector.java
│ │ │ │ ├── aot/
│ │ │ │ │ └── GoogleGenAiRuntimeHints.java
│ │ │ │ ├── cache/
│ │ │ │ │ ├── CachedContentRequest.java
│ │ │ │ │ ├── CachedContentUpdateRequest.java
│ │ │ │ │ ├── GoogleGenAiCachedContent.java
│ │ │ │ │ └── GoogleGenAiCachedContentService.java
│ │ │ │ ├── common/
│ │ │ │ │ ├── GoogleGenAiConstants.java
│ │ │ │ │ ├── GoogleGenAiSafetySetting.java
│ │ │ │ │ └── GoogleGenAiThinkingLevel.java
│ │ │ │ ├── metadata/
│ │ │ │ │ ├── GoogleGenAiModalityTokenCount.java
│ │ │ │ │ ├── GoogleGenAiTrafficType.java
│ │ │ │ │ └── GoogleGenAiUsage.java
│ │ │ │ └── schema/
│ │ │ │ ├── GoogleGenAiToolCallingManager.java
│ │ │ │ └── JsonSchemaConverter.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── google/
│ │ │ └── genai/
│ │ │ ├── CreateGeminiRequestTests.java
│ │ │ ├── GoogleGenAiChatModelCachedContentTests.java
│ │ │ ├── GoogleGenAiChatModelExtendedUsageTests.java
│ │ │ ├── GoogleGenAiChatModelIT.java
│ │ │ ├── GoogleGenAiChatModelMLDevIT.java
│ │ │ ├── GoogleGenAiChatModelObservationApiKeyIT.java
│ │ │ ├── GoogleGenAiChatModelObservationIT.java
│ │ │ ├── GoogleGenAiChatOptionsTest.java
│ │ │ ├── GoogleGenAiRetryTests.java
│ │ │ ├── GoogleGenAiThinkingLevelIT.java
│ │ │ ├── GoogleGenAiThoughtSignatureLifecycleIT.java
│ │ │ ├── MimeTypeDetectorTests.java
│ │ │ ├── TestGoogleGenAiCachedContentService.java
│ │ │ ├── TestGoogleGenAiGeminiChatModel.java
│ │ │ ├── aot/
│ │ │ │ └── GoogleGenAiRuntimeHintsTests.java
│ │ │ ├── cache/
│ │ │ │ └── GoogleGenAiCachedContentServiceTests.java
│ │ │ ├── client/
│ │ │ │ └── GoogleGenAiToolCallAdvisorIT.java
│ │ │ ├── metadata/
│ │ │ │ └── GoogleGenAiUsageTests.java
│ │ │ ├── schema/
│ │ │ │ └── JsonSchemaConverterTests.java
│ │ │ └── tool/
│ │ │ ├── GoogleGenAiChatModelToolCallingIT.java
│ │ │ ├── GoogleGenAiPaymentTransactionIT.java
│ │ │ ├── GoogleGenAiPaymentTransactionMethodIT.java
│ │ │ ├── GoogleGenAiPaymentTransactionToolsIT.java
│ │ │ └── MockWeatherService.java
│ │ └── resources/
│ │ └── prompts/
│ │ └── system-message.st
│ ├── spring-ai-google-genai-embedding/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── google/
│ │ │ └── genai/
│ │ │ ├── GoogleGenAiEmbeddingConnectionDetails.java
│ │ │ └── text/
│ │ │ ├── GoogleGenAiTextEmbeddingModel.java
│ │ │ ├── GoogleGenAiTextEmbeddingModelName.java
│ │ │ └── GoogleGenAiTextEmbeddingOptions.java
│ │ └── test/
│ │ └── java/
│ │ └── org/
│ │ └── springframework/
│ │ └── ai/
│ │ └── google/
│ │ └── genai/
│ │ └── text/
│ │ ├── GoogleGenAiTextEmbeddingModelIT.java
│ │ ├── GoogleGenAiTextEmbeddingModelObservationIT.java
│ │ ├── GoogleGenAiTextEmbeddingRetryTests.java
│ │ └── TestGoogleGenAiTextEmbeddingModel.java
│ ├── spring-ai-minimax/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── minimax/
│ │ │ │ ├── MiniMaxChatModel.java
│ │ │ │ ├── MiniMaxChatOptions.java
│ │ │ │ ├── MiniMaxEmbeddingModel.java
│ │ │ │ ├── MiniMaxEmbeddingOptions.java
│ │ │ │ ├── aot/
│ │ │ │ │ └── MiniMaxRuntimeHints.java
│ │ │ │ └── api/
│ │ │ │ ├── MiniMaxApi.java
│ │ │ │ ├── MiniMaxApiConstants.java
│ │ │ │ └── MiniMaxStreamFunctionCallingHelper.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── minimax/
│ │ │ ├── ChatCompletionRequestTests.java
│ │ │ ├── MiniMaxChatOptionsTests.java
│ │ │ ├── MiniMaxTestConfiguration.java
│ │ │ ├── api/
│ │ │ │ ├── MiniMaxApiIT.java
│ │ │ │ ├── MiniMaxApiToolFunctionCallIT.java
│ │ │ │ ├── MiniMaxRetryTests.java
│ │ │ │ └── MockWeatherService.java
│ │ │ ├── chat/
│ │ │ │ ├── MiniMaxChatModelObservationIT.java
│ │ │ │ └── MiniMaxChatOptionsTests.java
│ │ │ └── embedding/
│ │ │ ├── EmbeddingIT.java
│ │ │ └── MiniMaxEmbeddingModelObservationIT.java
│ │ └── resources/
│ │ └── prompts/
│ │ └── system-message.st
│ ├── spring-ai-mistral-ai/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── mistralai/
│ │ │ │ ├── MistralAiChatModel.java
│ │ │ │ ├── MistralAiChatOptions.java
│ │ │ │ ├── MistralAiEmbeddingModel.java
│ │ │ │ ├── MistralAiEmbeddingOptions.java
│ │ │ │ ├── aot/
│ │ │ │ │ ├── MistralAiRuntimeHints.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── api/
│ │ │ │ │ ├── MistralAiApi.java
│ │ │ │ │ ├── MistralAiModerationApi.java
│ │ │ │ │ ├── MistralAiStreamFunctionCallingHelper.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── moderation/
│ │ │ │ │ ├── MistralAiModerationModel.java
│ │ │ │ │ ├── MistralAiModerationOptions.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── ocr/
│ │ │ │ │ ├── MistralAiOcrOptions.java
│ │ │ │ │ ├── MistralOcrApi.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── mistralai/
│ │ │ ├── MistralAiChatClientIT.java
│ │ │ ├── MistralAiChatCompletionRequestTests.java
│ │ │ ├── MistralAiChatModelIT.java
│ │ │ ├── MistralAiChatModelObservationIT.java
│ │ │ ├── MistralAiChatOptionsTests.java
│ │ │ ├── MistralAiEmbeddingIT.java
│ │ │ ├── MistralAiEmbeddingModelObservationIT.java
│ │ │ ├── MistralAiEmbeddingModelTests.java
│ │ │ ├── MistralAiModerationModelIT.java
│ │ │ ├── MistralAiRetryTests.java
│ │ │ ├── MistralAiTestConfiguration.java
│ │ │ ├── MockWeatherService.java
│ │ │ ├── aot/
│ │ │ │ └── MistralAiRuntimeHintsTests.java
│ │ │ ├── api/
│ │ │ │ ├── MistralAiApiIT.java
│ │ │ │ └── tool/
│ │ │ │ ├── MistralAiApiToolFunctionCallIT.java
│ │ │ │ ├── MockWeatherService.java
│ │ │ │ └── PaymentStatusFunctionCallingIT.java
│ │ │ └── ocr/
│ │ │ ├── MistralAiOcrOptionsTests.java
│ │ │ └── MistralOcrApiIT.java
│ │ └── resources/
│ │ └── prompts/
│ │ ├── acme/
│ │ │ └── system-qa.st
│ │ ├── eval/
│ │ │ ├── qa-evaluator-accurate-answer.st
│ │ │ ├── qa-evaluator-fact-based-answer.st
│ │ │ ├── qa-evaluator-not-related-message.st
│ │ │ └── user-evaluator-message.st
│ │ └── system-message.st
│ ├── spring-ai-ollama/
│ │ ├── README.md
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── org/
│ │ │ │ └── springframework/
│ │ │ │ └── ai/
│ │ │ │ └── ollama/
│ │ │ │ ├── OllamaChatModel.java
│ │ │ │ ├── OllamaEmbeddingModel.java
│ │ │ │ ├── aot/
│ │ │ │ │ ├── OllamaRuntimeHints.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── api/
│ │ │ │ │ ├── OllamaApi.java
│ │ │ │ │ ├── OllamaApiHelper.java
│ │ │ │ │ ├── OllamaChatOptions.java
│ │ │ │ │ ├── OllamaEmbeddingOptions.java
│ │ │ │ │ ├── OllamaModel.java
│ │ │ │ │ ├── ThinkOption.java
│ │ │ │ │ ├── common/
│ │ │ │ │ │ └── OllamaApiConstants.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── management/
│ │ │ │ │ ├── ModelManagementOptions.java
│ │ │ │ │ ├── OllamaModelManager.java
│ │ │ │ │ ├── PullModelStrategy.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── package-info.java
│ │ │ └── resources/
│ │ │ └── META-INF/
│ │ │ └── spring/
│ │ │ └── aot.factories
│ │ └── test/
│ │ ├── java/
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── ai/
│ │ │ └── ollama/
│ │ │ ├── BaseOllamaIT.java
│ │ │ ├── OllamaChatModelFunctionCallingIT.java
│ │ │ ├── OllamaChatModelIT.java
│ │ │ ├── OllamaChatModelMetadataIT.java
│ │ │ ├── OllamaChatModelMultimodalIT.java
│ │ │ ├── OllamaChatModelObservationIT.java
│ │
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root = true
[*.{adoc,bat,groovy,html,java,js,jsp,kt,kts,md,properties,py,rb,sh,sql,svg,txt,xml,xsd}]
charset = utf-8
[*.{groovy,java,kt,kts,xml,xsd}]
indent_style = tab
indent_size = 4
continuation_indent_size = 8
end_of_line = lf
insert_final_newline = true
================================================
FILE: .gitattributes
================================================
*.onnx filter=lfs diff=lfs merge=lfs -text
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a bug report to help us improve the project
title: ''
labels: 'type: bug, status: waiting-for-triage'
assignees: ''
---
Please do a quick search on GitHub issues first, there might be already a duplicate issue for the one you are about to create.
If the bug is trivial, just go ahead and create the issue. Otherwise, please take a few moments and fill in the following sections:
**Bug description**
A clear and concise description of what the bug is about.
**Environment**
Please provide as many details as possible: Spring AI version, Java version, which vector store you use if any, etc
**Steps to reproduce**
Steps to reproduce the issue.
**Expected behavior**
A clear and concise description of what you expected to happen.
**Minimal Complete Reproducible example**
Please provide a failing test or a minimal complete verifiable example that reproduces the issue.
Bug reports that are reproducible will take priority in resolution over reports that are not reproducible.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Questions and Community Support
url: https://stackoverflow.com/questions/tagged/spring-ai
about: Please ask and answer questions on StackOverflow with the spring-ai tag
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: 'status: waiting-for-triage, type: feature'
assignees: ''
---
Please do a quick search on GitHub issues first, the feature you are about to request might have already been requested.
**Expected Behavior**
<!--- Tell us how it should work. Add a code example to explain what you think the feature should look like. This is optional, but it would help up understand your expectations. -->
**Current Behavior**
<!--- Explain the difference from current behavior and why do you need this feature (aka why it is not possible to implement the desired functionality with the current version) -->
**Context**
<!---
How has this issue affected you?
What are you trying to accomplish?
What other alternatives have you considered?
Are you aware of any workarounds?
-->
================================================
FILE: .github/ISSUE_TEMPLATE/miscellaneous.md
================================================
---
name: Miscellaneous
about: Suggest an improvement for this project
title: ''
labels: 'status: waiting-for-triage'
assignees: ''
---
For anything other than bug reports and feature requests (performance, refactoring, etc),
just go ahead and file the issue. Please provide as many details as possible.
If you have a question or a support request, please open a new discussion on [GitHub Discussions](https://github.com/spring-projects/spring-ai/discussions)
or ask a question on [StackOverflow](https://stackoverflow.com/questions/tagged/spring-ai).
Please do **not** create issues on the [Issue Tracker](https://github.com/spring-projects/spring-ai/issues) for questions or support requests.
We would like to keep the issue tracker **exclusively** for bug reports and feature requests.
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
Thank you for taking time to contribute this pull request!
You might have already read the [contributor guide][1], but as a reminder, please make sure to:
* Add a Signed-off-by line to each commit (`git commit -s`) per the [DCO](https://spring.io/blog/2025/01/06/hello-dco-goodbye-cla-simplifying-contributions-to-spring#how-to-use-developer-certificate-of-origin)
* Rebase your changes on the latest `main` branch and squash your commits
* Add/Update unit tests as needed
* Run a build and make sure all tests pass prior to submission
For more details, please check the [contributor guide][1].
Thank you upfront!
[1]: https://github.com/spring-projects/spring-ai/blob/main/CONTRIBUTING.adoc
================================================
FILE: .github/dco.yml
================================================
require:
members: false
================================================
FILE: .github/release-files-spec.json
================================================
{
"files": [
{
"aql": {
"items.find": {
"$and": [
{
"@build.name": "${buildname}",
"@build.number": "${buildnumber}",
"path": {"$match": "org*"}
},
{
"$or": [
{
"name": {"$match": "*.pom"}
},
{
"name": {"$match": "*.jar"}
}
]
}
]
}
},
"target": "nexus/"
}
]
}
================================================
FILE: .github/workflows/artifactory-milestone-release.yml
================================================
name: Artifactory Milestone Release
on:
workflow_dispatch:
inputs:
releaseVersion:
description: "Milestone release version"
required: true
jobs:
build:
name: Release milestone to Artifactory
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v6
- name: Set up JDK
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
- name: Capture release version
run: echo RELEASE_VERSION=${{ github.event.inputs.releaseVersion }} >> $GITHUB_ENV
- name: Update release version
run: |
./mvnw versions:set -DgenerateBackupPoms=false -DnewVersion=$RELEASE_VERSION
./mvnw versions:set -DgenerateBackupPoms=false -DnewVersion=$RELEASE_VERSION -pl spring-ai-bom
- name: Enforce release rules
run: ./wmvn org.apache.maven.plugins:maven-enforcer-plugin:enforce -Drules=requireReleaseDeps
- name: Build with Maven and deploy to Artifactory's milestone repository
env:
ARTIFACTORY_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }}
ARTIFACTORY_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }}
run: ./mvnw -P artifactory-milestone -s settings.xml --batch-mode -Dmaven.test.skip=true deploy
================================================
FILE: .github/workflows/auto-cherry-pick.yml
================================================
name: Auto Cherry-Pick
on:
push:
branches:
- main
- '*.x'
jobs:
cherry-pick-commit:
uses: spring-io/spring-github-workflows/.github/workflows/spring-cherry-pick.yml@v5
secrets:
GH_ACTIONS_REPO_TOKEN: ${{ secrets.GH_ACTIONS_REPO_TOKEN }}
================================================
FILE: .github/workflows/backport-issue.yml
================================================
name: Backport Issue
on:
push:
branches:
- '*.x'
jobs:
backport-issue:
if: contains(github.event.head_commit.message, 'Fixes:') || contains(github.event.head_commit.message, 'Closes:')
runs-on: ubuntu-latest
steps:
- uses: spring-io/backport-bot@v0.0.1
with:
token: ${{ secrets.GH_ACTIONS_REPO_TOKEN }}
================================================
FILE: .github/workflows/continuous-integration.yml
================================================
name: Build + Deploy on development branches
on:
push:
branches:
- 'main'
- '[0-9].[0-9].x'
schedule:
- cron: '30 11 * * 1-5' # 12:30 PM CET / 6:30 AM
workflow_dispatch:
concurrency:
group: ${{ github.workflow_ref }}
cancel-in-progress: true
jobs:
build-all:
name: Build all modules
if: ${{ github.repository_owner == 'spring-projects' }}
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v6
- name: Set up JDK
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
- name: Setup Maven Build-Cache (~/.m2/build-cache)
if: ${{ github.event_name != 'schedule' }}
uses: actions/cache@v5
with:
path: ~/.m2/build-cache
# See pr-check.yml for an explanation of the key format
key: build-cache-${{ runner.os }}-${{ hashFiles('**/pom.xml') }}-${{ github.run_id }}
restore-keys: |
build-cache-${{ runner.os }}-${{ hashFiles('**/pom.xml') }}-
build-cache-${{ runner.os }}-
- name: Build all modules with unit tests
run: |
./mvnw --batch-mode -ntp --update-snapshots clean install
- name: Upload Spring-AI Built Artifacts
uses: actions/upload-artifact@v6
with:
name: build-artifacts
path: ~/.m2/repository/org/springframework/ai
retention-days: 1 # Intent is to share only with downstream jobs in this workflow
- name: Purge Spring AI Built Artifacts # We don't want the setup-java m2 cache to capture our products, only our deps
run: |
rm -fr ~/.m2/repository/org/springframework/ai
test-ollama:
name: Test Ollama
if: ${{ github.repository_owner == 'spring-projects' }}
runs-on: ubuntu-latest
needs: build-all
services:
ollama:
image: ollama/ollama:latest
ports:
- 11434:11434
env:
OLLAMA_WITH_REUSE: true
OLLAMA_AUTOCONF_TESTS_ENABLED: "true"
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
- name: Setup Maven Build-Cache (~/.m2/build-cache)
uses: actions/cache@v4
if: ${{ github.event_name != 'schedule' }}
with:
path: ~/.m2/build-cache
key: build-cache-${{ runner.os }}-ollama-${{ hashFiles('**/pom.xml') }}-${{ github.run_id }}
restore-keys: |
build-cache-${{ runner.os }}-ollama-${{ hashFiles('**/pom.xml') }}-
build-cache-${{ runner.os }}-
- name: Download Spring-AI Built Artifacts
uses: actions/download-artifact@v4
with:
name: build-artifacts
path: ~/.m2/repository/org/springframework/ai
- name: Configure Testcontainers
run: |
echo "testcontainers.reuse.enable=true" > $HOME/.testcontainers.properties
- name: Test Ollama modules
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
SPRING_AI_OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
./mvnw --batch-mode -ntp --no-snapshot-updates \
-pl models/spring-ai-ollama,auto-configurations/models/spring-ai-autoconfigure-model-ollama \
-Pci-fast-integration-tests \
-Dfailsafe.rerunFailingTestsCount=3 \
verify
test-openai:
name: Test OpenAI
if: ${{ github.repository_owner == 'spring-projects' }}
runs-on: ubuntu-latest
needs: build-all
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
- name: Setup Maven Build-Cache (~/.m2/build-cache)
uses: actions/cache@v4
with:
path: ~/.m2/build-cache
key: build-cache-${{ runner.os }}-openai-${{ hashFiles('**/pom.xml') }}-${{ github.run_id }}
restore-keys: |
build-cache-${{ runner.os }}-openai-${{ hashFiles('**/pom.xml') }}-
build-cache-${{ runner.os }}-
- name: Download Spring-AI Built Artifacts
uses: actions/download-artifact@v4
with:
name: build-artifacts
path: ~/.m2/repository/org/springframework/ai
- name: Configure Testcontainers
run: |
echo "testcontainers.reuse.enable=true" > $HOME/.testcontainers.properties
- name: Test OpenAI modules
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
SPRING_AI_OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
./mvnw --batch-mode -ntp --no-snapshot-updates \
-pl models/spring-ai-openai,auto-configurations/models/spring-ai-autoconfigure-model-openai \
-Pci-fast-integration-tests \
-Dfailsafe.rerunFailingTestsCount=3 \
verify
test-remaining:
name: Test Remaining (MCP, Google GenAI, Chroma, PgVector)
if: ${{ github.repository_owner == 'spring-projects' }}
runs-on: ubuntu-latest
needs: build-all
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
- name: Setup Maven Build-Cache (~/.m2/build-cache)
uses: actions/cache@v4
with:
path: ~/.m2/build-cache
key: build-cache-${{ runner.os }}-other-${{ hashFiles('**/pom.xml') }}-${{ github.run_id }}
restore-keys: |
build-cache-${{ runner.os }}-other-${{ hashFiles('**/pom.xml') }}-
build-cache-${{ runner.os }}-
- name: Download Spring-AI Built Artifacts
uses: actions/download-artifact@v4
with:
name: build-artifacts
path: ~/.m2/repository/org/springframework/ai
- name: Configure Testcontainers
run: |
echo "testcontainers.reuse.enable=true" > $HOME/.testcontainers.properties
- name: Test remaining modules
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
SPRING_AI_OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
./mvnw --batch-mode -ntp --no-snapshot-updates \
-pl models/spring-ai-google-genai,auto-configurations/models/spring-ai-autoconfigure-model-google-genai,mcp/common,mcp/mcp-annotations,auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common,auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient,auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux,auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common,auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc,auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux,vector-stores/spring-ai-chroma-store,vector-stores/spring-ai-pgvector-store,spring-ai-integration-tests \
-Pci-fast-integration-tests \
-Dfailsafe.rerunFailingTestsCount=3 \
verify
handle-documentation:
name: Generate and upload javadocs, trigger antora reference doc
if: ${{ github.repository_owner == 'spring-projects' && github.event_name != 'schedule'}}
runs-on: ubuntu-latest
permissions:
actions: write
needs: [build-all, test-ollama, test-openai, test-remaining]
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Trigger Antora build
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh workflow run deploy-docs.yml -r docs-build
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
# NOT setting up maven build-cache b/c javadoc:aggregate-jar is forking lifecyle and can't benefit from it anyway
- name: Generate Java docs
run: ./mvnw --batch-mode -ntp javadoc:aggregate-jar
- name: Capture project version
run: echo PROJECT_VERSION=$(./mvnw help:evaluate -Dexpression=project.version --quiet -DforceStdout) >> $GITHUB_ENV
- name: Setup SSH key
run: |
mkdir "$HOME/.ssh"
echo "${{ secrets.DOCS_SSH_KEY }}" > "$HOME/.ssh/key"
chmod 600 "$HOME/.ssh/key"
echo "${{ secrets.DOCS_SSH_HOST_KEY }}" > "$HOME/.ssh/known_hosts"
- name: Deploy docs
run: |
ssh -i $HOME/.ssh/key ${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_HOST }} "cd ${{ secrets.DOCS_PATH }} && rm -fr $PROJECT_VERSION && mkdir -p $PROJECT_VERSION"
scp -i $HOME/.ssh/key target/spring-ai-parent-${PROJECT_VERSION}-javadoc.jar ${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_HOST }}:${{ secrets.DOCS_PATH }}/$PROJECT_VERSION
ssh -i $HOME/.ssh/key ${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_HOST }} "cd ${{ secrets.DOCS_PATH }}/${PROJECT_VERSION} && unzip spring-ai-parent-${PROJECT_VERSION}-javadoc.jar -d api && rm spring-ai-parent-${PROJECT_VERSION}-javadoc.jar"
deploy-artifactory:
name: Deploy to Artifactory
runs-on: ubuntu-latest
needs: [build-all, test-ollama, test-openai, test-remaining]
if: ${{ github.repository_owner == 'spring-projects' && github.event_name != 'schedule' }}
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
- name: Setup Maven Build-Cache (~/.m2/build-cache)
uses: actions/cache@v4
with:
path: ~/.m2/build-cache
key: build-cache-${{ runner.os }}-${{ hashFiles('**/pom.xml') }}-${{ github.run_id }}
restore-keys: |
build-cache-${{ runner.os }}-${{ hashFiles('**/pom.xml') }}-
build-cache-${{ runner.os }}-
- name: Deploy to Artifactory
env:
ARTIFACTORY_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }}
ARTIFACTORY_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }}
run: |
./mvnw -s settings.xml --batch-mode -ntp -Dmaven.test.skip deploy
================================================
FILE: .github/workflows/dependency-ci-dashboard.yml
================================================
name: Ecosystem CI Dashboard
on:
schedule:
- cron: '15 6 * * *' # 06:15 UTC daily
workflow_dispatch:
permissions:
issues: write
contents: write
jobs:
update-dashboard:
name: Update Ecosystem CI Dashboard
runs-on: ubuntu-latest
if: ${{ github.repository == 'spring-projects/spring-ai' }}
steps:
- name: Checkout source code
uses: actions/checkout@v6
- name: Load configuration
id: config
run: |
CONFIG=$(cat src/ecosystem-ci/ci-alert-config.json)
echo "issue_number=$(echo "$CONFIG" | jq -r '.issue_number')" >> $GITHUB_OUTPUT
echo "tracked_branch=$(echo "$CONFIG" | jq -r '.tracked_branch')" >> $GITHUB_OUTPUT
echo "alert_after_days=$(echo "$CONFIG" | jq -r '.alert_after_days')" >> $GITHUB_OUTPUT
echo "heartbeat_days=$(echo "$CONFIG" | jq -r '.heartbeat_days')" >> $GITHUB_OUTPUT
echo "dependencies<<EOF" >> $GITHUB_OUTPUT
echo "$CONFIG" | jq -c '.dependencies' >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Query CI status for all dependencies
id: query-status
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DEPENDENCIES: ${{ steps.config.outputs.dependencies }}
TRACKED_BRANCH: ${{ steps.config.outputs.tracked_branch }}
run: |
RESULTS="[]"
for row in $(echo "$DEPENDENCIES" | jq -r '.[] | @base64'); do
_jq() {
echo ${row} | base64 --decode | jq -r ${1}
}
OWNER=$(_jq '.owner')
REPO=$(_jq '.repo')
echo "Querying status for $OWNER/$REPO..."
# Query workflow runs for the branch (most reliable for GitHub Actions)
RUNS_RESPONSE=$(curl -s -H "Authorization: token $GH_TOKEN" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/$OWNER/$REPO/actions/runs?branch=$TRACKED_BRANCH&per_page=10")
# Find the most recent completed workflow run
LATEST_RUN=$(echo "$RUNS_RESPONSE" | jq '[.workflow_runs[] | select(.status == "completed")] | .[0]')
if [ "$LATEST_RUN" != "null" ] && [ -n "$LATEST_RUN" ]; then
CONCLUSION=$(echo "$LATEST_RUN" | jq -r '.conclusion // "unknown"')
COMMIT_SHA=$(echo "$LATEST_RUN" | jq -r '.head_sha // "unknown"' | head -c 7)
COMMIT_DATE=$(echo "$LATEST_RUN" | jq -r '.created_at // ""')
# Map conclusion to state
case "$CONCLUSION" in
"success") STATE="success" ;;
"failure"|"timed_out"|"cancelled") STATE="failure" ;;
*) STATE="unknown" ;;
esac
else
# Check if there are any in-progress runs
IN_PROGRESS=$(echo "$RUNS_RESPONSE" | jq '[.workflow_runs[] | select(.status == "in_progress" or .status == "queued")] | length')
if [ "$IN_PROGRESS" -gt 0 ]; then
STATE="pending"
# Get commit from in-progress run
COMMIT_SHA=$(echo "$RUNS_RESPONSE" | jq -r '.workflow_runs[0].head_sha // "unknown"' | head -c 7)
COMMIT_DATE=$(echo "$RUNS_RESPONSE" | jq -r '.workflow_runs[0].created_at // ""')
else
STATE="unknown"
# Fall back to HEAD commit info
COMMIT_RESPONSE=$(curl -s -H "Authorization: token $GH_TOKEN" \
-H "Accept: application/vnd.github+json" \
"https://api.github.com/repos/$OWNER/$REPO/commits/$TRACKED_BRANCH")
COMMIT_SHA=$(echo "$COMMIT_RESPONSE" | jq -r '.sha // "unknown"' | head -c 7)
COMMIT_DATE=$(echo "$COMMIT_RESPONSE" | jq -r '.commit.committer.date // ""')
fi
fi
RESULT=$(jq -n \
--arg owner "$OWNER" \
--arg repo "$REPO" \
--arg state "$STATE" \
--arg sha "$COMMIT_SHA" \
--arg date "$COMMIT_DATE" \
'{owner: $owner, repo: $repo, state: $state, sha: $sha, commit_date: $date}')
RESULTS=$(echo "$RESULTS" | jq --argjson result "$RESULT" '. + [$result]')
done
echo "results<<EOF" >> $GITHUB_OUTPUT
echo "$RESULTS" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Update dashboard and check alerts
uses: actions/github-script@v7
env:
RESULTS: ${{ steps.query-status.outputs.results }}
ISSUE_NUMBER: ${{ steps.config.outputs.issue_number }}
ALERT_AFTER_DAYS: ${{ steps.config.outputs.alert_after_days }}
HEARTBEAT_DAYS: ${{ steps.config.outputs.heartbeat_days }}
TRACKED_BRANCH: ${{ steps.config.outputs.tracked_branch }}
with:
script: |
const results = JSON.parse(process.env.RESULTS);
const issueNumber = parseInt(process.env.ISSUE_NUMBER);
const alertAfterDays = parseInt(process.env.ALERT_AFTER_DAYS);
const heartbeatDays = parseInt(process.env.HEARTBEAT_DAYS);
const trackedBranch = process.env.TRACKED_BRANCH;
const now = new Date();
const timestamp = now.toISOString();
// Status emoji mapping
const statusEmoji = {
'success': ':white_check_mark:',
'failure': ':x:',
'pending': ':yellow_circle:',
'unknown': ':grey_question:'
};
// Find dashboard comment (contains hidden state marker)
const STATE_MARKER = '<!-- ECOSYSTEM-CI-DASHBOARD-STATE:';
const DASHBOARD_MARKER = '<!-- ECOSYSTEM-CI-DASHBOARD -->';
const comments = await github.paginate(github.rest.issues.listComments, {
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber
});
let dashboardComment = comments.find(c => c.body.includes(DASHBOARD_MARKER));
// Parse previous state from comment
let previousState = {};
if (dashboardComment) {
const stateMatch = dashboardComment.body.match(/<!-- ECOSYSTEM-CI-DASHBOARD-STATE:(.*?)-->/s);
if (stateMatch) {
try {
previousState = JSON.parse(stateMatch[1]);
} catch (e) {
console.log('Failed to parse previous state:', e);
}
}
}
// Update state with current results
const newState = {};
const alertsNeeded = [];
for (const result of results) {
const key = `${result.owner}/${result.repo}`;
const prevEntry = previousState[key] || {};
if (result.state === 'failure') {
// Track when it first failed
const failedSince = prevEntry.failedSince || timestamp;
const failedDays = Math.floor((now - new Date(failedSince)) / (1000 * 60 * 60 * 24));
const lastAlerted = prevEntry.lastAlerted;
newState[key] = {
state: result.state,
failedSince: failedSince,
failedDays: failedDays,
lastAlerted: lastAlerted
};
// Check if we need to alert
if (failedDays >= alertAfterDays) {
// Only alert if we haven't alerted in the last heartbeat period
const shouldAlert = !lastAlerted ||
(now - new Date(lastAlerted)) >= (heartbeatDays * 24 * 60 * 60 * 1000);
if (shouldAlert) {
alertsNeeded.push({
owner: result.owner,
repo: result.repo,
failedDays: failedDays,
sha: result.sha
});
newState[key].lastAlerted = timestamp;
}
}
} else {
// Not failing - clear failure tracking
newState[key] = {
state: result.state
};
}
}
// Build dashboard table
let dashboardTable = `| Repository | Status | Branch | Latest Commit | Last Run |\n`;
dashboardTable += `|------------|--------|--------|---------------|----------|\n`;
for (const result of results) {
const key = `${result.owner}/${result.repo}`;
const emoji = statusEmoji[result.state] || statusEmoji['unknown'];
const stateEntry = newState[key];
let statusText = emoji;
if (result.state === 'failure' && stateEntry.failedDays > 0) {
statusText += ` (${stateEntry.failedDays}d)`;
}
const repoLink = `[${result.owner}/${result.repo}](https://github.com/${result.owner}/${result.repo})`;
const commitLink = result.sha !== 'unknown'
? `[\`${result.sha}\`](https://github.com/${result.owner}/${result.repo}/commit/${result.sha})`
: 'N/A';
const actionsLink = `[${trackedBranch}](https://github.com/${result.owner}/${result.repo}/actions?query=branch%3A${trackedBranch})`;
// Format date as YYYY-MM-DD
const lastRun = result.commit_date
? new Date(result.commit_date).toISOString().split('T')[0]
: 'N/A';
dashboardTable += `| ${repoLink} | ${statusText} | ${actionsLink} | ${commitLink} | ${lastRun} |\n`;
}
// Build dashboard comment body
const stateJson = JSON.stringify(newState);
const dashboardBody = `${DASHBOARD_MARKER}
## Ecosystem CI Dashboard
**Last updated:** ${timestamp}
${dashboardTable}
### Legend
- :white_check_mark: All checks passing
- :x: CI failing (days in parentheses)
- :yellow_circle: Checks in progress
- :grey_question: Status unknown
### Alert Policy
- Alerts are posted when a dependency has been failing for **${alertAfterDays}+ days**
- Subscribe to this issue to receive CI failure notifications
${STATE_MARKER}${stateJson}-->
`.split('\n').map(line => line.trim()).join('\n');
// Update or create dashboard comment
if (dashboardComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: dashboardComment.id,
body: dashboardBody
});
console.log('Updated dashboard comment');
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
body: dashboardBody
});
console.log('Created dashboard comment');
}
// Post alert comments if needed
for (const alert of alertsNeeded) {
const alertBody = `:rotating_light: **CI Alert**: [${alert.owner}/${alert.repo}](https://github.com/${alert.owner}/${alert.repo}) has been failing for **${alert.failedDays} days**
- **Branch:** ${trackedBranch}
- **Latest commit:** [\`${alert.sha}\`](https://github.com/${alert.owner}/${alert.repo}/commit/${alert.sha})
- **CI Status:** [View Actions](https://github.com/${alert.owner}/${alert.repo}/actions?query=branch%3A${trackedBranch})
Please investigate and fix the CI failure.`;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
body: alertBody
});
console.log(`Posted alert for ${alert.owner}/${alert.repo}`);
}
// Set outputs for wiki update
core.setOutput('dashboard_table', dashboardTable);
core.setOutput('timestamp', timestamp);
core.setOutput('alert_after_days', alertAfterDays);
- name: Update Wiki Dashboard
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RESULTS: ${{ steps.query-status.outputs.results }}
TRACKED_BRANCH: ${{ steps.config.outputs.tracked_branch }}
ALERT_AFTER_DAYS: ${{ steps.config.outputs.alert_after_days }}
run: |
# Configure git
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
# Clone wiki repo
WIKI_DIR=$(mktemp -d)
git clone "https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.wiki.git" "$WIKI_DIR"
# Generate wiki page content
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
# Status emoji mapping for wiki (GitHub wiki renders these)
cat > "$WIKI_DIR/Ecosystem-CI-Dashboard.md" << 'WIKI_HEADER'
# Ecosystem CI Dashboard
This dashboard monitors the CI health of Spring AI ecosystem dependencies.
WIKI_HEADER
echo "**Last updated:** $TIMESTAMP" >> "$WIKI_DIR/Ecosystem-CI-Dashboard.md"
echo "" >> "$WIKI_DIR/Ecosystem-CI-Dashboard.md"
# Build table
echo "| Repository | Status | Branch | Latest Commit | Last Run |" >> "$WIKI_DIR/Ecosystem-CI-Dashboard.md"
echo "|------------|--------|--------|---------------|----------|" >> "$WIKI_DIR/Ecosystem-CI-Dashboard.md"
echo "$RESULTS" | jq -r '.[] | @base64' | while read row; do
OWNER=$(echo "$row" | base64 --decode | jq -r '.owner')
REPO=$(echo "$row" | base64 --decode | jq -r '.repo')
STATE=$(echo "$row" | base64 --decode | jq -r '.state')
SHA=$(echo "$row" | base64 --decode | jq -r '.sha')
COMMIT_DATE=$(echo "$row" | base64 --decode | jq -r '.commit_date')
case "$STATE" in
"success") EMOJI=":white_check_mark:" ;;
"failure") EMOJI=":x:" ;;
"pending") EMOJI=":yellow_circle:" ;;
*) EMOJI=":grey_question:" ;;
esac
REPO_LINK="[$OWNER/$REPO](https://github.com/$OWNER/$REPO)"
COMMIT_LINK="[\`$SHA\`](https://github.com/$OWNER/$REPO/commit/$SHA)"
ACTIONS_LINK="[$TRACKED_BRANCH](https://github.com/$OWNER/$REPO/actions?query=branch%3A$TRACKED_BRANCH)"
# Format date as YYYY-MM-DD
if [ -n "$COMMIT_DATE" ] && [ "$COMMIT_DATE" != "null" ]; then
LAST_RUN=$(echo "$COMMIT_DATE" | cut -d'T' -f1)
else
LAST_RUN="N/A"
fi
echo "| $REPO_LINK | $EMOJI | $ACTIONS_LINK | $COMMIT_LINK | $LAST_RUN |" >> "$WIKI_DIR/Ecosystem-CI-Dashboard.md"
done
cat >> "$WIKI_DIR/Ecosystem-CI-Dashboard.md" << WIKI_FOOTER
## Legend
- :white_check_mark: All checks passing
- :x: CI failing
- :yellow_circle: Checks in progress
- :grey_question: Status unknown
## Alert Policy
Alerts are posted to [Issue #${{ steps.config.outputs.issue_number }}](https://github.com/${{ github.repository }}/issues/${{ steps.config.outputs.issue_number }}) when a dependency has been failing for **${ALERT_AFTER_DAYS}+ days**.
Subscribe to that issue to receive CI failure notifications.
## Monitored Repositories
The following repositories are monitored as part of the Spring AI ecosystem:
WIKI_FOOTER
echo "$RESULTS" | jq -r '.[] | "- [`\(.owner)/\(.repo)`](https://github.com/\(.owner)/\(.repo))"' >> "$WIKI_DIR/Ecosystem-CI-Dashboard.md"
cat >> "$WIKI_DIR/Ecosystem-CI-Dashboard.md" << 'WIKI_END'
---
*This page is automatically updated by the [Ecosystem CI Dashboard workflow](https://github.com/spring-projects/spring-ai/actions/workflows/dependency-ci-dashboard.yml).*
WIKI_END
# Commit and push wiki changes
cd "$WIKI_DIR"
git add Ecosystem-CI-Dashboard.md
if git diff --staged --quiet; then
echo "No changes to wiki"
else
git commit -m "Update Ecosystem CI Dashboard - $TIMESTAMP"
git push
echo "Wiki updated successfully"
fi
================================================
FILE: .github/workflows/deploy-docs.yml
================================================
name: Deploy Docs
run-name: ${{ github.event_name == 'workflow_dispatch' && 'Deploy Docs (Build)' || 'Deploy Docs (Dispatcher)' }}
on:
workflow_dispatch:
permissions:
actions: write
jobs:
build:
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'spring-projects' }}
steps:
- name: Dispatch (full build)
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh workflow run deploy-docs.yml -r docs-build
================================================
FILE: .github/workflows/documentation-upload.yml
================================================
name: Documentation Upload
on:
workflow_dispatch:
jobs:
handle-documentation:
name: Generate and upload javadocs
if: ${{ github.repository_owner == 'spring-projects' }}
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v6
- name: Set up JDK
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
# NOT setting up maven build-cache b/c javadoc:aggregate-jar is forking lifecyle and can't benefit from it anyway
- name: Generate Java docs
run: ./mvnw --batch-mode -ntp javadoc:aggregate-jar
- name: Capture project version
run: echo PROJECT_VERSION=$(./mvnw help:evaluate -Dexpression=project.version --quiet -DforceStdout) >> $GITHUB_ENV
- name: Setup SSH key
run: |
mkdir "$HOME/.ssh"
echo "${{ secrets.DOCS_SSH_KEY }}" > "$HOME/.ssh/key"
chmod 600 "$HOME/.ssh/key"
echo "${{ secrets.DOCS_SSH_HOST_KEY }}" > "$HOME/.ssh/known_hosts"
- name: Deploy docs
run: |
ssh -i $HOME/.ssh/key ${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_HOST }} "cd ${{ secrets.DOCS_PATH }} && rm -fr $PROJECT_VERSION && mkdir -p $PROJECT_VERSION"
scp -i $HOME/.ssh/key target/spring-ai-parent-${PROJECT_VERSION}-javadoc.jar ${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_HOST }}:${{ secrets.DOCS_PATH }}/$PROJECT_VERSION
ssh -i $HOME/.ssh/key ${{ secrets.DOCS_USERNAME }}@${{ secrets.DOCS_HOST }} "cd ${{ secrets.DOCS_PATH }}/${PROJECT_VERSION} && unzip spring-ai-parent-${PROJECT_VERSION}-javadoc.jar -d api && rm spring-ai-parent-${PROJECT_VERSION}-javadoc.jar"
================================================
FILE: .github/workflows/maven-central-release.yml
================================================
name: Release to Maven Central
on:
workflow_dispatch:
jobs:
build:
name: Release project
runs-on: ubuntu-latest
steps:
- name: Check out sources
uses: actions/checkout@v6
- name: Set up JDK
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 25
cache: 'maven'
- name: Install GPG key
run: |
echo "${{ secrets.GPG_PRIVATE_KEY }}" > gpg.asc
echo "${{ secrets.GPG_PASSPHRASE }}" | gpg --batch --yes --passphrase-fd 0 --import gpg.asc
- name: Release to Maven Central
env:
CENTRAL_TOKEN_USERNAME: ${{ secrets.CENTRAL_TOKEN_USERNAME }}
CENTRAL_TOKEN_PASSWORD: ${{ secrets.CENTRAL_TOKEN_PASSWORD }}
MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
run: |
./mvnw -B -ntp clean install -DskipTests
./mvnw -B -ntp clean deploy -Psonatype -s settings.xml
================================================
FILE: .github/workflows/mcp-integration-tests.yml
================================================
name: MCP Integration Tests
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
jobs:
mcp-common:
name: MCP common and annotations integration tests
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v6
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '20'
- name: Build with Maven and run mcp/common and mcp/mcp-annotations integration tests
run: |
./mvnw clean verify -Pintegration-tests -pl "mcp/common,mcp/mcp-annotations"
mcp-transport:
name: MCP transport integration tests
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v6
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '20'
- name: Build with Maven and run MCP transport integration tests
run: |
./mvnw clean verify -Pintegration-tests -pl "mcp/transport/mcp-spring-webflux,mcp/transport/mcp-spring-webmvc"
================================================
FILE: .github/workflows/pr-check.yml
================================================
name: PR Check
on:
pull_request:
jobs:
build:
name: Build branch
runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'spring-projects' }}
steps:
- name: Checkout source code
uses: actions/checkout@v6
- name: Set up JDK
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
cache: 'maven'
- name: Setup Maven Build-Cache (~/.m2/build-cache)
uses: actions/cache@v5
with:
path: ~/.m2/build-cache
# See https://github.com/actions/cache/blob/main/tips-and-workarounds.md#update-a-cache
# We need to incrementally save the contents of the build-cache directory, even if there was a hit prior to the build
# Cached restored from restore-keys are restored using the latest one first, so this is a good compromise
key: build-cache-${{ runner.os }}-${{ hashFiles('**/pom.xml') }}-${{ github.run_id }}
restore-keys: |
build-cache-${{ runner.os }}-${{ hashFiles('**/pom.xml') }}-
build-cache-${{ runner.os }}-
- name: Run tests
run: |
./mvnw -ntp -B -U package
================================================
FILE: .gitignore
================================================
.checkstyle
target
.classpath
.project
.settings
.env
bin
build.log
integration-repo
ivy-cache
spring-build
derby-home
derbydb
derby.log
com.springsource.sts.config.flow.prefs
s3.properties
.idea
*.iml
*.ipr
*.iws
.*.swp
.DS_Store
.springBeans
build
.gradle
out
*~
/.gradletasknamecache
**/*.flattened-pom.xml
vscode
settings.json
node
node_modules
package-lock.json
package.json
.vscode
.antlr
shell.log
.profiler
nbproject/
CLAUDE.md
**/.claude/settings.local.json
.devcontainer
qodana.yaml
__pycache__/
*.pyc
tmp
plans
================================================
FILE: .mvn/extensions.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2023-present the original author or authors.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ https://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<extensions>
<extension>
<groupId>fr.jcgay.maven</groupId>
<artifactId>maven-profiler</artifactId>
<version>3.2</version>
</extension>
<extension>
<groupId>org.apache.maven.extensions</groupId>
<artifactId>maven-build-cache-extension</artifactId>
<version>1.2.1</version>
</extension>
</extensions>
================================================
FILE: .mvn/jvm.config
================================================
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED
================================================
FILE: .mvn/maven-build-cache-config.xml
================================================
<cache xmlns="http://maven.apache.org/BUILD-CACHE-CONFIG/1.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/BUILD-CACHE-CONFIG/1.2.0 https://maven.apache.org/xsd/build-cache-config-1.2.0.xsd">
<input>
<global>
<includes>
<!-- By default, project sources and resources directories are included (src/main/java and src/main/resources) -->
<!-- Here, the goal is to include a wider range of src directories (like src/main/assembly or src/main/antora) -->
<include>src/</include>
</includes>
</global>
</input>
<executionControl>
<runAlways>
<goalsLists>
<goalsList artifactId="swagger-codegen-maven-plugin">
<goals>
<goal>generate</goal>
</goals>
</goalsList>
<goalsList artifactId="maven-install-plugin">
<goals>
<goal>install</goal>
</goals>
</goalsList>
<goalsList artifactId="maven-deploy-plugin">
<goals>
<goal>deploy</goal>
</goals>
</goalsList>
<goalsList groupId="org.codehaus.mojo" artifactId="flatten-maven-plugin">
<goals>
<goal>flatten</goal>
</goals>
</goalsList>
</goalsLists>
</runAlways>
<reconcile>
<plugins>
<plugin artifactId="maven-surefire-plugin" goal="test">
<reconciles>
<reconcile propertyName="skip" skipValue="true"/>
<reconcile propertyName="skipExec" skipValue="true"/>
<reconcile propertyName="skipTests" skipValue="true"/>
</reconciles>
</plugin>
<plugin artifactId="maven-failsafe-plugin" goal="integration-test">
<reconciles>
<reconcile propertyName="skip" skipValue="true"/>
<reconcile propertyName="skipExec" skipValue="true"/>
<reconcile propertyName="skipITs" skipValue="true"/>
<reconcile propertyName="skipTests" skipValue="true"/>
</reconciles>
</plugin>
<!-- workaround for https://issues.apache.org/jira/browse/MBUILDCACHE-56 -->
<plugin artifactId="maven-enforcer-plugin" goal="enforce">
<nologs>
<nolog propertyName="commandLineRules"/>
</nologs>
</plugin>
</plugins>
</reconcile>
</executionControl>
</cache>
================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
#
# Copyright 2023-present the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar
================================================
FILE: .sdkmanrc
================================================
# Enable auto-env through the sdkman_auto_env config
# Add key=value pairs of SDKs to use below
java=21.0.9-tem
================================================
FILE: CONTRIBUTING.adoc
================================================
= Spring AI Contributor Guidelines
Do you have something you'd like to contribute to **Spring AI**?
We welcome pull requests, but ask that you carefully read this document first to understand how best to submit them;
what kind of changes are likely to be accepted; and what to expect from the Spring team when evaluating your submission.
Please refer back to this document as a checklist before issuing any pull request; this will save time for everyone!
== Code of Conduct
This project adheres to the Contributor Covenant https://github.com/spring-projects/spring-ai#coc-ov-file[code of conduct].
By participating, you are expected to uphold this code. Please report unacceptable behavior to
spring-code-of-conduct@pivotal.io.
== Understand the basics
Not sure what a *pull request* is, or how to submit one? Take a look at GitHub's excellent documentation:
https://help.github.com/articles/using-pull-requests/[Using Pull Requests] first.
== Search GitHub ticket first; create an issue if necessary
Is there already an issue that addresses your concern? Search the
https://github.com/spring-projects/spring-ai/issues[GitHub issue tracker] to see if you can find something similar.
If not, please create a new issue before submitting a pull request unless the change is truly trivial, e.g. typo fixes,
removing compiler warnings, etc.
== Developer Certificate of Origin
All commits must include a __Signed-off-by__ trailer at the end of each commit message to indicate that the contributor agrees to the Developer Certificate of Origin.
For additional details, please refer to the blog post https://spring.io/blog/2025/01/06/hello-dco-goodbye-cla-simplifying-contributions-to-spring[Hello DCO, Goodbye CLA: Simplifying Contributions to Spring].
== Fork the Repository
1. Go to https://github.com/spring-projects/spring-ai[https://github.com/spring-projects/spring-ai]
2. Hit the "fork" button and choose your own GitHub account as the target
3. For more detail see https://help.github.com/articles/fork-a-repo/[Fork A Repo].
== Setup your Local Development Environment
1. `git clone --recursive git@github.com:<your-github-username>/spring-ai.git`
2. `cd spring-ai`
3. `git remote show`
_you should see only 'origin' - which is the fork you created for your own GitHub account_
4. `git remote add upstream git@github.com:spring-projects/spring-ai.git`
5. `git remote show`
_you should now see 'upstream' in addition to 'origin' where 'upstream' is the SpringIO repository from which releases are built_
6. `git fetch --all`
7. `git branch -a`
_you should see branches on origin as well as upstream, including 'main'_
== A Day in the Life of a Contributor
* _Always_ work on topic branches (Typically use the GitHub issue ID as the branch name).
- For example, to create and switch to a new branch for issue GH-123: `git checkout -b GH-123`
* You might be working on several different topic branches at any given time, but when at a stopping point for one of those branches, commit (a local operation).
* Please follow the "Commit Guidelines" described in
https://git-scm.com/book/ms/v2/Distributed-Git-Contributing-to-a-Project[this chapter of Pro Git].
* Then to begin working on another issue (say GH-101): `git checkout GH-101`. The _-b_ flag is not needed if that
branch already exists in your local repository.
* When ready to resolve an issue or to collaborate with others, you can push your branch to origin (your fork),
e.g.: `git push origin GH-123`
* If you want to collaborate with another contributor, have them fork your repository (add it as a remote) and
`git fetch <your-username>` to grab your branch.
Alternatively, they can use `git fetch --all` to sync their local state with all of their remotes.
* If you grant that collaborator push access to your repository, they can even apply their changes to your branch.
* When ready for your contribution to be reviewed for potential inclusion in the main branch of the canonical
spring-ai repository (what you know as 'upstream'), issue a pull request to the SpringSource repository
(for more detail, see https://help.github.com/articles/using-pull-requests/[Using pull requests]).
* The project lead may merge your changes into the upstream main branch as-is, he may keep the pull request open yet
add a comment about something that should be modified, or he might reject the pull request by closing it.
* A prerequisite for any pull request is that it will be cleanly merge-able with the upstream main's current state.
**This is the responsibility of any contributor.**
If your pull request cannot be applied cleanly, the project lead will most likely add a comment requesting that you make
it merge-able.
For a full explanation, see https://git-scm.com/book/en/Git-Branching-Rebasing[the Pro Git section on rebasing].
As stated there: _"> Often, you’ll do this to make sure your commits apply cleanly on a remote branch — perhaps in a
project to which you’re trying to contribute but that you don’t maintain."_
== Keeping your Local Code in Sync
* As mentioned above, you should always work on topic branches (since 'main' is a moving target). However, you do want
to always keep your own 'origin' main branch in sync with the 'upstream' main.
* Within your local working directory, you can sync up all remotes' branches with: `git fetch --all`
* While on your own local main branch: `git pull upstream main` (which is the equivalent of fetching upstream/main
and merging that into the branch you are in currently)
* Now that you're in sync, switch to the topic branch where you plan to work, e.g.: `git checkout -b GH-123`
* When you get to a stopping point: `git commit`
* If changes have occurred on the upstream/main while you were working you can sync again:
- Switch back to main: `git checkout main`
- Then: `git pull upstream main`
- Switch back to the topic branch: `git checkout GH-123` (no -b needed since the branch already exists)
- Rebase the topic branch to minimize the distance between it and your recently synced main branch: `git rebase main`
(Again, for more detail see https://git-scm.com/book/en/Git-Branching-Rebasing[the Pro Git section on rebasing]).
* **Note** You cannot rebase if you have already pushed your branch to your remote because you'd be rewriting history
(see **'The Perils of Rebasing'** in the article).
If you rebase by mistake, you can undo it as discussed
https://stackoverflow.com/questions/134882/undoing-a-git-rebase[in this StackOverflow discussion].
Once you have published your branch, you need to merge in the main rather than rebasing.
* Now, if you issue a pull request, it is much more likely to be merged without conflicts.
Most likely, any pull request that would produce conflicts will be deferred until the issuer of that pull request makes
these adjustments.
* Assuming your pull request is merged into the 'upstream' main, you will actually end up pulling that change into
your own main eventually, and at that time, you may decide to delete the topic branch from your local repository and
your fork (origin) if you pushed it there.
- to delete the local branch: `git branch -d GH-123`
- to delete the branch from your origin: `git push origin :GH-123`
== Maintain a linear commit history
When merging to main, the project __always__ uses fast-forward merges.
When issuing pull requests, please ensure that your commit history is linear.
From the command line you can check this using:
----
git log --graph --pretty=oneline
----
As this may cause lots of typing, we recommend creating a global alias, e.g. `git logg` for this:
----
git config --global alias.logg 'log --graph --pretty=oneline'
----
This command, will provide the following output, which in this case shows a nice linear history:
----
* c129a02e6c752b49bacd4a445092a44f66c2a1e9 INT-2721 Increase Timers on JDBC Delayer Tests
* 14e556ce23d49229c420632cef608630b1d82e7d INT-2620 Fix Debug Log
* 6140aa7b2cfb6ae309c55a157e94b44e5d0bea4f INT-3037 Fix JDBC MS Discard After Completion
* 077f2b24ea871a3937c513e08241d1c6cb9c9179 Update Spring Social Twitter to 1.0.5
* 6d4f2b46d859c903881a561c35aa28df68f8faf3 INT-3053 Allow task-executor on <reply-listener/>
* 56f9581b85a8a40bbcf2461ffc0753212669a68d Update Spring Social Twitter version to 1.0.4
----
If you see intersecting lines, that usually means that you forgot to rebase you branch.
As mentioned earlier, **please rebase against main** before issuing a pull request.
== Run Formatting Checks and Make Sure the Build Passes
Before opening a pull request, make sure that the following full build passes locally. As a side effect of that build, some files may get re-formatted to
automatically adhere to the conventions used in the project (see below). Be sure to commit those reformats before opening a PR if that happens.
[source,shell]
----
./mvnw package
----
=== Source Code Style
Spring AI source code checkstyle tries to follow the checkstyle guidelines used by the core Spring Framework project with some exceptions.
The wiki pages
https://github.com/spring-projects/spring-framework/wiki/Code-Style[Code Style] and
https://github.com/spring-projects/spring-framework/wiki/IntelliJ-IDEA-Editor-Settings[IntelliJ IDEA Editor Settings]
define the source file coding standards we use along with some IDEA editor settings we customize.
== Mind the whitespace
Please carefully follow the whitespace and formatting conventions already present in the framework.
1. Tabs, not spaces
2. Unix (LF), not DOS (CRLF) line endings
3. Eliminate all trailing whitespace
4. Wrap Javadoc at 90 characters
5. Aim to wrap code at 120 characters, but favor readability over wrapping
6. Preserve existing formatting; i.e. do not reformat code for its own sake
7. Search the codebase using `git grep` and other tools to discover common
naming conventions, etc.
8. Latin-1 (ISO-8859-1) encoding for Java sources; use `native2ascii` to convert
if necessary
== Add Apache license header to all new classes
[source, java]
----
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ...;
----
== Use @since tags
Use @since tags for newly-added public API types and methods e.g.
[source java]
----
/**
* ...
*
* @author First Last
* @since 3.0
* @see ...
*/
----
== Submit JUnit test cases for all behavior changes
Search the codebase to find related unit tests and add additional @Test methods within. It is also acceptable to submit test cases on a per GitHub issue basis.
== Squash commits
Use `git rebase --interactive`, `git add --patch` and other tools to "squash" multiple commits into atomic changes.
In addition to the man pages for git, there are many resources online to help you understand how these tools work.
== Use your real name in git commits
Please configure git to use your real first and last name for any commits you intend to submit as pull requests. For example, this is not acceptable:
Author: Nickname <user@mail.com>
Rather, please include your first and last name, properly capitalized, as submitted against the SpringSource contributor license agreement:
Author: First Last <user@mail.com>
This helps ensure traceability against the CLA, and also goes a long way to ensuring useful output from tools like `git shortlog` and others.
You can configure this globally via the account admin area GitHub (useful for fork-and-edit cases); globally with
git config --global user.name "First Last"
git config --global user.email user@mail.com
or locally for the *spring-ai* repository only by omitting the '--global' flag:
cd spring-ai
git config user.name "First Last"
git config user.email user@mail.com
== Run all tests prior to submission
Make sure that all tests pass prior to submitting your pull request.
Again, CI will run the equivalent of the following command on your PR. Make
sure that it passes locally before opening your PR:
[source,shell]
----
./mvnw package
----
== Mention your pull request on the associated GitHub issue
Add a comment to the associated GitHub issue(s) linking to your new pull request.
== Provide a Link to the GitHub issue in the Associated Pull Request
There are multiple ways to link a Pull Request to a GitHub issue as described
https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue[here].
One way would be to add a GitHub issue link to your first commit comment of the pull request on the second line,
so your commit message may look like this:
----
GH-1: Add Contribution Guidelines
Fixes GH-1 (https://github.com/spring-projects/spring-ai/issues/1)
* add `CONTRIBUTING.adoc` describing the Contribution procedure
* mention Contribution Guidelines in the `README.md`
* mention CODE_OF_CONDUCT in the `README.md`
----
Also by using specific
https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword[keywords]
you can link to a GitHub issue like so:
Closes #10
================================================
FILE: LICENSE.txt
================================================
Apache License
Version 2.0, January 2004
https://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
# Spring AI [](https://github.com/spring-projects/spring-ai/actions/workflows/continuous-integration.yml) [](https://github.com/spring-projects/spring-ai-integration-tests/actions/workflows/spring-ai-integration-tests.yml) [](https://central.sonatype.com/artifact/org.springframework.ai/spring-ai-model)
### Spring Boot Version Compatibility
> **Spring AI 2.x.x** ([main](https://github.com/spring-projects/spring-ai/tree/main) branch) - Spring Boot `4.x`
>
> **Spring AI 1.1.x** ([1.1.x](https://github.com/spring-projects/spring-ai/tree/1.1.x) branch) - Spring Boot `3.5.x`
The Spring AI project provides a Spring-friendly API and abstractions for developing AI applications.
Its goal is to apply to the AI domain Spring ecosystem design principles such as portability and modular design and promote using POJOs as the building blocks of an application to the AI domain.

> At its core, Spring AI addresses the fundamental challenge of AI integration: Connecting your enterprise __Data__ and __APIs__ with the __AI Models__.
The project draws inspiration from notable Python projects, such as [LangChain](https://docs.langchain.com/docs/) and [LlamaIndex](https://gpt-index.readthedocs.io/en/latest/getting_started/concepts.html), but Spring AI is not a direct port of those projects. The project was founded with the belief that the next wave of Generative AI applications will not be only for Python developers but will be ubiquitous across many programming languages.
You can check out the blog post [Why Spring AI](https://spring.io/blog/2024/11/19/why-spring-ai) for additional motivations.
This is a high level feature overview.
You can find more details in the [Reference Documentation](https://docs.spring.io/spring-ai/reference/)
* Support for all major [AI Model providers](https://docs.spring.io/spring-ai/reference/api/index.html) such as Anthropic, OpenAI, Microsoft, Amazon, Google, and Ollama. Supported model types include:
- [Chat Completion](https://docs.spring.io/spring-ai/reference/api/chatmodel.html)
- [Embedding](https://docs.spring.io/spring-ai/reference/api/embeddings.html)
- [Text to Image](https://docs.spring.io/spring-ai/reference/api/imageclient.html)
- [Audio Transcription](https://docs.spring.io/spring-ai/reference/api/audio/transcriptions.html)
- [Text to Speech](https://docs.spring.io/spring-ai/reference/api/audio/speech.html)
- [Moderation](https://docs.spring.io/spring-ai/reference/api/index.html#api/moderation)
- **Latest Models**: GPT-5, and other cutting-edge models for advanced AI applications.
* Portable API support across AI providers for both synchronous and streaming options. Access to [model-specific features](https://docs.spring.io/spring-ai/reference/api/chatmodel.html#_chat_options) is also available.
* [Structured Outputs](https://docs.spring.io/spring-ai/reference/api/structured-output-converter.html) - Mapping of AI Model output to POJOs.
* Support for all major [Vector Database providers](https://docs.spring.io/spring-ai/reference/api/vectordbs.html) such as *Apache Cassandra, Azure Vector Search, Chroma, Elasticsearch, Milvus, MongoDB Atlas, MariaDB, Neo4j, Oracle, PostgreSQL/PGVector, Pinecone, Qdrant, Redis, and Weaviate*.
* Portable API across Vector Store providers, including a novel SQL-like [metadata filter API](https://docs.spring.io/spring-ai/reference/api/vectordbs.html#metadata-filters).
* [Tools/Function Calling](https://docs.spring.io/spring-ai/reference/api/tools.html) - permits the model to request the execution of client-side tools and functions, thereby accessing necessary real-time information as required.
* [Observability](https://docs.spring.io/spring-ai/reference/observability/index.html) - Provides insights into AI-related operations.
* Document injection [ETL framework](https://docs.spring.io/spring-ai/reference/api/etl-pipeline.html) for Data Engineering.
* [AI Model Evaluation](https://docs.spring.io/spring-ai/reference/api/testing.html) - Utilities to help evaluate generated content and protect against hallucinated response.
* [ChatClient API](https://docs.spring.io/spring-ai/reference/api/chatclient.html) - Fluent API for communicating with AI Chat Models, idiomatically similar to the WebClient and RestClient APIs.
* [Advisors API](https://docs.spring.io/spring-ai/reference/api/advisors.html) - Encapsulates recurring Generative AI patterns, transforms data sent to and from Language Models (LLMs), and provides portability across various models and use cases.
* Support for [Chat Conversation Memory](https://docs.spring.io/spring-ai/reference/api/chatclient.html#_chat_memory) and [Retrieval Augmented Generation (RAG)](https://docs.spring.io/spring-ai/reference/api/chatclient.html#_retrieval_augmented_generation).
* Spring Boot Auto Configuration and Starters for all AI Models and Vector Stores - use the [start.spring.io](https://start.spring.io/) to select the Model or Vector-store of choice.
## Getting Started
Please refer to the [Getting Started Guide](https://docs.spring.io/spring-ai/reference/getting-started.html) for instruction on adding your dependencies.
## Project Resources
* [Documentation](https://docs.spring.io/spring-ai/reference/)
* [Issues](https://github.com/spring-projects/spring-ai/issues)
<!-- * [Discussions](https://github.com/spring-projects/spring-ai/discussions) - Go here if you have a question, suggestion, or feedback! -->
* [Awesome Spring AI](https://github.com/spring-ai-community/awesome-spring-ai) - A curated list of awesome resources, tools, tutorials, and projects for building generative AI applications using Spring AI
* [Spring AI Examples](https://github.com/spring-projects/spring-ai-examples) contains example projects that explain specific features in more detail.
* [Spring AI Community](https://github.com/spring-ai-community) - A community-driven organization for building Spring-based integrations with AI models, agents, vector databases, and more.
## Breaking changes
* Refer to the [upgrade notes](https://docs.spring.io/spring-ai/reference/upgrade-notes.html) to see how to upgrade to 1.0.0.M1 or higher.
## Cloning the repo
This repository contains [large model files](https://github.com/spring-projects/spring-ai/tree/main/models/spring-ai-transformers/src/main/resources/onnx/all-MiniLM-L6-v2).
To clone it you have to either:
- Ignore the large files (won't affect the spring-ai behaviour) : `GIT_LFS_SKIP_SMUDGE=1 git clone git@github.com:spring-projects/spring-ai.git`.
- Or install the [Git Large File Storage](https://git-lfs.com/) before cloning the repo.
## Building
The project targets and build artifacts compatible with Java 17+, but requires JDK 21
to build. This is enforced by the maven enforcer plugin.
To build with running unit tests
```shell
./mvnw clean package
```
To build including integration tests.
```shell
./mvnw clean verify -Pintegration-tests
```
Note that you should set API key environment variables for OpenAI or other model providers before running. If the API key isn't set for a specific model provider, the integration test is skipped.
To run a specific integration test allowing for up to two attempts to succeed. This is useful when a hosted service is not reliable or times out.
```shell
./mvnw -pl vector-stores/spring-ai-pgvector-store -am -Pintegration-tests -Dfailsafe.failIfNoSpecifiedTests=false -Dfailsafe.rerunFailingTestsCount=2 -Dit.test=PgVectorStoreIT verify
```
### Integration Tests
There are many integration tests, so it often isn't realistic to run them all at once.
A quick pass through the most important pathways that runs integration tests for
* OpenAI models
* OpenAI autoconfiguration
* PGVector
* Chroma
can be done with the profile `-Pci-fast-integration-tests` and is used in the main CI build of this project.
A full integration test is done twice a day in the [Spring AI Integration Test Repository](https://github.com/spring-projects/spring-ai-integration-tests)
One way to run integration tests on part of the code is to first do a quick compile and install of the project
```shell
./mvnw clean install -DskipTests -Dmaven.javadoc.skip=true
```
Then run the integration test for a specific module using the `-pl` option
```shell
./mvnw verify -Pintegration-tests -pl spring-ai-spring-boot-testcontainers
```
### Documentation
To build the docs
```shell
./mvnw -pl spring-ai-docs antora
```
The docs are then in the directory `spring-ai-docs/target/antora/site/index.html`
### Formatting the Source Code
The code is formatted using the [java-format plugin](https://github.com/spring-io/spring-javaformat) as part of the build. Correct
formatting is enforced by CI.
### Updating License Headers
To update the year on license headers using the [license-maven-plugin](https://oss.carbou.me/license-maven-plugin/#goals)
```shell
./mvnw license:update-file-header -Plicense
```
### Javadocs
To check javadocs using the [javadoc:javadoc](https://maven.apache.org/plugins/maven-javadoc-plugin/)
```shell
./mvnw javadoc:javadoc
```
#### Source Code Style
Spring AI source code checkstyle tries to follow the checkstyle guidelines used by the core Spring Framework project with some exceptions.
The wiki pages
[Code Style](https://github.com/spring-projects/spring-framework/wiki/Code-Style) and
[IntelliJ IDEA Editor Settings](https://github.com/spring-projects/spring-framework/wiki/IntelliJ-IDEA-Editor-Settings)
define the source file coding standards we use along with some IDEA editor settings we customize.
Run checkstyle manually:
```shell
./mvnw process-sources -P checkstyle-check
```
## Contributing
Your contributions are always welcome! Please read the [contribution guidelines](CONTRIBUTING.adoc) first.
================================================
FILE: advisors/spring-ai-advisors-vector-store/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2023-present the original author or authors.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ https://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>spring-ai-advisors-vector-store</artifactId>
<packaging>jar</packaging>
<name>Spring AI Advisors</name>
<description>Chat client advisors for Spring AI</description>
<url>https://github.com/spring-projects/spring-ai</url>
<scm>
<url>https://github.com/spring-projects/spring-ai</url>
<connection>scm:git:git://github.com/spring-projects/spring-ai.git</connection>
<developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-ai.git</developerConnection>
</scm>
<properties>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-client-chat</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-vector-store</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!-- test dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
================================================
FILE: advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.chat.client.advisor.vectorstore;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import org.jspecify.annotations.Nullable;
import reactor.core.scheduler.Scheduler;
import reactor.core.scheduler.Schedulers;
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.AdvisorChain;
import org.springframework.ai.chat.client.advisor.api.BaseAdvisor;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.filter.Filter;
import org.springframework.ai.vectorstore.filter.FilterExpressionTextParser;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
* Context for the question is retrieved from a Vector Store and added to the prompt's
* user text.
*
* @author Christian Tzolov
* @author Timo Salm
* @author Ilayaperumal Gopinathan
* @author Thomas Vitale
* @author Yanming Zhou
* @since 1.0.0
*/
public class QuestionAnswerAdvisor implements BaseAdvisor {
public static final String RETRIEVED_DOCUMENTS = "qa_retrieved_documents";
public static final String FILTER_EXPRESSION = "qa_filter_expression";
private static final PromptTemplate DEFAULT_PROMPT_TEMPLATE = new PromptTemplate("""
{query}
Context information is below, surrounded by ---------------------
---------------------
{question_answer_context}
---------------------
Given the context and provided history information and not prior knowledge,
reply to the user comment. If the answer is not in the context, inform
the user that you can't answer the question.
""");
private static final int DEFAULT_ORDER = 0;
private final VectorStore vectorStore;
private final PromptTemplate promptTemplate;
private final SearchRequest searchRequest;
private final Scheduler scheduler;
private final int order;
QuestionAnswerAdvisor(VectorStore vectorStore, SearchRequest searchRequest, @Nullable PromptTemplate promptTemplate,
@Nullable Scheduler scheduler, int order) {
Assert.notNull(vectorStore, "vectorStore cannot be null");
Assert.notNull(searchRequest, "searchRequest cannot be null");
this.vectorStore = vectorStore;
this.searchRequest = searchRequest;
this.promptTemplate = promptTemplate != null ? promptTemplate : DEFAULT_PROMPT_TEMPLATE;
this.scheduler = scheduler != null ? scheduler : BaseAdvisor.DEFAULT_SCHEDULER;
this.order = order;
}
public static Builder builder(VectorStore vectorStore) {
return new Builder(vectorStore);
}
@Override
public int getOrder() {
return this.order;
}
@Override
public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChain advisorChain) {
// 1. Search for similar documents in the vector store.
var searchRequestBuilder = SearchRequest.from(this.searchRequest)
.query(Objects.requireNonNullElse(chatClientRequest.prompt().getUserMessage().getText(), ""));
var filterExpr = doGetFilterExpression(chatClientRequest.context());
if (filterExpr != null) {
searchRequestBuilder.filterExpression(filterExpr);
}
var searchRequestToUse = searchRequestBuilder.build();
List<Document> documents = this.vectorStore.similaritySearch(searchRequestToUse);
// 2. Create the context from the documents.
Map<String, Object> context = new HashMap<>(chatClientRequest.context());
context.put(RETRIEVED_DOCUMENTS, documents);
String documentContext = documents.stream()
.map(Document::getText)
.collect(Collectors.joining(System.lineSeparator()));
// 3. Augment the user prompt with the document context.
UserMessage userMessage = chatClientRequest.prompt().getUserMessage();
String augmentedUserText = this.promptTemplate
.render(Map.of("query", userMessage.getText(), "question_answer_context", documentContext));
// 4. Update ChatClientRequest with augmented prompt.
return chatClientRequest.mutate()
.prompt(chatClientRequest.prompt().augmentUserMessage(augmentedUserText))
.context(context)
.build();
}
@Override
public ChatClientResponse after(ChatClientResponse chatClientResponse, AdvisorChain advisorChain) {
ChatResponse.Builder chatResponseBuilder = ChatResponse.builder();
if (chatClientResponse.chatResponse() != null) {
chatResponseBuilder.from(chatClientResponse.chatResponse());
}
if (chatClientResponse.context().get(RETRIEVED_DOCUMENTS) != null) {
chatResponseBuilder.metadata(RETRIEVED_DOCUMENTS, chatClientResponse.context().get(RETRIEVED_DOCUMENTS));
}
return ChatClientResponse.builder()
.chatResponse(chatResponseBuilder.build())
.context(chatClientResponse.context())
.build();
}
protected Filter.@Nullable Expression doGetFilterExpression(Map<String, @Nullable Object> context) {
Object ctxFilterExpr = context.get(FILTER_EXPRESSION);
if (ctxFilterExpr == null || !StringUtils.hasText(ctxFilterExpr.toString())) {
return this.searchRequest.getFilterExpression();
}
return new FilterExpressionTextParser().parse(ctxFilterExpr.toString());
}
@Override
public Scheduler getScheduler() {
return this.scheduler;
}
public static final class Builder {
private final VectorStore vectorStore;
private SearchRequest searchRequest = SearchRequest.builder().build();
private @Nullable PromptTemplate promptTemplate;
private @Nullable Scheduler scheduler;
private int order = DEFAULT_ORDER;
private Builder(VectorStore vectorStore) {
Assert.notNull(vectorStore, "The vectorStore must not be null!");
this.vectorStore = vectorStore;
}
public Builder promptTemplate(PromptTemplate promptTemplate) {
Assert.notNull(promptTemplate, "promptTemplate cannot be null");
this.promptTemplate = promptTemplate;
return this;
}
public Builder searchRequest(SearchRequest searchRequest) {
Assert.notNull(searchRequest, "The searchRequest must not be null!");
this.searchRequest = searchRequest;
return this;
}
public Builder protectFromBlocking(boolean protectFromBlocking) {
this.scheduler = protectFromBlocking ? BaseAdvisor.DEFAULT_SCHEDULER : Schedulers.immediate();
return this;
}
public Builder scheduler(Scheduler scheduler) {
this.scheduler = scheduler;
return this;
}
public Builder order(int order) {
this.order = order;
return this;
}
public QuestionAnswerAdvisor build() {
return new QuestionAnswerAdvisor(this.vectorStore, this.searchRequest, this.promptTemplate, this.scheduler,
this.order);
}
}
}
================================================
FILE: advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisor.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.chat.client.advisor.vectorstore;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import org.jspecify.annotations.Nullable;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Scheduler;
import org.springframework.ai.chat.client.ChatClientMessageAggregator;
import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.Advisor;
import org.springframework.ai.chat.client.advisor.api.AdvisorChain;
import org.springframework.ai.chat.client.advisor.api.BaseAdvisor;
import org.springframework.ai.chat.client.advisor.api.BaseChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.MessageType;
import org.springframework.ai.chat.messages.SystemMessage;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.util.Assert;
/**
* Memory is retrieved from a VectorStore added into the prompt's system text.
*
* This only works for text based exchanges with the models, not multi-modal exchanges.
*
* @author Christian Tzolov
* @author Thomas Vitale
* @author Oganes Bozoyan
* @author Mark Pollack
* @since 1.0.0
*/
public final class VectorStoreChatMemoryAdvisor implements BaseChatMemoryAdvisor {
public static final String TOP_K = "chat_memory_vector_store_top_k";
private static final String DOCUMENT_METADATA_CONVERSATION_ID = "conversationId";
private static final String DOCUMENT_METADATA_MESSAGE_TYPE = "messageType";
private static final int DEFAULT_TOP_K = 20;
private static final PromptTemplate DEFAULT_SYSTEM_PROMPT_TEMPLATE = new PromptTemplate("""
{instructions}
Use the long term conversation memory from the LONG_TERM_MEMORY section to provide accurate answers.
---------------------
LONG_TERM_MEMORY:
{long_term_memory}
---------------------
""");
private final PromptTemplate systemPromptTemplate;
private final int defaultTopK;
private final String defaultConversationId;
private final int order;
private final Scheduler scheduler;
private final VectorStore vectorStore;
private VectorStoreChatMemoryAdvisor(PromptTemplate systemPromptTemplate, int defaultTopK,
String defaultConversationId, int order, Scheduler scheduler, VectorStore vectorStore) {
Assert.notNull(systemPromptTemplate, "systemPromptTemplate cannot be null");
Assert.isTrue(defaultTopK > 0, "topK must be greater than 0");
Assert.hasText(defaultConversationId, "defaultConversationId cannot be null or empty");
Assert.notNull(scheduler, "scheduler cannot be null");
Assert.notNull(vectorStore, "vectorStore cannot be null");
this.systemPromptTemplate = systemPromptTemplate;
this.defaultTopK = defaultTopK;
this.defaultConversationId = defaultConversationId;
this.order = order;
this.scheduler = scheduler;
this.vectorStore = vectorStore;
}
public static Builder builder(VectorStore chatMemory) {
return new Builder(chatMemory);
}
@Override
public int getOrder() {
return this.order;
}
@Override
public Scheduler getScheduler() {
return this.scheduler;
}
@Override
public ChatClientRequest before(ChatClientRequest request, AdvisorChain advisorChain) {
String conversationId = getConversationId(request.context(), this.defaultConversationId);
String query = Objects.requireNonNullElse(request.prompt().getUserMessage().getText(), "");
int topK = getChatMemoryTopK(request.context());
String filter = DOCUMENT_METADATA_CONVERSATION_ID + "=='" + conversationId + "'";
SearchRequest searchRequest = SearchRequest.builder().query(query).topK(topK).filterExpression(filter).build();
List<Document> documents = this.vectorStore.similaritySearch(searchRequest);
String longTermMemory = documents == null ? ""
: documents.stream().map(Document::getText).collect(Collectors.joining(System.lineSeparator()));
SystemMessage systemMessage = request.prompt().getSystemMessage();
String augmentedSystemText = this.systemPromptTemplate
.render(Map.of("instructions", systemMessage.getText(), "long_term_memory", longTermMemory));
ChatClientRequest processedChatClientRequest = request.mutate()
.prompt(request.prompt().augmentSystemMessage(augmentedSystemText))
.build();
UserMessage userMessage = processedChatClientRequest.prompt().getUserMessage();
if (userMessage != null) {
this.vectorStore.write(toDocuments(List.of(userMessage), conversationId));
}
return processedChatClientRequest;
}
private int getChatMemoryTopK(Map<String, @Nullable Object> context) {
Object fromCtx = context.get(TOP_K);
if (fromCtx != null) {
return Integer.parseInt(fromCtx.toString());
}
else {
return this.defaultTopK;
}
}
@Override
public ChatClientResponse after(ChatClientResponse chatClientResponse, AdvisorChain advisorChain) {
List<Message> assistantMessages = new ArrayList<>();
if (chatClientResponse.chatResponse() != null) {
assistantMessages = chatClientResponse.chatResponse()
.getResults()
.stream()
.map(g -> (Message) g.getOutput())
.toList();
}
this.vectorStore.write(toDocuments(assistantMessages,
this.getConversationId(chatClientResponse.context(), this.defaultConversationId)));
return chatClientResponse;
}
@Override
public Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest,
StreamAdvisorChain streamAdvisorChain) {
// Get the scheduler from BaseAdvisor
Scheduler scheduler = this.getScheduler();
// Process the request with the before method
return Mono.just(chatClientRequest)
.publishOn(scheduler)
.map(request -> this.before(request, streamAdvisorChain))
.flatMapMany(streamAdvisorChain::nextStream)
.transform(flux -> new ChatClientMessageAggregator().aggregateChatClientResponse(flux,
response -> this.after(response, streamAdvisorChain)));
}
private List<Document> toDocuments(List<Message> messages, String conversationId) {
return messages.stream()
.filter(m -> m.getMessageType() == MessageType.USER || m.getMessageType() == MessageType.ASSISTANT)
.map(message -> {
Map<String, Object> metadata = new HashMap<>(
message.getMetadata() != null ? message.getMetadata() : new HashMap<>());
metadata.put(DOCUMENT_METADATA_CONVERSATION_ID, conversationId);
metadata.put(DOCUMENT_METADATA_MESSAGE_TYPE, message.getMessageType().name());
if (message instanceof UserMessage userMessage) {
return Document.builder()
.text(userMessage.getText())
// userMessage.getMedia().get(0).getId()
// TODO vector store for memory would not store this into the
// vector store, could store an 'id' instead
// .media(userMessage.getMedia())
.metadata(metadata)
.build();
}
else if (message instanceof AssistantMessage assistantMessage) {
return Document.builder().text(assistantMessage.getText()).metadata(metadata).build();
}
throw new RuntimeException("Unknown message type: " + message.getMessageType());
})
.toList();
}
/**
* Builder for VectorStoreChatMemoryAdvisor.
*/
public static final class Builder {
private PromptTemplate systemPromptTemplate = DEFAULT_SYSTEM_PROMPT_TEMPLATE;
private Integer defaultTopK = DEFAULT_TOP_K;
private String conversationId = ChatMemory.DEFAULT_CONVERSATION_ID;
private Scheduler scheduler = BaseAdvisor.DEFAULT_SCHEDULER;
private int order = Advisor.DEFAULT_CHAT_MEMORY_PRECEDENCE_ORDER;
private final VectorStore vectorStore;
/**
* Creates a new builder instance.
* @param vectorStore the vector store to use
*/
Builder(VectorStore vectorStore) {
this.vectorStore = vectorStore;
}
/**
* Set the system prompt template.
* @param systemPromptTemplate the system prompt template
* @return this builder
*/
public Builder systemPromptTemplate(PromptTemplate systemPromptTemplate) {
this.systemPromptTemplate = systemPromptTemplate;
return this;
}
/**
* Set the chat memory retrieve size.
* @param defaultTopK the chat memory retrieve size
* @return this builder
*/
public Builder defaultTopK(int defaultTopK) {
this.defaultTopK = defaultTopK;
return this;
}
/**
* Set the conversation id.
* @param conversationId the conversation id
* @return the builder
*/
public Builder conversationId(String conversationId) {
this.conversationId = conversationId;
return this;
}
public Builder scheduler(Scheduler scheduler) {
this.scheduler = scheduler;
return this;
}
/**
* Set the order.
* @param order the order
* @return the builder
*/
public Builder order(int order) {
this.order = order;
return this;
}
/**
* Build the advisor.
* @return the advisor
*/
public VectorStoreChatMemoryAdvisor build() {
return new VectorStoreChatMemoryAdvisor(this.systemPromptTemplate, this.defaultTopK, this.conversationId,
this.order, this.scheduler, this.vectorStore);
}
}
}
================================================
FILE: advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/package-info.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Spring AI chat client advisors package.
*/
@NullMarked
package org.springframework.ai.chat.client.advisor.vectorstore;
import org.jspecify.annotations.NullMarked;
================================================
FILE: advisors/spring-ai-advisors-vector-store/src/test/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisorTests.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.chat.client.advisor.vectorstore;
import java.time.Duration;
import java.util.List;
import java.util.Map;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.MessageType;
import org.springframework.ai.chat.metadata.ChatResponseMetadata;
import org.springframework.ai.chat.metadata.DefaultUsage;
import org.springframework.ai.chat.metadata.RateLimit;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.model.Generation;
import org.springframework.ai.chat.prompt.ChatOptions;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.ai.vectorstore.filter.FilterExpressionBuilder;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.when;
/**
* @author Christian Tzolov
* @author Timo Salm
* @author Alexandros Pappas
* @author Thomas Vitale
*/
@ExtendWith(MockitoExtension.class)
public class QuestionAnswerAdvisorTests {
@Mock
ChatModel chatModel;
@Captor
ArgumentCaptor<Prompt> promptCaptor;
@Captor
ArgumentCaptor<SearchRequest> vectorSearchCaptor;
@Mock
VectorStore vectorStore;
@Test
public void qaAdvisorWithDynamicFilterExpressions() {
when(this.chatModel.getDefaultOptions()).thenReturn(ChatOptions.builder().build());
// @formatter:off
given(this.chatModel.call(this.promptCaptor.capture()))
.willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("Your answer is ZXY"))),
ChatResponseMetadata.builder().id("678").model("model1").keyValue("key6", "value6").metadata(Map.of("key1", "value1")).promptMetadata(null).rateLimit(new RateLimit() {
@Override
public Long getRequestsLimit() {
return 5L;
}
@Override
public Long getRequestsRemaining() {
return 6L;
}
@Override
public Duration getRequestsReset() {
return Duration.ofSeconds(7);
}
@Override
public Long getTokensLimit() {
return 8L;
}
@Override
public Long getTokensRemaining() {
return 8L;
}
@Override
public Duration getTokensReset() {
return Duration.ofSeconds(9);
}
}).usage(new DefaultUsage(6, 7))
.build()));
// @formatter:on
given(this.vectorStore.similaritySearch(this.vectorSearchCaptor.capture()))
.willReturn(List.of(new Document("doc1"), new Document("doc2")));
var qaAdvisor = QuestionAnswerAdvisor.builder(this.vectorStore)
.searchRequest(SearchRequest.builder().similarityThreshold(0.99d).topK(6).build())
.build();
var chatClient = ChatClient.builder(this.chatModel)
.defaultSystem("Default system text.")
.defaultAdvisors(qaAdvisor)
.build();
// @formatter:off
var response = chatClient.prompt()
.user("Please answer my question XYZ")
.advisors(a -> a.param(QuestionAnswerAdvisor.FILTER_EXPRESSION, "type == 'Spring'"))
.call()
.chatResponse();
//formatter:on
// Ensure the metadata is correctly copied over
Assertions.assertThat(response.getMetadata().getModel()).isEqualTo("model1");
Assertions.assertThat(response.getMetadata().getId()).isEqualTo("678");
Assertions.assertThat(response.getMetadata().getRateLimit().getRequestsLimit()).isEqualTo(5L);
Assertions.assertThat(response.getMetadata().getRateLimit().getRequestsRemaining()).isEqualTo(6L);
Assertions.assertThat(response.getMetadata().getRateLimit().getRequestsReset()).isEqualTo(Duration.ofSeconds(7));
Assertions.assertThat(response.getMetadata().getRateLimit().getTokensLimit()).isEqualTo(8L);
Assertions.assertThat(response.getMetadata().getRateLimit().getTokensRemaining()).isEqualTo(8L);
Assertions.assertThat(response.getMetadata().getRateLimit().getTokensReset()).isEqualTo(Duration.ofSeconds(9));
Assertions.assertThat(response.getMetadata().getUsage().getPromptTokens()).isEqualTo(6L);
Assertions.assertThat(response.getMetadata().getUsage().getCompletionTokens()).isEqualTo(7L);
Assertions.assertThat(response.getMetadata().getUsage().getTotalTokens()).isEqualTo(6L + 7L);
Assertions.assertThat(response.getMetadata().get("key6").toString()).isEqualTo("value6");
Assertions.assertThat(response.getMetadata().get("key1").toString()).isEqualTo("value1");
String content = response.getResult().getOutput().getText();
assertThat(content).isEqualTo("Your answer is ZXY");
Message systemMessage = this.promptCaptor.getValue().getInstructions().get(0);
assertThat(systemMessage.getText()).isEqualToIgnoringWhitespace("""
Default system text.
""");
assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM);
Message userMessage = this.promptCaptor.getValue().getInstructions().get(1);
assertThat(userMessage.getText()).isEqualToIgnoringWhitespace("""
Please answer my question XYZ
Context information is below, surrounded by ---------------------
---------------------
doc1
doc2
---------------------
Given the context and provided history information and not prior knowledge,
reply to the user comment. If the answer is not in the context, inform
the user that you can't answer the question.
""");
Assertions.assertThat(this.vectorSearchCaptor.getValue().getFilterExpression()).isEqualTo(new FilterExpressionBuilder().eq("type", "Spring").build());
Assertions.assertThat(this.vectorSearchCaptor.getValue().getSimilarityThreshold()).isEqualTo(0.99d);
Assertions.assertThat(this.vectorSearchCaptor.getValue().getTopK()).isEqualTo(6);
}
@Test
public void qaAdvisorTakesUserTextParametersIntoAccountForSimilaritySearch() {
when(this.chatModel.getDefaultOptions()).thenReturn(ChatOptions.builder().build());
given(this.chatModel.call(this.promptCaptor.capture()))
.willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("Your answer is ZXY"))),
ChatResponseMetadata.builder().build()));
given(this.vectorStore.similaritySearch(this.vectorSearchCaptor.capture()))
.willReturn(List.of(new Document("doc1"), new Document("doc2")));
var chatClient = ChatClient.builder(this.chatModel).build();
var qaAdvisor = QuestionAnswerAdvisor.builder(this.vectorStore)
.searchRequest(SearchRequest.builder().build())
.build();
var userTextTemplate = "Please answer my question {question}";
// @formatter:off
chatClient.prompt()
.user(u -> u.text(userTextTemplate).param("question", "XYZ"))
.advisors(qaAdvisor)
.call()
.chatResponse();
//formatter:on
var expectedQuery = "Please answer my question XYZ";
var userPrompt = this.promptCaptor.getValue().getInstructions().get(0).getText();
assertThat(userPrompt).doesNotContain(userTextTemplate);
assertThat(userPrompt).contains(expectedQuery);
Assertions.assertThat(this.vectorSearchCaptor.getValue().getQuery()).isEqualTo(expectedQuery);
}
@Test
public void qaAdvisorTakesUserParameterizedUserMessagesIntoAccountForSimilaritySearch() {
when(this.chatModel.getDefaultOptions()).thenReturn(ChatOptions.builder().build());
given(this.chatModel.call(this.promptCaptor.capture()))
.willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("Your answer is ZXY"))),
ChatResponseMetadata.builder().build()));
given(this.vectorStore.similaritySearch(this.vectorSearchCaptor.capture()))
.willReturn(List.of(new Document("doc1"), new Document("doc2")));
var chatClient = ChatClient.builder(this.chatModel).build();
var qaAdvisor = QuestionAnswerAdvisor.builder(this.vectorStore)
.searchRequest(SearchRequest.builder().build())
.build();
var userTextTemplate = "Please answer my question {question}";
var userPromptTemplate = PromptTemplate.builder()
.template(userTextTemplate)
.variables(Map.of("question", "XYZ"))
.build();
var userMessage = userPromptTemplate.createMessage();
// @formatter:off
chatClient.prompt(new Prompt(userMessage))
.advisors(qaAdvisor)
.call()
.chatResponse();
//formatter:on
var expectedQuery = "Please answer my question XYZ";
var userPrompt = this.promptCaptor.getValue().getInstructions().get(0).getText();
assertThat(userPrompt).doesNotContain(userTextTemplate);
assertThat(userPrompt).contains(expectedQuery);
Assertions.assertThat(this.vectorSearchCaptor.getValue().getQuery()).isEqualTo(expectedQuery);
}
@Test
public void qaAdvisorWithMultipleFilterParameters() {
when(this.chatModel.getDefaultOptions()).thenReturn(ChatOptions.builder().build());
given(this.chatModel.call(this.promptCaptor.capture()))
.willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("Filtered response"))),
ChatResponseMetadata.builder().build()));
given(this.vectorStore.similaritySearch(this.vectorSearchCaptor.capture()))
.willReturn(List.of(new Document("doc1"), new Document("doc2")));
var qaAdvisor = QuestionAnswerAdvisor.builder(this.vectorStore)
.searchRequest(SearchRequest.builder().topK(10).build())
.build();
var chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(qaAdvisor)
.build();
chatClient.prompt()
.user("Complex query")
.advisors(a -> a.param(QuestionAnswerAdvisor.FILTER_EXPRESSION, "type == 'Documentation' AND status == 'Published'"))
.call()
.chatResponse();
var capturedFilter = this.vectorSearchCaptor.getValue().getFilterExpression();
assertThat(capturedFilter).isNotNull();
// The filter should be properly constructed with AND operation
assertThat(capturedFilter.toString()).contains("type");
assertThat(capturedFilter.toString()).contains("Documentation");
}
@Test
public void qaAdvisorWithDifferentSimilarityThresholds() {
when(this.chatModel.getDefaultOptions()).thenReturn(ChatOptions.builder().build());
given(this.chatModel.call(this.promptCaptor.capture()))
.willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("High threshold response"))),
ChatResponseMetadata.builder().build()));
given(this.vectorStore.similaritySearch(this.vectorSearchCaptor.capture()))
.willReturn(List.of(new Document("relevant doc")));
var qaAdvisor = QuestionAnswerAdvisor.builder(this.vectorStore)
.searchRequest(SearchRequest.builder().similarityThreshold(0.95).topK(3).build())
.build();
var chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(qaAdvisor)
.build();
chatClient.prompt()
.user("Specific question requiring high similarity")
.call()
.chatResponse();
assertThat(this.vectorSearchCaptor.getValue().getSimilarityThreshold()).isEqualTo(0.95);
assertThat(this.vectorSearchCaptor.getValue().getTopK()).isEqualTo(3);
}
@Test
public void qaAdvisorWithComplexParameterizedTemplate() {
when(this.chatModel.getDefaultOptions()).thenReturn(ChatOptions.builder().build());
given(this.chatModel.call(this.promptCaptor.capture()))
.willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("Complex template response"))),
ChatResponseMetadata.builder().build()));
given(this.vectorStore.similaritySearch(this.vectorSearchCaptor.capture()))
.willReturn(List.of(new Document("template doc")));
var qaAdvisor = QuestionAnswerAdvisor.builder(this.vectorStore)
.searchRequest(SearchRequest.builder().build())
.build();
var chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(qaAdvisor)
.build();
var complexTemplate = "Please analyze {topic} considering {aspect1} and {aspect2} for user {userId}";
chatClient.prompt()
.user(u -> u.text(complexTemplate)
.param("topic", "machine learning")
.param("aspect1", "performance")
.param("aspect2", "scalability")
.param("userId", "user1"))
.call()
.chatResponse();
var expectedQuery = "Please analyze machine learning considering performance and scalability for user user1";
assertThat(this.vectorSearchCaptor.getValue().getQuery()).isEqualTo(expectedQuery);
Message userMessage = this.promptCaptor.getValue().getInstructions().get(0);
assertThat(userMessage.getText()).contains(expectedQuery);
assertThat(userMessage.getText()).doesNotContain("{topic}");
assertThat(userMessage.getText()).doesNotContain("{aspect1}");
assertThat(userMessage.getText()).doesNotContain("{aspect2}");
assertThat(userMessage.getText()).doesNotContain("{userId}");
}
@Test
public void qaAdvisorWithDocumentsContainingMetadata() {
when(this.chatModel.getDefaultOptions()).thenReturn(ChatOptions.builder().build());
given(this.chatModel.call(this.promptCaptor.capture()))
.willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("Metadata response"))),
ChatResponseMetadata.builder().build()));
var docWithMetadata1 = new Document("First document content", Map.of("source", "wiki", "author", "John"));
var docWithMetadata2 = new Document("Second document content", Map.of("source", "manual", "version", "2.1"));
given(this.vectorStore.similaritySearch(this.vectorSearchCaptor.capture()))
.willReturn(List.of(docWithMetadata1, docWithMetadata2));
var qaAdvisor = QuestionAnswerAdvisor.builder(this.vectorStore)
.searchRequest(SearchRequest.builder().topK(2).build())
.build();
var chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(qaAdvisor)
.build();
chatClient.prompt()
.user("Question about documents with metadata")
.call()
.chatResponse();
Message userMessage = this.promptCaptor.getValue().getInstructions().get(0);
assertThat(userMessage.getText()).contains("First document content");
assertThat(userMessage.getText()).contains("Second document content");
}
@Test
public void qaAdvisorBuilderValidation() {
// Test that builder validates required parameters
Assertions.assertThatThrownBy(() -> QuestionAnswerAdvisor.builder(null))
.isInstanceOf(IllegalArgumentException.class);
// Test successful builder creation
var advisor = QuestionAnswerAdvisor.builder(this.vectorStore).build();
assertThat(advisor).isNotNull();
}
@Test
public void qaAdvisorWithZeroTopK() {
when(this.chatModel.getDefaultOptions()).thenReturn(ChatOptions.builder().build());
given(this.chatModel.call(this.promptCaptor.capture()))
.willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("Zero docs response"))),
ChatResponseMetadata.builder().build()));
given(this.vectorStore.similaritySearch(this.vectorSearchCaptor.capture()))
.willReturn(List.of());
var qaAdvisor = QuestionAnswerAdvisor.builder(this.vectorStore)
.searchRequest(SearchRequest.builder().topK(0).build())
.build();
var chatClient = ChatClient.builder(this.chatModel)
.defaultAdvisors(qaAdvisor)
.build();
chatClient.prompt()
.user("Question with zero topK")
.call()
.chatResponse();
assertThat(this.vectorSearchCaptor.getValue().getTopK()).isEqualTo(0);
}
}
================================================
FILE: advisors/spring-ai-advisors-vector-store/src/test/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisorTests.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.chat.client.advisor.vectorstore;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import reactor.core.scheduler.Scheduler;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.ai.vectorstore.VectorStore;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
/**
* Unit tests for {@link VectorStoreChatMemoryAdvisor}.
*
* @author Thomas Vitale
*/
class VectorStoreChatMemoryAdvisorTests {
@Test
void whenVectorStoreIsNullThenThrow() {
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(null).build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("vectorStore cannot be null");
}
@Test
void whenDefaultConversationIdIsNullThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).conversationId(null).build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("defaultConversationId cannot be null or empty");
}
@Test
void whenDefaultConversationIdIsEmptyThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).conversationId(null).build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("defaultConversationId cannot be null or empty");
}
@Test
void whenSchedulerIsNullThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).scheduler(null).build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("scheduler cannot be null");
}
@Test
void whenSystemPromptTemplateIsNullThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).systemPromptTemplate(null).build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("systemPromptTemplate cannot be null");
}
@Test
void whenDefaultTopKIsZeroThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).defaultTopK(0).build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("topK must be greater than 0");
}
@Test
void whenDefaultTopKIsNegativeThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).defaultTopK(-1).build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("topK must be greater than 0");
}
@Test
void whenBuilderWithValidVectorStoreThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore).build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderWithAllValidParametersThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
Scheduler scheduler = Mockito.mock(Scheduler.class);
PromptTemplate systemPromptTemplate = Mockito.mock(PromptTemplate.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.conversationId("test-conversation")
.scheduler(scheduler)
.systemPromptTemplate(systemPromptTemplate)
.defaultTopK(5)
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenDefaultConversationIdIsBlankThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).conversationId(" ").build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("defaultConversationId cannot be null or empty");
}
@Test
void whenBuilderWithValidConversationIdThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.conversationId("valid-id")
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderWithValidTopKThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.defaultTopK(10)
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderWithMinimumTopKThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore).defaultTopK(1).build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderWithLargeTopKThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.defaultTopK(1000)
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderCalledMultipleTimesWithSameVectorStoreThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
VectorStoreChatMemoryAdvisor advisor1 = VectorStoreChatMemoryAdvisor.builder(vectorStore).build();
VectorStoreChatMemoryAdvisor advisor2 = VectorStoreChatMemoryAdvisor.builder(vectorStore).build();
assertThat(advisor1).isNotNull();
assertThat(advisor2).isNotNull();
assertThat(advisor1).isNotSameAs(advisor2);
}
@Test
void whenBuilderWithCustomSchedulerThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
Scheduler customScheduler = Mockito.mock(Scheduler.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.scheduler(customScheduler)
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderWithCustomSystemPromptTemplateThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
PromptTemplate customTemplate = Mockito.mock(PromptTemplate.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.systemPromptTemplate(customTemplate)
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderWithEmptyStringConversationIdThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).conversationId("").build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("defaultConversationId cannot be null or empty");
}
@Test
void whenBuilderWithWhitespaceOnlyConversationIdThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).conversationId("\t\n\r ").build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("defaultConversationId cannot be null or empty");
}
@Test
void whenBuilderWithSpecialCharactersInConversationIdThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.conversationId("conversation-id_123@domain.com")
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderWithMaxIntegerTopKThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.defaultTopK(Integer.MAX_VALUE)
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderWithNegativeTopKThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore).defaultTopK(-100).build())
.isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("topK must be greater than 0");
}
@Test
void whenBuilderChainedWithAllParametersThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
Scheduler scheduler = Mockito.mock(Scheduler.class);
PromptTemplate systemPromptTemplate = Mockito.mock(PromptTemplate.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.conversationId("chained-test")
.defaultTopK(42)
.scheduler(scheduler)
.systemPromptTemplate(systemPromptTemplate)
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderParametersSetInDifferentOrderThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
Scheduler scheduler = Mockito.mock(Scheduler.class);
PromptTemplate systemPromptTemplate = Mockito.mock(PromptTemplate.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.systemPromptTemplate(systemPromptTemplate)
.defaultTopK(7)
.scheduler(scheduler)
.conversationId("order-test")
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderWithOverriddenParametersThenUseLastValue() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.conversationId("first-id")
.conversationId("second-id") // This should override the first
.defaultTopK(5)
.defaultTopK(10) // This should override the first
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderReusedThenCreatesSeparateInstances() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
// Simulate builder reuse (if the builder itself is stateful)
var builder = VectorStoreChatMemoryAdvisor.builder(vectorStore).conversationId("shared-config");
VectorStoreChatMemoryAdvisor advisor1 = builder.build();
VectorStoreChatMemoryAdvisor advisor2 = builder.build();
assertThat(advisor1).isNotNull();
assertThat(advisor2).isNotNull();
assertThat(advisor1).isNotSameAs(advisor2);
}
@Test
void whenBuilderWithLongConversationIdThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
String longId = "a".repeat(1000); // 1000 character conversation ID
VectorStoreChatMemoryAdvisor advisor = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.conversationId(longId)
.build();
assertThat(advisor).isNotNull();
}
@Test
void whenBuilderCalledWithNullAfterValidValueThenThrow() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
assertThatThrownBy(() -> VectorStoreChatMemoryAdvisor.builder(vectorStore)
.conversationId("valid-id")
.conversationId(null) // Set to null after valid value
.build()).isInstanceOf(IllegalArgumentException.class)
.hasMessageContaining("defaultConversationId cannot be null or empty");
}
@Test
void whenBuilderWithTopKBoundaryValuesThenSuccess() {
VectorStore vectorStore = Mockito.mock(VectorStore.class);
// Test with value 1 (minimum valid)
VectorStoreChatMemoryAdvisor advisor1 = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.defaultTopK(1)
.build();
// Test with a reasonable upper bound
VectorStoreChatMemoryAdvisor advisor2 = VectorStoreChatMemoryAdvisor.builder(vectorStore)
.defaultTopK(10000)
.build();
assertThat(advisor1).isNotNull();
assertThat(advisor2).isNotNull();
}
}
================================================
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
<relativePath>../../../pom.xml</relativePath>
</parent>
<artifactId>spring-ai-autoconfigure-retry</artifactId>
<packaging>jar</packaging>
<name>Spring AI Retry Auto Configuration</name>
<description>Spring AI Retry Auto Configuration</description>
<url>https://github.com/spring-projects/spring-ai</url>
<scm>
<url>https://github.com/spring-projects/spring-ai</url>
<connection>scm:git:git://github.com/spring-projects/spring-ai.git</connection>
<developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-ai.git</developerConnection>
</scm>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-retry</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!-- Boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- Test dependencies -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-test</artifactId>
<version>${project.parent.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-restclient-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
================================================
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/main/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryAutoConfiguration.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.retry.autoconfigure;
import java.io.IOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.retry.NonTransientAiException;
import org.springframework.ai.retry.RetryUtils;
import org.springframework.ai.retry.TransientAiException;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.core.retry.RetryListener;
import org.springframework.core.retry.RetryPolicy;
import org.springframework.core.retry.RetryTemplate;
import org.springframework.core.retry.Retryable;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StreamUtils;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.client.ResponseErrorHandler;
/**
* {@link AutoConfiguration Auto-configuration} for AI Retry. Provides beans for retry
* template and response error handling. Handles transient and non-transient exceptions
* based on HTTP status codes.
*
* @author Christian Tzolov
* @author SriVarshan P
* @author Seunggyu Lee
*/
@AutoConfiguration
@ConditionalOnClass(RetryUtils.class)
@EnableConfigurationProperties({ SpringAiRetryProperties.class })
public class SpringAiRetryAutoConfiguration {
private static final Logger logger = LoggerFactory.getLogger(SpringAiRetryAutoConfiguration.class);
@Bean
@ConditionalOnMissingBean
public RetryTemplate retryTemplate(SpringAiRetryProperties properties) {
RetryPolicy retryPolicy = RetryPolicy.builder()
.maxRetries(properties.getMaxAttempts())
.includes(TransientAiException.class)
.includes(ResourceAccessException.class)
.delay(properties.getBackoff().getInitialInterval())
.multiplier(properties.getBackoff().getMultiplier())
.maxDelay(properties.getBackoff().getMaxInterval())
.build();
RetryTemplate retryTemplate = new RetryTemplate(retryPolicy);
retryTemplate.setRetryListener(new RetryListener() {
private final AtomicInteger retryCount = new AtomicInteger(0);
@Override
public void onRetryFailure(RetryPolicy policy, Retryable<?> retryable, Throwable throwable) {
int currentRetries = this.retryCount.incrementAndGet();
logger.warn("Retry error. Retry count:{}", currentRetries, throwable);
}
});
return retryTemplate;
}
@Bean
@ConditionalOnMissingBean
public ResponseErrorHandler responseErrorHandler(SpringAiRetryProperties properties) {
return new ResponseErrorHandler() {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return response.getStatusCode().isError();
}
@Override
public void handleError(URI url, HttpMethod method, ClientHttpResponse response) throws IOException {
handleError(response);
}
@SuppressWarnings("removal")
public void handleError(ClientHttpResponse response) throws IOException {
if (!response.getStatusCode().isError()) {
return;
}
String error = StreamUtils.copyToString(response.getBody(), StandardCharsets.UTF_8);
if (error == null || error.isEmpty()) {
error = "No response body available";
}
String message = String.format("HTTP %s - %s", response.getStatusCode().value(), error);
// Explicitly configured transient codes
if (properties.getOnHttpCodes().contains(response.getStatusCode().value())) {
throw new TransientAiException(message);
}
// Handle client errors (4xx)
if (!properties.isOnClientErrors() && response.getStatusCode().is4xxClientError()) {
throw new NonTransientAiException(message);
}
// Explicitly configured non-transient codes
if (!CollectionUtils.isEmpty(properties.getExcludeOnHttpCodes())
&& properties.getExcludeOnHttpCodes().contains(response.getStatusCode().value())) {
throw new NonTransientAiException(message);
}
// Default to transient exception
throw new TransientAiException(message);
}
};
}
}
================================================
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/main/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryProperties.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.retry.autoconfigure;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
/**
* Properties for AI Retry.
*
* @author Christian Tzolov
*/
@ConfigurationProperties(SpringAiRetryProperties.CONFIG_PREFIX)
public class SpringAiRetryProperties {
public static final String CONFIG_PREFIX = "spring.ai.retry";
/**
* Maximum number of retry attempts.
*/
private int maxAttempts = 10;
/**
* Exponential Backoff properties.
*/
@NestedConfigurationProperty
private final Backoff backoff = new Backoff();
/**
* If false, throw a NonTransientAiException, and do not attempt retry for 4xx client
* error codes. False by default. If true, throw a TransientAiException, and attempt
* retry for 4xx client.
*/
private boolean onClientErrors = false;
/**
* List of HTTP status codes that should not trigger a retry (e.g. throw
* NonTransientAiException).
*/
private List<Integer> excludeOnHttpCodes = new ArrayList<>();
/**
* List of HTTP status codes that should trigger a retry.
*/
private List<Integer> onHttpCodes = new ArrayList<>();
public int getMaxAttempts() {
return this.maxAttempts;
}
public void setMaxAttempts(int maxAttempts) {
this.maxAttempts = maxAttempts;
}
public Backoff getBackoff() {
return this.backoff;
}
public List<Integer> getExcludeOnHttpCodes() {
return this.excludeOnHttpCodes;
}
public void setExcludeOnHttpCodes(List<Integer> onHttpCodes) {
this.excludeOnHttpCodes = onHttpCodes;
}
public boolean isOnClientErrors() {
return this.onClientErrors;
}
public void setOnClientErrors(boolean onClientErrors) {
this.onClientErrors = onClientErrors;
}
public List<Integer> getOnHttpCodes() {
return this.onHttpCodes;
}
public void setOnHttpCodes(List<Integer> onHttpCodes) {
this.onHttpCodes = onHttpCodes;
}
/**
* Exponential Backoff properties.
*/
public static class Backoff {
/**
* Initial sleep duration.
*/
private Duration initialInterval = Duration.ofMillis(2000);
/**
* Backoff interval multiplier.
*/
private int multiplier = 5;
/**
* Maximum backoff duration.
*/
private Duration maxInterval = Duration.ofMillis(3 * 60000);
public Duration getInitialInterval() {
return this.initialInterval;
}
public void setInitialInterval(Duration initialInterval) {
this.initialInterval = initialInterval;
}
public int getMultiplier() {
return this.multiplier;
}
public void setMultiplier(int multiplier) {
this.multiplier = multiplier;
}
public Duration getMaxInterval() {
return this.maxInterval;
}
public void setMaxInterval(Duration maxInterval) {
this.maxInterval = maxInterval;
}
}
}
================================================
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/main/java/org/springframework/ai/retry/autoconfigure/package-info.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@NullMarked
package org.springframework.ai.retry.autoconfigure;
import org.jspecify.annotations.NullMarked;
================================================
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
================================================
#
# Copyright 2023-present the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration
================================================
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/test/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryAutoConfigurationIT.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.retry.autoconfigure;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.restclient.autoconfigure.RestClientAutoConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.core.retry.RetryTemplate;
import org.springframework.web.client.ResponseErrorHandler;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Christian Tzolov
*/
public class SpringAiRetryAutoConfigurationIT {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withConfiguration(
AutoConfigurations.of(SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class));
@Test
void testRetryAutoConfiguration() {
this.contextRunner.run(context -> {
assertThat(context).hasSingleBean(RetryTemplate.class);
assertThat(context).hasSingleBean(ResponseErrorHandler.class);
});
}
}
================================================
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/test/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryPropertiesTests.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.retry.autoconfigure;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Unit Tests for {@link SpringAiRetryProperties}.
*
* @author Christian Tzolov
*/
public class SpringAiRetryPropertiesTests {
@Test
public void retryDefaultProperties() {
new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class))
.run(context -> {
var retryProperties = context.getBean(SpringAiRetryProperties.class);
assertThat(retryProperties.getMaxAttempts()).isEqualTo(10);
// do not retry on 4xx errors
assertThat(retryProperties.isOnClientErrors()).isFalse();
assertThat(retryProperties.getExcludeOnHttpCodes()).isEmpty();
assertThat(retryProperties.getOnHttpCodes()).isEmpty();
assertThat(retryProperties.getBackoff().getInitialInterval().toMillis()).isEqualTo(2000);
assertThat(retryProperties.getBackoff().getMultiplier()).isEqualTo(5);
assertThat(retryProperties.getBackoff().getMaxInterval().toMillis()).isEqualTo(3 * 60000);
});
}
@Test
public void retryCustomProperties() {
new ApplicationContextRunner().withPropertyValues(
// @formatter:off
"spring.ai.retry.max-attempts=100",
"spring.ai.retry.on-client-errors=false",
"spring.ai.retry.exclude-on-http-codes=404,500",
"spring.ai.retry.on-http-codes=429",
"spring.ai.retry.backoff.initial-interval=1000",
"spring.ai.retry.backoff.multiplier=2",
"spring.ai.retry.backoff.max-interval=60000")
// @formatter:on
.withConfiguration(AutoConfigurations.of(SpringAiRetryAutoConfiguration.class))
.run(context -> {
var retryProperties = context.getBean(SpringAiRetryProperties.class);
assertThat(retryProperties.getMaxAttempts()).isEqualTo(100);
assertThat(retryProperties.isOnClientErrors()).isFalse();
assertThat(retryProperties.getExcludeOnHttpCodes()).containsExactly(404, 500);
assertThat(retryProperties.getOnHttpCodes()).containsExactly(429);
assertThat(retryProperties.getBackoff().getInitialInterval().toMillis()).isEqualTo(1000);
assertThat(retryProperties.getBackoff().getMultiplier()).isEqualTo(2);
assertThat(retryProperties.getBackoff().getMaxInterval().toMillis()).isEqualTo(60000);
});
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-parent</artifactId>
<version>2.0.0-SNAPSHOT</version>
<relativePath>../../../pom.xml</relativePath>
</parent>
<artifactId>spring-ai-autoconfigure-mcp-client-common</artifactId>
<packaging>jar</packaging>
<name>Spring AI MCP Client Common Auto Configuration</name>
<description>Spring AI MCP Client Common Auto Configuration</description>
<url>https://github.com/spring-projects/spring-ai</url>
<scm>
<url>https://github.com/spring-projects/spring-ai</url>
<connection>scm:git:git://github.com/spring-projects/spring-ai.git</connection>
<developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-ai.git</developerConnection>
</scm>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-annotations</artifactId>
<version>${project.parent.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- Test dependencies -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-test</artifactId>
<version>${project.parent.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpAsyncToolsChangeEventEmmiter.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure;
import io.modelcontextprotocol.client.McpClient.AsyncSpec;
import io.modelcontextprotocol.util.Assert;
import reactor.core.publisher.Mono;
import org.springframework.ai.mcp.McpToolsChangedEvent;
import org.springframework.ai.mcp.customizer.McpClientCustomizer;
import org.springframework.context.ApplicationEventPublisher;
/**
* Emits {@link McpToolsChangedEvent} when the MCP Tools have changed for a given MCP
* connection.
*
* @author Christian Tzolov
*/
public class McpAsyncToolsChangeEventEmmiter implements McpClientCustomizer<AsyncSpec> {
private final ApplicationEventPublisher applicationEventPublisher;
public McpAsyncToolsChangeEventEmmiter(ApplicationEventPublisher applicationEventPublisher) {
Assert.notNull(applicationEventPublisher, "applicationEventPublisher must not be null");
this.applicationEventPublisher = applicationEventPublisher;
}
@Override
public void customize(String connectionName, AsyncSpec spec) {
spec.toolsChangeConsumer(tools -> {
this.applicationEventPublisher.publishEvent(new McpToolsChangedEvent(connectionName, tools));
return Mono.empty();
});
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpClientAutoConfiguration.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure;
import java.util.ArrayList;
import java.util.List;
import io.modelcontextprotocol.client.McpAsyncClient;
import io.modelcontextprotocol.client.McpClient;
import io.modelcontextprotocol.client.McpSyncClient;
import io.modelcontextprotocol.spec.McpSchema;
import org.springframework.ai.mcp.annotation.spring.ClientMcpAsyncHandlersRegistry;
import org.springframework.ai.mcp.annotation.spring.ClientMcpSyncHandlersRegistry;
import org.springframework.ai.mcp.client.common.autoconfigure.configurer.McpAsyncClientConfigurer;
import org.springframework.ai.mcp.client.common.autoconfigure.configurer.McpSyncClientConfigurer;
import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpClientCommonProperties;
import org.springframework.ai.mcp.customizer.McpClientCustomizer;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.util.CollectionUtils;
/**
* Auto-configuration for Model Context Protocol (MCP) client support.
*
* <p>
* This configuration class sets up the necessary beans for MCP client functionality,
* including both synchronous and asynchronous clients along with their respective tool
* callbacks. It is automatically enabled when the required classes are present on the
* classpath and can be explicitly disabled through properties.
*
* <p>
* Configuration Properties:
* <ul>
* <li>{@code spring.ai.mcp.client.enabled} - Enable/disable MCP client support (default:
* true)
* <li>{@code spring.ai.mcp.client.type} - Client type: SYNC or ASYNC (default: SYNC)
* <li>{@code spring.ai.mcp.client.name} - Client implementation name
* <li>{@code spring.ai.mcp.client.version} - Client implementation version
* <li>{@code spring.ai.mcp.client.request-timeout} - Request timeout duration
* <li>{@code spring.ai.mcp.client.initialized} - Whether to initialize clients on
* creation
* </ul>
*
* <p>
* The configuration is activated after the transport-specific auto-configurations (Stdio,
* SSE HTTP, and SSE WebFlux) to ensure proper initialization order. At least one
* transport must be available for the clients to be created.
*
* <p>
* Key features:
* <ul>
* <li>Synchronous and Asynchronous Client Support:
* <ul>
* <li>Creates and configures MCP clients based on available transports
* <li>Supports both blocking (sync) and non-blocking (async) operations
* <li>Automatic client initialization if enabled
* </ul>
* <li>Integration Support:
* <ul>
* <li>Sets up tool callbacks for Spring AI integration
* <li>Supports multiple named transports
* <li>Proper lifecycle management with automatic cleanup
* </ul>
* <li>Customization Options:
* <ul>
* <li>Extensible through {@link McpClientCustomizer<McpClient.SyncSpec>} and
* {@link McpClientCustomizer<McpClient.AsyncSpec>}
* <li>Configurable timeouts and client information
* <li>Support for custom transport implementations
* </ul>
* </ul>
*
* @see McpSyncClient
* @see McpAsyncClient
* @see McpClientCommonProperties
* @see McpClientCustomizer
* @see StdioTransportAutoConfiguration
*/
@AutoConfiguration
@EnableConfigurationProperties(McpClientCommonProperties.class)
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true",
matchIfMissing = true)
public class McpClientAutoConfiguration {
/**
* Create a dynamic client name based on the client name and the name of the server
* connection.
* @param clientName the client name as defined by the configuration
* @param serverConnectionName the name of the server connection being used by the
* client
* @return the connected client name
*/
private String connectedClientName(String clientName, String serverConnectionName) {
return clientName + " - " + serverConnectionName;
}
@Bean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "SYNC",
matchIfMissing = true)
public McpSyncToolsChangeEventEmmiter mcpSyncToolChangeEventEmmiter(
ApplicationEventPublisher applicationEventPublisher) {
return new McpSyncToolsChangeEventEmmiter(applicationEventPublisher);
}
/**
* Creates a list of {@link McpSyncClient} instances based on the available
* transports.
*
* <p>
* Each client is configured with:
* <ul>
* <li>Client information (name and version) from common properties
* <li>Request timeout settings
* <li>Custom configurations through {@link McpSyncClientConfigurer}
* </ul>
*
* <p>
* If initialization is enabled in properties, the clients are automatically
* initialized.
* @param mcpSyncClientConfigurer the configurer for customizing client creation
* @param commonProperties common MCP client properties
* @param transportsProvider provider of named MCP transports
* @return list of configured MCP sync clients
*/
@Bean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "SYNC",
matchIfMissing = true)
public List<McpSyncClient> mcpSyncClients(McpSyncClientConfigurer mcpSyncClientConfigurer,
McpClientCommonProperties commonProperties,
ObjectProvider<List<NamedClientMcpTransport>> transportsProvider,
ObjectProvider<ClientMcpSyncHandlersRegistry> clientMcpSyncHandlersRegistry) {
List<McpSyncClient> mcpSyncClients = new ArrayList<>();
List<NamedClientMcpTransport> namedTransports = transportsProvider.stream().flatMap(List::stream).toList();
if (!CollectionUtils.isEmpty(namedTransports)) {
for (NamedClientMcpTransport namedTransport : namedTransports) {
McpSchema.Implementation clientInfo = new McpSchema.Implementation(
this.connectedClientName(commonProperties.getName(), namedTransport.name()),
namedTransport.name(), commonProperties.getVersion());
McpClient.SyncSpec spec = McpClient.sync(namedTransport.transport())
.clientInfo(clientInfo)
.requestTimeout(commonProperties.getRequestTimeout());
clientMcpSyncHandlersRegistry.ifAvailable(registry -> spec
.sampling(samplingRequest -> registry.handleSampling(namedTransport.name(), samplingRequest))
.elicitation(
elicitationRequest -> registry.handleElicitation(namedTransport.name(), elicitationRequest))
.loggingConsumer(loggingMessageNotification -> registry.handleLogging(namedTransport.name(),
loggingMessageNotification))
.progressConsumer(progressNotification -> registry.handleProgress(namedTransport.name(),
progressNotification))
.toolsChangeConsumer(newTools -> registry.handleToolListChanged(namedTransport.name(), newTools))
.promptsChangeConsumer(
newPrompts -> registry.handlePromptListChanged(namedTransport.name(), newPrompts))
.resourcesChangeConsumer(
newResources -> registry.handleResourceListChanged(namedTransport.name(), newResources))
.capabilities(registry.getCapabilities(namedTransport.name())));
McpClient.SyncSpec customizedSpec = mcpSyncClientConfigurer.configure(namedTransport.name(), spec);
var client = customizedSpec.build();
if (commonProperties.isInitialized()) {
client.initialize();
}
mcpSyncClients.add(client);
}
}
return mcpSyncClients;
}
/**
* Creates a closeable wrapper for MCP sync clients to ensure proper resource cleanup.
* @param clients the list of MCP sync clients to manage
* @return a closeable wrapper for the clients
*/
@Bean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "SYNC",
matchIfMissing = true)
public CloseableMcpSyncClients makeSyncClientsClosable(List<McpSyncClient> clients) {
return new CloseableMcpSyncClients(clients);
}
/**
* Creates the default {@link McpSyncClientConfigurer} if none is provided.
*
* <p>
* This configurer aggregates all available
* {@link McpClientCustomizer<McpClient.SyncSpec>} instances to allow for
* customization of MCP sync client creation.
* @param customizerProvider provider of MCP sync client customizers
* @return the configured MCP sync client configurer
*/
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "SYNC",
matchIfMissing = true)
McpSyncClientConfigurer mcpSyncClientConfigurer(
ObjectProvider<McpClientCustomizer<McpClient.SyncSpec>> customizerProvider) {
return new McpSyncClientConfigurer(customizerProvider.orderedStream().toList());
}
// Async client configuration
@Bean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
public McpAsyncToolsChangeEventEmmiter mcpAsyncToolChangeEventEmmiter(
ApplicationEventPublisher applicationEventPublisher) {
return new McpAsyncToolsChangeEventEmmiter(applicationEventPublisher);
}
@Bean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
public List<McpAsyncClient> mcpAsyncClients(McpAsyncClientConfigurer mcpAsyncClientConfigurer,
McpClientCommonProperties commonProperties,
ObjectProvider<List<NamedClientMcpTransport>> transportsProvider,
ObjectProvider<ClientMcpAsyncHandlersRegistry> clientMcpAsyncHandlersRegistry) {
List<McpAsyncClient> mcpAsyncClients = new ArrayList<>();
List<NamedClientMcpTransport> namedTransports = transportsProvider.stream().flatMap(List::stream).toList();
if (!CollectionUtils.isEmpty(namedTransports)) {
for (NamedClientMcpTransport namedTransport : namedTransports) {
McpSchema.Implementation clientInfo = new McpSchema.Implementation(
this.connectedClientName(commonProperties.getName(), namedTransport.name()),
commonProperties.getVersion());
McpClient.AsyncSpec spec = McpClient.async(namedTransport.transport())
.clientInfo(clientInfo)
.requestTimeout(commonProperties.getRequestTimeout());
clientMcpAsyncHandlersRegistry.ifAvailable(registry -> spec
.sampling(samplingRequest -> registry.handleSampling(namedTransport.name(), samplingRequest))
.elicitation(
elicitationRequest -> registry.handleElicitation(namedTransport.name(), elicitationRequest))
.loggingConsumer(loggingMessageNotification -> registry.handleLogging(namedTransport.name(),
loggingMessageNotification))
.progressConsumer(progressNotification -> registry.handleProgress(namedTransport.name(),
progressNotification))
.toolsChangeConsumer(newTools -> registry.handleToolListChanged(namedTransport.name(), newTools))
.promptsChangeConsumer(
newPrompts -> registry.handlePromptListChanged(namedTransport.name(), newPrompts))
.resourcesChangeConsumer(
newResources -> registry.handleResourceListChanged(namedTransport.name(), newResources))
.capabilities(registry.getCapabilities(namedTransport.name())));
McpClient.AsyncSpec customizedSpec = mcpAsyncClientConfigurer.configure(namedTransport.name(), spec);
var client = customizedSpec.build();
if (commonProperties.isInitialized()) {
client.initialize().block();
}
mcpAsyncClients.add(client);
}
}
return mcpAsyncClients;
}
@Bean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
public CloseableMcpAsyncClients makeAsyncClientsClosable(List<McpAsyncClient> clients) {
return new CloseableMcpAsyncClients(clients);
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
McpAsyncClientConfigurer mcpAsyncClientConfigurer(
ObjectProvider<McpClientCustomizer<McpClient.AsyncSpec>> customizerProvider) {
return new McpAsyncClientConfigurer(customizerProvider.orderedStream().toList());
}
/**
* Record class that implements {@link AutoCloseable} to ensure proper cleanup of MCP
* clients.
*
* <p>
* This class is responsible for closing all MCP sync clients when the application
* context is closed, preventing resource leaks.
*/
public record CloseableMcpSyncClients(List<McpSyncClient> clients) implements AutoCloseable {
@Override
public void close() {
this.clients.forEach(McpSyncClient::close);
}
}
public record CloseableMcpAsyncClients(List<McpAsyncClient> clients) implements AutoCloseable {
@Override
public void close() {
this.clients.forEach(McpAsyncClient::close);
}
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpSseClientConnectionDetails.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure;
import java.util.Map;
import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpSseClientProperties;
import org.springframework.boot.autoconfigure.service.connection.ConnectionDetails;
/**
* Connection details for an MCP client.
*
* @author Eddú Meléndez
*/
public interface McpSseClientConnectionDetails extends ConnectionDetails {
Map<String, McpSseClientProperties.SseParameters> getConnections();
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpSyncToolsChangeEventEmmiter.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure;
import io.modelcontextprotocol.client.McpClient.SyncSpec;
import io.modelcontextprotocol.util.Assert;
import org.springframework.ai.mcp.McpToolsChangedEvent;
import org.springframework.ai.mcp.customizer.McpClientCustomizer;
import org.springframework.context.ApplicationEventPublisher;
/**
* Emits {@link McpToolsChangedEvent} when the MCP Tools have changed for a given MCP
* connection.
*
* @author Christian Tzolov
*/
public class McpSyncToolsChangeEventEmmiter implements McpClientCustomizer<SyncSpec> {
private final ApplicationEventPublisher applicationEventPublisher;
public McpSyncToolsChangeEventEmmiter(ApplicationEventPublisher applicationEventPublisher) {
Assert.notNull(applicationEventPublisher, "applicationEventPublisher must not be null");
this.applicationEventPublisher = applicationEventPublisher;
}
@Override
public void customize(String connectionName, SyncSpec spec) {
spec.toolsChangeConsumer(
tools -> this.applicationEventPublisher.publishEvent(new McpToolsChangedEvent(connectionName, tools)));
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpToolCallbackAutoConfiguration.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure;
import java.util.List;
import io.modelcontextprotocol.client.McpAsyncClient;
import io.modelcontextprotocol.client.McpSyncClient;
import org.springframework.ai.mcp.AsyncMcpToolCallbackProvider;
import org.springframework.ai.mcp.DefaultMcpToolNamePrefixGenerator;
import org.springframework.ai.mcp.McpToolFilter;
import org.springframework.ai.mcp.McpToolNamePrefixGenerator;
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.ai.mcp.ToolContextToMcpMetaConverter;
import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpClientCommonProperties;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.AllNestedConditions;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
/**
* Responsible to convert MCP (sync and async) clients into Spring AI
* ToolCallbacksProviders. These providers are used by Spring AI to discover and execute
* tools.
*/
@AutoConfiguration
@EnableConfigurationProperties(McpClientCommonProperties.class)
@Conditional(McpToolCallbackAutoConfiguration.McpToolCallbackAutoConfigurationCondition.class)
public class McpToolCallbackAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public McpToolNamePrefixGenerator defaultMcpToolNamePrefixGenerator() {
return new DefaultMcpToolNamePrefixGenerator();
}
/**
* Creates tool callbacks for all configured MCP clients.
*
* <p>
* These callbacks enable integration with Spring AI's tool execution framework,
* allowing MCP tools to be used as part of AI interactions.
* @param syncClientsToolFilter list of {@link McpToolFilter}s for the sync client to
* filter the discovered tools
* @param syncMcpClients provider of MCP sync clients
* @param mcpToolNamePrefixGenerator the tool name prefix generator
* @return list of tool callbacks for MCP integration
*/
@Bean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "SYNC",
matchIfMissing = true)
public SyncMcpToolCallbackProvider mcpToolCallbacks(ObjectProvider<McpToolFilter> syncClientsToolFilter,
ObjectProvider<List<McpSyncClient>> syncMcpClients,
ObjectProvider<McpToolNamePrefixGenerator> mcpToolNamePrefixGenerator,
ObjectProvider<ToolContextToMcpMetaConverter> toolContextToMcpMetaConverter) {
List<McpSyncClient> mcpClients = syncMcpClients.stream().flatMap(List::stream).toList();
return SyncMcpToolCallbackProvider.builder()
.mcpClients(mcpClients)
.toolFilter(syncClientsToolFilter.getIfUnique((() -> (McpSyncClient, tool) -> true)))
.toolNamePrefixGenerator(
mcpToolNamePrefixGenerator.getIfUnique(() -> McpToolNamePrefixGenerator.noPrefix()))
.toolContextToMcpMetaConverter(
toolContextToMcpMetaConverter.getIfUnique(() -> ToolContextToMcpMetaConverter.defaultConverter()))
.build();
}
@Bean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
public AsyncMcpToolCallbackProvider mcpAsyncToolCallbacks(ObjectProvider<McpToolFilter> asyncClientsToolFilter,
ObjectProvider<List<McpAsyncClient>> mcpClientsProvider,
ObjectProvider<McpToolNamePrefixGenerator> toolNamePrefixGenerator,
ObjectProvider<ToolContextToMcpMetaConverter> toolContextToMcpMetaConverter) { // TODO
List<McpAsyncClient> mcpClients = mcpClientsProvider.stream().flatMap(List::stream).toList();
return AsyncMcpToolCallbackProvider.builder()
.toolFilter(asyncClientsToolFilter.getIfUnique(() -> (McpAsyncClient, tool) -> true))
.toolNamePrefixGenerator(toolNamePrefixGenerator.getIfUnique(() -> McpToolNamePrefixGenerator.noPrefix()))
.toolContextToMcpMetaConverter(
toolContextToMcpMetaConverter.getIfUnique(() -> ToolContextToMcpMetaConverter.defaultConverter()))
.mcpClients(mcpClients)
.build();
}
public static class McpToolCallbackAutoConfigurationCondition extends AllNestedConditions {
public McpToolCallbackAutoConfigurationCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION);
}
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true",
matchIfMissing = true)
static class McpAutoConfigEnabled {
}
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX + ".toolcallback", name = "enabled",
havingValue = "true", matchIfMissing = true)
static class ToolCallbackProviderEnabled {
}
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/NamedClientMcpTransport.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure;
import io.modelcontextprotocol.spec.McpClientTransport;
/**
* A named MCP client transport. Usually created by the transport auto-configurations, but
* you can also create them manually.
*
* @param name the name of the transport. Usually the name of the server connection.
* @param transport the MCP client transport.
* @author Christian Tzolov
* @since 1.0.0
*/
public record NamedClientMcpTransport(String name, McpClientTransport transport) {
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/PropertiesMcpSseClientConnectionDetails.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure;
import java.util.Map;
import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpSseClientProperties;
public class PropertiesMcpSseClientConnectionDetails implements McpSseClientConnectionDetails {
private final McpSseClientProperties properties;
public PropertiesMcpSseClientConnectionDetails(McpSseClientProperties properties) {
this.properties = properties;
}
@Override
public Map<String, McpSseClientProperties.SseParameters> getConnections() {
return this.properties.getConnections();
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/StdioTransportAutoConfiguration.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import io.modelcontextprotocol.client.transport.ServerParameters;
import io.modelcontextprotocol.client.transport.StdioClientTransport;
import io.modelcontextprotocol.json.jackson3.JacksonMcpJsonMapper;
import tools.jackson.databind.json.JsonMapper;
import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpClientCommonProperties;
import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpStdioClientProperties;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
/**
* Auto-configuration for Standard Input/Output (stdio) transport in the Model Context
* Protocol (MCP).
*
* <p>
* This configuration class sets up the necessary beans for stdio-based transport,
* enabling communication with MCP servers through standard input and output streams.
*
* <p>
* Key features:
* <ul>
* <li>Creates stdio transports for configured MCP server connections
* <li>Supports multiple named server connections with different parameters
* <li>Configures transport with server-specific parameters
* </ul>
*
* @see StdioClientTransport
* @see McpStdioClientProperties
*/
@AutoConfiguration
@EnableConfigurationProperties({ McpStdioClientProperties.class, McpClientCommonProperties.class })
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true",
matchIfMissing = true)
public class StdioTransportAutoConfiguration {
/**
* Creates a list of stdio-based transports for MCP communication.
*
* <p>
* Each transport is configured with:
* <ul>
* <li>Server-specific parameters from properties
* <li>Unique connection name for identification
* </ul>
* @param stdioProperties the stdio client properties containing server configurations
* @return list of named MCP transports
*/
@Bean
public List<NamedClientMcpTransport> stdioTransports(McpStdioClientProperties stdioProperties) {
List<NamedClientMcpTransport> stdioTransports = new ArrayList<>();
for (Map.Entry<String, ServerParameters> serverParameters : stdioProperties.toServerParameters().entrySet()) {
var transport = new StdioClientTransport(serverParameters.getValue(),
new JacksonMcpJsonMapper(JsonMapper.shared()));
stdioTransports.add(new NamedClientMcpTransport(serverParameters.getKey(), transport));
}
return stdioTransports;
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientAnnotationScannerAutoConfiguration.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure.annotations;
import java.lang.annotation.Annotation;
import java.util.Set;
import org.jspecify.annotations.Nullable;
import org.springframework.ai.mcp.annotation.McpElicitation;
import org.springframework.ai.mcp.annotation.McpLogging;
import org.springframework.ai.mcp.annotation.McpProgress;
import org.springframework.ai.mcp.annotation.McpPromptListChanged;
import org.springframework.ai.mcp.annotation.McpResourceListChanged;
import org.springframework.ai.mcp.annotation.McpSampling;
import org.springframework.ai.mcp.annotation.McpToolListChanged;
import org.springframework.ai.mcp.annotation.spring.ClientMcpAsyncHandlersRegistry;
import org.springframework.ai.mcp.annotation.spring.ClientMcpSyncHandlersRegistry;
import org.springframework.ai.mcp.annotation.spring.scan.AbstractAnnotatedMethodBeanFactoryInitializationAotProcessor;
import org.springframework.ai.mcp.annotation.spring.scan.AbstractMcpAnnotatedBeans;
import org.springframework.ai.mcp.client.common.autoconfigure.properties.McpClientCommonProperties;
import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportRuntimeHints;
/**
* @author Christian Tzolov
* @author Josh Long
* @author Fu Jian
*/
@AutoConfiguration
@ConditionalOnClass(McpLogging.class)
@ConditionalOnProperty(prefix = McpClientAnnotationScannerProperties.CONFIG_PREFIX, name = "enabled",
havingValue = "true", matchIfMissing = true)
@EnableConfigurationProperties(McpClientAnnotationScannerProperties.class)
@ImportRuntimeHints(McpClientAnnotationScannerAutoConfiguration.AnnotationHints.class)
public class McpClientAnnotationScannerAutoConfiguration {
private static final Set<Class<? extends Annotation>> CLIENT_MCP_ANNOTATIONS = Set.of(McpLogging.class,
McpSampling.class, McpElicitation.class, McpProgress.class, McpToolListChanged.class,
McpResourceListChanged.class, McpPromptListChanged.class);
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "SYNC",
matchIfMissing = true)
public ClientMcpSyncHandlersRegistry clientMcpSyncHandlersRegistry() {
return new ClientMcpSyncHandlersRegistry();
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PREFIX, name = "type", havingValue = "ASYNC")
public ClientMcpAsyncHandlersRegistry clientMcpAsyncHandlersRegistry() {
return new ClientMcpAsyncHandlersRegistry();
}
@Bean
static ClientAnnotatedBeanFactoryInitializationAotProcessor clientAnnotatedBeanFactoryInitializationAotProcessor() {
return new ClientAnnotatedBeanFactoryInitializationAotProcessor(CLIENT_MCP_ANNOTATIONS);
}
public static class ClientMcpAnnotatedBeans extends AbstractMcpAnnotatedBeans {
}
public static class ClientAnnotatedBeanFactoryInitializationAotProcessor
extends AbstractAnnotatedMethodBeanFactoryInitializationAotProcessor {
public ClientAnnotatedBeanFactoryInitializationAotProcessor(
Set<Class<? extends Annotation>> targetAnnotations) {
super(targetAnnotations);
}
}
static class AnnotationHints implements RuntimeHintsRegistrar {
@Override
public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) {
CLIENT_MCP_ANNOTATIONS.forEach(an -> hints.reflection().registerType(an, MemberCategory.values()));
}
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientAnnotationScannerProperties.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure.annotations;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author Christian Tzolov
*/
@ConfigurationProperties(prefix = McpClientAnnotationScannerProperties.CONFIG_PREFIX)
public class McpClientAnnotationScannerProperties {
public static final String CONFIG_PREFIX = "spring.ai.mcp.client.annotation-scanner";
private boolean enabled = true;
public boolean isEnabled() {
return this.enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/package-info.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@NullMarked
package org.springframework.ai.mcp.client.common.autoconfigure.annotations;
import org.jspecify.annotations.NullMarked;
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/aot/McpClientAutoConfigurationRuntimeHints.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure.aot;
import org.jspecify.annotations.Nullable;
import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import static org.springframework.ai.aot.AiRuntimeHints.findJsonAnnotatedClassesInPackage;
/**
* @author Josh Long
* @author Soby Chacko
* @author Christian Tzolov
*/
public class McpClientAutoConfigurationRuntimeHints implements RuntimeHintsRegistrar {
@Override
public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) {
hints.resources().registerPattern("**.json");
var mcs = MemberCategory.values();
for (var tr : findJsonAnnotatedClassesInPackage("org.springframework.ai.mcp.client.common.autoconfigure")) {
hints.reflection().registerType(tr, mcs);
}
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/aot/package-info.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
@NullMarked
package org.springframework.ai.mcp.client.common.autoconfigure.aot;
import org.jspecify.annotations.NullMarked;
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/configurer/McpAsyncClientConfigurer.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.ai.mcp.client.common.autoconfigure.configurer;
import java.util.List;
import io.modelcontextprotocol.client.McpClient;
import org.springframework.ai.mcp.customizer.McpClientCustomizer;
import org.springframework.util.Assert;
public class McpAsyncClientConfigurer {
private List<McpClientCustomizer<McpClient.AsyncSpec>> customizers;
public McpAsyncClientConfigurer(List<McpClientCustomizer<McpClient.AsyncSpec>> customizers) {
Assert.notNull(customizers, "customizers must not be null");
this.customizers = customizers;
}
public McpClient.AsyncSpec configure(String name, McpClient.AsyncSpec spec) {
applyCustomizers(name, spec);
return spec;
}
private void applyCustomizers(String name, McpClient.AsyncSpec spec) {
if (this.customizers != null) {
for (McpClientCustomizer<McpClient.AsyncSpec> customizer : this.customizers) {
customizer.customize(name, spec);
}
}
}
}
================================================
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/configurer/McpSyncClientConfigurer.java
================================================
/*
* Copyright 2023-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BAS
Showing preview only (397K chars total). Download the full file or copy to clipboard to get everything.
gitextract_2jlwg2th/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ ├── feature_request.md │ │ └── miscellaneous.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── dco.yml │ ├── release-files-spec.json │ └── workflows/ │ ├── artifactory-milestone-release.yml │ ├── auto-cherry-pick.yml │ ├── backport-issue.yml │ ├── continuous-integration.yml │ ├── dependency-ci-dashboard.yml │ ├── deploy-docs.yml │ ├── documentation-upload.yml │ ├── maven-central-release.yml │ ├── mcp-integration-tests.yml │ └── pr-check.yml ├── .gitignore ├── .mvn/ │ ├── extensions.xml │ ├── jvm.config │ ├── maven-build-cache-config.xml │ └── wrapper/ │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── .sdkmanrc ├── CONTRIBUTING.adoc ├── LICENSE.txt ├── README.md ├── advisors/ │ └── spring-ai-advisors-vector-store/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── chat/ │ │ └── client/ │ │ └── advisor/ │ │ └── vectorstore/ │ │ ├── QuestionAnswerAdvisor.java │ │ ├── VectorStoreChatMemoryAdvisor.java │ │ └── package-info.java │ └── test/ │ └── java/ │ └── org/ │ └── springframework/ │ └── ai/ │ └── chat/ │ └── client/ │ └── advisor/ │ └── vectorstore/ │ ├── QuestionAnswerAdvisorTests.java │ └── VectorStoreChatMemoryAdvisorTests.java ├── auto-configurations/ │ ├── common/ │ │ └── spring-ai-autoconfigure-retry/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── retry/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── SpringAiRetryAutoConfiguration.java │ │ │ │ ├── SpringAiRetryProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── retry/ │ │ └── autoconfigure/ │ │ ├── SpringAiRetryAutoConfigurationIT.java │ │ └── SpringAiRetryPropertiesTests.java │ ├── mcp/ │ │ ├── spring-ai-autoconfigure-mcp-client-common/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── mcp/ │ │ │ │ │ └── client/ │ │ │ │ │ └── common/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── McpAsyncToolsChangeEventEmmiter.java │ │ │ │ │ ├── McpClientAutoConfiguration.java │ │ │ │ │ ├── McpSseClientConnectionDetails.java │ │ │ │ │ ├── McpSyncToolsChangeEventEmmiter.java │ │ │ │ │ ├── McpToolCallbackAutoConfiguration.java │ │ │ │ │ ├── NamedClientMcpTransport.java │ │ │ │ │ ├── PropertiesMcpSseClientConnectionDetails.java │ │ │ │ │ ├── StdioTransportAutoConfiguration.java │ │ │ │ │ ├── annotations/ │ │ │ │ │ │ ├── McpClientAnnotationScannerAutoConfiguration.java │ │ │ │ │ │ ├── McpClientAnnotationScannerProperties.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── aot/ │ │ │ │ │ │ ├── McpClientAutoConfigurationRuntimeHints.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── configurer/ │ │ │ │ │ │ ├── McpAsyncClientConfigurer.java │ │ │ │ │ │ ├── McpSyncClientConfigurer.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ └── properties/ │ │ │ │ │ ├── McpClientCommonProperties.java │ │ │ │ │ ├── McpSseClientProperties.java │ │ │ │ │ ├── McpStdioClientProperties.java │ │ │ │ │ ├── McpStreamableHttpClientProperties.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ ├── aot.factories │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── mcp/ │ │ │ │ └── client/ │ │ │ │ └── common/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── McpClientAutoConfigurationIT.java │ │ │ │ ├── McpClientAutoConfigurationRuntimeHintsTests.java │ │ │ │ ├── McpToolCallbackAutoConfigurationConditionTests.java │ │ │ │ ├── McpToolCallbackAutoConfigurationTests.java │ │ │ │ ├── annotations/ │ │ │ │ │ └── McpClientListChangedAnnotationsScanningIT.java │ │ │ │ └── properties/ │ │ │ │ ├── McpClientCommonPropertiesTests.java │ │ │ │ └── McpSseClientPropertiesTests.java │ │ │ └── resources/ │ │ │ ├── application-test.properties │ │ │ ├── nested/ │ │ │ │ └── nested-config.json │ │ │ └── test-config.json │ │ ├── spring-ai-autoconfigure-mcp-client-httpclient/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── mcp/ │ │ │ │ │ └── client/ │ │ │ │ │ └── httpclient/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── SseHttpClientTransportAutoConfiguration.java │ │ │ │ │ ├── StreamableHttpHttpClientTransportAutoConfiguration.java │ │ │ │ │ ├── aot/ │ │ │ │ │ │ ├── McpClientAutoConfigurationRuntimeHints.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ ├── aot.factories │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── mcp/ │ │ │ │ └── client/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── SseHttpClientTransportAutoConfigurationIT.java │ │ │ │ ├── SseHttpClientTransportAutoConfigurationTests.java │ │ │ │ ├── StreamableHttpHttpClientTransportAutoConfigurationIT.java │ │ │ │ └── StreamableHttpHttpClientTransportAutoConfigurationTests.java │ │ │ └── resources/ │ │ │ ├── application-test.properties │ │ │ ├── nested/ │ │ │ │ └── nested-config.json │ │ │ └── test-config.json │ │ ├── spring-ai-autoconfigure-mcp-client-webflux/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── mcp/ │ │ │ │ │ └── client/ │ │ │ │ │ └── webflux/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── SseWebFluxTransportAutoConfiguration.java │ │ │ │ │ ├── StreamableHttpWebFluxTransportAutoConfiguration.java │ │ │ │ │ ├── aot/ │ │ │ │ │ │ ├── McpClientAutoConfigurationRuntimeHints.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ ├── aot.factories │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── mcp/ │ │ │ │ └── client/ │ │ │ │ └── webflux/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── McpToolsConfigurationTests.java │ │ │ │ ├── SseWebFluxTransportAutoConfigurationIT.java │ │ │ │ ├── SseWebFluxTransportAutoConfigurationTests.java │ │ │ │ ├── StreamableHttpHttpClientTransportAutoConfigurationIT.java │ │ │ │ └── StreamableHttpWebFluxTransportAutoConfigurationTests.java │ │ │ └── resources/ │ │ │ ├── application-test.properties │ │ │ ├── nested/ │ │ │ │ └── nested-config.json │ │ │ └── test-config.json │ │ ├── spring-ai-autoconfigure-mcp-server-common/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── mcp/ │ │ │ │ │ └── server/ │ │ │ │ │ └── common/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── McpServerAutoConfiguration.java │ │ │ │ │ ├── McpServerJsonMapperAutoConfiguration.java │ │ │ │ │ ├── McpServerStatelessAutoConfiguration.java │ │ │ │ │ ├── McpServerStdioDisabledCondition.java │ │ │ │ │ ├── StatelessToolCallbackConverterAutoConfiguration.java │ │ │ │ │ ├── ToolCallbackConverterAutoConfiguration.java │ │ │ │ │ ├── ToolCallbackUtils.java │ │ │ │ │ ├── annotations/ │ │ │ │ │ │ ├── McpServerAnnotationScannerAutoConfiguration.java │ │ │ │ │ │ ├── McpServerAnnotationScannerProperties.java │ │ │ │ │ │ ├── McpServerSpecificationFactoryAutoConfiguration.java │ │ │ │ │ │ ├── StatelessServerSpecificationFactoryAutoConfiguration.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── package-info.java │ │ │ │ │ └── properties/ │ │ │ │ │ ├── McpServerChangeNotificationProperties.java │ │ │ │ │ ├── McpServerProperties.java │ │ │ │ │ ├── McpServerSseProperties.java │ │ │ │ │ ├── McpServerStreamableHttpProperties.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── mcp/ │ │ │ └── server/ │ │ │ └── common/ │ │ │ └── autoconfigure/ │ │ │ ├── McpServerAutoConfigurationIT.java │ │ │ ├── McpServerJsonMapperAutoConfigurationIT.java │ │ │ ├── McpStatelessServerAutoConfigurationIT.java │ │ │ ├── McpToolWithStdioIT.java │ │ │ ├── StatelessToolCallbackConverterAutoConfigurationIT.java │ │ │ └── ToolCallbackConverterAutoConfigurationIT.java │ │ ├── spring-ai-autoconfigure-mcp-server-webflux/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── mcp/ │ │ │ │ │ └── server/ │ │ │ │ │ └── webflux/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── McpServerSseWebFluxAutoConfiguration.java │ │ │ │ │ ├── McpServerStatelessWebFluxAutoConfiguration.java │ │ │ │ │ ├── McpServerStreamableHttpWebFluxAutoConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── mcp/ │ │ │ └── server/ │ │ │ └── webflux/ │ │ │ └── autoconfigure/ │ │ │ ├── McpServerSseWebFluxAutoConfigurationIT.java │ │ │ ├── McpServerSseWebFluxAutoConfigurationTests.java │ │ │ ├── McpServerStatelessWebFluxAutoConfigurationIT.java │ │ │ ├── McpServerStreamableHttpWebFluxAutoConfigurationIT.java │ │ │ ├── McpToolCallProviderCachingIT.java │ │ │ ├── McpToolCallbackParameterlessToolIT.java │ │ │ ├── SseWebClientWebFluxServerIT.java │ │ │ ├── StatelessWebClientWebFluxServerIT.java │ │ │ ├── StreamableMcpAnnotations2IT.java │ │ │ ├── StreamableMcpAnnotationsIT.java │ │ │ ├── StreamableMcpAnnotationsManualIT.java │ │ │ ├── StreamableMcpAnnotationsWithLLMIT.java │ │ │ ├── StreamableWebClientWebFluxServerIT.java │ │ │ └── capabilities/ │ │ │ ├── McpHandlerConfiguration.java │ │ │ └── McpHandlerService.java │ │ └── spring-ai-autoconfigure-mcp-server-webmvc/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── mcp/ │ │ │ │ └── server/ │ │ │ │ └── webmvc/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── McpServerSseWebMvcAutoConfiguration.java │ │ │ │ ├── McpServerStatelessWebMvcAutoConfiguration.java │ │ │ │ ├── McpServerStreamableHttpWebMvcAutoConfiguration.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── mcp/ │ │ └── server/ │ │ └── webmvc/ │ │ └── autoconfigure/ │ │ ├── McpServerSseWebMvcAutoConfigurationIT.java │ │ ├── McpServerStatelessWebMvcAutoConfigurationIT.java │ │ └── McpServerStreamableHttpWebMvcAutoConfigurationIT.java │ ├── models/ │ │ ├── chat/ │ │ │ ├── client/ │ │ │ │ └── spring-ai-autoconfigure-model-chat-client/ │ │ │ │ ├── pom.xml │ │ │ │ └── src/ │ │ │ │ ├── main/ │ │ │ │ │ ├── java/ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ └── client/ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ ├── ChatClientAutoConfiguration.java │ │ │ │ │ │ ├── ChatClientBuilderConfigurer.java │ │ │ │ │ │ ├── ChatClientBuilderProperties.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── resources/ │ │ │ │ │ └── META-INF/ │ │ │ │ │ ├── additional-spring-configuration-metadata.json │ │ │ │ │ └── spring/ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ └── test/ │ │ │ │ └── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── model/ │ │ │ │ └── chat/ │ │ │ │ └── client/ │ │ │ │ └── autoconfigure/ │ │ │ │ └── ChatClientObservationAutoConfigurationTests.java │ │ │ ├── memory/ │ │ │ │ ├── repository/ │ │ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory-repository-cassandra/ │ │ │ │ │ │ ├── pom.xml │ │ │ │ │ │ └── src/ │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ ├── java/ │ │ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ │ │ └── repository/ │ │ │ │ │ │ │ │ └── cassandra/ │ │ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ │ │ ├── CassandraChatMemoryRepositoryAutoConfiguration.java │ │ │ │ │ │ │ │ ├── CassandraChatMemoryRepositoryProperties.java │ │ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ │ │ └── resources/ │ │ │ │ │ │ │ └── META-INF/ │ │ │ │ │ │ │ └── spring/ │ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── java/ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ └── repository/ │ │ │ │ │ │ └── cassandra/ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ ├── CassandraChatMemoryRepositoryAutoConfigurationIT.java │ │ │ │ │ │ └── CassandraChatMemoryRepositoryPropertiesTest.java │ │ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory-repository-cosmos-db/ │ │ │ │ │ │ ├── pom.xml │ │ │ │ │ │ └── src/ │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ ├── java/ │ │ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ │ │ └── repository/ │ │ │ │ │ │ │ │ └── cosmosdb/ │ │ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ │ │ ├── CosmosDBChatMemoryRepositoryAutoConfiguration.java │ │ │ │ │ │ │ │ ├── CosmosDBChatMemoryRepositoryProperties.java │ │ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ │ │ └── resources/ │ │ │ │ │ │ │ └── META-INF/ │ │ │ │ │ │ │ └── spring/ │ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── java/ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ └── repository/ │ │ │ │ │ │ └── cosmosdb/ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ ├── CosmosDBChatMemoryRepositoryAutoConfigurationIT.java │ │ │ │ │ │ └── CosmosDBChatMemoryRepositoryPropertiesTest.java │ │ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory-repository-jdbc/ │ │ │ │ │ │ ├── pom.xml │ │ │ │ │ │ └── src/ │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ ├── java/ │ │ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ │ │ └── repository/ │ │ │ │ │ │ │ │ └── jdbc/ │ │ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryAutoConfiguration.java │ │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryProperties.java │ │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositorySchemaInitializer.java │ │ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ │ │ └── resources/ │ │ │ │ │ │ │ └── META-INF/ │ │ │ │ │ │ │ └── spring/ │ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── java/ │ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ │ └── repository/ │ │ │ │ │ │ │ └── jdbc/ │ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryHsqldbAutoConfigurationIT.java │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryPostgresqlAutoConfigurationIT.java │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositoryPropertiesTests.java │ │ │ │ │ │ │ ├── JdbcChatMemoryRepositorySchemaInitializerPostgresqlTests.java │ │ │ │ │ │ │ └── JdbcChatMemoryRepositorySqlServerAutoConfigurationIT.java │ │ │ │ │ │ └── resources/ │ │ │ │ │ │ └── schema.sql │ │ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory-repository-mongodb/ │ │ │ │ │ │ ├── pom.xml │ │ │ │ │ │ └── src/ │ │ │ │ │ │ ├── main/ │ │ │ │ │ │ │ ├── java/ │ │ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ │ │ └── repository/ │ │ │ │ │ │ │ │ └── mongo/ │ │ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ │ │ ├── MongoChatMemoryAutoConfiguration.java │ │ │ │ │ │ │ │ ├── MongoChatMemoryIndexCreatorAutoConfiguration.java │ │ │ │ │ │ │ │ ├── MongoChatMemoryProperties.java │ │ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ │ │ └── resources/ │ │ │ │ │ │ │ └── META-INF/ │ │ │ │ │ │ │ └── spring/ │ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ │ │ └── test/ │ │ │ │ │ │ └── java/ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ └── repository/ │ │ │ │ │ │ └── mongo/ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ ├── MongoChatMemoryAutoConfigurationIT.java │ │ │ │ │ │ └── MongoChatMemoryPropertiesTests.java │ │ │ │ │ └── spring-ai-autoconfigure-model-chat-memory-repository-neo4j/ │ │ │ │ │ ├── pom.xml │ │ │ │ │ └── src/ │ │ │ │ │ ├── main/ │ │ │ │ │ │ ├── java/ │ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ │ └── repository/ │ │ │ │ │ │ │ └── neo4j/ │ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ │ ├── Neo4jChatMemoryRepositoryAutoConfiguration.java │ │ │ │ │ │ │ ├── Neo4jChatMemoryRepositoryProperties.java │ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ │ └── resources/ │ │ │ │ │ │ └── META-INF/ │ │ │ │ │ │ └── spring/ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ │ └── test/ │ │ │ │ │ └── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── chat/ │ │ │ │ │ └── memory/ │ │ │ │ │ └── repository/ │ │ │ │ │ └── neo4j/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── Neo4JChatMemoryRepositoryPropertiesTest.java │ │ │ │ │ └── Neo4jChatMemoryRepositoryAutoConfigurationIT.java │ │ │ │ ├── spring-ai-autoconfigure-model-chat-memory/ │ │ │ │ │ ├── pom.xml │ │ │ │ │ └── src/ │ │ │ │ │ ├── main/ │ │ │ │ │ │ ├── java/ │ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ │ ├── ChatMemoryAutoConfiguration.java │ │ │ │ │ │ │ └── package-info.java │ │ │ │ │ │ └── resources/ │ │ │ │ │ │ └── META-INF/ │ │ │ │ │ │ └── spring/ │ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ │ └── test/ │ │ │ │ │ └── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── chat/ │ │ │ │ │ └── memory/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ └── ChatMemoryAutoConfigurationTests.java │ │ │ │ └── spring-ai-autoconfigure-model-chat-memory-redis/ │ │ │ │ ├── pom.xml │ │ │ │ └── src/ │ │ │ │ ├── main/ │ │ │ │ │ ├── java/ │ │ │ │ │ │ └── org/ │ │ │ │ │ │ └── springframework/ │ │ │ │ │ │ └── ai/ │ │ │ │ │ │ └── model/ │ │ │ │ │ │ └── chat/ │ │ │ │ │ │ └── memory/ │ │ │ │ │ │ └── redis/ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ ├── RedisChatMemoryAutoConfiguration.java │ │ │ │ │ │ ├── RedisChatMemoryProperties.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── resources/ │ │ │ │ │ └── META-INF/ │ │ │ │ │ └── spring/ │ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ │ └── test/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── chat/ │ │ │ │ │ └── memory/ │ │ │ │ │ └── redis/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ └── RedisChatMemoryAutoConfigurationIT.java │ │ │ │ └── resources/ │ │ │ │ └── logback-test.xml │ │ │ └── observation/ │ │ │ └── spring-ai-autoconfigure-model-chat-observation/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── chat/ │ │ │ │ │ └── observation/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── ChatObservationAutoConfiguration.java │ │ │ │ │ ├── ChatObservationProperties.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── chat/ │ │ │ └── observation/ │ │ │ └── autoconfigure/ │ │ │ ├── ChatObservationAutoConfigurationOrderingTests.java │ │ │ └── ChatObservationAutoConfigurationTests.java │ │ ├── embedding/ │ │ │ └── observation/ │ │ │ └── spring-ai-autoconfigure-model-embedding-observation/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── embedding/ │ │ │ │ │ └── observation/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── EmbeddingObservationAutoConfiguration.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── embedding/ │ │ │ └── observation/ │ │ │ └── autoconfigure/ │ │ │ └── EmbeddingObservationAutoConfigurationTests.java │ │ ├── image/ │ │ │ └── observation/ │ │ │ └── spring-ai-autoconfigure-model-image-observation/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── image/ │ │ │ │ │ └── observation/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── ImageObservationAutoConfiguration.java │ │ │ │ │ ├── ImageObservationProperties.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── image/ │ │ │ └── observation/ │ │ │ └── autoconfigure/ │ │ │ └── ImageObservationAutoConfigurationTests.java │ │ ├── spring-ai-autoconfigure-model-anthropic/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── anthropic/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── AnthropicChatAutoConfiguration.java │ │ │ │ │ ├── AnthropicChatProperties.java │ │ │ │ │ ├── AnthropicConnectionProperties.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── anthropic/ │ │ │ └── autoconfigure/ │ │ │ ├── AnthropicChatAutoConfigurationIT.java │ │ │ ├── AnthropicModelConfigurationTests.java │ │ │ ├── AnthropicPropertiesTests.java │ │ │ └── tool/ │ │ │ ├── FunctionCallWithFunctionBeanIT.java │ │ │ ├── FunctionCallWithPromptFunctionIT.java │ │ │ └── MockWeatherService.java │ │ ├── spring-ai-autoconfigure-model-azure-openai/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── azure/ │ │ │ │ │ └── openai/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── AzureOpenAIClientBuilderCustomizer.java │ │ │ │ │ ├── AzureOpenAiAudioTranscriptionAutoConfiguration.java │ │ │ │ │ ├── AzureOpenAiAudioTranscriptionProperties.java │ │ │ │ │ ├── AzureOpenAiChatAutoConfiguration.java │ │ │ │ │ ├── AzureOpenAiChatProperties.java │ │ │ │ │ ├── AzureOpenAiClientBuilderConfiguration.java │ │ │ │ │ ├── AzureOpenAiConnectionProperties.java │ │ │ │ │ ├── AzureOpenAiEmbeddingAutoConfiguration.java │ │ │ │ │ ├── AzureOpenAiEmbeddingProperties.java │ │ │ │ │ ├── AzureOpenAiImageAutoConfiguration.java │ │ │ │ │ └── AzureOpenAiImageOptionsProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ ├── additional-spring-configuration-metadata.json │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── model/ │ │ │ │ └── azure/ │ │ │ │ └── openai/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── AzureOpenAiAutoConfigurationEntraIT.java │ │ │ │ ├── AzureOpenAiAutoConfigurationIT.java │ │ │ │ ├── AzureOpenAiAutoConfigurationPropertyTests.java │ │ │ │ ├── AzureOpenAiDirectOpenAiAutoConfigurationIT.java │ │ │ │ ├── AzureOpenAiModelConfigurationTests.java │ │ │ │ └── tool/ │ │ │ │ ├── DeploymentNameUtil.java │ │ │ │ ├── FunctionCallWithFunctionBeanIT.java │ │ │ │ ├── FunctionCallWithFunctionWrapperIT.java │ │ │ │ ├── FunctionCallWithPromptFunctionIT.java │ │ │ │ └── MockWeatherService.java │ │ │ └── resources/ │ │ │ └── speech/ │ │ │ └── jfk.flac │ │ ├── spring-ai-autoconfigure-model-bedrock-ai/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── bedrock/ │ │ │ │ │ ├── autoconfigure/ │ │ │ │ │ │ ├── BedrockAwsConnectionConfiguration.java │ │ │ │ │ │ ├── BedrockAwsConnectionProperties.java │ │ │ │ │ │ └── ProfileProperties.java │ │ │ │ │ ├── cohere/ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ ├── BedrockCohereEmbeddingAutoConfiguration.java │ │ │ │ │ │ └── BedrockCohereEmbeddingProperties.java │ │ │ │ │ ├── converse/ │ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ │ ├── BedrockConverseProxyChatAutoConfiguration.java │ │ │ │ │ │ └── BedrockConverseProxyChatProperties.java │ │ │ │ │ └── titan/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── BedrockTitanEmbeddingAutoConfiguration.java │ │ │ │ │ └── BedrockTitanEmbeddingProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── bedrock/ │ │ │ ├── autoconfigure/ │ │ │ │ ├── BedrockAwsConnectionConfigurationIT.java │ │ │ │ ├── BedrockTestUtils.java │ │ │ │ └── RequiresAwsCredentials.java │ │ │ ├── cohere/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── BedrockCohereEmbeddingAutoConfigurationIT.java │ │ │ │ └── BedrockCohereModelConfigurationTests.java │ │ │ ├── converse/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── BedrockConverseModelConfigurationTests.java │ │ │ │ ├── BedrockConverseProxyChatAutoConfigurationIT.java │ │ │ │ ├── BedrockConverseProxyChatPropertiesTests.java │ │ │ │ └── tool/ │ │ │ │ ├── FunctionCallWithFunctionBeanIT.java │ │ │ │ ├── FunctionCallWithPromptFunctionIT.java │ │ │ │ └── MockWeatherService.java │ │ │ └── titan/ │ │ │ └── autoconfigure/ │ │ │ ├── BedrockTitanEmbeddingAutoConfigurationIT.java │ │ │ └── BedrockTitanModelConfigurationTests.java │ │ ├── spring-ai-autoconfigure-model-deepseek/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── deepseek/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── DeepSeekChatAutoConfiguration.java │ │ │ │ │ ├── DeepSeekChatProperties.java │ │ │ │ │ ├── DeepSeekConnectionProperties.java │ │ │ │ │ └── DeepSeekParentProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── deepseek/ │ │ │ └── autoconfigure/ │ │ │ ├── BaseDeepSeekIT.java │ │ │ ├── DeepSeekAutoConfigurationIT.java │ │ │ ├── DeepSeekPropertiesTests.java │ │ │ └── tool/ │ │ │ ├── DeepSeekFunctionCallbackIT.java │ │ │ ├── FunctionCallbackInPromptIT.java │ │ │ ├── FunctionCallbackWithPlainFunctionBeanIT.java │ │ │ └── MockWeatherService.java │ │ ├── spring-ai-autoconfigure-model-elevenlabs/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── elevenlabs/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── ElevenLabsAutoConfiguration.java │ │ │ │ │ ├── ElevenLabsConnectionProperties.java │ │ │ │ │ └── ElevenLabsSpeechProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── elevenlabs/ │ │ │ └── autoconfigure/ │ │ │ ├── ElevenLabsAutoConfigurationIT.java │ │ │ ├── ElevenLabsITUtil.java │ │ │ └── ElevenLabsPropertiesTests.java │ │ ├── spring-ai-autoconfigure-model-google-genai/ │ │ │ ├── MIGRATION_GUIDE.md │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── google/ │ │ │ │ │ └── genai/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── chat/ │ │ │ │ │ │ ├── CachedContentServiceCondition.java │ │ │ │ │ │ ├── GoogleGenAiChatAutoConfiguration.java │ │ │ │ │ │ ├── GoogleGenAiChatProperties.java │ │ │ │ │ │ └── GoogleGenAiConnectionProperties.java │ │ │ │ │ └── embedding/ │ │ │ │ │ ├── GoogleGenAiEmbeddingConnectionAutoConfiguration.java │ │ │ │ │ ├── GoogleGenAiEmbeddingConnectionProperties.java │ │ │ │ │ ├── GoogleGenAiTextEmbeddingAutoConfiguration.java │ │ │ │ │ └── GoogleGenAiTextEmbeddingProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── google/ │ │ │ └── genai/ │ │ │ └── autoconfigure/ │ │ │ ├── chat/ │ │ │ │ ├── GoogleGenAiCachedContentServiceAutoConfigurationTests.java │ │ │ │ ├── GoogleGenAiChatAutoConfigurationIT.java │ │ │ │ ├── GoogleGenAiModelConfigurationTests.java │ │ │ │ ├── GoogleGenAiPropertiesTests.java │ │ │ │ └── tool/ │ │ │ │ ├── FunctionCallWithFunctionBeanIT.java │ │ │ │ ├── FunctionCallWithFunctionWrapperIT.java │ │ │ │ ├── FunctionCallWithPromptFunctionIT.java │ │ │ │ └── MockWeatherService.java │ │ │ └── embedding/ │ │ │ └── GoogleGenAiTextEmbeddingAutoConfigurationIT.java │ │ ├── spring-ai-autoconfigure-model-minimax/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── minimax/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── MiniMaxChatAutoConfiguration.java │ │ │ │ │ ├── MiniMaxChatProperties.java │ │ │ │ │ ├── MiniMaxConnectionProperties.java │ │ │ │ │ ├── MiniMaxEmbeddingAutoConfiguration.java │ │ │ │ │ ├── MiniMaxEmbeddingProperties.java │ │ │ │ │ └── MiniMaxParentProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── minimax/ │ │ │ └── autoconfigure/ │ │ │ ├── FunctionCallbackInPromptIT.java │ │ │ ├── FunctionCallbackWithPlainFunctionBeanIT.java │ │ │ ├── MiniMaxAutoConfigurationIT.java │ │ │ ├── MiniMaxFunctionCallbackIT.java │ │ │ ├── MiniMaxPropertiesTests.java │ │ │ ├── MinimaxModelConfigurationTests.java │ │ │ └── MockWeatherService.java │ │ ├── spring-ai-autoconfigure-model-mistral-ai/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── mistralai/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── MistralAiChatAutoConfiguration.java │ │ │ │ │ ├── MistralAiChatProperties.java │ │ │ │ │ ├── MistralAiCommonProperties.java │ │ │ │ │ ├── MistralAiEmbeddingAutoConfiguration.java │ │ │ │ │ ├── MistralAiEmbeddingProperties.java │ │ │ │ │ ├── MistralAiModerationAutoConfiguration.java │ │ │ │ │ ├── MistralAiModerationProperties.java │ │ │ │ │ ├── MistralAiOcrAutoConfiguration.java │ │ │ │ │ ├── MistralAiOcrProperties.java │ │ │ │ │ └── MistralAiParentProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ ├── additional-spring-configuration-metadata.json │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── mistralai/ │ │ │ └── autoconfigure/ │ │ │ ├── MistralAiAutoConfigurationIT.java │ │ │ ├── MistralAiOcrAutoConfigurationIT.java │ │ │ ├── MistralAiOcrPropertiesTests.java │ │ │ ├── MistralAiPropertiesTests.java │ │ │ ├── MistralModelConfigurationTests.java │ │ │ └── tool/ │ │ │ ├── PaymentStatusBeanIT.java │ │ │ ├── PaymentStatusBeanOpenAiIT.java │ │ │ ├── PaymentStatusPromptIT.java │ │ │ └── WeatherServicePromptIT.java │ │ ├── spring-ai-autoconfigure-model-ollama/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── ollama/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── OllamaApiAutoConfiguration.java │ │ │ │ │ ├── OllamaChatAutoConfiguration.java │ │ │ │ │ ├── OllamaChatProperties.java │ │ │ │ │ ├── OllamaConnectionDetails.java │ │ │ │ │ ├── OllamaConnectionProperties.java │ │ │ │ │ ├── OllamaEmbeddingAutoConfiguration.java │ │ │ │ │ ├── OllamaEmbeddingProperties.java │ │ │ │ │ └── OllamaInitializationProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── model/ │ │ │ │ └── ollama/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── BaseOllamaIT.java │ │ │ │ ├── OllamaChatAutoConfigurationIT.java │ │ │ │ ├── OllamaChatAutoConfigurationTests.java │ │ │ │ ├── OllamaEmbeddingAutoConfigurationIT.java │ │ │ │ ├── OllamaEmbeddingAutoConfigurationTests.java │ │ │ │ ├── OllamaImage.java │ │ │ │ ├── OllamaModelConfigurationTests.java │ │ │ │ └── tool/ │ │ │ │ ├── FunctionCallbackInPromptIT.java │ │ │ │ ├── MockWeatherService.java │ │ │ │ ├── OllamaFunctionCallbackIT.java │ │ │ │ └── OllamaFunctionToolBeanIT.java │ │ │ └── kotlin/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── ollama/ │ │ │ └── autoconfigure/ │ │ │ └── tool/ │ │ │ ├── FunctionCallbackContextKotlinIT.kt │ │ │ ├── MockKotlinWeatherService.kt │ │ │ └── ToolCallbackKotlinIT.kt │ │ ├── spring-ai-autoconfigure-model-openai/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── openai/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── OpenAiAudioSpeechAutoConfiguration.java │ │ │ │ │ ├── OpenAiAudioSpeechProperties.java │ │ │ │ │ ├── OpenAiAudioTranscriptionAutoConfiguration.java │ │ │ │ │ ├── OpenAiAudioTranscriptionProperties.java │ │ │ │ │ ├── OpenAiAutoConfigurationUtil.java │ │ │ │ │ ├── OpenAiChatAutoConfiguration.java │ │ │ │ │ ├── OpenAiChatProperties.java │ │ │ │ │ ├── OpenAiConnectionProperties.java │ │ │ │ │ ├── OpenAiEmbeddingAutoConfiguration.java │ │ │ │ │ ├── OpenAiEmbeddingProperties.java │ │ │ │ │ ├── OpenAiImageAutoConfiguration.java │ │ │ │ │ ├── OpenAiImageProperties.java │ │ │ │ │ ├── OpenAiModerationAutoConfiguration.java │ │ │ │ │ ├── OpenAiModerationProperties.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ ├── additional-spring-configuration-metadata.json │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── model/ │ │ │ │ └── openai/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── ChatClientAutoConfigurationIT.java │ │ │ │ ├── MockWeatherService.java │ │ │ │ ├── OpenAiAudioSpeechAutoConfigurationIT.java │ │ │ │ ├── OpenAiAudioTranscriptionAutoConfigurationIT.java │ │ │ │ ├── OpenAiAudioTranscriptionPropertiesTests.java │ │ │ │ ├── OpenAiChatAutoConfigurationIT.java │ │ │ │ ├── OpenAiChatPropertiesTests.java │ │ │ │ ├── OpenAiEmbeddingAutoConfigurationIT.java │ │ │ │ ├── OpenAiEmbeddingPropertiesTests.java │ │ │ │ ├── OpenAiFunctionCallback2IT.java │ │ │ │ ├── OpenAiImageAutoConfigurationIT.java │ │ │ │ ├── OpenAiImagePropertiesTests.java │ │ │ │ └── tool/ │ │ │ │ ├── FunctionCallbackInPrompt2IT.java │ │ │ │ ├── FunctionCallbackInPromptIT.java │ │ │ │ ├── FunctionCallbackWithPlainFunctionBeanIT.java │ │ │ │ ├── MockWeatherService.java │ │ │ │ ├── OpenAiFunctionCallback2IT.java │ │ │ │ └── OpenAiFunctionCallbackIT.java │ │ │ └── resources/ │ │ │ ├── speech/ │ │ │ │ └── jfk.flac │ │ │ └── speech.flac │ │ ├── spring-ai-autoconfigure-model-postgresml-embedding/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── postgresml/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── PostgresMlEmbeddingAutoConfiguration.java │ │ │ │ │ ├── PostgresMlEmbeddingProperties.java │ │ │ │ │ └── package-info.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── postgresml/ │ │ │ └── autoconfigure/ │ │ │ ├── PostgresMlEmbeddingAutoConfigurationIT.java │ │ │ └── PostgresMlEmbeddingPropertiesTests.java │ │ ├── spring-ai-autoconfigure-model-stability-ai/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── stabilityai/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── StabilityAiConnectionProperties.java │ │ │ │ │ ├── StabilityAiImageAutoConfiguration.java │ │ │ │ │ ├── StabilityAiImageProperties.java │ │ │ │ │ └── StabilityAiParentProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── stabilityai/ │ │ │ └── autoconfigure/ │ │ │ ├── StabilityAiAutoConfigurationIT.java │ │ │ └── StabilityAiImagePropertiesTests.java │ │ ├── spring-ai-autoconfigure-model-transformers/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── transformers/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ ├── TransformersEmbeddingModelAutoConfiguration.java │ │ │ │ │ └── TransformersEmbeddingModelProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── transformers/ │ │ │ └── autoconfigure/ │ │ │ └── TransformersEmbeddingModelAutoConfigurationIT.java │ │ ├── spring-ai-autoconfigure-model-vertex-ai/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ ├── main/ │ │ │ │ ├── java/ │ │ │ │ │ └── org/ │ │ │ │ │ └── springframework/ │ │ │ │ │ └── ai/ │ │ │ │ │ └── model/ │ │ │ │ │ └── vertexai/ │ │ │ │ │ └── autoconfigure/ │ │ │ │ │ └── embedding/ │ │ │ │ │ ├── VertexAiEmbeddingConnectionAutoConfiguration.java │ │ │ │ │ ├── VertexAiEmbeddingConnectionProperties.java │ │ │ │ │ ├── VertexAiMultiModalEmbeddingAutoConfiguration.java │ │ │ │ │ ├── VertexAiMultimodalEmbeddingProperties.java │ │ │ │ │ ├── VertexAiTextEmbeddingAutoConfiguration.java │ │ │ │ │ └── VertexAiTextEmbeddingProperties.java │ │ │ │ └── resources/ │ │ │ │ └── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ │ └── test/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── model/ │ │ │ └── vertexai/ │ │ │ └── autoconfigure/ │ │ │ └── embedding/ │ │ │ └── VertexAiTextEmbeddingModelAutoConfigurationIT.java │ │ └── tool/ │ │ └── spring-ai-autoconfigure-model-tool/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── model/ │ │ │ │ └── tool/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── ToolCallingAutoConfiguration.java │ │ │ │ ├── ToolCallingProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── model/ │ │ └── tool/ │ │ └── autoconfigure/ │ │ └── ToolCallingAutoConfigurationTests.java │ └── vector-stores/ │ ├── spring-ai-autoconfigure-vector-store-azure/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── azure/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── AzureVectorStoreAutoConfiguration.java │ │ │ │ ├── AzureVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── azure/ │ │ └── autoconfigure/ │ │ └── AzureVectorStoreAutoConfigurationIT.java │ ├── spring-ai-autoconfigure-vector-store-azure-cosmos-db/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── cosmosdb/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── CosmosDBVectorStoreAutoConfiguration.java │ │ │ │ ├── CosmosDBVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── cosmosdb/ │ │ └── autoconfigure/ │ │ └── CosmosDBVectorStoreAutoConfigurationIT.java │ ├── spring-ai-autoconfigure-vector-store-bedrock-knowledgebase/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── vectorstore/ │ │ │ └── bedrockknowledgebase/ │ │ │ └── autoconfigure/ │ │ │ ├── BedrockKnowledgeBaseVectorStoreAutoConfiguration.java │ │ │ ├── BedrockKnowledgeBaseVectorStoreProperties.java │ │ │ └── package-info.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── spring/ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ ├── spring-ai-autoconfigure-vector-store-cassandra/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── cassandra/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── CassandraVectorStoreAutoConfiguration.java │ │ │ │ ├── CassandraVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── cassandra/ │ │ └── autoconfigure/ │ │ ├── CassandraVectorStoreAutoConfigurationIT.java │ │ └── CassandraVectorStorePropertiesTests.java │ ├── spring-ai-autoconfigure-vector-store-chroma/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── chroma/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── ChromaApiProperties.java │ │ │ │ ├── ChromaConnectionDetails.java │ │ │ │ ├── ChromaVectorStoreAutoConfiguration.java │ │ │ │ ├── ChromaVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── chroma/ │ │ └── autoconfigure/ │ │ └── ChromaVectorStoreAutoConfigurationIT.java │ ├── spring-ai-autoconfigure-vector-store-couchbase/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── couchbase/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── CouchbaseSearchVectorStoreAutoConfiguration.java │ │ │ │ ├── CouchbaseSearchVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── couchbase/ │ │ └── autoconfigure/ │ │ ├── CouchbaseContainerMetadata.java │ │ └── CouchbaseSearchVectorStoreAutoConfigurationIT.java │ ├── spring-ai-autoconfigure-vector-store-elasticsearch/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── elasticsearch/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── ElasticsearchVectorStoreAutoConfiguration.java │ │ │ │ ├── ElasticsearchVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── elasticsearch/ │ │ └── autoconfigure/ │ │ └── ElasticsearchVectorStoreAutoConfigurationIT.java │ ├── spring-ai-autoconfigure-vector-store-gemfire/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── gemfire/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── GemFireConnectionDetails.java │ │ │ │ ├── GemFireVectorStoreAutoConfiguration.java │ │ │ │ ├── GemFireVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ ├── springframework/ │ │ │ └── ai/ │ │ │ └── vectorstore/ │ │ │ └── gemfire/ │ │ │ └── autoconfigure/ │ │ │ ├── GemFireVectorStoreAutoConfigurationAuthenticationIT.java │ │ │ ├── GemFireVectorStoreAutoConfigurationIT.java │ │ │ └── GemFireVectorStorePropertiesTests.java │ │ └── testcontainers/ │ │ └── containers/ │ │ └── FailureDetectingExternalResource.java │ ├── spring-ai-autoconfigure-vector-store-infinispan/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── infinispan/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── InfinispanVectorStoreAutoConfiguration.java │ │ │ │ ├── InfinispanVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── infinispan/ │ │ └── autoconfigure/ │ │ └── InfinispanVectorStoreAutoConfigurationIT.java │ ├── spring-ai-autoconfigure-vector-store-mariadb/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── mariadb/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── MariaDbStoreAutoConfiguration.java │ │ │ │ ├── MariaDbStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── mariadb/ │ │ └── autoconfigure/ │ │ ├── MariaDbStoreAutoConfigurationIT.java │ │ └── MariaDbStorePropertiesTests.java │ ├── spring-ai-autoconfigure-vector-store-milvus/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── milvus/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── MilvusServiceClientConnectionDetails.java │ │ │ │ ├── MilvusServiceClientProperties.java │ │ │ │ ├── MilvusVectorStoreAutoConfiguration.java │ │ │ │ ├── MilvusVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── milvus/ │ │ └── autoconfigure/ │ │ └── MilvusVectorStoreAutoConfigurationIT.java │ ├── spring-ai-autoconfigure-vector-store-mongodb-atlas/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── mongodb/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── MongoDBAtlasVectorStoreAutoConfiguration.java │ │ │ │ ├── MongoDBAtlasVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── mongodb/ │ │ └── autoconfigure/ │ │ └── MongoDBAtlasVectorStoreAutoConfigurationIT.java │ ├── spring-ai-autoconfigure-vector-store-neo4j/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── neo4j/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── Neo4jVectorStoreAutoConfiguration.java │ │ │ │ ├── Neo4jVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── neo4j/ │ │ └── autoconfigure/ │ │ └── Neo4jVectorStoreAutoConfigurationIT.java │ ├── spring-ai-autoconfigure-vector-store-observation/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── observation/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── VectorStoreObservationAutoConfiguration.java │ │ │ │ ├── VectorStoreObservationProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── observation/ │ │ └── autoconfigure/ │ │ └── VectorStoreObservationAutoConfigurationTests.java │ ├── spring-ai-autoconfigure-vector-store-opensearch/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── opensearch/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── AwsOpenSearchConnectionDetails.java │ │ │ │ ├── OpenSearchConnectionDetails.java │ │ │ │ ├── OpenSearchNonAwsCondition.java │ │ │ │ ├── OpenSearchVectorStoreAutoConfiguration.java │ │ │ │ ├── OpenSearchVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── opensearch/ │ │ └── autoconfigure/ │ │ ├── AwsOpenSearchVectorStoreAutoConfigurationIT.java │ │ ├── OpenSearchVectorStoreAutoConfigurationIT.java │ │ └── OpenSearchVectorStoreNonAwsFallbackIT.java │ ├── spring-ai-autoconfigure-vector-store-oracle/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── oracle/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── OracleVectorStoreAutoConfiguration.java │ │ │ │ ├── OracleVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── vectorstore/ │ │ │ └── oracle/ │ │ │ └── autoconfigure/ │ │ │ ├── OracleVectorStoreAutoConfigurationIT.java │ │ │ └── OracleVectorStorePropertiesTests.java │ │ └── resources/ │ │ └── oracle/ │ │ └── initialize.sql │ ├── spring-ai-autoconfigure-vector-store-pgvector/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── pgvector/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── PgVectorStoreAutoConfiguration.java │ │ │ │ ├── PgVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── pgvector/ │ │ └── autoconfigure/ │ │ ├── PgVectorStoreAutoConfigurationIT.java │ │ └── PgVectorStorePropertiesTests.java │ ├── spring-ai-autoconfigure-vector-store-pinecone/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── pinecone/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── PineconeVectorStoreAutoConfiguration.java │ │ │ │ ├── PineconeVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── pinecone/ │ │ └── autoconfigure/ │ │ ├── PineconeVectorStoreAutoConfigurationIT.java │ │ └── PineconeVectorStorePropertiesTests.java │ ├── spring-ai-autoconfigure-vector-store-qdrant/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── qdrant/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── QdrantConnectionDetails.java │ │ │ │ ├── QdrantVectorStoreAutoConfiguration.java │ │ │ │ ├── QdrantVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── qdrant/ │ │ └── autoconfigure/ │ │ ├── QdrantVectorStoreAutoConfigurationIT.java │ │ ├── QdrantVectorStoreCloudAutoConfigurationIT.java │ │ └── QdrantVectorStorePropertiesTests.java │ ├── spring-ai-autoconfigure-vector-store-redis/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── redis/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── RedisVectorStoreAutoConfiguration.java │ │ │ │ ├── RedisVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── redis/ │ │ └── autoconfigure/ │ │ ├── RedisVectorStoreAutoConfigurationIT.java │ │ └── RedisVectorStorePropertiesTests.java │ ├── spring-ai-autoconfigure-vector-store-redis-semantic-cache/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── redis/ │ │ │ │ └── cache/ │ │ │ │ └── semantic/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── RedisSemanticCacheAutoConfiguration.java │ │ │ │ ├── RedisSemanticCacheProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── vectorstore/ │ │ │ └── redis/ │ │ │ └── cache/ │ │ │ └── semantic/ │ │ │ └── autoconfigure/ │ │ │ └── RedisSemanticCacheAutoConfigurationIT.java │ │ └── resources/ │ │ └── logback-test.xml │ ├── spring-ai-autoconfigure-vector-store-s3/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── s3/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── S3VectorStoreAutoConfiguration.java │ │ │ │ ├── S3VectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── azure/ │ │ └── autoconfigure/ │ │ └── S3VectorStoreAutoConfigurationTest.java │ ├── spring-ai-autoconfigure-vector-store-typesense/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── vectorstore/ │ │ │ │ └── typesense/ │ │ │ │ └── autoconfigure/ │ │ │ │ ├── TypesenseConnectionDetails.java │ │ │ │ ├── TypesenseServiceClientProperties.java │ │ │ │ ├── TypesenseVectorStoreAutoConfiguration.java │ │ │ │ ├── TypesenseVectorStoreProperties.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── vectorstore/ │ │ └── typesense/ │ │ └── autoconfigure/ │ │ └── TypesenseVectorStoreAutoConfigurationIT.java │ └── spring-ai-autoconfigure-vector-store-weaviate/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── vectorstore/ │ │ │ └── weaviate/ │ │ │ └── autoconfigure/ │ │ │ ├── WeaviateConnectionDetails.java │ │ │ ├── WeaviateVectorStoreAutoConfiguration.java │ │ │ ├── WeaviateVectorStoreProperties.java │ │ │ └── package-info.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── spring/ │ │ └── org.springframework.boot.autoconfigure.AutoConfiguration.imports │ └── test/ │ └── java/ │ └── org/ │ └── springframework/ │ └── ai/ │ └── vectorstore/ │ └── weaviate/ │ └── autoconfigure/ │ └── WeaviateVectorStoreAutoConfigurationIT.java ├── design/ │ ├── 00-template.adoc │ └── 01-null-safety.adoc ├── document-readers/ │ ├── jsoup-reader/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── reader/ │ │ │ └── jsoup/ │ │ │ ├── JsoupDocumentReader.java │ │ │ ├── config/ │ │ │ │ ├── JsoupDocumentReaderConfig.java │ │ │ │ └── package-info.java │ │ │ └── package-info.java │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── reader/ │ │ │ └── jsoup/ │ │ │ └── JsoupDocumentReaderTests.java │ │ └── resources/ │ │ ├── test-group-by.html │ │ └── test.html │ ├── markdown-reader/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── reader/ │ │ │ └── markdown/ │ │ │ ├── MarkdownDocumentReader.java │ │ │ ├── config/ │ │ │ │ ├── MarkdownDocumentReaderConfig.java │ │ │ │ └── package-info.java │ │ │ └── package-info.java │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── reader/ │ │ │ └── markdown/ │ │ │ └── MarkdownDocumentReaderTest.java │ │ └── resources/ │ │ ├── blockquote.md │ │ ├── code.md │ │ ├── dir-test-1/ │ │ │ ├── blockquote.md │ │ │ └── blockquote.txt │ │ ├── dir-test-2/ │ │ │ ├── only-headers.md │ │ │ └── with-formatting.md │ │ ├── horizontal-rules.md │ │ ├── lists.md │ │ ├── only-headers.md │ │ ├── simple.md │ │ └── with-formatting.md │ ├── pdf-reader/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── reader/ │ │ │ │ └── pdf/ │ │ │ │ ├── PagePdfDocumentReader.java │ │ │ │ ├── ParagraphPdfDocumentReader.java │ │ │ │ ├── aot/ │ │ │ │ │ ├── PdfReaderRuntimeHints.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── config/ │ │ │ │ │ ├── ParagraphManager.java │ │ │ │ │ ├── PdfDocumentReaderConfig.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── layout/ │ │ │ │ │ ├── Character.java │ │ │ │ │ ├── CharacterFactory.java │ │ │ │ │ ├── ForkPDFLayoutTextStripper.java │ │ │ │ │ ├── PDFLayoutTextStripperByArea.java │ │ │ │ │ ├── TextLine.java │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── reader/ │ │ └── pdf/ │ │ ├── PagePdfDocumentReaderTests.java │ │ ├── ParagraphPdfDocumentReaderTests.java │ │ ├── aot/ │ │ │ └── PdfReaderRuntimeHintsTests.java │ │ └── layout/ │ │ └── TextLineTest.java │ └── tika-reader/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── reader/ │ │ └── tika/ │ │ ├── TikaDocumentReader.java │ │ └── package-info.java │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── reader/ │ │ └── tika/ │ │ └── TikaDocumentReaderTests.java │ └── resources/ │ ├── sample.ppt │ ├── sample.pptx │ ├── word-sample.doc │ └── word-sample.docx ├── mcp/ │ ├── common/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── mcp/ │ │ │ │ ├── AsyncMcpToolCallback.java │ │ │ │ ├── AsyncMcpToolCallbackProvider.java │ │ │ │ ├── DefaultMcpToolNamePrefixGenerator.java │ │ │ │ ├── McpConnectionInfo.java │ │ │ │ ├── McpToolFilter.java │ │ │ │ ├── McpToolNamePrefixGenerator.java │ │ │ │ ├── McpToolUtils.java │ │ │ │ ├── McpToolsChangedEvent.java │ │ │ │ ├── SyncMcpToolCallback.java │ │ │ │ ├── SyncMcpToolCallbackProvider.java │ │ │ │ ├── ToolContextToMcpMetaConverter.java │ │ │ │ ├── aot/ │ │ │ │ │ ├── McpHints.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── customizer/ │ │ │ │ │ ├── McpAsyncServerCustomizer.java │ │ │ │ │ ├── McpClientCustomizer.java │ │ │ │ │ ├── McpSyncServerCustomizer.java │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── mcp/ │ │ ├── AsyncMcpToolCallbackProviderTests.java │ │ ├── AsyncMcpToolCallbackTest.java │ │ ├── SyncMcpToolCallbackBuilderTest.java │ │ ├── SyncMcpToolCallbackProviderBuilderTest.java │ │ ├── SyncMcpToolCallbackProviderTests.java │ │ ├── SyncMcpToolCallbackTests.java │ │ ├── ToolContextToMcpMetaConverterTest.java │ │ └── ToolUtilsTests.java │ ├── mcp-annotations/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── mcp/ │ │ │ └── annotation/ │ │ │ ├── McpArg.java │ │ │ ├── McpComplete.java │ │ │ ├── McpElicitation.java │ │ │ ├── McpLogging.java │ │ │ ├── McpMeta.java │ │ │ ├── McpProgress.java │ │ │ ├── McpProgressToken.java │ │ │ ├── McpPrompt.java │ │ │ ├── McpPromptListChanged.java │ │ │ ├── McpResource.java │ │ │ ├── McpResourceListChanged.java │ │ │ ├── McpSampling.java │ │ │ ├── McpTool.java │ │ │ ├── McpToolListChanged.java │ │ │ ├── McpToolParam.java │ │ │ ├── adapter/ │ │ │ │ ├── CompleteAdapter.java │ │ │ │ ├── PromptAdapter.java │ │ │ │ ├── ResourceAdapter.java │ │ │ │ └── package-info.java │ │ │ ├── common/ │ │ │ │ ├── ErrorUtils.java │ │ │ │ ├── McpPredicates.java │ │ │ │ ├── MetaUtils.java │ │ │ │ └── package-info.java │ │ │ ├── context/ │ │ │ │ ├── DefaultElicitationSpec.java │ │ │ │ ├── DefaultLoggingSpec.java │ │ │ │ ├── DefaultMcpAsyncRequestContext.java │ │ │ │ ├── DefaultMcpSyncRequestContext.java │ │ │ │ ├── DefaultMetaProvider.java │ │ │ │ ├── DefaultProgressSpec.java │ │ │ │ ├── DefaultSamplingSpec.java │ │ │ │ ├── McpAsyncRequestContext.java │ │ │ │ ├── McpRequestContextTypes.java │ │ │ │ ├── McpSyncRequestContext.java │ │ │ │ ├── MetaProvider.java │ │ │ │ ├── StructuredElicitResult.java │ │ │ │ └── package-info.java │ │ │ ├── method/ │ │ │ │ ├── changed/ │ │ │ │ │ ├── prompt/ │ │ │ │ │ │ ├── AbstractMcpPromptListChangedMethodCallback.java │ │ │ │ │ │ ├── AsyncMcpPromptListChangedMethodCallback.java │ │ │ │ │ │ ├── AsyncPromptListChangedSpecification.java │ │ │ │ │ │ ├── SyncMcpPromptListChangedMethodCallback.java │ │ │ │ │ │ ├── SyncPromptListChangedSpecification.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── resource/ │ │ │ │ │ │ ├── AbstractMcpResourceListChangedMethodCallback.java │ │ │ │ │ │ ├── AsyncMcpResourceListChangedMethodCallback.java │ │ │ │ │ │ ├── AsyncResourceListChangedSpecification.java │ │ │ │ │ │ ├── SyncMcpResourceListChangedMethodCallback.java │ │ │ │ │ │ ├── SyncResourceListChangedSpecification.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── tool/ │ │ │ │ │ ├── AbstractMcpToolListChangedMethodCallback.java │ │ │ │ │ ├── AsyncMcpToolListChangedMethodCallback.java │ │ │ │ │ ├── AsyncToolListChangedSpecification.java │ │ │ │ │ ├── SyncMcpToolListChangedMethodCallback.java │ │ │ │ │ ├── SyncToolListChangedSpecification.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── complete/ │ │ │ │ │ ├── AbstractMcpCompleteMethodCallback.java │ │ │ │ │ ├── AsyncMcpCompleteMethodCallback.java │ │ │ │ │ ├── AsyncStatelessMcpCompleteMethodCallback.java │ │ │ │ │ ├── SyncMcpCompleteMethodCallback.java │ │ │ │ │ ├── SyncStatelessMcpCompleteMethodCallback.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── elicitation/ │ │ │ │ │ ├── AbstractMcpElicitationMethodCallback.java │ │ │ │ │ ├── AsyncElicitationSpecification.java │ │ │ │ │ ├── AsyncMcpElicitationMethodCallback.java │ │ │ │ │ ├── SyncElicitationSpecification.java │ │ │ │ │ ├── SyncMcpElicitationMethodCallback.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── logging/ │ │ │ │ │ ├── AbstractMcpLoggingMethodCallback.java │ │ │ │ │ ├── AsyncLoggingSpecification.java │ │ │ │ │ ├── AsyncMcpLoggingMethodCallback.java │ │ │ │ │ ├── SyncLoggingSpecification.java │ │ │ │ │ ├── SyncMcpLoggingMethodCallback.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── progress/ │ │ │ │ │ ├── AbstractMcpProgressMethodCallback.java │ │ │ │ │ ├── AsyncMcpProgressMethodCallback.java │ │ │ │ │ ├── AsyncProgressSpecification.java │ │ │ │ │ ├── SyncMcpProgressMethodCallback.java │ │ │ │ │ ├── SyncProgressSpecification.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── prompt/ │ │ │ │ │ ├── AbstractMcpPromptMethodCallback.java │ │ │ │ │ ├── AsyncMcpPromptMethodCallback.java │ │ │ │ │ ├── AsyncStatelessMcpPromptMethodCallback.java │ │ │ │ │ ├── SyncMcpPromptMethodCallback.java │ │ │ │ │ ├── SyncStatelessMcpPromptMethodCallback.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── resource/ │ │ │ │ │ ├── AbstractMcpResourceMethodCallback.java │ │ │ │ │ ├── AsyncMcpResourceMethodCallback.java │ │ │ │ │ ├── AsyncStatelessMcpResourceMethodCallback.java │ │ │ │ │ ├── DefaultMcpReadResourceResultConverter.java │ │ │ │ │ ├── McpReadResourceResultConverter.java │ │ │ │ │ ├── SyncMcpResourceMethodCallback.java │ │ │ │ │ ├── SyncStatelessMcpResourceMethodCallback.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── sampling/ │ │ │ │ │ ├── AbstractMcpSamplingMethodCallback.java │ │ │ │ │ ├── AsyncMcpSamplingMethodCallback.java │ │ │ │ │ ├── AsyncSamplingSpecification.java │ │ │ │ │ ├── SyncMcpSamplingMethodCallback.java │ │ │ │ │ ├── SyncSamplingSpecification.java │ │ │ │ │ └── package-info.java │ │ │ │ └── tool/ │ │ │ │ ├── AbstractAsyncMcpToolMethodCallback.java │ │ │ │ ├── AbstractMcpToolMethodCallback.java │ │ │ │ ├── AbstractSyncMcpToolMethodCallback.java │ │ │ │ ├── AsyncMcpToolMethodCallback.java │ │ │ │ ├── AsyncStatelessMcpToolMethodCallback.java │ │ │ │ ├── ReactiveUtils.java │ │ │ │ ├── ReturnMode.java │ │ │ │ ├── SyncMcpToolMethodCallback.java │ │ │ │ ├── SyncStatelessMcpToolMethodCallback.java │ │ │ │ ├── package-info.java │ │ │ │ └── utils/ │ │ │ │ ├── McpJsonParser.java │ │ │ │ ├── McpJsonSchemaGenerator.java │ │ │ │ ├── SpringAiSchemaModule.java │ │ │ │ └── package-info.java │ │ │ ├── package-info.java │ │ │ ├── provider/ │ │ │ │ ├── changed/ │ │ │ │ │ ├── prompt/ │ │ │ │ │ │ ├── AsyncMcpPromptListChangedProvider.java │ │ │ │ │ │ ├── SyncMcpPromptListChangedProvider.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ ├── resource/ │ │ │ │ │ │ ├── AsyncMcpResourceListChangedProvider.java │ │ │ │ │ │ ├── SyncMcpResourceListChangedProvider.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── tool/ │ │ │ │ │ ├── AsyncMcpToolListChangedProvider.java │ │ │ │ │ ├── SyncMcpToolListChangedProvider.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── complete/ │ │ │ │ │ ├── AsyncMcpCompleteProvider.java │ │ │ │ │ ├── AsyncStatelessMcpCompleteProvider.java │ │ │ │ │ ├── SyncMcpCompleteProvider.java │ │ │ │ │ ├── SyncStatelessMcpCompleteProvider.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── elicitation/ │ │ │ │ │ ├── AsyncMcpElicitationProvider.java │ │ │ │ │ ├── SyncMcpElicitationProvider.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── logging/ │ │ │ │ │ ├── AsyncMcpLoggingProvider.java │ │ │ │ │ ├── SyncMcpLogginProvider.java │ │ │ │ │ ├── SyncMcpLoggingProvider.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── progress/ │ │ │ │ │ ├── AsyncMcpProgressProvider.java │ │ │ │ │ ├── SyncMcpProgressProvider.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── prompt/ │ │ │ │ │ ├── AsyncMcpPromptProvider.java │ │ │ │ │ ├── AsyncStatelessMcpPromptProvider.java │ │ │ │ │ ├── SyncMcpPromptProvider.java │ │ │ │ │ ├── SyncStatelessMcpPromptProvider.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── resource/ │ │ │ │ │ ├── AsyncMcpResourceProvider.java │ │ │ │ │ ├── AsyncStatelessMcpResourceProvider.java │ │ │ │ │ ├── SyncMcpResourceProvider.java │ │ │ │ │ ├── SyncStatelessMcpResourceProvider.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── sampling/ │ │ │ │ │ ├── AsyncMcpSamplingProvider.java │ │ │ │ │ ├── SyncMcpSamplingProvider.java │ │ │ │ │ └── package-info.java │ │ │ │ └── tool/ │ │ │ │ ├── AbstractMcpToolProvider.java │ │ │ │ ├── AsyncMcpToolProvider.java │ │ │ │ ├── AsyncStatelessMcpToolProvider.java │ │ │ │ ├── SyncMcpToolProvider.java │ │ │ │ ├── SyncStatelessMcpToolProvider.java │ │ │ │ └── package-info.java │ │ │ └── spring/ │ │ │ ├── AbstractClientMcpHandlerRegistry.java │ │ │ ├── AnnotationProviderUtil.java │ │ │ ├── AsyncMcpAnnotationProviders.java │ │ │ ├── ClientMcpAsyncHandlersRegistry.java │ │ │ ├── ClientMcpSyncHandlersRegistry.java │ │ │ ├── SyncMcpAnnotationProviders.java │ │ │ ├── package-info.java │ │ │ └── scan/ │ │ │ ├── AbstractAnnotatedMethodBeanFactoryInitializationAotProcessor.java │ │ │ ├── AbstractAnnotatedMethodBeanPostProcessor.java │ │ │ ├── AbstractMcpAnnotatedBeans.java │ │ │ ├── AnnotatedMethodDiscovery.java │ │ │ └── package-info.java │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── mcp/ │ │ └── annotation/ │ │ ├── common/ │ │ │ ├── McpPredicatesTests.java │ │ │ └── MetaUtilsTest.java │ │ ├── context/ │ │ │ ├── DefaultLoggingSpecTests.java │ │ │ ├── DefaultMcpAsyncRequestContextTests.java │ │ │ ├── DefaultMcpSyncRequestContextTests.java │ │ │ ├── DefaultMetaProviderTest.java │ │ │ ├── DefaultProgressSpecTests.java │ │ │ └── DefaultSamplingSpecTests.java │ │ ├── method/ │ │ │ ├── changed/ │ │ │ │ ├── prompt/ │ │ │ │ │ ├── AsyncMcpPromptListChangedMethodCallbackTests.java │ │ │ │ │ └── SyncMcpPromptListChangedMethodCallbackTests.java │ │ │ │ ├── resource/ │ │ │ │ │ ├── AsyncMcpResourceListChangedMethodCallbackTests.java │ │ │ │ │ └── SyncMcpResourceListChangedMethodCallbackTests.java │ │ │ │ └── tool/ │ │ │ │ ├── AsyncMcpToolListChangedMethodCallbackTests.java │ │ │ │ └── SyncMcpToolListChangedMethodCallbackTests.java │ │ │ ├── complete/ │ │ │ │ ├── AsyncMcpCompleteMethodCallbackExample.java │ │ │ │ ├── AsyncMcpCompleteMethodCallbackTests.java │ │ │ │ ├── AsyncStatelessMcpCompleteMethodCallbackTests.java │ │ │ │ ├── SyncMcpCompleteMethodCallbackExample.java │ │ │ │ ├── SyncMcpCompleteMethodCallbackTests.java │ │ │ │ └── SyncStatelessMcpCompleteMethodCallbackTests.java │ │ │ ├── elicitation/ │ │ │ │ ├── AsyncMcpElicitationMethodCallbackExample.java │ │ │ │ ├── AsyncMcpElicitationMethodCallbackTests.java │ │ │ │ ├── ElicitationSpecificationTests.java │ │ │ │ ├── ElicitationTestHelper.java │ │ │ │ ├── SyncMcpElicitationMethodCallbackExample.java │ │ │ │ └── SyncMcpElicitationMethodCallbackTests.java │ │ │ ├── logging/ │ │ │ │ ├── AsyncMcpLoggingMethodCallbackExample.java │ │ │ │ ├── AsyncMcpLoggingMethodCallbackTests.java │ │ │ │ ├── SyncMcpLoggingMethodCallbackExample.java │ │ │ │ └── SyncMcpLoggingMethodCallbackTests.java │ │ │ ├── progress/ │ │ │ │ ├── AsyncMcpProgressMethodCallbackExample.java │ │ │ │ ├── AsyncMcpProgressMethodCallbackTests.java │ │ │ │ ├── SyncMcpProgressMethodCallbackExample.java │ │ │ │ └── SyncMcpProgressMethodCallbackTests.java │ │ │ ├── prompt/ │ │ │ │ ├── AsyncMcpPromptMethodCallbackExample.java │ │ │ │ ├── AsyncMcpPromptMethodCallbackTests.java │ │ │ │ ├── AsyncStatelessMcpPromptMethodCallbackTests.java │ │ │ │ ├── SyncMcpPromptMethodCallbackExample.java │ │ │ │ ├── SyncMcpPromptMethodCallbackTests.java │ │ │ │ └── SyncStatelessMcpPromptMethodCallbackTests.java │ │ │ ├── resource/ │ │ │ │ ├── AsyncMcpResourceMethodCallbackTests.java │ │ │ │ ├── AsyncStatelessMcpResourceMethodCallbackTests.java │ │ │ │ ├── DefaultMcpReadResourceResultConverterTests.java │ │ │ │ ├── McpResourceUriValidationTest.java │ │ │ │ ├── SyncMcpResourceMethodCallbackExample.java │ │ │ │ ├── SyncMcpResourceMethodCallbackTests.java │ │ │ │ └── SyncStatelessMcpResourceMethodCallbackTests.java │ │ │ ├── sampling/ │ │ │ │ ├── AsyncMcpSamplingMethodCallbackExample.java │ │ │ │ ├── AsyncMcpSamplingMethodCallbackTests.java │ │ │ │ ├── SamplingTestHelper.java │ │ │ │ ├── SyncMcpSamplingMethodCallbackExample.java │ │ │ │ └── SyncMcpSamplingMethodCallbackTests.java │ │ │ └── tool/ │ │ │ ├── AsyncCallToolRequestSupportTests.java │ │ │ ├── AsyncMcpToolMethodCallbackTests.java │ │ │ ├── AsyncStatelessMcpToolMethodCallbackTests.java │ │ │ ├── CallToolRequestSupportTests.java │ │ │ ├── SyncMcpToolMethodCallbackExceptionHandlingTests.java │ │ │ ├── SyncMcpToolMethodCallbackTests.java │ │ │ └── SyncStatelessMcpToolMethodCallbackTests.java │ │ ├── provider/ │ │ │ ├── changed/ │ │ │ │ ├── prompt/ │ │ │ │ │ ├── AsyncMcpPromptListChangedProviderTests.java │ │ │ │ │ └── SyncMcpPromptListChangedProviderTests.java │ │ │ │ ├── resource/ │ │ │ │ │ ├── AsyncMcpResourceListChangedProviderTests.java │ │ │ │ │ └── SyncMcpResourceListChangedProviderTests.java │ │ │ │ └── tool/ │ │ │ │ ├── AsyncMcpToolListChangedProviderTests.java │ │ │ │ └── SyncMcpToolListChangedProviderTests.java │ │ │ ├── complete/ │ │ │ │ ├── AsyncMcpCompletionProviderTests.java │ │ │ │ ├── AsyncStatelessMcpCompleteProviderTests.java │ │ │ │ ├── SyncMcpCompletionProviderTests.java │ │ │ │ └── SyncStatelessMcpCompleteProviderTests.java │ │ │ ├── elicitation/ │ │ │ │ ├── AsyncMcpElicitationProviderTests.java │ │ │ │ └── SyncMcpElicitationProviderTests.java │ │ │ ├── logging/ │ │ │ │ ├── AsyncMcpLoggingProviderTests.java │ │ │ │ └── SyncMcpLoggingProviderTests.java │ │ │ ├── progress/ │ │ │ │ ├── AsyncMcpProgressProviderTests.java │ │ │ │ └── SyncMcpProgressProviderTests.java │ │ │ ├── prompt/ │ │ │ │ ├── AsyncMcpPromptProviderTests.java │ │ │ │ ├── AsyncStatelessMcpPromptProviderTests.java │ │ │ │ ├── SyncMcpPromptProviderTests.java │ │ │ │ └── SyncStatelessMcpPromptProviderTests.java │ │ │ ├── resource/ │ │ │ │ ├── AsyncMcpResourceProviderTests.java │ │ │ │ ├── AsyncStatelessMcpResourceProviderTests.java │ │ │ │ ├── SyncMcpResourceProviderTests.java │ │ │ │ └── SyncStatelessMcpResourceProviderTests.java │ │ │ ├── sampling/ │ │ │ │ ├── AsyncMcpSamplingProviderTests.java │ │ │ │ └── SyncMcpSamplingProviderTests.java │ │ │ └── tool/ │ │ │ ├── AsyncMcpToolProviderTests.java │ │ │ ├── AsyncStatelessMcpToolProviderTests.java │ │ │ ├── SyncMcpToolProviderTests.java │ │ │ └── SyncStatelessMcpToolProviderTests.java │ │ └── spring/ │ │ ├── AnnotationProviderUtilTests.java │ │ ├── AsyncMcpAnnotationProvidersTests.java │ │ ├── ClientMcpAsyncHandlersRegistryTests.java │ │ ├── ClientMcpSyncHandlersRegistryTests.java │ │ ├── SyncMcpAnnotationProvidersTests.java │ │ └── scan/ │ │ ├── AbstractAnnotatedMethodBeanFactoryInitializationAotProcessorTests.java │ │ ├── AbstractAnnotatedMethodBeanPostProcessorTests.java │ │ ├── AbstractMcpAnnotatedBeansTests.java │ │ └── AnnotatedMethodDiscoveryTests.java │ └── transport/ │ ├── mcp-spring-webflux/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── mcp/ │ │ │ ├── client/ │ │ │ │ └── webflux/ │ │ │ │ └── transport/ │ │ │ │ ├── WebClientStreamableHttpTransport.java │ │ │ │ ├── WebFluxSseClientTransport.java │ │ │ │ └── package-info.java │ │ │ └── server/ │ │ │ └── webflux/ │ │ │ └── transport/ │ │ │ ├── WebFluxSseServerTransportProvider.java │ │ │ ├── WebFluxStatelessServerTransport.java │ │ │ ├── WebFluxStreamableServerTransportProvider.java │ │ │ └── package-info.java │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── mcp/ │ │ │ ├── WebFluxSseIT.java │ │ │ ├── WebFluxStatelessIT.java │ │ │ ├── WebFluxStreamableHttpVersionNegotiationIT.java │ │ │ ├── WebFluxStreamableIT.java │ │ │ ├── client/ │ │ │ │ ├── WebClientStreamableHttpAsyncClientIT.java │ │ │ │ ├── WebClientStreamableHttpSyncClientIT.java │ │ │ │ ├── WebFluxSseMcpAsyncClientIT.java │ │ │ │ ├── WebFluxSseMcpSyncClientIT.java │ │ │ │ ├── _WebClientStreamableHttpAsyncClientResiliencyTests.java_ │ │ │ │ └── webflux/ │ │ │ │ └── transport/ │ │ │ │ ├── WebClientStreamableHttpTransportErrorHandlingIT.java │ │ │ │ ├── WebClientStreamableHttpTransportIT.java │ │ │ │ └── WebFluxSseClientTransportIT.java │ │ │ ├── common/ │ │ │ │ ├── AsyncServerMcpTransportContextIT.java │ │ │ │ └── SyncServerMcpTransportContextIT.java │ │ │ ├── security/ │ │ │ │ └── WebFluxServerTransportSecurityIT.java │ │ │ ├── server/ │ │ │ │ └── webflux/ │ │ │ │ └── transport/ │ │ │ │ ├── WebFluxSseMcpAsyncServerIT.java │ │ │ │ ├── WebFluxSseMcpSyncServerIT.java │ │ │ │ ├── WebFluxStreamableMcpAsyncServerIT.java │ │ │ │ └── WebFluxStreamableMcpSyncServerIT.java │ │ │ └── utils/ │ │ │ ├── McpJsonMapperUtils.java │ │ │ └── McpTestRequestRecordingExchangeFilterFunction.java │ │ └── resources/ │ │ └── logback.xml │ └── mcp-spring-webmvc/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── mcp/ │ │ └── server/ │ │ └── webmvc/ │ │ └── transport/ │ │ ├── HeaderUtils.java │ │ ├── WebMvcSseServerTransportProvider.java │ │ ├── WebMvcStatelessServerTransport.java │ │ ├── WebMvcStreamableServerTransportProvider.java │ │ └── package-info.java │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── mcp/ │ │ ├── common/ │ │ │ └── McpTransportContextIT.java │ │ ├── security/ │ │ │ └── ServerTransportSecurityIT.java │ │ └── server/ │ │ ├── TomcatTestUtil.java │ │ ├── WebMcpStreamableAsyncServerTransportIT.java │ │ ├── WebMcpStreamableSyncServerTransportIT.java │ │ ├── WebMvcSseAsyncServerTransportIT.java │ │ ├── WebMvcSseCustomContextPathIT.java │ │ ├── WebMvcSseIT.java │ │ ├── WebMvcSseSyncServerTransportIT.java │ │ ├── WebMvcStatelessIT.java │ │ ├── WebMvcStreamableIT.java │ │ └── webmvc/ │ │ └── transport/ │ │ ├── HeaderUtilsTests.java │ │ └── WebMvcSseServerTransportProviderIT.java │ └── resources/ │ └── logback.xml ├── mcp-spring-migration-guide.md ├── memory/ │ └── repository/ │ ├── spring-ai-model-chat-memory-repository-cassandra/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── chat/ │ │ │ └── memory/ │ │ │ └── repository/ │ │ │ └── cassandra/ │ │ │ ├── CassandraChatMemoryRepository.java │ │ │ ├── CassandraChatMemoryRepositoryConfig.java │ │ │ ├── SchemaUtil.java │ │ │ └── package-info.java │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── chat/ │ │ └── memory/ │ │ └── repository/ │ │ └── cassandra/ │ │ ├── CassandraChatMemoryRepositoryIT.java │ │ └── CassandraImage.java │ ├── spring-ai-model-chat-memory-repository-cosmos-db/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── chat/ │ │ │ └── memory/ │ │ │ └── repository/ │ │ │ └── cosmosdb/ │ │ │ ├── CosmosDBChatMemoryRepository.java │ │ │ ├── CosmosDBChatMemoryRepositoryConfig.java │ │ │ └── package-info.java │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── chat/ │ │ └── memory/ │ │ └── repository/ │ │ └── cosmosdb/ │ │ └── CosmosDBChatMemoryRepositoryIT.java │ ├── spring-ai-model-chat-memory-repository-jdbc/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── chat/ │ │ │ │ └── memory/ │ │ │ │ └── repository/ │ │ │ │ └── jdbc/ │ │ │ │ ├── H2ChatMemoryRepositoryDialect.java │ │ │ │ ├── HsqldbChatMemoryRepositoryDialect.java │ │ │ │ ├── JdbcChatMemoryRepository.java │ │ │ │ ├── JdbcChatMemoryRepositoryDialect.java │ │ │ │ ├── MysqlChatMemoryRepositoryDialect.java │ │ │ │ ├── OracleChatMemoryRepositoryDialect.java │ │ │ │ ├── PostgresChatMemoryRepositoryDialect.java │ │ │ │ ├── SqlServerChatMemoryRepositoryDialect.java │ │ │ │ ├── SqliteChatMemoryRepositoryDialect.java │ │ │ │ ├── aot/ │ │ │ │ │ └── hint/ │ │ │ │ │ ├── JdbcChatMemoryRepositoryRuntimeHints.java │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── spring/ │ │ │ │ └── aot.factories │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── chat/ │ │ │ └── memory/ │ │ │ └── repository/ │ │ │ └── jdbc/ │ │ │ ├── schema-h2.sql │ │ │ ├── schema-hsqldb.sql │ │ │ ├── schema-mariadb.sql │ │ │ ├── schema-mysql.sql │ │ │ ├── schema-oracle.sql │ │ │ ├── schema-postgresql.sql │ │ │ ├── schema-sqlite.sql │ │ │ └── schema-sqlserver.sql │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── chat/ │ │ │ └── memory/ │ │ │ └── repository/ │ │ │ └── jdbc/ │ │ │ ├── AbstractJdbcChatMemoryRepositoryIT.java │ │ │ ├── JdbcChatMemoryRepositoryBuilderTests.java │ │ │ ├── JdbcChatMemoryRepositoryH2IT.java │ │ │ ├── JdbcChatMemoryRepositoryMariaDbIT.java │ │ │ ├── JdbcChatMemoryRepositoryMysqlIT.java │ │ │ ├── JdbcChatMemoryRepositoryOracleIT.java │ │ │ ├── JdbcChatMemoryRepositoryPostgresqlIT.java │ │ │ ├── JdbcChatMemoryRepositorySqlServerIT.java │ │ │ ├── JdbcChatMemoryRepositorySqliteIT.java │ │ │ └── aot/ │ │ │ └── hint/ │ │ │ └── JdbcChatMemoryRepositoryRuntimeHintsTest.java │ │ └── resources/ │ │ └── container-license-acceptance.txt │ ├── spring-ai-model-chat-memory-repository-mongodb/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── chat/ │ │ │ └── memory/ │ │ │ └── repository/ │ │ │ └── mongo/ │ │ │ ├── Conversation.java │ │ │ ├── MongoChatMemoryRepository.java │ │ │ └── package-info.java │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── chat/ │ │ └── memory/ │ │ └── repository/ │ │ └── mongo/ │ │ └── MongoChatMemoryRepositoryIT.java │ ├── spring-ai-model-chat-memory-repository-neo4j/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── chat/ │ │ │ └── memory/ │ │ │ └── repository/ │ │ │ └── neo4j/ │ │ │ ├── AttributeGetter.java │ │ │ ├── MediaAttributes.java │ │ │ ├── MessageAttributes.java │ │ │ ├── Neo4jChatMemoryRepository.java │ │ │ ├── Neo4jChatMemoryRepositoryConfig.java │ │ │ ├── ToolCallAttributes.java │ │ │ ├── ToolResponseAttributes.java │ │ │ └── package-info.java │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── chat/ │ │ └── memory/ │ │ └── repository/ │ │ └── neo4j/ │ │ ├── Neo4JChatMemoryRepositoryConfigIT.java │ │ └── Neo4jChatMemoryRepositoryIT.java │ └── spring-ai-model-chat-memory-repository-redis/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── chat/ │ │ └── memory/ │ │ └── repository/ │ │ └── redis/ │ │ ├── AdvancedRedisChatMemoryRepository.java │ │ ├── RedisChatMemoryConfig.java │ │ ├── RedisChatMemoryRepository.java │ │ └── package-info.java │ └── test/ │ ├── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── chat/ │ │ └── memory/ │ │ └── repository/ │ │ └── redis/ │ │ ├── RedisChatMemoryAdvancedQueryIT.java │ │ ├── RedisChatMemoryErrorHandlingIT.java │ │ ├── RedisChatMemoryIT.java │ │ ├── RedisChatMemoryMediaIT.java │ │ ├── RedisChatMemoryMessageTypesIT.java │ │ ├── RedisChatMemoryRepositoryIT.java │ │ └── RedisChatMemoryWithSchemaIT.java │ └── resources/ │ ├── application-metadata-schema.yml │ └── logback-test.xml ├── models/ │ ├── spring-ai-anthropic/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── anthropic/ │ │ │ ├── AbstractAnthropicOptions.java │ │ │ ├── AnthropicCacheOptions.java │ │ │ ├── AnthropicCacheStrategy.java │ │ │ ├── AnthropicCacheTtl.java │ │ │ ├── AnthropicChatModel.java │ │ │ ├── AnthropicChatOptions.java │ │ │ ├── AnthropicCitationDocument.java │ │ │ ├── AnthropicServiceTier.java │ │ │ ├── AnthropicSetup.java │ │ │ ├── AnthropicSkill.java │ │ │ ├── AnthropicSkillContainer.java │ │ │ ├── AnthropicSkillRecord.java │ │ │ ├── AnthropicSkillType.java │ │ │ ├── AnthropicSkillsResponseHelper.java │ │ │ ├── AnthropicWebSearchResult.java │ │ │ ├── AnthropicWebSearchTool.java │ │ │ ├── CacheBreakpointTracker.java │ │ │ ├── CacheEligibilityResolver.java │ │ │ ├── Citation.java │ │ │ └── package-info.java │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── anthropic/ │ │ │ ├── AnthropicCacheOptionsTests.java │ │ │ ├── AnthropicChatModelTests.java │ │ │ ├── AnthropicChatOptionsTests.java │ │ │ ├── AnthropicSkillsIT.java │ │ │ ├── AnthropicSkillsResponseHelperTests.java │ │ │ ├── AnthropicTestConfiguration.java │ │ │ ├── CacheEligibilityResolverTests.java │ │ │ └── chat/ │ │ │ ├── AnthropicChatClientIT.java │ │ │ ├── AnthropicChatModelIT.java │ │ │ ├── AnthropicChatModelObservationIT.java │ │ │ ├── AnthropicPromptCachingIT.java │ │ │ └── MockWeatherService.java │ │ └── resources/ │ │ └── prompts/ │ │ ├── conversation-history-cache-prompt.txt │ │ ├── extended-ttl-cache-prompt.txt │ │ ├── system-and-tools-cache-prompt.txt │ │ ├── system-message.st │ │ └── system-only-cache-prompt.txt │ ├── spring-ai-azure-openai/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── azure/ │ │ │ │ └── openai/ │ │ │ │ ├── AzureOpenAiAudioTranscriptionModel.java │ │ │ │ ├── AzureOpenAiAudioTranscriptionOptions.java │ │ │ │ ├── AzureOpenAiChatModel.java │ │ │ │ ├── AzureOpenAiChatOptions.java │ │ │ │ ├── AzureOpenAiEmbeddingModel.java │ │ │ │ ├── AzureOpenAiEmbeddingOptions.java │ │ │ │ ├── AzureOpenAiImageModel.java │ │ │ │ ├── AzureOpenAiImageOptions.java │ │ │ │ ├── AzureOpenAiResponseFormat.java │ │ │ │ ├── MergeUtils.java │ │ │ │ ├── aot/ │ │ │ │ │ └── AzureOpenAiRuntimeHints.java │ │ │ │ └── metadata/ │ │ │ │ ├── AzureOpenAiAudioTranscriptionResponseMetadata.java │ │ │ │ ├── AzureOpenAiImageGenerationMetadata.java │ │ │ │ └── AzureOpenAiImageResponseMetadata.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── azure/ │ │ │ └── openai/ │ │ │ ├── AzureChatCompletionsOptionsTests.java │ │ │ ├── AzureEmbeddingsOptionsTests.java │ │ │ ├── AzureOpenAiAudioTranscriptionModelIT.java │ │ │ ├── AzureOpenAiChatClientIT.java │ │ │ ├── AzureOpenAiChatModelIT.java │ │ │ ├── AzureOpenAiChatModelObservationIT.java │ │ │ ├── AzureOpenAiChatOptionsTests.java │ │ │ ├── AzureOpenAiEmbeddingModelIT.java │ │ │ ├── AzureOpenAiEmbeddingModelObservationIT.java │ │ │ ├── MockAiTestConfiguration.java │ │ │ ├── MockAzureOpenAiTestConfiguration.java │ │ │ ├── RequiresAzureCredentials.java │ │ │ ├── aot/ │ │ │ │ └── AzureOpenAiRuntimeHintsTests.java │ │ │ ├── function/ │ │ │ │ ├── AzureOpenAiChatModelFunctionCallIT.java │ │ │ │ └── MockWeatherService.java │ │ │ ├── image/ │ │ │ │ └── AzureOpenAiImageModelIT.java │ │ │ └── metadata/ │ │ │ └── AzureOpenAiChatModelMetadataTests.java │ │ └── resources/ │ │ ├── prompts/ │ │ │ └── system-message.st │ │ └── speech/ │ │ └── jfk.flac │ ├── spring-ai-bedrock/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── bedrock/ │ │ │ │ ├── MessageToPromptConverter.java │ │ │ │ ├── aot/ │ │ │ │ │ └── BedrockRuntimeHints.java │ │ │ │ ├── api/ │ │ │ │ │ └── AbstractBedrockApi.java │ │ │ │ ├── cohere/ │ │ │ │ │ ├── BedrockCohereEmbeddingModel.java │ │ │ │ │ ├── BedrockCohereEmbeddingOptions.java │ │ │ │ │ └── api/ │ │ │ │ │ └── CohereEmbeddingBedrockApi.java │ │ │ │ └── titan/ │ │ │ │ ├── BedrockTitanEmbeddingModel.java │ │ │ │ ├── BedrockTitanEmbeddingOptions.java │ │ │ │ └── api/ │ │ │ │ └── TitanEmbeddingBedrockApi.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── bedrock/ │ │ │ ├── RequiresAwsCredentials.java │ │ │ ├── aot/ │ │ │ │ └── BedrockRuntimeHintsTests.java │ │ │ ├── api/ │ │ │ │ └── AbstractBedrockApiTest.java │ │ │ ├── cohere/ │ │ │ │ ├── BedrockCohereEmbeddingModelIT.java │ │ │ │ └── api/ │ │ │ │ └── CohereEmbeddingBedrockApiIT.java │ │ │ └── titan/ │ │ │ ├── BedrockTitanEmbeddingModelIT.java │ │ │ └── api/ │ │ │ └── TitanEmbeddingBedrockApiIT.java │ │ └── resources/ │ │ └── prompts/ │ │ └── system-message.st │ ├── spring-ai-bedrock-converse/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── bedrock/ │ │ │ └── converse/ │ │ │ ├── BedrockChatOptions.java │ │ │ ├── BedrockProxyChatModel.java │ │ │ └── api/ │ │ │ ├── BedrockCacheOptions.java │ │ │ ├── BedrockCacheStrategy.java │ │ │ ├── BedrockMediaFormat.java │ │ │ ├── ConverseApiUtils.java │ │ │ ├── ConverseChatResponseStream.java │ │ │ ├── MediaFetcher.java │ │ │ ├── StreamingToolCallBuilder.java │ │ │ └── URLValidator.java │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── bedrock/ │ │ │ └── converse/ │ │ │ ├── BedrockChatOptionsTests.java │ │ │ ├── BedrockConverseTestConfiguration.java │ │ │ ├── BedrockConverseUsageAggregationTests.java │ │ │ ├── BedrockProxyChatModelIT.java │ │ │ ├── BedrockProxyChatModelObservationIT.java │ │ │ ├── BedrockProxyChatModelTest.java │ │ │ ├── MockWeatherService.java │ │ │ ├── RequiresAwsCredentials.java │ │ │ ├── api/ │ │ │ │ ├── BedrockMediaFormatTest.java │ │ │ │ ├── MediaFetcherTest.java │ │ │ │ └── URLValidatorTest.java │ │ │ ├── client/ │ │ │ │ ├── BedrockConverseChatClientIT.java │ │ │ │ ├── BedrockNovaChatClientIT.java │ │ │ │ └── BedrockNovaToolCallAdvisorIT.java │ │ │ └── experiments/ │ │ │ ├── BedrockConverseChatModelMain.java │ │ │ └── BedrockConverseChatModelMain3.java │ │ └── resources/ │ │ └── prompts/ │ │ └── system-message.st │ ├── spring-ai-deepseek/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── deepseek/ │ │ │ │ ├── DeepSeekAssistantMessage.java │ │ │ │ ├── DeepSeekChatModel.java │ │ │ │ ├── DeepSeekChatOptions.java │ │ │ │ ├── aot/ │ │ │ │ │ ├── DeepSeekRuntimeHints.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── api/ │ │ │ │ │ ├── DeepSeekApi.java │ │ │ │ │ ├── DeepSeekStreamFunctionCallingHelper.java │ │ │ │ │ ├── ResponseFormat.java │ │ │ │ │ ├── common/ │ │ │ │ │ │ ├── DeepSeekConstants.java │ │ │ │ │ │ └── package-info.java │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── deepseek/ │ │ │ ├── DeepSeekAssistantMessageTests.java │ │ │ ├── DeepSeekChatCompletionRequestTests.java │ │ │ ├── DeepSeekChatOptionsTests.java │ │ │ ├── DeepSeekRetryTests.java │ │ │ ├── DeepSeekTestConfiguration.java │ │ │ ├── aot/ │ │ │ │ └── DeepSeekRuntimeHintsTests.java │ │ │ ├── api/ │ │ │ │ ├── DeepSeekApiIT.java │ │ │ │ ├── DeepSeekStreamFunctionCallingHelperTest.java │ │ │ │ └── MockWeatherService.java │ │ │ └── chat/ │ │ │ ├── ActorsFilms.java │ │ │ ├── DeepSeekChatModelFunctionCallingIT.java │ │ │ ├── DeepSeekChatModelIT.java │ │ │ └── DeepSeekChatModelObservationIT.java │ │ └── resources/ │ │ └── prompts/ │ │ └── system-message.st │ ├── spring-ai-elevenlabs/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── elevenlabs/ │ │ │ │ ├── ElevenLabsTextToSpeechModel.java │ │ │ │ ├── ElevenLabsTextToSpeechOptions.java │ │ │ │ ├── aot/ │ │ │ │ │ └── ElevenLabsRuntimeHints.java │ │ │ │ └── api/ │ │ │ │ ├── ElevenLabsApi.java │ │ │ │ └── ElevenLabsVoicesApi.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── elevenlabs/ │ │ │ ├── ElevenLabsTestConfiguration.java │ │ │ ├── ElevenLabsTextToSpeechModelIT.java │ │ │ ├── ElevenLabsTextToSpeechOptionsTests.java │ │ │ └── api/ │ │ │ ├── ElevenLabsApiIT.java │ │ │ └── ElevenLabsVoicesApiIT.java │ │ └── resources/ │ │ └── voices.json │ ├── spring-ai-google-genai/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── google/ │ │ │ │ └── genai/ │ │ │ │ ├── GoogleGenAiChatModel.java │ │ │ │ ├── GoogleGenAiChatOptions.java │ │ │ │ ├── MimeTypeDetector.java │ │ │ │ ├── aot/ │ │ │ │ │ └── GoogleGenAiRuntimeHints.java │ │ │ │ ├── cache/ │ │ │ │ │ ├── CachedContentRequest.java │ │ │ │ │ ├── CachedContentUpdateRequest.java │ │ │ │ │ ├── GoogleGenAiCachedContent.java │ │ │ │ │ └── GoogleGenAiCachedContentService.java │ │ │ │ ├── common/ │ │ │ │ │ ├── GoogleGenAiConstants.java │ │ │ │ │ ├── GoogleGenAiSafetySetting.java │ │ │ │ │ └── GoogleGenAiThinkingLevel.java │ │ │ │ ├── metadata/ │ │ │ │ │ ├── GoogleGenAiModalityTokenCount.java │ │ │ │ │ ├── GoogleGenAiTrafficType.java │ │ │ │ │ └── GoogleGenAiUsage.java │ │ │ │ └── schema/ │ │ │ │ ├── GoogleGenAiToolCallingManager.java │ │ │ │ └── JsonSchemaConverter.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── google/ │ │ │ └── genai/ │ │ │ ├── CreateGeminiRequestTests.java │ │ │ ├── GoogleGenAiChatModelCachedContentTests.java │ │ │ ├── GoogleGenAiChatModelExtendedUsageTests.java │ │ │ ├── GoogleGenAiChatModelIT.java │ │ │ ├── GoogleGenAiChatModelMLDevIT.java │ │ │ ├── GoogleGenAiChatModelObservationApiKeyIT.java │ │ │ ├── GoogleGenAiChatModelObservationIT.java │ │ │ ├── GoogleGenAiChatOptionsTest.java │ │ │ ├── GoogleGenAiRetryTests.java │ │ │ ├── GoogleGenAiThinkingLevelIT.java │ │ │ ├── GoogleGenAiThoughtSignatureLifecycleIT.java │ │ │ ├── MimeTypeDetectorTests.java │ │ │ ├── TestGoogleGenAiCachedContentService.java │ │ │ ├── TestGoogleGenAiGeminiChatModel.java │ │ │ ├── aot/ │ │ │ │ └── GoogleGenAiRuntimeHintsTests.java │ │ │ ├── cache/ │ │ │ │ └── GoogleGenAiCachedContentServiceTests.java │ │ │ ├── client/ │ │ │ │ └── GoogleGenAiToolCallAdvisorIT.java │ │ │ ├── metadata/ │ │ │ │ └── GoogleGenAiUsageTests.java │ │ │ ├── schema/ │ │ │ │ └── JsonSchemaConverterTests.java │ │ │ └── tool/ │ │ │ ├── GoogleGenAiChatModelToolCallingIT.java │ │ │ ├── GoogleGenAiPaymentTransactionIT.java │ │ │ ├── GoogleGenAiPaymentTransactionMethodIT.java │ │ │ ├── GoogleGenAiPaymentTransactionToolsIT.java │ │ │ └── MockWeatherService.java │ │ └── resources/ │ │ └── prompts/ │ │ └── system-message.st │ ├── spring-ai-google-genai-embedding/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── google/ │ │ │ └── genai/ │ │ │ ├── GoogleGenAiEmbeddingConnectionDetails.java │ │ │ └── text/ │ │ │ ├── GoogleGenAiTextEmbeddingModel.java │ │ │ ├── GoogleGenAiTextEmbeddingModelName.java │ │ │ └── GoogleGenAiTextEmbeddingOptions.java │ │ └── test/ │ │ └── java/ │ │ └── org/ │ │ └── springframework/ │ │ └── ai/ │ │ └── google/ │ │ └── genai/ │ │ └── text/ │ │ ├── GoogleGenAiTextEmbeddingModelIT.java │ │ ├── GoogleGenAiTextEmbeddingModelObservationIT.java │ │ ├── GoogleGenAiTextEmbeddingRetryTests.java │ │ └── TestGoogleGenAiTextEmbeddingModel.java │ ├── spring-ai-minimax/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── minimax/ │ │ │ │ ├── MiniMaxChatModel.java │ │ │ │ ├── MiniMaxChatOptions.java │ │ │ │ ├── MiniMaxEmbeddingModel.java │ │ │ │ ├── MiniMaxEmbeddingOptions.java │ │ │ │ ├── aot/ │ │ │ │ │ └── MiniMaxRuntimeHints.java │ │ │ │ └── api/ │ │ │ │ ├── MiniMaxApi.java │ │ │ │ ├── MiniMaxApiConstants.java │ │ │ │ └── MiniMaxStreamFunctionCallingHelper.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── minimax/ │ │ │ ├── ChatCompletionRequestTests.java │ │ │ ├── MiniMaxChatOptionsTests.java │ │ │ ├── MiniMaxTestConfiguration.java │ │ │ ├── api/ │ │ │ │ ├── MiniMaxApiIT.java │ │ │ │ ├── MiniMaxApiToolFunctionCallIT.java │ │ │ │ ├── MiniMaxRetryTests.java │ │ │ │ └── MockWeatherService.java │ │ │ ├── chat/ │ │ │ │ ├── MiniMaxChatModelObservationIT.java │ │ │ │ └── MiniMaxChatOptionsTests.java │ │ │ └── embedding/ │ │ │ ├── EmbeddingIT.java │ │ │ └── MiniMaxEmbeddingModelObservationIT.java │ │ └── resources/ │ │ └── prompts/ │ │ └── system-message.st │ ├── spring-ai-mistral-ai/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── mistralai/ │ │ │ │ ├── MistralAiChatModel.java │ │ │ │ ├── MistralAiChatOptions.java │ │ │ │ ├── MistralAiEmbeddingModel.java │ │ │ │ ├── MistralAiEmbeddingOptions.java │ │ │ │ ├── aot/ │ │ │ │ │ ├── MistralAiRuntimeHints.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── api/ │ │ │ │ │ ├── MistralAiApi.java │ │ │ │ │ ├── MistralAiModerationApi.java │ │ │ │ │ ├── MistralAiStreamFunctionCallingHelper.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── moderation/ │ │ │ │ │ ├── MistralAiModerationModel.java │ │ │ │ │ ├── MistralAiModerationOptions.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── ocr/ │ │ │ │ │ ├── MistralAiOcrOptions.java │ │ │ │ │ ├── MistralOcrApi.java │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── mistralai/ │ │ │ ├── MistralAiChatClientIT.java │ │ │ ├── MistralAiChatCompletionRequestTests.java │ │ │ ├── MistralAiChatModelIT.java │ │ │ ├── MistralAiChatModelObservationIT.java │ │ │ ├── MistralAiChatOptionsTests.java │ │ │ ├── MistralAiEmbeddingIT.java │ │ │ ├── MistralAiEmbeddingModelObservationIT.java │ │ │ ├── MistralAiEmbeddingModelTests.java │ │ │ ├── MistralAiModerationModelIT.java │ │ │ ├── MistralAiRetryTests.java │ │ │ ├── MistralAiTestConfiguration.java │ │ │ ├── MockWeatherService.java │ │ │ ├── aot/ │ │ │ │ └── MistralAiRuntimeHintsTests.java │ │ │ ├── api/ │ │ │ │ ├── MistralAiApiIT.java │ │ │ │ └── tool/ │ │ │ │ ├── MistralAiApiToolFunctionCallIT.java │ │ │ │ ├── MockWeatherService.java │ │ │ │ └── PaymentStatusFunctionCallingIT.java │ │ │ └── ocr/ │ │ │ ├── MistralAiOcrOptionsTests.java │ │ │ └── MistralOcrApiIT.java │ │ └── resources/ │ │ └── prompts/ │ │ ├── acme/ │ │ │ └── system-qa.st │ │ ├── eval/ │ │ │ ├── qa-evaluator-accurate-answer.st │ │ │ ├── qa-evaluator-fact-based-answer.st │ │ │ ├── qa-evaluator-not-related-message.st │ │ │ └── user-evaluator-message.st │ │ └── system-message.st │ ├── spring-ai-ollama/ │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── org/ │ │ │ │ └── springframework/ │ │ │ │ └── ai/ │ │ │ │ └── ollama/ │ │ │ │ ├── OllamaChatModel.java │ │ │ │ ├── OllamaEmbeddingModel.java │ │ │ │ ├── aot/ │ │ │ │ │ ├── OllamaRuntimeHints.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── api/ │ │ │ │ │ ├── OllamaApi.java │ │ │ │ │ ├── OllamaApiHelper.java │ │ │ │ │ ├── OllamaChatOptions.java │ │ │ │ │ ├── OllamaEmbeddingOptions.java │ │ │ │ │ ├── OllamaModel.java │ │ │ │ │ ├── ThinkOption.java │ │ │ │ │ ├── common/ │ │ │ │ │ │ └── OllamaApiConstants.java │ │ │ │ │ └── package-info.java │ │ │ │ ├── management/ │ │ │ │ │ ├── ModelManagementOptions.java │ │ │ │ │ ├── OllamaModelManager.java │ │ │ │ │ ├── PullModelStrategy.java │ │ │ │ │ └── package-info.java │ │ │ │ └── package-info.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring/ │ │ │ └── aot.factories │ │ └── test/ │ │ ├── java/ │ │ │ └── org/ │ │ │ └── springframework/ │ │ │ └── ai/ │ │ │ └── ollama/ │ │ │ ├── BaseOllamaIT.java │ │ │ ├── OllamaChatModelFunctionCallingIT.java │ │ │ ├── OllamaChatModelIT.java │ │ │ ├── OllamaChatModelMetadataIT.java │ │ │ ├── OllamaChatModelMultimodalIT.java │ │ │ ├── OllamaChatModelObservationIT.java │ │ │ ├── OllamaChatModelTests.java │ │ │ ├── OllamaChatRequestTests.java │ │
Showing preview only (1,918K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (21662 symbols across 1916 files)
FILE: advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java
class QuestionAnswerAdvisor (line 55) | public class QuestionAnswerAdvisor implements BaseAdvisor {
method QuestionAnswerAdvisor (line 87) | QuestionAnswerAdvisor(VectorStore vectorStore, SearchRequest searchReq...
method builder (line 99) | public static Builder builder(VectorStore vectorStore) {
method getOrder (line 103) | @Override
method before (line 108) | @Override
method after (line 143) | @Override
method doGetFilterExpression (line 158) | protected Filter.@Nullable Expression doGetFilterExpression(Map<String...
method getScheduler (line 166) | @Override
class Builder (line 171) | public static final class Builder {
method Builder (line 183) | private Builder(VectorStore vectorStore) {
method promptTemplate (line 188) | public Builder promptTemplate(PromptTemplate promptTemplate) {
method searchRequest (line 194) | public Builder searchRequest(SearchRequest searchRequest) {
method protectFromBlocking (line 200) | public Builder protectFromBlocking(boolean protectFromBlocking) {
method scheduler (line 205) | public Builder scheduler(Scheduler scheduler) {
method order (line 210) | public Builder order(int order) {
method build (line 215) | public QuestionAnswerAdvisor build() {
FILE: advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisor.java
class VectorStoreChatMemoryAdvisor (line 62) | public final class VectorStoreChatMemoryAdvisor implements BaseChatMemor...
method VectorStoreChatMemoryAdvisor (line 95) | private VectorStoreChatMemoryAdvisor(PromptTemplate systemPromptTempla...
method builder (line 110) | public static Builder builder(VectorStore chatMemory) {
method getOrder (line 114) | @Override
method getScheduler (line 119) | @Override
method before (line 124) | @Override
method getChatMemoryTopK (line 152) | private int getChatMemoryTopK(Map<String, @Nullable Object> context) {
method after (line 162) | @Override
method adviseStream (line 177) | @Override
method toDocuments (line 191) | private List<Document> toDocuments(List<Message> messages, String conv...
class Builder (line 220) | public static final class Builder {
method Builder (line 238) | Builder(VectorStore vectorStore) {
method systemPromptTemplate (line 247) | public Builder systemPromptTemplate(PromptTemplate systemPromptTempl...
method defaultTopK (line 257) | public Builder defaultTopK(int defaultTopK) {
method conversationId (line 267) | public Builder conversationId(String conversationId) {
method scheduler (line 272) | public Builder scheduler(Scheduler scheduler) {
method order (line 282) | public Builder order(int order) {
method build (line 291) | public VectorStoreChatMemoryAdvisor build() {
FILE: advisors/spring-ai-advisors-vector-store/src/test/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisorTests.java
class QuestionAnswerAdvisorTests (line 59) | @ExtendWith(MockitoExtension.class)
method qaAdvisorWithDynamicFilterExpressions (line 74) | @Test
method qaAdvisorTakesUserTextParametersIntoAccountForSimilaritySearch (line 183) | @Test
method qaAdvisorTakesUserParameterizedUserMessagesIntoAccountForSimilaritySearch (line 214) | @Test
method qaAdvisorWithMultipleFilterParameters (line 249) | @Test
method qaAdvisorWithDifferentSimilarityThresholds (line 280) | @Test
method qaAdvisorWithComplexParameterizedTemplate (line 307) | @Test
method qaAdvisorWithDocumentsContainingMetadata (line 346) | @Test
method qaAdvisorBuilderValidation (line 377) | @Test
method qaAdvisorWithZeroTopK (line 388) | @Test
FILE: advisors/spring-ai-advisors-vector-store/src/test/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisorTests.java
class VectorStoreChatMemoryAdvisorTests (line 34) | class VectorStoreChatMemoryAdvisorTests {
method whenVectorStoreIsNullThenThrow (line 36) | @Test
method whenDefaultConversationIdIsNullThenThrow (line 43) | @Test
method whenDefaultConversationIdIsEmptyThenThrow (line 52) | @Test
method whenSchedulerIsNullThenThrow (line 61) | @Test
method whenSystemPromptTemplateIsNullThenThrow (line 70) | @Test
method whenDefaultTopKIsZeroThenThrow (line 79) | @Test
method whenDefaultTopKIsNegativeThenThrow (line 88) | @Test
method whenBuilderWithValidVectorStoreThenSuccess (line 97) | @Test
method whenBuilderWithAllValidParametersThenSuccess (line 106) | @Test
method whenDefaultConversationIdIsBlankThenThrow (line 122) | @Test
method whenBuilderWithValidConversationIdThenSuccess (line 131) | @Test
method whenBuilderWithValidTopKThenSuccess (line 142) | @Test
method whenBuilderWithMinimumTopKThenSuccess (line 153) | @Test
method whenBuilderWithLargeTopKThenSuccess (line 162) | @Test
method whenBuilderCalledMultipleTimesWithSameVectorStoreThenSuccess (line 173) | @Test
method whenBuilderWithCustomSchedulerThenSuccess (line 185) | @Test
method whenBuilderWithCustomSystemPromptTemplateThenSuccess (line 197) | @Test
method whenBuilderWithEmptyStringConversationIdThenThrow (line 209) | @Test
method whenBuilderWithWhitespaceOnlyConversationIdThenThrow (line 218) | @Test
method whenBuilderWithSpecialCharactersInConversationIdThenSuccess (line 227) | @Test
method whenBuilderWithMaxIntegerTopKThenSuccess (line 238) | @Test
method whenBuilderWithNegativeTopKThenThrow (line 249) | @Test
method whenBuilderChainedWithAllParametersThenSuccess (line 258) | @Test
method whenBuilderParametersSetInDifferentOrderThenSuccess (line 274) | @Test
method whenBuilderWithOverriddenParametersThenUseLastValue (line 290) | @Test
method whenBuilderReusedThenCreatesSeparateInstances (line 304) | @Test
method whenBuilderWithLongConversationIdThenSuccess (line 319) | @Test
method whenBuilderCalledWithNullAfterValidValueThenThrow (line 331) | @Test
method whenBuilderWithTopKBoundaryValuesThenSuccess (line 342) | @Test
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/main/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryAutoConfiguration.java
class SpringAiRetryAutoConfiguration (line 55) | @AutoConfiguration
method retryTemplate (line 62) | @Bean
method responseErrorHandler (line 87) | @Bean
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/main/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryProperties.java
class SpringAiRetryProperties (line 31) | @ConfigurationProperties(SpringAiRetryProperties.CONFIG_PREFIX)
method getMaxAttempts (line 65) | public int getMaxAttempts() {
method setMaxAttempts (line 69) | public void setMaxAttempts(int maxAttempts) {
method getBackoff (line 73) | public Backoff getBackoff() {
method getExcludeOnHttpCodes (line 77) | public List<Integer> getExcludeOnHttpCodes() {
method setExcludeOnHttpCodes (line 81) | public void setExcludeOnHttpCodes(List<Integer> onHttpCodes) {
method isOnClientErrors (line 85) | public boolean isOnClientErrors() {
method setOnClientErrors (line 89) | public void setOnClientErrors(boolean onClientErrors) {
method getOnHttpCodes (line 93) | public List<Integer> getOnHttpCodes() {
method setOnHttpCodes (line 97) | public void setOnHttpCodes(List<Integer> onHttpCodes) {
class Backoff (line 104) | public static class Backoff {
method getInitialInterval (line 121) | public Duration getInitialInterval() {
method setInitialInterval (line 125) | public void setInitialInterval(Duration initialInterval) {
method getMultiplier (line 129) | public int getMultiplier() {
method setMultiplier (line 133) | public void setMultiplier(int multiplier) {
method getMaxInterval (line 137) | public Duration getMaxInterval() {
method setMaxInterval (line 141) | public void setMaxInterval(Duration maxInterval) {
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/test/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryAutoConfigurationIT.java
class SpringAiRetryAutoConfigurationIT (line 32) | public class SpringAiRetryAutoConfigurationIT {
method testRetryAutoConfiguration (line 37) | @Test
FILE: auto-configurations/common/spring-ai-autoconfigure-retry/src/test/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryPropertiesTests.java
class SpringAiRetryPropertiesTests (line 31) | public class SpringAiRetryPropertiesTests {
method retryDefaultProperties (line 33) | @Test
method retryCustomProperties (line 51) | @Test
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpAsyncToolsChangeEventEmmiter.java
class McpAsyncToolsChangeEventEmmiter (line 33) | public class McpAsyncToolsChangeEventEmmiter implements McpClientCustomi...
method McpAsyncToolsChangeEventEmmiter (line 37) | public McpAsyncToolsChangeEventEmmiter(ApplicationEventPublisher appli...
method customize (line 42) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpClientAutoConfiguration.java
class McpClientAutoConfiguration (line 99) | @AutoConfiguration
method connectedClientName (line 113) | private String connectedClientName(String clientName, String serverCon...
method mcpSyncToolChangeEventEmmiter (line 117) | @Bean
method mcpSyncClients (line 145) | @Bean
method makeSyncClientsClosable (line 203) | @Bean
method mcpSyncClientConfigurer (line 220) | @Bean
method mcpAsyncToolChangeEventEmmiter (line 231) | @Bean
method mcpAsyncClients (line 238) | @Bean
method makeAsyncClientsClosable (line 288) | @Bean
method mcpAsyncClientConfigurer (line 294) | @Bean
method close (line 312) | @Override
method close (line 319) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpSseClientConnectionDetails.java
type McpSseClientConnectionDetails (line 29) | public interface McpSseClientConnectionDetails extends ConnectionDetails {
method getConnections (line 31) | Map<String, McpSseClientProperties.SseParameters> getConnections();
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpSyncToolsChangeEventEmmiter.java
class McpSyncToolsChangeEventEmmiter (line 32) | public class McpSyncToolsChangeEventEmmiter implements McpClientCustomiz...
method McpSyncToolsChangeEventEmmiter (line 36) | public McpSyncToolsChangeEventEmmiter(ApplicationEventPublisher applic...
method customize (line 41) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpToolCallbackAutoConfiguration.java
class McpToolCallbackAutoConfiguration (line 45) | @AutoConfiguration
method defaultMcpToolNamePrefixGenerator (line 50) | @Bean
method mcpToolCallbacks (line 68) | @Bean
method mcpAsyncToolCallbacks (line 88) | @Bean
class McpToolCallbackAutoConfigurationCondition (line 104) | public static class McpToolCallbackAutoConfigurationCondition extends ...
method McpToolCallbackAutoConfigurationCondition (line 106) | public McpToolCallbackAutoConfigurationCondition() {
class McpAutoConfigEnabled (line 110) | @ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PRE...
class ToolCallbackProviderEnabled (line 116) | @ConditionalOnProperty(prefix = McpClientCommonProperties.CONFIG_PRE...
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/PropertiesMcpSseClientConnectionDetails.java
class PropertiesMcpSseClientConnectionDetails (line 23) | public class PropertiesMcpSseClientConnectionDetails implements McpSseCl...
method PropertiesMcpSseClientConnectionDetails (line 27) | public PropertiesMcpSseClientConnectionDetails(McpSseClientProperties ...
method getConnections (line 31) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/StdioTransportAutoConfiguration.java
class StdioTransportAutoConfiguration (line 54) | @AutoConfiguration
method stdioTransports (line 72) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientAnnotationScannerAutoConfiguration.java
class McpClientAnnotationScannerAutoConfiguration (line 52) | @AutoConfiguration
method clientMcpSyncHandlersRegistry (line 64) | @Bean
method clientMcpAsyncHandlersRegistry (line 72) | @Bean
method clientAnnotatedBeanFactoryInitializationAotProcessor (line 79) | @Bean
class ClientMcpAnnotatedBeans (line 84) | public static class ClientMcpAnnotatedBeans extends AbstractMcpAnnotat...
class ClientAnnotatedBeanFactoryInitializationAotProcessor (line 88) | public static class ClientAnnotatedBeanFactoryInitializationAotProcessor
method ClientAnnotatedBeanFactoryInitializationAotProcessor (line 91) | public ClientAnnotatedBeanFactoryInitializationAotProcessor(
class AnnotationHints (line 98) | static class AnnotationHints implements RuntimeHintsRegistrar {
method registerHints (line 100) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientAnnotationScannerProperties.java
class McpClientAnnotationScannerProperties (line 24) | @ConfigurationProperties(prefix = McpClientAnnotationScannerProperties.C...
method isEnabled (line 31) | public boolean isEnabled() {
method setEnabled (line 35) | public void setEnabled(boolean enabled) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/aot/McpClientAutoConfigurationRuntimeHints.java
class McpClientAutoConfigurationRuntimeHints (line 32) | public class McpClientAutoConfigurationRuntimeHints implements RuntimeHi...
method registerHints (line 34) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/configurer/McpAsyncClientConfigurer.java
class McpAsyncClientConfigurer (line 26) | public class McpAsyncClientConfigurer {
method McpAsyncClientConfigurer (line 30) | public McpAsyncClientConfigurer(List<McpClientCustomizer<McpClient.Asy...
method configure (line 35) | public McpClient.AsyncSpec configure(String name, McpClient.AsyncSpec ...
method applyCustomizers (line 40) | private void applyCustomizers(String name, McpClient.AsyncSpec spec) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/configurer/McpSyncClientConfigurer.java
class McpSyncClientConfigurer (line 41) | public class McpSyncClientConfigurer {
method McpSyncClientConfigurer (line 45) | public McpSyncClientConfigurer(List<McpClientCustomizer<McpClient.Sync...
method configure (line 56) | public McpClient.SyncSpec configure(String name, McpClient.SyncSpec sp...
method applyCustomizers (line 70) | private void applyCustomizers(String name, McpClient.SyncSpec spec) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpClientCommonProperties.java
class McpClientCommonProperties (line 31) | @ConfigurationProperties(McpClientCommonProperties.CONFIG_PREFIX)
type ClientType (line 79) | public enum ClientType {
method isEnabled (line 108) | public boolean isEnabled() {
method setEnabled (line 112) | public void setEnabled(boolean enabled) {
method getName (line 116) | public String getName() {
method setName (line 120) | public void setName(String name) {
method getVersion (line 124) | public String getVersion() {
method setVersion (line 128) | public void setVersion(String version) {
method isInitialized (line 132) | public boolean isInitialized() {
method setInitialized (line 136) | public void setInitialized(boolean initialized) {
method getRequestTimeout (line 140) | public Duration getRequestTimeout() {
method setRequestTimeout (line 144) | public void setRequestTimeout(Duration requestTimeout) {
method getType (line 148) | public ClientType getType() {
method setType (line 152) | public void setType(ClientType type) {
method isRootChangeNotification (line 156) | public boolean isRootChangeNotification() {
method setRootChangeNotification (line 160) | public void setRootChangeNotification(boolean rootChangeNotification) {
method getToolcallback (line 164) | public Toolcallback getToolcallback() {
method setToolcallback (line 168) | public void setToolcallback(Toolcallback toolcallback) {
class Toolcallback (line 179) | public static class Toolcallback {
method setEnabled (line 187) | public void setEnabled(boolean enabled) {
method isEnabled (line 191) | public boolean isEnabled() {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpSseClientProperties.java
class McpSseClientProperties (line 61) | @ConfigurationProperties(McpSseClientProperties.CONFIG_PREFIX)
method getConnections (line 78) | public Map<String, SseParameters> getConnections() {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpStdioClientProperties.java
class McpStdioClientProperties (line 45) | @ConfigurationProperties(McpStdioClientProperties.CONFIG_PREFIX)
method getServersConfiguration (line 66) | public @Nullable Resource getServersConfiguration() {
method setServersConfiguration (line 70) | public void setServersConfiguration(@Nullable Resource stdioConnection...
method getConnections (line 74) | public Map<String, Parameters> getConnections() {
method resourceToServerParameters (line 78) | private Map<String, ServerParameters> resourceToServerParameters() {
method toServerParameters (line 102) | public Map<String, ServerParameters> toServerParameters() {
method toServerParameters (line 132) | public ServerParameters toServerParameters() {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpStreamableHttpClientProperties.java
class McpStreamableHttpClientProperties (line 46) | @ConfigurationProperties(McpStreamableHttpClientProperties.CONFIG_PREFIX)
method getConnections (line 63) | public Map<String, ConnectionParameters> getConnections() {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/McpClientAutoConfigurationIT.java
class McpClientAutoConfigurationIT (line 87) | public class McpClientAutoConfigurationIT {
method defaultConfiguration (line 102) | @Test
method asyncConfiguration (line 119) | @Test
method disabledConfiguration (line 139) | @Test
method customTransportConfiguration (line 157) | @Test
method clientCustomization (line 177) | @Test
method toolCallbacksCreation (line 202) | @Test
method missingAnnotationScanner (line 213) | @Test
method closeableWrappersCreation (line 240) | @Test
class TestTransportConfiguration (line 248) | @Configuration
method testTransports (line 251) | @Bean
class CustomTransportConfiguration (line 268) | @Configuration
method customTransports (line 271) | @Bean
class CustomizerConfiguration (line 278) | @Configuration
method testCustomizer (line 281) | @Bean
class CustomClientTransport (line 289) | static class CustomClientTransport implements McpClientTransport {
method close (line 291) | @Override
method connect (line 296) | @Override
method sendMessage (line 302) | @Override
method unmarshalFrom (line 307) | @Override
method closeGracefully (line 312) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/McpClientAutoConfigurationRuntimeHintsTests.java
class McpClientAutoConfigurationRuntimeHintsTests (line 40) | public class McpClientAutoConfigurationRuntimeHintsTests {
method setUp (line 50) | @BeforeEach
method registerHints (line 56) | @Test
method registerHintsWithNullClassLoader (line 112) | @Test
method allMemberCategoriesAreRegistered (line 127) | @Test
method verifySpecificMcpClientClasses (line 143) | @Test
method multipleRegistrationCallsAreIdempotent (line 156) | @Test
method verifyJsonResourcePatternIsRegistered (line 177) | @Test
method verifyNestedClassesAreRegistered (line 191) | @Test
method verifyResourcePatternHintsArePresentAfterRegistration (line 204) | @Test
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/McpToolCallbackAutoConfigurationConditionTests.java
class McpToolCallbackAutoConfigurationConditionTests (line 45) | public class McpToolCallbackAutoConfigurationConditionTests {
method matchesWhenBothPropertiesAreEnabled (line 50) | @Test
method doesNotMatchWhenMcpClientIsDisabled (line 57) | @Test
method doesNotMatchWhenToolCallbackIsDisabled (line 64) | @Test
method doesNotMatchWhenBothPropertiesAreDisabled (line 71) | @Test
method doesMatchWhenToolCallbackPropertyIsMissing (line 78) | @Test
method doesMatchWhenBothPropertiesAreMissing (line 84) | @Test
method verifySyncToolCallbackFilterConfiguration (line 89) | @Test
method verifyAsyncToolCallbackFilterConfiguration (line 117) | @Test
class TestConfiguration (line 145) | @Configuration
method testBean (line 149) | @Bean
class McpClientFilterConfiguration (line 156) | @Configuration
method mcpClientFilter (line 159) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/McpToolCallbackAutoConfigurationTests.java
class McpToolCallbackAutoConfigurationTests (line 43) | public class McpToolCallbackAutoConfigurationTests {
method enabledByDefault (line 48) | @Test
method enabledMcpToolCallbackAutoConfiguration (line 71) | @Test
method disabledMcpToolCallbackAutoConfiguration (line 105) | @Test
method customMcpToolNamePrefixGeneratorOverridesDefault (line 128) | @Test
method customMcpToolFilterOverridesDefault (line 155) | @Test
method customToolContextToMcpMetaConverterOverridesDefault (line 182) | @Test
method providersCreatedWithMcpClients (line 211) | @Test
method providersCreatedWithoutMcpClients (line 234) | @Test
class CustomPrefixGeneratorConfig (line 251) | @Configuration
method mcpToolNamePrefixGenerator (line 254) | @Bean
class CustomPrefixGenerator (line 261) | static class CustomPrefixGenerator implements McpToolNamePrefixGenerat...
method prefixedToolName (line 263) | @Override
class CustomToolFilterConfig (line 270) | @Configuration
method customToolFilter (line 273) | @Bean
class CustomToolFilter (line 280) | static class CustomToolFilter implements McpToolFilter {
method test (line 282) | @Override
class CustomConverterConfig (line 290) | @Configuration
method customConverter (line 293) | @Bean
class CustomToolContextToMcpMetaConverter (line 300) | static class CustomToolContextToMcpMetaConverter implements ToolContex...
method convert (line 302) | @Override
class McpSyncClientConfig (line 310) | @Configuration
method mcpSyncClients (line 313) | @Bean
method mcpSyncClient1 (line 318) | @Bean
method mcpSyncClient2 (line 323) | @Bean
class McpAsyncClientConfig (line 330) | @Configuration
method mcpAsyncClients (line 333) | @Bean
method mcpAsyncClient1 (line 338) | @Bean
method mcpAsyncClient2 (line 343) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientListChangedAnnotationsScanningIT.java
class McpClientListChangedAnnotationsScanningIT (line 51) | public class McpClientListChangedAnnotationsScanningIT {
method shouldScanAllThreeListChangedAnnotationsSync (line 56) | @Test
method shouldScanAllThreeListChangedAnnotationsAsync (line 87) | @Test
method shouldNotScanAnnotationsWhenScannerDisabled (line 118) | @ParameterizedTest
class AllListChangedConfiguration (line 133) | @Configuration
method testHandlers (line 136) | @Bean
class TestListChangedHandlers (line 143) | static class TestListChangedHandlers {
method getCalls (line 147) | public List<Call> getCalls() {
method onToolListChanged (line 151) | @McpToolListChanged(clients = "test-client")
method onResourceListChanged (line 156) | @McpResourceListChanged(clients = "test-client")
method onPromptListChanged (line 161) | @McpPromptListChanged(clients = "test-client")
method onToolListChangedReactive (line 166) | @McpToolListChanged(clients = "test-client")
method onResourceListChangedReactive (line 172) | @McpResourceListChanged(clients = "test-client")
method onPromptListChangedReactive (line 178) | @McpPromptListChanged(clients = "test-client")
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpClientCommonPropertiesTests.java
class McpClientCommonPropertiesTests (line 34) | class McpClientCommonPropertiesTests {
method defaultValues (line 39) | @Test
method customValues (line 53) | @Test
method setterGetterMethods (line 72) | @Test
method durationPropertyBinding (line 106) | @Test
method enumPropertyBinding (line 114) | @Test
method propertiesFileBinding (line 122) | @Test
method invalidEnumValue (line 141) | @Test
method invalidDurationFormat (line 152) | @Test
method yamlConfigurationBinding (line 162) | @Test
method configPrefixConstant (line 181) | @Test
method clientTypeEnumValues (line 186) | @Test
method disabledProperties (line 192) | @Test
method notInitializedProperties (line 207) | @Test
method rootChangeNotificationDisabled (line 222) | @Test
method customRequestTimeout (line 237) | @Test
method asyncClientType (line 252) | @Test
method customNameAndVersion (line 267) | @Test
class TestConfiguration (line 284) | @Configuration
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpSseClientPropertiesTests.java
class McpSseClientPropertiesTests (line 34) | class McpSseClientPropertiesTests {
method defaultValues (line 39) | @Test
method singleConnection (line 48) | @Test
method multipleConnections (line 61) | @Test
method connectionWithEmptyUrl (line 78) | @Test
method connectionWithNullUrl (line 89) | @Test
method sseParametersRecord (line 104) | @Test
method sseParametersRecordWithNullSseEndpoint (line 114) | @Test
method configPrefixConstant (line 123) | @Test
method yamlConfigurationBinding (line 128) | @Test
method connectionMapManipulation (line 145) | @Test
method specialCharactersInUrl (line 180) | @Test
method specialCharactersInConnectionName (line 193) | @Test
method connectionWithSseEndpoint (line 208) | @Test
method multipleConnectionsWithSseEndpoint (line 222) | @Test
method connectionWithEmptySseEndpoint (line 240) | @Test
method mixedConnectionsWithAndWithoutSseEndpoint (line 254) | @Test
method specialCharactersInSseEndpoint (line 271) | @Test
method mcpHubStyleUrlWithTokenPath (line 286) | @Test
class TestConfiguration (line 300) | @Configuration
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/SseHttpClientTransportAutoConfiguration.java
class SseHttpClientTransportAutoConfiguration (line 65) | @AutoConfiguration
method mcpSseClientConnectionDetails (line 73) | @Bean
method sseHttpClientTransports (line 98) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/StreamableHttpHttpClientTransportAutoConfiguration.java
class StreamableHttpHttpClientTransportAutoConfiguration (line 62) | @AutoConfiguration
method streamableHttpHttpClientTransports (line 90) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/aot/McpClientAutoConfigurationRuntimeHints.java
class McpClientAutoConfigurationRuntimeHints (line 32) | public class McpClientAutoConfigurationRuntimeHints implements RuntimeHi...
method registerHints (line 34) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/SseHttpClientTransportAutoConfigurationIT.java
class SseHttpClientTransportAutoConfigurationIT (line 50) | @Timeout(15)
method setUp (line 71) | @BeforeAll
method tearDown (line 79) | @AfterAll
method streamableHttpTest (line 84) | @Test
method usesRequestCustomizer (line 106) | @Test
class RequestCustomizerConfiguration (line 124) | @Configuration
method syncHttpRequestCustomizer (line 127) | @Bean
method transportCustomizer (line 132) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/SseHttpClientTransportAutoConfigurationTests.java
class SseHttpClientTransportAutoConfigurationTests (line 46) | public class SseHttpClientTransportAutoConfigurationTests {
method mcpHttpClientTransportsNotPresentIfMcpClientDisabled (line 51) | @Test
method noTransportsCreatedWithEmptyConnections (line 57) | @Test
method singleConnectionCreatesOneTransport (line 65) | @Test
method multipleConnectionsCreateMultipleTransports (line 77) | @Test
method customSseEndpointIsRespected (line 95) | @Test
method customJsonMapperIsUsed (line 111) | @Test
method defaultSseEndpointIsUsedWhenNotSpecified (line 122) | @Test
method mixedConnectionsWithAndWithoutCustomSseEndpoint (line 135) | @Test
method customizerIsApplied (line 161) | @Test
method getSseEndpoint (line 173) | private String getSseEndpoint(HttpClientSseClientTransport transport) {
class CustomJsonMapperConfiguration (line 179) | @Configuration
method jsonMapper (line 182) | @Bean
class CustomizerConfiguration (line 189) | @Configuration
method customizer (line 192) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationIT.java
class StreamableHttpHttpClientTransportAutoConfigurationIT (line 50) | @Timeout(15)
method setUp (line 73) | @BeforeAll
method tearDown (line 81) | @AfterAll
method streamableHttpTest (line 86) | @Test
method usesRequestCustomizer (line 108) | @Test
class SyncRequestCustomizerConfiguration (line 126) | @Configuration
method syncHttpRequestCustomizer (line 129) | @Bean
method streamableHttpTransportCustomizer (line 134) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationTests.java
class StreamableHttpHttpClientTransportAutoConfigurationTests (line 41) | public class StreamableHttpHttpClientTransportAutoConfigurationTests {
method mcpHttpClientTransportsNotPresentIfMcpClientDisabled (line 46) | @Test
method noTransportsCreatedWithEmptyConnections (line 52) | @Test
method singleConnectionCreatesOneTransport (line 61) | @Test
method multipleConnectionsCreateMultipleTransports (line 74) | @Test
method customEndpointIsRespected (line 94) | @Test
method customJsonMapperIsUsed (line 111) | @Test
method defaultEndpointIsUsedWhenNotSpecified (line 123) | @Test
method mixedConnectionsWithAndWithoutCustomEndpoint (line 138) | @Test
method getStreamableHttpEndpoint (line 165) | private String getStreamableHttpEndpoint(HttpClientStreamableHttpTrans...
class CustomJsonMapperConfiguration (line 171) | @Configuration
method jsonMapper (line 174) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/java/org/springframework/ai/mcp/client/webflux/autoconfigure/SseWebFluxTransportAutoConfiguration.java
class SseWebFluxTransportAutoConfiguration (line 67) | @AutoConfiguration
method mcpSseClientConnectionDetails (line 74) | @Bean
method sseWebFluxClientTransports (line 98) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/java/org/springframework/ai/mcp/client/webflux/autoconfigure/StreamableHttpWebFluxTransportAutoConfiguration.java
class StreamableHttpWebFluxTransportAutoConfiguration (line 65) | @AutoConfiguration
method streamableHttpWebFluxClientTransports (line 91) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/java/org/springframework/ai/mcp/client/webflux/autoconfigure/aot/McpClientAutoConfigurationRuntimeHints.java
class McpClientAutoConfigurationRuntimeHints (line 31) | public class McpClientAutoConfigurationRuntimeHints implements RuntimeHi...
method registerHints (line 33) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/McpToolsConfigurationTests.java
class McpToolsConfigurationTests (line 54) | class McpToolsConfigurationTests {
method mcpClientSupportsSampling (line 61) | @Test
method toolCallbacksRegistered (line 108) | @Test
class TestMcpClientHandlers (line 127) | static class TestMcpClientHandlers {
method TestMcpClientHandlers (line 133) | TestMcpClientHandlers(ChatClient.Builder clientBuilder) {
method samplingHandler (line 137) | @McpSampling(clients = "server1")
class ChatModelAutoConfiguration (line 153) | static class ChatModelAutoConfiguration {
method chatModel (line 160) | @Bean
class TestToolCallbackConfiguration (line 167) | static class TestToolCallbackConfiguration {
method toolCallbackProvider (line 169) | @Bean
method customToolCallbackProvider (line 176) | @Bean
method mcpToolCallbackProvider (line 182) | @Bean
method customMcpToolCallbackProvider (line 191) | @Bean
method genericMcpToolCallbackProvider (line 197) | @Bean
method toolCallback (line 202) | static ToolCallback[] toolCallback(String name) {
class CustomToolCallbackProvider (line 219) | static class CustomToolCallbackProvider implements ToolCallbackProvi...
method CustomToolCallbackProvider (line 223) | CustomToolCallbackProvider(String name) {
method getToolCallbacks (line 227) | @Override
class CustomMcpToolCallbackProvider (line 234) | static class CustomMcpToolCallbackProvider extends SyncMcpToolCallba...
method getToolCallbacks (line 236) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/SseWebFluxTransportAutoConfigurationIT.java
class SseWebFluxTransportAutoConfigurationIT (line 39) | @Timeout(15)
method setUp (line 60) | @BeforeAll
method tearDown (line 68) | @AfterAll
method streamableHttpTest (line 73) | @Test
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/SseWebFluxTransportAutoConfigurationTests.java
class SseWebFluxTransportAutoConfigurationTests (line 47) | public class SseWebFluxTransportAutoConfigurationTests {
method webFluxClientTransportsPresentIfWebFluxSseClientTransportPresent (line 52) | @Test
method webFluxClientTransportsNotPresentIfMissingWebFluxSseClientTransportNotPresent (line 57) | @Test
method webFluxClientTransportsNotPresentIfMcpClientDisabled (line 65) | @Test
method noTransportsCreatedWithEmptyConnections (line 71) | @Test
method singleConnectionCreatesOneTransport (line 79) | @Test
method multipleConnectionsCreateMultipleTransports (line 91) | @Test
method customSseEndpointIsRespected (line 109) | @Test
method customWebClientBuilderIsUsed (line 125) | @Test
method customJsonMapperIsUsed (line 136) | @Test
method defaultSseEndpointIsUsedWhenNotSpecified (line 147) | @Test
method mixedConnectionsWithAndWithoutCustomSseEndpoint (line 160) | @Test
method customizerIsApplied (line 185) | @Test
method getSseEndpoint (line 197) | private String getSseEndpoint(WebFluxSseClientTransport transport) {
class CustomWebClientConfiguration (line 203) | @Configuration
method webClientBuilder (line 206) | @Bean
class JsonMapperConfiguration (line 213) | @Configuration
method jsonMapper (line 216) | @Bean
class CustomizerConfiguration (line 223) | @Configuration
method customizer (line 226) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationIT.java
class StreamableHttpHttpClientTransportAutoConfigurationIT (line 39) | @Timeout(15)
method setUp (line 62) | @BeforeAll
method tearDown (line 70) | @AfterAll
method streamableHttpTest (line 75) | @Test
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/StreamableHttpWebFluxTransportAutoConfigurationTests.java
class StreamableHttpWebFluxTransportAutoConfigurationTests (line 47) | public class StreamableHttpWebFluxTransportAutoConfigurationTests {
method webFluxClientTransportsPresentIfWebClientStreamableHttpTransportPresent (line 52) | @Test
method webFluxClientTransportsNotPresentIfMissingWebClientStreamableHttpTransportNotPresent (line 58) | @Test
method webFluxClientTransportsNotPresentIfMcpClientDisabled (line 67) | @Test
method noTransportsCreatedWithEmptyConnections (line 73) | @Test
method singleConnectionCreatesOneTransport (line 82) | @Test
method multipleConnectionsCreateMultipleTransports (line 95) | @Test
method customStreamableHttpEndpointIsRespected (line 115) | @Test
method customWebClientBuilderIsUsed (line 132) | @Test
method customJsonMapperIsUsed (line 144) | @Test
method defaultStreamableHttpEndpointIsUsedWhenNotSpecified (line 156) | @Test
method mixedConnectionsWithAndWithoutCustomStreamableHttpEndpoint (line 171) | @Test
method customizerIsApplied (line 198) | @Test
method getStreamableHttpEndpoint (line 210) | private String getStreamableHttpEndpoint(WebClientStreamableHttpTransp...
class CustomWebClientConfiguration (line 216) | @Configuration
method webClientBuilder (line 219) | @Bean
class CustomJsonMapperConfiguration (line 226) | @Configuration
method jsonMapper (line 229) | @Bean
class CustomizerConfiguration (line 236) | @Configuration
method customizer (line 239) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerAutoConfiguration.java
class McpServerAutoConfiguration (line 81) | @AutoConfiguration
method stdioServerTransport (line 91) | @Bean
method capabilitiesBuilder (line 98) | @Bean
method mcpSyncServer (line 104) | @Bean
method servletMcpSyncServerCustomizer (line 218) | @Bean
method mcpAsyncServer (line 226) | @Bean
class NonStatelessServerCondition (line 341) | public static class NonStatelessServerCondition extends AnyNestedCondi...
method NonStatelessServerCondition (line 343) | public NonStatelessServerCondition() {
class SseEnabledCondition (line 347) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
class StreamableEnabledCondition (line 353) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
class EnabledSseServerCondition (line 361) | public static class EnabledSseServerCondition extends AllNestedConditi...
method EnabledSseServerCondition (line 363) | public EnabledSseServerCondition() {
class McpServerEnabledCondition (line 367) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
class SseEnabledCondition (line 373) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
class EnabledStreamableServerCondition (line 381) | public static class EnabledStreamableServerCondition extends AllNested...
method EnabledStreamableServerCondition (line 383) | public EnabledStreamableServerCondition() {
class McpServerEnabledCondition (line 387) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
class StreamableEnabledCondition (line 393) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerJsonMapperAutoConfiguration.java
class McpServerJsonMapperAutoConfiguration (line 33) | @AutoConfiguration
method mcpServerJsonMapper (line 57) | @Bean(name = "mcpServerJsonMapper", defaultCandidate = false)
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerStatelessAutoConfiguration.java
class McpServerStatelessAutoConfiguration (line 59) | @AutoConfiguration
method capabilitiesBuilder (line 68) | @Bean
method mcpStatelessSyncServer (line 74) | @Bean
method mcpStatelessAsyncServer (line 165) | @Bean
class EnabledStatelessServerCondition (line 252) | public static class EnabledStatelessServerCondition extends AllNestedC...
method EnabledStatelessServerCondition (line 254) | public EnabledStatelessServerCondition() {
class McpServerEnabledCondition (line 258) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
class StatelessEnabledCondition (line 264) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerStdioDisabledCondition.java
class McpServerStdioDisabledCondition (line 30) | public class McpServerStdioDisabledCondition extends AllNestedConditions {
method McpServerStdioDisabledCondition (line 32) | public McpServerStdioDisabledCondition() {
class McpServerEnabledCondition (line 36) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, nam...
class StdioDisabledCondition (line 42) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, nam...
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/StatelessToolCallbackConverterAutoConfiguration.java
class StatelessToolCallbackConverterAutoConfiguration (line 40) | @AutoConfiguration
method syncTools (line 47) | @Bean
method toSyncToolSpecifications (line 60) | private List<McpStatelessServerFeatures.SyncToolSpecification> toSyncT...
method asyncTools (line 79) | @Bean
method toAsyncToolSpecification (line 91) | private List<McpStatelessServerFeatures.AsyncToolSpecification> toAsyn...
class ToolCallbackConverterCondition (line 109) | public static class ToolCallbackConverterCondition extends AllNestedCo...
method ToolCallbackConverterCondition (line 111) | public ToolCallbackConverterCondition() {
class McpServerEnabledCondition (line 115) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
class ToolCallbackConvertCondition (line 121) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/ToolCallbackConverterAutoConfiguration.java
class ToolCallbackConverterAutoConfiguration (line 40) | @AutoConfiguration
method syncTools (line 46) | @Bean
method toSyncToolSpecifications (line 59) | private List<McpServerFeatures.SyncToolSpecification> toSyncToolSpecif...
method asyncTools (line 79) | @Bean
method toAsyncToolSpecification (line 90) | private List<McpServerFeatures.AsyncToolSpecification> toAsyncToolSpec...
method isMcpToolProvider (line 110) | private static boolean isMcpToolProvider(ToolCallbackProvider tcbp) {
class ToolCallbackConverterCondition (line 115) | public static class ToolCallbackConverterCondition extends AllNestedCo...
method ToolCallbackConverterCondition (line 117) | public ToolCallbackConverterCondition() {
class McpServerEnabledCondition (line 121) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
class ToolCallbackConvertCondition (line 127) | @ConditionalOnProperty(prefix = McpServerProperties.CONFIG_PREFIX, n...
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/ToolCallbackUtils.java
class ToolCallbackUtils (line 37) | final class ToolCallbackUtils {
method ToolCallbackUtils (line 41) | private ToolCallbackUtils() {
method aggregateToolCallbacks (line 44) | static List<ToolCallback> aggregateToolCallbacks(ObjectProvider<List<T...
method isMcpToolCallback (line 74) | static boolean isMcpToolCallback(ToolCallback toolCallback) {
method isMcpToolProvider (line 78) | static boolean isMcpToolProvider(ToolCallbackProvider tcbp) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/annotations/McpServerAnnotationScannerAutoConfiguration.java
class McpServerAnnotationScannerAutoConfiguration (line 46) | @AutoConfiguration
method serverAnnotatedBeanRegistry (line 57) | @Bean
method serverAnnotatedMethodBeanPostProcessor (line 63) | @Bean
method serverAnnotatedBeanFactoryInitializationAotProcessor (line 70) | @Bean
class ServerMcpAnnotatedBeans (line 75) | public static class ServerMcpAnnotatedBeans extends AbstractMcpAnnotat...
class ServerAnnotatedBeanFactoryInitializationAotProcessor (line 79) | public static class ServerAnnotatedBeanFactoryInitializationAotProcessor
method ServerAnnotatedBeanFactoryInitializationAotProcessor (line 82) | public ServerAnnotatedBeanFactoryInitializationAotProcessor(
class ServerAnnotatedMethodBeanPostProcessor (line 89) | public static class ServerAnnotatedMethodBeanPostProcessor extends Abs...
method ServerAnnotatedMethodBeanPostProcessor (line 91) | public ServerAnnotatedMethodBeanPostProcessor(ServerMcpAnnotatedBean...
class AnnotationHints (line 98) | static class AnnotationHints implements RuntimeHintsRegistrar {
method registerHints (line 100) | @Override
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/annotations/McpServerAnnotationScannerProperties.java
class McpServerAnnotationScannerProperties (line 24) | @ConfigurationProperties(prefix = McpServerAnnotationScannerProperties.C...
method isEnabled (line 31) | public boolean isEnabled() {
method setEnabled (line 35) | public void setEnabled(boolean enabled) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/annotations/McpServerSpecificationFactoryAutoConfiguration.java
class McpServerSpecificationFactoryAutoConfiguration (line 42) | @AutoConfiguration(after = McpServerAnnotationScannerAutoConfiguration.c...
class SyncServerSpecificationConfiguration (line 49) | @Configuration(proxyBeanMethods = false)
method resourceSpecs (line 54) | @Bean
method resourceTemplateSpecs (line 63) | @Bean
method promptSpecs (line 72) | @Bean
method completionSpecs (line 79) | @Bean
method toolSpecs (line 86) | @Bean
class AsyncServerSpecificationConfiguration (line 95) | @Configuration(proxyBeanMethods = false)
method resourceSpecs (line 99) | @Bean
method resourceTemplateSpecs (line 106) | @Bean
method promptSpecs (line 114) | @Bean
method completionSpecs (line 121) | @Bean
method toolSpecs (line 128) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/annotations/StatelessServerSpecificationFactoryAutoConfiguration.java
class StatelessServerSpecificationFactoryAutoConfiguration (line 43) | @AutoConfiguration(after = McpServerAnnotationScannerAutoConfiguration.c...
class SyncStatelessServerSpecificationConfiguration (line 51) | @Configuration(proxyBeanMethods = false)
method resourceSpecs (line 56) | @Bean
method resourceTemplateSpecs (line 63) | @Bean
method promptSpecs (line 70) | @Bean
method completionSpecs (line 77) | @Bean
method toolSpecs (line 84) | @Bean
class AsyncStatelessServerSpecificationConfiguration (line 95) | @Configuration(proxyBeanMethods = false)
method resourceSpecs (line 99) | @Bean
method resourceTemplateSpecs (line 106) | @Bean
method promptSpecs (line 113) | @Bean
method completionSpecs (line 120) | @Bean
method toolSpecs (line 127) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/properties/McpServerChangeNotificationProperties.java
class McpServerChangeNotificationProperties (line 25) | @ConfigurationProperties(McpServerChangeNotificationProperties.CONFIG_PR...
method isResourceChangeNotification (line 56) | public boolean isResourceChangeNotification() {
method setResourceChangeNotification (line 60) | public void setResourceChangeNotification(boolean resourceChangeNotifi...
method isToolChangeNotification (line 64) | public boolean isToolChangeNotification() {
method setToolChangeNotification (line 68) | public void setToolChangeNotification(boolean toolChangeNotification) {
method isPromptChangeNotification (line 72) | public boolean isPromptChangeNotification() {
method setPromptChangeNotification (line 76) | public void setPromptChangeNotification(boolean promptChangeNotificati...
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/properties/McpServerProperties.java
class McpServerProperties (line 47) | @ConfigurationProperties(McpServerProperties.CONFIG_PREFIX)
method getRequestTimeout (line 115) | public Duration getRequestTimeout() {
method isExposeMcpClientTools (line 119) | public boolean isExposeMcpClientTools() {
method setExposeMcpClientTools (line 123) | public void setExposeMcpClientTools(boolean exposeMcpClientTools) {
method setRequestTimeout (line 127) | public void setRequestTimeout(Duration requestTimeout) {
method getCapabilities (line 132) | public Capabilities getCapabilities() {
type ServerProtocol (line 136) | public enum ServerProtocol {
type ApiType (line 145) | public enum ApiType {
method isStdio (line 164) | public boolean isStdio() {
method setStdio (line 168) | public void setStdio(boolean stdio) {
method isEnabled (line 172) | public boolean isEnabled() {
method setEnabled (line 176) | public void setEnabled(boolean enabled) {
method getName (line 180) | public String getName() {
method setName (line 184) | public void setName(String name) {
method getVersion (line 189) | public String getVersion() {
method setVersion (line 193) | public void setVersion(String version) {
method getInstructions (line 198) | public @Nullable String getInstructions() {
method setInstructions (line 202) | public void setInstructions(@Nullable String instructions) {
method getType (line 206) | public ApiType getType() {
method setType (line 210) | public void setType(ApiType serverType) {
method getToolResponseMimeType (line 215) | public Map<String, String> getToolResponseMimeType() {
method getProtocol (line 219) | public ServerProtocol getProtocol() {
method setProtocol (line 223) | public void setProtocol(ServerProtocol serverMode) {
class Capabilities (line 228) | public static class Capabilities {
method isResource (line 238) | public boolean isResource() {
method setResource (line 242) | public void setResource(boolean resource) {
method isTool (line 246) | public boolean isTool() {
method setTool (line 250) | public void setTool(boolean tool) {
method isPrompt (line 254) | public boolean isPrompt() {
method setPrompt (line 258) | public void setPrompt(boolean prompt) {
method isCompletion (line 262) | public boolean isCompletion() {
method setCompletion (line 266) | public void setCompletion(boolean completion) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/properties/McpServerSseProperties.java
class McpServerSseProperties (line 29) | @ConfigurationProperties(McpServerSseProperties.CONFIG_PREFIX)
method getBaseUrl (line 54) | public String getBaseUrl() {
method setBaseUrl (line 58) | public void setBaseUrl(String baseUrl) {
method getSseEndpoint (line 63) | public String getSseEndpoint() {
method setSseEndpoint (line 67) | public void setSseEndpoint(String sseEndpoint) {
method getSseMessageEndpoint (line 72) | public String getSseMessageEndpoint() {
method setSseMessageEndpoint (line 76) | public void setSseMessageEndpoint(String sseMessageEndpoint) {
method getKeepAliveInterval (line 81) | public @Nullable Duration getKeepAliveInterval() {
method setKeepAliveInterval (line 85) | public void setKeepAliveInterval(@Nullable Duration keepAliveInterval) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/properties/McpServerStreamableHttpProperties.java
class McpServerStreamableHttpProperties (line 29) | @ConfigurationProperties(McpServerStreamableHttpProperties.CONFIG_PREFIX)
method getMcpEndpoint (line 45) | public String getMcpEndpoint() {
method setMcpEndpoint (line 49) | public void setMcpEndpoint(String mcpEndpoint) {
method setKeepAliveInterval (line 54) | public void setKeepAliveInterval(@Nullable Duration keepAliveInterval) {
method getKeepAliveInterval (line 59) | public @Nullable Duration getKeepAliveInterval() {
method isDisallowDelete (line 63) | public boolean isDisallowDelete() {
method setDisallowDelete (line 67) | public void setDisallowDelete(boolean disallowDelete) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerAutoConfigurationIT.java
class McpServerAutoConfigurationIT (line 73) | public class McpServerAutoConfigurationIT {
method defaultConfiguration (line 79) | @Test
method asyncConfiguration (line 108) | @Test
method syncServerInstructionsConfiguration (line 127) | @Test
method transportConfiguration (line 139) | @Test
method serverNotificationConfiguration (line 147) | @Test
method invalidConfigurationThrowsException (line 161) | void invalidConfigurationThrowsException() {
method disabledConfiguration (line 170) | @Test
method notificationConfiguration (line 179) | @Test
method stdioConfiguration (line 194) | @Test
method serverCapabilitiesConfiguration (line 202) | @Test
method toolSpecificationConfiguration (line 211) | @Test
method syncToolCallbackRegistrationControl (line 221) | @Test
method asyncToolCallbackRegistrationControl (line 232) | @Test
method resourceSpecificationConfiguration (line 242) | @Test
method promptSpecificationConfiguration (line 250) | @Test
method asyncToolSpecificationConfiguration (line 258) | @Test
method customCapabilitiesBuilder (line 269) | @Test
method rootsChangeHandlerConfiguration (line 278) | @Test
method asyncRootsChangeHandlerConfiguration (line 286) | @Test
method capabilitiesConfiguration (line 296) | @Test
method toolResponseMimeTypeConfiguration (line 314) | @Test
method requestTimeoutConfiguration (line 334) | @Test
method completionSpecificationConfiguration (line 346) | @Test
method asyncCompletionSpecificationConfiguration (line 354) | @Test
method toolCallbackProviderConfiguration (line 364) | @Test
method syncServerSpecificationConfiguration (line 370) | @SuppressWarnings("unchecked")
method asyncServerSpecificationConfiguration (line 408) | @SuppressWarnings("unchecked")
class TestResourceConfiguration (line 446) | @Configuration
method testResources (line 449) | @Bean
class TestPromptConfiguration (line 456) | @Configuration
method testPrompts (line 459) | @Bean
class CustomCapabilitiesConfiguration (line 466) | @Configuration
method customCapabilitiesBuilder (line 469) | @Bean
class CustomCapabilitiesBuilder (line 476) | static class CustomCapabilitiesBuilder extends McpSchema.ServerCapabil...
class TestToolConfiguration (line 482) | @Configuration
method testTool (line 485) | @Bean
class TestToolCallbackProviderConfiguration (line 505) | @Configuration
method testToolCallbackProvider (line 508) | @Bean
class TestCompletionConfiguration (line 528) | @Configuration
method testCompletions (line 531) | @Bean
class TestAsyncCompletionConfiguration (line 544) | @Configuration
method testAsyncCompletions (line 547) | @Bean
class TestRootsHandlerConfiguration (line 559) | @Configuration
method rootsChangeHandler (line 562) | @Bean
class TestAsyncRootsHandlerConfiguration (line 571) | @Configuration
method rootsChangeHandler (line 574) | @Bean
class CustomServerTransport (line 583) | static class CustomServerTransport implements McpServerTransport {
method sendMessage (line 585) | @Override
method unmarshalFrom (line 590) | @Override
method close (line 595) | @Override
method closeGracefully (line 600) | @Override
class CustomTransportConfiguration (line 607) | @Configuration
method customTransport (line 610) | @Bean
class SyncTestMcpSpecsComponent (line 617) | @Component
method add (line 620) | @McpTool(name = "add", description = "Add two numbers together", tit...
method getSimple (line 628) | @McpResource(uri = "simple://static", name = "Configuration", descri...
method getConfig (line 633) | @McpResource(uri = "config://{key}", name = "Configuration", descrip...
method greeting (line 638) | @McpPrompt(name = "greeting", description = "Generate a greeting mes...
method completeCityName (line 648) | @McpComplete(prompt = "city-search")
class AsyncTestMcpSpecsComponent (line 658) | @Component
method add (line 661) | @McpTool(name = "add", description = "Add two numbers together", tit...
method getSimple (line 669) | @McpResource(uri = "simple://static", name = "Configuration", descri...
method getConfig (line 674) | @McpResource(uri = "config://{key}", name = "Configuration", descrip...
method greeting (line 679) | @McpPrompt(name = "greeting", description = "Generate a greeting mes...
method completeCityName (line 689) | @McpComplete(prompt = "city-search")
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerJsonMapperAutoConfigurationIT.java
class McpServerJsonMapperAutoConfigurationIT (line 35) | public class McpServerJsonMapperAutoConfigurationIT {
method defaultMcpServerJsonMapper (line 40) | @Test
method customizeMcpServerJsonMapper (line 48) | @Test
class TestConfig (line 60) | @Configuration
method mcpServerJsonMapper (line 63) | @Bean(name = "mcpServerJsonMapper")
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpStatelessServerAutoConfigurationIT.java
class McpStatelessServerAutoConfigurationIT (line 70) | public class McpStatelessServerAutoConfigurationIT {
method defaultConfiguration (line 78) | @Test
method asyncConfiguration (line 99) | @Test
method syncToolCallbackRegistrationControl (line 118) | @Test
method asyncToolCallbackRegistrationControl (line 129) | @Test
method syncServerInstructionsConfiguration (line 139) | @Test
method disabledConfiguration (line 151) | @Test
method serverCapabilitiesConfiguration (line 160) | @Test
method toolSpecificationConfiguration (line 169) | @Test
method resourceSpecificationConfiguration (line 179) | @Test
method promptSpecificationConfiguration (line 187) | @Test
method asyncToolSpecificationConfiguration (line 195) | @Test
method customCapabilitiesBuilder (line 206) | @Test
method rootsChangeHandlerConfiguration (line 215) | @Test
method asyncRootsChangeHandlerConfiguration (line 223) | @Test
method capabilitiesConfiguration (line 233) | @Test
method toolResponseMimeTypeConfiguration (line 251) | @Test
method requestTimeoutConfiguration (line 271) | @Test
method endpointConfiguration (line 283) | @Test
method completionSpecificationConfiguration (line 295) | @Test
method asyncCompletionSpecificationConfiguration (line 303) | @Test
method toolCallbackProviderConfiguration (line 313) | @Test
method syncStatelessServerSpecificationConfiguration (line 319) | @SuppressWarnings("unchecked")
method asyncStatelessServerSpecificationConfiguration (line 358) | @SuppressWarnings("unchecked")
class TestResourceConfiguration (line 396) | @Configuration
method testResources (line 399) | @Bean
class TestPromptConfiguration (line 406) | @Configuration
method testPrompts (line 409) | @Bean
class CustomCapabilitiesConfiguration (line 416) | @Configuration
method customCapabilitiesBuilder (line 419) | @Bean
class CustomCapabilitiesBuilder (line 426) | static class CustomCapabilitiesBuilder extends McpSchema.ServerCapabil...
class TestToolConfiguration (line 432) | @Configuration
method testTool (line 435) | @Bean
class TestToolCallbackProviderConfiguration (line 451) | @Configuration
method testToolCallbackProvider (line 454) | @Bean
class TestCompletionConfiguration (line 471) | @Configuration
method testCompletions (line 474) | @Bean
class TestAsyncCompletionConfiguration (line 487) | @Configuration
method testAsyncCompletions (line 490) | @Bean
class TestRootsHandlerConfiguration (line 502) | @Configuration
method rootsChangeHandler (line 505) | @Bean
class TestAsyncRootsHandlerConfiguration (line 514) | @Configuration
method rootsChangeHandler (line 517) | @Bean
class TestStatelessTransportConfiguration (line 526) | @Configuration
method statelessTransport (line 529) | @Bean
class SyncTestMcpSpecsComponent (line 538) | @Component
method add (line 541) | @McpTool(name = "add", description = "Add two numbers together", tit...
method getSimple (line 549) | @McpResource(uri = "simple://static", name = "Configuration", descri...
method getConfig (line 554) | @McpResource(uri = "config://{key}", name = "Configuration", descrip...
method greeting (line 559) | @McpPrompt(name = "greeting", description = "Generate a greeting mes...
method completeCityName (line 569) | @McpComplete(prompt = "city-search")
class AsyncTestMcpSpecsComponent (line 579) | @Component
method add (line 582) | @McpTool(name = "add", description = "Add two numbers together", tit...
method getSimple (line 590) | @McpResource(uri = "simple://static", name = "Configuration", descri...
method getConfig (line 595) | @McpResource(uri = "config://{key}", name = "Configuration", descrip...
method greeting (line 600) | @McpPrompt(name = "greeting", description = "Generate a greeting mes...
method completeCityName (line 610) | @McpComplete(prompt = "city-search")
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpToolWithStdioIT.java
class McpToolWithStdioIT (line 45) | public class McpToolWithStdioIT {
method shouldCreateConfiguredJsonMapperForMcpServer (line 55) | @Test
method stdioTransportShouldUseConfiguredJsonMapper (line 76) | @Test
method mcpToolAnnotationsShouldWorkWithStdio (line 93) | @Test
method mcpToolWithComplexParametersShouldWorkWithStdio (line 141) | @Test
class TestCalculatorTools (line 167) | @Component
method add (line 170) | @McpTool(name = "add", description = "Add two numbers")
method subtract (line 176) | @McpTool(name = "subtract", description = "Subtract two numbers")
method multiply (line 182) | @McpTool(name = "multiply", description = "Multiply two numbers")
class TestComplexTools (line 190) | @Component
method processData (line 193) | @McpTool(name = "processData", description = "Process complex data")
class EmptyBean (line 203) | static class EmptyBean {
class BeanWithNull (line 207) | static class BeanWithNull {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/StatelessToolCallbackConverterAutoConfigurationIT.java
class StatelessToolCallbackConverterAutoConfigurationIT (line 48) | public class StatelessToolCallbackConverterAutoConfigurationIT {
method defaultSyncToolsConfiguration (line 55) | @Test
method asyncToolsConfiguration (line 68) | @Test
method toolCallbackProviderConfiguration (line 84) | @Test
method multipleToolCallbacksConfiguration (line 96) | @Test
method toolResponseMimeTypeConfiguration (line 108) | @Test
method duplicateToolNamesDeduplication (line 125) | @Test
method conditionDisabledWhenServerDisabled (line 139) | @Test
method conditionDisabledWhenToolCallbackConvertDisabled (line 150) | @Test
method conditionEnabledByDefault (line 161) | @Test
method conditionEnabledExplicitly (line 169) | @Test
method emptyToolCallbacksConfiguration (line 181) | @Test
method mixedToolCallbacksAndProvidersConfiguration (line 193) | @Test
method mcpClientToolsNotExposedByDefault (line 208) | @Test
method regularToolsExportedByDefault (line 224) | @Test
class TestMcpToolConfiguration (line 240) | @Configuration
method testToolCallbacks (line 243) | @Bean
class TestRegularToolConfiguration (line 259) | @Configuration
method testRegularToolCallbacks (line 262) | @Bean
class TestMultipleToolsConfiguration (line 273) | @Configuration
method testMultipleToolCallbacks (line 276) | @Bean
class TestDuplicateToolsConfiguration (line 302) | @Configuration
method testDuplicateToolCallbacks (line 305) | @Bean
class TestToolCallbackProviderConfiguration (line 331) | @Configuration
method testToolCallbackProvider (line 334) | @Bean
class TestMcpToolCallbackProviderConfiguration (line 353) | @Configuration
method testMcpToolCallbackProvider (line 356) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/ToolCallbackConverterAutoConfigurationIT.java
class ToolCallbackConverterAutoConfigurationIT (line 48) | public class ToolCallbackConverterAutoConfigurationIT {
method defaultSyncToolsConfiguration (line 54) | @Test
method asyncToolsConfiguration (line 67) | @Test
method toolCallbackProviderConfiguration (line 83) | @Test
method multipleToolCallbacksConfiguration (line 95) | @Test
method toolResponseMimeTypeConfiguration (line 107) | @Test
method duplicateToolNamesDeduplication (line 124) | @Test
method conditionDisabledWhenServerDisabled (line 138) | @Test
method conditionDisabledWhenToolCallbackConvertDisabled (line 149) | @Test
method conditionEnabledByDefault (line 160) | @Test
method conditionEnabledExplicitly (line 168) | @Test
method emptyToolCallbacksConfiguration (line 180) | @Test
method mixedToolCallbacksAndProvidersConfiguration (line 192) | @Test
method mcpClientToolsNotExposedByDefault (line 207) | @Test
method regularToolsExportedByDefault (line 223) | @Test
class TestToolConfiguration (line 239) | @Configuration
method testToolCallbacks (line 242) | @Bean
class TestRegularToolConfiguration (line 258) | @Configuration
method testRegularToolCallbacks (line 261) | @Bean
class TestMultipleToolsConfiguration (line 272) | @Configuration
method testMultipleToolCallbacks (line 275) | @Bean
class TestDuplicateToolsConfiguration (line 301) | @Configuration
method testDuplicateToolCallbacks (line 304) | @Bean
class TestMcpToolConfiguration (line 330) | @Configuration
method testToolCallbacks (line 333) | @Bean
class TestMcpToolCallbackProviderConfiguration (line 349) | @Configuration
method testMcpToolCallbackProvider (line 352) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/main/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerSseWebFluxAutoConfiguration.java
class McpServerSseWebFluxAutoConfiguration (line 65) | @AutoConfiguration(before = McpServerAutoConfiguration.class)
method webFluxTransport (line 72) | @Bean
method webfluxSseServerRouterFunction (line 88) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/main/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerStatelessWebFluxAutoConfiguration.java
class McpServerStatelessWebFluxAutoConfiguration (line 40) | @AutoConfiguration(before = McpServerStatelessAutoConfiguration.class)
method webFluxStatelessServerTransport (line 47) | @Bean
method webFluxStatelessServerRouterFunction (line 61) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/main/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerStreamableHttpWebFluxAutoConfiguration.java
class McpServerStreamableHttpWebFluxAutoConfiguration (line 43) | @AutoConfiguration(before = McpServerAutoConfiguration.class)
method webFluxStreamableServerTransportProvider (line 50) | @Bean
method webFluxStreamableServerRouterFunction (line 66) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerSseWebFluxAutoConfigurationIT.java
class McpServerSseWebFluxAutoConfigurationIT (line 35) | class McpServerSseWebFluxAutoConfigurationIT {
method defaultConfiguration (line 41) | @Test
method endpointConfiguration (line 56) | @Test
method jsonMapperConfiguration (line 74) | @Test
method stdioEnabledConfiguration (line 82) | @Test
method serverDisableConfiguration (line 88) | @Test
method serverBaseUrlConfiguration (line 96) | @Test
method routerFunctionIsCreatedFromProvider (line 103) | @Test
method routerFunctionIsCustom (line 117) | @Test
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerSseWebFluxAutoConfigurationTests.java
class McpServerSseWebFluxAutoConfigurationTests (line 33) | class McpServerSseWebFluxAutoConfigurationTests {
method shouldConfigureWebFluxTransportWithCustomJsonMapper (line 39) | @Test
class TestConfiguration (line 71) | @Configuration
class TestMessage (line 78) | static class TestMessage {
method getName (line 82) | public String getName() {
method setName (line 86) | public void setName(String name) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerStatelessWebFluxAutoConfigurationIT.java
class McpServerStatelessWebFluxAutoConfigurationIT (line 35) | class McpServerStatelessWebFluxAutoConfigurationIT {
method defaultConfiguration (line 42) | @Test
method jsonMapperConfiguration (line 50) | @Test
method serverDisableConfiguration (line 58) | @Test
method serverBaseUrlConfiguration (line 66) | @Test
method keepAliveIntervalConfiguration (line 73) | @Test
method disallowDeleteConfiguration (line 82) | @Test
method disallowDeleteFalseConfiguration (line 91) | @Test
method customJsonMapperIsUsed (line 100) | @Test
method conditionalOnClassPresent (line 111) | @Test
method conditionalOnMissingBeanWorks (line 120) | @Test
method routerFunctionIsCreatedFromProvider (line 137) | @Test
method routerFunctionIsCustom (line 150) | @Test
method allPropertiesConfiguration (line 162) | @Test
method enabledPropertyDefaultsToTrue (line 176) | @Test
method enabledPropertyExplicitlyTrue (line 186) | @Test
class CustomRouterFunctionConfig (line 194) | @Configuration
method webFluxStatelessServerRouterFunction (line 197) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerStreamableHttpWebFluxAutoConfigurationIT.java
class McpServerStreamableHttpWebFluxAutoConfigurationIT (line 33) | class McpServerStreamableHttpWebFluxAutoConfigurationIT {
method defaultConfiguration (line 40) | @Test
method jsonMapperConfiguration (line 48) | @Test
method serverDisableConfiguration (line 56) | @Test
method serverBaseUrlConfiguration (line 64) | @Test
method keepAliveIntervalConfiguration (line 72) | @Test
method disallowDeleteConfiguration (line 81) | @Test
method disallowDeleteFalseConfiguration (line 90) | @Test
method customJsonMapperIsUsed (line 99) | @Test
method conditionalOnClassPresent (line 110) | @Test
method conditionalOnMissingBeanWorks (line 119) | @Test
method routerFunctionIsCreatedFromProvider (line 137) | @Test
method routerFunctionIsCustom (line 151) | @Test
method allPropertiesConfiguration (line 163) | @Test
method enabledPropertyDefaultsToTrue (line 179) | @Test
method enabledPropertyExplicitlyTrue (line 189) | @Test
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpToolCallProviderCachingIT.java
class McpToolCallProviderCachingIT (line 66) | @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".+")
method anthropicAutoConfig (line 84) | private static AutoConfigurations anthropicAutoConfig(Class<?>... addi...
method clientToolCallbacksUpdateWhenServerToolsChangeAsync (line 91) | @Test
method startHttpServer (line 144) | private static DisposableServer startHttpServer(ApplicationContext ser...
method stopHttpServer (line 152) | private static void stopHttpServer(DisposableServer server) {
class TestMcpServerConfiguration (line 158) | public static class TestMcpServerConfiguration {
method serverSideSpecProviders (line 160) | @Bean
class McpServerHandlers (line 165) | public static class McpServerHandlers {
method weather (line 167) | @McpTool(description = "Provides weather information by city name")
class TimeService (line 176) | public class TimeService implements Function<TimeRequest, String> {
method apply (line 178) | public String apply(TimeRequest request) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpToolCallbackParameterlessToolIT.java
class McpToolCallbackParameterlessToolIT (line 68) | class McpToolCallbackParameterlessToolIT {
method baseAutoConfig (line 83) | private static AutoConfigurations baseAutoConfig(Class<?>... additiona...
method testMcpServerClientIntegrationWithIncompleteSchemaSyncTool (line 89) | @Test
method startHttpServer (line 192) | private static DisposableServer startHttpServer(ApplicationContext ser...
method stopHttpServer (line 200) | private static void stopHttpServer(DisposableServer server) {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/SseWebClientWebFluxServerIT.java
class SseWebClientWebFluxServerIT (line 88) | public class SseWebClientWebFluxServerIT {
method clientServerCapabilities (line 102) | @Test
method startHttpServer (line 275) | private static DisposableServer startHttpServer(ApplicationContext ser...
method stopHttpServer (line 283) | private static void stopHttpServer(DisposableServer server) {
method getMcpSyncClient (line 290) | private static McpSyncClient getMcpSyncClient(ApplicationContext clien...
class TestContext (line 296) | private static class TestContext {
class TestMcpServerConfiguration (line 306) | public static class TestMcpServerConfiguration {
method myTools (line 308) | @Bean
method myPrompts (line 393) | @Bean
method myCompletions (line 421) | @Bean
method myResources (line 435) | @Bean
method evaluateExpression (line 463) | private double evaluateExpression(String expression) {
class TestMcpClientConfiguration (line 476) | public static class TestMcpClientConfiguration {
method testContext (line 478) | @Bean
method clientCustomizer (line 483) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StatelessWebClientWebFluxServerIT.java
class StatelessWebClientWebFluxServerIT (line 77) | public class StatelessWebClientWebFluxServerIT {
method clientServerCapabilities (line 92) | @Test
method startHttpServer (line 237) | private static DisposableServer startHttpServer(ApplicationContext ser...
method stopHttpServer (line 245) | private static void stopHttpServer(DisposableServer server) {
method getMcpSyncClient (line 252) | private static McpSyncClient getMcpSyncClient(ApplicationContext clien...
class TestMcpServerConfiguration (line 258) | public static class TestMcpServerConfiguration {
method myTools (line 260) | @Bean
method myPrompts (line 317) | @Bean
method myCompletions (line 338) | @Bean
method myResources (line 352) | @Bean
method evaluateExpression (line 380) | private double evaluateExpression(String expression) {
class TestMcpClientConfiguration (line 396) | public static class TestMcpClientConfiguration {
method clientCustomizer (line 398) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableMcpAnnotations2IT.java
class StreamableMcpAnnotations2IT (line 98) | public class StreamableMcpAnnotations2IT {
method clientServerCapabilities (line 113) | @Test
method startHttpServer (line 290) | private static DisposableServer startHttpServer(ApplicationContext ser...
method stopHttpServer (line 298) | private static void stopHttpServer(DisposableServer server) {
method getMcpSyncClient (line 305) | private static McpSyncClient getMcpSyncClient(ApplicationContext clien...
class TestMcpServerConfiguration (line 314) | public static class TestMcpServerConfiguration {
method serverSideSpecProviders (line 316) | @Bean
class McpServerHandlers (line 321) | public static class McpServerHandlers {
method toolWithSamplingAndElicitation (line 323) | @McpTool(description = "Test tool", name = "tool1")
method calculator (line 351) | @McpTool(name = "calculator", description = "Performs mathematical...
method evaluateExpression (line 361) | private static double evaluateExpression(String expression) {
method testResource (line 372) | @McpResource(name = "Test Resource", uri = "file://resource", mime...
method codeCompletionPrompt (line 390) | @McpPrompt(name = "code-completion", description = "this is code r...
method codeCompletion (line 405) | @McpComplete(prompt = "code-completion")
class TestMcpClientConfiguration (line 418) | public static class TestMcpClientConfiguration {
method testContext (line 420) | @Bean
method mcpClientHandlers (line 425) | @Bean
class TestContext (line 430) | public static class TestContext {
class TestMcpClientHandlers (line 440) | public static class TestMcpClientHandlers {
method TestMcpClientHandlers (line 446) | public TestMcpClientHandlers(TestContext testContext) {
method progressHandler (line 450) | @McpProgress(clients = "server1")
method loggingHandler (line 459) | @McpLogging(clients = "server1")
method samplingHandler (line 465) | @McpSampling(clients = "server1")
method elicitationHandler (line 477) | @McpElicitation(clients = "server1")
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableMcpAnnotationsIT.java
class StreamableMcpAnnotationsIT (line 99) | public class StreamableMcpAnnotationsIT {
method clientServerCapabilities (line 114) | @Test
method startHttpServer (line 286) | private static DisposableServer startHttpServer(ApplicationContext ser...
method stopHttpServer (line 294) | private static void stopHttpServer(DisposableServer server) {
method getMcpSyncClient (line 301) | private static McpSyncClient getMcpSyncClient(ApplicationContext clien...
class TestMcpServerConfiguration (line 307) | public static class TestMcpServerConfiguration {
method serverSideSpecProviders (line 309) | @Bean
class McpServerHandlers (line 314) | public static class McpServerHandlers {
method toolWithSamplingAndElicitation (line 316) | @McpTool(description = "Test tool", name = "tool1")
method calculator (line 359) | @McpTool(name = "calculator", description = "Performs mathematical...
method evaluateExpression (line 369) | private static double evaluateExpression(String expression) {
method testResource (line 380) | @McpResource(name = "Test Resource", uri = "file://resource", mime...
method codeCompletionPrompt (line 395) | @McpPrompt(name = "code-completion", description = "this is code r...
method codeCompletion (line 414) | @McpComplete(prompt = "code-completion") // the code-completion is...
class TestMcpClientConfiguration (line 427) | public static class TestMcpClientConfiguration {
method testContext (line 429) | @Bean
method mcpClientHandlers (line 434) | @Bean
class TestContext (line 439) | public static class TestContext {
class TestMcpClientHandlers (line 449) | public static class TestMcpClientHandlers {
method TestMcpClientHandlers (line 455) | public TestMcpClientHandlers(TestContext testContext) {
method progressHandler (line 459) | @McpProgress(clients = "server1")
method loggingHandler (line 468) | @McpLogging(clients = "server1")
method samplingHandler (line 474) | @McpSampling(clients = "server1")
method elicitationHandler (line 486) | @McpElicitation(clients = "server1")
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableMcpAnnotationsManualIT.java
class StreamableMcpAnnotationsManualIT (line 104) | @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".+")
method clientServerCapabilities (line 123) | @Test
method startHttpServer (line 293) | private static DisposableServer startHttpServer(ApplicationContext ser...
method stopHttpServer (line 301) | private static void stopHttpServer(DisposableServer server) {
method getMcpSyncClient (line 308) | private static McpSyncClient getMcpSyncClient(ApplicationContext clien...
class TestMcpServerConfiguration (line 314) | public static class TestMcpServerConfiguration {
method serverSideSpecProviders (line 316) | @Bean
class McpServerHandlers (line 321) | public static class McpServerHandlers {
method toolWithSamplingAndElicitation (line 323) | @McpTool(description = "Test tool", name = "tool1")
method calculator (line 366) | @McpTool(name = "calculator", description = "Performs mathematical...
method evaluateExpression (line 376) | private static double evaluateExpression(String expression) {
method testResource (line 387) | @McpResource(name = "Test Resource", uri = "file://resource", mime...
method codeCompletionPrompt (line 402) | @McpPrompt(name = "code-completion", description = "this is code r...
method codeCompletion (line 421) | @McpComplete(prompt = "code-completion") // the code-completion is...
class TestMcpClientConfiguration (line 434) | public static class TestMcpClientConfiguration {
method testContext (line 436) | @Bean
method mcpClientHandlers (line 441) | @Bean
class TestContext (line 447) | public static class TestContext {
class McpClientHandlers (line 457) | public static class McpClientHandlers {
method chatClient (line 467) | private ChatClient chatClient() {
method McpClientHandlers (line 474) | public McpClientHandlers(TestContext testContext,
method progressHandler (line 480) | @McpProgress(clients = "server1")
method loggingHandler (line 489) | @McpLogging(clients = "server1")
method samplingHandler (line 495) | @McpSampling(clients = "server1")
method elicitationHandler (line 512) | @McpElicitation(clients = "server1")
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableMcpAnnotationsWithLLMIT.java
class StreamableMcpAnnotationsWithLLMIT (line 84) | @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".+")
method anthropicAutoConfig (line 102) | private static AutoConfigurations anthropicAutoConfig(Class<?>... addi...
method clientServerCapabilities (line 111) | @Test
method startHttpServer (line 208) | private static DisposableServer startHttpServer(ApplicationContext ser...
method stopHttpServer (line 216) | private static void stopHttpServer(DisposableServer server) {
class TestMcpServerConfiguration (line 222) | public static class TestMcpServerConfiguration {
method serverSideSpecProviders (line 224) | @Bean
class McpServerHandlers (line 229) | public static class McpServerHandlers {
method weather (line 231) | @McpTool(description = "Provides weather information by city name")
class TestMcpClientConfiguration (line 266) | public static class TestMcpClientConfiguration {
method testContext (line 268) | @Bean
class TestContext (line 273) | public static class TestContext {
class TestMcpClientHandlers (line 286) | @ComponentScan(basePackageClasses = McpHandlerService.class)
method TestMcpClientHandlers (line 293) | public TestMcpClientHandlers(TestMcpClientConfiguration.TestContext ...
method progressHandler (line 297) | @McpProgress(clients = "server1")
method loggingHandler (line 305) | @McpLogging(clients = "server1")
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableWebClientWebFluxServerIT.java
class StreamableWebClientWebFluxServerIT (line 90) | public class StreamableWebClientWebFluxServerIT {
method clientServerCapabilities (line 107) | @Test
method startHttpServer (line 284) | private static DisposableServer startHttpServer(ApplicationContext ser...
method stopHttpServer (line 292) | private static void stopHttpServer(DisposableServer server) {
method getMcpSyncClient (line 300) | private static McpSyncClient getMcpSyncClient(ApplicationContext clien...
class TestMcpServerConfiguration (line 306) | public static class TestMcpServerConfiguration {
method myTools (line 308) | @Bean
method myPrompts (line 392) | @Bean
method myCompletions (line 420) | @Bean
method myResources (line 434) | @Bean
method evaluateExpression (line 462) | private double evaluateExpression(String expression) {
class TestContext (line 475) | private static class TestContext {
class TestMcpClientConfiguration (line 485) | public static class TestMcpClientConfiguration {
method testContext (line 487) | @Bean
method clientCustomizer (line 492) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/capabilities/McpHandlerConfiguration.java
class McpHandlerConfiguration (line 31) | @Configuration
method elicitationHandler (line 36) | @Bean
method foo (line 42) | @Bean
method bar (line 49) | @Bean
method elicitationHandler (line 57) | @McpElicitation(clients = "server1")
class Foo (line 69) | public static class Foo {
class Bar (line 73) | public static class Bar {
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/capabilities/McpHandlerService.java
class McpHandlerService (line 27) | @Service
method McpHandlerService (line 34) | public McpHandlerService(ChatClient.Builder chatClientBuilder) {
method samplingHandler (line 38) | @McpSampling(clients = "server1")
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/main/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerSseWebMvcAutoConfiguration.java
class McpServerSseWebMvcAutoConfiguration (line 71) | @AutoConfiguration(before = McpServerAutoConfiguration.class)
method webMvcSseServerTransportProvider (line 78) | @Bean
method webMvcSseServerRouterFunction (line 92) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/main/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerStatelessWebMvcAutoConfiguration.java
class McpServerStatelessWebMvcAutoConfiguration (line 41) | @AutoConfiguration(before = McpServerStatelessAutoConfiguration.class)
method webMvcStatelessServerTransport (line 48) | @Bean
method webMvcStatelessServerRouterFunction (line 62) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/main/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerStreamableHttpWebMvcAutoConfiguration.java
class McpServerStreamableHttpWebMvcAutoConfiguration (line 44) | @AutoConfiguration(before = McpServerAutoConfiguration.class)
method webMvcStreamableServerTransportProvider (line 51) | @Bean
method webMvcStreamableServerRouterFunction (line 67) | @Bean
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/test/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerSseWebMvcAutoConfigurationIT.java
class McpServerSseWebMvcAutoConfigurationIT (line 39) | class McpServerSseWebMvcAutoConfigurationIT {
method defaultConfiguration (line 45) | @Test
method endpointConfiguration (line 60) | @Test
method jsonMapperConfiguration (line 78) | @Test
method stdioEnabledConfiguration (line 86) | @Test
method serverDisableConfiguration (line 92) | @Test
method serverBaseUrlConfiguration (line 100) | @Test
method servletEnvironmentConfiguration (line 107) | @Test
method routerFunctionIsCreatedFromProvider (line 124) | @Test
method routerFunctionIsCustom (line 137) | @Test
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/test/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerStatelessWebMvcAutoConfigurationIT.java
class McpServerStatelessWebMvcAutoConfigurationIT (line 33) | class McpServerStatelessWebMvcAutoConfigurationIT {
method defaultConfiguration (line 40) | @Test
method jsonMapperConfiguration (line 48) | @Test
method serverDisableConfiguration (line 56) | @Test
method serverBaseUrlConfiguration (line 64) | @Test
method keepAliveIntervalConfiguration (line 71) | @Test
method disallowDeleteConfiguration (line 80) | @Test
method disallowDeleteFalseConfiguration (line 89) | @Test
method customjsonMapperIsUsed (line 98) | @Test
method conditionalOnClassPresent (line 109) | @Test
method conditionalOnMissingBeanWorks (line 118) | @Test
method routerFunctionIsCreatedFromProvider (line 135) | @Test
method routerFunctionIsCustom (line 148) | @Test
method allPropertiesConfiguration (line 160) | @Test
method enabledPropertyDefaultsToTrue (line 174) | @Test
method enabledPropertyExplicitlyTrue (line 184) | @Test
FILE: auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/test/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerStreamableHttpWebMvcAutoConfigurationIT.java
class McpServerStreamableHttpWebMvcAutoConfigurationIT (line 33) | class McpServerStreamableHttpWebMvcAutoConfigurationIT {
method defaultConfiguration (line 40) | @Test
method jsonMapperConfiguration (line 48) | @Test
method serverDisableConfiguration (line 56) | @Test
method serverBaseUrlConfiguration (line 64) | @Test
method keepAliveIntervalConfiguration (line 72) | @Test
method disallowDeleteConfiguration (line 81) | @Test
method disallowDeleteFalseConfiguration (line 90) | @Test
method customJsonMapperIsUsed (line 99) | @Test
method conditionalOnClassPresent (line 110) | @Test
method conditionalOnMissingBeanWorks (line 119) | @Test
method routerFunctionIsCreatedFromProvider (line 137) | @Test
method routerFunctionIsCustom (line 151) | @Test
method allPropertiesConfiguration (line 163) | @Test
method enabledPropertyDefaultsToTrue (line 179) | @Test
method enabledPropertyExplicitlyTrue (line 189) | @Test
FILE: auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/main/java/org/springframework/ai/model/chat/client/autoconfigure/ChatClientAutoConfiguration.java
class ChatClientAutoConfiguration (line 61) | @AutoConfiguration
method logPromptContentWarning (line 70) | private static void logPromptContentWarning() {
method logCompletionWarning (line 75) | private static void logCompletionWarning() {
method chatClientBuilderConfigurer (line 80) | @Bean
method chatClientBuilder (line 88) | @Bean
class TracerPresentObservationConfiguration (line 101) | @Configuration(proxyBeanMethods = false)
method chatClientPromptContentObservationHandler (line 106) | @Bean
method chatClientCompletionObservationHandler (line 117) | @Bean
class TracerNotPresentObservationConfiguration (line 130) | @Configuration(proxyBeanMethods = false)
method chatClientPromptContentObservationHandler (line 134) | @Bean
method chatClientCompletionObservationHandler (line 143) | @Bean
FILE: auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/main/java/org/springframework/ai/model/chat/client/autoconfigure/ChatClientBuilderConfigurer.java
class ChatClientBuilderConfigurer (line 35) | public class ChatClientBuilderConfigurer {
method setChatClientCustomizers (line 39) | void setChatClientCustomizers(List<ChatClientCustomizer> customizers) {
method configure (line 49) | public ChatClient.Builder configure(ChatClient.Builder builder) {
method applyCustomizers (line 54) | private void applyCustomizers(ChatClient.Builder builder) {
FILE: auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/main/java/org/springframework/ai/model/chat/client/autoconfigure/ChatClientBuilderProperties.java
class ChatClientBuilderProperties (line 32) | @ConfigurationProperties(ChatClientBuilderProperties.CONFIG_PREFIX)
method getObservations (line 44) | public Observations getObservations() {
method isEnabled (line 48) | public boolean isEnabled() {
method setEnabled (line 52) | public void setEnabled(boolean enabled) {
class Observations (line 56) | public static class Observations {
method isLogPrompt (line 69) | public boolean isLogPrompt() {
method isLogCompletion (line 77) | public boolean isLogCompletion() {
method setLogPrompt (line 81) | public void setLogPrompt(boolean logPrompt) {
method setLogCompletion (line 89) | public void setLogCompletion(boolean logCompletion) {
FILE: auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/test/java/org/springframework/ai/model/chat/client/autoconfigure/ChatClientObservationAutoConfigurationTests.java
class ChatClientObservationAutoConfigurationTests (line 45) | @ExtendWith(OutputCaptureExtension.class)
method handlersNoTracer (line 51) | @Test
method handlersWithTracer (line 59) | @Test
method promptContentHandlerEnabledNoTracer (line 67) | @Test
method promptContentHandlerEnabledWithTracer (line 78) | @Test
method promptContentHandlerDisabledNoTracer (line 89) | @Test
method promptContentHandlerDisabledWithTracer (line 98) | @Test
method completionHandlerEnabledNoTracer (line 107) | @Test
method completionHandlerEnabledWithTracer (line 118) | @Test
method completionHandlerDisabledNoTracer (line 129) | @Test
method completionDisabledWithTracer (line 138) | @Test
method customChatClientPromptContentObservationHandlerNoTracer (line 147) | @Test
method customChatClientPromptContentObservationHandlerWithTracer (line 158) | @Test
method customTracingAwareLoggingObservationHandlerForChatClientPromptContent (line 169) | @Test
method customChatClientCompletionObservationHandlerNoTracer (line 185) | @Test
method customChatClientCompletionObservationHandlerWithTracer (line 196) | @Test
method customTracingAwareLoggingObservationHandlerForChatClientCompletion (line 207) | @Test
class TracerConfiguration (line 223) | @Configuration(proxyBeanMethods = false)
method tracer (line 226) | @Bean
class CustomChatClientPromptContentObservationHandlerConfiguration (line 233) | @Configuration(proxyBeanMethods = false)
method customChatClientPromptContentObservationHandler (line 236) | @Bean
class CustomTracingAwareLoggingObservationHandlerForChatClientPromptContentConfiguration (line 243) | @Configuration(proxyBeanMethods = false)
method chatClientPromptContentObservationHandler (line 249) | @Bean
class CustomChatClientCompletionObservationHandlerConfiguration (line 256) | @Configuration(proxyBeanMethods = false)
method customChatClientCompletionObservationHandler (line 259) | @Bean
class CustomTracingAwareLoggingObservationHandlerForChatClientChatClientCompletionConfiguration (line 266) | @Configuration(proxyBeanMethods = false)
method chatClientCompletionObservationHandler (line 272) | @Bean
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/model/chat/memory/repository/cassandra/autoconfigure/CassandraChatMemoryRepositoryAutoConfiguration.java
class CassandraChatMemoryRepositoryAutoConfiguration (line 38) | @AutoConfiguration(before = ChatMemoryAutoConfiguration.class)
method cassandraChatMemoryRepository (line 43) | @Bean
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/model/chat/memory/repository/cassandra/autoconfigure/CassandraChatMemoryRepositoryProperties.java
class CassandraChatMemoryRepositoryProperties (line 35) | @ConfigurationProperties(CassandraChatMemoryRepositoryProperties.CONFIG_...
method isInitializeSchema (line 50) | public boolean isInitializeSchema() {
method setInitializeSchema (line 54) | public void setInitializeSchema(boolean initializeSchema) {
method getKeyspace (line 60) | public String getKeyspace() {
method setKeyspace (line 64) | public void setKeyspace(String keyspace) {
method getTable (line 68) | public String getTable() {
method setTable (line 72) | public void setTable(String table) {
method getMessagesColumn (line 76) | public String getMessagesColumn() {
method setMessagesColumn (line 80) | public void setMessagesColumn(String messagesColumn) {
method getTimeToLive (line 84) | public @Nullable Duration getTimeToLive() {
method setTimeToLive (line 88) | public void setTimeToLive(@Nullable Duration timeToLive) {
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cassandra/src/test/java/org/springframework/ai/model/chat/memory/repository/cassandra/autoconfigure/CassandraChatMemoryRepositoryAutoConfigurationIT.java
class CassandraChatMemoryRepositoryAutoConfigurationIT (line 44) | @Testcontainers
method addAndGet (line 57) | @Test
method compareTimeToLive_ISO8601Format (line 94) | @Test
method getContactPointHost (line 107) | private String getContactPointHost() {
method getContactPointPort (line 111) | private String getContactPointPort() {
method getTimeToLive (line 115) | private Duration getTimeToLive() {
method getTimeToLiveString (line 119) | private String getTimeToLiveString() {
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cassandra/src/test/java/org/springframework/ai/model/chat/memory/repository/cassandra/autoconfigure/CassandraChatMemoryRepositoryPropertiesTest.java
class CassandraChatMemoryRepositoryPropertiesTest (line 32) | class CassandraChatMemoryRepositoryPropertiesTest {
method defaultValues (line 34) | @Test
method customValues (line 46) | @Test
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cosmos-db/src/main/java/org/springframework/ai/model/chat/memory/repository/cosmosdb/autoconfigure/CosmosDBChatMemoryRepositoryAutoConfiguration.java
class CosmosDBChatMemoryRepositoryAutoConfiguration (line 40) | @AutoConfiguration(before = ChatMemoryAutoConfiguration.class)
method cosmosClient (line 47) | @Bean
method cosmosDBChatMemoryRepositoryConfig (line 78) | @Bean
method cosmosDBChatMemoryRepository (line 91) | @Bean
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cosmos-db/src/main/java/org/springframework/ai/model/chat/memory/repository/cosmosdb/autoconfigure/CosmosDBChatMemoryRepositoryProperties.java
class CosmosDBChatMemoryRepositoryProperties (line 30) | @ConfigurationProperties(CosmosDBChatMemoryRepositoryProperties.CONFIG_P...
method getEndpoint (line 47) | public @Nullable String getEndpoint() {
method setEndpoint (line 51) | public void setEndpoint(@Nullable String endpoint) {
method getKey (line 55) | public @Nullable String getKey() {
method setKey (line 59) | public void setKey(@Nullable String key) {
method getConnectionMode (line 63) | public String getConnectionMode() {
method setConnectionMode (line 67) | public void setConnectionMode(String connectionMode) {
method getDatabaseName (line 71) | public String getDatabaseName() {
method setDatabaseName (line 75) | public void setDatabaseName(String databaseName) {
method getContainerName (line 79) | public String getContainerName() {
method setContainerName (line 83) | public void setContainerName(String containerName) {
method getPartitionKeyPath (line 87) | public String getPartitionKeyPath() {
method setPartitionKeyPath (line 91) | public void setPartitionKeyPath(String partitionKeyPath) {
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cosmos-db/src/test/java/org/springframework/ai/model/chat/memory/repository/cosmosdb/autoconfigure/CosmosDBChatMemoryRepositoryAutoConfigurationIT.java
class CosmosDBChatMemoryRepositoryAutoConfigurationIT (line 40) | @EnabledIfEnvironmentVariable(named = "AZURE_COSMOSDB_ENDPOINT", matches...
method addAndGet (line 50) | @Test
method propertiesConfiguration (line 79) | @Test
method findConversationIds (line 97) | @Test
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cosmos-db/src/test/java/org/springframework/ai/model/chat/memory/repository/cosmosdb/autoconfigure/CosmosDBChatMemoryRepositoryPropertiesTest.java
class CosmosDBChatMemoryRepositoryPropertiesTest (line 34) | class CosmosDBChatMemoryRepositoryPropertiesTest {
method defaultProperties (line 39) | @Test
method customProperties (line 53) | @Test
class TestConfiguration (line 67) | @Configuration
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/model/chat/memory/repository/jdbc/autoconfigure/JdbcChatMemoryRepositoryAutoConfiguration.java
class JdbcChatMemoryRepositoryAutoConfiguration (line 40) | @AutoConfiguration(before = ChatMemoryAutoConfiguration.class)
method jdbcChatMemoryRepository (line 45) | @Bean
method jdbcChatMemoryScriptDatabaseInitializer (line 52) | @Bean
class OnJdbcChatMemoryRepositoryDatasourceInitializationCondition (line 60) | static class OnJdbcChatMemoryRepositoryDatasourceInitializationConditi...
method OnJdbcChatMemoryRepositoryDatasourceInitializationCondition (line 62) | OnJdbcChatMemoryRepositoryDatasourceInitializationCondition() {
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/model/chat/memory/repository/jdbc/autoconfigure/JdbcChatMemoryRepositoryProperties.java
class JdbcChatMemoryRepositoryProperties (line 28) | @ConfigurationProperties(JdbcChatMemoryRepositoryProperties.CONFIG_PREFIX)
method getDefaultSchemaLocation (line 35) | @Override
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/model/chat/memory/repository/jdbc/autoconfigure/JdbcChatMemoryRepositorySchemaInitializer.java
class JdbcChatMemoryRepositorySchemaInitializer (line 30) | class JdbcChatMemoryRepositorySchemaInitializer
method JdbcChatMemoryRepositorySchemaInitializer (line 33) | JdbcChatMemoryRepositorySchemaInitializer(DataSource dataSource, JdbcC...
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/model/chat/memory/repository/jdbc/autoconfigure/JdbcChatMemoryRepositoryHsqldbAutoConfigurationIT.java
class JdbcChatMemoryRepositoryHsqldbAutoConfigurationIT (line 43) | @ExtendWith(SpringExtension.class)
method setUp (line 68) | @BeforeEach
method useAutoConfiguredChatMemoryWithJdbc (line 124) | @Test
class TestConfig (line 185) | @SpringBootConfiguration
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/model/chat/memory/repository/jdbc/autoconfigure/JdbcChatMemoryRepositoryPostgresqlAutoConfigurationIT.java
class JdbcChatMemoryRepositoryPostgresqlAutoConfigurationIT (line 43) | class JdbcChatMemoryRepositoryPostgresqlAutoConfigurationIT {
method jdbcChatMemoryScriptDatabaseInitializer_shouldBeLoaded (line 50) | @Test
method jdbcChatMemoryScriptDatabaseInitializer_shouldNotRunSchemaInit (line 56) | @Test
method initializeSchemaEmbeddedDefault (line 68) | @Test
method useAutoConfiguredJdbcChatMemoryRepository (line 74) | @Test
method useAutoConfiguredChatMemoryWithJdbc (line 101) | @Test
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/model/chat/memory/repository/jdbc/autoconfigure/JdbcChatMemoryRepositoryPropertiesTests.java
class JdbcChatMemoryRepositoryPropertiesTests (line 28) | class JdbcChatMemoryRepositoryPropertiesTests {
method defaultValues (line 30) | @Test
method customValues (line 36) | @Test
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/model/chat/memory/repository/jdbc/autoconfigure/JdbcChatMemoryRepositorySchemaInitializerPostgresqlTests.java
class JdbcChatMemoryRepositorySchemaInitializerPostgresqlTests (line 37) | @Testcontainers
method getSettings_shouldHaveSchemaLocations (line 56) | @Test
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/model/chat/memory/repository/jdbc/autoconfigure/JdbcChatMemoryRepositorySqlServerAutoConfigurationIT.java
class JdbcChatMemoryRepositorySqlServerAutoConfigurationIT (line 45) | @Testcontainers
method jdbcChatMemoryScriptDatabaseInitializer_shouldBeLoaded (line 68) | @Test
method jdbcChatMemoryScriptDatabaseInitializer_shouldNotRunSchemaInit (line 74) | @Test
method initializeSchemaEmbeddedDefault (line 80) | @Test
method useAutoConfiguredChatMemoryWithJdbc (line 86) | @Test
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/test/resources/schema.sql
type SPRING_AI_CHAT_MEMORY (line 2) | CREATE TABLE IF NOT EXISTS SPRING_AI_CHAT_MEMORY (
type SPRING_AI_CHAT_MEMORY_CONVERSATION_ID_TIMESTAMP_IDX (line 9) | CREATE INDEX IF NOT EXISTS SPRING_AI_CHAT_MEMORY_CONVERSATION_ID_TIMESTA...
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-mongodb/src/main/java/org/springframework/ai/model/chat/memory/repository/mongo/autoconfigure/MongoChatMemoryAutoConfiguration.java
class MongoChatMemoryAutoConfiguration (line 34) | @AutoConfiguration(before = ChatMemoryAutoConfiguration.class)
method chatMemoryRepository (line 38) | @Bean
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-mongodb/src/main/java/org/springframework/ai/model/chat/memory/repository/mongo/autoconfigure/MongoChatMemoryIndexCreatorAutoConfiguration.java
class MongoChatMemoryIndexCreatorAutoConfiguration (line 44) | @AutoConfiguration
method MongoChatMemoryIndexCreatorAutoConfiguration (line 54) | public MongoChatMemoryIndexCreatorAutoConfiguration(final MongoTemplat...
method initIndicesAfterStartup (line 63) | @EventListener(ContextRefreshedEvent.class)
method createMainIndex (line 71) | private void createMainIndex() {
method createOrUpdateTtlIndex (line 79) | private void createOrUpdateTtlIndex() {
method createIndexSafely (line 110) | private void createIndexSafely(final IndexOperations indexOps, final I...
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-mongodb/src/main/java/org/springframework/ai/model/chat/memory/repository/mongo/autoconfigure/MongoChatMemoryProperties.java
class MongoChatMemoryProperties (line 29) | @ConfigurationProperties(MongoChatMemoryProperties.CONFIG_PREFIX)
method getTtl (line 46) | public Duration getTtl() {
method setTtl (line 50) | public void setTtl(Duration ttl) {
method isCreateIndices (line 54) | public boolean isCreateIndices() {
method setCreateIndices (line 58) | public void setCreateIndices(boolean createIndices) {
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-mongodb/src/test/java/org/springframework/ai/model/chat/memory/repository/mongo/autoconfigure/MongoChatMemoryAutoConfigurationIT.java
class MongoChatMemoryAutoConfigurationIT (line 39) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
method allMethodsShouldExecute (line 53) | @Test
method indicesShouldBeCreated (line 70) | @Test
class TestConfiguration (line 80) | @Configuration
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-mongodb/src/test/java/org/springframework/ai/model/chat/memory/repository/mongo/autoconfigure/MongoChatMemoryPropertiesTests.java
class MongoChatMemoryPropertiesTests (line 25) | public class MongoChatMemoryPropertiesTests {
method defaultValues_set (line 27) | @Test
method overrideValues (line 34) | @Test
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-neo4j/src/main/java/org/springframework/ai/model/chat/memory/repository/neo4j/autoconfigure/Neo4jChatMemoryRepositoryAutoConfiguration.java
class Neo4jChatMemoryRepositoryAutoConfiguration (line 37) | @AutoConfiguration(before = ChatMemoryAutoConfiguration.class)
method neo4jChatMemoryRepository (line 42) | @Bean
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-neo4j/src/main/java/org/springframework/ai/model/chat/memory/repository/neo4j/autoconfigure/Neo4jChatMemoryRepositoryProperties.java
class Neo4jChatMemoryRepositoryProperties (line 27) | @ConfigurationProperties(Neo4jChatMemoryRepositoryProperties.CONFIG_PREFIX)
method getSessionLabel (line 44) | public String getSessionLabel() {
method setSessionLabel (line 48) | public void setSessionLabel(String sessionLabel) {
method getToolCallLabel (line 52) | public String getToolCallLabel() {
method getMetadataLabel (line 56) | public String getMetadataLabel() {
method getMessageLabel (line 60) | public String getMessageLabel() {
method getToolResponseLabel (line 64) | public String getToolResponseLabel() {
method getMediaLabel (line 68) | public String getMediaLabel() {
method setToolCallLabel (line 72) | public void setToolCallLabel(String toolCallLabel) {
method setMetadataLabel (line 76) | public void setMetadataLabel(String metadataLabel) {
method setMessageLabel (line 80) | public void setMessageLabel(String messageLabel) {
method setToolResponseLabel (line 84) | public void setToolResponseLabel(String toolResponseLabel) {
method setMediaLabel (line 88) | public void setMediaLabel(String mediaLabel) {
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-neo4j/src/test/java/org/springframework/ai/model/chat/memory/repository/neo4j/autoconfigure/Neo4JChatMemoryRepositoryPropertiesTest.java
class Neo4JChatMemoryRepositoryPropertiesTest (line 29) | class Neo4JChatMemoryRepositoryPropertiesTest {
method defaultValues (line 31) | @Test
FILE: auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-neo4j/src/test/java/org/springframework/ai/model/chat/memory/repository/neo4j/autoconfigure/Neo4jChatMemoryRepositoryAutoConfigurationIT.java
class Neo4jChatMemoryRepositoryAutoConfigurationIT (line 54) | @Testcontainers
method addAndGet (line 68) | @Test
method setCustomConfiguration (line 137) | @Test
FILE: auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/main/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryAutoConfiguration.java
class RedisChatMemoryAutoConfiguration (line 37) | @AutoConfiguration(before = ChatMemoryAutoConfiguration.class)
method jedisClient (line 42) | @Bean
method redisChatMemory (line 48) | @Bean
FILE: auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/main/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryProperties.java
class RedisChatMemoryProperties (line 34) | @ConfigurationProperties(prefix = "spring.ai.chat.memory.redis")
method getHost (line 88) | public String getHost() {
method setHost (line 92) | public void setHost(String host) {
method getPort (line 96) | public int getPort() {
method setPort (line 100) | public void setPort(int port) {
method getIndexName (line 104) | public String getIndexName() {
method setIndexName (line 108) | public void setIndexName(String indexName) {
method getKeyPrefix (line 112) | public String getKeyPrefix() {
method setKeyPrefix (line 116) | public void setKeyPrefix(String keyPrefix) {
method getTimeToLive (line 120) | public @Nullable Duration getTimeToLive() {
method setTimeToLive (line 124) | public void setTimeToLive(@Nullable Duration timeToLive) {
method getInitializeSchema (line 128) | public Boolean getInitializeSchema() {
method setInitializeSchema (line 132) | public void setInitializeSchema(Boolean initializeSchema) {
method getMaxConversationIds (line 136) | public Integer getMaxConversationIds() {
method setMaxConversationIds (line 140) | public void setMaxConversationIds(Integer maxConversationIds) {
method getMaxMessagesPerConversation (line 144) | public Integer getMaxMessagesPerConversation() {
method setMaxMessagesPerConversation (line 148) | public void setMaxMessagesPerConversation(Integer maxMessagesPerConver...
method getMetadataFields (line 152) | public List<Map<String, String>> getMetadataFields() {
method setMetadataFields (line 156) | public void setMetadataFields(List<Map<String, String>> metadataFields) {
FILE: auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-redis/src/test/java/org/springframework/ai/model/chat/memory/redis/autoconfigure/RedisChatMemoryAutoConfigurationIT.java
class RedisChatMemoryAutoConfigurationIT (line 35) | @Testcontainers
method setup (line 45) | @BeforeAll
method autoConfigurationRegistersExpectedBeans (line 60) | @Test
method customPropertiesAreApplied (line 68) | @Test
method chatMemoryRepositoryIsProvidedByRedisChatMemory (line 80) | @Test
FILE: auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory/src/main/java/org/springframework/ai/model/chat/memory/autoconfigure/ChatMemoryAutoConfiguration.java
class ChatMemoryAutoConfiguration (line 34) | @AutoConfiguration
method chatMemoryRepository (line 38) | @Bean
method chatMemory (line 44) | @Bean
FILE: auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory/src/test/java/org/springframework/ai/model/chat/memory/autoconfigure/ChatMemoryAutoConfigurationTests.java
class ChatMemoryAutoConfigurationTests (line 37) | class ChatMemoryAutoConfigurationTests {
method defaultConfiguration (line 42) | @Test
method whenChatMemoryRepositoryExists (line 50) | @Test
method whenChatMemoryExists (line 59) | @Test
class CustomChatMemoryRepositoryConfiguration (line 68) | @Configuration(proxyBeanMethods = false)
method customChatMemoryRepository (line 73) | @Bean
class CustomChatMemoryConfiguration (line 80) | @Configuration(proxyBeanMethods = false)
method customChatMemory (line 85) | @Bean
FILE: auto-configurations/models/chat/observation/spring-ai-autoconfigure-model-chat-observation/src/main/java/org/springframework/ai/model/chat/observation/autoconfigure/ChatObservationAutoConfiguration.java
class ChatObservationAutoConfiguration (line 57) | @AutoConfiguration(
method logPromptContentWarning (line 65) | private static void logPromptContentWarning() {
method logCompletionWarning (line 70) | private static void logCompletionWarning() {
method chatModelMeterObservationHandler (line 75) | @Bean
class TracerPresentObservationConfiguration (line 82) | @Configuration(proxyBeanMethods = false)
method chatModelPromptContentObservationHandler (line 87) | @Bean
method chatModelCompletionObservationHandler (line 98) | @Bean
method errorLoggingObservationHandler (line 109) | @Bean
class TracerNotPresentObservationConfiguration (line 122) | @Configuration(proxyBeanMethods = false)
method chatModelPromptContentObservationHandler (line 126) | @Bean
method chatModelCompletionObservationHandler (line 135) | @Bean
FILE: auto-configurations/models/chat/observation/spring-ai-autoconfigure-model-chat-observation/src/main/java/org/springframework/ai/model/chat/observation/autoconfigure/ChatObservationProperties.java
class ChatObservationProperties (line 28) | @ConfigurationProperties(ChatObservationProperties.CONFIG_PREFIX)
method isLogCompletion (line 48) | public boolean isLogCompletion() {
method setLogCompletion (line 52) | public void setLogCompletion(boolean logCompletion) {
method isLogPrompt (line 56) | public boolean isLogPrompt() {
method setLogPrompt (line 60) | public void setLogPrompt(boolean logPrompt) {
method isIncludeErrorLogging (line 64) | public boolean isIncludeErrorLogging() {
method setIncludeErrorLogging (line 68) | public void setIncludeErrorLogging(boolean includeErrorLogging) {
FILE: auto-configurations/models/chat/observation/spring-ai-autoconfigure-model-chat-observation/src/test/java/org/springframework/ai/model/chat/observation/autoconfigure/ChatObservationAutoConfigurationOrderingTests.java
class ChatObservationAutoConfigurationOrderingTests (line 59) | class ChatObservationAutoConfigurationOrderingTests {
method meterObservationHandlerCreatedWithFullAutoConfigChain (line 66) | @Test
method tokenUsageMetricGeneratedWithFullAutoConfigChain (line 74) | @Test
class TestUsage (line 101) | static class TestUsage implements Usage {
method getPromptTokens (line 103) | @Override
method getCompletionTokens (line 108) | @Override
method getNativeUsage (line 113) | @Override
FILE: auto-configurations/models/chat/observation/spring-ai-autoconfigure-model-chat-observation/src/test/java/org/springframework/ai/model/chat/observation/autoconfigure/ChatObservationAutoConfigurationTests.java
class ChatObservationAutoConfigurationTests (line 50) | @ExtendWith(OutputCaptureExtension.class)
method meterObservationHandlerEnabled (line 56) | @Test
method meterObservationHandlerDisabled (line 62) | @Test
method handlersNoTracer (line 67) | @Test
method handlersWithTracer (line 76) | @Test
method promptContentHandlerEnabledNoTracer (line 85) | @Test
method promptContentHandlerEnabledWithTracer (line 97) | @Test
method promptContentHandlerDisabledNoTracer (line 109) | @Test
method promptContentHandlerDisabledWithTracer (line 119) | @Test
method completionHandlerEnabledNoTracer (line 129) | @Test
method completionHandlerEnabledWithTracer (line 141) | @Test
method completionHandlerDisabledNoTracer (line 153) | @Test
method completionHandlerDisabledWithTracer (line 163) | @Test
method errorLoggingHandlerEnabledNoTracer (line 173) | @Test
method errorLoggingHandlerEnabledWithTracer (line 183) | @Test
method errorLoggingHandlerDisabledNoTracer (line 193) | @Test
method errorLoggingHandlerDisabledWithTracer (line 203) | @Test
method customChatModelPromptContentObservationHandlerNoTracer (line 213) | @Test
method customChatModelPromptContentObservationHandlerWithTracer (line 225) | @Test
method customTracingAwareLoggingObservationHandlerForChatModelPromptContent (line 237) | @Test
method customChatModelCompletionObservationHandlerNoTracer (line 254) | @Test
method customChatModelCompletionObservationHandlerWithTracer (line 266) | @Test
method customTracingAwareLoggingObservationHandlerForChatModelCompletion (line 278) | @Test
method customErrorLoggingObservationHandler (line 294) | @Test
class TracerConfiguration (line 306) | @Configuration(proxyBeanMethods = false)
method tracer (line 309) | @Bean
class CustomChatModelPromptContentObservationHandlerConfiguration (line 316) | @Configuration(proxyBeanMethods = false)
method customChatModelPromptContentObservationHandler (line 319) | @Bean
class CustomTracingAwareLoggingObservationHandlerForChatModelPromptContentConfiguration (line 326) | @Configuration(proxyBeanMethods = false)
method chatModelPromptContentObservationHandler (line 332) | @Bean
class CustomChatModelCompletionObservationHandlerConfiguration (line 339) | @Configuration(proxyBeanMethods = false)
method customChatModelCompletionObservationHandler (line 342) | @Bean
class CustomTracingAwareLoggingObservationHandlerForChatModelCompletionConfiguration (line 349) | @Configuration(proxyBeanMethods = false)
method chatModelCompletionObservationHandler (line 355) | @Bean
class CustomErrorLoggingObservationHandlerConfiguration (line 362) | @Configuration(proxyBeanMethods = false)
method customErrorLoggingObservationHandler (line 365) | @Bean
FILE: auto-configurations/models/embedding/observation/spring-ai-autoconfigure-model-embedding-observation/src/main/java/org/springframework/ai/model/embedding/observation/autoconfigure/EmbeddingObservationAutoConfiguration.java
class EmbeddingObservationAutoConfiguration (line 38) | @AutoConfiguration(
method embeddingModelMeterObservationHandler (line 43) | @Bean
FILE: auto-configurations/models/embedding/observation/spring-ai-autoconfigure-model-embedding-observation/src/test/java/org/springframework/ai/model/embedding/observation/autoconfigure/EmbeddingObservationAutoConfigurationTests.java
class EmbeddingObservationAutoConfigurationTests (line 33) | class EmbeddingObservationAutoConfigurationTests {
method meterObservationHandlerEnabled (line 38) | @Test
method meterObservationHandlerDisabled (line 44) | @Test
FILE: auto-configurations/models/image/observation/spring-ai-autoconfigure-model-image-observation/src/main/java/org/springframework/ai/model/image/observation/autoconfigure/ImageObservationAutoConfiguration.java
class ImageObservationAutoConfiguration (line 44) | @AutoConfiguration
method logPromptContentWarning (line 51) | private static void logPromptContentWarning() {
class TracerPresentObservationConfiguration (line 56) | @Configuration(proxyBeanMethods = false)
method imageModelPromptContentObservationHandler (line 61) | @Bean
class TracerNotPresentObservationConfiguration (line 74) | @Configuration(proxyBeanMethods = false)
method imageModelPromptContentObservationHandler (line 78) | @Bean
FILE: auto-configurations/models/image/observation/spring-ai-autoconfigure-model-image-observation/src/main/java/org/springframework/ai/model/image/observation/autoconfigure/ImageObservationProperties.java
class ImageObservationProperties (line 28) | @ConfigurationProperties(ImageObservationProperties.CONFIG_PREFIX)
method isLogPrompt (line 38) | public boolean isLogPrompt() {
method setLogPrompt (line 42) | public void setLogPrompt(boolean logPrompt) {
FILE: auto-configurations/models/image/observation/spring-ai-autoconfigure-model-image-observation/src/test/java/org/springframework/ai/model/image/observation/autoconfigure/ImageObservationAutoConfigurationTests.java
class ImageObservationAutoConfigurationTests (line 43) | @ExtendWith(OutputCaptureExtension.class)
method imageModelPromptContentHandlerNoTracer (line 49) | @Test
method imageModelPromptContentHandlerWithTracer (line 56) | @Test
method imageModelPromptContentHandlerEnabledNoTracer (line 63) | @Test
method imageModelPromptContentHandlerEnabledWithTracer (line 73) | @Test
method imageModelPromptContentHandlerDisabledNoTracer (line 83) | @Test
method imageModelPromptContentHandlerDisabledWithTracer (line 91) | @Test
method customChatClientPromptContentObservationHandlerNoTracer (line 99) | @Test
method customChatClientPromptContentObservationHandlerWithTracer (line 110) | @Test
method customTracingAwareLoggingObservationHandler (line 120) | @Test
class TracerConfiguration (line 135) | @Configuration(proxyBeanMethods = false)
method tracer (line 138) | @Bean
class CustomImageModelPromptContentObservationHandlerConfiguration (line 145) | @Configuration(proxyBeanMethods = false)
method customImageModelPromptContentObservationHandler (line 148) | @Bean
class CustomTracingAwareLoggingObservationHandlerConfiguration (line 155) | @Configuration(proxyBeanMethods = false)
method imageModelPromptContentObservationHandler (line 161) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/main/java/org/springframework/ai/model/anthropic/autoconfigure/AnthropicChatAutoConfiguration.java
class AnthropicChatAutoConfiguration (line 44) | @AutoConfiguration
method anthropicChatModel (line 51) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/main/java/org/springframework/ai/model/anthropic/autoconfigure/AnthropicChatProperties.java
class AnthropicChatProperties (line 30) | @ConfigurationProperties(AnthropicChatProperties.CONFIG_PREFIX)
method getOptions (line 43) | public AnthropicChatOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/main/java/org/springframework/ai/model/anthropic/autoconfigure/AnthropicConnectionProperties.java
class AnthropicConnectionProperties (line 28) | @ConfigurationProperties(AnthropicConnectionProperties.CONFIG_PREFIX)
FILE: auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/test/java/org/springframework/ai/model/anthropic/autoconfigure/AnthropicChatAutoConfigurationIT.java
class AnthropicChatAutoConfigurationIT (line 46) | @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".+")
method call (line 56) | @Test
method callWithOptions (line 66) | @Test
method stream (line 77) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/test/java/org/springframework/ai/model/anthropic/autoconfigure/AnthropicModelConfigurationTests.java
class AnthropicModelConfigurationTests (line 33) | class AnthropicModelConfigurationTests {
method chatModelActivation (line 40) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/test/java/org/springframework/ai/model/anthropic/autoconfigure/AnthropicPropertiesTests.java
class AnthropicPropertiesTests (line 34) | class AnthropicPropertiesTests {
method connectionProperties (line 36) | @Test
method chatOverrideConnectionProperties (line 56) | @Test
method chatOptionsTest (line 80) | @Test
method webSearchToolProperties (line 106) | @Test
method chatCompletionDisabled (line 135) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/test/java/org/springframework/ai/model/anthropic/autoconfigure/tool/FunctionCallWithFunctionBeanIT.java
class FunctionCallWithFunctionBeanIT (line 50) | @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".+")
method functionCallTest (line 61) | @Test
class Config (line 89) | @Configuration
method weatherFunction (line 92) | @Bean
method weatherFunction3 (line 98) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/test/java/org/springframework/ai/model/anthropic/autoconfigure/tool/FunctionCallWithPromptFunctionIT.java
class FunctionCallWithPromptFunctionIT (line 44) | @EnabledIfEnvironmentVariable(named = "ANTHROPIC_API_KEY", matches = ".+")
method functionCallTest (line 54) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-anthropic/src/test/java/org/springframework/ai/model/anthropic/autoconfigure/tool/MockWeatherService.java
class MockWeatherService (line 32) | public class MockWeatherService implements Function<MockWeatherService.R...
method apply (line 34) | @Override
type Unit (line 54) | public enum Unit {
method Unit (line 70) | Unit(String text) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAIClientBuilderCustomizer.java
type AzureOpenAIClientBuilderCustomizer (line 28) | @FunctionalInterface
method customize (line 35) | void customize(OpenAIClientBuilder clientBuilder);
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiAudioTranscriptionAutoConfiguration.java
class AzureOpenAiAudioTranscriptionAutoConfiguration (line 40) | @AutoConfiguration
method azureOpenAiAudioTranscriptionModel (line 48) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiAudioTranscriptionProperties.java
class AzureOpenAiAudioTranscriptionProperties (line 28) | @ConfigurationProperties(AzureOpenAiAudioTranscriptionProperties.CONFIG_...
method getOptions (line 36) | public AzureOpenAiAudioTranscriptionOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiChatAutoConfiguration.java
class AzureOpenAiChatAutoConfiguration (line 46) | @AutoConfiguration
method azureOpenAiChatModel (line 54) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiChatProperties.java
class AzureOpenAiChatProperties (line 23) | @ConfigurationProperties(AzureOpenAiChatProperties.CONFIG_PREFIX)
method getOptions (line 35) | public AzureOpenAiChatOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiClientBuilderConfiguration.java
class AzureOpenAiClientBuilderConfiguration (line 46) | @ConditionalOnClass(OpenAIClientBuilder.class)
method openAIClientBuilder (line 52) | @Bean
method applyOpenAIClientBuilderCustomizers (line 94) | private void applyOpenAIClientBuilderCustomizers(OpenAIClientBuilder c...
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiConnectionProperties.java
class AzureOpenAiConnectionProperties (line 24) | @ConfigurationProperties(AzureOpenAiConnectionProperties.CONFIG_PREFIX)
method getEndpoint (line 49) | public String getEndpoint() {
method setEndpoint (line 53) | public void setEndpoint(String endpoint) {
method getApiKey (line 57) | public String getApiKey() {
method setApiKey (line 61) | public void setApiKey(String apiKey) {
method getOpenAiApiKey (line 65) | public String getOpenAiApiKey() {
method setOpenAiApiKey (line 69) | public void setOpenAiApiKey(String openAiApiKey) {
method getCustomHeaders (line 73) | public Map<String, String> getCustomHeaders() {
method setCustomHeaders (line 77) | public void setCustomHeaders(Map<String, String> customHeaders) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiEmbeddingAutoConfiguration.java
class AzureOpenAiEmbeddingAutoConfiguration (line 43) | @AutoConfiguration
method azureOpenAiEmbeddingModel (line 51) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiEmbeddingProperties.java
class AzureOpenAiEmbeddingProperties (line 25) | @ConfigurationProperties(AzureOpenAiEmbeddingProperties.CONFIG_PREFIX)
method getOptions (line 37) | public AzureOpenAiEmbeddingOptions getOptions() {
method getMetadataMode (line 41) | public MetadataMode getMetadataMode() {
method setMetadataMode (line 45) | public void setMetadataMode(MetadataMode metadataMode) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiImageAutoConfiguration.java
class AzureOpenAiImageAutoConfiguration (line 40) | @AutoConfiguration
method azureOpenAiImageModel (line 48) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/main/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiImageOptionsProperties.java
class AzureOpenAiImageOptionsProperties (line 29) | @ConfigurationProperties(AzureOpenAiImageOptionsProperties.CONFIG_PREFIX)
method getOptions (line 37) | public AzureOpenAiImageOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiAutoConfigurationEntraIT.java
class AzureOpenAiAutoConfigurationEntraIT (line 69) | @DisabledIfEnvironmentVariable(named = "AZURE_OPENAI_API_KEY", matches =...
method chatCompletion (line 101) | @Test
method httpRequestContainsUserAgentAndCustomHeaders (line 113) | @Test
method chatCompletionStreaming (line 142) | @Test
method embedding (line 168) | @Test
method transcribe (line 187) | @Test
method chatActivation (line 202) | @Test
method embeddingActivation (line 235) | @Test
method audioTranscriptionActivation (line 262) | @Test
method openAIClientBuilderCustomizer (line 286) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiAutoConfigurationIT.java
class AzureOpenAiAutoConfigurationIT (line 67) | @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_API_KEY", matches = ...
method chatCompletion (line 99) | @Test
method httpRequestContainsUserAgentAndCustomHeaders (line 111) | @Test
method chatCompletionStreaming (line 140) | @Test
method embedding (line 166) | @Test
method transcribe (line 185) | @Test
method chatActivation (line 200) | @Test
method embeddingActivation (line 233) | @Test
method audioTranscriptionActivation (line 260) | @Test
method openAIClientBuilderCustomizer (line 284) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiAutoConfigurationPropertyTests.java
class AzureOpenAiAutoConfigurationPropertyTests (line 32) | public class AzureOpenAiAutoConfigurationPropertyTests {
method embeddingPropertiesTest (line 34) | @Test
method chatPropertiesTest (line 53) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiDirectOpenAiAutoConfigurationIT.java
class AzureOpenAiDirectOpenAiAutoConfigurationIT (line 48) | @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+")
method chatCompletion (line 78) | @Test
method chatCompletionStreaming (line 87) | @Test
method embedding (line 109) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/AzureOpenAiModelConfigurationTests.java
class AzureOpenAiModelConfigurationTests (line 38) | public class AzureOpenAiModelConfigurationTests {
method chatModelActivation (line 43) | @Test
method embeddingModelActivation (line 90) | @Test
method imageModelActivation (line 130) | @Test
method audioTranscriptionModelActivation (line 170) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/tool/DeploymentNameUtil.java
class DeploymentNameUtil (line 21) | public final class DeploymentNameUtil {
method DeploymentNameUtil (line 23) | private DeploymentNameUtil() {
method getDeploymentName (line 27) | public static String getDeploymentName() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/tool/FunctionCallWithFunctionBeanIT.java
class FunctionCallWithFunctionBeanIT (line 44) | @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_API_KEY", matches = ...
method functionCallTest (line 59) | @Test
method functionCallWithPortableFunctionCallingOptions (line 88) | @Test
class Config (line 110) | @Configuration
method weatherFunction (line 113) | @Bean
method weatherFunction3 (line 121) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/tool/FunctionCallWithFunctionWrapperIT.java
class FunctionCallWithFunctionWrapperIT (line 42) | @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_API_KEY", matches = ...
method functionCallTest (line 57) | @Test
class Config (line 79) | @Configuration
method weatherFunctionInfo (line 82) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/tool/FunctionCallWithPromptFunctionIT.java
class FunctionCallWithPromptFunctionIT (line 39) | @EnabledIfEnvironmentVariable(named = "AZURE_OPENAI_API_KEY", matches = ...
method functionCallTest (line 53) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-azure-openai/src/test/java/org/springframework/ai/model/azure/openai/autoconfigure/tool/MockWeatherService.java
class MockWeatherService (line 32) | public class MockWeatherService implements Function<MockWeatherService.R...
method apply (line 34) | @Override
type Unit (line 54) | public enum Unit {
method Unit (line 70) | Unit(String text) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/autoconfigure/BedrockAwsConnectionConfiguration.java
class BedrockAwsConnectionConfiguration (line 45) | @Configuration
method credentialsProvider (line 49) | @Bean
method regionProvider (line 96) | @Bean
class StaticRegionProvider (line 107) | static class StaticRegionProvider implements AwsRegionProvider {
method StaticRegionProvider (line 111) | StaticRegionProvider(String region) {
method getRegion (line 120) | @Override
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/autoconfigure/BedrockAwsConnectionProperties.java
class BedrockAwsConnectionProperties (line 31) | @ConfigurationProperties(BedrockAwsConnectionProperties.CONFIG_PREFIX)
method getRegion (line 89) | public String getRegion() {
method setRegion (line 93) | public void setRegion(String awsRegion) {
method getAccessKey (line 97) | public String getAccessKey() {
method setAccessKey (line 101) | public void setAccessKey(String accessKey) {
method getSecretKey (line 105) | public String getSecretKey() {
method setSecretKey (line 109) | public void setSecretKey(String secretKey) {
method getTimeout (line 113) | public Duration getTimeout() {
method setTimeout (line 117) | public void setTimeout(Duration timeout) {
method getConnectionTimeout (line 121) | public Duration getConnectionTimeout() {
method setConnectionTimeout (line 125) | public void setConnectionTimeout(Duration connectionTimeout) {
method getAsyncReadTimeout (line 129) | public Duration getAsyncReadTimeout() {
method setAsyncReadTimeout (line 133) | public void setAsyncReadTimeout(Duration asyncReadTimeout) {
method getConnectionAcquisitionTimeout (line 137) | public Duration getConnectionAcquisitionTimeout() {
method setConnectionAcquisitionTimeout (line 141) | public void setConnectionAcquisitionTimeout(Duration connectionAcquisi...
method getSocketTimeout (line 145) | public Duration getSocketTimeout() {
method setSocketTimeout (line 149) | public void setSocketTimeout(Duration socketTimeout) {
method getSessionToken (line 153) | public String getSessionToken() {
method setSessionToken (line 157) | public void setSessionToken(String sessionToken) {
method getProfile (line 161) | public ProfileProperties getProfile() {
method setProfile (line 165) | public void setProfile(ProfileProperties profile) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/autoconfigure/ProfileProperties.java
class ProfileProperties (line 24) | public class ProfileProperties {
method getName (line 41) | public String getName() {
method setName (line 45) | public void setName(String name) {
method getCredentialsPath (line 49) | public String getCredentialsPath() {
method setCredentialsPath (line 53) | public void setCredentialsPath(String credentialsPath) {
method getConfigurationPath (line 57) | public String getConfigurationPath() {
method setConfigurationPath (line 61) | public void setConfigurationPath(String configurationPath) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/cohere/autoconfigure/BedrockCohereEmbeddingAutoConfiguration.java
class BedrockCohereEmbeddingAutoConfiguration (line 45) | @AutoConfiguration
method cohereEmbeddingApi (line 53) | @Bean
method cohereEmbeddingModel (line 63) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/cohere/autoconfigure/BedrockCohereEmbeddingProperties.java
class BedrockCohereEmbeddingProperties (line 32) | @ConfigurationProperties(BedrockCohereEmbeddingProperties.CONFIG_PREFIX)
method getModel (line 54) | public String getModel() {
method setModel (line 58) | public void setModel(String model) {
method getOptions (line 62) | public BedrockCohereEmbeddingOptions getOptions() {
method isEnabled (line 66) | public boolean isEnabled() {
method setEnabled (line 70) | public void setEnabled(boolean enabled) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/converse/autoconfigure/BedrockConverseProxyChatAutoConfiguration.java
class BedrockConverseProxyChatAutoConfiguration (line 53) | @AutoConfiguration
method bedrockProxyChatModel (line 61) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/converse/autoconfigure/BedrockConverseProxyChatProperties.java
class BedrockConverseProxyChatProperties (line 30) | @ConfigurationProperties(BedrockConverseProxyChatProperties.CONFIG_PREFIX)
method getOptions (line 43) | public BedrockChatOptions getOptions() {
method isEnabled (line 47) | public boolean isEnabled() {
method setEnabled (line 51) | public void setEnabled(boolean enabled) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/titan/autoconfigure/BedrockTitanEmbeddingAutoConfiguration.java
class BedrockTitanEmbeddingAutoConfiguration (line 48) | @AutoConfiguration
method titanEmbeddingBedrockApi (line 56) | @Bean
method titanEmbeddingModel (line 72) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/main/java/org/springframework/ai/model/bedrock/titan/autoconfigure/BedrockTitanEmbeddingProperties.java
class BedrockTitanEmbeddingProperties (line 29) | @ConfigurationProperties(BedrockTitanEmbeddingProperties.CONFIG_PREFIX)
method getConfigPrefix (line 45) | public static String getConfigPrefix() {
method getModel (line 49) | public String getModel() {
method setModel (line 53) | public void setModel(String model) {
method getInputType (line 57) | public InputType getInputType() {
method setInputType (line 61) | public void setInputType(InputType inputType) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/autoconfigure/BedrockAwsConnectionConfigurationIT.java
class BedrockAwsConnectionConfigurationIT (line 45) | @RequiresAwsCredentials
method autoConfigureAWSCredentialAndRegionProvider (line 48) | @Test
method autoConfigureWithCustomAWSCredentialAndRegionProvider (line 68) | @Test
method autoConfigureWithCustomAWSProfileCredentialAndRegionProvider (line 90) | @Test
class TestAutoConfiguration (line 114) | @EnableConfigurationProperties(BedrockAwsConnectionProperties.class)
class CustomAwsProfileCredentialsProviderAutoConfiguration (line 120) | @AutoConfiguration
method credentialsProvider (line 123) | @Bean
class CustomAwsCredentialsProviderAutoConfiguration (line 155) | @AutoConfiguration
method credentialsProvider (line 158) | @Bean
class CustomAwsRegionProviderAutoConfiguration (line 185) | @AutoConfiguration
method regionProvider (line 188) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/autoconfigure/BedrockTestUtils.java
class BedrockTestUtils (line 26) | public final class BedrockTestUtils {
method BedrockTestUtils (line 28) | private BedrockTestUtils() {
method getContextRunner (line 31) | public static ApplicationContextRunner getContextRunner() {
method getContextRunnerWithUserConfiguration (line 40) | public static ApplicationContextRunner getContextRunnerWithUserConfigu...
class Config (line 44) | @Configuration
method jsonMapper (line 47) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/cohere/autoconfigure/BedrockCohereEmbeddingAutoConfigurationIT.java
class BedrockCohereEmbeddingAutoConfigurationIT (line 42) | @RequiresAwsCredentials
method singleEmbedding (line 52) | @Test
method batchEmbedding (line 64) | @Test
method propertiesTest (line 84) | @Test
method embeddingActivation (line 110) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/cohere/autoconfigure/BedrockCohereModelConfigurationTests.java
class BedrockCohereModelConfigurationTests (line 34) | public class BedrockCohereModelConfigurationTests {
method embeddingModelActivation (line 40) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/converse/autoconfigure/BedrockConverseModelConfigurationTests.java
class BedrockConverseModelConfigurationTests (line 36) | public class BedrockConverseModelConfigurationTests {
method chatModelActivation (line 41) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/converse/autoconfigure/BedrockConverseProxyChatAutoConfigurationIT.java
class BedrockConverseProxyChatAutoConfigurationIT (line 41) | @RequiresAwsCredentials
method call (line 53) | @Test
method stream (line 63) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/converse/autoconfigure/BedrockConverseProxyChatPropertiesTests.java
class BedrockConverseProxyChatPropertiesTests (line 35) | public class BedrockConverseProxyChatPropertiesTests {
method chatOptionsTest (line 37) | @Test
method chatCompletionDisabled (line 68) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/converse/autoconfigure/tool/FunctionCallWithFunctionBeanIT.java
class FunctionCallWithFunctionBeanIT (line 45) | @RequiresAwsCredentials
method functionCallTest (line 55) | @Test
method functionStreamTest (line 84) | @Test
class Config (line 113) | @Configuration
method weatherFunction (line 116) | @Bean
method weatherFunction3 (line 124) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/converse/autoconfigure/tool/FunctionCallWithPromptFunctionIT.java
class FunctionCallWithPromptFunctionIT (line 40) | @RequiresAwsCredentials
method functionCallTest (line 49) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/converse/autoconfigure/tool/MockWeatherService.java
class MockWeatherService (line 32) | public class MockWeatherService implements Function<MockWeatherService.R...
method apply (line 34) | @Override
type Unit (line 54) | public enum Unit {
method Unit (line 70) | Unit(String text) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/titan/autoconfigure/BedrockTitanEmbeddingAutoConfigurationIT.java
class BedrockTitanEmbeddingAutoConfigurationIT (line 43) | @RequiresAwsCredentials
method singleTextEmbedding (line 54) | @Test
method singleImageEmbedding (line 66) | @Test
method propertiesTest (line 85) | @Test
method embeddingActivation (line 109) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-bedrock-ai/src/test/java/org/springframework/ai/model/bedrock/titan/autoconfigure/BedrockTitanModelConfigurationTests.java
class BedrockTitanModelConfigurationTests (line 34) | public class BedrockTitanModelConfigurationTests {
method embeddingModelActivation (line 40) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/main/java/org/springframework/ai/model/deepseek/autoconfigure/DeepSeekChatAutoConfiguration.java
class DeepSeekChatAutoConfiguration (line 52) | @AutoConfiguration
method deepSeekChatModel (line 59) | @Bean
method deepSeekApi (line 88) | private DeepSeekApi deepSeekApi(DeepSeekChatProperties chatProperties,
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/main/java/org/springframework/ai/model/deepseek/autoconfigure/DeepSeekChatProperties.java
class DeepSeekChatProperties (line 29) | @ConfigurationProperties(DeepSeekChatProperties.CONFIG_PREFIX)
method getOptions (line 52) | public DeepSeekChatOptions getOptions() {
method isEnabled (line 56) | public boolean isEnabled() {
method setEnabled (line 60) | public void setEnabled(boolean enabled) {
method getCompletionsPath (line 64) | public String getCompletionsPath() {
method setCompletionsPath (line 68) | public void setCompletionsPath(String completionsPath) {
method getBetaPrefixPath (line 72) | public String getBetaPrefixPath() {
method setBetaPrefixPath (line 76) | public void setBetaPrefixPath(String betaPrefixPath) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/main/java/org/springframework/ai/model/deepseek/autoconfigure/DeepSeekConnectionProperties.java
class DeepSeekConnectionProperties (line 26) | @ConfigurationProperties(DeepSeekConnectionProperties.CONFIG_PREFIX)
method DeepSeekConnectionProperties (line 33) | public DeepSeekConnectionProperties() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/main/java/org/springframework/ai/model/deepseek/autoconfigure/DeepSeekParentProperties.java
class DeepSeekParentProperties (line 24) | public class DeepSeekParentProperties {
method getApiKey (line 30) | public String getApiKey() {
method setApiKey (line 34) | public void setApiKey(String apiKey) {
method getBaseUrl (line 38) | public String getBaseUrl() {
method setBaseUrl (line 42) | public void setBaseUrl(String baseUrl) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/test/java/org/springframework/ai/model/deepseek/autoconfigure/BaseDeepSeekIT.java
class BaseDeepSeekIT (line 32) | public abstract class BaseDeepSeekIT {
method deepSeekAutoConfig (line 34) | public static AutoConfigurations deepSeekAutoConfig(Class<?>... additi...
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/test/java/org/springframework/ai/model/deepseek/autoconfigure/DeepSeekAutoConfigurationIT.java
class DeepSeekAutoConfigurationIT (line 46) | @EnabledIfEnvironmentVariable(named = "DEEPSEEK_API_KEY", matches = ".+")
method generate (line 57) | @Test
method generateStreaming (line 67) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/test/java/org/springframework/ai/model/deepseek/autoconfigure/DeepSeekPropertiesTests.java
class DeepSeekPropertiesTests (line 36) | public class DeepSeekPropertiesTests {
method chatProperties (line 38) | @Test
method chatOverrideConnectionProperties (line 66) | @Test
method chatOptionsTest (line 96) | @Test
method chatActivation (line 137) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/test/java/org/springframework/ai/model/deepseek/autoconfigure/tool/DeepSeekFunctionCallbackIT.java
class DeepSeekFunctionCallbackIT (line 57) | @EnabledIfEnvironmentVariable(named = "DEEPSEEK_API_KEY", matches = ".+")
method functionCallTest (line 69) | @Test
method streamFunctionCallTest (line 88) | @Test
class Config (line 118) | @Configuration
method weatherFunctionInfo (line 121) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/test/java/org/springframework/ai/model/deepseek/autoconfigure/tool/FunctionCallbackInPromptIT.java
class FunctionCallbackInPromptIT (line 53) | @EnabledIfEnvironmentVariable(named = "DEEPSEEK_API_KEY", matches = ".+")
method functionCallTest (line 64) | @Test
method streamingFunctionCallTest (line 88) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/test/java/org/springframework/ai/model/deepseek/autoconfigure/tool/FunctionCallbackWithPlainFunctionBeanIT.java
class FunctionCallbackWithPlainFunctionBeanIT (line 55) | @EnabledIfEnvironmentVariable(named = "DEEPSEEK_API_KEY", matches = ".+")
method functionCallTest (line 69) | @Test
method functionCallWithPortableFunctionCallingOptions (line 97) | @Test
method streamFunctionCallTest (line 117) | @Test
class Config (line 164) | @Configuration
method weatherFunction (line 167) | @Bean
method weatherFunctionTwo (line 175) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-deepseek/src/test/java/org/springframework/ai/model/deepseek/autoconfigure/tool/MockWeatherService.java
class MockWeatherService (line 32) | public class MockWeatherService implements Function<MockWeatherService.R...
method apply (line 34) | @Override
type Unit (line 54) | public enum Unit {
method Unit (line 70) | Unit(String text) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/main/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfiguration.java
class ElevenLabsAutoConfiguration (line 42) | @AutoConfiguration
method elevenLabsApi (line 49) | @Bean
method elevenLabsSpeechModel (line 65) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/main/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsConnectionProperties.java
class ElevenLabsConnectionProperties (line 27) | @ConfigurationProperties(ElevenLabsConnectionProperties.CONFIG_PREFIX)
method getApiKey (line 42) | public String getApiKey() {
method setApiKey (line 46) | public void setApiKey(String apiKey) {
method getBaseUrl (line 50) | public String getBaseUrl() {
method setBaseUrl (line 54) | public void setBaseUrl(String baseUrl) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/main/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsSpeechProperties.java
class ElevenLabsSpeechProperties (line 29) | @ConfigurationProperties(ElevenLabsSpeechProperties.CONFIG_PREFIX)
method getOptions (line 47) | public ElevenLabsTextToSpeechOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfigurationIT.java
class ElevenLabsAutoConfigurationIT (line 39) | @EnabledIfEnvironmentVariable(named = "ELEVEN_LABS_API_KEY", matches = "...
method speech (line 50) | @Test
method speechStream (line 65) | @Test
method verifyMp3FrameHeader (line 80) | public boolean verifyMp3FrameHeader(byte[] audioResponse) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsITUtil.java
class ElevenLabsITUtil (line 28) | public final class ElevenLabsITUtil {
method ElevenLabsITUtil (line 30) | private ElevenLabsITUtil() {
method elevenLabsAutoConfig (line 33) | public static AutoConfigurations elevenLabsAutoConfig(Class<?>... addi...
FILE: auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsPropertiesTests.java
class ElevenLabsPropertiesTests (line 38) | public class ElevenLabsPropertiesTests {
method connectionProperties (line 40) | @Test
method speechOptionsTest (line 75) | @Test
method speechActivation (line 121) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/chat/CachedContentServiceCondition.java
class CachedContentServiceCondition (line 32) | public class CachedContentServiceCondition extends SpringBootCondition {
method getMatchOutcome (line 34) | @Override
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiChatAutoConfiguration.java
class GoogleGenAiChatAutoConfiguration (line 60) | @AutoConfiguration
method googleGenAiClient (line 69) | @Bean
method isVertexAiConfiguration (line 114) | private boolean isVertexAiConfiguration(GoogleGenAiConnectionPropertie...
method configureVertexAi (line 119) | private void configureVertexAi(Client.Builder builder, GoogleGenAiConn...
method googleGenAiChatModel (line 132) | @Bean
method googleGenAiCachedContentService (line 155) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiChatProperties.java
class GoogleGenAiChatProperties (line 31) | @ConfigurationProperties(GoogleGenAiChatProperties.CONFIG_PREFIX)
method getOptions (line 48) | public GoogleGenAiChatOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiConnectionProperties.java
class GoogleGenAiConnectionProperties (line 28) | @ConfigurationProperties(GoogleGenAiConnectionProperties.CONFIG_PREFIX)
method getApiKey (line 59) | public String getApiKey() {
method setApiKey (line 63) | public void setApiKey(String apiKey) {
method getProjectId (line 67) | public String getProjectId() {
method setProjectId (line 71) | public void setProjectId(String projectId) {
method getLocation (line 75) | public String getLocation() {
method setLocation (line 79) | public void setLocation(String location) {
method getCredentialsUri (line 83) | public Resource getCredentialsUri() {
method setCredentialsUri (line 87) | public void setCredentialsUri(Resource credentialsUri) {
method isVertexAi (line 91) | public boolean isVertexAi() {
method setVertexAi (line 95) | public void setVertexAi(boolean vertexAi) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/embedding/GoogleGenAiEmbeddingConnectionAutoConfiguration.java
class GoogleGenAiEmbeddingConnectionAutoConfiguration (line 41) | @AutoConfiguration
method googleGenAiEmbeddingConnectionDetails (line 46) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/embedding/GoogleGenAiEmbeddingConnectionProperties.java
class GoogleGenAiEmbeddingConnectionProperties (line 30) | @ConfigurationProperties(GoogleGenAiEmbeddingConnectionProperties.CONFIG...
method getApiKey (line 61) | public String getApiKey() {
method setApiKey (line 65) | public void setApiKey(String apiKey) {
method getProjectId (line 69) | public String getProjectId() {
method setProjectId (line 73) | public void setProjectId(String projectId) {
method getLocation (line 77) | public String getLocation() {
method setLocation (line 81) | public void setLocation(String location) {
method getCredentialsUri (line 85) | public Resource getCredentialsUri() {
method setCredentialsUri (line 89) | public void setCredentialsUri(Resource credentialsUri) {
method isVertexAi (line 93) | public boolean isVertexAi() {
method setVertexAi (line 97) | public void setVertexAi(boolean vertexAi) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/embedding/GoogleGenAiTextEmbeddingAutoConfiguration.java
class GoogleGenAiTextEmbeddingAutoConfiguration (line 45) | @AutoConfiguration
method googleGenAiTextEmbedding (line 52) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/main/java/org/springframework/ai/model/google/genai/autoconfigure/embedding/GoogleGenAiTextEmbeddingProperties.java
class GoogleGenAiTextEmbeddingProperties (line 32) | @ConfigurationProperties(GoogleGenAiTextEmbeddingProperties.CONFIG_PREFIX)
method getOptions (line 47) | public GoogleGenAiTextEmbeddingOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiCachedContentServiceAutoConfigurationTests.java
class GoogleGenAiCachedContentServiceAutoConfigurationTests (line 43) | public class GoogleGenAiCachedContentServiceAutoConfigurationTests {
method cachedContentServiceBeanIsCreatedWhenChatModelExists (line 49) | @Test
method cachedContentServiceBeanIsNotCreatedWhenDisabled (line 66) | @Test
method cachedContentServiceBeanIsNotCreatedWhenChatModelIsDisabled (line 78) | @Test
method cachedContentServiceCannotBeCreatedWithMockClientWithoutCaches (line 93) | @Test
method cachedContentPropertiesArePassedToChatModel (line 108) | @Test
method extendedUsageMetadataPropertyIsPassedToChatModel (line 129) | @Test
class MockGoogleGenAiConfiguration (line 145) | @Configuration
method googleGenAiClient (line 148) | @Bean
method toolCallingManager (line 156) | @Bean
method googleGenAiChatModel (line 161) | @Bean
class MockGoogleGenAiConfigurationWithoutCachedContent (line 174) | @Configuration
method googleGenAiClient (line 177) | @Bean
method toolCallingManager (line 182) | @Bean
method googleGenAiChatModel (line 187) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiChatAutoConfigurationIT.java
class GoogleGenAiChatAutoConfigurationIT (line 46) | public class GoogleGenAiChatAutoConfigurationIT {
method shouldNotFailOnAmbiguousConfigurationButPrioritizeApiKey (line 54) | @Test
method shouldFailWhenVertexAiEnabledButConfigMissing (line 63) | @Test
method shouldConfigureVertexAiSuccessfully (line 74) | @Test
method shouldConfigureApiKeySuccessfully (line 84) | @Test
method generateWithApiKey (line 91) | @Test
method generateStreamingWithApiKey (line 107) | @Test
method generateWithVertexAi (line 129) | @Test
method generateStreamingWithVertexAi (line 147) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiModelConfigurationTests.java
class GoogleGenAiModelConfigurationTests (line 36) | class GoogleGenAiModelConfigurationTests {
method chatModelActivationWithApiKey (line 40) | @Test
method chatModelActivationWithVertexAi (line 62) | @Test
method chatModelDefaultActivation (line 88) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/GoogleGenAiPropertiesTests.java
class GoogleGenAiPropertiesTests (line 31) | public class GoogleGenAiPropertiesTests {
method connectionPropertiesBinding (line 36) | @Test
method chatPropertiesBinding (line 50) | @Test
method embeddingPropertiesBinding (line 68) | @Test
method cachedContentPropertiesBinding (line 83) | @Test
method extendedUsageMetadataPropertiesBinding (line 101) | @Test
method cachedContentDefaultValuesBinding (line 111) | @Test
method extendedUsageMetadataDefaultBinding (line 124) | @Test
method includeThoughtsPropertiesBinding (line 134) | @Test
method includeThoughtsDefaultBinding (line 143) | @Test
class PropertiesTestConfiguration (line 153) | @Configuration
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/tool/FunctionCallWithFunctionBeanIT.java
class FunctionCallWithFunctionBeanIT (line 48) | public class FunctionCallWithFunctionBeanIT {
method functionCallWithApiKey (line 52) | @Test
method functionCallWithVertexAi (line 82) | @Test
class FunctionConfiguration (line 114) | @Configuration
method currentWeatherFunction (line 117) | @Bean
method CurrentWeatherService (line 123) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/tool/FunctionCallWithFunctionWrapperIT.java
class FunctionCallWithFunctionWrapperIT (line 46) | public class FunctionCallWithFunctionWrapperIT {
method functionCallWithApiKey (line 50) | @Test
method functionCallWithVertexAi (line 86) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/tool/FunctionCallWithPromptFunctionIT.java
class FunctionCallWithPromptFunctionIT (line 44) | public class FunctionCallWithPromptFunctionIT {
method functionCallTestWithApiKey (line 48) | @Test
method functionCallTestWithVertexAi (line 92) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/chat/tool/MockWeatherService.java
class MockWeatherService (line 32) | @JsonClassDescription("Get the weather in location")
method apply (line 35) | @Override
type Unit (line 55) | public enum Unit {
method Unit (line 71) | Unit(String text) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-google-genai/src/test/java/org/springframework/ai/model/google/genai/autoconfigure/embedding/GoogleGenAiTextEmbeddingAutoConfigurationIT.java
class GoogleGenAiTextEmbeddingAutoConfigurationIT (line 39) | public class GoogleGenAiTextEmbeddingAutoConfigurationIT {
method embeddingWithApiKey (line 41) | @Test
method embeddingWithVertexAi (line 60) | @Test
method embeddingModelActivation (line 82) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxChatAutoConfiguration.java
class MiniMaxChatAutoConfiguration (line 51) | @AutoConfiguration
method miniMaxChatModel (line 58) | @Bean
method miniMaxApi (line 81) | private MiniMaxApi miniMaxApi(String baseUrl, String commonBaseUrl, St...
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxChatProperties.java
class MiniMaxChatProperties (line 29) | @ConfigurationProperties(MiniMaxChatProperties.CONFIG_PREFIX)
method getOptions (line 39) | public MiniMaxChatOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxConnectionProperties.java
class MiniMaxConnectionProperties (line 21) | @ConfigurationProperties(MiniMaxConnectionProperties.CONFIG_PREFIX)
method MiniMaxConnectionProperties (line 28) | public MiniMaxConnectionProperties() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxEmbeddingAutoConfiguration.java
class MiniMaxEmbeddingAutoConfiguration (line 47) | @AutoConfiguration
method miniMaxEmbeddingModel (line 54) | @Bean
method miniMaxApi (line 76) | private MiniMaxApi miniMaxApi(String baseUrl, String commonBaseUrl, St...
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxEmbeddingProperties.java
class MiniMaxEmbeddingProperties (line 30) | @ConfigurationProperties(MiniMaxEmbeddingProperties.CONFIG_PREFIX)
method getOptions (line 44) | public MiniMaxEmbeddingOptions getOptions() {
method getMetadataMode (line 48) | public MetadataMode getMetadataMode() {
method setMetadataMode (line 52) | public void setMetadataMode(MetadataMode metadataMode) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxParentProperties.java
class MiniMaxParentProperties (line 22) | class MiniMaxParentProperties {
method getApiKey (line 28) | public String getApiKey() {
method setApiKey (line 32) | public void setApiKey(String apiKey) {
method getBaseUrl (line 36) | public String getBaseUrl() {
method setBaseUrl (line 40) | public void setBaseUrl(String baseUrl) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/FunctionCallbackInPromptIT.java
class FunctionCallbackInPromptIT (line 48) | @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+")
method functionCallTest (line 58) | @Test
method streamingFunctionCallTest (line 82) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/FunctionCallbackWithPlainFunctionBeanIT.java
class FunctionCallbackWithPlainFunctionBeanIT (line 52) | @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+")
method functionCallTest (line 64) | @Test
method functionCallWithPortableFunctionCallingOptions (line 92) | @Test
method streamFunctionCallTest (line 113) | @Test
class Config (line 160) | @Configuration
method weatherFunction (line 163) | @Bean
method weatherFunctionTwo (line 171) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxAutoConfigurationIT.java
class MiniMaxAutoConfigurationIT (line 46) | @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+")
method generate (line 54) | @Test
method generateStreaming (line 67) | @Test
method embedding (line 86) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxFunctionCallbackIT.java
class MiniMaxFunctionCallbackIT (line 50) | @EnabledIfEnvironmentVariable(named = "MINIMAX_API_KEY", matches = ".+")
method functionCallTest (line 61) | @Test
method streamFunctionCallTest (line 80) | @Test
class Config (line 109) | @Configuration
method weatherFunctionInfo (line 112) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxPropertiesTests.java
class MiniMaxPropertiesTests (line 42) | public class MiniMaxPropertiesTests {
method chatProperties (line 44) | @Test
method chatOverrideConnectionProperties (line 72) | @Test
method embeddingProperties (line 102) | @Test
method embeddingOverrideConnectionProperties (line 127) | @Test
method chatOptionsTest (line 154) | @Test
method embeddingOptionsTest (line 240) | @Test
method embeddingActivation (line 265) | @Test
method chatActivation (line 298) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MinimaxModelConfigurationTests.java
class MinimaxModelConfigurationTests (line 37) | public class MinimaxModelConfigurationTests {
method chatModelActivation (line 49) | @Test
method embeddingModelActivation (line 69) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MockWeatherService.java
class MockWeatherService (line 32) | public class MockWeatherService implements Function<MockWeatherService.R...
method apply (line 34) | @Override
type Unit (line 54) | public enum Unit {
method Unit (line 70) | Unit(String text) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiChatAutoConfiguration.java
class MistralAiChatAutoConfiguration (line 54) | @AutoConfiguration
method mistralAiChatModel (line 61) | @Bean
method mistralAiApi (line 91) | private MistralAiApi mistralAiApi(String apiKey, String commonApiKey, ...
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiChatProperties.java
class MistralAiChatProperties (line 33) | @ConfigurationProperties(MistralAiChatProperties.CONFIG_PREFIX)
method MistralAiChatProperties (line 51) | public MistralAiChatProperties() {
method getOptions (line 55) | public MistralAiChatOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiCommonProperties.java
class MistralAiCommonProperties (line 28) | @ConfigurationProperties(MistralAiCommonProperties.CONFIG_PREFIX)
method MistralAiCommonProperties (line 35) | public MistralAiCommonProperties() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiEmbeddingAutoConfiguration.java
class MistralAiEmbeddingAutoConfiguration (line 50) | @AutoConfiguration
method mistralAiEmbeddingModel (line 57) | @Bean
method mistralAiApi (line 83) | private MistralAiApi mistralAiApi(String apiKey, String commonApiKey, ...
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiEmbeddingProperties.java
class MistralAiEmbeddingProperties (line 31) | @ConfigurationProperties(MistralAiEmbeddingProperties.CONFIG_PREFIX)
method MistralAiEmbeddingProperties (line 48) | public MistralAiEmbeddingProperties() {
method getOptions (line 52) | public MistralAiEmbeddingOptions getOptions() {
method getMetadataMode (line 56) | public MetadataMode getMetadataMode() {
method setMetadataMode (line 60) | public void setMetadataMode(MetadataMode metadataMode) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiModerationAutoConfiguration.java
class MistralAiModerationAutoConfiguration (line 44) | @AutoConfiguration
method mistralAiModerationModel (line 51) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiModerationProperties.java
class MistralAiModerationProperties (line 27) | @ConfigurationProperties(MistralAiModerationProperties.CONFIG_PREFIX)
method MistralAiModerationProperties (line 39) | public MistralAiModerationProperties() {
method getOptions (line 43) | public MistralAiModerationOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiOcrAutoConfiguration.java
class MistralAiOcrAutoConfiguration (line 40) | @AutoConfiguration
method mistralOcrApi (line 46) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiOcrProperties.java
class MistralAiOcrProperties (line 30) | @ConfigurationProperties(MistralAiOcrProperties.CONFIG_PREFIX)
method MistralAiOcrProperties (line 40) | public MistralAiOcrProperties() {
method getOptions (line 44) | public MistralAiOcrOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/main/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiParentProperties.java
class MistralAiParentProperties (line 25) | public class MistralAiParentProperties {
method getApiKey (line 31) | public String getApiKey() {
method setApiKey (line 35) | public void setApiKey(String apiKey) {
method getBaseUrl (line 39) | public String getBaseUrl() {
method setBaseUrl (line 43) | public void setBaseUrl(String baseUrl) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/test/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiAutoConfigurationIT.java
class MistralAiAutoConfigurationIT (line 49) | @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+")
method generate (line 57) | @Test
method generateStreaming (line 71) | @Test
method embedding (line 91) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/test/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiOcrAutoConfigurationIT.java
class MistralAiOcrAutoConfigurationIT (line 46) | @EnabledIfEnvironmentVariable(named = MistralAiOcrAutoConfigurationIT.EN...
method ocrExtractionWithPublicUrl (line 56) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/test/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiOcrPropertiesTests.java
class MistralAiOcrPropertiesTests (line 37) | class MistralAiOcrPropertiesTests {
method commonPropertiesAppliedToOcr (line 43) | @Test
method ocrSpecificPropertiesOverrideCommon (line 70) | @Test
method ocrOptionsBinding (line 98) | @Test
method ocrActivationViaModelProperty (line 121) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/test/java/org/springframework/ai/model/mistralai/autoconfigure/MistralAiPropertiesTests.java
class MistralAiPropertiesTests (line 34) | public class MistralAiPropertiesTests {
method embeddingProperties (line 36) | @Test
method chatOptionsTest (line 58) | @Test
method embeddingOverrideConnectionProperties (line 107) | @Test
method embeddingOptionsTest (line 129) | @Test
method moderationOptionsTest (line 150) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/test/java/org/springframework/ai/model/mistralai/autoconfigure/MistralModelConfigurationTests.java
class MistralModelConfigurationTests (line 40) | public class MistralModelConfigurationTests {
method chatModelActivation (line 59) | @Test
method embeddingModelActivation (line 87) | @Test
method moderationModelActivation (line 103) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/test/java/org/springframework/ai/model/mistralai/autoconfigure/tool/PaymentStatusBeanIT.java
class PaymentStatusBeanIT (line 48) | @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+")
method functionCallTest (line 65) | @Test
class Config (line 93) | @Configuration
method retrievePaymentStatus (line 96) | @Bean
method retrievePaymentDate (line 102) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/test/java/org/springframework/ai/model/mistralai/autoconfigure/tool/PaymentStatusBeanOpenAiIT.java
class PaymentStatusBeanOpenAiIT (line 55) | @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+")
method functionCallTest (line 73) | @Test
class Config (line 101) | @Configuration
method retrievePaymentStatus (line 104) | @Bean
method retrievePaymentDate (line 110) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/test/java/org/springframework/ai/model/mistralai/autoconfigure/tool/PaymentStatusPromptIT.java
class PaymentStatusPromptIT (line 45) | @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+")
method functionCallTest (line 62) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-mistral-ai/src/test/java/org/springframework/ai/model/mistralai/autoconfigure/tool/WeatherServicePromptIT.java
class WeatherServicePromptIT (line 57) | @EnabledIfEnvironmentVariable(named = "MISTRAL_AI_API_KEY", matches = ".+")
method promptFunctionCall (line 68) | @Test
method functionCallWithPortableFunctionCallingOptions (line 98) | @Test
class MyWeatherService (line 125) | public static class MyWeatherService implements Function<Request, Resp...
method apply (line 127) | @Override
type Unit (line 142) | public enum Unit { C, F }
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaApiAutoConfiguration.java
class OllamaApiAutoConfiguration (line 40) | @AutoConfiguration
method ollamaConnectionDetails (line 45) | @Bean
method ollamaApi (line 51) | @Bean
class PropertiesOllamaConnectionDetails (line 65) | static class PropertiesOllamaConnectionDetails implements OllamaConnec...
method PropertiesOllamaConnectionDetails (line 69) | PropertiesOllamaConnectionDetails(OllamaConnectionProperties propert...
method getBaseUrl (line 73) | @Override
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaChatAutoConfiguration.java
class OllamaChatAutoConfiguration (line 52) | @AutoConfiguration
method ollamaChatModel (line 59) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaChatProperties.java
class OllamaChatProperties (line 30) | @ConfigurationProperties(OllamaChatProperties.CONFIG_PREFIX)
method getModel (line 43) | public String getModel() {
method setModel (line 47) | public void setModel(String model) {
method getOptions (line 51) | public OllamaChatOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaConnectionDetails.java
type OllamaConnectionDetails (line 26) | public interface OllamaConnectionDetails extends ConnectionDetails {
method getBaseUrl (line 28) | String getBaseUrl();
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaConnectionProperties.java
class OllamaConnectionProperties (line 27) | @ConfigurationProperties(OllamaConnectionProperties.CONFIG_PREFIX)
method getBaseUrl (line 37) | public String getBaseUrl() {
method setBaseUrl (line 41) | public void setBaseUrl(String baseUrl) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaEmbeddingAutoConfiguration.java
class OllamaEmbeddingAutoConfiguration (line 45) | @AutoConfiguration
method ollamaEmbeddingModel (line 52) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaEmbeddingProperties.java
class OllamaEmbeddingProperties (line 30) | @ConfigurationProperties(OllamaEmbeddingProperties.CONFIG_PREFIX)
method getModel (line 45) | public String getModel() {
method setModel (line 49) | public void setModel(String model) {
method getOptions (line 53) | public OllamaEmbeddingOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaInitializationProperties.java
class OllamaInitializationProperties (line 31) | @ConfigurationProperties(OllamaInitializationProperties.CONFIG_PREFIX)
method getPullModelStrategy (line 61) | public PullModelStrategy getPullModelStrategy() {
method setPullModelStrategy (line 65) | public void setPullModelStrategy(PullModelStrategy pullModelStrategy) {
method getChat (line 69) | public ModelTypeInit getChat() {
method getEmbedding (line 73) | public ModelTypeInit getEmbedding() {
method getTimeout (line 77) | public Duration getTimeout() {
method setTimeout (line 81) | public void setTimeout(Duration timeout) {
method getMaxRetries (line 85) | public int getMaxRetries() {
method setMaxRetries (line 89) | public void setMaxRetries(int maxRetries) {
class ModelTypeInit (line 93) | public static class ModelTypeInit {
method isInclude (line 106) | public boolean isInclude() {
method setInclude (line 110) | public void setInclude(boolean include) {
method getAdditionalModels (line 114) | public List<String> getAdditionalModels() {
method setAdditionalModels (line 118) | public void setAdditionalModels(List<String> additionalModels) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/BaseOllamaIT.java
class BaseOllamaIT (line 43) | @Testcontainers
method initializeOllama (line 74) | protected static OllamaApi initializeOllama(final String model) {
method getOllamaApi (line 92) | protected static OllamaApi getOllamaApi() {
method tearDown (line 98) | @AfterAll
method buildOllamaApiWithModel (line 105) | public static OllamaApi buildOllamaApiWithModel(final String model) {
method mergeOptions (line 115) | protected static OllamaChatOptions mergeOptions(OllamaChatModel chatMo...
method getBaseUrl (line 119) | public String getBaseUrl() {
method ensureModelIsPresent (line 123) | private static void ensureModelIsPresent(final OllamaApi ollamaApi, fi...
method ollamaAutoConfig (line 132) | public static AutoConfigurations ollamaAutoConfig(Class<?>... addition...
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaChatAutoConfigurationIT.java
class OllamaChatAutoConfigurationIT (line 46) | public class OllamaChatAutoConfigurationIT extends BaseOllamaIT {
method beforeAll (line 61) | @BeforeAll
method chatCompletion (line 66) | @Test
method chatCompletionStreaming (line 75) | @Test
method chatCompletionWithPull (line 97) | @Test
method chatActivation (line 114) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaChatAutoConfigurationTests.java
class OllamaChatAutoConfigurationTests (line 29) | public class OllamaChatAutoConfigurationTests {
method propertiesTest (line 31) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaEmbeddingAutoConfigurationIT.java
class OllamaEmbeddingAutoConfigurationIT (line 39) | public class OllamaEmbeddingAutoConfigurationIT extends BaseOllamaIT {
method beforeAll (line 48) | @BeforeAll
method singleTextEmbedding (line 53) | @Test
method embeddingWithPull (line 65) | @Test
method embeddingActivation (line 82) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaEmbeddingAutoConfigurationTests.java
class OllamaEmbeddingAutoConfigurationTests (line 30) | public class OllamaEmbeddingAutoConfigurationTests {
method propertiesTest (line 32) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaImage.java
class OllamaImage (line 19) | public final class OllamaImage {
method OllamaImage (line 23) | private OllamaImage() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaModelConfigurationTests.java
class OllamaModelConfigurationTests (line 32) | public class OllamaModelConfigurationTests {
method chatModelActivation (line 36) | @Test
method embeddingModelActivation (line 61) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/tool/FunctionCallbackInPromptIT.java
class FunctionCallbackInPromptIT (line 43) | class FunctionCallbackInPromptIT extends BaseOllamaIT {
method beforeAll (line 64) | @BeforeAll
method functionCallTest (line 69) | @Test
method streamingFunctionCallTest (line 94) | @Test
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/tool/MockWeatherService.java
class MockWeatherService (line 32) | public class MockWeatherService implements Function<MockWeatherService.R...
method apply (line 34) | @Override
type Unit (line 54) | public enum Unit {
method Unit (line 70) | Unit(String text) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/tool/OllamaFunctionCallbackIT.java
class OllamaFunctionCallbackIT (line 48) | class OllamaFunctionCallbackIT extends BaseOllamaIT {
method beforeAll (line 70) | @BeforeAll
method chatClientHelloWorld (line 78) | @Test
method functionCallTest (line 95) | @Test
method streamFunctionCallTest (line 115) | @Test
class Config (line 143) | @Configuration
method weatherFunctionInfo (line 146) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/tool/OllamaFunctionToolBeanIT.java
class OllamaFunctionToolBeanIT (line 53) | class OllamaFunctionToolBeanIT extends BaseOllamaIT {
method beforeAll (line 75) | @BeforeAll
method toolCallTest (line 80) | @Test
method functionCallTest (line 104) | @Test
method streamFunctionCallTest (line 124) | @Test
class MyTools (line 152) | static class MyTools {
method weatherByLocation (line 154) | @SuppressWarnings("unused")
class Config (line 169) | @Configuration
method weatherInfo (line 172) | @Bean
method myTools (line 178) | @Bean
FILE: auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiAudioSpeechAutoConfiguration.java
class OpenAiAudioSpeechAutoConfiguration (line 42) | @AutoConfiguration
method openAiSdkAudioSpeechModel (line 48) | @Bean
method openAiClient (line 64) | private OpenAIClient openAiClient(AbstractOpenAiOptions resolved) {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiAudioSpeechProperties.java
class OpenAiAudioSpeechProperties (line 32) | @ConfigurationProperties(OpenAiAudioSpeechProperties.CONFIG_PREFIX)
method getOptions (line 47) | public OpenAiAudioSpeechOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiAudioTranscriptionAutoConfiguration.java
class OpenAiAudioTranscriptionAutoConfiguration (line 42) | @AutoConfiguration
method openAiSdkAudioTranscriptionModel (line 48) | @Bean
method openAiClient (line 60) | private OpenAIClient openAiClient(OpenAiConnectionProperties connectio...
FILE: auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiAudioTranscriptionProperties.java
class OpenAiAudioTranscriptionProperties (line 32) | @ConfigurationProperties(OpenAiAudioTranscriptionProperties.CONFIG_PREFIX)
method getOptions (line 46) | public OpenAiAudioTranscriptionOptions getOptions() {
FILE: auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiAutoConfigurationUtil.java
class OpenAiAu
Copy disabled (too large)
Download .json
Condensed preview — 2792 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (19,387K chars).
[
{
"path": ".editorconfig",
"chars": 262,
"preview": "root = true\n\n[*.{adoc,bat,groovy,html,java,js,jsp,kt,kts,md,properties,py,rb,sh,sql,svg,txt,xml,xsd}]\ncharset = utf-8\n\n["
},
{
"path": ".gitattributes",
"chars": 43,
"preview": "*.onnx filter=lfs diff=lfs merge=lfs -text\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 1017,
"preview": "---\nname: Bug report\nabout: Create a bug report to help us improve the project\ntitle: ''\nlabels: 'type: bug, status: wai"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 230,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Questions and Community Support\n url: https://stackoverflow.com/"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 851,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: 'status: waiting-for-triage, type: f"
},
{
"path": ".github/ISSUE_TEMPLATE/miscellaneous.md",
"chars": 793,
"preview": "---\nname: Miscellaneous\nabout: Suggest an improvement for this project\ntitle: ''\nlabels: 'status: waiting-for-triage'\nas"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 694,
"preview": "Thank you for taking time to contribute this pull request!\nYou might have already read the [contributor guide][1], but a"
},
{
"path": ".github/dco.yml",
"chars": 25,
"preview": "require:\n members: false"
},
{
"path": ".github/release-files-spec.json",
"chars": 543,
"preview": "{\n \"files\": [\n {\n \"aql\": {\n \"items.find\": {\n \"$and\": [\n {\n \"@build.name"
},
{
"path": ".github/workflows/artifactory-milestone-release.yml",
"chars": 1346,
"preview": "name: Artifactory Milestone Release\n\non:\n workflow_dispatch:\n inputs:\n releaseVersion:\n description: \"Mi"
},
{
"path": ".github/workflows/auto-cherry-pick.yml",
"chars": 273,
"preview": "name: Auto Cherry-Pick\n\non:\n push:\n branches:\n - main\n - '*.x'\n\njobs:\n cherry-pick-commit:\n uses: spri"
},
{
"path": ".github/workflows/backport-issue.yml",
"chars": 355,
"preview": "name: Backport Issue\n\non:\n push:\n branches:\n - '*.x'\n\njobs:\n backport-issue:\n if: contains(github.event.hea"
},
{
"path": ".github/workflows/continuous-integration.yml",
"chars": 10456,
"preview": "name: Build + Deploy on development branches\n\non:\n push:\n branches:\n - 'main'\n - '[0-9].[0-9].x'\n schedul"
},
{
"path": ".github/workflows/dependency-ci-dashboard.yml",
"chars": 16736,
"preview": "name: Ecosystem CI Dashboard\n\non:\n schedule:\n - cron: '15 6 * * *' # 06:15 UTC daily\n workflow_dispatch:\n\npermissi"
},
{
"path": ".github/workflows/deploy-docs.yml",
"chars": 455,
"preview": "name: Deploy Docs\nrun-name: ${{ github.event_name == 'workflow_dispatch' && 'Deploy Docs (Build)' || 'Deploy Docs (Dispa"
},
{
"path": ".github/workflows/documentation-upload.yml",
"chars": 1732,
"preview": "name: Documentation Upload\non:\n workflow_dispatch:\n\njobs:\n handle-documentation:\n name: Generate and upload javadoc"
},
{
"path": ".github/workflows/maven-central-release.yml",
"chars": 963,
"preview": "name: Release to Maven Central\n\non:\n workflow_dispatch:\n\njobs:\n build:\n name: Release project\n runs-on: ubuntu-l"
},
{
"path": ".github/workflows/mcp-integration-tests.yml",
"chars": 1443,
"preview": "name: MCP Integration Tests\n\non:\n push:\n branches: [ \"main\" ]\n pull_request:\n branches: [ \"main\" ]\n workflow_di"
},
{
"path": ".github/workflows/pr-check.yml",
"chars": 1199,
"preview": "name: PR Check\n\non:\n pull_request:\n\njobs:\n build:\n name: Build branch\n runs-on: ubuntu-latest\n if: ${{ github"
},
{
"path": ".gitignore",
"chars": 530,
"preview": ".checkstyle\ntarget\n.classpath\n.project\n.settings\n.env\nbin\nbuild.log\nintegration-repo\nivy-cache\nspring-build\nderby-home\nd"
},
{
"path": ".mvn/extensions.xml",
"chars": 1014,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n ~ Copyright 2023-present the original author or authors.\n ~\n ~ Licensed "
},
{
"path": ".mvn/jvm.config",
"chars": 644,
"preview": "--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED\n--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-U"
},
{
"path": ".mvn/maven-build-cache-config.xml",
"chars": 2156,
"preview": "<cache xmlns=\"http://maven.apache.org/BUILD-CACHE-CONFIG/1.2.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xs"
},
{
"path": ".mvn/wrapper/maven-wrapper.properties",
"chars": 845,
"preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
},
{
"path": ".sdkmanrc",
"chars": 112,
"preview": "# Enable auto-env through the sdkman_auto_env config\n# Add key=value pairs of SDKs to use below\njava=21.0.9-tem\n"
},
{
"path": "CONTRIBUTING.adoc",
"chars": 13583,
"preview": "= Spring AI Contributor Guidelines\n\nDo you have something you'd like to contribute to **Spring AI**?\nWe welcome pull req"
},
{
"path": "LICENSE.txt",
"chars": 11360,
"preview": "\n Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 10249,
"preview": "# Spring AI [
About this extraction
This page contains the full source code of the spring-projects-experimental/spring-ai GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2792 files (16.9 MB), approximately 4.7M tokens, and a symbol index with 21662 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.