Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
6bc06d5
refactor(providers): modular provider form with vertical scroll navig…
ding113 Jan 21, 2026
16bb04b
chore: format code (feat-provider-form-refactor-6bc06d5)
github-actions[bot] Jan 21, 2026
c40b9b6
feat(dashboard): add bento grid layout with glassmorphism design
ding113 Jan 21, 2026
b4a97ef
feat(dashboard): add comparison metrics and RPM to bento cards
ding113 Jan 21, 2026
6e7e96e
feat(settings): enhance UI with new components and translations
ding113 Jan 21, 2026
7a6f8b5
chore: format code (feat-provider-form-refactor-6e7e96e)
github-actions[bot] Jan 21, 2026
cfe13ed
style(ui): update component styling to use consistent muted colors
ding113 Jan 21, 2026
0bfb266
feat(providers): improve form handling and translations
ding113 Jan 21, 2026
cf0dcbe
refactor(provider-form): simplify form data handling and remove unuse…
ding113 Jan 21, 2026
60d3508
refactor(provider-form): clean up unused imports and variables
ding113 Jan 21, 2026
c3a6711
feat(dashboard): improve bento grid components
ding113 Jan 21, 2026
a0b9398
feat(endpoint-latency): add tooltip and average latency display to sp…
ding113 Jan 21, 2026
ab98f0d
style(settings): remove unnecessary line breaks in sparkline component
ding113 Jan 21, 2026
b8e5052
fix(metric-card): use spread operator for comparison props
ding113 Jan 21, 2026
d2d36a0
feat(providers): add batch edit and quick paste features
ding113 Jan 22, 2026
f37e60e
feat(providers): add quick paste feature and batch operations tests
ding113 Jan 22, 2026
629f294
chore: format code (feat-provider-form-refactor-f37e60e)
github-actions[bot] Jan 22, 2026
2dcdb7a
feat(i18n): add missing translations for session status and loading s…
ding113 Jan 22, 2026
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,4 @@ docs-site/node_modules/

