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

Cloudflare AI Search 11 сентября 2026 года устранил проблему с именами файлов при загрузке данных из R2 в индекс. Если документы хранятся под стабильными ключами без расширения, теперь их не нужно менять: достаточно сохранить для каждого объекта поддерживаемый HTTP Content-Type, и содержимое станет доступно для поиска.
Из процесса загрузки можно убрать отдельный этап переименования. Но по-прежнему придётся привести в порядок метаданные, запустить индексацию и убедиться, что документ действительно появился в поиске.
Что изменилось в Cloudflare AI Search
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-метаданные уже корректны. В этом и состоит реальное упрощение процесса.
Ниже — оценка процесса загрузки до и после обновления. Это модель работ, а не измеренный бенчмарк и не обещанная экономия.

В таблице намеренно нет денежной оценки. 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:
{
"$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:
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 по адресу без расширения:
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 часа либо запустить задачу самостоятельно:
npx wrangler ai-search jobs create <INSTANCE_NAME>Ручную синхронизацию источника можно запускать не чаще одного раза в 30 секунд. Дополнительные попытки не исправят неверные метаданные.
После завершения задачи проверьте журналы и сведения об элементах либо статистику экземпляра. Ошибка уровня элемента unsupported_type означает, что AI Search не смог принять определённый тип файла. Исправьте объект, затем снова синхронизируйте этот элемент или весь источник.
Если у всех ключей R2 уже есть распознаваемые расширения, обновление вас не затрагивает. То же верно, если источником AI Search служит сайт или встроенное хранилище, а не внешний бакет R2. Неподдерживаемый формат или слишком большой файл после этого изменения не станет пригодным для индексации.
Что сделать в первую очередь
Начните с аудита, а не с массовой перезаписи.
Найдите пропущенные объекты без расширения
Получите список объектов R2 вместе с
httpMetadata, переходите по страницам, пока значениеtruncatedне станет равным false, и выделите ключи, у которых в последнем сегменте пути нет расширения. Сверьте их с журналами элементов AI Search и ошибкамиunsupported_type.Классифицируйте метаданные
Разделите поддерживаемые MIME-типы и отсутствующие, некорректные, неподдерживаемые значения, а также
application/octet-stream. Не включайте в эту проверку пользовательские поляx-amz-meta-*: они решают другую задачу.Исправьте небольшую тестовую выборку
Подберите небольшой репрезентативный набор форматов, которые действительно хранятся в бакете. Запишите или скопируйте каждый объект с правильным HTTP
Content-Type, сохранив исходный ключ там, где это допускает ваш инструмент.Синхронизируйте и проверьте поиск
Запустите одну синхронизацию источника. Дождитесь завершения обработки элементов, изучите их журналы, а затем найдите известную фразу внутри каждого документа. Успешная запись в хранилище — ещё не финиш. Доказательством служит найденный фрагмент исходного текста.
Расширяйте пакет только после проверки
Оцените число операций Class A и Class B, которые создаст выбранный способ исправления, уточните класс хранения R2 и только затем увеличивайте пакет. Одновременно обновите загрузчик, чтобы новые объекты без расширения сразу получали поддерживаемые метаданные.
Действуйте на этой неделе, если из-за стабильных или непрозрачных ключей R2 вам приходилось поддерживать отдельную систему имён для AI Search. Подождите, если у существующих объектов нет достоверных данных о типе: сначала понадобится план классификации. Ничего менять не нужно, если распознаваемые расширения уже обеспечивают корректную загрузку в индекс.
Если хотите получать такие же практические разборы следующих изменений платформ, подпишитесь на рассылку.
- Последнее обновление
- 12 сент. 2026 г.
- Категория
- Explained







