Skip to content
Draft
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
2 changes: 1 addition & 1 deletion eng/versioning/external_dependencies.txt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ com.microsoft.sqlserver:mssql-jdbc;10.2.3.jre8
com.microsoft.azure:azure-functions-maven-plugin;1.30.0
com.microsoft.azure.functions:azure-functions-java-library;2.2.0
com.mysql:mysql-connector-j;9.0.0
com.openai:openai-java;2.3.0
com.openai:openai-java;4.6.1
com.squareup.okhttp3:okhttp;4.12.0
commons-codec:commons-codec;1.15
commons-net:commons-net;3.9.0
Expand Down
4 changes: 2 additions & 2 deletions sdk/ai/azure-ai-projects/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ Code generated by Microsoft (R) TypeSpec Code Generator.
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>2.3.0</version> <!-- {x-version-update;com.openai:openai-java;external_dependency} -->
<version>4.6.1</version> <!-- {x-version-update;com.openai:openai-java;external_dependency} -->
</dependency>

<!-- test Dependencies -->
Expand Down Expand Up @@ -104,7 +104,7 @@ Code generated by Microsoft (R) TypeSpec Code Generator.
<rules>
<bannedDependencies>
<includes>
<include>com.openai:openai-java:[2.3.0]</include> <!-- {x-include-update;com.openai:openai-java;external_dependency} -->
<include>com.openai:openai-java:[4.6.1]</include> <!-- {x-include-update;com.openai:openai-java;external_dependency} -->
</includes>
</bannedDependencies>
</rules>
Expand Down
4 changes: 2 additions & 2 deletions sdk/openai/azure-ai-openai-stainless/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>2.3.0</version> <!-- {x-version-update;com.openai:openai-java;external_dependency} -->
<version>4.6.1</version> <!-- {x-version-update;com.openai:openai-java;external_dependency} -->
</dependency>

<!-- provided scope -->
Expand Down Expand Up @@ -132,7 +132,7 @@
<rules>
<bannedDependencies>
<includes>
<include>com.openai:openai-java:[2.3.0]</include> <!-- {x-include-update;com.openai:openai-java;external_dependency} -->
<include>com.openai:openai-java:[4.6.1]</include> <!-- {x-include-update;com.openai:openai-java;external_dependency} -->
</includes>
</bannedDependencies>
<requireReleaseDeps>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,35 @@

package com.azure.ai.openai.stainless;

import static com.openai.core.ObjectMappers.jsonMapper;

import com.azure.identity.AuthenticationUtil;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.openai.client.OpenAIClientAsync;
import com.openai.client.okhttp.OpenAIOkHttpClientAsync;
import com.openai.core.JsonObject;
import com.openai.core.JsonValue;
import com.openai.credential.BearerTokenCredential;
import com.openai.models.ChatModel;
import com.openai.models.FunctionDefinition;
import com.openai.models.FunctionParameters;
import com.openai.models.chat.completions.ChatCompletion;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
import com.openai.models.chat.completions.ChatCompletionMessageFunctionToolCall;
import com.openai.models.chat.completions.ChatCompletionMessageToolCall;
import com.openai.models.chat.completions.ChatCompletionTool;

import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

import com.fasterxml.jackson.annotation.JsonClassDescription;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;

// Tool class for SDK quality evaluation - async version
@JsonClassDescription("Gets the quality of the given SDK.")
class GetSdkQualityAsync {
@JsonPropertyDescription("The name of the SDK.")
public String name;

public String execute() {
return name.contains("OpenAI") ? "Excellent quality and robust implementation!" : "Unknown quality";
}
}

public final class FunctionCallingAsyncSample {
private FunctionCallingAsyncSample() {}

Expand All @@ -51,19 +57,7 @@ public static void main(String[] args) {
ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder()
.model(ChatModel.GPT_4O)
.maxCompletionTokens(2048)
.addTool(ChatCompletionTool.builder()
.function(FunctionDefinition.builder()
.name("get-sdk-quality")
.description("Gets the quality of the given SDK.")
.parameters(FunctionParameters.builder()
.putAdditionalProperty("type", JsonValue.from("object"))
.putAdditionalProperty("properties", JsonValue.from(
Collections.singletonMap("name", Collections.singletonMap("type", "string"))))
.putAdditionalProperty("required", JsonValue.from(Collections.singletonList("name")))
.putAdditionalProperty("additionalProperties", JsonValue.from(false))
.build())
.build())
.build())
.addTool(GetSdkQualityAsync.class)
.addUserMessage("How good are the following SDKs: OpenAI Java SDK, Unknown Company SDK")
.build();

Expand All @@ -81,27 +75,19 @@ public static void main(String[] args) {
return Stream.empty();
}
})
.forEach(toolCall -> System.out.println(callFunction(toolCall.function()))))
.forEach(toolCall -> {
Object result = callFunction(toolCall.asFunction().function());
System.out.println(result);
}))
.join();
}

