diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionClient.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionClient.java index 30982ec12..98f1b8ac7 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionClient.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionClient.java @@ -68,6 +68,11 @@ public class OpenAiAudioTranscriptionClient private final OpenAiAudioApi audioApi; + /** + * OpenAiAudioTranscriptionClient is a client class used to interact with the OpenAI + * Audio Transcription API. + * @param audioApi The OpenAiAudioApi instance to be used for making API calls. + */ public OpenAiAudioTranscriptionClient(OpenAiAudioApi audioApi) { this(audioApi, OpenAiAudioTranscriptionOptions.builder() @@ -78,6 +83,25 @@ public class OpenAiAudioTranscriptionClient RetryUtils.DEFAULT_RETRY_TEMPLATE); } + /** + * OpenAiAudioTranscriptionClient is a client class used to interact with the OpenAI + * Audio Transcription API. + * @param audioApi The OpenAiAudioApi instance to be used for making API calls. + * @param options The OpenAiAudioTranscriptionOptions instance for configuring the + * audio transcription. + */ + public OpenAiAudioTranscriptionClient(OpenAiAudioApi audioApi, OpenAiAudioTranscriptionOptions options) { + this(audioApi, options, RetryUtils.DEFAULT_RETRY_TEMPLATE); + } + + /** + * OpenAiAudioTranscriptionClient is a client class used to interact with the OpenAI + * Audio Transcription API. + * @param audioApi The OpenAiAudioApi instance to be used for making API calls. + * @param options The OpenAiAudioTranscriptionOptions instance for configuring the + * audio transcription. + * @param retryTemplate The RetryTemplate instance for retrying failed API calls. + */ public OpenAiAudioTranscriptionClient(OpenAiAudioApi audioApi, OpenAiAudioTranscriptionOptions options, RetryTemplate retryTemplate) { Assert.notNull(audioApi, "OpenAiAudioApi must not be null"); diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionOptions.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionOptions.java index 417dfac7b..0307657e6 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionOptions.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiAudioTranscriptionOptions.java @@ -38,8 +38,7 @@ public class OpenAiAudioTranscriptionOptions implements ModelOptions { private @JsonProperty("model") String model; /** - * An object specifying the format that the model must output. Setting to { "type": - * "json_object" } enables JSON mode, which guarantees the message the model generates is valid JSON. + * The format of the transcript output, in one of these options: json, text, srt, verbose_json, or vtt. */ private @JsonProperty("response_format") TranscriptResponseFormat responseFormat; diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/nav.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/nav.adoc index c10738151..7fa84af40 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/nav.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/nav.adoc @@ -2,17 +2,6 @@ * xref:concepts.adoc[AI Concepts] * xref:getting-started.adoc[Getting Started] * xref:api/index.adoc[] -** xref:api/embeddings.adoc[] -*** xref:api/embeddings/openai-embeddings.adoc[OpenAI] -*** xref:api/embeddings/ollama-embeddings.adoc[Ollama] -*** xref:api/embeddings/azure-openai-embeddings.adoc[Azure OpenAI] -*** xref:api/embeddings/postgresml-embeddings.adoc[PostgresML] -*** xref:api/embeddings/vertexai-embeddings.adoc[Google VertexAI PaLM2] -*** xref:api/bedrock.adoc[Amazon Bedrock] -**** xref:api/embeddings/bedrock-cohere-embedding.adoc[Cohere] -**** xref:api/embeddings/bedrock-titan-embedding.adoc[Titan] -*** xref:api/embeddings/onnx.adoc[Transformers (ONNX)] -*** xref:api/embeddings/mistralai-embeddings.adoc[Mistral AI] ** xref:api/chatclient.adoc[] *** xref:api/clients/openai-chat.adoc[OpenAI] **** xref:api/clients/functions/openai-chat-functions.adoc[Function Calling] @@ -31,9 +20,22 @@ ***** xref:api/clients/functions/vertexai-gemini-chat-functions.adoc[Function Calling] *** xref:api/clients/mistralai-chat.adoc[Mistral AI] **** xref:api/clients/functions/mistralai-chat-functions.adoc[Function Calling] +** xref:api/embeddings.adoc[] +*** xref:api/embeddings/openai-embeddings.adoc[OpenAI] +*** xref:api/embeddings/ollama-embeddings.adoc[Ollama] +*** xref:api/embeddings/azure-openai-embeddings.adoc[Azure OpenAI] +*** xref:api/embeddings/postgresml-embeddings.adoc[PostgresML] +*** xref:api/embeddings/vertexai-embeddings.adoc[Google VertexAI PaLM2] +*** xref:api/bedrock.adoc[Amazon Bedrock] +**** xref:api/embeddings/bedrock-cohere-embedding.adoc[Cohere] +**** xref:api/embeddings/bedrock-titan-embedding.adoc[Titan] +*** xref:api/embeddings/onnx.adoc[Transformers (ONNX)] +*** xref:api/embeddings/mistralai-embeddings.adoc[Mistral AI] ** xref:api/imageclient.adoc[] *** xref:api/clients/image/openai-image.adoc[OpenAI] *** xref:api/clients/image/stabilityai-image.adoc[Stability] +** xref:api/transcriptions.adoc[] +*** xref:api/transcriptions/openai-transcriptions.adoc[OpenAI] ** xref:api/vectordbs.adoc[] *** xref:api/vectordbs/azure.adoc[] *** xref:api/vectordbs/chroma.adoc[] diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/bedrock/bedrock-titan.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/bedrock/bedrock-titan.adoc index e7ac73435..ecb239908 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/bedrock/bedrock-titan.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/bedrock/bedrock-titan.adoc @@ -1,6 +1,6 @@ = Titan Chat -link:https://aws.amazon.com/bedrock/titan/[Amazon Titan] foundation models (FMs) provide customers with a breadth of high-performing image, multimodal, and text model choices, via a fully managed API. +link:https://aws.amazon.com/bedrock/titan/[Amazon Titan] foundation models (FMs) provide customers with a breadth of high-performing image, multimodal embeddings, and text model choices, via a fully managed API. Amazon Titan models are created by AWS and pretrained on large datasets, making them powerful, general-purpose models built to support a variety of use cases, while also supporting the responsible use of AI. Use them as is or privately customize them with your own data. diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/image/openai-image.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/image/openai-image.adoc index d4f378ba9..0fcef6cd7 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/image/openai-image.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/image/openai-image.adoc @@ -1,7 +1,7 @@ = OpenAI Image Generation -Spring AI supports ChatGPT's DALL-E, the Image generation model from OpenAI. +Spring AI supports DALL-E, the Image generation model from OpenAI. == Prerequisites @@ -41,34 +41,6 @@ TIP: Refer to the xref:getting-started.adoc#dependency-management[Dependency Man === Image Generation Properties -==== Retry Properties - -The prefix `spring.ai.retry` is used as the property prefix that lets you configure the retry mechanism for the OpenAI Image client. - -[cols="3,5,1"] -|==== -| Property | Description | Default - -| spring.ai.retry.max-attempts | Maximum number of retry attempts. | 10 -| spring.ai.retry.backoff.initial-interval | Initial sleep duration for the exponential backoff policy. | 2 sec. -| spring.ai.retry.backoff.multiplier | Backoff interval multiplier. | 5 -| spring.ai.retry.backoff.max-interval | Maximum backoff duration. | 3 min. -| spring.ai.retry.on-client-errors | If false, throw a NonTransientAiException, and do not attempt retry for `4xx` client error codes | false -| spring.ai.retry.exclude-on-http-codes | List of HTTP status codes that should not trigger a retry (e.g. to throw NonTransientAiException). | empty -|==== - -==== Connection Properties - -The prefix `spring.ai.openai` is used as the property prefix that lets you connect to OpenAI. - -[cols="3,5,1"] -|==== -| Property | Description | Default -| spring.ai.openai.base-url | The URL to connect to | https://api.openai.com -| spring.ai.openai.api-key | The API Key | - -|==== - -==== Configuration Properties The prefix `spring.ai.openai.image` is the property prefix that lets you configure the `ImageClient` implementation for OpenAI. @@ -89,13 +61,44 @@ The prefix `spring.ai.openai.image` is the property prefix that lets you configu | `spring.ai.openai.image.options.user` | A unique identifier representing your end-user, which can help OpenAI to monitor and detect abuse. | - |==== -=== Image Options [[image-options]] +==== Connection Properties + +The prefix `spring.ai.openai` is used as the property prefix that lets you connect to OpenAI. + +[cols="3,5,1"] +|==== +| Property | Description | Default +| spring.ai.openai.base-url | The URL to connect to | https://api.openai.com +| spring.ai.openai.api-key | The API Key | - +|==== + +==== Configuration Properties + + +==== Retry Properties + +The prefix `spring.ai.retry` is used as the property prefix that lets you configure the retry mechanism for the OpenAI Image client. + +[cols="3,5,1"] +|==== +| Property | Description | Default + +| spring.ai.retry.max-attempts | Maximum number of retry attempts. | 10 +| spring.ai.retry.backoff.initial-interval | Initial sleep duration for the exponential backoff policy. | 2 sec. +| spring.ai.retry.backoff.multiplier | Backoff interval multiplier. | 5 +| spring.ai.retry.backoff.max-interval | Maximum backoff duration. | 3 min. +| spring.ai.retry.on-client-errors | If false, throw a NonTransientAiException, and do not attempt retry for `4xx` client error codes | false +| spring.ai.retry.exclude-on-http-codes | List of HTTP status codes that should not trigger a retry (e.g. to throw NonTransientAiException). | empty +|==== + + +== Runtime Options [[image-options]] The https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiImageOptions.java[OpenAiImageOptions.java] provides model configurations, such as the model to use, the quality, the size, etc. On start-up, the default options can be configured with the `OpenAiImageClient(OpenAiImageApi openAiImageApi)` constructor and the `withDefaultOptions(OpenAiImageOptions defaultOptions)` method. Alternatively, use the `spring.ai.openai.image.options.*` properties described previously. -At run-time you can override the default options by adding new, request specific, options to the `ImagePrompt` call. +At runtime you can override the default options by adding new, request specific, options to the `ImagePrompt` call. For example to override the OpenAI specific options such as quality and the number of images to create, use the following code example: [source,java] diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/image/stabilityai-image.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/image/stabilityai-image.adoc index 07d5a4fe5..10bc1c98b 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/image/stabilityai-image.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/image/stabilityai-image.adoc @@ -80,7 +80,7 @@ The https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-stab On start-up, the default options can be configured with the `StabilityAiImageClient(StabilityAiApi stabilityAiApi, StabilityAiImageOptions options)` constructor. Alternatively, use the `spring.ai.openai.image.options.*` properties described previously. -At run-time you can override the default options by adding new, request specific, options to the `ImagePrompt` call. +At runtime, you can override the default options by adding new, request specific, options to the `ImagePrompt` call. For example to override the Stability AI specific options such as quality and the number of images to create, use the following code example: [source,java] diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/openai-chat.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/openai-chat.adoc index a9303495e..f97ec1249 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/openai-chat.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/openai-chat.adoc @@ -262,7 +262,7 @@ Flux streamResponse = openAiApi.chatCompletionStream( Follow the https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java[OpenAiApi.java]'s JavaDoc for further information. -==== OpenAiApi Samples +== Example Code * The link:https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/api/OpenAiApiIT.java[OpenAiApiIT.java] test provides some general examples how to use the lightweight library. * The link:https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/api/tool/OpenAiApiToolFunctionCallIT.java[OpenAiApiToolFunctionCallIT.java] test shows how to use the low-level API to call tool functions. diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/vertexai-gemini-chat.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/vertexai-gemini-chat.adoc index b519d6c17..9e0c444d3 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/vertexai-gemini-chat.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/clients/vertexai-gemini-chat.adoc @@ -1,7 +1,5 @@ = VertexAI Gemini Chat - - The https://cloud.google.com/vertex-ai/docs/generative-ai/multimodal/overview[Vertex AI Gemini API] allows developers to build generative AI applications using the Gemini model. The Vertex AI Gemini API supports multimodal prompts as input and output text or code. A multimodal model is a model that is capable of processing information from multiple modalities, including images, videos, and text. For example, you can send the model a photo of a plate of cookies and ask it to give you a recipe for those cookies. @@ -79,13 +77,13 @@ The prefix `spring.ai.vertex.ai.gemini.chat` is the property prefix that lets yo TIP: All properties prefixed with `spring.ai.vertex.ai.gemini.chat.options` can be overridden at runtime by adding a request specific <> to the `Prompt` call. -=== Chat Options [[chat-options]] +== Runtime options [[chat-options]] The https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatOptions.java[VertexAiGeminiChatOptions.java] provides model configurations, such as the temperature, the topK, etc. On start-up, the default options can be configured with the `VertexAiGeminiChatClient(api, options)` constructor or the `spring.ai.vertex.ai.chat.options.*` properties. -At run-time you can override the default options by adding new, request specific, options to the `Prompt` call. +At runtime you can override the default options by adding new, request specific, options to the `Prompt` call. For example to override the default temperature for a specific request: [source,java] @@ -101,21 +99,21 @@ ChatResponse response = chatClient.call( TIP: In addition to the model specific `VertexAiChatPaLm2Options` you can use a portable https://github.com/spring-projects/spring-ai/blob/main/spring-ai-core/src/main/java/org/springframework/ai/chat/ChatOptions.java[ChatOptions] instance, created with the https://github.com/spring-projects/spring-ai/blob/main/spring-ai-core/src/main/java/org/springframework/ai/chat/ChatOptionsBuilder.java[ChatOptionsBuilder#builder()]. -=== Function Calling +== Function Calling You can register custom Java functions with the VertexAiGeminiChatClient and have the Gemini Pro model intelligently choose to output a JSON object containing arguments to call one or many of the registered functions. This is a powerful technique to connect the LLM capabilities with external tools and APIs. Read more about xref:api/clients/functions/vertexai-gemini-chat-functions.adoc[Vertex AI Gemini Function Calling]. -=== Multimodal Example +== Multimodal Multimodality refers to a model's ability to simultaneously understand and process information from various sources, including text, images, audio, and other data formats. This paradigm represents a significant advancement in AI models. -Google's Gemini AI models support this capability by comprehending and integrating text, code, audio, images, and video. For more details, refer to the blog post [Introducing Gemini](https://blog.google/technology/ai/google-gemini-ai/#introducing-gemini). +Google's Gemini AI models support this capability by comprehending and integrating text, code, audio, images, and video. For more details, refer to the blog post https://blog.google/technology/ai/google-gemini-ai/#introducing-gemini[Introducing Gemini]. Spring AI's `Message` interface supports multimodal AI models by introducing the Media type. This type contains data and information about media attachments in messages, using Spring's `org.springframework.util.MimeType` and a `java.lang.Object` for the raw media data. -Below is a simple code example extracted from [VertexAiGeminiChatClientIT.java](https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatClientIT.java), demonstrating the combination of user text with an image. +Below is a simple code example extracted from https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatClientIT.java[VertexAiGeminiChatClientIT.java], demonstrating the combination of user text with an image. [source,java] @@ -128,7 +126,7 @@ var userMessage = new UserMessage("Explain what do you see o this picture?", ChatResponse response = chatClient.call(new Prompt(List.of(userMessage))); ---- -=== Sample Controller (Auto-configuration) +== Sample Controller https://start.spring.io/[Create] a new Spring Boot project and add the `spring-ai-vertex-ai-palm2-spring-boot-starter` to your pom (or gradle) dependencies. diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-titan-embedding.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-titan-embedding.adoc index 70c9836f0..8fbbbebd0 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-titan-embedding.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-titan-embedding.adoc @@ -1,7 +1,7 @@ = Titan Embeddings Provides Bedrock Titan Embedding client. -link:https://aws.amazon.com/bedrock/titan/[Amazon Titan] foundation models (FMs) provide customers with a breadth of high-performing image, multimodal, and text model choices, via a fully managed API. +link:https://aws.amazon.com/bedrock/titan/[Amazon Titan] foundation models (FMs) provide customers with a breadth of high-performing image, multimodal embeddings, and text model choices, via a fully managed API. Amazon Titan models are created by AWS and pretrained on large datasets, making them powerful, general-purpose models built to support a variety of use cases, while also supporting the responsible use of AI. Use them as is or privately customize them with your own data. diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/transcriptions.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/transcriptions.adoc new file mode 100644 index 000000000..703f19908 --- /dev/null +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/transcriptions.adoc @@ -0,0 +1,5 @@ +[[Transcription]] += Transcription API + +Spring AI provides support for OpenAI's Transcription API. +When additional providers for Transcription are implemented, a common `AudioTranscriptionClient` interface will be extracted. \ No newline at end of file diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/transcriptions/openai-transcriptions.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/transcriptions/openai-transcriptions.adoc new file mode 100644 index 000000000..5592aa266 --- /dev/null +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/transcriptions/openai-transcriptions.adoc @@ -0,0 +1,118 @@ +== OpenAI Transcriptions + +Spring AI supports https://platform.openai.com/docs/api-reference/audio/createTranscription[OpenAI's Transcription model]. + +== Prerequisites + + +You will need to create an API key with OpenAI to access ChatGPT models. +Create an account at https://platform.openai.com/signup[OpenAI signup page] and generate the token on the https://platform.openai.com/account/api-keys[API Keys page]. +The Spring AI project defines a configuration property named `spring.ai.openai.api-key` that you should set to the value of the `API Key` obtained from openai.com. +Exporting an environment variable is one way to set that configuration property: + + +== Auto-configuration + +Spring AI provides Spring Boot auto-configuration for the OpenAI Image Generation Client. +To enable it add the following dependency to your project's Maven `pom.xml` file: + +[source, xml] +---- + + org.springframework.ai + spring-ai-openai-spring-boot-starter + +---- + +or to your Gradle `build.gradle` build file. + +[source,groovy] +---- +dependencies { + implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter' +} +---- + +TIP: Refer to the xref:getting-started.adoc#dependency-management[Dependency Management] section to add the Spring AI BOM to your build file. + +=== Transcription Properties + +The prefix `spring.ai.openai.audio.transcription` is used as the property prefix that lets you configure the retry mechanism for the OpenAI Image client. + +[cols="3,5,2"] +|==== +| Property | Description | Default + +| spring.ai.openai.audio.transcription.options.model | ID of the model to use. Only whisper-1 (which is powered by our open source Whisper V2 model) is currently available. | whisper-1 +| spring.ai.openai.audio.transcription.options.response-format | The format of the transcript output, in one of these options: json, text, srt, verbose_json, or vtt. | json +| spring.ai.openai.audio.transcription.options.prompt | An optional text to guide the model's style or continue a previous audio segment. The prompt should match the audio language. | +| spring.ai.openai.audio.transcription.options.language | The language of the input audio. Supplying the input language in ISO-639-1 format will improve accuracy and latency. | +| spring.ai.openai.audio.transcription.options.temperature | The sampling temperature, between 0 and 1. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. If set to 0, the model will use log probability to automatically increase the temperature until certain thresholds are hit. | 0 +| spring.ai.openai.audio.transcription.options.timestamp_granularities | The timestamp granularities to populate for this transcription. response_format must be set verbose_json to use timestamp granularities. Either or both of these options are supported: word, or segment. Note: There is no additional latency for segment timestamps, but generating word timestamps incurs additional latency. | segment +|==== + +== Runtime Options [[image-options]] + +The `OpenAiAudioTranscriptionOptions` class provides the options to use when making a transcription. +On start-up, the options specified by `spring.ai.openai.audio.transcription` are used but you can override these at runtime. + +For example: + +[source,java] +---- +OpenAiAudioApi.TranscriptResponseFormat responseFormat = OpenAiAudioApi.TranscriptResponseFormat.VTT; + +OpenAiAudioTranscriptionOptions transcriptionOptions = OpenAiAudioTranscriptionOptions.builder() + .withLanguage("en") + .withPrompt("Ask not this, but ask that") + .withTemperature(0f) + .withResponseFormat(responseFormat) + .build(); +AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptionPrompt(audioFile, transcriptionOptions); +AudioTranscriptionResponse response = openAiTranscriptionClient.call(transcriptionRequest); +---- + +== Manual Configuration + +Add the `spring-ai-openai` dependency to your project's Maven `pom.xml` file: + +[source, xml] +---- + + org.springframework.ai + spring-ai-openai + +---- + +or to your Gradle `build.gradle` build file. + +[source,groovy] +---- +dependencies { + implementation 'org.springframework.ai:spring-ai-openai' +} +---- + +TIP: Refer to the xref:getting-started.adoc#dependency-management[Dependency Management] section to add the Spring AI BOM to your build file. + +Next, create a `OpenAiAudioTranscriptionClient` + +[source,java] +---- +var openAiAudioApi = new OpenAiAudioApi(System.getenv("OPENAI_API_KEY")); + +var openAiAudioTranscriptionClient = new OpenAiAudioTranscriptionClient(openAiAudioApi); + +var transcriptionOptions = OpenAiAudioTranscriptionOptions.builder() + .withResponseFormat(TranscriptResponseFormat.TEXT) + .withTemperature(0f) + .build(); + +var audioFile = new FileSystemResource("/path/to/your/resource/speech/jfk.flac"); + +AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptionPrompt(audioFile, transcriptionOptions); +AudioTranscriptionResponse response = openAiTranscriptionClient.call(transcriptionRequest); +---- + +== Example Code +* The link:https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/OpenAiTranscriptionClientIT.java[OpenAiTranscriptionClientIT.java] test provides some general examples how to use the library. \ No newline at end of file