usingvarclient=newUltravoxClient(apiKey);// Create a call using the REST API to get a joinUrl.varcall=awaitclient.Calls.CallsCreateAsync(newUltravoxV1StartCallRequest{SystemPrompt="You are a helpful assistant. Respond briefly.",});Console.WriteLine($"Call ID: {call.CallId}");// Connect to the WebSocket using the joinUrl from the REST call.usingvarrealtimeClient=newUltravoxRealtimeClient();awaitrealtimeClient.ConnectAsync(newUri(call.JoinUrl!));// Send a text message to the agent.awaitrealtimeClient.SendUserTextMessageAsync(newUserTextMessagePayload{Text="Hello, how are you?",});// Receive server events: state changes, transcripts, and tool invocations.usingvarcts=newCancellationTokenSource(TimeSpan.FromSeconds(30));varreceivedCallStarted=false;varreceivedTranscript=false;awaitforeach(varserverEventinrealtimeClient.ReceiveUpdatesAsync(cts.Token)){if(serverEvent.IsCallStarted){receivedCallStarted=true;Console.WriteLine($"Call started: {serverEvent.CallStarted?.CallId}");}elseif(serverEvent.IsState){Console.WriteLine($"Agent state: {serverEvent.State?.State}");}elseif(serverEvent.IsTranscript){vartranscript=serverEvent.Transcript!;Console.Write(transcript.Delta??transcript.Text);if(transcript.Final==true&&transcript.Role==TranscriptPayloadRole.Agent){receivedTranscript=true;Console.WriteLine();break;}}elseif(serverEvent.IsClientToolInvocation){// Respond to client tool invocations.varinvocation=serverEvent.ClientToolInvocation!;awaitrealtimeClient.SendClientToolResultAsync(newClientToolResultPayload{InvocationId=invocation.InvocationId,Result="Tool executed successfully.",});}elseif(serverEvent.IsDebug){Console.WriteLine($"Debug: {serverEvent.Debug?.Message}");}}// Hang up the call.awaitrealtimeClient.SendHangUpAsync(newHangUpPayload{Message="Goodbye!",});