Claude Kimi Bridge

Extension VSCode qui bascule le panneau officiel Claude Code entre deux profils, en n'utilisant que tes abonnements (tokens bearer OAuth locaux) — jamais de clé API, jamais de facturation au token.
Profils
- Direct — Claude (abonnement) : tout est routé vers Anthropic (login OAuth) ; un id Kimi resté « sticky » dans la session est réécrit à chaud vers
directModel.
- Proxy — Claude ↔ Kimi (abonnements) : un mini-proxy local (127.0.0.1, partagé entre fenêtres, relancé automatiquement si la fenêtre hôte se ferme) relaie le panneau vers Claude et Kimi selon le modèle choisi. Le sélecteur
/model du panneau liste les modèles des deux providers (découverte native via /v1/models) → switch à chaud dans le panneau.
Changement de profil à chaud (v0.8+) : la redirection (env) est posée une seule fois et ne change plus ; le profil est un simple mode de routage interne au proxy — basculer Direct ↔ Proxy est immédiat, sans rechargement de fenêtre.
Modèles exposés en mode Proxy (ordre = priorité, conservé par le picker) : Claude Fable 5, Claude Opus 5, 🌙 Kimi K3 (1M) en tête, puis Sonnet 5, les autres alias Kimi et les 4.5. Catalogue éditable depuis la sidebar (section « Modèles du picker ») : ajout (id exposé + cible provider optionnelle), suppression, réinitialisation — prise en compte à la prochaine nouvelle conversation Claude.
Note filtre CLI : le picker /model ne retient de la découverte gateway que les ids préfixés claude/anthropic (codé en dur dans le CLI) — les modèles Kimi y figurent via leurs alias claude-kimi-* (champ target = vrai id Kimi, traduit au routage). Les ids bruts k3/kimi-* restent utilisables en saisissant /model k3 à la main ; la sidebar ne liste que les alias, comme le picker.
Usage
- Clic sur l'icône dans la barre de statut (ou
Ctrl+Shift+P → « Claude Switcher : Changer de profil »).
- Choisir le profil → immédiat, sans rechargement. Seule la toute première activation de la redirection demande un rechargement (les variables d'env ne sont lues qu'au lancement du processus Claude).
- En mode Proxy : ouvrir le panneau Claude Code, taper
/model → les modèles Kimi et Claude apparaissent ; changer de modèle = changer de provider, sans rechargement.
Commandes : Changer de profil · Basculer Direct ↔ Proxy (idéale pour un raccourci clavier) · Revenir en Direct · État du proxy et des tokens · Ouvrir le panneau de configuration · Désactiver la redirection. Logs : panneau Output « Claude Kimi Bridge ».
Sidebar dédiée : icône « Claude Switcher » dans la barre d'activité (à gauche) — profil actif, état du proxy (avec le rôle de la fenêtre : hôte / adopté), quota Kimi 5h en direct, quota Claude 5h (capté des en-têtes anthropic-ratelimit-*), compteurs de tokens par provider (entrée/sortie/cache, cumul persisté entre sessions, bouton de remise à zéro), boutons d'action (dont tester le proxy et exporter l'historique en CSV).
Settings :
claudeProviderSwitcher.extraModels — modèles supplémentaires exposés au sélecteur /model (routage par préfixe : k3*/kimi* → Kimi, le reste → Anthropic).
claudeProviderSwitcher.defaultProfile — remember (défaut) / direct / proxy ; définissable au niveau workspace pour un profil par défaut par dossier.
claudeProviderSwitcher.fallbackModel — repli automatique : si Kimi renvoie une erreur de quota/rate-limit (HTTP 429 ou corps d'erreur explicite), la requête est renvoyée vers ce modèle Claude (défaut claude-sonnet-4-5, vide = désactivé). Compteur de replis dans la sidebar.
claudeProviderSwitcher.fallbackMap — repli par modèle Kimi (prioritaire sur fallbackModel) : {"k3": "claude-fable-5"}. La valeur "none" désactive le repli pour ce modèle. Éditable depuis la sidebar (selects par modèle) — tout est appliqué à chaud.
claudeProviderSwitcher.claudeFallbackModel — repli inverse : si Claude renvoie une erreur de quota/rate-limit, la requête est renvoyée vers ce modèle Kimi (défaut k3, vide = désactivé). Anti-boucle : une tentative de repli ne déclenche jamais un nouveau repli.
claudeProviderSwitcher.claudeFallbackMap — repli par modèle Claude (prioritaire sur claudeFallbackModel) : {"claude-opus-4-5": "k3"}. La valeur "none" désactive le repli pour ce modèle. Éditable depuis la sidebar.
- Repli ou pas, une surcharge transitoire (503/529 « overloaded ») déclenche d'abord un retry unique sur le même modèle — sans changement de provider.
claudeProviderSwitcher.quotaAlertThresholdPercent — seuil d'alerte du quota Kimi 5h en % restant (défaut 10, 0 = désactivé) ; la notification propose de basculer en Direct.
claudeProviderSwitcher.smartRouting — routage intelligent côté Kimi (défaut activé) : contexte estimé ≥ seuil → k3 (1M) ; requêtes légères vers un modèle k3* → kimi-for-coding-highspeed.
claudeProviderSwitcher.smartRoutingThreshold — seuil en tokens estimés (défaut 100000).
claudeProviderSwitcher.directModel — profil Direct : modèle Claude utilisé quand la session envoie un id Kimi (défaut claude-fable-5). Réécriture à chaud, sans rechargement.
claudeProviderSwitcher.upstreamTimeoutSeconds — timeout des requêtes vers Kimi/Anthropic (défaut 600) : à l'expiration, la requête échoue en 504 au lieu de pendre. Les corps de requête sont par ailleurs limités à 50 Mo (→ 413).
claudeProviderSwitcher.autoScopeModel — garde-fou « modèle global » automatique (défaut activé) : un id Kimi écrit dans ~/.claude/settings.json est migré vers .claude/settings.local.json du projet et le global est réparé (repairModel), silencieusement. false = prompt de réparation en 1 clic.
claudeProviderSwitcher.repairModel — modèle de remplacement écrit dans le settings global par le garde-fou (défaut claude-fable-5[1m]).
La sidebar affiche aussi : l'historique des 12 dernières requêtes (modèle demandé → routé, statut, latence, tokens, repli éventuel) et la détection des CLI Codex/Grok (statut seulement — leur protocole propriétaire n'est pas encore bridgé).
Portée & architecture de la redirection
- Le profil actif est mémorisé par projet/fenêtre (workspaceState) ; le mode courant est en plus synchronisé entre fenêtres via le proxy partagé.
- La redirection (
ANTHROPIC_BASE_URL, ANTHROPIC_AUTH_TOKEN, CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY) est posée une seule fois dans claudeCode.environmentVariables (seul point d'accroche officiel). Le token est stable et partagé par machine (~/.claude-provider-switcher/runtime.json) : il reste valide quelle que soit la fenêtre qui héberge le proxy — c'est ce qui rend les bascules à chaud possibles. Elle ne fuit jamais hors de VSCode et se retire via « Désactiver la redirection ».
- Multi-fenêtres : la première fenêtre héberge le proxy (port 4177) ; les suivantes l'adoptent (sonde
/control/health). Si l'hôte se ferme, une autre fenêtre le relance automatiquement — même port, même token, transparent pour le panneau Claude.
~/.claude/settings.json et les fichiers du projet ne sont jamais modifiés… sauf par le garde-fou ci-dessous.
Garde-fou « modèle global » (automatique, v0.8+)
Le modèle choisi dans le picker /model est écrit par Claude Code dans ~/.claude/settings.json (global, lu par toutes les sessions claude de la machine). Dès qu'un id Kimi y apparaît, l'extension le migre vers .claude/settings.local.json du projet courant (portée projet, prioritaire sur le global — la session garde son choix) et répare le global avec repairModel. Silencieux, sans clic : un id Kimi ne peut plus partir chez Anthropic depuis un terminal externe → fini les 404.
Tokens (abonnements uniquement)
- Kimi : lit
~/.kimi-code/credentials/kimi-code.json, rafraîchit via https://auth.kimi.com/api/oauth/token quand le token expire (~15 min) et réécrit les tokens tournés dans le fichier (le Kimi CLI reste connecté). Endpoint : https://api.kimi.com/coding/v1 avec les en-têtes X-Msh-* attendus.
- Claude : lit
~/.claude/.credentials.json (claudeAiOauth), rafraîchit via https://console.anthropic.com/v1/oauth/token si besoin (le CLI Claude Code le fait déjà de lui-même ; relecture du fichier à chaque requête).
Dev
npm install
npm run compile # tsc → out/
npm run lint # vérification de types sans émission
npm test # tests unitaires + intégration proxy (30 tests, node:test)
node scripts/test-proxy.mjs # tests standalone contre le vrai proxy (auth, catalogue, routage Kimi + Claude)
node scripts/validate-kimi.mjs # vérifie le login Kimi local (token, refresh, endpoint quota)
node scripts/check-model-persistence.mjs # inspecte où Claude Code persiste le modèle choisi
npx vsce package --no-dependencies
code --install-extension claude-kimi-bridge-0.9.2.vsix
CI : GitHub Actions (.github/workflows/ci.yml) — compile + tests sur Ubuntu et Windows à chaque push/PR.
Limites
- Seule la première pose de la redirection (ou sa désactivation) demande un rechargement de fenêtre — les env sont lues au lancement du processus Claude. Tout le reste (profil, modèle, replis, config) est à chaud.
- Port 4177 occupé par un service étranger → redirection bloquée (le panneau Claude parlerait à ce service) : notification avec « Réessayer » ou « Utiliser un port aléatoire » (l'env suit alors le port réel, avec rechargement).
- L'usage d'un token OAuth d'abonnement via un proxy local est une zone grise côté conditions Anthropic/Kimi — le client reste Claude Code, mais tu utilises à tes risques.