main 7cfad4559be4 cached
2792 files
16.9 MB
4.7M tokens
21662 symbols
1 requests
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 [![build status](https://github.com/spring-projects/spring-ai/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/spring-projects/spring-ai/actions/workflows/continuous-integration.yml) [![build status](https://github.com/spring-projects/spring-ai-integration-tests/actions/workflows/spring-ai-integration-tests.yml/badge.svg)](https://github.com/spring-projects/spring-ai-integration-tests/actions/workflows/spring-ai-integration-tests.yml) [![Maven Central](https://img.shields.io/maven-central/v/org.springframework.ai/spring-ai-model?label=Maven%20Central&versionPrefix=2.0)](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.

![spring-ai-integration-diagram-3](https://docs.spring.io/spring-ai/reference/_images/spring-ai-integration-diagram-3.svg)

> 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
Download .txt
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
│   │     
Download .txt
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 [![build status](https://github.com/spring-projects/spring-ai/actions/workflows/continuous-integration.yml/b"
  },
  {
    "path": "advisors/spring-ai-advisors-vector-store/pom.xml",
    "chars": 2332,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2023-present the original author or authors.\n  ~\n  ~ Licensed "
  },
  {
    "path": "advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java",
    "chars": 7535,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisor.java",
    "chars": 10235,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/package-info.java",
    "chars": 798,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "advisors/spring-ai-advisors-vector-store/src/test/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisorTests.java",
    "chars": 16224,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "advisors/spring-ai-advisors-vector-store/src/test/java/org/springframework/ai/chat/client/advisor/vectorstore/VectorStoreChatMemoryAdvisorTests.java",
    "chars": 11985,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/common/spring-ai-autoconfigure-retry/pom.xml",
    "chars": 2375,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "auto-configurations/common/spring-ai-autoconfigure-retry/src/main/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryAutoConfiguration.java",
    "chars": 5064,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/common/spring-ai-autoconfigure-retry/src/main/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryProperties.java",
    "chars": 3518,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/common/spring-ai-autoconfigure-retry/src/main/java/org/springframework/ai/retry/autoconfigure/package-info.java",
    "chars": 735,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/common/spring-ai-autoconfigure-retry/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 683,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "auto-configurations/common/spring-ai-autoconfigure-retry/src/test/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryAutoConfigurationIT.java",
    "chars": 1629,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/common/spring-ai-autoconfigure-retry/src/test/java/org/springframework/ai/retry/autoconfigure/SpringAiRetryPropertiesTests.java",
    "chars": 3073,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/pom.xml",
    "chars": 2422,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpAsyncToolsChangeEventEmmiter.java",
    "chars": 1813,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpClientAutoConfiguration.java",
    "chars": 13510,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpSseClientConnectionDetails.java",
    "chars": 1121,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpSyncToolsChangeEventEmmiter.java",
    "chars": 1744,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/McpToolCallbackAutoConfiguration.java",
    "chars": 5515,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/NamedClientMcpTransport.java",
    "chars": 1149,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/PropertiesMcpSseClientConnectionDetails.java",
    "chars": 1218,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/StdioTransportAutoConfiguration.java",
    "chars": 3329,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientAnnotationScannerAutoConfiguration.java",
    "chars": 4594,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientAnnotationScannerProperties.java",
    "chars": 1209,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/package-info.java",
    "chars": 759,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/aot/McpClientAutoConfigurationRuntimeHints.java",
    "chars": 1507,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/aot/package-info.java",
    "chars": 751,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/configurer/McpAsyncClientConfigurer.java",
    "chars": 1561,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/configurer/McpSyncClientConfigurer.java",
    "chars": 2611,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/configurer/package-info.java",
    "chars": 758,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/package-info.java",
    "chars": 747,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpClientCommonProperties.java",
    "chars": 4473,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpSseClientProperties.java",
    "chars": 2892,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpStdioClientProperties.java",
    "chars": 4592,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpStreamableHttpClientProperties.java",
    "chars": 2474,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/package-info.java",
    "chars": 758,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/resources/META-INF/spring/aot.factories",
    "chars": 152,
    "preview": "org.springframework.aot.hint.RuntimeHintsRegistrar=\\\n\torg.springframework.ai.mcp.client.common.autoconfigure.aot.McpClie"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 978,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/McpClientAutoConfigurationIT.java",
    "chars": 12815,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/McpClientAutoConfigurationRuntimeHintsTests.java",
    "chars": 7911,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/McpToolCallbackAutoConfigurationConditionTests.java",
    "chars": 6917,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/McpToolCallbackAutoConfigurationTests.java",
    "chars": 12500,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/annotations/McpClientListChangedAnnotationsScanningIT.java",
    "chars": 7810,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpClientCommonPropertiesTests.java",
    "chars": 12686,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/java/org/springframework/ai/mcp/client/common/autoconfigure/properties/McpSseClientPropertiesTests.java",
    "chars": 13845,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/resources/application-test.properties",
    "chars": 481,
    "preview": "# Test MCP STDIO client configuration\nspring.ai.mcp.client.stdio.enabled=true\nspring.ai.mcp.client.stdio.version=test-ve"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/resources/nested/nested-config.json",
    "chars": 189,
    "preview": "{\n  \"name\": \"nested-config\",\n  \"description\": \"Test JSON file in nested subfolder of test resources\",\n  \"version\": \"1.0."
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-common/src/test/resources/test-config.json",
    "chars": 165,
    "preview": "{\n  \"name\": \"test-config\",\n  \"description\": \"Test JSON file in root test resources folder\",\n  \"version\": \"1.0.0\",\n  \"pro"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/pom.xml",
    "chars": 2621,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/SseHttpClientTransportAutoConfiguration.java",
    "chars": 6075,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/StreamableHttpHttpClientTransportAutoConfiguration.java",
    "chars": 5223,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/aot/McpClientAutoConfigurationRuntimeHints.java",
    "chars": 1515,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/aot/package-info.java",
    "chars": 755,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/java/org/springframework/ai/mcp/client/httpclient/autoconfigure/package-info.java",
    "chars": 751,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/resources/META-INF/spring/aot.factories",
    "chars": 156,
    "preview": "org.springframework.aot.hint.RuntimeHintsRegistrar=\\\n\torg.springframework.ai.mcp.client.httpclient.autoconfigure.aot.Mcp"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 818,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/SseHttpClientTransportAutoConfigurationIT.java",
    "chars": 5147,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/SseHttpClientTransportAutoConfigurationTests.java",
    "chars": 8155,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationIT.java",
    "chars": 5269,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/java/org/springframework/ai/mcp/client/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationTests.java",
    "chars": 7560,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/resources/application-test.properties",
    "chars": 481,
    "preview": "# Test MCP STDIO client configuration\nspring.ai.mcp.client.stdio.enabled=true\nspring.ai.mcp.client.stdio.version=test-ve"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/resources/nested/nested-config.json",
    "chars": 189,
    "preview": "{\n  \"name\": \"nested-config\",\n  \"description\": \"Test JSON file in nested subfolder of test resources\",\n  \"version\": \"1.0."
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-httpclient/src/test/resources/test-config.json",
    "chars": 165,
    "preview": "{\n  \"name\": \"test-config\",\n  \"description\": \"Test JSON file in root test resources folder\",\n  \"version\": \"1.0.0\",\n  \"pro"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/pom.xml",
    "chars": 3305,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/java/org/springframework/ai/mcp/client/webflux/autoconfigure/SseWebFluxTransportAutoConfiguration.java",
    "chars": 5909,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/java/org/springframework/ai/mcp/client/webflux/autoconfigure/StreamableHttpWebFluxTransportAutoConfiguration.java",
    "chars": 5647,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/java/org/springframework/ai/mcp/client/webflux/autoconfigure/aot/McpClientAutoConfigurationRuntimeHints.java",
    "chars": 1481,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/java/org/springframework/ai/mcp/client/webflux/autoconfigure/aot/package-info.java",
    "chars": 752,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/java/org/springframework/ai/mcp/client/webflux/autoconfigure/package-info.java",
    "chars": 748,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/resources/META-INF/spring/aot.factories",
    "chars": 153,
    "preview": "org.springframework.aot.hint.RuntimeHintsRegistrar=\\\n\torg.springframework.ai.mcp.client.webflux.autoconfigure.aot.McpCli"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 807,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/McpToolsConfigurationTests.java",
    "chars": 8463,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/SseWebFluxTransportAutoConfigurationIT.java",
    "chars": 3445,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/SseWebFluxTransportAutoConfigurationTests.java",
    "chars": 9358,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/StreamableHttpHttpClientTransportAutoConfigurationIT.java",
    "chars": 3514,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/java/org/springframework/ai/mcp/client/webflux/autoconfigure/StreamableHttpWebFluxTransportAutoConfigurationTests.java",
    "chars": 9982,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/resources/application-test.properties",
    "chars": 481,
    "preview": "# Test MCP STDIO client configuration\nspring.ai.mcp.client.stdio.enabled=true\nspring.ai.mcp.client.stdio.version=test-ve"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/resources/nested/nested-config.json",
    "chars": 189,
    "preview": "{\n  \"name\": \"nested-config\",\n  \"description\": \"Test JSON file in nested subfolder of test resources\",\n  \"version\": \"1.0."
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-client-webflux/src/test/resources/test-config.json",
    "chars": 165,
    "preview": "{\n  \"name\": \"test-config\",\n  \"description\": \"Test JSON file in root test resources folder\",\n  \"version\": \"1.0.0\",\n  \"pro"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/pom.xml",
    "chars": 2751,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerAutoConfiguration.java",
    "chars": 17187,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerJsonMapperAutoConfiguration.java",
    "chars": 3137,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerStatelessAutoConfiguration.java",
    "chars": 11206,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerStdioDisabledCondition.java",
    "chars": 1632,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/StatelessToolCallbackConverterAutoConfiguration.java",
    "chars": 5535,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/ToolCallbackConverterAutoConfiguration.java",
    "chars": 5777,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/ToolCallbackUtils.java",
    "chars": 3364,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/annotations/McpServerAnnotationScannerAutoConfiguration.java",
    "chars": 4352,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/annotations/McpServerAnnotationScannerProperties.java",
    "chars": 1209,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/annotations/McpServerSpecificationFactoryAutoConfiguration.java",
    "chars": 5933,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/annotations/StatelessServerSpecificationFactoryAutoConfiguration.java",
    "chars": 6263,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/annotations/package-info.java",
    "chars": 759,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/package-info.java",
    "chars": 747,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/properties/McpServerChangeNotificationProperties.java",
    "chars": 2631,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/properties/McpServerProperties.java",
    "chars": 6669,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/properties/McpServerSseProperties.java",
    "chars": 2447,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/properties/McpServerStreamableHttpProperties.java",
    "chars": 2005,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/java/org/springframework/ai/mcp/server/common/autoconfigure/properties/package-info.java",
    "chars": 758,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 1416,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerAutoConfigurationIT.java",
    "chars": 27472,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpServerJsonMapperAutoConfigurationIT.java",
    "chars": 2379,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpStatelessServerAutoConfigurationIT.java",
    "chars": 25310,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/McpToolWithStdioIT.java",
    "chars": 7900,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/StatelessToolCallbackConverterAutoConfigurationIT.java",
    "chars": 15679,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-common/src/test/java/org/springframework/ai/mcp/server/common/autoconfigure/ToolCallbackConverterAutoConfigurationIT.java",
    "chars": 15263,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/pom.xml",
    "chars": 4228,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/main/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerSseWebFluxAutoConfiguration.java",
    "chars": 4211,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/main/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerStatelessWebFluxAutoConfiguration.java",
    "chars": 3005,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/main/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerStreamableHttpWebFluxAutoConfiguration.java",
    "chars": 3391,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/main/java/org/springframework/ai/mcp/server/webflux/autoconfigure/package-info.java",
    "chars": 748,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 905,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerSseWebFluxAutoConfigurationIT.java",
    "chars": 5275,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerSseWebFluxAutoConfigurationTests.java",
    "chars": 3231,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerStatelessWebFluxAutoConfigurationIT.java",
    "chars": 7901,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpServerStreamableHttpWebFluxAutoConfigurationIT.java",
    "chars": 7847,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpToolCallProviderCachingIT.java",
    "chars": 8308,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/McpToolCallbackParameterlessToolIT.java",
    "chars": 9654,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/SseWebClientWebFluxServerIT.java",
    "chars": 22449,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StatelessWebClientWebFluxServerIT.java",
    "chars": 17145,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableMcpAnnotations2IT.java",
    "chars": 21724,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableMcpAnnotationsIT.java",
    "chars": 22179,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableMcpAnnotationsManualIT.java",
    "chars": 23591,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableMcpAnnotationsWithLLMIT.java",
    "chars": 14189,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/StreamableWebClientWebFluxServerIT.java",
    "chars": 22666,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/capabilities/McpHandlerConfiguration.java",
    "chars": 2262,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webflux/src/test/java/org/springframework/ai/mcp/server/webflux/autoconfigure/capabilities/McpHandlerService.java",
    "chars": 1922,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/pom.xml",
    "chars": 2764,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/main/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerSseWebMvcAutoConfiguration.java",
    "chars": 4332,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/main/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerStatelessWebMvcAutoConfiguration.java",
    "chars": 3062,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/main/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerStreamableHttpWebMvcAutoConfiguration.java",
    "chars": 3444,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/main/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/package-info.java",
    "chars": 747,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 899,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/test/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerSseWebMvcAutoConfigurationIT.java",
    "chars": 6200,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/test/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerStatelessWebMvcAutoConfigurationIT.java",
    "chars": 7514,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/mcp/spring-ai-autoconfigure-mcp-server-webmvc/src/test/java/org/springframework/ai/mcp/server/webmvc/autoconfigure/McpServerStreamableHttpWebMvcAutoConfigurationIT.java",
    "chars": 7823,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/pom.xml",
    "chars": 2390,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/main/java/org/springframework/ai/model/chat/client/autoconfigure/ChatClientAutoConfiguration.java",
    "chars": 6880,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/main/java/org/springframework/ai/model/chat/client/autoconfigure/ChatClientBuilderConfigurer.java",
    "chars": 1852,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/main/java/org/springframework/ai/model/chat/client/autoconfigure/ChatClientBuilderProperties.java",
    "chars": 2335,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/main/java/org/springframework/ai/model/chat/client/autoconfigure/package-info.java",
    "chars": 747,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/main/resources/META-INF/additional-spring-configuration-metadata.json",
    "chars": 2158,
    "preview": "{\n  \"properties\": [\n    {\n      \"name\": \"spring.ai.model.chat\",\n      \"type\": \"java.lang.String\",\n      \"description\": \""
  },
  {
    "path": "auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 692,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "auto-configurations/models/chat/client/spring-ai-autoconfigure-model-chat-client/src/test/java/org/springframework/ai/model/chat/client/autoconfigure/ChatClientObservationAutoConfigurationTests.java",
    "chars": 13180,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cassandra/pom.xml",
    "chars": 3396,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "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",
    "chars": 2611,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 2625,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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/package-info.java",
    "chars": 768,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cassandra/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 732,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "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",
    "chars": 5262,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 2177,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cosmos-db/pom.xml",
    "chars": 3783,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright 2023-present the original author or authors.\n  ~\n  ~ Licensed "
  },
  {
    "path": "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",
    "chars": 4038,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 2615,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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/package-info.java",
    "chars": 767,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-cosmos-db/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 121,
    "preview": "org.springframework.ai.model.chat.memory.repository.cosmosdb.autoconfigure.CosmosDBChatMemoryRepositoryAutoConfiguration"
  },
  {
    "path": "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",
    "chars": 5123,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 2882,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/pom.xml",
    "chars": 3329,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "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",
    "chars": 3025,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 1458,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 1282,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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/package-info.java",
    "chars": 763,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "chars": 722,
    "preview": "#\n# Copyright 2023-present the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "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",
    "chars": 8221,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 5818,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 1385,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 2763,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 5474,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-jdbc/src/test/resources/schema.sql",
    "chars": 565,
    "preview": "-- Test-specific schema initialization for HSQLDB\nCREATE TABLE IF NOT EXISTS SPRING_AI_CHAT_MEMORY (\n    conversation_id"
  },
  {
    "path": "auto-configurations/models/chat/memory/repository/spring-ai-autoconfigure-model-chat-memory-repository-mongodb/pom.xml",
    "chars": 3511,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://m"
  },
  {
    "path": "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",
    "chars": 1796,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "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",
    "chars": 5548,
    "preview": "/*\n * Copyright 2023-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  }
]

// ... and 2592 more files (download for full content)

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.

Copied to clipboard!