diff --git a/README.md b/README.md
index 4fdc0868de3..907a481db91 100644
--- a/README.md
+++ b/README.md
@@ -157,6 +157,10 @@ See [SPONSORS.md](./SPONSORS.md).
Thanks to PackyCode for sponsoring this project! PackyCode is a stable, high-performance API relay provider, offering relay services for Claude Code, Codex, Gemini, and more. With automatic failover, smart routing, and unlimited concurrency, it turns AI into a real productivity tool. Register via this link and get started! Pick PackyCode in the Add provider picker or run ocx provider add packycode. PackyCode 是一家稳定、高效的 API 中转服务商,提供 Claude Code、Codex、Gemini 等多种中转服务。具备自动故障转移、智能路由和无限并发等多种功能,让 AI 编程成为真正的生产力工具。点此链接注册,立即开始使用!
+
+
+
Thanks to TokenLab for sponsoring this project! TokenLab gives coding agents one API key for leading models, supporting OpenAI Responses and Chat Completions, Anthropic Messages, and Gemini's native API formats, with streaming and tool calling. It also provides an MCP server and agent Skills for easy integration. Choose your delivery mode and pay as you go. Pick TokenLab in the Add provider picker or run ocx provider add tokenlab. TokenLab 为编程智能体提供统一的多模型 API,一枚 API Key 即可接入主流模型,支持 OpenAI Responses、Chat Completions、Anthropic Messages 和 Gemini 原生 API 格式,以及流式输出和工具调用。同时提供 MCP 服务器和 Agent Skills,方便接入现有工作流;交付模式可选,按量付费。
+
diff --git a/SPONSORS.md b/SPONSORS.md
index 76a54c377b7..97506d9ce9a 100644
--- a/SPONSORS.md
+++ b/SPONSORS.md
@@ -47,8 +47,8 @@ sponsor receives:
policy. A second-language blurb (for example Chinese) may run alongside the English one.
- A built-in provider preset (`ocx provider add `) shipped in a public npm release,
listed near the top of the provider picker in the dashboard and CLI and marked as a sponsor
- there. (The registry field and picker ordering that back this land with the first sponsor
- preset; today the picker follows registry order.)
+ there. The dashboard picker, `ocx init` and `ocx provider presets` list sponsor rows Main
+ before Standard, then alphabetically by label, an order no sponsor can buy.
- A detailed entry on the [providers page](https://opencodex.me/guides/providers/) of the docs
site.
- Maintenance: if a release breaks the preset or its adapter, the maintainer fixes it; issues
@@ -66,9 +66,8 @@ and the placements themselves:
The README says nothing else about sponsorship; tiers, pricing, and contact channels live only on
this page.
-The translated READMEs under [`readme/`](./readme) carry one linking line right after their
-own quick-start block instead of duplicating the section, so a sponsor change is one edit in
-English.
+The translated READMEs under [`readme/`](./readme) carry the same sponsor section, with each
+row's thanks line and blurb translated, so a sponsor change updates every README together.
## Pricing
diff --git a/assets/sponsors/tokenlab-dark.png b/assets/sponsors/tokenlab-dark.png
new file mode 100644
index 00000000000..7c1ef48dac9
Binary files /dev/null and b/assets/sponsors/tokenlab-dark.png differ
diff --git a/assets/sponsors/tokenlab-light.png b/assets/sponsors/tokenlab-light.png
new file mode 100644
index 00000000000..37a0f17ef69
Binary files /dev/null and b/assets/sponsors/tokenlab-light.png differ
diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock
index 29d6e6df8b0..4f41c651d47 100644
--- a/desktop/src-tauri/Cargo.lock
+++ b/desktop/src-tauri/Cargo.lock
@@ -2645,7 +2645,7 @@ dependencies = [
[[package]]
name = "opencodex-desktop"
-version = "2.71.0-preview.20260929"
+version = "2.72.0-preview.20260930"
dependencies = [
"base64 0.22.1",
"dbus",
diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml
index f8c0abc4d11..7c3f8d6de38 100644
--- a/desktop/src-tauri/Cargo.toml
+++ b/desktop/src-tauri/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "opencodex-desktop"
-version = "2.71.0-preview.20260929"
+version = "2.72.0-preview.20260930"
description = "OpenCodex desktop shell"
authors = ["OpenCodex contributors"]
license = "MIT"
diff --git a/desktop/src-tauri/src/provider_icons.rs b/desktop/src-tauri/src/provider_icons.rs
index 1fc7ba747f2..750bd5cb7b1 100644
--- a/desktop/src-tauri/src/provider_icons.rs
+++ b/desktop/src-tauri/src/provider_icons.rs
@@ -91,6 +91,7 @@ const ALIASES: &[(&str, &str)] = &[
("orcarouter", "orcarouter.svg"),
("orcarouter-oauth", "orcarouter.svg"),
("packycode", "packycode.svg"),
+ ("tokenlab", "tokenlab.svg"),
("parallel", "parallel.svg"),
("sambanova", "sambanova.svg"),
("scaleway", "scaleway.svg"),
@@ -131,6 +132,7 @@ fn paint(file: &str) -> &'static str {
| "packycode.svg"
| "siliconflow.svg"
| "synthetic.svg"
+ | "tokenlab.svg"
| "vercel-ai-gateway-color.svg"
| "zenmux.svg" => "mask",
"baseten.svg" | "kilo.svg" | "sambanova.svg" | "venice.svg" | "zai.svg" => "plate",
@@ -200,6 +202,7 @@ fn svg(file: &str) -> Option<&'static str> {
"stepfun-color.svg" => svg!("stepfun-color.svg"),
"synthetic.svg" => svg!("synthetic.svg"),
"together.svg" => svg!("together.svg"),
+ "tokenlab.svg" => svg!("tokenlab.svg"),
"umans.svg" => svg!("umans.svg"),
"venice.svg" => svg!("venice.svg"),
"vercel-ai-gateway-color.svg" => svg!("vercel-ai-gateway-color.svg"),
diff --git a/desktop/src-tauri/tauri.conf.json b/desktop/src-tauri/tauri.conf.json
index c2ce63aa33e..32516fe8f71 100644
--- a/desktop/src-tauri/tauri.conf.json
+++ b/desktop/src-tauri/tauri.conf.json
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "OpenCodex",
- "version": "2.71.0-preview.20260929",
+ "version": "2.72.0-preview.20260930",
"identifier": "com.opencodex.desktop",
"build": {
"frontendDist": "../ui",
diff --git a/devlog/_plan/260929_release_2_71_0/000_plan.md b/devlog/_fin/260929_release_2_71_0/000_plan.md
similarity index 100%
rename from devlog/_plan/260929_release_2_71_0/000_plan.md
rename to devlog/_fin/260929_release_2_71_0/000_plan.md
diff --git a/devlog/_plan/260929_release_2_71_0/001_consultation.md b/devlog/_fin/260929_release_2_71_0/001_consultation.md
similarity index 100%
rename from devlog/_plan/260929_release_2_71_0/001_consultation.md
rename to devlog/_fin/260929_release_2_71_0/001_consultation.md
diff --git a/devlog/_plan/260929_release_2_71_0/010_integration.md b/devlog/_fin/260929_release_2_71_0/010_integration.md
similarity index 100%
rename from devlog/_plan/260929_release_2_71_0/010_integration.md
rename to devlog/_fin/260929_release_2_71_0/010_integration.md
diff --git a/devlog/_plan/260929_release_2_71_0/011_wp1_execution.md b/devlog/_fin/260929_release_2_71_0/011_wp1_execution.md
similarity index 100%
rename from devlog/_plan/260929_release_2_71_0/011_wp1_execution.md
rename to devlog/_fin/260929_release_2_71_0/011_wp1_execution.md
diff --git a/devlog/_plan/260929_release_2_71_0/020_verification.md b/devlog/_fin/260929_release_2_71_0/020_verification.md
similarity index 100%
rename from devlog/_plan/260929_release_2_71_0/020_verification.md
rename to devlog/_fin/260929_release_2_71_0/020_verification.md
diff --git a/devlog/_plan/260929_release_2_71_0/021_wp2_execution.md b/devlog/_fin/260929_release_2_71_0/021_wp2_execution.md
similarity index 100%
rename from devlog/_plan/260929_release_2_71_0/021_wp2_execution.md
rename to devlog/_fin/260929_release_2_71_0/021_wp2_execution.md
diff --git a/devlog/_plan/260929_release_2_71_0/022_wp2_results.md b/devlog/_fin/260929_release_2_71_0/022_wp2_results.md
similarity index 100%
rename from devlog/_plan/260929_release_2_71_0/022_wp2_results.md
rename to devlog/_fin/260929_release_2_71_0/022_wp2_results.md
diff --git a/devlog/_plan/260929_release_2_71_0/030_land.md b/devlog/_fin/260929_release_2_71_0/030_land.md
similarity index 100%
rename from devlog/_plan/260929_release_2_71_0/030_land.md
rename to devlog/_fin/260929_release_2_71_0/030_land.md
diff --git a/devlog/_plan/260929_release_2_71_0/031_wp3_execution.md b/devlog/_fin/260929_release_2_71_0/031_wp3_execution.md
similarity index 100%
rename from devlog/_plan/260929_release_2_71_0/031_wp3_execution.md
rename to devlog/_fin/260929_release_2_71_0/031_wp3_execution.md
diff --git a/devlog/_fin/260929_release_2_71_0/032_wp3_results.md b/devlog/_fin/260929_release_2_71_0/032_wp3_results.md
new file mode 100644
index 00000000000..1affb33855e
--- /dev/null
+++ b/devlog/_fin/260929_release_2_71_0/032_wp3_results.md
@@ -0,0 +1,18 @@
+# 032 wp3 results: landed on dev
+
+| Step | Evidence |
+|---|---|
+| Screenshots | pr-assets 947e869c8b (`260929-release-2-71-0/request-pacing.png`, `cursor-installer.png`), fast-forward from ea1749154d |
+| PR | #6224 `chore(release): integrate six reviewed PRs for 2.71.0`, head dcfbb2f708 |
+| PR-event CI | Cross-platform CI 36525839698 success; Service lifecycle 36525839767 success; React Doctor 36525839694, PR hygiene, Enforce PR target branch success |
+| Full-lane CI | Cross-platform CI workflow_dispatch 36526719414 (lane all) success: 39 jobs success, 1 skipped; includes windows 1/9-9/9 (the pull_request event skips the Windows matrix, ci.yml:835-839) and macos control |
+| Head totals | 80 check-runs: 74 success, 6 skipped by design, 0 failed |
+| Policy | `scripts/ci/assert-mergeable-review.sh --maintainer-integration 6224`: OK; decision recorded in PR comment 5884552184 |
+| Merge | `gh pr merge 6224 --admin --merge --match-head-commit dcfbb2f708` -> dev d161c0e83e; all six land commits and four fixes are ancestors of dev |
+| Source PRs | #6206 #6201 #6209 #6094 #5905 #6198 closed with a comment naming the land commit; issue #6208 closed with the #6209 commit |
+
+Note: windows 8/9 passed in 36526719414, including the 32-profile transaction case that failed
+the dev tip in 36499924172, now under BULK_DURABLE_IO_BUDGET_MS.
+
+Candidate for 040: dev d161c0e83e (version sources 2.71.0).
+
diff --git a/devlog/_plan/260929_release_2_71_0/040_release.md b/devlog/_fin/260929_release_2_71_0/040_release.md
similarity index 96%
rename from devlog/_plan/260929_release_2_71_0/040_release.md
rename to devlog/_fin/260929_release_2_71_0/040_release.md
index aa108ce81bf..174aa211495 100644
--- a/devlog/_plan/260929_release_2_71_0/040_release.md
+++ b/devlog/_fin/260929_release_2_71_0/040_release.md
@@ -7,8 +7,8 @@ that merge commit is informative; the gating runs are on the promotion SHAs.
1. Pre-move dev: `gh workflow run dev-version-bump.yml --ref main -f intended-version=2.71.0 -f mode=pre-move`;
the opened PR must change only the four version sources to 2.72.0 (package.json,
- desktop/src-tauri/Cargo.toml, Cargo.lock, tauri.conf.json); merge it with --admin --merge
- --match-head-commit.
+ desktop/src-tauri/Cargo.toml, Cargo.lock, tauri.conf.json); merge it with --admin --squash
+ --match-head-commit (as #6213).
2. Preview: branch `codex/promote-preview-2-71-0` from the candidate, `git merge -s ours origin/preview`,
`bun scripts/release-version-sources.ts sync 2.71.0-preview.20260929`, commit, PR to preview,
merge commit. Wait for push-event Cross-platform CI and Service lifecycle success on the
@@ -28,4 +28,3 @@ Guards: verify preview tree differs from candidate only in the four version sour
equals the candidate. A failing promotion run is fixed through dev and re-promoted. If a release
run fails after npm acknowledged publication, re-dispatch with resume-after-npm-publish=true and the
same expected-sha; never republish.
-
diff --git a/devlog/_fin/260929_release_2_71_0/041_wp4_execution.md b/devlog/_fin/260929_release_2_71_0/041_wp4_execution.md
new file mode 100644
index 00000000000..f1db2d5025d
--- /dev/null
+++ b/devlog/_fin/260929_release_2_71_0/041_wp4_execution.md
@@ -0,0 +1,59 @@
+# 041 wp4 execution: release 2.71.0
+
+Previous D (wp3): #6224 merged, dev d161c0e83e; final CI green including windows 1-9. Direction
+unchanged: release that candidate exactly as 040 (same shape as 2.70.0: #6211/#6212/#6213).
+
+Revalidated at wp4 P: dev d161c0e83e (package 2.71.0), preview aa3a8dda16 (2.70.0-preview.20260929),
+main 53834ff47b (2.70.0); npm latest=2.70.0, preview=2.70.0-preview.20260929. Candidate C =
+d161c0e83ea8a88027b2cef28c125ff3c1f29f8a.
+
+## Order and parallelism
+
+1. Pre-move dispatch (runs on GitHub, ~1 min):
+ `gh workflow run dev-version-bump.yml -R lidge-jun/opencodex --ref main -f intended-version=2.71.0 -f mode=pre-move`
+ -> PR `codex/dev-version-2.72.0`. Accept only if its files are exactly the four version sources and
+ each reads 2.72.0. Its PR CI runs while steps 2-3 proceed; merge it (`--admin --squash
+ --match-head-commit`, as #6213) once its Cross-platform CI and gates are green. It is merged
+ before any release dispatch; the stable dispatch strictly requires it (release-preflight.sh
+ assert-ahead), and doing it first for both keeps one order.
+2. Preview branch (managed worktree, clean tree):
+ ```sh
+ git switch -c codex/promote-preview-2.71.0 d161c0e83ea8a88027b2cef28c125ff3c1f29f8a
+ git merge -s ours refs/remotes/canon/preview -m "Merge preview into 2.71.0-preview.20260929 promotion"
+ bun scripts/release-version-sources.ts sync 2.71.0-preview.20260929
+ git commit -am "chore(release): 2.71.0-preview.20260929"
+ git diff --name-only d161c0e83e HEAD # must list exactly the four version sources
+ bun scripts/release-version-sources.ts # check mode: all sources 2.71.0-preview.20260929
+ ```
+ Push, PR to preview titled "release: 2.71.0-preview.20260929", body as #6211 (plus the two
+ pr-assets screenshots because the union touches gui/), merge with `--admin --merge
+ --match-head-commit`.
+3. Main branch:
+ ```sh
+ git switch -c codex/promote-main-2.71.0 d161c0e83ea8a88027b2cef28c125ff3c1f29f8a
+ git merge -s ours refs/remotes/canon/main -m "Merge main into 2.71.0 promotion"
+ git diff --quiet d161c0e83e HEAD # tree equals the candidate
+ ```
+ Push, PR to main titled "release: 2.71.0", body as #6212 plus screenshots, merge the same way.
+4. Gate per promotion SHA (the merge commits on preview and main): push-event Cross-platform CI and
+ Service lifecycle both `success` (release.yml checks both). A red run is diagnosed; a flake with
+ evidence may be rerun once; a real defect is fixed on dev and re-promoted.
+5. Dispatch, preview first:
+ `gh workflow run release.yml -R lidge-jun/opencodex --ref preview -f version=2.71.0-preview.20260929 -f tag=preview -f dry-run=false -f expected-sha=`
+ then after it succeeds:
+ `gh workflow run release.yml -R lidge-jun/opencodex --ref main -f version=2.71.0 -f tag=latest -f dry-run=false -f expected-sha=`
+ On a failure after npm acknowledged publication: same inputs plus `-f resume-after-npm-publish=true`.
+6. Verify: `npm view @bitkyc08/opencodex dist-tags --json` (latest=2.71.0, preview=2.71.0-preview.20260929),
+ `npm view @bitkyc08/opencodex@2.71.0 gitHead` = main merge sha, `gh release view v2.71.0` (not
+ prerelease, asset count as v2.70.0 = 25), `gh release view v2.71.0-preview.20260929` (prerelease),
+ latest.json from the v2.71.0 release reports 2.71.0 with signed platforms.
+7. Outcome: 090_outcome.md, move the unit to devlog/_fin/260929_release_2_71_0, docs PR to dev from
+ a branch on the pre-moved dev tip; merge after its gates.
+
+Merging promotion PRs is owner-authorized in this session ("배포까지 완료"). enforce-target flags
+promotion PRs as wrong base by design (2.70.0 precedent); that check is not required for preview/main.
+
+D11 (architect, wp4, ALIGNED): release.yml:847-867 accepts only a push-event ci.yml run on the exact
+SHA (a PR run does not count); package.json is in both ci.yml push paths (:51) and
+service-lifecycle.yml push paths (:19), so both gating runs fire on each promotion merge commit;
+release-preflight.sh enforces dev strictly ahead, so the pre-move PR merges first.
diff --git a/devlog/_fin/260929_release_2_71_0/090_outcome.md b/devlog/_fin/260929_release_2_71_0/090_outcome.md
new file mode 100644
index 00000000000..f3bd2a59d29
--- /dev/null
+++ b/devlog/_fin/260929_release_2_71_0/090_outcome.md
@@ -0,0 +1,38 @@
+# 090 Outcome: 2.71.0 released
+
+Published 2026-09-29 (KST). GitHub releases `v2.71.0` and `v2.71.0-preview.20260929` exist with 25
+assets each; npm accepted both publications with signed provenance.
+
+Six reviewed PRs landed on dev with author credit, the Windows timeout that had turned the dev tip
+red was fixed, and the whole set was released as 2.71.0 and 2.71.0-preview.20260929.
+
+| Step | Evidence |
+|---|---|
+| Integration | #6224 merged to dev as d161c0e83e (merge commit). Land commits: df951bc2ee #6206 (Ingwannu), 6d7af977a4 #6201 (luvs01), 21ccf35dbe #6209 (Jio Kim), e3fcf3e43c #6094 (Brad Hallett), 2b0ac07170 #5905 (halysondev), febc16d2a4 #6198 (luvs01); follow-ups 9155880950, 7b875559dd, 917db156de, 441aeb179e. Details in 032. |
+| Local regression | 022: all gates exit 0; full-suite failures proven pre-existing at dev 37ad7e771b. |
+| Final CI | #6224 head dcfbb2f708: Cross-platform CI pull_request 36525839698, workflow_dispatch lane=all 36526719414 (windows 1-9), Service lifecycle 36525839767, all success; 0 failed check-runs. |
+| dev pre-move | Dev version bump run 36529404555 opened #6226; its PR checks were approval-gated (bot-authored, as #6213), so the version tests and typecheck ran locally on its head 316750815c (209 pass) before `--admin --squash`; dev 69ce312097 reads 2.72.0. |
+| Preview | #6227 merged as fd346e2489 (tree = candidate + four version sources at 2.71.0-preview.20260929). Push Cross-platform CI 36529530341 and Service lifecycle 36529530333 success. Release run 36531705017 success; npm `preview=2.71.0-preview.20260929`, gitHead fd346e2489, provenance attestation present. |
+| Stable | #6228 merged as 8a005dd98f (tree equal to the candidate). Push Cross-platform CI 36529537253 and Service lifecycle 36529537201 success. Release run 36533478070 success; npm publish acknowledged (`+ @bitkyc08/opencodex@2.71.0`, sigstore log 2995422874); GitHub release `v2.71.0` not prerelease, 25 assets; latest.json reports 2.71.0 with 5 signed platforms. |
+| Source PRs | #6206 #6201 #6209 #6094 #5905 #6198 closed with landing comments; issue #6208 closed. |
+
+## Notes
+
+- The pull_request event skips the Windows matrix (ci.yml:835-839); a workflow_dispatch run on the
+ integration head covered windows 1-9 before merge.
+- The promotion PRs' own pull_request CI runs (36529486815, 36529483354) were cancelled to free
+ runners after both promotions merged; the push runs on the same trees gate the release.
+- The registry smoke step warned on both releases because npm took a few minutes to serve the new
+ versions; no republish was attempted.
+- The installed proxy, service and desktop app on this machine were not updated.
+
+## What did not improve / open follow-ups
+
+- Local full `bun run test` on a loaded macOS host is not a clean signal: a claude-integration
+ server test can hang and cascade into `SpendLedgerOwnerError` for the rest of its worker, and
+ `tests/service/shutdown-launcher.test.ts` fails and leaves orphan proxies. Both reproduce at dev
+ 37ad7e771b; they deserve their own issue.
+- Optional hardening noted by reviewers and not built here: a response-size cap and redirect policy
+ for the Cursor manifest fetch (#5905), strict single-[3] TBS parsing in picker-ca (#6201), extra
+ subprocess tests for #6209, localized copies of the cli.md priority note.
+
diff --git a/devlog/_plan/260929_tokenlab_sponsor/000_roadmap.md b/devlog/_plan/260929_tokenlab_sponsor/000_roadmap.md
new file mode 100644
index 00000000000..3d14bac63ca
--- /dev/null
+++ b/devlog/_plan/260929_tokenlab_sponsor/000_roadmap.md
@@ -0,0 +1,13 @@
+# TokenLab — preset merge and third Standard sponsor
+
+TokenLab (TOKENLAB AI INC.) signed up as a Standard sponsor on 2026-09-29 (DocuSign envelope sent
+21:08 KST; USD 1,200 / 3 months, term starts at the npm release that ships the preset). Two units:
+
+| Doc | Work phase | Outcome |
+|-----|-----------|---------|
+| [010](./010_merge_6221.md) | wp1 | #6221 (fork `hedging8563`, ordinary API-key preset) merged into `dev` on green exact-head CI |
+| [020](./020_sponsor_pr.md) | wp2 | Separate maintainer PR: sponsor field, dashboard sponsor surface, README row #3, docs, assets |
+
+The sponsor PR stays unmerged for owner review. The Responses-first proposal in TokenLab's asset pack
+(`integration-notes.md`) is out of scope for both units: it changes the upstream protocol and needs
+its own evidence and PR.
diff --git a/devlog/_plan/260929_tokenlab_sponsor/010_merge_6221.md b/devlog/_plan/260929_tokenlab_sponsor/010_merge_6221.md
new file mode 100644
index 00000000000..789fa1aa080
--- /dev/null
+++ b/devlog/_plan/260929_tokenlab_sponsor/010_merge_6221.md
@@ -0,0 +1,37 @@
+# 010 — Merge #6221 (TokenLab API-key preset)
+
+## State at plan time
+
+- Head repo `hedging8563/opencodex`, branch `codex/tokenlab-provider`, draft, `maintainerCanModify`.
+- Branch updated onto `dev` with `gh pr update-branch` → head `6a9e571202`.
+- Fork runs `Cross-platform CI` (36566988054) and `React Doctor` (36566988033) approved by the maintainer.
+- Admission gap recorded in the PR body: routing/resale authorization evidence. The owner's
+ sponsorship agreement with the operator (§2.2: sourcing and delivery mode are TokenLab's
+ responsibility, not audited or guaranteed by opencodex) is the maintainer decision that closes it;
+ no upstream endorsement claim is added.
+
+## Steps
+
+0. Head moved to `fb565b7c48`: the `dev` union failed `docs-provider-preset-counts` (16 assertions,
+ localized 99/82 counts). Recounted the anchored lines; the test passes locally 18/18.
+1. Wait for every required check on `6a9e571202` to complete successfully. A red, skipped or
+ older-head result blocks merge; fix forward only if the failure is in this diff.
+2. Mark the PR ready (`gh pr ready 6221`).
+3. Post a maintainer-integration comment: owner instruction, exact head SHA, check list, and the
+ admission decision above.
+4. Squash-merge with the admin bypass (`gh pr merge 6221 --squash --admin`); the squash keeps the
+ PR author as commit author.
+5. Verify `dev` contains the squash commit and `src/providers/registry/entries-extended.ts` carries
+ the `tokenlab` entry.
+
+## Not in this unit
+
+Sponsor field, README, logos — see 020.
+
+## Outcome (2026-09-29)
+
+Merged as `f6cddd7d69` at 12:51 UTC from head `fb565b7c48`: 24 checks passed, 7 skipped by path
+conditions (Cross-platform CI 36567400620, React Doctor). CodeRabbit's assertive review found nothing
+actionable. The readiness gate re-drafted the PR on `ready`; the maintainer ticked the last two boxes
+after that review and recorded it on the PR. A full local `bun run test` cannot run from a worktree
+under `~/.codex`: the harness refuses to delete temporary directories inside the real Codex home.
diff --git a/devlog/_plan/260929_tokenlab_sponsor/020_sponsor_pr.md b/devlog/_plan/260929_tokenlab_sponsor/020_sponsor_pr.md
new file mode 100644
index 00000000000..0cbee8371cf
--- /dev/null
+++ b/devlog/_plan/260929_tokenlab_sponsor/020_sponsor_pr.md
@@ -0,0 +1,63 @@
+# 020 — TokenLab third Standard sponsor PR
+
+Branch `codex/tokenlab-sponsor`, started on the #6221 head and rebased onto `dev` after 010 lands.
+Pattern: #3914 (OrcaRouter, mechanism) and #3915 (PackyCode, second sponsor). Assets come from
+TokenLab's corrected pack (`TokenLab-OpenCodex-assets-corrected.zip`), artwork unchanged.
+
+## Diff
+
+- `src/providers/registry/entries-extended.ts` — the `tokenlab` entry gains
+ `sponsor: { tier: "standard", url: "https://tokenlab.sh/?utm_source=opencodex&utm_medium=readme" }`
+ with a comment naming SPONSORS.md and the signing date. No routing, default or discovery change.
+- `assets/sponsors/tokenlab-light.png`, `assets/sponsors/tokenlab-dark.png` — the pack's 500×125
+ lockups, unchanged (`-light` = for light page backgrounds, as in the pack). Listed in
+ `package.json` `files` beside the OrcaRouter/PackyCode logos.
+- `README.md` — third row of the `sponsors:standard` table, in signing order after PackyCode.
+ Logo in `` with a `prefers-color-scheme: dark` source so the dark lockup shows in
+ GitHub dark mode; the `` fallback is the light lockup (npm). Text: "Thanks to TokenLab for
+ sponsoring this project!", the sponsor's English blurb verbatim, then the picker /
+ `ocx provider add tokenlab` line.
+- `readme/README.{ko,ja,zh-CN,zh-TW,ru,fr,tr}.md` — the same row, translated like the existing
+ rows, image paths `../assets/...`. Keep the README drift gate green.
+- `gui/public/provider-icons/tokenlab.svg` — the pack's symbol mark; `gui/src/provider-icons.ts`
+ maps `tokenlab` to it, sets the display name, and applies dark-mode treatment like other
+ monochrome marks.
+- `gui/src/components/provider-workspace/ProviderSponsor.tsx` — replace the hardcoded
+ OrcaRouter/PackyCode ternaries with a small brand table so a sponsor is one row; add TokenLab.
+ i18n keys `pws.sponsor.tokenlabTitle` / `pws.sponsor.tokenlabDescription` in every
+ `gui/src/i18n/*.ts` locale (the closed catalog must stay exhaustive).
+- `docs-site/src/content/docs/guides/providers.md` — sponsor paragraph after PackyCode, and the
+ base-URL table row if #6221 has not already added it. Translated locales must not contradict it.
+- Tests — `tests/providers/sponsor-presets.test.ts` stays generic; the GUI sponsor overview test
+ covers the TokenLab card. Respect the file-size ratchet: move rather than grow capped files.
+
+## Verification
+
+## Audit folds (reviewer, NEAR-PASS)
+
+- `desktop/src-tauri/src/provider_icons.rs`: `("tokenlab", "tokenlab.svg")` in `ALIASES`, the same paint
+ arm as `MASKED_PROVIDER_ICONS`, and `svg!("tokenlab.svg")` (`gui/tests/provider-icons-native.test.ts`).
+- `readme/i18n-manifest.json`: refresh all seven `sourceSha256` values to the new LF-normalized README hash
+ (`docs-readme-translation-parity.test.ts`).
+- `` is gate-compatible: only `src=`/`href=` are asset-tracked, so each locale's `` must be
+ `../assets/sponsors/tokenlab-light.png`; include the dark `` too.
+- Icon provenance row in `gui/public/provider-icons/README.md`; `structure/dashboard-and-usage.md` owns the
+ `ProviderSponsor` description — update it for the brand table.
+- Docs: extend the existing TokenLab section in `guides/providers.md` with the sponsor link; do not add a
+ second paragraph.
+- `SPONSORS.md`: fix the stale "picker follows registry order" and "translated READMEs carry one linking
+ line" sentences.
+- Branch: after #6221 squashes, move only the sponsor commits onto `dev`
+ (`git rebase --onto origin/dev fb565b7c48`).
+
+## Verification (commands)
+
+Focused: sponsor-presets, provider-registry-parity, tokenlab-provider, README drift/translation
+gates, GUI sponsor tests, `bun run typecheck`, `bun run lint:gui`, `bun run privacy:scan`,
+`bun run structure:check`, `bun run build:gui`. Then `bun run test` or the documented focused
+exception. Screenshot of the dashboard sponsor card and picker uploaded to the `pr-assets` branch
+and linked by SHA in the PR description, never committed to the PR branch.
+
+## Out of scope
+
+Responses-first adapter and the `X-TokenLab-Delivery-Policy` header (pack `integration-notes.md`).
diff --git a/docs-site/src/content/docs/fr/getting-started/quickstart.md b/docs-site/src/content/docs/fr/getting-started/quickstart.md
index 4d08caed17d..3cf3a91b39c 100644
--- a/docs-site/src/content/docs/fr/getting-started/quickstart.md
+++ b/docs-site/src/content/docs/fr/getting-started/quickstart.md
@@ -13,7 +13,7 @@ ocx init
`ocx init` vous accompagne dans les étapes suivantes :
-1. **Choix d’un fournisseur** — sélectionnez l’un des 99 préréglages intégrés au registre, ou `custom` pour saisir une
+1. **Choix d’un fournisseur** — sélectionnez l’un des 100 préréglages intégrés au registre, ou `custom` pour saisir une
URL de base et un adaptateur.
2. **Clé API** — collez une clé ou référencez une variable d’environnement telle que `${ANTHROPIC_API_KEY}`.
3. **Modèle par défaut** — pour les fournisseurs clés, locaux et personnalisés, acceptez le préréglage ou saisissez un identifiant de modèle.
diff --git a/docs-site/src/content/docs/fr/guides/providers.md b/docs-site/src/content/docs/fr/guides/providers.md
index 1f2090b4b86..641b9a93735 100644
--- a/docs-site/src/content/docs/fr/guides/providers.md
+++ b/docs-site/src/content/docs/fr/guides/providers.md
@@ -295,7 +295,7 @@ existante n'est pas concernée.
## 3. Catalogue des clés API
-opencodex fournit 99 préréglages intégrés : 82 à clé, 13 OAuth, trois locaux et un préréglage par défaut de
+opencodex fournit 100 préréglages intégrés : 83 à clé, 13 OAuth, trois locaux et un préréglage par défaut de
transfert ChatGPT. Dans le tableau de bord, le sélecteur **Ajouter un fournisseur** ouvre le tableau de bord du
fournisseur à clé, valide la clé et l'enregistre ; la validation dépend du fournisseur. Parmi les entrées notables :
diff --git a/docs-site/src/content/docs/getting-started/quickstart.md b/docs-site/src/content/docs/getting-started/quickstart.md
index 8f863b6f517..d49783ed4ec 100644
--- a/docs-site/src/content/docs/getting-started/quickstart.md
+++ b/docs-site/src/content/docs/getting-started/quickstart.md
@@ -18,7 +18,7 @@ ocx init
`ocx init` walks you through:
-1. **Pick a provider** — choose one of the 99 built-in registry presets or `custom` to type a base
+1. **Pick a provider** — choose one of the 100 built-in registry presets or `custom` to type a base
URL and adapter.
2. **API key** — paste a key, or reference an environment variable like `${ANTHROPIC_API_KEY}`.
3. **Default model** — for key, local, and custom providers, accept the preset or enter a model id.
diff --git a/docs-site/src/content/docs/guides/providers.md b/docs-site/src/content/docs/guides/providers.md
index b8c6c7510c6..5bbf4735c66 100644
--- a/docs-site/src/content/docs/guides/providers.md
+++ b/docs-site/src/content/docs/guides/providers.md
@@ -456,7 +456,7 @@ The account list marks Kiro accounts excluded from automatic selection with a re
## 3. API-key catalog
-opencodex ships 99 built-in presets: 82 key-based, 13 OAuth, three local, and one default
+opencodex ships 100 built-in presets: 83 key-based, 13 OAuth, three local, and one default
ChatGPT-forward preset. The dashboard's **Add provider** picker opens a key provider's dashboard,
validates the key, and stores it; validation is provider-specific. Notable entries:
@@ -548,10 +548,29 @@ region-pinned EU routes, is at [opper.ai/models](https://opper.ai/models). Opper
| Xiaomi MiMo (OpenAI Chat) | `https://api.xiaomimimo.com/v1` |
| Kilo | `https://api.kilo.ai/api/gateway` |
| Opper | `https://api.opper.ai/v3/compat` |
+| TokenLab | `https://api.tokenlab.sh/v1` |
| GitLab Duo | `https://cloud.gitlab.com/ai/v1/proxy/openai/v1` |
| Cloudflare AI Gateway | `https://gateway.ai.cloudflare.com/v1/{account-id}/{gateway}/anthropic` |
| …and more | opencode zen, Vercel AI Gateway, Venice, NanoGPT, Synthetic, Qianfan, Alibaba, Parallel, ZenMux, LiteLLM |
+**TokenLab** ([sponsor](https://github.com/lidge-jun/opencodex/blob/main/SPONSORS.md)) is an
+OpenAI-compatible API gateway at [tokenlab.sh](https://tokenlab.sh/r/OPENCODEX),
+operated by TOKENLAB AI INC.
+Create a workspace [API key](https://tokenlab.sh/dashboard/api?tab=keys), then run
+`ocx provider add tokenlab` or select **TokenLab** in the dashboard's **Add provider** picker.
+The preset uses [Chat Completions](https://docs.tokenlab.sh/quickstart) and discovers models at
+`GET /v1/models?category=chat`, keeping only entries that declare `tool-use` capability.
+Image, video, audio, embedding and decision models are excluded from this chat preset.
+
+The [model catalog](https://docs.tokenlab.sh/api-reference/models/list-models) is public without
+a key, but a supplied key is validated and scopes results to its model permissions and delivery
+policy. Use a valid key with a funded workspace for inference. `gpt-5.6-terra` is the seeded
+default; choose another discovered model if your key does not allow it. The provider and model
+prefixes remain separate: `tokenlab/gpt-5.6-terra` sends `gpt-5.6-terra` upstream.
+TokenLab's [terms](https://tokenlab.sh/tos) and [privacy policy](https://tokenlab.sh/privacy-policy)
+apply to requests sent to this service. The preset pins the row near the top of the Add provider
+picker and marks it as a sponsor, and nothing else about routing or defaults changes.
+
The MiniMax and MiniMax (CN) provider cards can also show Coding Plan quota when the configured
key has an active plan. The dashboard reads the plan's 5-hour window and, when present, weekly
window; these are display observations and do not change model routing.
diff --git a/docs-site/src/content/docs/ja/getting-started/quickstart.md b/docs-site/src/content/docs/ja/getting-started/quickstart.md
index d2a3c3f4b86..3760250bc91 100644
--- a/docs-site/src/content/docs/ja/getting-started/quickstart.md
+++ b/docs-site/src/content/docs/ja/getting-started/quickstart.md
@@ -18,7 +18,7 @@ ocx init
`ocx init` では次の手順を説明します。
-1. **プロバイダーを選択してください** — 99 個の組み込みレジストリプリセットのいずれか、または `custom` を選択してベース URL とアダプターを入力します。
+1. **プロバイダーを選択してください** — 100 個の組み込みレジストリプリセットのいずれか、または `custom` を選択してベース URL とアダプターを入力します。
2. **API キー** — キーを貼り付けるか、`${ANTHROPIC_API_KEY}` のような環境変数を参照します。
3. **デフォルト モデル** — キー、ローカル、カスタム プロバイダーの場合は、プリセットを受け入れるか、モデル ID を入力します。
4. **プロキシ ポート** — デフォルトは `10100` です。
diff --git a/docs-site/src/content/docs/ja/guides/providers.md b/docs-site/src/content/docs/ja/guides/providers.md
index f54fa25dd07..282f7335c05 100644
--- a/docs-site/src/content/docs/ja/guides/providers.md
+++ b/docs-site/src/content/docs/ja/guides/providers.md
@@ -193,7 +193,7 @@ Kiro のログインには Kiro CLI が必要です。Unix では `curl -fsSL ht
## 3. API キーカタログ
-opencodex には組み込みプリセットが 99 個含まれています。キー方式 82、OAuth 13、ローカル 3、
+opencodex には組み込みプリセットが 100 個含まれています。キー方式 83、OAuth 13、ローカル 3、
デフォルト ChatGPT 転送プリセット 1 です。ダッシュボードの **Add provider** ピッカーはキー発行ページを開き、
入力したキーを検証した後保存します(検証はプロバイダー固有です)。主な項目は以下のとおりです:
diff --git a/docs-site/src/content/docs/ko/getting-started/quickstart.md b/docs-site/src/content/docs/ko/getting-started/quickstart.md
index b0b22222a37..7ddac09c0d8 100644
--- a/docs-site/src/content/docs/ko/getting-started/quickstart.md
+++ b/docs-site/src/content/docs/ko/getting-started/quickstart.md
@@ -18,7 +18,7 @@ ocx init
`ocx init`은 다음 과정을 안내합니다:
-1. **프로바이더 선택** — 내장 레지스트리 프리셋 99개 중 하나를 고르거나 `custom`을 선택해 base URL과 adapter를 직접 입력합니다.
+1. **프로바이더 선택** — 내장 레지스트리 프리셋 100개 중 하나를 고르거나 `custom`을 선택해 base URL과 adapter를 직접 입력합니다.
2. **API 키** — 키를 붙여넣거나 `${ANTHROPIC_API_KEY}` 같은 환경 변수를 참조합니다.
3. **기본 모델** — 키, 로컬, custom 프로바이더에서는 프리셋을 그대로 쓰거나 모델 ID를 직접 입력합니다.
4. **프록시 포트** — 기본값은 `10100`입니다.
diff --git a/docs-site/src/content/docs/ko/guides/providers.md b/docs-site/src/content/docs/ko/guides/providers.md
index 8027e1ff1fc..a3184d953ce 100644
--- a/docs-site/src/content/docs/ko/guides/providers.md
+++ b/docs-site/src/content/docs/ko/guides/providers.md
@@ -190,7 +190,7 @@ Kiro 로그인에는 Kiro CLI가 필요합니다. Unix에서는 `curl -fsSL http
## 3. API 키 카탈로그
-opencodex에는 빌트인 프리셋이 99개 들어 있습니다. 키 방식 82개, OAuth 13개, 로컬 3개,
+opencodex에는 빌트인 프리셋이 100개 들어 있습니다. 키 방식 83개, OAuth 13개, 로컬 3개,
기본 ChatGPT 포워드 프리셋 1개입니다. 대시보드의 **Add provider** 선택기는 키 발급 페이지를 열고,
입력한 키를 검증한 뒤 저장합니다(검증은 프로바이더별로 다릅니다). 주요 항목은 다음과 같습니다:
diff --git a/docs-site/src/content/docs/ru/getting-started/quickstart.md b/docs-site/src/content/docs/ru/getting-started/quickstart.md
index 945893e0457..9552ed50b42 100644
--- a/docs-site/src/content/docs/ru/getting-started/quickstart.md
+++ b/docs-site/src/content/docs/ru/getting-started/quickstart.md
@@ -18,7 +18,7 @@ ocx init
`ocx init` проведёт вас по следующим шагам:
-1. **Выбор провайдера** — выберите один из 99 встроенных пресетов реестра или `custom`, чтобы
+1. **Выбор провайдера** — выберите один из 100 встроенных пресетов реестра или `custom`, чтобы
ввести базовый URL и адаптер вручную.
2. **API-ключ** — вставьте ключ или сошлитесь на переменную окружения вида `${ANTHROPIC_API_KEY}`.
3. **Модель по умолчанию** — для провайдеров с ключом, локальных и `custom` примите значение из
diff --git a/docs-site/src/content/docs/ru/guides/providers.md b/docs-site/src/content/docs/ru/guides/providers.md
index 579005a20dd..4bc043e2fa7 100644
--- a/docs-site/src/content/docs/ru/guides/providers.md
+++ b/docs-site/src/content/docs/ru/guides/providers.md
@@ -206,7 +206,7 @@ Inline JSON и лишние позиционные аргументы откло
## 3. Каталог API-ключей
-opencodex поставляется с 99 встроенными пресетами: 82 на основе ключей, 13 OAuth, три локальных и
+opencodex поставляется с 100 встроенными пресетами: 83 на основе ключей, 13 OAuth, три локальных и
один пресет ChatGPT-форварда по умолчанию. Селектор **Add provider** в дашборде открывает страницу
выдачи ключей провайдера, проверяет ключ и сохраняет его; проверка зависит от провайдера.
Наиболее заметные записи:
diff --git a/docs-site/src/content/docs/tr/getting-started/quickstart.md b/docs-site/src/content/docs/tr/getting-started/quickstart.md
index 2d45af871ca..21056695bba 100644
--- a/docs-site/src/content/docs/tr/getting-started/quickstart.md
+++ b/docs-site/src/content/docs/tr/getting-started/quickstart.md
@@ -14,7 +14,7 @@ ocx init
`ocx init` adım adım size rehberlik eder:
-1. **Bir sağlayıcı seçin** — yerleşik kayıt defterindeki 99 önayardan birini
+1. **Bir sağlayıcı seçin** — yerleşik kayıt defterindeki 100 önayardan birini
veya bir temel URL ile adaptör yazmak için `custom` seçeneğini belirleyin.
2. **API anahtarı** — bir anahtar yapıştırın veya `${ANTHROPIC_API_KEY}` gibi
bir ortam değişkenine başvurun.
diff --git a/docs-site/src/content/docs/tr/guides/providers.md b/docs-site/src/content/docs/tr/guides/providers.md
index 58c628b2ddc..76201a96233 100644
--- a/docs-site/src/content/docs/tr/guides/providers.md
+++ b/docs-site/src/content/docs/tr/guides/providers.md
@@ -327,7 +327,7 @@ olmayan bir makineden oturum açmak bundan etkilenmez.
## 3. API anahtarı kataloğu
-opencodex 99 yerleşik önayar ile birlikte gelir: 82 anahtar tabanlı, 13
+opencodex 100 yerleşik önayar ile birlikte gelir: 83 anahtar tabanlı, 13
OAuth, üç yerel ve bir varsayılan ChatGPT iletme önayarı. Kontrol panelinin
**Sağlayıcı ekle** seçicisi bir anahtar sağlayıcısının kontrol panelini açar,
anahtarı doğrular ve saklar; doğrulama sağlayıcıya özgüdür. Dikkate değer
diff --git a/docs-site/src/content/docs/zh-cn/getting-started/quickstart.md b/docs-site/src/content/docs/zh-cn/getting-started/quickstart.md
index cb5abdcc458..b8561722c38 100644
--- a/docs-site/src/content/docs/zh-cn/getting-started/quickstart.md
+++ b/docs-site/src/content/docs/zh-cn/getting-started/quickstart.md
@@ -18,7 +18,7 @@ ocx init
`ocx init` 会引导你完成:
-1. **选择 provider** — 从内置 registry 的 99 个预设中选择一个,或选择 `custom` 手动输入 base URL 和 adapter。
+1. **选择 provider** — 从内置 registry 的 100 个预设中选择一个,或选择 `custom` 手动输入 base URL 和 adapter。
2. **API key** — 粘贴一个 key,或引用一个环境变量,例如 `${ANTHROPIC_API_KEY}`。
3. **默认模型** — 对于 key、本地和 custom provider,接受预设值或输入模型 id。
4. **代理端口** — 默认为 `10100`。
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 5b8c902e5bf..0e8df8f42af 100644
--- a/docs-site/src/content/docs/zh-cn/guides/providers.md
+++ b/docs-site/src/content/docs/zh-cn/guides/providers.md
@@ -181,7 +181,7 @@ Kiro 登录需要 Kiro CLI:Unix 使用 `curl -fsSL https://cli.kiro.dev/instal
## 3. API 密钥目录
-opencodex 内置 99 个预设:82 个密钥预设、13 个 OAuth 预设、3 个本地预设,以及 1 个默认的
+opencodex 内置 100 个预设:83 个密钥预设、13 个 OAuth 预设、3 个本地预设,以及 1 个默认的
ChatGPT 转发预设。仪表盘的 **Add provider** 选择器会打开密钥提供商的控制台,验证并保存密钥。
验证因提供商而异。主要条目包括:
diff --git a/docs-site/src/content/docs/zh-tw/getting-started/quickstart.md b/docs-site/src/content/docs/zh-tw/getting-started/quickstart.md
index d7e601b025e..f0b02c6ab89 100644
--- a/docs-site/src/content/docs/zh-tw/getting-started/quickstart.md
+++ b/docs-site/src/content/docs/zh-tw/getting-started/quickstart.md
@@ -13,7 +13,7 @@ ocx init
`ocx init` 會引導你完成:
-1. **選擇 provider** —— 從內建 registry 的 99 個預設中選擇一個,或選擇 `custom` 手動輸入
+1. **選擇 provider** —— 從內建 registry 的 100 個預設中選擇一個,或選擇 `custom` 手動輸入
base URL 和 adapter。
2. **API key** —— 貼上一個 key,或引用一個環境變數,例如 `${ANTHROPIC_API_KEY}`。
3. **預設模型** —— 對於 API key、本機和 custom provider,可接受預設值或輸入模型 id。
diff --git a/docs-site/src/content/docs/zh-tw/guides/providers.md b/docs-site/src/content/docs/zh-tw/guides/providers.md
index 5d68c93eb51..3b8c18a509e 100644
--- a/docs-site/src/content/docs/zh-tw/guides/providers.md
+++ b/docs-site/src/content/docs/zh-tw/guides/providers.md
@@ -249,7 +249,7 @@ database 並移除目前的 WAL、SHM 與 journal sidecar,再發布先前的 s
## 3. API 金鑰目錄
-opencodex 內建 99 個 preset:82 個 key-based、13 個 OAuth、3 個 local,以及 1 個預設 ChatGPT-forward
+opencodex 內建 100 個 preset:83 個 key-based、13 個 OAuth、3 個 local,以及 1 個預設 ChatGPT-forward
preset。儀表板的 **Add provider** picker 會開啟 key provider 的 dashboard、驗證金鑰並儲存;驗證方式
依 provider 而異。主要條目如下。
diff --git a/gui/public/provider-icons/README.md b/gui/public/provider-icons/README.md
index 7efbbbac919..e53cfda2211 100644
--- a/gui/public/provider-icons/README.md
+++ b/gui/public/provider-icons/README.md
@@ -382,3 +382,12 @@ committing it.
gradient is the brand, so it must never be masked.
- `factory-droid.svg` — Factory Docs favicon, fetched 2026-09-28 from `https://docs.factory.ai/favicon.svg`; unmodified first-party asset for Factory Droid.
+
+## TokenLab (2026-09-29)
+
+- `tokenlab.svg` — TokenLab's "Specimen Split" symbol, `logos/tokenlab-symbol.svg` from the
+ sponsor asset pack TokenLab supplied for its Standard sponsorship (`SPONSORS.md`), committed
+ byte for byte (416 bytes, MD5 `fcb8c1325a34ed52b1dc89eabf08a0e6`), ``/`` included
+ since they do not affect rendering. `viewBox="0 0 48 48"`, one `#151714` ink, so it is
+ **masked** like `packycode.svg`: as an image it vanishes on the dark tile. The pack's reverse
+ symbol (`#F5F5F1`) is the same geometry and is not needed once the mark follows the theme.
diff --git a/gui/public/provider-icons/tokenlab.svg b/gui/public/provider-icons/tokenlab.svg
new file mode 100644
index 00000000000..6c193a9214e
--- /dev/null
+++ b/gui/public/provider-icons/tokenlab.svg
@@ -0,0 +1,8 @@
+
diff --git a/gui/src/components/provider-workspace/ProviderSponsor.tsx b/gui/src/components/provider-workspace/ProviderSponsor.tsx
index 6b52252b91a..621ac4a95b0 100644
--- a/gui/src/components/provider-workspace/ProviderSponsor.tsx
+++ b/gui/src/components/provider-workspace/ProviderSponsor.tsx
@@ -1,8 +1,26 @@
-import { useT } from "../../i18n/shared";
+import { useT, type TKey } from "../../i18n/shared";
import { IconExternal } from "../../icons";
import type { WorkspaceItem } from "../../provider-workspace/catalog";
import { matchingWorkspacePreset, type CatalogPreset } from "../provider-catalog/provider-presets";
+type SponsorBrand = { name: string; title: TKey; description: TKey };
+
+const ORCAROUTER: SponsorBrand = {
+ name: "OrcaRouter", title: "pws.sponsor.orcaTitle", description: "pws.sponsor.orcaDescription",
+};
+
+/**
+ * One row per sponsor preset id. The registry `sponsor` field decides whether a card shows;
+ * this table only supplies the brand name and localized copy, so a preset flagged as a sponsor
+ * without a row here still renders nothing rather than borrowing another sponsor's words.
+ */
+const SPONSOR_BRANDS: Readonly> = {
+ orcarouter: ORCAROUTER,
+ "orcarouter-oauth": ORCAROUTER,
+ packycode: { name: "PackyCode", title: "pws.sponsor.packyTitle", description: "pws.sponsor.packyDescription" },
+ tokenlab: { name: "TokenLab", title: "pws.sponsor.tokenlabTitle", description: "pws.sponsor.tokenlabDescription" },
+};
+
function webLink(value?: string): string | undefined {
if (!value) return undefined;
try {
@@ -16,25 +34,23 @@ function webLink(value?: string): string | undefined {
export default function ProviderSponsor({ item, preset }: { item: WorkspaceItem; preset?: CatalogPreset }) {
const t = useT();
if (!preset?.sponsor || !matchingWorkspacePreset(item, [preset])) return null;
- const brand = preset.id === "orcarouter" || preset.id === "orcarouter-oauth"
- ? "OrcaRouter" : preset.id === "packycode" ? "PackyCode" : undefined;
+ const brand = Object.hasOwn(SPONSOR_BRANDS, preset.id) ? SPONSOR_BRANDS[preset.id] : undefined;
if (!brand) return null;
- const orca = brand === "OrcaRouter";
const visit = webLink(preset.sponsorUrl);
const dashboard = webLink(preset.dashboardUrl);
- return
+ return
Merci à PackyCode pour son soutien à ce projet ! PackyCode est un fournisseur de relais API stable et performant, qui propose des services de relais pour Claude Code, Codex, Gemini et d'autres. Grâce au basculement automatique, au routage intelligent et à une concurrence illimitée, il fait de l'IA un véritable outil de productivité. Inscrivez-vous via ce lien et commencez ! Choisissez PackyCode dans le sélecteur Add provider ou exécutez ocx provider add packycode. PackyCode 是一家稳定、高效的 API 中转服务商,提供 Claude Code、Codex、Gemini 等多种中转服务。具备自动故障转移、智能路由和无限并发等多种功能,让 AI 编程成为真正的生产力工具。点此链接注册,立即开始使用!
+
+
+
Merci à TokenLab pour son soutien à ce projet ! TokenLab donne aux agents de code une seule clé API pour les principaux modèles, avec les formats OpenAI Responses et Chat Completions, Anthropic Messages et l'API native de Gemini, streaming et appel d'outils compris. Il fournit aussi un serveur MCP et des Skills pour agents afin de faciliter l'intégration. Choisissez votre mode de livraison et payez à l'usage. Choisissez TokenLab dans le sélecteur Add provider ou exécutez ocx provider add tokenlab. TokenLab 为编程智能体提供统一的多模型 API,一枚 API Key 即可接入主流模型,支持 OpenAI Responses、Chat Completions、Anthropic Messages 和 Gemini 原生 API 格式,以及流式输出和工具调用。同时提供 MCP 服务器和 Agent Skills,方便接入现有工作流;交付模式可选,按量付费。
diff --git a/readme/README.ko.md b/readme/README.ko.md
index 4facdfd7de1..26eee185dce 100644
--- a/readme/README.ko.md
+++ b/readme/README.ko.md
@@ -153,6 +153,10 @@ Codex Desktop 로그인처럼 다른 계정이 소진된 뒤에만 쓰고 싶은
PackyCode의 후원에 감사합니다. PackyCode는 안정적인 고성능 API 릴레이 프로바이더로, Claude Code, Codex, Gemini 등의 릴레이를 제공합니다. 자동 failover, 스마트 라우팅, 무제한 동시성으로 AI를 실제 생산성 도구로 만듭니다. 이 링크로 등록하고 바로 시작하세요. Add provider 선택기에서 PackyCode를 고르거나 ocx provider add packycode를 실행하세요. PackyCode 是一家稳定、高效的 API 中转服务商,提供 Claude Code、Codex、Gemini 等多种中转服务。具备自动故障转移、智能路由和无限并发等多种功能,让 AI 编程成为真正的生产力工具。点此链接注册,立即开始使用!
+
+
+
TokenLab의 후원에 감사합니다. TokenLab은 코딩 에이전트에게 주요 모델용 API 키 하나를 제공하며, OpenAI Responses와 Chat Completions, Anthropic Messages, Gemini 네이티브 API 형식을 스트리밍과 도구 호출까지 지원합니다. MCP 서버와 에이전트 Skills도 제공해 쉽게 연동할 수 있습니다. 전달 모드를 고르고 쓴 만큼 결제하세요. Add provider 선택기에서 TokenLab을 고르거나 ocx provider add tokenlab을 실행하세요. TokenLab 为编程智能体提供统一的多模型 API,一枚 API Key 即可接入主流模型,支持 OpenAI Responses、Chat Completions、Anthropic Messages 和 Gemini 原生 API 格式,以及流式输出和工具调用。同时提供 MCP 服务器和 Agent Skills,方便接入现有工作流;交付模式可选,按量付费。
+
diff --git a/readme/README.ru.md b/readme/README.ru.md
index c274d4f632b..6732e0f3126 100644
--- a/readme/README.ru.md
+++ b/readme/README.ru.md
@@ -164,6 +164,10 @@ opencodex также умеет управлять **пулом аккаунто
Благодарим PackyCode за спонсорскую поддержку проекта! PackyCode — стабильный высокопроизводительный API-релей, предоставляющий релей-сервисы для Claude Code, Codex, Gemini и других. Автоматический failover, умная маршрутизация и неограниченная конкурентность превращают AI в настоящий инструмент продуктивности. Зарегистрируйтесь по этой ссылке и начните работу! Выберите PackyCode в селекторе Add provider или выполните ocx provider add packycode. PackyCode 是一家稳定、高效的 API 中转服务商,提供 Claude Code、Codex、Gemini 等多种中转服务。具备自动故障转移、智能路由和无限并发等多种功能,让 AI 编程成为真正的生产力工具。点此链接注册,立即开始使用!
+
+
+
Благодарим TokenLab за спонсорскую поддержку проекта! TokenLab даёт агентам для программирования один API-ключ для ведущих моделей с поддержкой форматов OpenAI Responses и Chat Completions, Anthropic Messages и нативного API Gemini, включая стриминг и вызов инструментов. Также доступны MCP-сервер и Skills для агентов, чтобы упростить интеграцию. Выберите режим доставки и платите по мере использования. Выберите TokenLab в селекторе Add provider или выполните ocx provider add tokenlab. TokenLab 为编程智能体提供统一的多模型 API,一枚 API Key 即可接入主流模型,支持 OpenAI Responses、Chat Completions、Anthropic Messages 和 Gemini 原生 API 格式,以及流式输出和工具调用。同时提供 MCP 服务器和 Agent Skills,方便接入现有工作流;交付模式可选,按量付费。
+
diff --git a/readme/README.tr.md b/readme/README.tr.md
index 1a5e35ae823..6e99c74da04 100644
--- a/readme/README.tr.md
+++ b/readme/README.tr.md
@@ -160,6 +160,10 @@ Her yukarı akış protokol değişiminde opencodex'in bakımını sürdürebilm
Bu projeye sponsor olduğu için PackyCode'a teşekkürler! PackyCode, Claude Code, Codex, Gemini ve daha fazlası için aktarma hizmeti sunan istikrarlı ve yüksek başarımlı bir API aktarma sağlayıcısıdır. Otomatik failover, akıllı yönlendirme ve sınırsız eşzamanlılıkla yapay zekâyı gerçek bir üretkenlik aracına dönüştürür. Bu bağlantıdan kaydolun ve hemen başlayın! Add provider seçicisinden PackyCode seçin ya da ocx provider add packycode çalıştırın. PackyCode 是一家稳定、高效的 API 中转服务商,提供 Claude Code、Codex、Gemini 等多种中转服务。具备自动故障转移、智能路由和无限并发等多种功能,让 AI 编程成为真正的生产力工具。点此链接注册,立即开始使用!
+
+
+
Bu projeye sponsor olduğu için TokenLab'a teşekkürler! TokenLab, kodlama ajanlarına önde gelen modeller için tek bir API anahtarı sunar; OpenAI Responses ve Chat Completions, Anthropic Messages ve Gemini'nin yerel API biçimleri, akış ve araç çağırma ile desteklenir. Kolay entegrasyon için bir MCP sunucusu ve ajan Skills'i de sağlar. Teslimat modunuzu seçin, kullandıkça ödeyin. Add provider seçicisinden TokenLab seçin ya da ocx provider add tokenlab çalıştırın. TokenLab 为编程智能体提供统一的多模型 API,一枚 API Key 即可接入主流模型,支持 OpenAI Responses、Chat Completions、Anthropic Messages 和 Gemini 原生 API 格式,以及流式输出和工具调用。同时提供 MCP 服务器和 Agent Skills,方便接入现有工作流;交付模式可选,按量付费。
感谢 PackyCode 赞助本项目!PackyCode 是一家稳定、高性能的 API 中转提供商,为 Claude Code、Codex、Gemini 等提供中转服务。凭借自动故障转移、智能路由和无限并发,它让 AI 成为真正的生产力工具。通过此链接注册并开始使用!在添加提供商选择器中选择 PackyCode,或运行 ocx provider add packycode。 PackyCode 是一家稳定、高效的 API 中转服务商,提供 Claude Code、Codex、Gemini 等多种中转服务。具备自动故障转移、智能路由和无限并发等多种功能,让 AI 编程成为真正的生产力工具。点此链接注册,立即开始使用!
感謝 PackyCode 贊助本專案!PackyCode 是穩定、高效能的 API 轉送供應商,提供 Claude Code、Codex、Gemini 等轉送服務。具備自動 failover、智慧路由與無限並行,讓 AI 成為真正的生產力工具。透過此連結註冊即可開始!在「新增供應商」選擇器選 PackyCode,或執行 ocx provider add packycode。 PackyCode 是一家稳定、高效的 API 中转服务商,提供 Claude Code、Codex、Gemini 等多种中转服务。具备自动故障转移、智能路由和无限并发等多种功能,让 AI 编程成为真正的生产力工具。点此链接注册,立即开始使用!