Closed raphaeldelio closed 8 months ago
@raphaeldelio , perhaps you have an outdated dependencies?
Could you please try to re-build with -U options?
I've successfully run the OpenAiChatClient2IT test below against the latest 0.8.0 SNAPSHOT and it produces expected JSON output like:
Response content: {
"planets": [ "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune" ]
}
Mind that according to the OpenAI Spec the response_format must be one of text
or json_object
and your user message MUST mention the JSON world.
Test:
package org.springframework.ai.openai.chat;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
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.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatClient;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(classes = OpenAiChatClient2IT.Config.class)
@EnabledIfEnvironmentVariable(named = "OPENAI_API_KEY", matches = ".+")
public class OpenAiChatClient2IT {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private OpenAiChatClient openAiChatClient;
@Test
void responseFormatTest() throws JsonMappingException, JsonProcessingException {
// 400 - ResponseError[error=Error[message='json' is not one of ['json_object', 'text'] -
// 'response_format.type', type=invalid_request_error, param=null, code=null]]
// 400 - ResponseError[error=Error[message='messages' must contain the word 'json' in some form, to use
// 'response_format' of type 'json_object'., type=invalid_request_error, param=messages, code=null]]
Prompt prompt = new Prompt("List 8 planets. Use JSON response", OpenAiChatOptions.builder()
.withResponseFormat(new ChatCompletionRequest.ResponseFormat("json_object"))
.build());
ChatResponse response = this.openAiChatClient.call(prompt);
assertThat(response).isNotNull();
String content = response.getResult().getOutput().getContent();
logger.info("Response content: {}", content);
assertThat(isValidJson(content)).isTrue();
}
private static ObjectMapper MAPPER = new ObjectMapper()
.enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS);
public static boolean isValidJson(String json) {
try {
MAPPER.readTree(json);
}
catch (JacksonException e) {
return false;
}
return true;
}
@SpringBootConfiguration
static class Config {
@Bean
public OpenAiApi chatCompletionApi() {
return new OpenAiApi(System.getenv("OPENAI_API_KEY"));
}
@Bean
public OpenAiChatClient openAiClient(OpenAiApi openAiApi) {
return new OpenAiChatClient(openAiApi);
}
}
}
closing as we were not able to reproduce. Please reopen if necessary. Thanks.
Bug description If I try to call the client with a prompt with OpenAiChatOptions it complains that it cannot find the class: java.lang.ClassNotFoundException: org.springframework.ai.chat.prompt.ChatOptions
Environment
Steps to reproduce
Expected behavior Without chat options, it works just fine.