// Copyright (c) Microsoft. All rights reserved.
using GettingStarted.Tools.Abstractions;
using Microsoft.Extensions.AI;
using OpenAI.Assistants;
#pragma warning disable OPENAI001
namespace GettingStarted.Tools.Extensions;
///
/// conversion for OpenAI Assistants.
/// When abstraction is in place, this logic should go to OpenAI Assistants SDK.
///
internal static class OpenAIAssistantChatOptionsExtensions
{
public static ChatOptions ToOpenAIAssistantChatOptions(this ChatOptions chatOptions)
{
// File references can be added on message attachment level only and not on code interpreter tool definition level.
// Message attachment content should be non-empty.
var threadInitializationMessage = new ThreadInitializationMessage(MessageRole.User, [MessageContent.FromText("attachments")]);
var toolDefinitions = new List();
foreach (var tool in chatOptions.Tools!)
{
if (tool is NewHostedCodeInterpreterTool codeInterpreterTool)
{
var codeInterpreterToolDefinition = new CodeInterpreterToolDefinition();
toolDefinitions.Add(codeInterpreterToolDefinition);
if (codeInterpreterTool.FileIds is { Count: > 0 })
{
foreach (var fileId in codeInterpreterTool.FileIds)
{
threadInitializationMessage.Attachments.Add(new(fileId, [codeInterpreterToolDefinition]));
}
}
}
}
var runCreationOptions = new RunCreationOptions();
runCreationOptions.AdditionalMessages.Add(threadInitializationMessage);
chatOptions.RawRepresentationFactory = (_) => runCreationOptions;
return chatOptions;
}
}