Files
ttstd-infinite-canvas/web/src/lib/generation-error.ts

48 lines
2.2 KiB
TypeScript

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)}`;
}