Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 6 additions & 6 deletions docs/development/catalog-implementation.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
## 当前交付范围

- `/models`:模型数、配方数、调优对照组数及覆盖率、源记录提升中位数及范围、最佳提升及配方入口五项统计;搜索、家族/引擎/配方角色/硬件厂商/硬件型号多选/拓扑筛选、源记录增幅/名称/配方发布日期排序、卡片/表格视图、分页和统一配方详情入口。默认展示配方,模型/配方视角选择器与技术标签筛选已移除;旧 `view=models` 链接继续兼容,旧 `tag` 参数不再参与筛选。
- `/models/detail?modelId=…`:模型资料和可用配方。
- `/model?id=…`:模型资料和可用配方的短分享入口,使用通用静态页面,新增模型不需要重建页面。旧 `/models/detail?modelId=…` 使用 replace 转到新入口;显式 `dataVersion` 保留,筛选返回地址移入浏览器当前历史记录。普通站内点击同样通过历史记录保存目录版本及返回筛选条件,新标签页的短分享链接展示当前目录。
- 模型和配方详情在首屏脚本接管及目录数据等待阶段显示骨架屏,支持明暗主题、窄屏与减少动态效果偏好;请求结束后显示详情或原有错误状态。“需要 JavaScript”及原目录入口仅在 `<noscript>` 中展示,禁用脚本时隐藏骨架屏。
- `/models/recipe?modelId=…&recipeId=…`:以配方为主体,使用“部署配置 / 性能对照”两个 Tab;默认部署配置,保留 SHA-256 校验、完整 YAML 复制与配方版本选择。启动参数包含在原始 YAML 内,不再单独展示折叠章节;版本历史 Tab 与提交列表已移除。
- `tab=performance` 展示关联测量版本、完整原始报告 iframe 和独立打开入口;旧 `tab=history` 回退部署配置。Tab 支持分享、刷新和浏览器前进后退;左右方向键及 Home/End 移动焦点,Enter/Space 激活。
- `/recipe?model=…&id=…`:配方短分享入口,使用通用静态页面;普通链接只携带模型与配方标识,目录快照和返回筛选条件保存在浏览器历史记录。旧 `/models/recipe?modelId=…&recipeId=…` 自动使用 replace 转到新地址,与当前公开目录一致的 `dataVersion` 移入历史记录,其他显式快照与配方 `version` 参数继续保留。以配方为主体,使用“部署配置 / 性能对照”两个 Tab;默认部署配置,保留 SHA-256 校验、完整 YAML 复制与配方版本选择。启动参数包含在原始 YAML 内,不再单独展示折叠章节;版本历史 Tab 与提交列表已移除。
- `tab=performance` 展示关联测量版本及完整原始报告 iframe;概览中的“完整对照报告”自动切换并聚焦到对应报告模块;报告操作区仅保留“全屏观看”,退出全屏后恢复按钮焦点。多份报告通过 `report` 参数选择,刷新保持选择;旧 `tab=history` 回退部署配置。Tab 支持分享、刷新和浏览器前进后退;左右方向键及 Home/End 移动焦点,Enter/Space 激活。
- 目录与详情页不再展示正常联网状态的“公开目录 · SHA / Model Catalog”标识;离线、缓存和读取失败提示及重试入口保留。“隐藏已弃用记录”开关已移除,目录固定排除源数据中标记为 deprecated 的模型及配方;列表、模型摘要、筛选选项和统计使用同一可用记录集合,不删除源记录。旧 hidedep 参数忽略且不再生成。

配方详情顶部概览展示默认/调优/基线标记、当前版本及发布日期、引擎、完整硬件型号、拓扑、Chart、镜像与服务名称。调优对照逐组保留 baseline 和 optimized 的测量版本,并展示全部负载增幅;缺少分负载时才回退到该组 uplift,无数据时不补零。选择历史 YAML 不替换当前目录元数据,历史配置版本与测量版本分别标注。
Expand All @@ -19,9 +19,9 @@

