Cloudflare R2: arquivos sem extensão já entram no AI Search

O Cloudflare R2 agora permite indexar arquivos sem extensão no AI Search via Content-Type. Veja o que muda na ingestão, os custos e como validar.

Saturday, September 12, 2026Omid Saffari
Cloudflare R2: arquivos sem extensão já entram no AI Search

O Cloudflare AI Search eliminou, em 11 de setembro de 2026, um obstáculo para ingerir arquivos do Cloudflare R2: o nome do arquivo. Se os documentos ficam sob chaves estáveis e sem extensão, agora você pode preservar essas chaves e tornar os objetos pesquisáveis salvando em cada um deles um Content-Type HTTP compatível.

Com isso, uma etapa de renomeação pode sair do fluxo de ingestão. O trabalho de corrigir metadados, indexar e confirmar que o documento realmente chegou à busca continua necessário.

O que mudou, na prática

O Cloudflare AI Search é um serviço gerenciado de busca no seu próprio conteúdo. Uma das formas de alimentá-lo é conectar um bucket R2, o armazenamento de objetos da Cloudflare. O AI Search lê o bucket, converte documentos compatíveis em texto pesquisável e monta o índice consultado pelo seu aplicativo.

Antes desta atualização, o caminho seguro para detectar o formato dependia da extensão no nome. Uma chave como manual.pdf informa ao indexador o tipo do arquivo. Já uma chave estável como documents/manual-alpha não traz essa pista.

Agora, o AI Search também consegue usar o Content-Type HTTP comum de um objeto sem extensão. application/pdf indica que os bytes formam um PDF; text/markdown, que se trata de Markdown. A Cloudflare também inclui text/plain, application/json, text/html e text/csv entre os tipos compatíveis.

As extensões de arquivo não deixaram de valer. A Cloudflare ainda considera uma extensão reconhecida o caminho preferencial e mais rápido para detectar o formato. A novidade faz diferença quando trocar a chave quebraria URLs, referências no banco de dados, associações de tenants, assinaturas ou um contrato de upload que já está em produção.

Há uma distinção importante aqui. Content-Type é um metadado HTTP do objeto no R2. Não é o metadado personalizado que o AI Search usa em filtros como categoria, cliente ou status do documento. Esses campos personalizados viajam em cabeçalhos x-amz-meta-* e precisam de um schema no AI Search. Adicionar x-amz-meta-content-type não substitui o campo HTTP verdadeiro.

Esta atualização muda a ingestão na fonte, ou seja, o ponto em que o documento entra no índice. Ela não altera o modelo que redige a resposta depois da recuperação. A atualização para o GLM-5.3 Flash atua nessa etapa posterior de geração.

Cloudflare R2: uma convenção de nomes a menos

Chaves opacas são comuns por bons motivos. Um produto pode usar um ID estável do banco de dados como chave no R2 para que o objeto mude sem trocar de endereço. Um serviço de documentos pode evitar a exposição do nome original enviado pelo cliente. Uma URL assinada pode depender da chave exata.

A solução anterior era criar, para a cópia destinada à busca, um nome com extensão ou incluir uma etapa de renomeação antes que o AI Search encontrasse o objeto. Isso gera mais uma identidade para armazenar, conciliar e remover.

Com a atualização, a chave original pode permanecer intacta quando seus metadados HTTP já estão corretos. Essa é a redução de trabalho que realmente importa no fluxo.

Veja uma estimativa do trabalho de ingestão antes e depois. Trata-se de um modelo de processo, não de um benchmark medido nem de uma economia prometida.

SituaçãoTrabalho antes desta versãoTrabalho agoraTrabalho que permanece
Novo upload sem extensãoGravar o objeto, criar um nome com extensão para a busca, indexar, verificarGravar o objeto com um Content-Type compatível, indexar, verificarValidar o tipo e verificar
Objeto existente com metadados HTTP válidosCriar ou manter o nome para a busca, indexar, verificarPreservar a chave, sincronizar, verificarSincronizar e verificar
Objeto existente com metadados HTTP ausentes ou incorretosContornar a falta do tipo renomeando, indexar, verificarAuditar, corrigir os metadados, sincronizar, verificarExecutar a correção e verificar
Modelo arquitetônico em que um objeto R2 sem extensão passa pela validação de Content-Type e entra no índice do AI Search sem que sua chave mude
A chave pode continuar a mesma. Um Content-Type HTTP compatível passa a indicar o formato do arquivo; depois, o objeto ainda precisa ser sincronizado e validado.

