{{ currentNavLabel }}
📱
总设备数
{{ dashboard.total_devices || 0 }}
📦
活跃积分包
{{ dashboard.active_packages || 0 }}
总积分消耗
{{ formatNumber(dashboard.total_credits_used) }}
📊
今日请求数
{{ formatNumber(dashboard.today_requests) }}
🟢
在线节点
{{ dashboard.online_nodes || 0 }}
🌐
总节点数
{{ dashboard.total_nodes || 0 }}
设备ID指纹首次出现最后活跃 状态累计消耗操作
{{ d.device_id }} {{ d.fingerprint ? (d.fingerprint.length > 16 ? d.fingerprint.slice(0,16) + '...' : d.fingerprint) : '-' }} {{ formatTime(d.first_seen) }} {{ formatTime(d.last_active) }} {{ d.is_blocked ? '已封禁' : '正常' }} {{ formatNumber(d.total_credits_used) }}
暂无数据
IDBuddy Key联系方式状态 积分余额累计消耗设备数最近活跃创建时间操作
{{ u.id }} {{ u.buddy_key }} {{ u.contact || '-' }} {{ u.status === 'blocked' ? '已封禁' : '正常' }} {{ formatNumber(u.total_credits) }} {{ formatNumber(u.total_used) }} {{ u.device_count }} {{ u.last_active_at ? formatTime(u.last_active_at) : '-' }} {{ formatTime(u.created_at) }}
暂无数据
兑换码状态批次积分值生成时间 激活时间过期时间操作
{{ c.code }} {{ codeStatusText(c.status) }} {{ c.batch_id || '-' }} {{ c.credits != null ? c.credits : '-' }} {{ formatTime(c.generated_at) }} {{ formatTime(c.activated_at) }} {{ formatTime(c.expired_at) }}
暂无数据

套餐模板列表

ID名称积分有效期(天) 价格解绑次数描述状态操作
{{ p.id }} {{ p.name }} {{ formatNumber(p.credits) }} {{ p.duration_days }} {{ p.price != null ? '¥' + p.price : '-' }} {{ p.max_unbinds }} {{ p.description || '-' }} {{ p.is_active ? '启用' : '停用' }}
暂无数据
ID设备ID套餐名总积分 剩余积分状态激活时间过期时间 解绑次数操作
{{ p.id }} {{ p.device_id ? (p.device_id.length > 16 ? p.device_id.slice(0,16) + '...' : p.device_id) : '-' }} {{ p.package_name || '-' }} {{ formatNumber(p.total_credits) }} {{ formatNumber(p.remaining_credits) }} {{ pkgStatusText(p.status) }} {{ formatTime(p.activated_at) }} {{ formatTime(p.expires_at) }} {{ p.unbind_count }}/{{ p.max_unbinds }}
暂无数据

节点列表

ID名称提供商地址权重 最大并发模式区域支持模型启用健康延迟操作
{{ n.id }} {{ n.name }} {{ n.provider }} {{ n.base_url }} {{ n.weight }} {{ n.max_concurrent }} {{ n.mode }} {{ n.region || '-' }} 全部 {{ n.is_active ? '启用' : '停用' }} {{ n.health_status_text || '未检测' }} {{ n.health_latency_ms != null ? n.health_latency_ms + 'ms' : '-' }}
暂无数据

模型映射列表

排序 ID 客户端模型ID 模型名(计费) 上游1(主路由) 上游2(备选) 上下文 模型能力 描述 状态 更新时间 操作
模型ID权重 模型ID权重
{{ m.id }} {{ m.client_model_id }} {{ m.model_name }} - {{ m.upstream_model_id }} {{ m.upstream_weight }} {{ m.upstream_model_id_2 }} - {{ m.upstream_weight_2 || 0 }} {{ formatContext(m.context_size || 128) }} {{ c }} - {{ m.description || '-' }} {{ m.is_active ? '启用' : '停用' }} {{ formatTime(m.updated_at) }}
暂无数据

模型费率列表

