2025-12-10 10:34:57 +03:00
import json
2025-12-04 16:45:03 +03:00
import logging
import httpx
2025-12-04 11:09:54 +03:00
from openai import AsyncOpenAI
from config . settings import settings
2025-12-08 15:16:24 +03:00
from database . db import async_session_maker
from database . models import AIProvider
from typing import Dict , List , Optional
2025-12-04 11:09:54 +03:00
2025-12-04 16:45:03 +03:00
logger = logging . getLogger ( __name__ )
2025-12-04 11:09:54 +03:00
class AIService :
2025-12-08 15:16:24 +03:00
""" Сервис для работы с AI API (OpenAI и Google) """
2025-12-04 11:09:54 +03:00
def __init__ ( self ) :
2025-12-08 15:16:24 +03:00
self . openai_api_key = settings . openai_api_key
self . google_api_key = settings . google_api_key
2025-12-04 16:45:03 +03:00
2025-12-04 14:39:23 +03:00
# Проверяем, настроен ли Cloudflare AI Gateway
if settings . cloudflare_account_id :
2025-12-04 16:45:03 +03:00
# Используем Cloudflare AI Gateway с прямыми HTTP запросами
2025-12-08 15:16:24 +03:00
self . openai_base_url = (
2025-12-04 14:39:23 +03:00
f " https://gateway.ai.cloudflare.com/v1/ "
f " { settings . cloudflare_account_id } / "
f " { settings . cloudflare_gateway_id } / "
2025-12-04 16:45:03 +03:00
f " openai "
2025-12-04 14:39:23 +03:00
)
2025-12-04 16:45:03 +03:00
self . use_cloudflare = True
2025-12-08 15:16:24 +03:00
logger . info ( f " AI Service initialized with Cloudflare Gateway: { self . openai_base_url } " )
2025-12-04 14:39:23 +03:00
else :
# Прямое подключение к OpenAI
2025-12-08 15:16:24 +03:00
self . openai_base_url = " https://api.openai.com/v1 "
2025-12-04 16:45:03 +03:00
self . use_cloudflare = False
logger . info ( " AI Service initialized with direct OpenAI connection " )
2025-12-08 15:16:24 +03:00
# Google Gemini API URL (через Cloudflare Gateway или напрямую)
if settings . cloudflare_account_id :
self . google_base_url = (
f " https://gateway.ai.cloudflare.com/v1/ "
f " { settings . cloudflare_account_id } / "
f " { settings . cloudflare_gateway_id } / "
f " google-ai-studio/v1 "
)
else :
self . google_base_url = " https://generativelanguage.googleapis.com/v1beta "
2025-12-04 16:45:03 +03:00
# HTTP клиент для всех запросов
self . http_client = httpx . AsyncClient (
timeout = httpx . Timeout ( 60.0 , connect = 10.0 ) ,
limits = httpx . Limits ( max_keepalive_connections = 5 , max_connections = 10 )
)
2025-12-08 15:16:24 +03:00
# Кеш активной модели (обновляется при запросах)
self . _cached_model : Optional [ str ] = None
self . _cached_provider : Optional [ AIProvider ] = None
2025-12-09 15:05:38 +03:00
def _markdown_to_html ( self , text : str ) - > str :
""" Конвертировать markdown форматирование в HTML для Telegram. """
import re
# **bold** -> <b>bold</b>
text = re . sub ( r ' \ * \ *(.+?) \ * \ * ' , r ' <b> \ 1</b> ' , text )
# *italic* -> <i>italic</i> (но не внутри уже конвертированных тегов)
text = re . sub ( r ' (?<!</[bi]>) \ *([^*]+?) \ *(?![^<]*</) ' , r ' <i> \ 1</i> ' , text )
# Убираем оставшиеся одиночные * в начале строк (списки)
text = re . sub ( r ' ^ \ * \ s+ ' , ' • ' , text , flags = re . MULTILINE )
return text
def _strip_markdown_code_block ( self , text : str ) - > str :
""" Удалить markdown обёртку ```json ... ``` из текста. """
import re
text = text . strip ( )
# Паттерн для ```json ... ``` или просто ``` ... ```
pattern = r ' ^```(?:json)? \ s* \ n?(.*?) \ n?```$ '
match = re . match ( pattern , text , re . DOTALL )
if match :
return match . group ( 1 ) . strip ( )
# Альтернативный способ - если начинается с ``` но паттерн не сработал
if text . startswith ( ' ``` ' ) :
lines = text . split ( ' \n ' )
# Убираем первую строку (```json или ```)
lines = lines [ 1 : ]
# Убираем последнюю строку если это ```
if lines and lines [ - 1 ] . strip ( ) == ' ``` ' :
lines = lines [ : - 1 ]
return ' \n ' . join ( lines ) . strip ( )
return text
2025-12-08 16:43:08 +03:00
async def _get_active_model ( self , user_id : Optional [ int ] = None ) - > tuple [ str , AIProvider ] :
"""
Получить активную модель и провайдера из БД .
Args :
user_id : ID пользователя в БД ( не telegram_id ) . Если указан , берёт модель пользователя .
Returns :
tuple [ model_name , provider ]
"""
2025-12-08 15:16:24 +03:00
from services . ai_model_service import AIModelService , DEFAULT_MODEL , DEFAULT_PROVIDER
async with async_session_maker ( ) as session :
2025-12-08 16:43:08 +03:00
if user_id :
# Получаем модель пользователя (или глобальную если не выбрана)
model = await AIModelService . get_user_model ( session , user_id )
else :
# Глобальная активная модель
model = await AIModelService . get_active_model ( session )
2025-12-08 15:16:24 +03:00
if model :
self . _cached_model = model . model_name
self . _cached_provider = model . provider
return model . model_name , model . provider
return DEFAULT_MODEL , DEFAULT_PROVIDER
2025-12-08 16:43:08 +03:00
async def _make_request ( self , messages : list , temperature : float = 0.3 , user_id : Optional [ int ] = None ) - > dict :
"""
Выполнить запрос к активному AI провайдеру .
Args :
messages : Сообщения для API
temperature : Температура генерации
user_id : ID пользователя в БД для получения е г о модели
"""
model_name , provider = await self . _get_active_model ( user_id )
2025-12-08 15:16:24 +03:00
if provider == AIProvider . google :
return await self . _make_google_request ( messages , temperature , model_name )
else :
return await self . _make_openai_request ( messages , temperature , model_name )
async def _make_google_request ( self , messages : list , temperature : float = 0.3 , model : str = " gemini-2.5-flash-lite " ) - > dict :
""" Выполнить запрос к Google Gemini API (через Cloudflare Gateway или напрямую) """
url = f " { self . google_base_url } /models/ { model } :generateContent "
# Конвертируем формат сообщений OpenAI в формат Google
# System message добавляем как первое user сообщение
contents = [ ]
for msg in messages :
role = msg [ " role " ]
content = msg [ " content " ]
if role == " system " :
# Добавляем system как user сообщение в начало
contents . insert ( 0 , { " role " : " user " , " parts " : [ { " text " : f " [System instruction]: { content } " } ] } )
elif role == " user " :
contents . append ( { " role " : " user " , " parts " : [ { " text " : content } ] } )
elif role == " assistant " :
contents . append ( { " role " : " model " , " parts " : [ { " text " : content } ] } )
payload = {
" contents " : contents ,
" generationConfig " : {
" temperature " : temperature
}
}
headers = {
" Content-Type " : " application/json " ,
" x-goog-api-key " : self . google_api_key
}
response = await self . http_client . post ( url , headers = headers , json = payload )
response . raise_for_status ( )
data = response . json ( )
# Конвертируем ответ Google в формат OpenAI для совместимости
text = data [ " candidates " ] [ 0 ] [ " content " ] [ " parts " ] [ 0 ] [ " text " ]
2025-12-09 15:05:38 +03:00
# Убираем markdown обёртку если есть (```json ... ``` или ```...```)
text = self . _strip_markdown_code_block ( text )
2025-12-08 15:16:24 +03:00
return {
" choices " : [ {
" message " : {
" content " : text
}
} ]
}
2025-12-04 16:45:03 +03:00
async def _make_openai_request ( self , messages : list , temperature : float = 0.3 , model : str = " gpt-4o-mini " ) - > dict :
""" Выполнить запрос к OpenAI API (через Cloudflare или напрямую) """
2025-12-08 15:16:24 +03:00
url = f " { self . openai_base_url } /chat/completions "
2025-12-04 16:45:03 +03:00
headers = {
2025-12-08 15:16:24 +03:00
" Authorization " : f " Bearer { self . openai_api_key } " ,
2025-12-04 16:45:03 +03:00
" Content-Type " : " application/json "
}
payload = {
" model " : model ,
2025-12-08 15:16:24 +03:00
" messages " : messages
2025-12-04 16:45:03 +03:00
}
2025-12-08 15:16:24 +03:00
# Модели с ограничениями (не поддерживают temperature и json mode)
limited_models = { " gpt-5-nano " , " o1 " , " o1-mini " , " o1-preview " , " o3-mini " }
if model not in limited_models :
payload [ " temperature " ] = temperature
# JSON mode
payload [ " response_format " ] = { " type " : " json_object " }
2025-12-04 16:45:03 +03:00
response = await self . http_client . post ( url , headers = headers , json = payload )
response . raise_for_status ( )
return response . json ( )
2025-12-04 11:09:54 +03:00
2025-12-08 16:43:08 +03:00
async def translate_word ( self , word : str , source_lang : str = " en " , translation_lang : str = " ru " , user_id : Optional [ int ] = None ) - > Dict :
2025-12-04 11:09:54 +03:00
"""
Перевести слово и получить дополнительную информацию
Args :
word : Слово для перевода
2025-12-04 19:40:01 +03:00
source_lang : Язык исходного слова ( ISO2 )
translation_lang : Язык перевода ( ISO2 )
2025-12-08 16:43:08 +03:00
user_id : ID пользователя в БД для получения е г о модели
2025-12-04 11:09:54 +03:00
Returns :
Dict с переводом , транскрипцией и примерами
"""
2025-12-04 19:40:01 +03:00
prompt = f """ Переведи слово/фразу " { word } " с языка { source_lang } на { translation_lang } .
2025-12-04 11:09:54 +03:00
Верни ответ строго в формате JSON :
{ {
2025-12-04 19:40:01 +03:00
" word " : " исходное слово на {source_lang} " ,
" translation " : " перевод на {translation_lang} " ,
" transcription " : " транскрипция в IPA (если применимо) " ,
2025-12-04 11:09:54 +03:00
" examples " : [
2025-12-04 19:40:01 +03:00
{ { " {source_lang} " : " пример на языке обучения " , " {translation_lang} " : " перевод примера " } }
2025-12-04 11:09:54 +03:00
] ,
" category " : " категория слова (работа, еда, путешествия и т.д.) " ,
" difficulty " : " уровень сложности (A1/A2/B1/B2/C1/C2) "
} }
Важно : верни только JSON , без дополнительного текста . """
try :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] translate_word: word= ' { word } ' , source= ' { source_lang } ' , to= ' { translation_lang } ' " )
2025-12-04 16:45:03 +03:00
messages = [
2025-12-04 19:40:01 +03:00
{ " role " : " system " , " content " : " Ты - помощник для изучения языков. Отвечай только в формате JSON. " } ,
2025-12-04 16:45:03 +03:00
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.3 , user_id = user_id )
2025-12-04 11:09:54 +03:00
import json
2025-12-04 16:45:03 +03:00
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] translate_word: success, translation= ' { result . get ( ' translation ' , ' N/A ' ) } ' " )
2025-12-04 11:09:54 +03:00
return result
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] translate_word: { type ( e ) . __name__ } : { str ( e ) } " )
2025-12-04 11:09:54 +03:00
# Fallback в случае ошибки
return {
" word " : word ,
" translation " : " Ошибка перевода " ,
" transcription " : " " ,
" examples " : [ ] ,
" category " : " unknown " ,
" difficulty " : " A1 "
}
2025-12-06 21:29:41 +03:00
async def translate_word_with_contexts (
self ,
word : str ,
source_lang : str = " en " ,
translation_lang : str = " ru " ,
2025-12-08 16:43:08 +03:00
max_translations : int = 3 ,
user_id : Optional [ int ] = None
2025-12-06 21:29:41 +03:00
) - > Dict :
"""
Перевести слово и получить несколько переводов с контекстами
Args :
word : Слово для перевода
source_lang : Язык исходного слова ( ISO2 )
translation_lang : Язык перевода ( ISO2 )
max_translations : Максимальное количество переводов
2025-12-08 16:43:08 +03:00
user_id : ID пользователя в БД для получения е г о модели
2025-12-06 21:29:41 +03:00
Returns :
Dict с переводами , каждый с примером предложения
"""
prompt = f """ Переведи слово/фразу " { word } " с языка { source_lang } на { translation_lang } .
Если у слова есть несколько значений в разных контекстах , дай до { max_translations } разных переводов .
Для каждого перевода дай пример предложения , показывающий это значение .
Верни ответ строго в формате JSON :
{ {
" word " : " исходное слово на {source_lang} " ,
" transcription " : " транскрипция в IPA (если применимо) " ,
" category " : " основная категория слова " ,
" difficulty " : " уровень сложности (A1/A2/B1/B2/C1/C2) " ,
" translations " : [
{ {
" translation " : " перевод 1 на {translation_lang} " ,
" context " : " пример предложения на {source_lang} , показывающий это значение " ,
" context_translation " : " перевод примера на {translation_lang} " ,
" is_primary " : true
} } ,
{ {
" translation " : " перевод 2 на {translation_lang} (если есть другое значение) " ,
" context " : " пример предложения на {source_lang} " ,
" context_translation " : " перевод примера на {translation_lang} " ,
" is_primary " : false
} }
]
} }
Важно :
- Первый перевод должен быть самым распространённым ( is_primary : true )
- Давай разные переводы только если слово реально имеет разные значения
- Примеры должны чётко показывать конкретное значение слова
- Верни только JSON , без дополнительного текста """
try :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] translate_word_with_contexts: word= ' { word } ' , source= ' { source_lang } ' , to= ' { translation_lang } ' " )
2025-12-06 21:29:41 +03:00
messages = [
{ " role " : " system " , " content " : " Ты - помощник для изучения языков. Отвечай только в формате JSON. " } ,
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.3 , user_id = user_id )
2025-12-06 21:29:41 +03:00
import json
content = response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ]
# Убираем markdown обёртку если есть
if content . startswith ( ' ``` ' ) :
content = content . split ( ' \n ' , 1 ) [ 1 ] if ' \n ' in content else content [ 3 : ]
if content . endswith ( ' ``` ' ) :
content = content [ : - 3 ]
content = content . strip ( )
result = json . loads ( content )
translations_count = len ( result . get ( ' translations ' , [ ] ) )
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] translate_word_with_contexts: success, { translations_count } translations " )
2025-12-06 21:29:41 +03:00
return result
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] translate_word_with_contexts: { type ( e ) . __name__ } : { str ( e ) } " )
2025-12-06 21:29:41 +03:00
# Fallback в случае ошибки
return {
" word " : word ,
" transcription " : " " ,
" category " : " unknown " ,
" difficulty " : " A1 " ,
" translations " : [ {
" translation " : " Ошибка перевода " ,
" context " : " " ,
" context_translation " : " " ,
" is_primary " : True
} ]
}
2025-12-05 20:15:47 +03:00
async def translate_words_batch (
self ,
words : List [ str ] ,
source_lang : str = " en " ,
2025-12-08 16:43:08 +03:00
translation_lang : str = " ru " ,
user_id : Optional [ int ] = None
2025-12-05 20:15:47 +03:00
) - > List [ Dict ] :
"""
Перевести список слов пакетно
Args :
words : Список слов для перевода
source_lang : Язык исходных слов ( ISO2 )
translation_lang : Язык перевода ( ISO2 )
2025-12-08 16:43:08 +03:00
user_id : ID пользователя в БД для получения е г о модели
2025-12-05 20:15:47 +03:00
Returns :
List [ Dict ] с переводами , транскрипциями
"""
if not words :
return [ ]
words_list = " \n " . join ( f " - { w } " for w in words [ : 50 ] ) # Максимум 50 слов за раз
# Добавляем инструкцию для фуриганы если японский
furigana_instruction = " "
if source_lang == " ja " :
furigana_instruction = ' \n " reading " : " чтение хираганой (только для кандзи) " , '
prompt = f """ Переведи следующие слова/фразы с языка { source_lang } на { translation_lang } :
{ words_list }
Верни ответ строго в формате JSON массива :
[
{ {
" word " : " исходное слово " ,
" translation " : " перевод " ,
" transcription " : " транскрипция (IPA или ромадзи для японского) " , { furigana_instruction }
2025-12-10 19:42:10 +03:00
" example " : " короткий пример использования на {source_lang} " ,
" example_translation " : " перевод примера на {translation_lang} "
2025-12-05 20:15:47 +03:00
} } ,
. . .
]
Важно :
- Верни только JSON массив , без дополнительного текста
- Сохрани порядок слов как в исходном списке
2025-12-10 19:42:10 +03:00
- Для каждого слова укажи точный перевод , транскрипцию и короткий пример """
2025-12-05 20:15:47 +03:00
try :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] translate_words_batch: { len ( words ) } words, { source_lang } -> { translation_lang } " )
2025-12-05 20:15:47 +03:00
messages = [
{ " role " : " system " , " content " : " Ты - помощник для изучения языков. Отвечай только в формате JSON. " } ,
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.3 , user_id = user_id )
2025-12-05 20:15:47 +03:00
import json
content = response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ]
# Убираем markdown обёртку если есть
if content . startswith ( ' ``` ' ) :
content = content . split ( ' \n ' , 1 ) [ 1 ] if ' \n ' in content else content [ 3 : ]
if content . endswith ( ' ``` ' ) :
content = content [ : - 3 ]
content = content . strip ( )
result = json . loads ( content )
# Если вернулся dict с ключом типа "words" или "translations" — извлекаем список
if isinstance ( result , dict ) :
for key in [ ' words ' , ' translations ' , ' result ' , ' data ' ] :
if key in result and isinstance ( result [ key ] , list ) :
result = result [ key ]
break
if not isinstance ( result , list ) :
2025-12-08 15:16:24 +03:00
logger . warning ( f " [AI Warning] translate_words_batch: unexpected format, got { type ( result ) } " )
2025-12-05 20:15:47 +03:00
return [ { " word " : w , " translation " : " " , " transcription " : " " } for w in words ]
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] translate_words_batch: success, got { len ( result ) } translations " )
2025-12-05 20:15:47 +03:00
return result
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] translate_words_batch: { type ( e ) . __name__ } : { str ( e ) } " )
2025-12-05 20:15:47 +03:00
# Возвращаем слова без перевода в случае ошибки
return [ { " word " : w , " translation " : " " , " transcription " : " " } for w in words ]
2025-12-08 16:43:08 +03:00
async def check_answer ( self , question : str , correct_answer : str , user_answer : str , user_id : Optional [ int ] = None ) - > Dict :
2025-12-04 11:09:54 +03:00
"""
Проверить ответ пользователя с помощью ИИ
Args :
question : Вопрос задания
correct_answer : Правильный ответ
user_answer : Ответ пользователя
2025-12-08 16:43:08 +03:00
user_id : ID пользователя в БД для получения е г о модели
2025-12-04 11:09:54 +03:00
Returns :
Dict с результатом проверки и обратной связью
"""
prompt = f """ Проверь ответ пользователя на задание по английскому языку.
Задание : { question }
Правильный ответ : { correct_answer }
Ответ пользователя : { user_answer }
Верни ответ в формате JSON :
{ {
" is_correct " : true / false ,
" feedback " : " краткое объяснение (если ответ неверный, объясни ошибку и дай правильный вариант) " ,
" score " : 0 - 100
} }
Учитывай возможные вариации ответа . Если смысл передан правильно , даже с небольшими грамматическими неточностями , засчитывай ответ . """
try :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] check_answer: user_answer= ' { user_answer [ : 30 ] } ... ' " )
2025-12-04 16:45:03 +03:00
messages = [
{ " role " : " system " , " content " : " Ты - преподаватель английского языка. Проверяй ответы справедливо, учитывая контекст. " } ,
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.3 , user_id = user_id )
2025-12-04 11:09:54 +03:00
import json
2025-12-04 16:45:03 +03:00
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] check_answer: is_correct= { result . get ( ' is_correct ' , False ) } , score= { result . get ( ' score ' , 0 ) } " )
2025-12-04 11:09:54 +03:00
return result
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] check_answer: { type ( e ) . __name__ } : { str ( e ) } " )
2025-12-04 11:09:54 +03:00
return {
" is_correct " : False ,
" feedback " : " Ошибка проверки ответа " ,
" score " : 0
}
2025-12-10 19:42:10 +03:00
async def check_translation (
self ,
word : str ,
correct_translation : str ,
user_answer : str ,
source_lang : str = " en " ,
target_lang : str = " ru " ,
user_id : Optional [ int ] = None
) - > Dict :
"""
Проверить перевод слова с помощью ИИ ( для мини - игр )
Args :
word : Оригинальное слово
correct_translation : Эталонный перевод
user_answer : Ответ пользователя
source_lang : Язык оригинального слова
target_lang : Язык перевода
user_id : ID пользователя в БД
Returns :
Dict с результатом проверки
"""
prompt = f """ Проверь перевод слова.
Слово ( { source_lang } ) : { word }
Эталонный перевод ( { target_lang } ) : { correct_translation }
Ответ пользователя : { user_answer }
Определи , правильный ли перевод пользователя . Учитывай :
- Синонимы и близкие по смыслу слова
- Разные формы слова ( единственное / множественное число )
- Небольшие опечатки
Верни JSON :
{ {
" is_correct " : true / false ,
" feedback " : " краткое пояснение (почему верно/неверно, какой вариант лучше) "
} } """
try :
logger . info ( f " [AI Request] check_translation: word= ' { word } ' , user= ' { user_answer } ' " )
messages = [
{ " role " : " system " , " content " : " Ты - лингвист, проверяющий переводы. Будь справедлив и учитывай синонимы. " } ,
{ " role " : " user " , " content " : prompt }
]
response_data = await self . _make_request ( messages , temperature = 0.2 , user_id = user_id )
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
logger . info ( f " [AI Response] check_translation: is_correct= { result . get ( ' is_correct ' , False ) } " )
return result
except Exception as e :
logger . error ( f " [AI Error] check_translation: { type ( e ) . __name__ } : { str ( e ) } " )
# В случае ошибки делаем простое сравнение
is_correct = user_answer . lower ( ) . strip ( ) == correct_translation . lower ( ) . strip ( )
return {
" is_correct " : is_correct ,
" feedback " : " "
}
async def check_translations_batch (
self ,
answers : List [ Dict ] ,
source_lang : str = " en " ,
target_lang : str = " ru " ,
user_id : Optional [ int ] = None
) - > List [ Dict ] :
"""
Проверить несколько переводов одним запросом ( для мини - игр )
Args :
answers : Список словарей с ключами : word , correct_translation , user_answer
source_lang : Язык оригинальных слов
target_lang : Язык перевода
user_id : ID пользователя в БД
Returns :
Список словарей с результатами проверки
"""
if not answers :
return [ ]
# Формируем список для проверки
answers_text = " "
for i , ans in enumerate ( answers , 1 ) :
answers_text + = f " { i } . { ans [ ' word ' ] } → эталон: { ans [ ' correct_translation ' ] } | ответ: { ans [ ' user_answer ' ] } \n "
prompt = f """ Проверь переводы слов с { source_lang } на { target_lang } .
{ answers_text }
Для каждого слова определи , правильный ли перевод . Учитывай :
- Синонимы и близкие по смыслу слова
- Разные формы слова
- Небольшие опечатки
Верни JSON массив :
[
{ { " index " : 1 , " is_correct " : true / false , " feedback " : " краткое пояснение " , " user_answer_meaning " : " что означает ответ пользователя на {source_lang} , если это валидное слово " } } ,
. . .
]
user_answer_meaning - переведи ответ пользователя обратно на { source_lang } , чтобы показать что он на самом деле написал . Если ответ бессмысленный - оставь пустым . """
try :
logger . info ( f " [AI Request] check_translations_batch: { len ( answers ) } answers " )
messages = [
{ " role " : " system " , " content " : " Ты - лингвист, проверяющий переводы. Будь справедлив и учитывай синонимы. Отвечай только JSON массивом. " } ,
{ " role " : " user " , " content " : prompt }
]
response_data = await self . _make_request ( messages , temperature = 0.2 , user_id = user_id )
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
logger . info ( f " [AI Response] check_translations_batch: { len ( result ) } results " )
# Преобразуем в удобный формат
results_map = { r [ ' index ' ] : r for r in result }
final_results = [ ]
for i , ans in enumerate ( answers , 1 ) :
if i in results_map :
final_results . append ( {
' is_correct ' : results_map [ i ] . get ( ' is_correct ' , False ) ,
' feedback ' : results_map [ i ] . get ( ' feedback ' , ' ' ) ,
' user_answer_meaning ' : results_map [ i ] . get ( ' user_answer_meaning ' , ' ' )
} )
else :
# Fallback на простое сравнение
is_correct = ans [ ' user_answer ' ] . lower ( ) . strip ( ) == ans [ ' correct_translation ' ] . lower ( ) . strip ( )
final_results . append ( { ' is_correct ' : is_correct , ' feedback ' : ' ' , ' user_answer_meaning ' : ' ' } )
return final_results
except Exception as e :
logger . error ( f " [AI Error] check_translations_batch: { type ( e ) . __name__ } : { str ( e ) } " )
# В случае ошибки делаем простое сравнение для всех
return [
{
' is_correct ' : ans [ ' user_answer ' ] . lower ( ) . strip ( ) == ans [ ' correct_translation ' ] . lower ( ) . strip ( ) ,
' feedback ' : ' ' ,
' user_answer_meaning ' : ' '
}
for ans in answers
]
2025-12-08 16:43:08 +03:00
async def generate_fill_in_sentence ( self , word : str , learning_lang : str = " en " , translation_lang : str = " ru " , user_id : Optional [ int ] = None ) - > Dict :
2025-12-04 14:46:30 +03:00
"""
Сгенерировать предложение с пропуском для заданного слова
Args :
2025-12-04 19:40:01 +03:00
word : Слово ( на языке обучения ) , для которого нужно создать предложение
learning_lang : Язык обучения ( ISO2 )
translation_lang : Язык перевода предложения ( ISO2 )
2025-12-08 16:43:08 +03:00
user_id : ID пользователя в БД для получения е г о модели
2025-12-04 14:46:30 +03:00
Returns :
Dict с предложением и правильным ответом
"""
2025-12-04 19:40:01 +03:00
prompt = f """ Создай предложение на языке { learning_lang } , используя слово " { word } " .
2025-12-04 14:46:30 +03:00
Замени это слово на пропуск " ___ " .
Верни ответ в формате JSON :
{ {
" sentence " : " предложение с пропуском ___ " ,
" answer " : " {word} " ,
2025-12-04 19:40:01 +03:00
" translation " : " перевод предложения на {translation_lang} "
2025-12-04 14:46:30 +03:00
} }
Предложение должно быть простым и естественным . Контекст должен четко подсказывать правильное слово . """
try :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] generate_fill_in_sentence: word= ' { word } ' , lang= ' { learning_lang } ' , to= ' { translation_lang } ' " )
2025-12-04 16:45:03 +03:00
messages = [
2025-12-04 19:40:01 +03:00
{ " role " : " system " , " content " : " Ты - преподаватель иностранных языков. Создавай простые и понятные упражнения. " } ,
2025-12-04 16:45:03 +03:00
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.7 , user_id = user_id )
2025-12-04 14:46:30 +03:00
import json
2025-12-04 16:45:03 +03:00
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] generate_fill_in_sentence: success " )
2025-12-04 14:46:30 +03:00
return result
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] generate_fill_in_sentence: { type ( e ) . __name__ } : { str ( e ) } " )
2025-12-04 14:46:30 +03:00
return {
" sentence " : f " I like to ___ every day. " ,
" answer " : word ,
" translation " : f " Мне нравится { word } каждый день. "
}
2025-12-08 16:43:08 +03:00
async def generate_sentence_for_translation ( self , word : str , learning_lang : str = " en " , translation_lang : str = " ru " , user_id : Optional [ int ] = None ) - > Dict :
2025-12-08 15:16:24 +03:00
"""
Сгенерировать предложение для перевода , содержащее заданное слово
Args :
word : Слово ( на языке обучения ) , которое должно быть в предложении
learning_lang : Язык обучения ( ISO2 )
translation_lang : Язык перевода ( ISO2 )
2025-12-08 16:43:08 +03:00
user_id : ID пользователя в БД для получения е г о модели
2025-12-08 15:16:24 +03:00
Returns :
Dict с предложением и е г о переводом
"""
prompt = f """ Создай простое предложение на языке { learning_lang } , используя слово " { word } " .
Верни ответ в формате JSON :
{ {
" sentence " : " предложение на {learning_lang} с о словом {word} " ,
" translation " : " перевод предложения на {translation_lang} "
} }
Предложение должно быть простым ( 5 - 10 слов ) , естественным и подходящим для изучения языка . """
try :
logger . info ( f " [AI Request] generate_sentence_for_translation: word= ' { word } ' , lang= ' { learning_lang } ' , to= ' { translation_lang } ' " )
messages = [
{ " role " : " system " , " content " : " Ты - преподаватель иностранных языков. Создавай простые и понятные примеры для практики перевода. " } ,
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.7 , user_id = user_id )
2025-12-08 15:16:24 +03:00
import json
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
logger . info ( f " [AI Response] generate_sentence_for_translation: success " )
return result
except Exception as e :
logger . error ( f " [AI Error] generate_sentence_for_translation: { type ( e ) . __name__ } : { str ( e ) } " )
# Fallback - простое предложение
return {
" sentence " : f " I use { word } every day. " ,
" translation " : f " Я использую { word } каждый день. "
}
2025-12-08 16:43:08 +03:00
async def generate_task_sentences_batch (
self ,
tasks_data : List [ Dict ] ,
learning_lang : str = " en " ,
translation_lang : str = " ru " ,
user_id : Optional [ int ] = None
) - > List [ Dict ] :
"""
Батч - генерация предложений для заданий за один запрос к AI .
Args :
tasks_data : Список словарей с информацией о заданиях :
[ { " word " : " run " , " task_type " : " fill_blank " } , { " word " : " eat " , " task_type " : " sentence_translate " } ]
learning_lang : Язык обучения
translation_lang : Язык перевода
user_id : ID пользователя в БД для получения е г о модели
Returns :
Список результатов в том же порядке
"""
if not tasks_data :
return [ ]
# Формируем описание заданий для промпта
tasks_description = [ ]
for i , task in enumerate ( tasks_data ) :
word = task . get ( ' word ' , ' ' )
task_type = task . get ( ' task_type ' , ' ' )
if task_type == ' fill_blank ' :
tasks_description . append (
f ' { i + 1 } . Слово " { word } " - создай предложение с пропуском (замени слово на ___) '
)
elif task_type == ' sentence_translate ' :
tasks_description . append (
f ' { i + 1 } . Слово " { word } " - создай простое предложение для перевода '
)
if not tasks_description :
return [ ]
2025-12-10 14:08:37 +03:00
# Инструкция для фуриганы в японском
furigana_instruction = " "
if learning_lang == " ja " :
furigana_instruction = """
- ОБЯЗАТЕЛЬНО : добавляй фуригану к кандзи в формате : 漢字 ( かんじ )
- Пример : 私 ( わたし ) は毎日 ( まいにち ) ___を読 ( よ ) みます 。 """
2025-12-08 16:43:08 +03:00
prompt = f """ Создай предложения на языке { learning_lang } для следующих заданий:
{ chr ( 10 ) . join ( tasks_description ) }
Верни ответ в формате JSON :
{ {
" results " : [
{ {
" sentence " : " предложение (с ___ для fill_blank) " ,
2025-12-10 19:42:10 +03:00
" full_sentence " : " полное предложение БЕЗ пропуска " ,
2025-12-08 16:43:08 +03:00
" answer " : " слово для пропуска (только для fill_blank) " ,
2025-12-10 19:42:10 +03:00
" translation " : " ПОЛНЫЙ перевод предложения на {translation_lang} (БЕЗ пропусков, БЕЗ слов на {learning_lang} ) "
2025-12-08 16:43:08 +03:00
} }
]
} }
Важно :
2025-12-10 19:42:10 +03:00
- Для fill_blank : замени целевое слово на ___ , укажи answer и full_sentence
2025-12-08 16:43:08 +03:00
- Для sentence_translate : просто предложение с о словом , answer не нужен
2025-12-10 19:42:10 +03:00
- translation должен быть ПОЛНЫМ переводом на { translation_lang } , без ___ и без слов на { learning_lang }
2025-12-08 16:43:08 +03:00
- Предложения должны быть простыми ( 5 - 10 слов )
2025-12-10 14:08:37 +03:00
- Контекст должен подсказывать правильное слово { furigana_instruction }
2025-12-08 16:43:08 +03:00
- Верни результаты В Т О М ЖЕ ПОРЯДКЕ что и задания """
try :
logger . info ( f " [AI Request] generate_task_sentences_batch: { len ( tasks_data ) } tasks, lang= ' { learning_lang } ' " )
messages = [
{ " role " : " system " , " content " : " Ты - преподаватель иностранных языков. Создавай простые и понятные упражнения. " } ,
{ " role " : " user " , " content " : prompt }
]
response_data = await self . _make_request ( messages , temperature = 0.7 , user_id = user_id )
import json
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
results = result . get ( ' results ' , [ ] )
logger . info ( f " [AI Response] generate_task_sentences_batch: got { len ( results ) } results " )
# Дополняем результаты до нужного количества если AI вернул меньше
while len ( results ) < len ( tasks_data ) :
task = tasks_data [ len ( results ) ]
word = task . get ( ' word ' , ' word ' )
results . append ( {
" sentence " : f " I use { word } every day. " if task . get ( ' task_type ' ) != ' fill_blank ' else f " I like to ___ every day. " ,
" answer " : word ,
" translation " : f " Fallback предложение "
} )
return results
except Exception as e :
logger . error ( f " [AI Error] generate_task_sentences_batch: { type ( e ) . __name__ } : { str ( e ) } " )
# Fallback - простые предложения для всех заданий
results = [ ]
for task in tasks_data :
word = task . get ( ' word ' , ' word ' )
if task . get ( ' task_type ' ) == ' fill_blank ' :
results . append ( {
" sentence " : f " I like to ___ every day. " ,
" answer " : word ,
" translation " : f " Мне нравится { word } каждый день. "
} )
else :
results . append ( {
" sentence " : f " I use { word } every day. " ,
" translation " : f " Я использую { word } каждый день. "
} )
return results
2025-12-06 21:29:41 +03:00
async def generate_thematic_words (
self ,
theme : str ,
level : str = " B1 " ,
count : int = 10 ,
learning_lang : str = " en " ,
translation_lang : str = " ru " ,
2025-12-08 16:43:08 +03:00
exclude_words : List [ str ] = None ,
user_id : Optional [ int ] = None
2025-12-06 21:29:41 +03:00
) - > List [ Dict ] :
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
"""
Сгенерировать подборку слов по теме
Args :
theme : Тема для подборки слов
level : Уровень сложности ( A1 - C2 )
count : Количество слов
2025-12-06 21:29:41 +03:00
learning_lang : Язык изучения
translation_lang : Язык перевода
exclude_words : Список слов для исключения ( уже известные )
2025-12-08 16:43:08 +03:00
user_id : ID пользователя в БД для получения е г о модели
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Returns :
Список словарей с информацией о словах
"""
2025-12-06 21:29:41 +03:00
exclude_instruction = " "
exclude_words_set = set ( )
if exclude_words :
# Ограничиваем список до 100 слов чтобы не раздувать промпт
words_sample = exclude_words [ : 100 ]
exclude_words_set = set ( w . lower ( ) for w in exclude_words )
exclude_instruction = f """
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
2025-12-06 21:29:41 +03:00
⚠ ️ ЗАПРЕЩЁННЫЕ СЛОВА ( Н Е ИСПОЛЬЗОВАТЬ ! ) :
{ ' , ' . join ( words_sample ) }
Эти слова пользователь уже знает . ОБЯЗАТЕЛЬНО выбери ДРУГИЕ слова ! """
2025-12-10 14:08:37 +03:00
# Инструкция для фуриганы в японском
furigana_instruction = " "
if learning_lang == " ja " :
furigana_instruction = """
- ОБЯЗАТЕЛЬНО : в примерах добавляй фуригану к кандзи в формате : 漢字 ( かんじ )
- Пример : 私 ( わたし ) は毎日 ( まいにち ) 本 ( ほん ) を読 ( よ ) みます 。 """
2025-12-06 21:29:41 +03:00
prompt = f """ Создай подборку из { count } слов на языке { learning_lang } по теме " { theme } " для уровня { level } . Переводы дай на { translation_lang } .
{ exclude_instruction }
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Верни ответ в формате JSON :
{ {
" theme " : " {theme} " ,
" words " : [
{ {
2025-12-04 19:40:01 +03:00
" word " : " слово на {learning_lang} " ,
" translation " : " перевод на {translation_lang} " ,
2025-12-10 14:08:37 +03:00
" transcription " : " транскрипция в IPA (для английского) или хирагана (для японского) " ,
2025-12-06 21:29:41 +03:00
" example " : " пример использования на {learning_lang} " ,
" example_translation " : " перевод примера на {translation_lang} "
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
} }
]
} }
Слова должны быть :
- Полезными и часто используемыми
- Соответствовать уровню { level }
- Связаны с темой " {theme} "
2025-12-10 14:08:37 +03:00
- Разнообразными ( существительные , глаголы , прилагательные ) { furigana_instruction } """
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
try :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] generate_thematic_words: theme= ' { theme } ' , level= ' { level } ' , count= { count } , learn= ' { learning_lang } ' , to= ' { translation_lang } ' " )
2025-12-04 16:45:03 +03:00
messages = [
2025-12-04 19:40:01 +03:00
{ " role " : " system " , " content " : " Ты - преподаватель иностранных языков. Подбирай полезные и актуальные слова. " } ,
2025-12-04 16:45:03 +03:00
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.7 , user_id = user_id )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
import json
2025-12-04 16:45:03 +03:00
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
2025-12-06 21:29:41 +03:00
words = result . get ( ' words ' , [ ] )
# Фильтруем слова которые AI мог вернуть несмотря на инструкцию
if exclude_words_set :
filtered_words = [
w for w in words
if w . get ( ' word ' , ' ' ) . lower ( ) not in exclude_words_set
]
filtered_count = len ( words ) - len ( filtered_words )
if filtered_count > 0 :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] generate_thematic_words: filtered out { filtered_count } excluded words " )
2025-12-06 21:29:41 +03:00
words = filtered_words
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] generate_thematic_words: success, generated { len ( words ) } words " )
2025-12-06 21:29:41 +03:00
return words
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] generate_thematic_words: { type ( e ) . __name__ } : { str ( e ) } " )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
return [ ]
2025-12-08 16:43:08 +03:00
async def extract_words_from_text ( self , text : str , level : str = " B1 " , max_words : int = 15 , learning_lang : str = " en " , translation_lang : str = " ru " , user_id : Optional [ int ] = None ) - > List [ Dict ] :
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
"""
Извлечь ключевые слова из текста для изучения
Args :
2025-12-08 16:43:08 +03:00
text : Текст на языке изучения
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
level : Уровень пользователя ( A1 - C2 )
max_words : Максимальное количество слов для извлечения
2025-12-08 16:43:08 +03:00
learning_lang : Язык изучения
translation_lang : Язык перевода
user_id : ID пользователя в БД для получения е г о модели
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Returns :
Список словарей с информацией о словах
"""
2025-12-10 14:08:37 +03:00
# Инструкция для фуриганы в японском
furigana_instruction = " "
if learning_lang == " ja " :
furigana_instruction = """
- ОБЯЗАТЕЛЬНО : в context добавляй фуригану к кандзи в формате : 漢字 ( かんじ )
- Для transcription используй хирагану """
2025-12-04 19:40:01 +03:00
prompt = f """ Проанализируй следующий текст на языке { learning_lang } и извлеки из него до { max_words } самых полезных слов для изучения на уровне { level } . Переводы дай на { translation_lang } .
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Текст :
{ text }
Верни ответ в формате JSON :
{ {
" words " : [
{ {
2025-12-04 19:40:01 +03:00
" word " : " слово на {learning_lang} (в базовой форме) " ,
" translation " : " перевод на {translation_lang} " ,
2025-12-10 14:08:37 +03:00
" transcription " : " транскрипция в IPA (для английского) или хирагана (для японского) " ,
2025-12-10 19:42:10 +03:00
" example " : " предложение из текста на {learning_lang} , где используется это слово " ,
" example_translation " : " перевод этого предложения на {translation_lang} "
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
} }
]
} }
Критерии отбора слов :
- Выбирай самые важные и полезные слова из текста
- Слова должны быть интересны для уровня { level }
- Н е включай простейшие слова ( a , the , is , и т . д . )
- Слова должны быть в базовой форме ( инфинитив для глаголов , ед . число для существительных )
2025-12-10 14:08:37 +03:00
- Разнообразие : существительные , глаголы , прилагательные , устойчивые выражения { furigana_instruction } """
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
try :
2025-12-04 16:45:03 +03:00
text_preview = text [ : 100 ] + " ... " if len ( text ) > 100 else text
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] extract_words_from_text: text_length= { len ( text ) } , level= ' { level } ' , max_words= { max_words } , learn= ' { learning_lang } ' , to= ' { translation_lang } ' " )
2025-12-04 16:45:03 +03:00
messages = [
2025-12-04 19:40:01 +03:00
{ " role " : " system " , " content " : " Ты - преподаватель иностранных языков. Помогаешь извлекать полезные слова для изучения из текстов. " } ,
2025-12-04 16:45:03 +03:00
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.5 , user_id = user_id )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
import json
2025-12-04 16:45:03 +03:00
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
words_count = len ( result . get ( ' words ' , [ ] ) )
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] extract_words_from_text: success, extracted { words_count } words " )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
return result . get ( ' words ' , [ ] )
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] extract_words_from_text: { type ( e ) . __name__ } : { str ( e ) } " )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
return [ ]
2025-12-08 16:43:08 +03:00
async def start_conversation ( self , scenario : str , level : str = " B1 " , learning_lang : str = " en " , translation_lang : str = " ru " , user_id : Optional [ int ] = None ) - > Dict :
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
"""
Начать диалоговую практику с AI
Args :
scenario : Сценарий диалога ( restaurant , shopping , travel , etc . )
level : Уровень пользователя ( A1 - C2 )
2025-12-08 16:43:08 +03:00
learning_lang : Язык изучения
translation_lang : Язык перевода
user_id : ID пользователя в БД для получения е г о модели
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Returns :
Dict с начальной репликой и контекстом
"""
scenarios = {
" restaurant " : " ресторан - заказ еды " ,
" shopping " : " магазин - покупка одежды " ,
" travel " : " аэропорт/отель - путешествие " ,
" work " : " офис - рабочая встреча " ,
" doctor " : " клиника - визит к врачу " ,
" casual " : " повседневный разговор "
}
2025-12-12 14:41:36 +03:00
# Если сценарий не найден в стандартных - значит это кастомный сценарий пользователя
scenario_desc = scenarios . get ( scenario , scenario )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
2025-12-04 20:48:38 +03:00
extra_fields = ' '
if learning_lang . lower ( ) == ' ja ' :
2025-12-04 21:37:21 +03:00
# Для японского просим версию с фуриганой в скобках ТОЛЬКО для кандзи
# Н е добавляй фуригану к кана или латинским буквам
extra_fields = " , \n \" message_annotated \" : \" фраза на {learning_lang} с фуриганой в скобках ТОЛЬКО к кандзи (Так правильно: いらっしゃいませ!今日は何を注文(ちゅうもん)しますか?, Так неправильно: こんにちは(こんにちは)!今日ははどうですか?); к こんにちは не добовляй фурагану; не добавляй фуригану к катакане, фуригане, хирагане, частице и латинице \" "
2025-12-04 20:48:38 +03:00
2025-12-04 19:40:01 +03:00
prompt = f """ Ты - собеседник для практики языка { learning_lang } уровня { level } .
Начни диалог в сценарии : { scenario_desc } на { learning_lang } .
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Верни ответ в формате JSON :
{ {
2025-12-04 19:40:01 +03:00
" message " : " твоя первая реплика на {learning_lang} " ,
" translation " : " перевод на {translation_lang} " ,
" context " : " краткое описание ситуации на {translation_lang} " ,
2025-12-04 21:37:21 +03:00
" suggestions " : [
{ { " learn " : " подсказка на {learning_lang} " , " learn_annotated " : " подсказка с фуриганой в скобках ТОЛЬКО к кандзи (Так правильно: いらっしゃいませ!今日は何を注文(ちゅうもん)しますか?, Так неправильно: こんにちは(こんにちは)!今日ははどうですか?); к こんにちは не добовляй фурагану; не добавляй фуригану к катакане, фуригане, хирагане, частице и латинице; {learning_lang} ) " , " trans " : " перевод подсказки на {translation_lang} " } } ,
{ { " learn " : " ... " , " learn_annotated " : " ... " , " trans " : " ... " } } ,
{ { " learn " : " ... " , " learn_annotated " : " ... " , " trans " : " ... " } }
] { extra_fields }
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
} }
Требования :
- Говори естественно , используй уровень { level }
- Создай интересную ситуацию
- Задай вопрос или начни разговор
- Подсказки должны помочь пользователю ответить """
try :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] start_conversation: scenario= ' { scenario } ' , level= ' { level } ' , learn= ' { learning_lang } ' , to= ' { translation_lang } ' " )
2025-12-04 16:45:03 +03:00
messages = [
2025-12-04 19:40:01 +03:00
{ " role " : " system " , " content " : " Ты - дружелюбный собеседник для практики иностранных языков. Веди естественный диалог. " } ,
2025-12-04 16:45:03 +03:00
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.8 , user_id = user_id )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
import json
2025-12-04 16:45:03 +03:00
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] start_conversation: success, scenario= ' { scenario } ' " )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
return result
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] start_conversation: { type ( e ) . __name__ } : { str ( e ) } " )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
return {
" message " : " Hello! How are you today? " ,
" translation " : " Привет! Как дела сегодня? " ,
2025-12-12 14:41:36 +03:00
" context " : scenario_desc ,
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
" suggestions " : [ " I ' m fine, thank you! " , " Good, and you? " , " Not bad! " ]
}
async def continue_conversation (
self ,
conversation_history : List [ Dict ] ,
user_message : str ,
scenario : str ,
2025-12-04 19:40:01 +03:00
level : str = " B1 " ,
learning_lang : str = " en " ,
2025-12-08 16:43:08 +03:00
translation_lang : str = " ru " ,
user_id : Optional [ int ] = None
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
) - > Dict :
"""
Продолжить диалог и проверить ответ пользователя
Args :
conversation_history : История диалога
user_message : Сообщение пользователя
scenario : Сценарий диалога
level : Уровень пользователя
2025-12-08 16:43:08 +03:00
learning_lang : Язык изучения
translation_lang : Язык перевода
user_id : ID пользователя в БД для получения е г о модели
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Returns :
Dict с ответом AI , проверкой и подсказками
"""
# Формируем историю для контекста
history_text = " \n " . join ( [
f " { ' AI ' if msg [ ' role ' ] == ' assistant ' else ' User ' } : { msg [ ' content ' ] } "
for msg in conversation_history [ - 6 : ] # Последние 6 сообщений
] )
2025-12-04 20:48:38 +03:00
extra_fields_resp = ' '
if learning_lang . lower ( ) == ' ja ' :
2025-12-04 21:37:21 +03:00
# Для японского просим версию ответа с фуриганой ТОЛЬКО для кандзи
# Н е добавляй фуригану к кана или латинским буквам
extra_fields_resp = " , \n \" response_annotated \" : \" ответ на {learning_lang} с фуриганой ТОЛЬКО для кандзи (напр.: 今日(きょう)); не добавляй фуригану к кана или латинице \" "
2025-12-04 20:48:38 +03:00
2025-12-04 19:40:01 +03:00
prompt = f """ Ты ведешь диалог на языке { learning_lang } уровня { level } в сценарии " { scenario } " .
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
История диалога :
{ history_text }
User : { user_message }
Верни ответ в формате JSON :
{ {
2025-12-04 19:40:01 +03:00
" response " : " твой ответ на {learning_lang} " ,
" translation " : " перевод твоего ответа на {translation_lang} " ,
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
" feedback " : { {
" has_errors " : true / false ,
" corrections " : " исправления ошибок пользователя (если есть) " ,
" comment " : " краткий комментарий о б ответе пользователя "
} } ,
2025-12-04 21:37:21 +03:00
" suggestions " : [
{ { " learn " : " подсказка на {learning_lang} " , " learn_annotated " : " подсказка с фуриганой (ТОЛЬКО для кандзи; {learning_lang} ) " , " trans " : " перевод подсказки на {translation_lang} " } } ,
{ { " learn " : " ... " , " learn_annotated " : " ... " , " trans " : " ... " } }
] { extra_fields_resp }
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
} }
Требования :
- Продолжай естественный диалог
- Если у пользователя есть грамматические или лексические ошибки , укажи их в corrections
- Будь дружелюбным и поддерживающим
- Используй лексику уровня { level } """
try :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] continue_conversation: scenario= ' { scenario } ' , level= ' { level } ' , history_length= { len ( conversation_history ) } , learn= ' { learning_lang } ' , to= ' { translation_lang } ' " )
2025-12-04 16:45:03 +03:00
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
# Формируем сообщения для API
messages = [
2025-12-04 19:40:01 +03:00
{ " role " : " system " , " content " : f " Ты - дружелюбный собеседник для практики языка { learning_lang } уровня { level } . Веди естественный диалог и помогай исправлять ошибки. " }
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
]
# Добавляем историю
for msg in conversation_history [ - 6 : ] :
messages . append ( msg )
# Добавляем текущее сообщение пользователя
messages . append ( { " role " : " user " , " content " : user_message } )
# Добавляем инструкцию для форматирования ответа
messages . append ( { " role " : " user " , " content " : prompt } )
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.8 , user_id = user_id )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
import json
2025-12-04 16:45:03 +03:00
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
has_errors = result . get ( ' feedback ' , { } ) . get ( ' has_errors ' , False )
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] continue_conversation: success, has_errors= { has_errors } " )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
return result
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] continue_conversation: { type ( e ) . __name__ } : { str ( e ) } " )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
return {
" response " : " I see. Tell me more about that. " ,
" translation " : " Понятно. Расскажи мне больше о б этом. " ,
" feedback " : {
" has_errors " : False ,
" corrections " : " " ,
" comment " : " Good! "
} ,
" suggestions " : [ " Sure! " , " Well... " , " Actually... " ]
}
2025-12-08 16:43:08 +03:00
async def generate_level_test ( self , learning_language : str = " en " , user_id : Optional [ int ] = None ) - > List [ Dict ] :
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
"""
2025-12-05 14:30:24 +03:00
Сгенерировать тест для определения уровня языка
Args :
learning_language : Язык изучения ( en , es , de , fr , ja )
2025-12-08 16:43:08 +03:00
user_id : ID пользователя в БД для получения е г о модели
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Returns :
Список из 7 вопросов разной сложности
"""
2025-12-05 14:30:24 +03:00
# Определяем систему уровней и язык для промпта
2025-12-10 14:08:37 +03:00
furigana_instruction = " "
2025-12-05 14:30:24 +03:00
if learning_language == " ja " :
level_system = " JLPT (N5-N1) "
language_name = " японского "
levels_req = """ - Вопросы 1-2: уровень N5 (базовый)
- Вопросы 3 - 4 : уровень N4 - N3 ( элементарный - средний )
- Вопросы 5 - 6 : уровень N2 ( продвинутый )
- Вопрос 7 : уровень N1 ( профессиональный ) """
level_example = " N5 "
2025-12-10 14:08:37 +03:00
furigana_instruction = """
- ОБЯЗАТЕЛЬНО : добавляй фуригану к кандзи в формате : 漢字 ( かんじ )
- Пример : 私 ( わたし ) は毎日 ( まいにち ) 学校 ( がっこう ) に行 ( い ) きます 。 """
2025-12-05 14:30:24 +03:00
else :
level_system = " CEFR (A1-C2) "
lang_names = { " en " : " английского " , " es " : " испанского " , " de " : " немецкого " , " fr " : " французского " }
language_name = lang_names . get ( learning_language , " английского " )
levels_req = """ - Вопросы 1-2: уровень A1 (базовый)
- Вопросы 3 - 4 : уровень A2 - B1 ( элементарный - средний )
- Вопросы 5 - 6 : уровень B2 - C1 ( продвинутый )
- Вопрос 7 : уровень C2 ( профессиональный ) """
level_example = " A1 "
prompt = f """ Создай тест из 7 вопросов для определения уровня { language_name } языка ( { level_system } ).
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Верни ответ в формате JSON :
2025-12-05 14:30:24 +03:00
{ {
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
" questions " : [
2025-12-05 14:30:24 +03:00
{ {
" question " : " текст вопроса на изучаемом языке " ,
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
" question_ru " : " перевод вопроса на русский " ,
" options " : [ " вариант A " , " вариант B " , " вариант C " , " вариант D " ] ,
" correct " : 0 ,
2025-12-05 14:30:24 +03:00
" level " : " {level_example} "
} }
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
]
2025-12-05 14:30:24 +03:00
} }
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
Требования :
2025-12-05 14:30:24 +03:00
{ levels_req }
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
- Каждый вопрос с 4 вариантами ответа
- correct - индекс правильного ответа ( 0 - 3 )
2025-12-10 14:08:37 +03:00
- Вопросы на грамматику , лексику и понимание { furigana_instruction } """
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
try :
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Request] generate_level_test: generating 7 questions for { learning_language } " )
2025-12-04 16:45:03 +03:00
2025-12-05 14:30:24 +03:00
system_msg = f " Ты - эксперт по тестированию уровня { language_name } языка. Создавай объективные тесты. "
2025-12-04 16:45:03 +03:00
messages = [
2025-12-05 14:30:24 +03:00
{ " role " : " system " , " content " : system_msg } ,
2025-12-04 16:45:03 +03:00
{ " role " : " user " , " content " : prompt }
]
2025-12-08 16:43:08 +03:00
response_data = await self . _make_request ( messages , temperature = 0.7 , user_id = user_id )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
import json
2025-12-04 16:45:03 +03:00
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
questions_count = len ( result . get ( ' questions ' , [ ] ) )
2025-12-08 15:16:24 +03:00
logger . info ( f " [AI Response] generate_level_test: success, generated { questions_count } questions " )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
return result . get ( ' questions ' , [ ] )
except Exception as e :
2025-12-08 15:16:24 +03:00
logger . error ( f " [AI Error] generate_level_test: { type ( e ) . __name__ } : { str ( e ) } , using fallback questions " )
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
# Fallback с базовыми вопросами
2025-12-05 14:30:24 +03:00
if learning_language == " ja " :
return self . _get_jlpt_fallback_questions ( )
return self . _get_cefr_fallback_questions ( )
2025-12-09 15:05:38 +03:00
async def generate_grammar_rule (
self ,
topic_name : str ,
topic_description : str ,
level : str ,
learning_lang : str = " en " ,
ui_lang : str = " ru " ,
user_id : Optional [ int ] = None
) - > str :
"""
Генерация объяснения грамматического правила .
Args :
topic_name : Название темы ( например , " Present Simple " )
topic_description : Описание темы ( например , " I work, he works " )
level : Уровень пользователя ( A1 - C2 или N5 - N1 )
learning_lang : Язык изучения
ui_lang : Язык интерфейса для объяснения
user_id : ID пользователя в БД
Returns :
Текст с объяснением правила
"""
if learning_lang == " ja " :
language_name = " японского "
else :
language_name = " английского "
prompt = f """ Объясни грамматическое правило " { topic_name } " ( { topic_description } ) для изучающих { language_name } язык.
Уровень ученика : { level }
Язык объяснения : { ui_lang }
Требования :
- Объяснение должно быть кратким и понятным ( 3 - 5 предложений )
- Приведи формулу / структуру правила
- Дай 2 - 3 примера с переводом
- Упомяни типичные ошибки ( если есть )
- Адаптируй сложность под уровень { level }
ВАЖНО - форматирование для Telegram ( используй ТОЛЬКО HTML теги , Н Е markdown ) :
- < b > жирный текст < / b > для важного ( Н Е * * жирный * * )
- < i > курсив < / i > для примеров ( Н Е * курсив * )
- Н Е используй звёздочки * , Н Е используй markdown
- Можно использовать эмодзи """
try :
logger . info ( f " [AI Request] generate_grammar_rule: topic= ' { topic_name } ' , level= ' { level } ' " )
messages = [
{ " role " : " system " , " content " : f " Ты - опытный преподаватель { language_name } языка. Объясняй правила просто и понятно. " } ,
{ " role " : " user " , " content " : prompt }
]
# Для этого запроса не используем JSON mode
model_name , provider = await self . _get_active_model ( user_id )
if provider == AIProvider . google :
response_data = await self . _make_google_request_text ( messages , temperature = 0.5 , model = model_name )
else :
response_data = await self . _make_openai_request_text ( messages , temperature = 0.5 , model = model_name )
rule_text = response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ]
# Конвертируем markdown в HTML на случай если AI использовал звёздочки
rule_text = self . _markdown_to_html ( rule_text )
logger . info ( f " [AI Response] generate_grammar_rule: success, { len ( rule_text ) } chars " )
return rule_text
except Exception as e :
logger . error ( f " [AI Error] generate_grammar_rule: { type ( e ) . __name__ } : { str ( e ) } " )
return f " 📖 <b> { topic_name } </b> \n \n { topic_description } \n \n Изучите это правило и приступайте к упражнениям. "
async def _make_google_request_text ( self , messages : list , temperature : float = 0.3 , model : str = " gemini-2.0-flash-lite " ) - > dict :
""" Запрос к Google без JSON mode (для текстовых ответов) """
url = f " { self . google_base_url } /models/ { model } :generateContent "
contents = [ ]
for msg in messages :
role = msg [ " role " ]
content = msg [ " content " ]
if role == " system " :
contents . insert ( 0 , { " role " : " user " , " parts " : [ { " text " : f " [System instruction]: { content } " } ] } )
elif role == " user " :
contents . append ( { " role " : " user " , " parts " : [ { " text " : content } ] } )
elif role == " assistant " :
contents . append ( { " role " : " model " , " parts " : [ { " text " : content } ] } )
payload = {
" contents " : contents ,
" generationConfig " : { " temperature " : temperature }
}
headers = {
" Content-Type " : " application/json " ,
" x-goog-api-key " : self . google_api_key
}
response = await self . http_client . post ( url , headers = headers , json = payload )
response . raise_for_status ( )
data = response . json ( )
text = data [ " candidates " ] [ 0 ] [ " content " ] [ " parts " ] [ 0 ] [ " text " ]
return { " choices " : [ { " message " : { " content " : text } } ] }
async def _make_openai_request_text ( self , messages : list , temperature : float = 0.3 , model : str = " gpt-4o-mini " ) - > dict :
""" Запрос к OpenAI без JSON mode (для текстовых ответов) """
url = f " { self . openai_base_url } /chat/completions "
headers = {
" Authorization " : f " Bearer { self . openai_api_key } " ,
" Content-Type " : " application/json "
}
payload = {
" model " : model ,
" messages " : messages ,
" temperature " : temperature
}
response = await self . http_client . post ( url , headers = headers , json = payload )
response . raise_for_status ( )
return response . json ( )
async def generate_grammar_exercise (
self ,
topic_id : str ,
topic_name : str ,
topic_description : str ,
level : str ,
learning_lang : str = " en " ,
translation_lang : str = " ru " ,
count : int = 3 ,
user_id : Optional [ int ] = None
) - > List [ Dict ] :
"""
Генерация грамматических упражнений по теме .
Args :
topic_id : ID темы ( например , " present_simple " )
topic_name : Название темы ( например , " Present Simple " )
topic_description : Описание темы ( например , " I work, he works " )
level : Уровень пользователя ( A1 - C2 или N5 - N1 )
learning_lang : Язык изучения
translation_lang : Язык перевода
count : Количество упражнений
user_id : ID пользователя в БД для получения е г о модели
Returns :
Список упражнений
"""
2025-12-10 14:08:37 +03:00
furigana_instruction = " "
2025-12-09 15:05:38 +03:00
if learning_lang == " ja " :
language_name = " японском "
2025-12-10 14:08:37 +03:00
furigana_instruction = """
- ОБЯЗАТЕЛЬНО : добавляй фуригану к кандзи в формате : 漢字 ( かんじ )
- Пример : 私 ( わたし ) は毎日 ( まいにち ) ___に行 ( い ) きます 。 """
2025-12-09 15:05:38 +03:00
else :
language_name = " английском "
prompt = f """ Создай { count } грамматических упражнения на тему " { topic_name } " ( { topic_description } ).
Уровень : { level }
Язык : { language_name }
Язык перевода : { translation_lang }
Верни ответ в формате JSON :
{ {
" exercises " : [
{ {
" sentence " : " предложение с пропуском ___ на {learning_lang} " ,
" translation " : " ПОЛНЫЙ перевод предложения на {translation_lang} (без пропусков, с правильным ответом) " ,
" correct_answer " : " правильный ответ для пропуска " ,
" hint " : " краткая подсказка на {translation_lang} (1-2 слова) " ,
" explanation " : " объяснение правила на {translation_lang} (1-2 предложения) "
} }
]
} }
Требования :
- Предложения должны быть естественными и полезными
- Пропуск обозначай как ___
- ВАЖНО : translation должен быть ПОЛНЫМ переводом готового предложения ( без пропусков ) , чтобы ученик понимал смысл
- Подсказка должна направлять к ответу , но не содержать е г о
- Объяснение должно быть понятным для уровня { level }
2025-12-10 14:08:37 +03:00
- Сложность должна соответствовать уровню { level } { furigana_instruction } """
2025-12-09 15:05:38 +03:00
try :
logger . info ( f " [AI Request] generate_grammar_exercise: topic= ' { topic_name } ' , level= ' { level } ' " )
messages = [
{ " role " : " system " , " content " : f " Ты - преподаватель { language_name } языка. Создавай качественные упражнения. Отвечай только JSON. " } ,
{ " role " : " user " , " content " : prompt }
]
response_data = await self . _make_request ( messages , temperature = 0.7 , user_id = user_id )
import json
result = json . loads ( response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ] )
exercises = result . get ( ' exercises ' , [ ] )
logger . info ( f " [AI Response] generate_grammar_exercise: success, { len ( exercises ) } exercises generated " )
return exercises
except Exception as e :
logger . error ( f " [AI Error] generate_grammar_exercise: { type ( e ) . __name__ } : { str ( e ) } " )
# Fallback с простым упражнением
return [ {
" sentence " : f " Example sentence with ___ ( { topic_name } ) " ,
" translation " : " Пример предложения " ,
" correct_answer " : " answer " ,
" hint " : " hint " ,
" explanation " : f " This exercise is about { topic_name } . "
} ]
2025-12-05 14:30:24 +03:00
def _get_cefr_fallback_questions ( self ) - > List [ Dict ] :
""" Fallback вопросы для CEFR (английский и европейские языки) """
return [
{
" question " : " What is your name? " ,
" question_ru " : " Как тебя зовут? " ,
" options " : [ " My name is " , " I am name " , " Name my is " , " Is name my " ] ,
" correct " : 0 ,
" level " : " A1 "
} ,
{
" question " : " I ___ to school every day. " ,
" question_ru " : " Я ___ в школу каждый день. " ,
" options " : [ " go " , " goes " , " going " , " went " ] ,
" correct " : 0 ,
" level " : " A1 "
} ,
{
" question " : " She ___ been to Paris twice. " ,
" question_ru " : " Она ___ в Париже дважды. " ,
" options " : [ " have " , " has " , " had " , " having " ] ,
" correct " : 1 ,
" level " : " A2 "
} ,
{
" question " : " If I ___ rich, I would travel the world. " ,
" question_ru " : " Если бы я был богат, я бы путешествовал по миру. " ,
" options " : [ " am " , " was " , " were " , " be " ] ,
" correct " : 2 ,
" level " : " B1 "
} ,
{
" question " : " The project ___ by next Monday. " ,
" question_ru " : " Проект ___ к следующему понедельнику. " ,
" options " : [ " will complete " , " will be completed " , " completes " , " is completing " ] ,
" correct " : 1 ,
" level " : " B2 "
} ,
{
" question " : " Had I known about the meeting, I ___ attended. " ,
" question_ru " : " Если бы я знал о встрече, я бы посетил. " ,
" options " : [ " would have " , " will have " , " would " , " will " ] ,
" correct " : 0 ,
" level " : " C1 "
} ,
{
" question " : " The nuances of his argument were so ___ that few could grasp them. " ,
" question_ru " : " Нюансы е г о аргумента были настолько ___, что немногие могли их понять. " ,
" options " : [ " subtle " , " obvious " , " simple " , " clear " ] ,
" correct " : 0 ,
" level " : " C2 "
}
]
2025-12-10 11:00:30 +03:00
async def generate_words_of_day_batch (
2025-12-09 15:05:38 +03:00
self ,
2025-12-10 11:00:30 +03:00
language : str ,
levels : List [ str ] ,
2025-12-09 15:05:38 +03:00
translation_lang : str = " ru " ,
2025-12-10 11:00:30 +03:00
excluded_words : Dict [ str , List [ str ] ] = None
) - > Optional [ Dict [ str , Dict ] ] :
2025-12-09 15:05:38 +03:00
"""
2025-12-10 11:00:30 +03:00
Генерация слов дня для всех уровней одного языка за один запрос .
2025-12-09 15:05:38 +03:00
Args :
2025-12-10 11:00:30 +03:00
language : Язык изучения ( en / ja )
levels : Список уровней ( A1 - C2 или N5 - N1 )
2025-12-09 15:05:38 +03:00
translation_lang : Язык перевода
2025-12-10 11:00:30 +03:00
excluded_words : Dict { level : [ excluded_words ] } для исключения
2025-12-09 15:05:38 +03:00
Returns :
2025-12-10 11:00:30 +03:00
Dict { level : word_data } или None при ошибке
2025-12-09 15:05:38 +03:00
"""
2025-12-10 11:00:30 +03:00
language_names = { " en " : " английский " , " ja " : " японский " }
language_name = language_names . get ( language , " английский " )
2025-12-09 15:05:38 +03:00
2025-12-10 11:00:30 +03:00
translation_names = { " ru " : " русский " , " en " : " английский " , " ja " : " японский " }
2025-12-09 15:05:38 +03:00
translation_name = translation_names . get ( translation_lang , " русский " )
2025-12-10 11:00:30 +03:00
# Формируем список исключений по уровням
excluded_info = " "
2025-12-09 15:05:38 +03:00
if excluded_words :
2025-12-10 11:00:30 +03:00
excluded_parts = [ ]
for level , words in excluded_words . items ( ) :
if words :
excluded_parts . append ( f " - { level } : { ' , ' . join ( words [ : 15 ] ) } " )
if excluded_parts :
excluded_info = " \n \n Н Е используй эти слова (уже были недавно):\n " + " \n " . join ( excluded_parts )
2025-12-09 15:05:38 +03:00
2025-12-10 11:00:30 +03:00
levels_str = " , " . join ( levels )
2025-12-09 15:05:38 +03:00
2025-12-10 14:08:37 +03:00
# Инструкция для фуриганы в японском
furigana_instruction = " "
if language == " ja " :
furigana_instruction = """
- ОБЯЗАТЕЛЬНО : в примерах ( sentence ) добавляй фуригану к кандзи в формате : 漢字 ( かんじ )
- Пример : 私 ( わたし ) は毎日 ( まいにち ) 本 ( ほん ) を読 ( よ ) みます 。 """
2025-12-10 11:00:30 +03:00
prompt = f """ Сгенерируй " слово дня " для изучающих { language_name } язык на каждом из уровней: { levels_str } .
Требования для каждого слова :
2025-12-09 15:05:38 +03:00
- Слово должно быть полезным и интересным
2025-12-10 11:00:30 +03:00
- Строго соответствовать указанному уровню сложности
- Желательно с интересной этимологией или фактом
2025-12-10 14:08:37 +03:00
- В с е слова должны быть РАЗНЫМИ { furigana_instruction } { excluded_info }
2025-12-09 15:05:38 +03:00
2025-12-10 11:00:30 +03:00
Верни JSON объект , где ключи - уровни ( { levels_str } ) :
2025-12-09 15:05:38 +03:00
{ {
2025-12-10 11:00:30 +03:00
" {levels[0]} " : { {
" word " : " слово на {language_name} " ,
" transcription " : " транскрипция (IPA для английского, хирагана для японского) " ,
" translation " : " перевод на {translation_name} " ,
" examples " : [
{ { " sentence " : " пример предложения " , " translation " : " перевод примера " } } ,
{ { " sentence " : " второй пример " , " translation " : " перевод " } }
] ,
" synonyms " : " с ино ним1, с ино ним2" ,
" etymology " : " краткий интересный факт (1-2 предложения) "
} } ,
. . . ( для каждого уровня )
2025-12-09 15:05:38 +03:00
} } """
try :
2025-12-10 11:00:30 +03:00
logger . info ( f " [AI Request] generate_words_of_day_batch: lang= ' { language } ' , levels= { levels } " )
2025-12-09 15:05:38 +03:00
messages = [
2025-12-10 11:00:30 +03:00
{ " role " : " system " , " content " : " Ты - опытный лингвист. Отвечай только валидным JSON без markdown. " } ,
2025-12-09 15:05:38 +03:00
{ " role " : " user " , " content " : prompt }
]
2025-12-10 11:00:30 +03:00
model_name , provider = await self . _get_active_model ( None )
2025-12-09 15:05:38 +03:00
if provider == AIProvider . google :
response_data = await self . _make_google_request ( messages , temperature = 0.8 , model = model_name )
else :
response_data = await self . _make_openai_request ( messages , temperature = 0.8 , model = model_name )
content = response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ]
content = self . _strip_markdown_code_block ( content )
result = json . loads ( content )
2025-12-10 11:00:30 +03:00
logger . info ( f " [AI Response] generate_words_of_day_batch: generated { len ( result ) } words " )
2025-12-09 15:05:38 +03:00
return result
except Exception as e :
2025-12-10 11:00:30 +03:00
logger . error ( f " [AI Error] generate_words_of_day_batch: { type ( e ) . __name__ } : { str ( e ) } " )
2025-12-09 15:05:38 +03:00
return None
async def generate_mini_story (
self ,
genre : str ,
level : str ,
learning_lang : str = " en " ,
translation_lang : str = " ru " ,
user_id : Optional [ int ] = None ,
num_questions : int = 5
) - > Optional [ Dict ] :
"""
Генерация мини - истории для чтения .
Args :
genre : Жанр ( dialogue , news , story , letter , recipe )
level : Уровень ( A1 - C2 или N5 - N1 )
learning_lang : Язык истории
translation_lang : Язык переводов
user_id : ID пользователя для выбора модели
num_questions : Количество вопросов ( из настроек пользователя )
Returns :
Dict с полями : title , content , vocabulary , questions , word_count
"""
import json
language_names = {
" en " : " английский " ,
" ja " : " японский "
}
language_name = language_names . get ( learning_lang , " английский " )
translation_names = {
" ru " : " русский " ,
" en " : " английский " ,
" ja " : " японский "
}
translation_name = translation_names . get ( translation_lang , " русский " )
genre_descriptions = {
" dialogue " : " разговорный диалог между людьми " ,
" news " : " короткая новостная статья " ,
" story " : " художественный рассказ с сюжетом " ,
" letter " : " email или письмо " ,
" recipe " : " рецепт блюда с инструкциями "
}
genre_desc = genre_descriptions . get ( genre , " короткий рассказ " )
# Определяем длину текста по уровню
word_counts = {
" A1 " : " 50-80 " , " N5 " : " 30-50 " ,
" A2 " : " 80-120 " , " N4 " : " 50-80 " ,
" B1 " : " 120-180 " , " N3 " : " 80-120 " ,
" B2 " : " 180-250 " , " N2 " : " 120-180 " ,
" C1 " : " 250-350 " , " N1 " : " 180-250 " ,
" C2 " : " 300-400 "
}
word_range = word_counts . get ( level , " 100-150 " )
# Генерируем примеры вопросов для промпта
questions_examples = [ ]
for i in range ( num_questions ) :
questions_examples . append ( f ''' {{
" question " : " Вопрос { i + 1} на понимание на {translation_name} " ,
" options " : [ " вариант 1 " , " вариант 2 " , " вариант 3 " ] ,
" correct " : { i % 3 }
} } ''' )
questions_json = " , \n " . join ( questions_examples )
2025-12-10 14:08:37 +03:00
# Специальные инструкции для японского языка
japanese_instructions = " "
if learning_lang == " ja " :
japanese_instructions = """
- ОБЯЗАТЕЛЬНО : Для КАЖДОГО кандзи добавляй фуригану в формате : 漢字 ( かんじ )
- Пример : 私 ( わたし ) は毎日 ( まいにち ) 学校 ( がっこう ) に行 ( い ) きます 。
- Это критически важно для изучающих японский ! """
2025-12-09 15:05:38 +03:00
prompt = f """ Создай { genre_desc } на { language_name } языке для уровня { level } .
Требования :
- Длина : { word_range } слов
- Используй лексику и грамматику подходящую для уровня { level }
- История должна быть интересной и законченной
- Выдели 5 - 8 ключевых слов которые могут быть новыми для изучающего
2025-12-10 14:08:37 +03:00
- Добавь полный перевод текста на { translation_name } язык { japanese_instructions }
2025-12-09 15:05:38 +03:00
Верни JSON :
{ {
" title " : " Название истории на {language_name} " ,
" content " : " Полный текст истории " ,
" translation " : " Полный перевод истории на {translation_name} " ,
" vocabulary " : [
{ { " word " : " слово " , " translation " : " перевод на {translation_name} " , " transcription " : " транскрипция " } } ,
. . .
] ,
" questions " : [
{ questions_json }
] ,
" word_count " : чис ло _с ло в_в_те кс те
} }
Важно :
- Создай ровно { num_questions } вопросов на понимание текста
- У каждого вопроса ровно 3 варианта ответа
- correct — индекс правильного ответа ( 0 , 1 или 2 ) """
try :
logger . info ( f " [AI Request] generate_mini_story: genre= ' { genre } ' , level= ' { level } ' , lang= ' { learning_lang } ' " )
messages = [
{ " role " : " system " , " content " : " Ты - автор адаптированных текстов для изучающих иностранные языки. " } ,
{ " role " : " user " , " content " : prompt }
]
model_name , provider = await self . _get_active_model ( user_id )
if provider == AIProvider . google :
response_data = await self . _make_google_request ( messages , temperature = 0.8 , model = model_name )
else :
response_data = await self . _make_openai_request ( messages , temperature = 0.8 , model = model_name )
content = response_data [ ' choices ' ] [ 0 ] [ ' message ' ] [ ' content ' ]
content = self . _strip_markdown_code_block ( content )
result = json . loads ( content )
logger . info ( f " [AI Response] generate_mini_story: title= ' { result . get ( ' title ' , ' N/A ' ) } ' , words= { result . get ( ' word_count ' , 0 ) } " )
return result
except Exception as e :
logger . error ( f " [AI Error] generate_mini_story: { type ( e ) . __name__ } : { str ( e ) } " )
return None
2025-12-05 14:30:24 +03:00
def _get_jlpt_fallback_questions ( self ) - > List [ Dict ] :
""" Fallback вопросы для JLPT (японский) """
return [
{
" question " : " これは ___です。 " ,
" question_ru " : " Это ___. " ,
" options " : [ " ほん " , " 本ん " , " ぼん " , " もと " ] ,
" correct " : 0 ,
" level " : " N5 "
} ,
{
" question " : " 私は毎日学校に___。 " ,
" question_ru " : " Я каждый день хожу в школу. " ,
" options " : [ " いきます " , " いくます " , " いきす " , " いきました " ] ,
" correct " : 0 ,
" level " : " N5 "
} ,
{
" question " : " 昨日、映画を___から、今日は勉強します。 " ,
" question_ru " : " Вчера я посмотрел фильм, поэтому сегодня буду учиться. " ,
" options " : [ " 見た " , " 見て " , " 見る " , " 見ない " ] ,
" correct " : 0 ,
" level " : " N4 "
} ,
{
" question " : " この本は読み___です。 " ,
" question_ru " : " Эту книгу легко/трудно читать. " ,
" options " : [ " やすい " , " にくい " , " たい " , " そう " ] ,
" correct " : 0 ,
" level " : " N3 "
} ,
{
" question " : " 彼の話を聞く___、涙が出てきた。 " ,
" question_ru " : " Слушая е г о рассказ, у меня потекли слёзы. " ,
" options " : [ " につれて " , " にしたがって " , " とともに " , " うちに " ] ,
" correct " : 0 ,
" level " : " N2 "
} ,
{
" question " : " その計画は実現不可能と___。 " ,
" question_ru " : " Этот план считается невыполнимым. " ,
" options " : [ " 言わざるを得ない " , " 言うまでもない " , " 言いかねない " , " 言うに及ばない " ] ,
" correct " : 0 ,
" level " : " N2 "
} ,
{
" question " : " 彼の行動は___に堪えない。 " ,
" question_ru " : " Е г о поведение невозможно понять/вынести." ,
" options " : [ " 理解 " , " 批判 " , " 説明 " , " 弁解 " ] ,
" correct " : 0 ,
" level " : " N1 "
}
]
Добавлены основные функции MVP: тематические подборки, импорт слов, диалоговая практика, напоминания и тест уровня
Новые команды:
- /words [тема] - AI-генерация тематических подборок слов (10 слов по теме с учётом уровня)
- /import - извлечение до 15 ключевых слов из текста (книги, статьи, песни)
- /practice - диалоговая практика с AI в 6 сценариях (ресторан, магазин, путешествие, работа, врач, общение)
- /reminder - настройка ежедневных напоминаний по расписанию
- /level_test - тест из 7 вопросов для определения уровня английского (A1-C2)
Основные изменения:
- AI сервис: добавлены методы generate_thematic_words, extract_words_from_text, start_conversation, continue_conversation, generate_level_test
- Диалоговая практика: исправление ошибок в реальном времени, подсказки, перевод реплик
- Напоминания: APScheduler для ежедневной отправки напоминаний в выбранное время
- Тест уровня: автоматическое определение уровня при регистрации, можно пропустить
- База данных: добавлены поля reminders_enabled, last_reminder_sent
- Vocabulary service: метод get_word_by_original для проверки дубликатов
- Зависимости: apscheduler==3.10.4
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 15:46:02 +03:00
2025-12-04 11:09:54 +03:00
# Глобальный экземпляр сервиса
ai_service = AIService ( )