A API Gemini continua a crescer. Em 5 de agosto de 2024, atualizei amplamente GeminiWithFiles para v2.xx. Com esta grande atualização, a versão foi alterada de v1 para v2.
Se você quiser usar GeminiWithFiles v1.xx, veja aqui.
Esta é uma biblioteca de scripts do Google Apps para API Gemini com arquivos.
Uma nova biblioteca de scripts do Google Apps chamada GeminiWithFiles simplifica o uso do Gemini, um grande modelo de linguagem, para processar dados não estruturados, como imagens e PDFs. GeminiWithFiles pode fazer upload de arquivos, gerar conteúdo e criar descrições de várias imagens ao mesmo tempo. Isso reduz significativamente a carga de trabalho e amplia as possibilidades de uso do Gemini.
Recentemente, Gemini, um grande modelo de linguagem do Google AI, trouxe novas possibilidades para diversas tarefas ao permitir o uso de dados não estruturados como dados estruturados. Isto é particularmente significativo porque existe uma grande quantidade de informações em formatos não estruturados, como documentos de texto, imagens e vídeos.
A API Gemini 1.5, lançada recentemente, expande significativamente esses recursos. Pode gerar conteúdo de até 1 milhão de tokens, um aumento substancial em relação às versões anteriores. Além disso, o Gemini 1.5 agora pode processar até 3.000 arquivos de imagem, excedendo amplamente o limite de 16 imagens do Gemini 1.0. Referência
Embora o Gemini não possa trabalhar diretamente com formatos do Google Drive, como Documentos, Planilhas e Apresentações, existem soluções alternativas. No estágio atual, os dados PDF podem ser processados diretamente com a API Gemini. Usando isso, os arquivos do Google Docs são convertidos em PDF e usados com a API Gemini. Referência
Este relatório apresenta uma nova biblioteca de scripts do Google Apps chamada "GeminiWithFiles" que simplifica esse processo. GeminiWithFiles permite aos usuários fazer upload de arquivos e gerar conteúdo facilmente usando os poderosos recursos do Gemini. Ele também permite a criação eficiente de descrições a partir de várias imagens com uma única chamada de API, reduzindo significativamente a carga de trabalho em comparação com o processamento de cada imagem individualmente, conforme demonstrado em meu relatório anterior. Referência
Ao simplificar o processo e expandir os recursos, GeminiWithFiles é promissor para vários casos de uso em diferentes domínios. Este relatório serve como uma abordagem ampliada ao anterior, visando reduzir ainda mais os custos do processo e melhorar a eficiência ao trabalhar com Gemini e dados não estruturados.
Criei esta biblioteca com base nos seguintes relatórios.
Esta biblioteca GeminiWithFiles permite interagir com Gemini, uma poderosa plataforma de processamento e gerenciamento de documentos, por meio de uma API fácil de usar. Aqui está o que você pode conseguir com esta biblioteca:
Gerenciamento de arquivos:
Carregamento de conteúdo:
Gerenciamento de histórico de bate-papo:
Geração de conteúdo:
Especificação de saída:
Especifique o formato de saída desejado para os resultados gerados pela API Gemini.
Usando response_mime_type
e esquema JSON, o formato de saída é controlado. Referência
Para testar este script, execute as etapas a seguir.
Acesse https://makersuite.google.com/app/apikey e crie sua chave API. Nesse momento, ative a API Generative Language no console da API. Esta chave de API é usada para este script de amostra.
Este documento oficial também pode ser visto. Ref.
Crie um projeto independente do Google Apps Script. Claro, esse script também pode ser usado com o script vinculado ao contêiner.
E abra o editor de script do projeto Google Apps Script.
Existem 2 padrões para usar GeminiWithFiles.
Se você usar esta biblioteca como uma biblioteca do Google Apps Script, instale-a em seu projeto do Google Apps Script da seguinte maneira.
Crie um projeto do Google Apps Script. Ou abra seu projeto do Google Apps Script.
Instale esta biblioteca.
1dolXnIeXKz-BH1BlwRDaKhzC2smJcGyVxMxGYhaY2kqiLa857odLXrIC
Se você usa esta biblioteca em seu próprio projeto do Google Apps Script, copie e cole o script "classGeminiWithFiles.js" em seu projeto do Google Apps Script. Com isso, o script pode ser usado.
"main.js" é usado para a biblioteca de scripts do Google Apps. Portanto, neste padrão, você não é obrigado a usá-lo.
Esta biblioteca usa os 2 escopos a seguir.
https://www.googleapis.com/auth/script.external_request
https://www.googleapis.com/auth/drive
Se você quiser usar o token de acesso, vincule o projeto Google Cloud Platform ao projeto Google Apps Script. E adicione o seguinte escopo.
https://www.googleapis.com/auth/generative-language
Além disso, você pode ver o documento oficial da API Gemini em https://ai.google.dev/api/rest.
Métodos | Descrição |
---|---|
setFileIds(fileIds, asImage = false) | Defina IDs de arquivo. |
setBlobs(blobs) | Definir bolhas. |
withUploadedFilesByGenerateContent(fileList = []) | Crie um objeto para usar o método generateContent. |
uploadArquivos(n = 50) | Carregar arquivos para o Gemini. |
getListaArquivos() | Obtenha a lista de arquivos no Gemini. |
deleteFiles(nomes, n = 50) | Exclua arquivos do Gemini. |
gerarConteúdo(objeto) | Método principal. Gere conteúdo pela API Gemini. |
setFileIdsOrUrlsWithResumableUpload(objeto) | Arquivos com mais de 50 MB podem ser carregados no Gemini. |
Ao instalar GeminiWithFiles como uma biblioteca em seu projeto do Google Apps Script, use o script a seguir.
const g = GeminiWithFiles . geminiWithFiles ( object ) ;
ou
Ao copiar e colar diretamente o script da classe GeminiWithFiles em seu projeto do Google Apps Script, use o script a seguir.
const g = new GeminiWithFiles ( object ) ;
O valor do object
é o seguinte.
{Object} object API key or access token for using Gemini API.
{String} object.apiKey API key.
{String} object.accessToken Access token.
{String} object.model Model. Default is "models/gemini-1.5-pro-latest".
{String} object.version Version of API. Default is "v1beta".
{Boolean} object.doCountToken Default is false. If this is true, when Gemini API is requested, the token of request is shown in the log.
{Array} object.history History for continuing chat.
{Array} object.functions If you want to give the custom functions, please use this.
{String} object.response_mime_type In the current stage, only "application/json" can be used.
{String} object.responseMimeType In the current stage, only "application/json" can be used.
{Object} object.response_schema JSON schema for controlling the output format.
{Object} object.responseSchema JSON schema for controlling the output format.
{Number} object.temperature Control the randomness of the output.
{Object} object.systemInstruction Ref: https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/gemini.
{Boolean} object.exportTotalTokens When this is true, the total tokens are exported as the result value. At that time, the generated content and the total tokens are returned as an object.
{Boolean} object.exportRawData The default value is false. When this is true, the raw data returned from Gemini API is returned.
{Object} object.toolConfig The default is null. If you want to directly give the object of "toolConfig", please use this.
{Array} object.tools The default value is null. For example, when you want to use "codeExecution", please set `tools: [{ codeExecution: {}}]`.
{PropertiesService.Properties} object.propertiesService PropertiesService.getScriptProperties()
{Boolean} object.resumableUploadAsNewUpload When you want to upload the data with the resumable upload as new upload, please set this as true. The default is false.
Quando você quiser usar response_mime_type
, forneça jsonSchema
para o método generateContent. No estágio atual, apenas "application/json"
pode ser usado para response_mime_type
.
Quando você quiser usar systemInstruction
, confirme o documento oficial Ref.
Gemini 1.5 Flash Latest ( models/gemini-1.5-flash-latest
) é usado como modelo padrão. Quando você quiser usar o Gemini 1.5 Pro Latest ( models/gemini-1.5-pro-latest
), use-o como const g = GeminiWithFiles.geminiWithFiles({ apiKey, model: "models/gemini-1.5-pro-latest" })
.
No estágio atual, quando response_schema
é usado, response_mime_type: "application/json"
é usado automaticamente.
Defina IDs de arquivo. Os arquivos de IDs de arquivo são carregados no Gemini.
Neste caso, async/await é usado na função.
function myFunction ( ) {
const apiKey = "###" ; // Please set your API key.
const folderId = "###" ; // Please set your folder ID including images.
let fileIds = [ ] ;
const files = DriveApp . getFolderById ( folderId ) . getFiles ( ) ;
while ( files . hasNext ( ) ) {
const file = files . next ( ) ;
fileIds . push ( file . getId ( ) ) ;
}
const g = GeminiWithFiles . geminiWithFiles ( { apiKey } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const res = g . setFileIds ( fileIds , false ) . uploadFiles ( ) ;
console . log ( res ) ;
}
setFileIds
são String[] (os IDs dos arquivos no Google Drive) e o booleano, respectivamente. Se o segundo argumento for falso, os arquivos inseridos de IDs de arquivo serão carregados como dados brutos. Se o segundo argumento for verdadeiro, os arquivos de IDs de arquivo inseridos são convertidos em dados de imagem e carregados. O padrão do segundo argumento é falso.false
neste método como setFileIds(fileIds, false)
. Definir bolhas. Os blobs são carregados no Gemini.
function myFunction ( ) {
const apiKey = "###" ; // Please set your API key.
const folderId = "###" ; // Please set your folder ID including images.
const blobs = [ ] ;
const files = DriveApp . getFolderById ( folderId ) . getFiles ( ) ;
while ( files . hasNext ( ) ) {
blobs . push ( files . next ( ) . getBlob ( ) ) ;
}
const g = GeminiWithFiles . geminiWithFiles ( { apiKey } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const res = g . setBlobs ( blobs ) . uploadFiles ( ) ;
console . log ( res ) ;
}
setBlobs
é Blob[].Crie um objeto para usar o método generateContent.
function myFunction ( ) {
const apiKey = "###" ; // Please set your API key.
const q = "###" ; // Please set your question.
const g = GeminiWithFiles . geminiWithFiles ( { apiKey } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const fileList = g . getFileList ( ) ;
const res = g
. withUploadedFilesByGenerateContent ( fileList )
. generateContent ( { q } ) ;
console . log ( res ) ;
}
withUploadedFilesByGenerateContent
possui apenas um argumento. Esse é o valor do método getFileList. Você pode ver os valores reais depois de fazer upload dos arquivos.Carregar arquivos para o Gemini. Os arquivos são carregados no Gemini usando os IDs de arquivo ou blobs inseridos.
function myFunction ( ) {
const apiKey = "###" ; // Please set your API key.
const fileIds = [ "###fileId1###" , "###fileId2###" , , , ] ; // Please set your file IDs in this array.
const g = GeminiWithFiles . geminiWithFiles ( { apiKey } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const res = g . setFileIds ( fileIds , false ) . uploadFiles ( ) ;
console . log ( res ) ;
}
Neste script, os arquivos de fileIds
são carregados no Gemini com os dados brutos. Se setFileIds(fileIds, false)
for modificado para setFileIds(fileIds, true)
, os arquivos serão carregados no Gemini como imagens.
Ao usar o Blob diretamente, você pode usar o script a seguir.
function myFunction ( ) {
const apiKey = "###" ; // Please set your API key.
const fileIds = [ "###fileId1###" , "###fileId2###" , , , ] ; // Please set your file IDs in this array.
const blobs = fileIds . map ( id => DriveApp . getFileById ( id ) . getBlob ( ) ) ;
const g = GeminiWithFiles . geminiWithFiles ( { apiKey } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const res = g . setBlobs ( blobs ) . uploadFiles ( ) ;
console . log ( res ) ;
}
Obtenha a lista de arquivos no Gemini.
function myFunction ( ) {
const apiKey = "###" ; // Please set your API key.
const g = GeminiWithFiles . geminiWithFiles ( { apiKey } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const res = g . getFileList ( ) ;
console . log ( res ) ;
}
Exclua arquivos do Gemini.
function myFunction ( ) {
const apiKey = "###" ; // Please set your API key.
const g = GeminiWithFiles . geminiWithFiles ( { apiKey } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const names = g . getFileList ( ) . map ( ( { name } ) => name ) ;
if ( names . length == 0 ) return ;
g . deleteFiles ( names ) ;
console . log ( ` ${ names . length } files were deleted.` ) ;
}
Método principal. Gere conteúdo pela API Gemini. Mais scripts de exemplo podem ser vistos na seção "Scripts de exemplo" a seguir.
function myFunction ( ) {
const apiKey = "###" ; // Please set your API key.
const g = GeminiWithFiles . geminiWithFiles ( { apiKey } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const res = g . generateContent ( { q : "What is Google Apps Script?" } ) ;
console . log ( res ) ;
}
Neste script, o conteúdo é gerado com a chamada da função.
Quando você quiser usar response_mime_type
, forneça jsonSchema
para o método generateContent da seguinte maneira. Neste caso, ao fornecer apenas o esquema JSON, esta biblioteca pode retornar um objeto válido. Você também pode ver informações detalhadas sobre response_mime_type
em meu relatório.
function myFunction ( ) {
const apiKey = "###" ; // Please set your API key.
const g = GeminiWithFiles . geminiWithFiles ( {
apiKey ,
response_mime_type : "application/json" ,
} ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey, response_mime_type: "application/json" }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const jsonSchema = {
title : "5 popular cookie recipes" ,
description : "List 5 popular cookie recipes." ,
type : "array" ,
items : {
type : "object" ,
properties : {
recipe_name : {
description : "Names of recipe." ,
type : "string" ,
} ,
} ,
} ,
} ;
const res = g . generateContent ( { jsonSchema } ) ;
console . log ( res ) ;
}
Quando este script é executado, o seguinte resultado é obtido.
[
{ "recipe_name" : " Chocolate Chip Cookies " },
{ "recipe_name" : " Peanut Butter Cookies " },
{ "recipe_name" : " Oatmeal Cookies " },
{ "recipe_name" : " Sugar Cookies " },
{ "recipe_name" : " Snickerdoodle Cookies " }
]
Este método pode fazer upload de arquivos com mais de 50 MB.
A partir da v2.xx, isso pode ser alcançado. Isto é da Ref e Ref.
A partir da versão 2.0.3, ao usar este método, inclua propertiesService: PropertiesService.getScriptProperties()
no objeto inicial da seguinte maneira. Porque, quando PropertiesService.getScriptProperties()
é usado na biblioteca, os valores são colocados na biblioteca. Quando criei Ref e Ref, supus que o script fosse usado copiando e colando em vez da biblioteca. Então, incluí PropertiesService.getScriptProperties()
no script. Mas notei que quando isso é usado com GeminiWithFiles, cada usuário é obrigado a usar PropertiesService.getScriptProperties()
. Então, eu modifiquei isso.
O script de amostra é o seguinte.
function myFunction ( ) {
// This URL is from https://github.com/google/generative-ai-docs/blob/main/site/en/gemini-api/docs/prompting_with_media.ipynb
const url = "https://download.blender.org/peach/bigbuckbunny_movies/BigBuckBunny_320x180.mp4" ; // 64,657,027 bytes
const apiKey = "###" ; // Please set your API key.
const q = "Description this video." ;
const g = GeminiWithFiles . geminiWithFiles ( { apiKey , propertiesService : PropertiesService . getScriptProperties ( ) } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey, propertiesService: PropertiesService.getScriptProperties() }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const fileList = g . setFileIdsOrUrlsWithResumableUpload ( [ { url } ] ) . uploadFiles ( ) ;
Utilities . sleep ( 10000 ) ; // This might be required to be used because the state of the uploaded file might not be active.
const res = g . withUploadedFilesByGenerateContent ( fileList ) . generateContent ( { q } ) ;
console . log ( res ) ;
}
Quando este script é executado, o seguinte log pode ser visto no log.
- Get metadata
- Calculate chunks
- Get location
- Download and upload data.
- Now... 1/4
- Start downloading data with 0-16777215
- Finished downloading data with 0-16777215
- Start uploading data with 0-16777215
- Finished uploading data with 0-16777215
- Upload the next chunk.
- Now... 2/4
- Start downloading data with 16777216-33554431
- Finished downloading data with 16777216-33554431
- Start uploading data with 16777216-33554431
- Finished uploading data with 16777216-33554431
- Upload the next chunk.
- Now... 3/4
- Start downloading data with 33554432-50331647
- Finished downloading data with 33554432-50331647
- Start uploading data with 33554432-50331647
- Finished uploading data with 33554432-50331647
- Upload the next chunk.
- Now... 4/4
- Start downloading data with 50331648-64657026
- Finished downloading data with 50331648-64657026
- Start uploading data with 50331648-64657026
- Finished uploading data with 50331648-64657026
- Done.
- Now, the state of the uploaded files "url@https://download.blender.org/peach/bigbuckbunny_movies/BigBuckBunny_320x180.mp4$page@1$maxPage@1" is not active. So, it will wait until it is active. Please wait for 10 seconds. Retry (1/3)
- 1 uploaded files are used with generateCotent.
- The video is a cartoon that shows a large, white rabbit in a field. The rabbit is shown waking up from a nap and then is seen eating an apple. After eating the apple, the rabbit is approached by a bird. The rabbit is scared of the bird and tries to hide from it. The bird flies away. The rabbit is seen smiling and then a squirrel flies toward the rabbit. The squirrel is startled by the rabbit and flies away. The rabbit is then seen catching another squirrel with its vine and the scene ends with a close-up of the rabbit's face.
Se o seu arquivo for grande e o estado do arquivo enviado ainda não for "ATIVO", teste o script a seguir.
function myFunction ( ) {
// This URL is from https://github.com/google/generative-ai-docs/blob/main/site/en/gemini-api/docs/prompting_with_media.ipynb
const url = "https://download.blender.org/peach/bigbuckbunny_movies/BigBuckBunny_320x180.mp4" ; // 64,657,027 bytes
const apiKey = "###" ; // Please set your API key.
const q = "Description this video." ;
const g = GeminiWithFiles . geminiWithFiles ( { apiKey , propertiesService : PropertiesService . getScriptProperties ( ) } ) ; // This is for installing GeminiWithFiles as a library.
// const g = new GeminiWithFiles({ apiKey, propertiesService: PropertiesService.getScriptProperties() }); // This is for directly copying and pasting Class GeminiWithFiles into your Google Apps Script project.
const fileList = g . setFileIdsOrUrlsWithResumableUpload ( [ { url } ] ) . uploadFiles ( ) ;
console . log ( JSON . stringify ( fileList ) ) ;
// Please copy the value of "fileList".
}
Com isso, o arquivo pode ser carregado. E você pode usar o arquivo carregado depois de esperar tempo suficiente para alterar o estado para "ATIVO". O arquivo carregado pode ser usado da seguinte maneira.