feat: персональные AI модели, оптимизация задач, фильтрация словаря
- Добавлена поддержка персональных AI моделей для каждого пользователя - Оптимизация создания заданий: батч-запрос к AI вместо N запросов - Фильтрация слов по языку изучения (source_lang) в словаре - Удалены неиспользуемые колонки examples и category из vocabulary - Миграции для ai_model_id и удаления колонок 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -187,7 +187,7 @@ async def import_single_word(callback: CallbackQuery, state: FSMContext):
|
||||
|
||||
# Проверяем, нет ли уже такого слова
|
||||
existing = await VocabularyService.get_word_by_original(
|
||||
session, user_id, word_data['word']
|
||||
session, user_id, word_data['word'], source_lang=user.learning_language
|
||||
)
|
||||
|
||||
if existing:
|
||||
@@ -195,10 +195,7 @@ async def import_single_word(callback: CallbackQuery, state: FSMContext):
|
||||
return
|
||||
|
||||
# Добавляем слово
|
||||
learn = user.learning_language if user else 'en'
|
||||
translation_lang = get_user_translation_lang(user)
|
||||
ctx = word_data.get('context')
|
||||
examples = ([{learn: ctx, translation_lang: ''}] if ctx else [])
|
||||
|
||||
await VocabularyService.add_word(
|
||||
session=session,
|
||||
@@ -208,10 +205,8 @@ async def import_single_word(callback: CallbackQuery, state: FSMContext):
|
||||
source_lang=user.learning_language if user else None,
|
||||
translation_lang=translation_lang,
|
||||
transcription=word_data.get('transcription'),
|
||||
examples=examples,
|
||||
source=WordSource.CONTEXT,
|
||||
category='imported',
|
||||
difficulty_level=data.get('level')
|
||||
difficulty_level=data.get('level'),
|
||||
source=WordSource.CONTEXT
|
||||
)
|
||||
|
||||
lang = (user.language_interface if user else 'ru') or 'ru'
|
||||
@@ -235,7 +230,7 @@ async def import_all_words(callback: CallbackQuery, state: FSMContext):
|
||||
for word_data in words:
|
||||
# Проверяем, нет ли уже такого слова
|
||||
existing = await VocabularyService.get_word_by_original(
|
||||
session, user_id, word_data['word']
|
||||
session, user_id, word_data['word'], source_lang=user.learning_language
|
||||
)
|
||||
|
||||
if existing:
|
||||
@@ -243,10 +238,7 @@ async def import_all_words(callback: CallbackQuery, state: FSMContext):
|
||||
continue
|
||||
|
||||
# Добавляем слово
|
||||
learn = user.learning_language if user else 'en'
|
||||
translation_lang = get_user_translation_lang(user)
|
||||
ctx = word_data.get('context')
|
||||
examples = ([{learn: ctx, translation_lang: ''}] if ctx else [])
|
||||
|
||||
await VocabularyService.add_word(
|
||||
session=session,
|
||||
@@ -256,10 +248,8 @@ async def import_all_words(callback: CallbackQuery, state: FSMContext):
|
||||
source_lang=user.learning_language if user else None,
|
||||
translation_lang=translation_lang,
|
||||
transcription=word_data.get('transcription'),
|
||||
examples=examples,
|
||||
source=WordSource.CONTEXT,
|
||||
category='imported',
|
||||
difficulty_level=data.get('level')
|
||||
difficulty_level=data.get('level'),
|
||||
source=WordSource.CONTEXT
|
||||
)
|
||||
added_count += 1
|
||||
|
||||
@@ -478,7 +468,7 @@ async def import_file_all_words(callback: CallbackQuery, state: FSMContext):
|
||||
for word_data in words:
|
||||
# Проверяем, нет ли уже такого слова
|
||||
existing = await VocabularyService.get_word_by_original(
|
||||
session, user_id, word_data['word']
|
||||
session, user_id, word_data['word'], source_lang=user.learning_language
|
||||
)
|
||||
|
||||
if existing:
|
||||
|
||||
Reference in New Issue
Block a user