From 77d1955607eeff674aafee0aad796ff921edfebf Mon Sep 17 00:00:00 2001 From: Lukin Date: Sat, 4 Jul 2026 22:35:26 +0800 Subject: [PATCH] Polish admin settings layout Co-Authored-By: Codex --- apps/admin/src/locales/en.json | 9 + apps/admin/src/locales/ja.json | 9 + apps/admin/src/locales/ko.json | 9 + apps/admin/src/locales/zh-hans.json | 9 + apps/admin/src/locales/zh-hant.json | 9 + apps/admin/src/routes/settings/+page.svelte | 866 +++++++++++--------- package.json | 2 +- 7 files changed, 502 insertions(+), 411 deletions(-) diff --git a/apps/admin/src/locales/en.json b/apps/admin/src/locales/en.json index fc85af48..59ea4271 100644 --- a/apps/admin/src/locales/en.json +++ b/apps/admin/src/locales/en.json @@ -128,6 +128,7 @@ "Clean now": "Clean now", "Cleaning…": "Cleaning…", "Cleanup failed": "Cleanup failed", + "Cleanup schedule": "Cleanup schedule", "Cleanup settings are saved with the “Save settings” button below.": "Cleanup settings are saved with the “Save settings” button below.", "Clear": "Clear", "Clear proxy": "Clear proxy", @@ -430,11 +431,13 @@ "Loading…": "Loading…", "Log level": "Log level", "Logging": "Logging", + "Logs and captured request detail.": "Logs and captured request detail.", "Manage": "Manage", "Manage account": "Manage account", "Manage memory": "Manage memory", "Manage the long-term memory the gateway has learned — the discrete facts it remembers and the per-scope reflections it merges. Browse by scope or by key, then edit or remove what it keeps.": "Manage the long-term memory the gateway has learned — the discrete facts it remembers and the per-scope reflections it merges. Browse by scope or by key, then edit or remove what it keeps.", "Management plane only — do not feed production traffic.": "Management plane only — do not feed production traffic.", + "Maintenance actions": "Maintenance actions", "Master switch. When off, nothing is deleted automatically.": "Master switch. When off, nothing is deleted automatically.", "Match a single end-user by their ID.": "Match a single end-user by their ID.", "Match every request from one organization.": "Match every request from one organization.", @@ -521,6 +524,7 @@ "Online": "Online", "Open in new tab": "Open in new tab", "Open navigation": "Open navigation", + "Observability": "Observability", "OpenAI / Anthropic SDK": "OpenAI / Anthropic SDK", "OpenClaw": "OpenClaw", "Operations": "Operations", @@ -612,6 +616,7 @@ "Request trail": "Request trail", "Requested": "Requested", "Requested model": "Requested model", + "Retention windows": "Retention windows", "Requests": "Requests", "Requests per minute (RPM)": "Requests per minute (RPM)", "Require JSON": "Require JSON", @@ -652,6 +657,7 @@ "Route this account’s upstream traffic through a proxy so it egresses from a distinct IP. Leave unset for a direct connection.": "Route this account’s upstream traffic through a proxy so it egresses from a distinct IP. Leave unset for a direct connection.", "Routes the gateway's calls to this provider (token exchange, refresh, API traffic) and is saved to this account. The sign-in page you open in your browser is not proxied.": "Routes the gateway's calls to this provider (token exchange, refresh, API traffic) and is saved to this account. The sign-in page you open in your browser is not proxied.", "Routing": "Routing", + "Routing, limits, queues, and request shaping.": "Routing, limits, queues, and request shaping.", "Routing trail for each request — classification layer, lane, served model, fallbacks, cost and errors. Keys are shown by prefix only.": "Routing trail for each request — classification layer, lane, served model, fallbacks, cost and errors. Keys are shown by prefix only.", "Rows per page": "Rows per page", "RPM": "RPM", @@ -668,6 +674,7 @@ "Running": "Running", "Runs user-message requests to the same OAuth account one at a time with a minimum gap, to avoid tripping upstream rate limits. Tool results and assistant continuations are never queued.": "Runs user-message requests to the same OAuth account one at a time with a minimum gap, to avoid tripping upstream rate limits. Tool results and assistant continuations are never queued.", "Runs VACUUM once a day to reclaim deleted disk space. The database is briefly locked while it runs.": "Runs VACUUM once a day to reclaim deleted disk space. The database is briefly locked while it runs.", + "Runtime settings that take effect immediately, no restart needed.": "Runtime settings that take effect immediately, no restart needed.", "Runtime settings that take effect immediately — no restart needed.": "Runtime settings that take effect immediately — no restart needed.", "Save": "Save", "Save and connect. ChatGPT opens a Helm login page — paste a Helm API key to authorize; the connection is scoped to the account behind that key.": "Save and connect. ChatGPT opens a Helm login page — paste a Helm API key to authorize; the connection is scoped to the account behind that key.", @@ -755,6 +762,7 @@ "The verdict that routed this request — the badge shows which layer decided it.": "The verdict that routed this request — the badge shows which layer decided it.", "Then apply actions:": "Then apply actions:", "Then force the lane:": "Then force the lane:", + "These actions run immediately and do not wait for Save settings.": "These actions run immediately and do not wait for Save settings.", "These snippets include your API key. Copy what you need now and keep it private.": "These snippets include your API key. Copy what you need now and keep it private.", "These snippets include your new key, shown only this once. Copy what you need now — we store only a hash, so it cannot be recovered later.": "These snippets include your new key, shown only this once. Copy what you need now — we store only a hash, so it cannot be recovered later.", "These two settings are saved to the gateway when you click Save.": "These two settings are saved to the gateway when you click Save.", @@ -787,6 +795,7 @@ "Tokens by model": "Tokens by model", "Tokens generated per second (output ÷ generation time), averaged over streamed requests.": "Tokens generated per second (output ÷ generation time), averaged over streamed requests.", "Tokens per minute (TPM)": "Tokens per minute (TPM)", + "Traffic controls": "Traffic controls", "tool call": "tool call", "Total": "Total", "Total cost": "Total cost", diff --git a/apps/admin/src/locales/ja.json b/apps/admin/src/locales/ja.json index 099c6749..f17bcdbf 100644 --- a/apps/admin/src/locales/ja.json +++ b/apps/admin/src/locales/ja.json @@ -128,6 +128,7 @@ "Clean now": "今すぐクリーンアップ", "Cleaning…": "クリーンアップ中…", "Cleanup failed": "クリーンアップに失敗しました", + "Cleanup schedule": "クリーンアップスケジュール", "Cleanup settings are saved with the “Save settings” button below.": "クリーンアップ設定は、下の設定を保存ボタンで保存されます。", "Clear": "クリア", "Clear proxy": "プロキシをクリア", @@ -430,11 +431,13 @@ "Loading…": "読み込み中…", "Log level": "ログレベル", "Logging": "ログ記録", + "Logs and captured request detail.": "ログと記録されたリクエスト詳細。", "Manage": "管理", "Manage account": "アカウントを管理", "Manage memory": "メモリを管理", "Manage the long-term memory the gateway has learned — the discrete facts it remembers and the per-scope reflections it merges. Browse by scope or by key, then edit or remove what it keeps.": "ゲートウェイが学習した長期メモリを管理します — 記憶している個別のファクトと、マージするスコープごとのリフレクションです。スコープ別またはキー別に参照し、保持内容を編集または削除できます。", "Management plane only — do not feed production traffic.": "管理プレーン専用——本番トラフィックを流さないでください。", + "Maintenance actions": "メンテナンス操作", "Master switch. When off, nothing is deleted automatically.": "マスタースイッチ。オフの場合、自動的には何も削除されません。", "Match a single end-user by their ID.": "IDで単一のエンドユーザーに一致させます。", "Match every request from one organization.": "1つの組織からのすべてのリクエストに一致させます。", @@ -521,6 +524,7 @@ "Online": "オンライン", "Open in new tab": "新しいタブで開く", "Open navigation": "ナビゲーションを開く", + "Observability": "可観測性", "OpenAI / Anthropic SDK": "OpenAI / Anthropic SDK", "OpenClaw": "OpenClaw", "Operations": "操作", @@ -612,6 +616,7 @@ "Request trail": "リクエスト履歴", "Requested": "リクエストモデル", "Requested model": "リクエストされたモデル", + "Retention windows": "保持期間", "Requests": "リクエスト", "Requests per minute (RPM)": "1分あたりのリクエスト数 (RPM)", "Require JSON": "JSON 必須", @@ -652,6 +657,7 @@ "Route this account’s upstream traffic through a proxy so it egresses from a distinct IP. Leave unset for a direct connection.": "このアカウントのアップストリームトラフィックをプロキシ経由でルーティングし、別のIPから送信されるようにします。直接接続する場合は未設定のままにしてください。", "Routes the gateway's calls to this provider (token exchange, refresh, API traffic) and is saved to this account. The sign-in page you open in your browser is not proxied.": "ゲートウェイからこのプロバイダーへの呼び出し(トークン交換、更新、APIトラフィック)をルーティングし、このアカウントに保存されます。ブラウザーで開くサインインページはプロキシされません。", "Routing": "ルーティング", + "Routing, limits, queues, and request shaping.": "ルーティング、制限、キュー、リクエスト整形。", "Routing trail for each request — classification layer, lane, served model, fallbacks, cost and errors. Keys are shown by prefix only.": "各リクエストのルーティング履歴 — 分類レイヤー、レーン、提供モデル、フォールバック、コスト、エラー。キーはプレフィックスのみ表示されます。", "Rows per page": "1ページあたりの行数", "RPM": "RPM", @@ -668,6 +674,7 @@ "Running": "実行中", "Runs user-message requests to the same OAuth account one at a time with a minimum gap, to avoid tripping upstream rate limits. Tool results and assistant continuations are never queued.": "上流のレート制限に引っかからないように、同じ OAuth アカウントへのユーザーメッセージリクエストを最小間隔を空けて 1 件ずつ実行します。ツール結果とアシスタントの継続はキューに入りません。", "Runs VACUUM once a day to reclaim deleted disk space. The database is briefly locked while it runs.": "1日1回 VACUUM を実行して削除済みのディスク領域を回収します。実行中はデータベースが短時間ロックされます。", + "Runtime settings that take effect immediately, no restart needed.": "再起動不要で即時に有効になるランタイム設定。", "Runtime settings that take effect immediately — no restart needed.": "再起動不要で即時に有効になるランタイム設定。", "Save": "保存", "Save and connect. ChatGPT opens a Helm login page — paste a Helm API key to authorize; the connection is scoped to the account behind that key.": "保存して接続します。ChatGPTがHelmのログインページを開きます — Helm APIキーを貼り付けて認可します。この接続は、そのキーの背後にあるアカウントにスコープされます。", @@ -755,6 +762,7 @@ "The verdict that routed this request — the badge shows which layer decided it.": "このリクエストをルーティングした判定結果——バッジがどのレイヤーの判定かを示します。", "Then apply actions:": "次にアクションを適用します:", "Then force the lane:": "次にレーンを強制します:", + "These actions run immediately and do not wait for Save settings.": "これらの操作は即時に実行され、「設定を保存」を待ちません。", "These snippets include your API key. Copy what you need now and keep it private.": "これらのスニペットには API キーが含まれます。必要なものを今コピーし、秘密として保管してください。", "These snippets include your new key, shown only this once. Copy what you need now — we store only a hash, so it cannot be recovered later.": "以下のスニペットには新しいキーが含まれており、表示されるのはこの一度きりです。必要なものは今すぐコピーしてください。保存するのはハッシュのみで、後から復元はできません。", "These two settings are saved to the gateway when you click Save.": "これら2つの設定は、保存をクリックするとゲートウェイに保存されます。", @@ -787,6 +795,7 @@ "Tokens by model": "モデル別トークン使用量", "Tokens generated per second (output ÷ generation time), averaged over streamed requests.": "1秒あたりの生成トークン数(出力 ÷ 生成時間)。ストリーミングリクエストの平均。", "Tokens per minute (TPM)": "1分あたりのトークン数 (TPM)", + "Traffic controls": "トラフィック制御", "tool call": "ツール呼び出し", "Total": "合計", "Total cost": "合計コスト", diff --git a/apps/admin/src/locales/ko.json b/apps/admin/src/locales/ko.json index cd6c61f6..19d6fe7c 100644 --- a/apps/admin/src/locales/ko.json +++ b/apps/admin/src/locales/ko.json @@ -128,6 +128,7 @@ "Clean now": "지금 정리", "Cleaning…": "정리 중…", "Cleanup failed": "정리 실패", + "Cleanup schedule": "정리 일정", "Cleanup settings are saved with the “Save settings” button below.": "정리 설정은 아래 “설정 저장” 버튼으로 저장됩니다.", "Clear": "지우기", "Clear proxy": "프록시 지우기", @@ -430,11 +431,13 @@ "Loading…": "불러오는 중…", "Log level": "로그 수준", "Logging": "로깅", + "Logs and captured request detail.": "로그와 캡처된 요청 세부 정보.", "Manage": "관리", "Manage account": "계정 관리", "Manage memory": "메모리 관리", "Manage the long-term memory the gateway has learned — the discrete facts it remembers and the per-scope reflections it merges. Browse by scope or by key, then edit or remove what it keeps.": "게이트웨이가 학습한 장기 메모리, 즉 기억하는 개별 사실과 병합하는 범위별 회고를 관리합니다. 범위별 또는 키별로 탐색한 다음, 보관 내용을 편집하거나 제거하세요.", "Management plane only — do not feed production traffic.": "관리 플레인 전용 — 프로덕션 트래픽을 보내지 마세요.", + "Maintenance actions": "유지 관리 작업", "Master switch. When off, nothing is deleted automatically.": "마스터 스위치입니다. 꺼져 있으면 아무것도 자동으로 삭제되지 않습니다.", "Match a single end-user by their ID.": "ID로 단일 최종 사용자를 일치시킵니다.", "Match every request from one organization.": "한 조직의 모든 요청을 일치시킵니다.", @@ -521,6 +524,7 @@ "Online": "온라인", "Open in new tab": "새 탭에서 열기", "Open navigation": "내비게이션 열기", + "Observability": "관측성", "OpenAI / Anthropic SDK": "OpenAI / Anthropic SDK", "OpenClaw": "OpenClaw", "Operations": "작업", @@ -612,6 +616,7 @@ "Request trail": "요청 추적", "Requested": "요청 모델", "Requested model": "요청된 모델", + "Retention windows": "보존 기간", "Requests": "요청", "Requests per minute (RPM)": "분당 요청 수 (RPM)", "Require JSON": "JSON 필요", @@ -652,6 +657,7 @@ "Route this account’s upstream traffic through a proxy so it egresses from a distinct IP. Leave unset for a direct connection.": "이 계정의 업스트림 트래픽을 프록시를 통해 라우팅하여 별도의 IP에서 나가도록 합니다. 직접 연결하려면 설정하지 마세요.", "Routes the gateway's calls to this provider (token exchange, refresh, API traffic) and is saved to this account. The sign-in page you open in your browser is not proxied.": "게이트웨이의 호출(토큰 교환, 새로 고침, API 트래픽)을 이 공급자로 라우팅하며 이 계정에 저장됩니다. 브라우저에서 여는 로그인 페이지는 프록시되지 않습니다.", "Routing": "라우팅", + "Routing, limits, queues, and request shaping.": "라우팅, 제한, 대기열, 요청 조정.", "Routing trail for each request — classification layer, lane, served model, fallbacks, cost and errors. Keys are shown by prefix only.": "각 요청의 라우팅 추적 — 분류 계층, 레인, 제공된 모델, 대체 항목, 비용 및 오류. 키는 접두사로만 표시됩니다.", "Rows per page": "페이지당 행 수", "RPM": "RPM", @@ -668,6 +674,7 @@ "Running": "실행 중", "Runs user-message requests to the same OAuth account one at a time with a minimum gap, to avoid tripping upstream rate limits. Tool results and assistant continuations are never queued.": "업스트림 속도 제한에 걸리지 않도록, 동일한 OAuth 계정으로 보내는 사용자 메시지 요청을 최소 간격을 두고 한 번에 하나씩 실행합니다. 도구 결과와 어시스턴트 연속 응답은 대기열에 넣지 않습니다.", "Runs VACUUM once a day to reclaim deleted disk space. The database is briefly locked while it runs.": "Runs VACUUM once a day to reclaim deleted disk space. The database is briefly locked while it runs.", + "Runtime settings that take effect immediately, no restart needed.": "즉시 적용되는 런타임 설정, 재시작이 필요 없습니다.", "Runtime settings that take effect immediately — no restart needed.": "즉시 적용되는 런타임 설정 — 재시작이 필요 없습니다.", "Save": "저장", "Save and connect. ChatGPT opens a Helm login page — paste a Helm API key to authorize; the connection is scoped to the account behind that key.": "저장하고 연결하세요. ChatGPT가 Helm 로그인 페이지를 엽니다. Helm API 키를 붙여넣어 인증하세요. 연결은 해당 키에 연결된 계정 범위로 제한됩니다.", @@ -755,6 +762,7 @@ "The verdict that routed this request — the badge shows which layer decided it.": "이 요청을 라우팅한 판정 결과 — 배지가 어느 레이어의 판정인지 표시합니다.", "Then apply actions:": "그런 다음 작업을 적용합니다:", "Then force the lane:": "그런 다음 레인을 강제합니다:", + "These actions run immediately and do not wait for Save settings.": "이 작업은 즉시 실행되며 “설정 저장”을 기다리지 않습니다.", "These snippets include your API key. Copy what you need now and keep it private.": "이 스니펫에는 API 키가 포함되어 있습니다. 필요한 내용을 지금 복사하고 비공개로 보관하세요.", "These snippets include your new key, shown only this once. Copy what you need now — we store only a hash, so it cannot be recovered later.": "아래 스니펫에는 새 키가 포함되어 있으며 이번 한 번만 표시됩니다. 필요한 것은 지금 복사하세요. 해시만 저장하므로 나중에 복구할 수 없습니다.", "These two settings are saved to the gateway when you click Save.": "이 두 설정은 저장을 클릭하면 게이트웨이에 저장됩니다.", @@ -787,6 +795,7 @@ "Tokens by model": "모델별 토큰", "Tokens generated per second (output ÷ generation time), averaged over streamed requests.": "초당 생성 토큰 수(출력 ÷ 생성 시간), 스트리밍 요청 평균.", "Tokens per minute (TPM)": "분당 토큰 수 (TPM)", + "Traffic controls": "트래픽 제어", "tool call": "도구 호출", "Total": "합계", "Total cost": "총비용", diff --git a/apps/admin/src/locales/zh-hans.json b/apps/admin/src/locales/zh-hans.json index b03b39ce..25df7957 100644 --- a/apps/admin/src/locales/zh-hans.json +++ b/apps/admin/src/locales/zh-hans.json @@ -128,6 +128,7 @@ "Clean now": "立即清理", "Cleaning…": "正在清理…", "Cleanup failed": "清理失败", + "Cleanup schedule": "清理计划", "Cleanup settings are saved with the “Save settings” button below.": "清理设置会通过下方的“保存设置”按钮保存。", "Clear": "清除", "Clear proxy": "清除代理", @@ -430,11 +431,13 @@ "Loading…": "加载中…", "Log level": "日志级别", "Logging": "日志记录", + "Logs and captured request detail.": "日志和捕获的请求详情。", "Manage": "管理", "Manage account": "管理账户", "Manage memory": "管理记忆", "Manage the long-term memory the gateway has learned — the discrete facts it remembers and the per-scope reflections it merges. Browse by scope or by key, then edit or remove what it keeps.": "管理网关已学习的长期记忆——它记住的离散事实,以及它合并的每个范围的反思。按范围或按密钥浏览,然后编辑或移除它保留的内容。", "Management plane only — do not feed production traffic.": "仅用于管理平面——请勿用于生产流量。", + "Maintenance actions": "维护操作", "Master switch. When off, nothing is deleted automatically.": "主开关。关闭时,不会自动删除任何内容。", "Match a single end-user by their ID.": "按 ID 匹配单个终端用户。", "Match every request from one organization.": "匹配来自同一组织的每个请求。", @@ -521,6 +524,7 @@ "Online": "在线", "Open in new tab": "在新标签页打开", "Open navigation": "打开导航", + "Observability": "可观测性", "OpenAI / Anthropic SDK": "OpenAI / Anthropic SDK", "OpenClaw": "OpenClaw", "Operations": "操作", @@ -612,6 +616,7 @@ "Request trail": "请求轨迹", "Requested": "请求模型", "Requested model": "请求模型", + "Retention windows": "保留窗口", "Requests": "请求", "Requests per minute (RPM)": "每分钟请求数 (RPM)", "Require JSON": "需要 JSON", @@ -652,6 +657,7 @@ "Route this account’s upstream traffic through a proxy so it egresses from a distinct IP. Leave unset for a direct connection.": "通过代理路由此账户的上游流量,使其从不同的 IP 地址流出。留空则使用直接连接。", "Routes the gateway's calls to this provider (token exchange, refresh, API traffic) and is saved to this account. The sign-in page you open in your browser is not proxied.": "用于网关对该 provider 的请求(令牌交换、刷新、API 流量),并保存到此账户。你在浏览器中打开的登录页面不走代理。", "Routing": "路由", + "Routing, limits, queues, and request shaping.": "路由、限额、队列和请求整形。", "Routing trail for each request — classification layer, lane, served model, fallbacks, cost and errors. Keys are shown by prefix only.": "每个请求的路由轨迹——分类层、通道(lane)、实际服务模型、兜底次数、成本与错误。密钥仅显示前缀。", "Rows per page": "每页行数", "RPM": "RPM", @@ -668,6 +674,7 @@ "Running": "运行中", "Runs user-message requests to the same OAuth account one at a time with a minimum gap, to avoid tripping upstream rate limits. Tool results and assistant continuations are never queued.": "同一 OAuth 账户的用户消息请求逐个执行,并保持最小间隔,避免触发上游限流。工具调用结果与助手续写消息不会排队。", "Runs VACUUM once a day to reclaim deleted disk space. The database is briefly locked while it runs.": "每天运行一次 VACUUM 以回收已删除的磁盘空间。运行期间数据库会短暂锁定。", + "Runtime settings that take effect immediately, no restart needed.": "立即生效的运行时设置,无需重启。", "Runtime settings that take effect immediately — no restart needed.": "立即生效的运行时设置 — 无需重启。", "Save": "保存", "Save and connect. ChatGPT opens a Helm login page — paste a Helm API key to authorize; the connection is scoped to the account behind that key.": "保存并连接。ChatGPT 会打开一个 Helm 登录页——粘贴一个 Helm API 密钥完成授权;该连接的范围限定为此密钥所属的账户。", @@ -755,6 +762,7 @@ "The verdict that routed this request — the badge shows which layer decided it.": "本请求最终采用的分类结论——徽章标明由哪一层判定。", "Then apply actions:": "然后应用动作:", "Then force the lane:": "然后强制使用该车道:", + "These actions run immediately and do not wait for Save settings.": "这些操作会立即运行,不会等待“保存设置”。", "These snippets include your API key. Copy what you need now and keep it private.": "这些片段包含你的 API 密钥。请复制需要的内容并妥善保密。", "These snippets include your new key, shown only this once. Copy what you need now — we store only a hash, so it cannot be recovered later.": "下面的代码已经带上了你的新密钥,且仅此一次展示。需要的现在就复制——我们只保存哈希,之后无法找回。", "These two settings are saved to the gateway when you click Save.": "点击「保存」后,这两项设置会写入网关。", @@ -787,6 +795,7 @@ "Tokens by model": "各模型 Token 用量", "Tokens generated per second (output ÷ generation time), averaged over streamed requests.": "每秒生成的 Token 数(输出 ÷ 生成时间),按流式请求平均。", "Tokens per minute (TPM)": "每分钟令牌数 (TPM)", + "Traffic controls": "流量控制", "tool call": "工具调用", "Total": "合计", "Total cost": "总花费", diff --git a/apps/admin/src/locales/zh-hant.json b/apps/admin/src/locales/zh-hant.json index 16d7fc2d..725bdd92 100644 --- a/apps/admin/src/locales/zh-hant.json +++ b/apps/admin/src/locales/zh-hant.json @@ -128,6 +128,7 @@ "Clean now": "立即清理", "Cleaning…": "正在清理…", "Cleanup failed": "清理失敗", + "Cleanup schedule": "清理排程", "Cleanup settings are saved with the “Save settings” button below.": "清理設定會透過下方的「儲存設定」按鈕儲存。", "Clear": "清除", "Clear proxy": "清除代理", @@ -430,11 +431,13 @@ "Loading…": "載入中…", "Log level": "記錄層級", "Logging": "日誌記錄", + "Logs and captured request detail.": "日誌和擷取的請求詳情。", "Manage": "管理", "Manage account": "管理帳戶", "Manage memory": "管理記憶", "Manage the long-term memory the gateway has learned — the discrete facts it remembers and the per-scope reflections it merges. Browse by scope or by key, then edit or remove what it keeps.": "管理閘道已學習的長期記憶——它記住的離散事實,以及它合併的每個範圍的反思。按範圍或按金鑰瀏覽,然後編輯或移除它保留的內容。", "Management plane only — do not feed production traffic.": "僅用於管理平面——請勿用於生產流量。", + "Maintenance actions": "維護操作", "Master switch. When off, nothing is deleted automatically.": "主開關。關閉時,不會自動刪除任何內容。", "Match a single end-user by their ID.": "按 ID 符合單一終端使用者。", "Match every request from one organization.": "符合來自同一組織的每個請求。", @@ -521,6 +524,7 @@ "Online": "線上", "Open in new tab": "在新分頁開啟", "Open navigation": "開啟導覽", + "Observability": "可觀測性", "OpenAI / Anthropic SDK": "OpenAI / Anthropic SDK", "OpenClaw": "OpenClaw", "Operations": "操作", @@ -612,6 +616,7 @@ "Request trail": "請求軌跡", "Requested": "請求模型", "Requested model": "請求模型", + "Retention windows": "保留窗口", "Requests": "請求", "Requests per minute (RPM)": "每分鐘請求數 (RPM)", "Require JSON": "需要 JSON", @@ -652,6 +657,7 @@ "Route this account’s upstream traffic through a proxy so it egresses from a distinct IP. Leave unset for a direct connection.": "透過代理路由此帳戶的上游流量,使其從不同的 IP 位址流出。留空則使用直接連線。", "Routes the gateway's calls to this provider (token exchange, refresh, API traffic) and is saved to this account. The sign-in page you open in your browser is not proxied.": "用於閘道對該 provider 的請求(權杖交換、刷新、API 流量),並儲存至此帳戶。你在瀏覽器中開啟的登入頁面不走代理。", "Routing": "路由", + "Routing, limits, queues, and request shaping.": "路由、限額、佇列和請求整形。", "Routing trail for each request — classification layer, lane, served model, fallbacks, cost and errors. Keys are shown by prefix only.": "每個請求的路由軌跡——分類層、通道(lane)、實際服務模型、備援次數、成本與錯誤。金鑰僅顯示前綴。", "Rows per page": "每頁列數", "RPM": "RPM", @@ -668,6 +674,7 @@ "Running": "執行中", "Runs user-message requests to the same OAuth account one at a time with a minimum gap, to avoid tripping upstream rate limits. Tool results and assistant continuations are never queued.": "同一 OAuth 帳戶的使用者訊息請求逐一執行,並保持最小間隔,避免觸發上游限流。工具呼叫結果與助手續寫訊息不會排隊。", "Runs VACUUM once a day to reclaim deleted disk space. The database is briefly locked while it runs.": "Runs VACUUM once a day to reclaim deleted disk space. The database is briefly locked while it runs.", + "Runtime settings that take effect immediately, no restart needed.": "立即生效的執行階段設定,無需重新啟動。", "Runtime settings that take effect immediately — no restart needed.": "立即生效的執行階段設定 — 無需重新啟動。", "Save": "儲存", "Save and connect. ChatGPT opens a Helm login page — paste a Helm API key to authorize; the connection is scoped to the account behind that key.": "儲存並連線。ChatGPT 會開啟一個 Helm 登入頁——貼上一個 Helm API 金鑰完成授權;該連線的範圍限定為此金鑰所屬的帳戶。", @@ -755,6 +762,7 @@ "The verdict that routed this request — the badge shows which layer decided it.": "本請求最終採用的分類結論——徽章標明由哪一層判定。", "Then apply actions:": "然後套用動作:", "Then force the lane:": "然後強制使用該車道:", + "These actions run immediately and do not wait for Save settings.": "這些操作會立即執行,不會等待「儲存設定」。", "These snippets include your API key. Copy what you need now and keep it private.": "這些片段包含你的 API 金鑰。請複製需要的內容並妥善保密。", "These snippets include your new key, shown only this once. Copy what you need now — we store only a hash, so it cannot be recovered later.": "下面的程式碼已經帶上了你的新密鑰,且僅此一次顯示。需要的現在就複製——我們只保存雜湊,之後無法找回。", "These two settings are saved to the gateway when you click Save.": "點擊「儲存」後,這兩項設定會寫入閘道。", @@ -787,6 +795,7 @@ "Tokens by model": "各模型權杖用量", "Tokens generated per second (output ÷ generation time), averaged over streamed requests.": "每秒生成的 Token 數(輸出 ÷ 生成時間),依串流請求平均。", "Tokens per minute (TPM)": "每分鐘權杖數 (TPM)", + "Traffic controls": "流量控制", "tool call": "工具呼叫", "Total": "合計", "Total cost": "總花費", diff --git a/apps/admin/src/routes/settings/+page.svelte b/apps/admin/src/routes/settings/+page.svelte index 807f740c..a9c619ce 100644 --- a/apps/admin/src/routes/settings/+page.svelte +++ b/apps/admin/src/routes/settings/+page.svelte @@ -152,11 +152,11 @@ } -
+

