Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
b24158f
feat(providers): allow trusted encrypted V2 task passthrough
cb8010d6 Aug 18, 2026
e118d83
fix(providers): enforce encrypted V2 final wire
cb8010d6 Aug 19, 2026
1fdffac
docs/tests: address encrypted V2 review feedback
cb8010d6 Aug 19, 2026
57f6948
refactor(management): keep provider capability checks out of auth bou…
cb8010d6 Aug 19, 2026
2da157d
docs(i18n): clarify encrypted V2 relay behavior
cb8010d6 Aug 19, 2026
db43d75
docs: document final encrypted V2 adapter gate
cb8010d6 Aug 19, 2026
89d4553
docs: restore sanitized provider screenshots
cb8010d6 Aug 19, 2026
828fe6e
fix(responses): preserve inbound wire in combo guard
cb8010d6 Aug 20, 2026
b27e3f9
docs(i18n): clarify encrypted relay confirmation
cb8010d6 Aug 20, 2026
c4fbfdf
fix(responses): guard encrypted tasks after wire normalization
cb8010d6 Aug 20, 2026
6aa88a9
fix: clear stale encrypted V2 provider opt-ins
cb8010d6 Aug 20, 2026
a0654c3
fix(gui): preserve confirmed V2 opt-ins on refresh
cb8010d6 Aug 20, 2026
f25be42
docs: sync localized encrypted V2 guidance
cb8010d6 Aug 20, 2026
7120dfe
fix: repair provider type declaration after rebase
cb8010d6 Aug 21, 2026
b04f1d0
fix: bind encrypted V2 trust to destination and alias wire
cb8010d6 Aug 21, 2026
0b2d44d
fix(gui): clear encrypted V2 trust on endpoint changes
cb8010d6 Aug 21, 2026
16861e2
fix: address latest encrypted V2 review findings
cb8010d6 Aug 21, 2026
5048236
docs: clarify encrypted V2 eligibility translations
cb8010d6 Aug 21, 2026
356c79c
docs: remove trailing blank line
cb8010d6 Aug 21, 2026
cd81621
fix: bind encrypted tasks to approved Copilot origin
cb8010d6 Aug 22, 2026
9e55953
fix: enforce origin binding across encrypted routing
cb8010d6 Aug 22, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 22 additions & 10 deletions docs-site/src/content/docs/fr/guides/sub-agent-surface.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,27 +116,39 @@ pendant un temps de recharge, il manque un compte Codex poolé utilisable ou au-
Les sondes de disponibilité sont mises en cache pendant `subagentModelFallbackPollMs` (60 secondes par défaut).

La solution de secours ne rend pas lisibles les tâches chiffrées incompatibles. Lorsque la tâche enfant est chiffrée pour
ChatGPT, la sélection est restreinte aux cibles ChatGPT natives canoniques même si un modèle externe
apparaît plus tôt dans la chaîne.
ChatGPT, la sélection est restreinte aux cibles capables de recevoir ce chiffrage : les cibles ChatGPT natives
canoniques ou un fournisseur Responses avec l'option explicite `allowEncryptedV2AgentTasks: true`, lorsque le wire final
reste `openai-responses`. Une surcharge `modelAdapters` qui résout le modèle vers `openai-chat` reste non admissible.

## Livraison de tâches v2 cryptées

