Add voice agent WebSocket transport, tests, samples, and AI Projects parity - #50408
Mike Guo (guotuofeng) wants to merge 23 commits into
Conversation
There was a problem hiding this comment.
🟡 Changes recommended
Unresolved critical and moderate findings remain in WebSocket behavior and model serialization.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Adds generated voice/realtime agent models and authenticated synchronous/asynchronous WS/WSS sessions to azure-ai-agents.
Changes:
- Regenerates voice, realtime, telephony, and agent model surfaces.
- Adds WebSocket authentication, proxying, typed events, audio, tools, cancellation, and close handling.
- Updates TypeSpec metadata, module dependencies, vocabulary, and release metadata.
Unresolved findings remain in connection validation and cancellation, bounded close buffering, handshake error preservation, and PromptAgentDefinition serialization.
File summaries
| File | Summary |
|---|---|
sdk/ai/cspell.yml |
Adds domain vocabulary. |
sdk/ai/azure-ai-agents/tsp-location.yaml |
Updates TypeSpec source metadata. |
sdk/ai/azure-ai-agents/src/main/java/module-info.java |
Updates module dependencies. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceType.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceResponseBaseStatus.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceResponseBaseOutputModality.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceResponseBaseObject1.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceResponseBaseObject.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceResponseAudio.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceOutputModality.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceModelType.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceConversationStatus.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAudioRole.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAudioContainerFormat.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAudioCodec.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentTurnDetectionType.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentTransport.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentToolResponseScheduling.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentSystemToolName.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentSubagentAbortReason.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentSessionIncludeOption.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentSemanticVadTurnDetectionEagerness.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentResponseCreateParamsConversation.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentNoiseReductionType.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentInterimResponseTrigger.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentFunctionToolType.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentEndOfUtteranceThresholdLevel.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentEchoCancellationReferenceSource.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentAvatarType.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentAvatarOutputProtocol.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentAudioTimestampType.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentAudioInputConfigTranscriptionDelay.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/VoiceAgentAnimationOutputType.java |
Generated voice model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TranscriptionLanguage.java |
Generated transcription model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/ToolType.java |
Generated tool model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/ToolConfig.java |
Generated tool model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/ToolChoiceOptions.java |
Generated tool model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/ToolboxVersions.java |
Generated toolbox model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/ToolboxToolType.java |
Generated toolbox model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/ToolboxTool.java |
Generated toolbox model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/Tool.java |
Generated tool model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyTransferDestinationKind.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyProvider.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyOutboundRetryPolicyType.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyOutboundDestinationType.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyOperationStatus.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCampaignScheduleType.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCampaignRecipientImportStatus.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCampaignRecipientImportFormat.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCampaignDuplicateHandling.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCampaignConfigurationStatus.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCallTraceStatus.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCallTraceMode.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCallTimestampSource.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCallStatus.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCallLifecycleEventSource.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCallLifecycleEventOutcome.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyCallDurationBasis.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/TelephonyBindingStatus.java |
Generated telephony model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/SessionAffinitySource.java |
Generated session-affinity model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/SessionAffinityRequestMode.java |
Generated session-affinity model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/SessionAffinityMode.java |
Generated session-affinity model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/SessionAffinityDecision.java |
Generated session-affinity model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeTurnDetectionType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeSessionCreateRequestUnionType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeServerEventResponseContentPartDonePartType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeServerEventResponseContentPartAddedPartType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeServerEventRateLimitsUpdatedRateLimitsName.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeServerEventConversationCreatedConversationObject.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeResponseStatusDetailsType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeResponseStatusDetailsReason.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeReasoningEffort.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeMcpErrorType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemObject.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemMessageUserStatus.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemMessageUserContentType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemMessageUserContentDetail.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemMessageType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemMessageSystemStatus.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemMessageSystemContentType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemMessageAssistantStatus.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemMessageAssistantContentType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemFunctionCallStatus.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeConversationItemFunctionCallOutputStatus.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeClientEventSessionUpdateSessionTruncation.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeClientEventSessionUpdateSessionOutputModality.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeAudioFormatsType.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RealtimeAudioFormatsAudioPcmRate.java |
Generated realtime model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RaiInvocationMode.java |
Generated responsible-AI model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/RaiInvocationContentType.java |
Generated responsible-AI model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/PublishTelephonyCampaignRequest.java |
Generated telephony request model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/PromptCacheBreakpointConfig.java |
Generated prompt model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/PromptAgentDefinition.java |
Prompt agent model; serialization finding remains. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/NoiseReductionType.java |
Generated audio model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/ModelRouterDetails.java |
Generated agent model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/McpListToolsToolInputSchema.java |
Generated MCP model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/McpListToolsToolAnnotations.java |
Generated MCP model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/ImageDetail.java |
Generated content model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/GitHubCopilotHarness.java |
Generated GitHub Copilot model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/GitHubCopilotBuiltInTool.java |
Generated GitHub Copilot model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/FileInputDetail.java |
Generated content model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/CreateTranscriptionResponseJsonUsageType.java |
Generated transcription model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/AzureCreateResponseOptions.java |
Generated agent model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/AgentOptimizationJobProgress.java |
Generated agent model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/AgentKind.java |
Generated agent model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/AgentEndpointProtocol.java |
Generated agent model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/AgentDetails.java |
Generated agent model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/models/AgentDefinition.java |
Generated agent model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/implementation/SyncOperationLocationPollingStrategy.java |
Polling customization. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/implementation/realtime/VoiceAgentWebSocketHandshakeHandler.java |
WebSocket handshake handling. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/implementation/OperationLocationPollingStrategy.java |
Polling customization. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/implementation/models/TransferTelephonyCallRequest.java |
Generated implementation model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/implementation/models/AgentDefinitionOptInKeys.java |
Generated implementation model. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/implementation/JsonMergePatchHelper.java |
JSON merge-patch helper. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/implementation/AgentsClientImpl.java |
Generated client implementation. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/BetaVoiceAgentWebSocketClient.java |
Synchronous WebSocket entry point; validation finding remains. |
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/BetaVoiceAgentWebSocketAsyncClient.java |
Asynchronous WebSocket entry point. |
sdk/ai/azure-ai-agents/CHANGELOG.md |
Documents the feature. |
sdk/ai/azure-ai-agents/assets.json |
Updates package metadata. |
Review details
Suppressed comments (4)
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/VoiceAgentWebSocketSessionAsyncClient.java:404
- Disabling automatic ping handling leaves ping frames to the receive path, but
handleFrameonly processes text and binary frames and never sends a Pong. A server keepalive ping can therefore go unanswered and cause the session to be closed. Keep automatic ping handling enabled or explicitly process PingWebSocketFrame messages.
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/VoiceAgentWebSocketSessionClient.java:412 - The OkHttp transport configures a fixed proxy but ignores
ProxyOptions.getNonProxyHosts(), whereas the Reactor Netty path honors that setting. Synchronous sessions therefore route hosts configured to bypass the proxy through it, which can break internal endpoints and makes the two clients behave differently. Configure the OkHttp proxy selector to honor the bypass pattern.
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/VoiceAgentWebSocketSessionClient.java:92 - The synchronous constructor accepts an empty agent name and builds
/agents//endpoint/protocols/voice, whereas the async constructor rejects empty names.connect("")should fail before issuing this malformed service request so both public clients have the same validation.
sdk/ai/azure-ai-agents/src/main/java/com/azure/ai/agents/implementation/realtime/VoiceAgentWebSocketHttpResponse.java:37 - Netty can expose multiple header entries with the same name, but
HttpHeaders.setoverwrites the previous value on each iteration. A rejected handshake with repeated headers (for example, authentication challenges) is therefore reported with only its last value, unlike the OkHttp adapter. Append each entry instead of replacing the header.
- Files reviewed: 74/418 changed files
- Comments generated: 5
- Review effort level: Lite
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
c27ca24 to
f5b5cc2
Compare
|
Azure Pipelines: Successfully started running 278 pipeline(s). 36 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
1 similar comment
|
Azure Pipelines: Successfully started running 278 pipeline(s). 36 pipeline(s) were filtered out due to trigger conditions. There may be pipelines that require an authorized user to comment /azp run to run. |
f5b5cc2 to
e20f5ac
Compare
e20f5ac to
1b86c84
Compare
Kaylie (kaylieee)
left a comment
There was a problem hiding this comment.
Scope: this PR contains a substantial set of changes that are unrelated to the websocket/voice agent functionality. Examples include:
- Additional models eg.
AzureAIEvaluationDataSource,FileUploadOptions,ModelUploadOptions - Addition of handwritten methods across multiple clients
- Addition of telemetryclient
- Modifications to polling strategy
azure-ai-projectsbuilder configuration updates
I have not listed every affected file. Can you please clarify why these changes are required for the websocket implementation? Unless they are direct dependencies, please revert them here so this PR remains focused.
|
Thanks for calling this out. The listed changes are not direct dependencies of the voice-agent WebSocket implementation. They came from a broader Java/Python SDK parity audit that was consolidated into this PR:
The PR title and description were broadened when that parity work was consolidated, but I agree these changes are separable from WebSocket/voice functionality. Would you prefer that I split the non-voice parity work into a separate stacked PR and keep #50408 focused on voice agents and their direct dependencies? I can do that before further review. |
Thanks for clarifying. I don't think we should carry the unrelated parity changes forward as a stacked PR from this work. Since they aren't direct dependencies of the websocket implementation, could we revert them here and revisit them independently if needed? |
|
Thanks for removing the public OkHttp/Reactor Netty callbacks in eec49fe. That addresses the transport-type leak and also removes the path by which a caller could supply shared OkHttp resources that the session would subsequently shut down. I still have a few concerns about the WebSocket API/configuration boundary:
|
|
Thanks for clarifying the parity work's origin. I agree with Kaylie's request to remove the unrelated changes here and revisit them independently if needed, rather than carrying them forward as a stacked dependency of this work. At eec49fe, these separable groups are still in the diff:
Let's keep #50408 focused on VoiceAgents functionality, the WebSocket transport and wiring it actually needs, and the corresponding documentation, samples, and tests. The listed parity entry points are not called by the voice samples/tests, and the WebSocket configuration path does not depend on the new OpenAI factory path. If a particular shared-infrastructure change really is a prerequisite, please identify the concrete dependency and retain only that necessary hunk. Please move/remove the associated non-voice tests, documentation, changelog entries, and generation customizations together with the implementation changes, and narrow the PR title/description accordingly. This is about separating reviewable changes, not deleting existing shared infrastructure or dismissing potentially useful fixes. |
|
One polling follow-up for when this work is revisited independently: GET-only resumption from a saved job ID is a reasonable requirement, and these helpers do use Azure Core's There is, however, a concrete issue in async activation in both The GET callback already constructs a complete Please use the existing |
|
Following up specifically on the Both
Agents additionally rewrites both polling strategies' I understand the engineering purpose: these transformations make the corresponding behavior survive regeneration, and cloning generated methods avoids manually freezing their constructor/pipeline details. But that explains why the customizations accompany those changes, not why the changes belong in a VoiceAgents PR. The WebSocket construction path does not call these cloned inner-client/OpenAI pipeline methods, and preview-aware REST client construction already existed at the base of this PR. Please remove these new AST transformations together with the unrelated logging/OpenAI/preview-error and memory-polling changes, unless there is a concrete VoiceAgents requirement for a particular transformation. Preserve existing customizations and any minimal generated metadata adjustment genuinely needed for voice clients. For ordinary handwritten builder additions, use the existing partial-update mechanism rather than adding AST injection; generated-member changes may still legitimately need customization. This should not be fixed by deleting the customizations while leaving their generated effects behind, or by copying the entire generated pipeline into handwritten code. Please keep the retained source changes and their regeneration inputs consistent. The narrowly scoped voice feature should not require maintaining two new copies of template-sensitive pipeline-rewriting logic. |
|
Split the work into a new two-PR stack as requested:
The original |
Description
Follow-up to the generated Projects + Agents foundation merged through #50407. This PR now targets
maindirectly and adds handwritten voice-agent WebSocket transport, AI Projects parity improvements, tests, samples, and documentation.Azure AI Agents
Voice agents and WebSocket transport
AgentsClientBuilder.beta().wss://endpoints and validates URL overrides before token acquisition.Builders, preview features, and OpenAI integration
Foundry-Featuresvalues; non-beta preview APIs remain controlled byallowPreview(true).ResponsesAsyncClient.403 preview_feature_requirederrors while preserving service response details.generateAgentmethods withcreateAgentFromPromptmethods on beta Agents clients.Polling, uploads, and logging
completed,succeeded,superseded, andcancelledto Azure Core polling states.StreamingResponseUtilsadapters for OpenAI streaming responses.Samples and tests
Azure AI Projects
File and model uploads
Projects APIs and parity
Compatibility and Security
PR History
main.maindirectly and has no active lower-PR dependency.Current TypeSpec pins: Projects
c12a439255c265d647357b4762e095656dda91c0; Agents2ba065c423a4c08ddb4e517a9f16deb17cb378c2.Validation
Combined foundation validation:
Verify TypeSpec Code Generationtask passed for both modules with exit code 0.Core validation before the latest foundation update:
Telephony validation:
VoiceAgentTelephonyTests: 14 passed, covering sync/async request paths, status codes, typed responses/errors, ETags, idempotency keys, and call-job revisions.Known Limits
These are dated local validation results, not a claim that current CI or merge requirements are complete. See the PR checks for current status.
Contribution Checklist