fix(generation): include missing @ mention in error
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 6m25s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 6m25s
This commit is contained in:
parent
540f8ef4bb
commit
ac12c0fbd4
@ -91,12 +91,15 @@ def _format_prompt_for_ark(prompt, label_placeholders):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
_ORPHAN_MATERIAL_MENTION_RE = re.compile(r'@(?:图片|视频|音频|素材)\S*')
|
_ORPHAN_MATERIAL_MENTION_RE = re.compile(r'@(?:图片|视频|音频|素材)[^\s,。!?、;:,.!?;:))]*')
|
||||||
|
|
||||||
|
|
||||||
def _has_orphan_material_mention(prompt, references):
|
def _find_orphan_material_mention(prompt, references):
|
||||||
"""Detect a material @mention in prompt when no reference payload arrived."""
|
"""Return a material @mention in prompt when no reference payload arrived."""
|
||||||
return bool(prompt and not references and _ORPHAN_MATERIAL_MENTION_RE.search(prompt))
|
if not prompt or references:
|
||||||
|
return None
|
||||||
|
match = _ORPHAN_MATERIAL_MENTION_RE.search(prompt)
|
||||||
|
return match.group(0) if match else None
|
||||||
|
|
||||||
|
|
||||||
def _get_token_price(config, model, has_video_ref, resolution):
|
def _get_token_price(config, model, has_video_ref, resolution):
|
||||||
@ -239,7 +242,8 @@ def video_generate_view(request):
|
|||||||
search_mode = request.data.get('search_mode', 'off')
|
search_mode = request.data.get('search_mode', 'off')
|
||||||
seed = _safe_int(request.data.get('seed', -1), -1)
|
seed = _safe_int(request.data.get('seed', -1), -1)
|
||||||
|
|
||||||
if _has_orphan_material_mention(prompt, references):
|
orphan_mention = _find_orphan_material_mention(prompt, references)
|
||||||
|
if orphan_mention:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
'Blocked generate with material @mention but empty references (user=%s prompt=%s)',
|
'Blocked generate with material @mention but empty references (user=%s prompt=%s)',
|
||||||
user.id,
|
user.id,
|
||||||
@ -247,7 +251,7 @@ def video_generate_view(request):
|
|||||||
)
|
)
|
||||||
return Response({
|
return Response({
|
||||||
'error': 'missing_references',
|
'error': 'missing_references',
|
||||||
'message': '@对应的内容为空',
|
'message': f'{orphan_mention} 对应的内容为空',
|
||||||
}, status=status.HTTP_400_BAD_REQUEST)
|
}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
# 1080P 仅 Seedance 2.0 支持,Fast 不支持
|
# 1080P 仅 Seedance 2.0 支持,Fast 不支持
|
||||||
|
|||||||
@ -152,7 +152,7 @@ class TestVideoGenerateArkPrompt(TestCase):
|
|||||||
resp = self._post_generate('@图片1 走过来', [])
|
resp = self._post_generate('@图片1 走过来', [])
|
||||||
self.assertEqual(resp.status_code, 400, resp.content)
|
self.assertEqual(resp.status_code, 400, resp.content)
|
||||||
self.assertEqual(resp.json().get('error'), 'missing_references')
|
self.assertEqual(resp.json().get('error'), 'missing_references')
|
||||||
self.assertEqual(resp.json().get('message'), '@对应的内容为空')
|
self.assertEqual(resp.json().get('message'), '@图片1 对应的内容为空')
|
||||||
self.assertFalse(mock_create_task.called)
|
self.assertFalse(mock_create_task.called)
|
||||||
self.assertFalse(GenerationRecord.objects.filter(user=self.user).exists())
|
self.assertFalse(GenerationRecord.objects.filter(user=self.user).exists())
|
||||||
|
|
||||||
|
|||||||
@ -54,13 +54,14 @@ function mapProgress(backendStatus: string): number {
|
|||||||
return 50;
|
return 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ORPHAN_MATERIAL_MENTION_RE = /@(?:图片|视频|音频|素材)\S*/;
|
const ORPHAN_MATERIAL_MENTION_RE = /@(?:图片|视频|音频|素材)[^\s,。!?、;:,.!?;:))]*/;
|
||||||
|
|
||||||
function hasOrphanMaterialMention(input: ReturnType<typeof useInputBarStore.getState>): boolean {
|
function findOrphanMaterialMention(input: ReturnType<typeof useInputBarStore.getState>): string | null {
|
||||||
if (input.mode !== 'universal') return false;
|
if (input.mode !== 'universal') return null;
|
||||||
const hasDirectRefs = input.references.length > 0;
|
const hasDirectRefs = input.references.length > 0;
|
||||||
const hasAssetMentions = (input.assetMentions || []).length > 0;
|
const hasAssetMentions = (input.assetMentions || []).length > 0;
|
||||||
return !hasDirectRefs && !hasAssetMentions && ORPHAN_MATERIAL_MENTION_RE.test(input.prompt);
|
if (hasDirectRefs || hasAssetMentions) return null;
|
||||||
|
return input.prompt.match(ORPHAN_MATERIAL_MENTION_RE)?.[0] || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Check if a URL is an asset library reference (case-insensitive protocol). */
|
/** Check if a URL is an asset library reference (case-insensitive protocol). */
|
||||||
@ -323,8 +324,9 @@ export const useGenerationStore = create<GenerationState>((set, get) => ({
|
|||||||
|
|
||||||
addTask: async () => {
|
addTask: async () => {
|
||||||
const input = useInputBarStore.getState();
|
const input = useInputBarStore.getState();
|
||||||
if (hasOrphanMaterialMention(input)) {
|
const orphanMention = findOrphanMaterialMention(input);
|
||||||
showToast('@对应的内容为空');
|
if (orphanMention) {
|
||||||
|
showToast(`${orphanMention} 对应的内容为空`);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (!input.canSubmit()) return null;
|
if (!input.canSubmit()) return null;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user