fix: polish parameter preprocessing details

This commit is contained in:
2026-05-12 15:42:39 +08:00
parent b9c9f457e9
commit c5cede2359
4 changed files with 161 additions and 12 deletions
+36 -3
View File
@@ -359,15 +359,16 @@ func (contentFilterProcessor) Process(params map[string]any, modelType string, c
next := make([]map[string]any, 0, len(content))
for index, item := range content {
if isImageContent(item) {
reason, path, value := imageContentRemovalEvidence(item, modelType, context)
context.recordChange(
"ContentFilterProcessor",
"remove",
fmt.Sprintf("content[%d]", index),
item,
nil,
"当前候选模型没有图像参考输入模式,需移除 image_url。",
capabilityPath(modelType, ""),
capabilityForType(context.modelCapability, modelType),
reason,
path,
value,
)
continue
}
@@ -408,6 +409,38 @@ func (contentFilterProcessor) Process(params map[string]any, modelType string, c
return true
}
func imageContentRemovalEvidence(item map[string]any, modelType string, context *paramProcessContext) (string, string, any) {
role := stringFromAny(item["role"])
switch role {
case "first_frame":
return "模型能力未开启首帧输入,已移除 first_frame。", capabilityPath(modelType, "input_first_frame"), map[string]any{
"input_first_frame": capabilityValue(context.modelCapability, modelType, "input_first_frame"),
"input_first_last_frame": capabilityValue(context.modelCapability, modelType, "input_first_last_frame"),
}
case "last_frame":
return "模型能力未开启尾帧或首尾帧输入,已移除 last_frame。", capabilityPath(modelType, "input_first_last_frame"), map[string]any{
"input_last_frame": capabilityValue(context.modelCapability, modelType, "input_last_frame"),
"input_first_last_frame": capabilityValue(context.modelCapability, modelType, "input_first_last_frame"),
"max_images_for_last_frame": capabilityValue(context.modelCapability, modelType, "max_images_for_last_frame"),
"max_images_for_first_frame": capabilityValue(context.modelCapability, modelType, "max_images_for_first_frame"),
"max_images_for_middle_frame": capabilityValue(context.modelCapability, modelType, "max_images_for_middle_frame"),
}
case "reference_image":
return "模型能力未开启参考图输入,已移除 reference_image。", capabilityPath(modelType, "input_reference_generate_single"), map[string]any{
"input_reference_generate_single": capabilityValue(context.modelCapability, modelType, "input_reference_generate_single"),
"input_reference_generate_multiple": capabilityValue(context.modelCapability, modelType, "input_reference_generate_multiple"),
"max_images": capabilityValue(context.modelCapability, modelType, "max_images"),
}
default:
return "当前模型能力未开启图像输入,已移除 image_url。", capabilityPath(modelType, "input_first_frame"), map[string]any{
"input_first_frame": capabilityValue(context.modelCapability, modelType, "input_first_frame"),
"input_first_last_frame": capabilityValue(context.modelCapability, modelType, "input_first_last_frame"),
"input_reference_generate_single": capabilityValue(context.modelCapability, modelType, "input_reference_generate_single"),
"input_reference_generate_multiple": capabilityValue(context.modelCapability, modelType, "input_reference_generate_multiple"),
}
}
}
type inputAudioProcessor struct{}
func (inputAudioProcessor) Name() string { return "InputAudioProcessor" }
@@ -180,6 +180,44 @@ func TestParamProcessorVideoCapabilitiesNormalizeAndFilter(t *testing.T) {
}
}
func TestParamProcessorVideoGenerateLogsFirstFrameRemoval(t *testing.T) {
body := map[string]any{
"model": "Seedance T2V",
"prompt": "animate it",
"content": []any{
map[string]any{"type": "text", "text": "animate it"},
map[string]any{"type": "image_url", "role": "first_frame", "image_url": "https://example.com/first.png"},
},
}
candidate := store.RuntimeModelCandidate{
ModelType: "video_generate",
Capabilities: map[string]any{
"video_generate": map[string]any{
"duration_range": []any{3, 12},
},
},
}
result := preprocessRequestWithLog("videos.generations", body, candidate)
for _, item := range contentItems(result.Body["content"]) {
if isImageContent(item) {
t.Fatalf("first frame image should be removed for video_generate: %+v", result.Body["content"])
}
}
for _, change := range result.Log.Changes {
if change.Path == "content[1]" {
if change.Reason != "模型能力未开启首帧输入,已移除 first_frame。" {
t.Fatalf("unexpected first frame removal reason: %+v", change)
}
if change.CapabilityPath != "capabilities.video_generate.input_first_frame" {
t.Fatalf("unexpected first frame capability path: %+v", change)
}
return
}
}
t.Fatalf("expected first frame removal log, got %+v", result.Log.Changes)
}
func TestParamProcessorImageResolutionAndOutputCount(t *testing.T) {
body := map[string]any{
"model": "即梦V4.0",