chatclient
This commit is contained in:
@@ -117,7 +117,7 @@ public class AnthropicChatConnector extends
|
||||
* @param retryTemplate the retry template used to retry the Anthropic API calls.
|
||||
*/
|
||||
public AnthropicChatConnector(AnthropicApi anthropicApi, AnthropicChatOptions defaultOptions,
|
||||
RetryTemplate retryTemplate) {
|
||||
RetryTemplate retryTemplate) {
|
||||
this(anthropicApi, defaultOptions, retryTemplate, null);
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ public class AnthropicChatConnector extends
|
||||
* state of the function calls.
|
||||
*/
|
||||
public AnthropicChatConnector(AnthropicApi anthropicApi, AnthropicChatOptions defaultOptions,
|
||||
RetryTemplate retryTemplate, FunctionCallbackContext functionCallbackContext) {
|
||||
RetryTemplate retryTemplate, FunctionCallbackContext functionCallbackContext) {
|
||||
|
||||
super(functionCallbackContext);
|
||||
|
||||
@@ -144,7 +144,7 @@ public class AnthropicChatConnector extends
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
ChatCompletionRequest request = createRequest(prompt, false);
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ class AnthropicChatConnectorIT {
|
||||
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);
|
||||
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", "Bob", "voice", "pirate"));
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
ChatResponse response = chatConnector.execute(prompt);
|
||||
ChatResponse response = chatConnector.call(prompt);
|
||||
assertThat(response.getResults()).hasSize(1);
|
||||
assertThat(response.getMetadata().getUsage().getGenerationTokens()).isGreaterThan(0);
|
||||
assertThat(response.getMetadata().getUsage().getPromptTokens()).isGreaterThan(0);
|
||||
@@ -102,7 +102,7 @@ class AnthropicChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.chatConnector.execute(prompt).getResult();
|
||||
Generation generation = this.chatConnector.call(prompt).getResult();
|
||||
|
||||
List<String> list = listOutputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -120,7 +120,7 @@ class AnthropicChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatConnector.execute(prompt).getResult();
|
||||
Generation generation = chatConnector.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = mapOutputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -142,7 +142,7 @@ class AnthropicChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatConnector.execute(prompt).getResult();
|
||||
Generation generation = chatConnector.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = beanOutputConverter.convert(generation.getOutput().getContent());
|
||||
logger.info("" + actorsFilms);
|
||||
@@ -187,14 +187,14 @@ class AnthropicChatConnectorIT {
|
||||
var userMessage = new UserMessage("Explain what do you see on this picture?",
|
||||
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
|
||||
|
||||
var response = chatConnector.execute(new Prompt(List.of(userMessage)));
|
||||
var response = chatConnector.call(new Prompt(List.of(userMessage)));
|
||||
|
||||
logger.info(response.getResult().getOutput().getContent());
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple", "basket");
|
||||
}
|
||||
|
||||
@Test
|
||||
void functionExecuteTest() {
|
||||
void functionCallTest() {
|
||||
|
||||
UserMessage userMessage = new UserMessage(
|
||||
"What's the weather like in San Francisco, Tokyo and Paris? Return the result in Celsius.");
|
||||
@@ -209,7 +209,7 @@ class AnthropicChatConnectorIT {
|
||||
.build()))
|
||||
.build();
|
||||
|
||||
ChatResponse response = chatConnector.execute(new Prompt(messages, promptOptions));
|
||||
ChatResponse response = chatConnector.call(new Prompt(messages, promptOptions));
|
||||
|
||||
logger.info("Response: {}", response);
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ public class AzureOpenAiChatConnector
|
||||
}
|
||||
|
||||
public AzureOpenAiChatConnector(OpenAIClient microsoftOpenAiClient, AzureOpenAiChatOptions options,
|
||||
FunctionCallbackContext functionCallbackContext) {
|
||||
FunctionCallbackContext functionCallbackContext) {
|
||||
super(functionCallbackContext);
|
||||
Assert.notNull(microsoftOpenAiClient, "com.azure.ai.openai.OpenAIClient must not be null");
|
||||
Assert.notNull(options, "AzureOpenAiChatOptions must not be null");
|
||||
@@ -131,7 +131,7 @@ public class AzureOpenAiChatConnector
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
ChatCompletionsOptions options = toAzureChatCompletionsOptions(prompt);
|
||||
options.setStream(false);
|
||||
|
||||
@@ -69,7 +69,7 @@ class AzureOpenAiChatConnectorIT {
|
||||
UserMessage userMessage = new UserMessage("Generate the names of 5 famous pirates.");
|
||||
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
ChatResponse response = chatClient.execute(prompt);
|
||||
ChatResponse response = chatClient.call(prompt);
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ class AzureOpenAiChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatClient.execute(prompt).getResult();
|
||||
Generation generation = chatClient.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -105,7 +105,7 @@ class AzureOpenAiChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatClient.execute(prompt).getResult();
|
||||
Generation generation = chatClient.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -124,7 +124,7 @@ class AzureOpenAiChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatClient.execute(prompt).getResult();
|
||||
Generation generation = chatClient.call(prompt).getResult();
|
||||
|
||||
ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(actorsFilms.actor()).isNotNull();
|
||||
@@ -145,7 +145,7 @@ class AzureOpenAiChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatClient.execute(prompt).getResult();
|
||||
Generation generation = chatClient.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
System.out.println(actorsFilms);
|
||||
|
||||
@@ -59,7 +59,7 @@ public class MockAzureOpenAiTestConfiguration {
|
||||
}
|
||||
|
||||
@Bean
|
||||
AzureOpenAiChatConnector azureOpenAiChatClient(OpenAIClient microsoftAzureOpenAiClient) {
|
||||
AzureOpenAiChatConnector azureOpenAiChatClient(OpenAIClient microsoftAzureOpenAiClient) {
|
||||
return new AzureOpenAiChatConnector(microsoftAzureOpenAiClient);
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ class AzureOpenAiChatConnectorFunctionCallIT {
|
||||
private AzureOpenAiChatConnector chatClient;
|
||||
|
||||
@Test
|
||||
void functionExecuteTest() {
|
||||
void functionCallTest() {
|
||||
|
||||
UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, in Tokyo, and in Paris?");
|
||||
|
||||
@@ -75,7 +75,7 @@ class AzureOpenAiChatConnectorFunctionCallIT {
|
||||
.build()))
|
||||
.build();
|
||||
|
||||
ChatResponse response = chatClient.execute(new Prompt(messages, promptOptions));
|
||||
ChatResponse response = chatClient.call(new Prompt(messages, promptOptions));
|
||||
|
||||
logger.info("Response: {}", response);
|
||||
|
||||
@@ -85,7 +85,7 @@ class AzureOpenAiChatConnectorFunctionCallIT {
|
||||
}
|
||||
|
||||
@Test
|
||||
void streamFunctionExecuteTest() {
|
||||
void streamFunctionCallTest() {
|
||||
UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?");
|
||||
|
||||
List<Message> messages = new ArrayList<>(List.of(userMessage));
|
||||
|
||||
@@ -75,7 +75,7 @@ class AzureOpenAiChatConnectorMetadataTests {
|
||||
|
||||
Prompt prompt = new Prompt("Can I fly like a bird?");
|
||||
|
||||
ChatResponse response = this.aiClient.execute(prompt);
|
||||
ChatResponse response = this.aiClient.call(prompt);
|
||||
|
||||
assertThat(response).isNotNull();
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ public class BedrockAnthropicChatConnector implements ChatConnector, StreamingCh
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
AnthropicChatRequest request = createRequest(prompt);
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ public class BedrockAnthropic3ChatConnector implements ChatConnector, StreamingC
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
AnthropicChatRequest request = createRequest(prompt);
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ public class BedrockCohereChatConnector implements ChatConnector, StreamingChatC
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
CohereChatResponse response = this.chatApi.chatCompletion(this.createRequest(prompt, false));
|
||||
List<Generation> generations = response.generations().stream().map(g -> {
|
||||
return new Generation(g.text());
|
||||
|
||||
@@ -41,7 +41,7 @@ public class BedrockAi21Jurassic2ChatConnector implements ChatConnector {
|
||||
private final BedrockAi21Jurassic2ChatOptions defaultOptions;
|
||||
|
||||
public BedrockAi21Jurassic2ChatConnector(Ai21Jurassic2ChatBedrockApi chatApi,
|
||||
BedrockAi21Jurassic2ChatOptions options) {
|
||||
BedrockAi21Jurassic2ChatOptions options) {
|
||||
Assert.notNull(chatApi, "Ai21Jurassic2ChatBedrockApi must not be null");
|
||||
Assert.notNull(options, "BedrockAi21Jurassic2ChatOptions must not be null");
|
||||
|
||||
@@ -59,7 +59,7 @@ public class BedrockAi21Jurassic2ChatConnector implements ChatConnector {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
var request = createRequest(prompt);
|
||||
var response = this.chatApi.chatCompletion(request);
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ public class BedrockLlamaChatConnector implements ChatConnector, StreamingChatCl
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
var request = createRequest(prompt);
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ public class BedrockTitanChatConnector implements ChatConnector, StreamingChatCl
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
TitanChatResponse response = this.chatApi.chatCompletion(this.createRequest(prompt));
|
||||
List<Generation> generations = response.results().stream().map(result -> {
|
||||
return new Generation(result.outputText());
|
||||
|
||||
@@ -101,7 +101,7 @@ class BedrockAnthropicChatConnectorIT {
|
||||
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
}
|
||||
@@ -119,7 +119,7 @@ class BedrockAnthropicChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors.", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.client.execute(prompt).getResult();
|
||||
Generation generation = this.client.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputParser.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -137,7 +137,7 @@ class BedrockAnthropicChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -161,7 +161,7 @@ class BedrockAnthropicChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConvert.convert(generation.getOutput().getContent());
|
||||
assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks");
|
||||
|
||||
@@ -105,7 +105,7 @@ class BedrockAnthropic3ChatConnectorIT {
|
||||
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
}
|
||||
@@ -123,7 +123,7 @@ class BedrockAnthropic3ChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors.", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.client.execute(prompt).getResult();
|
||||
Generation generation = this.client.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -142,7 +142,7 @@ class BedrockAnthropic3ChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -166,7 +166,7 @@ class BedrockAnthropic3ChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks");
|
||||
@@ -211,7 +211,7 @@ class BedrockAnthropic3ChatConnectorIT {
|
||||
var userMessage = new UserMessage("Explain what do you see o this picture?",
|
||||
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
|
||||
|
||||
var response = client.execute(new Prompt(List.of(userMessage)));
|
||||
var response = client.call(new Prompt(List.of(userMessage)));
|
||||
|
||||
logger.info(response.getResult().getOutput().getContent());
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple", "basket");
|
||||
|
||||
@@ -98,7 +98,7 @@ class BedrockCohereChatConnectorIT {
|
||||
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);
|
||||
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ class BedrockCohereChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors.", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.client.execute(prompt).getResult();
|
||||
Generation generation = this.client.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -134,7 +134,7 @@ class BedrockCohereChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -157,7 +157,7 @@ class BedrockCohereChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks");
|
||||
|
||||
@@ -66,7 +66,7 @@ class BedrockAi21Jurassic2ChatConnectorIT {
|
||||
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
}
|
||||
@@ -83,7 +83,7 @@ class BedrockAi21Jurassic2ChatConnectorIT {
|
||||
UserMessage userMessage = new UserMessage("Can you express happiness using an emoji like 😄 ?");
|
||||
Prompt prompt = new Prompt(List.of(userMessage), options);
|
||||
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
|
||||
assertThat(response.getResult().getOutput().getContent()).matches(content -> content.contains("😄"));
|
||||
}
|
||||
@@ -103,7 +103,7 @@ class BedrockAi21Jurassic2ChatConnectorIT {
|
||||
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage), options);
|
||||
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
|
||||
assertThat(response.getResult().getOutput().getContent()).doesNotContain("😄");
|
||||
}
|
||||
@@ -120,7 +120,7 @@ class BedrockAi21Jurassic2ChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -135,7 +135,7 @@ class BedrockAi21Jurassic2ChatConnectorIT {
|
||||
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("AI");
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ class BedrockLlamaChatConnectorIT {
|
||||
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
}
|
||||
@@ -116,7 +116,7 @@ class BedrockLlamaChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors.", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.client.execute(prompt).getResult();
|
||||
Generation generation = this.client.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -134,7 +134,7 @@ class BedrockLlamaChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -158,7 +158,7 @@ class BedrockLlamaChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks");
|
||||
|
||||
@@ -99,7 +99,7 @@ class BedrockTitanChatConnectorIT {
|
||||
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);
|
||||
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ class BedrockTitanChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors.", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.client.execute(prompt).getResult();
|
||||
Generation generation = this.client.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -138,7 +138,7 @@ class BedrockTitanChatConnectorIT {
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -162,7 +162,7 @@ class BedrockTitanChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks");
|
||||
|
||||
@@ -86,7 +86,7 @@ public class HuggingfaceChatConnector implements ChatConnector {
|
||||
* @return ChatResponse containing the generated text and other related details.
|
||||
*/
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
GenerateRequest generateRequest = new GenerateRequest();
|
||||
generateRequest.setInputs(prompt.getContents());
|
||||
GenerateParameters generateParameters = new GenerateParameters();
|
||||
|
||||
@@ -46,7 +46,7 @@ public class ClientIT {
|
||||
[/INST]
|
||||
""";
|
||||
Prompt prompt = new Prompt(mistral7bInstruct);
|
||||
ChatResponse chatResponse = huggingfaceChatClient.execute(prompt);
|
||||
ChatResponse chatResponse = huggingfaceChatClient.call(prompt);
|
||||
assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty();
|
||||
String expectedResponse = """
|
||||
```json
|
||||
|
||||
@@ -83,7 +83,7 @@ public class MistralAiChatConnector extends
|
||||
}
|
||||
|
||||
public MistralAiChatConnector(MistralAiApi mistralAiApi, MistralAiChatOptions options,
|
||||
FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate) {
|
||||
FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate) {
|
||||
super(functionCallbackContext);
|
||||
Assert.notNull(mistralAiApi, "MistralAiApi must not be null");
|
||||
Assert.notNull(options, "Options must not be null");
|
||||
@@ -94,7 +94,7 @@ public class MistralAiChatConnector extends
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
var request = createRequest(prompt, false);
|
||||
|
||||
return retryTemplate.execute(ctx -> {
|
||||
|
||||
@@ -25,9 +25,9 @@ import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.ai.chat.connector.ChatConnector;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import org.springframework.ai.chat.connector.ChatConnector;
|
||||
import org.springframework.ai.chat.ChatResponse;
|
||||
import org.springframework.ai.chat.Generation;
|
||||
import org.springframework.ai.chat.StreamingChatClient;
|
||||
@@ -90,7 +90,7 @@ class MistralAiChatConnectorIT {
|
||||
// NOTE: Mistral expects the system message to be before the user message or will
|
||||
// fail with 400 error.
|
||||
Prompt prompt = new Prompt(List.of(systemMessage, userMessage));
|
||||
ChatResponse response = chatConnector.execute(prompt);
|
||||
ChatResponse response = chatConnector.call(prompt);
|
||||
assertThat(response.getResults()).hasSize(1);
|
||||
assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard");
|
||||
}
|
||||
@@ -108,7 +108,7 @@ class MistralAiChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.chatConnector.execute(prompt).getResult();
|
||||
Generation generation = this.chatConnector.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -126,7 +126,7 @@ class MistralAiChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatConnector.execute(prompt).getResult();
|
||||
Generation generation = chatConnector.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -148,7 +148,7 @@ class MistralAiChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatConnector.execute(prompt).getResult();
|
||||
Generation generation = chatConnector.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
logger.info("" + actorsFilms);
|
||||
@@ -186,7 +186,7 @@ class MistralAiChatConnectorIT {
|
||||
}
|
||||
|
||||
@Test
|
||||
void functionExecuteTest() {
|
||||
void functionCallTest() {
|
||||
|
||||
UserMessage userMessage = new UserMessage("What's the weather like in San Francisco?");
|
||||
|
||||
@@ -201,7 +201,7 @@ class MistralAiChatConnectorIT {
|
||||
.build()))
|
||||
.build();
|
||||
|
||||
ChatResponse response = chatConnector.execute(new Prompt(messages, promptOptions));
|
||||
ChatResponse response = chatConnector.call(new Prompt(messages, promptOptions));
|
||||
|
||||
logger.info("Response: {}", response);
|
||||
|
||||
@@ -209,7 +209,7 @@ class MistralAiChatConnectorIT {
|
||||
}
|
||||
|
||||
@Test
|
||||
void streamFunctionExecuteTest() {
|
||||
void streamFunctionCallTest() {
|
||||
|
||||
UserMessage userMessage = new UserMessage("What's the weather like in Tokyo, Japan?");
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ public class MistralAiRetryTests {
|
||||
.thenThrow(new TransientAiException("Transient Error 2"))
|
||||
.thenReturn(ResponseEntity.of(Optional.of(expectedChatCompletion)));
|
||||
|
||||
var result = chatClient.execute(new Prompt("text"));
|
||||
var result = chatClient.call(new Prompt("text"));
|
||||
|
||||
assertThat(result).isNotNull();
|
||||
assertThat(result.getResult().getOutput().getContent()).isSameAs("Response");
|
||||
@@ -130,7 +130,7 @@ public class MistralAiRetryTests {
|
||||
public void mistralAiChatNonTransientError() {
|
||||
when(mistralAiApi.chatCompletionEntity(isA(ChatCompletionRequest.class)))
|
||||
.thenThrow(new RuntimeException("Non Transient Error"));
|
||||
assertThrows(RuntimeException.class, () -> chatClient.execute(new Prompt("text")));
|
||||
assertThrows(RuntimeException.class, () -> chatClient.call(new Prompt("text")));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -18,10 +18,10 @@ package org.springframework.ai.ollama;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.ai.chat.connector.ChatConnector;
|
||||
import org.springframework.ai.ollama.metadata.OllamaChatResponseMetadata;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import org.springframework.ai.chat.connector.ChatConnector;
|
||||
import org.springframework.ai.chat.ChatResponse;
|
||||
import org.springframework.ai.chat.Generation;
|
||||
import org.springframework.ai.chat.StreamingChatClient;
|
||||
@@ -94,7 +94,7 @@ public class OllamaChatConnector implements ChatConnector, StreamingChatClient {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
OllamaApi.ChatResponse response = this.chatApi.chat(ollamaChatRequest(prompt, false));
|
||||
|
||||
|
||||
@@ -95,13 +95,13 @@ class OllamaChatConnectorIT {
|
||||
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage), portableOptions);
|
||||
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
|
||||
// ollama specific options
|
||||
var ollamaOptions = new OllamaOptions().withLowVRAM(true);
|
||||
|
||||
response = client.execute(new Prompt(List.of(userMessage, systemMessage), ollamaOptions));
|
||||
response = client.call(new Prompt(List.of(userMessage, systemMessage), ollamaOptions));
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
|
||||
}
|
||||
@@ -109,7 +109,7 @@ class OllamaChatConnectorIT {
|
||||
@Test
|
||||
void usageTest() {
|
||||
Prompt prompt = new Prompt("Tell me a joke");
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
Usage usage = response.getMetadata().getUsage();
|
||||
|
||||
assertThat(usage).isNotNull();
|
||||
@@ -131,7 +131,7 @@ class OllamaChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors.", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.client.execute(prompt).getResult();
|
||||
Generation generation = this.client.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -151,7 +151,7 @@ class OllamaChatConnectorIT {
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -173,7 +173,7 @@ class OllamaChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks");
|
||||
|
||||
@@ -75,7 +75,7 @@ class OllamaChatConnectorMultimodalIT {
|
||||
var userMessage = new UserMessage("Explain what do you see on this picture?",
|
||||
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
|
||||
|
||||
var response = client.execute(new Prompt(List.of(userMessage)));
|
||||
var response = client.call(new Prompt(List.of(userMessage)));
|
||||
|
||||
logger.info(response.getResult().getOutput().getContent());
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple", "basket");
|
||||
|
||||
@@ -123,7 +123,7 @@ public class OpenAiChatConnector extends
|
||||
* @param retryTemplate The retry template.
|
||||
*/
|
||||
public OpenAiChatConnector(OpenAiApi openAiApi, OpenAiChatOptions options,
|
||||
FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate) {
|
||||
FunctionCallbackContext functionCallbackContext, RetryTemplate retryTemplate) {
|
||||
super(functionCallbackContext);
|
||||
Assert.notNull(openAiApi, "OpenAiApi must not be null");
|
||||
Assert.notNull(options, "Options must not be null");
|
||||
@@ -134,7 +134,7 @@ public class OpenAiChatConnector extends
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
ChatCompletionRequest request = createRequest(prompt, false);
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
class ChatClientTest {
|
||||
class ChatConnectorTest {
|
||||
|
||||
@Configuration
|
||||
static class ChatClientTestConfiguration {
|
||||
@@ -28,7 +28,7 @@ class ChatClientTest {
|
||||
|
||||
private final ChatClient singularity;
|
||||
|
||||
ChatClientTest(@Autowired ChatClient singularity) {
|
||||
ChatConnectorTest(@Autowired ChatClient singularity) {
|
||||
this.singularity = singularity;
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ public class AcmeIT extends AbstractIT {
|
||||
logger.info("Asking AI generative to reply to question.");
|
||||
Prompt prompt = new Prompt(List.of(systemMessage, userMessage));
|
||||
logger.info("AI responded.");
|
||||
ChatResponse response = chatClient.execute(prompt);
|
||||
ChatResponse response = chatClient.call(prompt);
|
||||
|
||||
evaluateQuestionAndAnswer(userQuery, response, true);
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ public class OpenAiChatClientWithChatResponseMetadataTests {
|
||||
|
||||
Prompt prompt = new Prompt("Reach for the sky.");
|
||||
|
||||
ChatResponse response = this.openAiChatClient.execute(prompt);
|
||||
ChatResponse response = this.openAiChatClient.call(prompt);
|
||||
|
||||
assertThat(response).isNotNull();
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ public class OpenAiChatConnector2IT {
|
||||
.withResponseFormat(new ChatCompletionRequest.ResponseFormat("json_object"))
|
||||
.build());
|
||||
|
||||
ChatResponse response = this.openAiChatClient.execute(prompt);
|
||||
ChatResponse response = this.openAiChatClient.call(prompt);
|
||||
|
||||
assertThat(response).isNotNull();
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);
|
||||
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", "Bob", "voice", "pirate"));
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
ChatResponse response = chatConnector.execute(prompt);
|
||||
ChatResponse response = chatConnector.call(prompt);
|
||||
assertThat(response.getResults()).hasSize(1);
|
||||
assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard");
|
||||
// needs fine tuning... evaluateQuestionAndAnswer(request, response, false);
|
||||
@@ -93,7 +93,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.chatConnector.execute(prompt).getResult();
|
||||
Generation generation = this.chatConnector.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -112,7 +112,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatConnector.execute(prompt).getResult();
|
||||
Generation generation = chatConnector.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -131,7 +131,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatConnector.execute(prompt).getResult();
|
||||
Generation generation = chatConnector.call(prompt).getResult();
|
||||
|
||||
ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
}
|
||||
@@ -151,7 +151,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = chatConnector.execute(prompt).getResult();
|
||||
Generation generation = chatConnector.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
logger.info("" + actorsFilms);
|
||||
@@ -189,7 +189,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
}
|
||||
|
||||
@Test
|
||||
void functionExecuteTest() {
|
||||
void functionCallTest() {
|
||||
|
||||
UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?");
|
||||
|
||||
@@ -204,7 +204,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
.build()))
|
||||
.build();
|
||||
|
||||
ChatResponse response = chatConnector.execute(new Prompt(messages, promptOptions));
|
||||
ChatResponse response = chatConnector.call(new Prompt(messages, promptOptions));
|
||||
|
||||
logger.info("Response: {}", response);
|
||||
|
||||
@@ -214,7 +214,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
}
|
||||
|
||||
@Test
|
||||
void streamFunctionExecuteTest() {
|
||||
void streamFunctionCallTest() {
|
||||
|
||||
UserMessage userMessage = new UserMessage("What's the weather like in San Francisco, Tokyo, and Paris?");
|
||||
|
||||
@@ -256,7 +256,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
List.of(new Media(MimeTypeUtils.IMAGE_PNG, imageData)));
|
||||
|
||||
var response = chatConnector
|
||||
.execute(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build()));
|
||||
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build()));
|
||||
|
||||
logger.info(response.getResult().getOutput().getContent());
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple");
|
||||
@@ -272,7 +272,7 @@ class OpenAiChatConnectorIT extends AbstractIT {
|
||||
new URL("https://docs.spring.io/spring-ai/reference/1.0-SNAPSHOT/_images/multimodal.test.png"))));
|
||||
|
||||
ChatResponse response = chatConnector
|
||||
.execute(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build()));
|
||||
.call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build()));
|
||||
|
||||
logger.info(response.getResult().getOutput().getContent());
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple");
|
||||
|
||||
@@ -23,20 +23,14 @@ import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import org.springframework.ai.openai.*;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import org.springframework.ai.chat.prompt.Prompt;
|
||||
import org.springframework.ai.document.MetadataMode;
|
||||
import org.springframework.ai.image.ImageMessage;
|
||||
import org.springframework.ai.image.ImagePrompt;
|
||||
import org.springframework.ai.openai.OpenAiAudioTranscriptionClient;
|
||||
import org.springframework.ai.openai.OpenAiAudioTranscriptionOptions;
|
||||
import org.springframework.ai.openai.OpenAiChatConnector;
|
||||
import org.springframework.ai.openai.OpenAiChatOptions;
|
||||
import org.springframework.ai.openai.OpenAiEmbeddingClient;
|
||||
import org.springframework.ai.openai.OpenAiEmbeddingOptions;
|
||||
import org.springframework.ai.openai.OpenAiImageClient;
|
||||
import org.springframework.ai.openai.OpenAiImageOptions;
|
||||
import org.springframework.ai.openai.api.OpenAiApi;
|
||||
import org.springframework.ai.openai.api.OpenAiApi.ChatCompletion;
|
||||
import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionChunk;
|
||||
@@ -146,7 +140,7 @@ public class OpenAiRetryTests {
|
||||
.thenThrow(new TransientAiException("Transient Error 2"))
|
||||
.thenReturn(ResponseEntity.of(Optional.of(expectedChatCompletion)));
|
||||
|
||||
var result = chatClient.execute(new Prompt("text"));
|
||||
var result = chatClient.call(new Prompt("text"));
|
||||
|
||||
assertThat(result).isNotNull();
|
||||
assertThat(result.getResult().getOutput().getContent()).isSameAs("Response");
|
||||
@@ -158,7 +152,7 @@ public class OpenAiRetryTests {
|
||||
public void openAiChatNonTransientError() {
|
||||
when(openAiApi.chatCompletionEntity(isA(ChatCompletionRequest.class)))
|
||||
.thenThrow(new RuntimeException("Non Transient Error"));
|
||||
assertThrows(RuntimeException.class, () -> chatClient.execute(new Prompt("text")));
|
||||
assertThrows(RuntimeException.class, () -> chatClient.call(new Prompt("text")));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -99,7 +99,7 @@ public class ChatMemoryLongTermSystemPromptIT extends BaseMemoryTest {
|
||||
|
||||
@Bean
|
||||
public ChatService memoryChatService(OpenAiChatConnector chatClient, VectorStore vectorStore,
|
||||
TokenCountEstimator tokenCountEstimator) {
|
||||
TokenCountEstimator tokenCountEstimator) {
|
||||
|
||||
return PromptTransformingChatService.builder(chatClient)
|
||||
.withRetrievers(List.of(new VectorStoreChatMemoryRetriever(vectorStore, 10)))
|
||||
@@ -111,7 +111,7 @@ public class ChatMemoryLongTermSystemPromptIT extends BaseMemoryTest {
|
||||
|
||||
@Bean
|
||||
public StreamingChatService memoryStreamingChatService(OpenAiChatConnector streamingChatClient,
|
||||
VectorStore vectorStore, TokenCountEstimator tokenCountEstimator) {
|
||||
VectorStore vectorStore, TokenCountEstimator tokenCountEstimator) {
|
||||
|
||||
return StreamingPromptTransformingChatService.builder(streamingChatClient)
|
||||
.withRetrievers(List.of(new VectorStoreChatMemoryRetriever(vectorStore, 10)))
|
||||
|
||||
@@ -75,7 +75,7 @@ public class ChatMemoryShortTermMessageListIT extends BaseMemoryTest {
|
||||
|
||||
@Bean
|
||||
public ChatService memoryChatService(OpenAiChatConnector chatClient, ChatMemory chatHistory,
|
||||
TokenCountEstimator tokenCountEstimator) {
|
||||
TokenCountEstimator tokenCountEstimator) {
|
||||
|
||||
return PromptTransformingChatService.builder(chatClient)
|
||||
.withRetrievers(List.of(new ChatMemoryRetriever(chatHistory)))
|
||||
@@ -87,7 +87,7 @@ public class ChatMemoryShortTermMessageListIT extends BaseMemoryTest {
|
||||
|
||||
@Bean
|
||||
public StreamingChatService memoryStreamingChatService(OpenAiChatConnector streamingChatClient,
|
||||
ChatMemory chatHistory, TokenCountEstimator tokenCountEstimator) {
|
||||
ChatMemory chatHistory, TokenCountEstimator tokenCountEstimator) {
|
||||
|
||||
return StreamingPromptTransformingChatService.builder(streamingChatClient)
|
||||
.withRetrievers(List.of(new ChatMemoryRetriever(chatHistory)))
|
||||
|
||||
@@ -76,7 +76,7 @@ public class ChatMemoryShortTermSystemPromptIT extends BaseMemoryTest {
|
||||
|
||||
@Bean
|
||||
public ChatService memoryChatService(OpenAiChatConnector chatClient, ChatMemory chatHistory,
|
||||
TokenCountEstimator tokenCountEstimator) {
|
||||
TokenCountEstimator tokenCountEstimator) {
|
||||
|
||||
return PromptTransformingChatService.builder(chatClient)
|
||||
.withRetrievers(List.of(new ChatMemoryRetriever(chatHistory)))
|
||||
@@ -88,7 +88,7 @@ public class ChatMemoryShortTermSystemPromptIT extends BaseMemoryTest {
|
||||
|
||||
@Bean
|
||||
public StreamingChatService memoryStreamingChatService(OpenAiChatConnector streamingChatClient,
|
||||
ChatMemory chatHistory, TokenCountEstimator tokenCountEstimator) {
|
||||
ChatMemory chatHistory, TokenCountEstimator tokenCountEstimator) {
|
||||
|
||||
return StreamingPromptTransformingChatService.builder(streamingChatClient)
|
||||
.withRetrievers(List.of(new ChatMemoryRetriever(chatHistory)))
|
||||
|
||||
@@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory;
|
||||
import org.springframework.ai.chat.prompt.transformer.ChatServiceContext;
|
||||
import org.springframework.ai.chat.service.ChatService;
|
||||
import org.springframework.ai.chat.service.PromptTransformingChatService;
|
||||
import org.springframework.ai.openai.OpenAiChatConnector;
|
||||
import org.springframework.ai.openai.OpenAiChatOptions;
|
||||
import org.testcontainers.junit.jupiter.Container;
|
||||
import org.testcontainers.junit.jupiter.Testcontainers;
|
||||
@@ -52,7 +53,6 @@ import org.springframework.ai.document.DocumentTransformer;
|
||||
import org.springframework.ai.embedding.EmbeddingClient;
|
||||
import org.springframework.ai.evaluation.EvaluationResponse;
|
||||
import org.springframework.ai.evaluation.RelevancyEvaluator;
|
||||
import org.springframework.ai.openai.OpenAiChatConnector;
|
||||
import org.springframework.ai.openai.OpenAiEmbeddingClient;
|
||||
import org.springframework.ai.openai.api.OpenAiApi;
|
||||
import org.springframework.ai.reader.JsonReader;
|
||||
@@ -187,7 +187,7 @@ public class LongShortTermChatMemoryWithRagIT {
|
||||
|
||||
@Bean
|
||||
public ChatService memoryChatService(OpenAiChatConnector chatClient, VectorStore vectorStore,
|
||||
TokenCountEstimator tokenCountEstimator, ChatMemory chatHistory) {
|
||||
TokenCountEstimator tokenCountEstimator, ChatMemory chatHistory) {
|
||||
|
||||
return PromptTransformingChatService.builder(chatClient)
|
||||
.withRetrievers(List.of(new VectorStoreRetriever(vectorStore, SearchRequest.defaults()),
|
||||
|
||||
@@ -82,7 +82,7 @@ public class OpenAiPromptTransformingChatServiceIT {
|
||||
|
||||
@Autowired
|
||||
public OpenAiPromptTransformingChatServiceIT(ChatConnector chatConnector, ChatService chatService,
|
||||
VectorStore vectorStore) {
|
||||
VectorStore vectorStore) {
|
||||
this.chatConnector = chatConnector;
|
||||
this.chatService = chatService;
|
||||
this.vectorStore = vectorStore;
|
||||
|
||||
@@ -85,12 +85,12 @@ public abstract class AbstractIT {
|
||||
}
|
||||
Message userMessage = userPromptTemplate.createMessage();
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
String yesOrNo = chatConnector.execute(prompt).getResult().getOutput().getContent();
|
||||
String yesOrNo = chatConnector.call(prompt).getResult().getOutput().getContent();
|
||||
logger.info("Is Answer related to question: " + yesOrNo);
|
||||
if (yesOrNo.equalsIgnoreCase("no")) {
|
||||
SystemMessage notRelatedSystemMessage = new SystemMessage(qaEvaluatorNotRelatedResource);
|
||||
prompt = new Prompt(List.of(userMessage, notRelatedSystemMessage));
|
||||
String reasonForFailure = chatConnector.execute(prompt).getResult().getOutput().getContent();
|
||||
String reasonForFailure = chatConnector.call(prompt).getResult().getOutput().getContent();
|
||||
fail(reasonForFailure);
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -130,7 +130,7 @@ public class VertexAiGeminiChatConnector
|
||||
}
|
||||
|
||||
public VertexAiGeminiChatConnector(VertexAI vertexAI, VertexAiGeminiChatOptions options,
|
||||
FunctionCallbackContext functionCallbackContext) {
|
||||
FunctionCallbackContext functionCallbackContext) {
|
||||
|
||||
super(functionCallbackContext);
|
||||
|
||||
@@ -145,7 +145,7 @@ public class VertexAiGeminiChatConnector
|
||||
|
||||
// https://cloud.google.com/vertex-ai/docs/generative-ai/model-reference/gemini
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
var geminiRequest = createGeminiRequest(prompt);
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ class VertexAiGeminiChatConnectorIT {
|
||||
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);
|
||||
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard");
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ class VertexAiGeminiChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors.", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.client.execute(prompt).getResult();
|
||||
Generation generation = this.client.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputParser.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -106,7 +106,7 @@ class VertexAiGeminiChatConnectorIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -129,7 +129,7 @@ class VertexAiGeminiChatConnectorIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConvert.convert(generation.getOutput().getContent());
|
||||
assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks");
|
||||
@@ -191,7 +191,7 @@ class VertexAiGeminiChatConnectorIT {
|
||||
var userMessage = new UserMessage("Explain what do you see o this picture?",
|
||||
List.of(new Media(MimeTypeUtils.IMAGE_PNG, data)));
|
||||
|
||||
var response = client.execute(new Prompt(List.of(userMessage)));
|
||||
var response = client.call(new Prompt(List.of(userMessage)));
|
||||
|
||||
// Response should contain something like:
|
||||
// I see a bunch of bananas in a golden basket. The bananas are ripe and yellow.
|
||||
|
||||
@@ -68,7 +68,7 @@ public class VertexAiGeminiChatConnectorFunctionCallingIT {
|
||||
|
||||
@Test
|
||||
// @Disabled("Google Vertex AI degraded support for parallel function calls")
|
||||
public void functionExecuteExplicitOpenApiSchema() {
|
||||
public void functionCallExplicitOpenApiSchema() {
|
||||
|
||||
UserMessage userMessage = new UserMessage(
|
||||
"What's the weather like in San Francisco, in Paris and in Tokyo, Japan?"
|
||||
@@ -106,7 +106,7 @@ public class VertexAiGeminiChatConnectorFunctionCallingIT {
|
||||
.build()))
|
||||
.build();
|
||||
|
||||
ChatResponse response = vertexGeminiClient.execute(new Prompt(messages, promptOptions));
|
||||
ChatResponse response = vertexGeminiClient.call(new Prompt(messages, promptOptions));
|
||||
|
||||
logger.info("Response: {}", response);
|
||||
|
||||
@@ -118,7 +118,7 @@ public class VertexAiGeminiChatConnectorFunctionCallingIT {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void functionExecuteTestInferredOpenApiSchema() {
|
||||
public void functionCallTestInferredOpenApiSchema() {
|
||||
|
||||
UserMessage userMessage = new UserMessage("What's the weather like in Paris? Use Celsius units.");
|
||||
|
||||
@@ -141,14 +141,14 @@ public class VertexAiGeminiChatConnectorFunctionCallingIT {
|
||||
.build()))
|
||||
.build();
|
||||
|
||||
ChatResponse response = vertexGeminiClient.execute(new Prompt(messages, promptOptions));
|
||||
ChatResponse response = vertexGeminiClient.call(new Prompt(messages, promptOptions));
|
||||
|
||||
logger.info("Response: {}", response);
|
||||
|
||||
assertThat(response.getResult().getOutput().getContent()).containsAnyOf("15.0", "15");
|
||||
|
||||
ChatResponse response2 = vertexGeminiClient
|
||||
.execute(new Prompt("What is the payment status for transaction 696?", promptOptions));
|
||||
.call(new Prompt("What is the payment status for transaction 696?", promptOptions));
|
||||
|
||||
logger.info("Response: {}", response2);
|
||||
|
||||
@@ -157,7 +157,7 @@ public class VertexAiGeminiChatConnectorFunctionCallingIT {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void functionExecuteTestInferredOpenApiSchemaStream() {
|
||||
public void functionCallTestInferredOpenApiSchemaStream() {
|
||||
|
||||
UserMessage userMessage = new UserMessage("What's the weather like in San Francisco in Celsius units?");
|
||||
// UserMessage userMessage = new UserMessage(
|
||||
|
||||
@@ -55,7 +55,7 @@ public class VertexAiPaLm2ChatConnector implements ChatConnector {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
GenerateMessageRequest request = createRequest(prompt);
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ class VertexAiPaLm2ChatGenerationClientIT {
|
||||
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemResource);
|
||||
Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice));
|
||||
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
assertThat(response.getResult().getOutput().getContent()).contains("Bartholomew");
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ class VertexAiPaLm2ChatGenerationClientIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "ice cream flavors.", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = this.client.execute(prompt).getResult();
|
||||
Generation generation = this.client.call(prompt).getResult();
|
||||
|
||||
List<String> list = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(list).hasSize(5);
|
||||
@@ -98,7 +98,7 @@ class VertexAiPaLm2ChatGenerationClientIT {
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template,
|
||||
Map.of("subject", "an array of numbers from 1 to 9 under they key name 'numbers'", "format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
Map<String, Object> result = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9));
|
||||
@@ -120,7 +120,7 @@ class VertexAiPaLm2ChatGenerationClientIT {
|
||||
""";
|
||||
PromptTemplate promptTemplate = new PromptTemplate(template, Map.of("format", format));
|
||||
Prompt prompt = new Prompt(promptTemplate.createMessage());
|
||||
Generation generation = client.execute(prompt).getResult();
|
||||
Generation generation = client.call(prompt).getResult();
|
||||
|
||||
ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent());
|
||||
assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks");
|
||||
|
||||
@@ -18,9 +18,9 @@ package org.springframework.ai.watsonx;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.ai.chat.connector.ChatConnector;
|
||||
import reactor.core.publisher.Flux;
|
||||
|
||||
import org.springframework.ai.chat.connector.ChatConnector;
|
||||
import org.springframework.ai.chat.ChatResponse;
|
||||
import org.springframework.ai.chat.Generation;
|
||||
import org.springframework.ai.chat.StreamingChatClient;
|
||||
@@ -76,7 +76,7 @@ public class WatsonxAiChatConnector implements ChatConnector, StreamingChatClien
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatResponse execute(Prompt prompt) {
|
||||
public ChatResponse call(Prompt prompt) {
|
||||
|
||||
WatsonxAiRequest request = request(prompt);
|
||||
|
||||
|
||||
@@ -155,7 +155,7 @@ public class WatsonxAiChatConnectorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExecuteMethod() {
|
||||
public void testCallMethod() {
|
||||
WatsonxAiApi mockChatApi = mock(WatsonxAiApi.class);
|
||||
WatsonxAiChatConnector client = new WatsonxAiChatConnector(mockChatApi);
|
||||
|
||||
@@ -177,7 +177,7 @@ public class WatsonxAiChatConnectorTest {
|
||||
Map.of("warnings", List.of(Map.of("message", "the message", "id", "disclaimer_warning")))));
|
||||
|
||||
ChatResponse expectedResponse = new ChatResponse(List.of(expectedGenerator));
|
||||
ChatResponse response = client.execute(prompt);
|
||||
ChatResponse response = client.call(prompt);
|
||||
|
||||
Assert.assertEquals(expectedResponse.getResults().size(), response.getResults().size());
|
||||
Assert.assertEquals(expectedResponse.getResult().getOutput(), response.getResult().getOutput());
|
||||
|
||||
Reference in New Issue
Block a user