import { marked } from 'marked' /** 渲染 Markdown(先转义 HTML,避免模型输出的 HTML 被直接执行) */ export function renderMarkdown(md: string) { if (!md) return '' const escaped = md.replace(/&/g, '&').replace(//g, '>') return marked.parse(escaped, { async: false, breaks: true, gfm: true }) as string } export function formatTime(t: string | number | Date | null | undefined) { if (!t) return '' return new Date(t).toLocaleString('zh-CN', { hour12: false, month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }) } export function formatWords(n: number) { return n >= 10000 ? `${(n / 10000).toFixed(1)} 万字` : `${n} 字` } /** 取出接口错误信息 */ export function apiErrorMessage(err: unknown, fallback = '请求失败') { const e = err as { data?: { message?: string, statusMessage?: string }, message?: string } return e.data?.message || e.data?.statusMessage || e.message || fallback }