From cd077d34f4b944766449e823c85507f70c2d89ae Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 07:24:07 +0200 Subject: [PATCH 01/12] fix(clinepass): preserve full reasoning effort ladder Live probing shows every static ClinePass model accepts low, medium, high, xhigh, and max while rejecting invalid reasoning efforts. Preserve caller tiers and leave backend-specific normalization to ClinePass. --- src/providers/registry.ts | 10 +- tests/cline-pass-provider.test.ts | 9 +- tests/cline-pass-reasoning-efforts.test.ts | 108 +++++++++++++++++++++ 3 files changed, 118 insertions(+), 9 deletions(-) create mode 100644 tests/cline-pass-reasoning-efforts.test.ts diff --git a/src/providers/registry.ts b/src/providers/registry.ts index 6de9b84b56..83beadd941 100644 --- a/src/providers/registry.ts +++ b/src/providers/registry.ts @@ -1300,10 +1300,10 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ modelContextWindows: CLINE_PASS_MODEL_CONTEXT_WINDOWS, modelInputModalities: CLINE_PASS_MODEL_INPUT_MODALITIES, noVisionModels: CLINE_PASS_TEXT_ONLY_MODELS, - // Only low and the `reasoning: { enabled, effort }` request shape have been accepted by a live - // ClinePass request. Neither wire detail is currently documented, so clamp higher Codex - // requests to the verified tier until the gateway documents or is live-probed more broadly. - reasoningEfforts: ["low"], + // Live-probed 2026-08-13 across every static ClinePass model: the gateway accepts and + // validates low/medium/high/xhigh/max, and rejects an invalid sentinel. Preserve the + // caller's requested tier and let ClinePass own any backend-specific normalization. + reasoningEfforts: ["low", "medium", "high", "xhigh", "max"], reasoningWireFormat: "gateway-object", preserveCustomDestination: true, note: "ClinePass subscription API. Uses a Cline API key and the full cline-pass/ upstream slug; quota is shared across the account's rolling 5-hour, weekly, and monthly limits.", @@ -1789,7 +1789,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [ liveModels: true, preserveCustomDestination: true, // /v1/models is documented as callable authenticated or unauthenticated, so a 2xx catalog - // response cannot prove the supplied Bearer key is valid. + // response cannot prove that the supplied Bearer key is valid. apiKeyValidation: "unknown", // Featherless documents tool calling, but not a provider-wide parallel tool-call contract. parallelToolCalls: false, diff --git a/tests/cline-pass-provider.test.ts b/tests/cline-pass-provider.test.ts index 11d88ef41e..c90896154a 100644 --- a/tests/cline-pass-provider.test.ts +++ b/tests/cline-pass-provider.test.ts @@ -64,7 +64,8 @@ describe("ClinePass provider", () => { expect(entry?.models).toEqual(OFFICIAL_CLINE_PASS_MODELS); expect(entry?.models).toContain(entry?.defaultModel); expect(entry?.liveModels).toBeUndefined(); - expect(entry?.reasoningEfforts).toEqual(["low"]); + expect(entry?.reasoningEfforts).toEqual(["low", "medium", "high", "xhigh", "max"]); + expect(entry?.modelReasoningEfforts).toBeUndefined(); expect(entry?.modelMaxInputTokens).toBeUndefined(); expect(entry?.noVisionModels).toEqual([ "cline-pass/glm-5.2", @@ -102,12 +103,12 @@ describe("ClinePass provider", () => { expect(route.modelId).toBe("cline-pass/kimi-k3"); expect(route.provider).toMatchObject({ reasoningWireFormat: "gateway-object" }); expect(body.model).toBe("cline-pass/kimi-k3"); - expect(body.reasoning).toEqual({ enabled: true, effort: "low" }); + expect(body.reasoning).toEqual({ enabled: true, effort: "high" }); expect(body).not.toHaveProperty("reasoning_effort"); expect(request.reasoningLog).toEqual({ - effectiveEffort: "low", + effectiveEffort: "high", wireField: "reasoning.effort", - wireValue: "low", + wireValue: "high", }); }); diff --git a/tests/cline-pass-reasoning-efforts.test.ts b/tests/cline-pass-reasoning-efforts.test.ts new file mode 100644 index 0000000000..a71c2c74f2 --- /dev/null +++ b/tests/cline-pass-reasoning-efforts.test.ts @@ -0,0 +1,108 @@ +import { describe, expect, test } from "bun:test"; +import { createOpenAIChatAdapter } from "../src/adapters/openai-chat"; +import { PROVIDER_REGISTRY } from "../src/providers/registry"; +import { routeModel } from "../src/router"; +import type { OcxConfig, OcxParsedRequest } from "../src/types"; + +const CLINE_PASS_MODELS = [ + "cline-pass/glm-5.2", + "cline-pass/kimi-k3", + "cline-pass/kimi-k2.7-code", + "cline-pass/kimi-k2.6", + "cline-pass/deepseek-v4-pro", + "cline-pass/deepseek-v4-flash", + "cline-pass/mimo-v2.5", + "cline-pass/mimo-v2.5-pro", + "cline-pass/minimax-m3", + "cline-pass/qwen3.7-max", + "cline-pass/qwen3.7-plus", +] as const; + +const CLINE_PASS_REASONING_EFFORTS = ["low", "medium", "high", "xhigh", "max"] as const; + +// Live probe 2026-08-13 against https://api.cline.bot/api/v1/chat/completions: +// every static ClinePass model accepted every effort above, while an invalid sentinel was +// rejected with the gateway's accepted enum (none|minimal|low|medium|high|xhigh|max). +// This pins ClinePass's INPUT contract only. It deliberately does not claim that every backend +// implements five distinct native compute modes; backend-specific normalization remains ClinePass's job. +function registryEntry() { + const entry = PROVIDER_REGISTRY.find(provider => provider.id === "cline-pass"); + if (!entry) throw new Error("missing ClinePass registry entry"); + return entry; +} + +function parsed(modelId: string, reasoning: string): OcxParsedRequest { + return { + modelId, + context: { messages: [{ role: "user", content: "hello", timestamp: 0 }] }, + stream: false, + options: { reasoning }, + }; +} + +const config: OcxConfig = { + port: 10100, + defaultProvider: "cline-pass", + providers: { + "cline-pass": { + adapter: "openai-chat", + baseUrl: "https://api.cline.bot/api/v1", + apiKey: "cline-test-key", + authMode: "key", + }, + }, +}; + +describe("ClinePass reasoning effort capabilities", () => { + test("registry exposes the full live-probed gateway input ladder provider-wide", () => { + const entry = registryEntry(); + + expect(entry.reasoningEfforts).toEqual([...CLINE_PASS_REASONING_EFFORTS]); + expect(entry.modelReasoningEfforts).toBeUndefined(); + }); + + test("preserves every live-probed effort for every static ClinePass model", () => { + for (const model of CLINE_PASS_MODELS) { + for (const effort of CLINE_PASS_REASONING_EFFORTS) { + const route = routeModel(config, `cline-pass/${model}`); + const request = createOpenAIChatAdapter(route.provider).buildRequest(parsed(route.modelId, effort)); + const body = JSON.parse(request.body) as Record; + + expect(route.modelId).toBe(model); + expect(body.reasoning).toEqual({ enabled: true, effort }); + expect(body).not.toHaveProperty("reasoning_effort"); + expect(request.reasoningLog).toEqual({ + effectiveEffort: effort, + wireField: "reasoning.effort", + wireValue: effort, + }); + } + } + }); + + test("DeepSeek V4 Flash preserves max instead of clamping it", () => { + const route = routeModel(config, "cline-pass/cline-pass/deepseek-v4-flash"); + const request = createOpenAIChatAdapter(route.provider).buildRequest(parsed(route.modelId, "max")); + const body = JSON.parse(request.body) as Record; + + expect(body.reasoning).toEqual({ enabled: true, effort: "max" }); + expect(request.reasoningLog).toEqual({ + effectiveEffort: "max", + wireField: "reasoning.effort", + wireValue: "max", + }); + }); + + test("Codex ultra still crosses the provider boundary as max", () => { + const route = routeModel(config, "cline-pass/cline-pass/glm-5.2"); + const request = createOpenAIChatAdapter(route.provider).buildRequest(parsed(route.modelId, "ultra")); + const body = JSON.parse(request.body) as Record; + + expect(body.reasoning).toEqual({ enabled: true, effort: "max" }); + expect(request.reasoningLog).toEqual({ + effectiveEffort: "max", + wireField: "reasoning.effort", + wireValue: "max", + }); + }); +}); From 1ce384fa5c02d5927377c017e5d26c1e1c458804 Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 07:34:49 +0200 Subject: [PATCH 02/12] test(clinepass): cover legacy low-only preset --- tests/cline-pass-reasoning-efforts.test.ts | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/cline-pass-reasoning-efforts.test.ts b/tests/cline-pass-reasoning-efforts.test.ts index a71c2c74f2..88f498d748 100644 --- a/tests/cline-pass-reasoning-efforts.test.ts +++ b/tests/cline-pass-reasoning-efforts.test.ts @@ -105,4 +105,27 @@ describe("ClinePass reasoning effort capabilities", () => { wireValue: "max", }); }); + + test("canonical ClinePass repairs the legacy persisted low-only preset", () => { + const staleConfig: OcxConfig = { + ...config, + providers: { + "cline-pass": { + ...config.providers!["cline-pass"], + reasoningEfforts: ["low"], + }, + }, + }; + const route = routeModel(staleConfig, "cline-pass/cline-pass/deepseek-v4-flash"); + const request = createOpenAIChatAdapter(route.provider).buildRequest(parsed(route.modelId, "max")); + const body = JSON.parse(request.body) as Record; + + expect(route.provider.reasoningEfforts).toEqual([...CLINE_PASS_REASONING_EFFORTS]); + expect(body.reasoning).toEqual({ enabled: true, effort: "max" }); + expect(request.reasoningLog).toEqual({ + effectiveEffort: "max", + wireField: "reasoning.effort", + wireValue: "max", + }); + }); }); From 5862346a0617e764d11145f03382755a1230c776 Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 07:42:52 +0200 Subject: [PATCH 03/12] fix(clinepass): repair legacy low-only preset --- src/router.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/router.ts b/src/router.ts index b01fee0431..9477addb30 100644 --- a/src/router.ts +++ b/src/router.ts @@ -267,6 +267,10 @@ export function routedProviderConfig(providerName: string, provider: OcxProvider const modelReasoningEffortMap = mergeNestedRecord(registryEntry.modelReasoningEffortMap, provider.modelReasoningEffortMap); const modelReasoningEfforts = mergeStringArrayRecord(registryEntry.modelReasoningEfforts, provider.modelReasoningEfforts); const modelDefaultReasoningEfforts = mergeRecordFill(registryEntry.modelDefaultReasoningEfforts, provider.modelDefaultReasoningEfforts); + const repairLegacyClinePassReasoningEfforts = providerName === "cline-pass" + && provider.reasoningWireFormat === "gateway-object" + && provider.reasoningEfforts?.length === 1 + && provider.reasoningEfforts[0] === "low"; const modelContextWindows = providerName === OPENAI_API_PROVIDER_ID ? mergePositiveNumberCaps(registryEntry.modelContextWindows, provider.modelContextWindows) : mergeRecordFill(registryEntry.modelContextWindows, provider.modelContextWindows); @@ -342,7 +346,10 @@ export function routedProviderConfig(providerName: string, provider: OcxProvider ...(provider.project === undefined && registryEntry.project !== undefined ? { project: registryEntry.project } : {}), ...(provider.location === undefined && registryEntry.location !== undefined ? { location: registryEntry.location } : {}), ...(provider.contextWindow === undefined && registryEntry.contextWindow !== undefined ? { contextWindow: registryEntry.contextWindow } : {}), - ...(provider.reasoningEfforts === undefined && registryEntry.reasoningEfforts !== undefined ? { reasoningEfforts: registryEntry.reasoningEfforts } : {}), + ...((provider.reasoningEfforts === undefined || repairLegacyClinePassReasoningEfforts) + && registryEntry.reasoningEfforts !== undefined + ? { reasoningEfforts: [...registryEntry.reasoningEfforts] } + : {}), ...(provider.escapeBuiltinToolNames === undefined && registryEntry.escapeBuiltinToolNames !== undefined ? { escapeBuiltinToolNames: registryEntry.escapeBuiltinToolNames } : {}), ...(provider.keyOptional === undefined && registryEntry.keyOptional !== undefined ? { keyOptional: registryEntry.keyOptional } : {}), ...(provider.modelSuffixBracketStrip === undefined && registryEntry.modelSuffixBracketStrip !== undefined ? { modelSuffixBracketStrip: registryEntry.modelSuffixBracketStrip } : {}), @@ -688,4 +695,4 @@ function routeByKnownModelPattern(config: OcxConfig, modelId: string): RouteResu } } return undefined; -} +} \ No newline at end of file From 0515688e2089cc82958d4b6f366c7e0060ccc28a Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 07:46:10 +0200 Subject: [PATCH 04/12] chore(clinepass): document legacy preset repair --- src/router.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/router.ts b/src/router.ts index 9477addb30..12edcd532f 100644 --- a/src/router.ts +++ b/src/router.ts @@ -267,6 +267,10 @@ export function routedProviderConfig(providerName: string, provider: OcxProvider const modelReasoningEffortMap = mergeNestedRecord(registryEntry.modelReasoningEffortMap, provider.modelReasoningEffortMap); const modelReasoningEfforts = mergeStringArrayRecord(registryEntry.modelReasoningEfforts, provider.modelReasoningEfforts); const modelDefaultReasoningEfforts = mergeRecordFill(registryEntry.modelDefaultReasoningEfforts, provider.modelDefaultReasoningEfforts); + // Key-login used to persist this exact low-only ClinePass capability seed. Once the gateway's + // wider input ladder was live-verified, leaving that generated row untouched would keep old + // installs clamped forever. This branch is reached only after canonical transport matching, so + // same-named custom destinations and every other explicit ladder still retain user precedence. const repairLegacyClinePassReasoningEfforts = providerName === "cline-pass" && provider.reasoningWireFormat === "gateway-object" && provider.reasoningEfforts?.length === 1 @@ -695,4 +699,4 @@ function routeByKnownModelPattern(config: OcxConfig, modelId: string): RouteResu } } return undefined; -} \ No newline at end of file +} From cb05c8ffa83a100f65a7c635e0a6899c6cd00e5d Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 07:48:18 +0200 Subject: [PATCH 05/12] docs(clinepass): document verified effort ladder --- docs-site/src/content/docs/guides/providers.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs-site/src/content/docs/guides/providers.md b/docs-site/src/content/docs/guides/providers.md index 835280d9f1..46348e5371 100644 --- a/docs-site/src/content/docs/guides/providers.md +++ b/docs-site/src/content/docs/guides/providers.md @@ -216,7 +216,6 @@ also needs the local CLI binary: opencodex first uses `PATH`, then falls back to After a successful import, opencodex persists the imported credential to `~/.opencodex/auth.json`. - Keep these variables and the selected database private. Do not attach database files or raw login diagnostics to bug reports. @@ -243,8 +242,9 @@ and [Chat Completions endpoint](https://docs.cline.bot/api/chat-completions), op [Cline's terms](https://cline.bot/tos). A routed id such as `cline-pass/cline-pass/kimi-k3` is intentional: the first segment selects the opencodex provider, while `cline-pass/kimi-k3` is the full model slug sent upstream. ClinePass quota is shared by the account across rolling 5-hour, -weekly, and monthly limits. opencodex currently advertises the live-verified `low` reasoning tier; -higher requested tiers clamp to `low` until the gateway publishes or verifies a wider ladder. +weekly, and monthly limits. A 2026-08-13 live probe verified that every static ClinePass model +accepts `low`, `medium`, `high`, `xhigh`, and `max` at the gateway input boundary. opencodex +preserves those requested tiers; any backend-specific normalization remains ClinePass's responsibility. **Cline** is the same API key and endpoint on pay-as-you-go usage billing across 100+ models (OpenRouter-style ids like `anthropic/claude-sonnet-4-6`). Cline's promotional free models are only From 306c2f8fa0494848e9a7a6705e37f9b6ea560fc4 Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 07:51:59 +0200 Subject: [PATCH 06/12] test(clinepass): pin legacy preset repair boundary --- tests/cline-pass-reasoning-efforts.test.ts | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tests/cline-pass-reasoning-efforts.test.ts b/tests/cline-pass-reasoning-efforts.test.ts index 88f498d748..5b56b7b744 100644 --- a/tests/cline-pass-reasoning-efforts.test.ts +++ b/tests/cline-pass-reasoning-efforts.test.ts @@ -106,13 +106,14 @@ describe("ClinePass reasoning effort capabilities", () => { }); }); - test("canonical ClinePass repairs the legacy persisted low-only preset", () => { + test("canonical ClinePass repairs the historical generated low-only preset", () => { const staleConfig: OcxConfig = { ...config, providers: { "cline-pass": { ...config.providers!["cline-pass"], reasoningEfforts: ["low"], + reasoningWireFormat: "gateway-object", }, }, }; @@ -128,4 +129,24 @@ describe("ClinePass reasoning effort capabilities", () => { wireValue: "max", }); }); + + test("does not repair a low-only same-name provider on a custom destination", () => { + const customConfig: OcxConfig = { + ...config, + providers: { + "cline-pass": { + ...config.providers!["cline-pass"], + baseUrl: "https://example.com/v1", + reasoningEfforts: ["low"], + reasoningWireFormat: "gateway-object", + }, + }, + }; + const route = routeModel(customConfig, "cline-pass/cline-pass/deepseek-v4-flash"); + const request = createOpenAIChatAdapter(route.provider).buildRequest(parsed(route.modelId, "max")); + const body = JSON.parse(request.body) as Record; + + expect(route.provider.reasoningEfforts).toEqual(["low"]); + expect(body.reasoning).toEqual({ enabled: true, effort: "low" }); + }); }); From 4f0219ff8b464e0a4479670a3ba09e0b19dec404 Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 08:05:16 +0200 Subject: [PATCH 07/12] docs(clinepass): sync localized reasoning guidance --- docs-site/src/content/docs/ja/guides/providers.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs-site/src/content/docs/ja/guides/providers.md b/docs-site/src/content/docs/ja/guides/providers.md index 988bbfab72..63f67acb2f 100644 --- a/docs-site/src/content/docs/ja/guides/providers.md +++ b/docs-site/src/content/docs/ja/guides/providers.md @@ -170,8 +170,8 @@ opencodex には組み込みプリセットが 79 個含まれています。キ [Cline の利用規約](https://cline.bot/tos)に記載された Cline Bot Inc. です。`cline-pass/cline-pass/kimi-k3` のようなルーティング ID は 意図した形式です。先頭は opencodex のプロバイダー、残りの `cline-pass/kimi-k3` は upstream に送信する 完全なモデル slug です。使用量はアカウントのローリング 5 時間、週次、月次の各上限で共有されます。 -現在 opencodex が公開する reasoning tier は実機検証済みの `low` のみで、より高い要求は公式範囲が -公開または検証されるまで `low` にクランプされます。 +2026-08-13 の実機検証で、すべての静的 ClinePass モデルが gateway input で `low`、`medium`、`high`、`xhigh`、`max` を受け付けることを確認しました。 +opencodex は要求された tier をそのまま保持し、バックエンド固有の正規化は ClinePass 側に委ねます。 **Cline** は同じ API キー・エンドポイントを従量課金で使い、100 以上のモデルにアクセスできます (OpenRouter 形式の ID、例: `anthropic/claude-sonnet-4-6`)。Cline の期間限定無料モデルは @@ -430,4 +430,4 @@ opencodex をローカルの OpenAI 互換サーバーに向けてください プロバイダーが Chat Completions を使うなら `openai-chat` アダプターが処理します — ダッシュボードで **Custom** を選ぶか `ocx init` で `custom` を選んだ後ベース URL を入力してください。すべてのプロバイダーフィールド (`headers`、`noReasoningModels`、`noVisionModels`、`models`、…)は -[設定リファレンス](/ja/reference/configuration/)を参照してください。 +[設定リファレンス](/ja/reference/configuration/)を参照してください。 \ No newline at end of file From 4e030cddd9adcdeaf465095698c2ca435af8ec8e Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 08:10:24 +0200 Subject: [PATCH 08/12] docs(clinepass): sync Korean reasoning guidance --- docs-site/src/content/docs/ko/guides/providers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-site/src/content/docs/ko/guides/providers.md b/docs-site/src/content/docs/ko/guides/providers.md index 4d0e033d56..9be3bdf6f0 100644 --- a/docs-site/src/content/docs/ko/guides/providers.md +++ b/docs-site/src/content/docs/ko/guides/providers.md @@ -170,8 +170,8 @@ opencodex에는 빌트인 프리셋이 79개 들어 있습니다. 키 방식 67 같은 라우팅 ID는 정상입니다. 앞의 `cline-pass`는 opencodex 프로바이더이고, 뒤의 `cline-pass/kimi-k3`는 upstream에 보내는 전체 모델 slug입니다. ClinePass 사용량은 계정의 5시간 롤링·주간·월간 한도를 함께 사용합니다. -현재 opencodex는 실측된 `low` reasoning 단계만 광고하며, 더 높은 요청은 공식 지원 범위가 -게시되거나 검증될 때까지 `low`로 제한합니다. +2026-08-13 실측에서 모든 정적 ClinePass 모델이 게이트웨이 입력에서 `low`, `medium`, `high`, `xhigh`, `max`를 수락하는 것을 확인했습니다. +opencodex는 요청한 단계를 그대로 보존하며, 백엔드별 정규화는 ClinePass가 담당합니다. **Cline**은 동일한 API 키·엔드포인트를 종량제로 사용하며 100개 이상의 모델에 접근합니다 (OpenRouter 형식 ID, 예: `anthropic/claude-sonnet-4-6`). Cline의 프로모션 무료 모델은 From 9740390156f3b8a7652c1368e393ce566e913f79 Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 08:12:34 +0200 Subject: [PATCH 09/12] docs(clinepass): sync Russian reasoning guidance --- docs-site/src/content/docs/ru/guides/providers.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs-site/src/content/docs/ru/guides/providers.md b/docs-site/src/content/docs/ru/guides/providers.md index e2cb648c37..966d75dcb5 100644 --- a/docs-site/src/content/docs/ru/guides/providers.md +++ b/docs-site/src/content/docs/ru/guides/providers.md @@ -181,8 +181,9 @@ opencodex поставляется с 79 встроенными пресетам [условиях Cline](https://cline.bot/tos). Маршрут вида `cline-pass/cline-pass/kimi-k3` намеренный: первая часть выбирает провайдера opencodex, а полный slug `cline-pass/kimi-k3` отправляется upstream. Использование учитывается в общих для аккаунта скользящем 5-часовом, -недельном и месячном лимитах. Сейчас opencodex публикует только проверенный на живом API reasoning tier -`low`; более высокие запросы ограничиваются до `low`, пока шлюз не опубликует или не подтвердит более широкий диапазон. +недельном и месячном лимитах. Проверка живого API 2026-08-13 подтвердила, что все статические модели ClinePass +принимают на входе шлюза `low`, `medium`, `high`, `xhigh` и `max`. opencodex сохраняет запрошенный tier без изменения; +нормализация для конкретного backend остаётся ответственностью ClinePass. **Cline** использует тот же ключ и эндпоинт с оплатой по мере использования и доступом к 100+ моделям (ID в формате OpenRouter, например `anthropic/claude-sonnet-4-6`). Промо-бесплатные модели Cline From d51f11ab0d6193293e480af5c466416be1696d0d Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 08:14:36 +0200 Subject: [PATCH 10/12] docs(clinepass): sync Chinese reasoning guidance --- docs-site/src/content/docs/zh-cn/guides/providers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs-site/src/content/docs/zh-cn/guides/providers.md b/docs-site/src/content/docs/zh-cn/guides/providers.md index 9537da4b4f..2d57170b93 100644 --- a/docs-site/src/content/docs/zh-cn/guides/providers.md +++ b/docs-site/src/content/docs/zh-cn/guides/providers.md @@ -158,8 +158,8 @@ ChatGPT 转发预设。仪表盘的 **Add provider** 选择器会打开密钥提 [Cline 条款](https://cline.bot/tos)所列的 Cline Bot Inc.。 `cline-pass/cline-pass/kimi-k3` 这样的路由 ID 是预期格式:第一段选择 opencodex 提供商, 其余的 `cline-pass/kimi-k3` 是发送到上游的完整模型 slug。用量由账户的滚动 5 小时、每周和 -每月限额共同管理。当前 opencodex 仅公开经过实测的 `low` reasoning 档位;在网关公布或验证更宽 -档位之前,更高请求会被限制为 `low`。 +每月限额共同管理。2026-08-13 的实测确认,所有静态 ClinePass 模型在网关输入端都接受 +`low`、`medium`、`high`、`xhigh` 和 `max`。opencodex 会保留请求的档位;后端特定的规范化由 ClinePass 负责。 **Cline** 使用相同的 API 密钥和端点,按用量计费,可访问 100 多个模型 (OpenRouter 风格 ID,如 `anthropic/claude-sonnet-4-6`)。Cline 的促销免费模型仅在 From aec12c6538aa84ffd86fa33ff0ae90238a7596af Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 08:23:24 +0200 Subject: [PATCH 11/12] docs(ja): restore trailing newline --- docs-site/src/content/docs/ja/guides/providers.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs-site/src/content/docs/ja/guides/providers.md b/docs-site/src/content/docs/ja/guides/providers.md index 63f67acb2f..4c0ea71f07 100644 --- a/docs-site/src/content/docs/ja/guides/providers.md +++ b/docs-site/src/content/docs/ja/guides/providers.md @@ -309,7 +309,7 @@ raw 100 行が上限で、数万件の catalog 全体を download / cache しま **Novita の discovery:** キー方式のプリセットは `openai-chat` adapter を使用し、Bearer key は Novita の固定 OpenAI 互換 host にだけ送信します。公開 model list から `model_type: chat` と `chat/completions` endpoint の両方を報告する row だけを残し、discovery を 512 KiB と raw 256 行に -制限します。catalog は公開されているため、login は list 成功を key の証明にせず「検証不能」と報告します。 +制限します。catalog は公開されているため、login は list 成功を key の証拠にせず「検証不能」と報告します。 model ごとに capability が異なるため、provider 全体の parallel tool call と OpenAI `reasoning_effort` は宣伝しません。キーは [Novita key manager](https://novita.ai/settings/key-management) で作成します。 @@ -430,4 +430,5 @@ opencodex をローカルの OpenAI 互換サーバーに向けてください プロバイダーが Chat Completions を使うなら `openai-chat` アダプターが処理します — ダッシュボードで **Custom** を選ぶか `ocx init` で `custom` を選んだ後ベース URL を入力してください。すべてのプロバイダーフィールド (`headers`、`noReasoningModels`、`noVisionModels`、`models`、…)は -[設定リファレンス](/ja/reference/configuration/)を参照してください。 \ No newline at end of file +[設定リファレンス](/ja/reference/configuration/)を参照してください。 + From afe4037c48079698557e2980390f42b6596c91df Mon Sep 17 00:00:00 2001 From: Wibias <37517432+Wibias@users.noreply.github.com> Date: Thu, 13 Aug 2026 08:25:06 +0200 Subject: [PATCH 12/12] fix(docs): keep Japanese newline fix surgical --- docs-site/src/content/docs/ja/guides/providers.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs-site/src/content/docs/ja/guides/providers.md b/docs-site/src/content/docs/ja/guides/providers.md index 4c0ea71f07..54db46fdbb 100644 --- a/docs-site/src/content/docs/ja/guides/providers.md +++ b/docs-site/src/content/docs/ja/guides/providers.md @@ -309,7 +309,7 @@ raw 100 行が上限で、数万件の catalog 全体を download / cache しま **Novita の discovery:** キー方式のプリセットは `openai-chat` adapter を使用し、Bearer key は Novita の固定 OpenAI 互換 host にだけ送信します。公開 model list から `model_type: chat` と `chat/completions` endpoint の両方を報告する row だけを残し、discovery を 512 KiB と raw 256 行に -制限します。catalog は公開されているため、login は list 成功を key の証拠にせず「検証不能」と報告します。 +制限します。catalog は公開されているため、login は list 成功を key の証明にせず「検証不能」と報告します。 model ごとに capability が異なるため、provider 全体の parallel tool call と OpenAI `reasoning_effort` は宣伝しません。キーは [Novita key manager](https://novita.ai/settings/key-management) で作成します。 @@ -431,4 +431,3 @@ opencodex をローカルの OpenAI 互換サーバーに向けてください **Custom** を選ぶか `ocx init` で `custom` を選んだ後ベース URL を入力してください。すべてのプロバイダーフィールド (`headers`、`noReasoningModels`、`noVisionModels`、`models`、…)は [設定リファレンス](/ja/reference/configuration/)を参照してください。 -