Перейти к содержимому
17.5k

Cursor Private Inference

Обычный Cursor не может обращаться к прокси на вашем компьютере. При настройке «Override OpenAI Base URL» бэкенд Cursor формирует промпт и вызывает этот URL с серверов Cursor, которые отклоняют loopback-, LAN- и частные адреса. Поэтому все рецепты сообщества для Cursor с локальными моделями заканчиваются ngrok, Cloudflare Tunnel или VPS.

Cursor также поставляет вторую настольную сборку — Cursor Private Inference. Её агентный цикл работает локально и обращается к настроенному вами шлюзу, совместимому с OpenAI. Если направить её на opencodex, маршрутизируемые модели работают без туннеля, патча приложения и TLS. Эта страница посвящена именно такой сборке.

Прочитайте этот раздел первым: его чаще всего пропускают.

  • opencodex не распространяет эту сборку. Cursor тоже не документирует её. На cursor.com нет ссылки на неё; она может измениться без предупреждения или перестать быть доступной. Если у вас её ещё нет, это руководство не подходит. Вместо неё используйте мост сообщества ocx-cursor с публичным HTTPS-эндпоинтом.
  • Вход в Cursor всё ещё обязателен. Экран входа появляется до диалога настройки шлюза.
  • Собственные модели Cursor недоступны. В локальном режиме список выбора содержит только модели, возвращённые шлюзом. Автодополнение Tab, каталог Cursor (Composer, Auto) и Cloud Agents выключены. К моделям провайдера Cursor всё ещё можно обращаться через маршруты cursor/* самого opencodex, если вы настроили этого провайдера.
  • Каждый ход содержит локальный системный промпт Cursor — примерно 23 тысячи токенов со второго хода и далее. Учитывайте это при выборе модели.
  • Сборка использует те же данные профиля, что и обычный Cursor. У неё тот же ID пакета, тот же ~/.cursor, тот же Application Support/Cursor (macOS), %APPDATA%\Cursor (Windows) или ~/.config/Cursor (Linux). Запускайте её с --user-data-dir <dir>, чтобы разделить данные, и при первом запуске не отмечайте «Import data from existing Cursor installation», если не хотите скопировать настройки.

Обе сборки называются «Cursor» в Dock и имеют один ID пакета, поэтому проверьте product.json:

Платформа product.json
macOS /Applications/Cursor Private Inference.app/Contents/Resources/app/product.json
Windows %LOCALAPPDATA%\\Programs\\cursor-private-inference\\resources\\app\\product.json
Linux <install root>/resources/app/product.json (AppImage нужно сначала распаковать)

Для локальной агентной сборки nameLong равно "Cursor Private Inference", а для обычной — "Cursor"; version обозначает сборку (на момент написания — 3.18.25). Карточка Integrations > Cursor в дашборде выполняет ту же проверку и показывает найденное. Локальный режим включается внутри пакета workbench, а не в product.json, поэтому переключаемого флага нет: если nameLong указывает на обычный Cursor, эта установка не сможет обратиться к loopback-шлюзу.

Агентный цикл, обращающийся к шлюзу, находится в одном файле под тем же корнем установки: extensions/cursor-agent-exec/dist/main.js. opencodex читает его (только для чтения, с ограничением объёма), чтобы узнать таблицу уровней рассуждения Cursor; см. раздел «Модели и уровень рассуждения».

opencodex должен работать (ocx service status). Оба следующих способа приводят к одному результату.

В приложении. Settings → Models → Gateway → Configure gateway:

Поле Значение
Base URL http://127.0.0.1:10100/v1 (включите /v1; обычный loopback через http:// допускается)
API Key значение OPENCODEX_API_AUTH_TOKEN, если служба использует API-аутентификацию; иначе любой заполнитель, например opencodex-loopback

Нажмите Refresh model list. Список выбора заполнится моделями из /v1/models opencodex; включите нужные строки.

Через переменные окружения. Приложение читает их при запуске:

CURSOR_LOCAL_AGENT_BASE_URL=http://127.0.0.1:10100/v1
CURSOR_LOCAL_AGENT_API_KEY=opencodex-loopback
CURSOR_LOCAL_AGENT_HEADERS= # optional, newline-separated "Header-Name: value" lines

CURSOR_LOCAL_AGENT_HEADERS отклоняет User-Agent и неразрешённые заполнители {...}; {gitOrgRepo} и {gitBranch} разворачиваются.

Порядок приоритетов от высшего к низшему: учётные данные конкретной модели → шлюз, сохранённый в Settings → CURSOR_LOCAL_AGENT_* → ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN (резервный вариант для совместимости). Окружение не переопределяет сохранённый шлюз; сначала очистите его в Settings, если хотите переключаться через окружение.

Cursor Private Inference — GUI-приложение, поэтому одного профиля интерактивной оболочки недостаточно: переменная должна присутствовать в окружении процесса, запускающего приложение.

ОС Где задать переменную
macOS launchctl setenv CURSOR_LOCAL_AGENT_BASE_URL http://127.0.0.1:10100/v1 для текущего сеанса входа либо LaunchAgent с EnvironmentVariables для постоянной настройки. Запуск из терминала тоже работает.
Windows setx CURSOR_LOCAL_AGENT_BASE_URL http://127.0.0.1:10100/v1 для пользователя (влияет на новые процессы) либо System Properties → Environment Variables. После этого перезапустите приложение.
Linux ~/.profile или ~/.pam_environment для сеанса дисплейного менеджера либо systemctl --user set-environment CURSOR_LOCAL_AGENT_BASE_URL=http://127.0.0.1:10100/v1, если рабочий стол работает в пользовательском сеансе systemd. AppImage, запущенный из терминала, наследует окружение оболочки.

Сборка доступна для macOS (arm64, x64, universal), Windows (x64, arm64) и Linux (x64, arm64). Настройка одинакова на всех платформах.

В дашборде opencodex есть вкладка Cursor в разделе Integrations (/#integrations/cursor). По отношению к Cursor она работает только для чтения: не меняет базу настроек Cursor, запись в хранилище ключей или пакет приложения. Поэтому здесь нет переключателя, который можно включить. Вкладка показывает нужные значения и помогает проверить, применились ли они.

  • Установленные сборки. Наличие Cursor Private Inference (с путём и версией) и обычного Cursor (только путь). Если обнаружен лишь обычный Cursor, вкладка сообщает об этом, даёт ссылку обратно сюда и предлагает кнопку Найти установщик Private Inference. Нажатие на неё спрашивает у канала обновлений самого Cursor (канал cursor-local на api2.cursor.sh), какой установщик local-mode он предлагает для этой платформы и процессора, и показывает его версию со ссылкой на установщик downloads.cursor.com/local-mode/. Пока кнопка не нажата, ничего не запрашивается: открытие вкладки и её периодическое обновление никогда не обращаются к каналу Cursor. opencodex только показывает ссылку: он ничего не скачивает, не запускает и не устанавливает. Ответ кэшируется на 30 минут (на 5 после ошибки). Если канал недоступен, отвечает чем-то непригодным или Cursor не выпускает сборку для этого компьютера (сборки есть только для x64 и arm64 под Windows, macOS и Linux), вкладка сообщает, что установщик определить не удалось; значения шлюза ниже остаются верными в любом случае. Сам обычный Cursor по-прежнему отправляет запросы к пользовательским эндпоинтам через свои серверы, поэтому loopback-прокси для него недоступен.
  • Значения шлюза. Base URL на собственном порту прослушивания прокси (из записи среды выполнения, поэтому даже дашборд за обратным прокси показывает порт, доступный Cursor на этом компьютере) с кнопкой Copy. Строка API Key зависит от адреса привязки: если учётные данные не нужны, показываются opencodex-loopback и Copy; если включена API-аутентификация или настроен любой API-ключ opencodex, строка просит использовать один из ваших ключей и ведёт на вкладку API Keys. Подходит любой настроенный ключ, а не только OPENCODEX_API_AUTH_TOKEN.
  • Соединение. Последний запрос /v1/models, у которого User-Agent точно равен Cursor/<version> (такой заголовок отправляет локальная агентная среда Cursor), с временем и версией. Пока Cursor не обратится к прокси, отображается «never seen»; нажатие Refresh model list в Cursor обновляет состояние. Открытая карточка обновляется каждые 15 секунд.
  • Что покажет Cursor. Таблица Model / Reasoning / Context для моделей, которые объявляет opencodex (отключённые модели и списки разрешённых провайдеров учитываются, как в исходном списке), по правилам следующего раздела. Это прогноз: ступени Reasoning Cursor выбирает по собственной таблице.

Список выбора — исходный список /v1/models opencodex. Наличие элемента Reasoning у строки модели определяется двумя условиями:

  1. opencodex должен объявлять возможности в строке (api_types и объект capabilities). Начиная с v2.41 он это делает. Старые версии прокси показывают модели без настройки уровня.
  2. ID модели после удаления всего до последнего / и суффикса @… должен совпасть с таблицей уровней самого Cursor. Таблица встроена в приложение (extensions/cursor-agent-exec/dist/main.js); opencodex читает её из обнаруженной установки, чтобы прогноз в дашборде следовал обновлениям Cursor. Карточка указывает прочитанную сборку либо «static mirror», если сборка не найдена. Ступени определяет Cursor, а не opencodex; никакое поле /v1/models не добавит модель в эту таблицу. Ниже приведён снимок версии 3.18.25, используемый статической копией:
ID модели (после последнего /) Ступени Cursor Поле протокола
gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna Уровни Low, Medium, High, Extra High reasoning.effort
gpt-5, gpt-5.x Уровни Low, Medium, High, Extra High reasoning.effort
claude-opus-5, claude-sonnet-5, claude-opus-4.7, claude-opus-4.8 Уровни Low, Medium, High, Extra High, Max output_config.effort
claude-opus-4.6, claude-opus-4.5, claude-sonnet-4.6 Уровни Low, Medium, High, Max output_config.effort
grok-4.3, grok-4.5, grok-4.6, grok-build-latest Уровни Minimal, Low, Medium, High, Extra High reasoning_effort
gemini-* (требуется supports_reasoning) Minimal, Low, Medium, High reasoning_effort
все остальные, включая claude-fable-5-1, kimi-k3 настройки нет —

Итак, anthropic/claude-opus-5 работает, а уровни max/ultra opencodex для GPT-5.6 недоступны через этот список выбора.

anthropic/claude-fable-5-1, cursor/kimi-k3 и другие модели вне таблицы не получают настройку Reasoning. Если шлюз объявляет supports_reasoning, Cursor записывает в лог одну строку для каждого такого ID: «Local provider advertises reasoning support for a model with no hardcoded Bottlerocket effort family». Уровень всё же можно выбрать двумя способами:

  • Строки уровней (cursorEffortRows: true в конфигурации opencodex; по умолчанию выключено): шлюз публикует отдельную запись выбора для каждого уровня модели вне таблицы, например anthropic/claude-fable-5-1--high или cursor/kimi-k3--max, и направляет её в базовую модель с применённым уровнем. Для моделей, которые Cursor уже отображает, дополнительные строки не создаются; точный ID известной модели всегда имеет приоритет над суффиксом --<effort>. После включения нажмите Refresh model list. Карточка дашборда подсчитывает опубликованные строки для каждой модели. Выбор строки является явным, поэтому заданный ею уровень также имеет приоритет над директивой ocx-effort в запросе.
  • Фиксированный уровень по умолчанию (modelDefaultReasoningEfforts у провайдера): применяется, когда Cursor не передаёт уровень.

Обычный Cursor показывает переключатель Max рядом с некоторыми моделями. Это Max Mode — расширенное окно контекста, а не уровень рассуждения. В локальной агентной сборке аналогичная настройка называется Context в меню модели. opencodex включает её для нативного семейства GPT-5.6: 272K (по умолчанию) или 922K (опциональный режим 1M с пометкой о более высокой стоимости). Выбранное значение ограничивает контекст этого хода. Маршрутизируемые модели показывают одно окно без пункта Context; ограничение контекста провайдера ниже 922K убирает этот пункт и у нативных строк.

Второе значение — уровень рассуждения Max (max/ultra в opencodex). Он здесь недоступен: Cursor берёт ступени уровней из собственной таблицы, а запись GPT-5.6 заканчивается на Extra High.

Поскольку opencodex объявляет responses в api_types, эта сборка отправляет агентные ходы на /v1/responses с reasoning.effort, а не на /v1/chat/completions.

Выбор протокола влияет на строки Claude: Cursor передаёт уровень Claude только как output_config.effort в протоколе Anthropic Messages, поэтому при Base URL на /v1 даже строка Claude с доступной настройкой работает с уровнем провайдера по умолчанию. Base URL, заканчивающийся на /messages, меняет ситуацию: уровень Claude передаётся, а уровень семейства OpenAI теряется. Одна запись шлюза не обслужит оба семейства; строки уровней выше обходят это ограничение, потому что opencodex применяет уровень сам.

ocx observe logs показывает ходы как inboundProtocol: responses с admissionKind: loopback.

Симптом Что проверить
Ответ 401 от шлюза API Key не совпадает с OPENCODEX_API_AUTH_TOKEN; при loopback-привязке без API-аутентификации подходит любое значение
Список выбора пуст opencodex не работает или в Base URL отсутствует /v1; после исправления нажмите Refresh model list
Модели есть, но нет настройки Reasoning версия opencodex старше v2.41 или ID отсутствует в таблице Cursor (дашборд помечает его как —); включите cursorEffortRows или задайте значение по умолчанию у провайдера
Изменение схемы не подхватилось Cursor кэширует /models по строке Base URL без срока действия; Refresh model list перечитывает его. Иначе перезапустите приложение или временно сохраните другую запись URL (localhost вместо 127.0.0.1)
На первом ходе расходуется 23 тысячи токенов ожидаемо: это локальный системный промпт Cursor