From d2d3fcf57ba5647d23817c077a49b9d4b3132217 Mon Sep 17 00:00:00 2001
From: superman2003 <2112076433zcr@gmail.com>
Date: Tue, 14 Jul 2026 12:24:25 +0800
Subject: [PATCH] feat(frontend): show Grok monitoring and Free plan badge
---
frontend/src/api/admin/channelMonitor.ts | 2 +-
.../monitor/MonitorAdvancedRequestConfig.vue | 7 +-
.../admin/monitor/MonitorFiltersBar.vue | 2 +
.../admin/monitor/MonitorFormDialog.vue | 29 +++-
.../monitor/MonitorTemplateManagerDialog.vue | 7 +-
.../src/components/common/GrokFreeIcon.vue | 15 ++
.../components/common/PlatformTypeBadge.vue | 48 ++++++-
.../__tests__/PlatformTypeBadge.grok.spec.ts | 64 +++++++++
.../components/user/monitor/MonitorCard.vue | 1 +
.../components/user/monitor/ProviderIcon.vue | 5 +
.../composables/useChannelMonitorFormat.ts | 16 ++-
frontend/src/constants/channelMonitor.ts | 5 +
frontend/src/i18n/locales/en/dashboard.ts | 3 +-
frontend/src/i18n/locales/zh/dashboard.ts | 3 +-
frontend/src/views/admin/AccountsView.vue | 23 ++-
.../AccountsView.sparkShadow.spec.ts | 75 ++++++++++
.../__tests__/ChannelMonitorView.grok.spec.ts | 136 ++++++++++++++++++
17 files changed, 423 insertions(+), 18 deletions(-)
create mode 100644 frontend/src/components/common/GrokFreeIcon.vue
create mode 100644 frontend/src/components/common/__tests__/PlatformTypeBadge.grok.spec.ts
create mode 100644 frontend/src/views/admin/__tests__/ChannelMonitorView.grok.spec.ts
diff --git a/frontend/src/api/admin/channelMonitor.ts b/frontend/src/api/admin/channelMonitor.ts
index 0b9c62231c..de605351e3 100644
--- a/frontend/src/api/admin/channelMonitor.ts
+++ b/frontend/src/api/admin/channelMonitor.ts
@@ -5,7 +5,7 @@
import { apiClient } from '../client'
-export type Provider = 'openai' | 'anthropic' | 'gemini'
+export type Provider = 'openai' | 'anthropic' | 'gemini' | 'grok'
export type MonitorStatus = 'operational' | 'degraded' | 'failed' | 'error'
export type BodyOverrideMode = 'off' | 'merge' | 'replace'
export type APIMode = 'chat_completions' | 'responses'
diff --git a/frontend/src/components/admin/monitor/MonitorAdvancedRequestConfig.vue b/frontend/src/components/admin/monitor/MonitorAdvancedRequestConfig.vue
index 404b691692..c4ccdfa3ac 100644
--- a/frontend/src/components/admin/monitor/MonitorAdvancedRequestConfig.vue
+++ b/frontend/src/components/admin/monitor/MonitorAdvancedRequestConfig.vue
@@ -109,6 +109,8 @@ import { useI18n } from 'vue-i18n'
import type { APIMode, BodyOverrideMode, Provider } from '@/api/admin/channelMonitor'
import {
API_MODE_RESPONSES,
+ DEFAULT_GROK_MODEL,
+ PROVIDER_GROK,
PROVIDER_OPENAI,
} from '@/constants/channelMonitor'
@@ -305,11 +307,12 @@ const bodyPlaceholder = computed(() => {
}
return '{\n "model": "gpt-4o-mini",\n "instructions": "You are a health check endpoint. Reply briefly.",\n "input": "Reply with exactly: ok",\n "max_output_tokens": 20,\n "stream": false\n}'
}
- if (props.provider === PROVIDER_OPENAI) {
+ if (props.provider === PROVIDER_OPENAI || props.provider === PROVIDER_GROK) {
if (props.bodyOverrideMode === 'merge') {
return '{\n "max_tokens": 20\n}'
}
- return '{\n "model": "gpt-4o-mini",\n "messages": [{"role":"user","content":"Reply with exactly: ok"}],\n "max_tokens": 20,\n "stream": false\n}'
+ const model = props.provider === PROVIDER_GROK ? DEFAULT_GROK_MODEL : 'gpt-4o-mini'
+ return `{\n "model": "${model}",\n "messages": [{"role":"user","content":"Reply with exactly: ok"}],\n "max_tokens": 20,\n "stream": false\n}`
}
if (props.bodyOverrideMode === 'merge') {
return '{\n "system": "You are Claude Code..."\n}'
diff --git a/frontend/src/components/admin/monitor/MonitorFiltersBar.vue b/frontend/src/components/admin/monitor/MonitorFiltersBar.vue
index eb2a5c7857..544238f49c 100644
--- a/frontend/src/components/admin/monitor/MonitorFiltersBar.vue
+++ b/frontend/src/components/admin/monitor/MonitorFiltersBar.vue
@@ -70,6 +70,7 @@ import {
PROVIDER_OPENAI,
PROVIDER_ANTHROPIC,
PROVIDER_GEMINI,
+ PROVIDER_GROK,
} from '@/constants/channelMonitor'
defineProps<{
@@ -94,6 +95,7 @@ const providerFilterOptions = computed(() => [
{ value: PROVIDER_OPENAI, label: t('monitorCommon.providers.openai') },
{ value: PROVIDER_ANTHROPIC, label: t('monitorCommon.providers.anthropic') },
{ value: PROVIDER_GEMINI, label: t('monitorCommon.providers.gemini') },
+ { value: PROVIDER_GROK, label: t('monitorCommon.providers.grok') },
])
const enabledFilterOptions = computed(() => [
diff --git a/frontend/src/components/admin/monitor/MonitorFormDialog.vue b/frontend/src/components/admin/monitor/MonitorFormDialog.vue
index e6cab8edf1..14a9e2dd15 100644
--- a/frontend/src/components/admin/monitor/MonitorFormDialog.vue
+++ b/frontend/src/components/admin/monitor/MonitorFormDialog.vue
@@ -13,15 +13,16 @@
-
+