diff --git a/.vscode/cspell.json b/.vscode/cspell.json index 00396b171619..7d894cc6dc5b 100644 --- a/.vscode/cspell.json +++ b/.vscode/cspell.json @@ -874,10 +874,16 @@ "filename": "/sdk/ai/azure-ai-voicelive/**", "words": [ "Dexec", + "filler", + "FILLER", + "foundry", + "FOUNDRY", "viseme", "VISEME", "webrtc", - "WEBRTC" + "WEBRTC", + "xhigh", + "XHIGH" ] }, { diff --git a/sdk/ai/azure-ai-voicelive/CHANGELOG.md b/sdk/ai/azure-ai-voicelive/CHANGELOG.md index 0f0827d6483a..1a8be82ee2a1 100644 --- a/sdk/ai/azure-ai-voicelive/CHANGELOG.md +++ b/sdk/ai/azure-ai-voicelive/CHANGELOG.md @@ -12,11 +12,35 @@ - Added `startSession(String model, VoiceLiveRequestOptions requestOptions)` for model with custom options - Added `startSession(VoiceLiveRequestOptions requestOptions)` for custom options without explicit model parameter - Original `startSession(String model)` and `startSession()` methods preserved for backward compatibility +- Added Foundry Agent tool support: + - `FoundryAgentTool` for integrating Foundry agents as tools in VoiceLive sessions + - `FoundryAgentContextType` enum for configuring agent context (no_context, agent_context) + - `ResponseFoundryAgentCallItem` for tracking Foundry agent call responses + - Foundry agent call lifecycle events: `ServerEventResponseFoundryAgentCallArgumentsDelta`, `ServerEventResponseFoundryAgentCallArgumentsDone`, `ServerEventResponseFoundryAgentCallInProgress`, `ServerEventResponseFoundryAgentCallCompleted`, `ServerEventResponseFoundryAgentCallFailed` + - `ItemType.FOUNDRY_AGENT_CALL` and `ToolType.FOUNDRY_AGENT` discriminator values +- Added filler response configuration for handling latency and tool calls: + - `FillerResponseConfigBase` base class for filler response configurations + - `BasicFillerResponseConfig` for static/random text filler responses + - `LlmFillerResponseConfig` for LLM-generated context-aware filler responses + - `FillerResponseConfigType` enum (static_filler, llm_filler) + - `FillerTrigger` enum for trigger conditions (latency, tool) + - Added `fillerResponse` property to `VoiceLiveSessionOptions` and `VoiceLiveSessionResponse` +- Added reasoning effort configuration for reasoning models: + - `ReasoningEffort` enum with levels: none, minimal, low, medium, high, xhigh + - Added `reasoningEffort` property to `VoiceLiveSessionOptions`, `VoiceLiveSessionResponse`, and `ResponseCreateParams` +- Added metadata support: + - Added `metadata` property to `ResponseCreateParams` and `SessionResponse` for attaching key-value pairs +- Added custom text normalization URL support for Azure voices: + - Added `customTextNormalizationUrl` property to `AzureCustomVoice`, `AzurePersonalVoice`, and `AzureStandardVoice` ### Breaking Changes ### Bugs Fixed +- Fixed `OutputAudioFormat` enum values from dash-separated to underscore-separated: + - `pcm16-8000hz` → `pcm16_8000hz` + - `pcm16-16000hz` → `pcm16_16000hz` + ### Other Changes ## 1.0.0-beta.3 (2025-12-03) diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzureCustomVoice.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzureCustomVoice.java index c968dc17f0e0..885fb6de560b 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzureCustomVoice.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzureCustomVoice.java @@ -314,6 +314,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); jsonWriter.writeNumberField("temperature", this.temperature); jsonWriter.writeStringField("custom_lexicon_url", this.customLexiconUri); + jsonWriter.writeStringField("custom_text_normalization_url", this.customTextNormalizationUrl); jsonWriter.writeArrayField("prefer_locales", this.preferLocales, (writer, element) -> writer.writeString(element)); jsonWriter.writeStringField("locale", this.locale); @@ -341,6 +342,7 @@ public static AzureCustomVoice fromJson(JsonReader jsonReader) throws IOExceptio AzureVoiceType type = AzureVoiceType.AZURE_CUSTOM; Double temperature = null; String customLexiconUri = null; + String customTextNormalizationUrl = null; List preferLocales = null; String locale = null; String style = null; @@ -360,6 +362,8 @@ public static AzureCustomVoice fromJson(JsonReader jsonReader) throws IOExceptio temperature = reader.getNullable(JsonReader::getDouble); } else if ("custom_lexicon_url".equals(fieldName)) { customLexiconUri = reader.getString(); + } else if ("custom_text_normalization_url".equals(fieldName)) { + customTextNormalizationUrl = reader.getString(); } else if ("prefer_locales".equals(fieldName)) { preferLocales = reader.readArray(reader1 -> reader1.getString()); } else if ("locale".equals(fieldName)) { @@ -380,6 +384,7 @@ public static AzureCustomVoice fromJson(JsonReader jsonReader) throws IOExceptio deserializedAzureCustomVoice.type = type; deserializedAzureCustomVoice.temperature = temperature; deserializedAzureCustomVoice.customLexiconUri = customLexiconUri; + deserializedAzureCustomVoice.customTextNormalizationUrl = customTextNormalizationUrl; deserializedAzureCustomVoice.preferLocales = preferLocales; deserializedAzureCustomVoice.locale = locale; deserializedAzureCustomVoice.style = style; @@ -389,4 +394,32 @@ public static AzureCustomVoice fromJson(JsonReader jsonReader) throws IOExceptio return deserializedAzureCustomVoice; }); } + + /* + * The custom_text_normalization_url property. + */ + @Generated + private String customTextNormalizationUrl; + + /** + * Get the customTextNormalizationUrl property: The custom_text_normalization_url property. + * + * @return the customTextNormalizationUrl value. + */ + @Generated + public String getCustomTextNormalizationUrl() { + return this.customTextNormalizationUrl; + } + + /** + * Set the customTextNormalizationUrl property: The custom_text_normalization_url property. + * + * @param customTextNormalizationUrl the customTextNormalizationUrl value to set. + * @return the AzureCustomVoice object itself. + */ + @Generated + public AzureCustomVoice setCustomTextNormalizationUrl(String customTextNormalizationUrl) { + this.customTextNormalizationUrl = customTextNormalizationUrl; + return this; + } } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzurePersonalVoice.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzurePersonalVoice.java index e174a11111b3..ae49f535dc08 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzurePersonalVoice.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzurePersonalVoice.java @@ -118,6 +118,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); jsonWriter.writeNumberField("temperature", this.temperature); jsonWriter.writeStringField("custom_lexicon_url", this.customLexiconUrl); + jsonWriter.writeStringField("custom_text_normalization_url", this.customTextNormalizationUrl); jsonWriter.writeArrayField("prefer_locales", this.preferLocales, (writer, element) -> writer.writeString(element)); jsonWriter.writeStringField("locale", this.locale); @@ -145,6 +146,7 @@ public static AzurePersonalVoice fromJson(JsonReader jsonReader) throws IOExcept AzureVoiceType type = AzureVoiceType.AZURE_PERSONAL; Double temperature = null; String customLexiconUrl = null; + String customTextNormalizationUrl = null; List preferLocales = null; String locale = null; String style = null; @@ -164,6 +166,8 @@ public static AzurePersonalVoice fromJson(JsonReader jsonReader) throws IOExcept temperature = reader.getNullable(JsonReader::getDouble); } else if ("custom_lexicon_url".equals(fieldName)) { customLexiconUrl = reader.getString(); + } else if ("custom_text_normalization_url".equals(fieldName)) { + customTextNormalizationUrl = reader.getString(); } else if ("prefer_locales".equals(fieldName)) { preferLocales = reader.readArray(reader1 -> reader1.getString()); } else if ("locale".equals(fieldName)) { @@ -184,6 +188,7 @@ public static AzurePersonalVoice fromJson(JsonReader jsonReader) throws IOExcept deserializedAzurePersonalVoice.type = type; deserializedAzurePersonalVoice.temperature = temperature; deserializedAzurePersonalVoice.customLexiconUrl = customLexiconUrl; + deserializedAzurePersonalVoice.customTextNormalizationUrl = customTextNormalizationUrl; deserializedAzurePersonalVoice.preferLocales = preferLocales; deserializedAzurePersonalVoice.locale = locale; deserializedAzurePersonalVoice.style = style; @@ -389,4 +394,32 @@ public AzurePersonalVoice setVolume(String volume) { this.volume = volume; return this; } + + /* + * The custom_text_normalization_url property. + */ + @Generated + private String customTextNormalizationUrl; + + /** + * Get the customTextNormalizationUrl property: The custom_text_normalization_url property. + * + * @return the customTextNormalizationUrl value. + */ + @Generated + public String getCustomTextNormalizationUrl() { + return this.customTextNormalizationUrl; + } + + /** + * Set the customTextNormalizationUrl property: The custom_text_normalization_url property. + * + * @param customTextNormalizationUrl the customTextNormalizationUrl value to set. + * @return the AzurePersonalVoice object itself. + */ + @Generated + public AzurePersonalVoice setCustomTextNormalizationUrl(String customTextNormalizationUrl) { + this.customTextNormalizationUrl = customTextNormalizationUrl; + return this; + } } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzureStandardVoice.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzureStandardVoice.java index 595f06b9a9f1..8d30d23c0674 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzureStandardVoice.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/AzureStandardVoice.java @@ -295,6 +295,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); jsonWriter.writeNumberField("temperature", this.temperature); jsonWriter.writeStringField("custom_lexicon_url", this.customLexiconUrl); + jsonWriter.writeStringField("custom_text_normalization_url", this.customTextNormalizationUrl); jsonWriter.writeArrayField("prefer_locales", this.preferLocales, (writer, element) -> writer.writeString(element)); jsonWriter.writeStringField("locale", this.locale); @@ -321,6 +322,7 @@ public static AzureStandardVoice fromJson(JsonReader jsonReader) throws IOExcept AzureVoiceType type = AzureVoiceType.AZURE_STANDARD; Double temperature = null; String customLexiconUrl = null; + String customTextNormalizationUrl = null; List preferLocales = null; String locale = null; String style = null; @@ -338,6 +340,8 @@ public static AzureStandardVoice fromJson(JsonReader jsonReader) throws IOExcept temperature = reader.getNullable(JsonReader::getDouble); } else if ("custom_lexicon_url".equals(fieldName)) { customLexiconUrl = reader.getString(); + } else if ("custom_text_normalization_url".equals(fieldName)) { + customTextNormalizationUrl = reader.getString(); } else if ("prefer_locales".equals(fieldName)) { preferLocales = reader.readArray(reader1 -> reader1.getString()); } else if ("locale".equals(fieldName)) { @@ -358,6 +362,7 @@ public static AzureStandardVoice fromJson(JsonReader jsonReader) throws IOExcept deserializedAzureStandardVoice.type = type; deserializedAzureStandardVoice.temperature = temperature; deserializedAzureStandardVoice.customLexiconUrl = customLexiconUrl; + deserializedAzureStandardVoice.customTextNormalizationUrl = customTextNormalizationUrl; deserializedAzureStandardVoice.preferLocales = preferLocales; deserializedAzureStandardVoice.locale = locale; deserializedAzureStandardVoice.style = style; @@ -367,4 +372,32 @@ public static AzureStandardVoice fromJson(JsonReader jsonReader) throws IOExcept return deserializedAzureStandardVoice; }); } + + /* + * The custom_text_normalization_url property. + */ + @Generated + private String customTextNormalizationUrl; + + /** + * Get the customTextNormalizationUrl property: The custom_text_normalization_url property. + * + * @return the customTextNormalizationUrl value. + */ + @Generated + public String getCustomTextNormalizationUrl() { + return this.customTextNormalizationUrl; + } + + /** + * Set the customTextNormalizationUrl property: The custom_text_normalization_url property. + * + * @param customTextNormalizationUrl the customTextNormalizationUrl value to set. + * @return the AzureStandardVoice object itself. + */ + @Generated + public AzureStandardVoice setCustomTextNormalizationUrl(String customTextNormalizationUrl) { + this.customTextNormalizationUrl = customTextNormalizationUrl; + return this; + } } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/BasicFillerResponseConfig.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/BasicFillerResponseConfig.java new file mode 100644 index 000000000000..c98150cdd7bd --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/BasicFillerResponseConfig.java @@ -0,0 +1,142 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; +import java.util.List; + +/** + * Configuration for basic/static filler response generation. + * Randomly selects from configured texts when any trigger condition is met. + */ +@Fluent +public final class BasicFillerResponseConfig extends FillerResponseConfigBase { + + /* + * The type of filler response configuration. + */ + @Generated + private FillerResponseConfigType type = FillerResponseConfigType.STATIC_FILLER; + + /* + * List of filler text options to randomly select from. + */ + @Generated + private List texts; + + /** + * Creates an instance of BasicFillerResponseConfig class. + */ + @Generated + public BasicFillerResponseConfig() { + } + + /** + * Get the type property: The type of filler response configuration. + * + * @return the type value. + */ + @Generated + @Override + public FillerResponseConfigType getType() { + return this.type; + } + + /** + * Get the texts property: List of filler text options to randomly select from. + * + * @return the texts value. + */ + @Generated + public List getTexts() { + return this.texts; + } + + /** + * Set the texts property: List of filler text options to randomly select from. + * + * @param texts the texts value to set. + * @return the BasicFillerResponseConfig object itself. + */ + @Generated + public BasicFillerResponseConfig setTexts(List texts) { + this.texts = texts; + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public BasicFillerResponseConfig setTriggers(List triggers) { + super.setTriggers(triggers); + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public BasicFillerResponseConfig setLatencyThresholdMs(Integer latencyThresholdMs) { + super.setLatencyThresholdMs(latencyThresholdMs); + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeArrayField("triggers", getTriggers(), + (writer, element) -> writer.writeString(element == null ? null : element.toString())); + jsonWriter.writeNumberField("latency_threshold_ms", getLatencyThresholdMs()); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + jsonWriter.writeArrayField("texts", this.texts, (writer, element) -> writer.writeString(element)); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of BasicFillerResponseConfig from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of BasicFillerResponseConfig if the JsonReader was pointing to an instance of it, or null if + * it was pointing to JSON null. + * @throws IOException If an error occurs while reading the BasicFillerResponseConfig. + */ + @Generated + public static BasicFillerResponseConfig fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + BasicFillerResponseConfig deserializedBasicFillerResponseConfig = new BasicFillerResponseConfig(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("triggers".equals(fieldName)) { + List triggers + = reader.readArray(reader1 -> FillerTrigger.fromString(reader1.getString())); + deserializedBasicFillerResponseConfig.setTriggers(triggers); + } else if ("latency_threshold_ms".equals(fieldName)) { + deserializedBasicFillerResponseConfig.setLatencyThresholdMs(reader.getNullable(JsonReader::getInt)); + } else if ("type".equals(fieldName)) { + deserializedBasicFillerResponseConfig.type + = FillerResponseConfigType.fromString(reader.getString()); + } else if ("texts".equals(fieldName)) { + List texts = reader.readArray(reader1 -> reader1.getString()); + deserializedBasicFillerResponseConfig.texts = texts; + } else { + reader.skipChildren(); + } + } + return deserializedBasicFillerResponseConfig; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FillerResponseConfigBase.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FillerResponseConfigBase.java new file mode 100644 index 000000000000..fd4ef5501d5b --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FillerResponseConfigBase.java @@ -0,0 +1,180 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.json.JsonReader; +import com.azure.json.JsonSerializable; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; +import java.util.List; + +/** + * Base model for filler response configuration. + */ +@Fluent +public class FillerResponseConfigBase implements JsonSerializable { + + /* + * The type of filler response configuration. + */ + @Generated + private FillerResponseConfigType type = FillerResponseConfigType.fromString("FillerResponseConfigBase"); + + /* + * List of triggers that can fire the filler. Any trigger can activate the filler (OR logic). + * Supported: 'latency', 'tool'. + */ + @Generated + private List triggers; + + /* + * Latency threshold in milliseconds before triggering filler response. Default is 2000ms. + */ + @Generated + private Integer latencyThresholdMs; + + /** + * Creates an instance of FillerResponseConfigBase class. + */ + @Generated + public FillerResponseConfigBase() { + } + + /** + * Get the type property: The type of filler response configuration. + * + * @return the type value. + */ + @Generated + public FillerResponseConfigType getType() { + return this.type; + } + + /** + * Get the triggers property: List of triggers that can fire the filler. Any trigger can activate the filler (OR + * logic). + * Supported: 'latency', 'tool'. + * + * @return the triggers value. + */ + @Generated + public List getTriggers() { + return this.triggers; + } + + /** + * Set the triggers property: List of triggers that can fire the filler. Any trigger can activate the filler (OR + * logic). + * Supported: 'latency', 'tool'. + * + * @param triggers the triggers value to set. + * @return the FillerResponseConfigBase object itself. + */ + @Generated + public FillerResponseConfigBase setTriggers(List triggers) { + this.triggers = triggers; + return this; + } + + /** + * Get the latencyThresholdMs property: Latency threshold in milliseconds before triggering filler response. Default + * is 2000ms. + * + * @return the latencyThresholdMs value. + */ + @Generated + public Integer getLatencyThresholdMs() { + return this.latencyThresholdMs; + } + + /** + * Set the latencyThresholdMs property: Latency threshold in milliseconds before triggering filler response. Default + * is 2000ms. + * + * @param latencyThresholdMs the latencyThresholdMs value to set. + * @return the FillerResponseConfigBase object itself. + */ + @Generated + public FillerResponseConfigBase setLatencyThresholdMs(Integer latencyThresholdMs) { + this.latencyThresholdMs = latencyThresholdMs; + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + jsonWriter.writeArrayField("triggers", this.triggers, + (writer, element) -> writer.writeString(element == null ? null : element.toString())); + jsonWriter.writeNumberField("latency_threshold_ms", this.latencyThresholdMs); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of FillerResponseConfigBase from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of FillerResponseConfigBase if the JsonReader was pointing to an instance of it, or null if + * it was pointing to JSON null. + * @throws IOException If an error occurs while reading the FillerResponseConfigBase. + */ + @Generated + public static FillerResponseConfigBase fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String discriminatorValue = null; + try (JsonReader readerToUse = reader.bufferObject()) { + // Prepare for reading + readerToUse.nextToken(); + while (readerToUse.nextToken() != JsonToken.END_OBJECT) { + String fieldName = readerToUse.getFieldName(); + readerToUse.nextToken(); + if ("type".equals(fieldName)) { + discriminatorValue = readerToUse.getString(); + break; + } else { + readerToUse.skipChildren(); + } + } + // Use the discriminator value to determine which subtype should be deserialized. + if ("llm_filler".equals(discriminatorValue)) { + return LlmFillerResponseConfig.fromJson(readerToUse.reset()); + } else if ("static_filler".equals(discriminatorValue)) { + return BasicFillerResponseConfig.fromJson(readerToUse.reset()); + } else { + return fromJsonKnownDiscriminator(readerToUse.reset()); + } + } + }); + } + + @Generated + static FillerResponseConfigBase fromJsonKnownDiscriminator(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + FillerResponseConfigBase deserializedFillerResponseConfigBase = new FillerResponseConfigBase(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("type".equals(fieldName)) { + deserializedFillerResponseConfigBase.type = FillerResponseConfigType.fromString(reader.getString()); + } else if ("triggers".equals(fieldName)) { + List triggers + = reader.readArray(reader1 -> FillerTrigger.fromString(reader1.getString())); + deserializedFillerResponseConfigBase.triggers = triggers; + } else if ("latency_threshold_ms".equals(fieldName)) { + deserializedFillerResponseConfigBase.latencyThresholdMs = reader.getNullable(JsonReader::getInt); + } else { + reader.skipChildren(); + } + } + return deserializedFillerResponseConfigBase; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FillerResponseConfigType.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FillerResponseConfigType.java new file mode 100644 index 000000000000..a6c8ee8e8366 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FillerResponseConfigType.java @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.util.ExpandableStringEnum; +import java.util.Collection; + +/** + * Filler response configuration types. + */ +public final class FillerResponseConfigType extends ExpandableStringEnum { + + /** + * Static filler configuration type. + */ + @Generated + public static final FillerResponseConfigType STATIC_FILLER = fromString("static_filler"); + + /** + * LLM-based filler configuration type. + */ + @Generated + public static final FillerResponseConfigType LLM_FILLER = fromString("llm_filler"); + + /** + * Creates a new instance of FillerResponseConfigType value. + * + * @deprecated Use the {@link #fromString(String)} factory method. + */ + @Generated + @Deprecated + public FillerResponseConfigType() { + } + + /** + * Creates or finds a FillerResponseConfigType from its string representation. + * + * @param name a name to look for. + * @return the corresponding FillerResponseConfigType. + */ + @Generated + public static FillerResponseConfigType fromString(String name) { + return fromString(name, FillerResponseConfigType.class); + } + + /** + * Gets known FillerResponseConfigType values. + * + * @return known FillerResponseConfigType values. + */ + @Generated + public static Collection values() { + return values(FillerResponseConfigType.class); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FillerTrigger.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FillerTrigger.java new file mode 100644 index 000000000000..b0fed0b257d1 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FillerTrigger.java @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.util.ExpandableStringEnum; +import java.util.Collection; + +/** + * Triggers that can activate filler response generation. + */ +public final class FillerTrigger extends ExpandableStringEnum { + + /** + * Trigger filler when response latency exceeds threshold. + */ + @Generated + public static final FillerTrigger LATENCY = fromString("latency"); + + /** + * Trigger filler when a tool call is being executed. + */ + @Generated + public static final FillerTrigger TOOL = fromString("tool"); + + /** + * Creates a new instance of FillerTrigger value. + * + * @deprecated Use the {@link #fromString(String)} factory method. + */ + @Generated + @Deprecated + public FillerTrigger() { + } + + /** + * Creates or finds a FillerTrigger from its string representation. + * + * @param name a name to look for. + * @return the corresponding FillerTrigger. + */ + @Generated + public static FillerTrigger fromString(String name) { + return fromString(name, FillerTrigger.class); + } + + /** + * Gets known FillerTrigger values. + * + * @return known FillerTrigger values. + */ + @Generated + public static Collection values() { + return values(FillerTrigger.class); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FoundryAgentContextType.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FoundryAgentContextType.java new file mode 100644 index 000000000000..c6999eb99f90 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FoundryAgentContextType.java @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.util.ExpandableStringEnum; +import java.util.Collection; + +/** + * The available set of Foundry agent context types. + */ +public final class FoundryAgentContextType extends ExpandableStringEnum { + + /** + * Only the current user input is sent, no context maintained. + */ + @Generated + public static final FoundryAgentContextType NO_CONTEXT = fromString("no_context"); + + /** + * Agent maintains its own context (thread), only current input sent per call. + */ + @Generated + public static final FoundryAgentContextType AGENT_CONTEXT = fromString("agent_context"); + + /** + * Creates a new instance of FoundryAgentContextType value. + * + * @deprecated Use the {@link #fromString(String)} factory method. + */ + @Generated + @Deprecated + public FoundryAgentContextType() { + } + + /** + * Creates or finds a FoundryAgentContextType from its string representation. + * + * @param name a name to look for. + * @return the corresponding FoundryAgentContextType. + */ + @Generated + public static FoundryAgentContextType fromString(String name) { + return fromString(name, FoundryAgentContextType.class); + } + + /** + * Gets known FoundryAgentContextType values. + * + * @return known FoundryAgentContextType values. + */ + @Generated + public static Collection values() { + return values(FoundryAgentContextType.class); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FoundryAgentTool.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FoundryAgentTool.java new file mode 100644 index 000000000000..416cbdc289fc --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/FoundryAgentTool.java @@ -0,0 +1,335 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * The definition of a Foundry agent tool as used by the voicelive endpoint. + */ +@Fluent +public final class FoundryAgentTool extends VoiceLiveToolDefinition { + + /* + * The type property. + */ + @Generated + private ToolType type = ToolType.FOUNDRY_AGENT; + + /* + * The name of the Foundry agent to call. + */ + @Generated + private final String agentName; + + /* + * The version of the Foundry agent to call. + */ + @Generated + private String agentVersion; + + /* + * The name of the Foundry project containing the agent. + */ + @Generated + private final String projectName; + + /* + * The client ID associated with the Foundry agent. + */ + @Generated + private String clientId; + + /* + * An optional description for the Foundry agent tool. If this is provided, it will be used instead of the agent's + * description in foundry portal. + */ + @Generated + private String description; + + /* + * An optional override for the Foundry resource used to execute the agent. + */ + @Generated + private String foundryResourceOverride; + + /* + * The context type to use when invoking the Foundry agent. Defaults to 'agent_context'. + */ + @Generated + private FoundryAgentContextType agentContextType; + + /* + * Whether to return the agent's response directly in the VoiceLive response. Set to false means to ask the voice + * live to rewrite the response. + */ + @Generated + private Boolean returnAgentResponseDirectly; + + /** + * Creates an instance of FoundryAgentTool class. + * + * @param agentName the agentName value to set. + * @param projectName the projectName value to set. + */ + @Generated + public FoundryAgentTool(String agentName, String projectName) { + this.agentName = agentName; + this.projectName = projectName; + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + @Override + public ToolType getType() { + return this.type; + } + + /** + * Get the agentName property: The name of the Foundry agent to call. + * + * @return the agentName value. + */ + @Generated + public String getAgentName() { + return this.agentName; + } + + /** + * Get the agentVersion property: The version of the Foundry agent to call. + * + * @return the agentVersion value. + */ + @Generated + public String getAgentVersion() { + return this.agentVersion; + } + + /** + * Set the agentVersion property: The version of the Foundry agent to call. + * + * @param agentVersion the agentVersion value to set. + * @return the FoundryAgentTool object itself. + */ + @Generated + public FoundryAgentTool setAgentVersion(String agentVersion) { + this.agentVersion = agentVersion; + return this; + } + + /** + * Get the projectName property: The name of the Foundry project containing the agent. + * + * @return the projectName value. + */ + @Generated + public String getProjectName() { + return this.projectName; + } + + /** + * Get the clientId property: The client ID associated with the Foundry agent. + * + * @return the clientId value. + */ + @Generated + public String getClientId() { + return this.clientId; + } + + /** + * Set the clientId property: The client ID associated with the Foundry agent. + * + * @param clientId the clientId value to set. + * @return the FoundryAgentTool object itself. + */ + @Generated + public FoundryAgentTool setClientId(String clientId) { + this.clientId = clientId; + return this; + } + + /** + * Get the description property: An optional description for the Foundry agent tool. If this is provided, it will be + * used instead of the agent's description in foundry portal. + * + * @return the description value. + */ + @Generated + public String getDescription() { + return this.description; + } + + /** + * Set the description property: An optional description for the Foundry agent tool. If this is provided, it will be + * used instead of the agent's description in foundry portal. + * + * @param description the description value to set. + * @return the FoundryAgentTool object itself. + */ + @Generated + public FoundryAgentTool setDescription(String description) { + this.description = description; + return this; + } + + /** + * Get the foundryResourceOverride property: An optional override for the Foundry resource used to execute the + * agent. + * + * @return the foundryResourceOverride value. + */ + @Generated + public String getFoundryResourceOverride() { + return this.foundryResourceOverride; + } + + /** + * Set the foundryResourceOverride property: An optional override for the Foundry resource used to execute the + * agent. + * + * @param foundryResourceOverride the foundryResourceOverride value to set. + * @return the FoundryAgentTool object itself. + */ + @Generated + public FoundryAgentTool setFoundryResourceOverride(String foundryResourceOverride) { + this.foundryResourceOverride = foundryResourceOverride; + return this; + } + + /** + * Get the agentContextType property: The context type to use when invoking the Foundry agent. Defaults to + * 'agent_context'. + * + * @return the agentContextType value. + */ + @Generated + public FoundryAgentContextType getAgentContextType() { + return this.agentContextType; + } + + /** + * Set the agentContextType property: The context type to use when invoking the Foundry agent. Defaults to + * 'agent_context'. + * + * @param agentContextType the agentContextType value to set. + * @return the FoundryAgentTool object itself. + */ + @Generated + public FoundryAgentTool setAgentContextType(FoundryAgentContextType agentContextType) { + this.agentContextType = agentContextType; + return this; + } + + /** + * Get the returnAgentResponseDirectly property: Whether to return the agent's response directly in the VoiceLive + * response. Set to false means to ask the voice live to rewrite the response. + * + * @return the returnAgentResponseDirectly value. + */ + @Generated + public Boolean isReturnAgentResponseDirectly() { + return this.returnAgentResponseDirectly; + } + + /** + * Set the returnAgentResponseDirectly property: Whether to return the agent's response directly in the VoiceLive + * response. Set to false means to ask the voice live to rewrite the response. + * + * @param returnAgentResponseDirectly the returnAgentResponseDirectly value to set. + * @return the FoundryAgentTool object itself. + */ + @Generated + public FoundryAgentTool setReturnAgentResponseDirectly(Boolean returnAgentResponseDirectly) { + this.returnAgentResponseDirectly = returnAgentResponseDirectly; + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("agent_name", this.agentName); + jsonWriter.writeStringField("project_name", this.projectName); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + jsonWriter.writeStringField("agent_version", this.agentVersion); + jsonWriter.writeStringField("client_id", this.clientId); + jsonWriter.writeStringField("description", this.description); + jsonWriter.writeStringField("foundry_resource_override", this.foundryResourceOverride); + jsonWriter.writeStringField("agent_context_type", + this.agentContextType == null ? null : this.agentContextType.toString()); + jsonWriter.writeBooleanField("return_agent_response_directly", this.returnAgentResponseDirectly); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of FoundryAgentTool from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of FoundryAgentTool if the JsonReader was pointing to an instance of it, or null if it was + * pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the FoundryAgentTool. + */ + @Generated + public static FoundryAgentTool fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String agentName = null; + String projectName = null; + ToolType type = ToolType.FOUNDRY_AGENT; + String agentVersion = null; + String clientId = null; + String description = null; + String foundryResourceOverride = null; + FoundryAgentContextType agentContextType = null; + Boolean returnAgentResponseDirectly = null; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("agent_name".equals(fieldName)) { + agentName = reader.getString(); + } else if ("project_name".equals(fieldName)) { + projectName = reader.getString(); + } else if ("type".equals(fieldName)) { + type = ToolType.fromString(reader.getString()); + } else if ("agent_version".equals(fieldName)) { + agentVersion = reader.getString(); + } else if ("client_id".equals(fieldName)) { + clientId = reader.getString(); + } else if ("description".equals(fieldName)) { + description = reader.getString(); + } else if ("foundry_resource_override".equals(fieldName)) { + foundryResourceOverride = reader.getString(); + } else if ("agent_context_type".equals(fieldName)) { + agentContextType = FoundryAgentContextType.fromString(reader.getString()); + } else if ("return_agent_response_directly".equals(fieldName)) { + returnAgentResponseDirectly = reader.getNullable(JsonReader::getBoolean); + } else { + reader.skipChildren(); + } + } + FoundryAgentTool deserializedFoundryAgentTool = new FoundryAgentTool(agentName, projectName); + deserializedFoundryAgentTool.type = type; + deserializedFoundryAgentTool.agentVersion = agentVersion; + deserializedFoundryAgentTool.clientId = clientId; + deserializedFoundryAgentTool.description = description; + deserializedFoundryAgentTool.foundryResourceOverride = foundryResourceOverride; + deserializedFoundryAgentTool.agentContextType = agentContextType; + deserializedFoundryAgentTool.returnAgentResponseDirectly = returnAgentResponseDirectly; + return deserializedFoundryAgentTool; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ItemType.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ItemType.java index 1ec270061796..23ddaa2fe3a7 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ItemType.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ItemType.java @@ -84,4 +84,10 @@ public static Collection values() { */ @Generated public static final ItemType MCP_APPROVAL_RESPONSE = fromString("mcp_approval_response"); + + /** + * Static value foundry_agent_call for ItemType. + */ + @Generated + public static final ItemType FOUNDRY_AGENT_CALL = fromString("foundry_agent_call"); } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/LlmFillerResponseConfig.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/LlmFillerResponseConfig.java new file mode 100644 index 000000000000..10e610afd6e5 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/LlmFillerResponseConfig.java @@ -0,0 +1,204 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; +import java.util.List; + +/** + * Configuration for LLM-based filler response generation. + * Uses LLM to generate context-aware filler responses when any trigger condition is met. + */ +@Fluent +public final class LlmFillerResponseConfig extends FillerResponseConfigBase { + + /* + * The type of filler response configuration. + */ + @Generated + private FillerResponseConfigType type = FillerResponseConfigType.LLM_FILLER; + + /* + * The model to use for LLM-based filler generation. Default is gpt-4.1-mini. + */ + @Generated + private String model; + + /* + * Custom instructions for generating filler responses. If not provided, a default prompt is used. + */ + @Generated + private String instructions; + + /* + * Maximum number of tokens to generate for the filler response. + */ + @Generated + private Integer maxCompletionTokens; + + /** + * Creates an instance of LlmFillerResponseConfig class. + */ + @Generated + public LlmFillerResponseConfig() { + } + + /** + * Get the type property: The type of filler response configuration. + * + * @return the type value. + */ + @Generated + @Override + public FillerResponseConfigType getType() { + return this.type; + } + + /** + * Get the model property: The model to use for LLM-based filler generation. Default is gpt-4.1-mini. + * + * @return the model value. + */ + @Generated + public String getModel() { + return this.model; + } + + /** + * Set the model property: The model to use for LLM-based filler generation. Default is gpt-4.1-mini. + * + * @param model the model value to set. + * @return the LlmFillerResponseConfig object itself. + */ + @Generated + public LlmFillerResponseConfig setModel(String model) { + this.model = model; + return this; + } + + /** + * Get the instructions property: Custom instructions for generating filler responses. If not provided, a default + * prompt is used. + * + * @return the instructions value. + */ + @Generated + public String getInstructions() { + return this.instructions; + } + + /** + * Set the instructions property: Custom instructions for generating filler responses. If not provided, a default + * prompt is used. + * + * @param instructions the instructions value to set. + * @return the LlmFillerResponseConfig object itself. + */ + @Generated + public LlmFillerResponseConfig setInstructions(String instructions) { + this.instructions = instructions; + return this; + } + + /** + * Get the maxCompletionTokens property: Maximum number of tokens to generate for the filler response. + * + * @return the maxCompletionTokens value. + */ + @Generated + public Integer getMaxCompletionTokens() { + return this.maxCompletionTokens; + } + + /** + * Set the maxCompletionTokens property: Maximum number of tokens to generate for the filler response. + * + * @param maxCompletionTokens the maxCompletionTokens value to set. + * @return the LlmFillerResponseConfig object itself. + */ + @Generated + public LlmFillerResponseConfig setMaxCompletionTokens(Integer maxCompletionTokens) { + this.maxCompletionTokens = maxCompletionTokens; + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public LlmFillerResponseConfig setTriggers(List triggers) { + super.setTriggers(triggers); + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public LlmFillerResponseConfig setLatencyThresholdMs(Integer latencyThresholdMs) { + super.setLatencyThresholdMs(latencyThresholdMs); + return this; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeArrayField("triggers", getTriggers(), + (writer, element) -> writer.writeString(element == null ? null : element.toString())); + jsonWriter.writeNumberField("latency_threshold_ms", getLatencyThresholdMs()); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + jsonWriter.writeStringField("model", this.model); + jsonWriter.writeStringField("instructions", this.instructions); + jsonWriter.writeNumberField("max_completion_tokens", this.maxCompletionTokens); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of LlmFillerResponseConfig from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of LlmFillerResponseConfig if the JsonReader was pointing to an instance of it, or null if it + * was pointing to JSON null. + * @throws IOException If an error occurs while reading the LlmFillerResponseConfig. + */ + @Generated + public static LlmFillerResponseConfig fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + LlmFillerResponseConfig deserializedLlmFillerResponseConfig = new LlmFillerResponseConfig(); + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("triggers".equals(fieldName)) { + List triggers + = reader.readArray(reader1 -> FillerTrigger.fromString(reader1.getString())); + deserializedLlmFillerResponseConfig.setTriggers(triggers); + } else if ("latency_threshold_ms".equals(fieldName)) { + deserializedLlmFillerResponseConfig.setLatencyThresholdMs(reader.getNullable(JsonReader::getInt)); + } else if ("type".equals(fieldName)) { + deserializedLlmFillerResponseConfig.type = FillerResponseConfigType.fromString(reader.getString()); + } else if ("model".equals(fieldName)) { + deserializedLlmFillerResponseConfig.model = reader.getString(); + } else if ("instructions".equals(fieldName)) { + deserializedLlmFillerResponseConfig.instructions = reader.getString(); + } else if ("max_completion_tokens".equals(fieldName)) { + deserializedLlmFillerResponseConfig.maxCompletionTokens = reader.getNullable(JsonReader::getInt); + } else { + reader.skipChildren(); + } + } + return deserializedLlmFillerResponseConfig; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/OutputAudioFormat.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/OutputAudioFormat.java index fac44d49409b..c8053e5c0bab 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/OutputAudioFormat.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/OutputAudioFormat.java @@ -22,13 +22,13 @@ public final class OutputAudioFormat extends ExpandableStringEnum { + + /** + * No reasoning effort. + */ + @Generated + public static final ReasoningEffort NONE = fromString("none"); + + /** + * Minimal reasoning effort. + */ + @Generated + public static final ReasoningEffort MINIMAL = fromString("minimal"); + + /** + * Low reasoning effort - faster responses with less reasoning. + */ + @Generated + public static final ReasoningEffort LOW = fromString("low"); + + /** + * Medium reasoning effort - balanced between speed and reasoning depth. + */ + @Generated + public static final ReasoningEffort MEDIUM = fromString("medium"); + + /** + * High reasoning effort - more thorough reasoning, may take longer. + */ + @Generated + public static final ReasoningEffort HIGH = fromString("high"); + + /** + * Extra high reasoning effort - maximum reasoning depth. + */ + @Generated + public static final ReasoningEffort XHIGH = fromString("xhigh"); + + /** + * Creates a new instance of ReasoningEffort value. + * + * @deprecated Use the {@link #fromString(String)} factory method. + */ + @Generated + @Deprecated + public ReasoningEffort() { + } + + /** + * Creates or finds a ReasoningEffort from its string representation. + * + * @param name a name to look for. + * @return the corresponding ReasoningEffort. + */ + @Generated + public static ReasoningEffort fromString(String name) { + return fromString(name, ReasoningEffort.class); + } + + /** + * Gets known ReasoningEffort values. + * + * @return known ReasoningEffort values. + */ + @Generated + public static Collection values() { + return values(ReasoningEffort.class); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ResponseCreateParams.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ResponseCreateParams.java index 8e7f7089f3ca..f138eb3cffce 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ResponseCreateParams.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ResponseCreateParams.java @@ -12,6 +12,7 @@ import com.azure.json.JsonWriter; import java.io.IOException; import java.util.List; +import java.util.Map; /** * Create a new VoiceLive response with these parameters. @@ -419,6 +420,9 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { this.maxOutputTokens.writeTo(jsonWriter); } jsonWriter.writeJsonField("pre_generated_assistant_message", this.preGeneratedAssistantMessage); + jsonWriter.writeStringField("reasoning_effort", + this.reasoningEffort == null ? null : this.reasoningEffort.toString()); + jsonWriter.writeMapField("metadata", this.metadata, (writer, element) -> writer.writeString(element)); return jsonWriter.writeEndObject(); } @@ -475,6 +479,11 @@ public static ResponseCreateParams fromJson(JsonReader jsonReader) throws IOExce } else if ("pre_generated_assistant_message".equals(fieldName)) { deserializedResponseCreateParams.preGeneratedAssistantMessage = AssistantMessageItem.fromJson(reader); + } else if ("reasoning_effort".equals(fieldName)) { + deserializedResponseCreateParams.reasoningEffort = ReasoningEffort.fromString(reader.getString()); + } else if ("metadata".equals(fieldName)) { + Map metadata = reader.readMap(reader1 -> reader1.getString()); + deserializedResponseCreateParams.metadata = metadata; } else { reader.skipChildren(); } @@ -542,4 +551,72 @@ public ResponseCreateParams setPreGeneratedAssistantMessage(AssistantMessageItem this.preGeneratedAssistantMessage = preGeneratedAssistantMessage; return this; } + + /* + * Constrains effort on reasoning for reasoning models. Check model documentation for supported values for each + * model. + * Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response. + */ + @Generated + private ReasoningEffort reasoningEffort; + + /* + * Set of up to 16 key-value pairs that can be attached to an object. + * This can be useful for storing additional information about the object in a structured format. + * Keys can be a maximum of 64 characters long and values can be a maximum of 512 characters long. + */ + @Generated + private Map metadata; + + /** + * Get the reasoningEffort property: Constrains effort on reasoning for reasoning models. Check model documentation + * for supported values for each model. + * Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response. + * + * @return the reasoningEffort value. + */ + @Generated + public ReasoningEffort getReasoningEffort() { + return this.reasoningEffort; + } + + /** + * Set the reasoningEffort property: Constrains effort on reasoning for reasoning models. Check model documentation + * for supported values for each model. + * Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response. + * + * @param reasoningEffort the reasoningEffort value to set. + * @return the ResponseCreateParams object itself. + */ + @Generated + public ResponseCreateParams setReasoningEffort(ReasoningEffort reasoningEffort) { + this.reasoningEffort = reasoningEffort; + return this; + } + + /** + * Get the metadata property: Set of up to 16 key-value pairs that can be attached to an object. + * This can be useful for storing additional information about the object in a structured format. + * Keys can be a maximum of 64 characters long and values can be a maximum of 512 characters long. + * + * @return the metadata value. + */ + @Generated + public Map getMetadata() { + return this.metadata; + } + + /** + * Set the metadata property: Set of up to 16 key-value pairs that can be attached to an object. + * This can be useful for storing additional information about the object in a structured format. + * Keys can be a maximum of 64 characters long and values can be a maximum of 512 characters long. + * + * @param metadata the metadata value to set. + * @return the ResponseCreateParams object itself. + */ + @Generated + public ResponseCreateParams setMetadata(Map metadata) { + this.metadata = metadata; + return this; + } } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ResponseFoundryAgentCallItem.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ResponseFoundryAgentCallItem.java new file mode 100644 index 000000000000..95da0ba79c24 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ResponseFoundryAgentCallItem.java @@ -0,0 +1,226 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.core.util.BinaryData; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * A response item that represents a call to a Foundry agent. + */ +@Immutable +public final class ResponseFoundryAgentCallItem extends SessionResponseItem { + + /* + * The type property. + */ + @Generated + private ItemType type = ItemType.FOUNDRY_AGENT_CALL; + + /* + * The name of the Foundry agent. + */ + @Generated + private final String name; + + /* + * The ID of the call. + */ + @Generated + private final String callId; + + /* + * The arguments for the agent call. + */ + @Generated + private final String arguments; + + /* + * The ID of the agent response, if any. + */ + @Generated + private String agentResponseId; + + /* + * The output of the agent call. + */ + @Generated + private String output; + + /* + * The error, if any, from the agent call. + */ + @Generated + private BinaryData error; + + /** + * Creates an instance of ResponseFoundryAgentCallItem class. + * + * @param name the name value to set. + * @param callId the callId value to set. + * @param arguments the arguments value to set. + */ + @Generated + private ResponseFoundryAgentCallItem(String name, String callId, String arguments) { + this.name = name; + this.callId = callId; + this.arguments = arguments; + } + + /** + * Get the type property: The type property. + * + * @return the type value. + */ + @Generated + @Override + public ItemType getType() { + return this.type; + } + + /** + * Get the name property: The name of the Foundry agent. + * + * @return the name value. + */ + @Generated + public String getName() { + return this.name; + } + + /** + * Get the callId property: The ID of the call. + * + * @return the callId value. + */ + @Generated + public String getCallId() { + return this.callId; + } + + /** + * Get the arguments property: The arguments for the agent call. + * + * @return the arguments value. + */ + @Generated + public String getArguments() { + return this.arguments; + } + + /** + * Get the agentResponseId property: The ID of the agent response, if any. + * + * @return the agentResponseId value. + */ + @Generated + public String getAgentResponseId() { + return this.agentResponseId; + } + + /** + * Get the output property: The output of the agent call. + * + * @return the output value. + */ + @Generated + public String getOutput() { + return this.output; + } + + /** + * Get the error property: The error, if any, from the agent call. + * + * @return the error value. + */ + @Generated + public BinaryData getError() { + return this.error; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("id", getId()); + jsonWriter.writeStringField("object", getObject() == null ? null : getObject().toString()); + jsonWriter.writeStringField("name", this.name); + jsonWriter.writeStringField("call_id", this.callId); + jsonWriter.writeStringField("arguments", this.arguments); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + jsonWriter.writeStringField("agent_response_id", this.agentResponseId); + jsonWriter.writeStringField("output", this.output); + if (this.error != null) { + jsonWriter.writeFieldName("error"); + this.error.writeTo(jsonWriter); + } + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of ResponseFoundryAgentCallItem from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of ResponseFoundryAgentCallItem if the JsonReader was pointing to an instance of it, or null + * if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the ResponseFoundryAgentCallItem. + */ + @Generated + public static ResponseFoundryAgentCallItem fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String id = null; + ResponseItemObject object = null; + String name = null; + String callId = null; + String arguments = null; + ItemType type = ItemType.FOUNDRY_AGENT_CALL; + String agentResponseId = null; + String output = null; + BinaryData error = null; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("id".equals(fieldName)) { + id = reader.getString(); + } else if ("object".equals(fieldName)) { + object = ResponseItemObject.fromString(reader.getString()); + } else if ("name".equals(fieldName)) { + name = reader.getString(); + } else if ("call_id".equals(fieldName)) { + callId = reader.getString(); + } else if ("arguments".equals(fieldName)) { + arguments = reader.getString(); + } else if ("type".equals(fieldName)) { + type = ItemType.fromString(reader.getString()); + } else if ("agent_response_id".equals(fieldName)) { + agentResponseId = reader.getString(); + } else if ("output".equals(fieldName)) { + output = reader.getString(); + } else if ("error".equals(fieldName)) { + error = reader.getNullable(nonNullReader -> BinaryData.fromObject(nonNullReader.readUntyped())); + } else { + reader.skipChildren(); + } + } + ResponseFoundryAgentCallItem deserializedResponseFoundryAgentCallItem + = new ResponseFoundryAgentCallItem(name, callId, arguments); + deserializedResponseFoundryAgentCallItem.setId(id); + deserializedResponseFoundryAgentCallItem.setObject(object); + deserializedResponseFoundryAgentCallItem.type = type; + deserializedResponseFoundryAgentCallItem.agentResponseId = agentResponseId; + deserializedResponseFoundryAgentCallItem.output = output; + deserializedResponseFoundryAgentCallItem.error = error; + return deserializedResponseFoundryAgentCallItem; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallArgumentsDelta.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallArgumentsDelta.java new file mode 100644 index 000000000000..3bfa4f3d4995 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallArgumentsDelta.java @@ -0,0 +1,177 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * Represents a delta update of the arguments for a Foundry agent call. + */ +@Immutable +public final class ServerEventResponseFoundryAgentCallArgumentsDelta extends SessionUpdate { + + /* + * The type of event. + */ + @Generated + private ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DELTA; + + /* + * The delta of the arguments. + */ + @Generated + private final String delta; + + /* + * The ID of the item associated with the event. + */ + @Generated + private final String itemId; + + /* + * The ID of the response associated with the event. + */ + @Generated + private final String responseId; + + /* + * The index of the output associated with the event. + */ + @Generated + private final int outputIndex; + + /** + * Creates an instance of ServerEventResponseFoundryAgentCallArgumentsDelta class. + * + * @param delta the delta value to set. + * @param itemId the itemId value to set. + * @param responseId the responseId value to set. + * @param outputIndex the outputIndex value to set. + */ + @Generated + private ServerEventResponseFoundryAgentCallArgumentsDelta(String delta, String itemId, String responseId, + int outputIndex) { + this.delta = delta; + this.itemId = itemId; + this.responseId = responseId; + this.outputIndex = outputIndex; + } + + /** + * Get the type property: The type of event. + * + * @return the type value. + */ + @Generated + @Override + public ServerEventType getType() { + return this.type; + } + + /** + * Get the delta property: The delta of the arguments. + * + * @return the delta value. + */ + @Generated + public String getDelta() { + return this.delta; + } + + /** + * Get the itemId property: The ID of the item associated with the event. + * + * @return the itemId value. + */ + @Generated + public String getItemId() { + return this.itemId; + } + + /** + * Get the responseId property: The ID of the response associated with the event. + * + * @return the responseId value. + */ + @Generated + public String getResponseId() { + return this.responseId; + } + + /** + * Get the outputIndex property: The index of the output associated with the event. + * + * @return the outputIndex value. + */ + @Generated + public int getOutputIndex() { + return this.outputIndex; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("event_id", getEventId()); + jsonWriter.writeStringField("delta", this.delta); + jsonWriter.writeStringField("item_id", this.itemId); + jsonWriter.writeStringField("response_id", this.responseId); + jsonWriter.writeIntField("output_index", this.outputIndex); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of ServerEventResponseFoundryAgentCallArgumentsDelta from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of ServerEventResponseFoundryAgentCallArgumentsDelta if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the ServerEventResponseFoundryAgentCallArgumentsDelta. + */ + @Generated + public static ServerEventResponseFoundryAgentCallArgumentsDelta fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String eventId = null; + String delta = null; + String itemId = null; + String responseId = null; + int outputIndex = 0; + ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DELTA; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("event_id".equals(fieldName)) { + eventId = reader.getString(); + } else if ("delta".equals(fieldName)) { + delta = reader.getString(); + } else if ("item_id".equals(fieldName)) { + itemId = reader.getString(); + } else if ("response_id".equals(fieldName)) { + responseId = reader.getString(); + } else if ("output_index".equals(fieldName)) { + outputIndex = reader.getInt(); + } else if ("type".equals(fieldName)) { + type = ServerEventType.fromString(reader.getString()); + } else { + reader.skipChildren(); + } + } + ServerEventResponseFoundryAgentCallArgumentsDelta deserializedServerEventResponseFoundryAgentCallArgumentsDelta + = new ServerEventResponseFoundryAgentCallArgumentsDelta(delta, itemId, responseId, outputIndex); + deserializedServerEventResponseFoundryAgentCallArgumentsDelta.setEventId(eventId); + deserializedServerEventResponseFoundryAgentCallArgumentsDelta.type = type; + return deserializedServerEventResponseFoundryAgentCallArgumentsDelta; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallArgumentsDone.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallArgumentsDone.java new file mode 100644 index 000000000000..3dff894acf7b --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallArgumentsDone.java @@ -0,0 +1,175 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * Indicates the completion of the arguments for a Foundry agent call. + */ +@Immutable +public final class ServerEventResponseFoundryAgentCallArgumentsDone extends SessionUpdate { + + /* + * The type of event. + */ + @Generated + private ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DONE; + + /* + * The ID of the item associated with the event. + */ + @Generated + private final String itemId; + + /* + * The ID of the response associated with the event. + */ + @Generated + private final String responseId; + + /* + * The index of the output associated with the event. + */ + @Generated + private final int outputIndex; + + /* + * The full arguments for the agent call. + */ + @Generated + private String arguments; + + /** + * Creates an instance of ServerEventResponseFoundryAgentCallArgumentsDone class. + * + * @param itemId the itemId value to set. + * @param responseId the responseId value to set. + * @param outputIndex the outputIndex value to set. + */ + @Generated + private ServerEventResponseFoundryAgentCallArgumentsDone(String itemId, String responseId, int outputIndex) { + this.itemId = itemId; + this.responseId = responseId; + this.outputIndex = outputIndex; + } + + /** + * Get the type property: The type of event. + * + * @return the type value. + */ + @Generated + @Override + public ServerEventType getType() { + return this.type; + } + + /** + * Get the itemId property: The ID of the item associated with the event. + * + * @return the itemId value. + */ + @Generated + public String getItemId() { + return this.itemId; + } + + /** + * Get the responseId property: The ID of the response associated with the event. + * + * @return the responseId value. + */ + @Generated + public String getResponseId() { + return this.responseId; + } + + /** + * Get the outputIndex property: The index of the output associated with the event. + * + * @return the outputIndex value. + */ + @Generated + public int getOutputIndex() { + return this.outputIndex; + } + + /** + * Get the arguments property: The full arguments for the agent call. + * + * @return the arguments value. + */ + @Generated + public String getArguments() { + return this.arguments; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("event_id", getEventId()); + jsonWriter.writeStringField("item_id", this.itemId); + jsonWriter.writeStringField("response_id", this.responseId); + jsonWriter.writeIntField("output_index", this.outputIndex); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + jsonWriter.writeStringField("arguments", this.arguments); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of ServerEventResponseFoundryAgentCallArgumentsDone from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of ServerEventResponseFoundryAgentCallArgumentsDone if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the ServerEventResponseFoundryAgentCallArgumentsDone. + */ + @Generated + public static ServerEventResponseFoundryAgentCallArgumentsDone fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String eventId = null; + String itemId = null; + String responseId = null; + int outputIndex = 0; + ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DONE; + String arguments = null; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("event_id".equals(fieldName)) { + eventId = reader.getString(); + } else if ("item_id".equals(fieldName)) { + itemId = reader.getString(); + } else if ("response_id".equals(fieldName)) { + responseId = reader.getString(); + } else if ("output_index".equals(fieldName)) { + outputIndex = reader.getInt(); + } else if ("type".equals(fieldName)) { + type = ServerEventType.fromString(reader.getString()); + } else if ("arguments".equals(fieldName)) { + arguments = reader.getString(); + } else { + reader.skipChildren(); + } + } + ServerEventResponseFoundryAgentCallArgumentsDone deserializedServerEventResponseFoundryAgentCallArgumentsDone + = new ServerEventResponseFoundryAgentCallArgumentsDone(itemId, responseId, outputIndex); + deserializedServerEventResponseFoundryAgentCallArgumentsDone.setEventId(eventId); + deserializedServerEventResponseFoundryAgentCallArgumentsDone.type = type; + deserializedServerEventResponseFoundryAgentCallArgumentsDone.arguments = arguments; + return deserializedServerEventResponseFoundryAgentCallArgumentsDone; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallCompleted.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallCompleted.java new file mode 100644 index 000000000000..8942bc6041df --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallCompleted.java @@ -0,0 +1,132 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * Indicates the Foundry agent call has completed. + */ +@Immutable +public final class ServerEventResponseFoundryAgentCallCompleted extends SessionUpdate { + + /* + * The type of event. + */ + @Generated + private ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_COMPLETED; + + /* + * The ID of the item associated with the event. + */ + @Generated + private final String itemId; + + /* + * The index of the output associated with the event. + */ + @Generated + private final int outputIndex; + + /** + * Creates an instance of ServerEventResponseFoundryAgentCallCompleted class. + * + * @param itemId the itemId value to set. + * @param outputIndex the outputIndex value to set. + */ + @Generated + private ServerEventResponseFoundryAgentCallCompleted(String itemId, int outputIndex) { + this.itemId = itemId; + this.outputIndex = outputIndex; + } + + /** + * Get the type property: The type of event. + * + * @return the type value. + */ + @Generated + @Override + public ServerEventType getType() { + return this.type; + } + + /** + * Get the itemId property: The ID of the item associated with the event. + * + * @return the itemId value. + */ + @Generated + public String getItemId() { + return this.itemId; + } + + /** + * Get the outputIndex property: The index of the output associated with the event. + * + * @return the outputIndex value. + */ + @Generated + public int getOutputIndex() { + return this.outputIndex; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("event_id", getEventId()); + jsonWriter.writeStringField("item_id", this.itemId); + jsonWriter.writeIntField("output_index", this.outputIndex); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of ServerEventResponseFoundryAgentCallCompleted from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of ServerEventResponseFoundryAgentCallCompleted if the JsonReader was pointing to an instance + * of it, or null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the ServerEventResponseFoundryAgentCallCompleted. + */ + @Generated + public static ServerEventResponseFoundryAgentCallCompleted fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String eventId = null; + String itemId = null; + int outputIndex = 0; + ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_COMPLETED; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("event_id".equals(fieldName)) { + eventId = reader.getString(); + } else if ("item_id".equals(fieldName)) { + itemId = reader.getString(); + } else if ("output_index".equals(fieldName)) { + outputIndex = reader.getInt(); + } else if ("type".equals(fieldName)) { + type = ServerEventType.fromString(reader.getString()); + } else { + reader.skipChildren(); + } + } + ServerEventResponseFoundryAgentCallCompleted deserializedServerEventResponseFoundryAgentCallCompleted + = new ServerEventResponseFoundryAgentCallCompleted(itemId, outputIndex); + deserializedServerEventResponseFoundryAgentCallCompleted.setEventId(eventId); + deserializedServerEventResponseFoundryAgentCallCompleted.type = type; + return deserializedServerEventResponseFoundryAgentCallCompleted; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallFailed.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallFailed.java new file mode 100644 index 000000000000..8c65146961b1 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallFailed.java @@ -0,0 +1,132 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * Indicates the Foundry agent call has failed. + */ +@Immutable +public final class ServerEventResponseFoundryAgentCallFailed extends SessionUpdate { + + /* + * The type of event. + */ + @Generated + private ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_FAILED; + + /* + * The ID of the item associated with the event. + */ + @Generated + private final String itemId; + + /* + * The index of the output associated with the event. + */ + @Generated + private final int outputIndex; + + /** + * Creates an instance of ServerEventResponseFoundryAgentCallFailed class. + * + * @param itemId the itemId value to set. + * @param outputIndex the outputIndex value to set. + */ + @Generated + private ServerEventResponseFoundryAgentCallFailed(String itemId, int outputIndex) { + this.itemId = itemId; + this.outputIndex = outputIndex; + } + + /** + * Get the type property: The type of event. + * + * @return the type value. + */ + @Generated + @Override + public ServerEventType getType() { + return this.type; + } + + /** + * Get the itemId property: The ID of the item associated with the event. + * + * @return the itemId value. + */ + @Generated + public String getItemId() { + return this.itemId; + } + + /** + * Get the outputIndex property: The index of the output associated with the event. + * + * @return the outputIndex value. + */ + @Generated + public int getOutputIndex() { + return this.outputIndex; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("event_id", getEventId()); + jsonWriter.writeStringField("item_id", this.itemId); + jsonWriter.writeIntField("output_index", this.outputIndex); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of ServerEventResponseFoundryAgentCallFailed from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of ServerEventResponseFoundryAgentCallFailed if the JsonReader was pointing to an instance of + * it, or null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the ServerEventResponseFoundryAgentCallFailed. + */ + @Generated + public static ServerEventResponseFoundryAgentCallFailed fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String eventId = null; + String itemId = null; + int outputIndex = 0; + ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_FAILED; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("event_id".equals(fieldName)) { + eventId = reader.getString(); + } else if ("item_id".equals(fieldName)) { + itemId = reader.getString(); + } else if ("output_index".equals(fieldName)) { + outputIndex = reader.getInt(); + } else if ("type".equals(fieldName)) { + type = ServerEventType.fromString(reader.getString()); + } else { + reader.skipChildren(); + } + } + ServerEventResponseFoundryAgentCallFailed deserializedServerEventResponseFoundryAgentCallFailed + = new ServerEventResponseFoundryAgentCallFailed(itemId, outputIndex); + deserializedServerEventResponseFoundryAgentCallFailed.setEventId(eventId); + deserializedServerEventResponseFoundryAgentCallFailed.type = type; + return deserializedServerEventResponseFoundryAgentCallFailed; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallInProgress.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallInProgress.java new file mode 100644 index 000000000000..469f798968d1 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallInProgress.java @@ -0,0 +1,153 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.voicelive.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.azure.json.JsonReader; +import com.azure.json.JsonToken; +import com.azure.json.JsonWriter; +import java.io.IOException; + +/** + * Indicates the Foundry agent call is in progress. + */ +@Immutable +public final class ServerEventResponseFoundryAgentCallInProgress extends SessionUpdate { + + /* + * The type of event. + */ + @Generated + private ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_IN_PROGRESS; + + /* + * The ID of the item associated with the event. + */ + @Generated + private final String itemId; + + /* + * The index of the output associated with the event. + */ + @Generated + private final int outputIndex; + + /* + * The ID of the agent response, if any. + */ + @Generated + private String agentResponseId; + + /** + * Creates an instance of ServerEventResponseFoundryAgentCallInProgress class. + * + * @param itemId the itemId value to set. + * @param outputIndex the outputIndex value to set. + */ + @Generated + private ServerEventResponseFoundryAgentCallInProgress(String itemId, int outputIndex) { + this.itemId = itemId; + this.outputIndex = outputIndex; + } + + /** + * Get the type property: The type of event. + * + * @return the type value. + */ + @Generated + @Override + public ServerEventType getType() { + return this.type; + } + + /** + * Get the itemId property: The ID of the item associated with the event. + * + * @return the itemId value. + */ + @Generated + public String getItemId() { + return this.itemId; + } + + /** + * Get the outputIndex property: The index of the output associated with the event. + * + * @return the outputIndex value. + */ + @Generated + public int getOutputIndex() { + return this.outputIndex; + } + + /** + * Get the agentResponseId property: The ID of the agent response, if any. + * + * @return the agentResponseId value. + */ + @Generated + public String getAgentResponseId() { + return this.agentResponseId; + } + + /** + * {@inheritDoc} + */ + @Generated + @Override + public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { + jsonWriter.writeStartObject(); + jsonWriter.writeStringField("event_id", getEventId()); + jsonWriter.writeStringField("item_id", this.itemId); + jsonWriter.writeIntField("output_index", this.outputIndex); + jsonWriter.writeStringField("type", this.type == null ? null : this.type.toString()); + jsonWriter.writeStringField("agent_response_id", this.agentResponseId); + return jsonWriter.writeEndObject(); + } + + /** + * Reads an instance of ServerEventResponseFoundryAgentCallInProgress from the JsonReader. + * + * @param jsonReader The JsonReader being read. + * @return An instance of ServerEventResponseFoundryAgentCallInProgress if the JsonReader was pointing to an + * instance of it, or null if it was pointing to JSON null. + * @throws IllegalStateException If the deserialized JSON object was missing any required properties. + * @throws IOException If an error occurs while reading the ServerEventResponseFoundryAgentCallInProgress. + */ + @Generated + public static ServerEventResponseFoundryAgentCallInProgress fromJson(JsonReader jsonReader) throws IOException { + return jsonReader.readObject(reader -> { + String eventId = null; + String itemId = null; + int outputIndex = 0; + ServerEventType type = ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_IN_PROGRESS; + String agentResponseId = null; + while (reader.nextToken() != JsonToken.END_OBJECT) { + String fieldName = reader.getFieldName(); + reader.nextToken(); + if ("event_id".equals(fieldName)) { + eventId = reader.getString(); + } else if ("item_id".equals(fieldName)) { + itemId = reader.getString(); + } else if ("output_index".equals(fieldName)) { + outputIndex = reader.getInt(); + } else if ("type".equals(fieldName)) { + type = ServerEventType.fromString(reader.getString()); + } else if ("agent_response_id".equals(fieldName)) { + agentResponseId = reader.getString(); + } else { + reader.skipChildren(); + } + } + ServerEventResponseFoundryAgentCallInProgress deserializedServerEventResponseFoundryAgentCallInProgress + = new ServerEventResponseFoundryAgentCallInProgress(itemId, outputIndex); + deserializedServerEventResponseFoundryAgentCallInProgress.setEventId(eventId); + deserializedServerEventResponseFoundryAgentCallInProgress.type = type; + deserializedServerEventResponseFoundryAgentCallInProgress.agentResponseId = agentResponseId; + return deserializedServerEventResponseFoundryAgentCallInProgress; + }); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventType.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventType.java index a853e08f76f4..4b299dfe2212 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventType.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ServerEventType.java @@ -323,4 +323,39 @@ public static Collection values() { */ @Generated public static final ServerEventType RESPONSE_MCP_CALL_FAILED = fromString("response.mcp_call.failed"); + + /** + * Static value response.foundry_agent_call_arguments.delta for ServerEventType. + */ + @Generated + public static final ServerEventType RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DELTA + = fromString("response.foundry_agent_call_arguments.delta"); + + /** + * Static value response.foundry_agent_call_arguments.done for ServerEventType. + */ + @Generated + public static final ServerEventType RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DONE + = fromString("response.foundry_agent_call_arguments.done"); + + /** + * Static value response.foundry_agent_call.in_progress for ServerEventType. + */ + @Generated + public static final ServerEventType RESPONSE_FOUNDRY_AGENT_CALL_IN_PROGRESS + = fromString("response.foundry_agent_call.in_progress"); + + /** + * Static value response.foundry_agent_call.completed for ServerEventType. + */ + @Generated + public static final ServerEventType RESPONSE_FOUNDRY_AGENT_CALL_COMPLETED + = fromString("response.foundry_agent_call.completed"); + + /** + * Static value response.foundry_agent_call.failed for ServerEventType. + */ + @Generated + public static final ServerEventType RESPONSE_FOUNDRY_AGENT_CALL_FAILED + = fromString("response.foundry_agent_call.failed"); } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionResponse.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionResponse.java index 73ef45678456..7b707cb76010 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionResponse.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionResponse.java @@ -12,6 +12,7 @@ import com.azure.json.JsonWriter; import java.io.IOException; import java.util.List; +import java.util.Map; /** * The response resource. @@ -273,6 +274,7 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeFieldName("max_output_tokens"); this.maxOutputTokens.writeTo(jsonWriter); } + jsonWriter.writeMapField("metadata", this.metadata, (writer, element) -> writer.writeString(element)); return jsonWriter.writeEndObject(); } @@ -321,6 +323,9 @@ public static SessionResponse fromJson(JsonReader jsonReader) throws IOException } else if ("max_output_tokens".equals(fieldName)) { deserializedSessionResponse.maxOutputTokens = reader.getNullable(nonNullReader -> BinaryData.fromObject(nonNullReader.readUntyped())); + } else if ("metadata".equals(fieldName)) { + Map metadata = reader.readMap(reader1 -> reader1.getString()); + deserializedSessionResponse.metadata = metadata; } else { reader.skipChildren(); } @@ -328,4 +333,24 @@ public static SessionResponse fromJson(JsonReader jsonReader) throws IOException return deserializedSessionResponse; }); } + + /* + * Set of up to 16 key-value pairs that can be attached to an object. + * This can be useful for storing additional information about the object in a structured format. + * Keys can be a maximum of 64 characters long and values can be a maximum of 512 characters long. + */ + @Generated + private Map metadata; + + /** + * Get the metadata property: Set of up to 16 key-value pairs that can be attached to an object. + * This can be useful for storing additional information about the object in a structured format. + * Keys can be a maximum of 64 characters long and values can be a maximum of 512 characters long. + * + * @return the metadata value. + */ + @Generated + public Map getMetadata() { + return this.metadata; + } } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionResponseItem.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionResponseItem.java index cc1e2f518a0c..abb3e7835a8d 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionResponseItem.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionResponseItem.java @@ -149,6 +149,8 @@ public static SessionResponseItem fromJson(JsonReader jsonReader) throws IOExcep return ResponseMCPApprovalRequestItem.fromJson(readerToUse.reset()); } else if ("mcp_approval_response".equals(discriminatorValue)) { return ResponseMCPApprovalResponseItem.fromJson(readerToUse.reset()); + } else if ("foundry_agent_call".equals(discriminatorValue)) { + return ResponseFoundryAgentCallItem.fromJson(readerToUse.reset()); } else { return fromJsonKnownDiscriminator(readerToUse.reset()); } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionUpdate.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionUpdate.java index 291e833c648d..1eb5a743e12d 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionUpdate.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/SessionUpdate.java @@ -192,6 +192,16 @@ public static SessionUpdate fromJson(JsonReader jsonReader) throws IOException { return ServerEventResponseMcpCallCompleted.fromJson(readerToUse.reset()); } else if ("response.mcp_call.failed".equals(discriminatorValue)) { return ServerEventResponseMcpCallFailed.fromJson(readerToUse.reset()); + } else if ("response.foundry_agent_call_arguments.delta".equals(discriminatorValue)) { + return ServerEventResponseFoundryAgentCallArgumentsDelta.fromJson(readerToUse.reset()); + } else if ("response.foundry_agent_call_arguments.done".equals(discriminatorValue)) { + return ServerEventResponseFoundryAgentCallArgumentsDone.fromJson(readerToUse.reset()); + } else if ("response.foundry_agent_call.in_progress".equals(discriminatorValue)) { + return ServerEventResponseFoundryAgentCallInProgress.fromJson(readerToUse.reset()); + } else if ("response.foundry_agent_call.completed".equals(discriminatorValue)) { + return ServerEventResponseFoundryAgentCallCompleted.fromJson(readerToUse.reset()); + } else if ("response.foundry_agent_call.failed".equals(discriminatorValue)) { + return ServerEventResponseFoundryAgentCallFailed.fromJson(readerToUse.reset()); } else { return fromJsonKnownDiscriminator(readerToUse.reset()); } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ToolType.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ToolType.java index 46025e3bcdc3..b0766f40d5de 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ToolType.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/ToolType.java @@ -55,4 +55,10 @@ public static Collection values() { */ @Generated public static final ToolType MCP = fromString("mcp"); + + /** + * Static value foundry_agent for ToolType. + */ + @Generated + public static final ToolType FOUNDRY_AGENT = fromString("foundry_agent"); } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionOptions.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionOptions.java index 82a6e80c131e..5b42cc60dfe2 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionOptions.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionOptions.java @@ -547,6 +547,12 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeFieldName("max_response_output_tokens"); this.maxResponseOutputTokens.writeTo(jsonWriter); } + jsonWriter.writeStringField("reasoning_effort", + this.reasoningEffort == null ? null : this.reasoningEffort.toString()); + if (this.fillerResponse != null) { + jsonWriter.writeFieldName("filler_response"); + this.fillerResponse.writeTo(jsonWriter); + } return jsonWriter.writeEndObject(); } @@ -614,6 +620,12 @@ public static VoiceLiveSessionOptions fromJson(JsonReader jsonReader) throws IOE } else if ("max_response_output_tokens".equals(fieldName)) { deserializedVoiceLiveSessionOptions.maxResponseOutputTokens = reader.getNullable(nonNullReader -> BinaryData.fromObject(nonNullReader.readUntyped())); + } else if ("reasoning_effort".equals(fieldName)) { + deserializedVoiceLiveSessionOptions.reasoningEffort + = ReasoningEffort.fromString(reader.getString()); + } else if ("filler_response".equals(fieldName)) { + deserializedVoiceLiveSessionOptions.fillerResponse + = reader.getNullable(nonNullReader -> BinaryData.fromObject(nonNullReader.readUntyped())); } else { reader.skipChildren(); } @@ -658,4 +670,66 @@ public VoiceLiveSessionOptions setMaxResponseOutputTokens(BinaryData maxResponse this.maxResponseOutputTokens = maxResponseOutputTokens; return this; } + + /* + * Constrains effort on reasoning for reasoning models. Check model documentation for supported values for each + * model. + * Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response. + */ + @Generated + private ReasoningEffort reasoningEffort; + + /* + * Configuration for filler response generation during latency or tool calls. + */ + @Generated + private BinaryData fillerResponse; + + /** + * Get the reasoningEffort property: Constrains effort on reasoning for reasoning models. Check model documentation + * for supported values for each model. + * Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response. + * + * @return the reasoningEffort value. + */ + @Generated + public ReasoningEffort getReasoningEffort() { + return this.reasoningEffort; + } + + /** + * Set the reasoningEffort property: Constrains effort on reasoning for reasoning models. Check model documentation + * for supported values for each model. + * Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response. + * + * @param reasoningEffort the reasoningEffort value to set. + * @return the VoiceLiveSessionOptions object itself. + */ + @Generated + public VoiceLiveSessionOptions setReasoningEffort(ReasoningEffort reasoningEffort) { + this.reasoningEffort = reasoningEffort; + return this; + } + + /** + * Get the fillerResponse property: Configuration for filler response generation during latency or tool calls. + * + * @return the fillerResponse value. + */ + @Generated + public BinaryData getFillerResponse() { + return this.fillerResponse; + } + + /** + * Set the fillerResponse property: Configuration for filler response generation during latency or tool calls. + * + * @param fillerResponse the fillerResponse value to set. + * @return the VoiceLiveSessionOptions object itself. + */ + @Generated + public VoiceLiveSessionOptions setFillerResponse(BinaryData fillerResponse) { + this.fillerResponse = fillerResponse; + return this; + } } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionResponse.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionResponse.java index ab2da7c15db2..ef76630dc0f4 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionResponse.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionResponse.java @@ -603,6 +603,12 @@ public JsonWriter toJson(JsonWriter jsonWriter) throws IOException { jsonWriter.writeFieldName("max_response_output_tokens"); this.maxResponseOutputTokens.writeTo(jsonWriter); } + jsonWriter.writeStringField("reasoning_effort", + this.reasoningEffort == null ? null : this.reasoningEffort.toString()); + if (this.fillerResponse != null) { + jsonWriter.writeFieldName("filler_response"); + this.fillerResponse.writeTo(jsonWriter); + } jsonWriter.writeJsonField("agent", this.agent); jsonWriter.writeStringField("id", this.id); return jsonWriter.writeEndObject(); @@ -674,6 +680,12 @@ public static VoiceLiveSessionResponse fromJson(JsonReader jsonReader) throws IO } else if ("max_response_output_tokens".equals(fieldName)) { deserializedVoiceLiveSessionResponse.maxResponseOutputTokens = reader.getNullable(nonNullReader -> BinaryData.fromObject(nonNullReader.readUntyped())); + } else if ("reasoning_effort".equals(fieldName)) { + deserializedVoiceLiveSessionResponse.reasoningEffort + = ReasoningEffort.fromString(reader.getString()); + } else if ("filler_response".equals(fieldName)) { + deserializedVoiceLiveSessionResponse.fillerResponse + = reader.getNullable(nonNullReader -> BinaryData.fromObject(nonNullReader.readUntyped())); } else if ("agent".equals(fieldName)) { deserializedVoiceLiveSessionResponse.agent = RespondingAgentOptions.fromJson(reader); } else if ("id".equals(fieldName)) { @@ -722,4 +734,66 @@ public VoiceLiveSessionResponse setMaxResponseOutputTokens(BinaryData maxRespons this.maxResponseOutputTokens = maxResponseOutputTokens; return this; } + + /* + * Constrains effort on reasoning for reasoning models. Check model documentation for supported values for each + * model. + * Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response. + */ + @Generated + private ReasoningEffort reasoningEffort; + + /* + * Configuration for filler response generation during latency or tool calls. + */ + @Generated + private BinaryData fillerResponse; + + /** + * Get the reasoningEffort property: Constrains effort on reasoning for reasoning models. Check model documentation + * for supported values for each model. + * Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response. + * + * @return the reasoningEffort value. + */ + @Generated + public ReasoningEffort getReasoningEffort() { + return this.reasoningEffort; + } + + /** + * Set the reasoningEffort property: Constrains effort on reasoning for reasoning models. Check model documentation + * for supported values for each model. + * Reducing reasoning effort can result in faster responses and fewer tokens used on reasoning in a response. + * + * @param reasoningEffort the reasoningEffort value to set. + * @return the VoiceLiveSessionResponse object itself. + */ + @Generated + public VoiceLiveSessionResponse setReasoningEffort(ReasoningEffort reasoningEffort) { + this.reasoningEffort = reasoningEffort; + return this; + } + + /** + * Get the fillerResponse property: Configuration for filler response generation during latency or tool calls. + * + * @return the fillerResponse value. + */ + @Generated + public BinaryData getFillerResponse() { + return this.fillerResponse; + } + + /** + * Set the fillerResponse property: Configuration for filler response generation during latency or tool calls. + * + * @param fillerResponse the fillerResponse value to set. + * @return the VoiceLiveSessionResponse object itself. + */ + @Generated + public VoiceLiveSessionResponse setFillerResponse(BinaryData fillerResponse) { + this.fillerResponse = fillerResponse; + return this; + } } diff --git a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveToolDefinition.java b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveToolDefinition.java index dae0cd192f44..3091481947d9 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveToolDefinition.java +++ b/sdk/ai/azure-ai-voicelive/src/main/java/com/azure/ai/voicelive/models/VoiceLiveToolDefinition.java @@ -81,6 +81,8 @@ public static VoiceLiveToolDefinition fromJson(JsonReader jsonReader) throws IOE return VoiceLiveFunctionDefinition.fromJson(readerToUse.reset()); } else if ("mcp".equals(discriminatorValue)) { return MCPServer.fromJson(readerToUse.reset()); + } else if ("foundry_agent".equals(discriminatorValue)) { + return FoundryAgentTool.fromJson(readerToUse.reset()); } else { return fromJsonKnownDiscriminator(readerToUse.reset()); } diff --git a/sdk/ai/azure-ai-voicelive/src/main/resources/META-INF/azure-ai-voicelive_apiview_properties.json b/sdk/ai/azure-ai-voicelive/src/main/resources/META-INF/azure-ai-voicelive_apiview_properties.json index 6bf263f967ae..7d5774cec766 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/resources/META-INF/azure-ai-voicelive_apiview_properties.json +++ b/sdk/ai/azure-ai-voicelive/src/main/resources/META-INF/azure-ai-voicelive_apiview_properties.json @@ -24,6 +24,7 @@ "com.azure.ai.voicelive.models.AzureStandardVoice": "VoiceLive.AzureStandardVoice", "com.azure.ai.voicelive.models.AzureVoice": "VoiceLive.AzureVoice", "com.azure.ai.voicelive.models.AzureVoiceType": "VoiceLive.AzureVoiceType", + "com.azure.ai.voicelive.models.BasicFillerResponseConfig": "VoiceLive.BasicFillerResponseConfig", "com.azure.ai.voicelive.models.CachedTokenDetails": "VoiceLive.CachedTokenDetails", "com.azure.ai.voicelive.models.ClientEvent": "VoiceLive.ClientEvent", "com.azure.ai.voicelive.models.ClientEventConversationItemCreate": "VoiceLive.ClientEventConversationItemCreate", @@ -48,6 +49,11 @@ "com.azure.ai.voicelive.models.EouDetection": "VoiceLive.EouDetection", "com.azure.ai.voicelive.models.EouDetectionModel": "VoiceLive.EouDetection.model.anonymous", "com.azure.ai.voicelive.models.EouThresholdLevel": "VoiceLive.EouThresholdLevel", + "com.azure.ai.voicelive.models.FillerResponseConfigBase": "VoiceLive.FillerResponseConfigBase", + "com.azure.ai.voicelive.models.FillerResponseConfigType": "VoiceLive.FillerResponseConfigType", + "com.azure.ai.voicelive.models.FillerTrigger": "VoiceLive.FillerTrigger", + "com.azure.ai.voicelive.models.FoundryAgentContextType": "VoiceLive.FoundryAgentContextType", + "com.azure.ai.voicelive.models.FoundryAgentTool": "VoiceLive.FoundryAgentTool", "com.azure.ai.voicelive.models.FunctionCallItem": "VoiceLive.FunctionCallItem", "com.azure.ai.voicelive.models.FunctionCallOutputItem": "VoiceLive.FunctionCallOutputItem", "com.azure.ai.voicelive.models.IceServer": "VoiceLive.IceServer", @@ -58,6 +64,7 @@ "com.azure.ai.voicelive.models.InteractionModality": "VoiceLive.Modality", "com.azure.ai.voicelive.models.ItemParamStatus": "VoiceLive.ItemParamStatus", "com.azure.ai.voicelive.models.ItemType": "VoiceLive.ItemType", + "com.azure.ai.voicelive.models.LlmFillerResponseConfig": "VoiceLive.LlmFillerResponseConfig", "com.azure.ai.voicelive.models.LogProbProperties": "VoiceLive.LogProbProperties", "com.azure.ai.voicelive.models.MCPApprovalResponseRequestItem": "VoiceLive.MCPApprovalResponseRequestItem", "com.azure.ai.voicelive.models.MCPApprovalType": "VoiceLive.MCPApprovalType", @@ -72,6 +79,7 @@ "com.azure.ai.voicelive.models.OutputTokenDetails": "VoiceLive.OutputTokenDetails", "com.azure.ai.voicelive.models.PersonalVoiceModels": "VoiceLive.PersonalVoiceModels", "com.azure.ai.voicelive.models.PhotoAvatarBaseModes": "VoiceLive.PhotoAvatarBaseModes", + "com.azure.ai.voicelive.models.ReasoningEffort": "VoiceLive.ReasoningEffort", "com.azure.ai.voicelive.models.RequestAudioContentPart": "VoiceLive.RequestAudioContentPart", "com.azure.ai.voicelive.models.RequestImageContentPart": "VoiceLive.RequestImageContentPart", "com.azure.ai.voicelive.models.RequestImageContentPartDetail": "VoiceLive.RequestImageContentPartDetail", @@ -82,6 +90,7 @@ "com.azure.ai.voicelive.models.ResponseCancelledDetailsReason": "VoiceLive.ResponseCancelledDetails.reason.anonymous", "com.azure.ai.voicelive.models.ResponseCreateParams": "VoiceLive.ResponseCreateParams", "com.azure.ai.voicelive.models.ResponseFailedDetails": "VoiceLive.ResponseFailedDetails", + "com.azure.ai.voicelive.models.ResponseFoundryAgentCallItem": "VoiceLive.ResponseFoundryAgentCallItem", "com.azure.ai.voicelive.models.ResponseFunctionCallItem": "VoiceLive.ResponseFunctionCallItem", "com.azure.ai.voicelive.models.ResponseFunctionCallOutputItem": "VoiceLive.ResponseFunctionCallOutputItem", "com.azure.ai.voicelive.models.ResponseIncompleteDetails": "VoiceLive.ResponseIncompleteDetails", @@ -99,6 +108,11 @@ "com.azure.ai.voicelive.models.ServerEventMcpListToolsCompleted": "VoiceLive.ServerEventMcpListToolsCompleted", "com.azure.ai.voicelive.models.ServerEventMcpListToolsFailed": "VoiceLive.ServerEventMcpListToolsFailed", "com.azure.ai.voicelive.models.ServerEventMcpListToolsInProgress": "VoiceLive.ServerEventMcpListToolsInProgress", + "com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallArgumentsDelta": "VoiceLive.ServerEventResponseFoundryAgentCallArgumentsDelta", + "com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallArgumentsDone": "VoiceLive.ServerEventResponseFoundryAgentCallArgumentsDone", + "com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallCompleted": "VoiceLive.ServerEventResponseFoundryAgentCallCompleted", + "com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallFailed": "VoiceLive.ServerEventResponseFoundryAgentCallFailed", + "com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallInProgress": "VoiceLive.ServerEventResponseFoundryAgentCallInProgress", "com.azure.ai.voicelive.models.ServerEventResponseMcpCallArgumentsDelta": "VoiceLive.ServerEventResponseMcpCallArgumentsDelta", "com.azure.ai.voicelive.models.ServerEventResponseMcpCallArgumentsDone": "VoiceLive.ServerEventResponseMcpCallArgumentsDone", "com.azure.ai.voicelive.models.ServerEventResponseMcpCallCompleted": "VoiceLive.ServerEventResponseMcpCallCompleted", diff --git a/sdk/ai/azure-ai-voicelive/src/main/resources/META-INF/azure-ai-voicelive_metadata.json b/sdk/ai/azure-ai-voicelive/src/main/resources/META-INF/azure-ai-voicelive_metadata.json index a47de149bab1..b91181bca424 100644 --- a/sdk/ai/azure-ai-voicelive/src/main/resources/META-INF/azure-ai-voicelive_metadata.json +++ b/sdk/ai/azure-ai-voicelive/src/main/resources/META-INF/azure-ai-voicelive_metadata.json @@ -1 +1 @@ -{"flavor":"azure","crossLanguageDefinitions":{"com.azure.ai.voicelive.models.AnimationOptions":"VoiceLive.Animation","com.azure.ai.voicelive.models.AnimationOutputType":"VoiceLive.AnimationOutputType","com.azure.ai.voicelive.models.AssistantMessageItem":"VoiceLive.AssistantMessageItem","com.azure.ai.voicelive.models.AudioEchoCancellation":"VoiceLive.AudioEchoCancellation","com.azure.ai.voicelive.models.AudioInputTranscriptionOptions":"VoiceLive.AudioInputTranscriptionOptions","com.azure.ai.voicelive.models.AudioInputTranscriptionOptionsModel":"VoiceLive.AudioInputTranscriptionOptions.model.anonymous","com.azure.ai.voicelive.models.AudioNoiseReduction":"VoiceLive.AudioNoiseReduction","com.azure.ai.voicelive.models.AudioNoiseReductionType":"VoiceLive.AudioNoiseReduction.type.anonymous","com.azure.ai.voicelive.models.AudioTimestampType":"VoiceLive.AudioTimestampType","com.azure.ai.voicelive.models.AvatarConfigTypes":"VoiceLive.AvatarConfigTypes","com.azure.ai.voicelive.models.AvatarConfiguration":"VoiceLive.AvatarConfig","com.azure.ai.voicelive.models.AvatarOutputProtocol":"VoiceLive.AvatarOutputProtocol","com.azure.ai.voicelive.models.AzureCustomVoice":"VoiceLive.AzureCustomVoice","com.azure.ai.voicelive.models.AzurePersonalVoice":"VoiceLive.AzurePersonalVoice","com.azure.ai.voicelive.models.AzureSemanticEouDetection":"VoiceLive.AzureSemanticDetection","com.azure.ai.voicelive.models.AzureSemanticEouDetectionEn":"VoiceLive.AzureSemanticDetectionEn","com.azure.ai.voicelive.models.AzureSemanticEouDetectionMultilingual":"VoiceLive.AzureSemanticDetectionMultilingual","com.azure.ai.voicelive.models.AzureSemanticVadTurnDetection":"VoiceLive.AzureSemanticVad","com.azure.ai.voicelive.models.AzureSemanticVadTurnDetectionEn":"VoiceLive.AzureSemanticVadEn","com.azure.ai.voicelive.models.AzureSemanticVadTurnDetectionMultilingual":"VoiceLive.AzureSemanticVadMultilingual","com.azure.ai.voicelive.models.AzureStandardVoice":"VoiceLive.AzureStandardVoice","com.azure.ai.voicelive.models.AzureVoice":"VoiceLive.AzureVoice","com.azure.ai.voicelive.models.AzureVoiceType":"VoiceLive.AzureVoiceType","com.azure.ai.voicelive.models.CachedTokenDetails":"VoiceLive.CachedTokenDetails","com.azure.ai.voicelive.models.ClientEvent":"VoiceLive.ClientEvent","com.azure.ai.voicelive.models.ClientEventConversationItemCreate":"VoiceLive.ClientEventConversationItemCreate","com.azure.ai.voicelive.models.ClientEventConversationItemDelete":"VoiceLive.ClientEventConversationItemDelete","com.azure.ai.voicelive.models.ClientEventConversationItemRetrieve":"VoiceLive.ClientEventConversationItemRetrieve","com.azure.ai.voicelive.models.ClientEventConversationItemTruncate":"VoiceLive.ClientEventConversationItemTruncate","com.azure.ai.voicelive.models.ClientEventInputAudioBufferAppend":"VoiceLive.ClientEventInputAudioBufferAppend","com.azure.ai.voicelive.models.ClientEventInputAudioBufferClear":"VoiceLive.ClientEventInputAudioBufferClear","com.azure.ai.voicelive.models.ClientEventInputAudioBufferCommit":"VoiceLive.ClientEventInputAudioBufferCommit","com.azure.ai.voicelive.models.ClientEventInputAudioClear":"VoiceLive.ClientEventInputAudioClear","com.azure.ai.voicelive.models.ClientEventInputAudioTurnAppend":"VoiceLive.ClientEventInputAudioTurnAppend","com.azure.ai.voicelive.models.ClientEventInputAudioTurnCancel":"VoiceLive.ClientEventInputAudioTurnCancel","com.azure.ai.voicelive.models.ClientEventInputAudioTurnEnd":"VoiceLive.ClientEventInputAudioTurnEnd","com.azure.ai.voicelive.models.ClientEventInputAudioTurnStart":"VoiceLive.ClientEventInputAudioTurnStart","com.azure.ai.voicelive.models.ClientEventResponseCancel":"VoiceLive.ClientEventResponseCancel","com.azure.ai.voicelive.models.ClientEventResponseCreate":"VoiceLive.ClientEventResponseCreate","com.azure.ai.voicelive.models.ClientEventSessionAvatarConnect":"VoiceLive.ClientEventSessionAvatarConnect","com.azure.ai.voicelive.models.ClientEventSessionUpdate":"VoiceLive.ClientEventSessionUpdate","com.azure.ai.voicelive.models.ClientEventType":"VoiceLive.ClientEventType","com.azure.ai.voicelive.models.ContentPartType":"VoiceLive.ContentPartType","com.azure.ai.voicelive.models.ConversationRequestItem":"VoiceLive.ConversationRequestItem","com.azure.ai.voicelive.models.EouDetection":"VoiceLive.EouDetection","com.azure.ai.voicelive.models.EouDetectionModel":"VoiceLive.EouDetection.model.anonymous","com.azure.ai.voicelive.models.EouThresholdLevel":"VoiceLive.EouThresholdLevel","com.azure.ai.voicelive.models.FunctionCallItem":"VoiceLive.FunctionCallItem","com.azure.ai.voicelive.models.FunctionCallOutputItem":"VoiceLive.FunctionCallOutputItem","com.azure.ai.voicelive.models.IceServer":"VoiceLive.IceServer","com.azure.ai.voicelive.models.InputAudioContentPart":"VoiceLive.InputAudioContentPart","com.azure.ai.voicelive.models.InputAudioFormat":"VoiceLive.InputAudioFormat","com.azure.ai.voicelive.models.InputTextContentPart":"VoiceLive.InputTextContentPart","com.azure.ai.voicelive.models.InputTokenDetails":"VoiceLive.InputTokenDetails","com.azure.ai.voicelive.models.InteractionModality":"VoiceLive.Modality","com.azure.ai.voicelive.models.ItemParamStatus":"VoiceLive.ItemParamStatus","com.azure.ai.voicelive.models.ItemType":"VoiceLive.ItemType","com.azure.ai.voicelive.models.LogProbProperties":"VoiceLive.LogProbProperties","com.azure.ai.voicelive.models.MCPApprovalResponseRequestItem":"VoiceLive.MCPApprovalResponseRequestItem","com.azure.ai.voicelive.models.MCPApprovalType":"VoiceLive.MCPApprovalType","com.azure.ai.voicelive.models.MCPServer":"VoiceLive.MCPServer","com.azure.ai.voicelive.models.MCPTool":"VoiceLive.MCPTool","com.azure.ai.voicelive.models.MessageContentPart":"VoiceLive.MessageContentPart","com.azure.ai.voicelive.models.MessageItem":"VoiceLive.MessageItem","com.azure.ai.voicelive.models.OpenAIVoice":"VoiceLive.OpenAIVoice","com.azure.ai.voicelive.models.OpenAIVoiceName":"VoiceLive.OAIVoice","com.azure.ai.voicelive.models.OutputAudioFormat":"VoiceLive.OutputAudioFormat","com.azure.ai.voicelive.models.OutputTextContentPart":"VoiceLive.OutputTextContentPart","com.azure.ai.voicelive.models.OutputTokenDetails":"VoiceLive.OutputTokenDetails","com.azure.ai.voicelive.models.PersonalVoiceModels":"VoiceLive.PersonalVoiceModels","com.azure.ai.voicelive.models.PhotoAvatarBaseModes":"VoiceLive.PhotoAvatarBaseModes","com.azure.ai.voicelive.models.RequestAudioContentPart":"VoiceLive.RequestAudioContentPart","com.azure.ai.voicelive.models.RequestImageContentPart":"VoiceLive.RequestImageContentPart","com.azure.ai.voicelive.models.RequestImageContentPartDetail":"VoiceLive.RequestImageContentPartDetail","com.azure.ai.voicelive.models.RequestTextContentPart":"VoiceLive.RequestTextContentPart","com.azure.ai.voicelive.models.RespondingAgentOptions":"VoiceLive.AgentConfig","com.azure.ai.voicelive.models.ResponseAudioContentPart":"VoiceLive.ResponseAudioContentPart","com.azure.ai.voicelive.models.ResponseCancelledDetails":"VoiceLive.ResponseCancelledDetails","com.azure.ai.voicelive.models.ResponseCancelledDetailsReason":"VoiceLive.ResponseCancelledDetails.reason.anonymous","com.azure.ai.voicelive.models.ResponseCreateParams":"VoiceLive.ResponseCreateParams","com.azure.ai.voicelive.models.ResponseFailedDetails":"VoiceLive.ResponseFailedDetails","com.azure.ai.voicelive.models.ResponseFunctionCallItem":"VoiceLive.ResponseFunctionCallItem","com.azure.ai.voicelive.models.ResponseFunctionCallOutputItem":"VoiceLive.ResponseFunctionCallOutputItem","com.azure.ai.voicelive.models.ResponseIncompleteDetails":"VoiceLive.ResponseIncompleteDetails","com.azure.ai.voicelive.models.ResponseIncompleteDetailsReason":"VoiceLive.ResponseIncompleteDetails.reason.anonymous","com.azure.ai.voicelive.models.ResponseItemObject":null,"com.azure.ai.voicelive.models.ResponseMCPApprovalRequestItem":"VoiceLive.ResponseMCPApprovalRequestItem","com.azure.ai.voicelive.models.ResponseMCPApprovalResponseItem":"VoiceLive.ResponseMCPApprovalResponseItem","com.azure.ai.voicelive.models.ResponseMCPCallItem":"VoiceLive.ResponseMCPCallItem","com.azure.ai.voicelive.models.ResponseMCPListToolItem":"VoiceLive.ResponseMCPListToolItem","com.azure.ai.voicelive.models.ResponseMessageRole":"VoiceLive.MessageRole","com.azure.ai.voicelive.models.ResponseObject":null,"com.azure.ai.voicelive.models.ResponseStatusDetails":"VoiceLive.ResponseStatusDetails","com.azure.ai.voicelive.models.ResponseTextContentPart":"VoiceLive.ResponseTextContentPart","com.azure.ai.voicelive.models.ResponseTokenStatistics":"VoiceLive.TokenUsage","com.azure.ai.voicelive.models.ServerEventMcpListToolsCompleted":"VoiceLive.ServerEventMcpListToolsCompleted","com.azure.ai.voicelive.models.ServerEventMcpListToolsFailed":"VoiceLive.ServerEventMcpListToolsFailed","com.azure.ai.voicelive.models.ServerEventMcpListToolsInProgress":"VoiceLive.ServerEventMcpListToolsInProgress","com.azure.ai.voicelive.models.ServerEventResponseMcpCallArgumentsDelta":"VoiceLive.ServerEventResponseMcpCallArgumentsDelta","com.azure.ai.voicelive.models.ServerEventResponseMcpCallArgumentsDone":"VoiceLive.ServerEventResponseMcpCallArgumentsDone","com.azure.ai.voicelive.models.ServerEventResponseMcpCallCompleted":"VoiceLive.ServerEventResponseMcpCallCompleted","com.azure.ai.voicelive.models.ServerEventResponseMcpCallFailed":"VoiceLive.ServerEventResponseMcpCallFailed","com.azure.ai.voicelive.models.ServerEventResponseMcpCallInProgress":"VoiceLive.ServerEventResponseMcpCallInProgress","com.azure.ai.voicelive.models.ServerEventType":"VoiceLive.ServerEventType","com.azure.ai.voicelive.models.ServerVadTurnDetection":"VoiceLive.ServerVad","com.azure.ai.voicelive.models.SessionResponse":"VoiceLive.Response","com.azure.ai.voicelive.models.SessionResponseItem":"VoiceLive.ResponseItem","com.azure.ai.voicelive.models.SessionResponseItemStatus":"VoiceLive.ResponseItemStatus","com.azure.ai.voicelive.models.SessionResponseMessageItem":"VoiceLive.ResponseMessageItem","com.azure.ai.voicelive.models.SessionResponseStatus":"VoiceLive.ResponseStatus","com.azure.ai.voicelive.models.SessionUpdate":"VoiceLive.ServerEvent","com.azure.ai.voicelive.models.SessionUpdateAvatarConnecting":"VoiceLive.ServerEventSessionAvatarConnecting","com.azure.ai.voicelive.models.SessionUpdateConversationItemCreated":"VoiceLive.ServerEventConversationItemCreated","com.azure.ai.voicelive.models.SessionUpdateConversationItemDeleted":"VoiceLive.ServerEventConversationItemDeleted","com.azure.ai.voicelive.models.SessionUpdateConversationItemInputAudioTranscriptionCompleted":"VoiceLive.ServerEventConversationItemInputAudioTranscriptionCompleted","com.azure.ai.voicelive.models.SessionUpdateConversationItemInputAudioTranscriptionDelta":"VoiceLive.ServerEventConversationItemInputAudioTranscriptionDelta","com.azure.ai.voicelive.models.SessionUpdateConversationItemInputAudioTranscriptionFailed":"VoiceLive.ServerEventConversationItemInputAudioTranscriptionFailed","com.azure.ai.voicelive.models.SessionUpdateConversationItemRetrieved":"VoiceLive.ServerEventConversationItemRetrieved","com.azure.ai.voicelive.models.SessionUpdateConversationItemTruncated":"VoiceLive.ServerEventConversationItemTruncated","com.azure.ai.voicelive.models.SessionUpdateError":"VoiceLive.ServerEventError","com.azure.ai.voicelive.models.SessionUpdateErrorDetails":"VoiceLive.ServerEventErrorDetails","com.azure.ai.voicelive.models.SessionUpdateInputAudioBufferCleared":"VoiceLive.ServerEventInputAudioBufferCleared","com.azure.ai.voicelive.models.SessionUpdateInputAudioBufferCommitted":"VoiceLive.ServerEventInputAudioBufferCommitted","com.azure.ai.voicelive.models.SessionUpdateInputAudioBufferSpeechStarted":"VoiceLive.ServerEventInputAudioBufferSpeechStarted","com.azure.ai.voicelive.models.SessionUpdateInputAudioBufferSpeechStopped":"VoiceLive.ServerEventInputAudioBufferSpeechStopped","com.azure.ai.voicelive.models.SessionUpdateResponseAnimationBlendshapeDelta":"VoiceLive.ServerEventResponseAnimationBlendshapeDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAnimationBlendshapeDone":"VoiceLive.ServerEventResponseAnimationBlendshapeDone","com.azure.ai.voicelive.models.SessionUpdateResponseAnimationVisemeDelta":"VoiceLive.ServerEventResponseAnimationVisemeDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAnimationVisemeDone":"VoiceLive.ServerEventResponseAnimationVisemeDone","com.azure.ai.voicelive.models.SessionUpdateResponseAudioDelta":"VoiceLive.ServerEventResponseAudioDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAudioDone":"VoiceLive.ServerEventResponseAudioDone","com.azure.ai.voicelive.models.SessionUpdateResponseAudioTimestampDelta":"VoiceLive.ServerEventResponseAudioTimestampDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAudioTimestampDone":"VoiceLive.ServerEventResponseAudioTimestampDone","com.azure.ai.voicelive.models.SessionUpdateResponseAudioTranscriptDelta":"VoiceLive.ServerEventResponseAudioTranscriptDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAudioTranscriptDone":"VoiceLive.ServerEventResponseAudioTranscriptDone","com.azure.ai.voicelive.models.SessionUpdateResponseContentPartAdded":"VoiceLive.ServerEventResponseContentPartAdded","com.azure.ai.voicelive.models.SessionUpdateResponseContentPartDone":"VoiceLive.ServerEventResponseContentPartDone","com.azure.ai.voicelive.models.SessionUpdateResponseCreated":"VoiceLive.ServerEventResponseCreated","com.azure.ai.voicelive.models.SessionUpdateResponseDone":"VoiceLive.ServerEventResponseDone","com.azure.ai.voicelive.models.SessionUpdateResponseFunctionCallArgumentsDelta":"VoiceLive.ServerEventResponseFunctionCallArgumentsDelta","com.azure.ai.voicelive.models.SessionUpdateResponseFunctionCallArgumentsDone":"VoiceLive.ServerEventResponseFunctionCallArgumentsDone","com.azure.ai.voicelive.models.SessionUpdateResponseOutputItemAdded":"VoiceLive.ServerEventResponseOutputItemAdded","com.azure.ai.voicelive.models.SessionUpdateResponseOutputItemDone":"VoiceLive.ServerEventResponseOutputItemDone","com.azure.ai.voicelive.models.SessionUpdateResponseTextDelta":"VoiceLive.ServerEventResponseTextDelta","com.azure.ai.voicelive.models.SessionUpdateResponseTextDone":"VoiceLive.ServerEventResponseTextDone","com.azure.ai.voicelive.models.SessionUpdateSessionCreated":"VoiceLive.ServerEventSessionCreated","com.azure.ai.voicelive.models.SessionUpdateSessionUpdated":"VoiceLive.ServerEventSessionUpdated","com.azure.ai.voicelive.models.SystemMessageItem":"VoiceLive.SystemMessageItem","com.azure.ai.voicelive.models.ToolChoiceFunctionSelection":"VoiceLive.ToolChoiceFunctionObject","com.azure.ai.voicelive.models.ToolChoiceLiteral":"VoiceLive.ToolChoiceLiteral","com.azure.ai.voicelive.models.ToolChoiceSelection":"VoiceLive.ToolChoiceObject","com.azure.ai.voicelive.models.ToolType":"VoiceLive.ToolType","com.azure.ai.voicelive.models.TurnDetection":"VoiceLive.TurnDetection","com.azure.ai.voicelive.models.TurnDetectionType":"VoiceLive.TurnDetectionType","com.azure.ai.voicelive.models.UserMessageItem":"VoiceLive.UserMessageItem","com.azure.ai.voicelive.models.VideoBackground":"VoiceLive.Background","com.azure.ai.voicelive.models.VideoCrop":"VoiceLive.VideoCrop","com.azure.ai.voicelive.models.VideoParams":"VoiceLive.VideoParams","com.azure.ai.voicelive.models.VideoParamsCodec":null,"com.azure.ai.voicelive.models.VideoResolution":"VoiceLive.VideoResolution","com.azure.ai.voicelive.models.VoiceLiveContentPart":"VoiceLive.ContentPart","com.azure.ai.voicelive.models.VoiceLiveErrorDetails":"VoiceLive.VoiceLiveErrorDetails","com.azure.ai.voicelive.models.VoiceLiveFunctionDefinition":"VoiceLive.FunctionTool","com.azure.ai.voicelive.models.VoiceLiveSessionOptions":"VoiceLive.RequestSession","com.azure.ai.voicelive.models.VoiceLiveSessionResponse":"VoiceLive.ResponseSession","com.azure.ai.voicelive.models.VoiceLiveToolDefinition":"VoiceLive.Tool"},"generatedFiles":["src/main/java/com/azure/ai/voicelive/implementation/package-info.java","src/main/java/com/azure/ai/voicelive/models/AnimationOptions.java","src/main/java/com/azure/ai/voicelive/models/AnimationOutputType.java","src/main/java/com/azure/ai/voicelive/models/AssistantMessageItem.java","src/main/java/com/azure/ai/voicelive/models/AudioEchoCancellation.java","src/main/java/com/azure/ai/voicelive/models/AudioInputTranscriptionOptions.java","src/main/java/com/azure/ai/voicelive/models/AudioInputTranscriptionOptionsModel.java","src/main/java/com/azure/ai/voicelive/models/AudioNoiseReduction.java","src/main/java/com/azure/ai/voicelive/models/AudioNoiseReductionType.java","src/main/java/com/azure/ai/voicelive/models/AudioTimestampType.java","src/main/java/com/azure/ai/voicelive/models/AvatarConfigTypes.java","src/main/java/com/azure/ai/voicelive/models/AvatarConfiguration.java","src/main/java/com/azure/ai/voicelive/models/AvatarOutputProtocol.java","src/main/java/com/azure/ai/voicelive/models/AzureCustomVoice.java","src/main/java/com/azure/ai/voicelive/models/AzurePersonalVoice.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticEouDetection.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticEouDetectionEn.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticEouDetectionMultilingual.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticVadTurnDetection.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticVadTurnDetectionEn.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticVadTurnDetectionMultilingual.java","src/main/java/com/azure/ai/voicelive/models/AzureStandardVoice.java","src/main/java/com/azure/ai/voicelive/models/AzureVoice.java","src/main/java/com/azure/ai/voicelive/models/AzureVoiceType.java","src/main/java/com/azure/ai/voicelive/models/CachedTokenDetails.java","src/main/java/com/azure/ai/voicelive/models/ClientEvent.java","src/main/java/com/azure/ai/voicelive/models/ClientEventConversationItemCreate.java","src/main/java/com/azure/ai/voicelive/models/ClientEventConversationItemDelete.java","src/main/java/com/azure/ai/voicelive/models/ClientEventConversationItemRetrieve.java","src/main/java/com/azure/ai/voicelive/models/ClientEventConversationItemTruncate.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioBufferAppend.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioBufferClear.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioBufferCommit.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioClear.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioTurnAppend.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioTurnCancel.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioTurnEnd.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioTurnStart.java","src/main/java/com/azure/ai/voicelive/models/ClientEventResponseCancel.java","src/main/java/com/azure/ai/voicelive/models/ClientEventResponseCreate.java","src/main/java/com/azure/ai/voicelive/models/ClientEventSessionAvatarConnect.java","src/main/java/com/azure/ai/voicelive/models/ClientEventSessionUpdate.java","src/main/java/com/azure/ai/voicelive/models/ClientEventType.java","src/main/java/com/azure/ai/voicelive/models/ContentPartType.java","src/main/java/com/azure/ai/voicelive/models/ConversationRequestItem.java","src/main/java/com/azure/ai/voicelive/models/EouDetection.java","src/main/java/com/azure/ai/voicelive/models/EouDetectionModel.java","src/main/java/com/azure/ai/voicelive/models/EouThresholdLevel.java","src/main/java/com/azure/ai/voicelive/models/FunctionCallItem.java","src/main/java/com/azure/ai/voicelive/models/FunctionCallOutputItem.java","src/main/java/com/azure/ai/voicelive/models/IceServer.java","src/main/java/com/azure/ai/voicelive/models/InputAudioContentPart.java","src/main/java/com/azure/ai/voicelive/models/InputAudioFormat.java","src/main/java/com/azure/ai/voicelive/models/InputTextContentPart.java","src/main/java/com/azure/ai/voicelive/models/InputTokenDetails.java","src/main/java/com/azure/ai/voicelive/models/InteractionModality.java","src/main/java/com/azure/ai/voicelive/models/ItemParamStatus.java","src/main/java/com/azure/ai/voicelive/models/ItemType.java","src/main/java/com/azure/ai/voicelive/models/LogProbProperties.java","src/main/java/com/azure/ai/voicelive/models/MCPApprovalResponseRequestItem.java","src/main/java/com/azure/ai/voicelive/models/MCPApprovalType.java","src/main/java/com/azure/ai/voicelive/models/MCPServer.java","src/main/java/com/azure/ai/voicelive/models/MCPTool.java","src/main/java/com/azure/ai/voicelive/models/MessageContentPart.java","src/main/java/com/azure/ai/voicelive/models/MessageItem.java","src/main/java/com/azure/ai/voicelive/models/OpenAIVoice.java","src/main/java/com/azure/ai/voicelive/models/OpenAIVoiceName.java","src/main/java/com/azure/ai/voicelive/models/OutputAudioFormat.java","src/main/java/com/azure/ai/voicelive/models/OutputTextContentPart.java","src/main/java/com/azure/ai/voicelive/models/OutputTokenDetails.java","src/main/java/com/azure/ai/voicelive/models/PersonalVoiceModels.java","src/main/java/com/azure/ai/voicelive/models/PhotoAvatarBaseModes.java","src/main/java/com/azure/ai/voicelive/models/RequestAudioContentPart.java","src/main/java/com/azure/ai/voicelive/models/RequestImageContentPart.java","src/main/java/com/azure/ai/voicelive/models/RequestImageContentPartDetail.java","src/main/java/com/azure/ai/voicelive/models/RequestTextContentPart.java","src/main/java/com/azure/ai/voicelive/models/RespondingAgentOptions.java","src/main/java/com/azure/ai/voicelive/models/ResponseAudioContentPart.java","src/main/java/com/azure/ai/voicelive/models/ResponseCancelledDetails.java","src/main/java/com/azure/ai/voicelive/models/ResponseCancelledDetailsReason.java","src/main/java/com/azure/ai/voicelive/models/ResponseCreateParams.java","src/main/java/com/azure/ai/voicelive/models/ResponseFailedDetails.java","src/main/java/com/azure/ai/voicelive/models/ResponseFunctionCallItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseFunctionCallOutputItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseIncompleteDetails.java","src/main/java/com/azure/ai/voicelive/models/ResponseIncompleteDetailsReason.java","src/main/java/com/azure/ai/voicelive/models/ResponseItemObject.java","src/main/java/com/azure/ai/voicelive/models/ResponseMCPApprovalRequestItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseMCPApprovalResponseItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseMCPCallItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseMCPListToolItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseMessageRole.java","src/main/java/com/azure/ai/voicelive/models/ResponseObject.java","src/main/java/com/azure/ai/voicelive/models/ResponseStatusDetails.java","src/main/java/com/azure/ai/voicelive/models/ResponseTextContentPart.java","src/main/java/com/azure/ai/voicelive/models/ResponseTokenStatistics.java","src/main/java/com/azure/ai/voicelive/models/ServerEventMcpListToolsCompleted.java","src/main/java/com/azure/ai/voicelive/models/ServerEventMcpListToolsFailed.java","src/main/java/com/azure/ai/voicelive/models/ServerEventMcpListToolsInProgress.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallArgumentsDelta.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallArgumentsDone.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallCompleted.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallFailed.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallInProgress.java","src/main/java/com/azure/ai/voicelive/models/ServerEventType.java","src/main/java/com/azure/ai/voicelive/models/ServerVadTurnDetection.java","src/main/java/com/azure/ai/voicelive/models/SessionResponse.java","src/main/java/com/azure/ai/voicelive/models/SessionResponseItem.java","src/main/java/com/azure/ai/voicelive/models/SessionResponseItemStatus.java","src/main/java/com/azure/ai/voicelive/models/SessionResponseMessageItem.java","src/main/java/com/azure/ai/voicelive/models/SessionResponseStatus.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdate.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateAvatarConnecting.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemCreated.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemDeleted.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemInputAudioTranscriptionCompleted.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemInputAudioTranscriptionDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemInputAudioTranscriptionFailed.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemRetrieved.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemTruncated.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateError.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateErrorDetails.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateInputAudioBufferCleared.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateInputAudioBufferCommitted.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateInputAudioBufferSpeechStarted.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateInputAudioBufferSpeechStopped.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAnimationBlendshapeDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAnimationBlendshapeDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAnimationVisemeDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAnimationVisemeDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioTimestampDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioTimestampDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioTranscriptDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioTranscriptDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseContentPartAdded.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseContentPartDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseCreated.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseFunctionCallArgumentsDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseFunctionCallArgumentsDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseOutputItemAdded.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseOutputItemDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseTextDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseTextDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateSessionCreated.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateSessionUpdated.java","src/main/java/com/azure/ai/voicelive/models/SystemMessageItem.java","src/main/java/com/azure/ai/voicelive/models/ToolChoiceFunctionSelection.java","src/main/java/com/azure/ai/voicelive/models/ToolChoiceLiteral.java","src/main/java/com/azure/ai/voicelive/models/ToolChoiceSelection.java","src/main/java/com/azure/ai/voicelive/models/ToolType.java","src/main/java/com/azure/ai/voicelive/models/TurnDetection.java","src/main/java/com/azure/ai/voicelive/models/TurnDetectionType.java","src/main/java/com/azure/ai/voicelive/models/UserMessageItem.java","src/main/java/com/azure/ai/voicelive/models/VideoBackground.java","src/main/java/com/azure/ai/voicelive/models/VideoCrop.java","src/main/java/com/azure/ai/voicelive/models/VideoParams.java","src/main/java/com/azure/ai/voicelive/models/VideoParamsCodec.java","src/main/java/com/azure/ai/voicelive/models/VideoResolution.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveContentPart.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveErrorDetails.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveFunctionDefinition.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionOptions.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionResponse.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveToolDefinition.java","src/main/java/com/azure/ai/voicelive/models/package-info.java","src/main/java/com/azure/ai/voicelive/package-info.java","src/main/java/module-info.java"]} \ No newline at end of file +{"flavor":"azure","crossLanguageDefinitions":{"com.azure.ai.voicelive.models.AnimationOptions":"VoiceLive.Animation","com.azure.ai.voicelive.models.AnimationOutputType":"VoiceLive.AnimationOutputType","com.azure.ai.voicelive.models.AssistantMessageItem":"VoiceLive.AssistantMessageItem","com.azure.ai.voicelive.models.AudioEchoCancellation":"VoiceLive.AudioEchoCancellation","com.azure.ai.voicelive.models.AudioInputTranscriptionOptions":"VoiceLive.AudioInputTranscriptionOptions","com.azure.ai.voicelive.models.AudioInputTranscriptionOptionsModel":"VoiceLive.AudioInputTranscriptionOptions.model.anonymous","com.azure.ai.voicelive.models.AudioNoiseReduction":"VoiceLive.AudioNoiseReduction","com.azure.ai.voicelive.models.AudioNoiseReductionType":"VoiceLive.AudioNoiseReduction.type.anonymous","com.azure.ai.voicelive.models.AudioTimestampType":"VoiceLive.AudioTimestampType","com.azure.ai.voicelive.models.AvatarConfigTypes":"VoiceLive.AvatarConfigTypes","com.azure.ai.voicelive.models.AvatarConfiguration":"VoiceLive.AvatarConfig","com.azure.ai.voicelive.models.AvatarOutputProtocol":"VoiceLive.AvatarOutputProtocol","com.azure.ai.voicelive.models.AzureCustomVoice":"VoiceLive.AzureCustomVoice","com.azure.ai.voicelive.models.AzurePersonalVoice":"VoiceLive.AzurePersonalVoice","com.azure.ai.voicelive.models.AzureSemanticEouDetection":"VoiceLive.AzureSemanticDetection","com.azure.ai.voicelive.models.AzureSemanticEouDetectionEn":"VoiceLive.AzureSemanticDetectionEn","com.azure.ai.voicelive.models.AzureSemanticEouDetectionMultilingual":"VoiceLive.AzureSemanticDetectionMultilingual","com.azure.ai.voicelive.models.AzureSemanticVadTurnDetection":"VoiceLive.AzureSemanticVad","com.azure.ai.voicelive.models.AzureSemanticVadTurnDetectionEn":"VoiceLive.AzureSemanticVadEn","com.azure.ai.voicelive.models.AzureSemanticVadTurnDetectionMultilingual":"VoiceLive.AzureSemanticVadMultilingual","com.azure.ai.voicelive.models.AzureStandardVoice":"VoiceLive.AzureStandardVoice","com.azure.ai.voicelive.models.AzureVoice":"VoiceLive.AzureVoice","com.azure.ai.voicelive.models.AzureVoiceType":"VoiceLive.AzureVoiceType","com.azure.ai.voicelive.models.BasicFillerResponseConfig":"VoiceLive.BasicFillerResponseConfig","com.azure.ai.voicelive.models.CachedTokenDetails":"VoiceLive.CachedTokenDetails","com.azure.ai.voicelive.models.ClientEvent":"VoiceLive.ClientEvent","com.azure.ai.voicelive.models.ClientEventConversationItemCreate":"VoiceLive.ClientEventConversationItemCreate","com.azure.ai.voicelive.models.ClientEventConversationItemDelete":"VoiceLive.ClientEventConversationItemDelete","com.azure.ai.voicelive.models.ClientEventConversationItemRetrieve":"VoiceLive.ClientEventConversationItemRetrieve","com.azure.ai.voicelive.models.ClientEventConversationItemTruncate":"VoiceLive.ClientEventConversationItemTruncate","com.azure.ai.voicelive.models.ClientEventInputAudioBufferAppend":"VoiceLive.ClientEventInputAudioBufferAppend","com.azure.ai.voicelive.models.ClientEventInputAudioBufferClear":"VoiceLive.ClientEventInputAudioBufferClear","com.azure.ai.voicelive.models.ClientEventInputAudioBufferCommit":"VoiceLive.ClientEventInputAudioBufferCommit","com.azure.ai.voicelive.models.ClientEventInputAudioClear":"VoiceLive.ClientEventInputAudioClear","com.azure.ai.voicelive.models.ClientEventInputAudioTurnAppend":"VoiceLive.ClientEventInputAudioTurnAppend","com.azure.ai.voicelive.models.ClientEventInputAudioTurnCancel":"VoiceLive.ClientEventInputAudioTurnCancel","com.azure.ai.voicelive.models.ClientEventInputAudioTurnEnd":"VoiceLive.ClientEventInputAudioTurnEnd","com.azure.ai.voicelive.models.ClientEventInputAudioTurnStart":"VoiceLive.ClientEventInputAudioTurnStart","com.azure.ai.voicelive.models.ClientEventResponseCancel":"VoiceLive.ClientEventResponseCancel","com.azure.ai.voicelive.models.ClientEventResponseCreate":"VoiceLive.ClientEventResponseCreate","com.azure.ai.voicelive.models.ClientEventSessionAvatarConnect":"VoiceLive.ClientEventSessionAvatarConnect","com.azure.ai.voicelive.models.ClientEventSessionUpdate":"VoiceLive.ClientEventSessionUpdate","com.azure.ai.voicelive.models.ClientEventType":"VoiceLive.ClientEventType","com.azure.ai.voicelive.models.ContentPartType":"VoiceLive.ContentPartType","com.azure.ai.voicelive.models.ConversationRequestItem":"VoiceLive.ConversationRequestItem","com.azure.ai.voicelive.models.EouDetection":"VoiceLive.EouDetection","com.azure.ai.voicelive.models.EouDetectionModel":"VoiceLive.EouDetection.model.anonymous","com.azure.ai.voicelive.models.EouThresholdLevel":"VoiceLive.EouThresholdLevel","com.azure.ai.voicelive.models.FillerResponseConfigBase":"VoiceLive.FillerResponseConfigBase","com.azure.ai.voicelive.models.FillerResponseConfigType":"VoiceLive.FillerResponseConfigType","com.azure.ai.voicelive.models.FillerTrigger":"VoiceLive.FillerTrigger","com.azure.ai.voicelive.models.FoundryAgentContextType":"VoiceLive.FoundryAgentContextType","com.azure.ai.voicelive.models.FoundryAgentTool":"VoiceLive.FoundryAgentTool","com.azure.ai.voicelive.models.FunctionCallItem":"VoiceLive.FunctionCallItem","com.azure.ai.voicelive.models.FunctionCallOutputItem":"VoiceLive.FunctionCallOutputItem","com.azure.ai.voicelive.models.IceServer":"VoiceLive.IceServer","com.azure.ai.voicelive.models.InputAudioContentPart":"VoiceLive.InputAudioContentPart","com.azure.ai.voicelive.models.InputAudioFormat":"VoiceLive.InputAudioFormat","com.azure.ai.voicelive.models.InputTextContentPart":"VoiceLive.InputTextContentPart","com.azure.ai.voicelive.models.InputTokenDetails":"VoiceLive.InputTokenDetails","com.azure.ai.voicelive.models.InteractionModality":"VoiceLive.Modality","com.azure.ai.voicelive.models.ItemParamStatus":"VoiceLive.ItemParamStatus","com.azure.ai.voicelive.models.ItemType":"VoiceLive.ItemType","com.azure.ai.voicelive.models.LlmFillerResponseConfig":"VoiceLive.LlmFillerResponseConfig","com.azure.ai.voicelive.models.LogProbProperties":"VoiceLive.LogProbProperties","com.azure.ai.voicelive.models.MCPApprovalResponseRequestItem":"VoiceLive.MCPApprovalResponseRequestItem","com.azure.ai.voicelive.models.MCPApprovalType":"VoiceLive.MCPApprovalType","com.azure.ai.voicelive.models.MCPServer":"VoiceLive.MCPServer","com.azure.ai.voicelive.models.MCPTool":"VoiceLive.MCPTool","com.azure.ai.voicelive.models.MessageContentPart":"VoiceLive.MessageContentPart","com.azure.ai.voicelive.models.MessageItem":"VoiceLive.MessageItem","com.azure.ai.voicelive.models.OpenAIVoice":"VoiceLive.OpenAIVoice","com.azure.ai.voicelive.models.OpenAIVoiceName":"VoiceLive.OAIVoice","com.azure.ai.voicelive.models.OutputAudioFormat":"VoiceLive.OutputAudioFormat","com.azure.ai.voicelive.models.OutputTextContentPart":"VoiceLive.OutputTextContentPart","com.azure.ai.voicelive.models.OutputTokenDetails":"VoiceLive.OutputTokenDetails","com.azure.ai.voicelive.models.PersonalVoiceModels":"VoiceLive.PersonalVoiceModels","com.azure.ai.voicelive.models.PhotoAvatarBaseModes":"VoiceLive.PhotoAvatarBaseModes","com.azure.ai.voicelive.models.ReasoningEffort":"VoiceLive.ReasoningEffort","com.azure.ai.voicelive.models.RequestAudioContentPart":"VoiceLive.RequestAudioContentPart","com.azure.ai.voicelive.models.RequestImageContentPart":"VoiceLive.RequestImageContentPart","com.azure.ai.voicelive.models.RequestImageContentPartDetail":"VoiceLive.RequestImageContentPartDetail","com.azure.ai.voicelive.models.RequestTextContentPart":"VoiceLive.RequestTextContentPart","com.azure.ai.voicelive.models.RespondingAgentOptions":"VoiceLive.AgentConfig","com.azure.ai.voicelive.models.ResponseAudioContentPart":"VoiceLive.ResponseAudioContentPart","com.azure.ai.voicelive.models.ResponseCancelledDetails":"VoiceLive.ResponseCancelledDetails","com.azure.ai.voicelive.models.ResponseCancelledDetailsReason":"VoiceLive.ResponseCancelledDetails.reason.anonymous","com.azure.ai.voicelive.models.ResponseCreateParams":"VoiceLive.ResponseCreateParams","com.azure.ai.voicelive.models.ResponseFailedDetails":"VoiceLive.ResponseFailedDetails","com.azure.ai.voicelive.models.ResponseFoundryAgentCallItem":"VoiceLive.ResponseFoundryAgentCallItem","com.azure.ai.voicelive.models.ResponseFunctionCallItem":"VoiceLive.ResponseFunctionCallItem","com.azure.ai.voicelive.models.ResponseFunctionCallOutputItem":"VoiceLive.ResponseFunctionCallOutputItem","com.azure.ai.voicelive.models.ResponseIncompleteDetails":"VoiceLive.ResponseIncompleteDetails","com.azure.ai.voicelive.models.ResponseIncompleteDetailsReason":"VoiceLive.ResponseIncompleteDetails.reason.anonymous","com.azure.ai.voicelive.models.ResponseItemObject":null,"com.azure.ai.voicelive.models.ResponseMCPApprovalRequestItem":"VoiceLive.ResponseMCPApprovalRequestItem","com.azure.ai.voicelive.models.ResponseMCPApprovalResponseItem":"VoiceLive.ResponseMCPApprovalResponseItem","com.azure.ai.voicelive.models.ResponseMCPCallItem":"VoiceLive.ResponseMCPCallItem","com.azure.ai.voicelive.models.ResponseMCPListToolItem":"VoiceLive.ResponseMCPListToolItem","com.azure.ai.voicelive.models.ResponseMessageRole":"VoiceLive.MessageRole","com.azure.ai.voicelive.models.ResponseObject":null,"com.azure.ai.voicelive.models.ResponseStatusDetails":"VoiceLive.ResponseStatusDetails","com.azure.ai.voicelive.models.ResponseTextContentPart":"VoiceLive.ResponseTextContentPart","com.azure.ai.voicelive.models.ResponseTokenStatistics":"VoiceLive.TokenUsage","com.azure.ai.voicelive.models.ServerEventMcpListToolsCompleted":"VoiceLive.ServerEventMcpListToolsCompleted","com.azure.ai.voicelive.models.ServerEventMcpListToolsFailed":"VoiceLive.ServerEventMcpListToolsFailed","com.azure.ai.voicelive.models.ServerEventMcpListToolsInProgress":"VoiceLive.ServerEventMcpListToolsInProgress","com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallArgumentsDelta":"VoiceLive.ServerEventResponseFoundryAgentCallArgumentsDelta","com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallArgumentsDone":"VoiceLive.ServerEventResponseFoundryAgentCallArgumentsDone","com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallCompleted":"VoiceLive.ServerEventResponseFoundryAgentCallCompleted","com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallFailed":"VoiceLive.ServerEventResponseFoundryAgentCallFailed","com.azure.ai.voicelive.models.ServerEventResponseFoundryAgentCallInProgress":"VoiceLive.ServerEventResponseFoundryAgentCallInProgress","com.azure.ai.voicelive.models.ServerEventResponseMcpCallArgumentsDelta":"VoiceLive.ServerEventResponseMcpCallArgumentsDelta","com.azure.ai.voicelive.models.ServerEventResponseMcpCallArgumentsDone":"VoiceLive.ServerEventResponseMcpCallArgumentsDone","com.azure.ai.voicelive.models.ServerEventResponseMcpCallCompleted":"VoiceLive.ServerEventResponseMcpCallCompleted","com.azure.ai.voicelive.models.ServerEventResponseMcpCallFailed":"VoiceLive.ServerEventResponseMcpCallFailed","com.azure.ai.voicelive.models.ServerEventResponseMcpCallInProgress":"VoiceLive.ServerEventResponseMcpCallInProgress","com.azure.ai.voicelive.models.ServerEventType":"VoiceLive.ServerEventType","com.azure.ai.voicelive.models.ServerVadTurnDetection":"VoiceLive.ServerVad","com.azure.ai.voicelive.models.SessionResponse":"VoiceLive.Response","com.azure.ai.voicelive.models.SessionResponseItem":"VoiceLive.ResponseItem","com.azure.ai.voicelive.models.SessionResponseItemStatus":"VoiceLive.ResponseItemStatus","com.azure.ai.voicelive.models.SessionResponseMessageItem":"VoiceLive.ResponseMessageItem","com.azure.ai.voicelive.models.SessionResponseStatus":"VoiceLive.ResponseStatus","com.azure.ai.voicelive.models.SessionUpdate":"VoiceLive.ServerEvent","com.azure.ai.voicelive.models.SessionUpdateAvatarConnecting":"VoiceLive.ServerEventSessionAvatarConnecting","com.azure.ai.voicelive.models.SessionUpdateConversationItemCreated":"VoiceLive.ServerEventConversationItemCreated","com.azure.ai.voicelive.models.SessionUpdateConversationItemDeleted":"VoiceLive.ServerEventConversationItemDeleted","com.azure.ai.voicelive.models.SessionUpdateConversationItemInputAudioTranscriptionCompleted":"VoiceLive.ServerEventConversationItemInputAudioTranscriptionCompleted","com.azure.ai.voicelive.models.SessionUpdateConversationItemInputAudioTranscriptionDelta":"VoiceLive.ServerEventConversationItemInputAudioTranscriptionDelta","com.azure.ai.voicelive.models.SessionUpdateConversationItemInputAudioTranscriptionFailed":"VoiceLive.ServerEventConversationItemInputAudioTranscriptionFailed","com.azure.ai.voicelive.models.SessionUpdateConversationItemRetrieved":"VoiceLive.ServerEventConversationItemRetrieved","com.azure.ai.voicelive.models.SessionUpdateConversationItemTruncated":"VoiceLive.ServerEventConversationItemTruncated","com.azure.ai.voicelive.models.SessionUpdateError":"VoiceLive.ServerEventError","com.azure.ai.voicelive.models.SessionUpdateErrorDetails":"VoiceLive.ServerEventErrorDetails","com.azure.ai.voicelive.models.SessionUpdateInputAudioBufferCleared":"VoiceLive.ServerEventInputAudioBufferCleared","com.azure.ai.voicelive.models.SessionUpdateInputAudioBufferCommitted":"VoiceLive.ServerEventInputAudioBufferCommitted","com.azure.ai.voicelive.models.SessionUpdateInputAudioBufferSpeechStarted":"VoiceLive.ServerEventInputAudioBufferSpeechStarted","com.azure.ai.voicelive.models.SessionUpdateInputAudioBufferSpeechStopped":"VoiceLive.ServerEventInputAudioBufferSpeechStopped","com.azure.ai.voicelive.models.SessionUpdateResponseAnimationBlendshapeDelta":"VoiceLive.ServerEventResponseAnimationBlendshapeDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAnimationBlendshapeDone":"VoiceLive.ServerEventResponseAnimationBlendshapeDone","com.azure.ai.voicelive.models.SessionUpdateResponseAnimationVisemeDelta":"VoiceLive.ServerEventResponseAnimationVisemeDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAnimationVisemeDone":"VoiceLive.ServerEventResponseAnimationVisemeDone","com.azure.ai.voicelive.models.SessionUpdateResponseAudioDelta":"VoiceLive.ServerEventResponseAudioDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAudioDone":"VoiceLive.ServerEventResponseAudioDone","com.azure.ai.voicelive.models.SessionUpdateResponseAudioTimestampDelta":"VoiceLive.ServerEventResponseAudioTimestampDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAudioTimestampDone":"VoiceLive.ServerEventResponseAudioTimestampDone","com.azure.ai.voicelive.models.SessionUpdateResponseAudioTranscriptDelta":"VoiceLive.ServerEventResponseAudioTranscriptDelta","com.azure.ai.voicelive.models.SessionUpdateResponseAudioTranscriptDone":"VoiceLive.ServerEventResponseAudioTranscriptDone","com.azure.ai.voicelive.models.SessionUpdateResponseContentPartAdded":"VoiceLive.ServerEventResponseContentPartAdded","com.azure.ai.voicelive.models.SessionUpdateResponseContentPartDone":"VoiceLive.ServerEventResponseContentPartDone","com.azure.ai.voicelive.models.SessionUpdateResponseCreated":"VoiceLive.ServerEventResponseCreated","com.azure.ai.voicelive.models.SessionUpdateResponseDone":"VoiceLive.ServerEventResponseDone","com.azure.ai.voicelive.models.SessionUpdateResponseFunctionCallArgumentsDelta":"VoiceLive.ServerEventResponseFunctionCallArgumentsDelta","com.azure.ai.voicelive.models.SessionUpdateResponseFunctionCallArgumentsDone":"VoiceLive.ServerEventResponseFunctionCallArgumentsDone","com.azure.ai.voicelive.models.SessionUpdateResponseOutputItemAdded":"VoiceLive.ServerEventResponseOutputItemAdded","com.azure.ai.voicelive.models.SessionUpdateResponseOutputItemDone":"VoiceLive.ServerEventResponseOutputItemDone","com.azure.ai.voicelive.models.SessionUpdateResponseTextDelta":"VoiceLive.ServerEventResponseTextDelta","com.azure.ai.voicelive.models.SessionUpdateResponseTextDone":"VoiceLive.ServerEventResponseTextDone","com.azure.ai.voicelive.models.SessionUpdateSessionCreated":"VoiceLive.ServerEventSessionCreated","com.azure.ai.voicelive.models.SessionUpdateSessionUpdated":"VoiceLive.ServerEventSessionUpdated","com.azure.ai.voicelive.models.SystemMessageItem":"VoiceLive.SystemMessageItem","com.azure.ai.voicelive.models.ToolChoiceFunctionSelection":"VoiceLive.ToolChoiceFunctionObject","com.azure.ai.voicelive.models.ToolChoiceLiteral":"VoiceLive.ToolChoiceLiteral","com.azure.ai.voicelive.models.ToolChoiceSelection":"VoiceLive.ToolChoiceObject","com.azure.ai.voicelive.models.ToolType":"VoiceLive.ToolType","com.azure.ai.voicelive.models.TurnDetection":"VoiceLive.TurnDetection","com.azure.ai.voicelive.models.TurnDetectionType":"VoiceLive.TurnDetectionType","com.azure.ai.voicelive.models.UserMessageItem":"VoiceLive.UserMessageItem","com.azure.ai.voicelive.models.VideoBackground":"VoiceLive.Background","com.azure.ai.voicelive.models.VideoCrop":"VoiceLive.VideoCrop","com.azure.ai.voicelive.models.VideoParams":"VoiceLive.VideoParams","com.azure.ai.voicelive.models.VideoParamsCodec":null,"com.azure.ai.voicelive.models.VideoResolution":"VoiceLive.VideoResolution","com.azure.ai.voicelive.models.VoiceLiveContentPart":"VoiceLive.ContentPart","com.azure.ai.voicelive.models.VoiceLiveErrorDetails":"VoiceLive.VoiceLiveErrorDetails","com.azure.ai.voicelive.models.VoiceLiveFunctionDefinition":"VoiceLive.FunctionTool","com.azure.ai.voicelive.models.VoiceLiveSessionOptions":"VoiceLive.RequestSession","com.azure.ai.voicelive.models.VoiceLiveSessionResponse":"VoiceLive.ResponseSession","com.azure.ai.voicelive.models.VoiceLiveToolDefinition":"VoiceLive.Tool"},"generatedFiles":["src/main/java/com/azure/ai/voicelive/implementation/package-info.java","src/main/java/com/azure/ai/voicelive/models/AnimationOptions.java","src/main/java/com/azure/ai/voicelive/models/AnimationOutputType.java","src/main/java/com/azure/ai/voicelive/models/AssistantMessageItem.java","src/main/java/com/azure/ai/voicelive/models/AudioEchoCancellation.java","src/main/java/com/azure/ai/voicelive/models/AudioInputTranscriptionOptions.java","src/main/java/com/azure/ai/voicelive/models/AudioInputTranscriptionOptionsModel.java","src/main/java/com/azure/ai/voicelive/models/AudioNoiseReduction.java","src/main/java/com/azure/ai/voicelive/models/AudioNoiseReductionType.java","src/main/java/com/azure/ai/voicelive/models/AudioTimestampType.java","src/main/java/com/azure/ai/voicelive/models/AvatarConfigTypes.java","src/main/java/com/azure/ai/voicelive/models/AvatarConfiguration.java","src/main/java/com/azure/ai/voicelive/models/AvatarOutputProtocol.java","src/main/java/com/azure/ai/voicelive/models/AzureCustomVoice.java","src/main/java/com/azure/ai/voicelive/models/AzurePersonalVoice.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticEouDetection.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticEouDetectionEn.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticEouDetectionMultilingual.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticVadTurnDetection.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticVadTurnDetectionEn.java","src/main/java/com/azure/ai/voicelive/models/AzureSemanticVadTurnDetectionMultilingual.java","src/main/java/com/azure/ai/voicelive/models/AzureStandardVoice.java","src/main/java/com/azure/ai/voicelive/models/AzureVoice.java","src/main/java/com/azure/ai/voicelive/models/AzureVoiceType.java","src/main/java/com/azure/ai/voicelive/models/BasicFillerResponseConfig.java","src/main/java/com/azure/ai/voicelive/models/CachedTokenDetails.java","src/main/java/com/azure/ai/voicelive/models/ClientEvent.java","src/main/java/com/azure/ai/voicelive/models/ClientEventConversationItemCreate.java","src/main/java/com/azure/ai/voicelive/models/ClientEventConversationItemDelete.java","src/main/java/com/azure/ai/voicelive/models/ClientEventConversationItemRetrieve.java","src/main/java/com/azure/ai/voicelive/models/ClientEventConversationItemTruncate.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioBufferAppend.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioBufferClear.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioBufferCommit.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioClear.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioTurnAppend.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioTurnCancel.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioTurnEnd.java","src/main/java/com/azure/ai/voicelive/models/ClientEventInputAudioTurnStart.java","src/main/java/com/azure/ai/voicelive/models/ClientEventResponseCancel.java","src/main/java/com/azure/ai/voicelive/models/ClientEventResponseCreate.java","src/main/java/com/azure/ai/voicelive/models/ClientEventSessionAvatarConnect.java","src/main/java/com/azure/ai/voicelive/models/ClientEventSessionUpdate.java","src/main/java/com/azure/ai/voicelive/models/ClientEventType.java","src/main/java/com/azure/ai/voicelive/models/ContentPartType.java","src/main/java/com/azure/ai/voicelive/models/ConversationRequestItem.java","src/main/java/com/azure/ai/voicelive/models/EouDetection.java","src/main/java/com/azure/ai/voicelive/models/EouDetectionModel.java","src/main/java/com/azure/ai/voicelive/models/EouThresholdLevel.java","src/main/java/com/azure/ai/voicelive/models/FillerResponseConfigBase.java","src/main/java/com/azure/ai/voicelive/models/FillerResponseConfigType.java","src/main/java/com/azure/ai/voicelive/models/FillerTrigger.java","src/main/java/com/azure/ai/voicelive/models/FoundryAgentContextType.java","src/main/java/com/azure/ai/voicelive/models/FoundryAgentTool.java","src/main/java/com/azure/ai/voicelive/models/FunctionCallItem.java","src/main/java/com/azure/ai/voicelive/models/FunctionCallOutputItem.java","src/main/java/com/azure/ai/voicelive/models/IceServer.java","src/main/java/com/azure/ai/voicelive/models/InputAudioContentPart.java","src/main/java/com/azure/ai/voicelive/models/InputAudioFormat.java","src/main/java/com/azure/ai/voicelive/models/InputTextContentPart.java","src/main/java/com/azure/ai/voicelive/models/InputTokenDetails.java","src/main/java/com/azure/ai/voicelive/models/InteractionModality.java","src/main/java/com/azure/ai/voicelive/models/ItemParamStatus.java","src/main/java/com/azure/ai/voicelive/models/ItemType.java","src/main/java/com/azure/ai/voicelive/models/LlmFillerResponseConfig.java","src/main/java/com/azure/ai/voicelive/models/LogProbProperties.java","src/main/java/com/azure/ai/voicelive/models/MCPApprovalResponseRequestItem.java","src/main/java/com/azure/ai/voicelive/models/MCPApprovalType.java","src/main/java/com/azure/ai/voicelive/models/MCPServer.java","src/main/java/com/azure/ai/voicelive/models/MCPTool.java","src/main/java/com/azure/ai/voicelive/models/MessageContentPart.java","src/main/java/com/azure/ai/voicelive/models/MessageItem.java","src/main/java/com/azure/ai/voicelive/models/OpenAIVoice.java","src/main/java/com/azure/ai/voicelive/models/OpenAIVoiceName.java","src/main/java/com/azure/ai/voicelive/models/OutputAudioFormat.java","src/main/java/com/azure/ai/voicelive/models/OutputTextContentPart.java","src/main/java/com/azure/ai/voicelive/models/OutputTokenDetails.java","src/main/java/com/azure/ai/voicelive/models/PersonalVoiceModels.java","src/main/java/com/azure/ai/voicelive/models/PhotoAvatarBaseModes.java","src/main/java/com/azure/ai/voicelive/models/ReasoningEffort.java","src/main/java/com/azure/ai/voicelive/models/RequestAudioContentPart.java","src/main/java/com/azure/ai/voicelive/models/RequestImageContentPart.java","src/main/java/com/azure/ai/voicelive/models/RequestImageContentPartDetail.java","src/main/java/com/azure/ai/voicelive/models/RequestTextContentPart.java","src/main/java/com/azure/ai/voicelive/models/RespondingAgentOptions.java","src/main/java/com/azure/ai/voicelive/models/ResponseAudioContentPart.java","src/main/java/com/azure/ai/voicelive/models/ResponseCancelledDetails.java","src/main/java/com/azure/ai/voicelive/models/ResponseCancelledDetailsReason.java","src/main/java/com/azure/ai/voicelive/models/ResponseCreateParams.java","src/main/java/com/azure/ai/voicelive/models/ResponseFailedDetails.java","src/main/java/com/azure/ai/voicelive/models/ResponseFoundryAgentCallItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseFunctionCallItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseFunctionCallOutputItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseIncompleteDetails.java","src/main/java/com/azure/ai/voicelive/models/ResponseIncompleteDetailsReason.java","src/main/java/com/azure/ai/voicelive/models/ResponseItemObject.java","src/main/java/com/azure/ai/voicelive/models/ResponseMCPApprovalRequestItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseMCPApprovalResponseItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseMCPCallItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseMCPListToolItem.java","src/main/java/com/azure/ai/voicelive/models/ResponseMessageRole.java","src/main/java/com/azure/ai/voicelive/models/ResponseObject.java","src/main/java/com/azure/ai/voicelive/models/ResponseStatusDetails.java","src/main/java/com/azure/ai/voicelive/models/ResponseTextContentPart.java","src/main/java/com/azure/ai/voicelive/models/ResponseTokenStatistics.java","src/main/java/com/azure/ai/voicelive/models/ServerEventMcpListToolsCompleted.java","src/main/java/com/azure/ai/voicelive/models/ServerEventMcpListToolsFailed.java","src/main/java/com/azure/ai/voicelive/models/ServerEventMcpListToolsInProgress.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallArgumentsDelta.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallArgumentsDone.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallCompleted.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallFailed.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallInProgress.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallArgumentsDelta.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallArgumentsDone.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallCompleted.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallFailed.java","src/main/java/com/azure/ai/voicelive/models/ServerEventResponseMcpCallInProgress.java","src/main/java/com/azure/ai/voicelive/models/ServerEventType.java","src/main/java/com/azure/ai/voicelive/models/ServerVadTurnDetection.java","src/main/java/com/azure/ai/voicelive/models/SessionResponse.java","src/main/java/com/azure/ai/voicelive/models/SessionResponseItem.java","src/main/java/com/azure/ai/voicelive/models/SessionResponseItemStatus.java","src/main/java/com/azure/ai/voicelive/models/SessionResponseMessageItem.java","src/main/java/com/azure/ai/voicelive/models/SessionResponseStatus.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdate.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateAvatarConnecting.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemCreated.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemDeleted.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemInputAudioTranscriptionCompleted.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemInputAudioTranscriptionDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemInputAudioTranscriptionFailed.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemRetrieved.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateConversationItemTruncated.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateError.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateErrorDetails.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateInputAudioBufferCleared.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateInputAudioBufferCommitted.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateInputAudioBufferSpeechStarted.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateInputAudioBufferSpeechStopped.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAnimationBlendshapeDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAnimationBlendshapeDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAnimationVisemeDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAnimationVisemeDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioTimestampDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioTimestampDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioTranscriptDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseAudioTranscriptDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseContentPartAdded.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseContentPartDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseCreated.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseFunctionCallArgumentsDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseFunctionCallArgumentsDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseOutputItemAdded.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseOutputItemDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseTextDelta.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateResponseTextDone.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateSessionCreated.java","src/main/java/com/azure/ai/voicelive/models/SessionUpdateSessionUpdated.java","src/main/java/com/azure/ai/voicelive/models/SystemMessageItem.java","src/main/java/com/azure/ai/voicelive/models/ToolChoiceFunctionSelection.java","src/main/java/com/azure/ai/voicelive/models/ToolChoiceLiteral.java","src/main/java/com/azure/ai/voicelive/models/ToolChoiceSelection.java","src/main/java/com/azure/ai/voicelive/models/ToolType.java","src/main/java/com/azure/ai/voicelive/models/TurnDetection.java","src/main/java/com/azure/ai/voicelive/models/TurnDetectionType.java","src/main/java/com/azure/ai/voicelive/models/UserMessageItem.java","src/main/java/com/azure/ai/voicelive/models/VideoBackground.java","src/main/java/com/azure/ai/voicelive/models/VideoCrop.java","src/main/java/com/azure/ai/voicelive/models/VideoParams.java","src/main/java/com/azure/ai/voicelive/models/VideoParamsCodec.java","src/main/java/com/azure/ai/voicelive/models/VideoResolution.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveContentPart.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveErrorDetails.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveFunctionDefinition.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionOptions.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveSessionResponse.java","src/main/java/com/azure/ai/voicelive/models/VoiceLiveToolDefinition.java","src/main/java/com/azure/ai/voicelive/models/package-info.java","src/main/java/com/azure/ai/voicelive/package-info.java","src/main/java/module-info.java"]} \ No newline at end of file diff --git a/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/AzureVoiceCustomTextNormalizationTest.java b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/AzureVoiceCustomTextNormalizationTest.java new file mode 100644 index 000000000000..acf2ac31caa1 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/AzureVoiceCustomTextNormalizationTest.java @@ -0,0 +1,174 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.voicelive.models; + +import com.azure.core.util.BinaryData; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * Unit tests for custom text normalization URL property in Azure voice classes: + * {@link AzureCustomVoice}, {@link AzurePersonalVoice}, {@link AzureStandardVoice}. + */ +class AzureVoiceCustomTextNormalizationTest { + + @Test + void testAzureCustomVoiceWithCustomTextNormalizationUrl() { + // Arrange + String normalizationUrl = "https://example.com/normalization.xml"; + + // Act + AzureCustomVoice voice + = new AzureCustomVoice("custom-voice-id", "en-US").setCustomTextNormalizationUrl(normalizationUrl); + + // Assert + assertEquals(normalizationUrl, voice.getCustomTextNormalizationUrl()); + } + + @Test + void testAzureCustomVoiceJsonSerialization() { + // Arrange + AzureCustomVoice voice = new AzureCustomVoice("my-custom-voice", "en-US") + .setCustomTextNormalizationUrl("https://storage.blob.core.windows.net/normalization.xml") + .setCustomLexiconUri("https://storage.blob.core.windows.net/lexicon.xml"); + + // Act + BinaryData serialized = BinaryData.fromObject(voice); + AzureCustomVoice deserialized = serialized.toObject(AzureCustomVoice.class); + + // Assert + assertEquals(voice.getCustomTextNormalizationUrl(), deserialized.getCustomTextNormalizationUrl()); + assertEquals(voice.getCustomLexiconUri(), deserialized.getCustomLexiconUri()); + assertEquals(voice.getEndpointId(), deserialized.getEndpointId()); + } + + @Test + void testAzurePersonalVoiceWithCustomTextNormalizationUrl() { + // Arrange + String normalizationUrl = "https://example.com/personal-normalization.xml"; + + // Act + AzurePersonalVoice voice + = new AzurePersonalVoice("personal-voice-id", PersonalVoiceModels.PHOENIX_LATEST_NEURAL) + .setCustomTextNormalizationUrl(normalizationUrl); + + // Assert + assertEquals(normalizationUrl, voice.getCustomTextNormalizationUrl()); + } + + @Test + void testAzurePersonalVoiceJsonSerialization() { + // Arrange + AzurePersonalVoice voice + = new AzurePersonalVoice("my-personal-voice", PersonalVoiceModels.PHOENIX_LATEST_NEURAL) + .setCustomTextNormalizationUrl("https://storage.blob.core.windows.net/personal-normalization.xml") + .setCustomLexiconUrl("https://storage.blob.core.windows.net/personal-lexicon.xml"); + + // Act + BinaryData serialized = BinaryData.fromObject(voice); + AzurePersonalVoice deserialized = serialized.toObject(AzurePersonalVoice.class); + + // Assert + assertEquals(voice.getCustomTextNormalizationUrl(), deserialized.getCustomTextNormalizationUrl()); + assertEquals(voice.getCustomLexiconUrl(), deserialized.getCustomLexiconUrl()); + assertEquals(voice.getName(), deserialized.getName()); + } + + @Test + void testAzureStandardVoiceWithCustomTextNormalizationUrl() { + // Arrange + String normalizationUrl = "https://example.com/standard-normalization.xml"; + + // Act + AzureStandardVoice voice + = new AzureStandardVoice("en-US-JennyNeural").setCustomTextNormalizationUrl(normalizationUrl); + + // Assert + assertEquals(normalizationUrl, voice.getCustomTextNormalizationUrl()); + } + + @Test + void testAzureStandardVoiceJsonSerialization() { + // Arrange + AzureStandardVoice voice = new AzureStandardVoice("en-US-GuyNeural") + .setCustomTextNormalizationUrl("https://storage.blob.core.windows.net/standard-normalization.xml") + .setCustomLexiconUrl("https://storage.blob.core.windows.net/standard-lexicon.xml"); + + // Act + BinaryData serialized = BinaryData.fromObject(voice); + AzureStandardVoice deserialized = serialized.toObject(AzureStandardVoice.class); + + // Assert + assertEquals(voice.getCustomTextNormalizationUrl(), deserialized.getCustomTextNormalizationUrl()); + assertEquals(voice.getCustomLexiconUrl(), deserialized.getCustomLexiconUrl()); + assertEquals(voice.getName(), deserialized.getName()); + } + + @Test + void testAzureCustomVoiceJsonDeserializationWithNormalizationUrl() { + // Arrange + String json = "{\"type\":\"azure_custom\",\"endpoint_id\":\"ep123\",\"deployment_id\":\"dep456\"," + + "\"custom_lexicon_url\":\"https://lexicon.xml\"," + + "\"custom_text_normalization_url\":\"https://normalization.xml\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + AzureCustomVoice voice = data.toObject(AzureCustomVoice.class); + + // Assert + assertNotNull(voice); + assertEquals("https://normalization.xml", voice.getCustomTextNormalizationUrl()); + assertEquals("https://lexicon.xml", voice.getCustomLexiconUri()); + } + + @Test + void testAzurePersonalVoiceJsonDeserializationWithNormalizationUrl() { + // Arrange + String json = "{\"type\":\"azure_personal\",\"name\":\"voice1\",\"model\":\"personal_voice_neural\"," + + "\"custom_lexicon_url\":\"https://lexicon.xml\"," + + "\"custom_text_normalization_url\":\"https://normalization.xml\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + AzurePersonalVoice voice = data.toObject(AzurePersonalVoice.class); + + // Assert + assertNotNull(voice); + assertEquals("https://normalization.xml", voice.getCustomTextNormalizationUrl()); + assertEquals("https://lexicon.xml", voice.getCustomLexiconUrl()); + } + + @Test + void testAzureStandardVoiceJsonDeserializationWithNormalizationUrl() { + // Arrange + String json = "{\"type\":\"azure_standard\",\"name\":\"en-US-AriaNeural\"," + + "\"custom_lexicon_url\":\"https://lexicon.xml\"," + + "\"custom_text_normalization_url\":\"https://normalization.xml\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + AzureStandardVoice voice = data.toObject(AzureStandardVoice.class); + + // Assert + assertNotNull(voice); + assertEquals("https://normalization.xml", voice.getCustomTextNormalizationUrl()); + assertEquals("https://lexicon.xml", voice.getCustomLexiconUrl()); + } + + @Test + void testAzureVoicesWithoutCustomTextNormalizationUrl() { + // Arrange & Act + AzureCustomVoice customVoice = new AzureCustomVoice("ep", "dep"); + AzurePersonalVoice personalVoice = new AzurePersonalVoice("name", PersonalVoiceModels.PHOENIX_LATEST_NEURAL); + AzureStandardVoice standardVoice = new AzureStandardVoice("en-US-JennyNeural"); + + // Assert - default should be null + assertNull(customVoice.getCustomTextNormalizationUrl()); + assertNull(personalVoice.getCustomTextNormalizationUrl()); + assertNull(standardVoice.getCustomTextNormalizationUrl()); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/FillerResponseConfigTest.java b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/FillerResponseConfigTest.java new file mode 100644 index 000000000000..ce72d7aad051 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/FillerResponseConfigTest.java @@ -0,0 +1,193 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.voicelive.models; + +import com.azure.core.util.BinaryData; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * Unit tests for filler response configuration classes: + * {@link FillerResponseConfigBase}, {@link BasicFillerResponseConfig}, {@link LlmFillerResponseConfig}. + */ +class FillerResponseConfigTest { + + @Test + void testFillerResponseConfigTypeValues() { + // Assert all known values exist + assertNotNull(FillerResponseConfigType.STATIC_FILLER); + assertNotNull(FillerResponseConfigType.LLM_FILLER); + + assertEquals("static_filler", FillerResponseConfigType.STATIC_FILLER.toString()); + assertEquals("llm_filler", FillerResponseConfigType.LLM_FILLER.toString()); + } + + @Test + void testFillerResponseConfigTypeFromString() { + // Act & Assert + assertEquals(FillerResponseConfigType.STATIC_FILLER, FillerResponseConfigType.fromString("static_filler")); + assertEquals(FillerResponseConfigType.LLM_FILLER, FillerResponseConfigType.fromString("llm_filler")); + } + + @Test + void testFillerTriggerValues() { + // Assert all known values exist + assertNotNull(FillerTrigger.LATENCY); + assertNotNull(FillerTrigger.TOOL); + + assertEquals("latency", FillerTrigger.LATENCY.toString()); + assertEquals("tool", FillerTrigger.TOOL.toString()); + } + + @Test + void testFillerTriggerFromString() { + // Act & Assert + assertEquals(FillerTrigger.LATENCY, FillerTrigger.fromString("latency")); + assertEquals(FillerTrigger.TOOL, FillerTrigger.fromString("tool")); + } + + @Test + void testBasicFillerResponseConfigCreation() { + // Arrange & Act + BasicFillerResponseConfig config = new BasicFillerResponseConfig(); + + // Assert + assertNotNull(config); + assertEquals(FillerResponseConfigType.STATIC_FILLER, config.getType()); + } + + @Test + void testBasicFillerResponseConfigWithAllProperties() { + // Arrange + List texts = Arrays.asList("Please wait...", "One moment please...", "Let me check..."); + List triggers = Arrays.asList(FillerTrigger.LATENCY, FillerTrigger.TOOL); + + // Act + BasicFillerResponseConfig config + = new BasicFillerResponseConfig().setTexts(texts).setTriggers(triggers).setLatencyThresholdMs(3000); + + // Assert + assertEquals(texts, config.getTexts()); + assertEquals(triggers, config.getTriggers()); + assertEquals(3000, config.getLatencyThresholdMs()); + assertEquals(FillerResponseConfigType.STATIC_FILLER, config.getType()); + } + + @Test + void testBasicFillerResponseConfigJsonSerialization() { + // Arrange + BasicFillerResponseConfig config + = new BasicFillerResponseConfig().setTexts(Arrays.asList("Hold on...", "Processing...")) + .setTriggers(Arrays.asList(FillerTrigger.LATENCY)) + .setLatencyThresholdMs(2500); + + // Act + BinaryData serialized = BinaryData.fromObject(config); + BasicFillerResponseConfig deserialized = serialized.toObject(BasicFillerResponseConfig.class); + + // Assert + assertEquals(config.getTexts(), deserialized.getTexts()); + assertEquals(config.getTriggers(), deserialized.getTriggers()); + assertEquals(config.getLatencyThresholdMs(), deserialized.getLatencyThresholdMs()); + assertEquals(FillerResponseConfigType.STATIC_FILLER, deserialized.getType()); + } + + @Test + void testLlmFillerResponseConfigCreation() { + // Arrange & Act + LlmFillerResponseConfig config = new LlmFillerResponseConfig(); + + // Assert + assertNotNull(config); + assertEquals(FillerResponseConfigType.LLM_FILLER, config.getType()); + } + + @Test + void testLlmFillerResponseConfigWithAllProperties() { + // Arrange + List triggers = Arrays.asList(FillerTrigger.TOOL); + + // Act + LlmFillerResponseConfig config = new LlmFillerResponseConfig().setModel("gpt-4.1-mini") + .setInstructions("Generate brief waiting messages") + .setMaxCompletionTokens(50) + .setTriggers(triggers) + .setLatencyThresholdMs(1500); + + // Assert + assertEquals("gpt-4.1-mini", config.getModel()); + assertEquals("Generate brief waiting messages", config.getInstructions()); + assertEquals(50, config.getMaxCompletionTokens()); + assertEquals(triggers, config.getTriggers()); + assertEquals(1500, config.getLatencyThresholdMs()); + assertEquals(FillerResponseConfigType.LLM_FILLER, config.getType()); + } + + @Test + void testLlmFillerResponseConfigJsonSerialization() { + // Arrange + LlmFillerResponseConfig config = new LlmFillerResponseConfig().setModel("test-model") + .setInstructions("Test instructions") + .setMaxCompletionTokens(100) + .setTriggers(Arrays.asList(FillerTrigger.LATENCY, FillerTrigger.TOOL)) + .setLatencyThresholdMs(2000); + + // Act + BinaryData serialized = BinaryData.fromObject(config); + LlmFillerResponseConfig deserialized = serialized.toObject(LlmFillerResponseConfig.class); + + // Assert + assertEquals(config.getModel(), deserialized.getModel()); + assertEquals(config.getInstructions(), deserialized.getInstructions()); + assertEquals(config.getMaxCompletionTokens(), deserialized.getMaxCompletionTokens()); + assertEquals(config.getTriggers(), deserialized.getTriggers()); + assertEquals(config.getLatencyThresholdMs(), deserialized.getLatencyThresholdMs()); + assertEquals(FillerResponseConfigType.LLM_FILLER, deserialized.getType()); + } + + @Test + void testBasicFillerResponseConfigJsonDeserialization() { + // Arrange + String json = "{\"type\":\"static_filler\",\"texts\":[\"Wait...\",\"Hold on...\"]," + + "\"triggers\":[\"latency\"],\"latency_threshold_ms\":2000}"; + BinaryData data = BinaryData.fromString(json); + + // Act + BasicFillerResponseConfig config = data.toObject(BasicFillerResponseConfig.class); + + // Assert + assertNotNull(config); + assertEquals(2, config.getTexts().size()); + assertEquals("Wait...", config.getTexts().get(0)); + assertEquals("Hold on...", config.getTexts().get(1)); + assertEquals(1, config.getTriggers().size()); + assertEquals(FillerTrigger.LATENCY, config.getTriggers().get(0)); + assertEquals(2000, config.getLatencyThresholdMs()); + } + + @Test + void testLlmFillerResponseConfigJsonDeserialization() { + // Arrange + String json = "{\"type\":\"llm_filler\",\"model\":\"gpt-4\",\"instructions\":\"Be brief\"," + + "\"max_completion_tokens\":25,\"triggers\":[\"tool\"],\"latency_threshold_ms\":3000}"; + BinaryData data = BinaryData.fromString(json); + + // Act + LlmFillerResponseConfig config = data.toObject(LlmFillerResponseConfig.class); + + // Assert + assertNotNull(config); + assertEquals("gpt-4", config.getModel()); + assertEquals("Be brief", config.getInstructions()); + assertEquals(25, config.getMaxCompletionTokens()); + assertEquals(1, config.getTriggers().size()); + assertEquals(FillerTrigger.TOOL, config.getTriggers().get(0)); + assertEquals(3000, config.getLatencyThresholdMs()); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/FoundryAgentToolTest.java b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/FoundryAgentToolTest.java new file mode 100644 index 000000000000..06a04448214f --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/FoundryAgentToolTest.java @@ -0,0 +1,114 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.voicelive.models; + +import com.azure.core.util.BinaryData; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Unit tests for {@link FoundryAgentTool} and related classes. + */ +class FoundryAgentToolTest { + + @Test + void testFoundryAgentToolCreation() { + // Arrange & Act + FoundryAgentTool tool = new FoundryAgentTool("test-agent", "test-project"); + + // Assert + assertNotNull(tool); + assertEquals("test-agent", tool.getAgentName()); + assertEquals("test-project", tool.getProjectName()); + assertEquals(ToolType.FOUNDRY_AGENT, tool.getType()); + } + + @Test + void testFoundryAgentToolWithAllProperties() { + // Arrange & Act + FoundryAgentTool tool = new FoundryAgentTool("my-agent", "my-project").setAgentVersion("1.0.0") + .setClientId("client-123") + .setDescription("A test agent tool") + .setFoundryResourceOverride("custom-resource") + .setAgentContextType(FoundryAgentContextType.AGENT_CONTEXT) + .setReturnAgentResponseDirectly(true); + + // Assert + assertEquals("my-agent", tool.getAgentName()); + assertEquals("my-project", tool.getProjectName()); + assertEquals("1.0.0", tool.getAgentVersion()); + assertEquals("client-123", tool.getClientId()); + assertEquals("A test agent tool", tool.getDescription()); + assertEquals("custom-resource", tool.getFoundryResourceOverride()); + assertEquals(FoundryAgentContextType.AGENT_CONTEXT, tool.getAgentContextType()); + assertTrue(tool.isReturnAgentResponseDirectly()); + } + + @Test + void testFoundryAgentContextTypeValues() { + // Assert all known values exist + assertNotNull(FoundryAgentContextType.NO_CONTEXT); + assertNotNull(FoundryAgentContextType.AGENT_CONTEXT); + + assertEquals("no_context", FoundryAgentContextType.NO_CONTEXT.toString()); + assertEquals("agent_context", FoundryAgentContextType.AGENT_CONTEXT.toString()); + } + + @Test + void testFoundryAgentContextTypeFromString() { + // Act & Assert + assertEquals(FoundryAgentContextType.NO_CONTEXT, FoundryAgentContextType.fromString("no_context")); + assertEquals(FoundryAgentContextType.AGENT_CONTEXT, FoundryAgentContextType.fromString("agent_context")); + } + + @Test + void testFoundryAgentToolJsonSerialization() { + // Arrange + FoundryAgentTool tool = new FoundryAgentTool("agent-1", "project-1").setDescription("Test description") + .setAgentContextType(FoundryAgentContextType.NO_CONTEXT); + + // Act + BinaryData serialized = BinaryData.fromObject(tool); + FoundryAgentTool deserialized = serialized.toObject(FoundryAgentTool.class); + + // Assert + assertEquals(tool.getAgentName(), deserialized.getAgentName()); + assertEquals(tool.getProjectName(), deserialized.getProjectName()); + assertEquals(tool.getDescription(), deserialized.getDescription()); + assertEquals(tool.getAgentContextType(), deserialized.getAgentContextType()); + assertEquals(ToolType.FOUNDRY_AGENT, deserialized.getType()); + } + + @Test + void testFoundryAgentToolJsonDeserialization() { + // Arrange + String json = "{\"type\":\"foundry_agent\",\"agent_name\":\"my-agent\",\"project_name\":\"my-project\"," + + "\"agent_version\":\"2.0\",\"client_id\":\"cid\",\"description\":\"desc\"," + + "\"agent_context_type\":\"agent_context\",\"return_agent_response_directly\":false}"; + BinaryData data = BinaryData.fromString(json); + + // Act + FoundryAgentTool tool = data.toObject(FoundryAgentTool.class); + + // Assert + assertNotNull(tool); + assertEquals("my-agent", tool.getAgentName()); + assertEquals("my-project", tool.getProjectName()); + assertEquals("2.0", tool.getAgentVersion()); + assertEquals("cid", tool.getClientId()); + assertEquals("desc", tool.getDescription()); + assertEquals(FoundryAgentContextType.AGENT_CONTEXT, tool.getAgentContextType()); + assertEquals(false, tool.isReturnAgentResponseDirectly()); + } + + @Test + void testToolTypeFoundryAgent() { + // Assert + assertEquals("foundry_agent", ToolType.FOUNDRY_AGENT.toString()); + assertEquals(ToolType.FOUNDRY_AGENT, ToolType.fromString("foundry_agent")); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/OutputAudioFormatTest.java b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/OutputAudioFormatTest.java new file mode 100644 index 000000000000..56d0b138bb78 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/OutputAudioFormatTest.java @@ -0,0 +1,80 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.voicelive.models; + +import org.junit.jupiter.api.Test; + +import java.util.Collection; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * Unit tests for {@link OutputAudioFormat} - verifies the updated format values. + */ +class OutputAudioFormatTest { + + @Test + void testOutputAudioFormatValues() { + // Assert all known values exist + assertNotNull(OutputAudioFormat.PCM16); + assertNotNull(OutputAudioFormat.PCM16_8000HZ); + assertNotNull(OutputAudioFormat.PCM16_16000HZ); + assertNotNull(OutputAudioFormat.G711_ULAW); + assertNotNull(OutputAudioFormat.G711_ALAW); + } + + @Test + void testOutputAudioFormatToString() { + // Assert correct string values (underscore format) + assertEquals("pcm16", OutputAudioFormat.PCM16.toString()); + assertEquals("pcm16_8000hz", OutputAudioFormat.PCM16_8000HZ.toString()); + assertEquals("pcm16_16000hz", OutputAudioFormat.PCM16_16000HZ.toString()); + assertEquals("g711_ulaw", OutputAudioFormat.G711_ULAW.toString()); + assertEquals("g711_alaw", OutputAudioFormat.G711_ALAW.toString()); + } + + @Test + void testOutputAudioFormatFromString() { + // Act & Assert - using underscore format + assertEquals(OutputAudioFormat.PCM16, OutputAudioFormat.fromString("pcm16")); + assertEquals(OutputAudioFormat.PCM16_8000HZ, OutputAudioFormat.fromString("pcm16_8000hz")); + assertEquals(OutputAudioFormat.PCM16_16000HZ, OutputAudioFormat.fromString("pcm16_16000hz")); + assertEquals(OutputAudioFormat.G711_ULAW, OutputAudioFormat.fromString("g711_ulaw")); + assertEquals(OutputAudioFormat.G711_ALAW, OutputAudioFormat.fromString("g711_alaw")); + } + + @Test + void testOutputAudioFormatInVoiceLiveSessionOptions() { + // Arrange + VoiceLiveSessionOptions options = new VoiceLiveSessionOptions(); + + // Act & Assert - all formats should work + options.setOutputAudioFormat(OutputAudioFormat.PCM16); + assertEquals(OutputAudioFormat.PCM16, options.getOutputAudioFormat()); + + options.setOutputAudioFormat(OutputAudioFormat.PCM16_8000HZ); + assertEquals(OutputAudioFormat.PCM16_8000HZ, options.getOutputAudioFormat()); + + options.setOutputAudioFormat(OutputAudioFormat.PCM16_16000HZ); + assertEquals(OutputAudioFormat.PCM16_16000HZ, options.getOutputAudioFormat()); + + options.setOutputAudioFormat(OutputAudioFormat.G711_ULAW); + assertEquals(OutputAudioFormat.G711_ULAW, options.getOutputAudioFormat()); + + options.setOutputAudioFormat(OutputAudioFormat.G711_ALAW); + assertEquals(OutputAudioFormat.G711_ALAW, options.getOutputAudioFormat()); + } + + @Test + void testOutputAudioFormatValuesCollection() { + // Act + Collection values = OutputAudioFormat.values(); + + // Assert + assertNotNull(values); + // Should contain at least the 5 known values + assertEquals(5, values.size()); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ReasoningEffortTest.java b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ReasoningEffortTest.java new file mode 100644 index 000000000000..ee73357075ba --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ReasoningEffortTest.java @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.voicelive.models; + +import org.junit.jupiter.api.Test; + +import java.util.Collection; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Unit tests for {@link ReasoningEffort}. + */ +class ReasoningEffortTest { + + @Test + void testReasoningEffortValues() { + // Assert all known values exist + assertNotNull(ReasoningEffort.NONE); + assertNotNull(ReasoningEffort.MINIMAL); + assertNotNull(ReasoningEffort.LOW); + assertNotNull(ReasoningEffort.MEDIUM); + assertNotNull(ReasoningEffort.HIGH); + assertNotNull(ReasoningEffort.XHIGH); + } + + @Test + void testReasoningEffortToString() { + // Assert correct string values + assertEquals("none", ReasoningEffort.NONE.toString()); + assertEquals("minimal", ReasoningEffort.MINIMAL.toString()); + assertEquals("low", ReasoningEffort.LOW.toString()); + assertEquals("medium", ReasoningEffort.MEDIUM.toString()); + assertEquals("high", ReasoningEffort.HIGH.toString()); + assertEquals("xhigh", ReasoningEffort.XHIGH.toString()); + } + + @Test + void testReasoningEffortFromString() { + // Act & Assert + assertEquals(ReasoningEffort.NONE, ReasoningEffort.fromString("none")); + assertEquals(ReasoningEffort.MINIMAL, ReasoningEffort.fromString("minimal")); + assertEquals(ReasoningEffort.LOW, ReasoningEffort.fromString("low")); + assertEquals(ReasoningEffort.MEDIUM, ReasoningEffort.fromString("medium")); + assertEquals(ReasoningEffort.HIGH, ReasoningEffort.fromString("high")); + assertEquals(ReasoningEffort.XHIGH, ReasoningEffort.fromString("xhigh")); + } + + @Test + void testReasoningEffortFromStringCustomValue() { + // Act - custom/unknown values should still work as expandable string enum + ReasoningEffort custom = ReasoningEffort.fromString("custom_value"); + + // Assert + assertNotNull(custom); + assertEquals("custom_value", custom.toString()); + } + + @Test + void testReasoningEffortValuesCollection() { + // Act + Collection values = ReasoningEffort.values(); + + // Assert + assertNotNull(values); + // Should contain at least the 6 known values + // Note: may contain more if custom values were added during test run + assertTrue(values.size() >= 6); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ResponseCreateParamsNewFeaturesTest.java b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ResponseCreateParamsNewFeaturesTest.java new file mode 100644 index 000000000000..171e7ce3a7b3 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ResponseCreateParamsNewFeaturesTest.java @@ -0,0 +1,143 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.voicelive.models; + +import com.azure.core.util.BinaryData; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +/** + * Unit tests for new features in {@link ResponseCreateParams} and {@link SessionResponse}: + * - ReasoningEffort configuration + * - Metadata support + */ +class ResponseCreateParamsNewFeaturesTest { + + @Test + void testResponseCreateParamsReasoningEffort() { + // Arrange + ResponseCreateParams params = new ResponseCreateParams(); + + // Act + ResponseCreateParams result = params.setReasoningEffort(ReasoningEffort.HIGH); + + // Assert + assertSame(params, result); + assertEquals(ReasoningEffort.HIGH, params.getReasoningEffort()); + } + + @Test + void testResponseCreateParamsMetadata() { + // Arrange + ResponseCreateParams params = new ResponseCreateParams(); + Map metadata = new HashMap<>(); + metadata.put("user_id", "user123"); + metadata.put("session_type", "customer_support"); + + // Act + ResponseCreateParams result = params.setMetadata(metadata); + + // Assert + assertSame(params, result); + assertNotNull(params.getMetadata()); + assertEquals(2, params.getMetadata().size()); + assertEquals("user123", params.getMetadata().get("user_id")); + assertEquals("customer_support", params.getMetadata().get("session_type")); + } + + @Test + void testResponseCreateParamsJsonSerialization() { + // Arrange + Map metadata = new HashMap<>(); + metadata.put("key1", "value1"); + metadata.put("key2", "value2"); + + ResponseCreateParams params + = new ResponseCreateParams().setReasoningEffort(ReasoningEffort.MEDIUM).setMetadata(metadata); + + // Act + BinaryData serialized = BinaryData.fromObject(params); + ResponseCreateParams deserialized = serialized.toObject(ResponseCreateParams.class); + + // Assert + assertEquals(params.getReasoningEffort(), deserialized.getReasoningEffort()); + assertEquals(params.getMetadata(), deserialized.getMetadata()); + } + + @Test + void testResponseCreateParamsJsonDeserialization() { + // Arrange + String json = "{\"reasoning_effort\":\"low\",\"metadata\":{\"test_key\":\"test_value\"}}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ResponseCreateParams params = data.toObject(ResponseCreateParams.class); + + // Assert + assertNotNull(params); + assertEquals(ReasoningEffort.LOW, params.getReasoningEffort()); + assertNotNull(params.getMetadata()); + assertEquals("test_value", params.getMetadata().get("test_key")); + } + + @Test + void testSessionResponseMetadata() { + // Arrange + String json = "{\"id\":\"resp123\",\"status\":\"completed\"," + + "\"metadata\":{\"user\":\"user456\",\"context\":\"test\"}}"; + BinaryData data = BinaryData.fromString(json); + + // Act + SessionResponse response = data.toObject(SessionResponse.class); + + // Assert + assertNotNull(response); + assertEquals("resp123", response.getId()); + assertNotNull(response.getMetadata()); + assertEquals(2, response.getMetadata().size()); + assertEquals("user456", response.getMetadata().get("user")); + assertEquals("test", response.getMetadata().get("context")); + } + + @Test + void testResponseCreateParamsMethodChaining() { + // Arrange + Map metadata = new HashMap<>(); + metadata.put("chain_key", "chain_value"); + + // Act + ResponseCreateParams params = new ResponseCreateParams().setCommit(true) + .setCancelPrevious(false) + .setReasoningEffort(ReasoningEffort.XHIGH) + .setMetadata(metadata) + .setTemperature(0.9); + + // Assert + assertEquals(true, params.isCommit()); + assertEquals(false, params.isCancelPrevious()); + assertEquals(ReasoningEffort.XHIGH, params.getReasoningEffort()); + assertEquals(metadata, params.getMetadata()); + assertEquals(0.9, params.getTemperature()); + } + + @Test + void testEmptyMetadata() { + // Arrange + ResponseCreateParams params = new ResponseCreateParams().setMetadata(new HashMap<>()); + + // Act + BinaryData serialized = BinaryData.fromObject(params); + ResponseCreateParams deserialized = serialized.toObject(ResponseCreateParams.class); + + // Assert + assertNotNull(deserialized.getMetadata()); + assertEquals(0, deserialized.getMetadata().size()); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ResponseFoundryAgentCallItemTest.java b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ResponseFoundryAgentCallItemTest.java new file mode 100644 index 000000000000..7fa637302eb7 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ResponseFoundryAgentCallItemTest.java @@ -0,0 +1,123 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.voicelive.models; + +import com.azure.core.util.BinaryData; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * Unit tests for {@link ResponseFoundryAgentCallItem}. + */ +class ResponseFoundryAgentCallItemTest { + + @Test + void testResponseFoundryAgentCallItemDeserialization() { + // Arrange + String json = "{\"type\":\"foundry_agent_call\",\"id\":\"item123\",\"object\":\"realtime.item\"," + + "\"name\":\"test-agent\",\"call_id\":\"call456\",\"arguments\":\"{\\\"param\\\":\\\"value\\\"}\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ResponseFoundryAgentCallItem item = data.toObject(ResponseFoundryAgentCallItem.class); + + // Assert + assertNotNull(item); + assertEquals(ItemType.FOUNDRY_AGENT_CALL, item.getType()); + assertEquals("item123", item.getId()); + assertEquals(ResponseItemObject.REALTIME_ITEM, item.getObject()); + assertEquals("test-agent", item.getName()); + assertEquals("call456", item.getCallId()); + assertEquals("{\"param\":\"value\"}", item.getArguments()); + } + + @Test + void testResponseFoundryAgentCallItemWithAllFields() { + // Arrange + String json = "{\"type\":\"foundry_agent_call\",\"id\":\"item789\",\"object\":\"realtime.item\"," + + "\"name\":\"my-agent\",\"call_id\":\"call012\",\"arguments\":\"{}\"," + + "\"agent_response_id\":\"resp345\",\"output\":\"Agent response text\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ResponseFoundryAgentCallItem item = data.toObject(ResponseFoundryAgentCallItem.class); + + // Assert + assertNotNull(item); + assertEquals("my-agent", item.getName()); + assertEquals("call012", item.getCallId()); + assertEquals("{}", item.getArguments()); + assertEquals("resp345", item.getAgentResponseId()); + assertEquals("Agent response text", item.getOutput()); + } + + @Test + void testResponseFoundryAgentCallItemWithError() { + // Arrange + String json = "{\"type\":\"foundry_agent_call\",\"id\":\"item999\",\"object\":\"realtime.item\"," + + "\"name\":\"error-agent\",\"call_id\":\"call888\",\"arguments\":\"{}\"," + + "\"error\":{\"code\":\"error_code\",\"message\":\"Something went wrong\"}}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ResponseFoundryAgentCallItem item = data.toObject(ResponseFoundryAgentCallItem.class); + + // Assert + assertNotNull(item); + assertEquals("error-agent", item.getName()); + assertNotNull(item.getError()); + } + + @Test + void testItemTypeFoundryAgentCall() { + // Assert + assertEquals("foundry_agent_call", ItemType.FOUNDRY_AGENT_CALL.toString()); + assertEquals(ItemType.FOUNDRY_AGENT_CALL, ItemType.fromString("foundry_agent_call")); + } + + @Test + void testResponseFoundryAgentCallItemJsonRoundTrip() { + // Arrange + String json = "{\"type\":\"foundry_agent_call\",\"id\":\"item111\",\"object\":\"realtime.item\"," + + "\"name\":\"roundtrip-agent\",\"call_id\":\"call222\",\"arguments\":\"{\\\"test\\\":true}\"}"; + BinaryData originalData = BinaryData.fromString(json); + ResponseFoundryAgentCallItem item = originalData.toObject(ResponseFoundryAgentCallItem.class); + + // Act + BinaryData serialized = BinaryData.fromObject(item); + ResponseFoundryAgentCallItem deserialized = serialized.toObject(ResponseFoundryAgentCallItem.class); + + // Assert + assertEquals(item.getType(), deserialized.getType()); + assertEquals(item.getId(), deserialized.getId()); + assertEquals(item.getObject(), deserialized.getObject()); + assertEquals(item.getName(), deserialized.getName()); + assertEquals(item.getCallId(), deserialized.getCallId()); + assertEquals(item.getArguments(), deserialized.getArguments()); + } + + @Test + void testResponseFoundryAgentCallItemMinimalFields() { + // Arrange - minimal required fields + String json = "{\"type\":\"foundry_agent_call\",\"name\":\"minimal-agent\"," + + "\"call_id\":\"minimal-call\",\"arguments\":\"{}\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ResponseFoundryAgentCallItem item = data.toObject(ResponseFoundryAgentCallItem.class); + + // Assert + assertNotNull(item); + assertEquals(ItemType.FOUNDRY_AGENT_CALL, item.getType()); + assertEquals("minimal-agent", item.getName()); + assertEquals("minimal-call", item.getCallId()); + assertEquals("{}", item.getArguments()); + assertNull(item.getAgentResponseId()); + assertNull(item.getOutput()); + assertNull(item.getError()); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallLifecycleTest.java b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallLifecycleTest.java new file mode 100644 index 000000000000..3170aecaf42b --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/ServerEventResponseFoundryAgentCallLifecycleTest.java @@ -0,0 +1,253 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.voicelive.models; + +import com.azure.core.util.BinaryData; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * Unit tests for Foundry agent call lifecycle events: + * {@link ServerEventResponseFoundryAgentCallArgumentsDelta}, + * {@link ServerEventResponseFoundryAgentCallArgumentsDone}, + * {@link ServerEventResponseFoundryAgentCallInProgress}, + * {@link ServerEventResponseFoundryAgentCallCompleted}, + * {@link ServerEventResponseFoundryAgentCallFailed}. + */ +class ServerEventResponseFoundryAgentCallLifecycleTest { + + @Test + void testServerEventResponseFoundryAgentCallArgumentsDelta() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call_arguments.delta\",\"event_id\":\"event123\"," + + "\"item_id\":\"item456\",\"response_id\":\"resp789\",\"output_index\":0,\"delta\":\"partial_args\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ServerEventResponseFoundryAgentCallArgumentsDelta event + = data.toObject(ServerEventResponseFoundryAgentCallArgumentsDelta.class); + + // Assert + assertNotNull(event); + assertEquals(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DELTA, event.getType()); + assertEquals("event123", event.getEventId()); + assertEquals("item456", event.getItemId()); + assertEquals("resp789", event.getResponseId()); + assertEquals(0, event.getOutputIndex()); + assertEquals("partial_args", event.getDelta()); + } + + @Test + void testServerEventResponseFoundryAgentCallArgumentsDone() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call_arguments.done\",\"event_id\":\"event456\"," + + "\"item_id\":\"item789\",\"response_id\":\"resp012\",\"output_index\":1,\"arguments\":\"{\\\"key\\\":\\\"value\\\"}\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ServerEventResponseFoundryAgentCallArgumentsDone event + = data.toObject(ServerEventResponseFoundryAgentCallArgumentsDone.class); + + // Assert + assertNotNull(event); + assertEquals(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DONE, event.getType()); + assertEquals("event456", event.getEventId()); + assertEquals("item789", event.getItemId()); + assertEquals("resp012", event.getResponseId()); + assertEquals(1, event.getOutputIndex()); + assertEquals("{\"key\":\"value\"}", event.getArguments()); + } + + @Test + void testServerEventResponseFoundryAgentCallInProgress() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call.in_progress\",\"event_id\":\"event789\"," + + "\"item_id\":\"item012\",\"output_index\":2,\"agent_response_id\":\"agent_resp_123\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ServerEventResponseFoundryAgentCallInProgress event + = data.toObject(ServerEventResponseFoundryAgentCallInProgress.class); + + // Assert + assertNotNull(event); + assertEquals(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_IN_PROGRESS, event.getType()); + assertEquals("event789", event.getEventId()); + assertEquals("item012", event.getItemId()); + assertEquals(2, event.getOutputIndex()); + assertEquals("agent_resp_123", event.getAgentResponseId()); + } + + @Test + void testServerEventResponseFoundryAgentCallCompleted() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call.completed\",\"event_id\":\"event012\"," + + "\"item_id\":\"item345\",\"output_index\":3}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ServerEventResponseFoundryAgentCallCompleted event + = data.toObject(ServerEventResponseFoundryAgentCallCompleted.class); + + // Assert + assertNotNull(event); + assertEquals(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_COMPLETED, event.getType()); + assertEquals("event012", event.getEventId()); + assertEquals("item345", event.getItemId()); + assertEquals(3, event.getOutputIndex()); + } + + @Test + void testServerEventResponseFoundryAgentCallFailed() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call.failed\",\"event_id\":\"event345\"," + + "\"item_id\":\"item678\",\"output_index\":4}"; + BinaryData data = BinaryData.fromString(json); + + // Act + ServerEventResponseFoundryAgentCallFailed event + = data.toObject(ServerEventResponseFoundryAgentCallFailed.class); + + // Assert + assertNotNull(event); + assertEquals(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_FAILED, event.getType()); + assertEquals("event345", event.getEventId()); + assertEquals("item678", event.getItemId()); + assertEquals(4, event.getOutputIndex()); + } + + @Test + void testArgumentsDeltaJsonRoundTrip() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call_arguments.delta\",\"event_id\":\"evt1\"," + + "\"item_id\":\"itm1\",\"response_id\":\"resp1\",\"output_index\":0,\"delta\":\"test_delta\"}"; + BinaryData originalData = BinaryData.fromString(json); + ServerEventResponseFoundryAgentCallArgumentsDelta event + = originalData.toObject(ServerEventResponseFoundryAgentCallArgumentsDelta.class); + + // Act + BinaryData serialized = BinaryData.fromObject(event); + ServerEventResponseFoundryAgentCallArgumentsDelta deserialized + = serialized.toObject(ServerEventResponseFoundryAgentCallArgumentsDelta.class); + + // Assert + assertEquals(event.getType(), deserialized.getType()); + assertEquals(event.getEventId(), deserialized.getEventId()); + assertEquals(event.getItemId(), deserialized.getItemId()); + assertEquals(event.getResponseId(), deserialized.getResponseId()); + assertEquals(event.getOutputIndex(), deserialized.getOutputIndex()); + assertEquals(event.getDelta(), deserialized.getDelta()); + } + + @Test + void testArgumentsDoneJsonRoundTrip() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call_arguments.done\",\"event_id\":\"evt2\"," + + "\"item_id\":\"itm2\",\"response_id\":\"resp2\",\"output_index\":1,\"arguments\":\"{}\"}"; + BinaryData originalData = BinaryData.fromString(json); + ServerEventResponseFoundryAgentCallArgumentsDone event + = originalData.toObject(ServerEventResponseFoundryAgentCallArgumentsDone.class); + + // Act + BinaryData serialized = BinaryData.fromObject(event); + ServerEventResponseFoundryAgentCallArgumentsDone deserialized + = serialized.toObject(ServerEventResponseFoundryAgentCallArgumentsDone.class); + + // Assert + assertEquals(event.getType(), deserialized.getType()); + assertEquals(event.getEventId(), deserialized.getEventId()); + assertEquals(event.getItemId(), deserialized.getItemId()); + assertEquals(event.getResponseId(), deserialized.getResponseId()); + assertEquals(event.getOutputIndex(), deserialized.getOutputIndex()); + assertEquals(event.getArguments(), deserialized.getArguments()); + } + + @Test + void testInProgressJsonRoundTrip() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call.in_progress\",\"event_id\":\"evt3\"," + + "\"item_id\":\"itm3\",\"output_index\":2,\"agent_response_id\":\"ar3\"}"; + BinaryData originalData = BinaryData.fromString(json); + ServerEventResponseFoundryAgentCallInProgress event + = originalData.toObject(ServerEventResponseFoundryAgentCallInProgress.class); + + // Act + BinaryData serialized = BinaryData.fromObject(event); + ServerEventResponseFoundryAgentCallInProgress deserialized + = serialized.toObject(ServerEventResponseFoundryAgentCallInProgress.class); + + // Assert + assertEquals(event.getType(), deserialized.getType()); + assertEquals(event.getEventId(), deserialized.getEventId()); + assertEquals(event.getItemId(), deserialized.getItemId()); + assertEquals(event.getOutputIndex(), deserialized.getOutputIndex()); + assertEquals(event.getAgentResponseId(), deserialized.getAgentResponseId()); + } + + @Test + void testCompletedJsonRoundTrip() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call.completed\",\"event_id\":\"evt4\"," + + "\"item_id\":\"itm4\",\"output_index\":3}"; + BinaryData originalData = BinaryData.fromString(json); + ServerEventResponseFoundryAgentCallCompleted event + = originalData.toObject(ServerEventResponseFoundryAgentCallCompleted.class); + + // Act + BinaryData serialized = BinaryData.fromObject(event); + ServerEventResponseFoundryAgentCallCompleted deserialized + = serialized.toObject(ServerEventResponseFoundryAgentCallCompleted.class); + + // Assert + assertEquals(event.getType(), deserialized.getType()); + assertEquals(event.getEventId(), deserialized.getEventId()); + assertEquals(event.getItemId(), deserialized.getItemId()); + assertEquals(event.getOutputIndex(), deserialized.getOutputIndex()); + } + + @Test + void testFailedJsonRoundTrip() { + // Arrange + String json = "{\"type\":\"response.foundry_agent_call.failed\",\"event_id\":\"evt5\"," + + "\"item_id\":\"itm5\",\"output_index\":4}"; + BinaryData originalData = BinaryData.fromString(json); + ServerEventResponseFoundryAgentCallFailed event + = originalData.toObject(ServerEventResponseFoundryAgentCallFailed.class); + + // Act + BinaryData serialized = BinaryData.fromObject(event); + ServerEventResponseFoundryAgentCallFailed deserialized + = serialized.toObject(ServerEventResponseFoundryAgentCallFailed.class); + + // Assert + assertEquals(event.getType(), deserialized.getType()); + assertEquals(event.getEventId(), deserialized.getEventId()); + assertEquals(event.getItemId(), deserialized.getItemId()); + assertEquals(event.getOutputIndex(), deserialized.getOutputIndex()); + } + + @Test + void testServerEventTypeFoundryAgentCallValues() { + // Assert all Foundry agent call event types exist + assertNotNull(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DELTA); + assertNotNull(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DONE); + assertNotNull(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_IN_PROGRESS); + assertNotNull(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_COMPLETED); + assertNotNull(ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_FAILED); + + // Assert correct string values + assertEquals("response.foundry_agent_call_arguments.delta", + ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DELTA.toString()); + assertEquals("response.foundry_agent_call_arguments.done", + ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_ARGUMENTS_DONE.toString()); + assertEquals("response.foundry_agent_call.in_progress", + ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_IN_PROGRESS.toString()); + assertEquals("response.foundry_agent_call.completed", + ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_COMPLETED.toString()); + assertEquals("response.foundry_agent_call.failed", + ServerEventType.RESPONSE_FOUNDRY_AGENT_CALL_FAILED.toString()); + } +} diff --git a/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/VoiceLiveSessionOptionsNewFeaturesTest.java b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/VoiceLiveSessionOptionsNewFeaturesTest.java new file mode 100644 index 000000000000..4e8632105fb1 --- /dev/null +++ b/sdk/ai/azure-ai-voicelive/src/test/java/com/azure/ai/voicelive/models/VoiceLiveSessionOptionsNewFeaturesTest.java @@ -0,0 +1,149 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.ai.voicelive.models; + +import com.azure.core.util.BinaryData; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +/** + * Unit tests for new session options features: + * - ReasoningEffort configuration + * - FillerResponse configuration + */ +class VoiceLiveSessionOptionsNewFeaturesTest { + + @Test + void testSetAndGetReasoningEffort() { + // Arrange + VoiceLiveSessionOptions options = new VoiceLiveSessionOptions(); + + // Act + VoiceLiveSessionOptions result = options.setReasoningEffort(ReasoningEffort.MEDIUM); + + // Assert + assertSame(options, result); + assertEquals(ReasoningEffort.MEDIUM, options.getReasoningEffort()); + } + + @Test + void testSetReasoningEffortAllValues() { + // Test all reasoning effort values + VoiceLiveSessionOptions options = new VoiceLiveSessionOptions(); + + for (ReasoningEffort effort : ReasoningEffort.values()) { + options.setReasoningEffort(effort); + assertEquals(effort, options.getReasoningEffort()); + } + } + + @Test + void testSetAndGetFillerResponse() { + // Arrange + VoiceLiveSessionOptions options = new VoiceLiveSessionOptions(); + BasicFillerResponseConfig fillerConfig + = new BasicFillerResponseConfig().setTexts(Arrays.asList("Please wait...", "One moment...")) + .setTriggers(Arrays.asList(FillerTrigger.LATENCY)) + .setLatencyThresholdMs(2000); + BinaryData fillerData = BinaryData.fromObject(fillerConfig); + + // Act + VoiceLiveSessionOptions result = options.setFillerResponse(fillerData); + + // Assert + assertSame(options, result); + assertNotNull(options.getFillerResponse()); + } + + @Test + void testReasoningEffortJsonSerialization() { + // Arrange + VoiceLiveSessionOptions options = new VoiceLiveSessionOptions().setModel("gpt-4o-realtime-preview") + .setReasoningEffort(ReasoningEffort.HIGH); + + // Act + BinaryData serialized = BinaryData.fromObject(options); + VoiceLiveSessionOptions deserialized = serialized.toObject(VoiceLiveSessionOptions.class); + + // Assert + assertEquals(options.getModel(), deserialized.getModel()); + assertEquals(options.getReasoningEffort(), deserialized.getReasoningEffort()); + } + + @Test + void testFillerResponseJsonSerialization() { + // Arrange + LlmFillerResponseConfig fillerConfig = new LlmFillerResponseConfig().setModel("gpt-4.1-mini") + .setInstructions("Generate brief waiting messages") + .setMaxCompletionTokens(50) + .setTriggers(Arrays.asList(FillerTrigger.TOOL)) + .setLatencyThresholdMs(1500); + + VoiceLiveSessionOptions options = new VoiceLiveSessionOptions().setModel("gpt-4o-realtime-preview") + .setFillerResponse(BinaryData.fromObject(fillerConfig)); + + // Act + BinaryData serialized = BinaryData.fromObject(options); + VoiceLiveSessionOptions deserialized = serialized.toObject(VoiceLiveSessionOptions.class); + + // Assert + assertEquals(options.getModel(), deserialized.getModel()); + assertNotNull(deserialized.getFillerResponse()); + } + + @Test + void testMethodChainingWithNewFeatures() { + // Arrange + BasicFillerResponseConfig fillerConfig = new BasicFillerResponseConfig().setTexts(Arrays.asList("Hold on...")) + .setTriggers(Arrays.asList(FillerTrigger.LATENCY, FillerTrigger.TOOL)); + + // Act + VoiceLiveSessionOptions options = new VoiceLiveSessionOptions().setModel("gpt-4o-realtime-preview") + .setInstructions("Test instructions") + .setReasoningEffort(ReasoningEffort.LOW) + .setFillerResponse(BinaryData.fromObject(fillerConfig)) + .setTemperature(0.8); + + // Assert + assertEquals("gpt-4o-realtime-preview", options.getModel()); + assertEquals("Test instructions", options.getInstructions()); + assertEquals(ReasoningEffort.LOW, options.getReasoningEffort()); + assertNotNull(options.getFillerResponse()); + assertEquals(0.8, options.getTemperature()); + } + + @Test + void testVoiceLiveSessionResponseReasoningEffort() { + // Arrange + String json = "{\"id\":\"session123\",\"reasoning_effort\":\"high\"}"; + BinaryData data = BinaryData.fromString(json); + + // Act + VoiceLiveSessionResponse response = data.toObject(VoiceLiveSessionResponse.class); + + // Assert + assertNotNull(response); + assertEquals(ReasoningEffort.HIGH, response.getReasoningEffort()); + } + + @Test + void testVoiceLiveSessionResponseFillerResponse() { + // Arrange + String json + = "{\"id\":\"session456\",\"filler_response\":{\"type\":\"static_filler\",\"texts\":[\"Wait...\"]}}"; + BinaryData data = BinaryData.fromString(json); + + // Act + VoiceLiveSessionResponse response = data.toObject(VoiceLiveSessionResponse.class); + + // Assert + assertNotNull(response); + assertNotNull(response.getFillerResponse()); + } +} diff --git a/sdk/ai/azure-ai-voicelive/tsp-location.yaml b/sdk/ai/azure-ai-voicelive/tsp-location.yaml index 31a8a277dd97..8a45a1818475 100644 --- a/sdk/ai/azure-ai-voicelive/tsp-location.yaml +++ b/sdk/ai/azure-ai-voicelive/tsp-location.yaml @@ -1,4 +1,4 @@ directory: specification/ai/data-plane/VoiceLive -commit: a8b0baa97b3c15c2dca2abd87951734f35a04e87 +commit: c4539fb55b3292e0f38e6ef790c776573246c6d2 repo: Azure/azure-rest-api-specs additionalDirectories: