Переопределение эндпоинта в Windows и Linux
Перенаправление фиксированного HTTPS-эндпоинта разрешённого локального клиента через mitmproxy: ограниченный перехват, доверие TLS, потоковые ответы и откат.
По возможности используйте встроенную настройку клиента Base URL / Custom endpoint / BYOK. См. Инструкции подключения и GitHub Copilot. Локальный перехват HTTPS — необязательный запасной вариант для клиента без смены эндпоинта, а не условие использования Model Gate.
Этот способ совместим не со всеми клиентами. Клиент должен отправлять протокол, путь и модель, поддерживаемые вашим аккаунтом Model Gate, доверять локальному центру сертификации и позволять настроить API-ключ Model Gate. Закрепление сертификата, отдельное хранилище доверия, подписанные запросы, фиксированная модель или удалённый процесс расширения могут препятствовать работе. Перезапись URL не преобразует OpenAI Chat Completions в Anthropic Messages или Responses, не добавляет возможностей модели и не заменяет аутентификацию GitHub.
Перехватывайте только приложения и трафик, которые принадлежат вам либо разрешены вам для анализа. На управляемых рабочих станциях получите согласование. mitmproxy видит расшифрованные промпты, исходный код и заголовки аутентификации; закрытый ключ локального центра сертификации позволяет представляться HTTPS-серверами клиентам, доверяющим этому центру. Не передавайте закрытые ключи CA, не экспортируйте потоки/HAR без удаления секретов, не открывайте интерфейс в сеть и не отключайте проверку TLS.
Что меняет этот пример
Пример сопоставляет ровно этот исходный origin с origin Model API, указанным в документации сайта:
https://api.deepseek.com/v1/chat/completions
-> local mitmproxy
-> https://api.model-gate.com/v1/chat/completions
В поле учётных данных клиента настройте отдельный API-ключ Model Gate, а не ключ DeepSeek. Выберите активную модель Model Gate или поддерживаемый псевдоним из каталога моделей. Используйте origin Model API из этой инструкции с соответствующим API-ключом; не используйте хост панели или Partner API.
Правило намеренно не редактирует HTTP-метод, путь, query, JSON-тело, model, Authorization или JSON-значение stream. Оно меняет назначение и HTTP Host / HTTP/2 :authority; TLS-соединение с поставщиком устанавливается с новым назначением. Версия HTTP, регистр и порядок заголовков, заголовки соединения и обрамление также могут отличаться. Это не побайтное сохранение всех заголовков или сетевого трафика.
Подготовить потоковую передачу только ответа (обе системы)
Сохраните следующий файл как model-gate-response-stream.py в рабочем каталоге. Скрипт выполняется внутри mitmproxy и при использовании нативного пакета не требует отдельной установки Python.
"""Keep map_remote requests buffered; stream responses without retaining bodies."""
from mitmproxy import ctx, exceptions, http
def configure(updated: set[str]) -> None:
if ctx.options.stream_large_bodies is not None:
raise exceptions.OptionsError(
"Unset stream_large_bodies: map_remote must run before request forwarding."
)
def requestheaders(flow: http.HTTPFlow) -> None:
flow.request.stream = False
def responseheaders(flow: http.HTTPFlow) -> None:
if flow.response is not None:
flow.response.stream = True
Встроенное дополнение map_remote меняет назначение в обработчике request, после чтения тела запроса. До этой перезаписи потоковую передачу запроса нужно оставить отключённой. Не используйте --set stream_large_bodies=1 с этим примером: так исходный запрос может уйти до перезаписи. Небольшое дополнение выше включает потоковую передачу только ответа, включая SSE, не меняя JSON-тело и не повторяя запросы.
Команды ниже используют --set stream_large_bodies без знака равенства и значения, чтобы вернуть необязательную настройку в None, и явно отключают сохранение потоковых тел. Дополнение не позволяет позже включить глобальный порог потоковой передачи. Уберите другие дополнения потоковой передачи и перезаписи запросов из этого отдельного сеанса, устраните ошибки запуска до ввода ключа в клиент. Прокси не гарантирует блокировку утечки ключа при отказе: сначала проверьте маршрут с фиктивным ключом.
Windows: пример для Visual Studio
Установите официальный нативный пакет Windows с mitmproxy Downloads. Заново откройте PowerShell и проверьте mitmweb --version. Для этого примера с Windows-процессом не устанавливайте его внутри WSL.
Создать локальный CA этой установки и добавить доверие
Один раз запустите под той же учётной записью Windows, которая будет запускать прокси:
mitmweb --listen-host 127.0.0.1 --web-host 127.0.0.1
После запуска остановите через Ctrl+C. mitmproxy создаёт CA в %USERPROFILE%\.mitmproxy. Для приложения под вашей учётной записью предпочтительно доверие Current User:
$ca = Join-Path $env:USERPROFILE '.mitmproxy\mitmproxy-ca-cert.cer'
if (-not (Test-Path -LiteralPath $ca)) { throw 'Start mitmweb once under this account first.' }
certutil -user -addstore Root "$ca"
if ($LASTEXITCODE -ne 0) { throw 'CA installation failed.' }
Доверяйте только CA, созданному вашей установкой. mitmproxy-ca-cert.cer — публичный сертификат; mitmproxy-ca.pem также содержит закрытый ключ и должен оставаться приватным. После изменения доверия перезапустите Visual Studio.
Только если согласованному приложению требуется доверие Local Machine, используйте PowerShell с повышенными правами и certutil -addstore Root "$ca" без -user. Это добавляет доверие на уровне всей машины, шире меняет безопасность и требует соответствующего удаления из машинного хранилища ниже. Повышение прав под другой административной учётной записью может использовать другой профиль и CA; согласуйте учётную запись, сертификат и настройку прокси.
Перехватывать только нужный процесс и хост
Когда этого требуют разрешения перехвата Windows, запустите нативный PowerShell от администратора под той же учётной записью и профилем. Сначала запустите Visual Studio. Этот пример выбирает имя процесса devenv:
mitmweb --mode local:devenv `
--listen-host 127.0.0.1 --web-host 127.0.0.1 `
--allow-hosts '^api\.deepseek\.com(:443)?$' `
--set connection_strategy=lazy --set upstream_cert=false `
--set stream_large_bodies --set store_streamed_bodies=false `
-s .\model-gate-response-stream.py `
--set 'map_remote=|^https://api\.deepseek\.com(?::443)?/|https://api.model-gate.com/'
После обратной кавычки продолжения строки PowerShell не должно быть пробелов. Привязанное к границам правило совпадает только с указанным HTTPS-origin, в том числе с явно указанным портом 443; имя поставщика внутри query или другого хоста не переписывается. Список разрешённых хостов не позволяет расшифровывать посторонние назначения выбранного процесса. lazy вместе с upstream_cert=false исключает ненужное соединение с исходным поставщиком для изучения сертификата. Проверка TLS фактического назначения остаётся включённой.
Visual Studio — не VS Code. Расширение может отправлять запросы из отдельного ServiceHub, языкового сервера или вспомогательного процесса, а не devenv. Перед расширением области перехвата установите, какому процессу принадлежит соединение. Для просмотра экземпляров Visual Studio:
Get-Process -Name devenv | Select-Object Id, ProcessName, Path
Замените local:devenv на local:12345 с фактическим PID либо список явно установленных PID через запятую. После перезапуска PID меняется. Не используйте $PID как собственную переменную PowerShell: это процесс самого PowerShell. Не включайте перехват всей машины через --mode local лишь для появления отсутствующего запроса.
Linux: то же ограниченное сопоставление
Установите актуальную официальную сборку mitmproxy и проверьте mitmweb --version и uname -r. Local Capture использует eBPF; официальная нижняя граница поддержки — Linux 6.8. Нужен привилегированный вспомогательный процесс через sudo. Запускайте mitmweb обычным пользователем с --mode local:... в командной строке, чтобы он мог запросить эти права; не переводите весь прокси в root со случайным использованием /root/.mitmproxy.
Сначала инициализируйте CA обычным пользователем, затем остановите через Ctrl+C:
mitmweb --listen-host 127.0.0.1 --web-host 127.0.0.1
Предпочтителен документированный механизм собственного CA приложения. В Ubuntu/Debian приложения, использующие системное хранилище доверия, могут вместо него применять следующую необязательную установку для всей системы:
sudo install -m 0644 "$HOME/.mitmproxy/mitmproxy-ca-cert.pem" \
/usr/local/share/ca-certificates/model-gate-local-mitmproxy.crt
sudo update-ca-certificates
Перезапустите клиент. Отдельному хранилищу Java/Node/браузера или ограниченному приложению может потребоваться собственная документированная настройка доверия; импорт в хранилище ОС не гарантирует доверие всех клиентов. В других дистрибутивах действуют собственные процедуры CA.
Для локального процесса VS Code с именем code сопоставление такое:
mitmweb --mode local:code \
--listen-host 127.0.0.1 --web-host 127.0.0.1 \
--allow-hosts '^api\.deepseek\.com(:443)?$' \
--set connection_strategy=lazy --set upstream_cert=false \
--set stream_large_bodies --set store_streamed_bodies=false \
-s ./model-gate-response-stream.py \
--set 'map_remote=|^https://api\.deepseek\.com(?::443)?/|https://api.model-gate.com/'
Как и в Windows, используйте фактический процесс/PID отправки запросов, а не обязательно окно редактора. Просмотрите ps -eo pid,comm,args и при необходимости подставьте local:12345. В Linux сопоставление имени ограничено первыми 16 символами. Local Capture в WSL не поддерживается; контейнерам для этого режима нужна сеть хоста. Трафик SSH/удалённого процесса расширений нужно настраивать на машине, где он выполняется, а не только на рабочем столе.
Потоковые ответы, пути и другие поставщики
Дополнение потоковой передачи только ответа пересылает HTTP-ответы без ожидания всего содержимого, что важно для доставки токенов SSE. Тела запросов остаются буферизованными, пока map_remote не сменит назначение. Потоковые тела по умолчанию не сохраняются для просмотра; заголовки и статус остаются полезны. Не включайте сохранение тела или экспорт потока только ради проверки ключа. Эта настройка не меняет JSON-флаг клиента stream и не превращает непотокового поставщика в потокового.
Сопоставление по умолчанию сохраняет пути. Клиент, отправляющий /chat/completions без /v1, передаст тот же путь в Model Gate и может получить 404. Только если известно, что пути исходного API требуют такой нормализации, замените значение map_remote на:
map_remote=|^https://api\.deepseek\.com(?::443)?/(?:v1/)?|https://api.model-gate.com/v1/
Это намеренно добавляет один префикс /v1/, сохраняя уже имеющийся, остальной путь и query. Это отдельный вариант с изменением пути, а не пример смены только origin. Проверьте итоговый эндпоинт перед отправкой реального промпта.
Для другого поставщика замените точный исходный хост и в allow-hosts, и в map_remote, экранируйте точки регулярного выражения и выберите правильные origin/путь назначения. Сохраняйте привязку ^https:// и границу имени хоста; никогда не используйте широкую замену подстрок. Существующие сохранённые дополнения и правила перезаписи могут менять результат, поэтому изучите настройку mitmproxy до проверки.
Приёмка и устранение проблем
Сначала проверьте маршрутизацию с фиктивными учётными данными и неконфиденциальным промптом; ошибка аутентификации на нужном назначении ожидаема. Только после подтверждения назначения выполните один намеренно небольшой запрос отдельным ключом с лимитом; инференс может тарифицироваться. В mitmweb проверьте хост Model Gate API, поддерживаемый путь, наличие ID/псевдонима модели и успешный HTTP-статус. Проверьте Request History Model Gate и поэтапное поступление потокового текста. Не публикуйте заголовок Authorization или экспорт потока как доказательство.
Запрос не перехвачен. Проверьте фактический вспомогательный процесс/PID, права перехвата, локальное или удалённое выполнение, исходный хост и поддержку ядром.
Ошибка TLS-сертификата. Проверьте CA, профиль, хранилище и перезапуск клиента. Закрепление сертификата — ограничение совместимости, а не повод отключать проверку.
401. Клиент должен использовать ключ Model Gate для соответствующего аккаунта и домена API; map_remote не обменивает учётные данные.
404. Проверьте фактический путь; сопоставление только origin не добавляет /v1.
400 или ошибка messages.0 / system. Проверьте совместимость протокола запроса. Перезапись origin не переводит роли сообщений или другие JSON-поля.
Модель недоступна. Используйте активный канонический ID или существующий псевдоним; сопоставление не переименовывает model.
Поток приходит целиком. Проверьте загрузку дополнения передачи только ответа, значение клиента stream и фактическую поддержку поставщиком. Не включайте глобальную потоковую передачу запросов.
Остановить и удалить доверие
Перед остановкой перехвата закройте клиент либо уберите ключ Model Gate из настройки исходного поставщика. Иначе следующий прямой запрос может отправить этот ключ исходному поставщику. Не считайте, что остановка прокси автоматически блокирует такие запросы. Остановите mitmweb через Ctrl+C, затем верните обычные настройки эндпоинта и ключа клиента.
Для описанного выше импорта Windows Current User удалите только точный сертификат этой установки:
$ca = Join-Path $env:USERPROFILE '.mitmproxy\mitmproxy-ca-cert.cer'
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($ca)
certutil -user -delstore Root $cert.Thumbprint
if ($LASTEXITCODE -ne 0) { throw 'CA removal failed; inspect the certificate store.' }
Для необязательного импорта Local Machine используйте повышенную оболочку и certutil -delstore Root $cert.Thumbprint. Сохраняйте публичный файл CA до определения и удаления соответствующего доверенного сертификата; не удаляйте посторонние доверенные корневые сертификаты по имени.
Для описанного выше системного импорта Ubuntu/Debian:
sudo rm -- /usr/local/share/ca-certificates/model-gate-local-mitmproxy.crt
sudo update-ca-certificates --fresh
Удалите также настройки CA отдельных приложений. Перезапустите клиенты. Удалите захваченные конфиденциальные материалы и перевыпустите отдельный ключ Model Gate, если он был раскрыт или отправлен не по назначению. Ограничьте изменения собственной рабочей станцией. Не ослабляйте проверку сертификатов и не изменяйте удалённый сервис ради переопределения.
Официальные источники
Проверено 2026-09-08. Сверяйте параметры с установленным mitmweb --options; перехват и доверие клиента всё равно требуют проверки на вашей рабочей станции.
- Режимы и ограничения mitmproxy Local Capture
- Сопоставление URL и потоковая передача mitmproxy
- Пример дополнения потоковой передачи ответа mitmproxy
- Реализация обработчика запросов mitmproxy map_remote
- Параметры mitmproxy
- Сертификаты CA и закрепление сертификатов mitmproxy
- Назначение HTTP-запроса и authority в mitmproxy
- Microsoft certutil
- Установка и удаление CA в Ubuntu