Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
5 changes: 5 additions & 0 deletions docs-site/src/content/docs/fr/guides/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,11 @@ Le préréglage DeepSeek intégré route également `deepseek-v4-flash` par son
et conserve le streaming SSE en amont. Si ce modèle termine tous les éléments de sortie mais omet l'événement
Responses final, opencodex applique une réparation après un délai de grâce de cinq secondes, limitée à ce
modèle ; les flux mal formés ou partiels sont fermés comme incomplets, et non déclarés réussis.
Le modèle DeepSeek de première partie `deepseek-flash` déclare nativement les entrées `text` et `image` ;
les requêtes contenant une image sont donc envoyées directement à DeepSeek par défaut sans passer par le
sidecar de vision. Les déclarations explicites `noVisionModels` ou texte seul restent prioritaires. Les modèles
de première partie `deepseek-chat`, `deepseek-reasoner` et `deepseek-v4-flash` restent desservis par le sidecar
par défaut ; les routes Zen sont inchangées et n'ont pas été sondées dans cette mise à jour.

> **Trois routes de facturation Volcengine :** `volcengine` correspond à l'API Ark facturée à l'usage,
> `volcengine-coding-plan` consomme le quota Coding Plan et `volcengine-agent-plan` le quota Agent Plan.
Expand Down
12 changes: 7 additions & 5 deletions docs-site/src/content/docs/guides/codex-app-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,15 @@ the resulting list; otherwise the native default is used when present, then the
choice. Stored custom configuration is unchanged, and repeated syncs do not add `max` back to a
narrow custom list.

