mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-06-01 08:49:35 +08:00
- 核心架构:新增独立 AI 会话中枢,集成主流大模型生态(含私有部署中继版)的无感衔接发问 - 智能诊断:打破信息孤岛,大模型可通过关联工作区实时数据表 DDL 和错误栈,充当专属 DBA 排错及代码编写 - 视觉与多模态:支持极简发图读图交互体验,智能补全模型所需的缺省预警 Prompt,并兼容不规范中转端点图文并茂 - UI 与性能:重构聊天浮层挂靠逻辑与渲染阻断,应对长时间巨量问答引发的卡段内存泄漏,会话自动保存归档
77 lines
3.5 KiB
TypeScript
77 lines
3.5 KiB
TypeScript
import React from 'react';
|
|
import { Button, Tooltip } from 'antd';
|
|
import { HistoryOutlined, RobotOutlined, ClearOutlined, SettingOutlined, CloseOutlined, ExportOutlined } from '@ant-design/icons';
|
|
import type { OverlayWorkbenchTheme } from '../../utils/overlayWorkbenchTheme';
|
|
import type { AIChatMessage } from '../../types';
|
|
|
|
interface AIChatHeaderProps {
|
|
darkMode: boolean;
|
|
mutedColor: string;
|
|
textColor: string;
|
|
overlayTheme: OverlayWorkbenchTheme;
|
|
onHistoryClick: () => void;
|
|
onClear: () => void;
|
|
onSettingsClick: () => void;
|
|
onClose: () => void;
|
|
messages?: AIChatMessage[];
|
|
sessionTitle?: string;
|
|
}
|
|
|
|
const exportToMarkdown = (messages: AIChatMessage[], title: string) => {
|
|
const lines: string[] = [`# ${title}`, '', `> 导出时间:${new Date().toLocaleString()}`, ''];
|
|
messages.forEach(msg => {
|
|
const role = msg.role === 'user' ? '👤 You' : '🤖 GoNavi AI';
|
|
lines.push(`## ${role}`);
|
|
lines.push('');
|
|
lines.push(msg.content);
|
|
lines.push('');
|
|
lines.push('---');
|
|
lines.push('');
|
|
});
|
|
const blob = new Blob([lines.join('\n')], { type: 'text/markdown;charset=utf-8' });
|
|
const url = URL.createObjectURL(blob);
|
|
const a = document.createElement('a');
|
|
a.href = url;
|
|
a.download = `${title.replace(/[/\\?%*:|"<>]/g, '-')}.md`;
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
document.body.removeChild(a);
|
|
URL.revokeObjectURL(url);
|
|
};
|
|
|
|
export const AIChatHeader: React.FC<AIChatHeaderProps> = ({
|
|
darkMode, mutedColor, textColor, overlayTheme,
|
|
onHistoryClick, onClear, onSettingsClick, onClose,
|
|
messages = [], sessionTitle = '新对话'
|
|
}) => {
|
|
return (
|
|
<div className="ai-chat-header" style={{ borderBottom: 'none', padding: '10px 16px', background: darkMode ? 'rgba(255,255,255,0.02)' : 'rgba(0,0,0,0.01)' }}>
|
|
<div className="ai-chat-header-left" style={{ gap: 8 }}>
|
|
<Tooltip title="历史会话">
|
|
<Button type="text" size="small" icon={<HistoryOutlined />} onClick={onHistoryClick} style={{ color: mutedColor }} />
|
|
</Tooltip>
|
|
<div className="ai-logo" style={{ background: overlayTheme.iconBg, color: overlayTheme.iconColor, display: 'flex', alignItems: 'center', justifyContent: 'center', width: 20, height: 20, borderRadius: 6, fontSize: 12 }}>
|
|
<RobotOutlined />
|
|
</div>
|
|
<span className="ai-title" style={{ color: textColor, fontSize: 13, fontWeight: 600 }}>GoNavi AI</span>
|
|
</div>
|
|
<div className="ai-chat-header-right">
|
|
{messages.length > 0 && (
|
|
<Tooltip title="导出为 Markdown">
|
|
<Button type="text" size="small" icon={<ExportOutlined />} onClick={() => exportToMarkdown(messages, sessionTitle)} style={{ color: mutedColor }} />
|
|
</Tooltip>
|
|
)}
|
|
<Tooltip title="新对话 (清空当前)">
|
|
<Button type="text" size="small" icon={<ClearOutlined />} onClick={onClear} style={{ color: mutedColor }} />
|
|
</Tooltip>
|
|
<Tooltip title="AI 设置">
|
|
<Button type="text" size="small" icon={<SettingOutlined />} onClick={onSettingsClick} style={{ color: mutedColor }} />
|
|
</Tooltip>
|
|
<Tooltip title="关闭面板">
|
|
<Button type="text" size="small" icon={<CloseOutlined />} onClick={onClose} style={{ color: mutedColor }} />
|
|
</Tooltip>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|