Remplacement du point de terminaison sous Windows et Linux

Acheminez le point de terminaison HTTPS fixe d'un client local autorisé via mitmproxy, avec capture étendue, confiance TLS, streaming et restauration.

Utiliser le module intégré d'un client URL de base/point de terminaison personnalisé/BYOK réglage autant que possible. Voir Guides de connexion et Copilote GitHub. L'interception HTTPS locale est une solution de secours facultative pour un client qui ne peut pas modifier son point de terminaison, et non une exigence pour l'utilisation de Model Gate.

Ce n’est pas universellement compatible. Le client doit envoyer un protocole, un chemin et un modèle pris en charge par votre compte Model Gate, accepter votre autorité de certification locale et vous permettre de configurer une clé API Model Gate. L'épinglage de certificat, un magasin de confiance privé, des requêtes signées, un modèle codé en dur ou un hôte d'extension distant peuvent empêcher cette méthode de fonctionner. Une réécriture d'URL ne convertit pas les complétions de chat OpenAI en messages ou réponses anthropiques, n'ajoute pas de fonctionnalités de modèle et ne remplace pas l'authentification GitHub.

Interceptez uniquement les applications et le trafic que vous possédez ou que vous êtes autorisé à inspecter. Obtenez l’approbation sur les postes de travail gérés. mitmproxy voit les invites déchiffrées, le code source et les en-têtes d'authentification ; sa clé privée d'autorité de certification locale peut usurper l'identité des serveurs HTTPS auprès des clients qui lui font confiance. Ne partagez pas les clés privées de l'autorité de certification, n'exportez pas de flux/fichiers HAR non expurgés, n'exposez pas son interface utilisateur au réseau et ne désactivez pas la vérification TLS.

Ce que cet exemple change

L'exemple mappe exactement cette origine source à l'origine de l'API modèle indiquée dans la documentation de ce site :

https://api.deepseek.com/v1/chat/completions
  -> local mitmproxy
  -> https://api.model-gate.com/v1/chat/completions

Configurer un clé API Model Gate dédiée, et non une clé DeepSeek, dans le champ d'informations d'identification du client. Choisissez un modèle Model Gate activé ou un alias géré par l'administrateur dans la liste catalogue de modèles. Utilisez l'origine de l'API du modèle présentée dans ce guide avec sa clé API correspondante ; n'utilisez pas le panneau ou l'hôte de l'API partenaire.

La règle ne modifie pas intentionnellement la méthode HTTP, le chemin, la requête, le corps JSON, model, Authorization, ou le JSON stream valeur. Cela change la destination et HTTP Host / HTTP/2 :authority; TLS en amont se connecte à la nouvelle destination. La version HTTP, la casse/l'ordre des en-têtes, les en-têtes de connexion et le cadrage peuvent également différer. Il ne s'agit pas d'une préservation octet par octet de tous les en-têtes ou du trafic réseau.

Préparer le streaming de réponse uniquement (les deux systèmes)

Enregistrez ce qui suit sous model-gate-response-stream.py dans votre répertoire de travail. Le même fichier est inclus dans la version dans l'application PHP à l'adresse deploy/client-tools/; il s'exécute dans mitmproxy et ne nécessite aucune installation Python distincte lors de l'utilisation du package natif.

