Последние 3 месяца живу в парадигме, где повседневные приложения на телефоне постепенно превращаются в текстовые команды в терминале. Звучит как откат в 90-е, но на практике это быстрее, удобнее и мощнее, чем тыкать по вкладкам в мобильном приложении. В этой статье расскажу, как появился skill для управления личным кабинетом СберМобайл через Claude Code/OpenClaw/KimiClaw.

Что такое Claude Code Skills

Claude Code — это CLI‑агент от Anthropic, который живёт в терминале и умеет выполнять задачи: писать код, работать с файлами, запускать команды. Но самое интересное — это система skills (в терминологии Anthropic — slash commands). Skill — это markdown‑файл, который описывает для Claude новую способность: какие API вызывать, как авторизоваться, что отвечать пользователю.

Кладёшь файл в ~/.claude/commands/, вызываешь через /имя‑скилла, и Claude получает контекст: документацию API, примеры вызовов, правила форматирования ответов. Дальше он сам решает, какие запросы отправить и как интерпретировать результат. Не нужно ни фронтенда, ни мобильного приложения — только терминал и естественный язык.

Эксперимент — Dodo Pizza

Всё началось с пиццы. Я захотел заказать Додо Пиццу, не открывая приложение. Написал в терминале /dodo, и Claude стал моим курьерским ассистентом: показывает меню, ищет по названию, показывает корзину и профиль.

Технически Dodo Pizza skill работает через Puppeteer — headless Chrome. Причина проста: сайт dodopizza.ru стоит за ServicePipe (антибот‑защита), и любые прямые HTTP‑запросы получают 403. Приходится эмулировать полноценный браузер. Авторизация вообще требует видимый Chrome с reCAPTCHA. Это работает, но решение тяжёлое: Chrome жрёт память, запуск медленный, а капча требует ручного вмешательства.

После Dodo я задумался: а что если следующий skill можно сделать чище — без браузера, без капчи, на чистых REST‑вызовах?

Зачем мне skill для мобильного оператора

Пользуюсь СберМобайл. Звоню много, раздаю интернет с телефона, периодически проверяю остатки. Каждый раз это одна и та же последовательность: открыть приложение, подождать пока загрузится, потыкать по вкладкам. Три нажатия, чтобы узнать сколько гигабайт осталось. Пять нажатий, чтобы посмотреть какие услуги подключены.

А ещё я хотел видеть всю картину разом: остатки, тариф, подключённые услуги, бонусы — одним вопросом. Ни одно мобильное приложение так не умеет, потому что информация размазана по разным экранам. AI‑агент может собрать данные из нескольких API‑эндпоинтов и дать сводку за один ответ.

Как устроен SberMobile skill

Разведка API

Первый шаг — понять, как устроен личный кабинет. Открыл lk.sbermobile.ru в Chrome DevTools и начал записывать сетевые запросы. SPA‑приложение, база API — https://lk.sbermobile.ru/v2/api/. Все данные приходят в JSON. Никакого антибота, никакого ServicePipe — просто REST API за авторизацией. После Dodo Pizza это было как глоток свежего воздуха.
Токен передаётся в заголовке token: значение, а не в стандартном Authorization: Bearer. Номер телефона — 10 цифр без +7, в поле number, а не phone. Все суммы — в копейках: 39 000 это 390 рублей.

Архитектура

В итоге получилась такая структура:

sbermobile-skill/
|-- client/
|   |-- __init__.py
|   |-- sbermobile_client.py    # REST-клиент
|-- skills/
|   |-- base.py                 # Базовый класс Skill
|   |-- account/                # get_balance, get_remainders
|   |-- tariff/                 # get_current, list_available
|   |-- services/               # list_current, get_campaigns
|-- examples/
|   |-- agent_demo.py           # Интерактивный AI-агент
|-- docs/
|   |-- api-reference.md
|-- SKILL.md                    # Описание для Claude Code
|-- requirements.txt            # requests
|-- README.md

Два слоя: Python‑клиент (SberMobileClient) и набор AI‑skills поверх него.

Python‑клиент

SberMobileClient — это обёртка над requests. Один файл, ~350 строк, зависимость одна — requests. Поддерживает авторизацию через SMS OTP, автоматически сохраняет и подгружает токен из /tmp/sbermobile_token.json. Все методы — read‑only GET‑запросы: тариф, остатки, услуги, платежи, промо, семья.

