|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.TestUtilities;
using Xunit;
namespace Microsoft.Extensions.AI;
public class OpenAIResponseClientIntegrationTests : ChatClientIntegrationTests
{
protected override IChatClient? CreateChatClient() =>
IntegrationTestHelpers.GetOpenAIClient()
?.GetOpenAIResponseClient(TestRunnerConfiguration.Instance["OpenAI:ChatModel"] ?? "gpt-4o-mini")
.AsIChatClient();
public override bool FunctionInvokingChatClientSetsConversationId => true;
// Test structure doesn't make sense with Respones.
public override Task Caching_AfterFunctionInvocation_FunctionOutputUnchangedAsync() => Task.CompletedTask;
[ConditionalFact]
public async Task UseWebSearch_AnnotationsReflectResults()
{
SkipIfNotEnabled();
var response = await ChatClient.GetResponseAsync(
"Write a paragraph about the three most recent blog posts on the .NET blog. Cite your sources.",
new() { Tools = [new HostedWebSearchTool()] });
ChatMessage m = Assert.Single(response.Messages);
TextContent tc = m.Contents.OfType<TextContent>().First();
Assert.NotNull(tc.Annotations);
Assert.NotEmpty(tc.Annotations);
Assert.All(tc.Annotations, a =>
{
CitationAnnotation ca = Assert.IsType<CitationAnnotation>(a);
var regions = Assert.IsType<List<AnnotatedRegion>>(ca.AnnotatedRegions);
Assert.NotNull(regions);
Assert.Single(regions);
var region = Assert.IsType<TextSpanAnnotatedRegion>(regions[0]);
Assert.NotNull(region);
Assert.NotNull(region.StartIndex);
Assert.NotNull(region.EndIndex);
Assert.NotNull(ca.Url);
Assert.NotNull(ca.Title);
Assert.NotEmpty(ca.Title);
});
}
}
|