fix(canvas): honor model sort order and hide video models in image mode
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-02-20 20:54:26 +08:00
parent 6ff83ee92a
commit 0534560f7d

View File

@ -1314,6 +1314,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
modelId: string;
displayName: string;
avatarUrl?: string | null;
sortOrder?: number;
providerType: string;
supportsVision?: boolean;
supportsImageGen?: boolean;
@ -1356,12 +1357,21 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
const aiDetailGenerationEnabled = siteSettings?.aiDetailGenerationEnabled === true;
const VIDEO_PROVIDER_TYPES = new Set(["volcano-video", "doubao-video", "qianwen-video", "fal-video"]);
const visualModels =
modelsData?.models?.filter(
(model) =>
model.modelId !== "volcano-video-master" &&
(model.supportsImageGen || VIDEO_PROVIDER_TYPES.has(model.providerType))
) || [];
const visualModels = useMemo(() => {
const filtered =
modelsData?.models?.filter(
(model) =>
model.modelId !== "volcano-video-master" &&
(model.supportsImageGen || VIDEO_PROVIDER_TYPES.has(model.providerType))
) || [];
return [...filtered].sort((a, b) => {
const leftOrder = Number.isFinite(a.sortOrder as number) ? Number(a.sortOrder) : 0;
const rightOrder = Number.isFinite(b.sortOrder as number) ? Number(b.sortOrder) : 0;
if (leftOrder !== rightOrder) return leftOrder - rightOrder;
return String(a.displayName || "").localeCompare(String(b.displayName || ""), "zh-Hans-CN");
});
}, [modelsData?.models]);
// Agent模式(自动路由)模型选项
const SMART_AUTO_MODEL = {
@ -1369,6 +1379,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
modelId: "auto",
displayName: "Agent模式",
avatarUrl: modelsData?.agentModel?.avatarUrl || null,
sortOrder: -999,
providerType: "auto",
supportsImageGen: true,
imageGenConfig: modelsData?.agentModel?.imageGenConfig || undefined,
@ -1376,6 +1387,13 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
// 所有可选模型(Agent模式 + 可视化模型)
const allModels = [SMART_AUTO_MODEL, ...visualModels];
const imageOnlyModels = useMemo(
() =>
visualModels.filter(
(model) => model.supportsImageGen && !VIDEO_PROVIDER_TYPES.has(model.providerType)
),
[visualModels]
);
const videoOnlyModels = useMemo(
() => visualModels.filter((model) => VIDEO_PROVIDER_TYPES.has(model.providerType)),
[visualModels]
@ -1389,8 +1407,8 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
if (isVideoModel) {
return videoOnlyModels;
}
return allModels;
}, [SMART_AUTO_MODEL, allModels, isDetailGenerationMode, isVideoModel, videoOnlyModels]);
return [SMART_AUTO_MODEL, ...imageOnlyModels];
}, [SMART_AUTO_MODEL, imageOnlyModels, isDetailGenerationMode, isVideoModel, videoOnlyModels]);
const modelSelectValue = selectableModels.some((model) => model.id === selectedModelId)
? selectedModelId
: selectableModels[0]?.id || selectedModelId;