chore: sync local changes

This commit is contained in:
2026-03-01 12:55:17 +03:00
parent 27ee32be38
commit f1bc254c6b
8 changed files with 192 additions and 292 deletions

View File

@@ -1,7 +1,4 @@
"""AI module with pluggable providers."""
# Модуль общения с искусственным интеллектом.
# Обрабатывает запросы пользователя и переводы через выбранный API-провайдер.
"""AI module."""
import json
import re
@@ -31,8 +28,7 @@ from .config import (
_HTTP = requests.Session()
# Системный промпт (инструкция) для AI.
# Задает личность ассистента: имя "Александр", стиль общения, краткость.
# Системный промпт
SYSTEM_PROMPT = """Ты — Александр, умный голосовой ассистент с человеческим поведением.
Веди себя как живой человек: будь дружелюбным, естественным и немного эмоциональным, где это уместно.
Твоя главная цель — помогать пользователю и поддерживать интересный диалог.
@@ -45,8 +41,7 @@ SYSTEM_PROMPT += (
'"language":"ru","style":["дружелюбный","естественный","краткий"],"format":"plain"}'
)
# Системный промпт для режима переводчика.
# Требует возвращать ТОЛЬКО перевод, без лишних слов ("Конечно, вот перевод...").
# Промпт для перевода
TRANSLATION_SYSTEM_PROMPT = """You are a translation engine.
Translate from {source} to {target}.
Return 2-3 short translation variants only.
@@ -69,9 +64,7 @@ _PROVIDER_ALIASES = {
"zai": "zai",
}
# В реальном .env у пользователя должен быть активен только один AI-ключ.
# Поэтому настройки храним в одном словаре, а ниже отдельно проверяем конфликт
# конфигурации, чтобы ассистент не делал "лучшее предположение" молча.
# В .env нужен только один AI-ключ
_PROVIDER_SETTINGS = {
"perplexity": {
"provider": "perplexity",
@@ -140,8 +133,8 @@ def _normalize_provider_name(provider_name: str) -> str:
def _get_provider_settings():
# Сначала ищем реально активные ключи. Это главный источник истины:
# если ключ один, используем именно его, даже если AI_PROVIDER указан иначе.
"""Определяет какой AI провайдер использовать."""
# Ищем активные ключи
configured = [
cfg
for cfg in _PROVIDER_SETTINGS.values()
@@ -150,7 +143,11 @@ def _get_provider_settings():
if len(configured) == 1:
cfg = configured[0]
requested = _normalize_provider_name(AI_PROVIDER)
if requested and requested in _PROVIDER_SETTINGS and requested != cfg["provider"]:
if (
requested
and requested in _PROVIDER_SETTINGS
and requested != cfg["provider"]
):
print(
f"⚠️ AI_PROVIDER={AI_PROVIDER!r} не совпадает с единственным "
f"активным ключом {cfg['name']}. Используем {cfg['name']}."
@@ -223,6 +220,7 @@ def _build_headers(cfg):
def _split_system_messages(messages):
"""Извлекает system prompt из списка сообщений."""
system_parts = []
chat_messages = []
@@ -238,7 +236,6 @@ def _split_system_messages(messages):
role = "user"
chat_messages.append({"role": role, "content": content})
# Anthropic хранит системную инструкцию отдельно от обычной истории чата.
return "\n\n".join(system_parts), chat_messages