База данных
AgentCore использует PostgreSQL 16 с расширением pgvector для поиска по векторной близости. Схемой управляет Prisma 6, файл — prisma/schema.prisma.
Установка
# Start PostgreSQL
docker compose up -d postgres
# Generate Prisma client
npx prisma generate
# Run migrations
npx prisma migrate dev
# Visual database browser
npm run db:studio
Обзор моделей
В схеме 26 моделей, сгруппированных по доменам.
RBAC и организация
| Модель | Назначение | Ключевые поля |
|---|---|---|
SystemRole | Кастомные и встроенные RBAC-роли | name, slug, isSystem, allDepartments, departmentIds, permissions |
Department | Tenant/department boundary для большинства данных | name, slug, color, description, settings, isArchived |
User | Аутентифицированные пользователи и HR-состояние | email, name, phone, passwordHash, legacy role, roleId, departmentId, avatarUrl, tokenVersion, permission/department override-ы |
PasswordResetToken | Флоу сброса пароля | userId, token, expiresAt, usedAt |
User.role хранит legacy enum (admin, approver, dept_head, employee) для совместимости. Текущая авторизация использует SystemRole + per-user extraPermissions, revokedPermissions, extraDepartmentIds и revokedDepartmentIds.
База знаний
| Модель | Назначение | Ключевые поля |
|---|---|---|
KnowledgeBase | Коллекция документов, принадлежащая отделу | departmentId, name, description, config |
Document | Исходный документ или сгенерированный output-файл | knowledgeBaseId, title, type, originalUrl, status, metadata |
Chunk | Текстовый фрагмент для поиска | documentId, content, embedding, syntheticQuestions, metadata |
ChunkQuestion | Путь retrieval через synthetic Q&A | chunkId, question, embedding |
Chunk.embedding и ChunkQuestion.embedding — столбцы vector(1536), должны совпадать с размерностью настроенной embedding-модели.
Разговоры и namespaces
| Модель | Назначение | Ключевые поля |
|---|---|---|
Namespace | Department-specific AI-ассистент | name, departmentId, systemPrompt, persona, config |
NamespacePlugin | Включённые integration-плагины для namespace | namespaceId, pluginId, config, enabled |
Conversation | Тред разговора с пользователем | userId, channel, status, metadata, namespaceId |
Message | Сообщение в разговоре | conversationId, role, content, sources |
PiiRedactionMap | Двусторонние PII-плейсхолдеры для разговора | conversationId, placeholder, entityType, encryptedValue |
Namespaces задают scope персоны, trust-матрицы, конфигурации адаптера, плагинов, разговоров, document-шаблонов и agent tasks.
Approvals и intents
| Модель | Назначение | Ключевые поля |
|---|---|---|
Approval | HITL approval-процесс | messageId, approverId, status, editedContent, approverNotes, escalatedToId, escalationReason, intentName |
IntentTrust | Матрица доверия для автономной отправки | namespaceId, intentName, successfulCount, threshold, isAutonomous, samplingRate |
IntentExample | Размеченные фразы для vector intent-классификации | namespaceId, intentName, phrase, embedding, metadata |
Генерация документов
| Модель | Назначение | Ключевые поля |
|---|---|---|
Template | Legacy file-based шаблоны | name, departmentId, filePath, variables |
DocumentTemplate | Handlebars-шаблоны, управляемые через API | namespaceId, departmentId, name, description, category, templateBody, variables, outputFormat, createdBy |
DocumentGeneration | История рендеринга и сгенерированный output | templateId, userId, input, output, outputFileId, status, error |
Сгенерированные файлы можно сохранить обратно в Document по outputFileId, чтобы они участвовали в обычных knowledge base-флоу.
Память сотрудников и agent execution
| Модель | Назначение | Ключевые поля |
|---|---|---|
EmployeeProfile | Извлечённая пользовательская память/профиль | userId, summary, currentProjects, preferences, frequentIntents, accessLevel, profileVersion, lastExtractedAt |
AgentTask | Запись задачи agent executor | namespaceId, conversationId, messageId, adapterType, status, поля токенов/стоимости/длительности, metadata, timestamps |
AgentToolCall | Step-level трейс выполнения агента | agentTaskId, stepName, status, inputData, outputData, durationMs, errorMessage |
Наблюдаемость и уведомления
| Модель | Назначение | Ключевые поля |
|---|---|---|
AuditLog | Business и security audit | userId, action, entityType, entityId, changes, ipAddress, userAgent |
AgentRun | Сводка Langfuse/OpenAI трейса | traceId, conversationId, provider, model, поля токенов/стоимости/latency, status |
RetrievalHit | RAG retrieval-evidence для трейса | agentRunId, chunkId, documentId, rank, score, rerankScore |
Notification | User inbox-уведомления | userId, type, title, body, entityType, entityId, readAt |
Enums
Role: admin | approver | dept_head | employee
DocumentType: pdf | docx | txt | url | image
DocumentStatus: pending | processing | ready | failed
ConversationChannel: web | whatsapp | telegram | slack | email
ConversationStatus: active | closed | escalated | awaiting_approval
MessageRole: user | assistant | system
ApprovalStatus: pending | approved | rejected | edited | escalated
AgentTaskStatus: queued | running | done | failed | timeout
Операционные заметки
- Изоляция отделов идёт через прямое
departmentIdили через связанные записиNamespace,UserилиKnowledgeBase. - Soft-деактивация для пользователей (
isActive = false) и отделов (isArchived = true). - Для инвалидации JWT используется
User.tokenVersion; сброс пароля, logout-all, переводы между отделами и деактивация инкрементируют его. - И загрузки, и сгенерированные output-документы живут в
Document, но у сгенерированных вmetadata.source = "document_generation".
Миграции
Миграции лежат в prisma/migrations/.
npx prisma migrate dev --name <migration_name>
Для production-деплоев:
npx prisma migrate deploy