Skip to content

Commit be177ea

Browse files
authored
Merge pull request #761 from Wibias/fix/alias-versioned-tilde-encoding
fix(claude): version slash/tilde aliases under claude-ocx2-
2 parents 350a07b + 0afaf7f commit be177ea

7 files changed

Lines changed: 159 additions & 95 deletions

File tree

docs-site/src/content/docs/guides/claude-code.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ with `claude` or `anthropic`, opencodex exposes routed models as stable, reversi
175175

176176
| Surface | Format | Example |
177177
| --- | --- | --- |
178-
| Claude Code CLI | `claude-ocx-<provider>--<model>` | `claude-ocx-native--gpt-5.6-sol` |
178+
| Claude Code CLI | `claude-ocx-<provider>--<model>` (plain) or `claude-ocx2-…` (escaped) | `claude-ocx-native--gpt-5.6-sol` |
179179
| Claude Desktop 3P | `claude-opus-4-8-<code>` (3-char base36 hash) | `claude-opus-4-8-ncb` |
180180

181181
The proxy picks the family per request: `?ids=cli` or `?ids=desktop` wins; otherwise the
@@ -200,11 +200,13 @@ slots via
200200
`ANTHROPIC_MODEL` or type any routed id with `/model` (Claude Code passes strings through).
201201

202202
**Alias grammar rules:** provider must not contain `/` or `--` or equal `native`.
203-
Model ids may contain `/` — encoded as `~s` in the alias (e.g. `openrouter/anthropic/claude-opus-4-8`
204-
`claude-ocx-openrouter--anthropic~sclaude-opus-4-8`). Literal `~` in a model id is encoded as `~t`.
205-
Bare `~` not followed by `s`/`t` is treated as a literal tilde so older persisted aliases keep resolving.
206-
Routes the readable form cannot express fall back to the hashed alias. Model ids MAY contain `--`
207-
(resolution splits on the first `--` only); native slugs containing `--` fall back to the hashed form.
203+
Plain model ids (no `/` or `~`) keep the v1 prefix `claude-ocx-…`. Model ids that contain `/` or
204+
`~` mint the v2 prefix `claude-ocx2-…` with escapes (`/``~s`, `~``~t`), e.g.
205+
`openrouter/anthropic/claude-opus-4-8``claude-ocx2-openrouter--anthropic~sclaude-opus-4-8`.
206+
v1 aliases decode literally (so a historical model id that contained the two-char sequences
207+
`~s` / `~t` is preserved); v2 aliases expand the escapes. Routes that the readable form cannot
208+
express fall back to the hashed alias. Model ids MAY contain `--` (resolution splits on the first
209+
`--` only); native slugs containing `--` fall back to the hashed form.
208210

209211
**Model resolution order:** `[1m]` marker stripped → readable alias decoded → Desktop hashed
210212
alias decoded → `modelMap` exact match → date-stripped match (`-20250514` removed) → passthrough.

docs-site/src/content/docs/ja/guides/claude-code.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ Claude Code 2.1.129 以降は `GET /v1/models?limit=1000` でゲートウェイ
6868
受け付けるため、opencodex はルーティングモデルを安定で元に戻せるエイリアスとして公開します。
6969

7070
| 画面 | 形式 ||
71-
--- | --- | --- |
72-
| Claude Code CLI | `claude-ocx-<provider>--<model>` | `claude-ocx-native--gpt-5.6-sol` |
71+
| --- | --- | --- |
72+
| Claude Code CLI | `claude-ocx-<provider>--<model>` (plain) または `claude-ocx2-…` (escaped) | `claude-ocx-native--gpt-5.6-sol` |
7373
| Claude Desktop 3P | `claude-opus-4-8-<code>` (3 桁の base36 ハッシュ) | `claude-opus-4-8-ncb` |
7474

