@raingor/pi-web-switch 0.7.1 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,15 +31,20 @@ const zhTW: Record<string, string> = {
31
31
  "providers_models.invalid_url": "請輸入合法的 http(s) 位址",
32
32
  "providers_models.baseurl_override": "此位址將覆蓋內建預設位址(寫入 models.json)",
33
33
  "providers_models.enable_all": "全部啟用",
34
- "providers_models.sort_by": "排序",
35
- "providers_models.sort_default": "預設",
36
- "providers_models.sort_family": "依廠商",
37
- "providers_models.sort_price_asc": "價格升序",
38
- "providers_models.sort_price_desc": "價格降序",
39
34
  "providers_models.disable_all": "全部停用",
40
35
  "providers_models.enabled_models_title": "已啟用模型",
41
36
  "providers_models.no_enabled_models": "尚無啟用的模型。在供應商的模型清單中開啟模型後,會顯示在這裡。",
42
37
  "providers_models.api_key_env": "將以環境變數 {0} 的值作為密鑰(不會明碼寫入)",
38
+ "providers_models.api_key_add": "新增密鑰",
39
+ "providers_models.api_key_count": "共 {0} 個密鑰",
40
+ "providers_models.api_key_active": "使用中",
41
+ "providers_models.api_key_use": "使用此密鑰",
42
+ "providers_models.api_key_show": "顯示密鑰",
43
+ "providers_models.api_key_hide": "隱藏密鑰",
44
+ "providers_models.api_key_delete": "刪除密鑰",
45
+ "providers_models.api_key_empty": "尚無密鑰,請在下方新增。",
46
+ "providers_models.api_key_duplicate": "該密鑰已在清單中",
47
+ "providers_models.api_key_switch_hint": "選取即可立即切換,pi 會使用標記為「使用中」的那一個。",
43
48
  "providers_models.test_all": "測試全部",
44
49
  "providers_models.id_exists": "ID “{0}” 已存在,請換一個名稱",
45
50
  "providers_models.id_preview": "將以 ID “{0}” 儲存",
@@ -86,6 +91,11 @@ const zhTW: Record<string, string> = {
86
91
  "speed_test.empty_catalog": "尚未取得模型列表",
87
92
  "speed_test.empty_catalog_desc": "點擊「一鍵取得模型」從供應商接口拉取全部模型,僅用於測速,不影響已配置的模型。",
88
93
  "speed_test.testing": "測速中",
94
+ "speed_test.col_action": "操作",
95
+ "speed_test.add_to_provider": "加入",
96
+ "speed_test.exists": "已存在",
97
+ "speed_test.add_all_passed": "一鍵加入全部通過",
98
+ "speed_test.add_all_passed_desc": "把測速 100% 通過且尚未配置的模型全部加入該供應商",
89
99
  "speed_test.reset": "重置",
90
100
  "speed_test.pending": "待測",
91
101
  "speed_test.ok": "全部成功",
@@ -126,6 +136,16 @@ const zhTW: Record<string, string> = {
126
136
  "app.version": "pi-switch v0.7.0",
127
137
  "changelog.button": "更新日誌",
128
138
  "changelog.title": "版本更新說明",
139
+ "changelog.0_8_2_1": "測速結果持久化:切換頁面再回來結果不丟,並記住上次選中的供應商。",
140
+ "changelog.0_8_2_2": "測速 100% 通過的模型支援一鍵加入對應供應商(單個/批次),已存在自動標記。",
141
+ "changelog.0_8_2_3": "新添加的模型預設為停用狀態,需手動啟用。",
142
+ "changelog.0_8_2_4": "移除供應商模型列表與遠端模型取得彈窗中的搜尋框。",
143
+ "changelog.0_8_1_1": "設定頁移除頂部統計卡片(供應商 / 已啟用模型 / 當前主題)。",
144
+ "changelog.0_8_1_2": "套件瀏覽彈窗新增「推薦安裝」標籤頁,搜尋標籤支援按全部/未安裝/已安裝篩選。",
145
+ "changelog.0_8_1_3": "修復:記憶與子代理的模型選擇改為真正的下拉;子代理儲存後面板即時更新。",
146
+ "changelog.0_8_0_1": "設定:新增擴充包瀏覽彈窗,含「推薦安裝」與「搜尋」兩個標籤頁。",
147
+ "changelog.0_8_0_2": "搜尋標籤支援模糊搜尋 npm 上的 pi 擴充包,並可按全部/未安裝/已安裝篩選。",
148
+ "changelog.0_8_0_3": "擴充包一鍵安裝,已安裝狀態自動標示。",
129
149
  "changelog.0_7_0_1": "新增右下角浮動「使用說明」按鈕,彈窗含專案總覽與各板塊使用指引。",
130
150
  "changelog.0_7_0_2": "新增「加入 Telegram 交流群」入口(側邊欄 + 使用說明彈窗)。",
131
151
  "changelog.0_7_0_3": "新增本「版本更新說明」彈窗。",
@@ -445,9 +465,9 @@ const zhTW: Record<string, string> = {
445
465
  "settings.updates_failed": "檢查更新失敗",
446
466
  "settings.update_all": "一鍵更新",
447
467
  "settings.updating": "更新中…",
448
- "settings.update_success": "已成功更新 {0} 個擴充",
449
- "settings.update_failed_names": "{0} 個擴充更新失敗:{1}",
450
- "settings.updates_hint": "擴充可透過 pi 重新安裝(或在 ~/.pi/agent/npm 執行 npm update)更新;pi 本體請透過安裝器更新。",
468
+ "settings.update_success": "已成功更新 {0} ",
469
+ "settings.update_failed_names": "{0} 項更新失敗:{1}",
470
+ "settings.updates_hint": "擴充透過 ~/.pi/agent/npm 裡的 npm install 更新;pi 本體透過執行 `pi update` 更新。更新後請重啟 pi",
451
471
  "settings.defaults": "預設值",
452
472
  "settings.default_provider": "預設提供商",
453
473
  "settings.default_model": "預設模型",
@@ -464,6 +484,30 @@ const zhTW: Record<string, string> = {
464
484
  "settings.packages": "擴充功能與套件",
465
485
  "settings.package_placeholder": "npm:package-name",
466
486
  "settings.add": "新增",
487
+ "settings.install": "安裝",
488
+ "settings.browse_packages": "瀏覽並新增擴充包",
489
+ "settings.tab_recommended": "推薦安裝",
490
+ "settings.tab_search": "搜尋",
491
+ "settings.filter_all": "全部",
492
+ "settings.filter_available": "未安裝",
493
+ "settings.filter_installed": "已安裝",
494
+ "settings.search_packages_placeholder": "搜尋擴充包(模糊匹配)…",
495
+ "settings.no_packages_found": "沒有找到匹配的擴充包",
496
+ "settings.installed": "已安裝",
497
+ "settings.view_on_npm": "在 npm 檢視",
498
+ "settings.recommended_packages": "推薦擴充包(點擊安裝)",
499
+ "settings.install_all_recommended": "一鍵安裝全部推薦",
500
+ "settings.add_custom_package": "手動新增其他包…",
501
+ "pkg.hermes_memory": "長期記憶系統(記憶讀寫與整合)",
502
+ "pkg.context_mode": "大輸出處理與知識庫檢索",
503
+ "pkg.subagents": "子代理與多步編排",
504
+ "pkg.web_access": "網頁抓取與搜尋",
505
+ "pkg.smart_fetch": "瀏覽器指紋級網頁抓取",
506
+ "pkg.rtk_optimizer": "RTK 優化與規範",
507
+ "pkg.puppeteer": "瀏覽器自動化",
508
+ "pkg.intercom": "多會話協作通訊",
509
+ "pkg.prompt_template": "自訂提示詞模板與模型",
510
+ "pkg.notify": "跨平台通知",
467
511
  "settings.no_packages": "未安裝任何套件",
468
512
  "settings.import_export": "匯入與匯出",
469
513
  "settings.export": "匯出設定",
@@ -42,6 +42,8 @@ function getCustomProviders(modelsJson: PiModelsJson | null): Provider[] {
42
42
  baseUrl: cfg.baseUrl,
43
43
  api: cfg.api,
44
44
  apiKey: cfg.apiKey,
45
+ apiKeys: cfg.apiKeys,
46
+ activeKeyId: cfg.activeKeyId,
45
47
  authHeader: cfg.authHeader,
46
48
  headers: cfg.headers,
47
49
  compat: cfg.compat,
@@ -400,7 +402,7 @@ export const useConfigStore = create<ConfigState>((set, get) => ({
400
402
  }
401
403
  newProviders[providerId] = {
402
404
  ...newProviders[providerId],
403
- models: [...(newProviders[providerId]!.models ?? []), { ...model, enabled: true }],
405
+ models: [...(newProviders[providerId]!.models ?? []), { ...model, enabled: false }],
404
406
  };
405
407
  const updated = { providers: newProviders };
406
408
  set({ modelsJson: updated });
@@ -75,6 +75,16 @@ export interface ProviderOAuth {
75
75
  name: string;
76
76
  }
77
77
 
78
+ /**
79
+ * One entry in a custom provider's API key pool. Only the key referenced by
80
+ * `activeKeyId` is mirrored into `apiKey`, which is the field pi itself reads.
81
+ */
82
+ export interface ProviderApiKey {
83
+ id: string;
84
+ label?: string;
85
+ key: string;
86
+ }
87
+
78
88
  export interface Provider {
79
89
  id: string;
80
90
  name: string;
@@ -82,6 +92,8 @@ export interface Provider {
82
92
  baseUrl?: string;
83
93
  api?: ApiType;
84
94
  apiKey?: string;
95
+ apiKeys?: ProviderApiKey[];
96
+ activeKeyId?: string;
85
97
  authHeader?: boolean;
86
98
  headers?: Record<string, string>;
87
99
  models: Model[];
@@ -121,6 +133,8 @@ export interface CustomProviderConfig {
121
133
  baseUrl?: string;
122
134
  api?: ApiType;
123
135
  apiKey?: string;
136
+ apiKeys?: ProviderApiKey[];
137
+ activeKeyId?: string;
124
138
  authHeader?: boolean;
125
139
  headers?: Record<string, string>;
126
140
  models?: Model[];
package/vite.config.ts CHANGED
@@ -148,6 +148,17 @@ function piApiPlugin(): Plugin {
148
148
  res.setHeader("Content-Type", "application/json");
149
149
  res.end(JSON.stringify(data));
150
150
  },
151
+ "GET /api/pi/packages/search"(req, res) {
152
+ const parsed = new URL(req.url ?? "", "http://localhost");
153
+ const q = parsed.searchParams.get("q") ?? "";
154
+ pi.searchPackages(q).then((results: unknown) => {
155
+ res.setHeader("Content-Type", "application/json");
156
+ res.end(JSON.stringify({ results }));
157
+ }).catch(() => {
158
+ res.setHeader("Content-Type", "application/json");
159
+ res.end(JSON.stringify({ results: [] }));
160
+ });
161
+ },
151
162
  "POST /api/pi/subagents/update-agent"(req, res) {
152
163
  let body = "";
153
164
  req.on("data", (chunk: string) => (body += chunk));