Add OpenRouter provider and remove Perplexity

This commit is contained in:
2026-03-07 19:59:01 +03:00
parent bed4ba36d7
commit 167ddc9264
4 changed files with 31 additions and 31 deletions

View File

@@ -2,10 +2,10 @@
# Если одновременно указать несколько AI ключей, колонка выдаст ошибку. # Если одновременно указать несколько AI ключей, колонка выдаст ошибку.
AI_PROVIDER= AI_PROVIDER=
# Perplexity # OpenRouter
# PERPLEXITY_API_KEY=your_perplexity_api_key_here # OPENROUTER_API_KEY=your_openrouter_api_key_here
PERPLEXITY_MODEL=llama-3.1-sonar-small-128k-chat OPENROUTER_MODEL=openai/gpt-4o-mini
PERPLEXITY_API_URL=https://api.perplexity.ai/chat/completions OPENROUTER_API_URL=https://openrouter.ai/api/v1/chat/completions
# OpenAI # OpenAI
# OPENAI_API_KEY=your_openai_api_key_here # OPENAI_API_KEY=your_openai_api_key_here

View File

@@ -26,7 +26,7 @@
- Follow-up окно 4 секунды после ответа: если пользователь молчит, ассистент возвращается к ожиданию wake word. - Follow-up окно 4 секунды после ответа: если пользователь молчит, ассистент возвращается к ожиданию wake word.
- Распознавание речи через Deepgram (WebSocket, VAD, fast stop). - Распознавание речи через Deepgram (WebSocket, VAD, fast stop).
- Озвучка через Silero TTS (RU + EN, с прерыванием по wake word). - Озвучка через Silero TTS (RU + EN, с прерыванием по wake word).
- AI-диалог через Perplexity, OpenAI, Gemini, Z.ai и Anthropic Claude API со streaming-ответом и контекстом. - AI-диалог через OpenRouter, OpenAI, Gemini, Z.ai и Anthropic Claude API со streaming-ответом и контекстом.
- Перевод RU -> EN и EN -> RU. - Перевод RU -> EN и EN -> RU.
- Погода: текущий прогноз по городу по умолчанию или по названию города. - Погода: текущий прогноз по городу по умолчанию или по названию города.
- Таймеры, будильники (включая будни/выходные), секундомеры. - Таймеры, будильники (включая будни/выходные), секундомеры.
@@ -84,7 +84,7 @@ cp .env.example .env
```ini ```ini
AI_PROVIDER= # опционально; можно оставить пустым AI_PROVIDER= # опционально; можно оставить пустым
# Раскомментируйте только один AI API KEY: # Раскомментируйте только один AI API KEY:
# PERPLEXITY_API_KEY=... # OPENROUTER_API_KEY=...
# OPENAI_API_KEY=... # OPENAI_API_KEY=...
# GEMINI_API_KEY=... # GEMINI_API_KEY=...
# ZAI_API_KEY=... # ZAI_API_KEY=...
@@ -122,10 +122,10 @@ python run.py
| Переменная | Обязательно | По умолчанию | Назначение | | Переменная | Обязательно | По умолчанию | Назначение |
|---|---|---|---| |---|---|---|---|
| `AI_PROVIDER` | Нет | `perplexity` | Опциональный провайдер AI (`perplexity`, `openai`, `gemini`, `zai`, `anthropic`; также понимает `claude`) | | `AI_PROVIDER` | Нет | `openrouter` | Опциональный провайдер AI (`openrouter`, `openai`, `gemini`, `zai`, `anthropic`; также понимает `claude`) |
| `PERPLEXITY_API_KEY` | Да* | - | Ключ Perplexity API (*если выбран Perplexity и только этот AI ключ активен) | | `OPENROUTER_API_KEY` | Да* | - | Ключ OpenRouter API (*если выбран OpenRouter и только этот AI ключ активен) |
| `PERPLEXITY_MODEL` | Нет | `llama-3.1-sonar-small-128k-chat` | Модель Perplexity | | `OPENROUTER_MODEL` | Нет | `openai/gpt-4o-mini` | Модель OpenRouter |
| `PERPLEXITY_API_URL` | Нет | `https://api.perplexity.ai/chat/completions` | Endpoint Perplexity Chat Completions | | `OPENROUTER_API_URL` | Нет | `https://openrouter.ai/api/v1/chat/completions` | Endpoint OpenRouter Chat Completions |
| `OPENAI_API_KEY` | Да* | - | Ключ OpenAI API (*если выбран OpenAI и только этот AI ключ активен) | | `OPENAI_API_KEY` | Да* | - | Ключ OpenAI API (*если выбран OpenAI и только этот AI ключ активен) |
| `OPENAI_MODEL` | Нет | `gpt-4o-mini` | Модель OpenAI | | `OPENAI_MODEL` | Нет | `gpt-4o-mini` | Модель OpenAI |
| `OPENAI_API_URL` | Нет | `https://api.openai.com/v1/chat/completions` | Endpoint OpenAI Chat Completions | | `OPENAI_API_URL` | Нет | `https://api.openai.com/v1/chat/completions` | Endpoint OpenAI Chat Completions |

