uploadFileBytes method

Future<OpenAIFile> uploadFileBytes({
  1. required FilePurpose purpose,
  2. required Uint8List fileBytes,
  3. required String filename,
  4. FileExpiresAfter? expiresAfter,
  5. String? mimeType,
})

Upload a file from raw bytes.

purpose one of:

  • assistants, batch, fine-tune, vision, user_data, evals
  • (system may also return assistants_output, batch_output, fine-tune-results)

Use expiresAfter to set a TTL (e.g. for batch). If provided, this is sent as form fields: expires_after[anchor] and expires_after[seconds].

Implementation

Future<OpenAIFile> uploadFileBytes({
  required FilePurpose purpose,
  required Uint8List fileBytes,
  required String filename,
  FileExpiresAfter? expiresAfter,
  String? mimeType, // optional; will be inferred if not provided
}) async {
  final uri = baseUrl.resolve('files');
  final req = http.MultipartRequest('POST', uri)
    ..headers.addAll(getHeaders({}) ?? {})
    ..fields['purpose'] = purpose.toJson();

  if (expiresAfter != null) {
    req.fields['expires_after[anchor]'] = expiresAfter.anchor;
    req.fields['expires_after[seconds]'] = expiresAfter.seconds.toString();
  }

  final contentType = mimeType ?? (lookupMimeType(filename) ?? 'application/octet-stream');
  req.files.add(http.MultipartFile.fromBytes('file', fileBytes, filename: filename, contentType: MediaType.parse(contentType)));

  final streamed = await httpClient.send(req);
  final res = await http.Response.fromStream(streamed);

  if (res.statusCode == 200) {
    return OpenAIFile.fromJson(jsonDecode(res.body));
  }
  throw OpenAIRequestException.fromHttpResponse(res);
}