Skip to content

Commit 7de48c8

Browse files
committed
Simplify the implementation of ChatClient-based interfaces.
Provide sensible defaults for overloaded methods in PromptUserSpec, PromptSystemSpec, AdvisorSpec, CallResponseSpec, ChatClientRequestSpec, and Builder interfaces.
1 parent 08a007f commit 7de48c8

File tree

1 file changed

+103
-36
lines changed
  • spring-ai-core/src/main/java/org/springframework/ai/chat/client

1 file changed

+103
-36
lines changed

spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java

Lines changed: 103 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616

1717
package org.springframework.ai.chat.client;
1818

19+
import java.lang.reflect.Type;
1920
import java.net.URL;
2021
import java.nio.charset.Charset;
22+
import java.util.Arrays;
2123
import java.util.List;
2224
import java.util.Map;
2325
import java.util.function.Consumer;
@@ -37,21 +39,24 @@
3739
import org.springframework.ai.model.Media;
3840
import org.springframework.ai.model.function.FunctionCallback;
3941
import org.springframework.core.ParameterizedTypeReference;
42+
import org.springframework.core.io.ByteArrayResource;
4043
import org.springframework.core.io.Resource;
4144
import org.springframework.lang.Nullable;
4245
import org.springframework.util.Assert;
4346
import org.springframework.util.MimeType;
4447