View File

@@ -18,9 +18,9 @@ from .config import (
OPENAI_API_KEY, OPENAI_API_KEY,
OPENAI_API_URL, OPENAI_API_URL,
OPENAI_MODEL, OPENAI_MODEL,
PERPLEXITY_API_KEY, OPENROUTER_API_KEY,
PERPLEXITY_API_URL, OPENROUTER_API_URL,
PERPLEXITY_MODEL, OPENROUTER_MODEL,
ZAI_API_KEY, ZAI_API_KEY,
ZAI_API_URL, ZAI_API_URL,
ZAI_MODEL, ZAI_MODEL,
@@ -50,14 +50,14 @@ Separate variants with " / " (space slash space).
Keep the translation максимально кратким и естественным, без лишних слов.""" Keep the translation максимально кратким и естественным, без лишних слов."""
_PROVIDER_ALIASES = { _PROVIDER_ALIASES = {
"": "perplexity", "": "openrouter",
"anthropic": "anthropic", "anthropic": "anthropic",
"claude": "anthropic", "claude": "anthropic",
"claude_anthropic": "anthropic", "claude_anthropic": "anthropic",
"gemini": "gemini", "gemini": "gemini",
"google": "gemini", "google": "gemini",
"openai": "openai", "openai": "openai",
"perplexity": "perplexity", "openrouter": "openrouter",
"z.ai": "zai", "z.ai": "zai",
"z-ai": "zai", "z-ai": "zai",
"z_ai": "zai", "z_ai": "zai",
@@ -66,15 +66,15 @@ _PROVIDER_ALIASES = {
# В .env нужен только один AI-ключ # В .env нужен только один AI-ключ
_PROVIDER_SETTINGS = { _PROVIDER_SETTINGS = {
"perplexity": { "openrouter": {
"provider": "perplexity", "provider": "openrouter",
"protocol": "openai_compatible", "protocol": "openai_compatible",
"api_key": PERPLEXITY_API_KEY, "api_key": OPENROUTER_API_KEY,
"model": PERPLEXITY_MODEL, "model": OPENROUTER_MODEL,
"api_url": PERPLEXITY_API_URL, "api_url": OPENROUTER_API_URL,
"name": "Perplexity", "name": "OpenRouter",
"key_var": "PERPLEXITY_API_KEY", "key_var": "OPENROUTER_API_KEY",
"model_var": "PERPLEXITY_MODEL", "model_var": "OPENROUTER_MODEL",
}, },
"openai": { "openai": {
"provider": "openai", "provider": "openai",
@@ -169,10 +169,10 @@ def _get_provider_settings():
supported = ", ".join(sorted(_PROVIDER_SETTINGS)) supported = ", ".join(sorted(_PROVIDER_SETTINGS))
print( print(
f"⚠️ Неизвестный AI_PROVIDER={AI_PROVIDER!r}, используем Perplexity. " f"⚠️ Неизвестный AI_PROVIDER={AI_PROVIDER!r}, используем OpenRouter. "
f"Поддерживаются: {supported}." f"Поддерживаются: {supported}."
) )
return _PROVIDER_SETTINGS["perplexity"], None return _PROVIDER_SETTINGS["openrouter"], None
def _content_to_text(content) -> str: def _content_to_text(content) -> str:

View File

@@ -20,13 +20,13 @@ load_dotenv(BASE_DIR / ".env")
# --- Настройки AI --- # --- Настройки AI ---
# AI_PROVIDER опционален. Приоритет у единственного активного AI API key. # AI_PROVIDER опционален. Приоритет у единственного активного AI API key.
# Если активных ключей несколько, AI-модуль вернет ошибку конфигурации. # Если активных ключей несколько, AI-модуль вернет ошибку конфигурации.
AI_PROVIDER = os.getenv("AI_PROVIDER", "perplexity").strip().lower() AI_PROVIDER = os.getenv("AI_PROVIDER", "openrouter").strip().lower()
# Perplexity # OpenRouter
PERPLEXITY_API_KEY = os.getenv("PERPLEXITY_API_KEY") OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY")
PERPLEXITY_MODEL = os.getenv("PERPLEXITY_MODEL", "llama-3.1-sonar-small-128k-chat") OPENROUTER_MODEL = os.getenv("OPENROUTER_MODEL", "openai/gpt-4o-mini")
PERPLEXITY_API_URL = os.getenv( OPENROUTER_API_URL = os.getenv(
"PERPLEXITY_API_URL", "https://api.perplexity.ai/chat/completions" "OPENROUTER_API_URL", "https://openrouter.ai/api/v1/chat/completions"
) )
# OpenAI # OpenAI