Upload File
Upload files, images, or audio clips to AI providers (OpenAI / Google) with metadata support
returns IUploadedFile
Upload text files, images (Texture2D
), or audio clips (AudioClip
) via multipart form-data to AI providers.
All uploads are sent as
MimeType.MultipartFormData
. The result is normalized intoIUploadedFile
.
Basic Usage (local path/file)
using Glitch9.AIDevKit;
using Glitch9.IO.Files;
// Use any IFile implementation. LocalFile covers raw bytes on disk.
IFile file = new LocalFile("C:/datasets/train.jsonl", mimeType: MimeType.ApplicationJson);
IUploadedFile uploaded = await Api.OpenAI
.UploadFile(file) // <- convenience form
.SetOpenAIUploadPurpose(OpenAITypes.UploadPurpose.Assistants) // default is Assistants
.ExecuteAsync();
DevLog.Info($"Uploaded: {uploaded.Id} ({uploaded.FileName}, {uploaded.ByteSize} bytes)");
Upload a Unity Texture2D
Texture2D
using Glitch9.AIDevKit;
using Glitch9.IO.Files;
using UnityEngine;
Texture2D tex = /* load or generate at runtime */;
// File<T> automatically infers MIME via MIMETypeUtil and encodes Texture2D -> PNG on upload.
IFile imageFile = new File<Texture2D>(tex, "C:/tmp/snapshot.png");
IUploadedFile img = await Api.OpenAI
.UploadFile(imageFile)
.SetOpenAIUploadPurpose(OpenAITypes.UploadPurpose.Assistants)
.ExecuteAsync();
DevLog.Info($"Image uploaded: {img.Id}");
Upload an AudioClip
AudioClip
using Glitch9.AIDevKit;
using Glitch9.IO.Files;
using UnityEngine;
AudioClip clip = /* from mic or asset */;
// File<T> encodes AudioClip -> WAV on upload.
IFile audioFile = new File<AudioClip>(clip, "C:/tmp/recording.wav");
IUploadedFile aud = await Api.OpenAI
.UploadFile(audioFile)
.SetOpenAIUploadPurpose(OpenAITypes.UploadPurpose.Assistants)
.ExecuteAsync();
DevLog.Info($"Audio uploaded: {aud.Id}");
Upload from in-memory bytes (no asset)
using Glitch9.AIDevKit;
using Glitch9.IO.Files;
byte[] payload = System.Text.Encoding.UTF8.GetBytes("{\"hello\":\"world\"}");
IFile mem = new LocalFile(payload, "C:/virtual/data.json", mimeType: MimeType.ApplicationJson);
var up = await Api.OpenAI
.UploadFile(mem)
.SetOpenAIUploadPurpose(OpenAITypes.UploadPurpose.Batch)
.ExecuteAsync();
Google upload (with metadata)
using Glitch9.AIDevKit;
using Glitch9.IO.Files;
var metadata = new GoogleTypes.UploadMetadata
{
Name = "my-dataset.jsonl",
Description = "Training corpus v3",
MimeType = MimeType.ApplicationJson
};
IFile file = new LocalFile("C:/datasets/train.jsonl", mimeType: MimeType.ApplicationJson);
IUploadedFile gcs = await Api.Google
.UploadFile(file) // provider is fixed by the Api facade
.SetGoogleUploadMetadata(metadata)
.ExecuteAsync();
DevLog.Info($"GCS uploaded: {gcs.Uri}");
Provider options
OpenAI
SetOpenAIUploadPurpose(OpenAITypes.UploadPurpose purpose)
Common:
Assistants
(default),FineTuning
,Batch
,Vision
Convenience call:
Api.OpenAI.UploadFile(IFile)
Google
SetGoogleUploadMetadata(GoogleTypes.UploadMetadata metadata)
Convenience call:
Api.Google.UploadFile(IFile)
Notes & best practices
Constructor inputs (internals): You can create uploads from
IFile
(e.g.,LocalFile
,File<Texture2D>
,File<AudioClip>
)Texture2D
/AudioClip
viaFile<T>
which handles encoding (PNG/WAV)In-memory bytes via
new LocalFile(byte[], path, mimeType: …)
MIME:
File<T>
auto-infers MIME viaMIMETypeUtil
.LocalFile
should be given an explicitMimeType
when possible.
Asset loading:
File<T>
lazily loads/encodes assets;EnsureAssetLoadedAsync()
if you need it preloaded.
Size limits:
Providers enforce max size/format. Chunk or compress large payloads.
Async:
ExecuteAsync()
returnsUniTask<IUploadedFile>
. For progress, use yourTaskManager
hooks.
Error handling:
Check
IFile.LastError
after reads and wrap uploads withtry/catch
.
Last updated