Ошибка при попытке загрузить приглашение изображения в Gemini API

Я использую Postman и пытаюсь получить ответ от Gemini API при попытке создать приглашение, включающее изображение. Я отправляю запрос по адресу: https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent

{
  "contents":[
    {
      "parts":[
        {"text": "What is this picture?"},
        {
          "inline_data": {
            "mime_type":"image/jpeg",
            "data": "https://i.ibb.co/3mX1qcB/Document-sans-titre-page-0001.jpg"
          }
        }
      ]
    }
  ]
}

Я получаю такой ответ:

{
    "error": {
        "code": 400,
        "message": "Invalid value at 'contents[0].parts[1].inline_data.data' (TYPE_BYTES), Base64 decoding failed for \"https://pastebin.com/raw/kL4WEnnn\"",
        "status": "INVALID_ARGUMENT",
        "details": [
            {
                "@type": "type.googleapis.com/google.rpc.BadRequest",
                "fieldViolations": [
                    {
                        "field": "contents[0].parts[1].inline_data.data",
                        "description": "Invalid value at 'contents[0].parts[1].inline_data.data' (TYPE_BYTES), Base64 decoding failed for \"https://pastebin.com/raw/kL4WEnnn\""
                    }
                ]
            }
        ]
    }
}

Я попытался преобразовать изображение в необработанный текст base64, загрузить его в Pastebin и передать в запросе, но у меня та же ошибка. Кто-нибудь может мне помочь?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы пытаетесь использовать изображение, расположенное по URL-адресу, но inline_dataPart, который вы пытаетесь использовать, предназначен для передачи представления необработанных байтов файла изображения в кодировке Base64.

Вместо этого используйте часть FileData, которая принимает «данные на основе URI»:

{
  "contents": [
    {
      "parts": [
        {
          "text": "What is this picture?"
        },
        {
          "fileData": {
            "mime_type": "image/jpeg",
            "fileUri": "https://i.ibb.co/3mX1qcB/Document-sans-titre-page-0001.jpg"
          }
        }
      ]
    }
  ]
}

Спасибо, но я уже пробовал это и теперь получаю эту ошибку Invalid JSON payload received. Unknown name \"uri\" at 'contents[0].parts[1].file_data': Cannot find field.",

Cryopt 16.07.2024 13:31

@Cryopt Мои извинения, см. редактирование. uri на самом деле должно быть fileUri согласно связанным документам.

esqew 16.07.2024 13:37

Спасибо, теперь у меня другая ошибка. { "error": { "code": 400, "message": "Invalid or unsupported file uri: https://i.ibb.co/3mX1qcB/Document-sans-titre-page-0001.jpg", "status": "INVALID_ARGUMENT" } } Я попробовал другое изображение, но ошибка все та же.

Cryopt 16.07.2024 13:41
Ответ принят как подходящий

Как насчет следующих шаблонов?

Узор 1:

В этом шаблоне используется inlineData.

В этом случае необходимо преобразовать данные изображения (https://i.ibb.co/3mX1qcB/Document-sans-titre-page-0001.jpg) в данные base64. Когда

Сначала я создал текстовые данные, включая данные base64, из URL-адреса следующим образом. Имя файла sampleRequestBody.txt.

{"contents":[{"parts":[{"text":"What is this picture?"},{"inline_data":{"mime_type":"image/jpeg","data":"{base64 data converted from image data}"}}]}]}

Когда это используется с командой curl, это выглядит следующим образом.

curl -s -X POST \
-H "Content-Type: application/json" \
-d @sampleRequestBody.txt \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key = {your API key}"

При запуске этой команды curl получается результат, показанный в разделе «Тестирование».

Схема 2:

В этом шаблоне используется fileData. В этом случае запускается следующий поток.

1. Загрузите данные изображения в Gemini.

curl "https://i.ibb.co/3mX1qcB/Document-sans-titre-page-0001.jpg" | curl --data-binary @- -X POST -H "Content-Type: image/jpeg" "https://generativelanguage.googleapis.com/upload/v1beta/files?uploadType=media&key = {your API key}"

При этом возвращается следующий результат.

{
  "file": {
    "name": "files/###s",
    "mimeType": "image/jpeg",
    "sizeBytes": "1271543",
    "createTime": "2024-07-17T00:00:00.000000Z",
    "updateTime": "2024-07-17T00:00:00.000000Z",
    "expirationTime": "2024-07-19T00:00:00.000000Z",
    "sha256Hash": "###",
    "uri": "https://generativelanguage.googleapis.com/v1beta/files/###",
    "state": "ACTIVE"
  }
}

Пожалуйста, скопируйте значение uri из возвращенного значения.

2. Генерируйте контент

Используя значение uri, контент генерируется следующим образом. Здесь используется свойство fileData.

curl -s -X POST \
-d '{"contents":[{"parts":[{"text":"What is this picture?"},{"fileData":{"mimeType":"image/jpeg","fileUri":"https://generativelanguage.googleapis.com/v1beta/files/###"}}]}]}' \
-H "Content-Type: application/json" \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key = {your API key}"

Тестирование:

Оба шаблона возвращают следующий результат. Сгенерированный текст будет другим.

{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "This image shows the Swagger documentation for a petstore API.  Swagger is a specification and toolset for describing, documenting, and consuming RESTful web services.  This particular documentation defines the endpoints and data structures for a petstore API.  It outlines how users can interact with the API to create, read, update, and delete pets, as well as manage their inventory."
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "index": 0,
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "probability": "NEGLIGIBLE"
        },
        {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "probability": "NEGLIGIBLE"
        },
        {
          "category": "HARM_CATEGORY_HARASSMENT",
          "probability": "NEGLIGIBLE"
        },
        {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "probability": "NEGLIGIBLE"
        }
      ]
    }
  ],
  "usageMetadata": {
    "promptTokenCount": 263,
    "candidatesTokenCount": 76,
    "totalTokenCount": 339
  }
}

Использованная литература:

  • Метод: models.generateContent
  • Метод: media.upload

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