openai/openai-dotnet

Public

mirrored from https://github.com/openai/openai-dotnetAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.11.0-oidc.test1

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

examples/Realtime/Example01_AudioFromFileWithToolsAsync.cs

262lines · modeblame

b0f9e5c3Jose Arriaga Maldonado1 years ago1using NUnit.Framework;
5dce104aJose Arriaga Maldonado1 years ago2using OpenAI.Realtime;
b0f9e5c3Jose Arriaga Maldonado1 years ago3using System;
4using System.Collections.Generic;
5using System.IO;
6using System.Linq;
7using System.Threading.Tasks;
8
9namespace OpenAI.Examples;
10
11#pragma warning disable OPENAI002
12
13public partial class RealtimeExamples
14{
803f0cadJose Arriaga Maldonado5 months ago15private static string GetCurrentWeather(string location, string unit = "celsius")
16{
17// Call the weather API here.
18return $"31 {unit}";
19}
20
e6152905Jose Arriaga Maldonado5 months ago21private static readonly RealtimeFunctionTool getCurrentWeatherTool = new(functionName: nameof(GetCurrentWeather))
803f0cadJose Arriaga Maldonado5 months ago22{
23FunctionDescription = "gets the weather for a location",
24FunctionParameters = BinaryData.FromString("""
25{
26"type": "object",
27"properties": {
28"location": {
29"type": "string",
30"description": "The city and state, e.g. Boston, MA"
31},
32"unit": {
33"type": "string",
34"enum": [ "celsius", "fahrenheit" ],
35"description": "The temperature unit to use. Infer this from the specified location."
36}
37},
38"required": [ "location" ]
39}
40""")
41};
42
b0f9e5c3Jose Arriaga Maldonado1 years ago43[Test]
44public async Task Example01_AudioFromFileWithToolsAsync()
45{
803f0cadJose Arriaga Maldonado5 months ago46RealtimeClient client = new(apiKey: Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
47
48using RealtimeSessionClient sessionClient = await client.StartConversationSessionAsync(model: "gpt-realtime");
49
e6152905Jose Arriaga Maldonado5 months ago50RealtimeConversationSessionOptions sessionOptions = new()
b0f9e5c3Jose Arriaga Maldonado1 years ago51{
52Instructions = "You are a cheerful assistant that talks like a pirate. "
53+ "Always inform the user when you are about to call a tool. "
54+ "Prefer to call tools whenever applicable.",
803f0cadJose Arriaga Maldonado5 months ago55
56Tools = { getCurrentWeatherTool },
57
58AudioOptions = new()
b0f9e5c3Jose Arriaga Maldonado1 years ago59{
803f0cadJose Arriaga Maldonado5 months ago60InputAudioOptions = new()
31d65943Christopher Scott5 months ago61{
803f0cadJose Arriaga Maldonado5 months ago62// AudioFormat = new GARealtimePcmAudioFormat(),
63AudioTranscriptionOptions = new()
31d65943Christopher Scott5 months ago64{
803f0cadJose Arriaga Maldonado5 months ago65Model = "gpt-4o-transcribe",
31d65943Christopher Scott5 months ago66},
e6152905Jose Arriaga Maldonado5 months ago67TurnDetection = new RealtimeServerVadTurnDetection(),
31d65943Christopher Scott5 months ago68},
803f0cadJose Arriaga Maldonado5 months ago69OutputAudioOptions = new()
31d65943Christopher Scott5 months ago70{
803f0cadJose Arriaga Maldonado5 months ago71// AudioFormat = new GARealtimePcmAudioFormat(),
e6152905Jose Arriaga Maldonado5 months ago72Voice = RealtimeVoice.Alloy,
31d65943Christopher Scott5 months ago73},
b0f9e5c3Jose Arriaga Maldonado1 years ago74},
75};
76
803f0cadJose Arriaga Maldonado5 months ago77await sessionClient.ConfigureConversationSessionAsync(sessionOptions);
b0f9e5c3Jose Arriaga Maldonado1 years ago78
803f0cadJose Arriaga Maldonado5 months ago79// The conversation history (if applicable) can be provided by adding messages to the
80// conversation one by one. Note that adding a message will not automatically initiate
81// a response from the model.
e6152905Jose Arriaga Maldonado5 months ago82await sessionClient.AddItemAsync(RealtimeItem.CreateUserMessageItem("I'm trying to decide what to wear on my trip."));
b0f9e5c3Jose Arriaga Maldonado1 years ago83
803f0cadJose Arriaga Maldonado5 months ago84string inputAudioFilePath = Path.Join("Assets", "realtime_whats_the_weather_pcm16_24khz_mono.wav");
85using Stream inputAudioStream = File.OpenRead(inputAudioFilePath);
86_ = sessionClient.SendInputAudioAsync(inputAudioStream);
b0f9e5c3Jose Arriaga Maldonado1 years ago87
803f0cadJose Arriaga Maldonado5 months ago88string outputAudioFilePath = Path.Join("output.raw");
89using Stream outputAudioStream = File.OpenWrite(outputAudioFilePath);
b0f9e5c3Jose Arriaga Maldonado1 years ago90
803f0cadJose Arriaga Maldonado5 months ago91bool done = false;
b0f9e5c3Jose Arriaga Maldonado1 years ago92
e6152905Jose Arriaga Maldonado5 months ago93await foreach (RealtimeServerUpdate update in sessionClient.ReceiveUpdatesAsync())
803f0cadJose Arriaga Maldonado5 months ago94{
95switch (update)
b0f9e5c3Jose Arriaga Maldonado1 years ago96{
e6152905Jose Arriaga Maldonado5 months ago97case RealtimeServerUpdateSessionCreated sessionCreatedUpdate:
803f0cadJose Arriaga Maldonado5 months ago98{
99Console.WriteLine($"[EVENT ID: {sessionCreatedUpdate.EventId}]");
100Console.WriteLine($">> Session created.");
101Console.WriteLine();
102break;
103}
e6152905Jose Arriaga Maldonado5 months ago104case RealtimeServerUpdateSessionUpdated sessionUpdatedUpdate:
803f0cadJose Arriaga Maldonado5 months ago105{
106Console.WriteLine($"[EVENT ID: {sessionUpdatedUpdate.EventId}]");
107Console.WriteLine($">> Session updated.");
108Console.WriteLine();
109break;
110}
e6152905Jose Arriaga Maldonado5 months ago111case RealtimeServerUpdateInputAudioBufferSpeechStarted inputAudioBufferSpeechStartedUpdate:
803f0cadJose Arriaga Maldonado5 months ago112{
113Console.WriteLine($"[EVENT ID: {inputAudioBufferSpeechStartedUpdate.EventId}]");
114Console.WriteLine($">> Speech started at {inputAudioBufferSpeechStartedUpdate.AudioStartTime}.");
115Console.WriteLine();
116break;
117}
e6152905Jose Arriaga Maldonado5 months ago118case RealtimeServerUpdateInputAudioBufferSpeechStopped inputAudioBufferSpeechStoppedUpdate:
803f0cadJose Arriaga Maldonado5 months ago119{
120Console.WriteLine($"[EVENT ID: {inputAudioBufferSpeechStoppedUpdate.EventId}]");
121Console.WriteLine($">> Speech stopped at {inputAudioBufferSpeechStoppedUpdate.AudioEndTime}.");
122Console.WriteLine();
123break;
124}
e6152905Jose Arriaga Maldonado5 months ago125case RealtimeServerUpdateConversationItemDone conversationItemDoneUpdate:
803f0cadJose Arriaga Maldonado5 months ago126{
127Console.WriteLine($"[EVENT ID: {conversationItemDoneUpdate.EventId}]");
128Console.WriteLine($">> Conversation item done. Type: {conversationItemDoneUpdate.Item.Patch.GetString("$.type"u8)}.");
b0f9e5c3Jose Arriaga Maldonado1 years ago129
e6152905Jose Arriaga Maldonado5 months ago130RealtimeMessageItem messageItem = conversationItemDoneUpdate.Item as RealtimeMessageItem;
b0f9e5c3Jose Arriaga Maldonado1 years ago131
803f0cadJose Arriaga Maldonado5 months ago132if (messageItem != null)
133{
e6152905Jose Arriaga Maldonado5 months ago134foreach (RealtimeMessageContentPart contentPart in messageItem.Content)
803f0cadJose Arriaga Maldonado5 months ago135{
136switch (contentPart)
137{
e6152905Jose Arriaga Maldonado5 months ago138case RealtimeInputTextMessageContentPart inputTextPart:
803f0cadJose Arriaga Maldonado5 months ago139{
140Console.WriteLine();
141Console.WriteLine($"++ [{messageItem.Role.ToString().ToUpperInvariant()}]:");
142Console.WriteLine(inputTextPart.Text);
143break;
144}
e6152905Jose Arriaga Maldonado5 months ago145case RealtimeOutputTextMessageContentPart outputTextPart:
803f0cadJose Arriaga Maldonado5 months ago146{
147Console.WriteLine();
148Console.WriteLine($"++ [{messageItem.Role.ToString().ToUpperInvariant()}]:");
149Console.WriteLine(outputTextPart.Text);
150break;
151}
152}
153}
154}
b0f9e5c3Jose Arriaga Maldonado1 years ago155
803f0cadJose Arriaga Maldonado5 months ago156Console.WriteLine();
157break;
b0f9e5c3Jose Arriaga Maldonado1 years ago158}
e6152905Jose Arriaga Maldonado5 months ago159case RealtimeServerUpdateConversationItemInputAudioTranscriptionCompleted conversationItemInputAudioTranscriptionCompletedUpdate:
803f0cadJose Arriaga Maldonado5 months ago160{
161Console.WriteLine($"[EVENT ID: {conversationItemInputAudioTranscriptionCompletedUpdate.EventId}]");
162Console.WriteLine($">> Conversation item input audio transcription completed.");
b0f9e5c3Jose Arriaga Maldonado1 years ago163
803f0cadJose Arriaga Maldonado5 months ago164Console.WriteLine();
165Console.WriteLine($"++ [USER]:");
166Console.WriteLine($"{conversationItemInputAudioTranscriptionCompletedUpdate.Transcript}");
167Console.WriteLine();
168break;
169}
e6152905Jose Arriaga Maldonado5 months ago170case RealtimeServerUpdateResponseOutputAudioDelta responseOutputAudioDeltaUpdate:
803f0cadJose Arriaga Maldonado5 months ago171{
172Console.WriteLine($"[EVENT ID: {responseOutputAudioDeltaUpdate.EventId}]");
173Console.WriteLine($">> Response output audio delta. Bytes: {responseOutputAudioDeltaUpdate.Delta.Length}.");
b0f9e5c3Jose Arriaga Maldonado1 years ago174
803f0cadJose Arriaga Maldonado5 months ago175outputAudioStream.Write(responseOutputAudioDeltaUpdate.Delta);
b0f9e5c3Jose Arriaga Maldonado1 years ago176
803f0cadJose Arriaga Maldonado5 months ago177break;
178}
e6152905Jose Arriaga Maldonado5 months ago179case RealtimeServerUpdateResponseOutputAudioDone responseOutputAudioDoneUpdate:
b0f9e5c3Jose Arriaga Maldonado1 years ago180{
803f0cadJose Arriaga Maldonado5 months ago181Console.WriteLine($"[EVENT ID: {responseOutputAudioDoneUpdate.EventId}]");
182Console.WriteLine($">> Response output audio done. Bytes: {outputAudioStream.Length}.");
183Console.WriteLine();
184break;
b0f9e5c3Jose Arriaga Maldonado1 years ago185}
e6152905Jose Arriaga Maldonado5 months ago186case RealtimeServerUpdateResponseOutputAudioTranscriptDone responseOutputAudioTranscriptionDoneUpdate:
803f0cadJose Arriaga Maldonado5 months ago187{
188Console.WriteLine($"[EVENT ID: {responseOutputAudioTranscriptionDoneUpdate.EventId}]");
189Console.WriteLine($">> Response output audio transcription done.");
b0f9e5c3Jose Arriaga Maldonado1 years ago190
803f0cadJose Arriaga Maldonado5 months ago191Console.WriteLine();
192Console.WriteLine($"++ [ASSISTANT]:");
193Console.WriteLine($"{responseOutputAudioTranscriptionDoneUpdate.Transcript}");
194Console.WriteLine();
195break;
196}
e6152905Jose Arriaga Maldonado5 months ago197case RealtimeServerUpdateResponseDone responseDoneUpdate:
803f0cadJose Arriaga Maldonado5 months ago198{
199Console.WriteLine($"[EVENT ID: {responseDoneUpdate.EventId}]");
200Console.WriteLine($">> Response done. Status: {responseDoneUpdate.Response.Status}.");
b0f9e5c3Jose Arriaga Maldonado1 years ago201
803f0cadJose Arriaga Maldonado5 months ago202bool hasToolCalls = false;
b0f9e5c3Jose Arriaga Maldonado1 years ago203
e6152905Jose Arriaga Maldonado5 months ago204List<RealtimeFunctionCallItem> functionCallItems = responseDoneUpdate.Response.OutputItems
205.OfType<RealtimeFunctionCallItem>()
803f0cadJose Arriaga Maldonado5 months ago206.ToList();
b0f9e5c3Jose Arriaga Maldonado1 years ago207
e6152905Jose Arriaga Maldonado5 months ago208foreach (RealtimeFunctionCallItem functionCallItem in functionCallItems)
803f0cadJose Arriaga Maldonado5 months ago209{
210hasToolCalls = true;
b0f9e5c3Jose Arriaga Maldonado1 years ago211
803f0cadJose Arriaga Maldonado5 months ago212Console.WriteLine($">> Calling {functionCallItem.FunctionName} function...");
b0f9e5c3Jose Arriaga Maldonado1 years ago213
803f0cadJose Arriaga Maldonado5 months ago214string output = GetCurrentWeather(location: "San Francisco, CA");
215
e6152905Jose Arriaga Maldonado5 months ago216RealtimeItem functionCallOutputItem = RealtimeItem.CreateFunctionCallOutputItem(
803f0cadJose Arriaga Maldonado5 months ago217callId: functionCallItem.CallId,
218functionOutput: output);
219
220Console.WriteLine($">> Adding function call output item...");
221
222await sessionClient.AddItemAsync(functionCallOutputItem);
223}
224
225if (hasToolCalls)
226{
227// If we need the model to process the output of a tool call, we instruct
228// the server to create another responses.
229Console.WriteLine($">> Requesting follow up response...");
230
231await sessionClient.StartResponseAsync();
232}
233else
234{
235done = true;
236break;
237}
238
239Console.WriteLine();
240break;
241}
e6152905Jose Arriaga Maldonado5 months ago242case RealtimeServerUpdateError errorUpdate:
803f0cadJose Arriaga Maldonado5 months ago243{
244Console.WriteLine($"[EVENT ID: {errorUpdate.EventId}]");
245Console.WriteLine($"Error: {errorUpdate.Error.Message}");
246
247done = true;
248
249Console.WriteLine();
250break;
251}
b0f9e5c3Jose Arriaga Maldonado1 years ago252}
253
803f0cadJose Arriaga Maldonado5 months ago254if (done)
b0f9e5c3Jose Arriaga Maldonado1 years ago255{
803f0cadJose Arriaga Maldonado5 months ago256break;
b0f9e5c3Jose Arriaga Maldonado1 years ago257}
258}
259}
260}
5dce104aJose Arriaga Maldonado1 years ago261
262#pragma warning restore OPENAI002