2
respostas

[Dúvida] Desafio: Iniciando a simplificação da função

Oi, gostaria de tirar algumas dúvidas sobre alguns retornos que obtive montando o código do desafio.

1 Dúvida:
Neste código, se eu deixar tudo em uma linha dá erro:

    resposta = client.models.generate_content(model="gemini-2.5-flash", contents="Resuma o email em apenas 1 linha:\n" + email)

E se eu deixar dessa forma, não dá erro:

    resposta = client.models.generate_content(
        model="gemini-2.5-flash",
        contents="Resuma o email em apenas 1 linha:\n" + email
    )

2 Dúvida
Eu tive como retorno, mensagem de erro 503 UNAVAILABLE e também 429 RESOURCE_EXHAUSTED.
Como posso corrigir elas?

3 Dúvida
Minha solução gerou apenas 3 retornos usando a função. Saberia me explicar o porquê não gerou sobre os 20 emails?

Segue meu código abaixo:

emails = [
    "Olá João,\nEspero que esteja bem. Segue em anexo o relatório da semana para análise. Caso tenha dúvidas, estou à disposição.\nAbraços,\nMaria",
    "Prezada equipe,\nA reunião de planejamento foi reagendada para quarta-feira às 15h. Conto com a presença de todos para alinharmos os próximos passos.\nAtenciosamente,\nCarlos",
    "Oi Ana,\nParabéns pelo seu aniversário! Desejo muita saúde e felicidade. Que este novo ciclo seja repleto de conquistas.\nCom carinho,\nPaula",
    "Caro cliente,\nSeu pedido foi confirmado e será entregue em até 3 dias úteis. Agradecemos pela confiança em nossa loja.\nEquipe Comercial",
    "Olá Pedro,\nGostaria de confirmar sua presença no workshop de inovação. Será uma ótima oportunidade para trocar experiências.\nAbraços,\nEquipe de Eventos",
    "Bom dia,\nEstamos com uma promoção especial válida até sexta-feira. Aproveite os descontos exclusivos em nossos produtos.\nEquipe Marketing",
    "Oi Lucas,\nSegue o convite para o jantar de confraternização da turma. Será uma noite especial para celebrarmos nossas conquistas.\nFernanda",
    "Prezados,\nO sistema passará por manutenção no sábado das 22h às 2h. Durante esse período, alguns serviços poderão ficar indisponíveis.\nEquipe de TI",
    "Olá,\nSeu cadastro foi concluído com sucesso. Agora você já pode acessar todos os recursos da plataforma.\nEquipe de Suporte",
    "Oi Mariana,\nGostaria de agradecer pela ajuda no projeto. Sua dedicação foi essencial para alcançarmos os resultados.\nAbraços,\nRicardo",
    "Prezada equipe,\nLembrem-se de enviar os relatórios até sexta-feira. Eles são fundamentais para o fechamento do trimestre.\nGestão",
    "Olá,\nEstamos lançando um novo curso online de programação. As inscrições já estão abertas e as vagas são limitadas.\nPlataforma Edu",
    "Oi João,\nConfirmo nossa reunião amanhã às 10h. Será importante para discutirmos os próximos passos do projeto.\nCarla",
    "Caro cliente,\nSua assinatura foi renovada automaticamente. Você continuará tendo acesso a todos os benefícios sem interrupções.\nEquipe Financeira",
    "Olá,\nGostaríamos de convidá-lo para a inauguração da nova loja. Será um evento especial com diversas atrações.\nEquipe Marketing",
    "Oi equipe,\nParabéns pelo excelente resultado deste trimestre. O esforço de todos foi fundamental para atingirmos nossas metas.\nGerência",
    "Prezada Ana,\nSeu exame está disponível para retirada. Caso prefira, podemos enviar por e-mail em formato digital.\nClínica Saúde",
    "Olá,\nEstamos com vagas abertas para estágio. É uma ótima oportunidade para quem deseja iniciar a carreira.\nRH",
    "Oi,\nSegue o link para acessar a gravação da reunião de ontem. Recomendo que assistam para acompanhar os pontos discutidos.\nEquipe Projetos",
    "Caro cliente,\nInformamos que sua fatura já está disponível no portal. O pagamento pode ser realizado online de forma prática.\nFinanceiro"
]

import os
from google.colab import userdata
os.environ["GOOGLE_API_KEY"] = userdata.get('GEMINI_API_KEY_1')
from google import genai
client = genai.Client()

def resumir_email(email):
    resposta = client.models.generate_content(
        model="gemini-2.5-flash",
        contents="Resuma o email em apenas 1 linha:\n" + email
    )
    return resposta.text

for i, email in enumerate(emails, 1):
    resumo = resumir_email(email)
    print(f"Email {i} resumo: {resumo}\n")

Segue um dos retornos que obtive:
Email 1 resumo: Maria enviou o relatório semanal anexo para João analisar.

Email 2 resumo: A reunião de planejamento foi reagendada para quarta-feira às 15h.

Email 3 resumo: Paula deseja feliz aniversário para Ana, com votos de saúde, felicidade e conquistas.

