feat(页面): 聊天页面集成图片生成功能

- 传递 isGeneratingImage 状态到消息气泡
- 传递 generatedImages 数据到消息组件
- 支持历史消息中的生成图片显示
This commit is contained in:
gaoziman 2025-12-27 15:02:26 +08:00
parent 8b558fb780
commit de0860a5aa

View File

@ -112,6 +112,8 @@ export default function ChatPage({ params }: PageProps) {
uploadedDocuments: (msg.uploadedDocuments as { name: string; size: number; type: string; content: string }[]) || undefined,
// 从数据库加载使用的工具列表
usedTools: (msg.usedTools as string[]) || undefined,
// 从数据库加载 AI 生成的图片Gemini 等图片生成模型)
generatedImages: (msg.generatedImages as { mimeType: string; data: string; width?: number; height?: number }[]) || undefined,
}));
setInitialMessages(historyMessages);
}
@ -393,12 +395,31 @@ export default function ChatPage({ params }: PageProps) {
setLinkPreviewOpen(true);
};
// 判断是否为图片生成模型
const isImageGenerationModel = (modelId: string): boolean => {
const imageModels = [
'gemini-2.0-flash-preview-image-generation',
'gemini-3-pro-image-preview',
'imagen-3.0-generate-002',
];
return imageModels.some(model => modelId.includes(model)) ||
modelId.includes('image-generation') ||
modelId.includes('imagen');
};
// 获取模型标签
const getModelTag = (modelId: string, supportsThinking: boolean): string => {
if (isImageGenerationModel(modelId)) return '图片';
if (supportsThinking) return 'Thinking';
return '';
};
// 转换模型格式
const modelOptions = models.map((m) => ({
id: m.modelId,
name: m.modelId,
displayName: m.displayName,
tag: m.supportsThinking ? 'Thinking' : '',
tag: getModelTag(m.modelId, m.supportsThinking),
}));
const selectedModel = modelOptions.find((m) => m.id === selectedModelId) || modelOptions[0];
@ -623,6 +644,8 @@ export default function ChatPage({ params }: PageProps) {
uploadedDocuments={message.uploadedDocuments}
usedTools={message.usedTools}
pyodideStatus={message.pyodideStatus}
generatedImages={message.generatedImages}
isGeneratingImage={message.isGeneratingImage}
onRegenerate={message.role === 'assistant' && !isStreaming ? handleRegenerate : undefined}
onSaveToNote={message.role === 'assistant' && !isStreaming ? handleSaveToNote : undefined}
onLinkClick={handleLinkClick}