Авторизация выглядит так:

c = SberMobileClient()
c.request_otp('+79XXXXXXXXX')  -- SMS уходит на телефон
c.submit_otp('+79XXXXXXXXX', '1234')  -- токен сохраняется
-- дальше всё автоматически

Токен живёт долго, и при следующем запуске клиент подхватывает его сам. Не нужно авторизовываться каждый раз.

Skills — атомарные способности агента

Каждый skill — это Python‑класс, наследник базового Skill. У него есть имя, описание для LLM (когда и зачем вызывать), JSON Schema входных параметров и метод execute(). Skill может вызывать один или несколько методов клиента и агрегировать результат.

Шесть skills покрывают основные сценарии:

account.get_balance -- рекомендуемое пополнение, автоплатёж, бонусы СберСпасибо
account.get_remainders -- остатки пакетов: ГБ, минуты, SMS
tariff.get_current -- текущий тариф + доступные для перехода
tariff.list_available -- витрина тарифов
services.list_current -- подключённые опции
services.get_campaigns -- промо-акции, персональные предложения

Все skills read‑only. Write‑операции (смена тарифа, подключение опции) в API существуют, но я сознательно их не реализовал в публичной версии. Smart executor умеет запрашивать подтверждение пользователя перед write‑операциями, но пока эта механика ждёт своего часа.

SKILL.md — точка входа для Claude Code

Файл SKILL.md — это то, что Claude Code читает при вызове /sbermobile. Он содержит инструкции: как создать клиент, какие методы вызывать, как обработать ошибки авторизации. Фактически это prompt, который превращает Claude из универсального ассистента в оператора моего личного кабинета.

agent_demo.py — автономный агент

Помимо skill для Claude Code, в проекте есть standalone‑агент (examples/agent_demo.py). Это полноценный agentic loop: пользователь пишет вопрос, Claude решает какие skills вызвать, получает результат, формулирует ответ. Всё на Anthropic Python SDK — 130 строк кода. Можно запустить без Claude Code, хоть в Jupyter, хоть на сервере.

Демо

Вот пять типичных вопросов, которые я задаю своему оператору через терминал. Каждый ответ — это один или несколько API‑вызовов, которые Claude делает автоматически.

«Сколько осталось пакета»

Один skill-вызов, один API-запрос. Claude парсит JSON с пакетами и выдаёт человекочитаемую сводку.
Один skill‑вызов, один API‑запрос. Claude парсит JSON с пакетами и выдаёт человекочитаемую сводку.

«Какой у меня тариф и сколько я плачу?»

Здесь Claude вызывает tariff.get_current и сам конвертирует копейки в рубли.
Здесь Claude вызывает tariff.get_current и сам конвертирует копейки в рубли.

«Какие услуги у меня подключены?»

Claude разделяет платные и бесплатные опции, показывает стоимость каждой.
Claude разделяет платные и бесплатные опции, показывает стоимость каждой.

«Сколько не хватает»

Два API-вызова в одном skill: рекомендуемая сумма пополнения и состояние программы лояльности.
Два API‑вызова в одном skill: рекомендуемая сумма пополнения и состояние программы лояльности.

«Какие есть акции или предложения для меня?»

Claude вытаскивает промо-кампании и формулирует их понятным языком, без маркетингового мусора.
Claude вытаскивает промо‑кампании и формулирует их понятным языком, без маркетингового мусора.

Помогает найти инсайт

Пополнить баланс не заходя в банк

Что дальше

Интересно, как традиционные интерфейсы веб‑сайтов и мобильных приложений могут трансформироваться и стать пережитком прошлого. Основная сложность любых интерфейсов — это их адаптация под пользователя и донесение функционала без перегрузки. Кажется, в будущем, где живут агенты, пользовательский интерфейс в классическом понимании теряет свою ценность. Мы переходим на этап гипер‑персонализации, когда пользователь может самостоятельно собрать свой собственный личный кабинет для взаимодействия с конкретным продуктом или его объединение с сторонними.

Кажется, такие сложные трансформации займут годы, но если диффузия фундаментальных моделей и сторонних продуктов продолжится, то мы увидим более глубокую интеграцию и смену юнит‑экономик продуктов.