feat: 画布聊天支持智能自动模式
1. 添加「智能自动」模型选项(默认选中) 2. 使用 qwen3-vl 先对话理解需求、优化提示词 3. 然后自动调用最佳生图模型生成图片 4. 支持历史图片上下文自动关联 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
8f90aaba08
commit
049795e264
@ -167,12 +167,24 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
|
|||||||
// 过滤支持图片生成的模型
|
// 过滤支持图片生成的模型
|
||||||
const imageModels = modelsData?.models?.filter(m => m.supportsImageGen) || [];
|
const imageModels = modelsData?.models?.filter(m => m.supportsImageGen) || [];
|
||||||
|
|
||||||
// 默认选择第一个图片模型
|
// 智能自动模型选项
|
||||||
|
const SMART_AUTO_MODEL = {
|
||||||
|
id: "auto",
|
||||||
|
modelId: "auto",
|
||||||
|
displayName: "智能自动",
|
||||||
|
providerType: "auto",
|
||||||
|
supportsImageGen: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
// 所有可选模型(智能自动 + 生图模型)
|
||||||
|
const allModels = [SMART_AUTO_MODEL, ...imageModels];
|
||||||
|
|
||||||
|
// 默认选择智能自动模型
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (imageModels.length > 0 && !selectedModelId) {
|
if (!selectedModelId) {
|
||||||
setSelectedModelId(imageModels[0].id);
|
setSelectedModelId("auto"); // 默认使用智能自动模式
|
||||||
}
|
}
|
||||||
}, [imageModels, selectedModelId]);
|
}, [selectedModelId]);
|
||||||
|
|
||||||
const currentModelIdRef = useRef(selectedModelId);
|
const currentModelIdRef = useRef(selectedModelId);
|
||||||
const imageParamsRef = useRef(imageParams);
|
const imageParamsRef = useRef(imageParams);
|
||||||
@ -759,15 +771,37 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
|
|||||||
<Paperclip className="h-4 w-4" />
|
<Paperclip className="h-4 w-4" />
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
{/* Agent Selector (Model) */}
|
{/* Agent Selector (Model) - 包含智能自动选项 */}
|
||||||
<Select value={selectedModelId} onValueChange={setSelectedModelId}>
|
<Select value={selectedModelId} onValueChange={setSelectedModelId}>
|
||||||
<SelectTrigger className="h-8 text-xs bg-blue-50 text-blue-600 border-blue-100 hover:bg-blue-100 hover:border-blue-200 transition-colors rounded-full px-3 gap-1 w-auto">
|
<SelectTrigger className={cn(
|
||||||
<Sparkles className="h-3 w-3" />
|
"h-8 text-xs transition-colors rounded-full px-3 gap-1 w-auto",
|
||||||
|
selectedModelId === "auto"
|
||||||
|
? "bg-gradient-to-r from-purple-50 to-blue-50 text-purple-600 border-purple-100 hover:from-purple-100 hover:to-blue-100"
|
||||||
|
: "bg-blue-50 text-blue-600 border-blue-100 hover:bg-blue-100 hover:border-blue-200"
|
||||||
|
)}>
|
||||||
|
{selectedModelId === "auto" ? (
|
||||||
|
<Zap className="h-3 w-3" />
|
||||||
|
) : (
|
||||||
|
<Sparkles className="h-3 w-3" />
|
||||||
|
)}
|
||||||
<span className="truncate max-w-[80px]">
|
<span className="truncate max-w-[80px]">
|
||||||
{imageModels.find(m => m.id === selectedModelId)?.displayName || "Agent"}
|
{allModels.find(m => m.id === selectedModelId)?.displayName || "智能自动"}
|
||||||
</span>
|
</span>
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
|
{/* 智能自动选项 */}
|
||||||
|
<SelectItem value="auto" className="text-xs">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Zap className="h-3 w-3 text-purple-500" />
|
||||||
|
<span>智能自动</span>
|
||||||
|
<span className="text-[10px] text-muted-foreground">先对话再生图</span>
|
||||||
|
</div>
|
||||||
|
</SelectItem>
|
||||||
|
{/* 分隔线 */}
|
||||||
|
{imageModels.length > 0 && (
|
||||||
|
<div className="my-1 border-t border-border" />
|
||||||
|
)}
|
||||||
|
{/* 生图模型列表 */}
|
||||||
{imageModels.map(model => (
|
{imageModels.map(model => (
|
||||||
<SelectItem key={model.id} value={model.id} className="text-xs">
|
<SelectItem key={model.id} value={model.id} className="text-xs">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
@ -781,13 +815,13 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
{/* Image Params Bar */}
|
{/* Image Params Bar - 智能自动模式时也显示,用于设置最终生图参数 */}
|
||||||
<ImageParamsBar
|
<ImageParamsBar
|
||||||
modelName={imageModels.find(m => m.id === selectedModelId)?.displayName}
|
modelName={allModels.find(m => m.id === selectedModelId)?.displayName}
|
||||||
initialParams={imageParams}
|
initialParams={imageParams}
|
||||||
onParamsChange={handleImageParamsChange}
|
onParamsChange={handleImageParamsChange}
|
||||||
inline={true}
|
inline={true}
|
||||||
providerType={imageModels.find(m => m.id === selectedModelId)?.providerType}
|
providerType={allModels.find(m => m.id === selectedModelId)?.providerType}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user