ID模型名输入输出缓存命中峰谷价
(高峰/空闲 积分/M)
时段Auto 池能力档视觉
图/视频
状态操作
官方元/M积分/M官方元/M积分/M官方元/M积分/M
{{ p.id }} {{ p.model_name }} {{ p.origin_input }} {{ Number(p.input_price).toFixed(2) }} {{ p.origin_output }} {{ Number(p.output_price).toFixed(2) }} {{ p.origin_cache }} {{ Number(p.cache_input_price).toFixed(2) }} {{ peakPeriodTag(p.peak_period)[0] }} {{ p.in_auto_pool ? '入池' : '出池' }} {{ p.auto_tier }}- {{ p.auto_supports_image ? '图✓' : '图✗' }} {{ p.auto_supports_video ? '视✓' : '视✗' }} {{ p.is_active ? '启用' : '停用' }}
暂无数据

版本列表

ID版本平台下载地址文件大小 文件哈希最低版本发布说明状态创建时间
{{ v.id }} {{ v.version }} {{ v.platform }} {{ v.download_url }} {{ formatFileSize(v.file_size) }} {{ v.file_hash ? v.file_hash.slice(0,12) + '...' : '-' }} {{ v.min_version || '-' }} {{ v.release_notes || '-' }} {{ v.is_active ? '启用' : '停用' }} {{ formatTime(v.created_at) }}
暂无数据
📅 {{ accessLogsTimeRangeText }}
起始时间
~
结束时间
📊
请求总数
{{ formatNumber(accessLogs.overview && accessLogs.overview.total_requests) }}
次调用
💰
消耗积分
{{ formatNumber(accessLogs.overview && accessLogs.overview.total_credits) }}
积分
🧩
Tokens 总量
{{ formatNumber(accessLogs.overview && accessLogs.overview.total_tokens) }}
输入 + 输出
🗜️
压缩节省 Tokens
{{ formatNumber(accessLogs.overview && accessLogs.overview.compression_saved_tokens) }}
无损压缩累计为你节省
时间节点模型 Tokens费用耗时状态详情
{{ formatTime(r.created_at) }}
{{ r.status === 'success' ? '消耗' : '错误' }}
{{ r.node_name || ('#' + (r.node_id || '-')) }}
ID: {{ r.node_id || '-' }}
{{ r.display_model || r.model || '-' }}
↳ {{ r.original_model }}
Tier: {{ r.tier }}
{{ r.is_stream ? '流' : '非流' }}
{{ r.tps }} t/s
{{ formatNumber(r.prompt_tokens) }} / {{ formatNumber(r.completion_tokens) }}
缓存: {{ formatNumber(r.cache_hit_tokens) }}
{{ formatNumber(r.credits_used) }}
首字 {{ formatMs(r.first_token_ms) }}
{{ formatMs(r.total_time_ms) }}
HTTP {{ r.status_code }}
{{ r.status === 'success' ? '消耗' : '错误' }}
{{ r.error_message.slice(0,30) }}
设备: {{ r.device_id || '-' }}
ReqID: {{ r.request_id || '-' }}
IP: {{ r.client_ip || '-' }}
UA: {{ r.user_agent || '-' }}
暂无数据

审计日志

时间操作员ID动作目标类型 目标ID详情IP
{{ formatTime(a.created_at) }} {{ a.admin_id }} {{ a.action }} {{ a.target_type || '-' }} {{ a.target_id != null ? a.target_id : '-' }} {{ formatDetails(a.details) }} {{ a.ip_address || '-' }}
暂无数据
📌 本页指标范围说明: Auto专属复杂度分级、Tier 成本/延迟分布 | 通用24h 总成本、缓存命中
📭 当前 24h 内还没有任何请求流量,以下指标显示为 0(等有 Auto/通用请求后自动填充)。
📈
24h总请求
{{ formatNumber(smartRouting.overview.metrics_24h?.total_requests_24h || 0) }}
💵
24h总成本(积分)
{{ totalCost24h() }}
🧩
SIMPLE占比
{{ tierPct('SIMPLE') }}%
⚙️
MEDIUM占比
{{ tierPct('MEDIUM') }}%
💻
COMPLEX占比
{{ tierPct('COMPLEX') }}%
🧠
REASONING占比
{{ tierPct('REASONING') }}%

当前配置 (可直接修改后点上方「保存配置」)

