48 lines
2.2 KiB
TypeScript
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)}`;
|
|
}
|