Cloudflare AI Search: как убрать переименование файлов R2 из конвейера

Cloudflare AI Search индексирует файлы R2 без расширения по HTTP Content-Type. Разбираем новый процесс, стоимость исправления метаданных и проверку поиска.

Saturday, September 12, 2026Omid Saffari
Cloudflare AI Search: как убрать переименование файлов R2 из конвейера

Cloudflare AI Search 11 сентября 2026 года устранил проблему с именами файлов при загрузке данных из R2 в индекс. Если документы хранятся под стабильными ключами без расширения, теперь их не нужно менять: достаточно сохранить для каждого объекта поддерживаемый HTTP Content-Type, и содержимое станет доступно для поиска.

Из процесса загрузки можно убрать отдельный этап переименования. Но по-прежнему придётся привести в порядок метаданные, запустить индексацию и убедиться, что документ действительно появился в поиске.

Cloudflare AI Search — управляемый сервис поиска по собственному контенту. Один из способов передать ему данные — подключить бакет R2, объектное хранилище Cloudflare. AI Search читает содержимое бакета, преобразует поддерживаемые документы в текст для поиска и строит индекс, к которому приложение обращается с запросами.

До этого обновления надёжное определение формата зависело от расширения в имени файла. По ключу вроде manual.pdf индексатор понимает, с чем работает. Стабильный ключ вроде documents/manual-alpha такой подсказки не даёт.

Теперь для объекта без расширения AI Search может взять тип из обычного HTTP-заголовка Content-Type. Значение application/pdf сообщает, что внутри PDF, а text/markdown — что Markdown. В перечень поддерживаемых типов Cloudflare также включает text/plain, application/json, text/html и text/csv.

Расширения файлов никуда не делись. Cloudflare по-прежнему называет распознаваемое расширение предпочтительным и более быстрым способом определения формата. Новый вариант нужен там, где смена ключа нарушила бы работу URL, ссылок в базе данных, привязок арендаторов, подписей или уже действующего контракта загрузки.

Здесь важно не смешивать два вида данных. Content-Type — это HTTP-метаданные объекта R2. Это не те пользовательские метаданные, по которым AI Search фильтрует результаты, например по категории, клиенту или статусу документа. Пользовательские поля передаются в заголовках x-amz-meta-*, и для них в AI Search нужна схема. Поле x-amz-meta-content-type не заменяет настоящий HTTP-заголовок.

Обновление относится к загрузке источника — этапу, на котором документ попадает в индекс. Оно не меняет модель, формирующую ответ после извлечения данных. Обновление GLM-5.3 Flash работает уже на этом, более позднем этапе генерации.

Практический результат: одной системой имён меньше

Непрозрачные ключи используют не случайно. Продукт может хранить объект R2 под стабильным идентификатором из базы данных, чтобы содержимое менялось без смены адреса. Сервис документов может не раскрывать исходное имя клиентского файла. А подписанный URL может зависеть от точного ключа.

Раньше приходилось создавать для поисковой копии имя с расширением или добавлять этап переименования до передачи объекта в AI Search. Так появлялся ещё один идентификатор, который нужно хранить, сверять и затем очищать.

Теперь исходный ключ можно оставить на месте, если HTTP-метаданные уже корректны. В этом и состоит реальное упрощение процесса.

Ниже — оценка процесса загрузки до и после обновления. Это модель работ, а не измеренный бенчмарк и не обещанная экономия.

СценарийЧто требовалось до выпускаЧто нужно теперьЧто всё ещё нужно сделать
Новая загрузка без расширенияЗаписать объект, создать для поиска имя с расширением, проиндексировать, проверитьЗаписать объект с поддерживаемым Content-Type, проиндексировать, проверитьПроверить тип и результат
Существующий объект с корректными HTTP-метаданнымиСоздать или поддерживать поисковое имя, проиндексировать, проверитьСохранить ключ, синхронизировать, проверитьСинхронизировать и проверить
Существующий объект с неверными или отсутствующими HTTP-метаданнымиКомпенсировать отсутствие типа переименованием, проиндексировать, проверитьПровести аудит, исправить метаданные, синхронизировать, проверитьВыполнить исправление и проверку
Архитектурная схема: объект R2 без расширения проходит проверку Content-Type и попадает в индекс AI Search, а его ключ остаётся прежним
Ключ можно не менять. Поддерживаемый HTTP Content-Type становится сигналом о типе файла, после чего объект всё равно нужно синхронизировать и проверить.

В таблице намеренно нет денежной оценки. Cloudflare не сообщала, сколько времени экономит эта функция, и обновление не исправляет уже существующие метаданные автоматически.

Во сколько обойдутся оставшиеся работы

Во время открытого бета-тестирования AI Search доступен бесплатно в пределах ограничений тарифа Workers. Хранение и векторная индексация включены. Использование Workers AI и AI Gateway по-прежнему может тарифицироваться отдельно, но это изменение процесса загрузки на их ставки не влияет.

Исправление метаданных может отразиться на счёте за R2. Операции ListObjects, PutObject и CopyObject относятся к Class A. Операции HeadObject и GetObject, которые инструмент исправления может использовать для проверки или чтения объекта, относятся к Class B.

