Contornando o Limite da API do Notion
O Desafio das Limitações da API
Um dos maiores desafios técnicos que enfrentamos no desenvolvimento do NotionAiAssistant foi lidar com as limitações da API do Notion, especialmente quando precisávamos criar páginas com conteúdo extenso e formatação Markdown.
flowchart TD A[Conteúdo Markdown] --> B{Limitações da API Notion} B -->|Limite de 2000 caracteres por bloco| C[Divisão Inteligente de Conteúdo] B -->|Formatação especial para Markdown| D[Parser de Markdown Personalizado] B -->|Limite de 100 blocos por requisição| E[Envio em Lotes] C --> F[Smart Chunking Algorithm] D --> G[Mapeamento de Markdown para Blocos Notion] E --> H[Fila de Processamento com Retry] F --> I[Resultado Final] G --> I H --> I I --> J[Página Notion com Conteúdo Formatado Completo] style B fill:#f96,stroke:#333,stroke-width:2px style I fill:#9f6,stroke:#333,stroke-width:2px style J fill:#69f,stroke:#333,stroke-width:2px
As Três Principais Limitações
A API do Notion impõe três restrições significativas que afetaram diretamente nossa implementação:
1. Limite de 2000 Caracteres por Bloco de Texto
"Erro: O conteúdo excede o limite máximo de 2000 caracteres por bloco"
Este limite impossibilitava a criação direta de blocos de texto grandes, como artigos, documentações ou relatórios extensos, que são comuns em ambientes produtivos.
2. Necessidade de Formatação Especial para Markdown
O Notion não aceita Markdown puro em sua API. Em vez disso, ele requer uma estrutura específica de blocos com formatação própria, o que tornava complexa a conversão de conteúdo Markdown para o formato esperado pela API.
3. Limite de 100 Blocos por Requisição
"Erro: Número máximo de blocos por requisição excedido (máximo: 100)"
Esta limitação significava que, mesmo após dividir o conteúdo em blocos menores, ainda precisávamos gerenciar múltiplas requisições para conteúdos muito extensos.
Nossa Solução Implementada
Para contornar essas limitações, desenvolvemos uma solução composta por três componentes principais:
1. Divisão Inteligente do Conteúdo
Criamos um algoritmo de "chunking" que:
- Divide o texto em blocos menores que 2000 caracteres
- Respeita a estrutura do conteúdo (parágrafos, listas, códigos)
- Preserva a formatação Markdown durante a divisão
- Lida inteligentemente com elementos como tabelas e imagens
O algoritmo analisa o conteúdo para encontrar pontos de quebra naturais, como finais de parágrafo, para garantir que a divisão não interrompa o fluxo do texto.
def smart_chunk_content(markdown_text, max_length=1900):
# Exemplo simplificado do algoritmo
chunks = []
current_chunk = ""
for line in markdown_text.split('\n'):
# Se adicionar esta linha exceder o limite
if len(current_chunk + line + '\n') > max_length:
# Finaliza o chunk atual e inicia um novo
if current_chunk:
chunks.append(current_chunk)
current_chunk = line + '\n'
else:
# Adiciona a linha ao chunk atual
current_chunk += line + '\n'
# Adiciona o último chunk se não estiver vazio
if current_chunk:
chunks.append(current_chunk)
return chunks
2. Formatação do Markdown para Blocos Estruturados do Notion
Desenvolvemos um parser de Markdown personalizado que:
- Converte elementos Markdown para o formato de blocos do Notion
- Preserva estilos como negrito, itálico, código inline
- Mapeia corretamente cabeçalhos, listas e blocos de código
- Mantém links, imagens e outros elementos complexos
Este parser foi crucial para garantir que o conteúdo mantivesse sua formatação original quando visualizado no Notion.
3. Envio em Lotes Respeitando o Limite de Blocos
Para lidar com o limite de 100 blocos por requisição, implementamos:
- Agrupamento de blocos em lotes de no máximo 100
- Sistema de fila para processar requisições em sequência
- Mecanismo de retry com backoff exponencial para lidar com falhas
- Monitoramento de progresso para operações de longa duração
Resultados e Benefícios
Esta solução nos permitiu:
- Criar páginas no Notion com conteúdo praticamente ilimitado
- Preservar toda a formatação Markdown original
- Oferecer uma experiência fluida para os usuários
- Contornar as limitações da API sem comprometer funcionalidades
Lições Aprendidas
O desenvolvimento desta solução nos ensinou:
- Importância de compreender as limitações de APIs de terceiros antes de iniciar o desenvolvimento
- Valor de algoritmos personalizados para resolver problemas específicos
- Necessidade de testes extensivos com diferentes tipos de conteúdo
- Benefícios de uma abordagem modular que permite ajustes em componentes específicos
Esta solução se tornou um dos diferenciais do NotionAiAssistant, permitindo casos de uso que seriam impossíveis com as limitações padrão da API do Notion.
"As limitações vivem apenas em nossas mentes. Mas se usamos nossa imaginação, nossas possibilidades tornam-se ilimitadas." - Jamie Paolinetti