73 lines
2.8 KiB
Python
73 lines
2.8 KiB
Python
|
|
"""make llm-check: один запрос к LLM, чтобы убедиться, что ключ и адрес рабочие.
|
|||
|
|
|
|||
|
|
Ключ берётся из backend/.env и никуда не печатается. Запускать там, где есть
|
|||
|
|
сеть до провайдера: из WSL под VPN российские адреса недоступны.
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import sys
|
|||
|
|
import time
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
import httpx
|
|||
|
|
|
|||
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|||
|
|
sys.path.insert(0, str(ROOT))
|
|||
|
|
|
|||
|
|
from app.config import get_settings # noqa: E402
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main() -> int:
|
|||
|
|
settings = get_settings()
|
|||
|
|
if not settings.llm_api_key:
|
|||
|
|
print("в backend/.env нет LLM_API_KEY")
|
|||
|
|
return 1
|
|||
|
|
|
|||
|
|
print(f"адрес: {settings.llm_base_url}")
|
|||
|
|
print(f"модель: {settings.llm_model_caller}")
|
|||
|
|
|
|||
|
|
body = {
|
|||
|
|
"model": settings.llm_model_caller,
|
|||
|
|
"messages": [
|
|||
|
|
{"role": "system", "content": "Ты звонящий в службу 112, у тебя горит балкон. "
|
|||
|
|
"Ответь одной короткой фразой, в панике."},
|
|||
|
|
{"role": "user", "content": "Служба 112, что у вас случилось?"},
|
|||
|
|
],
|
|||
|
|
"max_tokens": 60,
|
|||
|
|
"temperature": 0.8,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
started = time.monotonic()
|
|||
|
|
try:
|
|||
|
|
response = httpx.post(
|
|||
|
|
f"{settings.llm_base_url}/chat/completions",
|
|||
|
|
headers={"Authorization": f"Bearer {settings.llm_api_key}"},
|
|||
|
|
json=body,
|
|||
|
|
timeout=60,
|
|||
|
|
)
|
|||
|
|
except httpx.HTTPError as exc:
|
|||
|
|
print(f"\nсеть: {type(exc).__name__} — до провайдера не достучались.")
|
|||
|
|
print("Проверь, что российские адреса идут мимо VPN.")
|
|||
|
|
return 2
|
|||
|
|
|
|||
|
|
elapsed = time.monotonic() - started
|
|||
|
|
print(f"\nHTTP {response.status_code}, {elapsed:.2f} с")
|
|||
|
|
|
|||
|
|
if response.status_code == 200:
|
|||
|
|
data = response.json()
|
|||
|
|
print("ответ модели:", data["choices"][0]["message"]["content"].strip())
|
|||
|
|
usage = data.get("usage", {})
|
|||
|
|
print("токены:", usage.get("prompt_tokens"), "→", usage.get("completion_tokens"))
|
|||
|
|
print("\nКЛЮЧ РАБОТАЕТ")
|
|||
|
|
return 0
|
|||
|
|
|
|||
|
|
print("ответ сервера:", response.text[:400])
|
|||
|
|
if response.status_code in (401, 403):
|
|||
|
|
print("\nСеть в порядке, но ключ не принят: возможно, его нужно менять "
|
|||
|
|
"на временный токен — сверься с консолью Cloud.ru.")
|
|||
|
|
elif response.status_code == 404:
|
|||
|
|
print("\nКлюч принят, но такой модели нет: проверь LLM_MODEL_CALLER.")
|
|||
|
|
return 3
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
raise SystemExit(main())
|