File extractors (AI)
Реестр: ai.fileExtractors (target ai).
Экстракторы извлекают текст из файлов проекта перед RAG-индексацией. Регистрация через extension SDK — по аналогии с ai.artifactTypes.
Контракт
ts
import type { FileTextExtractor } from '@artiroute/extension-sdk';
const pdfExtractor: FileTextExtractor = {
extensions: ['.pdf'],
priority: 10,
async extract(buffer, { originalName }) {
// … вернуть plain text / markdown
return '…';
},
};Регистрация в extension
ts
import { getExtensionRegistry } from '@artiroute/extension-sdk';
import type { FileTextExtractor } from '@artiroute/extension-sdk';
getExtensionRegistry<FileTextExtractor>('ai.fileExtractors').register(
'my-pdf',
pdfExtractor,
50,
);В extension.manifest.mjs:
js
contributes: {
extendsRegistries: [
{ registryId: 'ai.fileExtractors', keys: ['my-pdf'] },
],
},Поведение индексации
- При upload non-asset файла (не аудио) → задача
rag_sync_file. - AI-сервис ищет экстрактор по расширению
originalName. - Есть экстрактор и текст извлечён → полная индексация (
kind: file.md,file.docx, …). - Нет экстрактора или ошибка → индексация только метаданных (
kind: file:unreadable): имя файла,fileId, служебный текст для FTS. - Полная переиндексация проекта (
rag_reindex_project) обрабатывает артефакты и файлы.
Core-экстракторы (txt, md, office, xlsx) встроены в ai-agent-service и регистрируются при старте. Extension-экстракторы с большим priority перекрывают core для того же расширения.
AI / чат
- Каталог файлов в system prompt чата с флагом
readable: true | false. readable: false— ИИ может ссылаться на файл, но не должен выдумывать содержимое.searchKnowledgeпомечает unreadable-чанки в snippet.
Ограничения
- Аудио не индексируется в RAG.
virtualPathне используется в индексе.- Editor assets (
asset: true) не индексируются.