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
2 changes: 1 addition & 1 deletion docs-site/src/content/docs/fr/guides/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ niveaux. Dans ces cas, le commutateur est verrouillé afin que rien ne soit modi
**OMP** n'est pas affecté non plus par les modifications voisines, mais pour une autre raison : son outil
d'écriture ne modifie, octet par octet, que sa propre plage `providers.opencodex` ; le reste du fichier
n'est jamais réécrit. Pour les autres formats susceptibles de contenir des commentaires (Hermes, OpenClaw,
Kimi Code, Gajae Code, MiniMax Code, ZCode, Prime Agent, Aside et Raycast — documents YAML, JSON5 et TOML réécrits en entier), ou lorsque les propres entrées
Kimi Code, Gajae Code, MiniMax Code et Raycast — documents YAML, JSON5 et TOML réécrits en entier), ou lorsque les propres entrées
d'opencodex ont été modifiées, le commutateur se verrouille et la désactivation est refusée plutôt que de
deviner quelles modifications vous appartiennent.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,24 @@ avec un contexte de `922000` et une entrée maximale de `922000` ; OpenRouter i
}
```

## Éditeur de noms d'affichage des modèles

Dans le tableau de bord, **Models** permet d'enregistrer durablement des noms lisibles pour les modèles découverts. Développez le fournisseur,
repérez un modèle découvert et choisissez **Name**. La boîte de dialogue garde le sélecteur exact
`provider/model` visible pendant que vous enregistrez un libellé lisible. Choisissez **Reset name**
pour revenir aux métadonnées du fournisseur ou au sélecteur utilisé par défaut. **Name** ne change
que l'affichage ; le crayon distinct consacré à l'alias modifie l'alias court de routage et n'est
pas un éditeur de nom d'affichage. Les lignes OpenAI natives et celles des modèles personnalisés
conservent leurs commandes existantes.

Si la modification est enregistrée mais que l'actualisation échoue, la boîte de dialogue reflète
la valeur enregistrée et garde **Retry** disponible. Retry relance la convergence du catalogue
si le serveur a signalé son échec, ou recharge la liste si seule la requête de liste a échoué.
La reprise d'une réinitialisation conserve cette opération ; elle ne rétablit pas l'ancien nom.
Les requêtes ont un délai maximal de 60 secondes couvrant l'écriture et l'actualisation de la liste
qui suit. Un dépassement de délai n'annule pas une écriture : utilisez **Retry** pour vérifier
le nom actuel avant d'effectuer une autre modification.

## Exemple complet

```json
Expand Down
24 changes: 16 additions & 8 deletions docs-site/src/content/docs/guides/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,22 @@ One caveat specific to Aside: the running app rewrites `models.json` itself, so
fully quit and reopen Aside after applying, the same way Claude Desktop needs a
restart. Aside's block is loopback-only and never carries a real credential.

Raycast has two prerequisites. Custom Providers is a **Raycast Pro** feature: on a
free plan the file is still written, but `ocx integration client status --client
raycast` and the Integrations page report a warning, because Raycast will not
read it. And Raycast only creates its `ai` folder when you open Raycast →
Settings → AI → **Reveal Providers Config** once; opencodex uses that folder as
the install signal and reports the client as not installed until then. Raycast
reads `~/.config/raycast/ai/providers.yaml` on macOS and Windows alike and does
not honor `XDG_CONFIG_HOME`, so that path is not relocatable.
The managed Raycast integration supports **macOS and Windows**. Custom Providers
is a **Raycast Pro** feature: on a free plan the file is still written, but
`ocx integration client status --client raycast` and the Integrations page report
a warning, because Raycast will not read it. On macOS or Windows, open Raycast →
Settings → AI → **Reveal Providers Config** once so the `ai` folder exists.
On these supported platforms, opencodex uses that folder as its install signal
and reports the client as not installed until it exists. Linux is unsupported,
even if the folder exists.