意图识别:{{ smartRouting.config.task_routing?.enabled ? '开启' : '关闭' }} ({{ smartRouting.config.task_routing?.classifier_model || '未配置' }} · 阈值 {{ smartRouting.config.task_routing?.threshold ?? '-' }})
复杂度评分:{{ smartRouting.config.complexity_scoring?.enabled !== false ? '开启' : '关闭' }} (SIMPLE<{{ smartRouting.config.complexity_scoring?.boundaries?.simple_max ?? 2 }} / MEDIUM<{{ smartRouting.config.complexity_scoring?.boundaries?.medium_max ?? 4 }} / COMPLEX<{{ smartRouting.config.complexity_scoring?.boundaries?.complex_max ?? 6 }})
视觉路由:图 {{ smartRouting.config.vision_config?.image_primary || '-' }} · 视频 {{ smartRouting.config.vision_config?.video_primary || '-' }} · 兜底 {{ smartRouting.config.vision_config?.long_context_backup || '-' }}
说明:路由引擎为只读状态(在「任务路由」「分级规则」Tab 修改);旧版分类器模式(ComplexityRouter/AutoRouter/Adaptive)已随架构升级移除。修改后点右上角「保存」立即热刷新 LiteLLM 路由。

流量占比(24h,全组)档位组 + 任务组 + 视觉组 + 分类器

当前 24h 内还没有任何路由流量
{{ r.label }}
{{ r.share }}% {{ formatNumber(r.count) }}次 {{ r.cost.toFixed(4) }}积分
⚠ 部分模型无费率,其成本未计入({{ (smartRouting.overview.metrics_24h.models_without_pricing||[]).join(', ') || '-' }})

Tier 平均延迟(24h,秒)

Tier请求数成本(积分)平均延迟(s)
{{ t }} {{ formatNumber(smartRouting.overview.metrics_24h?.tier_counts_24h?.[t] || 0) }} {{ (smartRouting.overview.metrics_24h?.tier_costs_24h_points?.[t] || 0).toFixed(4) }} {{ smartRouting.overview.metrics_24h?.tier_avg_latency_seconds?.[t] ?? '-' }}
📌 配置项适用范围: 通用重试次数、熔断阈值、最大并发、路由策略参数(所有模型生效) | 路由策略(在「概览」Tab 选择)决定组内多节点选择:任务/档位/视觉组确定后,组内同名部署(如双节点同模型)按该策略挑节点

容错与并发配置

单个请求失败后的重试次数,0=不重试
节点连续失败次数达到该值后熔断,临时剔除
全路由层最大并发请求数,留空表示不限制

路由策略参数 routing_strategy_args 通用

延迟容差系数,latency-based 时选延迟最低 ×(1+buffer) 范围内的节点
每个模型保留的延迟历史样本数,越大越稳但内存占用更高
价格/延迟缓存有效期,默认 3600 秒

会话亲和 Session Affinity Auto专属

同一 session_id 固定路由到同组同模型,保证多轮对话连续性
超时后该会话重新按策略选模型,默认 3600 秒
💡 与「任务路由」的意图缓存(86400s)、「视觉路由」的视觉会话粘性相互独立:意图缓存定,会话亲和定组内节点
📌 本页 Auto专属 会话首条默认 SIMPLE 档,分类器后台识别意图(积分扣用户),从第二条起按任务直连目标模型
配置加载中…(若一直不显示,点击 Tier分布 页的「刷新」重新拉取配置)

任务意图路由(LLM 分类器)

关闭后 Auto 文本请求全部走默认档位组
必须是 model_pricing 里的模型名,负责识别会话意图 ⚠ 当前值不在费率表/池内,分类器组不会构建,任务路由将静默失效!
低于该值回退默认档位路由
每 N 条消息后台重估一次意图,0=只识别一次
超时后本会话走默认档位,不阻塞主请求
会话意图缓存有效期,超时后重新识别

任务 → 目标映射(填模型名直连,或 auto-simple/medium/complex/reasoning 走档位组)

留空 = 该任务不建直连组,回退默认档位。改完点上方「保存配置」立即生效。
📌 本页 Auto专属 复杂度评分选档:为未直连专家模型的请求(general/chitchat/低置信度回退/任务路由关闭)按消息实际难度动态选档,零成本纯进程内评分,不调 LLM 不花积分
配置加载中…(若一直不显示,点击其他 Tab 再切回,或检查保存的配置是否包含 complexity_scoring 节)

复杂度评分选档 Auto专属

升档立即生效;降档需连续 N 条都判低档(防频繁换模型)

评分 → 档位边界(总分约 0~9.5)

