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
Texture2Dusing 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
AudioClipusing 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,VisionConvenience 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/AudioClipviaFile<T>which handles encoding (PNG/WAV)In-memory bytes via
new LocalFile(byte[], path, mimeType: …)
MIME:
File<T>auto-infers MIME viaMIMETypeUtil.LocalFileshould be given an explicitMimeTypewhen 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 yourTaskManagerhooks.
Error handling:
Check
IFile.LastErrorafter reads and wrap uploads withtry/catch.
Last updated