7575
プロキシはリクエストごとに系列を選びます。`?ids=cli` または `?ids=desktop` が優先し、指定しないと
@@ -82,12 +82,13 @@ Claude Desktop のフッターピッカーで実行中の 3P 会話のモデル
8282
含まれるモデル ID をルーティングします。結果は **Logs → requestedModel** で確認できます。
8383

8484
**エイリアス構文ルール:** provider には `/``--` を含められず `native` と同じでもいけません。
85-
model ID には `/` を含められ、エイリアス内では `~s` として符号化します(例: `openrouter/anthropic/claude-opus-4-8`
86-
`claude-ocx-openrouter--anthropic~sclaude-opus-4-8`)。model ID のリテラル `~``~t` として符号化します。
87-
`s`/`t` が続かない裸の `~` はリテラルのチルダとして扱い、古い永続化エイリアスも解決し続けます。
88-
読みやすい形式で表現できないルートはハッシュエイリアスに置き換えます。モデル
89-
ID には `--` を含め**られます**(解析時は最初の `--` だけを基準に分割します)。`--` を含む
90-
ネイティブスラッグはハッシュ形式に置き換えます。
85+
`/``~` も含まない plain な model ID は v1 接頭辞 `claude-ocx-…` のままです。`/` または `~` を含む
86+
model ID は v2 接頭辞 `claude-ocx2-…` で発行し、エスケープします(`/``~s``~``~t`)。例:
87+
`openrouter/anthropic/claude-opus-4-8``claude-ocx2-openrouter--anthropic~sclaude-opus-4-8`
88+
v1 エイリアスはリテラルにデコードします(歴史的に model ID に含まれていた 2 文字列 `~s` / `~t` も保持)。
89+
v2 エイリアスはエスケープを展開します。読みやすい形式で表現できないルートはハッシュエイリアスに
90+
置き換えます。モデル ID には `--` を含め**られます**(解析時は最初の `--` だけを基準に分割します)。
91+
`--` を含むネイティブスラッグはハッシュ形式に置き換えます。
9192

9293
**モデル解決順序:** `[1m]` 標識の削除 → 読みやすいエイリアスのデコード → Desktop ハッシュエイリアスのデコード →
9394
`modelMap` の完全一致 → 日付を削除した値との一致(`-20250514` 削除) → パススルー順です。

docs-site/src/content/docs/ko/guides/claude-code.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ Claude Code 2.1.129 이상은 `GET /v1/models?limit=1000`에서 게이트웨이
104104

105105
| 화면 | 형식 | 예시 |
106106
| --- | --- | --- |
107-
| Claude Code CLI | `claude-ocx-<provider>--<model>` | `claude-ocx-native--gpt-5.6-sol` |
107+
| Claude Code CLI | `claude-ocx-<provider>--<model>` (plain) 또는 `claude-ocx2-…` (escaped) | `claude-ocx-native--gpt-5.6-sol` |
108108
| Claude Desktop 3P | `claude-opus-4-8-<code>` (3자리 base36 해시) | `claude-opus-4-8-ncb` |
109109

110110
프록시는 요청마다 계열을 골라요. `?ids=cli` 또는 `?ids=desktop`이 우선하고, 지정하지 않으면
@@ -116,13 +116,14 @@ Claude Desktop의 하단 선택기로 이미 실행 중인 3P 대화의 모델
116116
`/model <id>`를 사용하세요. OpenCodex는 선택기 상태를 따로 볼 수 없고 각 요청에 실린 모델 ID를
117117
라우팅해요. 적용 결과는 **Logs → requestedModel**에서 확인할 수 있어요.
118118