配方卡片、模型卡片和详情页负载对照共用 `GainMeter`,渐变与数值色统一随明暗主题变化。各处统一以提升 100% 为满条,低于 100% 时按实际增幅填充,超过 100% 时条形封顶;数值保留实际增幅,不把超过 100%、零值或负值改写为视觉填充比例。
- `/models/evidence`:公开的数据来源、规则解释及缺失说明。
- 配方卡片有调优记录时显示“查看对照报告”,直达“性能对照”;基线和无调优记录显示“查看部署配置”,打开部署 Tab。表格使用“查看配方详情”,点击源记录增幅直达“性能对照”。模型与配方页面通过受限的 `returnTo` 保留原目录查询;旧 `/models/report`、目录 benchmark 参数和配方 `#benchmark` 链接以 history.replace 转到配方的性能 Tab。
- 切换 Tab 保留 `version`、`dataVersion` 与 `returnTo`,不重载目录、配置或已打开的报告。报告首次打开才加载,并按所选目录中的优化配方解析最新测量版本及首份关联报告;配置历史 `version` 不作为报告版本选择,页面明确显示实际测量版本。没有报告时仍保留 Tab 并显示空态。
- 报告语言跟随门户:兼容 `autotune-report-data` 的报告优先选择门户语言,仅调整初始化语言,保留原始比较数据和脚本。缺少对应语言、旧版 HTML 或元数据损坏时继续显示原报告;无法匹配语言时显示回退提示。完整报告入口使用当前报告语言,加载前使用门户语言;iframe 始终只授予 `allow-scripts`。
- 配方卡片有调优记录时显示“查看对照报告”,直达“性能对照”;基线和无调优记录显示“查看部署配置”,打开部署 Tab。表格使用“查看配方详情”,点击源记录增幅直达“性能对照”。模型与配方页面通过浏览器历史记录保留原目录查询,旧链接的 `returnTo` 校验后迁入历史记录;旧 `/models/report`、目录 benchmark 参数和配方 `#benchmark` 链接以 history.replace 转到配方的性能 Tab。
- 切换 Tab 保留 `version` 与选中的 `report`,并通过历史记录保留目录快照和返回筛选条件,不重载目录、配置或已打开的报告。报告首次打开才加载,并按所选目录中的优化配方解析最新测量版本及关联报告;配置历史 `version` 不作为报告版本选择,页面明确显示实际测量版本。没有报告时仍保留 Tab 并显示空态。
- 报告语言跟随门户:兼容 `autotune-report-data` 的报告优先选择门户语言,仅调整初始化语言,保留原始比较数据和脚本。缺少对应语言、旧版 HTML 或元数据损坏时继续显示原报告;无法匹配语言时显示回退提示。全屏报告保留当前报告语言;iframe 始终只授予 `allow-scripts`。
- 官网导航、首页 Catalog 入口和 Footer 进入站内目录;公共 Header/Footer 和双主题延续现有实现。
- 不修改 model-catalog 的源文件、生成程序或发布流水线,不创建自托管数据服务,不增加数据库和写入接口。

Expand Down
12 changes: 10 additions & 2 deletions src/components/LanguageSwitch/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react';
import * as Select from '@radix-ui/react-select';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import useIsBrowser from '@docusaurus/useIsBrowser';
import { useLocation } from '@docusaurus/router';
import { useHistory, useLocation } from '@docusaurus/router';
import { languageHref, rememberLocale } from '@site/src/lib/locale';
import styles from './styles.module.css';

