Unable to upload a file to my external API and always getting an validation error that indicates params are not getting passed correctly

Hi Team,

I appreciate any help on this.

I am actually building a GPT action and trying to call my external API and need to post a .zip file to my API.

This is how I have constructed my GPT schema -

{
  "openapi": "3.1.0",
  "info": {
    "title": "***",
    "description": "***",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "***"
    }
  ],
  "paths": {
    "/fileUpload": {
      "post": {
        "description": "****",
        "operationId": "UploadFile",
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "fileSource": {
                    "type": "string",
                    "format": "binary"
                  },
                  "name": {
                    "type": "string"
                  }
                },
                "required": ["fileSource", "name"]
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "File uploaded successfully"
          },
          "400": {
            "description": "Error in file upload"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {}
  }
}

Can someone please suggest how can make it work. I have working code built in PowerShell and that has below lines of code and that could be the reason why it is not working but the problem is not sure how to pass these values from GPT action schema -

"Content-Disposition: form-data; name=`"fileSource`"; filename=`"$projectName.zip`"",
       "Content-Type: application/x-zip-compressed$LF",

The issue you’re encountering with uploading a file to your external API seems to be related to how you’ve defined the file upload process in your OpenAPI schema and how you’re handling the request in your PowerShell script.

Based on your OpenAPI schema, the endpoint /fileUpload expects a multipart/form-data request with two required fields: fileSource (the binary data of the file) and name. The fileSource field should contain the actual binary data of the .zip file, and the name field is a string.

However, your PowerShell script snippet indicates that you’re setting the Content-Disposition and Content-Type headers manually, which is fine, but it’s not clear how you’re attaching the file data itself. Typically, in PowerShell, you would use Invoke-RestMethod or Invoke-WebRequest to make a POST request with a multipart form-data body.

Here’s a basic outline of how you might structure your PowerShell script to upload a file:

# Define the URI of your API endpoint
$uri = "https://your-api-endpoint/fileUpload"

# Define the path to your zip file
$filePath = "path\to\your\file.zip"
$fileBytes = [System.IO.File]::ReadAllBytes($filePath)
$fileEnc = [System.Text.Encoding]::GetEncoding('ISO-8859-1').GetString($fileBytes)

# Create a boundary string for the multipart/form-data request
$boundary = [System.Guid]::NewGuid().ToString()
$contentType = "multipart/form-data; boundary=$boundary"

# Construct the body of the request
$bodyLines = @(
    "--$boundary",
    "Content-Disposition: form-data; name=`"fileSource`"; filename=`"$filePath`"",
    "Content-Type: application/x-zip-compressed",
    "",
    $fileEnc,
    "--$boundary",
    "Content-Disposition: form-data; name=`"name`"",
    "",
    "YourFileNameHere",
    "--$boundary--"
)

$body = $bodyLines -join "`r`n"

# Make the request
$response = Invoke-RestMethod -Uri $uri -Method Post -ContentType $contentType -Body $body

# Handle the response
if ($response.StatusCode -eq 200) {
    "File uploaded successfully"
} else {
    "Error in file upload: $($response.StatusCode)"
}

Please ensure that the file path and API endpoint URL are correctly set. This script reads the file bytes, encodes them, and then constructs a multipart form-data request body with the appropriate headers and boundaries.

Remember to adjust the script to fit your specific requirements and test it thoroughly. Additionally, make sure that your server-side code is correctly configured to handle multipart/form-data requests and to parse the incoming file data correctly.

But note!

As of my last update in April 2023, Custom GPT implementations provided by OpenAI do not have the capability to directly send files, such as a .zip file, as part of their API interactions. Custom GPT models, like other GPT-3 based models, primarily deal with text input and output. They do not natively support binary data handling, which is required for file operations like sending a .zip file.

If your goal is to integrate file sending capabilities (like a .zip file upload) with a GPT-based system, you would typically need to handle this separately from the GPT model. This usually involves:

  1. Client-Side Handling: Your application’s client side (which could be a web or desktop application) would handle the file selection and uploading part.
  2. Server-Side Processing: The server, which could be a separate API or service, would receive the file, process it as needed, and possibly interact with the GPT model for any text-based processing.
  3. GPT Model Interaction: If needed, the server can interact with the GPT model to generate or process text, which can be based on the contents or metadata of the uploaded file. This would require custom logic to extract text from the file and then feed it to the GPT model.

For instance, if you have a server endpoint to handle file uploads, you would upload the file to this endpoint first. After processing the file as needed (like extracting text or relevant data), you can then send any necessary text to the GPT model for further processing or generation tasks.

Remember, GPT’s capabilities are primarily around text generation and processing, so any non-textual data needs to be handled outside of the GPT model and then possibly converted to a text format that the model can understand.

1 Like

Thank you for your response.

I’m uncertain about how to build this plugin. Is there comprehensive documentation available on file uploads supported by the GPT action? I can make the necessary changes to my API if required but at least I can find something on what is supported.

This is how I am receiving posted file at API side
[HttpPost]
public async Task PostFile([FromForm] RequestModel requestModel)
{
return Ok(await _service.Scan(requestModel));
}

Thanks

Custom GPT implementations provided by OpenAI do not have the capability to directly send files, such as a .zip file, as part of their API interactions. Custom GPT models, like other GPT-3 based models, primarily deal with text input and output. They do not natively support binary data handling, which is required for file operations like sending a .zip file.

If your goal is to integrate file sending capabilities (like a .zip file upload) with a GPT-based system, you would typically need to handle this separately from the GPT model. This usually involves:

  1. Client-Side Handling: Your application’s client side (which could be a web or desktop application) would handle the file selection and uploading part.
  2. Server-Side Processing: The server, which could be a separate API or service, would receive the file, process it as needed, and possibly interact with the GPT model for any text-based processing.
  3. GPT Model Interaction: If needed, the server can interact with the GPT model to generate or process text, which can be based on the contents or metadata of the uploaded file. This would require custom logic to extract text from the file and then feed it to the GPT model.

For instance, if you have a server endpoint to handle file uploads, you would upload the file to this endpoint first. After processing the file as needed (like extracting text or relevant data), you can then send any necessary text to the GPT model for further processing or generation tasks.

Remember, GPT’s capabilities are primarily around text generation and processing, so any non-textual data needs to be handled outside of the GPT model and then possibly converted to a text format that the model can understand.

3 Likes

Thanks for your input Paul. I will do some more research and take it from there.

Hello, regarding the issue of uploading files to a third-party API, have you come to a conclusion?