io.github.sashirestela.openai.OpenAI Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of simple-openai Show documentation
Show all versions of simple-openai Show documentation
A Java library to use the OpenAI API in the simplest possible way.
The newest version!
package io.github.sashirestela.openai;
import io.github.sashirestela.cleverclient.annotation.Body;
import io.github.sashirestela.cleverclient.annotation.DELETE;
import io.github.sashirestela.cleverclient.annotation.GET;
import io.github.sashirestela.cleverclient.annotation.Multipart;
import io.github.sashirestela.cleverclient.annotation.POST;
import io.github.sashirestela.cleverclient.annotation.Path;
import io.github.sashirestela.cleverclient.annotation.Query;
import io.github.sashirestela.cleverclient.annotation.Resource;
import io.github.sashirestela.openai.common.DeletedObject;
import io.github.sashirestela.openai.common.Generic;
import io.github.sashirestela.openai.common.Page;
import io.github.sashirestela.openai.common.StreamOptions;
import io.github.sashirestela.openai.common.tool.ToolChoiceOption;
import io.github.sashirestela.openai.domain.audio.AudioResponseFormat;
import io.github.sashirestela.openai.domain.audio.SpeechRequest;
import io.github.sashirestela.openai.domain.audio.Transcription;
import io.github.sashirestela.openai.domain.audio.TranscriptionRequest;
import io.github.sashirestela.openai.domain.audio.TranslationRequest;
import io.github.sashirestela.openai.domain.batch.Batch;
import io.github.sashirestela.openai.domain.batch.BatchRequest;
import io.github.sashirestela.openai.domain.chat.Chat;
import io.github.sashirestela.openai.domain.chat.ChatRequest;
import io.github.sashirestela.openai.domain.completion.Completion;
import io.github.sashirestela.openai.domain.completion.CompletionRequest;
import io.github.sashirestela.openai.domain.embedding.Embedding;
import io.github.sashirestela.openai.domain.embedding.EmbeddingBase64;
import io.github.sashirestela.openai.domain.embedding.EmbeddingFloat;
import io.github.sashirestela.openai.domain.embedding.EmbeddingRequest;
import io.github.sashirestela.openai.domain.embedding.EmbeddingRequest.EncodingFormat;
import io.github.sashirestela.openai.domain.file.FileRequest;
import io.github.sashirestela.openai.domain.file.FileRequest.PurposeType;
import io.github.sashirestela.openai.domain.file.FileResponse;
import io.github.sashirestela.openai.domain.finetuning.FineTuning;
import io.github.sashirestela.openai.domain.finetuning.FineTuningCheckpoint;
import io.github.sashirestela.openai.domain.finetuning.FineTuningEvent;
import io.github.sashirestela.openai.domain.finetuning.FineTuningRequest;
import io.github.sashirestela.openai.domain.image.Image;
import io.github.sashirestela.openai.domain.image.ImageEditsRequest;
import io.github.sashirestela.openai.domain.image.ImageRequest;
import io.github.sashirestela.openai.domain.image.ImageVariationsRequest;
import io.github.sashirestela.openai.domain.model.Model;
import io.github.sashirestela.openai.domain.moderation.Moderation;
import io.github.sashirestela.openai.domain.moderation.ModerationRequest;
import io.github.sashirestela.openai.domain.upload.Upload;
import io.github.sashirestela.openai.domain.upload.UploadCompleteRequest;
import io.github.sashirestela.openai.domain.upload.UploadPart;
import io.github.sashirestela.openai.domain.upload.UploadPartRequest;
import io.github.sashirestela.openai.domain.upload.UploadRequest;
import java.io.InputStream;
import java.util.EnumSet;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
import static io.github.sashirestela.cleverclient.util.CommonUtil.isNullOrEmpty;
/**
* The OpenAI API can be applied to virtually any task that requires understanding or generating
* natural language and code. The OpenAI API can also be used to generate and edit images or convert
* speech into text.
*
* @see OpenAI API
*/
public interface OpenAI {
/**
* Turn audio into text (speech to text).
*
* @see OpenAI Audio
*/
@Resource("/v1/audio")
interface Audios {
/**
* Generates audio from the input text.
*
* @param speechRequest Includes the text to generate audio for, and audio file format among others.
* @return The audio file content.
*/
@POST("/speech")
CompletableFuture speak(@Body SpeechRequest speechRequest);
/**
* Transcribes audio into the input language as object (don't call it directly).
*
* @param audioRequest Its 'responseFormat' attribute should be: json, verbose_json. Includes the
* audio file.
* @return Transcription as an object.
*/
@Multipart
@POST("/transcriptions")
CompletableFuture transcribePrimitive(@Body TranscriptionRequest audioRequest);
/**
* Translates audio into English as object (don't call it directly).
*
* @param audioRequest Its 'responseFormat' attribute should be: json, verbose_json. Includes the
* audio file.
* @return Translation as an object.
*/
@Multipart
@POST("/translations")
CompletableFuture translatePrimitive(@Body TranslationRequest audioRequest);
/**
* Transcribes audio into the input language as plain text (don't call it directly).
*
* @param audioRequest Its 'responseFormat' attribute should be: text, srt, vtt. Includes the audio
* file.
* @return Transcription as plain text.
*/
@Multipart
@POST("/transcriptions")
CompletableFuture transcribePlainPrimitive(@Body TranscriptionRequest audioRequest);
/**
* Translates audio into English as plain text (don't call it directly).
*
* @param audioRequest Its 'responseFormat' attribute should be: text, srt, vtt. Includes the audio
* file.
* @return Translation as plain text.
*/
@Multipart
@POST("/translations")
CompletableFuture translatePlainPrimitive(@Body TranslationRequest audioRequest);
/**
* Transcribes audio into the input language as object.
*
* @param audioRequest Its 'responseFormat' attribute should be: json, verbose_json. Includes the
* audio file.
* @return Transcription as an object.
*/
default CompletableFuture transcribe(TranscriptionRequest audioRequest) {
var responseFormat = getResponseFormat(audioRequest.getResponseFormat(), AudioResponseFormat.JSON,
"transcribe");
var request = audioRequest.withResponseFormat(responseFormat);
return transcribePrimitive(request);
}
/**
* Translates audio into English as object.
*
* @param audioRequest Its 'responseFormat' attribute should be: json, verbose_json. Includes the
* audio file.
* @return Translation as an object.
*/
default CompletableFuture translate(TranslationRequest audioRequest) {
var responseFormat = getResponseFormat(audioRequest.getResponseFormat(), AudioResponseFormat.JSON,
"translate");
var request = audioRequest.withResponseFormat(responseFormat);
return translatePrimitive(request);
}
/**
* Transcribes audio into the input language as plain text.
*
* @param audioRequest Its 'responseFormat' attribute should be: text, srt, vtt. Includes the audio
* file.
* @return Transcription as plain text.
*/
default CompletableFuture transcribePlain(TranscriptionRequest audioRequest) {
var responseFormat = getResponseFormat(audioRequest.getResponseFormat(), AudioResponseFormat.TEXT,
"transcribe");
var request = audioRequest.withResponseFormat(responseFormat);
return transcribePlainPrimitive(request);
}
/**
* Translates audio into English as plain text.
*
* @param audioRequest Its 'responseFormat' attribute should be: text, srt, vtt. Includes the audio
* file.
* @return Translation as plain text.
*/
default CompletableFuture translatePlain(TranslationRequest audioRequest) {
var responseFormat = getResponseFormat(audioRequest.getResponseFormat(), AudioResponseFormat.TEXT,
"translate");
var request = audioRequest.withResponseFormat(responseFormat);
return translatePlainPrimitive(request);
}
}
/**
* Create large batches of API requests to run asynchronously.
*
* @see OpenAI Batch
*/
@Resource("/v1/batches")
interface Batches {
/**
* Creates and executes a batch from an uploaded file of requests.
*
* @param batchRequest It includes the uploade file reference.
* @return The batch object.
*/
@POST
CompletableFuture create(@Body BatchRequest batchRequest);
/**
* Retrieves a batch.
*
* @param batchId The id of the batch to retrieve.
* @return The Batch object matching the specified id.
*/
@GET("/{batchId}")
CompletableFuture getOne(@Path("batchId") String batchId);
/**
* Cancels an in-progress batch.
*
* @param batchId The id of the batch to cancel.
* @return The Batch object matching the specified id.
*/
@POST("/{batchId}/cancel")
CompletableFuture cancel(@Path("batchId") String batchId);
/**
* List your organization's batches.
*
* @param after A cursor for use in pagination. It is an object ID that defines your place in the
* list. For instance, if you make a list request and receive 100 objects, ending with
* obj_foo, your subsequent call can include after=obj_foo in order to fetch the next
* page of the list.
* @param limit A limit on the number of objects to be returned. Limit can range between 1 and 100,
* and the default is 20.
* @return A list of paginated Batch objects.
*/
@GET
CompletableFuture> getList(@Query("after") String after, @Query("limit") Integer limit);
}
/**
* Given a list of messages comprising a conversation, the model will return a response.
*
* @see OpenAI Chat
*/
@Resource("/v1/chat/completions")
interface ChatCompletions {
/**
* Creates a model response for the given chat conversation without streaming (don't call it
* directly).
*
* @param chatRequest Includes a list of messages comprising the conversation.
* @return Response is delivered as a full text when is ready.
*/
@POST
CompletableFuture createPrimitive(@Body ChatRequest chatRequest);
/**
* Creates a model response for the given chat conversation with streaming (don't call it directly).
*
* @param chatRequest Includes a list of messages comprising the conversation.
* @return Response is delivered as a continuous stream of tokens.
*/
@POST
CompletableFuture> createStreamPrimitive(@Body ChatRequest chatRequest);
/**
* Creates a model response for the given chat conversation without streaming.
*
* @param chatRequest Includes a list of messages comprising the conversation. Its 'stream'
* attribute is setted to false automatically.
* @return Response is delivered as a full text when is ready.
*/
default CompletableFuture create(@Body ChatRequest chatRequest) {
var request = updateRequest(chatRequest, Boolean.FALSE);
return createPrimitive(request);
}
/**
* Creates a model response for the given chat conversation with streaming.
*
* @param chatRequest Includes a list of messages comprising the conversation. Its 'stream'
* attribute is setted to true automatically.
* @return Response is delivered as a continuous stream of tokens.
*/
default CompletableFuture> createStream(@Body ChatRequest chatRequest) {
var request = updateRequest(chatRequest, Boolean.TRUE);
return createStreamPrimitive(request);
}
}
/**
* Given a prompt, the model will return one or more predicted completions. It is recommended for
* most users to use the Chat Completion.
*
* @see OpenAI Completion
*/
@Resource("/v1/completions")
interface Completions {
/**
* Creates a completion for the provided prompt and parameters without streaming (don't call it
* directly).
*
* @param completionRequest Includes the prompt(s) to generate completions for.
* @return Response is delivered as a full text when is ready.
*/
@POST
CompletableFuture createPrimitive(@Body CompletionRequest completionRequest);
/**
* Creates a completion for the provided prompt and parameters with streaming (don't call it
* directly).
*
* @param completionRequest Includes the prompt(s) to generate completions for.
* @return Response is delivered as a continuous flow of tokens.
*/
@POST
CompletableFuture> createStreamPrimitive(@Body CompletionRequest completionRequest);
/**
* Creates a completion for the provided prompt and parameters without streaming.
*
* @param completionRequest Includes the prompt(s) to generate completions for. Its 'stream'
* attribute is setted to false automatically.
* @return Response is delivered as a full text when is ready.
*/
default CompletableFuture create(@Body CompletionRequest completionRequest) {
var request = completionRequest.withStream(Boolean.FALSE);
return createPrimitive(request);
}
/**
* Creates a completion for the provided prompt and parameters with streaming.
*
* @param completionRequest Includes the prompt(s) to generate completions for. Its 'stream'
* attribute is setted to true automatically.
* @return Response is delivered as a continuous flow of tokens.
*/
default CompletableFuture> createStream(@Body CompletionRequest completionRequest) {
var request = completionRequest.withStream(Boolean.TRUE).withStreamOptions(StreamOptions.of(Boolean.TRUE));
return createStreamPrimitive(request);
}
}
/**
* Get a vector representation of a given input that can be easily consumed by machine learning
* models and algorithms.
*
* @see OpenAI Embedding
*/
@Resource("/v1/embeddings")
interface Embeddings {
/**
* Creates an embedding vector representing the input text (don't call it directly).
*
* @param embeddingRequest The input text to embed and the model to use.
* @return Represents an embedding vector in array of float format.
*/
@POST
CompletableFuture> createPrimitive(@Body EmbeddingRequest embeddingRequest);
/**
* Creates an embedding vector representing the input text (don't call it directly).
*
* @param embeddingRequest The input text to embed and the model to use.
* @return Represents an embedding vector in base64 format.
*/
@POST
CompletableFuture> createBase64Primitive(@Body EmbeddingRequest embeddingRequest);
/**
* Creates an embedding vector representing the input text.
*
* @param embeddingRequest The input text to embed and the model to use.
* @return Represents an embedding vector in array of float format.
*/
default CompletableFuture> create(@Body EmbeddingRequest embeddingRequest) {
var request = embeddingRequest.withEncodingFormat(EncodingFormat.FLOAT);
return createPrimitive(request);
}
/**
* Creates an embedding vector representing the input text.
*
* @param embeddingRequest The input text to embed and the model to use.
* @return Represents an embedding vector in base64 format.
*/
default CompletableFuture> createBase64(@Body EmbeddingRequest embeddingRequest) {
var request = embeddingRequest.withEncodingFormat(EncodingFormat.BASE64);
return createBase64Primitive(request);
}
}
/**
* Files are used to upload documents that can be used with features like fine-tuning.
*
* @see OpenAI Files
*/
@Resource("/v1/files")
interface Files {
/**
* Upload a file that contains document(s) to be used across various endpoints/features. Currently
* *.jsonl files are supported only.
*
* @param fileRequest Includes the file to be uploaded.
* @return Represents a document that has been uploaded.
*/
@Multipart
@POST
CompletableFuture create(@Body FileRequest fileRequest);
/**
* Returns a Generic of files that belong to the user's organization (don't call it directly).
*
* @param purpose Only return files with the given purpose.
* @return Generic object of files.
*/
@GET
CompletableFuture> getListPrimitive(@Query("purpose") PurposeType purpose);
/**
* Returns a list of files that belong to the user's organization.
*
* @param purpose Only return files with the given purpose.
* @return List of files.
*/
default CompletableFuture> getList(PurposeType purpose) {
return getListPrimitive(purpose).thenApply(Generic::getData);
}
/**
* Returns information about a specific file.
*
* @param fileId The id of the file to use for this request.
* @return Specific file.
*/
@GET("/{fileId}")
CompletableFuture getOne(@Path("fileId") String fileId);
/**
* Returns a file content.
*
* @param fileId The id of the file to use for this request.
* @return Content of specific file.
*/
@GET("/{fileId}/content")
CompletableFuture getContent(@Path("fileId") String fileId);
/**
* Returns a file content as a stream.
*
* @param fileId The id of the file to use for this request.
* @return Content of specific file.
*/
@GET("/{fileId}/content")
CompletableFuture getContentInputStream(@Path("fileId") String fileId);
/**
* Delete a file.
*
* @param fileId The id of the file to use for this request.
* @return Deletion status.
*/
@DELETE("/{fileId}")
CompletableFuture delete(@Path("fileId") String fileId);
}
/**
* Manage fine-tuning jobs to tailor a model to your specific training data.
*
* @see OpenAI Fine-Tuning
*/
@Resource("/v1/fine_tuning/jobs")
interface FineTunings {
/**
* Creates a job that fine-tunes a specified model from a given dataset.
*
* @param fineTuningRequest Includes the trainig file in format jsonl and the base model to
* fine-tune.
* @return Response includes details of the enqueued job including job status and the name of the
* fine-tuned models once complete.
*/
@POST
CompletableFuture create(@Body FineTuningRequest fineTuningRequest);
/**
* Generic of your organization's fine-tuning jobs (don't call it directly).
*
* @param limit Number of fine-tuning jobs to retrieve.
* @param after Identifier for the last job from the previous pagination request.
* @return Generic object of fine-tunings.
*/
@GET
CompletableFuture> getListPrimitive(@Query("limit") Integer limit,
@Query("after") String after);
/**
* List your organization's fine-tuning jobs.
*
* @param limit Number of fine-tuning jobs to retrieve.
* @param after Identifier for the last job from the previous pagination request.
* @return A list of paginated fine-tuning job objects.
*/
default CompletableFuture> getList(Integer limit, String after) {
return getListPrimitive(limit, after).thenApply(Generic::getData);
}
/**
* Get info about a fine-tuning job.
*
* @param fineTuningId The id of the fine-tuning job.
* @return The fine-tuning object with the given id.
*/
@GET("/{fineTuningId}")
CompletableFuture getOne(@Path("fineTuningId") String fineTuningId);
/**
* Get status updates for a fine-tuning job as Generic object (don't call it directly).
*
* @param fineTuningId The id of the fine-tuning job to get events for.
* @param limit Number of fine-tuning jobs to retrieve.
* @param after Identifier for the last job from the previous pagination request.
* @return Generic of fine-tuning event object.
*/
@GET("/{fineTuningId}/events")
CompletableFuture> getEventsPrimitive(@Path("fineTuningId") String fineTuningId,
@Query("limit") Integer limit, @Query("after") String after);
/**
* Get status updates for a fine-tuning job.
*
* @param fineTuningId The id of the fine-tuning job to get events for.
* @param limit Number of fine-tuning jobs to retrieve.
* @param after Identifier for the last job from the previous pagination request.
* @return A list of fine-tuning event objects.
*/
default CompletableFuture> getEvents(String fineTuningId, Integer limit, String after) {
return getEventsPrimitive(fineTuningId, limit, after).thenApply(Generic::getData);
}
/**
* Generic of checkpoints for a fine-tuning job (don't call it directly).
*
* @param fineTuningId The id of the fine-tuning job to get checkpoints for.
* @param limit Number of fine-tuning jobs to retrieve.
* @param after Identifier for the last job from the previous pagination request.
* @return Generic of fine-tuning checkpoint object.
*/
@GET("/{fineTuningId}/checkpoints")
CompletableFuture> getCheckpointsPrimitive(
@Path("fineTuningId") String fineTuningId,
@Query("limit") Integer limit, @Query("after") String after);
/**
* List checkpoints for a fine-tuning job.
*
* @param fineTuningId The id of the fine-tuning job to get checkpoints for.
* @param limit Number of fine-tuning jobs to retrieve.
* @param after Identifier for the last job from the previous pagination request.
* @return A list of fine-tuning checkpoint objects.
*/
default CompletableFuture> getCheckpoints(String fineTuningId, Integer limit,
String after) {
return getCheckpointsPrimitive(fineTuningId, limit, after).thenApply(Generic::getData);
}
/**
* Immediately cancel a fine-tune job.
*
* @param fineTuningId The id of the fine-tuning job to cancel.
* @return The cancelled fine-tuning object.
*/
@POST("/{fineTuningId}/cancel")
CompletableFuture cancel(@Path("fineTuningId") String fineTuningId);
}
/**
* Given a prompt and/or an input image, the model will generate a new image.
*
* @see OpenAI Image
*/
@Resource("/v1/images")
interface Images {
/**
* Creates a Genric object of image given a prompt (don't call it directly).
*
* @param imageRequest A text description of the desired image(s) and other parameters such as
* number, size or responseFormat.
* @return Returns a Generic of image objects (the url or the binary content).
*/
@POST("/generations")
CompletableFuture> createPrimitive(@Body ImageRequest imageRequest);
/**
* Creates a Generic of edited or extended image given an original image and a prompt (don't call it
* directly).
*
* @param imageRequest Includes the image file to edit and a text description of the desired
* image(s).
* @return Returns a Generic of image objects (the url or the binary content).
*/
@Multipart
@POST("/edits")
CompletableFuture> createEditsPrimitive(@Body ImageEditsRequest imageRequest);
/**
* Creates a Generic of variation of a given image (don't call it directly).
*
* @param imageRequest Includes the image file to use as the basis for the variation(s).
* @return Returns a Generic of image objects (the url or the binary content).
*/
@Multipart
@POST("/variations")
CompletableFuture> createVariationsPrimitive(@Body ImageVariationsRequest imageRequest);
/**
* Creates an image given a prompt.
*
* @param imageRequest A text description of the desired image(s) and other parameters such as
* number, size or responseFormat.
* @return Returns a list of image objects (the url or the binary content).
*/
default CompletableFuture> create(ImageRequest imageRequest) {
return createPrimitive(imageRequest).thenApply(Generic::getData);
}
/**
* Creates an edited or extended image given an original image and a prompt.
*
* @param imageRequest Includes the image file to edit and a text description of the desired
* image(s).
* @return Returns a list of image objects (the url or the binary content).
*/
default CompletableFuture> createEdits(ImageEditsRequest imageRequest) {
return createEditsPrimitive(imageRequest).thenApply(Generic::getData);
}
/**
* Creates a variation of a given image.
*
* @param imageRequest Includes the image file to use as the basis for the variation(s).
* @return Returns a list of image objects (the url or the binary content).
*/
default CompletableFuture> createVariations(ImageVariationsRequest imageRequest) {
return createVariationsPrimitive(imageRequest).thenApply(Generic::getData);
}
}
/**
* List and describe the various models available in the API.
*
* @see OpenAI Model
*/
@Resource("/v1/models")
interface Models {
/**
* Generic of the currently available models, and provides basic information about each one such as
* the owner and availability (don't call it directly).
*
* @return A Generic of model objects.
*/
@GET
CompletableFuture> getListPrimitive();
/**
* Lists the currently available models, and provides basic information about each one such as the
* owner and availability.
*
* @return A list of model objects.
*/
default CompletableFuture> getList() {
return getListPrimitive().thenApply(Generic::getData);
}
/**
* Retrieves a model instance, providing basic information about the model such as the owner and
* permissioning.
*
* @param modelId The id of the model to use for this request.
* @return The model object matching the specified id.
*/
@GET("/{modelId}")
CompletableFuture getOne(@Path("modelId") String modelId);
/**
* Delete a fine tuned model.
*
* @param modelId The id of the dine tuned model to use for this request.
* @return Deletion status.
*/
@DELETE("/{modelId}")
CompletableFuture delete(@Path("modelId") String modelId);
}
/**
* Given a input text, outputs if the model classifies it as violating OpenAI's content policy.
*
* @see OpenAI Moderation
*/
@Resource("/v1/moderations")
interface Moderations {
/**
* Classifies if text violates OpenAI's Content Policy.
*
* @param moderationRequest Includes the input text to classify and the model to be used.
* @return Response including a list of moderation objects.
*/
@POST
CompletableFuture create(@Body ModerationRequest moderationRequest);
}
/**
* Allows you to upload large files in multiple parts.
*
* @see OpenAI Upload
*/
@Resource("/v1/uploads")
interface Uploads {
/**
* Creates an intermediate Upload object that you can add Parts to.
*
* @param uploadRequest The creation request.
* @return The Upload object with status pending.
*/
@POST
CompletableFuture create(@Body UploadRequest uploadRequest);
/**
* Adds a Part to an Upload object. A Part represents a chunk of bytes from the file you are trying
* to upload.
*
* @param uploadId The ID of the Upload.
* @param uploadPartRequest The chunk of bytes for this Part.
* @return The upload Part object.
*/
@Multipart
@POST("/{uploadId}/parts")
CompletableFuture addPart(@Path("uploadId") String uploadId,
@Body UploadPartRequest uploadPartRequest);
/**
* Completes the Upload.
*
* @param uploadId The ID of the Upload.
* @param uploadCompleteRequest The request including the ordered list of Part IDs.
* @return The Upload object with status completed.
*/
@POST("/{uploadId}/complete")
CompletableFuture complete(@Path("uploadId") String uploadId,
@Body UploadCompleteRequest uploadCompleteRequest);
/**
* Cancels the Upload. No Parts may be added after an Upload is cancelled.
*
* @param uploadId The ID of the Upload.
* @return The Upload object with status cancelled.
*/
@POST("/{uploadId}/cancel")
CompletableFuture cancel(@Path("uploadId") String uploadId);
}
static AudioResponseFormat getResponseFormat(AudioResponseFormat currValue, AudioResponseFormat orDefault,
String methodName) {
final var jsonEnumSet = EnumSet.of(AudioResponseFormat.JSON, AudioResponseFormat.VERBOSE_JSON);
final var textEnumSet = EnumSet.complementOf(jsonEnumSet);
var isText = textEnumSet.contains(orDefault);
var requestedFormat = currValue;
if (requestedFormat != null) {
if (isText != textEnumSet.contains(requestedFormat)) {
throw new SimpleUncheckedException("Unexpected responseFormat for the method {0}.",
methodName, null);
}
} else {
requestedFormat = orDefault;
}
return requestedFormat;
}
static ChatRequest updateRequest(ChatRequest chatRequest, Boolean useStream) {
var updatedChatRequest = chatRequest.withStream(useStream);
if (Boolean.TRUE.equals(useStream)) {
updatedChatRequest = updatedChatRequest.withStreamOptions(StreamOptions.of(useStream));
}
if (!isNullOrEmpty(chatRequest.getTools()) && chatRequest.getToolChoice() == null) {
updatedChatRequest = updatedChatRequest.withToolChoice(ToolChoiceOption.AUTO);
}
return updatedChatRequest;
}
}