1616
1717package org .springframework .ai .model .ollama .autoconfigure ;
1818
19+ import org .jspecify .annotations .NonNull ;
20+
21+ import org .springframework .ai .model .SpringAIModelProperties ;
22+ import org .springframework .ai .model .SpringAIModels ;
1923import org .springframework .ai .ollama .api .OllamaApi ;
2024import org .springframework .ai .retry .autoconfigure .SpringAiRetryAutoConfiguration ;
2125import org .springframework .beans .factory .ObjectProvider ;
2226import org .springframework .boot .autoconfigure .AutoConfiguration ;
2327import org .springframework .boot .autoconfigure .condition .ConditionalOnClass ;
2428import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
29+ import org .springframework .boot .autoconfigure .condition .ConditionMessage ;
30+ import org .springframework .boot .autoconfigure .condition .ConditionOutcome ;
31+ import org .springframework .boot .autoconfigure .condition .SpringBootCondition ;
2532import org .springframework .boot .context .properties .EnableConfigurationProperties ;
2633import org .springframework .boot .restclient .autoconfigure .RestClientAutoConfiguration ;
2734import org .springframework .boot .webclient .autoconfigure .WebClientAutoConfiguration ;
2835import org .springframework .context .annotation .Bean ;
36+ import org .springframework .context .annotation .ConditionContext ;
37+ import org .springframework .context .annotation .Conditional ;
38+ import org .springframework .core .type .AnnotatedTypeMetadata ;
2939import org .springframework .web .client .ResponseErrorHandler ;
3040import org .springframework .web .client .RestClient ;
3141import org .springframework .web .reactive .function .client .WebClient ;
3747 * @author Eddú Meléndez
3848 * @author Thomas Vitale
3949 * @author Ilayaperumal Gopinathan
50+ * @author Nicolas Krier
4051 * @since 0.8.0
4152 */
4253@ AutoConfiguration (after = { RestClientAutoConfiguration .class , WebClientAutoConfiguration .class ,
4354 SpringAiRetryAutoConfiguration .class })
4455@ ConditionalOnClass (OllamaApi .class )
56+ @ Conditional (OllamaApiAutoConfiguration .OllamaChatOrEmbeddingCondition .class )
4557@ EnableConfigurationProperties (OllamaConnectionProperties .class )
4658public class OllamaApiAutoConfiguration {
4759
@@ -53,7 +65,7 @@ PropertiesOllamaConnectionDetails ollamaConnectionDetails(OllamaConnectionProper
5365
5466 @ Bean
5567 @ ConditionalOnMissingBean
56- public OllamaApi ollamaApi (OllamaConnectionDetails connectionDetails ,
68+ OllamaApi ollamaApi (OllamaConnectionDetails connectionDetails ,
5769 ObjectProvider <RestClient .Builder > restClientBuilderProvider ,
5870 ObjectProvider <WebClient .Builder > webClientBuilderProvider , ResponseErrorHandler responseErrorHandler ) {
5971 return OllamaApi .builder ()
@@ -79,4 +91,30 @@ public String getBaseUrl() {
7991
8092 }
8193
94+ static class OllamaChatOrEmbeddingCondition extends SpringBootCondition {
95+
96+ @ Override
97+ public @ NonNull ConditionOutcome getMatchOutcome (@ NonNull ConditionContext context ,
98+ @ NonNull AnnotatedTypeMetadata metadata ) {
99+ var messageBuilder = ConditionMessage .forCondition ("OllamaChatOrEmbeddingCondition" );
100+ var environment = context .getEnvironment ();
101+ var chatModel = environment .getProperty (SpringAIModelProperties .CHAT_MODEL , SpringAIModels .OLLAMA );
102+
103+ if (SpringAIModels .OLLAMA .equals (chatModel )) {
104+ return ConditionOutcome .match (messageBuilder .because ("Chat model corresponds to Ollama." ));
105+ }
106+
107+ var embeddingModel = environment .getProperty (SpringAIModelProperties .EMBEDDING_MODEL ,
108+ SpringAIModels .OLLAMA );
109+
110+ if (SpringAIModels .OLLAMA .equals (embeddingModel )) {
111+ return ConditionOutcome .match (messageBuilder .because ("Embedding model corresponds to Ollama." ));
112+ }
113+
114+ return ConditionOutcome
115+ .noMatch (messageBuilder .because ("Neither chat model nor embedding model correspond to Ollama." ));
116+ }
117+
118+ }
119+
82120}
0 commit comments