В классе Standard запросы Class A стоят $4.50 за миллион после ежемесячного бесплатного лимита в 1 миллион. Для Infrequent Access бесплатного уровня нет, а миллион запросов Class A стоит $9.00. Кроме того, при чтении или копировании объектов может взиматься $0.01 за GB.

Отсюда следует простой принцип расчёта. Объект с корректным Content-Type не требует исправлений ради переименования. При неверном значении всё ещё может понадобиться запись или копирование — это зависит от выбранного инструмента. Перед очисткой всего бакета посчитайте такие операции.

Масштаб важен и для AI Search. Лимит одного экземпляра на Workers Free — 100,000 файлов. Workers Paid допускает 1 миллион файлов или 500,000 при включённом гибридном поиске. Ограничение в 4 MB на файл одинаково для обоих тарифов.

Кому это пригодится уже завтра

Основателю SaaS со стабильными идентификаторами загрузок

Оставьте в качестве ключа R2 тот идентификатор, который уже хранится в базе данных, а загрузчик пусть записывает фактический MIME-тип вместе с объектом. Тогда поиск по материалам поддержки сможет проиндексировать тот же объект без второй колонки с именем файла и без пакетной задачи по созданию поисковых копий.

Сопоставлять идентификаторы при замене, удалении или перемещении клиентского документа придётся реже. При этом загрузчик всё равно должен отклонять универсальный бинарный тип, если объект предназначен для поиска.

Платформенному инженеру с унаследованным бакетом

Получите список объектов без расширения вместе с их HTTP-метаданными, сравните значения с перечнем поддерживаемых MIME-типов Cloudflare и отделите ошибки. Сначала исправьте небольшую выборку, а уже затем переходите ко всему бакету.

Так миграция останется управляемой: бюджет на исправление уйдёт только на проблемные объекты, а ключи с корректными метаданными можно сразу отправить на синхронизацию и проверку.

Команде мультитенантного продукта

Сохраните непрозрачные ключи объектов, которые не раскрывают исходные имена файлов, а во время загрузки устанавливайте Content-Type по результатам надёжной серверной проверки. Если каждому арендатору нужна отдельная граница индексации, независимо настройте в AI Search фильтры путей или префиксы.

Так архитектура остаётся последовательной: идентификатор в хранилище не зависит от того, как файл показывается пользователю, а индексатор всё равно получает тип, который способен проверить.

Агентству, которое обслуживает клиентские базы знаний

Разделите в регламенте две задачи с метаданными. HTTP Content-Type определяет, сможет ли файл без расширения попасть в индекс. Пользовательские поля x-amz-meta-* определяют, как фильтровать уже проиндексированные результаты после задания их схемы.

Так проще искать причину сбоя. Если документ отсутствует, команда сначала проверяет метаданные загрузки, а не меняет правила фильтрации или модель генерации ответа.

Как отправить объект без расширения по поддерживаемому пути

API R2 для Workers принимает заголовки запроса через httpMetadata. Worker ниже сохраняет путь запроса как ключ объекта и отклоняет загрузки без Content-Type.

Подключите бакет R2 под именем DOCS в 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"
    }
  ]
}

Затем используйте этот 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>;

Запустите npx wrangler dev, присвойте WORKER_URL локальный адрес, который выведет Wrangler, а затем загрузите локальный PDF по адресу без расширения:

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

Этот пример подтверждает только запись в хранилище, но не индексацию. В рабочей среде добавьте авторизацию, определяйте тип по результатам надёжной проверки содержимого, а не только по имени файла от пользователя, и сверяйте его со списком Cloudflare.

Почему успешная загрузка ещё не означает, что файл доступен в поиске

Операции записи в R2 обладают строгой согласованностью, поэтому после успешной записи объект и его метаданные становятся видимыми. Но индексация AI Search — отдельная асинхронная задача. Запрос на синхронизацию могут принять, а обработка элемента всё равно завершится ошибкой позднее.

Экземпляры с источником R2 синхронизируются по умолчанию каждые 6 часов. Можно выбрать интервал 1, 2, 4, 6, 12 или 24 часа либо запустить задачу самостоятельно:

Bash
npx wrangler ai-search jobs create <INSTANCE_NAME>

Ручную синхронизацию источника можно запускать не чаще одного раза в 30 секунд. Дополнительные попытки не исправят неверные метаданные.

После завершения задачи проверьте журналы и сведения об элементах либо статистику экземпляра. Ошибка уровня элемента unsupported_type означает, что AI Search не смог принять определённый тип файла. Исправьте объект, затем снова синхронизируйте этот элемент или весь источник.

Если у всех ключей R2 уже есть распознаваемые расширения, обновление вас не затрагивает. То же верно, если источником AI Search служит сайт или встроенное хранилище, а не внешний бакет R2. Неподдерживаемый формат или слишком большой файл после этого изменения не станет пригодным для индексации.

Что сделать в первую очередь

