uploadFile method

Future<GptFile> uploadFile({
  1. required String apiKey,
  2. required String organizationId,
  3. required CreateFileRequest request,
  4. required Uint8List fileBytes,
})

Upload a file that can be used across various endpoints. The size of all the files uploaded by one organization can be up to 100 GB.

The size of individual files can be a maximum of 512 MB or 2 million tokens for Assistants. See the Assistants Tools guide to learn more about the types of files supported. The Fine-tuning API only supports .jsonl files.

Implementation

Future<GptFile> uploadFile({
  required String apiKey,
  required String organizationId,
  required CreateFileRequest request,
  required Uint8List fileBytes
}) async {

  Map<String, String> headers = {
    "Authorization": "Bearer $apiKey",
    "OpenAI-Organization": organizationId,
    'Content-Type': 'application/json',
    "Access-Control-Allow-Origin": "*", // Required for CORS support to work
  };


  Uri endpoint;
  if (secure) {
    endpoint =
        Uri.https(baseUrl, "/v1/files");
  } else {
    endpoint =
        Uri.http(baseUrl, "/v1/files");
  }

  String? targetFilename = request.fileName;
  request.fileName = null;
  var httpRequest = http.MultipartRequest('POST', endpoint)
    ..headers.addAll(headers)
    ..fields.addAll(
        request.toJson().map((key, value) => MapEntry(key, value.toString())))
    ..files.add(http.MultipartFile.fromBytes("file", fileBytes, filename: targetFilename));

  var response = await httpRequest.send();

  if (response.statusCode == 200 || response.statusCode == 201) {
    return GptFile.fromJson(jsonDecode(
        const Utf8Decoder().convert(await response.stream.toBytes())));
  } else {
    var error = ServerError.fromJson(jsonDecode(
        const Utf8Decoder().convert(await response.stream.toBytes())));
    throw FilesException(
        statusCode: response.statusCode, message: error.message);
  }
}