diff --git a/spring-ai-spring-boot-autoconfigure/pom.xml b/spring-ai-spring-boot-autoconfigure/pom.xml index 315e38d9d..af181ea9d 100644 --- a/spring-ai-spring-boot-autoconfigure/pom.xml +++ b/spring-ai-spring-boot-autoconfigure/pom.xml @@ -47,6 +47,12 @@ true + + com.squareup.retrofit2 + converter-jackson + 2.9.0 + + org.springframework.boot diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfiguration.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfiguration.java index 9acfa19db..1c3cf4850 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfiguration.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfiguration.java @@ -16,8 +16,15 @@ package org.springframework.ai.autoconfigure.openai; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.theokanning.openai.OpenAiApi; import com.theokanning.openai.service.OpenAiService; +import okhttp3.OkHttpClient; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.jackson.JacksonConverterFactory; + import org.springframework.ai.autoconfigure.NativeHints; import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.openai.embedding.OpenAiEmbeddingClient; @@ -45,11 +52,27 @@ public class OpenAiAutoConfiguration { @Bean public OpenAiService theoOpenAiService(OpenAiProperties openAiProperties) { - if (!StringUtils.hasText(openAiProperties.getApiKey())) { - throw new IllegalArgumentException( - "You must provide an API key with the property name " + CONFIG_PREFIX + ".api-key"); + if (openAiProperties.getBaseUrl().equals("https://api.openai.com")) { + if (!StringUtils.hasText(openAiProperties.getApiKey())) { + throw new IllegalArgumentException( + "You must provide an API key with the property name " + CONFIG_PREFIX + ".api-key"); + } } - return new OpenAiService(openAiProperties.getApiKey(), openAiProperties.getDuration()); + + ObjectMapper mapper = OpenAiService.defaultObjectMapper(); + OkHttpClient client = OpenAiService.defaultClient(openAiProperties.getApiKey(), openAiProperties.getDuration()); + + // Waiting for https://github.com/TheoKanning/openai-java/issues/249 to be + // resolved. + Retrofit retrofit = new Retrofit.Builder().baseUrl(openAiProperties.getBaseUrl()) + .client(client) + .addConverterFactory(JacksonConverterFactory.create(mapper)) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .build(); + + OpenAiApi api = retrofit.create(OpenAiApi.class); + + return new OpenAiService(api); } @Bean diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiProperties.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiProperties.java index d4dd19d5d..b0eec9a1c 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiProperties.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiProperties.java @@ -35,6 +35,8 @@ public class OpenAiProperties { private String model = "gpt-3.5-turbo"; + private String baseUrl = "https://api.openai.com"; + public String getApiKey() { return apiKey; } @@ -67,4 +69,12 @@ public class OpenAiProperties { this.duration = duration; } + public String getBaseUrl() { + return baseUrl; + } + + public void setBaseUrl(String baseUrl) { + this.baseUrl = baseUrl; + } + }