Ошибка при попытке загрузить приглашение изображения в 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 и передать в запросе, но у меня та же ошибка. Кто-нибудь может мне помочь?

🤔 А знаете ли вы, что...
JavaScript можно использовать для создания анимаций и игр на веб-страницах.


97
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"
          }
        }
      ]
    }
  ]
}

Решено

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

Узор 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