O Gemini é a mais recente tecnologia de inteligência artificial multimodal desenvolvida pelo Google.
Assim como o GPT, o Gemini é capaz de processar e gerar texto de forma contextual e coerente, mas vai além ao integrar capacidades de compreensão de imagens, áudio e vídeo.
A API do Gemini permite que desenvolvedores integrem essas poderosas capacidades de IA em seus projetos, possibilitando uma ampla gama de aplicações, como:
- Geração de texto avançada
- Processamento de áudio e vídeo
- Criação de chatbots e assistentes virtuais multimodais
Neste artigo, exploraremos em detalhes como utilizar o Gemini através da API do Google em Python.
Antes de começar, siga os passos no site oficial do Gemini para criar uma conta e gerar uma API key.
Configure a Variável de Ambiente
Configurar a API key como uma variável de ambiente é uma prática de segurança recomendada:
- No Windows:
set GEMINI_API_KEY=sua_api_key_aqui
- No macOS/Linux:
export GEMINI_API_KEY=sua_api_key_aqui
Alternativamente, adicione esta linha ao seu arquivo .bashrc
ou .zshrc
para torná-la permanente.
No Windows, você também pode definir variáveis de ambiente permanentes através do Painel de Controle.
Instale a Biblioteca do Google Generative AI para Python
A biblioteca oficial do Google para interagir com o Gemini facilita a integração com a API.
Para instalá-la via pip, execute o seguinte comando:
pip install -q -U google-generativeai
Exemplo Básico de Uso Para Gerar Texto Com o Gemini
Vamos criar um exemplo simples para demonstrar como usar o Gemini para gerar texto:
import google.generativeai as genai
import os
# Configure a API key
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
# Parâmetros de geração
generation_config = {
"temperature": 1,
"top_p": 0.95,
"top_k": 64,
"max_output_tokens": 1024,
"response_mime_type": "text/plain",
}
# Parâmetros de moderação da geração
safety_settings = [
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "BLOCK_NONE",
},
]
# Inicialize o modelo
model = genai.GenerativeModel(
model_name="gemini-1.5-flash",
safety_settings=safety_settings,
generation_config=generation_config,
)
# Defina o prompt
prompt = "Qual é a capital do Brasil e por que ela foi escolhida?"
# Gere a resposta
chat_session = model.start_chat()
response = chat_session.send_message(prompt)
# Imprima a resposta
print(response.text)
O código começa importando as bibliotecas necessárias.
A biblioteca google.generativeai
é importada como genai
, que será usada para interagir com os modelos de IA generativa do Google, como o Gemini.
O módulo os
também é importado, pois será usado para acessar variáveis de ambiente.
Em seguida, o código configura a API key para autenticar as requisições ao Gemini.
A chave é obtida da variável de ambiente “GEMINI_API_KEY”, que configuramos previamente, usando a função os.environ
.
O código então define um dicionário chamado generation_config
com parâmetros que controlam como o texto será gerado.
Isso inclui a temperatura, que afeta a aleatoriedade das respostas, os parâmetros top_p
e top_k
que influenciam a diversidade do texto gerado, o número máximo de tokens de saída, e o tipo MIME da resposta.
Estes são os parâmetros padrões da documentação oficial do Gemini.
Nunca precisei alterar esses parâmetros, mas eles estão disponíveis para ajustes conforme necessário.
Após isso, uma lista chamada safety_settings
é criada.
Esta lista contém dicionários que especificam configurações de moderação para diferentes categorias de conteúdo potencialmente prejudicial.
Neste caso, todas as categorias estão configuradas para “BLOCK_NONE”, o que significa que nenhum conteúdo será bloqueado.
Se sua aplicação precisa garantir que o conteúdo gerado seja seguro em algum destes aspectos, você pode passar outros valores que serão mostrados em uma seção posterior.
O código então inicializa o modelo Gemini, especificando o nome do modelo como “gemini-1.5-flash” e aplicando as configurações de moderação e geração definidas anteriormente.
Um prompt é definido com a pergunta “Qual é a capital do Brasil e por que ela foi escolhida?”.
Este será o texto enviado ao modelo para gerar uma resposta.
Uma sessão de chat é iniciada com o modelo usando model.start_chat()
.
Isso permite manter um contexto de conversa se mais mensagens forem enviadas posteriormente.
A mensagem (prompt) é então enviada para o modelo usando chat_session.send_message(prompt)
, e a resposta é armazenada na variável response
.
Finalmente, o texto da resposta gerada pelo modelo é impresso usando print(response.text)
.
Anatomia De Uma Resposta Da API
Quando você faz uma chamada à API do Gemini, a resposta retornada é um objeto rico em informações.
Vamos examinar sua estrutura e entender os atributos mais importantes.
GenerateContentResponse(
done=True,
iterator=None,
result=glm.GenerateContentResponse({
"candidates": [
{
"content": {
"parts": [
{
"text": "A capital do Brasil \u00e9 **Bras\u00edlia**. Ela foi escolhida em 1956, sob o governo de Juscelino Kubitschek, e inaugurada em 1960. A escolha de Bras\u00edlia como capital teve diversos fatores:\n\n* **Centraliza\u00e7\u00e3o pol\u00edtica:** O Brasil era um pa\u00eds com uma grande extens\u00e3o territorial e uma capital, Rio de Janeiro, localizada no litoral. A ideia era criar uma nova capital no interior do pa\u00eds para melhor integrar as diferentes regi\u00f5es e facilitar o acesso do governo \u00e0s diversas \u00e1reas do Brasil. \n* **Desenvolvimento econ\u00f4mico:** A constru\u00e7\u00e3o de Bras\u00edlia impulsionou o desenvolvimento do Centro-Oeste brasileiro, regi\u00e3o que at\u00e9 ent\u00e3o era pouco explorada.\n* **Planejamento urbano:** Bras\u00edlia foi projetada pelo arquiteto L\u00facio Costa e urbanista Oscar Niemeyer como uma cidade moderna, com amplas avenidas, edif\u00edcios imponentes e \u00e1reas verdes. A ideia era criar uma cidade que representasse o futuro do Brasil e que fosse um exemplo de planejamento urbano.\n* **S\u00edmbolo de modernidade:** A constru\u00e7\u00e3o de uma nova capital era um s\u00edmbolo do desenvolvimento e da moderniza\u00e7\u00e3o do Brasil ap\u00f3s a Segunda Guerra Mundial.\n\nA constru\u00e7\u00e3o de Bras\u00edlia foi um projeto ambicioso e desafiador, mas que trouxe muitos benef\u00edcios para o pa\u00eds. A capital se tornou um importante centro pol\u00edtico, econ\u00f4mico e cultural do Brasil, e continua sendo um exemplo de planejamento urbano e arquitetura moderna.\n"
}
],
"role": "model"
},
"finish_reason": 1,
"index": 0,
"safety_ratings": [
{
"category": 9,
"probability": 1,
"blocked": false
},
{
"category": 8,
"probability": 1,
"blocked": false
},
{
"category": 7,
"probability": 1,
"blocked": false
},
{
"category": 10,
"probability": 1,
"blocked": false
}
],
"token_count": 0,
"grounding_attributions": []
}
],
"usage_metadata": {
"prompt_token_count": 15,
"candidates_token_count": 293,
"total_token_count": 308
}
}),
)
Para acessar apenas o texto da resposta, você pode usar:
print(response.text)
O atributo text
contém o texto real da resposta gerada pelo modelo.
Neste caso, é uma explicação detalhada sobre Brasília como capital do Brasil, incluindo os motivos de sua escolha, seus benefícios e seu significado histórico.
Este é o conteúdo principal que seria apresentado ao usuário.
O finish_reason
indica por que a geração de conteúdo foi concluída.
Neste exemplo, o valor é 1, o que significa que o modelo completou a resposta naturalmente, sem ser interrompido por limites de tokens ou outras restrições.
Os safety_ratings
são uma série de avaliações que o modelo faz sobre o conteúdo gerado em relação a diferentes categorias de moderação.
Cada avaliação inclui uma categoria (representada por um número), uma probabilidade e um indicador de bloqueio.
As categorias geralmente correspondem a tipos de conteúdo potencialmente prejudiciais ou indesejados, como discurso de ódio ou conteúdo sexual explícito.
Neste caso, todas as probabilidades são 1 e nenhum conteúdo foi bloqueado, indicando que o modelo considera a resposta segura em todas as categorias avaliadas.
O usage_metadata
fornece informações sobre o uso de tokens, que é importante para entender o consumo de recursos e potenciais custos associados à geração de conteúdo.
Ele inclui a contagem de tokens do prompt (15), a contagem de tokens das respostas candidatas (293), e a contagem total de tokens (308).
Parâmetros Importantes Para a API do Gemini
Ao usar a API do Gemini, você pode ajustar vários parâmetros para controlar o comportamento e a saída do modelo:
Temperatura
A temperature
controla a aleatoriedade da saída do modelo. Os valores variam de 0 a 1.
generation_config = {
"temperature": 1,
}
Uma temperatura mais baixa (próxima de 0) resulta em respostas mais determinísticas, enquanto uma temperatura mais alta produz respostas mais diversas e criativas.
Max Output Tokens
O parâmetro max_output_tokens
controla o comprimento máximo da resposta gerada pelo modelo.
generation_config = {
"max_output_tokens": 100
}
Em aplicações como classificação de texto, onde geralmente queremos apenas um token (como “Sim” ou “Não”), você pode definir max_output_tokens
como 1.
Parâmetros De Moderação De Conteúdo
Ao trabalhar com modelos de linguagem avançados como o Gemini, é crucial ter controle sobre o tipo de conteúdo gerado.
O Google fornece uma série de parâmetros de moderação que permitem ajustar o nível de filtragem de conteúdo potencialmente problemático.
Ao utilizar corretamente estes parâmetros de moderação, você estará no caminho certo para criar aplicações mais seguras e apropriadas, minimizando os riscos associados a conteúdo gerado por IA.
Vamos explorar como configurar esses parâmetros em suas chamadas à API do Gemini.
Categorias de Moderação
O Gemini utiliza quatro categorias principais para classificar conteúdo potencialmente prejudicial:
HARM_CATEGORY_HARASSMENT
: Conteúdo que pode ser considerado assédio ou bullying.HARM_CATEGORY_HATE_SPEECH
: Discurso de ódio ou conteúdo discriminatório.HARM_CATEGORY_SEXUALLY_EXPLICIT
: Conteúdo sexualmente explícito.HARM_CATEGORY_DANGEROUS_CONTENT
: Conteúdo que pode promover ou incentivar atividades perigosas.
Níveis de Bloqueio
Para cada categoria, você pode definir um nível de bloqueio:
BLOCK_NONE
: Não bloqueia nenhum conteúdo nesta categoria.BLOCK_ONLY_HIGH
: Bloqueia apenas conteúdo com alta probabilidade de ser prejudicial.BLOCK_MEDIUM_AND_ABOVE
: Bloqueia conteúdo com probabilidade média ou alta de ser prejudicial.BLOCK_LOW_AND_ABOVE
: Bloqueia qualquer conteúdo com probabilidade baixa, média ou alta de ser prejudicial.
Configurando os Parâmetros de Moderação
Você pode configurar os parâmetros de moderação ao inicializar o modelo Gemini.
safety_settings = [
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE",
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_LOW_AND_ABOVE",
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "BLOCK_ONLY_HIGH",
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE",
},
]
model = genai.GenerativeModel(
model_name="gemini-1.5-flash",
safety_settings=safety_settings
)
Neste exemplo, configuramos diferentes níveis de bloqueio para cada categoria:
- Assédio: Bloqueamos conteúdo com probabilidade média ou alta.
- Discurso de ódio: Bloqueamos qualquer conteúdo, mesmo com baixa probabilidade.
- Conteúdo sexualmente explícito: Bloqueamos apenas conteúdo com alta probabilidade.
- Conteúdo perigoso: Bloqueamos conteúdo com probabilidade média ou alta.
Ao utilizar esses parâmetros de moderação, é importante considerar alguns pontos cruciais.
Primeiramente, busque um equilíbrio entre segurança e utilidade.
Configurações excessivamente restritivas podem limitar a capacidade do modelo de gerar conteúdo útil, enquanto configurações muito permissivas podem resultar em conteúdo inadequado.
O contexto da sua aplicação deve guiar suas escolhas de configuração.
Por exemplo, uma aplicação educacional voltada para crianças pode exigir configurações mais rigorosas em comparação com uma ferramenta para escritores criativos adultos.
Mesmo com filtros bem configurados, é essencial manter um monitoramento constante do conteúdo gerado.
Nenhum sistema de moderação é infalível, e ocasionalmente conteúdo inadequado pode passar pelos filtros.
Implementar um sistema de feedback do usuário pode ser valioso para identificar esses casos e melhorar continuamente a segurança da sua aplicação.
Fique atento a atualizações na API do Gemini.
As categorias e níveis de bloqueio podem ser refinados ou expandidos no futuro, oferecendo opções ainda mais granulares para controle de conteúdo.
A melhor forma de descobrir o nível certo de moderação é testando com uma série de prompts similares aos que o seu modelo receberá em produção e vendo como o modelo se comporta.
Conversas Com Múltiplas Mensagens
O Gemini não se limita apenas a respostas únicas para prompts isolados.
Uma de suas características mais poderosas é a capacidade de manter conversas com múltiplas mensagens, permitindo interações mais naturais e contextualmente ricas.
Esta funcionalidade é particularmente útil para criar chatbots, assistentes virtuais e outras aplicações que exigem um diálogo contínuo.
Como já vimos, para iniciar uma conversa com o Gemini, você primeiro precisa criar uma instância de chat.
Isso é feito usando o método start_chat()
do modelo. Veja como você pode fazer isso:
model = genai.GenerativeModel(model_name='gemini-1.5-flash')
chat = model.start_chat(history=[])
O parâmetro history
é opcional e permite que você inicie a conversa com um histórico predefinido, o que pode ser útil para retomar conversas anteriores ou estabelecer um contexto inicial.
Uma vez que você tenha iniciado um chat, pode enviar mensagens e receber respostas usando o método send_message()
.
Cada mensagem enviada e sua respectiva resposta são automaticamente adicionadas ao histórico da conversa.
response = chat.send_message("Olá, pode me ajudar a planejar uma viagem?")
print("Assistente:", response.text)
response = chat.send_message("Estou pensando em visitar o Japão. Que lugares você recomenda?")
print("Assistente:", response.text)
response = chat.send_message("Ótimas sugestões! Quanto tempo você acha que eu precisaria para visitar esses lugares?")
print("Assistente:", response.text)
Uma das grandes vantagens de usar conversas com múltiplas mensagens é que o Gemini mantém o contexto ao longo da interação.
Isso significa que você pode solicitar esclarecimentos sem precisar repetir informações anteriores. Por exemplo:
response = chat.send_message("Desses lugares que você mencionou, qual é o melhor para ver a cerejeira em flor?")
print("Assistente:", response.text)
Neste caso, o modelo entenderá que “esses lugares” se refere aos locais mencionados em suas respostas anteriores sobre o Japão.
Embora o Gemini gerencie automaticamente o histórico da conversa, às vezes você pode querer acessá-lo ou modificá-lo.
Você pode fazer isso usando o atributo history
do objeto de chat:
# Acessando o histórico completo
for message in chat.history:
print(f"{message.role}: {message.parts[0].text}")
# Limpando o histórico
chat.history = []
Exemplo Prático: Assistente de Planejamento de Viagem
Vamos ver um exemplo mais completo de como você poderia usar conversas com múltiplas mensagens para criar um assistente de planejamento de viagem:
import google.generativeai as genai
import os
# Configurar a API key
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
# Inicializar o modelo e o chat
model = genai.GenerativeModel('gemini-1.5-flash')
chat = model.start_chat(history=[])
def conversar_com_assistente(mensagem):
response = chat.send_message(mensagem)
print("Assistente:", response.text)
return response.text
# Início da conversa
print("Assistente: Olá! Sou seu assistente de planejamento de viagens. Para onde você gostaria de viajar?")
# Loop principal da conversa
while True:
entrada_usuario = input("Você: ")
if entrada_usuario.lower() in ['sair', 'tchau', 'obrigado']:
print("Assistente: Foi um prazer ajudar! Tenha uma ótima viagem!")
break
conversar_com_assistente(entrada_usuario)
# Exibir o histórico da conversa
print("\nHistórico da Conversa:")
for message in chat.history:
print(f"{message.role}: {message.parts[0].text}")
Este exemplo cria um assistente de planejamento de viagem interativo que pode manter uma conversa contínua com o usuário, respondendo a perguntas sobre destinos, fornecendo recomendações e mantendo o contexto ao longo da interação.
Vamos analisar o código fornecido linha por linha, explicando sua funcionalidade e propósito:
model = genai.GenerativeModel('gemini-1.5-flash')
chat = model.start_chat(history=[])
Aqui, inicializamos o modelo Gemini, especificamente o ‘gemini-1.5-flash’, e iniciamos uma nova sessão de chat.
O parâmetro history=[]
indica que estamos começando uma nova conversa sem histórico prévio.
def conversar_com_assistente(mensagem):
response = chat.send_message(mensagem)
print("Assistente:", response.text)
return response.text
Esta função encapsula a lógica de enviar uma mensagem para o assistente e imprimir a resposta.
Ela envia a mensagem para o chat, imprime a resposta precedida por “Assistente:”, e retorna o texto da resposta.
print("Assistente: Olá! Sou seu assistente de planejamento de viagens. Para onde você gostaria de viajar?")
Esta linha imprime a mensagem inicial do assistente, dando as boas-vindas ao usuário e iniciando a conversa sobre planejamento de viagens.
while True:
entrada_usuario = input("Você: ")
if entrada_usuario.lower() in ['sair', 'tchau', 'obrigado']:
print("Assistente: Foi um prazer ajudar! Tenha uma ótima viagem!")
break
conversar_com_assistente(entrada_usuario)
Este é o loop principal da conversa. Ele continua indefinidamente até que o usuário decida sair.
Em cada iteração:
- O programa solicita uma entrada do usuário.
- Se o usuário inserir ‘sair’, ’tchau’ ou ‘obrigado’ (ignorando maiúsculas/minúsculas), o loop é encerrado com uma mensagem de despedida.
- Caso contrário, a entrada do usuário é passada para a função
conversar_com_assistente()
, que envia a mensagem para o Gemini e imprime a resposta.
print("\nHistórico da Conversa:")
for message in chat.history:
print(f"{message.role}: {message.parts[0].text}")
Após o término da conversa, este bloco imprime o histórico completo.
Ele itera sobre todas as mensagens no histórico do chat, imprimindo o papel (role) de quem enviou a mensagem (usuário ou assistente) seguido pelo conteúdo da mensagem.
Trabalhando com Conteúdo Multimodal
Uma das características mais impressionantes do Gemini é sua capacidade de processar e gerar conteúdo multimodal.
Isso significa que o modelo pode entender e trabalhar com várias formas de entrada, incluindo texto e imagens, de maneira integrada.
Para começar a trabalhar com conteúdo multimodal no Gemini, primeiro precisamos configurar o ambiente e importar as bibliotecas necessárias.
Além da biblioteca google.generativeai
, vamos usar a Pillow (PIL) para manipulação de imagens.
Se você ainda não tem a Pillow instalada, pode fazê-lo com o comando pip install pillow
.
import google.generativeai as genai
from PIL import Image
import os
# Configurar a API key
genai.configure(api_key=os.environ["GEMINI_API_KEY"])
# Inicializar o modelo
model = genai.GenerativeModel('gemini-1.5-flash')
Agora que temos o ambiente configurado, podemos começar a explorar as capacidades multimodais do Gemini.
Vamos ver alguns exemplos práticos de como podemos usar o modelo para analisar imagens e responder perguntas sobre elas.
Imagine que você queira desenvolver um aplicativo de assistência para turistas.
Um recurso útil seria a capacidade de analisar fotos de pontos turísticos e fornecer informações sobre eles.
def analisar_imagem(caminho_imagem, pergunta):
imagem = Image.open(caminho_imagem)
resposta = model.generate_content([pergunta, imagem])
print(resposta.text)
# Exemplo de uso
analisar_imagem('torre_eiffel.jpg', 'Que monumento é este e em que cidade ele está localizado?')
Neste exemplo, a função analisar_imagem
recebe o caminho de uma imagem e uma pergunta sobre ela.
O Gemini analisa a imagem e responde à pergunta baseando-se no conteúdo visual.
Mas ele não se limita apenas a identificar objetos em imagens.
Ele pode realizar análises mais complexas e responder a perguntas que requerem um entendimento mais profundo do contexto visual.
Por exemplo:
analisar_imagem('pintura_renascentista.jpg', 'Descreva o estilo artístico desta pintura e mencione algumas características típicas deste período que você pode observar na imagem.')
"""
A pintura é um exemplo do Alto Renascimento, um período que se estendeu do final do século XV ao início do século XVI. O estilo característico do Alto Renascimento é marcado pelo interesse em naturalismo, perspectiva linear, clareza de forma e equilíbrio compositivo.
Na obra "A Criação de Adão", algumas características típicas do período podem ser observadas:
* **Naturalismo:** As figuras são representadas com grande realismo, com anatomia precisa e expressão facial convincente.
* **Perspectiva linear:** A perspectiva é utilizada para criar a ilusão de profundidade, conduzindo o olhar do observador para o ponto de encontro entre Deus e Adão.
* **Composição equilibrada:** A obra possui uma composição simétrica e harmoniosa, com as figuras dispostas em linhas diagonais que convergem para o centro da pintura.
* **Clareza de forma:** As formas são definidas de maneira clara e precisa, com contornos nítidos que delimitam os volumes.
A obra é também um exemplo da maestria de Michelangelo, que utilizou o conhecimento da anatomia humana e da perspectiva para criar uma obra impactante e poderosa.
"""
Neste caso, enviei uma imagem da obra “A Criação de Adão” e o modelo não apenas identificou o que está na imagem, mas também aplicou conhecimentos de história da arte para fornecer uma análise mais rica.
Uma aplicação no marketing, por exemplo, é criar legendas descritivas para imagens:
def criar_legenda(caminho_imagem):
imagem = Image.open(caminho_imagem)
prompt = "Crie uma legenda descritiva e envolvente para esta imagem, adequada para uso em redes sociais."
resposta = model.generate_content([prompt, imagem])
print(resposta.text)
criar_legenda('paisagem_montanha.jpg')
Esta função poderia ser integrada a um aplicativo de gerenciamento de conteúdo para redes sociais, automatizando parte do processo de criação de posts.
Conclusão
O Gemini do Google representa um avanço significativo na tecnologia de IA, oferecendo capacidades multimodais que abrem um leque de possibilidades para desenvolvedores e empresas.
Além disso, o Gemini 1.5 Flash oferece estas capacidades com baixa latência e um dos menores preços do mercado.
Através da API em Python, é possível integrar facilmente essas funcionalidades em diversos tipos de aplicações, desde assistentes virtuais até ferramentas de análise de imagem e geração de conteúdo.
Neste artigo, exploramos:
- Como configurar e utilizar a API do Gemini em Python
- A estrutura das respostas da API e como interpretá-las
- Parâmetros importantes para controlar a geração de conteúdo
- Configurações de moderação para garantir a segurança do conteúdo gerado
- Como manter conversas com múltiplas mensagens
- O potencial do processamento multimodal, combinando texto e imagem
A versatilidade do Gemini permite sua aplicação em uma ampla gama de cenários, desde o desenvolvimento de chatbots inteligentes até a criação de ferramentas de análise visual avançada.
À medida que a tecnologia continua a evoluir, podemos esperar ainda mais recursos e aprimoramentos que expandirão ainda mais as possibilidades de uso da IA generativa.
Ao integrar o Gemini em seus projetos, lembre-se que estes modelos possuem diversas limitações, como alucinações, que devem ser monitoradas e corrigidas.
Com o conhecimento adquirido neste artigo, você está bem equipado para começar a explorar e implementar as capacidades do Gemini em suas próprias aplicações.
Seja o primeiro a saber das novidades em Machine Learning. Me siga no LinkedIn.