Часть запросов с телефона хочется держать на самом устройстве — там приватно, работает без сети и не тратит деньги, — а тяжёлые задачи отправлять в облако, где модель умнее. Гибридный роутинг — это правило, которое автоматически решает, какой запрос пойдёт на локальную модель (on-device, то есть прямо на чипе iPhone, без сервера), а какой — на облачную через API (программный интерфейс, через который приложение общается с чужим сервером). Гайд для iPhone с актуальной версией iOS, где есть системное приложение «Команды» (Shortcuts — конструктор автоматизаций из блоков), плюс одно приложение с локальной моделью и один API-ключ облачного провайдера. Если вы ещё не запускали модель локально — начните с гайда для компьютера, там разобраны форматы весов и квантизация.


1. Проверьте локальную ветку отдельно от всех автоматизаций. Откройте приложение с моделью, загрузите веса (файлы модели) и задайте простой вопрос. Затем включите авиарежим и повторите вопрос.
**Пример:** вопрос «Сократи это письмо до трёх строк» → ответ приходит без Wi-Fi и мобильных данных.
Ожидаемый результат: ответ есть при выключенной сети. Почему это работает: вычисления идут на чипе телефона, сеть не участвует.
2. Проверьте облачную ветку «руками». Отправьте один тестовый запрос curl-ом или через консоль провайдера — так вы убедитесь, что ключ живой, до того как засунете его в автоматизацию.
**Пример:** запрос с телом `{"model": "<имя модели>", "messages": [{"role": "user", "content": "ping"}]}` → возвращается JSON с полем ответа.
Ожидаемый результат: статус 200 и осмысленный ответ. Если пришло 401 — ключ неверный, чинить нужно здесь, а не в шорткате.
3. Откройте «Команды» и создайте новый шорткат с именем `Умный роутер`. Добавьте первым действием «Получить текст из ввода» (Receive Text from Input) — так шорткат сможет принимать запрос из виджета, Siri или из другого приложения.
Ожидаемый результат: в редакторе появился блок приёма текста, и вы можете нажать «Выполнить» и ввести текст вручную.
4. Добавьте блок условия: «Если» (If) → «Длина» (Length) текста «меньше 200». Внутрь ветки «тогда» положите вызов локального приложения, внутрь «иначе» — вызов облака.
**Пример:** запрос «напомни купить хлеб» — 18 символов, уходит локально; запрос «разбери этот договор на 4 страницы» — 39 символов, но с вложением, уходит в облако.
Ожидаемый результат: короткие сообщения больше не тратят деньги на API. Почему это работает: длина текста — простой и предсказуемый признак «легкости» задачи.
5. Добавьте второе условие — «нет подключения к сети». Ветку «тогда» ведите на локальную модель принудительно, независимо от длины.
Ожидаемый результат: в самолёте роутер не падает с ошибкой, а отвечает локально.
6. Соберите облачный вызов: действие «Получить содержимое URL» (Get Contents of URL), метод `POST`, заголовки и тело — как в конфиге ниже.
**Пример:**
{
"endpoint": "https://api.example.com/v1/chat/completions",
"headers": {
"Authorization": "Bearer sk-ВАШ_КЛЮЧ",
"Content-Type": "application/json"
},
"body": {
"model": "<имя облачной модели>",
"messages": [{"role": "user", "content": "<текст запроса>"}],
"temperature": 0.3
}
}
`temperature` — «степень фантазии»: 0.3 даёт сдержанные ответы. Ожидаемый результат: в шорткате появляется ответ облака в виде JSON; достаньте из него текст поля с ответом.
7. Опишите правила роутинга в одном месте — так проще править, чем лазить по блокам. Сохраните схему рядом с шорткатом:
{
"route_local_if": [
{"length_lt": 200},
{"network": "offline"}
],
"route_cloud_if": [
{"has_attachment": true},
{"contains": ["разбери", "перепиши статью", "код", "договор"]}
],
"fallback": "local",
"timeout_sec": 8
}
8. Добавьте fallback (запасной маршрут): если облако вернуло ошибку или не ответило за 8 секунд — повторить запрос локально и пометить ответ как «локальный».
Ожидаемый результат: пользователь всегда получает ответ, даже при 429 (слишком много запросов) или пропавшей сети.
9. Прогоните три теста: короткий вопрос, вопрос со словом-триггером и тот же короткий вопрос в авиарежиме. Запишите, какой маршрут сработал.
**Пример:** «переведи абзац» → облако; «поставь таймер» → локально; «поставь таймер» в авиарежиме → локально.
Ожидаемый результат: три из трёх запросов ушли туда, куда вы задумали. Если нет — правьте условия, а не модель.
10. Вынесите шорткат на экран «Домой» или в виджет, чтобы запускать его в одно касание.
Ожидаемый результат: роутер вызывается без открытия «Команд».
Куда уходит мой запрос при гибридном роутинге?
Тот, что выбран локальной веткой, не покидает iPhone. Облачная ветка отправляет текст на сервер провайдера по вашему API-ключу — поэтому чувствительные данные лучше оставлять на устройстве.
Работает ли такая схема без интернета?
Да, за счёт локальной ветки и условия «нет подключения к сети». Облачные запросы в офлайне просто не пройдут — их и подменяет fallback.
Нужен ли API-ключ, если модель уже стоит на телефоне?
Нужен только для облачной части. Если вы готовы обходиться локальной моделью, роутер можно не собирать вообще — но тогда вы теряете доступ к более сильным моделям. Выбрать облачную модель под задачу помогает разбор рейтинга LMArena.
Локальная модель отвечает медленно — что делать?
Уменьшите размер модели или возьмите сильнее квантованную версию, сокращайте промпт и понижайте порог длины, чтобы на устройство уходили только совсем короткие запросы. Ориентир простой: если ответ идёт дольше, чем вы готовы ждать, — отправляйте задачу в облако. Подходы к запуску моделей на слабом железе разобраны в гайде для Android.