4
respostas

[Bug] Error while extracting response for type [org.springframework.ai.openai.api.OpenAiApi$ChatCompletion] and content type [application/json;charset=utf-8]

Já consultei o chatGPT, mas não consegui desvendar o problema, suspeito de incompatibilidade do Spring AI com Open AI.

Ao rodar a aplicação no primeiro teste apareceu o bug:

Error while extracting response for type [org.springframework.ai.openai.api.OpenAiApi$ChatCompletion] and content type [application/json;charset=utf-8]

Meu pom: 4.0.0 org.springframework.boot spring-boot-starter-parent 3.3.7 br.com.alura ecomart 0.0.1-SNAPSHOT ecomart Demo project for Spring Boot <java.version>21</java.version> <spring-ai.version>1.0.0-M4</spring-ai.version> org.springframework.boot spring-boot-starter-web org.springframework.ai spring-ai-openai-spring-boot-starter

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>${spring-ai.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

classe controller:

import org.springframework.ai.chat.client.ChatClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;

@RestController @RequestMapping("gerador") public class GeradorDeProdutosController {

private final ChatClient chatClient;

public GeradorDeProdutosController(ChatClient.Builder chatClientBuilder) {
    this.chatClient = chatClientBuilder.build();
}

@GetMapping
public String gerarProdutos(){

    var pergunta = "Gere 5 produtos ecológicos";

    return this.chatClient.prompt()
            .user(pergunta)
            .call()
            .content();
}

}

4 respostas

Resposta ao Erro: Incompatibilidade entre Spring e OpenAI

Olá, Eduardo.

O erro mencionado ocorre devido a uma incompatibilidade de serialização entre o Spring e a API da OpenAI ao tentar processar a resposta do tipo OpenAiApi$ChatCompletion com o content type application/json;charset=utf-8.

Causas Prováveis:

  1. Serialização JSON:O problema geralmente está relacionado ao uso do HttpMessageConverter padrão do Spring, que pode não estar tratando corretamente a resposta da API OpenAI.

  2. Dependências Conflitantes:Possivelmente, as versões das bibliotecas utilizadas (spring-boot-starter e a integração com OpenAI) podem ter conflitos, como diferentes implementações de Jackson ou Gson.

  3. Content-Type com Charset:A API da OpenAI retorna application/json;charset=utf-8, enquanto o Spring Boot pode estar esperando apenas application/json.


Soluções Possíveis:

1. Garantir Dependências Atualizadas

  • Certifique-se de que está utilizando a versão mais recente das bibliotecas spring-boot-starter-web e openai.
  • Evitar conflitos de versões, especialmente no Maven.

2. Customização do RestTemplate ou WebClient:

  • Criar uma configuração personalizada para o RestTemplate ou WebClient com um HttpMessageConverter específico para lidar com o tipo de resposta corretamente.

3. Forçar o Content-Type:

  • Configurar o RestTemplate para aceitar explicitamente application/json;charset=utf-8.

4. Utilizar Jackson Explicitamente:

  • Se o problema for de serialização, garantir o uso explícito de Jackson como conversor JSON.

Se precisar de exemplos de código para essas soluções ou ajuda na implementação, estou à disposição.

Lucas,

Como disse no começo da mensagem, já fiz a consulta ao ChatGPT e obtive a mesma resposta que você enviou. Agradeço sua iniciativa, mas se eu soubesse como consertar a partir das indicações apontadas pelo chatGPT, já teria resolvido o problema.

Oi, você conseguiu resolver o erro?

Eu obtive este mesmo erro quando a Jaque num curso lá atrás usava a Open AI para traduzir a sinopse de séries, acabou que eu desisti e usei uma outra API para finalizar o projeto: a api.mymemory.

Abraço

Oi Luma,

O problema estava na compatibilidade da versão do Spring Boot com o OPEN AI, quando baixei o modelo de projeto no Spring initializr escolhi a versão 3.3.7, depois de tentar muita coisa, alterarei a propriedade manualmente de 3.3.7 para 3.4.1 e funcionou: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.4.1</version> <relativePath/> <!-- lookup parent from repository --> </parent>