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);