# Локальная модель или облако на iPhone: как настроить гибридный роутинг ИИ-запросов

> AI Release · @ai_release1 · https://ai-release.org/guides/lokalnaya-model-ili-oblako-na-iphone-kak-nastroit-gibri.html

Часть запросов с телефона хочется держать на самом устройстве — там приватно, работает без сети и не тратит деньги, — а тяжёлые задачи отправлять в облако, где модель умнее. Гибридный роутинг — это правило, которое автоматически решает, какой запрос пойдёт на локальную модель (on-device, то есть прямо на чипе iPhone, без сервера), а какой — на облачную через API (программный интерфейс, через который приложение общается с чужим сервером). Гайд для iPhone с актуальной версией iOS, где есть системное приложение «Команды» (Shortcuts — конструктор автоматизаций из блоков), плюс одно приложение с локальной моделью и один API-ключ облачного провайдера. Если вы ещё не запускали модель локально — начните с [гайда для компьютера](https://ai-release.org/guides/kak-zapustit-ii-model-lokalno-na-svoem-kompyutere-gayd.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide), там разобраны форматы весов и квантизация.

## Требования и подготовка
![Иллюстрация к разделу «Требования и подготовка»](https://ai-release.org/guides/img/lokalnaya-model-ili-oblako-na-iphone-kak-nastroit-gibri-ru-1.jpg)


- iPhone с актуальной iOS: приложение «Команды» встроено в систему, отдельно ставить не нужно.
- Приложение, которое умеет запускать модель локально. Ставить модель внутрь iPhone сложнее, чем на ПК: памяти мало, поэтому выбирайте компактные и квантованные версии (квантование — сжатие весов, из-за которого модель занимает меньше места и RAM).
- Свободная память и заряд: локальный инференс (процесс генерации ответа) греет телефон и ест батарею.
- API-ключ облачного провайдера — длинная строка вида `sk-...`, которую выдают в личном кабинете сервиса.
- Эндпоинт (URL, по которому отправляется запрос) облака, например `https://api.example.com/v1/chat/completions`.
- Текстовая заметка или документ, куда вы запишете свои правила роутинга. Это ваш «источник истины».
- Проверка перед стартом — пройдитесь по списку:

- [ ] локальная модель отвечает в авиарежиме;
- [ ] API-ключ сохранён и не светится в переписках;
- [ ] известен эндпоинт и имя облачной модели;
- [ ] есть 3 тестовых запроса для проверки (короткий, длинный, офлайн).

## Пошаговая инструкция
![Иллюстрация к разделу «Пошаговая инструкция»](https://ai-release.org/guides/img/lokalnaya-model-ili-oblako-na-iphone-kak-nastroit-gibri-ru-2.jpg)


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`, заголовки и тело — как в конфиге ниже.
   **Пример:**

```json
{
  "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. Опишите правила роутинга в одном месте — так проще править, чем лазить по блокам. Сохраните схему рядом с шорткатом:

```json
{
  "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. Вынесите шорткат на экран «Домой» или в виджет, чтобы запускать его в одно касание.
    Ожидаемый результат: роутер вызывается без открытия «Команд».

## Возможные проблемы и решения

- **Ошибка вида «401 Unauthorized» или «Invalid API key».** Симптом: облачная ветка всегда падает с кодом 401. Причина почти всегда в заголовке `Authorization`. Решение: проверьте, что там ровно `Bearer ` (с пробелом) и ключ без переносов строк; если копировали ключ из мессенджера — перекопируйте из личного кабинета; после правки прогоните шаг 2 заново.
- **Локальная модель не отвечает или приложение закрывается.** Симптом: чат зависает, ответа нет, приложение вылетает при загрузке весов. Это нехватка памяти: телефон выгружает модель или убивает процесс. Решение: возьмите модель меньшего размера или более сильную квантизацию, закройте фоновые приложения, не запускайте локальную ветку параллельно с тяжёлыми задачами.
- **Роутер всегда уходит в облако.** Симптом: даже «привет» уходит по API. Причина — условие сравнивает не тот текст (например, пустую переменную до блока приёма ввода) или порядок условий перепутан. Решение: поставьте блок «Получить текст из ввода» самым первым, после каждого условия добавляйте «Показать уведомление» с названием выбранной ветки и прогоните тест из шага 9.

## FAQ

**Куда уходит мой запрос при гибридном роутинге?**
Тот, что выбран локальной веткой, не покидает iPhone. Облачная ветка отправляет текст на сервер провайдера по вашему API-ключу — поэтому чувствительные данные лучше оставлять на устройстве.

**Работает ли такая схема без интернета?**
Да, за счёт локальной ветки и условия «нет подключения к сети». Облачные запросы в офлайне просто не пройдут — их и подменяет fallback.

**Нужен ли API-ключ, если модель уже стоит на телефоне?**
Нужен только для облачной части. Если вы готовы обходиться локальной моделью, роутер можно не собирать вообще — но тогда вы теряете доступ к более сильным моделям. Выбрать облачную модель под задачу помогает [разбор рейтинга LMArena](https://ai-release.org/guides/kak-polzovatsya-lmarena-arena-ai-chitaem-reyting-i-vybi.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).

**Локальная модель отвечает медленно — что делать?**
Уменьшите размер модели или возьмите сильнее квантованную версию, сокращайте промпт и понижайте порог длины, чтобы на устройство уходили только совсем короткие запросы. Ориентир простой: если ответ идёт дольше, чем вы готовы ждать, — отправляйте задачу в облако. Подходы к запуску моделей на слабом железе разобраны в [гайде для Android](https://ai-release.org/guides/kak-zapustit-ii-model-lokalno-na-android-prilozheniya-i.html?utm_source=tg&utm_medium=channel&utm_campaign=guide_inline&utm_content=guide_to_guide).
