feat(rules): VLM 字段补齐多实体逐字段开关,对齐 LLM 字段行为
- 多实体总开关开启后,VLM 字段可点击单独切换 multi_entity(绿色=已开启) - 新增 VLM 字段时默认写入 multi_entity: false - 删除按钮 stopPropagation 避免触发多实体切换 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -232,12 +232,14 @@ export function ExtractionSettings({
|
||||
newFields.push({
|
||||
name: input,
|
||||
type: selectedVlmFieldType as VLMFieldType,
|
||||
template: customVlmPrompt
|
||||
template: customVlmPrompt,
|
||||
multi_entity: false,
|
||||
});
|
||||
} else {
|
||||
newFields.push({
|
||||
name: input,
|
||||
type: selectedVlmFieldType as VLMFieldType
|
||||
type: selectedVlmFieldType as VLMFieldType,
|
||||
multi_entity: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -289,6 +291,18 @@ export function ExtractionSettings({
|
||||
setHasPendingChanges(true);
|
||||
};
|
||||
|
||||
// 切换 VLM 字段的多实体状态
|
||||
const toggleVLMFieldMultiEntity = (index: number) => {
|
||||
if (!multiEntityEnabled) return; // 多实体未开启时不允许切换
|
||||
const newFields = [...fields.vlm];
|
||||
const field = newFields[index];
|
||||
if (typeof field === 'object') {
|
||||
newFields[index] = { ...field, multi_entity: !field.multi_entity };
|
||||
setFields({ ...fields, vlm: newFields });
|
||||
setHasPendingChanges(true);
|
||||
}
|
||||
};
|
||||
|
||||
// 获取VLM字段信息
|
||||
const getFieldInfo = (field: string | { name: string, type: string, template?: string }) => {
|
||||
let fieldName, fieldType, typeName, badgeClass;
|
||||
@@ -885,18 +899,27 @@ export function ExtractionSettings({
|
||||
<div className="chips-container" id="fields-container-vlm">
|
||||
{fields.vlm.map((field, index) => {
|
||||
const { fieldName, fieldType, typeName, badgeClass } = getFieldInfo(field);
|
||||
const isMulti = typeof field === 'object' && field.multi_entity === true;
|
||||
return (
|
||||
<div className="chip" key={`vlm-field-${index}`}>
|
||||
<div
|
||||
className="chip"
|
||||
key={`vlm-field-${index}`}
|
||||
style={multiEntityEnabled && isMulti ? { backgroundColor: '#00684a', color: '#fff', borderColor: '#00684a' } : undefined}
|
||||
onClick={() => toggleVLMFieldMultiEntity(index)}
|
||||
role={multiEntityEnabled ? 'button' : undefined}
|
||||
title={multiEntityEnabled ? (isMulti ? '点击关闭多实体展开' : '点击开启多实体展开') : fieldName}
|
||||
>
|
||||
{fieldName}
|
||||
<span
|
||||
className={`badge ${badgeClass} text-xs ml-1`}
|
||||
data-type={fieldType}
|
||||
style={multiEntityEnabled && isMulti ? { backgroundColor: 'rgba(255,255,255,0.25)', color: '#fff' } : undefined}
|
||||
>
|
||||
{typeName}
|
||||
</span>
|
||||
<span
|
||||
className="close-btn"
|
||||
onClick={() => removeField("vlm", index)}
|
||||
onClick={(e) => { e.stopPropagation(); removeField("vlm", index); }}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === "Enter" || e.key === " ")
|
||||
removeField("vlm", index);
|
||||
@@ -904,6 +927,7 @@ export function ExtractionSettings({
|
||||
role="button"
|
||||
tabIndex={0}
|
||||
aria-label={`删除字段 ${fieldName}`}
|
||||
style={multiEntityEnabled && isMulti ? { color: 'rgba(255,255,255,0.8)' } : undefined}
|
||||
>
|
||||
×
|
||||
</span>
|
||||
|
||||
Reference in New Issue
Block a user