--- # These are optional elements. Feel free to remove any of them. status: proposed contact: crickman, mabolan, semenshi date: 2024-01-16 --- # File Services ## Context and Problem Statement OpenAI provides a file service for uploading files to be used for *assistant retrieval* or *model fine-tuning*: `https://api.openai.com/v1/files` Other providers may also offer some type of file-service, such as Gemini. > Note: *Azure Open AI* does not currently support the OpenAI file service API. ## Considered Options 1. Add OpenAI file service support to `Microsoft.SemanticKernel.Experimental.Agents` 2. Add a file service abstraction and implement support for OpenAI 3. Add OpenAI file service support without abstraction ## Decision Outcome > Option 3. **Add OpenAI file service support without abstraction** > Mark code as experimental using label: `SKEXP0010` Defining a generalized file service interface provides an extensibility point for other vendors, in addition to *OpenAI*. ## Pros and Cons of the Options ### Option 1. Add OpenAI file service support to `Microsoft.SemanticKernel.Experimental.Agents` **Pro:** 1. No impact to existing AI connectors. **Con:** 1. No reuse via AI connectors. 1. No common abstraction. 1. Unnatural dependency binding for uses other than with OpenAI assistants. ### Option 2. Add a file service abstraction and implement support for OpenAI **Pro:** 1. Defines a common interface for file service interactions. 1. Allows for specialization for vendor specific services. **Con:** 1. Other systems may diverge from existing assumptions. ### Option 3. Add OpenAI file service support without abstraction **Pro:** 1. Provides support for OpenAI file-service. **Con:** 1. File service offerings from other vendors supported case-by-case without commonality. ## More Information ### Signature of BinaryContent > Note: `BinaryContent` object able to provide either `BinaryData` or `Stream` regardless of which constructor is invoked. #### `Microsoft.SemanticKernel.Abstractions` ```csharp namespace Microsoft.SemanticKernel; /// /// Represents binary content. /// public sealed class BinaryContent : KernelContent { public BinaryContent( BinaryData content, string? modelId = null, object? innerContent = null, IReadOnlyDictionary? metadata = null); public BinaryContent( Func streamProvider, string? modelId = null, object? innerContent = null, IReadOnlyDictionary? metadata = null); public Task GetContentAsync(); public Task GetStreamAsync(); } ``` ### Signatures for Option 3: #### `Microsoft.SemanticKernel.Connectors.OpenAI` ```csharp namespace Microsoft.SemanticKernel.Connectors.OpenAI; public sealed class OpenAIFileService { public async Task GetFileAsync( string id, CancellationToken cancellationToken = default); public async Task> GetFilesAsync(CancellationToken cancellationToken = default); public async Task GetFileContentAsync( string id, CancellationToken cancellationToken = default); public async Task DeleteFileAsync( string id, CancellationToken cancellationToken = default); public async Task UploadContentAsync( BinaryContent content, OpenAIFileUploadExecutionSettings settings, CancellationToken cancellationToken = default); } public sealed class OpenAIFileUploadExecutionSettings { public string FileName { get; } public OpenAIFilePurpose Purpose { get; } } public sealed class OpenAIFileReference { public string Id { get; set; } public DateTime CreatedTimestamp { get; set; } public string FileName { get; set; } public OpenAIFilePurpose Purpose { get; set; } public int SizeInBytes { get; set; } } public enum OpenAIFilePurpose { Assistants, Finetuning, } ```