The status field `aiDirPresent` reports only whether `~/.config/raycast/ai` exists,
independently of whether the Raycast app is installed or the platform is supported.
It does not prove that Raycast is installed or usable. The CLI prints `plan` on a
separate line and adds the macOS/Windows setup instruction when `aiDirPresent` is
false; `--json` preserves the raw status, including the nested `raycast` block.
Raycast reads `~/.config/raycast/ai/providers.yaml` on macOS and Windows alike and
does not honor `XDG_CONFIG_HOME`, so that path is not relocatable.

The managed block is one element, `id: opencodex`, in the file's `providers`
sequence: `name: OpenCodex`, `base_url: http://<host>:<port>/v1`, and every
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,22 @@ Vercel AI Gateway は、1 つのモデルを複数の基盤となる推論プロ
}
```

## モデルの表示名エディター

ダッシュボードの **Models** では、検出されたモデルに読みやすい名前を付けて永続的に保存できます。プロバイダーを展開し、検出された
モデルを見つけて **Name** を選択します。読みやすい名前を保存する間も、ダイアログには正確な
`provider/model` セレクターが表示されます。**Reset name** を選ぶと、プロバイダーのメタデータ、
または通常のセレクター表示に戻ります。**Name** が変更するのは表示だけです。別のエイリアス用
鉛筆アイコンは短いルーティングエイリアスを変更するもので、表示名エディターではありません。
ネイティブ OpenAI とカスタムモデルの行では、既存の操作方法が維持されます。

変更は保存されたものの更新に失敗した場合、ダイアログは保存済みの上書き設定を反映し、**Retry** を
引き続き利用できます。サーバーがカタログの収束処理の失敗を報告した場合、Retry はその処理を再実行し、
一覧取得のリクエストだけが失敗した場合は一覧を再読み込みします。リセット後の復旧でもリセット操作を
維持し、以前の名前には戻しません。リクエストには、書き込みとその後の一覧更新を合わせて 60 秒の
期限があります。タイムアウトしても書き込みは取り消されません。次の変更を行う前に **Retry** で
現在の名前を確認してください。

## 完全な例

```json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,20 @@ Vercel AI Gateway는 하나의 모델을 여러 기반 추론 공급자에 걸
}
```

## 모델 표시 이름 편집기

대시보드의 **Models**에서 발견된 모델의 읽기 쉬운 이름을 저장해 유지할 수 있습니다. 공급자를 펼치고 발견된 모델을
찾아 **Name**을 선택하세요. 읽기 쉬운 이름을 저장하는 동안에도 대화 상자는 정확한 `provider/model`
선택자를 표시합니다. **Reset name**을 선택하면 공급자 메타데이터 또는 기본 선택자 표시로 돌아갑니다.
**Name**은 표시만 바꿉니다. 별도의 별칭 연필 아이콘은 짧은 라우팅 별칭을 바꾸며, 표시 이름 편집기가
아닙니다. 네이티브 OpenAI와 사용자 지정 모델 행은 기존 조작 방식을 유지합니다.

변경은 저장됐지만 새로고침에 실패하면 대화 상자는 저장된 재정의를 반영하고 **Retry**를 계속 제공합니다.
서버가 카탈로그 수렴 실패를 보고했다면 Retry는 수렴을 다시 실행하고, 목록 요청만 실패했다면 목록을
다시 불러옵니다. 초기화 후 복구는 초기화 작업을 유지하며 이전 이름을 복원하지 않습니다. 요청에는
쓰기와 후속 목록 새로고침을 모두 포함하는 60초 제한이 있습니다. 시간 초과가 쓰기를 취소하지는 않습니다.
다른 변경을 하기 전에 **Retry**로 현재 이름을 확인하세요.

## 전체 예시

```json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,24 @@ Pool/Direct рекламирует `922000`; синхронизированны
}
```

## Редактор отображаемых имён моделей

На странице **Models** в дашборде можно задать понятные имена для обнаруженных моделей и сохранить их для дальнейшего использования. Разверните провайдера,
найдите обнаруженную модель и выберите **Name**. При сохранении понятной подписи диалог оставляет
видимым точный селектор `provider/model`. Выберите **Reset name**, чтобы вернуться к metadata
провайдера или обычному селектору, используемому по умолчанию. **Name** меняет только отображение;
отдельный значок карандаша для alias меняет короткий routing alias и не является редактором
отображаемого имени. Нативные строки OpenAI и строки пользовательских моделей сохраняют
существующие элементы управления.

Если изменение сохранено, но обновление не удалось, диалог отражает сохранённое переопределение
и оставляет **Retry** доступным. Retry повторяет приведение каталога к согласованному состоянию,
если сервер сообщил о сбое этого процесса, или перезагружает список, если не удался только запрос
списка. Восстановление после сброса сохраняет операцию сброса и не возвращает старое имя.
Для запросов действует общий срок в 60 секунд, включающий запись и последующее обновление списка.
Тайм-аут не отменяет запись: используйте **Retry**, чтобы проверить текущее имя перед следующим
изменением.

## Полный пример

```json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -518,6 +518,23 @@ bildirir; senkronize edilen katalog `xhigh`'ı ayrı tutarken `max` bildirir.
}
```

## Model görünen adı düzenleyicisi

Kontrol panelindeki **Models**, keşfedilen modeller için okunabilir adları kalıcı olarak kaydetmenizi sağlar. Sağlayıcıyı genişletin, keşfedilen
bir modeli bulun ve **Name** seçeneğini seçin. Okunabilir bir etiket kaydederken iletişim kutusu
tam `provider/model` seçicisini görünür tutar. Sağlayıcı meta verilerine veya varsayılan seçici
gösterimine dönmek için **Reset name** seçeneğini seçin. **Name** yalnızca görünümü değiştirir;
ayrı takma ad kalemi kısa yönlendirme takma adını değiştirir ve bir görünen ad düzenleyicisi
değildir. Yerel OpenAI ve özel model satırları mevcut kontrollerini korur.

Değişiklik kaydedildiği halde yenileme başarısız olursa iletişim kutusu kaydedilen geçersiz kılma
değerini yansıtır ve **Retry** kullanılabilir kalır. Sunucu katalog yakınsamasının başarısız
olduğunu bildirdiyse Retry bu işlemi tekrarlar; yalnızca liste isteği başarısız olduysa listeyi
yeniden yükler. Sıfırlama sonrası kurtarma, sıfırlama işlemini korur ve eski adı geri getirmez.
İsteklerin, yazma işlemini ve ardından gelen liste yenilemesini kapsayan 60 saniyelik bir süresi
vardır. Zaman aşımı yazma işlemini geri almaz: başka bir değişiklik yapmadan önce **Retry** ile
geçerli adı kontrol edin.

## Tam örnek

```json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,18 @@ Vercel AI Gateway 可以在多个底层推理提供者之间路由一个模型
}
```

## 模型显示名称编辑器

仪表板的 **Models** 可让你为已发现的模型持久保存易读名称。展开提供者,找到一个已发现的模型,然后选择 **Name**。
保存易读名称时,对话框会一直显示精确的 `provider/model` 选择器。选择 **Reset name** 可恢复为
提供者元数据中的名称,或默认的选择器显示。**Name** 只改变显示;单独的别名铅笔图标用于修改
短路由别名,并不是显示名称编辑器。原生 OpenAI 和自定义模型条目保留现有控件。

如果更改已保存但刷新失败,对话框会反映已保存的覆盖值,并继续提供 **Retry**。如果服务器报告
目录收敛失败,Retry 会重新执行目录收敛;如果只是列表请求失败,则重新加载列表。重置后的恢复
会保留重置操作,不会恢复旧名称。请求的总时限为 60 秒,涵盖写入及后续的列表刷新。超时不会撤销
写入:进行其他更改前,请使用 **Retry** 检查当前名称。

## 完整示例

```json
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,18 @@ Vercel AI Gateway 可在多個底層推論供應商之間路由一個模型。`v
}
```

