export const CONTENT_MODERATION_ERROR_CODE = "sensitive_words_detected"; export const CONTENT_MODERATION_MESSAGE = "内容审核未通过,本次平台积分未扣除或已退还。请修改提示词后重新生成。"; export type GenerationFailureMetadata = { errorDetails: string; generationErrorCode?: string; failedPromptFingerprint?: string; }; export function generationFailureMetadata(error: unknown, prompt: string): GenerationFailureMetadata { const raw = error instanceof Error ? error.message : String(error || "生成失败"); if (!isContentModerationError(raw)) return { errorDetails: raw || "生成失败" }; return { errorDetails: CONTENT_MODERATION_MESSAGE, generationErrorCode: CONTENT_MODERATION_ERROR_CODE, failedPromptFingerprint: generationPromptFingerprint(prompt), }; } export function generationErrorMessage(error: unknown) { const raw = error instanceof Error ? error.message : String(error || "生成失败"); return isContentModerationError(raw) ? CONTENT_MODERATION_MESSAGE : raw || "生成失败"; } export function isContentModerationError(value: unknown) { const text = value instanceof Error ? value.message : String(value || ""); return text.toLowerCase().includes(CONTENT_MODERATION_ERROR_CODE) || text.includes("内容审核未通过"); } export function unchangedModeratedPrompt(metadata: { errorDetails?: string; generationErrorCode?: string; failedPromptFingerprint?: string } | undefined, prompt: string) { const moderationFailure = metadata?.generationErrorCode === CONTENT_MODERATION_ERROR_CODE || isContentModerationError(metadata?.errorDetails); if (!moderationFailure) return false; if (!metadata?.failedPromptFingerprint) return true; return metadata.failedPromptFingerprint === generationPromptFingerprint(prompt); } // 指纹只用于识别“原样重试”,不是安全或鉴权用途。 export function generationPromptFingerprint(value: string) { const normalized = value.trim().replace(/\s+/g, " "); let hash = 2166136261; for (let index = 0; index < normalized.length; index += 1) { hash ^= normalized.charCodeAt(index); hash = Math.imul(hash, 16777619); } return `${normalized.length}:${(hash >>> 0).toString(36)}`; }