4548
/**
46-
* Client to perform stateless requests to an AI Model, using a fluent API.
47-
*
49+
* Client used to perform stateless requests to an AI Model, using a fluent API.
50+
* <p/>
4851
* Use {@link ChatClient#builder(ChatModel)} to prepare an instance.
4952
*
5053
* @author Mark Pollack
5154
* @author Christian Tzolov
5255
* @author Josh Long
5356
* @author Arjen Poutsma
5457
* @author Thomas Vitale
58+
* @author John Blum
59+
* @see ChatModel
5560
* @since 1.0.0
5661
*/
5762
public interface ChatClient {
@@ -97,15 +102,22 @@ static Builder builder(ChatModel chatModel, ObservationRegistry observationRegis
97102

98103
interface PromptUserSpec {
99104

100-
PromptUserSpec text(String text);
105+
default PromptUserSpec text(String text) {
106+
Charset defaultCharset = Charset.defaultCharset();
107+
return text(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
108+
}
101109

102-
PromptUserSpec text(Resource text, Charset charset);
110+
default PromptUserSpec text(Resource text) {
111+
return text(text, Charset.defaultCharset());
112+
}
103113

104-
PromptUserSpec text(Resource text);
114+
PromptUserSpec text(Resource text, Charset charset);
105115

106-
PromptUserSpec params(Map<String, Object> p);
116+
default PromptUserSpec param(String key, Object value) {
117+
return params(Map.of(key, value));
118+
}
107119

108-
PromptUserSpec param(String k, Object v);
120+
PromptUserSpec params(Map<String, Object> params);
109121

110122
PromptUserSpec media(Media... media);
111123

@@ -117,25 +129,36 @@ interface PromptUserSpec {
117129

118130
interface PromptSystemSpec {
119131

120-
PromptSystemSpec text(String text);
132+
default PromptSystemSpec text(String text) {
133+
Charset defaultCharset = Charset.defaultCharset();
134+
return text(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
135+
}
121136

122-
PromptSystemSpec text(Resource text, Charset charset);
137+
default PromptSystemSpec text(Resource text) {
138+
return text(text, Charset.defaultCharset());
139+
}
123140

124-
PromptSystemSpec text(Resource text);
141+
PromptSystemSpec text(Resource text, Charset charset);
125142

126-
PromptSystemSpec params(Map<String, Object> p);
143+
default PromptSystemSpec param(String key, Object value) {
144+
return params(Map.of(key, value));
145+
}
127146

128-
PromptSystemSpec param(String k, Object v);
147+
PromptSystemSpec params(Map<String, Object> params);
129148

130149
}
131150

132151
interface AdvisorSpec {
133152

134-
AdvisorSpec param(String k, Object v);
153+
default AdvisorSpec param(String key, Object value) {
154+
return params(Map.of(key, value));
155+
}
135156

136-
AdvisorSpec params(Map<String, Object> p);
157+
AdvisorSpec params(Map<String, Object> params);
137158

138-
AdvisorSpec advisors(Advisor... advisors);
159+
default AdvisorSpec advisors(Advisor... advisors) {
160+
return advisors(Arrays.asList(advisors));
161+
}
139162

140163
AdvisorSpec advisors(List<Advisor> advisors);
141164

@@ -144,21 +167,39 @@ interface AdvisorSpec {
144167
interface CallResponseSpec {
145168

146169
@Nullable
147-
<T> T entity(ParameterizedTypeReference<T> type);
170+
default <T> T entity(Class<T> type) {
171+
172+
return entity(new ParameterizedTypeReference<>() {
173+
174+
@Override
175+
public Type getType() {
176+
return type;
177+
}
178+
});
179+
}
148180

149181
@Nullable
150-
<T> T entity(StructuredOutputConverter<T> structuredOutputConverter);
182+
<T> T entity(ParameterizedTypeReference<T> type);
151183

152184
@Nullable
153-
<T> T entity(Class<T> type);
185+
<T> T entity(StructuredOutputConverter<T> structuredOutputConverter);
154186

155187
@Nullable
156188
ChatResponse chatResponse();
157189

158190
@Nullable
159191
String content();
160192

161-
<T> ResponseEntity<ChatResponse, T> responseEntity(Class<T> type);
193+
default <T> ResponseEntity<ChatResponse, T> responseEntity(Class<T> type) {
194+
195+
return responseEntity(new ParameterizedTypeReference<T>() {
196+
197+
@Override
198+
public Type getType() {
199+
return type;
200+
}
201+
});
202+
}
162203

163204
<T> ResponseEntity<ChatResponse, T> responseEntity(ParameterizedTypeReference<T> type);
164205

@@ -202,11 +243,15 @@ interface ChatClientRequestSpec {
202243

203244
ChatClientRequestSpec advisors(Consumer<AdvisorSpec> consumer);
204245

205-
ChatClientRequestSpec advisors(Advisor... advisors);
246+
default ChatClientRequestSpec advisors(Advisor... advisors) {
247+
return advisors(Arrays.asList(advisors));
248+
}
206249

207250
ChatClientRequestSpec advisors(List<Advisor> advisors);
208251

209-
ChatClientRequestSpec messages(Message... messages);
252+
default ChatClientRequestSpec messages(Message... messages) {
253+
return messages(Arrays.asList(messages));
254+
}
210255

211256
ChatClientRequestSpec messages(List<Message> messages);
212257

@@ -227,19 +272,29 @@ <I, O> ChatClientRequestSpec function(String name, String description, Class<I>
227272

228273
ChatClientRequestSpec toolContext(Map<String, Object> toolContext);
229274

230-
ChatClientRequestSpec system(String text);
275+
default ChatClientRequestSpec system(String text) {
276+
Charset defaultCharset = Charset.defaultCharset();
277+
return system(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
278+
}
231279

232-
ChatClientRequestSpec system(Resource textResource, Charset charset);
280+
default ChatClientRequestSpec system(Resource text) {
281+
return system(text, Charset.defaultCharset());
282+
}
233283

234-
ChatClientRequestSpec system(Resource text);
284+
ChatClientRequestSpec system(Resource textResource, Charset charset);
235285

236286
ChatClientRequestSpec system(Consumer<PromptSystemSpec> consumer);
237287

238-
ChatClientRequestSpec user(String text);
288+
default ChatClientRequestSpec user(String text) {
289+
Charset defaultCharset = Charset.defaultCharset();
290+
return user(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
291+
}
239292

240-
ChatClientRequestSpec user(Resource text, Charset charset);
293+
default ChatClientRequestSpec user(Resource text) {
294+
return user(text, Charset.defaultCharset());
295+
}
241296

242-
ChatClientRequestSpec user(Resource text);
297+
ChatClientRequestSpec user(Resource text, Charset charset);
243298

244299
ChatClientRequestSpec user(Consumer<PromptUserSpec> consumer);
245300

@@ -254,27 +309,39 @@ <I, O> ChatClientRequestSpec function(String name, String description, Class<I>
254309
*/
255310
interface Builder {
256311

257-
Builder defaultAdvisors(Advisor... advisor);
258-
259-
Builder defaultAdvisors(Consumer<AdvisorSpec> advisorSpecConsumer);
312+
default Builder defaultAdvisors(Advisor... advisors) {
313+
return defaultAdvisors(Arrays.asList(advisors));
314+
}
260315

261316
Builder defaultAdvisors(List<Advisor> advisors);
262317

318+
Builder defaultAdvisors(Consumer<AdvisorSpec> advisorSpecConsumer);
319+
263320
Builder defaultOptions(ChatOptions chatOptions);
264321

265-
Builder defaultUser(String text);
322+
default Builder defaultUser(String text) {
323+
Charset defaulCharset = Charset.defaultCharset();
324+
return defaultUser(new ByteArrayResource(text.getBytes(defaulCharset)), defaulCharset);
325+
}
266326

267-
Builder defaultUser(Resource text, Charset charset);
327+
default Builder defaultUser(Resource text) {
328+
return defaultUser(text, Charset.defaultCharset());
329+
}
268330

269-
Builder defaultUser(Resource text);
331+
Builder defaultUser(Resource text, Charset charset);
270332

271333
Builder defaultUser(Consumer<PromptUserSpec> userSpecConsumer);
272334

273-
Builder defaultSystem(String text);
335+
default Builder defaultSystem(String text) {
336+
Charset defaultCharset = Charset.defaultCharset();
337+
return defaultSystem(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
338+
}
274339

275-
Builder defaultSystem(Resource text, Charset charset);
340+
default Builder defaultSystem(Resource text) {
341+
return defaultSystem(text, Charset.defaultCharset());
342+
}
276343

277-
Builder defaultSystem(Resource text);
344+
Builder defaultSystem(Resource text, Charset charset);
278345

279346
Builder defaultSystem(Consumer<PromptSystemSpec> systemSpecConsumer);
280347

0 commit comments

Comments
 (0)