Backend:
- Document + MemoryEntry models with Alembic migration (GIN FTS index)
- File upload endpoint with path traversal protection (sanitized filenames)
- Background document text extraction (PyMuPDF)
- Full-text search on extracted_text via PostgreSQL tsvector/tsquery
- Memory CRUD with enum-validated categories/importance, field allow-list
- AI tools: save_memory, search_documents, get_memory (Claude function calling)
- Tool execution loop in stream_ai_response (multi-turn tool use)
- Context assembly: injects critical memory + relevant doc excerpts
- File storage abstraction (local filesystem, S3-swappable)
- Secure file deletion (DB flush before disk delete)
Frontend:
- Document upload dialog (drag-and-drop + file picker)
- Document list with status badges, search, download (via authenticated blob)
- Document viewer with extracted text preview
- Memory list grouped by category with importance color coding
- Memory editor with category/importance dropdowns
- Documents + Memory pages with full CRUD
- Enabled sidebar navigation for both sections
Review fixes applied:
- Sanitized upload filenames (path traversal prevention)
- Download via axios blob (not bare <a href>, preserves auth)
- Route ordering: /search before /{id}/reindex
- Memory update allows is_active=False + field allow-list
- MemoryEditor form resets on mode switch
- Literal enum validation on category/importance schemas
- DB flush before file deletion for data integrity
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
155 lines
6.7 KiB
JSON
155 lines
6.7 KiB
JSON
{
|
||
"auth": {
|
||
"login": "Войти",
|
||
"register": "Регистрация",
|
||
"email": "Email",
|
||
"password": "Пароль",
|
||
"confirmPassword": "Подтвердите пароль",
|
||
"username": "Имя пользователя",
|
||
"fullName": "Полное имя",
|
||
"rememberMe": "Запомнить меня",
|
||
"submit": "Отправить",
|
||
"noAccount": "Нет аккаунта?",
|
||
"hasAccount": "Уже есть аккаунт?",
|
||
"loginTitle": "С возвращением",
|
||
"loginSubtitle": "Войдите в свой аккаунт",
|
||
"registerTitle": "Создать аккаунт",
|
||
"registerSubtitle": "Начните работу с персональным ИИ-ассистентом",
|
||
"errors": {
|
||
"invalidCredentials": "Неверный email или пароль",
|
||
"emailExists": "Пользователь с таким email или именем уже существует",
|
||
"passwordMismatch": "Пароли не совпадают",
|
||
"passwordMinLength": "Пароль должен содержать минимум 8 символов",
|
||
"usernameFormat": "Имя пользователя: 3-50 символов (буквы, цифры, _ или -)",
|
||
"required": "Это поле обязательно"
|
||
}
|
||
},
|
||
"layout": {
|
||
"dashboard": "Главная",
|
||
"chats": "Чаты",
|
||
"documents": "Документы",
|
||
"memory": "Память",
|
||
"notifications": "Уведомления",
|
||
"profile": "Профиль",
|
||
"logout": "Выйти",
|
||
"settings": "Настройки",
|
||
"admin": "Администрирование",
|
||
"users": "Пользователи",
|
||
"context": "Контекст",
|
||
"skills": "Навыки",
|
||
"personal_context": "Мой контекст"
|
||
},
|
||
"dashboard": {
|
||
"welcome": "Добро пожаловать, {{name}}",
|
||
"subtitle": "Ваш персональный ИИ-ассистент по здоровью"
|
||
},
|
||
"chat": {
|
||
"new_chat": "Новый чат",
|
||
"no_chats": "Пока нет чатов. Создайте первый.",
|
||
"no_messages": "Начните разговор...",
|
||
"select_chat": "Выберите чат для начала общения",
|
||
"type_message": "Введите сообщение...",
|
||
"send": "Отправить",
|
||
"archive": "Архивировать",
|
||
"unarchive": "Разархивировать",
|
||
"delete_confirm": "Вы уверены, что хотите удалить этот чат?",
|
||
"limit_reached": "Достигнут лимит чатов",
|
||
"streaming": "ИИ думает..."
|
||
},
|
||
"admin": {
|
||
"context_editor": "Редактор основного контекста",
|
||
"context_placeholder": "Введите системный промпт для ИИ-ассистента...",
|
||
"save": "Сохранить",
|
||
"saved": "Сохранено",
|
||
"unsaved_changes": "Несохранённые изменения",
|
||
"version": "Версия",
|
||
"characters": "символов"
|
||
},
|
||
"skills": {
|
||
"my_skills": "Мои навыки",
|
||
"general_skills": "Общие навыки",
|
||
"no_skills": "Навыков пока нет.",
|
||
"no_personal_skills": "Вы ещё не создали персональных навыков.",
|
||
"create_personal": "Создать персональный навык",
|
||
"edit_personal": "Редактировать навык",
|
||
"create_general": "Создать общий навык",
|
||
"edit_general": "Редактировать общий навык",
|
||
"name": "Название",
|
||
"name_placeholder": "напр. Кардиолог",
|
||
"description": "Описание",
|
||
"description_placeholder": "Краткое описание специалиста",
|
||
"system_prompt": "Системный промпт",
|
||
"prompt_placeholder": "Инструкции для ИИ при использовании этого навыка...",
|
||
"icon": "Иконка",
|
||
"no_skill": "Без специалиста",
|
||
"general": "Общие",
|
||
"personal": "Персональные"
|
||
},
|
||
"personal_context": {
|
||
"title": "Персональный контекст",
|
||
"subtitle": "Этот контекст добавляется ко всем вашим разговорам с ИИ",
|
||
"placeholder": "Добавьте личную информацию, которую ИИ должен знать о вас..."
|
||
},
|
||
"documents": {
|
||
"upload": "Загрузить",
|
||
"drop_or_click": "Перетащите файл или нажмите для выбора",
|
||
"doc_type": "Тип документа",
|
||
"no_documents": "Документы ещё не загружены.",
|
||
"download": "Скачать",
|
||
"reindex": "Извлечь текст заново",
|
||
"extracted_text": "Извлечённый текст",
|
||
"search_placeholder": "Поиск по документам...",
|
||
"clear_search": "Очистить",
|
||
"types": {
|
||
"other": "Другое",
|
||
"lab_result": "Анализы",
|
||
"consultation": "Консультация",
|
||
"prescription": "Рецепт",
|
||
"imaging": "Снимки"
|
||
},
|
||
"status": {
|
||
"pending": "Ожидание",
|
||
"processing": "Обработка",
|
||
"completed": "Готово",
|
||
"failed": "Ошибка"
|
||
}
|
||
},
|
||
"memory": {
|
||
"create": "Добавить запись",
|
||
"edit": "Редактировать запись",
|
||
"no_entries": "Записей пока нет. ИИ будет сохранять важную информацию о здоровье здесь.",
|
||
"category": "Категория",
|
||
"importance": "Важность",
|
||
"title_field": "Заголовок",
|
||
"title_placeholder": "напр. Диабет 2 типа",
|
||
"content_field": "Содержание",
|
||
"content_placeholder": "Подробная информация...",
|
||
"categories": {
|
||
"condition": "Заболевание",
|
||
"medication": "Лекарство",
|
||
"allergy": "Аллергия",
|
||
"vital": "Показатели",
|
||
"document_summary": "Сводка документа",
|
||
"other": "Другое"
|
||
},
|
||
"importance_levels": {
|
||
"critical": "Критическая",
|
||
"high": "Высокая",
|
||
"medium": "Средняя",
|
||
"low": "Низкая"
|
||
}
|
||
},
|
||
"common": {
|
||
"loading": "Загрузка...",
|
||
"error": "Произошла ошибка",
|
||
"notFound": "Страница не найдена",
|
||
"goHome": "На главную",
|
||
"save": "Сохранить",
|
||
"cancel": "Отмена",
|
||
"delete": "Удалить",
|
||
"edit": "Редактировать",
|
||
"create": "Создать",
|
||
"search": "Поиск"
|
||
}
|
||
}
|