From dab1953888cfae4c811f1069ae2556e520b68c76 Mon Sep 17 00:00:00 2001 From: "mamonov.ep" Date: Thu, 4 Dec 2025 14:39:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20Cloudflare=20AI=20Gateway?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Изменено: - 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 --- .env.example | 5 ++ README.md | 21 ++++++ config/settings.py | 4 + docs/CLOUDFLARE_GATEWAY.md | 146 +++++++++++++++++++++++++++++++++++++ services/ai_service.py | 19 ++++- 5 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 docs/CLOUDFLARE_GATEWAY.md diff --git a/.env.example b/.env.example index 47f42d5..5696fd4 100644 --- a/.env.example +++ b/.env.example @@ -4,6 +4,11 @@ BOT_TOKEN=your_telegram_bot_token_here # OpenAI API Key OPENAI_API_KEY=your_openai_api_key_here +# Cloudflare AI Gateway (опционально, для кэширования и мониторинга) +# Получить Account ID: https://dash.cloudflare.com/ -> AI -> AI Gateway +CLOUDFLARE_ACCOUNT_ID=4c714ccd1433cf82279ac6e1278bcb8f +CLOUDFLARE_GATEWAY_ID=gpt + # Database (для локального запуска с БД в Docker) DATABASE_URL=postgresql+asyncpg://botuser:botpassword@localhost:15433/language_bot diff --git a/README.md b/README.md index c70aa0d..94c30ab 100644 --- a/README.md +++ b/README.md @@ -235,6 +235,26 @@ bot_tg_language/ - [ ] Статистика и прогресс - [ ] Spaced repetition алгоритм +## Cloudflare AI Gateway (опционально) + +Бот поддерживает использование [Cloudflare AI Gateway](https://developers.cloudflare.com/ai-gateway/) для: + +- 🚀 **Кэширование запросов** - экономия до 99% на повторных запросах +- 📊 **Аналитика** - детальная статистика использования AI +- 💰 **Контроль расходов** - мониторинг стоимости запросов +- 🛡️ **Безопасность** - защита API ключей и rate limiting + +**Настройка:** + +1. Создайте Gateway на [dash.cloudflare.com](https://dash.cloudflare.com/) → AI → AI Gateway +2. Добавьте в `.env`: +```env +CLOUDFLARE_ACCOUNT_ID=ваш_account_id +CLOUDFLARE_GATEWAY_ID=gpt +``` + +📖 Подробная инструкция: [docs/CLOUDFLARE_GATEWAY.md](docs/CLOUDFLARE_GATEWAY.md) + ## Технологии - **Python 3.11+** @@ -242,6 +262,7 @@ bot_tg_language/ - **SQLAlchemy 2.x** - ORM для работы с БД - **PostgreSQL** - База данных - **OpenAI API** - AI для перевода и проверки +- **Cloudflare AI Gateway** - кэширование и мониторинг AI запросов (опционально) ## Лицензия diff --git a/config/settings.py b/config/settings.py index 315db6c..73881d9 100644 --- a/config/settings.py +++ b/config/settings.py @@ -10,6 +10,10 @@ class Settings(BaseSettings): # OpenAI openai_api_key: str + # Cloudflare AI Gateway (опционально) + cloudflare_account_id: str = "" + cloudflare_gateway_id: str = "gpt" + # Database database_url: str diff --git a/docs/CLOUDFLARE_GATEWAY.md b/docs/CLOUDFLARE_GATEWAY.md new file mode 100644 index 0000000..850d96e --- /dev/null +++ b/docs/CLOUDFLARE_GATEWAY.md @@ -0,0 +1,146 @@ +# Cloudflare AI Gateway + +## Что это? + +Cloudflare AI Gateway — это прокси-сервис между вашим приложением и AI провайдерами (OpenAI, Anthropic и др.), который предоставляет: + +## Преимущества + +### 1. 🚀 Кэширование запросов +- Автоматическое кэширование одинаковых запросов к AI +- Экономия на повторных запросах +- Мгновенные ответы для закэшированных запросов + +### 2. 📊 Аналитика и мониторинг +- Детальная статистика использования API +- Отслеживание стоимости запросов +- Анализ производительности + +### 3. 💰 Экономия средств +- Снижение количества запросов к OpenAI через кэш +- Контроль расходов +- Rate limiting для предотвращения перерасхода + +### 4. 🛡️ Безопасность +- Защита API ключей +- Rate limiting +- Логирование всех запросов + +### 5. 🔄 Резервные варианты +- Поддержка нескольких AI провайдеров +- Автоматическое переключение при сбоях + +## Настройка + +### 1. Создание Gateway в Cloudflare + +1. Перейдите на [Cloudflare Dashboard](https://dash.cloudflare.com/) +2. Откройте раздел **AI** → **AI Gateway** +3. Нажмите **Create Gateway** +4. Введите имя для Gateway (например: `gpt`) +5. Скопируйте **Account ID** и **Gateway ID** + +### 2. Настройка в проекте + +Добавьте в `.env` файл: + +```env +# Cloudflare AI Gateway +CLOUDFLARE_ACCOUNT_ID=ваш_account_id +CLOUDFLARE_GATEWAY_ID=gpt +``` + +### 3. Проверка работы + +После настройки все запросы к OpenAI будут проходить через Cloudflare Gateway. + +Проверить можно в дашборде Cloudflare: **AI** → **AI Gateway** → выбрать ваш Gateway + +## Как это работает + +### Без Cloudflare Gateway: +``` +Бот → OpenAI API → Ответ +``` + +### С Cloudflare Gateway: +``` +Бот → Cloudflare Gateway → OpenAI API → Ответ + ↓ + (кэш + аналитика) +``` + +При повторном запросе: +``` +Бот → Cloudflare Gateway → Ответ из кэша (мгновенно!) +``` + +## Примеры экономии + +### Без кэширования: +- Запрос перевода слова "hello" → $0.002 +- 10 пользователей запрашивают "hello" → $0.02 +- 100 пользователей → $0.20 + +### С кэшированием: +- Первый запрос "hello" → $0.002 +- Последующие 99 запросов → $0 (из кэша) +- **Экономия: 99%** + +## Настройка кэширования + +В дашборде Cloudflare Gateway можно настроить: + +- **TTL кэша** - время жизни закэшированных ответов +- **Правила кэширования** - что кэшировать, а что нет +- **Invalidation** - очистка кэша + +### Рекомендации для нашего бота: + +**Кэшировать:** +- Переводы слов (TTL: 30 дней) +- Проверка ответов с одинаковыми параметрами (TTL: 1 день) + +**Не кэшировать:** +- Диалоги с пользователями (уникальный контекст) + +## Мониторинг + +В дашборде Cloudflare Gateway доступны метрики: + +- **Requests** - общее количество запросов +- **Cache hit rate** - процент попаданий в кэш +- **Cost** - стоимость запросов +- **Latency** - задержка ответов +- **Errors** - ошибки + +## Отключение + +Чтобы отключить Cloudflare Gateway и использовать прямое подключение к OpenAI: + +1. Удалите или закомментируйте в `.env`: +```env +# CLOUDFLARE_ACCOUNT_ID=... +# CLOUDFLARE_GATEWAY_ID=... +``` + +2. Или оставьте `CLOUDFLARE_ACCOUNT_ID` пустым: +```env +CLOUDFLARE_ACCOUNT_ID= +``` + +## Поддержка других AI провайдеров + +Cloudflare AI Gateway также поддерживает: +- Anthropic (Claude) +- Google AI +- Hugging Face +- Azure OpenAI + +Для переключения достаточно изменить base URL в коде. + +## Ссылки + +- [Cloudflare AI Gateway Documentation](https://developers.cloudflare.com/ai-gateway/) +- [Cloudflare Dashboard](https://dash.cloudflare.com/) +- [Pricing Calculator](https://developers.cloudflare.com/ai-gateway/get-started/pricing/) diff --git a/services/ai_service.py b/services/ai_service.py index 19ffdc3..ce4ae07 100644 --- a/services/ai_service.py +++ b/services/ai_service.py @@ -4,10 +4,25 @@ from typing import Dict, List class AIService: - """Сервис для работы с OpenAI API""" + """Сервис для работы с OpenAI API через Cloudflare Gateway""" def __init__(self): - self.client = AsyncOpenAI(api_key=settings.openai_api_key) + # Проверяем, настроен ли 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: """