diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java
index d53e998967a..1952fde6269 100644
--- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java
+++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/ChatClient.java
@@ -16,8 +16,10 @@
package org.springframework.ai.chat.client;
+import java.lang.reflect.Type;
import java.net.URL;
import java.nio.charset.Charset;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
@@ -37,14 +39,15 @@
import org.springframework.ai.model.Media;
import org.springframework.ai.model.function.FunctionCallback;
import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.MimeType;
/**
- * Client to perform stateless requests to an AI Model, using a fluent API.
- *
+ * Client used to perform stateless requests to an AI Model, using a fluent API.
+ *
* Use {@link ChatClient#builder(ChatModel)} to prepare an instance.
*
* @author Mark Pollack
@@ -52,6 +55,8 @@
* @author Josh Long
* @author Arjen Poutsma
* @author Thomas Vitale
+ * @author John Blum
+ * @see ChatModel
* @since 1.0.0
*/
public interface ChatClient {
@@ -97,15 +102,22 @@ static Builder builder(ChatModel chatModel, ObservationRegistry observationRegis
interface PromptUserSpec {
- PromptUserSpec text(String text);
+ default PromptUserSpec text(String text) {
+ Charset defaultCharset = Charset.defaultCharset();
+ return text(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
+ }
- PromptUserSpec text(Resource text, Charset charset);
+ default PromptUserSpec text(Resource text) {
+ return text(text, Charset.defaultCharset());
+ }
- PromptUserSpec text(Resource text);
+ PromptUserSpec text(Resource text, Charset charset);
- PromptUserSpec params(Map p);
+ default PromptUserSpec param(String key, Object value) {
+ return params(Map.of(key, value));
+ }
- PromptUserSpec param(String k, Object v);
+ PromptUserSpec params(Map params);
PromptUserSpec media(Media... media);
@@ -117,25 +129,36 @@ interface PromptUserSpec {
interface PromptSystemSpec {
- PromptSystemSpec text(String text);
+ default PromptSystemSpec text(String text) {
+ Charset defaultCharset = Charset.defaultCharset();
+ return text(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
+ }
- PromptSystemSpec text(Resource text, Charset charset);
+ default PromptSystemSpec text(Resource text) {
+ return text(text, Charset.defaultCharset());
+ }
- PromptSystemSpec text(Resource text);
+ PromptSystemSpec text(Resource text, Charset charset);
- PromptSystemSpec params(Map p);
+ default PromptSystemSpec param(String key, Object value) {
+ return params(Map.of(key, value));
+ }
- PromptSystemSpec param(String k, Object v);
+ PromptSystemSpec params(Map params);
}
interface AdvisorSpec {
- AdvisorSpec param(String k, Object v);
+ default AdvisorSpec param(String key, Object value) {
+ return params(Map.of(key, value));
+ }
- AdvisorSpec params(Map p);
+ AdvisorSpec params(Map params);
- AdvisorSpec advisors(Advisor... advisors);
+ default AdvisorSpec advisors(Advisor... advisors) {
+ return advisors(Arrays.asList(advisors));
+ }
AdvisorSpec advisors(List advisors);
@@ -144,13 +167,22 @@ interface AdvisorSpec {
interface CallResponseSpec {
@Nullable
- T entity(ParameterizedTypeReference type);
+ default T entity(Class type) {
+
+ return entity(new ParameterizedTypeReference<>() {
+
+ @Override
+ public Type getType() {
+ return type;
+ }
+ });
+ }
@Nullable
- T entity(StructuredOutputConverter structuredOutputConverter);
+ T entity(ParameterizedTypeReference type);
@Nullable
- T entity(Class type);
+ T entity(StructuredOutputConverter structuredOutputConverter);
@Nullable
ChatResponse chatResponse();
@@ -158,7 +190,16 @@ interface CallResponseSpec {
@Nullable
String content();
- ResponseEntity responseEntity(Class type);
+ default ResponseEntity responseEntity(Class type) {
+
+ return responseEntity(new ParameterizedTypeReference() {
+
+ @Override
+ public Type getType() {
+ return type;
+ }
+ });
+ }
ResponseEntity responseEntity(ParameterizedTypeReference type);
@@ -202,11 +243,15 @@ interface ChatClientRequestSpec {
ChatClientRequestSpec advisors(Consumer consumer);
- ChatClientRequestSpec advisors(Advisor... advisors);
+ default ChatClientRequestSpec advisors(Advisor... advisors) {
+ return advisors(Arrays.asList(advisors));
+ }
ChatClientRequestSpec advisors(List advisors);
- ChatClientRequestSpec messages(Message... messages);
+ default ChatClientRequestSpec messages(Message... messages) {
+ return messages(Arrays.asList(messages));
+ }
ChatClientRequestSpec messages(List messages);
@@ -227,19 +272,29 @@ ChatClientRequestSpec function(String name, String description, Class
ChatClientRequestSpec toolContext(Map toolContext);
- ChatClientRequestSpec system(String text);
+ default ChatClientRequestSpec system(String text) {
+ Charset defaultCharset = Charset.defaultCharset();
+ return system(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
+ }
- ChatClientRequestSpec system(Resource textResource, Charset charset);
+ default ChatClientRequestSpec system(Resource text) {
+ return system(text, Charset.defaultCharset());
+ }
- ChatClientRequestSpec system(Resource text);
+ ChatClientRequestSpec system(Resource textResource, Charset charset);
ChatClientRequestSpec system(Consumer consumer);
- ChatClientRequestSpec user(String text);
+ default ChatClientRequestSpec user(String text) {
+ Charset defaultCharset = Charset.defaultCharset();
+ return user(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
+ }
- ChatClientRequestSpec user(Resource text, Charset charset);
+ default ChatClientRequestSpec user(Resource text) {
+ return user(text, Charset.defaultCharset());
+ }
- ChatClientRequestSpec user(Resource text);
+ ChatClientRequestSpec user(Resource text, Charset charset);
ChatClientRequestSpec user(Consumer consumer);
@@ -254,27 +309,39 @@ ChatClientRequestSpec function(String name, String description, Class
*/
interface Builder {
- Builder defaultAdvisors(Advisor... advisor);
-
- Builder defaultAdvisors(Consumer advisorSpecConsumer);
+ default Builder defaultAdvisors(Advisor... advisors) {
+ return defaultAdvisors(Arrays.asList(advisors));
+ }
Builder defaultAdvisors(List advisors);
+ Builder defaultAdvisors(Consumer advisorSpecConsumer);
+
Builder defaultOptions(ChatOptions chatOptions);
- Builder defaultUser(String text);
+ default Builder defaultUser(String text) {
+ Charset defaulCharset = Charset.defaultCharset();
+ return defaultUser(new ByteArrayResource(text.getBytes(defaulCharset)), defaulCharset);
+ }
- Builder defaultUser(Resource text, Charset charset);
+ default Builder defaultUser(Resource text) {
+ return defaultUser(text, Charset.defaultCharset());
+ }
- Builder defaultUser(Resource text);
+ Builder defaultUser(Resource text, Charset charset);
Builder defaultUser(Consumer userSpecConsumer);
- Builder defaultSystem(String text);
+ default Builder defaultSystem(String text) {
+ Charset defaultCharset = Charset.defaultCharset();
+ return defaultSystem(new ByteArrayResource(text.getBytes(defaultCharset)), defaultCharset);
+ }
- Builder defaultSystem(Resource text, Charset charset);
+ default Builder defaultSystem(Resource text) {
+ return defaultSystem(text, Charset.defaultCharset());
+ }
- Builder defaultSystem(Resource text);
+ Builder defaultSystem(Resource text, Charset charset);
Builder defaultSystem(Consumer systemSpecConsumer);