This commit is contained in:
Mark Pollack
2024-05-16 18:26:22 +02:00
parent 1fd32e3e01
commit 2f570a9156
2 changed files with 55 additions and 98 deletions

View File

@@ -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<String> movies) {
}
record ActorsFilmsRecord2(String actor, List<String> movies) {
}
}

View File

@@ -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<String, Object> paramsMap = new HashMap<>();
AbstractSystemMessageBuilder params(Map<String, Object> paramsMap) {
public AbstractSystemMessageBuilder params(Map<String, Object> paramsMap) {
this.paramsMap.putAll(paramsMap);
return this;
}
}
static class AbstractUserMessageBuilder {
public static class AbstractUserMessageBuilder {
private final List<Media> media = new ArrayList<>();
private final Map<String, Object> paramsMap = new HashMap<>();
AbstractUserMessageBuilder params(Map<String, Object> paramsMap) {
public AbstractUserMessageBuilder params(Map<String, Object> 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<FunctionBuilderSpec> functions) {
public ChatBuilderSpec functions(Consumer<FunctionBuilderSpec> functions) {
return this;
}
ChatBuilderSpec system(Consumer<SystemMessageBuilderSpec> system) {
public ChatBuilderSpec system(Consumer<SystemMessageBuilderSpec> system) {
return this;
}
ChatBuilderSpec user(Consumer<UserMessageBuilderSpec> user) {
public ChatBuilderSpec user(Consumer<UserMessageBuilderSpec> user) {
return this;
}
}
static class LiquidChatCallSpec {
public static class LiquidChatCallSpec {
<T> T call(T... ts) {
public <T> T call(T... ts) {
return null;
}
<T> T call(Class<T> tClass) {
public <T> T call(Class<T> 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<ChatBuilderSpec> chatSpec) {
return null;
@@ -170,51 +171,4 @@ public class FluentChatClientLambda {
}
/*
void demo(ApplicationContext applicationContext, ChatClient cc) throws Exception {
record ActorsFilmsRecord2(String actor, List<String> 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<String, Object> params);
ChatMediaParamSpec media(Consumer<ChatMediaParamSpec> chatMediaParamSpecConsumer);
}
public interface ChatMediaParamSpec {
ChatMediaParamSpec param(List<Media> mediaList);
ChatMediaParamSpec param(Media media);
ChatMediaParamSpec param(MimeType mimeType, Object data);
}
public interface ChatParamSpec {
ChatParamSpec param(String name, Object value);
ChatParamSpec params(Map<String, ?> paramMap);
}
}