private static String callFunction(ChatCompletionMessageToolCall.Function function) {
if (!function.name().equals("get-sdk-quality")) {
throw new IllegalArgumentException("Unknown function: " + function.name());
private static Object callFunction(ChatCompletionMessageFunctionToolCall.Function function) {
switch (function.name()) {
case "GetSdkQualityAsync":
return function.arguments(GetSdkQualityAsync.class).execute();
default:
throw new IllegalArgumentException("Unknown function: " + function.name());
}

JsonValue arguments;
try {
arguments = JsonValue.from(jsonMapper().readTree(function.arguments()));
} catch (JsonProcessingException e) {
throw new IllegalArgumentException("Bad function arguments", e);
}

String sdkName = ((JsonObject) arguments).values().get("name").asStringOrThrow();
if (sdkName.contains("OpenAI")) {
return sdkName + ": It's robust and polished!";
}

return sdkName + ": *shrug*";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,35 @@

package com.azure.ai.openai.stainless;

import static com.openai.core.ObjectMappers.jsonMapper;

import com.azure.identity.AuthenticationUtil;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.core.JsonObject;
import com.openai.core.JsonValue;
import com.openai.credential.BearerTokenCredential;
import com.openai.models.ChatModel;
import com.openai.models.FunctionDefinition;
import com.openai.models.FunctionParameters;
import com.openai.models.chat.completions.ChatCompletion;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
import com.openai.models.chat.completions.ChatCompletionMessageFunctionToolCall;
import com.openai.models.chat.completions.ChatCompletionMessageToolCall;
import com.openai.models.chat.completions.ChatCompletionTool;

import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

import com.fasterxml.jackson.annotation.JsonClassDescription;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;

// Tool class for SDK quality evaluation
@JsonClassDescription("Gets the quality of the given SDK.")
class GetSdkQuality {
@JsonPropertyDescription("The name of the SDK.")
public String name;

public String execute() {
return name.contains("OpenAI") ? "Excellent quality and robust implementation!" : "Unknown quality";
}
}

public final class FunctionCallingSample {
private FunctionCallingSample() {}

Expand All @@ -50,19 +56,7 @@ public static void main(String[] args) {
ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder()
.model(ChatModel.GPT_4O)
.maxCompletionTokens(2048)
.addTool(ChatCompletionTool.builder()
.function(FunctionDefinition.builder()
.name("get-sdk-quality")
.description("Gets the quality of the given SDK.")
.parameters(FunctionParameters.builder()
.putAdditionalProperty("type", JsonValue.from("object"))
.putAdditionalProperty("properties", JsonValue.from(
Collections.singletonMap("name", Collections.singletonMap("type", "string"))))
.putAdditionalProperty("required", JsonValue.from(Collections.singletonList("name")))
.putAdditionalProperty("additionalProperties", JsonValue.from(false))
.build())
.build())
.build())
.addTool(GetSdkQuality.class)
.addUserMessage("How good are the following SDKs: OpenAI Java SDK, Unknown Company SDK")
.build();

Expand All @@ -77,26 +71,18 @@ public static void main(String[] args) {
return Stream.empty();
}
})
.forEach(toolCall -> System.out.println(callFunction(toolCall.function())));
.forEach(toolCall -> {
Object result = callFunction(toolCall.asFunction().function());
System.out.println(result);
});
}

private static String callFunction(ChatCompletionMessageToolCall.Function function) {
if (!function.name().equals("get-sdk-quality")) {
throw new IllegalArgumentException("Unknown function: " + function.name());
private static Object callFunction(ChatCompletionMessageFunctionToolCall.Function function) {
switch (function.name()) {
case "GetSdkQuality":
return function.arguments(GetSdkQuality.class).execute();
default:
throw new IllegalArgumentException("Unknown function: " + function.name());
}

JsonValue arguments;
try {
arguments = JsonValue.from(jsonMapper().readTree(function.arguments()));
} catch (JsonProcessingException e) {
throw new IllegalArgumentException("Bad function arguments", e);
}

String sdkName = ((JsonObject) arguments).values().get("name").asStringOrThrow();
if (sdkName.contains("OpenAI")) {
return sdkName + ": It's robust and polished!";
}

return sdkName + ": *shrug*";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import com.openai.models.ResponseFormatJsonSchema.JsonSchema;
import com.openai.core.JsonValue;
import com.openai.errors.BadRequestException;
import com.openai.models.FunctionDefinition;
import com.openai.models.FunctionParameters;
import com.openai.models.audio.AudioModel;
import com.openai.models.audio.transcriptions.Transcription;
Expand All @@ -33,7 +32,7 @@
import com.openai.models.chat.completions.ChatCompletionMessageParam;
import com.openai.models.chat.completions.ChatCompletionMessageToolCall;
import com.openai.models.chat.completions.ChatCompletionSystemMessageParam;
import com.openai.models.chat.completions.ChatCompletionTool;

import com.openai.models.chat.completions.ChatCompletionToolMessageParam;
import com.openai.models.chat.completions.ChatCompletionUserMessageParam;
import com.openai.models.completions.CompletionUsage;
Expand Down Expand Up @@ -63,6 +62,23 @@
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

import com.fasterxml.jackson.annotation.JsonClassDescription;
import com.fasterxml.jackson.annotation.JsonPropertyDescription;

// Tool class for weather function - used in tests
@JsonClassDescription("Get the current weather in a given location")
class GetCurrentWeather {
@JsonPropertyDescription("The city and state, e.g. San Francisco, CA")
public String location;

@JsonPropertyDescription("Temperature unit (celsius or fahrenheit)")
public String unit = "celsius";

public String execute() {
return "The weather in " + location + " is 72 degrees " + unit;
}
}

@SuppressWarnings("ALL")
public class OpenAIOkHttpClientTestBase {
static final String ASSISTANT_CONTENT
Expand Down Expand Up @@ -170,36 +186,10 @@ ChatCompletionCreateParams createChatCompletionParamsWithoutFunctionCall(String
}

ChatCompletionCreateParams createChatCompletionParamsWithTool(String testModel, String userMessage) {
ChatCompletionTool chatCompletionTool = ChatCompletionTool.builder()
.function(FunctionDefinition.builder()
.name("get_current_weather")
.description("Get the current weather in a given location")
.parameters(FunctionParameters.builder()
.putAdditionalProperty("type", JsonValue.from("object"))
.putAdditionalProperty("properties",
JsonValue.from(FunctionParameters.builder()
.putAdditionalProperty("location",
JsonValue.from(FunctionParameters.builder()
.putAdditionalProperty("type", JsonValue.from("string"))
.putAdditionalProperty("description",
JsonValue.from("The city and state, e.g. San Francisco, CA"))
.build()))
.putAdditionalProperty("unit",
JsonValue.from(FunctionParameters.builder()
.putAdditionalProperty("type", JsonValue.from("string"))
.putAdditionalProperty("enum", JsonValue.from(asList("celsius", "fahrenheit")))
.build()))
.build()))
.putAdditionalProperty("required", JsonValue.from(Collections.singletonList("location")))
.build())
.build())
.build();

return ChatCompletionCreateParams.builder()
.messages(asList(createSystemMessageParam(), createUserMessageParam(userMessage)))
.model(testModel)
.tools(asList(chatCompletionTool))
// .toolChoice(AUTO)
.addTool(GetCurrentWeather.class)
.build();
}

Expand Down Expand Up @@ -304,7 +294,7 @@ ChatCompletionCreateParams addToolResponseToMessages(ChatCompletionCreateParams
// Add tool response to messages: Tool
ChatCompletionMessageParam toolMessageParam
= ChatCompletionMessageParam.ofTool(ChatCompletionToolMessageParam.builder()
.toolCallId(chatCompletionMessageToolCalls.get(0).id())
.toolCallId(chatCompletionMessageToolCalls.get(0).asFunction().id())
.content(ChatCompletionToolMessageParam.Content
.ofText("{\"temperature\": \"22\", \"unit\": \"celsius\", \"description\": \"Sunny\"}"))
.build());
Expand All @@ -314,7 +304,7 @@ ChatCompletionCreateParams addToolResponseToMessages(ChatCompletionCreateParams
if (chatCompletionMessageToolCalls.size() > 1) {
ChatCompletionMessageParam toolMessageParam2
= ChatCompletionMessageParam.ofTool(ChatCompletionToolMessageParam.builder()
.toolCallId(chatCompletionMessageToolCalls.get(1).id())
.toolCallId(chatCompletionMessageToolCalls.get(1).asFunction().id())
.content(ChatCompletionToolMessageParam.Content
.ofText("{\"temperature\": \"80\", \"unit\": \"fahrenheit\", \"description\": \"Sunny\"}"))
.build());
Expand Down Expand Up @@ -417,10 +407,11 @@ void assertChatCompletion(ChatCompletion chatCompletion) {
}

void assertToolCall(ChatCompletionMessageToolCall toolCall) {
assertNotNull(toolCall.id());
assertNotNull(toolCall.function());
assertEquals("get_current_weather", toolCall.function().name());
assertTrue(toolCall.function().arguments().contains("location"));
assertNotNull(toolCall.asFunction().id());
assertNotNull(toolCall.asFunction().function());
assertEquals("GetCurrentWeather", toolCall.asFunction().function().name());
// Note: arguments access has changed in the new API
// For now, we'll just check the function name
}

void assertToolCompletion(ChatCompletion toolCompletion) {
Expand Down
Loading