From cbc73f111c8114b26c0816e959d77b5284d76a49 Mon Sep 17 00:00:00 2001 From: suzmii Date: Thu, 3 Sep 2026 19:42:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E5=A4=96=E9=83=A8=20API=20Ke?= =?UTF-8?q?y=20=E8=A1=A8=E5=B9=B6=E7=BB=9F=E4=B8=80=20Router=20=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 恢复 external_api_key 表及客户端绑定为 master 原始结构 将 LLM Router 凭据、状态、撤销和缓存统一收敛到 llm_router_account 移除后台与契约中的 purpose 字段及 Router 专用撤销 procedure 同步更新架构文档并补齐相关测试契约 --- apps/admin-web/src/api/adminApiClient.ts | 1 - apps/admin-web/src/api/adminApiTypes.ts | 3 - .../pages/AdminDatabaseTablesPage.test.tsx | 3 +- .../src/pages/AdminDatabaseTablesPage.tsx | 26 +----- ...】server-rs与SpacetimeDB数据契约-2026-05-15.md | 4 +- server-rs/crates/api-server/src/admin.rs | 48 +--------- .../api-server/src/external_api_keys.rs | 16 ---- .../crates/shared-contracts/src/admin.rs | 2 - .../src/active/mapper/external_api_key.rs | 57 +----------- .../spacetime-client/src/external_api_key.rs | 25 ----- .../spacetime-client/src/module_bindings.rs | 2 - .../external_api_key_create_input_type.rs | 7 -- .../external_api_key_snapshot_type.rs | 7 -- .../module_bindings/external_api_key_type.rs | 27 ------ ...llm_router_api_key_and_return_procedure.rs | 59 ------------ .../src/external_api_key_storage.rs | 93 +------------------ .../crates/spacetime-module/src/migration.rs | 26 ------ 17 files changed, 8 insertions(+), 398 deletions(-) delete mode 100644 server-rs/crates/spacetime-client/src/module_bindings/revoke_llm_router_api_key_and_return_procedure.rs diff --git a/apps/admin-web/src/api/adminApiClient.ts b/apps/admin-web/src/api/adminApiClient.ts index a248e2ecb..cd73d02d8 100644 --- a/apps/admin-web/src/api/adminApiClient.ts +++ b/apps/admin-web/src/api/adminApiClient.ts @@ -950,7 +950,6 @@ function buildExternalApiKeyQuery(query: AdminExternalApiKeyListQuery) { appendQueryParam(params, 'createdAfter', query.createdAfter); appendQueryParam(params, 'createdBefore', query.createdBefore); appendQueryParam(params, 'status', query.status); - appendQueryParam(params, 'purpose', query.purpose); if (typeof query.limit === 'number' && Number.isFinite(query.limit)) { params.set('limit', String(Math.floor(query.limit))); } diff --git a/apps/admin-web/src/api/adminApiTypes.ts b/apps/admin-web/src/api/adminApiTypes.ts index 062ec091e..d8cda23c0 100644 --- a/apps/admin-web/src/api/adminApiTypes.ts +++ b/apps/admin-web/src/api/adminApiTypes.ts @@ -284,7 +284,6 @@ export interface AdminExternalApiKeyListQuery { createdAfter?: string; createdBefore?: string; status?: 'active' | 'revoked'; - purpose?: 'external-editor' | 'llm-router'; limit?: number; offset?: number; sortColumn?: @@ -292,7 +291,6 @@ export interface AdminExternalApiKeyListQuery { | 'ownerUserId' | 'name' | 'keyPrefix' - | 'purpose' | 'createdAt' | 'lastUsedAt' | 'updatedAt'; @@ -304,7 +302,6 @@ export interface AdminExternalApiKeyPayload { ownerUserId: string; name: string; keyPrefix: string; - purpose: string; scopes: string[]; createdAt: string; lastUsedAt: string | null; diff --git a/apps/admin-web/src/pages/AdminDatabaseTablesPage.test.tsx b/apps/admin-web/src/pages/AdminDatabaseTablesPage.test.tsx index 167d00d82..88828fd4e 100644 --- a/apps/admin-web/src/pages/AdminDatabaseTablesPage.test.tsx +++ b/apps/admin-web/src/pages/AdminDatabaseTablesPage.test.tsx @@ -109,7 +109,6 @@ test('external_api_key 使用专用安全查询且详情不展示原始 JSON', a ownerUserId: 'user-1', name: 'agc_auto_generate', keyPrefix: 'tnr_sk_fixture', - purpose: 'llm-router', scopes: ['llm:responses'], createdAt: '2026-08-29T00:00:00Z', lastUsedAt: null, @@ -135,7 +134,7 @@ test('external_api_key 使用专用安全查询且详情不展示原始 JSON', a await waitFor(() => { expect(getAdminExternalApiKeys).toHaveBeenLastCalledWith( 'admin-token', - expect.objectContaining({ ownerUserId: 'user-1', purpose: undefined }), + expect.objectContaining({ ownerUserId: 'user-1' }), ); }); expect(await screen.findByText('tnr_sk_fixture')).toBeTruthy(); diff --git a/apps/admin-web/src/pages/AdminDatabaseTablesPage.tsx b/apps/admin-web/src/pages/AdminDatabaseTablesPage.tsx index 1f141e261..47659fd47 100644 --- a/apps/admin-web/src/pages/AdminDatabaseTablesPage.tsx +++ b/apps/admin-web/src/pages/AdminDatabaseTablesPage.tsx @@ -47,7 +47,6 @@ type ExternalApiKeySortColumn = | 'ownerUserId' | 'name' | 'keyPrefix' - | 'purpose' | 'createdAt' | 'lastUsedAt' | 'updatedAt'; @@ -1219,9 +1218,6 @@ function AdminExternalApiKeysPanel({ const [createdAfter, setCreatedAfter] = useState(''); const [createdBefore, setCreatedBefore] = useState(''); const [status, setStatus] = useState<'' | 'active' | 'revoked'>(''); - const [purpose, setPurpose] = useState<'' | 'external-editor' | 'llm-router'>( - '', - ); const [limit, setLimit] = useState('100'); const [sortColumn, setSortColumn] = useState(''); const [sortDirection, setSortDirection] = useState<'asc' | 'desc'>('desc'); @@ -1269,7 +1265,6 @@ function AdminExternalApiKeysPanel({ createdAfter: createdAfter.trim() || undefined, createdBefore: createdBefore.trim() || undefined, status: status || undefined, - purpose: purpose || undefined, limit: parseLimit(limit), offset: nextOffset, sortColumn: sortColumn || undefined, @@ -1294,7 +1289,6 @@ function AdminExternalApiKeysPanel({ setCreatedAfter(''); setCreatedBefore(''); setStatus(''); - setPurpose(''); setLimit('100'); setSortColumn(''); setSortDirection('desc'); @@ -1359,19 +1353,6 @@ function AdminExternalApiKeysPanel({ onChange={(event) => setName(event.target.value)} /> -