Files
microsoft--semantic-kernel/docs/decisions/0026-file-service.md
T
wehub-resource-sync b957a53def
CodeQL / Analyze (csharp) (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:21:23 +08:00

145 lines
4.0 KiB
Markdown

---
# 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;
/// <summary>
/// Represents binary content.
/// </summary>
public sealed class BinaryContent : KernelContent
{
public BinaryContent(
BinaryData content,
string? modelId = null,
object? innerContent = null,
IReadOnlyDictionary<string, object?>? metadata = null);
public BinaryContent(
Func<Stream> streamProvider,
string? modelId = null,
object? innerContent = null,
IReadOnlyDictionary<string, object?>? metadata = null);
public Task<BinaryData> GetContentAsync();
public Task<Stream> GetStreamAsync();
}
```
### Signatures for Option 3:
#### `Microsoft.SemanticKernel.Connectors.OpenAI`
```csharp
namespace Microsoft.SemanticKernel.Connectors.OpenAI;
public sealed class OpenAIFileService
{
public async Task<OpenAIFileReference> GetFileAsync(
string id,
CancellationToken cancellationToken = default);
public async Task<IEnumerable<OpenAIFileReference>> GetFilesAsync(CancellationToken cancellationToken = default);
public async Task<BinaryContent> GetFileContentAsync(
string id,
CancellationToken cancellationToken = default);
public async Task DeleteFileAsync(
string id,
CancellationToken cancellationToken = default);
public async Task<OpenAIFileReference> 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,
}
```