Skip to content

Commit 6fb6854

Browse files
committed
Add missing configuration and implementation
1 parent f49fff2 commit 6fb6854

File tree

6 files changed

+161
-1
lines changed

6 files changed

+161
-1
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ out/
4343
### Miscellaneous ###
4444
data/
4545
tmp/
46-
config/
46+
**/creds*.yml
4747
logs/
4848

4949

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package me.pacphi.config;
2+
3+
import org.springframework.ai.autoconfigure.openai.OpenAiChatProperties;
4+
import org.springframework.ai.autoconfigure.openai.OpenAiConnectionProperties;
5+
import org.springframework.ai.model.function.FunctionCallbackResolver;
6+
import org.springframework.ai.openai.OpenAiChatModel;
7+
import org.springframework.ai.openai.api.OpenAiApi;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.context.annotation.Profile;
11+
import org.springframework.http.HttpHeaders;
12+
import org.springframework.retry.support.RetryTemplate;
13+
import org.springframework.web.client.ResponseErrorHandler;
14+
import org.springframework.web.client.RestClient;
15+
import org.springframework.web.reactive.function.client.WebClient;
16+
17+
@Configuration
18+
// @see https://github.com/spring-projects/spring-ai/issues/372#issuecomment-2242650500
19+
public class Chat {
20+
21+
@Bean
22+
public OpenAiChatModel chatModel(
23+
OpenAiConnectionProperties connectionProperties,
24+
OpenAiChatProperties chatProperties,
25+
WebClient.Builder webClientBuilder,
26+
RetryTemplate retryTemplate,
27+
FunctionCallbackResolver functionCallbackResolver,
28+
ResponseErrorHandler responseErrorHandler,
29+
RestClient.Builder restClientBuilder
30+
) {
31+
restClientBuilder.defaultHeaders(headers -> headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate"));
32+
33+
OpenAiApi openAiApi = new OpenAiApi(
34+
chatProperties.getBaseUrl() != null ? chatProperties.getBaseUrl() : connectionProperties.getBaseUrl(),
35+
chatProperties.getApiKey() != null ? chatProperties.getApiKey() : connectionProperties.getApiKey(),
36+
restClientBuilder,
37+
webClientBuilder,
38+
responseErrorHandler
39+
);
40+
41+
return new OpenAiChatModel(
42+
openAiApi,
43+
chatProperties.getOptions(),
44+
functionCallbackResolver,
45+
retryTemplate
46+
);
47+
}
48+
49+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package me.pacphi.config;
2+
3+
import org.springframework.ai.autoconfigure.openai.OpenAiChatProperties;
4+
import org.springframework.ai.autoconfigure.openai.OpenAiConnectionProperties;
5+
import org.springframework.ai.chat.client.ChatClient;
6+
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
7+
import org.springframework.ai.model.function.FunctionCallbackResolver;
8+
import org.springframework.ai.openai.OpenAiChatModel;
9+
import org.springframework.ai.openai.OpenAiChatOptions;
10+
import org.springframework.ai.openai.api.OpenAiApi;
11+
import org.springframework.context.annotation.Bean;
12+
import org.springframework.context.annotation.Configuration;
13+
import org.springframework.context.annotation.Profile;
14+
import org.springframework.http.HttpHeaders;
15+
import org.springframework.retry.support.RetryTemplate;
16+
import org.springframework.web.client.ResponseErrorHandler;
17+
import org.springframework.web.client.RestClient;
18+
import org.springframework.web.reactive.function.client.WebClient;
19+
20+
import java.util.Map;
21+
import java.util.stream.Collectors;
22+
23+
@Configuration
24+
public class MultiChat {
25+
26+
@Bean
27+
public Map<String, ChatClient> chatClients(
28+
OpenAiConnectionProperties connectionProperties,
29+
OpenAiChatProperties chatProperties,
30+
WebClient.Builder webClientBuilder,
31+
RetryTemplate retryTemplate,
32+
FunctionCallbackResolver functionCallbackResolver,
33+
ResponseErrorHandler responseErrorHandler,
34+
MultiChatProperties multiChatProperties
35+
) {
36+
RestClient.Builder restClientBuilder = RestClient.builder()
37+
.defaultHeaders(headers -> headers.set(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate"));
38+
39+
OpenAiApi openAiApi = new OpenAiApi(
40+
chatProperties.getBaseUrl() != null ? chatProperties.getBaseUrl() : connectionProperties.getBaseUrl(),
41+
chatProperties.getApiKey() != null ? chatProperties.getApiKey() : connectionProperties.getApiKey(),
42+
restClientBuilder,
43+
webClientBuilder,
44+
responseErrorHandler
45+
);
46+
47+
return multiChatProperties.getOptions().getModels().stream().collect(
48+
Collectors.toMap(
49+
model -> model,
50+
model -> {
51+
OpenAiChatOptions chatOptions = OpenAiChatOptions.fromOptions(chatProperties.getOptions());
52+
chatOptions.setModel(model);
53+
OpenAiChatModel openAiChatModel = new OpenAiChatModel(
54+
openAiApi,
55+
chatOptions,
56+
functionCallbackResolver,
57+
retryTemplate
58+
);
59+
// Create ChatClient with similar configuration to original service
60+
return ChatClient.builder(openAiChatModel)
61+
.defaultAdvisors(
62+
new SimpleLoggerAdvisor())
63+
.build();
64+
}
65+
)
66+
);
67+
}
68+
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package me.pacphi.config;
2+
3+
public interface MultiChatProperties {
4+
Options getOptions();
5+
void setOptions(Options options);
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package me.pacphi.config;
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
import org.springframework.stereotype.Component;
5+
6+
@Component
7+
@ConfigurationProperties(prefix = "spring.ai.openrouter.chat")
8+
public class OpenRouterAiChatProperties implements MultiChatProperties {
9+
10+
private Options options = new Options();
11+
12+
public Options getOptions() {
13+
return options;
14+
}
15+
16+
public void setOptions(Options options) {
17+
this.options = options;
18+
}
19+
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package me.pacphi.config;
2+
3+
import java.util.Set;
4+
5+
public class Options {
6+
7+
private Set<String> models;
8+
9+
public Set<String> getModels() {
10+
return models;
11+
}
12+
13+
public void setModels(Set<String> models) {
14+
this.models = models;
15+
}
16+
}

0 commit comments

Comments
 (0)