## 模型顯示名稱編輯器

儀表板的 **Models** 可讓你為已探索到的模型持久儲存易讀名稱。展開供應商,找到已探索到的模型,然後選擇 **Name**。
儲存易讀名稱時,對話方塊會持續顯示精確的 `provider/model` 選擇器。選擇 **Reset name** 可回到
供應商中繼資料中的名稱,或預設的選擇器顯示。**Name** 只改變顯示;獨立的別名鉛筆圖示用來修改
短路由別名,並不是顯示名稱編輯器。原生 OpenAI 與自訂模型列保留既有控制項。

若變更已儲存但重新整理失敗,對話方塊會反映已儲存的覆寫值,並繼續提供 **Retry**。若伺服器回報
目錄收斂失敗,Retry 會重新執行目錄收斂;若只有清單請求失敗,則重新載入清單。重設後的復原
會保留重設操作,不會還原舊名稱。請求的總期限為 60 秒,涵蓋寫入及後續的清單重新整理。逾時不會
撤銷寫入:進行其他變更前,請使用 **Retry** 檢查目前名稱。

## 完整範例

```json
Expand Down
2 changes: 1 addition & 1 deletion src/cli/integrations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ function singleClientStatusLines(result: unknown): string[] {
const rest = Object.fromEntries(Object.entries(result as Record<string, unknown>).filter(([key]) => key !== "raycast"));
const lines = [...summaryLines(rest), `plan: ${raycast.plan}`];
if (!raycast.aiDirPresent) {
lines.push('Open Raycast → Settings → AI → "Reveal Providers Config" once so the ai folder exists.');
lines.push('On macOS or Windows, open Raycast → Settings → AI → "Reveal Providers Config" once so the ai folder exists.');
}
return lines;
}
Expand Down
39 changes: 39 additions & 0 deletions tests/cli/cli-headless-parity.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,45 @@ describe("headless GUI parity CLI", () => {
expect(runtime.requests[1]).toEqual({ path: "/api/grok/selection", method: "PUT", body: { excluded: ["b"] } });
});

for (const plan of ["pro", "free", "unknown"] as const) {
for (const aiDirPresent of [true, false]) {
test(`Raycast status keeps plan ${plan} separate with aiDirPresent=${aiDirPresent}`, async () => {
const payload = {
clientId: "raycast",
installed: aiDirPresent,
raycast: { plan, aiDirPresent },
};
const runtime = fakeRuntime(() => payload);
const logSpy = spyOn(console, "log").mockImplementation(() => {});
try {
expect(await handleClientIntegrationCommand(["status", "--client", "raycast"], runtime.deps)).toBe(0);
const out = logSpy.mock.calls.map(call => String(call[0])).join("\n");
const lines = out.split("\n");
expect(lines.filter(line => line.startsWith("plan:"))).toEqual([`plan: ${plan}`]);
expect(out).not.toContain("raycast.");
if (aiDirPresent) {
expect(out).not.toContain("Reveal Providers Config");
} else {
expect(lines).toContain('On macOS or Windows, open Raycast → Settings → AI → "Reveal Providers Config" once so the ai folder exists.');
}

logSpy.mockClear();
expect(await handleClientIntegrationCommand(["status", "--client", "raycast", "--json"], runtime.deps)).toBe(0);
expect(logSpy.mock.calls).toHaveLength(1);
const jsonOut = String(logSpy.mock.calls[0]![0]);
expect(JSON.parse(jsonOut)).toEqual(payload);
expect(jsonOut).not.toContain("Reveal Providers Config");
expect(runtime.requests).toEqual([
{ path: "/api/client-integrations/raycast", method: "GET", body: null },
{ path: "/api/client-integrations/raycast", method: "GET", body: null },
]);
} finally {
logSpy.mockRestore();
}
});
}
}

test("client integration toggles hit the exact management routes", async () => {
const runtime = fakeRuntime();
expect(await handleClientIntegrationCommand(["enable", "--client", "hermes", "--json"], runtime.deps)).toBe(0);
Expand Down
Loading