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/v1CURSOR_LOCAL_AGENT_API_KEY=opencodex-loopbackCURSOR_LOCAL_AGENT_HEADERS= # optional, newline-separated "Header-Name: value" linesCURSOR_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 у строки
модели определяется двумя условиями:
- opencodex должен объявлять возможности в строке (
api_typesи объектcapabilities). Начиная с v2.41 он это делает. Старые версии прокси показывают модели без настройки уровня. - 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 не передаёт уровень.
«Max» имеет два значения
Заголовок раздела ««Max» имеет два значения»Обычный 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 |

