openai/openai-dotnet

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
achandmsft-patch-2

Branches

Tags

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

Clone

HTTPS

Download ZIP

codegen/generator/src/Visitors/ExperimentalAttributeVisitor.cs

702lines · modecode

1using System;
2using System.Collections.Generic;
3using System.Diagnostics.CodeAnalysis;
4using System.Linq;
5using Microsoft.TypeSpec.Generator.ClientModel;
6using Microsoft.TypeSpec.Generator.ClientModel.Providers;
7using Microsoft.TypeSpec.Generator.Primitives;
8using Microsoft.TypeSpec.Generator.Providers;
9using Microsoft.TypeSpec.Generator.Snippets;
10using Microsoft.TypeSpec.Generator.Statements;
11
12namespace OpenAILibraryPlugin.Visitors
13{
14 /// <summary>
15 /// A visitor to add the <see cref="ExperimentalAttribute"/> to types, properties, and methods that are not stable.
16 /// </summary>
17 public class ExperimentalAttributeVisitor : ScmLibraryVisitor
18 {
19 private const string _realtimeNamespace = "OpenAI.Realtime";
20 private static readonly AttributeStatement _experimental001Attribute = new(typeof(ExperimentalAttribute), Snippet.Literal("OPENAI001"));
21 private static readonly AttributeStatement _experimental002Attribute = new(typeof(ExperimentalAttribute), Snippet.Literal("OPENAI002"));
22 private static readonly AttributeStatement _experimentalCUA001Attribute = new(typeof(ExperimentalAttribute), Snippet.Literal("OPENAICUA001"));
23
24 // Stable classes without ExperimentalAttribute
25 private static readonly HashSet<string> _stableClasses = new(StringComparer.OrdinalIgnoreCase)
26 {
27 "OpenAI.Audio.AudioClient",
28 "OpenAI.Audio.AudioTimestampGranularities",
29 "OpenAI.Audio.AudioTranscription",
30 "OpenAI.Audio.AudioTranscriptionFormat",
31 "OpenAI.Audio.AudioTranscriptionOptions",
32 "OpenAI.Audio.AudioTranslation",
33 "OpenAI.Audio.AudioTranslationFormat",
34 "OpenAI.Audio.AudioTranslationOptions",
35 "OpenAI.Audio.GeneratedSpeechFormat",
36 "OpenAI.Audio.GeneratedSpeechVoice",
37 "OpenAI.Audio.OpenAIAudioModelFactory",
38 "OpenAI.Audio.SpeechGenerationOptions",
39 "OpenAI.Audio.TranscribedSegment",
40 "OpenAI.Audio.TranscribedWord",
41 "OpenAI.Chat.AssistantChatMessage",
42 "OpenAI.Chat.ChatClient",
43 "OpenAI.Chat.ChatCompletion",
44 "OpenAI.Chat.ChatCompletionOptions",
45 "OpenAI.Chat.ChatFinishReason",
46 "OpenAI.Chat.ChatFunction",
47 "OpenAI.Chat.ChatFunctionCall",
48 "OpenAI.Chat.ChatFunctionChoice",
49 "OpenAI.Chat.ChatImageDetailLevel",
50 "OpenAI.Chat.ChatInputTokenUsageDetails",
51 "OpenAI.Chat.ChatMessage",
52 "OpenAI.Chat.ChatMessageContent",
53 "OpenAI.Chat.ChatMessageContentPart",
54 "OpenAI.Chat.ChatMessageContentPartKind",
55 "OpenAI.Chat.ChatMessageRole",
56 "OpenAI.Chat.ChatOutputTokenUsageDetails",
57 "OpenAI.Chat.ChatResponseFormat",
58 "OpenAI.Chat.ChatTokenLogProbabilityDetails",
59 "OpenAI.Chat.ChatTokenTopLogProbabilityDetails",
60 "OpenAI.Chat.ChatTokenUsage",
61 "OpenAI.Chat.ChatTool",
62 "OpenAI.Chat.ChatToolCall",
63 "OpenAI.Chat.ChatToolCallKind",
64 "OpenAI.Chat.ChatToolChoice",
65 "OpenAI.Chat.ChatToolKind",
66 "OpenAI.Chat.FunctionChatMessage",
67 "OpenAI.Chat.OpenAIChatModelFactory",
68 "OpenAI.Chat.StreamingChatCompletionUpdate",
69 "OpenAI.Chat.StreamingChatFunctionCallUpdate",
70 "OpenAI.Chat.StreamingChatToolCallUpdate",
71 "OpenAI.Chat.SystemChatMessage",
72 "OpenAI.Chat.ToolChatMessage",
73 "OpenAI.Chat.UserChatMessage",
74 "OpenAI.Embeddings.EmbeddingClient",
75 "OpenAI.Embeddings.EmbeddingGenerationOptions",
76 "OpenAI.Embeddings.EmbeddingTokenUsage",
77 "OpenAI.Embeddings.OpenAIEmbedding",
78 "OpenAI.Embeddings.OpenAIEmbeddingCollection",
79 "OpenAI.Embeddings.OpenAIEmbeddingsModelFactory",
80 "OpenAI.Files.FileDeletionResult",
81 "OpenAI.Files.FilePurpose",
82 "OpenAI.Files.FileStatus",
83 "OpenAI.Files.FileUploadPurpose",
84 "OpenAI.Files.OpenAIFile",
85 "OpenAI.Files.OpenAIFileClient",
86 "OpenAI.Files.OpenAIFileCollection",
87 "OpenAI.Files.OpenAIFilesModelFactory",
88 "OpenAI.Images.GeneratedImage",
89 "OpenAI.Images.GeneratedImageCollection",
90 "OpenAI.Images.GeneratedImageFormat",
91 "OpenAI.Images.GeneratedImageQuality",
92 "OpenAI.Images.GeneratedImageSize",
93 "OpenAI.Images.GeneratedImageStyle",
94 "OpenAI.Images.ImageClient",
95 "OpenAI.Images.ImageEditOptions",
96 "OpenAI.Images.ImageGenerationOptions",
97 "OpenAI.Images.ImageVariationOptions",
98 "OpenAI.Images.OpenAIImagesModelFactory",
99 "OpenAI.Models.ModelDeletionResult",
100 "OpenAI.Models.OpenAIModel",
101 "OpenAI.Models.OpenAIModelClient",
102 "OpenAI.Models.OpenAIModelCollection",
103 "OpenAI.Models.OpenAIModelsModelFactory",
104 "OpenAI.Moderations.ModerationCategory",
105 "OpenAI.Moderations.ModerationClient",
106 "OpenAI.Moderations.ModerationResult",
107 "OpenAI.Moderations.ModerationResultCollection",
108 "OpenAI.Moderations.OpenAIModerationsModelFactory",
109 "OpenAI.OpenAIClient",
110 "OpenAI.OpenAIClientOptions",
111 };
112
113 // Stable properties without ExperimentalAttribute
114 private static readonly HashSet<string> _stableProperties = new(StringComparer.OrdinalIgnoreCase)
115 {
116 "AssistantChatMessage.FunctionCall",
117 "AssistantChatMessage.ParticipantName",
118 "AssistantChatMessage.Refusal",
119 "AssistantChatMessage.ToolCalls",
120 "AudioClient.Pipeline",
121 "AudioTranscription.Duration",
122 "AudioTranscription.Language",
123 "AudioTranscription.Segments",
124 "AudioTranscription.Text",
125 "AudioTranscription.Words",
126 "AudioTranscriptionFormat.Simple",
127 "AudioTranscriptionFormat.Srt",
128 "AudioTranscriptionFormat.Text",
129 "AudioTranscriptionFormat.Verbose",
130 "AudioTranscriptionFormat.Vtt",
131 "AudioTranscriptionOptions.Language",
132 "AudioTranscriptionOptions.Prompt",
133 "AudioTranscriptionOptions.ResponseFormat",
134 "AudioTranscriptionOptions.Temperature",
135 "AudioTranscriptionOptions.TimestampGranularities",
136 "AudioTranslation.Duration",
137 "AudioTranslation.Language",
138 "AudioTranslation.Segments",
139 "AudioTranslation.Text",
140 "AudioTranslationFormat.Simple",
141 "AudioTranslationFormat.Srt",
142 "AudioTranslationFormat.Text",
143 "AudioTranslationFormat.Verbose",
144 "AudioTranslationFormat.Vtt",
145 "AudioTranslationOptions.Prompt",
146 "AudioTranslationOptions.ResponseFormat",
147 "AudioTranslationOptions.Temperature",
148 "ChatClient.Pipeline",
149 "ChatCompletion.Content",
150 "ChatCompletion.ContentTokenLogProbabilities",
151 "ChatCompletion.CreatedAt",
152 "ChatCompletion.FinishReason",
153 "ChatCompletion.FunctionCall",
154 "ChatCompletion.Id",
155 "ChatCompletion.Model",
156 "ChatCompletion.Refusal",
157 "ChatCompletion.RefusalTokenLogProbabilities",
158 "ChatCompletion.Role",
159 "ChatCompletion.SystemFingerprint",
160 "ChatCompletion.ToolCalls",
161 "ChatCompletion.Usage",
162 "ChatCompletionOptions.AllowParallelToolCalls",
163 "ChatCompletionOptions.EndUserId",
164 "ChatCompletionOptions.FrequencyPenalty",
165 "ChatCompletionOptions.FunctionChoice",
166 "ChatCompletionOptions.Functions",
167 "ChatCompletionOptions.IncludeLogProbabilities",
168 "ChatCompletionOptions.LogitBiases",
169 "ChatCompletionOptions.MaxOutputTokenCount",
170 "ChatCompletionOptions.Metadata",
171 "ChatCompletionOptions.PresencePenalty",
172 "ChatCompletionOptions.ResponseFormat",
173 "ChatCompletionOptions.StopSequences",
174 "ChatCompletionOptions.StoredOutputEnabled",
175 "ChatCompletionOptions.Temperature",
176 "ChatCompletionOptions.ToolChoice",
177 "ChatCompletionOptions.Tools",
178 "ChatCompletionOptions.TopLogProbabilityCount",
179 "ChatCompletionOptions.TopP",
180 "ChatFunction.FunctionDescription",
181 "ChatFunction.FunctionName",
182 "ChatFunction.FunctionParameters",
183 "ChatFunctionCall.FunctionArguments",
184 "ChatFunctionCall.FunctionName",
185 "ChatImageDetailLevel.Auto",
186 "ChatImageDetailLevel.High",
187 "ChatImageDetailLevel.Low",
188 "ChatInputTokenUsageDetails.AudioTokenCount",
189 "ChatInputTokenUsageDetails.CachedTokenCount",
190 "ChatMessage.Content",
191 "ChatMessageContentPart.ImageBytes",
192 "ChatMessageContentPart.ImageBytesMediaType",
193 "ChatMessageContentPart.ImageDetailLevel",
194 "ChatMessageContentPart.ImageUri",
195 "ChatMessageContentPart.Kind",
196 "ChatMessageContentPart.Refusal",
197 "ChatMessageContentPart.Text",
198 "ChatOutputTokenUsageDetails.AudioTokenCount",
199 "ChatOutputTokenUsageDetails.ReasoningTokenCount",
200 "ChatTokenLogProbabilityDetails.LogProbability",
201 "ChatTokenLogProbabilityDetails.Token",
202 "ChatTokenLogProbabilityDetails.TopLogProbabilities",
203 "ChatTokenLogProbabilityDetails.Utf8Bytes",
204 "ChatTokenTopLogProbabilityDetails.LogProbability",
205 "ChatTokenTopLogProbabilityDetails.Token",
206 "ChatTokenTopLogProbabilityDetails.Utf8Bytes",
207 "ChatTokenUsage.InputTokenCount",
208 "ChatTokenUsage.InputTokenDetails",
209 "ChatTokenUsage.OutputTokenCount",
210 "ChatTokenUsage.OutputTokenDetails",
211 "ChatTokenUsage.TotalTokenCount",
212 "ChatTool.FunctionDescription",
213 "ChatTool.FunctionName",
214 "ChatTool.FunctionParameters",
215 "ChatTool.FunctionSchemaIsStrict",
216 "ChatTool.Kind",
217 "ChatToolCall.FunctionArguments",
218 "ChatToolCall.FunctionName",
219 "ChatToolCall.Id",
220 "ChatToolCall.Kind",
221 "EmbeddingClient.Pipeline",
222 "EmbeddingGenerationOptions.Dimensions",
223 "EmbeddingGenerationOptions.EndUserId",
224 "EmbeddingTokenUsage.InputTokenCount",
225 "EmbeddingTokenUsage.TotalTokenCount",
226 "FileDeletionResult.Deleted",
227 "FileDeletionResult.FileId",
228 "FileUploadPurpose.Assistants",
229 "FileUploadPurpose.Batch",
230 "FileUploadPurpose.FineTune",
231 "FileUploadPurpose.Vision",
232 "FunctionChatMessage.FunctionName",
233 "GeneratedImage.ImageBytes",
234 "GeneratedImage.ImageUri",
235 "GeneratedImage.RevisedPrompt",
236 "GeneratedImageCollection.CreatedAt",
237 "GeneratedImageFormat.Bytes",
238 "GeneratedImageFormat.Uri",
239 "GeneratedImageQuality.High",
240 "GeneratedImageQuality.Standard",
241 "GeneratedImageStyle.Natural",
242 "GeneratedImageStyle.Vivid",
243 "GeneratedSpeechFormat.Aac",
244 "GeneratedSpeechFormat.Flac",
245 "GeneratedSpeechFormat.Mp3",
246 "GeneratedSpeechFormat.Opus",
247 "GeneratedSpeechFormat.Pcm",
248 "GeneratedSpeechFormat.Wav",
249 "GeneratedSpeechVoice.Alloy",
250 "GeneratedSpeechVoice.Echo",
251 "GeneratedSpeechVoice.Fable",
252 "GeneratedSpeechVoice.Nova",
253 "GeneratedSpeechVoice.Onyx",
254 "GeneratedSpeechVoice.Shimmer",
255 "ImageClient.Pipeline",
256 "ImageEditOptions.EndUserId",
257 "ImageEditOptions.ResponseFormat",
258 "ImageEditOptions.Size",
259 "ImageGenerationOptions.EndUserId",
260 "ImageGenerationOptions.Quality",
261 "ImageGenerationOptions.ResponseFormat",
262 "ImageGenerationOptions.Size",
263 "ImageGenerationOptions.Style",
264 "ImageVariationOptions.EndUserId",
265 "ImageVariationOptions.ResponseFormat",
266 "ImageVariationOptions.Size",
267 "ModelDeletionResult.Deleted",
268 "ModelDeletionResult.ModelId",
269 "ModerationCategory.Flagged",
270 "ModerationCategory.Score",
271 "ModerationClient.Pipeline",
272 "ModerationResult.Flagged",
273 "ModerationResult.Harassment",
274 "ModerationResult.HarassmentThreatening",
275 "ModerationResult.Hate",
276 "ModerationResult.HateThreatening",
277 "ModerationResult.Illicit",
278 "ModerationResult.IllicitViolent",
279 "ModerationResult.SelfHarm",
280 "ModerationResult.SelfHarmInstructions",
281 "ModerationResult.SelfHarmIntent",
282 "ModerationResult.Sexual",
283 "ModerationResult.SexualMinors",
284 "ModerationResult.Violence",
285 "ModerationResult.ViolenceGraphic",
286 "ModerationResultCollection.Id",
287 "ModerationResultCollection.Model",
288 "OpenAIClient.Pipeline",
289 "OpenAIClientOptions.Endpoint",
290 "OpenAIClientOptions.OrganizationId",
291 "OpenAIClientOptions.ProjectId",
292 "OpenAIClientOptions.UserAgentApplicationId",
293 "OpenAIEmbedding.Index",
294 "OpenAIEmbeddingCollection.Model",
295 "OpenAIEmbeddingCollection.Usage",
296 "OpenAIFile.CreatedAt",
297 "OpenAIFile.Filename",
298 "OpenAIFile.Id",
299 "OpenAIFile.Purpose",
300 "OpenAIFile.SizeInBytes",
301 "OpenAIFile.Status",
302 "OpenAIFile.StatusDetails",
303 "OpenAIFileClient.Pipeline",
304 "OpenAIModel.CreatedAt",
305 "OpenAIModel.Id",
306 "OpenAIModel.OwnedBy",
307 "OpenAIModelClient.Pipeline",
308 "SpeechGenerationOptions.ResponseFormat",
309 "SpeechGenerationOptions.SpeedRatio",
310 "StreamingChatCompletionUpdate.CompletionId",
311 "StreamingChatCompletionUpdate.ContentTokenLogProbabilities",
312 "StreamingChatCompletionUpdate.ContentUpdate",
313 "StreamingChatCompletionUpdate.CreatedAt",
314 "StreamingChatCompletionUpdate.FinishReason",
315 "StreamingChatCompletionUpdate.FunctionCallUpdate",
316 "StreamingChatCompletionUpdate.Model",
317 "StreamingChatCompletionUpdate.RefusalTokenLogProbabilities",
318 "StreamingChatCompletionUpdate.RefusalUpdate",
319 "StreamingChatCompletionUpdate.Role",
320 "StreamingChatCompletionUpdate.SystemFingerprint",
321 "StreamingChatCompletionUpdate.ToolCallUpdates",
322 "StreamingChatCompletionUpdate.Usage",
323 "StreamingChatFunctionCallUpdate.FunctionArgumentsUpdate",
324 "StreamingChatFunctionCallUpdate.FunctionName",
325 "StreamingChatToolCallUpdate.FunctionArgumentsUpdate",
326 "StreamingChatToolCallUpdate.FunctionName",
327 "StreamingChatToolCallUpdate.Index",
328 "StreamingChatToolCallUpdate.Kind",
329 "StreamingChatToolCallUpdate.ToolCallId",
330 "SystemChatMessage.ParticipantName",
331 "ToolChatMessage.ToolCallId",
332 "TranscribedSegment.AverageLogProbability",
333 "TranscribedSegment.CompressionRatio",
334 "TranscribedSegment.EndTime",
335 "TranscribedSegment.Id",
336 "TranscribedSegment.NoSpeechProbability",
337 "TranscribedSegment.SeekOffset",
338 "TranscribedSegment.StartTime",
339 "TranscribedSegment.Temperature",
340 "TranscribedSegment.Text",
341 "TranscribedSegment.TokenIds",
342 "TranscribedWord.EndTime",
343 "TranscribedWord.StartTime",
344 "TranscribedWord.Word",
345 "UserChatMessage.ParticipantName",
346 };
347
348 // Stable methods without ExperimentalAttribute
349 private static readonly HashSet<string> _stableMethods = new(StringComparer.OrdinalIgnoreCase)
350 {
351 "AudioClient.GenerateSpeech|BinaryContent|RequestOptions",
352 "AudioClient.GenerateSpeech|string|GeneratedSpeechVoice|SpeechGenerationOptions|CancellationToken",
353 "AudioClient.GenerateSpeechAsync|BinaryContent|RequestOptions",
354 "AudioClient.GenerateSpeechAsync|string|GeneratedSpeechVoice|SpeechGenerationOptions|CancellationToken",
355 "AudioClient.TranscribeAudio|BinaryContent|string|RequestOptions",
356 "AudioClient.TranscribeAudio|Stream|string|AudioTranscriptionOptions|CancellationToken",
357 "AudioClient.TranscribeAudio|string|AudioTranscriptionOptions",
358 "AudioClient.TranscribeAudioAsync|BinaryContent|string|RequestOptions",
359 "AudioClient.TranscribeAudioAsync|Stream|string|AudioTranscriptionOptions|CancellationToken",
360 "AudioClient.TranscribeAudioAsync|string|AudioTranscriptionOptions",
361 "AudioClient.TranslateAudio|BinaryContent|string|RequestOptions",
362 "AudioClient.TranslateAudio|Stream|string|AudioTranslationOptions|CancellationToken",
363 "AudioClient.TranslateAudio|string|AudioTranslationOptions",
364 "AudioClient.TranslateAudioAsync|BinaryContent|string|RequestOptions",
365 "AudioClient.TranslateAudioAsync|Stream|string|AudioTranslationOptions|CancellationToken",
366 "AudioClient.TranslateAudioAsync|string|AudioTranslationOptions",
367 "AudioTranscriptionFormat.Equals|AudioTranscriptionFormat",
368 "AudioTranscriptionFormat.Equals|object",
369 "AudioTranscriptionFormat.GetHashCode",
370 "AudioTranscriptionFormat.operator !=|AudioTranscriptionFormat|AudioTranscriptionFormat",
371 "AudioTranscriptionFormat.operator ==|AudioTranscriptionFormat|AudioTranscriptionFormat",
372 "AudioTranscriptionFormat.operator implicit AudioTranscriptionFormat|string",
373 "AudioTranscriptionFormat.ToString",
374 "AudioTranslationFormat.Equals|AudioTranslationFormat",
375 "AudioTranslationFormat.Equals|object",
376 "AudioTranslationFormat.GetHashCode",
377 "AudioTranslationFormat.operator !=|AudioTranslationFormat|AudioTranslationFormat",
378 "AudioTranslationFormat.operator ==|AudioTranslationFormat|AudioTranslationFormat",
379 "AudioTranslationFormat.operator implicit AudioTranslationFormat|string",
380 "AudioTranslationFormat.ToString",
381 "ChatClient.CompleteChat|BinaryContent|RequestOptions",
382 "ChatClient.CompleteChat|ChatMessage[]",
383 "ChatClient.CompleteChat|IEnumerable<ChatMessage>|ChatCompletionOptions|CancellationToken",
384 "ChatClient.CompleteChatAsync|BinaryContent|RequestOptions",
385 "ChatClient.CompleteChatAsync|ChatMessage[]",
386 "ChatClient.CompleteChatAsync|IEnumerable<ChatMessage>|ChatCompletionOptions|CancellationToken",
387 "ChatClient.CompleteChatStreaming|ChatMessage[]",
388 "ChatClient.CompleteChatStreaming|IEnumerable<ChatMessage>|ChatCompletionOptions|CancellationToken",
389 "ChatClient.CompleteChatStreamingAsync|ChatMessage[]",
390 "ChatClient.CompleteChatStreamingAsync|IEnumerable<ChatMessage>|ChatCompletionOptions|CancellationToken",
391 "ChatFunctionChoice.CreateAutoChoice",
392 "ChatFunctionChoice.CreateNamedChoice|string",
393 "ChatFunctionChoice.CreateNoneChoice",
394 "ChatImageDetailLevel.Equals|ChatImageDetailLevel",
395 "ChatImageDetailLevel.Equals|object",
396 "ChatImageDetailLevel.GetHashCode",
397 "ChatImageDetailLevel.operator !=|ChatImageDetailLevel|ChatImageDetailLevel",
398 "ChatImageDetailLevel.operator ==|ChatImageDetailLevel|ChatImageDetailLevel",
399 "ChatImageDetailLevel.operator implicit ChatImageDetailLevel|string",
400 "ChatImageDetailLevel.ToString",
401 "ChatMessage.CreateAssistantMessage|ChatCompletion",
402 "ChatMessage.CreateAssistantMessage|ChatFunctionCall",
403 "ChatMessage.CreateAssistantMessage|ChatMessageContentPart[]",
404 "ChatMessage.CreateAssistantMessage|IEnumerable<ChatMessageContentPart>",
405 "ChatMessage.CreateAssistantMessage|IEnumerable<ChatToolCall>",
406 "ChatMessage.CreateAssistantMessage|string",
407 "ChatMessage.CreateFunctionMessage|string|string",
408 "ChatMessage.CreateSystemMessage|ChatMessageContentPart[]",
409 "ChatMessage.CreateSystemMessage|IEnumerable<ChatMessageContentPart>",
410 "ChatMessage.CreateSystemMessage|string",
411 "ChatMessage.CreateToolMessage|string|ChatMessageContentPart[]",
412 "ChatMessage.CreateToolMessage|string|IEnumerable<ChatMessageContentPart>",
413 "ChatMessage.CreateToolMessage|string|string",
414 "ChatMessage.CreateUserMessage|ChatMessageContentPart[]",
415 "ChatMessage.CreateUserMessage|IEnumerable<ChatMessageContentPart>",
416 "ChatMessage.CreateUserMessage|string",
417 "ChatMessage.operator implicit ChatMessage|string",
418 "ChatMessageContentPart.CreateImagePart|BinaryData|string|ChatImageDetailLevel?",
419 "ChatMessageContentPart.CreateImagePart|Uri|ChatImageDetailLevel?",
420 "ChatMessageContentPart.CreateRefusalPart|string",
421 "ChatMessageContentPart.CreateTextPart|string",
422 "ChatMessageContentPart.operator implicit ChatMessageContentPart|string",
423 "ChatResponseFormat.CreateJsonObjectFormat",
424 "ChatResponseFormat.CreateJsonSchemaFormat|string|BinaryData|string|bool?",
425 "ChatResponseFormat.CreateTextFormat",
426 "ChatTool.CreateFunctionTool|string|string|BinaryData|bool?",
427 "ChatToolCall.CreateFunctionToolCall|string|string|BinaryData",
428 "ChatToolChoice.CreateAutoChoice",
429 "ChatToolChoice.CreateFunctionChoice|string",
430 "ChatToolChoice.CreateNoneChoice",
431 "ChatToolChoice.CreateRequiredChoice",
432 "EmbeddingClient.GenerateEmbedding|string|EmbeddingGenerationOptions|CancellationToken",
433 "EmbeddingClient.GenerateEmbeddingAsync|string|EmbeddingGenerationOptions|CancellationToken",
434 "EmbeddingClient.GenerateEmbeddings|BinaryContent|RequestOptions",
435 "EmbeddingClient.GenerateEmbeddings|IEnumerable<ReadOnlyMemory<int>>|EmbeddingGenerationOptions|CancellationToken",
436 "EmbeddingClient.GenerateEmbeddings|IEnumerable<string>|EmbeddingGenerationOptions|CancellationToken",
437 "EmbeddingClient.GenerateEmbeddingsAsync|BinaryContent|RequestOptions",
438 "EmbeddingClient.GenerateEmbeddingsAsync|IEnumerable<ReadOnlyMemory<int>>|EmbeddingGenerationOptions|CancellationToken",
439 "EmbeddingClient.GenerateEmbeddingsAsync|IEnumerable<string>|EmbeddingGenerationOptions|CancellationToken",
440 "FileUploadPurpose.Equals|FileUploadPurpose",
441 "FileUploadPurpose.Equals|object",
442 "FileUploadPurpose.GetHashCode",
443 "FileUploadPurpose.operator !=|FileUploadPurpose|FileUploadPurpose",
444 "FileUploadPurpose.operator ==|FileUploadPurpose|FileUploadPurpose",
445 "FileUploadPurpose.operator implicit FileUploadPurpose|string",
446 "FileUploadPurpose.ToString",
447 "GeneratedImageFormat.Equals|GeneratedImageFormat",
448 "GeneratedImageFormat.Equals|object",
449 "GeneratedImageFormat.GetHashCode",
450 "GeneratedImageFormat.operator !=|GeneratedImageFormat|GeneratedImageFormat",
451 "GeneratedImageFormat.operator ==|GeneratedImageFormat|GeneratedImageFormat",
452 "GeneratedImageFormat.operator implicit GeneratedImageFormat|string",
453 "GeneratedImageFormat.ToString",
454 "GeneratedImageQuality.Equals|GeneratedImageQuality",
455 "GeneratedImageQuality.Equals|object",
456 "GeneratedImageQuality.GetHashCode",
457 "GeneratedImageQuality.operator !=|GeneratedImageQuality|GeneratedImageQuality",
458 "GeneratedImageQuality.operator ==|GeneratedImageQuality|GeneratedImageQuality",
459 "GeneratedImageQuality.operator implicit GeneratedImageQuality|string",
460 "GeneratedImageQuality.ToString",
461 "GeneratedImageSize.Equals|GeneratedImageSize",
462 "GeneratedImageSize.Equals|object",
463 "GeneratedImageSize.GetHashCode",
464 "GeneratedImageSize.operator !=|GeneratedImageSize|GeneratedImageSize",
465 "GeneratedImageSize.operator ==|GeneratedImageSize|GeneratedImageSize",
466 "GeneratedImageSize.ToString",
467 "GeneratedImageStyle.Equals|GeneratedImageStyle",
468 "GeneratedImageStyle.Equals|object",
469 "GeneratedImageStyle.GetHashCode",
470 "GeneratedImageStyle.operator !=|GeneratedImageStyle|GeneratedImageStyle",
471 "GeneratedImageStyle.operator ==|GeneratedImageStyle|GeneratedImageStyle",
472 "GeneratedImageStyle.operator implicit GeneratedImageStyle|string",
473 "GeneratedImageStyle.ToString",
474 "GeneratedSpeechFormat.Equals|GeneratedSpeechFormat",
475 "GeneratedSpeechFormat.Equals|object",
476 "GeneratedSpeechFormat.GetHashCode",
477 "GeneratedSpeechFormat.operator !=|GeneratedSpeechFormat|GeneratedSpeechFormat",
478 "GeneratedSpeechFormat.operator ==|GeneratedSpeechFormat|GeneratedSpeechFormat",
479 "GeneratedSpeechFormat.operator implicit GeneratedSpeechFormat|string",
480 "GeneratedSpeechFormat.ToString",
481 "GeneratedSpeechVoice.Equals|GeneratedSpeechVoice",
482 "GeneratedSpeechVoice.Equals|object",
483 "GeneratedSpeechVoice.GetHashCode",
484 "GeneratedSpeechVoice.operator !=|GeneratedSpeechVoice|GeneratedSpeechVoice",
485 "GeneratedSpeechVoice.operator ==|GeneratedSpeechVoice|GeneratedSpeechVoice",
486 "GeneratedSpeechVoice.operator implicit GeneratedSpeechVoice|string",
487 "GeneratedSpeechVoice.ToString",
488 "ImageClient.GenerateImage|string|ImageGenerationOptions|CancellationToken",
489 "ImageClient.GenerateImageAsync|string|ImageGenerationOptions|CancellationToken",
490 "ImageClient.GenerateImageEdit|Stream|string|string|ImageEditOptions|CancellationToken",
491 "ImageClient.GenerateImageEdit|Stream|string|string|Stream|string|ImageEditOptions|CancellationToken",
492 "ImageClient.GenerateImageEdit|string|string|ImageEditOptions",
493 "ImageClient.GenerateImageEdit|string|string|string|ImageEditOptions",
494 "ImageClient.GenerateImageEditAsync|Stream|string|string|ImageEditOptions|CancellationToken",
495 "ImageClient.GenerateImageEditAsync|Stream|string|string|Stream|string|ImageEditOptions|CancellationToken",
496 "ImageClient.GenerateImageEditAsync|string|string|ImageEditOptions",
497 "ImageClient.GenerateImageEditAsync|string|string|string|ImageEditOptions",
498 "ImageClient.GenerateImageEdits|BinaryContent|string|RequestOptions",
499 "ImageClient.GenerateImageEdits|Stream|string|string|int|ImageEditOptions|CancellationToken",
500 "ImageClient.GenerateImageEdits|Stream|string|string|Stream|string|int|ImageEditOptions|CancellationToken",
501 "ImageClient.GenerateImageEdits|string|string|int|ImageEditOptions",
502 "ImageClient.GenerateImageEdits|string|string|string|int|ImageEditOptions",
503 "ImageClient.GenerateImageEditsAsync|BinaryContent|string|RequestOptions",
504 "ImageClient.GenerateImageEditsAsync|Stream|string|string|int|ImageEditOptions|CancellationToken",
505 "ImageClient.GenerateImageEditsAsync|Stream|string|string|Stream|string|int|ImageEditOptions|CancellationToken",
506 "ImageClient.GenerateImageEditsAsync|string|string|int|ImageEditOptions",
507 "ImageClient.GenerateImageEditsAsync|string|string|string|int|ImageEditOptions",
508 "ImageClient.GenerateImages|BinaryContent|RequestOptions",
509 "ImageClient.GenerateImages|string|int|ImageGenerationOptions|CancellationToken",
510 "ImageClient.GenerateImagesAsync|BinaryContent|RequestOptions",
511 "ImageClient.GenerateImagesAsync|string|int|ImageGenerationOptions|CancellationToken",
512 "ImageClient.GenerateImageVariation|Stream|string|ImageVariationOptions|CancellationToken",
513 "ImageClient.GenerateImageVariation|string|ImageVariationOptions",
514 "ImageClient.GenerateImageVariationAsync|Stream|string|ImageVariationOptions|CancellationToken",
515 "ImageClient.GenerateImageVariationAsync|string|ImageVariationOptions",
516 "ImageClient.GenerateImageVariations|BinaryContent|string|RequestOptions",
517 "ImageClient.GenerateImageVariations|Stream|string|int|ImageVariationOptions|CancellationToken",
518 "ImageClient.GenerateImageVariations|string|int|ImageVariationOptions",
519 "ImageClient.GenerateImageVariationsAsync|BinaryContent|string|RequestOptions",
520 "ImageClient.GenerateImageVariationsAsync|Stream|string|int|ImageVariationOptions|CancellationToken",
521 "ImageClient.GenerateImageVariationsAsync|string|int|ImageVariationOptions",
522 "ModerationClient.ClassifyText|BinaryContent|RequestOptions",
523 "ModerationClient.ClassifyText|IEnumerable<string>|CancellationToken",
524 "ModerationClient.ClassifyText|string|CancellationToken",
525 "ModerationClient.ClassifyTextAsync|BinaryContent|RequestOptions",
526 "ModerationClient.ClassifyTextAsync|IEnumerable<string>|CancellationToken",
527 "ModerationClient.ClassifyTextAsync|string|CancellationToken",
528 "OpenAIAudioModelFactory.AudioTranscription|string|TimeSpan?|string|IEnumerable<TranscribedWord>|IEnumerable<TranscribedSegment>",
529 "OpenAIAudioModelFactory.AudioTranslation|string|TimeSpan?|string|IEnumerable<TranscribedSegment>",
530 "OpenAIAudioModelFactory.TranscribedSegment|int|int|TimeSpan|TimeSpan|string|ReadOnlyMemory<int>|float|float|float|float",
531 "OpenAIAudioModelFactory.TranscribedWord|string|TimeSpan|TimeSpan",
532 "OpenAIChatModelFactory.ChatCompletion|string|ChatFinishReason|ChatMessageContent|string|IEnumerable<ChatToolCall>|ChatMessageRole|ChatFunctionCall|IEnumerable<ChatTokenLogProbabilityDetails>|IEnumerable<ChatTokenLogProbabilityDetails>|DateTimeOffset|string|string|ChatTokenUsage",
533 "OpenAIChatModelFactory.ChatInputTokenUsageDetails|int|int",
534 "OpenAIChatModelFactory.ChatOutputTokenUsageDetails|int",
535 "OpenAIChatModelFactory.ChatOutputTokenUsageDetails|int|int",
536 "OpenAIChatModelFactory.ChatTokenLogProbabilityDetails|string|float|ReadOnlyMemory<byte>?|IEnumerable<ChatTokenTopLogProbabilityDetails>",
537 "OpenAIChatModelFactory.ChatTokenTopLogProbabilityDetails|string|float|ReadOnlyMemory<byte>?",
538 "OpenAIChatModelFactory.ChatTokenUsage|int|int|int|ChatOutputTokenUsageDetails",
539 "OpenAIChatModelFactory.ChatTokenUsage|int|int|int|ChatOutputTokenUsageDetails|ChatInputTokenUsageDetails",
540 "OpenAIChatModelFactory.StreamingChatCompletionUpdate|string|ChatMessageContent|StreamingChatFunctionCallUpdate|IEnumerable<StreamingChatToolCallUpdate>|ChatMessageRole?|string|IEnumerable<ChatTokenLogProbabilityDetails>|IEnumerable<ChatTokenLogProbabilityDetails>|ChatFinishReason?|DateTimeOffset|string|string|ChatTokenUsage",
541 "OpenAIChatModelFactory.StreamingChatFunctionCallUpdate|string|BinaryData",
542 "OpenAIChatModelFactory.StreamingChatToolCallUpdate|int|string|ChatToolCallKind|string|BinaryData",
543 "OpenAIClient.GetAudioClient|string",
544 "OpenAIClient.GetChatClient|string",
545 "OpenAIClient.GetEmbeddingClient|string",
546 "OpenAIClient.GetImageClient|string",
547 "OpenAIClient.GetModerationClient|string",
548 "OpenAIClient.GetOpenAIFileClient",
549 "OpenAIClient.GetOpenAIModelClient",
550 "OpenAIEmbedding.ToFloats",
551 "OpenAIEmbeddingsModelFactory.EmbeddingTokenUsage|int|int",
552 "OpenAIEmbeddingsModelFactory.OpenAIEmbedding|int|IEnumerable<float>",
553 "OpenAIEmbeddingsModelFactory.OpenAIEmbeddingCollection|IEnumerable<OpenAIEmbedding>|string|EmbeddingTokenUsage",
554 "OpenAIFileClient.DeleteFile|string|CancellationToken",
555 "OpenAIFileClient.DeleteFile|string|RequestOptions",
556 "OpenAIFileClient.DeleteFileAsync|string|CancellationToken",
557 "OpenAIFileClient.DeleteFileAsync|string|RequestOptions",
558 "OpenAIFileClient.DownloadFile|string|CancellationToken",
559 "OpenAIFileClient.DownloadFile|string|RequestOptions",
560 "OpenAIFileClient.DownloadFileAsync|string|CancellationToken",
561 "OpenAIFileClient.DownloadFileAsync|string|RequestOptions",
562 "OpenAIFileClient.GetFile|string|CancellationToken",
563 "OpenAIFileClient.GetFile|string|RequestOptions",
564 "OpenAIFileClient.GetFileAsync|string|CancellationToken",
565 "OpenAIFileClient.GetFileAsync|string|RequestOptions",
566 "OpenAIFileClient.GetFiles|CancellationToken",
567 "OpenAIFileClient.GetFiles|FilePurpose|CancellationToken",
568 "OpenAIFileClient.GetFiles|string|RequestOptions",
569 "OpenAIFileClient.GetFilesAsync|CancellationToken",
570 "OpenAIFileClient.GetFilesAsync|FilePurpose|CancellationToken",
571 "OpenAIFileClient.GetFilesAsync|string|RequestOptions",
572 "OpenAIFileClient.UploadFile|BinaryContent|string|RequestOptions",
573 "OpenAIFileClient.UploadFile|BinaryData|string|FileUploadPurpose",
574 "OpenAIFileClient.UploadFile|Stream|string|FileUploadPurpose|CancellationToken",
575 "OpenAIFileClient.UploadFile|string|FileUploadPurpose",
576 "OpenAIFileClient.UploadFileAsync|BinaryContent|string|RequestOptions",
577 "OpenAIFileClient.UploadFileAsync|BinaryData|string|FileUploadPurpose",
578 "OpenAIFileClient.UploadFileAsync|Stream|string|FileUploadPurpose|CancellationToken",
579 "OpenAIFileClient.UploadFileAsync|string|FileUploadPurpose",
580 "OpenAIFilesModelFactory.FileDeletionResult|string|bool",
581 "OpenAIFilesModelFactory.OpenAIFileCollection|IEnumerable<OpenAIFile>",
582 "OpenAIFilesModelFactory.OpenAIFileInfo|string|int?|DateTimeOffset|string|FilePurpose|FileStatus|string",
583 "OpenAIImagesModelFactory.GeneratedImage|BinaryData|Uri|string",
584 "OpenAIImagesModelFactory.GeneratedImageCollection|DateTimeOffset|IEnumerable<GeneratedImage>",
585 "OpenAIModelClient.DeleteModel|string|CancellationToken",
586 "OpenAIModelClient.DeleteModel|string|RequestOptions",
587 "OpenAIModelClient.DeleteModelAsync|string|CancellationToken",
588 "OpenAIModelClient.DeleteModelAsync|string|RequestOptions",
589 "OpenAIModelClient.GetModel|string|CancellationToken",
590 "OpenAIModelClient.GetModel|string|RequestOptions",
591 "OpenAIModelClient.GetModelAsync|string|CancellationToken",
592 "OpenAIModelClient.GetModelAsync|string|RequestOptions",
593 "OpenAIModelClient.GetModels|CancellationToken",
594 "OpenAIModelClient.GetModels|RequestOptions",
595 "OpenAIModelClient.GetModelsAsync|CancellationToken",
596 "OpenAIModelClient.GetModelsAsync|RequestOptions",
597 "OpenAIModelsModelFactory.ModelDeletionResult|string|bool",
598 "OpenAIModelsModelFactory.OpenAIModel|string|DateTimeOffset|string",
599 "OpenAIModelsModelFactory.OpenAIModelCollection|IEnumerable<OpenAIModel>",
600 "OpenAIModerationsModelFactory.ModerationCategory|bool|float",
601 "OpenAIModerationsModelFactory.ModerationResult|bool|ModerationCategory|ModerationCategory|ModerationCategory|ModerationCategory|ModerationCategory|ModerationCategory|ModerationCategory|ModerationCategory|ModerationCategory|ModerationCategory|ModerationCategory",
602 "OpenAIModerationsModelFactory.ModerationResultCollection|string|string|IEnumerable<ModerationResult>",
603 };
604
605 private static readonly HashSet<string> _OPENAICUA001AttributeTypes = new(StringComparer.OrdinalIgnoreCase)
606 {
607 "ComputerCallAction",
608 "ComputerCallActionKind",
609 "ComputerCallActionMouseButton",
610 "ComputerCallOutputResponseItem",
611 "ComputerCallOutputStatus",
612 "ComputerCallResponseItem",
613 "ComputerCallSafetyCheck",
614 "ComputerCallStatus",
615 "ComputerOutput",
616 "ComputerToolEnvironment",
617 };
618
619 protected override PropertyProvider? VisitProperty(PropertyProvider property)
620 {
621 // Skip properties that are not public or are in non-stable classes
622 if ((!property.Modifiers.HasFlag(MethodSignatureModifiers.Public) &&
623 !property.Modifiers.HasFlag(MethodSignatureModifiers.Protected)) ||
624 !_stableClasses.Contains($"{property.EnclosingType.Type.Namespace}.{property.EnclosingType.Name}"))
625 {
626 return base.VisitProperty(property);
627 }
628
629 if (!_stableProperties.Contains($"{property.EnclosingType.Name}.{property.Name}"))
630 {
631 property.Update(
632 attributes: [.. property.Attributes,
633 property.EnclosingType.Type.Namespace.StartsWith(_realtimeNamespace) ? _experimental002Attribute : _experimental001Attribute]);
634
635 return property;
636 }
637
638 return base.VisitProperty(property);
639 }
640
641 protected override MethodProvider? VisitMethod(MethodProvider methodProvider)
642 {
643 // Skip methods that are not public or are in non-stable classes
644 if ((!methodProvider.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Public) &&
645 !methodProvider.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Protected)) ||
646 !_stableClasses.Contains($"{methodProvider.EnclosingType.Type.Namespace}.{methodProvider.EnclosingType.Name}"))
647 {
648 return base.VisitMethod(methodProvider);
649 }
650
651 string lookupName = methodProvider.Signature.Parameters.Count switch
652 {
653 0 => $"{methodProvider.Signature.Name}",
654 1 => $"{methodProvider.Signature.Name}|{methodProvider.Signature.Parameters[0].Type.Name}",
655 _ => $"{methodProvider.Signature.Name}|{string.Join("|", methodProvider.Signature.Parameters.Select(p => p.Type.Name))}"
656 };
657
658 // Generate a lookup name based on method signature
659 string operatorPrefix = "operator ";
660 bool isOperator = methodProvider.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Operator);
661 bool isImplicit = methodProvider.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Implicit);
662 bool isExplicit = methodProvider.Signature.Modifiers.HasFlag(MethodSignatureModifiers.Explicit);
663 lookupName = $"{methodProvider.EnclosingType.Name}.{(isOperator ? operatorPrefix : "")}{(isImplicit ? $"implicit {methodProvider.EnclosingType.Name}" : "")}{lookupName}";
664
665 if (!_stableMethods.Contains(lookupName))
666 {
667 methodProvider.Update(
668 attributes: [.. methodProvider.Attributes,
669 methodProvider.EnclosingType.Type.Namespace.StartsWith(_realtimeNamespace) || (methodProvider.Signature.ReturnType?.Namespace.StartsWith(_realtimeNamespace) ?? false) ?
670 _experimental002Attribute :
671 _experimental001Attribute]);
672
673 return methodProvider;
674 }
675
676 return base.VisitMethod(methodProvider);
677 }
678
679 protected override TypeProvider? VisitType(TypeProvider type)
680 {
681 if ((type.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Public) ||
682 type.DeclarationModifiers.HasFlag(TypeSignatureModifiers.Protected)) &&
683 !_stableClasses.Contains($"{type.Type.Namespace}.{type.Name}") &&
684 (type is ClientProvider or ModelProvider or ClientOptionsProvider or EnumProvider))
685 {
686 AttributeStatement experimentalAttribute = type.Type.Namespace switch
687 {
688 _ when type.Type.Namespace.StartsWith(_realtimeNamespace) => _experimental002Attribute,
689 _ when _OPENAICUA001AttributeTypes.Contains(type.Name) => _experimentalCUA001Attribute,
690 _ => _experimental001Attribute
691 };
692 type.Update(
693 attributes: [.. type.Attributes,
694 experimentalAttribute]);
695
696 return type;
697 }
698
699 return base.VisitType(type);
700 }
701 }
702}
703