评分 < 此值 → SIMPLE 档
评分 < 此值 → MEDIUM 档
评分 ≥ 此值 → REASONING 档
评分维度(固定权重):消息长度(≥200/800/2000 字各 +1)|追问数(≥2/≥4 个问号各 +1)|推理词(为什么/分析/证明/对比… 每个 +0.5,上限 2)|工程词(架构/优化/并发/排查… 每个 +0.5,上限 1.5)|上下文规模(历史 ≥20 条 +1)
旧版 keyword_tier_rules / dimension_weights / tier_boundaries 已废弃(老 ComplexityRouter 入口移除),保留在配置中不生效。改完记得点右上角「保存配置」。

视觉路由 Auto专属(图片/视频请求直连,跳过意图分类与复杂度评分)

含图内容块请求进入的组(auto-vision),候选见「Tier分布」页图片组 ⚠ 不在图片候选池,该组不会构建,带图请求将回退文本路由
含视频内容块请求进入的组(auto-vision-video),候选见「Tier分布」页视频组 ⚠ 不在视频候选池,该组不会构建,带视频请求将回退文本路由
视觉请求超上下文窗口时升级到的组(auto-vision-k3),需长上下文模型 ⚠ 不在模型池,该兜底组不会构建
留空 = 禁用该视觉组(对应请求回退文本路由);填池外模型名后端校验会拒绝。视觉会话有粘性:图/视频落地后,同会话纯文本消息继续走原视觉组(TTL 到期回任务路由)。
📌 配置项适用范围:链目标为组名(auto-*/task-*/vision 组),组内多节点由「路由策略」Tab 的重试/熔断兜底 Auto专属context_window_fallbacks(超窗升级) | 通用fallbacks(故障转移链)

任务组自动降级链(后端自动拼接,只读)Auto专属

{{ r.group }} ({{ r.label }},目标 {{ r.target }}){{ r.fallback }}
任务组主模型故障时自动落到目标模型所在档位组;与下方手动链叠加生效,无需重复配置
当前无已部署专家模型的任务组(任务路由未开启,或目标均为组名)

context_window_fallbacks(超上下文窗口自动升级)Auto专属

fallbacks(模型故障时的转移链)通用

📌 本页 通用 所有模型生效:响应缓存、供应商 Prompt Caching、Token 无损压缩、可观测性;压缩可配置 scope=auto_only 仅Auto启用

① 缓存实时统计(24h)通用

命中次数
{{ formatNumber((smartRouting.cacheStats.stats_24h?.hits_24h || 0) + (smartRouting.cacheStats.memory_metrics?.cache_hits_24h || 0)) }}
📥
总请求
{{ formatNumber(smartRouting.cacheStats.stats_24h?.total_24h || 0) }}
命中率
{{ smartRouting.cacheStats.stats_24h && smartRouting.cacheStats.stats_24h.total_24h ? Math.round(smartRouting.cacheStats.stats_24h.hits_24h*1000/smartRouting.cacheStats.stats_24h.total_24h)/10 : 0 }}%
💰
节省Token(约)
{{ formatNumber(smartRouting.cacheStats.memory_metrics?.tokens_saved_24h || 0) }}
🔖
KV前缀缓存省Token(24h)
{{ formatNumber(smartRouting.cacheStats.stats_24h?.prefix_saved_tokens_24h || 0) }}
📉
命中省成本(24h,元)
{{ (smartRouting.cacheStats.stats_24h?.cost_saved_24h || 0).toFixed(4) }}
💵
合计省成本(24h,元)
{{ (smartRouting.cacheStats.stats_24h?.cost_saved_24h_total || 0).toFixed(4) }}
含KV前缀节省,按输入0.5元/1M粗估
🗄️
语义缓存容量
{{ formatNumber(smartRouting.cacheStats.config?.semantic_cache_max_entries ?? 5000) }}
缓存配置(语义缓存 TTL/容量、KV 前缀、供应商范围)在下方 ② 区编辑保存。

② 缓存与可观测性配置

cache_config 缓存详细配置 通用

