Изменено: - services/ai_service.py - автоматическое использование Cloudflare Gateway - config/settings.py - настройки CLOUDFLARE_ACCOUNT_ID и CLOUDFLARE_GATEWAY_ID - .env.example - добавлены переменные Cloudflare - README.md - секция о Cloudflare AI Gateway Создано: - docs/CLOUDFLARE_GATEWAY.md - подробная документация Преимущества: 🚀 Кэширование запросов - экономия до 99% на повторных запросах 📊 Аналитика - детальная статистика использования AI 💰 Контроль расходов - мониторинг стоимости 🛡️ Безопасность - защита API ключей и rate limiting Использование: 1. Создать Gateway на dash.cloudflare.com 2. Добавить CLOUDFLARE_ACCOUNT_ID в .env 3. Все запросы автоматически пойдут через Cloudflare Для отключения оставьте CLOUDFLARE_ACCOUNT_ID пустым. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
133 lines
5.3 KiB
Python
133 lines
5.3 KiB
Python
from openai import AsyncOpenAI
|
||
from config.settings import settings
|
||
from typing import Dict, List
|
||
|
||
|
||
class AIService:
|
||
"""Сервис для работы с OpenAI API через Cloudflare Gateway"""
|
||
|
||
def __init__(self):
|
||
# Проверяем, настроен ли Cloudflare AI Gateway
|
||
if settings.cloudflare_account_id:
|
||
# Используем Cloudflare AI Gateway
|
||
base_url = (
|
||
f"https://gateway.ai.cloudflare.com/v1/"
|
||
f"{settings.cloudflare_account_id}/"
|
||
f"{settings.cloudflare_gateway_id}/"
|
||
f"openai"
|
||
)
|
||
self.client = AsyncOpenAI(
|
||
api_key=settings.openai_api_key,
|
||
base_url=base_url
|
||
)
|
||
else:
|
||
# Прямое подключение к OpenAI
|
||
self.client = AsyncOpenAI(api_key=settings.openai_api_key)
|
||
|
||
async def translate_word(self, word: str, target_lang: str = "ru") -> Dict:
|
||
"""
|
||
Перевести слово и получить дополнительную информацию
|
||
|
||
Args:
|
||
word: Слово для перевода
|
||
target_lang: Язык перевода (по умолчанию русский)
|
||
|
||
Returns:
|
||
Dict с переводом, транскрипцией и примерами
|
||
"""
|
||
prompt = f"""Переведи английское слово/фразу "{word}" на русский язык.
|
||
|
||
Верни ответ строго в формате JSON:
|
||
{{
|
||
"word": "{word}",
|
||
"translation": "перевод",
|
||
"transcription": "транскрипция в IPA",
|
||
"examples": [
|
||
{{"en": "пример на английском", "ru": "перевод примера"}},
|
||
{{"en": "ещё один пример", "ru": "перевод примера"}}
|
||
],
|
||
"category": "категория слова (работа, еда, путешествия и т.д.)",
|
||
"difficulty": "уровень сложности (A1/A2/B1/B2/C1/C2)"
|
||
}}
|
||
|
||
Важно: верни только JSON, без дополнительного текста."""
|
||
|
||
try:
|
||
response = await self.client.chat.completions.create(
|
||
model="gpt-4o-mini",
|
||
messages=[
|
||
{"role": "system", "content": "Ты - помощник для изучения английского языка. Отвечай только в формате JSON."},
|
||
{"role": "user", "content": prompt}
|
||
],
|
||
temperature=0.3,
|
||
response_format={"type": "json_object"}
|
||
)
|
||
|
||
import json
|
||
result = json.loads(response.choices[0].message.content)
|
||
return result
|
||
|
||
except Exception as e:
|
||
# Fallback в случае ошибки
|
||
return {
|
||
"word": word,
|
||
"translation": "Ошибка перевода",
|
||
"transcription": "",
|
||
"examples": [],
|
||
"category": "unknown",
|
||
"difficulty": "A1"
|
||
}
|
||
|
||
async def check_answer(self, question: str, correct_answer: str, user_answer: str) -> Dict:
|
||
"""
|
||
Проверить ответ пользователя с помощью ИИ
|
||
|
||
Args:
|
||
question: Вопрос задания
|
||
correct_answer: Правильный ответ
|
||
user_answer: Ответ пользователя
|
||
|
||
Returns:
|
||
Dict с результатом проверки и обратной связью
|
||
"""
|
||
prompt = f"""Проверь ответ пользователя на задание по английскому языку.
|
||
|
||
Задание: {question}
|
||
Правильный ответ: {correct_answer}
|
||
Ответ пользователя: {user_answer}
|
||
|
||
Верни ответ в формате JSON:
|
||
{{
|
||
"is_correct": true/false,
|
||
"feedback": "краткое объяснение (если ответ неверный, объясни ошибку и дай правильный вариант)",
|
||
"score": 0-100
|
||
}}
|
||
|
||
Учитывай возможные вариации ответа. Если смысл передан правильно, даже с небольшими грамматическими неточностями, засчитывай ответ."""
|
||
|
||
try:
|
||
response = await self.client.chat.completions.create(
|
||
model="gpt-4o-mini",
|
||
messages=[
|
||
{"role": "system", "content": "Ты - преподаватель английского языка. Проверяй ответы справедливо, учитывая контекст."},
|
||
{"role": "user", "content": prompt}
|
||
],
|
||
temperature=0.3,
|
||
response_format={"type": "json_object"}
|
||
)
|
||
|
||
import json
|
||
result = json.loads(response.choices[0].message.content)
|
||
return result
|
||
|
||
except Exception as e:
|
||
return {
|
||
"is_correct": False,
|
||
"feedback": "Ошибка проверки ответа",
|
||
"score": 0
|
||
}
|
||
|
||
|
||
# Глобальный экземпляр сервиса
|
||
ai_service = AIService()
|