"""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

L'intégré map_remote l'addon réécrit la destination dans le demande hook, après la lecture du corps de la requête. Gardez le streaming des requêtes désactivé jusqu'à ce que cette réécriture ait eu lieu. Ne pas utiliser --set stream_large_bodies=1 avec cette recette : il peut transmettre la demande originale avant la réécriture. Le petit module complémentaire ci-dessus permet uniquement le streaming de réponses, y compris SSE, sans modifier le corps JSON ni rejouer les requêtes.

Les commandes ci-dessous utilisent --set stream_large_bodies sans signe égal ni valeur pour réinitialiser ce paramètre facultatif à Noneet désactivez explicitement la rétention du corps diffusé. L'addon refuse d'activer ultérieurement un seuil de streaming global. Supprimez les autres modules complémentaires de streaming/réécriture de requêtes de cette session dédiée et résolvez toutes les erreurs de démarrage avant de placer une clé dans le client. Le proxy n’est pas une limite d’informations d’identification fermée en cas d’échec : validez d’abord l’itinéraire avec une clé factice.

Windows : exemple Visual Studio

Installez le package Windows natif officiel à partir de Téléchargements de mitmproxy. Rouvrez PowerShell et vérifiez mitmweb --version. Ne pas installer dans WSL pour cet exemple de processus Windows.

Créer et approuver l'autorité de certification locale de cette installation

Démarrez une fois sous le même compte Windows qui exécutera le proxy :

mitmweb --listen-host 127.0.0.1 --web-host 127.0.0.1

Après le démarrage, arrêtez-le avec Ctrl+C. mitmproxy crée son autorité de certification dans %USERPROFILE%\.mitmproxy. Préférer Utilisateur actuel faites confiance à une application exécutée lorsque vous :

$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.' }

Faites confiance uniquement à l'autorité de certification générée par votre propre installation. mitmproxy-ca-cert.cer est le certificat public ; mitmproxy-ca.pem contient également la clé privée et doit rester privée. Redémarrez Visual Studio après avoir modifié la confiance.

Uniquement lorsqu'une demande approuvée nécessite spécifiquement Machine locale faites confiance, utilisez un PowerShell élevé et certutil -addstore Root "$ca" sans -user. Cela fait confiance à l'autorité de certification à l'échelle de la machine, constitue un changement de sécurité plus large et nécessite la suppression du magasin de machines correspondant ci-dessous. Élévation sous un différent le compte administrateur peut utiliser un profil et une autorité de certification différents ; maintenir la cohérence de la configuration du compte, du certificat et du proxy.

Capturez uniquement le processus et l'hôte prévus

Exécutez PowerShell natif en tant qu'administrateur lorsque les autorisations de capture Windows l'exigent, en utilisant le même compte/profil. Démarrez Visual Studio en premier. Cet exemple cible le nom du processus 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/'

Il ne doit y avoir aucun espace après le backtick de continuation de ligne de PowerShell. La règle ancrée correspond uniquement à l'origine HTTPS spécifiée, y compris un port explicite 443 ; un nom d'hôte de fournisseur apparaissant dans une requête ou un autre nom d'hôte n'est pas réécrit. La liste verte des hôtes évite de déchiffrer les destinations non liées du processus sélectionné. lazy plus upstream_cert=false évite une connexion inutile de détection de certificat avec le fournisseur d'origine. La vérification TLS de l'amont réel est toujours activée.

Visual Studio est pas VSCode. Une extension peut envoyer des requêtes via un ServiceHub, un serveur de langage ou un processus d'assistance distinct plutôt que devenv. Identifiez le processus réel de possession du réseau avant d’élargir la capture. Pour inspecter les instances de Visual Studio :

Get-Process -Name devenv | Select-Object Id, ProcessName, Path

Remplacer local:devenv avec local:12345 en utilisant le PID réel ou une liste de PID explicitement identifiés, séparés par des virgules. Les PID changent après les redémarrages. Ne pas utiliser $PID pour une variable PowerShell personnalisée ; il fait référence au propre processus de PowerShell. Ne passez pas à la machine entière --mode local simplement pour faire apparaître une requête manquante.

Linux : le même mappage de portée

Installez une version officielle actuelle de mitmproxy et vérifiez mitmweb --version et uname -r. Local Capture utilise eBPF ; le support officiel est Linux 6.8. Il a besoin d'un assistant privilégié initié par sudo. Courir mitmweb en tant qu'utilisateur ordinaire avec --mode local:... sur la ligne de commande afin qu'il puisse demander ce privilège ; évitez de basculer l'intégralité du proxy vers root et d'utiliser accidentellement /root/.mitmproxy.

Initialisez d'abord le CA sous votre compte ordinaire, puis arrêtez avec Ctrl+C:

mitmweb --listen-host 127.0.0.1 --web-host 127.0.0.1

Préférez le mécanisme d’autorité de certification personnalisé documenté de l’application. Sur Ubuntu/Debian, les applications utilisant le magasin de clés de confiance du système peuvent utiliser cette installation facultative à l'échelle du système :

sudo install -m 0644 "$HOME/.mitmproxy/mitmproxy-ca-cert.pem" \
  /usr/local/share/ca-certificates/model-gate-local-mitmproxy.crt
sudo update-ca-certificates

Redémarrez le client. Un magasin de confiance privé Java/Node/navigateur ou une application confinée peut avoir besoin de sa propre configuration de confiance documentée ; l'importation dans le magasin du système d'exploitation ne garantit pas que chaque client lui fait confiance. D'autres distributions utilisent leurs propres procédures CA-store.

Pour un processus VS Code local nommé code, le mappage est :

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/'

Comme sous Windows, utilisez le processus/PID de production de requêtes, pas nécessairement la fenêtre de l'éditeur. Inspecter ps -eo pid,comm,args et remplacer local:12345 au besoin. La correspondance de nom Linux est limitée aux 16 premiers caractères. La capture locale sur WSL n'est pas prise en charge et les conteneurs nécessitent un réseau hôte pour ce mode. Le trafic provenant d'un hôte d'extension SSH/distant doit être configuré sur la machine sur laquelle ce processus s'exécute, et pas seulement sur votre bureau.

Streaming, chemins et autres fournisseurs

Le module complémentaire de réponse uniquement transmet les réponses HTTP sans attendre la réponse complète, ce qui est important pour la livraison des jetons SSE. Les corps des requêtes restent mis en mémoire tampon jusqu'à ce que map_remote a changé de destination. Les corps coulés ne sont pas retenus pour inspection par défaut ; les en-têtes et le statut restent utiles. N’activez pas la rétention de corps ou l’exportation de flux simplement pour dépanner une clé. Ce paramètre ne modifie pas le JSON du client stream drapeau et ne peut pas créer de flux de fournisseur autre que le streaming.

Le mappage par défaut préserve les chemins. Un client envoyant /chat/completions sans /v1 enverra toujours ce chemin à Model Gate et pourra recevoir 404. Uniquement pour une API source dont les chemins sont connus pour nécessiter cette normalisation, remplacez le map_remote valeur avec :

map_remote=|^https://api\.deepseek\.com(?::443)?/(?:v1/)?|https://api.model-gate.com/v1/

Cela en ajoute délibérément un /v1/ préfixe, en préservant un préfixe existant, le chemin et la requête restants. Il s'agit d'une variante distincte de changement de chemin, et non d'un exemple d'origine uniquement. Vérifiez le point de terminaison résultant avant d’envoyer une véritable invite.

Pour un autre fournisseur, remplacez le nom d'hôte source exact dans les deux allow-hosts et map_remote, échappez aux points d'expression régulière et choisissez l'origine/le chemin cible correct. Gardez le match ancré avec ^https:// et une limite de nom d'hôte ; n'utilisez jamais de remplacement de sous-chaîne large. Les modules complémentaires enregistrés existants ou les règles de réécriture peuvent modifier le résultat, alors inspectez votre configuration mitmproxy avant de tester.

Acceptation et dépannage

Testez d’abord le routage avec un identifiant factice et une invite non sensible ; un échec d'authentification sur la cible prévue est attendu. Ce n'est qu'une fois la destination confirmée que vous effectuez une demande volontairement petite avec une clé limitée dédiée ; l’inférence peut être facturable. Dans mitmweb, vérifiez que la destination est l'hôte de l'API Model Gate prévu, que le chemin est pris en charge, que l'ID/alias du modèle existe et que l'état HTTP est réussi. Vérifiez l’historique des demandes de Model Gate et confirmez que le texte diffusé arrive progressivement. Ne publiez pas d’en-tête d’autorisation ou d’exportation de flux comme preuve.

Aucune demande capturée. L'assistant/PID réel, les privilèges de capture, l'exécution locale ou distante, le nom d'hôte source et la prise en charge du noyau.

Échec du certificat TLS. Corrigez le redémarrage de l'autorité de certification/du profil/du magasin et du client. L’épinglage du certificat est une limitation de compatibilité et non une raison pour désactiver la vérification.

401. Le client doit utiliser une clé Model Gate pour le compte/domaine API correspondant ; map_remote n'échange pas d'informations d'identification.

404. Inspectez le chemin réel ; le mappage d'origine uniquement n'ajoute pas /v1.

400 ou messages.0 / system erreur. Vérifiez la compatibilité du protocole de requête. Une réécriture d'origine ne traduit pas les rôles de message ou d'autres champs JSON.

Modèle indisponible. Utilisez un identifiant canonique activé ou un alias existant ; le mappage ne renomme pas model.

Le streaming arrive d’un seul coup. Vérifiez que le module complémentaire de réponse uniquement s'est chargé avec succès, le client stream valeur et le soutien réel du fournisseur. N’activez pas le streaming de requêtes globales.

Arrêtez et supprimez la confiance

Avant d'arrêter l'interception, fermez le client ou supprimez la clé Model Gate de sa configuration d'origine du fournisseur. Sinon, sa prochaine demande directe peut envoyer cette clé au fournisseur d'origine. Ne présumez pas que l’arrêt du proxy échoue. Arrêtez mitmweb avec Ctrl+C, puis restaurez les paramètres normaux de point de terminaison/clé du client.

Pour les fenêtres Utilisateur actuel importez ci-dessus, supprimez uniquement le certificat exact de cette installation :

$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.' }

Pour l'option Machine locale importer, utiliser un shell élevé et certutil -delstore Root $cert.Thumbprint plutôt. Conservez le fichier public CA jusqu'à ce que vous ayez identifié et supprimé le certificat de confiance correspondant ; ne supprimez pas par leur nom les racines de confiance non liées.

Pour l'importation à l'échelle du système Ubuntu/Debian ci-dessus :

sudo rm -- /usr/local/share/ca-certificates/model-gate-local-mitmproxy.crt
sudo update-ca-certificates --fresh

Supprimez également toute configuration d'autorité de certification spécifique à l'application. Redémarrez les clients. Supprimez les artefacts sensibles capturés et faites pivoter la clé Model Gate dédiée si elle a été exposée ou envoyée vers une destination inattendue. Ces étapes du poste de travail ne nécessitent pas de modification de nginx, des magasins de confiance du serveur, de la production .env fichiers ou la politique TLS de Model Gate.

Références officielles

Révisé le 08/09/2026. Confirmez les options par rapport à votre installation mitmweb --options; la capture des clients et le comportement de confiance nécessitent toujours des tests sur votre poste de travail.