Expand All @@ -14,6 +14,7 @@ const languages = [
export default function LanguageSwitch() {
const { i18n, siteConfig } = useDocusaurusContext();
const location = useLocation();
const history = useHistory();
const browser = useIsBrowser();
const english = i18n.currentLocale === 'en';
const href = languageHref(
Expand All @@ -30,7 +31,14 @@ export default function LanguageSwitch() {
value={i18n.currentLocale}
onValueChange={(locale) => {
rememberLocale(locale);
if (locale !== i18n.currentLocale) window.location.assign(href);
if (locale !== i18n.currentLocale) {
if (location.state) {
// A full reload is needed for translated bundles. Carry the current
// entry's navigation context into the target locale before reloading.
history.push(href, location.state);
window.location.reload();
} else window.location.assign(href);
}
}}
>
<Select.Trigger
Expand Down
47 changes: 47 additions & 0 deletions src/features/catalog/CatalogLink.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import React from 'react';
import Link from '@docusaurus/Link';
import { useHistory } from '@docusaurus/router';
import { useSitePath } from '@site/src/lib/use-site-path';
import { modelNavigationState } from './routes';

type Props = Omit<React.ComponentProps<typeof Link>, 'to' | 'href'> & {
to: string;
version: string;
returnTo?: string;
};

// Keep the public href shareable while retaining the current list and snapshot
// on ordinary in-tab navigation. Native new-tab/copy-link behavior stays intact.
export default function CatalogLink({
to,
version,
returnTo,
onClick,
...props
}: Props) {
const history = useHistory();
const { siteHref } = useSitePath();
return (
<Link
{...props}
to={to}
onClick={(event) => {
onClick?.(event);
if (
(!to.startsWith('/model?') && !to.startsWith('/recipe?')) ||
event.defaultPrevented ||
event.button !== 0 ||
event.metaKey ||
event.ctrlKey ||
event.shiftKey ||
event.altKey ||
props.download ||
(props.target && props.target !== '_self')
)
return;
event.preventDefault();
history.push(siteHref(to), modelNavigationState(version, returnTo));
}}
/>
);
}
49 changes: 35 additions & 14 deletions src/features/catalog/CatalogPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useSitePath } from '@site/src/lib/use-site-path';
import React, { useEffect, useMemo, useRef, useState } from 'react';
import Layout from '@theme/Layout';
import Link from '@docusaurus/Link';
import CatalogLink from './CatalogLink';
import useIsBrowser from '@docusaurus/useIsBrowser';
import useIsomorphicLayoutEffect from '@docusaurus/useIsomorphicLayoutEffect';
import { useHistory, useLocation } from '@docusaurus/router';
Expand All @@ -29,7 +30,11 @@ import {
import { Icon, RecipeCard, SourceState, Stats } from './components';
import { useCatalog } from './useCatalog';
import { variantVendors, vendorLabel } from './hardware';
import { legacyCatalogReportHref, reportHref } from './routes';
import {
legacyCatalogReportHref,
modelNavigationState,
reportHref,
} from './routes';
import CatalogSelect from './CatalogSelect';
import ModelCard, { ModelRecipeList, ModelTuning } from './ModelCard';
import styles from './styles.module.css';
Expand Down Expand Up @@ -65,8 +70,12 @@ export default function CatalogPage() {
? legacyCatalogReportHref(location.search)
: null;
useEffect(() => {
if (legacyReport) history.replace(siteHref(legacyReport));
}, [history, legacyReport, siteHref]);
if (legacyReport)
history.replace(
siteHref(legacyReport),
modelNavigationState(version, returnTo),
);
}, [history, legacyReport, siteHref, version, returnTo]);
const [draft, setDraft] = useState(''),
search = useRef<HTMLInputElement>(null),
filters = useRef<HTMLFormElement>(null),
Expand Down Expand Up @@ -204,7 +213,7 @@ export default function CatalogPage() {
})}
</p>
</header>
<Stats catalog={c} />
<Stats catalog={c} returnTo={returnTo} />
{state.unavailable ? (
<p className={styles.notice} role="alert">
{state.status === 'loading'
Expand Down Expand Up @@ -668,11 +677,13 @@ export default function CatalogPage() {
data-model-id={summary.model.name}
>
<th>
<Link
<CatalogLink
to={modelHref(summary.model, c.commit, returnTo)}
version={c.commit}
returnTo={returnTo}
>
{summary.model.displayName || summary.model.name}
</Link>
</CatalogLink>
<p>
{summary.model.description ||
translate({
Expand Down Expand Up @@ -747,24 +758,32 @@ export default function CatalogPage() {
{items.map((r) => (
<tr key={r.key}>
<th>
<Link to={modelHref(r.model, c.commit, returnTo)}>
<CatalogLink
to={modelHref(r.model, c.commit, returnTo)}
version={c.commit}
returnTo={returnTo}
>
{r.model.displayName ?? r.model.name}
</Link>
</CatalogLink>
</th>
<td>
<Link
<CatalogLink
to={detailHref(r, c.commit, undefined, returnTo)}
version={c.commit}
returnTo={returnTo}
>
{r.variant.id}
</Link>
</CatalogLink>
<br />
{r.variant.engine}
</td>
<td>{translateCopy(hardwareText(r.variant))}</td>
<td>
{r.quotedGain != null && reportUrl(r) ? (
<Link
<CatalogLink
to={reportHref(r, c.commit, returnTo)}
version={c.commit}
returnTo={returnTo}
aria-label={translate(
{
id: 'site.50123e2643ec',
Expand All @@ -774,7 +793,7 @@ export default function CatalogPage() {
)}
>
{`${r.quotedGain >= 0 ? '+' : ''}${r.quotedGain.toFixed(1)}%`}
</Link>
</CatalogLink>
) : r.quotedGain == null ? (
translate({
id: 'site.756762e293f2',
Expand All @@ -786,14 +805,16 @@ export default function CatalogPage() {
<small>{r.workload}</small>
</td>
<td>
<Link
<CatalogLink
to={detailHref(r, c.commit, undefined, returnTo)}
version={c.commit}
returnTo={returnTo}
>
{translate({
id: 'site.ad28b6a65be6',
message: '查看配方详情',
})}
</Link>
</CatalogLink>
</td>
</tr>
))}
Expand Down
Loading
Loading