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+ */}