This requires the exact provider, destination, and capability-backed model identity. An arbitrary
gateway such as `YYLJ/gpt-6-astra` does not inherit native capabilities from its name. Its explicit
custom ladder continues to override discovered provider metadata under the normal routed rules.
The same catalog bound applies when the custom model id has pinned native capability metadata,
including an arbitrary gateway such as `YYLJ/gpt-6-astra`. Desktop validates the model id, so
`none` and `minimal` are stripped from that catalog row. Full native identity still requires the
exact provider, destination, and capability-backed model identity; a gateway does not inherit
Responses Lite, multi-agent, or native windows from its name.
Codex's native Astra `ultra` choice is retained: it is a client delegation mode converted to a
supported wire effort, distinct from the [API model's effort list](https://developers.openai.com/api/docs/models/gpt-6-astra).
Catalog normalization does not rewrite existing thread settings or establish support for a
particular installed Desktop version.
Catalog normalization does not rewrite existing thread settings. Request-time native effort
clamps remain canonical-forward only.

When the `codexAccountNamespaces` map is empty, account-qualified picker rows are off. If
`codexAccountPickerEnabled` is omitted with a non-empty map, they are treated as enabled for
Expand Down
5 changes: 5 additions & 0 deletions docs-site/src/content/docs/guides/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,11 @@ The built-in DeepSeek preset also routes `deepseek-v4-flash` over its native Res
keeps upstream SSE streaming enabled. If that model finishes every output item but omits the final
Responses event, opencodex applies a five-second model-scoped grace repair; malformed or partial
streams close as incomplete rather than being reported as successful.
The first-party `deepseek-flash` model advertises native `text` and `image` input, so image requests
are sent directly to DeepSeek by default instead of through the vision sidecar. Explicit
`noVisionModels` or text-only declarations remain authoritative. First-party `deepseek-chat`,
`deepseek-reasoner`, and `deepseek-v4-flash` remain sidecar-backed by default. Zen routes are
unchanged and were not probed in this update.

> **Three Volcengine billing routes:** `volcengine` is the pay-as-you-go Ark API,
> `volcengine-coding-plan` consumes Coding Plan quota, and `volcengine-agent-plan` consumes Agent
Expand Down
4 changes: 4 additions & 0 deletions docs-site/src/content/docs/guides/sidecars.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ allow attachments instead of blocking them before the sidecar runs. When
use the `gpt-5.6-luna` fallback. Startup still migrates an explicitly persisted legacy
`gpt-5.4-mini` value to `gpt-5.6-luna`; that migration applies to a stored value, not to an absent
model field.
The first-party DeepSeek `deepseek-flash` model is native multimodal (`text` and `image`) and does
not use this sidecar by default. Explicit `noVisionModels` or text-only declarations remain
authoritative. First-party `deepseek-chat`, `deepseek-reasoner`, and `deepseek-v4-flash` remain
sidecar-backed by default; Zen routes are unchanged and were not probed in this update.

- Images can come from user, developer, and tool-result messages, including Codex's `view_image`.
- On the OpenAI path (ChatGPT-login passthrough), each image is sent to the configured vision model
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,11 +231,12 @@ provider request is sent. Changing away and back also ends that continuation. St
use the new selection. Selection changes before the first provider send retain normal reselection.

Custom-model `reasoningEfforts` normally override discovered provider metadata. The bounded
exception is an explicit Astra or Daybreak custom row on the canonical `openai` Codex-forward
destination: its advertised list is intersected with that model's pinned native capabilities.
An explicit empty list remains empty with no default; a nonempty incompatible list falls back
to the native default as a single choice. Defaults must belong to the final list. This changes
the catalog projection, not stored configuration or arbitrary gateway models sharing a GPT name.
exception is an explicit custom row whose model id has pinned native Codex capabilities,
including Astra or Daybreak on an arbitrary gateway: its advertised list is intersected with
that model's pinned native capabilities. Full native identity still requires the canonical
`openai` Codex-forward destination. An explicit empty list remains empty with no default; a
nonempty incompatible list falls back to the native default as a single choice. Defaults must
belong to the final list. This changes the catalog projection, not stored configuration.
See [custom native catalog examples](/guides/codex-app-models/).

### Operator-pinned reasoning effort
Expand Down
5 changes: 5 additions & 0 deletions docs-site/src/content/docs/tr/guides/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,11 @@ yönlendirir ve yukarı akış SSE akışını etkin tutar. Bu model tüm çıkt
bitirir ancak son Responses olayını atlarsa opencodex beş saniyelik model
kapsamlı bir yetkisiz kullanım onarımı uygular; hatalı biçimlendirilmiş veya
kısmi akışlar başarılı olarak bildirilmek yerine tamamlanmamış olarak kapanır.
Birinci taraf `deepseek-flash` modeli yerel olarak `text` ve `image` girdilerini bildirir; bu nedenle
görüntü içeren istekler varsayılan olarak vision sidecar üzerinden geçmeden doğrudan DeepSeek'e gönderilir.
Açık `noVisionModels` veya yalnızca metin bildirimleri önceliğini korur. Birinci taraf `deepseek-chat`,
`deepseek-reasoner` ve `deepseek-v4-flash` varsayılan olarak sidecar üzerinden çalışmaya devam eder; Zen
rotaları değişmedi ve bu güncellemede yoklanmadı.

> **Üç Volcengine faturalandırma rotası:** `volcengine` kullandıkça öde Ark API'sidir, `volcengine-coding-plan` Coding Plan kotasını tüketir ve `volcengine-agent-plan` Agent Plan kotasını tüketir. Aynı ürün için verilen anahtarı ve uç noktayı kullanın; sıradan `/api/v3` uç noktası bir Plan aboneliği mevcut olduğunda bile kullandıkça öde ücretlerine neden olabilir. Önayarlar özenle seçilmiş statik model katalogları kullanır çünkü Ark'ın `/models` yanıtı yerleştirme, görsel, video ve 3D kaynaklarını da içerir, Coding ağ geçidi aynı geniş kataloğu döndürür ve Agent Plan ağ geçidinin `/models` kaynağı yoktur. Kullandıkça öde varsayılan olarak `doubao-seed-2-1-pro-260628`'dir; seçilmiş kataloğu güncel DeepSeek ve GLM metin modellerini de içerir. Coding Plan varsayılan olarak `ark-code-latest`, Agent Plan ise varsayılan olarak `deepseek-v4-flash`'dur.

Expand Down
4 changes: 4 additions & 0 deletions docs-site/src/content/docs/zh-cn/guides/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,10 @@ Cline IDE/CLI 中提供,不能通过 API 使用;`minimax/minimax-m2.5` 是
内置 DeepSeek preset 同样会让 `deepseek-v4-flash` 使用原生 Responses 端点,并保留上游 SSE
流式输出。如果该模型已经完成全部输出项却缺少最终 Responses 事件,opencodex 会应用模型级
5 秒宽限修复;不完整或格式异常的流会以 incomplete 结束,不会被误报为成功。
第一方 `deepseek-flash` 模型原生声明支持 `text` 和 `image` 输入,因此图像请求默认会直接发送给
DeepSeek,不经过 vision sidecar。显式的 `noVisionModels` 或纯文本声明仍然优先。第一方
`deepseek-chat`、`deepseek-reasoner` 和 `deepseek-v4-flash` 默认仍使用 sidecar;Zen 路由保持不变,
本次更新未进行探测。

> **三条火山方舟计费线路:**`volcengine` 是按量付费方舟 API,`volcengine-coding-plan`
> 消耗 Coding Plan 额度,`volcengine-agent-plan` 消耗 Agent Plan 额度。密钥与端点需要属于
Expand Down
4 changes: 4 additions & 0 deletions docs-site/src/content/docs/zh-tw/guides/providers.md
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,10 @@ provider,例如 **Xiaomi MiMo**,使用 `anthropic` adapter(`x-api-key`)
原生 Responses endpoint,並保持上游 SSE streaming。若該模型完成所有 output item 卻省略最後的
Responses event,opencodex 會套用 5 秒、model-scoped 的 grace repair;malformed 或 partial stream 會以
incomplete 關閉,不會被誤報為成功。
第一方 `deepseek-flash` 模型原生宣告支援 `text` 與 `image` 輸入,因此圖片請求預設會直接送往
DeepSeek,不經過 vision sidecar。明確的 `noVisionModels` 或純文字宣告仍然優先。第一方
`deepseek-chat`、`deepseek-reasoner` 與 `deepseek-v4-flash` 預設仍使用 sidecar;Zen 路由維持不變,
本次更新未進行探測。

> **三條 Volcengine 計費路徑:** `volcengine` 是 pay-as-you-go Ark API,
> `volcengine-coding-plan` 消耗 Coding Plan quota,`volcengine-agent-plan` 消耗 Agent Plan quota。請使用
Expand Down
18 changes: 13 additions & 5 deletions src/codex/catalog/provider-fetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2321,7 +2321,7 @@ async function gatherRoutedModelsWithAuth(
return models;
}

/** Bound a proven Codex-forward custom row without changing its stored configuration. */
/** Bound a custom row whose model id has pinned native Codex metadata, without changing stored configuration. */
function boundCustomNativeReasoning(
model: CatalogModel,
allowed: readonly string[],
Expand Down Expand Up @@ -2625,8 +2625,8 @@ async function gatherRoutedModelsUncached(
: {}),
// Explicit custom-row ladder wins over the inherited provider row below: the merge only
// gap-fills, so a stored `[]` (explicit "no reasoning") or a declared ladder is kept
// instead of being replaced by that row's metadata. Only proven native aliases are
// bounded against their own capability source after the merge.
// instead of being replaced by that row's metadata. Capability-backed native model ids
// are bounded against their own pinned ladder after the merge, including gateways.
...(Array.isArray(cm.reasoningEfforts) ? { reasoningEfforts: [...cm.reasoningEfforts] } : {}),
...(cm.defaultReasoningEffort ? { defaultReasoningEffort: cm.defaultReasoningEffort } : {}),
...(typeof supportsServiceTier === "boolean" ? { supportsServiceTier } : {}),
Expand Down Expand Up @@ -2679,8 +2679,16 @@ async function gatherRoutedModelsUncached(
...(base.codexToolMode === undefined && replaced.codexToolMode !== undefined ? { codexToolMode: replaced.codexToolMode } : {}),
...(base.capabilities === undefined && replaced.capabilities !== undefined ? { capabilities: replaced.capabilities } : {}),
} : base;
const reasoningBounded = codexForwardNativeCapabilityAlias
? boundCustomNativeReasoning(merged, nativeReasoningEfforts(cm.modelId), nativeAliasDefaultEffort)
// Catalog-advertised efforts are bounded whenever the model id is a pinned native
// slug. Desktop validates that id, so a gateway such as YYLJ/gpt-6-astra still cannot
// advertise none/minimal. Full native identity stays behind the alias predicate.
const nativeEffortSource = hasNativeOpenAiCapabilityMetadata(cm.modelId);
const reasoningBounded = nativeEffortSource
? boundCustomNativeReasoning(
merged,
nativeReasoningEfforts(cm.modelId),
nativeAliasDefaultEffort ?? nativeDefaultReasoningEffort(cm.modelId),
)
: merged;
// Vision-sidecar coverage only: when the enriched provider's shared predicate matches
// noVisionModels or text-without-image modelInputModalities, advertise image input so the
Expand Down
15 changes: 12 additions & 3 deletions src/codex/catalog/sync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ import { codexAccountLogLabel, fallbackCodexAccountLogLabel } from "../account-l

import { CODEX_CUSTOM_MODEL_CATALOG_KIND, CODEX_PROVIDER_MODEL_CATALOG_KIND, activeCodexModelsCachePath, applyCatalogMetadata, applyMultiAgentMode, applyNativeOpenAiContextOverride, applyRoutedCodexToolMode, catalogBackupPathFor, catalogHasRoutedEntries, catalogModelSlug, ensureStrictCatalogFields, findNativeTemplate, findSupportedNativeTemplate, isDefaultCatalogPath, isRoutedModelCompatibilityExcluded, legacyCatalogBackupPath, normalizeRoutedCatalogEntry, normalizeServiceTiers, readCatalog, readCatalogBackup, readCodexCatalogPath, readCodexCatalogPathForHome, readConfiguredAutoReviewModel, readNativeBaseline } from "./parsing";
import type { CatalogModel, MultiAgentMode, RawCatalog, RawEntry } from "./parsing";
import { accountBoundNativeOpenAiSlugs, accountBoundNativeOpenAiSlugsBySelector, applyNativeVisibility, CODEX_NATIVE_ALIAS_CATALOG_KIND, desktopAllowlistSuppressedNativeSlugs, disabledNativeSlugs, isNativeAliasCatalogEntry, isUnsupportedOpenAiNativeSlug, NATIVE_OPENAI_MODELS, RETIRED_NATIVE_OPENAI_MODELS, nativeContextLimits, observedAccountBoundNativeEntries, shouldIncludeAccountBoundNativeOpenAi, shouldIncludeNativeOpenAi, shouldUpgradeToUpstreamEntry, SUPPORTED_NATIVE_OPENAI_SLUGS, upstreamNativeEntry, type NativeContextLimitsInput } from "./metadata";
import { accountBoundNativeOpenAiSlugs, accountBoundNativeOpenAiSlugsBySelector, applyNativeVisibility, CODEX_NATIVE_ALIAS_CATALOG_KIND, desktopAllowlistSuppressedNativeSlugs, disabledNativeSlugs, hasNativeOpenAiCapabilityMetadata, isNativeAliasCatalogEntry, isUnsupportedOpenAiNativeSlug, NATIVE_OPENAI_MODELS, RETIRED_NATIVE_OPENAI_MODELS, nativeContextLimits, observedAccountBoundNativeEntries, shouldIncludeAccountBoundNativeOpenAi, shouldIncludeNativeOpenAi, shouldUpgradeToUpstreamEntry, SUPPORTED_NATIVE_OPENAI_SLUGS, upstreamNativeEntry, type NativeContextLimitsInput } from "./metadata";
import {
bundledCatalogCacheState,
loadBundledCodexCatalog,
Expand Down Expand Up @@ -316,6 +316,13 @@ function routedDisplayName(slug: string, model?: CatalogModel, config?: Pick<Ocx
return slug;
}

function preservePinnedNativeCustomReasoning(model?: CatalogModel): boolean {
return model !== undefined
&& model.catalogKind === CODEX_CUSTOM_MODEL_CATALOG_KIND
&& hasNativeOpenAiCapabilityMetadata(model.id)
&& Array.isArray(model.reasoningEfforts);
}

/**
* Cria uma entrada nativa ou roteada a partir do snapshot upstream, de um clone
* do template ou de campos mínimos. Aplica os metadados e limites pertinentes
Expand Down Expand Up @@ -380,7 +387,9 @@ export function deriveEntry(
e,
model?.reasoningEfforts,
model?.defaultReasoningEffort,
preserveExactReasoning || codexForwardNativeCapabilityAlias !== null,
preserveExactReasoning
|| codexForwardNativeCapabilityAlias !== null
|| preservePinnedNativeCustomReasoning(model),
);
// This exact provider/model pair is the ChatGPT/Codex forward surface. Keep the pinned
// native tool/search/responses-lite contract while preserving the routed slug and wire id.
Expand Down Expand Up @@ -429,7 +438,7 @@ export function deriveEntry(
};
if (isRouted) {
applyRoutedCodexToolMode(entry, model?.codexToolMode);
applyReasoningLevels(entry, model?.reasoningEfforts, model?.defaultReasoningEffort, preserveExactReasoning);
applyReasoningLevels(entry, model?.reasoningEfforts, model?.defaultReasoningEffort, preserveExactReasoning || preservePinnedNativeCustomReasoning(model));
}
else {
applyReasoningLevels(entry, isGpt56NativeSlug(slug) ? undefined : ["low", "medium", "high", "xhigh"]);
Expand Down
Loading
Loading