Codex peut envoyer une tâche enfant v2 native vers routé uniquement sous forme `encrypted_content` chiffrée par le backend. Cette
charge utile peut être lue par le backend natif ChatGPT, mais pas par un fournisseur externe. C'est la
Codex peut envoyer une tâche enfant v2 native vers routé uniquement sous forme `encrypted_content` chiffrée par le backend. Le
backend natif ChatGPT peut consommer cette charge utile ; certains relais compatibles peuvent aussi la transmettre à un
backend capable de la consommer. opencodex ne peut pas déduire cette capacité du nom du fournisseur ou de son Base URL. C'est la
limitation connue [#92](https://github.com/lidge-jun/opencodex/issues/92).

opencodex échoue en toute sécurité au lieu de transférer une tâche vide ou illisible :
opencodex échoue en toute sécurité au lieu de transférer une tâche vide ou illisible. Les règles de routage sont les suivantes :

- Une route directe non native renvoie HTTP 400 avec
- Une route directe non native inéligible renvoie HTTP 400 avec
Comment thread
coderabbitai[bot] marked this conversation as resolved.
`error.code = "unreadable_encrypted_agent_task"` et ne fait pas écho au texte chiffré.
- Un combo considère uniquement les cibles ChatGPT natives canoniques pour cette tâche, y compris les tentatives. Si aucun
est disponible, il renvoie la même erreur 400.
- Un combo considère uniquement les cibles ChatGPT natives canoniques et les cibles Responses explicitement approuvées pour
cette tâche lorsque leur wire final reste `openai-responses`, y compris les tentatives. Si aucune n'est disponible, il
renvoie la même erreur 400.
- Une tâche lisible en texte clair conserve la route normale et le comportement de repli.

Les options de récupération consistent à sélectionner un enfant ChatGPT natif, à ajouter une cible ChatGPT native au combo, à utiliser
v1 pour la délégation de fournisseurs hétérogènes, ou renvoyer la tâche en texte brut v2 `agent_message`
contenu lorsque vous contrôlez l’appelant.

Si un endpoint Responses non canonique a été vérifié pour consommer ou relayer ce chiffrage, activez l’option **Passer les tâches
d’agent V2 chiffrées** dans les paramètres de ce fournisseur, ou définissez `allowEncryptedV2AgentTasks: true` dans sa
configuration. Cette option est désactivée par défaut et n'est valide que lorsque le wire final du modèle sélectionné est
`openai-responses` ; une surcharge `modelAdapters` vers `openai-chat` reste donc non admissible. La charge utile opaque est
transmise sans modification : opencodex ne la déchiffre pas, ne la traduit pas et ne la récupère pas, et cette option ne prouve
pas la compatibilité du fournisseur. La cible ChatGPT canonique est toujours admissible sans cette option. Une cible ayant activé
le relais opaque ignore `agentTaskRecovery` pour cette route, car la récupération et le relais opaque sont deux modes de confiance
distincts.

L’option expérimentale `agentTaskRecovery`, désactivée par défaut, peut récupérer cette forme précise de
tâche native envoyée vers une route externe. Elle utilise un transfert Responses brut vers le point de
terminaison ChatGPT `/responses` fixe et la forme d’identification entrante du fournisseur canonique
Expand All @@ -154,8 +166,8 @@ récupéré, la fidélité octet par octet n’est pas garantie. Les appelants g
sont rejetés, et tout échec conserve l’erreur `unreadable_encrypted_agent_task`. Consultez
[Configuration de l'agent : récupération de tâche chiffrée v2](/fr/reference/configuration/agents/#récupération-des-tâches-v2-chiffrées)
pour la limite de confiance complète et la configuration.
Le routage des combinaisons reste inchangé et continue de considérer uniquement les cibles ChatGPT natives
canoniques pour les tâches chiffrées.
Le routage des combinaisons applique les mêmes règles d’admissibilité : il considère les cibles ChatGPT natives canoniques et les
cibles Responses explicitement approuvées pour les tâches chiffrées.

## Changer le mode

Expand Down
4 changes: 4 additions & 0 deletions docs-site/src/content/docs/guides/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@ what powers the [web-search and vision sidecars](/guides/sidecars/).
The ChatGPT passthrough catalog also layers in the bare GPT-5.6 Sol/Terra/Luna slugs
(`gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`) for accounts that can use them.

For encrypted V2 child tasks, canonical ChatGPT forwarding is trusted implicitly. The
destination-bound opt-in, final-wire eligibility, and fail-closed behavior for non-canonical
Responses providers are defined in the [provider configuration reference](/reference/configuration/providers/).

## 2. Account login (OAuth)

Eight provider presets use OAuth login — plus GitHub Copilot via an experimental unofficial
Expand Down
32 changes: 21 additions & 11 deletions docs-site/src/content/docs/guides/sub-agent-surface.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Choose the mode for **new sessions**. Existing sessions keep the surface they st

On **v2**, an optional **Keep ChatGPT on v1** switch (`keepNativeChatGptOnV1`) leaves Sol/Terra
on the v1 surface so they can still spawn Grok or Claude. ChatGPT-native parents encrypt v2
`NEW_TASK` bodies; routed models cannot read them. Routed parents stay on v2, where child tasks
`NEW_TASK` bodies; ordinary routed models cannot read them. Routed parents stay on v2, where child tasks
are plaintext. This is a switch *inside* v2, not a fourth catalog mode.

:::tip[Not sure?]
Expand Down Expand Up @@ -115,27 +115,37 @@ inside a cooldown, missing a usable pooled Codex account, or beyond the configur
Availability probes are cached for `subagentModelFallbackPollMs` (60 seconds by default).

Fallback does not make incompatible encrypted tasks readable. When the child task is encrypted for
ChatGPT, selection is restricted to canonical native ChatGPT targets even if an external model
appears earlier in the chain.
ChatGPT, selection is restricted to targets that can receive that ciphertext: canonical native
ChatGPT or a Responses provider with an explicit `allowEncryptedV2AgentTasks: true` opt-in.
Comment thread
Ingwannu marked this conversation as resolved.

## Encrypted v2 task delivery

Codex may send a v2 native-to-routed child task only as backend-encrypted `encrypted_content`. That
payload can be read by the native ChatGPT backend, but not by an external provider. This is the
known [#92 limitation](https://github.com/lidge-jun/opencodex/issues/92).
Codex may send a v2 native-to-routed child task only as backend-encrypted `encrypted_content`. The
native ChatGPT backend can consume that payload; some compatible relays may also be able to pass it
to a backend that can. OpenCodex cannot infer that capability from a provider name or Base URL. This
is the known [#92 limitation](https://github.com/lidge-jun/opencodex/issues/92).

opencodex fails safely instead of forwarding an empty or unreadable task:

- A direct non-native route returns HTTP 400 with
- An ineligible direct non-native route returns HTTP 400 with
`error.code = "unreadable_encrypted_agent_task"` and does not echo the ciphertext.
- A combo considers only canonical native ChatGPT targets for that task, including retries. If none
is available, it returns the same 400 error.
- A combo considers only canonical native ChatGPT targets and explicitly trusted Responses targets
for that task, including retries. If none is available, it returns the same 400 error.
Comment thread
cb8010d6 marked this conversation as resolved.
- A readable plaintext task keeps the normal route and fallback behavior.

Recovery options are to select a native ChatGPT child, add a native ChatGPT target to the combo, use
v1 for heterogeneous-provider delegation, or resend the task as plaintext v2 `agent_message`
content when you control the caller.

If a non-canonical Responses endpoint has been verified to consume or relay this ciphertext, enable
**Providers → Settings → Pass through encrypted V2 agent tasks** for that provider, or set
`allowEncryptedV2AgentTasks: true` in its provider config. The option is disabled by default and is
valid only when the selected model's final wire is `openai-responses`; a `modelAdapters` override to
`openai-chat` remains ineligible. It passes the opaque task through unchanged; it does not decrypt,
translate, or recover plaintext, and it does not prove provider compatibility. The canonical ChatGPT
forward provider is always eligible and needs no flag. A provider opted into passthrough skips
`agentTaskRecovery` for that route because recovery and opaque forwarding are separate trust modes.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

An experimental, disabled-by-default `agentTaskRecovery` option can recover this specific native-
to-routed shape through a raw Responses passthrough to the fixed ChatGPT `/responses` endpoint using
the incoming credential shape used by the canonical `openai` provider with `authMode: "forward"`.
Expand All @@ -149,8 +159,8 @@ byte-for-byte fidelity is not guaranteed. It rejects generic/API-key proxy calle
`unreadable_encrypted_agent_task` on any failure. See
[Agent configuration: Encrypted v2 task recovery](/reference/configuration/agents/#encrypted-v2-task-recovery)
for the full trust boundary and configuration.
Combo routing remains unchanged and continues to consider only canonical native ChatGPT targets for
encrypted tasks.
Combo routing applies the same eligibility rule and considers canonical native ChatGPT targets plus
Responses targets with the explicit provider opt-in.

## Changing the mode

Expand Down
4 changes: 4 additions & 0 deletions docs-site/src/content/docs/ja/guides/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@ ChatGPT パススルーカタログには GPT-5.6 Sol/Terra/Luna の名前空間
(`gpt-5.6-sol`、`gpt-5.6-terra`、`gpt-5.6-luna`)も含まれます。実際の呼び出し可否はアカウント権限に
依存します。

暗号化された V2 子タスクでは、正規の ChatGPT 転送は暗黙に信頼されます。非正規 Responses
プロバイダーの宛先バインド opt-in、最終 wire の適格性、フェイルクローズ動作については、
[プロバイダー設定リファレンス](/ja/reference/configuration/providers/)を参照してください。

## 2. アカウントログイン(OAuth)

OAuth ログインを使うプロバイダープリセットは 8 つで、これに実験的な非公式デバイスフロー
Expand Down
9 changes: 4 additions & 5 deletions docs-site/src/content/docs/ja/guides/sub-agent-surface.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,18 +72,17 @@ v1 では、opencodex は、`max` または `ultra` の取り組みでアップ

重複するモデル ID は、最初に出現したモデル ID を保持しながら削除されます。選択中、opencodex は、無効になっている、ルーティングできない、無効なプロバイダーによってサポートされている、異常とマークされている、クールダウン中、使用可能なプールされた Codex アカウントがない、または設定されたクォータしきい値を超えている候補をスキップします。可用性プローブは `subagentModelFallbackPollMs` に対してキャッシュされます (デフォルトでは 60 秒)。

フォールバックでは、互換性のない暗号化タスクは読み取り可能になりません。子タスクが ChatGPT 用に暗号化されている場合、外部モデルがチェーンの前の方に表示されている場合でも、選択は正規のネイティブ ChatGPT ターゲットに制限されます
フォールバックでは、互換性のない暗号化タスクは読み取り可能になりません。子タスクが ChatGPT 用に暗号化されている場合、外部モデルがチェーンの前の方に表示されていても、選択は正規のネイティブ ChatGPT ターゲットまたは、解決後の最終 wire adapter が `openai-responses` のままである `allowEncryptedV2AgentTasks: true` を明示した Responses プロバイダーに制限されます

## 暗号化された v2 タスク配信

Codex は、v2 ネイティブからルーティングされた子タスクを、バックエンドで暗号化された `encrypted_content` としてのみ送信できます。そのペイロードは、ネイティブ ChatGPT バックエンドによって読み取ることができますが、外部プロバイダーによっては読み取ることができません。これは既知の [#92限定](https://github.com/lidge-jun/opencodex/issues/92) です。
Codex は、v2 ネイティブからルーティングされた子タスクを、バックエンドで暗号化された `encrypted_content` としてのみ送信できます。そのペイロードは、ネイティブ ChatGPT バックエンドで処理されるか、互換性を確認して明示的に許可された Responses プロバイダーによって不透明なまま処理または中継されます。これは既知の [#92 の制限](https://github.com/lidge-jun/opencodex/issues/92) です。

opencodex は、空のタスクまたは読み取り不可能なタスクを転送するのではなく、安全に失敗します。

- 直接の非ネイティブ ルートは HTTP 400 を返します。
- 対象外の直接非ネイティブ ルートは HTTP 400 を返します。
`error.code = "unreadable_encrypted_agent_task"` であり、暗号文はエコーされません。
- コンボでは、再試行を含む、そのタスクの正規のネイティブ ChatGPT ターゲットのみが考慮されます。何もない場合
が利用可能な場合は、同じ 400 エラーが返されます。
- コンボでは、再試行を含め、そのタスクの正規のネイティブ ChatGPT ターゲットと、最終 wire adapter が `openai-responses` のままである明示的に許可された Responses ターゲットだけが考慮されます。利用可能なターゲットがない場合は、同じ 400 エラーが返されます。
- 読み取り可能なプレーンテキストのタスクは、通常のルートとフォールバック動作を維持します。

回復オプションは、ネイティブ ChatGPT 子の選択、コンボへのネイティブ ChatGPT ターゲットの追加、異種プロバイダーの委任に v1 を使用する、または呼び出し元を制御するときにタスクをプレーンテキスト v2 `agent_message` コンテンツとして再送信することです。
Expand Down
6 changes: 6 additions & 0 deletions docs-site/src/content/docs/ja/reference/adapters.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ HTTP リトライ ループの対象外です。
- `key` provider は検証済みの相対 `responsesPath` を設定できます。adapter は `baseUrl` 末尾の `/` を 1 つ除き、`{trimmedBaseUrl}{responsesPath}` に送信します。Ark Agent Plan では `baseUrl: "https://ark.cn-beijing.volces.com/api/plan/v3"` と `responsesPath: "/responses"` を使います。
- `forward` モードでは安全なヘッダー許可リスト(`FORWARD_HEADERS`)だけを中継します。authorization、ChatGPT account id、OpenAI beta/originator/session ヘッダーが対象です。この ChatGPT ログイン経路は [サイドカー](/ja/guides/sidecars/) にも使われます。

暗号化された V2 子タスクの暗号文はこのアダプター上でも不透明なままです。バイト単位で転送
され、復号・翻訳・復元は行われません。正規の ChatGPT 転送は暗黙に信頼されますが、非正規の
Responses プロバイダーは互換性を確認したうえで `allowEncryptedV2AgentTasks: true` を明示的に
設定する必要があります。オプションはデフォルトで無効で、最終 wire が `openai-responses` の場合
だけ有効です。`openai-chat` への override は対象外です。

## `anthropic`

**対象:** Anthropic **Messages**(`/v1/messages`)。
Expand Down
Loading
Loading