Начните с аудита, а не с массовой перезаписи.

  1. Найдите пропущенные объекты без расширения

    Получите список объектов R2 вместе с httpMetadata, переходите по страницам, пока значение truncated не станет равным false, и выделите ключи, у которых в последнем сегменте пути нет расширения. Сверьте их с журналами элементов AI Search и ошибками unsupported_type.

  2. Классифицируйте метаданные

    Разделите поддерживаемые MIME-типы и отсутствующие, некорректные, неподдерживаемые значения, а также application/octet-stream. Не включайте в эту проверку пользовательские поля x-amz-meta-*: они решают другую задачу.

  3. Исправьте небольшую тестовую выборку

    Подберите небольшой репрезентативный набор форматов, которые действительно хранятся в бакете. Запишите или скопируйте каждый объект с правильным HTTP Content-Type, сохранив исходный ключ там, где это допускает ваш инструмент.

  4. Синхронизируйте и проверьте поиск

    Запустите одну синхронизацию источника. Дождитесь завершения обработки элементов, изучите их журналы, а затем найдите известную фразу внутри каждого документа. Успешная запись в хранилище — ещё не финиш. Доказательством служит найденный фрагмент исходного текста.

  5. Расширяйте пакет только после проверки

    Оцените число операций Class A и Class B, которые создаст выбранный способ исправления, уточните класс хранения R2 и только затем увеличивайте пакет. Одновременно обновите загрузчик, чтобы новые объекты без расширения сразу получали поддерживаемые метаданные.

Действуйте на этой неделе, если из-за стабильных или непрозрачных ключей R2 вам приходилось поддерживать отдельную систему имён для AI Search. Подождите, если у существующих объектов нет достоверных данных о типе: сначала понадобится план классификации. Ничего менять не нужно, если распознаваемые расширения уже обеспечивают корректную загрузку в индекс.

Если хотите получать такие же практические разборы следующих изменений платформ, подпишитесь на рассылку.

Последнее обновление
12 сент. 2026 г.
Категория
Explained

Сделать этот сайт предпочтительным в Google

Добавить omidsaffari.com как предпочтительный источник в Google Поиске

Отметьте omidsaffari.com как предпочтительный источник — и Google будет поднимать его для вас в Top Stories, AI Overviews и AI Mode.

Похожие статьи
Vercel Sandbox: как 64 GB меняют сборки и задачи ИИ-агентов

Vercel Sandbox: как 64 GB меняют сборки и задачи ИИ-агентов

Vercel Sandbox получил 64 GB рабочего диска. Разбираем, какие сборки и задачи ИИ-агентов теперь помещаются в одну среду и как считать расходы.12 сент. 2026 г.Explained
Cloudflare Workflows: как настроить хранение истории запусков

Cloudflare Workflows: как настроить хранение истории запусков

В Cloudflare Workflows состояние новых платных Workflow теперь по умолчанию хранится 7 дней. Как выбрать сроки для ошибок, расследований и расчёта затрат.11 сент. 2026 г.Explained
Автоматизация отчетности с ChatGPT Data: меньше ручной работы каждую неделю

Автоматизация отчетности с ChatGPT Data: меньше ручной работы каждую неделю

Автоматизация отчетности с ChatGPT Data: подключение бизнес-данных, реальные расходы на Work и хранилище, проверка и безопасный доступ к дашборду.11 сент. 2026 г.Explained
Cursor Projects: как выстроить очередь ревью в команде

Cursor Projects: как выстроить очередь ревью в команде

Разбираем Cursor Projects: общий контекст, координатор, автоматические триггеры, нагрузка на ревью и бюджет пилота для команды разработки на практике.11 сент. 2026 г.Explained
Deep Research в ChatGPT: как устроены лимиты Work и Codex

Deep Research в ChatGPT: как устроены лимиты Work и Codex

Deep Research в ChatGPT теперь работает и в Work, и в Codex. Разбираем, откуда списываются кредиты, сколько стоит исследование и как контролировать бюджет.10 сент. 2026 г.Explained
Цены Vercel: сколько стоит закрытый сайт в продакшене

Цены Vercel: сколько стоит закрытый сайт в продакшене

Новые цены Vercel на защиту продакшена: Vercel Authentication — без доплаты, Password Protection на Pro — $20 в месяц за каждый закрытый проект.10 сент. 2026 г.Explained
Голосовой режим ChatGPT: что меняют лимиты Go, Plus и Pro

Голосовой режим ChatGPT: что меняют лимиты Go, Plus и Pro

Разбираем лимиты голосового режима ChatGPT для Go, Plus и Pro: сколько длится разговор, когда сессия остановится и какой тариф оправдывает доплату.9 сент. 2026 г.Explained
Vercel CDN по фиксированной цене: тарифы, лимиты и защита от всплесков

Vercel CDN по фиксированной цене: тарифы, лимиты и защита от всплесков

Flat Rate CDN делает расходы на Vercel CDN предсказуемыми. Разбираем тарифы, защиту от всплесков и части счёта, которые по-прежнему зависят от нагрузки.9 сент. 2026 г.Explained
Рассылка

Одно письмо, каждое воскресенье.Работающие системы, а не горячие мнения.

Еженедельно. Без спама. Отписка в любой момент.