总闸:关闭后 KV 前缀缓存一并停用(语义缓存有独立开关)
非流式成功响应自动写入,相同请求直接返回
默认 86400(1天)
1-100000,超出自动淘汰最旧条目
system prompt + tools 前缀命中标记(需总开关开启)
默认 3600
对支持的原生缓存计费折扣生效
仅列出的供应商走原生缓存,如 anthropic,deepseek
💡 节点级 RPM/TPM/max_parallel 限流(通用):请到「节点管理」→ 编辑节点 → 底部「LiteLLM 限流参数」区填写。

③ Token 无损压缩配置(7引擎:System-Dedup、RTK、JSON×2、MD-HR、CCR、InflationGuard)通用

1.1 = 膨胀超过10%回滚原文
更早的历史只保留摘要骨架
日志行删除存在语义损失风险,后期优化
去掉缩进空格,内容100%保留
---------- → ---,markdown 语法等价
内容完全相同的 system 只保留首份
🧪 压缩试跑(无损,不修改数据库)
原始 Token:{{ smartRouting.test.compressResult.original_tokens }} → 压缩后:{{ smartRouting.test.compressResult.compressed_tokens }},节省:{{ smartRouting.test.compressResult.tokens_saved }} token ({{ smartRouting.test.compressResult.saving_pct }}%),Inflation回滚:{{ smartRouting.test.compressResult.rolled_back?'是':'否' }}
各引擎贡献:{{ JSON.stringify(smartRouting.test.compressResult.engine_savings) }}
📄 压缩后内容:
{{ formatCompressedContent(smartRouting.test.compressResult.messages_after) }}
📄 压缩前内容:
{{ formatCompressedContent(smartRouting.test.compressResult.messages_before) }}

④ Output 精控(按档位限制输出 max_tokens)Auto专属

客户端已传 max_tokens 时不覆盖
finish_reason=length 时自动升级档位重试
低成本档压低输出上限省费用:简单闲聊不需要长回复;0 = 不限制该档。任务直连/视觉组请求不经过此精控。
📌 三个工具均对齐线上真实链路:Auto专属 视觉直判 → hy3 意图识别 → 复杂度评分选档;试意图为真实分类器调用(管理测试不扣用户积分),其余零成本

① 试意图分类(真实 hy3 调用,约 200 token,管理测试不扣积分)Auto专属

⚠ {{ smartRouting.test.intentResult.skipped }}

② 试复杂度评分(本地零成本,含维度明细)Auto专属

≥20 条时上下文维度 +1
⚠ {{ smartRouting.test.cxResult.note }}

③ 试路由(完整链路 dry-run:视觉直判 → 意图 → 评分)Auto专属

✗ 路由失败:{{ smartRouting.test.routeResult.error }}
📌 本页 Auto专属 仅用于 Auto 分级路由选择:模型按 SIMPLE/MEDIUM/COMPLEX/REASONING 四层分布,支持手动覆盖 tier

当前模型 tier 分布(基于 手动覆盖 overrides + 模型池能力档 auto_tier + 价格阈值 自动归类)Auto专属

{{ t }}(共 {{ smartRouting.overview.tier_models?.[t]?.length || 0 }} 个模型)
模型名手动覆盖 tier
暂无
{{ m }}

视觉组分布(图片/视频请求直连,跳过意图分类与复杂度评分)Auto专属

候选池(勾选 auto_supports_image 的模型)
候选池(勾选 auto_supports_video 的模型)
图片组模型(vision.image)视频组模型(vision.video)
暂无
{{ m }} 主力
暂无
{{ m }} 主力
主力模型在「分级规则」Tab 的视觉路由区配置;超长上下文兜底 auto-vision-k3 同页配置。模型能力(支持图/视频)在「模型费率」页的 Auto 池字段勾选。

{{ modal.message }}

暂无套餐模板,请先到「套餐模板」页创建

成功生成 {{ modal.data.generated.length }} 个兑换码:

