feat(platform): 开源发布 - 初始化 Open AI Canvas
This commit is contained in:
47
web/src/lib/generation-error.ts
Normal file
47
web/src/lib/generation-error.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
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)}`;
|
||||
}
|
||||
Reference in New Issue
Block a user