119-
**별칭 문법 규칙:** provider에는 `/``--`를 넣을 수 없고 `native`와 같아도 안 돼요. model ID에
120-
`/`가 있으면 별칭에서 `~s`로 인코딩해요(예: `openrouter/anthropic/claude-opus-4-8`
121-
`claude-ocx-openrouter--anthropic~sclaude-opus-4-8`). model ID의 리터럴 `~``~t`로 인코딩해요.
122-
`s`/`t`가 따르지 않는 단독 `~`는 예전 설정과의 호환을 위해 리터럴 `~`로 해석해요. 읽기 쉬운
123-
형식으로 표현할 수 없는 라우트는 해시 별칭으로 대체해요. 모델 ID에는 `--`를 넣을 **수 있어요**
124-
(해석할 때 첫 번째 `--`만 기준으로 나눠요). `--`가 포함된 네이티브 슬러그는 해시 형식으로
125-
대체해요.
119+
**별칭 문법 규칙:** provider에는 `/``--`를 넣을 수 없고 `native`와 같아도 안 돼요. `/``~`
120+
없는 plain model ID는 v1 접두사 `claude-ocx-…`를 유지해요. `/` 또는 `~`가 있는 model ID는 v2
121+
접두사 `claude-ocx2-…`로 만들고 이스케이프해요(`/``~s`, `~``~t`). 예:
122+
`openrouter/anthropic/claude-opus-4-8``claude-ocx2-openrouter--anthropic~sclaude-opus-4-8`.
123+
v1 별칭은 리터럴로 디코딩해요(예전 model ID에 들어 있던 두 글자 시퀀스 `~s` / `~t`도 그대로 보존).
124+
v2 별칭은 이스케이프를 펼쳐요. 읽기 쉬운 형식으로 표현할 수 없는 라우트는 해시 별칭으로 대체해요.
125+
모델 ID에는 `--`를 넣을 **수 있어요**(해석할 때 첫 번째 `--`만 기준으로 나눠요). `--`가 포함된
126+
네이티브 슬러그는 해시 형식으로 대체해요.
126127

127128
**모델 해석 순서:** `[1m]` 표식 제거 → 읽기 쉬운 별칭 디코딩 → Desktop 해시 별칭 디코딩 →
128129
`modelMap` 정확히 일치 → 날짜를 제거한 값과 일치(`-20250514` 제거) → 패스스루 순서예요.

docs-site/src/content/docs/ru/guides/claude-code.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ Claude Code 2.1.129+ обнаруживает модели шлюза через
7474

7575
| Интерфейс | Формат | Пример |
7676
| --- | --- | --- |
77-
| Claude Code CLI | `claude-ocx-<provider>--<model>` | `claude-ocx-native--gpt-5.6-sol` |
77+
| Claude Code CLI | `claude-ocx-<provider>--<model>` (plain) или `claude-ocx2-…` (escaped) | `claude-ocx-native--gpt-5.6-sol` |
7878
| Claude Desktop 3P | `claude-opus-4-8-<code>` (3-символьный base36-хеш) | `claude-opus-4-8-ncb` |
7979

8080
Прокси выбирает семейство для каждого запроса: приоритет у `?ids=cli` или `?ids=desktop`; иначе
@@ -87,13 +87,14 @@ user-agent `claude-code/*` получает читаемую CLI-форму, а
8787
маршрутизирует id модели из каждого запроса. Результат можно проверить в **Logs → requestedModel**.
8888