2 respostas

Segue abaixo uma das mensagens de erro que obtive:


ClientError Traceback (most recent call last)
/tmp/ipykernel_3390/1613025433.py in <cell line: 0>()
36
37 for i, email in enumerate(emails, 1):
---> 38 resumo = resumir_email(email)
39 print(f"Email {i} resumo: {resumo}\n")

14 frames
/usr/local/lib/python3.12/dist-packages/google/genai/errors.py in raise_error(cls, status_code, response_json, response)
157 """
158 if 400 <= status_code < 500:
--> 159 raise ClientError(status_code, response_json, response)
160 elif 500 <= status_code < 600:
161 raise ServerError(status_code, response_json, response)

ClientError: 429 RESOURCE_EXHAUSTED. {'error': {'code': 429, 'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits. To monitor your current usage, head to: https://ai.dev/rate-limit. \n* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_free_tier_requests, limit: 20, model: gemini-2.5-flash\nPlease retry in 7.318865275s.', 'status': 'RESOURCE_EXHAUSTED', 'details': [{'@type': 'type.googleapis.com/google.rpc.Help', 'links': [{'description': 'Learn more about Gemini API quotas', 'url': 'https://ai.google.dev/gemini-api/docs/rate-limits'}]}, {'@type': 'type.googleapis.com/google.rpc.QuotaFailure', 'violations': [{'quotaMetric': 'generativelanguage.googleapis.com/generate_content_free_tier_requests', 'quotaId': 'GenerateRequestsPerDayPerProjectPerModel-FreeTier', 'quotaDimensions': {'location': 'global', 'model': 'gemini-2.5-flash'}, 'quotaValue': '20'}]}, {'@type': 'type.googleapis.com/google.rpc.RetryInfo', 'retryDelay': '7s'}]}}

Oi, Thayane!

Que legal ver você praticando o desafio da aula. Esses erros de API e sintaxe são super comuns no dia a dia de quem desenvolve com IA, então vamos resolver ponto a ponto para você continuar sua jornada no curso.

1. Dúvida: Sintaxe de uma linha vs. múltiplas linhas

No Python, o que importa não é apenas se o código está em uma linha, mas sim se ele respeita a indentação e o fechamento de parênteses.

Geralmente, o erro de "uma linha só" acontece se você esqueceu algum parêntese ou se a linha ficou longa demais e o editor se confundiu. Tecnicamente, as duas formas que você mandou deveriam funcionar, desde que não haja quebras de linha soltas no meio do texto sem o uso de parênteses.

Usar múltiplas linhas (como no seu segundo exemplo) é uma boa prática, pois deixa o código mais legível e ajuda a evitar erros bobos de digitação.

2. Dúvida: Erros 503 e 429

Esses erros não são culpa do seu código, mas sim limites do "serviço" (a API do Gemini):

  • 429 RESOURCE_EXHAUSTED: Este é o erro de Cota. Você está usando a versão gratuita, que tem um limite de quantas perguntas você pode fazer por minuto ou por dia. O erro diz claramente: "Please retry in 7.318s" (Tente novamente em 7 segundos). Você "gastou" suas fichas rápido demais.
  • 503 UNAVAILABLE: Significa que o servidor do Google está sobrecarregado ou em manutenção momentânea. É como tentar entrar em uma loja que está com a porta fechada por 5 minutos.

3. Dúvida: Por que só gerou 3 retornos?

Isso está diretamente ligado à dúvida anterior. O seu código usa um laço de repetição (for) que percorre os 20 e-mails.

  1. O código processa o e-mail 1, 2 e 3 com sucesso.
  2. No e-mail 4, ele faz a requisição tão rápido que o Google entende como um "ataque" ou excesso de uso.
  3. A API trava você, envia o erro 429 e o programa para de rodar imediatamente. Por isso os outros 17 e-mails não aparecem.

Uma alternativa:

Pra resolver isso, precisamos ensinar o Python a "ter paciência" e esperar um pouco entre um e-mail e outro. Podemos usar a biblioteca time pra isso.

import time # Importamos para poder dar uma pausa

def resumir_email(email):
    try:
        resposta = client.models.generate_content(
            model="gemini-2.5-flash",
            contents="Resuma o email em apenas 1 linha:\n" + email
        )
        return resposta.text
    except Exception as e:
        # Se der erro de cota, ele nos avisa em vez de travar tudo
        return f"Erro ao processar: {e}"

for i, email in enumerate(emails, 1):
    resumo = resumir_email(email)
    print(f"Email {i} resumo: {resumo}\n")
    
    # Pausa de 4 segundos entre cada e-mail para não estourar a cota gratuita
    time.sleep(4) 

O que mudamos:

  1. import time: Uma biblioteca padrão do Python para lidar com tempo.
  2. time.sleep(4): Colocamos o programa para "dormir" por 4 segundos após cada e-mail. Isso garante que não faremos requisições rápidas demais para a versão gratuita.
  3. try/except (Opcional): Coloquei dentro da função para que, se um e-mail falhar, o programa não pare e tente o próximo.

Tente rodar dessa forma. Continue firme nos estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!