A tabela, de propósito, não estima economia em dólares. A Cloudflare não publicou uma redução de tempo para este recurso, e a versão também não reescreve os metadados existentes por conta própria.

Quanto custa o trabalho que continua

O AI Search é gratuito durante o beta aberto, dentro dos limites do seu plano Workers. O armazenamento e a indexação vetorial estão incluídos. O uso de Workers AI e AI Gateway ainda pode ser cobrado separadamente, mas esta mudança na ingestão não altera essas tarifas.

A correção de metadados pode aparecer na conta do R2. ListObjects, PutObject e CopyObject contam como operações Class A. Já HeadObject e GetObject, que uma ferramenta de correção pode usar para inspecionar ou ler um objeto, contam como operações Class B.

No armazenamento Standard, as solicitações Class A custam $4.50 por milhão depois da franquia mensal de 1 milhão. O Infrequent Access não tem franquia gratuita e cobra $9.00 por milhão de solicitações Class A. Ele também pode cobrar $0.01 por GB quando os objetos são lidos ou copiados.

Daí vem a regra realista de orçamento. Um objeto com Content-Type correto não exige nenhuma correção específica de nome. Se o valor estiver errado, talvez ainda seja necessário gravar ou copiar o objeto, conforme a ferramenta escolhida. Conte essas operações antes de programar a limpeza do bucket inteiro.

A escala também pesa no lado do AI Search. O limite por instância é de 100,000 arquivos no Workers Free. O Workers Paid aceita 1 milhão de arquivos, ou 500,000 quando a busca híbrida está ativada. O limite de 4 MB por arquivo é o mesmo nos dois planos.

Quem já pode aproveitar isso

Quem toca um SaaS sozinho e usa IDs estáveis nos uploads

Mantenha como chave no R2 o mesmo valor que seu banco de dados já armazena e faça o uploader anexar o tipo MIME real ao gravar o objeto. Assim, a busca de suporte consegue ingerir o mesmo objeto sem uma segunda coluna de nome de arquivo nem um job em lote para criar cópias destinadas à busca.

O ganho está em conciliar menos identidades quando um cliente substitui, exclui ou move um documento. Ainda assim, o upload precisa rejeitar um tipo binário genérico quando o objeto deve se tornar pesquisável.

Quem cuida de plataforma e herdou um bucket antigo

Liste os objetos sem extensão junto com seus metadados HTTP, compare cada valor com os tipos MIME aceitos pela Cloudflare e isole as falhas. Corrija uma pequena amostra antes de mexer no bucket inteiro.

O resultado é uma migração com escopo controlado. O orçamento de correção fica restrito aos objetos que precisam dela, enquanto as chaves com metadados válidos seguem direto para sincronização e verificação.

Uma equipe de produto multi-tenant

Preserve chaves de objeto opacas que não revelem o nome original do arquivo e defina o Content-Type a partir de uma verificação confiável no servidor durante o upload. Configure separadamente os filtros de caminho ou prefixos do AI Search quando cada tenant precisar de seu próprio limite de indexação.

O benefício é manter a arquitetura coerente. A identidade no armazenamento continua independente da apresentação do arquivo, e o indexador ainda recebe um tipo que consegue validar.

Uma agência que opera bases de conhecimento de clientes

Separe as duas funções dos metadados no runbook. O Content-Type HTTP determina se um arquivo sem extensão pode ser ingerido. Os campos personalizados x-amz-meta-* definem como filtrar os resultados indexados depois que o schema é configurado.

Isso simplifica o diagnóstico. Quando um documento some, a equipe verifica os metadados de ingestão antes de alterar as regras de filtro ou o modelo de resposta.

