Действия OpenAI для пользовательского GPT: как изменить схему OpenAPI для отправки файла вместе со строкой

Я создаю собственный GPT, который подключается к моему собственному серверу. Я могу заставить его работать, только отправив строку, но если я попытаюсь разрешить пользователю также отправлять файл (он мне нужен только для работы с файлами изображений) через интерфейс Chatgpt, он не отправит изображение, а только строка. Как изменить приведенную ниже схему, чтобы также отправить изображение?

      {
  "openapi": "3.1.0",
  "info": {
    "title": "Send an image and a string",
    "description": "Makes it super easy to send an image and a string",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://myawesomeserver.loca.lt"
    }
  ],
  "paths": {
    "/api/gpt/create": {
      "post": {
        "description": "Create a string and image",
        "operationId": "CreateImageandString",
        "parameters": [
          {
            "name": "an_awesome_string",
            "in": "query",
            "description": "The value of the string we will create",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "image to be uploaded",
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "image": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              }
            }
          }
        },
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {}
  }
}

2 ответа

У вас это было довольно близко, но вы упустили несколько вещей сencodingобъект, который является необязательным, но гораздо более информативным для полезной нагрузки. Другое дело, что строку следует отправлять в теле json, а не в параметре запроса. Параметры запроса должны быть зарезервированы для условий поиска.

      {
  "openapi": "3.1.0",
  "info": {
    "title": "Send an image and a string",
    "description": "Makes it super easy to send an image and a string",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://myawesomeserver.loca.lt"
    }
  ],
  "paths": {
    "/api/gpt/create": {
      "post": {
        "description": "Create a string and image",
        "operationId": "CreateImageandString",
        "parameters": [],
        "requestBody": {
          "description": "image to be uploaded",
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "an_awesome_string": {
                    "type": "string"
                  },
                  "image": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "an_awesome_string": {
                  "headers": {
                    "content-disposition": {
                      "$ref": "#/components/headers/content-disposition"
                    }
                  },
                  "contentType": "application/json"
                },
                "image": {
                  "headers": {
                    "content-disposition": {
                      "$ref": "#/components/headers/content-disposition"
                    }
                  },
                  "contentType": "image/*"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "headers": {
      "content-disposition": {
        "description": "the content-disposition header",
        "schema": {
          "type": "string"
        },
        "required": true
      }
    }
  }
}

Затем вам необходимо убедиться, что ваше тело действительно отформатировано как запрос данных формы с соответствующими заголовками, как того требует служба. Главное — это заголовок иnameнеобходимы свойства. Обычно они связаны с элементами данных формы, из которых возникли данные. Убедитесь, чтоboundaryправильно определено, поскольку именно так определяются части тела.

      POST https://myawesomeserver.loca.lt/api/gpt/create HTTP/1.1
Content-Type: multipart/form-data; boundary=gc0p4Jq0M2Yt08jU534c0p
  
--gc0p4Jq0M2Yt08jU534c0p
Content-Disposition: form-data; name="image"; filename="image_name.png"
Content-Type: image/png
Content-Length: <number>
 
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAJgAAAAAAAAAA
EAAAKAAAAAEAAAD+////AAAAACUAAAD/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////s
pcEAk8EJBAAA8BK/AAAAAAABEQABAAEACAAADggAAA4AYmpiagf4B/gAAAAAAAAAAAAAAAAAAAAA
AAAJBBYANA4AAGWSAQBlkgEADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA
AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAAKwFAAAAAAAArAUAAHwT
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA=

--gc0p4Jq0M2Yt08jU534c0p
Content-Disposition: form-data; name="an_awesome_string"
Content-Type: application/json
Content-Length: <number>

{
  "an_awesome_string": "test"
}

--gc0p4Jq0M2Yt08jU534c0p--

Если вы действительно хотите узнать о составных сообщениях, вы можете найти дополнительную информацию в RFC2045.

Информация оcontent-dispositionзаголовок можно найти в RFC6266.

Короче говоря, на момент написания статьи невозможно загружать файлы из действия GPT. Это связано с тем, что языковая модель (GPT) сама генерирует параметры для вызова GPT Action, а самый большой вывод модели на сегодняшний день (GPT-4-Turbo) составляет 4096 токенов (примерно 2 символа). Это означает, что самый большой файл, который вы теоретически могли бы предложить модели загрузить, должен был бы поместиться в это окно вывода. Поддержка загрузки файлов непосредственно в действие GPT другими способами пока невозможна.

Если вам нужна ваша модель для приема файлов, я бы рекомендовал иметь действие, которое создает безопасную конечную точку на вашем веб-сервере, где пользователь может загрузить файл непосредственно в ваш сервис (скажем,), предлагая пользователю щелкнуть эту ссылку и загрузить свой файл, а затем указать еще одно действие, ссылающееся на этот уникальный идентификатор, для получения и работы с файлом. Имейте в виду, что вы пока не можете использовать действие для передачи изображения в GPT-4 Vision, но вы можете вызвать API GPT-4 Vision на своем сервере с помощью файла пользователя. Ни один из этих опытов не будет гладким, но, надеюсь, это вдохновит вас на то, как действовать дальше.

Другие вопросы по тегам