{{ code }}
{{ userDetail.buddy_key }}
联系方式:{{ userDetail.contact || '-' }}  |  状态:{{ userDetail.status === 'blocked' ? '已封禁' : '正常' }}  |  积分:{{ formatNumber(userDetail.total_credits) }}  |  已用:{{ formatNumber(userDetail.total_used) }}
时间筛选
ID类型金额变动前变动后原因时间
{{ t.id }} {{ transTypeText(t.trans_type) }} {{ t.amount >= 0 ? '+' : '' }}{{ t.amount }} {{ t.balance_before }} {{ t.balance_after }} {{ t.reason || '-' }} {{ formatTime(t.created_at) }}
暂无数据
时间筛选
ID兑换码套餐积分激活时间过期时间状态
{{ r.id }} {{ r.code }} {{ r.template_name }} +{{ formatNumber(r.credits) }} {{ formatTime(r.activated_at) }} {{ formatTime(r.expired_at) }} {{ r.status === 'active' ? '生效中' : '已过期' }}
暂无数据
ID套餐名总积分剩余 状态过期时间解绑操作
{{ p.id }} {{ p.package_name || '-' }} {{ formatNumber(p.total_credits) }} {{ formatNumber(p.remaining_credits) }} {{ pkgStatusText(p.status) }} {{ formatTime(p.expires_at) }} {{ p.unbind_count }}/{{ p.max_unbinds }}
暂无数据
ID类型变动变动前 变动后原因时间
{{ t.id }} {{ transTypeText(t.trans_type) }} {{ t.amount > 0 ? '+' : '' }}{{ t.amount }} {{ formatNumber(t.balance_before) }} {{ formatNumber(t.balance_after) }} {{ t.reason || '-' }} {{ formatTime(t.created_at) }}
暂无数据
已保存的 Key(后半段加密隐藏):
Key #{{idx+1}}: {{ mk }}
留空表示保持原有 Key 不变;在上方输入新 Key 即可替换对应位置的 Key;点击"删除"可移除 Key。
{{ m }}{{ (modal.data.supported_models_selected || []).includes(m) ? ' ✓' : '' }}
暂无已映射模型(模型映射页未配置或加载中)
蓝色=已勾选;文本框可补充映射外的模型;两者均空表示支持所有模型
参考:腾讯云 TokenHub 套餐 5000万 token / 月 ≈ 平均 1160万 token/天,按 TPM=100000 大约够 5-10 个客户端并发。
该字段即模型费率表中的「模型名」字段,三元组:客户端模型ID → 模型名(计费) → 上游模型ID(路由)
▎ 上游1(主路由)
10=100%分流,0=不分流
▎ 上游2(备选路由,可选)
两路都>0时按比例分配
单位K,如 128 表示 128K,1024 表示 1M,2048 表示 2M
▎ 输入价格
💡 1:166.67 建议值:{{ (modal.data.origin_input * 166.67).toFixed(2) }} 积分/百万Token
实际换算比 1:{{ (modal.data.credits_input / modal.data.origin_input).toFixed(1) }}
▎ 输出价格
💡 1:166.67 建议值:{{ (modal.data.origin_output * 166.67).toFixed(2) }} 积分/百万Token
实际换算比 1:{{ (modal.data.credits_output / modal.data.origin_output).toFixed(1) }}
▎ 缓存命中价格 供应商原生 Prompt Caching 让利部分
💡 1:166.67 建议值:{{ (modal.data.origin_cache * 166.67).toFixed(2) }} 积分/百万Token
实际换算比 1:{{ (modal.data.credits_cache / modal.data.origin_cache).toFixed(1) }}
▎ 峰谷定价(可选) 高峰价留空则不启用峰谷;空闲价 = 高峰价 × 空闲折扣;高峰时段可逐模型配置(默认 09:00-12:00、14:00-18:00)
默认 1.0(不折);半价填 0.5
格式 [[开始,结束],...],左闭右开,如 [[9,12],[14,18]];留空使用默认 09-12、14-18
生效前仍按原积分价计费,生效后自动按高峰/空闲切换
▎ Auto 智能路由 出池=仅计费(如阶梯计费条目/上游别名);能力档决定文本请求分级路由;视觉标签决定图片/视频请求路由
视觉模型选"不进文本档",靠下方视觉标签进视觉组

正在测试节点连接...

测试失败

{{ modal.data.error }}

{{ modal.data.status_text || modal.data.status }} 延迟 {{ modal.data.latency_ms }}ms

{{ modal.data.summary }}

状态码: {{ modal.data.error_code }}
{{ modal.data.error_msg }}
可用模型 ({{ modal.data.detail.models_count }} 个)
{{ m }} +{{ modal.data.detail.models_count - modal.data.detail.models_sample.length }} 更多...
测试时间: {{ modal.data.tested_at ? new Date(modal.data.tested_at).toLocaleString('zh-CN') : '-' }}
{{ toastIcon(t.type) }} {{ t.message }}