Клиент обобщён, снята привязка к видеокартам

GPU это лишь один из тарифов, а клиент общего назначения. Примеры переписаны
на обычные серверы, добавлен пример с масштабированием под нагрузку.

Claude-Session: https://claude.ai/code/session_01Loz5stgQZH6ofBdMqTxiJu
Этот коммит содержится в:
2026-08-23 18:18:27 +09:00
родитель bb66bc1681
Коммит a106ba5b6b
6 изменённых файлов: 167 добавлений и 82 удалений
+8 -8
Просмотреть файл
@@ -10,14 +10,13 @@ API устроено как у DigitalOcean, сервер там называе
print(s["id"], s["name"], s["status"])
Зачем обёртка, если API простое. Затем, что у него есть неочевидные места,
на которые мы уже наступили и которые тут обойдены.
собранные на живых серверах и обойдённые тут.
Адрес машины лежит в поле ip, а не в networks, оно всегда пустое.
Снимок нельзя снять с остановленной машины, API сам её останавливает по offline.
Сразу после снимка машина сидит в locked и удаляться отказывается примерно полминуты,
поэтому удаление тут настойчивое, иначе забытая машина будет тикать по деньгам.
Тарифы с видеокартами метод sizes не показывает вовсе, хотя создание с ними работает,
их список лежит в docs_slugs.md.
Адрес сервера лежит в поле ip, а не в networks, оно всегда пустое.
Снимок снимается только с работающего сервера, останавливает его платформа сама по offline.
Сразу после снимка сервер сидит в locked и удаляться отказывается примерно полминуты,
поэтому удаление настойчивое, иначе забытый сервер продолжит тарифицироваться.
Метод sizes возвращает не все линейки тарифов, полный список смотрите в панели управления.
"""
from __future__ import annotations
@@ -50,7 +49,8 @@ class RegCloud:
return r.json().get("sizes", [])
def gpu_sizes(self) -> list[dict]:
"""Тарифы с видеокартой. У них в описании или в названии есть упоминание gpu."""
"""Отбор тарифов с видеокартой, если они вам нужны.
Учтите, что sizes() возвращает не все линейки, полный список в панели управления."""
out = []
for s in self.sizes():
blob = json.dumps(s, ensure_ascii=False).lower()