|
- {a.site?.url ? (
-
-
- {a.site?.name || '-'}
-
-
- ) : (
-
- {a.site?.name || '-'}
-
- )}
+
|
{(() => {
diff --git a/src/web/pages/Models.tsx b/src/web/pages/Models.tsx
index 38d4fe1..da6ecf5 100644
--- a/src/web/pages/Models.tsx
+++ b/src/web/pages/Models.tsx
@@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useLocation } from 'react-router-dom';
import { api } from '../api.js';
import { BrandGlyph, getBrand, hashColor, BrandIcon, type BrandInfo } from '../components/BrandIcon.js';
+import SiteBadgeLink from '../components/SiteBadgeLink.js';
import { useToast } from '../components/Toast.js';
import ModernSelect from '../components/ModernSelect.js';
import { useAnimatedVisibility } from '../components/useAnimatedVisibility.js';
@@ -168,6 +169,18 @@ export default function Models() {
const latestPrimaryRequestRef = useRef(0);
const latestMetadataRequestRef = useRef(0);
const location = useLocation();
+ const siteIdByName = useMemo(() => {
+ const index = new Map();
+ for (const model of data.models) {
+ for (const source of model.pricingSources || []) {
+ const siteName = String(source.siteName || '').trim();
+ const siteId = Number(source.siteId);
+ if (!siteName || !Number.isFinite(siteId) || siteId <= 0 || index.has(siteName)) continue;
+ index.set(siteName, Math.trunc(siteId));
+ }
+ }
+ return index;
+ }, [data.models]);
const loadBaseMarketplace = useCallback(async (refresh = false) => {
const requestId = ++latestPrimaryRequestRef.current;
@@ -688,7 +701,7 @@ export default function Models() {
style={{ border: '1px solid var(--color-border-light)', borderRadius: 8, padding: 8 }}
>
- {source.siteName} · {source.username || `ID:${source.accountId}`}
+ · {source.username || `ID:${source.accountId}`}
{Object.entries(source.groupPricing).map(([group, pricing]) => (
@@ -719,7 +732,7 @@ export default function Models() {
{m.accounts.map(a => (
- | {a.site} |
+ |
{a.username || `ID:${a.id}`} |
{a.tokens.length > 0 ? a.tokens.map(t => (
@@ -849,7 +862,7 @@ export default function Models() {
style={{ border: '1px solid var(--color-border-light)', borderRadius: 8, padding: 8 }}
>
- {source.siteName} · {source.username || `ID:${source.accountId}`}
+ · {source.username || `ID:${source.accountId}`}
{Object.entries(source.groupPricing).map(([group, pricing]) => (
@@ -878,7 +891,7 @@ export default function Models() {
|
{m.accounts.map(a => (
- | {a.site} |
+ |
{a.username || `ID:${a.id}`} |
{a.tokens.length > 0 ? a.tokens.map(t => (
diff --git a/src/web/pages/ProxyLogs.tsx b/src/web/pages/ProxyLogs.tsx
index 3025400..1931e62 100644
--- a/src/web/pages/ProxyLogs.tsx
+++ b/src/web/pages/ProxyLogs.tsx
@@ -10,6 +10,7 @@ import {
} from '../api.js';
import { useToast } from '../components/Toast.js';
import { ModelBadge } from '../components/BrandIcon.js';
+import SiteBadgeLink from '../components/SiteBadgeLink.js';
import { MobileCard, MobileField } from '../components/MobileCard.js';
import { MobileDrawer } from '../components/MobileDrawer.js';
import { useIsMobile } from '../components/useIsMobile.js';
@@ -329,6 +330,16 @@ export default function ProxyLogs() {
if (!siteFilter) return '全部站点';
return siteOptions.find((option) => option.value === String(siteFilter))?.label || `站点 #${siteFilter}`;
}, [siteFilter, siteOptions]);
+ const siteIdByName = useMemo(() => {
+ const index = new Map();
+ for (const site of sites) {
+ const siteName = String(site?.name || '').trim();
+ const siteId = Number(site?.id);
+ if (!siteName || !Number.isFinite(siteId) || siteId <= 0 || index.has(siteName)) continue;
+ index.set(siteName, Math.trunc(siteId));
+ }
+ return index;
+ }, [sites]);
const load = useCallback(async (silent = false) => {
const seq = ++loadSeq.current;
@@ -608,7 +619,7 @@ export default function ProxyLogs() {
)}
>
-
+ } />
{downstreamKeySummary ? : null}
@@ -709,7 +720,7 @@ export default function ProxyLogs() {
|
- {log.siteName || '-'}
+
|
| |