# local scratch
tmp/
.trae/
17 changes: 14 additions & 3 deletions messages/en/customs.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,27 @@
"viewRelease": "View Release"
},
"metrics": {
"concurrent": "Concurrent",
"concurrent": "Active Sessions",
"todayRequests": "Today's Requests",
"todayCost": "Today's Cost",
"avgResponse": "Average Response Time",
"viewDetails": "View Details"
"viewDetails": "View Details",
"rpm": "RPM",
"vsYesterday": "vs Yesterday"
},
"activeSessions": {
"title": "Active Sessions",
"summary": "{count} sessions in the last {minutes} minutes",
"empty": "No active sessions",
"viewAll": "View All"
"viewAll": "View All",
"loading": "Loading...",
"unknownUser": "unknown",
"status": {
"running": "RUNNING",
"init": "INIT",
"idle": "IDLE",
"error": "ERROR",
"done": "DONE"
}
}
}
8 changes: 7 additions & 1 deletion messages/en/settings/clientVersions.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,13 @@
"unknown": "Unknown",
"user": "User",
"usersCount": "{count} users",
"version": "Current Version"
"version": "Current Version",
"stats": {
"clientTypes": "Client Types",
"totalUsers": "Total Users",
"withGA": "With GA Version",
"coverage": "GA Coverage"
}
},
"title": "Client Update Reminder",
"toggle": {
Expand Down
3 changes: 3 additions & 0 deletions messages/en/settings/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import providersFormModelSelect from "./providers/form/modelSelect.json";
import providersFormName from "./providers/form/name.json";
import providersFormProviderTypes from "./providers/form/providerTypes.json";
import providersFormProxyTest from "./providers/form/proxyTest.json";
import providersFormQuickPaste from "./providers/form/quickPaste.json";
import providersFormSections from "./providers/form/sections.json";
import providersFormStrings from "./providers/form/strings.json";
import providersFormSuccess from "./providers/form/success.json";
Expand All @@ -47,6 +48,7 @@ import providersFormWebsiteUrl from "./providers/form/websiteUrl.json";

const providersForm = {
...providersFormStrings,
...providersFormCommon,
apiTest: providersFormApiTest,
buttons: providersFormButtons,
common: providersFormCommon,
Expand All @@ -60,6 +62,7 @@ const providersForm = {
name: providersFormName,
providerTypes: providersFormProviderTypes,
proxyTest: providersFormProxyTest,
quickPaste: providersFormQuickPaste,
sections: providersFormSections,
success: providersFormSuccess,
title: providersFormTitle,
Expand Down
2 changes: 2 additions & 0 deletions messages/en/settings/notifications.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@
"global": {
"description": "Enable or disable all push notification features",
"enable": "Enable Push Notifications",
"off": "Off",
"on": "On",
"legacyModeDescription": "You are using legacy single-URL notifications. Create a push target to switch to multi-target mode.",
"legacyModeTitle": "Legacy Mode",
"title": "Notification Master Switch"
Expand Down
43 changes: 43 additions & 0 deletions messages/en/settings/providers/batchEdit.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"enterMode": "Batch Edit",
"exitMode": "Exit",
"selectAll": "Select All",
"invertSelection": "Invert",
"selectedCount": "{count} selected",
"editSelected": "Edit Selected",
"actions": {
"edit": "Edit",
"delete": "Delete",
"resetCircuit": "Reset Circuit"
},
"dialog": {
"editTitle": "Batch Edit Providers",
"editDesc": "Changes will apply to {count} providers",
"deleteTitle": "Delete Providers",
"deleteDesc": "Permanently delete {count} providers?",
"resetCircuitTitle": "Reset Circuit Breakers",
"resetCircuitDesc": "Reset circuit breaker for {count} providers?",
"next": "Next",
"noFieldEnabled": "Please enable at least one field to update"
},
"fields": {
"isEnabled": "Status",
"priority": "Priority",
"weight": "Weight",
"costMultiplier": "Cost Multiplier",
"groupTag": "Group Tag"
},
"confirm": {
"title": "Confirm Operation",
"cancel": "Cancel",
"confirm": "Confirm",
"goBack": "Go Back",
"processing": "Processing..."
},
"toast": {
"updated": "Updated {count} providers",
"deleted": "Deleted {count} providers",
"circuitReset": "Reset {count} circuit breakers",
"failed": "Operation failed: {error}"
}
}
9 changes: 8 additions & 1 deletion messages/en/settings/providers/form/common.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
{
"core": "Core"
"core": "Core",
"tabs": {
"basic": "Basic",
"routing": "Routing",
"limits": "Limits",
"network": "Network",
"testing": "Testing"
}
}
1 change: 1 addition & 0 deletions messages/en/settings/providers/form/key.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"currentKey": "Current key: {key}",
"label": "API Key",
"labelEdit": "API Key (Leave empty to keep unchanged)",
"leaveEmpty": "(Leave empty to keep unchanged)",
"leaveEmptyDesc": "Leave empty to keep existing key",
"placeholder": "Enter API Key"
Expand Down
2 changes: 1 addition & 1 deletion messages/en/settings/providers/form/name.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"label": "Provider Name *",
"label": "Provider Name",
"placeholder": "e.g. Zhipu"
}
15 changes: 15 additions & 0 deletions messages/en/settings/providers/form/quickPaste.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"button": "Quick Paste",
"title": "Quick Paste Provider Info",
"description": "Paste text containing provider details (URL, API key, etc.) and we'll extract the information automatically.",
"placeholder": "Paste provider configuration text here...",
"preview": "Detected Information",
"type": "Type",
"name": "Name",
"url": "URL",
"key": "API Key",
"notFound": "Not detected",
"parseError": "Could not parse provider information from the text",
"cancel": "Cancel",
"confirm": "Apply"
}
23 changes: 22 additions & 1 deletion messages/en/settings/providers/form/sections.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@
{
"basic": {
"identity": {
"title": "Provider Identity",
"desc": "Set a unique name to identify this provider"
},
"endpoint": {
"title": "API Endpoint",
"desc": "Configure the base URL for API requests"
},
"auth": {
"title": "Authentication",
"desc": "Provide your API key for authentication"
}
},
"apiTest": {
"desc": "Validate whether the selected provider type and model respond correctly. Defaults to the routing configuration unless overridden.",
"summary": "Verify provider & model connectivity",
Expand All @@ -10,7 +24,8 @@
"failureThreshold": {
"desc": "Number of consecutive failures to trigger break",
"label": "Failure Threshold",
"placeholder": "5"
"placeholder": "5",
"warning": "Setting to 0 disables the circuit breaker - use with caution"
},
"maxRetryAttempts": {
"desc": "Total tries (including the first call) before switching providers. Leave empty to use the system default.",
Expand Down Expand Up @@ -129,6 +144,7 @@
"dailyResetTime": {
"label": "Daily Reset Time (HH:mm)"
},
"desc": "Configure spending limits to control costs across different time windows",
"limit5h": {
"label": "5h Spend Limit (USD)",
"placeholder": "Leave empty for unlimited"
Expand Down Expand Up @@ -164,6 +180,11 @@
},
"title": "Rate Limit"
},
"limits": {
"timeBased": "Time-based Limits",
"dailyReset": "Daily Reset Settings",
"otherLimits": "Other Limits"
},
"routing": {
"cacheTtl": {
"desc": "Force prompt cache TTL; only affects requests with cache_control.",
Expand Down
2 changes: 1 addition & 1 deletion messages/en/settings/providers/form/url.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"label": "API Address *",
"label": "API Address",
"placeholder": "e.g. https://open.bigmodel.cn/api/anthropic"
}
17 changes: 14 additions & 3 deletions messages/ja/customs.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,27 @@
"viewRelease": "リリースを表示"
},
"metrics": {
"concurrent": "同時実行",
"concurrent": "アクティブセッション数",
"todayRequests": "本日のリクエスト",
"todayCost": "本日のコスト",
"avgResponse": "平均応答時間",
"viewDetails": "詳細を表示"
"viewDetails": "詳細を表示",
"rpm": "RPM",
"vsYesterday": "前日同時間帯比"
},
"activeSessions": {
"title": "アクティブなセッション",
"summary": "過去{minutes}分間の{count}個のセッション",
"empty": "アクティブなセッションがありません",
"viewAll": "すべて表示"
"viewAll": "すべて表示",
"loading": "読み込み中...",
"unknownUser": "不明",
"status": {
"running": "実行中",
"init": "初期化",
"idle": "アイドル",
"error": "エラー",
"done": "完了"
}
}
}
8 changes: 7 additions & 1 deletion messages/ja/settings/clientVersions.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,13 @@
"unknown": "不明",
"user": "ユーザー",
"usersCount": "{count}名のユーザー",
"version": "現在のバージョン"
"version": "現在のバージョン",
"stats": {
"clientTypes": "クライアントタイプ",
"totalUsers": "ユーザー総数",
"withGA": "GA版あり",
"coverage": "GAカバレッジ"
}
},
"title": "クライアント更新リマインダー",
"toggle": {
Expand Down
3 changes: 3 additions & 0 deletions messages/ja/settings/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import providersFormModelSelect from "./providers/form/modelSelect.json";
import providersFormName from "./providers/form/name.json";
import providersFormProviderTypes from "./providers/form/providerTypes.json";
import providersFormProxyTest from "./providers/form/proxyTest.json";
import providersFormQuickPaste from "./providers/form/quickPaste.json";
import providersFormSections from "./providers/form/sections.json";
import providersFormStrings from "./providers/form/strings.json";
import providersFormSuccess from "./providers/form/success.json";
Expand All @@ -47,6 +48,7 @@ import providersFormWebsiteUrl from "./providers/form/websiteUrl.json";

const providersForm = {
...providersFormStrings,
...providersFormCommon,
apiTest: providersFormApiTest,
buttons: providersFormButtons,
common: providersFormCommon,
Expand All @@ -60,6 +62,7 @@ const providersForm = {
name: providersFormName,
providerTypes: providersFormProviderTypes,
proxyTest: providersFormProxyTest,
quickPaste: providersFormQuickPaste,
sections: providersFormSections,
success: providersFormSuccess,
title: providersFormTitle,
Expand Down
2 changes: 2 additions & 0 deletions messages/ja/settings/notifications.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@
"global": {
"description": "すべてのプッシュ通知機能を有効または無効にする",
"enable": "プッシュ通知を有効にする",
"off": "オフ",
"on": "オン",
"legacyModeDescription": "現在は旧来の単一URL通知設定を使用しています。プッシュ先を作成するとマルチターゲットモードに切り替わります。",
"legacyModeTitle": "互換モード",
"title": "通知マスタースイッチ"
Expand Down
43 changes: 43 additions & 0 deletions messages/ja/settings/providers/batchEdit.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"enterMode": "一括編集",
"exitMode": "終了",
"selectAll": "全選択",
"invertSelection": "反転",
"selectedCount": "{count} 件選択中",
"editSelected": "選択項目を編集",
"actions": {
"edit": "編集",
"delete": "削除",
"resetCircuit": "サーキット リセット"
},
"dialog": {
"editTitle": "プロバイダーの一括編集",
"editDesc": "{count} 件のプロバイダーに変更が適用されます",
"deleteTitle": "プロバイダーの削除",
"deleteDesc": "{count} 件のプロバイダーを完全に削除しますか?",
"resetCircuitTitle": "サーキットブレーカーのリセット",
"resetCircuitDesc": "{count} 件のプロバイダーのサーキットブレーカーをリセットしますか?",
"next": "次へ",
"noFieldEnabled": "更新するフィールドを少なくとも1つ有効にしてください"
},
"fields": {
"isEnabled": "ステータス",
"priority": "優先度",
"weight": "重み",
"costMultiplier": "価格倍率",
"groupTag": "グループタグ"
},
"confirm": {
"title": "操作の確認",
"cancel": "キャンセル",
"confirm": "確認",
"goBack": "戻る",
"processing": "処理中..."
},
"toast": {
"updated": "{count} 件のプロバイダーを更新しました",
"deleted": "{count} 件のプロバイダーを削除しました",
"circuitReset": "{count} 件のサーキットブレーカーをリセットしました",
"failed": "操作に失敗しました: {error}"
}
}
9 changes: 8 additions & 1 deletion messages/ja/settings/providers/form/common.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
{
"core": "コア"
"core": "コア",
"tabs": {
"basic": "基本情報",
"routing": "ルーティング",
"limits": "制限",
"network": "ネットワーク",
"testing": "テスト"
}
}
1 change: 1 addition & 0 deletions messages/ja/settings/providers/form/key.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"currentKey": "現在のキー: {key}",
"label": "API キー",
"labelEdit": "API キー(空欄のままにすると変更しません)",
"leaveEmpty": "(空欄のままにすると変更しません)",
"leaveEmptyDesc": "空欄のままにすると既存のキーを保持します",
"placeholder": "API キーを入力"
Expand Down
2 changes: 1 addition & 1 deletion messages/ja/settings/providers/form/name.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
"label": "プロバイダー名 *",
"label": "プロバイダー名",
"placeholder": "例: Zhipu"
}
15 changes: 15 additions & 0 deletions messages/ja/settings/providers/form/quickPaste.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"button": "クイック貼り付け",
"title": "クイック貼り付け",
"description": "プロバイダー情報(URL、APIキーなど)を含むテキストを貼り付けると、自動的に抽出されます。",
"placeholder": "ここにプロバイダー設定テキストを貼り付けてください...",
"preview": "検出された情報",
"type": "タイプ",
"name": "名前",
"url": "URL",
"key": "APIキー",
"notFound": "検出されませんでした",
"parseError": "テキストからプロバイダー情報を解析できませんでした",
"cancel": "キャンセル",
"confirm": "適用"
}
Loading
Loading