Действия 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 другими способами пока невозможна.
Если вам нужна ваша модель для приема файлов, я бы рекомендовал иметь действие, которое создает безопасную конечную точку на вашем веб-сервере, где пользователь может загрузить файл непосредственно в ваш сервис (скажем,