openai/openai-dotnet

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.6.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

examples/Assistants/Example01_RetrievalAugmentedGeneration.cs

152lines · modeblame

9f9f2936Jose Arriaga Maldonado2 years ago1using NUnit.Framework;
2using OpenAI.Assistants;
3using OpenAI.Files;
4using System;
5using System.ClientModel;
6using System.IO;
7using System.Threading;
8
8cc6643fJose Arriaga Maldonado2 years ago9namespace OpenAI.Examples;
9f9f2936Jose Arriaga Maldonado2 years ago10
5dce104aJose Arriaga Maldonado1 years ago11// This example uses experimental APIs which are subject to change. To use experimental APIs,
12// please acknowledge their experimental status by suppressing the corresponding warning.
13#pragma warning disable OPENAI001
14
8cc6643fJose Arriaga Maldonado2 years ago15public partial class AssistantExamples
9f9f2936Jose Arriaga Maldonado2 years ago16{
17[Test]
8cc6643fJose Arriaga Maldonado2 years ago18public void Example01_RetrievalAugmentedGeneration()
9f9f2936Jose Arriaga Maldonado2 years ago19{
20OpenAIClient openAIClient = new(Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
31c2ba63Jose Arriaga Maldonado1 years ago21OpenAIFileClient fileClient = openAIClient.GetOpenAIFileClient();
9f9f2936Jose Arriaga Maldonado2 years ago22AssistantClient assistantClient = openAIClient.GetAssistantClient();
23
24// First, let's contrive a document we'll use retrieval with and upload it.
e4af1691Jose Arriaga Maldonado1 years ago25using Stream document = BinaryData.FromBytes("""
9f9f2936Jose Arriaga Maldonado2 years ago26{
27"description": "This document contains the sale history data for Contoso products.",
28"sales": [
29{
30"month": "January",
31"by_product": {
32"113043": 15,
33"113045": 12,
34"113049": 2
35}
36},
37{
38"month": "February",
39"by_product": {
40"113045": 22
41}
42},
43{
44"month": "March",
45"by_product": {
46"113045": 16,
47"113055": 5
48}
49}
50]
51}
e4af1691Jose Arriaga Maldonado1 years ago52"""u8.ToArray()).ToStream();
9f9f2936Jose Arriaga Maldonado2 years ago53
19ceae44ShivangiReja1 years ago54OpenAIFile salesFile = fileClient.UploadFile(
9f9f2936Jose Arriaga Maldonado2 years ago55document,
56"monthly_sales.json",
57FileUploadPurpose.Assistants);
58
59// Now, we'll create a client intended to help with that data
60AssistantCreationOptions assistantOptions = new()
61{
62Name = "Example: Contoso sales RAG",
63Instructions =
64"You are an assistant that looks up sales data and helps visualize the information based"
65+ " on user queries. When asked to generate a graph, chart, or other visualization, use"
66+ " the code interpreter tool to do so.",
67Tools =
68{
69new FileSearchToolDefinition(),
70new CodeInterpreterToolDefinition(),
71},
72ToolResources = new()
73{
74FileSearch = new()
75{
76NewVectorStores =
77{
78new VectorStoreCreationHelper([salesFile.Id]),
79}
80}
81},
82};
83
84Assistant assistant = assistantClient.CreateAssistant("gpt-4o", assistantOptions);
85
86// Now we'll create a thread with a user query about the data already associated with the assistant, then run it
87ThreadCreationOptions threadOptions = new()
88{
1c40de67Krzysztof Cwalina2 years ago89InitialMessages = { "How well did product 113045 sell in February? Graph its trend over time." }
9f9f2936Jose Arriaga Maldonado2 years ago90};
91
92ThreadRun threadRun = assistantClient.CreateThreadAndRun(assistant.Id, threadOptions);
93
94// Check back to see when the run is done
95do
96{
97Thread.Sleep(TimeSpan.FromSeconds(1));
98threadRun = assistantClient.GetRun(threadRun.ThreadId, threadRun.Id);
99} while (!threadRun.Status.IsTerminal);
100
101// Finally, we'll print out the full history for the thread that includes the augmented generation
2ab1a942Jose Arriaga Maldonado1 years ago102CollectionResult<ThreadMessage> messages
103= assistantClient.GetMessages(threadRun.ThreadId, new MessageCollectionOptions() { Order = MessageCollectionOrder.Ascending });
9f9f2936Jose Arriaga Maldonado2 years ago104
105foreach (ThreadMessage message in messages)
106{
107Console.Write($"[{message.Role.ToString().ToUpper()}]: ");
108foreach (MessageContent contentItem in message.Content)
109{
110if (!string.IsNullOrEmpty(contentItem.Text))
111{
112Console.WriteLine($"{contentItem.Text}");
113
114if (contentItem.TextAnnotations.Count > 0)
115{
116Console.WriteLine();
117}
118
119// Include annotations, if any.
120foreach (TextAnnotation annotation in contentItem.TextAnnotations)
121{
122if (!string.IsNullOrEmpty(annotation.InputFileId))
123{
124Console.WriteLine($"* File citation, file ID: {annotation.InputFileId}");
125}
126if (!string.IsNullOrEmpty(annotation.OutputFileId))
127{
128Console.WriteLine($"* File output, new file ID: {annotation.OutputFileId}");
129}
130}
131}
132if (!string.IsNullOrEmpty(contentItem.ImageFileId))
133{
19ceae44ShivangiReja1 years ago134OpenAIFile imageInfo = fileClient.GetFile(contentItem.ImageFileId);
9f9f2936Jose Arriaga Maldonado2 years ago135BinaryData imageBytes = fileClient.DownloadFile(contentItem.ImageFileId);
136using FileStream stream = File.OpenWrite($"{imageInfo.Filename}.png");
137imageBytes.ToStream().CopyTo(stream);
138
139Console.WriteLine($"<image: {imageInfo.Filename}.png>");
140}
141}
142Console.WriteLine();
143}
144
145// Optionally, delete any persistent resources you no longer need.
146_ = assistantClient.DeleteThread(threadRun.ThreadId);
a330c2e7Jose Arriaga Maldonado1 years ago147_ = assistantClient.DeleteAssistant(assistant.Id);
13a9c686Jose Arriaga Maldonado1 years ago148_ = fileClient.DeleteFile(salesFile.Id);
9f9f2936Jose Arriaga Maldonado2 years ago149}
150}
5dce104aJose Arriaga Maldonado1 years ago151
152#pragma warning restore OPENAI001