{$t('System Settings')}

- {$t('Runtime settings that take effect immediately — no restart needed.')} + {$t('Runtime settings that take effect immediately, no restart needed.')}

@@ -165,445 +165,500 @@ {/if} {#if data.settings} - -
-

{$t('Routing')}

- - -
- - -
-

{$t('Rate limiting')}

- - - -
- - +
+
+

{$t('Traffic controls')}

+

{$t('Routing, limits, queues, and request shaping.')}

- {$t( - 'The fallback limit for any key without its own per-key value. 0 means unlimited.', - )} -
- -
-

{$t('Request queueing')}

- - +
+

{$t('Routing')}

+
+ + + +
+
-
- - - -
+
+

{$t('Rate limiting')}

- - -
- -
-
- -
-

{$t('Request optimization')}

- - -
+
+ +
+

{$t('Request queueing')}

+ +
+
+ + +
+ + + +
+
- -
-

{$t('Logging')}

- - - - - - -
+
+ + +
+ + +
+
+
+
+ - -
-

{$t('Data retention & cleanup')}

-

- {$t( - 'A scheduled sweep deletes old data per the windows below. Training/audit data is archived to a compressed file before deletion; you can download those archives or clean up immediately.', - )} -

+
+
+

{$t('Observability')}

+

{$t('Logs and captured request detail.')}

+
- +
+

{$t('Logging')}

-
- - +
+ + +
+ + + +
+
+
+
+ +
+
+

{$t('Data retention & cleanup')}

+

+ {$t( + 'A scheduled sweep deletes old data per the windows below. Training/audit data is archived to a compressed file before deletion; you can download those archives or clean up immediately.', + )} +

- -
+
+

{$t('Cleanup schedule')}

+ - -
- - -
- - - - +
+ + +
- +
+ + +
+
+ +
+

{$t('Retention windows')}

+ +
+ + + + + + + + + + + +
- +

+ {$t('Cleanup settings are saved with the “Save settings” button below.')} +

+
+ - - +
+ {#if saved} + {$t('Saved')} + {/if} + +
+
+

{$t('Maintenance actions')}

- {$t('Cleanup settings are saved with the “Save settings” button below.')} + {$t('These actions run immediately and do not wait for Save settings.')}

{#if cleanupError} {/if} -
-
- {#if confirmingClean}