Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions foundation-models/openai/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,11 @@
</scm>
<properties>
<project.rootdir>${project.basedir}/../../</project.rootdir>
<coverage.complexity>71%</coverage.complexity>
<coverage.complexity>70%</coverage.complexity>
<coverage.line>80%</coverage.line>
<coverage.instruction>76%</coverage.instruction>
<coverage.branch>70%</coverage.branch>
<coverage.method>76%</coverage.method>
<coverage.method>75%</coverage.method>
<coverage.class>84%</coverage.class>
</properties>
<dependencies>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.sap.ai.sdk.foundationmodels.openai;

import static lombok.AccessLevel.PUBLIC;
import static lombok.AccessLevel.PACKAGE;

import com.google.common.annotations.Beta;
import com.sap.ai.sdk.foundationmodels.openai.generated.model.ChatCompletionMessageToolCall;
import com.sap.ai.sdk.foundationmodels.openai.generated.model.ChatCompletionMessageToolCallFunction;
import com.sap.ai.sdk.foundationmodels.openai.generated.model.ChatCompletionRequestAssistantMessage;
import com.sap.ai.sdk.foundationmodels.openai.generated.model.ChatCompletionRequestAssistantMessageContent;
import com.sap.ai.sdk.foundationmodels.openai.generated.model.ToolCallType;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nonnull;
Expand All @@ -28,7 +29,7 @@
@Beta
@Value
@Accessors(fluent = true)
@AllArgsConstructor(access = PUBLIC)
@AllArgsConstructor(access = PACKAGE)
public class OpenAiAssistantMessage implements OpenAiMessage {

/** The role associated with this message. */
Expand All @@ -52,12 +53,27 @@ public class OpenAiAssistantMessage implements OpenAiMessage {
@Nonnull
List<OpenAiToolCall> toolCalls;

/**
* Creates a new assistant message with the given content and additional tool calls.
*
* @param toolCalls the additional tool calls to associate with the message.
* @return a new assistant message with the given content and additional tool calls.
* @since 1.10.0
*/
@Nonnull
public OpenAiAssistantMessage withToolCalls(
@Nonnull final List<? extends OpenAiToolCall> toolCalls) {
final List<OpenAiToolCall> newToolCalls = new ArrayList<>(this.toolCalls);
newToolCalls.addAll(toolCalls);
return new OpenAiAssistantMessage(content, newToolCalls);
}

/**
* Creates a new assistant message with the given single message as text content.
*
* @param singleMessage the message.
*/
public OpenAiAssistantMessage(@Nonnull final String singleMessage) {
OpenAiAssistantMessage(@Nonnull final String singleMessage) {
this(
new OpenAiMessageContent(List.of(new OpenAiTextItem(singleMessage))),
Collections.emptyList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.google.common.annotations.Beta;
import javax.annotation.Nonnull;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Value;

Expand All @@ -13,7 +12,7 @@
*/
@Beta
@Value
@AllArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor(access = lombok.AccessLevel.PACKAGE)
public class OpenAiFunctionCall implements OpenAiToolCall {
/** The unique identifier for the function call. */
@Nonnull String id;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
package com.sap.ai.sdk.foundationmodels.openai;

import com.google.common.annotations.Beta;
import javax.annotation.Nonnull;

/**
* Represents a tool called by an OpenAI model.
*
* @since 1.6.0
*/
@Beta
public sealed interface OpenAiToolCall permits OpenAiFunctionCall {}
public sealed interface OpenAiToolCall permits OpenAiFunctionCall {
/**
* Creates a new instance of {@link OpenAiToolCall}.
*
* @param id The unique identifier for the tool call.
* @param name The name of the tool to be called.
* @param arguments The arguments for the tool call, encoded as a JSON string.
* @return A new instance of {@link OpenAiToolCall}.
* @since 1.10.0
*/
@Nonnull
static OpenAiToolCall function(
@Nonnull final String id, @Nonnull final String name, @Nonnull final String arguments) {
return new OpenAiFunctionCall(id, name, arguments);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,10 @@

import static org.springframework.ai.model.tool.ToolCallingChatOptions.isInternalToolExecutionEnabled;

import com.sap.ai.sdk.foundationmodels.openai.OpenAiAssistantMessage;
import com.sap.ai.sdk.foundationmodels.openai.OpenAiChatCompletionRequest;
import com.sap.ai.sdk.foundationmodels.openai.OpenAiChatCompletionResponse;
import com.sap.ai.sdk.foundationmodels.openai.OpenAiClient;
import com.sap.ai.sdk.foundationmodels.openai.OpenAiFunctionCall;
import com.sap.ai.sdk.foundationmodels.openai.OpenAiMessage;
import com.sap.ai.sdk.foundationmodels.openai.OpenAiMessageContent;
import com.sap.ai.sdk.foundationmodels.openai.OpenAiTextItem;
import com.sap.ai.sdk.foundationmodels.openai.OpenAiToolCall;
import com.sap.ai.sdk.foundationmodels.openai.generated.model.ChatCompletionMessageToolCall;
import com.sap.ai.sdk.foundationmodels.openai.generated.model.ChatCompletionResponseMessage;
Expand Down Expand Up @@ -86,10 +82,9 @@ private static void addAssistantMessage(
return;
}
final Function<ToolCall, OpenAiToolCall> callTranslate =
toolCall -> new OpenAiFunctionCall(toolCall.id(), toolCall.name(), toolCall.arguments());
val content = new OpenAiMessageContent(List.of(new OpenAiTextItem(message.getText())));
toolCall -> OpenAiToolCall.function(toolCall.id(), toolCall.name(), toolCall.arguments());
val calls = message.getToolCalls().stream().map(callTranslate).toList();
result.add(new OpenAiAssistantMessage(content, calls));
result.add(OpenAiMessage.assistant(message.getText()).withToolCalls(calls));
}

private static void addToolMessages(
Expand Down