chore: sync local changes
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user