openai/openai-dotnet

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.1.0-beta.2

Branches

Tags

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

Clone

HTTPS

Download ZIP

examples/CombinationExamples.cs

150lines · modeblame

9f9f2936Jose Arriaga Maldonado2 years ago1using NUnit.Framework;
2using OpenAI.Audio;
3using OpenAI.Chat;
4using OpenAI.Images;
5using System;
6using System.ClientModel;
7using System.IO;
8using System.Threading.Tasks;
9
8cc6643fJose Arriaga Maldonado2 years ago10namespace OpenAI.Examples.Miscellaneous;
74848f8dJose Arriaga Maldonado2 years ago11
8cc6643fJose Arriaga Maldonado2 years ago12public partial class CombinationExamples
9f9f2936Jose Arriaga Maldonado2 years ago13{
74848f8dJose Arriaga Maldonado2 years ago14[Test]
15public void AlpacaArtAssessor()
9f9f2936Jose Arriaga Maldonado2 years ago16{
74848f8dJose Arriaga Maldonado2 years ago17// First, we create an image using dall-e-3:
13a9c686Jose Arriaga Maldonado1 years ago18ImageClient imageClient = new("dall-e-3", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
74848f8dJose Arriaga Maldonado2 years ago19ClientResult<GeneratedImage> imageResult = imageClient.GenerateImage(
20"a majestic alpaca on a mountain ridge, backed by an expansive blue sky accented with sparse clouds",
21new()
22{
23Style = GeneratedImageStyle.Vivid,
24Quality = GeneratedImageQuality.High,
25Size = GeneratedImageSize.W1792xH1024,
26});
27GeneratedImage imageGeneration = imageResult.Value;
28Console.WriteLine($"Majestic alpaca available at:\n{imageGeneration.ImageUri.AbsoluteUri}");
9f9f2936Jose Arriaga Maldonado2 years ago29
74848f8dJose Arriaga Maldonado2 years ago30// Now, we'll ask a cranky art critic to evaluate the image using gpt-4-vision-preview:
13a9c686Jose Arriaga Maldonado1 years ago31ChatClient chatClient = new("gpt-4o-mini", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
74848f8dJose Arriaga Maldonado2 years ago32ChatCompletion chatCompletion = chatClient.CompleteChat(
33[
34new SystemChatMessage("Assume the role of a cranky art critic. When asked to describe or "
35+ "evaluate imagery, focus on criticizing elements of subject, composition, and other details."),
36new UserChatMessage(
2ab1a942Jose Arriaga Maldonado1 years ago37ChatMessageContentPart.CreateTextPart("describe the following image in a few sentences"),
38ChatMessageContentPart.CreateImagePart(imageGeneration.ImageUri)),
74848f8dJose Arriaga Maldonado2 years ago39],
40new ChatCompletionOptions()
41{
2ab1a942Jose Arriaga Maldonado1 years ago42MaxOutputTokenCount = 2048,
74848f8dJose Arriaga Maldonado2 years ago43}
44);
9f9f2936Jose Arriaga Maldonado2 years ago45
74848f8dJose Arriaga Maldonado2 years ago46string chatResponseText = chatCompletion.Content[0].Text;
47Console.WriteLine($"Art critique of majestic alpaca:\n{chatResponseText}");
9f9f2936Jose Arriaga Maldonado2 years ago48
74848f8dJose Arriaga Maldonado2 years ago49// Finally, we'll get some text-to-speech for that critical evaluation using tts-1-hd:
13a9c686Jose Arriaga Maldonado1 years ago50AudioClient audioClient = new("tts-1-hd", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
d84bf54dTravis Wilson1 years ago51ClientResult<BinaryData> ttsResult = audioClient.GenerateSpeech(
74848f8dJose Arriaga Maldonado2 years ago52text: chatResponseText,
53GeneratedSpeechVoice.Fable,
54new SpeechGenerationOptions()
9f9f2936Jose Arriaga Maldonado2 years ago55{
cc9169adJose Arriaga Maldonado1 years ago56SpeedRatio = 0.9f,
74848f8dJose Arriaga Maldonado2 years ago57ResponseFormat = GeneratedSpeechFormat.Opus,
58});
59FileInfo ttsFileInfo = new($"{chatCompletion.Id}.opus");
60using (FileStream ttsFileStream = ttsFileInfo.Create())
61using (BinaryWriter ttsFileWriter = new(ttsFileStream))
62{
63ttsFileWriter.Write(ttsResult.Value);
9f9f2936Jose Arriaga Maldonado2 years ago64}
74848f8dJose Arriaga Maldonado2 years ago65Console.WriteLine($"Alpaca evaluation audio available at:\n{new Uri(ttsFileInfo.FullName).AbsoluteUri}");
66}
9f9f2936Jose Arriaga Maldonado2 years ago67
74848f8dJose Arriaga Maldonado2 years ago68[Test]
69public async Task CuriousCreatureCreator()
70{
71// First, we'll use gpt-4 to have a creative helper imagine a twist on a household pet
13a9c686Jose Arriaga Maldonado1 years ago72ChatClient creativeWriterClient = new("gpt-4o-mini", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
74848f8dJose Arriaga Maldonado2 years ago73ClientResult<ChatCompletion> creativeWriterResult = creativeWriterClient.CompleteChat(
74[
75new SystemChatMessage("You're a creative helper that specializes in brainstorming designs for concepts that fuse ordinary, mundane items with a fantastical touch. In particular, you can provide good one-paragraph descriptions of concept images."),
76new UserChatMessage("Imagine a household pet. Now add in a subtle touch of magic or 'different'. What do you imagine? Provide a one-paragraph description of a picture of this new creature, focusing on the details of the imagery such that it'd be suitable for creating a picture."),
77],
78new ChatCompletionOptions()
79{
2ab1a942Jose Arriaga Maldonado1 years ago80MaxOutputTokenCount = 2048,
74848f8dJose Arriaga Maldonado2 years ago81});
82string description = creativeWriterResult.Value.Content[0].Text;
83Console.WriteLine($"Creative helper's creature description:\n{description}");
9f9f2936Jose Arriaga Maldonado2 years ago84
74848f8dJose Arriaga Maldonado2 years ago85// Asynchronously, in parallel to the next steps, we'll get the creative description in the voice of Onyx
13a9c686Jose Arriaga Maldonado1 years ago86AudioClient ttsClient = new("tts-1-hd", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
d84bf54dTravis Wilson1 years ago87Task<ClientResult<BinaryData>> imageDescriptionAudioTask = ttsClient.GenerateSpeechAsync(
74848f8dJose Arriaga Maldonado2 years ago88description,
89GeneratedSpeechVoice.Onyx,
90new SpeechGenerationOptions()
9f9f2936Jose Arriaga Maldonado2 years ago91{
cc9169adJose Arriaga Maldonado1 years ago92SpeedRatio = 1.1f,
74848f8dJose Arriaga Maldonado2 years ago93ResponseFormat = GeneratedSpeechFormat.Opus,
9f9f2936Jose Arriaga Maldonado2 years ago94});
74848f8dJose Arriaga Maldonado2 years ago95_ = Task.Run(async () =>
96{
97ClientResult<BinaryData> audioResult = await imageDescriptionAudioTask;
98FileInfo audioFileInfo = new FileInfo($"{creativeWriterResult.Value.Id}-description.opus");
99using FileStream fileStream = audioFileInfo.Create();
100using BinaryWriter fileWriter = new(fileStream);
101fileWriter.Write(audioResult.Value);
102Console.WriteLine($"Spoken description available at:\n{new Uri(audioFileInfo.FullName).AbsoluteUri}");
103});
9f9f2936Jose Arriaga Maldonado2 years ago104
74848f8dJose Arriaga Maldonado2 years ago105// Meanwhile, we'll use dall-e-3 to generate a rendition of our LLM artist's vision
13a9c686Jose Arriaga Maldonado1 years ago106ImageClient imageGenerationClient = new("dall-e-3", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
74848f8dJose Arriaga Maldonado2 years ago107ClientResult<GeneratedImage> imageGenerationResult = await imageGenerationClient.GenerateImageAsync(
108description,
109new ImageGenerationOptions()
110{
111Size = GeneratedImageSize.W1792xH1024,
112Quality = GeneratedImageQuality.High,
113});
114Uri imageLocation = imageGenerationResult.Value.ImageUri;
115Console.WriteLine($"Creature image available at:\n{imageLocation.AbsoluteUri}");
9f9f2936Jose Arriaga Maldonado2 years ago116
74848f8dJose Arriaga Maldonado2 years ago117// Now, we'll use gpt-4-vision-preview to get a hopelessly taken assessment from a usually exigent art connoisseur
13a9c686Jose Arriaga Maldonado1 years ago118ChatClient imageCriticClient = new("gpt-4o-mini", Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
74848f8dJose Arriaga Maldonado2 years ago119ClientResult<ChatCompletion> criticalAppraisalResult = await imageCriticClient.CompleteChatAsync(
120[
121new SystemChatMessage("Assume the role of an art critic. Although usually cranky and occasionally even referred to as a 'curmudgeon', you're somehow entirely smitten with the subject presented to you and, despite your best efforts, can't help but lavish praise when you're asked to appraise a provided image."),
122new UserChatMessage(
2ab1a942Jose Arriaga Maldonado1 years ago123ChatMessageContentPart.CreateTextPart("Evaluate this image for me. What is it, and what do you think of it?"),
124ChatMessageContentPart.CreateImagePart(imageLocation)),
74848f8dJose Arriaga Maldonado2 years ago125],
126new ChatCompletionOptions()
127{
2ab1a942Jose Arriaga Maldonado1 years ago128MaxOutputTokenCount = 2048,
74848f8dJose Arriaga Maldonado2 years ago129});
130string appraisal = criticalAppraisalResult.Value.Content[0].Text;
131Console.WriteLine($"Critic's appraisal:\n{appraisal}");
9f9f2936Jose Arriaga Maldonado2 years ago132
74848f8dJose Arriaga Maldonado2 years ago133// Finally, we'll get that art expert's laudations in the voice of Fable
d84bf54dTravis Wilson1 years ago134ClientResult<BinaryData> appraisalAudioResult = await ttsClient.GenerateSpeechAsync(
74848f8dJose Arriaga Maldonado2 years ago135appraisal,
136GeneratedSpeechVoice.Fable,
137new SpeechGenerationOptions()
9f9f2936Jose Arriaga Maldonado2 years ago138{
cc9169adJose Arriaga Maldonado1 years ago139SpeedRatio = 0.9f,
74848f8dJose Arriaga Maldonado2 years ago140ResponseFormat = GeneratedSpeechFormat.Opus,
141});
142FileInfo criticAudioFileInfo = new($"{criticalAppraisalResult.Value.Id}-appraisal.opus");
143using (FileStream criticStream = criticAudioFileInfo.Create())
144using (BinaryWriter criticFileWriter = new(criticStream))
145{
146criticFileWriter.Write(appraisalAudioResult.Value);
9f9f2936Jose Arriaga Maldonado2 years ago147}
74848f8dJose Arriaga Maldonado2 years ago148Console.WriteLine($"Critical appraisal available at:\n{new Uri(criticAudioFileInfo.FullName).AbsoluteUri}");
9f9f2936Jose Arriaga Maldonado2 years ago149}
150}