2026-04-01 00:58:42 +08:00
|
|
|
import { ApiClientError } from "@geo/http-client";
|
|
|
|
|
|
|
|
|
|
const errorMessageMap: Record<string, string> = {
|
|
|
|
|
invalid_credentials: "邮箱或密码错误",
|
|
|
|
|
no_tenant: "当前账号未关联租户",
|
|
|
|
|
not_authenticated: "请先登录",
|
|
|
|
|
invalid_access_token: "登录状态已失效",
|
|
|
|
|
invalid_refresh_token: "刷新令牌已失效",
|
|
|
|
|
refresh_session_expired: "登录已过期,请重新登录",
|
|
|
|
|
refresh_token_mismatch: "刷新令牌校验失败,请重新登录",
|
|
|
|
|
token_revoked: "当前会话已经退出",
|
|
|
|
|
tenant_scope_missing: "租户上下文缺失",
|
|
|
|
|
query_failed: "数据读取失败",
|
|
|
|
|
quota_insufficient: "生成额度不足",
|
|
|
|
|
llm_unavailable: "生成服务不可用",
|
2026-04-02 00:31:28 +08:00
|
|
|
analyze_context_required: "请先填写品牌或模板上下文信息",
|
|
|
|
|
title_context_required: "请先确认品牌、关键词或竞品信息",
|
|
|
|
|
outline_context_required: "请先确认标题和文章结构后再生成大纲",
|
|
|
|
|
analyze_queue_unavailable: "品牌分析任务较多,请稍后重试",
|
|
|
|
|
title_queue_unavailable: "标题生成任务较多,请稍后重试",
|
|
|
|
|
outline_queue_unavailable: "大纲生成任务较多,请稍后重试",
|
|
|
|
|
analyze_task_not_found: "品牌分析任务不存在或已失效",
|
|
|
|
|
title_task_not_found: "标题生成任务不存在或已失效",
|
|
|
|
|
outline_task_not_found: "文章大纲任务不存在或已失效",
|
|
|
|
|
article_generating: "文章仍在生成中",
|
|
|
|
|
article_not_editable: "只有已完成文章才可编辑",
|
|
|
|
|
draft_not_editable: "只有草稿或生成失败的文章才可继续在向导中编辑",
|
|
|
|
|
article_title_required: "请输入文章标题",
|
|
|
|
|
invalid_payload: "请求参数不合法",
|
|
|
|
|
update_failed: "保存文章失败",
|
2026-04-01 00:58:42 +08:00
|
|
|
network_error: "网络连接失败,请稍后重试",
|
|
|
|
|
unknown_error: "发生未知错误",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function formatError(error: unknown): string {
|
|
|
|
|
if (error instanceof ApiClientError) {
|
|
|
|
|
const message = errorMessageMap[error.message] ?? error.message.replaceAll("_", " ");
|
|
|
|
|
return error.detail ? `${message}: ${error.detail}` : message;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (error instanceof Error) {
|
|
|
|
|
return error.message;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return "发生未知错误";
|
|
|
|
|
}
|