|
|
@ -46,6 +46,8 @@ import { useHorizontalWheelScroll } from "./useHorizontalWheelScroll"; |
|
|
import { |
|
|
import { |
|
|
OTHER_CATEGORY, |
|
|
OTHER_CATEGORY, |
|
|
buildPreferredParamValues, |
|
|
buildPreferredParamValues, |
|
|
|
|
|
buildComposerTaskParamPayload, |
|
|
|
|
|
buildSeedanceVideoPricePayload, |
|
|
buildSelectedParamsFromTaskInfo, |
|
|
buildSelectedParamsFromTaskInfo, |
|
|
buildGenTaskModelPayload, |
|
|
buildGenTaskModelPayload, |
|
|
collectTaskInfoMedia, |
|
|
collectTaskInfoMedia, |
|
|
@ -135,12 +137,11 @@ function useGenerateCost(params: { |
|
|
activeModelItem: AiModelItem | null; |
|
|
activeModelItem: AiModelItem | null; |
|
|
selectedParamValues: Record<string, string | number>; |
|
|
selectedParamValues: Record<string, string | number>; |
|
|
activeTaskSubType: number | null; |
|
|
activeTaskSubType: number | null; |
|
|
ratioSizePreview: AspectRatioItem | null; |
|
|
|
|
|
inputVideoDurationSeconds: number; |
|
|
inputVideoDurationSeconds: number; |
|
|
isActionMimicTask: boolean; |
|
|
isActionMimicTask: boolean; |
|
|
selectedActionMimicItem: ActionMimicSelectedItem | null; |
|
|
selectedActionMimicItem: ActionMimicSelectedItem | null; |
|
|
}) { |
|
|
}) { |
|
|
const { activeModelItem, selectedParamValues, activeTaskSubType, ratioSizePreview, inputVideoDurationSeconds, isActionMimicTask, selectedActionMimicItem } = params; |
|
|
const { activeModelItem, selectedParamValues, activeTaskSubType, inputVideoDurationSeconds, isActionMimicTask, selectedActionMimicItem } = params; |
|
|
const [generateCost, setGenerateCost] = useState<number>(0); |
|
|
const [generateCost, setGenerateCost] = useState<number>(0); |
|
|
const debounceTimerRef = useRef<number | null>(null); |
|
|
const debounceTimerRef = useRef<number | null>(null); |
|
|
const requestSeqRef = useRef(0); |
|
|
const requestSeqRef = useRef(0); |
|
|
@ -161,22 +162,27 @@ function useGenerateCost(params: { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const modelParamFields = getComposerParamFieldsForModel(activeModelItem); |
|
|
|
|
|
const resolvedParamValues = buildComposerTaskParamPayload(modelParamFields, selectedParamValues); |
|
|
|
|
|
|
|
|
// token计费 从服务端拿积分
|
|
|
// token计费 从服务端拿积分
|
|
|
if (activeModelItem?.billingMethod === 2) { |
|
|
if (activeModelItem?.billingMethod === 2) { |
|
|
if (!Object.keys(selectedParamValues).length) return; |
|
|
const seedanceParams = buildSeedanceVideoPricePayload(modelParamFields, selectedParamValues); |
|
|
|
|
|
if (!seedanceParams) { |
|
|
|
|
|
if (!cancelled) setGenerateCost(0); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
const currentSeq = ++requestSeqRef.current; |
|
|
const currentSeq = ++requestSeqRef.current; |
|
|
const res: any = await getAiModelPrice({ |
|
|
const res: any = await getAiModelPrice({ |
|
|
modelName: activeModelItem?.aiModelCodeAlias, |
|
|
modelName: activeModelItem?.aiModelCodeAlias, |
|
|
estimationType: "seedance_video", |
|
|
estimationType: "seedance_video", |
|
|
seedanceVideo: { |
|
|
seedanceVideo: { |
|
|
input_video_duration_seconds: inputVideoDurationSeconds, |
|
|
input_video_duration_seconds: inputVideoDurationSeconds, |
|
|
output_video_duration_seconds: selectedParamValues.duration, |
|
|
...seedanceParams, |
|
|
resolution: selectedParamValues.resolution, |
|
|
|
|
|
aspect_ratio: selectedParamValues.ratio, |
|
|
|
|
|
}, |
|
|
}, |
|
|
}); |
|
|
}); |
|
|
const points = res?.data?.estimated_points ?? 0; |
|
|
const points = res?.data?.estimated_points ?? 0; |
|
|
const batchSize = Number(selectedParamValues.batchSize ?? 1); |
|
|
const batchSize = Number(resolvedParamValues.batchSize ?? 1); |
|
|
if (!cancelled && currentSeq === requestSeqRef.current) { |
|
|
if (!cancelled && currentSeq === requestSeqRef.current) { |
|
|
setGenerateCost(Math.ceil(points * batchSize)); |
|
|
setGenerateCost(Math.ceil(points * batchSize)); |
|
|
} |
|
|
} |
|
|
@ -198,8 +204,7 @@ function useGenerateCost(params: { |
|
|
aiModelCode: activeModelItem?.code, |
|
|
aiModelCode: activeModelItem?.code, |
|
|
aiModelCodeAlias: activeModelItem?.aiModelCodeAlias, |
|
|
aiModelCodeAlias: activeModelItem?.aiModelCodeAlias, |
|
|
type: getTaskSubTypeRow(activeTaskSubType)?.type, |
|
|
type: getTaskSubTypeRow(activeTaskSubType)?.type, |
|
|
...selectedParamValues, |
|
|
...resolvedParamValues, |
|
|
...dimensionPayloadFromPreview(selectedParamValues.resolution, ratioSizePreview), |
|
|
|
|
|
}); |
|
|
}); |
|
|
const taskPrice = Number(res?.data?.taskPrice ?? 0); |
|
|
const taskPrice = Number(res?.data?.taskPrice ?? 0); |
|
|
if (!cancelled && currentSeq === requestSeqRef.current) { |
|
|
if (!cancelled && currentSeq === requestSeqRef.current) { |
|
|
@ -224,7 +229,7 @@ function useGenerateCost(params: { |
|
|
debounceTimerRef.current = null; |
|
|
debounceTimerRef.current = null; |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
}, [activeModelItem, activeTaskSubType, inputVideoDurationSeconds, isActionMimicTask, ratioSizePreview, selectedActionMimicItem, selectedParamValues]); |
|
|
}, [activeModelItem, activeTaskSubType, inputVideoDurationSeconds, isActionMimicTask, selectedActionMimicItem, selectedParamValues]); |
|
|
|
|
|
|
|
|
return generateCost; |
|
|
return generateCost; |
|
|
} |
|
|
} |
|
|
@ -865,8 +870,9 @@ export function GlobalPromptPanel({ |
|
|
|
|
|
|
|
|
const applyAiModelsList = useCallback((list: AiModelItem[]) => { |
|
|
const applyAiModelsList = useCallback((list: AiModelItem[]) => { |
|
|
setAiModels(list); |
|
|
setAiModels(list); |
|
|
setActiveModelItem(list[0] ?? null); |
|
|
const firstModel = list[0] ?? null; |
|
|
setSelectedParamValues({}); |
|
|
setActiveModelItem(firstModel); |
|
|
|
|
|
setSelectedParamValues(buildPreferredParamValues(getComposerParamFieldsForModel(firstModel), {})); |
|
|
}, []); |
|
|
}, []); |
|
|
|
|
|
|
|
|
/** 拉模型并写状态;制作同款可选择只取列表不落地,避免中间态覆盖。 */ |
|
|
/** 拉模型并写状态;制作同款可选择只取列表不落地,避免中间态覆盖。 */ |
|
|
@ -1241,7 +1247,6 @@ export function GlobalPromptPanel({ |
|
|
activeModelItem, |
|
|
activeModelItem, |
|
|
selectedParamValues, |
|
|
selectedParamValues, |
|
|
activeTaskSubType, |
|
|
activeTaskSubType, |
|
|
ratioSizePreview, |
|
|
|
|
|
inputVideoDurationSeconds, |
|
|
inputVideoDurationSeconds, |
|
|
isActionMimicTask, |
|
|
isActionMimicTask, |
|
|
selectedActionMimicItem, |
|
|
selectedActionMimicItem, |
|
|
@ -1754,7 +1759,9 @@ export function GlobalPromptPanel({ |
|
|
onClick={() => { |
|
|
onClick={() => { |
|
|
setActiveModelItem(item); |
|
|
setActiveModelItem(item); |
|
|
setModelMenuOpen(false); |
|
|
setModelMenuOpen(false); |
|
|
setSelectedParamValues({}); |
|
|
setSelectedParamValues( |
|
|
|
|
|
buildPreferredParamValues(getComposerParamFieldsForModel(item), {}), |
|
|
|
|
|
); |
|
|
}} |
|
|
}} |
|
|
> |
|
|
> |
|
|
<img |
|
|
<img |
|
|
|