8989
**Правила грамматики алиасов:** provider не может содержать `/` или `--` и не может быть равен
90-
`native`. Id моделей могут содержать `/` — в алиасе это кодируется как `~s` (например,
91-
`openrouter/anthropic/claude-opus-4-8``claude-ocx-openrouter--anthropic~sclaude-opus-4-8`).
92-
Литеральный `~` в id модели кодируется как `~t`. Голый `~` без следующего `s`/`t`
93-
считается литеральной тильдой, чтобы старые сохранённые алиасы продолжали разрешаться.
94-
Маршруты, которые невозможно выразить читаемой формой,
95-
откатываются на хешированный алиас. Id моделей МОГУТ содержать `--` (при разрешении разбиение
96-
выполняется только по первому `--`); нативные слаги с `--` откатываются на хешированную форму.
90+
`native`. Обычные id моделей (без `/` и `~`) остаются с префиксом v1 `claude-ocx-…`. Id с `/`
91+
или `~` выпускаются с префиксом v2 `claude-ocx2-…` и экранированием (`/``~s`, `~``~t`),
92+
например `openrouter/anthropic/claude-opus-4-8`
93+
`claude-ocx2-openrouter--anthropic~sclaude-opus-4-8`. Алиасы v1 декодируются литерально (исторические
94+
двухсимвольные последовательности `~s` / `~t` в id модели сохраняются); алиасы v2 раскрывают
95+
экранирование. Маршруты, которые невозможно выразить читаемой формой, откатываются на
96+
хешированный алиас. Id моделей МОГУТ содержать `--` (при разрешении разбиение выполняется только
97+
по первому `--`); нативные слаги с `--` откатываются на хешированную форму.
9798

9899
**Порядок разрешения модели:** удаление маркера `[1m]` → декодирование читаемого алиаса →
99100
декодирование Desktop-хеша → точное совпадение в `modelMap` → совпадение без даты (удаляется

docs-site/src/content/docs/zh-cn/guides/claude-code.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ opencodex 会将已路由模型公开为稳定且可逆的别名:
7777

7878
| 界面 | 格式 | 示例 |
7979
| --- | --- | --- |
80-
| Claude Code CLI | `claude-ocx-<provider>--<model>` | `claude-ocx-native--gpt-5.6-sol` |
80+
| Claude Code CLI | `claude-ocx-<provider>--<model>`(plain)或 `claude-ocx2-…`(escaped) | `claude-ocx-native--gpt-5.6-sol` |
8181
| Claude Desktop 3P | `claude-opus-4-8-<code>`(3 字符 base36 哈希) | `claude-opus-4-8-ncb` |
8282

8383
代理会按请求选择别名族:`?ids=cli``?ids=desktop` 优先;否则,`claude-code/*`
@@ -89,11 +89,12 @@ user-agent 会获得易读的 CLI 形式,其他客户端会获得 Desktop 哈
8989
**Logs → requestedModel** 中确认结果。
9090

9191
**别名语法规则:**provider 不得包含 `/``--`,也不得等于 `native`
92-
model ID 可以包含 `/` — 在别名中编码为 `~s`(例如 `openrouter/anthropic/claude-opus-4-8`
93-
`claude-ocx-openrouter--anthropic~sclaude-opus-4-8`)。model ID 中的字面 `~` 编码为 `~t`
94-
后面不是 `s`/`t` 的裸 `~` 视为字面波浪号,以便旧版已持久化的别名继续解析。
95-
易读形式无法表达的路由会回退到哈希别名。模型 ID **可以**包含 `--`(解析时只按第一个
96-
`--` 分割);含 `--` 的原生 slug 会回退到哈希形式。
92+
不含 `/``~` 的普通 model ID 继续使用 v1 前缀 `claude-ocx-…`。包含 `/``~` 的 model ID
93+
会使用 v2 前缀 `claude-ocx2-…` 并转义(`/``~s``~``~t`),例如
94+
`openrouter/anthropic/claude-opus-4-8``claude-ocx2-openrouter--anthropic~sclaude-opus-4-8`
95+
v1 别名按字面解码(历史上 model ID 中包含的两字符序列 `~s` / `~t` 会被保留);v2 别名会展开转义。
96+
易读形式无法表达的路由会回退到哈希别名。模型 ID **可以**包含 `--`(解析时只按第一个 `--` 分割);
97+
`--` 的原生 slug 会回退到哈希形式。
9798

9899
**模型解析顺序:**移除 `[1m]` 标记 → 解码易读别名 → 解码 Desktop 哈希别名 →
99100
`modelMap` 精确匹配 → 移除日期后的匹配(移除 `-20250514`)→ 透传。

0 commit comments

Comments
 (0)