From ac45a72e0e7bccaa2906b4760deb52ad2df47a46 Mon Sep 17 00:00:00 2001 From: jialin Date: Wed, 3 Jun 2026 11:56:31 +0800 Subject: [PATCH] fix: api acccess info model name --- .../model-routes/hooks/use-open-playground.ts | 14 ++++++++---- .../model-routes/hooks/use-routes-columns.tsx | 14 +++++------- src/pages/model-routes/index.tsx | 22 +++++-------------- 3 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/pages/model-routes/hooks/use-open-playground.ts b/src/pages/model-routes/hooks/use-open-playground.ts index a91a86c3..8045e07c 100644 --- a/src/pages/model-routes/hooks/use-open-playground.ts +++ b/src/pages/model-routes/hooks/use-open-playground.ts @@ -6,6 +6,13 @@ import { categoryToPathMap } from '../../llmodels/config/button-actions'; const useOpenPlayground = () => { const navigate = useNavigate(); + const generateModelName = (row: any) => { + const org = getOrgById(row.owner_principal_id) ?? getCurrentOrg(); + const rawModel = + org?.name && !org.is_platform ? `${org.name}/${row.name}` : row.name; + return rawModel; + }; + const handleOpenPlayGround = (row: any) => { // Match the id format the OpenAI ``/v1/models`` endpoint reports: an // org's models are namespaced as ``{org}/{name}``, while the platform @@ -13,9 +20,7 @@ const useOpenPlayground = () => { // ``owner_principal_id`` (an org principal id); fall back to the Org the // caller is currently acting under for the admin "All" view, where the // row's owner still resolves via the platform-wide org cache. - const org = getOrgById(row.owner_principal_id) ?? getCurrentOrg(); - const rawModel = - org?.name && !org.is_platform ? `${org.name}/${row.name}` : row.name; + const rawModel = generateModelName(row); const modelName = encodeURIComponent(rawModel); for (const [category, path] of Object.entries(categoryToPathMap)) { @@ -37,7 +42,8 @@ const useOpenPlayground = () => { navigate(`/playground/chat?model=${modelName}`); }; return { - handleOpenPlayGround + handleOpenPlayGround, + generateModelName }; }; diff --git a/src/pages/model-routes/hooks/use-routes-columns.tsx b/src/pages/model-routes/hooks/use-routes-columns.tsx index 583ff1bc..650ac593 100644 --- a/src/pages/model-routes/hooks/use-routes-columns.tsx +++ b/src/pages/model-routes/hooks/use-routes-columns.tsx @@ -9,9 +9,10 @@ import { type TableColumnProps } from '@gpustack/core-ui'; import { useIntl } from '@umijs/max'; +import { useMemoizedFn } from 'ahooks'; import { MenuProps } from 'antd'; import dayjs from 'dayjs'; -import { useCallback, useMemo } from 'react'; +import { useMemo } from 'react'; import { RouteItem } from '../config/types'; import type { ModelRouteConfigAction } from '../plugin'; @@ -128,10 +129,8 @@ const useAccessColumns = ({ }); }, [configActions, onConfigAction]); - const filterActions = useCallback( - (record: RouteItem) => - sortedActions.filter((a) => (a.show ? a.show(record) : true)), - [sortedActions] + const filterActions = useMemoizedFn((record: RouteItem) => + sortedActions.filter((a) => (a.show ? a.show(record) : true)) ); // Plugin entries carry their own `onClick` (wired to `onConfigAction` @@ -139,15 +138,14 @@ const useAccessColumns = ({ // when present. Built-ins fall through to the page's `handleSelect` // dispatcher keyed by `val`. Mirrors the api-keys page's onSelect // path — no key lookup needed. - const onSelectAction = useCallback( + const onSelectAction = useMemoizedFn( (val: string, record: RouteItem, item?: RankedAction) => { if (item?.onClick) { item.onClick(record); return; } handleSelect(val, record); - }, - [handleSelect] + } ); return useMemo(() => { diff --git a/src/pages/model-routes/index.tsx b/src/pages/model-routes/index.tsx index f7cdad10..999c5311 100644 --- a/src/pages/model-routes/index.tsx +++ b/src/pages/model-routes/index.tsx @@ -121,7 +121,7 @@ const ModelRoutes: React.FC = () => { openAccessControlModalStatus } = useAccessControl(); const { sourceModels, fetchSourceModels } = useTargetSourceModels(); - const { handleOpenPlayGround } = useOpenPlayground(); + const { handleOpenPlayGround, generateModelName } = useOpenPlayground(); const { apiAccessInfo, openViewAPIInfo, closeViewAPIInfo } = useViewApIInfo(); const [registerRouteConfig, setRegisterRouteConfig] = useAtom( registerRouteConfigAtom @@ -214,7 +214,10 @@ const ModelRoutes: React.FC = () => { } else if (val === 'chat') { handleOpenPlayGround(row); } else if (val === 'api') { - openViewAPIInfo(row); + openViewAPIInfo({ + ...row, + name: generateModelName(row) + }); } }); @@ -308,18 +311,8 @@ const ModelRoutes: React.FC = () => { } }, [registerRouteConfig, dataSource.loadend]); - // Generic per-row plugin slot. Each enterprise plugin contributes a - // `{ key, labelId, icon, priority, form, useCreate }` entry; the host - // renders a button per entry in the dropdown and renders one - // `ModelRouteConfigActionMount` per entry — those mounts own each - // entry's controller and register it back into `controllersRef` so - // dropdown clicks can route to the correct `openModal`. See - // `./plugin.tsx`. - // - // The action list is read once. Plugins are registered at boot and - // never recompute, so the reference is stable for the lifetime of - // the page and `useMemo([])` is safe. const configActions = useMemo(() => getModelRouteConfigActions(), []); + const controllersRef = useRef< Record >({}); @@ -336,9 +329,6 @@ const ModelRoutes: React.FC = () => { } ); - // Per-row save closes the drawer and refetches the table. The wrapped - // `fetchAPI` above takes care of bumping `pluginContext.refreshToken` - // for derived plugin data. const handleConfigActionOk = useMemoizedFn(() => { fetchData(); });