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

tests/Images/ImageTestFixtureBase.cs

79lines · modeblame

65d5703fMaddy Heaps10 months ago1using Microsoft.ClientModel.TestFramework;
2using Microsoft.ClientModel.TestFramework.TestProxy.Admin;
3using NUnit.Framework;
5dce104aJose Arriaga Maldonado1 years ago4using OpenAI.Chat;
5using OpenAI.Tests.Utility;
6using System;
7using System.ClientModel;
8using System.Collections.Generic;
9using System.Linq;
65d5703fMaddy Heaps10 months ago10using System.Threading.Tasks;
5dce104aJose Arriaga Maldonado1 years ago11using static OpenAI.Tests.TestHelpers;
12
13namespace OpenAI.Tests.Images;
14
15[Category("Images")]
65d5703fMaddy Heaps10 months ago16public class ImageTestFixtureBase : OpenAIRecordedTestBase
5dce104aJose Arriaga Maldonado1 years ago17{
18public ImageTestFixtureBase(bool isAsync) : base(isAsync)
19{
65d5703fMaddy Heaps10 months ago20// Replace large images with a small 1x1 PNG in recordings to save space
21BodyKeySanitizers.Add(new BodyKeySanitizer(
22new BodyKeySanitizerBody("$..b64_json")
23{
24Value = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII="
25}));
26
27// Sanitize data URLs in chat messages to prevent huge base64 content
28BodyRegexSanitizers.Add(new BodyRegexSanitizer(
29new BodyRegexSanitizerBody()
30{
31Value = @"""url"": ""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII=""",
32Regex = @"""url""\s*:\s*""data:image/[^""]+"""
33}));
5dce104aJose Arriaga Maldonado1 years ago34}
35
36public enum ImageSourceKind
37{
38UsingStream,
39UsingFilePath
40}
41
42internal const string CatPrompt = "A big cat with big round eyes and large cat ears, sitting in an empty room and looking at the camera.";
43
44internal static Array s_imageSourceKindSource = Enum.GetValues(typeof(ImageSourceKind));
45
65d5703fMaddy Heaps10 months ago46public async Task ValidateGeneratedImage(Uri imageUri, IEnumerable<string> possibleExpectedSubstrings, string descriptionHint = null)
5dce104aJose Arriaga Maldonado1 years ago47{
65d5703fMaddy Heaps10 months ago48ChatClient chatClient = GetProxiedOpenAIClient<ChatClient>(TestScenario.Chat);
5dce104aJose Arriaga Maldonado1 years ago49IEnumerable<ChatMessage> messages = [
50new UserChatMessage(
51ChatMessageContentPart.CreateTextPart($"Describe this image for me. {descriptionHint}"),
52ChatMessageContentPart.CreateImagePart(imageUri)),
53];
54ChatCompletionOptions chatOptions = new() { MaxOutputTokenCount = 2048 };
65d5703fMaddy Heaps10 months ago55ClientResult<ChatCompletion> result = await chatClient.CompleteChatAsync(messages, chatOptions);
5dce104aJose Arriaga Maldonado1 years ago56
57Assert.That(result.Value?.Content, Has.Count.EqualTo(1));
58string contentText = result.Value.Content[0].Text.ToLowerInvariant();
59
60Assert.That(possibleExpectedSubstrings.Any(possibleExpectedSubstring => contentText.Contains(possibleExpectedSubstring)));
61}
62
65d5703fMaddy Heaps10 months ago63public async Task ValidateGeneratedImage(BinaryData imageBytes, IEnumerable<string> possibleExpectedSubstrings, string descriptionHint = null)
5dce104aJose Arriaga Maldonado1 years ago64{
65d5703fMaddy Heaps10 months ago65ChatClient chatClient = GetProxiedOpenAIClient<ChatClient>(TestScenario.Chat);
5dce104aJose Arriaga Maldonado1 years ago66IEnumerable<ChatMessage> messages = [
67new UserChatMessage(
68ChatMessageContentPart.CreateTextPart($"Describe this image for me. {descriptionHint}"),
69ChatMessageContentPart.CreateImagePart(imageBytes, "image/png")),
70];
71ChatCompletionOptions chatOptions = new() { MaxOutputTokenCount = 2048 };
65d5703fMaddy Heaps10 months ago72ClientResult<ChatCompletion> result = await chatClient.CompleteChatAsync(messages, chatOptions);
5dce104aJose Arriaga Maldonado1 years ago73
74Assert.That(result.Value?.Content, Has.Count.EqualTo(1));
75string contentText = result.Value.Content[0].Text.ToLowerInvariant();
76
77Assert.That(possibleExpectedSubstrings.Any(possibleExpectedSubstring => contentText.Contains(possibleExpectedSubstring)));
78}
79}