Skip to content

Commit 377b24e

Browse files
committed
Update OpenAI-compatible chat configuration.
1 parent 7c59abd commit 377b24e

File tree

3 files changed

+52
-25
lines changed

3 files changed

+52
-25
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ repositories {
2424
}
2525

2626
ext {
27-
set('springAiVersion', "1.0.0-M6")
27+
set('springAiVersion', "1.0.0-SNAPSHOT")
2828
}
2929

3030
dependencies {

src/main/java/me/pacphi/config/Chat.java

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,61 @@
11
package me.pacphi.config;
22

3+
import io.micrometer.common.util.StringUtils;
4+
import io.micrometer.observation.ObservationRegistry;
35
import org.springframework.ai.autoconfigure.openai.OpenAiChatProperties;
46
import org.springframework.ai.autoconfigure.openai.OpenAiConnectionProperties;
5-
import org.springframework.ai.model.function.FunctionCallbackResolver;
7+
import org.springframework.ai.model.SimpleApiKey;
8+
import org.springframework.ai.model.tool.DefaultToolCallingManager;
69
import org.springframework.ai.openai.OpenAiChatModel;
710
import org.springframework.ai.openai.api.OpenAiApi;
11+
import org.springframework.ai.retry.RetryUtils;
812
import org.springframework.context.annotation.Bean;
913
import org.springframework.context.annotation.Configuration;
10-
import org.springframework.context.annotation.Profile;
1114
import org.springframework.http.HttpHeaders;
1215
import org.springframework.retry.support.RetryTemplate;
13-
import org.springframework.web.client.ResponseErrorHandler;
1416
import org.springframework.web.client.RestClient;
1517
import org.springframework.web.reactive.function.client.WebClient;
1618

1719
@Configuration
18-
// @see https://github.com/spring-projects/spring-ai/issues/372#issuecomment-2242650500
1920
public class Chat {
2021

2122
@Bean
2223
public OpenAiChatModel chatModel(
2324
OpenAiConnectionProperties connectionProperties,
2425
OpenAiChatProperties chatProperties,
2526
WebClient.Builder webClientBuilder,
26-
RetryTemplate retryTemplate,
27-
FunctionCallbackResolver functionCallbackResolver,
28-
ResponseErrorHandler responseErrorHandler,
29-
RestClient.Builder restClientBuilder
27+
RetryTemplate retryTemplate
3028
) {
31-
restClientBuilder.defaultHeaders(headers -> headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate"));
29+
HttpHeaders headers = new HttpHeaders();
30+
headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate");
31+
32+
RestClient.Builder restClientBuilder = RestClient.builder()
33+
.defaultHeaders(h -> h.addAll(headers));
34+
35+
String apiKey = connectionProperties.getApiKey();
36+
if (connectionProperties.getApiKey().equalsIgnoreCase("redundant") && StringUtils.isNotBlank(chatProperties.getApiKey())) {
37+
apiKey = chatProperties.getApiKey();
38+
}
3239

3340
OpenAiApi openAiApi = new OpenAiApi(
3441
chatProperties.getBaseUrl() != null ? chatProperties.getBaseUrl() : connectionProperties.getBaseUrl(),
35-
chatProperties.getApiKey() != null ? chatProperties.getApiKey() : connectionProperties.getApiKey(),
42+
new SimpleApiKey(apiKey),
43+
headers,
44+
"/v1/chat/completions",
45+
"/v1/embeddings",
3646
restClientBuilder,
3747
webClientBuilder,
38-
responseErrorHandler
48+
RetryUtils.DEFAULT_RESPONSE_ERROR_HANDLER
3949
);
4050

51+
ObservationRegistry observationRegistry = ObservationRegistry.NOOP;
52+
4153
return new OpenAiChatModel(
4254
openAiApi,
4355
chatProperties.getOptions(),
44-
functionCallbackResolver,
45-
retryTemplate
56+
DefaultToolCallingManager.builder().observationRegistry(observationRegistry).build(),
57+
retryTemplate,
58+
observationRegistry
4659
);
4760
}
4861

src/main/java/me/pacphi/config/MultiChat.java

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
package me.pacphi.config;
22

3+
import io.micrometer.observation.ObservationRegistry;
4+
import org.apache.commons.lang3.StringUtils;
35
import org.springframework.ai.autoconfigure.openai.OpenAiChatProperties;
46
import org.springframework.ai.autoconfigure.openai.OpenAiConnectionProperties;
57
import org.springframework.ai.chat.client.ChatClient;
68
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
7-
import org.springframework.ai.model.function.FunctionCallbackResolver;
9+
import org.springframework.ai.model.SimpleApiKey;
10+
import org.springframework.ai.model.tool.DefaultToolCallingManager;
811
import org.springframework.ai.openai.OpenAiChatModel;
912
import org.springframework.ai.openai.OpenAiChatOptions;
1013
import org.springframework.ai.openai.api.OpenAiApi;
14+
import org.springframework.ai.retry.RetryUtils;
1115
import org.springframework.context.annotation.Bean;
1216
import org.springframework.context.annotation.Configuration;
13-
import org.springframework.context.annotation.Profile;
1417
import org.springframework.http.HttpHeaders;
1518
import org.springframework.retry.support.RetryTemplate;
16-
import org.springframework.web.client.ResponseErrorHandler;
1719
import org.springframework.web.client.RestClient;
1820
import org.springframework.web.reactive.function.client.WebClient;
1921

@@ -29,21 +31,32 @@ public Map<String, ChatClient> chatClients(
2931
OpenAiChatProperties chatProperties,
3032
WebClient.Builder webClientBuilder,
3133
RetryTemplate retryTemplate,
32-
FunctionCallbackResolver functionCallbackResolver,
33-
ResponseErrorHandler responseErrorHandler,
3434
MultiChatProperties multiChatProperties
3535
) {
36+
HttpHeaders headers = new HttpHeaders();
37+
headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate");
38+
3639
RestClient.Builder restClientBuilder = RestClient.builder()
37-
.defaultHeaders(headers -> headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate"));
40+
.defaultHeaders(h -> h.addAll(headers));
41+
42+
String apiKey = connectionProperties.getApiKey();
43+
if (connectionProperties.getApiKey().equalsIgnoreCase("redundant") && StringUtils.isNotBlank(chatProperties.getApiKey())) {
44+
apiKey = chatProperties.getApiKey();
45+
}
3846

3947
OpenAiApi openAiApi = new OpenAiApi(
4048
chatProperties.getBaseUrl() != null ? chatProperties.getBaseUrl() : connectionProperties.getBaseUrl(),
41-
chatProperties.getApiKey() != null ? chatProperties.getApiKey() : connectionProperties.getApiKey(),
49+
new SimpleApiKey(apiKey),
50+
headers,
51+
"/v1/chat/completions",
52+
"/v1/embeddings",
4253
restClientBuilder,
4354
webClientBuilder,
44-
responseErrorHandler
55+
RetryUtils.DEFAULT_RESPONSE_ERROR_HANDLER
4556
);
4657

58+
ObservationRegistry observationRegistry = ObservationRegistry.NOOP;
59+
4760
return multiChatProperties.getOptions().getModels().stream().collect(
4861
Collectors.toMap(
4962
model -> model,
@@ -52,9 +65,10 @@ public Map<String, ChatClient> chatClients(
5265
chatOptions.setModel(model);
5366
OpenAiChatModel openAiChatModel = new OpenAiChatModel(
5467
openAiApi,
55-
chatOptions,
56-
functionCallbackResolver,
57-
retryTemplate
68+
chatProperties.getOptions(),
69+
DefaultToolCallingManager.builder().observationRegistry(observationRegistry).build(),
70+
retryTemplate,
71+
observationRegistry
5872
);
5973
// Create ChatClient with similar configuration to original service
6074
return ChatClient.builder(openAiChatModel)

0 commit comments

Comments
 (0)