From 27354cd6167ca6e10eaea65af0949b0e5afa52c5 Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Fri, 26 Jul 2024 11:42:58 -0400 Subject: [PATCH] Fix possible npes in openai response processing --- .../springframework/ai/openai/OpenAiChatModel.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java index 536420eec..65646ea29 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java @@ -31,6 +31,7 @@ import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.metadata.ChatGenerationMetadata; import org.springframework.ai.chat.metadata.ChatResponseMetadata; +import org.springframework.ai.chat.metadata.EmptyUsage; import org.springframework.ai.chat.metadata.RateLimit; import org.springframework.ai.chat.model.AbstractToolCallSupport; import org.springframework.ai.chat.model.ChatModel; @@ -163,7 +164,7 @@ public class OpenAiChatModel extends AbstractToolCallSupport implements ChatMode List generations = choices.stream().map(choice -> { // @formatter:off Map metadata = Map.of( - "id", chatCompletion.id(), + "id", chatCompletion.id() != null ? chatCompletion.id() : "", "role", choice.message().role() != null ? choice.message().role().name() : "", "finishReason", choice.finishReason() != null ? choice.finishReason().name() : ""); // @formatter:on @@ -265,12 +266,12 @@ public class OpenAiChatModel extends AbstractToolCallSupport implements ChatMode private ChatResponseMetadata from(OpenAiApi.ChatCompletion result, RateLimit rateLimit) { Assert.notNull(result, "OpenAI ChatCompletionResult must not be null"); var builder = ChatResponseMetadata.builder() - .withId(result.id()) - .withUsage(OpenAiUsage.from(result.usage())) - .withModel(result.model()) + .withId(result.id() != null ? result.id() : "") + .withUsage(result.usage() != null ? OpenAiUsage.from(result.usage()) : new EmptyUsage()) + .withModel(result.model() != null ? result.model() : "") .withRateLimit(rateLimit) - .withKeyValue("created", result.created()) - .withKeyValue("system-fingerprint", result.systemFingerprint()); + .withKeyValue("created", result.created() != null ? result.created() : 0L) + .withKeyValue("system-fingerprint", result.systemFingerprint() != null ? result.systemFingerprint() : ""); if (rateLimit != null) { builder.withRateLimit(rateLimit); }