Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
300a73a
chore(release): open dev at 2.95.0 before releasing 2.94.0 (#7934)
github-actions[bot] Oct 29, 2026
24d176e
feat(gui): show distinct first-response states on the provider overvi…
lidge-jun Oct 29, 2026
ef1ca71
fix(anthropic): honor explicit Opus 5.5 reasoning summaries (#7728) (…
lidge-jun Oct 29, 2026
8ed7b45
fix(codex): report main-pool affinity decisions in request logs (#7883)
lidge-jun Oct 29, 2026
d588ca9
test(windows): warm the PowerShell ancestry probe before its timed ru…
lidge-jun Oct 29, 2026
4179e8a
perf(usage): fast-path ASCII metadata folding (#7886)
lidge-jun Oct 29, 2026
93b8a5e
fix(codex): keep local account cooldowns from quarantining combo targ…
lidge-jun Oct 29, 2026
69c1c6e
fix(messaging): reserve SSH forward ports until handoff and recover l…
lidge-jun Oct 29, 2026
c7f3928
fix(config): re-arm the atomic writer's ACL timeout memo per destinat…
lidge-jun Oct 29, 2026
041d87f
fix: preserve tool safety on translated Messages fallbacks (#7919)
lidge-jun Oct 29, 2026
92e7350
test: add offline fixtures for claude-cli schema-constrained output (…
adirwt852-cloud Oct 29, 2026
392b786
fix(openai-responses): drop the include entry xAI rejects (#7911)
xubenqiang Oct 29, 2026
cac6f72
fix(gui): preserve Muse reset countdown after quota exhaustion (#7730)
stephen-drew Oct 29, 2026
2e447c8
Kiro: log the usage Kiro reports on every wire, and forward combo chi…
hedging8563 Oct 29, 2026
0e6ac98
feat(claude-desktop): per-client model visibility for the Desktop lis…
ljluestc Oct 29, 2026
6c49278
fix(oauth): explain why Antigravity project discovery failed (#7888)
lidge-jun Oct 29, 2026
e1a60c2
feat(kiro): add IAM Identity Center login to dashboard (#7690)
martinbcg Oct 29, 2026
e42c374
fix(test-layout): keep layout.json under the file-size threshold (#7943)
lidge-jun Oct 29, 2026
ad3e3d1
fix(providers): default Moonshot API to K3.1 Pro and retire K2.5 (#7880)
lidge-jun Oct 29, 2026
e3ebd82
fix(openai-chat): send LM Studio one leading system message (#7882)
lidge-jun Oct 29, 2026
49775ec
feat(catalog): opt in to omitting disabled native models (#7889)
lidge-jun Oct 29, 2026
fb81e53
fix(service): treat headless GUI-domain launchctl 125 as an unreachab…
lidge-jun Oct 29, 2026
b09c930
test(codex): retain bounded Windows plan refusal diagnostics (#7937)
lidge-jun Oct 29, 2026
524c019
fix(combos): fail over when a target rejects a request for context le…
lidge-jun Oct 29, 2026
8a6cea9
fix(advisor): support manual consultations during web search (#7858)
auroraflux-jhkim Oct 29, 2026
f4eef7b
fix(search): consume the final Responses data line at EOF (#7873)
oocheol Oct 29, 2026
fc17ac2
test(windows): resolve the atomic-write fixture root before matching …
lidge-jun Oct 29, 2026
9b78a16
test(windows): budget hosted fixture phases without weakening contrac…
lidge-jun Oct 29, 2026
26224ad
test(codebuddy): feed the abort fixture's stdout once (#7948)
lidge-jun Oct 29, 2026
b9fb2c7
test(windows): use a never-allocated PID for the pending-child recove…
lidge-jun Oct 29, 2026
8131535
test(claude): give native passthrough success paths the internal head…
lidge-jun Oct 29, 2026
9c96ce5
feat(gui): link completion probe failures to recovery, re-verificatio…
lidge-jun Oct 29, 2026
095ddf6
test(config): publish the overlap fixture after the recheck budget is…
lidge-jun Oct 29, 2026
463a0ee
fix(test): judge protected-tree containment per path component (#7884)
lidge-jun Oct 29, 2026
7aae44d
perf(anthropic): scan SSE inspection fragments incrementally (#7913)
0disoft Oct 29, 2026
6c2cdd1
feat(providers): test all models of a provider and disable the failur…
ljluestc Oct 29, 2026
a391835
feat(responses): complete gracefully on max_output_tokens (#7770)
omar391 Oct 29, 2026
297f299
fix(advisor): apply the caller's paid-combo consent and device fallba…
lidge-jun Oct 29, 2026
96e0e00
feat(clients): let the omo integration write the Responses dialect (#…
lidge-jun Oct 29, 2026
f5f47b0
feat(provider): add keyless CC-Switch provider import with preview, a…
lidge-jun Oct 29, 2026
3ea8965
fix(gui): explain upstream request failures (#7936)
lidge-jun Oct 29, 2026
8143cc0
build(deps): bump rustls from 0.23.45 to 0.23.46 in /desktop/src-taur…
dependabot[bot] Oct 30, 2026
88de376
fix(ci): distinguish install failures from owned deadlines (#7977)
luvs01 Oct 30, 2026
2c4e580
test(xai): cover encrypted Responses tool continuation (#7975)
Reedtrullz Oct 30, 2026
3a70dd4
fix(volcengine): keep Kimi K3.1 Pro tool continuations valid (#7944)
AaronZ345 Oct 30, 2026
4998194
perf(responses): count snapshot text bytes incrementally (#7957)
0disoft Oct 30, 2026
572467f
perf(history): move integrity scans off the serving thread (#7972)
luvs01 Oct 30, 2026
0cc5a59
fix(workflow-budget): make per-task ceilings configurable from config…
robin-bially Oct 30, 2026
899cc4f
docs(config): say when the workflow send ceiling is checked (#7987)
lidge-jun Oct 30, 2026
4fc8700
fix(kiro): exclude runtime callbacks from retry snapshot (#7981)
lidge-jun Oct 30, 2026
853508e
fix(windows): snapshot ACL failure diagnostics (#7970)
luvs01 Oct 30, 2026
db7bdc5
fix(cli): explain tracked runtime stop refusals (#7973)
luvs01 Oct 30, 2026
d82d7ee
fix(router): decode routed slugs via modelDisplayNames ids (#7979)
lidge-jun Oct 30, 2026
1e1620f
fix(responses): normalize Codex tool catalogs and include for Meta Mu…
lidge-jun Oct 30, 2026
ac0833b
fix(windows): bigint probe identity in runtime preflight; release CC-…
lidge-jun Oct 30, 2026
6218a9a
fix(combo): skip Meta Muse targets for mandatory tool_choice (#7982)
lidge-jun Oct 30, 2026
d42b9b1
fix(sidecars): accept CR-delimited Responses events (#7989)
lidge-jun Oct 30, 2026
d389699
fix(azure): omit unsupported Responses encrypted output include (#7988)
lidge-jun Oct 30, 2026
a2ae482
fix(codex): validate CLI and desktop launcher execution boundaries (#…
luvs01 Oct 30, 2026
eea1454
fix(credentials): stop Windows ancestor-watch feedback loops (#7976)
luvs01 Oct 30, 2026
1eca7a3
fix(discovery): name the invalid model row and the static-list workar…
lidge-jun Oct 30, 2026
0c74947
fix(codex): stop scoring an elapsed 5-hour window against a pool acco…
lidge-jun Oct 30, 2026
b692a8a
test(history): corrupt the index the health query plan actually reads…
lidge-jun Oct 30, 2026
ba0556d
fix(codex): retire a pool account's carried 5-hour window when WHAM s…
lidge-jun Oct 30, 2026
03d8bd0
fix(claude): keep web_search native when no sidecar backend can run (…
lidge-jun Oct 30, 2026
8063be2
fix(providers): keep the quota report cache when pool readings are on…
lidge-jun Oct 30, 2026
d9e0c05
fix(responses): promote additional_tools to top-level tools for xAI a…
lidge-jun Oct 30, 2026
a022a67
fix(claude): prune generated agents when the Claude integration is tu…
lidge-jun Oct 30, 2026
227811f
fix(history): bound the integrity check wait (#7997)
lidge-jun Oct 30, 2026
9922f81
test(history): corrupt the health index through a cold connection (#8…
lidge-jun Oct 30, 2026
cb48362
fix(codex): await recovery ACL checks in async parent admission (#7931)
luvs01 Oct 30, 2026
236a886
feat(codex): tier role auto-assign candidates by measured capability …
LilMGenius Oct 30, 2026
3bda3e5
test(codex): assert the cold keyring refusal kind and report its caus…
lidge-jun Oct 30, 2026
b53b5d2
test(cc-switch): finalize the F1/F2 fixture statements before cleanup…
lidge-jun Oct 30, 2026
261131d
fix(update): refuse dashboard restart under a systemd unit OpenCodex …
lidge-jun Oct 30, 2026
19ab113
fix(windows): admit config-root cache writes after the optional confi…
lidge-jun Oct 30, 2026
8e58c96
test(cli): name the pinned-port holder when a sibling misses its dead…
lidge-jun Oct 30, 2026
3cab4a7
test(anthropic): await the admitted provider quota cache write (#8004)
lidge-jun Oct 30, 2026
c34d26f
test(claude): report the hardened local-CA ACL in the first-party app…
lidge-jun Oct 30, 2026
86b72a6
fix: compare file identity with bigint stat (#8019)
lidge-jun Oct 30, 2026
6c86d0f
fix: compare Codex and remote workspace file identity with bigint sta…
lidge-jun Oct 30, 2026
c618c77
test: select injected stat targets by canonical path (#8029)
lidge-jun Oct 30, 2026
5103065
fix: compare CLI install and update artifact identity with bigint sta…
lidge-jun Oct 30, 2026
c68885b
test: give the Windows apply x64 fixture compile the shared spawn bud…
lidge-jun Oct 31, 2026
0c9edcb
release: promote frozen tip c68885b5f1 to main as 2.95.0
lidge-jun Oct 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions desktop/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion desktop/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "opencodex-desktop"
version = "2.94.0"
version = "2.95.0"
description = "OpenCodex desktop shell"
authors = ["OpenCodex contributors"]
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion desktop/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "OpenCodex",
"version": "2.94.0",
"version": "2.95.0",
"identifier": "com.opencodex.desktop",
"build": {
"frontendDist": "../ui",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,13 @@ declared `deferred-verb` in the route registry against this document, which is
what keeps them out of the undeclared-route ratchet without pretending the gap
does not exist.

The later configurable-ceilings change also defers the live CLI counterpart of
`PUT /api/workflow-budget/settings` against this document. Its management API
updates the running policy; local `ocx config set/unset workflowBudget...`
edits disk configuration and requires a proxy restart for live convergence.
`GET /api/workflow-budget/settings` is a `local-transport` exemption because
`ocx config get` can read the same configuration block locally.

## Verification posture

Local suite, typecheck, install and build: NOT RUN, by standing instruction.
Expand Down
1 change: 1 addition & 0 deletions docs-site/astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ export default defineConfig({
items: [
{ label: "Overview", translations: { fr: "Vue d’ensemble", ko: "개요", "zh-CN": "概览", "zh-TW": "概覽", ru: "Обзор", ja: "概要", tr: "Genel Bakış" }, slug: "reference/configuration" },
{ label: "Providers", translations: { fr: "Fournisseurs", ko: "프로바이더", "zh-CN": "提供商", "zh-TW": "供應商", ru: "Провайдеры", ja: "プロバイダー", tr: "Sağlayıcılar" }, slug: "reference/configuration/providers" },
{ label: "Catalog", translations: { fr: "Catalogue", ko: "카탈로그", "zh-CN": "目录", "zh-TW": "目錄", ru: "Каталог", ja: "カタログ", tr: "Katalog" }, slug: "reference/configuration/catalog" },
{ label: "Routing", translations: { fr: "Routage", ko: "라우팅", "zh-CN": "路由", "zh-TW": "路由", ru: "Маршрутизация", ja: "ルーティング", tr: "Yönlendirme" }, slug: "reference/configuration/routing" },
{ label: "Agents", translations: { fr: "Agents", ko: "에이전트", "zh-CN": "代理", "zh-TW": "代理", ru: "Агенты", ja: "エージェント", tr: "Ajanlar" }, slug: "reference/configuration/agents" },
{ label: "Advisor", translations: { fr: "Conseiller", ko: "어드바이저", "zh-CN": "顾问", "zh-TW": "顧問", ru: "Консультант", ja: "アドバイザー", tr: "Danışman" }, slug: "reference/configuration/advisor" },
Expand Down
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/fr/guides/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,7 @@ Le proxy traduit chaque requête Anthropic Messages API au format Codex Response
| Assistant `tool_use` | `function_call` (`input` → JSON-stringifié `arguments`) |
| Utilisateur `tool_result` | `function_call_output` (`is_error` → préfixe `[tool error]`) |
| Relecture de `thinking` / `redacted_thinking` | Éléments `reasoning` avec enveloppes `ocxr1` bornées pour les signatures et les contenus masqués |
| Outils fonctionnels | `{type: "function"}` (`web_search*` → `{type: "web_search"}`) |
| Outils fonctionnels | `{type: "function"}` (`web_search*` → `{type: "web_search"}`) La recherche hébergée avec `allowed_domains`, `blocked_domains` ou `user_location` est omise sur les routes Responses/Chat traduites ; la forcer renvoie 400. Les définitions de fonctions `defer_loading` valides restent appelables comme fonctions ordinaires. Voir les [limites de traduction](/guides/claude-code/#search-restrictions-and-deferred-tools-on-translated-routes). |
| `tool_choice` | `auto`→`auto`, `none`→`none`, `any`→`required`, fonction nommée→`{type:"function",name}`, hébergée WebSearch/web_search→`{type:"web_search"}` |
| `max_tokens` | `max_output_tokens` |
| `stop_sequences` | `stop` |
Expand Down
2 changes: 2 additions & 0 deletions docs-site/src/content/docs/fr/guides/codex-app-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Sélecteur de modèles de Codex App
description: Comment les modèles opencodex apparaissent dans Codex App, Codex CLI et Codex TUI par l'intermédiaire du catalogue Codex partagé.
---

Par défaut : `false`. Avec `"omitDisabledNativeModels": true` dans `config.json`, puis `ocx sync`, les lignes natives désactivées sont omises du catalogue, du cache et de la découverte HTTP au format Codex. Le modèle d’héritage natif validé avant omission conserve les métadonnées des lignes routées. Les requêtes directes gardent leur routage habituel. Les descriptions de masquage ci-dessous concernent le comportement par défaut.

opencodex ne modifie pas Codex App. Il écrit la même configuration et le même catalogue de modèles Codex
que ceux utilisés par Codex CLI et TUI. Le serveur d'application lit cet état partagé, mais certaines versions
de Codex Desktop appliquent dans le moteur de rendu une seconde liste d'autorisation distante et peuvent
Expand Down
13 changes: 10 additions & 3 deletions docs-site/src/content/docs/fr/guides/combos.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,8 @@ Les échecs d’un combo se répartissent entre ceux qui entraînent un **bascul
| --- | --- |
| HTTP 401, 403, 404, 408, 429, ou n'importe quel 5xx | Refroidissez la cible et passez à la prochaine cible éligible. |
| Erreur classée comme erreur d’authentification, d’abonnement, de quota, de limitation de débit, de surcharge ou de serveur en amont | Place la cible en période de refroidissement et bascule, même si le statut seul ne suffit pas. |
| Annulation client (499), `origin_rejected`, refus de cyber-politique, débordement de contexte ou autre demande invalide | Arrêtez et renvoyez l'erreur ; une autre cible ne rendrait pas la demande valide. |
| Annulation client (499), `origin_rejected`, refus de cyber-politique ou autre demande invalide | Arrêtez et renvoyez l'erreur ; une autre cible ne rendrait pas la demande valide. |
| Dépassement de contexte confirmé avant la sortie, y compris HTTP 400 | Essaie la prochaine cible admissible non tentée sans refroidissement ; à épuisement, renvoie la première erreur de contexte HTTP 400 confirmée (un refus de contexte avec un autre statut fait aussi passer à la cible suivante, sans être conservé). |
| Rejet structuré de `user`, valeur non prise en charge pour `reasoning.effort`/`reasoning_effort`, rejet d'entrée d'image propre à un modèle (`param: input`), ou refus d'un média d'entrée que la route ne peut pas lire (`unsupported_input_modality`) | Bascule vers la cible admissible suivante avant le début de la sortie, sans délai de refroidissement ; voir Compatibilité des paramètres facultatifs ci-dessous. |
| Premier appel d'outil d'un tour Responses exécuté par un adaptateur interne (`runTurn`) que la requête courante n'a pas déclaré, avant toute sortie et tout effet de bord non rejouable | Met la cible en refroidissement et bascule avec le même catalogue d'outils. Après une sortie visible ou un effet de bord non rejouable, le refus est définitif. Les requêtes Chat Completions et Anthropic Messages ne changent pas. |
| Toute autre erreur non classifiée | Arrêtez et renvoyez l'erreur. |
Expand All @@ -210,9 +211,15 @@ valeur `Retry-After` valide, opencodex l’utilise à la place ; les en-têtes d
acceptées, et un délai explicite `Retry-After` est plafonné à 24 heures ; les autres temps de recharge restent plafonnés à 10 minutes.

La requête actuelle ne réessaye jamais la même cible tentée. Les demandes ultérieures l'ignorent jusqu'à ce qu'il soit
le temps de recharge expire. S’il ne reste aucune cible éligible, le proxy renvoie HTTP 503 avec
le temps de recharge expire. Si aucune cible n’a été tentée et qu’aucune n’est éligible, le proxy renvoie HTTP 503 avec
`error.code = "combo_unavailable"`.

Après un refus de contexte HTTP 400 confirmé, l’épuisement des cibles ou du budget d’envoi renvoie
le premier refus sous `context_length_exceeded`, avant toute erreur ultérieure réessayable, même de quota.
Cela inclut les cibles restantes incompatibles avec la relecture du raisonnement ou sans consentement
de dépense. L’annulation, un refus fatal ultérieur ou un refus explicite de la politique de repli reste
prioritaire ; aucune cible facturée sans consentement ne reçoit la requête.

:::note
Le basculement est intentionnellement limité. Il facilite la disponibilité, l'authentification et l'authentification spécifiques à la cible.
échecs de quota et de surcharge ; il ne cache pas les erreurs des appelants ni les refus de politique.
Expand Down Expand Up @@ -366,7 +373,7 @@ message de validation.

### Pourquoi le basculement s'est-il arrêté après la première erreur ?

L’erreur était terminale plutôt que spécifique à la cible. Corriger une entrée invalide, réduire un contexte surdimensionné,
L’erreur était terminale plutôt que spécifique à la cible. Corriger une entrée invalide,
gérer un refus de politique ou corriger l’origine de la demande rejetée. Les combos ne sautent pas dans ces cas-là.

## Compatibilité des paramètres facultatifs
Expand Down
7 changes: 4 additions & 3 deletions docs-site/src/content/docs/fr/guides/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,7 @@ Les fournisseurs OAuth dont les identifiants comportent un identifiant de compte
peuvent conserver plusieurs connexions. La page **Fournisseurs** affiche ces comptes dans une liste déroulante,
permet d'en ajouter un autre et de changer de compte actif sans déconnecter les autres. Une connexion ordinaire
avec un identifiant Kimi qui ne contient aucune information d'identité remplace l'emplacement actif, tandis que l'action explicite **Ajouter un
compte** préserve cet emplacement et en active un nouveau, distinct. Les comptes Kiro sont indexés par ARN de
profil. `chatgpt` n'utilise toujours qu'un seul emplacement, car les comptes du pool Codex sont gérés dans un
compte** préserve cet emplacement et en active un nouveau, distinct. Les comptes Kiro utilisent l’ARN du profil avec l’adresse e-mail de l’utilisateur connecté lorsqu’elle est disponible ; plusieurs utilisateurs peuvent conserver des identifiants distincts pour un même profil d’organisation. `chatgpt` n'utilise toujours qu'un seul emplacement, car les comptes du pool Codex sont gérés dans un
registre distinct. Les jetons restent dans `~/.opencodex/auth.json` ; `/api/oauth/accounts` ne renvoie que des
métadonnées masquées.

Expand Down Expand Up @@ -255,6 +254,8 @@ dans le pool de comptes, ce que fait aussi le pool de comptes Codex du tableau d

### Importation des identifiants Kiro

Dans le tableau de bord, choisissez **AWS IAM Identity Center**, puis indiquez l’URL du portail d’accès AWS et la région SSO de votre organisation. Autorisez le code d’appareil dans votre navigateur et choisissez le profil Kiro à enregistrer si plusieurs sont proposés. Aucun CLI ni accès SSH n’est nécessaire. Les instructions CLI ci-dessous concernent le choix **Kiro CLI**.

La connexion Kiro nécessite la CLI Kiro : sous Unix, installez-la avec `curl -fsSL https://cli.kiro.dev/install | bash` ;
sous Windows PowerShell, utilisez `irm 'https://cli.kiro.dev/install.ps1' | iex`, puis connectez-vous avec `kiro-cli login`.
En l'absence de session `kiro-cli`, `ocx login kiro` se rabat sur un jeton d'accès collé ou sur la variable
Expand Down Expand Up @@ -359,7 +360,7 @@ promotionnels de Cline ne sont accessibles que dans l'IDE ou la CLI Cline, pas p
| Novita AI | `https://api.novita.ai/openai/v1` |
| Together | `https://api.together.xyz/v1` |
| Fireworks | `https://api.fireworks.ai/inference/v1` |
| Moonshot (Kimi API) · Kimi (coding) | `https://api.moonshot.ai/v1` · `https://api.kimi.com/coding/v1` |
| Moonshot (Kimi API) · Kimi (coding) | `https://api.moonshot.ai/v1` · `https://api.kimi.com/coding/v1`. L’API `moonshot` utilise `kimi-k3.1-pro` par défaut ; les sélections `kimi-k2.5` enregistrées pour les adresses API officielles migrent vers ce modèle. |
| Hugging Face | `https://router.huggingface.co/v1` |
| NVIDIA NIM | `https://integrate.api.nvidia.com/v1` |
| Z.AI (GLM Coding) | `https://api.z.ai/api/coding/paas/v4` |
Expand Down
2 changes: 2 additions & 0 deletions docs-site/src/content/docs/fr/guides/web-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ Les vues Utilisation, Tableau de bord, Fournisseurs, Catalogue des fournisseurs

### Filtrer les requêtes

Le détail d’une requête privilégie la cause d’échec amont enregistrée plutôt qu’un message générique d’erreur du proxy. Le nombre d’envois physiques est toujours affiché lorsqu’il est valide ; une comptabilité absente ou invalide affiche **Unavailable**, et non zéro. **Retries** compte les envois après le premier uniquement lorsqu’une seule tentative entièrement réglée et cohérente est enregistrée. Les tentatives multiples, les comptabilités non résolues ou incohérentes et les normalisations avec perte omettent les retries au lieu d’en inventer. Une cause persistante inconnue revient au titre fondé sur le statut, sans attribution brute.

Les filtres combinent interface, requêtes interceptées, fournisseur, modèle exact, statut, période, vitesse et identifiant de conversation dans le journal chargé. Les choix incluent les tentatives de repli ; les modèles ignorent la casse et les espaces externes, sans correspondance partielle. Un choix disparu revient à Tous.

Les périodes de 15 minutes, une heure et un jour évoluent toutes les 30 secondes dans l’onglet Logs, même sans actualisation automatique. La vitesse mesure les jetons de sortie par seconde sur toute la durée : moins de 15, de 15 à moins de 50, ou au moins 50 ; les valeurs indisponibles sont exclues quand ce filtre est actif. Réussite : 2xx ; erreur : 4xx/5xx.
Expand Down
22 changes: 22 additions & 0 deletions docs-site/src/content/docs/fr/reference/cli/providers-accounts.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ Gestion des fournisseurs non interactive. Les entrées de registre sont classée
| `quota` | `--refresh`, `--json` | Lire les rapports sur les quotas des fournisseurs. |
| `presets` | `--json` | Répertoriez les préréglages du fournisseur de tableau de bord. |
| `account-mode` | `pool`, `direct`, `--json` | Sélectionnez le routage de compte mutualisé ou direct Codex. |
| `import-cc-switch` | `--source <FILE>`, `--provider <id>`, `--apply`, `--restore`, `--allow-private-network`, `--json` | Prévisualiser, appliquer sélectivement ou restaurer des entrées de fournisseurs sans clé depuis une base SQLite (`cc-switch.db`) ou un fichier JSON CC-Switch. |

Par défaut, `add`, `remove` et `set-default` modifient la configuration locale. Ajoutez `--live` pour modifier le proxy actif, et `--yes` pour une suppression en direct. `--sync --json` tente aussi la synchronisation après enregistrement ; en cas d’échec, la sauvegarde reste acquise, avec un code non nul et `needsSync: true`. `--live` et `--sync` sont incompatibles. Voir le [guide anglais](/reference/cli/providers-accounts/#snapshot-edit-and-apply-with-a-baseline) pour pacing et snapshot/apply.

Expand Down Expand Up @@ -60,6 +61,27 @@ la frontière est à vous de la respecter. Deux raisons pour lesquelles c'est im
Utilisez `--api-key` ou un identifiant OAuth pour tout ce qui est secret.
:::

### Import de fournisseurs CC-Switch sans clé

```bash
ocx provider import-cc-switch --source ~/.cc-switch/cc-switch.db
ocx stop
ocx provider import-cc-switch --source ~/.cc-switch/cc-switch.db --provider my-provider --apply
# Démarrez le proxy dans un autre terminal (ou exécutez ocx ensure), puis ajoutez les clés :
ocx start
printf '%s\n' "$API_KEY" | ocx account add-key my-provider

# Chemin d’annulation distinct (arrêtez d’abord le proxy ; supprime uniquement les entrées sans clé non modifiées) :
ocx stop
ocx provider import-cc-switch --restore
```

`ocx provider import-cc-switch` projette des valeurs **uniquement** depuis une liste blanche explicite de champs de métadonnées non secrets (identifiants de fournisseur, types d’application, URL de base, dialectes et modèles par défaut) à partir d’une base SQLite ou d’un fichier JSON CC-Switch ordinaire. Les octets de la source et de la configuration intégrée sont lus de manière transitoire pour analyser l’entrée, tandis que les champs secrets, noms libres et commentaires TOML sont ignorés au niveau des octets, ne sont jamais décodés en chaînes, écrits ni journalisés, et les tampons d’octets transitoires sont remis à zéro dans `finally`. Les règles strictes de chemin d’URL (`http(s)://host[:port]` sans chemin ou avec 1 à 4 segments d’API en minuscules `[a-z0-9._-]` tels que `/v1`, `/api/v1` ou `/compatible-mode/v1`) et les contrôles syntaxiques d’identifiant/modèle servent de défense en profondeur sans faire écho aux valeurs rejetées. Les fichiers sources sont ouverts une seule fois avec vérification de descripteur `O_NOFOLLOW | O_NONBLOCK` et désérialisés en lecture seule en mémoire pour SQLite sans fichier temporaire ; les fichiers SQLite ayant plusieurs liens physiques (`nlink > 1`) sont refusés afin d’empêcher le contournement des contrôles de fichiers annexes, et si un fichier voisin `-wal` ou `-journal` est non vide, l’import refuse et demande de fermer CC-Switch (ou de consolider la base) avant de réessayer. N’importez que depuis une source locale CC-Switch de confiance et vérifiez chaque ID, modèle et `baseUrl` affichés avant d’ajouter des identifiants :

- **Aperçu (par défaut) :** exige `--source <FILE>`, n’écrit rien et indique les entrées découvertes, éligibles, en conflit et invalides.
- **Application (`--apply`) :** exige `--source <FILE>` et un proxy arrêté (`ocx stop`), et est refusée sur un Remote Link Child. Répétez `--provider <id>` pour n’importer que certaines entrées, ou passez `--allow-private-network` pour autoriser les URL de bouclage ou de réseau privé. Même sans aperçu préalable, `--apply` affiche chaque ID de fournisseur, modèle par défaut et URL de destination avant d’écrire les entrées sans clé et le journal d’annulation `$OPENCODEX_HOME/cc-switch-provider-import-journal.json` (`stdout` en mode texte, `stderr` en mode `--json`) ; un second `--apply` est refusé tant qu’un journal actif existe. Vérifiez les entrées affichées, démarrez le proxy (`ocx start` dans un autre terminal ou `ocx ensure`), puis ajoutez les clés avec `printf '%s\n' "$API_KEY" | ocx account add-key <provider>` (entrée standard redirigée) ou `ocx login <provider>`.
- **Restauration (`--restore`) :** chemin d’annulation distinct (et non la suite de l’ajout d’identifiants) qui exige un proxy arrêté (`ocx stop`), est refusé sur un Remote Link Child et n’accepte ni `--source`, ni `--provider`, ni `--allow-private-network`. Il inspecte `auth.json` en lecture seule au niveau des octets (échec fermé s’il est illisible ou mal formé) et ne supprime du journal actif que les fournisseurs qui correspondent encore à leur état importé sans clé et qui ne sont ni sélectionnés comme `defaultProvider` ni référencés par le routage, les combos, la politique de repli (fallback policy), les comptes OAuth ou les clés API.

## Authentification

### `ocx login <provider>`
Expand Down
Loading
Loading