diff --git a/evalscope/service/api_models/common.py b/evalscope/service/api_models/common.py index 1d22882ce..dd30b9852 100644 --- a/evalscope/service/api_models/common.py +++ b/evalscope/service/api_models/common.py @@ -11,6 +11,7 @@ class ApiResponseModel(BaseModel): class ConfigResponse(ApiResponseModel): outputs_root: str + version: str class DataFrameResponse(ApiResponseModel): diff --git a/evalscope/service/app.py b/evalscope/service/app.py index 6b750faae..453d23150 100644 --- a/evalscope/service/app.py +++ b/evalscope/service/app.py @@ -8,6 +8,7 @@ from flask import Flask, jsonify, send_from_directory from evalscope.utils.logger import get_logger +from evalscope.version import __version__ from .api_models import ConfigResponse from .blueprints import bp_eval, bp_perf, bp_reports @@ -67,6 +68,7 @@ def get_config(): ConfigResponse, { 'outputs_root': outputs_root or _DEFAULT_ROOT, + 'version': __version__, }, ) diff --git a/evalscope/web/src/api/generated/contracts.schema.json b/evalscope/web/src/api/generated/contracts.schema.json index c458b83ed..955324053 100644 --- a/evalscope/web/src/api/generated/contracts.schema.json +++ b/evalscope/web/src/api/generated/contracts.schema.json @@ -485,10 +485,14 @@ "properties": { "outputs_root": { "type": "string" + }, + "version": { + "type": "string" } }, "required": [ - "outputs_root" + "outputs_root", + "version" ], "type": "object" }, diff --git a/evalscope/web/src/api/generated/contracts.ts b/evalscope/web/src/api/generated/contracts.ts index 6215c576b..79bdda059 100644 --- a/evalscope/web/src/api/generated/contracts.ts +++ b/evalscope/web/src/api/generated/contracts.ts @@ -167,6 +167,7 @@ export interface PredictionToolCall { } export interface ConfigResponse { outputs_root: string; + version: string; } export interface DataFrameResponse { columns: string[]; diff --git a/evalscope/web/src/components/nav/TopNav.tsx b/evalscope/web/src/components/nav/TopNav.tsx index b5ee82bf0..43b285311 100644 --- a/evalscope/web/src/components/nav/TopNav.tsx +++ b/evalscope/web/src/components/nav/TopNav.tsx @@ -1,6 +1,8 @@ import { useState } from 'react' import { NavLink } from 'react-router-dom' +import Badge from '@/components/ui/Badge' import { useLocale } from '@/contexts/LocaleContext' +import { useAppConfig } from '@/contexts/ReportsContext' import LocaleToggle from './LocaleToggle' import ThemeToggle from './ThemeToggle' import { BarChart3, Gauge, FlaskConical, BookOpen, FileText, Menu, X } from 'lucide-react' @@ -28,6 +30,7 @@ const mobileLinkClass = ({ isActive }: { isActive: boolean }) => export default function TopNav() { const { t } = useLocale() + const { config } = useAppConfig() const [mobileOpen, setMobileOpen] = useState(false) const navItems = [ @@ -58,6 +61,11 @@ export default function TopNav() { EvalScope + {config?.version && ( + + v{config.version} + + )} {/* Desktop nav — full text, lg+ */}