Клиент к ИИ-платформе REG.RU

Обёртка над ai.reg.cloud. Протокол совместим с OpenAI, но у платформы свои
особенности: ключ бывает открыт не ко всем моделям, отказ приходит отдельным
кодом, картинки и речь доступны не всем.

Что внутри:
- синхронный и асинхронный клиенты
- каскад моделей на случай, если часть закрыта или занята
- ремонт оборванного json из ответов
- чистка типографики и отлов иероглифов в русском тексте

Claude-Session: https://claude.ai/code/session_01Loz5stgQZH6ofBdMqTxiJu
Этот коммит содержится в:
2026-08-23 16:58:07 +09:00
Коммит 428cff8c54
7 изменённых файлов: 450 добавлений и 0 удалений
+13
Просмотреть файл
@@ -0,0 +1,13 @@
"""Простейший пример. Перед запуском положите ключ в REGCLOUD_AI_KEY."""
from regcloud_ai import RegCloudAI
ai = RegCloudAI()
print("доступные модели:")
for m in ai.models():
print(" ", m)
answer = ai.chat("Придумай короткий заголовок для ролика про локальные нейросети",
model="qwen3.7-max", max_tokens=200)
print(f"\n{answer.text}")
print(f"модель {answer.model}, токенов {answer.usage.total_tokens}, {answer.seconds}с")
+19
Просмотреть файл
@@ -0,0 +1,19 @@
"""Каскад моделей асинхронно. Идём сверху вниз, пока кто-нибудь не ответит."""
import asyncio
from regcloud_ai import AsyncRegCloudAI
from regcloud_ai.client import normalize, foreign_chars
CASCADE = ["claude-5-sonnet", "gpt-5.5", "qwen3.7-max", "glm-5.2"]
async def main():
async with AsyncRegCloudAI() as ai:
answer = await ai.cascade(
"Напиши два живых предложения про нейросети. Без канцелярита и без двоеточий.",
models=CASCADE, max_tokens=300)
text = normalize(answer.text)
print(f"[{answer.model}, {answer.seconds}с] {text}")
bad = foreign_chars(text)
if bad:
print("внимание, чужие символы в тексте:", " ".join(bad))
asyncio.run(main())