From 89700ecff1ec8e0d952bc7c77fcc3e2dd20b8a63 Mon Sep 17 00:00:00 2001 From: Tomer Aberbach Date: Wed, 12 Feb 2025 15:57:29 -0800 Subject: [PATCH] docs: function calling example (#213) --- .../example/FunctionCallingAsyncExample.java | 75 +++++++++++++++++++ .../example/FunctionCallingExample.java | 71 ++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 openai-java-example/src/main/java/com/openai/example/FunctionCallingAsyncExample.java create mode 100644 openai-java-example/src/main/java/com/openai/example/FunctionCallingExample.java diff --git a/openai-java-example/src/main/java/com/openai/example/FunctionCallingAsyncExample.java b/openai-java-example/src/main/java/com/openai/example/FunctionCallingAsyncExample.java new file mode 100644 index 0000000..6f448be --- /dev/null +++ b/openai-java-example/src/main/java/com/openai/example/FunctionCallingAsyncExample.java @@ -0,0 +1,75 @@ +package com.openai.example; + +import static com.openai.core.ObjectMappers.jsonMapper; + +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.models.*; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public final class FunctionCallingAsyncExample { + private FunctionCallingAsyncExample() {} + + public static void main(String[] args) { + // Configures using one of: + // - The `OPENAI_API_KEY` environment variable + // - The `AZURE_OPENAI_ENDPOINT` and `AZURE_OPENAI_KEY` environment variables + OpenAIClientAsync client = OpenAIOkHttpClientAsync.fromEnv(); + + ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() + .model(ChatModel.GPT_3_5_TURBO) + .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(Map.of("name", Map.of("type", "string")))) + .putAdditionalProperty("required", JsonValue.from(List.of("name"))) + .putAdditionalProperty("additionalProperties", JsonValue.from(false)) + .build()) + .build()) + .build()) + .addUserMessage("How good are the following SDKs: OpenAI Java SDK, Unknown Company SDK") + .build(); + + client.chat() + .completions() + .create(createParams) + .thenAccept(completion -> completion.choices().stream() + .map(ChatCompletion.Choice::message) + .flatMap(message -> { + message.content().ifPresent(System.out::println); + return message.toolCalls().stream().flatMap(Collection::stream); + }) + .forEach(toolCall -> System.out.println(callFunction(toolCall.function())))) + .join(); + } + + private static String callFunction(ChatCompletionMessageToolCall.Function function) { + if (!function.name().equals("get-sdk-quality")) { + 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*"; + } +} diff --git a/openai-java-example/src/main/java/com/openai/example/FunctionCallingExample.java b/openai-java-example/src/main/java/com/openai/example/FunctionCallingExample.java new file mode 100644 index 0000000..8bb2db3 --- /dev/null +++ b/openai-java-example/src/main/java/com/openai/example/FunctionCallingExample.java @@ -0,0 +1,71 @@ +package com.openai.example; + +import static com.openai.core.ObjectMappers.jsonMapper; + +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.models.*; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public final class FunctionCallingExample { + private FunctionCallingExample() {} + + public static void main(String[] args) { + // Configures using one of: + // - The `OPENAI_API_KEY` environment variable + // - The `AZURE_OPENAI_ENDPOINT` and `AZURE_OPENAI_KEY` environment variables + OpenAIClient client = OpenAIOkHttpClient.fromEnv(); + + ChatCompletionCreateParams createParams = ChatCompletionCreateParams.builder() + .model(ChatModel.GPT_3_5_TURBO) + .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(Map.of("name", Map.of("type", "string")))) + .putAdditionalProperty("required", JsonValue.from(List.of("name"))) + .putAdditionalProperty("additionalProperties", JsonValue.from(false)) + .build()) + .build()) + .build()) + .addUserMessage("How good are the following SDKs: OpenAI Java SDK, Unknown Company SDK") + .build(); + + client.chat().completions().create(createParams).choices().stream() + .map(ChatCompletion.Choice::message) + .flatMap(message -> { + message.content().ifPresent(System.out::println); + return message.toolCalls().stream().flatMap(Collection::stream); + }) + .forEach(toolCall -> System.out.println(callFunction(toolCall.function()))); + } + + private static String callFunction(ChatCompletionMessageToolCall.Function function) { + if (!function.name().equals("get-sdk-quality")) { + 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*"; + } +}