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.

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.

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:
{
"$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:
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:
curl "$WORKER_URL/documents/manual-alpha" \
--request PUT \
--header "Content-Type: application/pdf" \
--data-binary @manual.pdfEste 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:
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.
Encontre os objetos sem extensão que foram ignorados
Liste os objetos do R2 incluindo
httpMetadata, avance pelas páginas até quetruncatedseja 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 falhasunsupported_type.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 personalizadosx-amz-meta-*nessa verificação, pois eles resolvem outro problema.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-TypeHTTP correto, preservando a chave original sempre que sua ferramenta permitir.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.
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







