openai/openai-dotnet

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
OpenAI_2.0.0-beta.1

Branches

Tags

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

Clone

HTTPS

Download ZIP

examples/Assistants/Example01_RetrievalAugmentedGenerationAsync.cs

156lines · modecode

1using NUnit.Framework;
2using OpenAI.Assistants;
3using OpenAI.Files;
4using System;
5using System.ClientModel;
6using System.Collections.Generic;
7using System.IO;
8using System.Threading;
9using System.Threading.Tasks;
10
11namespace OpenAI.Examples;
12
13public partial class AssistantExamples
14{
15 [Test]
16 public async Task Example01_RetrievalAugmentedGenerationAsync()
17 {
18 // Assistants is a beta API and subject to change; acknowledge its experimental status by suppressing the matching warning.
19#pragma warning disable OPENAI001
20 OpenAIClient openAIClient = new(Environment.GetEnvironmentVariable("OPENAI_API_KEY"));
21 FileClient fileClient = openAIClient.GetFileClient();
22 AssistantClient assistantClient = openAIClient.GetAssistantClient();
23
24 // First, let's contrive a document we'll use retrieval with and upload it.
25 using Stream document = BinaryData.FromString("""
26 {
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 }
52 """).ToStream();
53
54 OpenAIFileInfo salesFile = await fileClient.UploadFileAsync(
55 document,
56 "monthly_sales.json",
57 FileUploadPurpose.Assistants);
58
59 // Now, we'll create a client intended to help with that data
60 AssistantCreationOptions assistantOptions = new()
61 {
62 Name = "Example: Contoso sales RAG",
63 Instructions =
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.",
67 Tools =
68 {
69 new FileSearchToolDefinition(),
70 new CodeInterpreterToolDefinition(),
71 },
72 ToolResources = new()
73 {
74 FileSearch = new()
75 {
76 NewVectorStores =
77 {
78 new VectorStoreCreationHelper([salesFile.Id]),
79 }
80 }
81 },
82 };
83
84 Assistant assistant = await assistantClient.CreateAssistantAsync("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
87 ThreadCreationOptions threadOptions = new()
88 {
89 InitialMessages =
90 {
91 new ThreadInitializationMessage(new List<MessageContent>()
92 {
93 MessageContent.FromText("How well did product 113045 sell in February? Graph its trend over time."),
94 }),
95 },
96 };
97
98 ThreadRun threadRun = await assistantClient.CreateThreadAndRunAsync(assistant.Id, threadOptions);
99
100 // Check back to see when the run is done
101 do
102 {
103 Thread.Sleep(TimeSpan.FromSeconds(1));
104 threadRun = assistantClient.GetRun(threadRun.ThreadId, threadRun.Id);
105 } while (!threadRun.Status.IsTerminal);
106
107 // Finally, we'll print out the full history for the thread that includes the augmented generation
108 AsyncPageableCollection<ThreadMessage> messages
109 = assistantClient.GetMessagesAsync(threadRun.ThreadId, ListOrder.OldestFirst);
110
111 await foreach (ThreadMessage message in messages)
112 {
113 Console.Write($"[{message.Role.ToString().ToUpper()}]: ");
114 foreach (MessageContent contentItem in message.Content)
115 {
116 if (!string.IsNullOrEmpty(contentItem.Text))
117 {
118 Console.WriteLine($"{contentItem.Text}");
119
120 if (contentItem.TextAnnotations.Count > 0)
121 {
122 Console.WriteLine();
123 }
124
125 // Include annotations, if any.
126 foreach (TextAnnotation annotation in contentItem.TextAnnotations)
127 {
128 if (!string.IsNullOrEmpty(annotation.InputFileId))
129 {
130 Console.WriteLine($"* File citation, file ID: {annotation.InputFileId}");
131 }
132 if (!string.IsNullOrEmpty(annotation.OutputFileId))
133 {
134 Console.WriteLine($"* File output, new file ID: {annotation.OutputFileId}");
135 }
136 }
137 }
138 if (!string.IsNullOrEmpty(contentItem.ImageFileId))
139 {
140 OpenAIFileInfo imageInfo = await fileClient.GetFileAsync(contentItem.ImageFileId);
141 BinaryData imageBytes = await fileClient.DownloadFileAsync(contentItem.ImageFileId);
142 using FileStream stream = File.OpenWrite($"{imageInfo.Filename}.png");
143 imageBytes.ToStream().CopyTo(stream);
144
145 Console.WriteLine($"<image: {imageInfo.Filename}.png>");
146 }
147 }
148 Console.WriteLine();
149 }
150
151 // Optionally, delete any persistent resources you no longer need.
152 _ = await assistantClient.DeleteThreadAsync(threadRun.ThreadId);
153 _ = await assistantClient.DeleteAssistantAsync(assistant);
154 _ = await fileClient.DeleteFileAsync(salesFile);
155 }
156}