From 2f570a9156e48ff3e0e81b5c9ad7a95f3101f0af Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Thu, 16 May 2024 18:26:22 +0200 Subject: [PATCH] WIP --- .../openai/chat/OpenAiChatClientFluentIT.java | 43 +++---- .../ai/chat/FluentChatClient.java | 110 +++++------------- 2 files changed, 55 insertions(+), 98 deletions(-) diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatClientFluentIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatClientFluentIT.java index 848797b1d..62f5d22a6 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatClientFluentIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatClientFluentIT.java @@ -5,40 +5,43 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ai.chat.ChatClient; -import org.springframework.ai.chat.FluentChatClientLambda; +import org.springframework.ai.chat.FluentChatClient; +import org.springframework.ai.chat.messages.Media; +import org.springframework.ai.model.function.FunctionCallback; import org.springframework.ai.openai.OpenAiTestConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; +import java.util.Map; @SpringBootTest(classes = OpenAiTestConfiguration.class) @EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+") -public class OpenAiChatClientSpecLambdaIT { +public class OpenAiChatClientFluentIT { + @Autowired + private ChatClient chatClient; - @Autowired - private ChatClient chatClient; - private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientSpecLambdaIT.class); + private static final Logger logger = LoggerFactory.getLogger(OpenAiChatClientFluentIT.class); - - @Test - void simpleTest() { - var liquidChatClient = new FluentChatClientLambda.LiquidChatClient(this.chatClient); - var actors = liquidChatClient - .chat(s -> s.system(sys -> sys.text(""" + @Test + void simpleTest() { + var liquidChatClient = new FluentChatClient.LiquidChatClient(this.chatClient); + var actors = liquidChatClient + .chat(s -> s.system(sys -> sys.text(""" You're a non user hostile chatbot from cyberdyne systems. your primary objective is {primaryObjective} """).params(Map.of("primaryObjective", "No PHP"))) - .functions(fn -> fn.functions((FunctionCallback) null) - .functions("createReservation", "cancelReservations")) - .user(user -> user.text("tell me a joke about {topic}") - .params(Map.of("topic", "PHP")) - .media(new Media[0]))) - .call(ActorsFilmsRecord2.class); + .functions(fn -> fn.functions((FunctionCallback) null) + .functions("createReservation", "cancelReservations")) + .user(user -> user.text("tell me a joke about {topic}") + .params(Map.of("topic", "PHP")) + .media(new Media[0]))) + .call(ActorsFilmsRecord2.class); - } + } + + record ActorsFilmsRecord2(String actor, List movies) { + } - record ActorsFilmsRecord2(String actor, List movies) { - } } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/FluentChatClient.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/FluentChatClient.java index 7ce4b348b..28e04fce8 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/FluentChatClient.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/FluentChatClient.java @@ -11,11 +11,11 @@ import java.util.function.Consumer; /** * @author Josh Long */ -public class FluentChatClientLambda { +public class FluentChatClient { private final ChatClient chatClient; - public FluentChatClientLambda(ChatClient chatClient) { + public FluentChatClient(ChatClient chatClient) { this.chatClient = chatClient; } @@ -23,134 +23,134 @@ public class FluentChatClientLambda { private final Map paramsMap = new HashMap<>(); - AbstractSystemMessageBuilder params(Map paramsMap) { + public AbstractSystemMessageBuilder params(Map paramsMap) { this.paramsMap.putAll(paramsMap); return this; } } - static class AbstractUserMessageBuilder { + public static class AbstractUserMessageBuilder { private final List media = new ArrayList<>(); private final Map paramsMap = new HashMap<>(); - AbstractUserMessageBuilder params(Map paramsMap) { + public AbstractUserMessageBuilder params(Map paramsMap) { this.paramsMap.putAll(paramsMap); return this; } - AbstractUserMessageBuilder media(Media... media) { + public AbstractUserMessageBuilder media(Media... media) { this.media.addAll(Arrays.asList(media)); return this; } } - static class TextUserMessageBuilder extends AbstractUserMessageBuilder { + public static class TextUserMessageBuilder extends AbstractUserMessageBuilder { private final String text; - TextUserMessageBuilder(String text) { + public TextUserMessageBuilder(String text) { this.text = text; } } - static class ResourceUserMessageBuilder extends AbstractUserMessageBuilder { + public static class ResourceUserMessageBuilder extends AbstractUserMessageBuilder { private final Resource resource; - ResourceUserMessageBuilder(Resource resource) { + public ResourceUserMessageBuilder(Resource resource) { this.resource = resource; } } - static class ResourceSystemMessageBuilder extends AbstractSystemMessageBuilder { + public static class ResourceSystemMessageBuilder extends AbstractSystemMessageBuilder { private final Resource resource; - ResourceSystemMessageBuilder(Resource resource) { + public ResourceSystemMessageBuilder(Resource resource) { this.resource = resource; } } - static class TextSystemMessageBuilder extends AbstractSystemMessageBuilder { + public static class TextSystemMessageBuilder extends AbstractSystemMessageBuilder { private final String text; - TextSystemMessageBuilder(String text) { + public TextSystemMessageBuilder(String text) { this.text = text; } } - static class UserMessageBuilderSpec { + public static class UserMessageBuilderSpec { - TextUserMessageBuilder text(String text) { + public TextUserMessageBuilder text(String text) { return new TextUserMessageBuilder(text); } - ResourceUserMessageBuilder resource(Resource resource) { + public ResourceUserMessageBuilder resource(Resource resource) { return new ResourceUserMessageBuilder(resource); } } - static class SystemMessageBuilderSpec { + public static class SystemMessageBuilderSpec { - TextSystemMessageBuilder text(String text) { + public TextSystemMessageBuilder text(String text) { return new TextSystemMessageBuilder(text); } - ResourceSystemMessageBuilder resource(Resource resource) { + public ResourceSystemMessageBuilder resource(Resource resource) { return new ResourceSystemMessageBuilder(resource); } } - static class FunctionBuilderSpec { + public static class FunctionBuilderSpec { - FunctionBuilderSpec functions(String... functionNames) { + public FunctionBuilderSpec functions(String... functionNames) { return this; } - FunctionBuilderSpec functions(FunctionCallback... functionCallbacks) { + public FunctionBuilderSpec functions(FunctionCallback... functionCallbacks) { return this; } } - static class ChatBuilderSpec { + public static class ChatBuilderSpec { - ChatBuilderSpec functions(Consumer functions) { + public ChatBuilderSpec functions(Consumer functions) { return this; } - ChatBuilderSpec system(Consumer system) { + public ChatBuilderSpec system(Consumer system) { return this; } - ChatBuilderSpec user(Consumer user) { + public ChatBuilderSpec user(Consumer user) { return this; } } - static class LiquidChatCallSpec { + public static class LiquidChatCallSpec { - T call(T... ts) { + public T call(T... ts) { return null; } - T call(Class tClass) { + public T call(Class tClass) { return null; } - ChatResponse call() { + public ChatResponse call() { return null; } @@ -163,6 +163,7 @@ public class FluentChatClientLambda { public LiquidChatClient(ChatClient chatClient) { this.chatClient = chatClient; } + // put this in ChatClient public LiquidChatCallSpec chat(Consumer chatSpec) { return null; @@ -170,51 +171,4 @@ public class FluentChatClientLambda { } -/* - void demo(ApplicationContext applicationContext, ChatClient cc) throws Exception { - - record ActorsFilmsRecord2(String actor, List movies) { - } - - var liquidChatClient = new LiquidChatClient(cc); - var actors = liquidChatClient - .chat(s -> s.system(sys -> sys.text(""" - You're a non user hostile chatbot from cyberdyne systems. - your primary objective is {primaryObjective} - """).params(Map.of("primaryObjective", "No PHP"))) - .functions(fn -> fn.functions((FunctionCallback) null) - .functions("createReservation", "cancelReservations")) - .user(user -> user.text("tell me a joke about {topic}") - .params(Map.of("topic", "PHP")) - .media(new Media[0]))) - .call(ActorsFilmsRecord2.class); - } -*/ - - public interface ChatUserSpec { - - ChatParamSpec text(String text, Map params); - - ChatMediaParamSpec media(Consumer chatMediaParamSpecConsumer); - - } - - public interface ChatMediaParamSpec { - - ChatMediaParamSpec param(List mediaList); - - ChatMediaParamSpec param(Media media); - - ChatMediaParamSpec param(MimeType mimeType, Object data); - - } - - public interface ChatParamSpec { - - ChatParamSpec param(String name, Object value); - - ChatParamSpec params(Map paramMap); - - } - } \ No newline at end of file