Como indexar arquivos do Cloudflare R2 sem extensão

A API do R2 para Workers aceita cabeçalhos da solicitação no campo httpMetadata. O Worker abaixo preserva o caminho da solicitação como chave do objeto e recusa uploads que chegam sem Content-Type.

Vincule um bucket R2 como DOCS no wrangler.jsonc:

Jsonc
{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "name": "r2-document-upload",
  "main": "src/index.ts",
  "compatibility_date": "2026-09-11",
  "r2_buckets": [
    {
      "binding": "DOCS",
      "bucket_name": "your-bucket"
    }
  ]
}

Depois, use este Worker:

TypeScript
interface Env {
  DOCS: R2Bucket;
}

export default {
  async fetch(request, env): Promise<Response> {
    if (request.method !== "PUT") {
      return new Response("Method Not Allowed", { status: 405 });
    }

    const key = new URL(request.url).pathname.replace(/^\//, "");
    const contentType = request.headers.get("content-type");

    if (!key || !contentType) {
      return new Response("Key and Content-Type are required");
    }

    await env.DOCS.put(key, request.body, {
      httpMetadata: request.headers,
    });

    return new Response(`Stored ${key}`);
  },
} satisfies ExportedHandler<Env>;

Execute npx wrangler dev, defina WORKER_URL como o endereço local exibido pelo Wrangler e envie um PDF local para um destino sem extensão:

Bash
curl "$WORKER_URL/documents/manual-alpha" \
  --request PUT \
  --header "Content-Type: application/pdf" \
  --data-binary @manual.pdf

Este exemplo comprova apenas a parte do armazenamento, não a indexação. Em produção, adicione autorização, determine o tipo com uma inspeção confiável em vez de confiar apenas no nome fornecido pelo usuário e compare o resultado com a lista de formatos compatíveis da Cloudflare.

O ponto crítico: upload concluído não significa arquivo pesquisável

As gravações no R2 são fortemente consistentes, portanto o objeto e seus metadados ficam visíveis depois de uma gravação bem-sucedida. A indexação no AI Search é um job assíncrono separado. Uma solicitação de sincronização pode ser aceita e, ainda assim, o item falhar mais tarde.

Por padrão, as instâncias apoiadas no R2 sincronizam a cada 6 horas. Você pode escolher um intervalo de 1, 2, 4, 6, 12 ou 24 horas, ou iniciar um job manualmente:

Bash
npx wrangler ai-search jobs create <INSTANCE_NAME>

As sincronizações manuais da fonte podem rodar, no máximo, uma vez a cada 30 segundos. Repetir a tentativa não corrige metadados inválidos.

Depois do job, confira os logs dos itens, os detalhes de cada item ou as estatísticas da instância. unsupported_type é o erro no nível do item que importa quando o AI Search não aceita o formato detectado. Corrija o objeto e sincronize novamente esse item ou a fonte.

Nada muda para quem já usa uma extensão reconhecida em todas as chaves do R2. O mesmo vale se a fonte do AI Search for um site ou o armazenamento integrado, e não um bucket R2 externo. A atualização não torna indexável um formato incompatível nem um arquivo grande demais.

O plano para segunda-feira

Comece com uma auditoria, não com uma regravação em massa.

  1. Encontre os objetos sem extensão que foram ignorados

    Liste os objetos do R2 incluindo httpMetadata, avance pelas páginas até que truncated seja false e isole as chaves cujo último segmento do caminho não tem extensão. Cruze essas chaves com os logs de itens do AI Search e as falhas unsupported_type.

  2. Classifique os metadados

    Separe os tipos MIME compatíveis dos valores ausentes, malformados, incompatíveis ou definidos como application/octet-stream. Não inclua os campos personalizados x-amz-meta-* nessa verificação, pois eles resolvem outro problema.

  3. Corrija uma pequena importação

    Escolha uma amostra pequena e representativa dos formatos que você realmente armazena. Grave ou copie cada objeto com o Content-Type HTTP correto, preservando a chave original sempre que sua ferramenta permitir.

  4. Sincronize e comprove a recuperação

    Inicie uma única sincronização da fonte. Aguarde a conclusão dos itens, inspecione os logs e pesquise uma frase conhecida dentro de cada documento. Uma gravação bem-sucedida no armazenamento não encerra o trabalho. A prova é receber um trecho da fonte nos resultados.

  5. Só amplie depois da comprovação

    Estime quantas operações Class A e Class B seu método de correção vai gerar, confirme a classe de armazenamento do R2 e só então amplie o lote. Atualize o uploader ao mesmo tempo para que novos objetos sem extensão já cheguem com metadados compatíveis.

Tome uma providência nesta semana se as chaves estáveis ou opacas do R2 obrigaram você a manter um segundo caminho de nomes para o AI Search. Espere se os objetos atuais não têm informações de tipo confiáveis, pois será preciso definir uma estratégia de classificação antes de regravá-los. Não faça nada se extensões reconhecidas já sustentam seu fluxo de ingestão sem problemas.

Se você quer receber a próxima mudança de plataforma já convertida em uma decisão operacional, assine a newsletter.

Última atualização
12 de set. de 2026
Categoria
Explained

Prefira este site no Google

Adicionar omidsaffari.com como fonte preferida na Busca do Google

Marque omidsaffari.com como fonte preferida e o Google destaca o site para você em Top Stories, AI Overviews e AI Mode.

Vercel Sandbox dobra o espaço para jobs maiores de agentes

Vercel Sandbox dobra o espaço para jobs maiores de agentes

Entenda quais jobs de repositório, build e dados agora cabem no Vercel Sandbox e o que medir antes de repetir uma execução que exige muito disco.12 de set. de 2026Explained
Cloudflare Workflows: retenção curta sem perder evidências

Cloudflare Workflows: retenção curta sem perder evidências

Entenda o novo padrão de 7 dias no Cloudflare Workflows, separe retenção de sucesso e erro e estime custos sem perder evidências operacionais.11 de set. de 2026Explained
Dashboard com IA: como o ChatGPT Data reduz as idas e vindas do relatório semanal

Dashboard com IA: como o ChatGPT Data reduz as idas e vindas do relatório semanal

Veja como usar o ChatGPT Data para criar um dashboard com IA, reduzir o retrabalho em relatórios semanais e manter métricas e aprovações sob controle.11 de set. de 2026Explained
IA para programar em equipe: Cursor Projects na prática

IA para programar em equipe: Cursor Projects na prática

Veja como o Cursor Projects coordena agentes, compartilha contexto e leva o gargalo da execução à revisão, com um plano de piloto, custos e limites.11 de set. de 2026Explained
Codex ChatGPT: como o Deep Research usa o orçamento do Work

Codex ChatGPT: como o Deep Research usa o orçamento do Work

Entenda por que o Deep Research no ChatGPT Work usa a mesma franquia ou os mesmos créditos do Codex e como acompanhar o custo de cada entrega.10 de set. de 2026Explained
Vercel pricing: proteção de site privado custa $0 ou $20 por projeto

Vercel pricing: proteção de site privado custa $0 ou $20 por projeto

Vercel pricing mudou: veja quando a proteção de produção custa $0, quando a senha sai por $20 por projeto e como comparar com o plano de $150.10 de set. de 2026Explained
Planos ChatGPT: o custo real de usar voz no trabalho

Planos ChatGPT: o custo real de usar voz no trabalho

Compare os planos ChatGPT pelos limites de voz: 3 horas no Go e Plus, 15 horas no Pro de $100 e uso ilimitado no Pro de $200; entenda o fim do fallback mini.9 de set. de 2026Explained
Vercel pricing: como funciona a cobrança fixa do Flat Rate CDN

Vercel pricing: como funciona a cobrança fixa do Flat Rate CDN

Vercel pricing em detalhes: veja como o Flat Rate CDN fixa a capacidade mensal, absorve picos temporários e quando a cobrança pode subir no ciclo seguinte.9 de set. de 2026Explained
Newsletter

Uma carta, todo domingo.Sistemas que funcionam, não hot takes.

Semanal. Sem spam. Cancele quando quiser.