227 lines
7.5 KiB
JavaScript
227 lines
7.5 KiB
JavaScript
// ExportDatasetDialog.js 组件
|
||
import React, { useState } from 'react';
|
||
import { useTranslation } from 'react-i18next';
|
||
import { Dialog, DialogTitle, DialogContent, DialogActions, Button, Box, Tabs, Tab } from '@mui/material';
|
||
|
||
// 导入拆分后的组件
|
||
import LocalExportTab from './export/LocalExportTab';
|
||
import LlamaFactoryTab from './export/LlamaFactoryTab';
|
||
import HuggingFaceTab from './export/HuggingFaceTab';
|
||
|
||
const ExportDatasetDialog = ({ open, onClose, onExport, projectId }) => {
|
||
const { t } = useTranslation();
|
||
const [formatType, setFormatType] = useState('alpaca');
|
||
const [systemPrompt, setSystemPrompt] = useState('');
|
||
const [reasoningLanguage, setReasoningLanguage] = useState('');
|
||
const [confirmedOnly, setConfirmedOnly] = useState(false);
|
||
const [fileFormat, setFileFormat] = useState('json');
|
||
const [includeCOT, setIncludeCOT] = useState(true);
|
||
const [currentTab, setCurrentTab] = useState(0);
|
||
// alpaca 格式特有的设置
|
||
const [alpacaFieldType, setAlpacaFieldType] = useState('instruction'); // 'instruction' 或 'input'
|
||
const [customInstruction, setCustomInstruction] = useState(''); // 当选择 input 时使用的自定义 instruction
|
||
const [customFields, setCustomFields] = useState({
|
||
questionField: 'instruction',
|
||
answerField: 'output',
|
||
cotField: 'complexCOT', // 添加思维链字段名
|
||
includeLabels: false,
|
||
includeChunk: false, // 添加是否包含chunk字段
|
||
questionOnly: false // 添加仅导出问题选项
|
||
});
|
||
|
||
const handleFileFormatChange = event => {
|
||
setFileFormat(event.target.value);
|
||
};
|
||
|
||
const handleFormatChange = event => {
|
||
setFormatType(event.target.value);
|
||
// 根据格式类型设置默认字段名
|
||
if (event.target.value === 'alpaca') {
|
||
setCustomFields({
|
||
...customFields,
|
||
questionField: 'instruction',
|
||
answerField: 'output'
|
||
});
|
||
} else if (event.target.value === 'sharegpt') {
|
||
setCustomFields({
|
||
...customFields,
|
||
questionField: 'content',
|
||
answerField: 'content'
|
||
});
|
||
} else if (event.target.value === 'multilingual-thinking') {
|
||
setCustomFields({
|
||
...customFields,
|
||
questionField: 'content',
|
||
answerField: 'content'
|
||
});
|
||
} else if (event.target.value === 'custom') {
|
||
// 自定义格式保持当前值
|
||
}
|
||
};
|
||
|
||
const handleSystemPromptChange = event => {
|
||
setSystemPrompt(event.target.value);
|
||
};
|
||
|
||
const handleReasoningLanguageChange = event => {
|
||
setReasoningLanguage(event.target.value);
|
||
};
|
||
const handleConfirmedOnlyChange = event => {
|
||
setConfirmedOnly(event.target.checked);
|
||
};
|
||
|
||
// 新增处理函数
|
||
const handleIncludeCOTChange = event => {
|
||
setIncludeCOT(event.target.checked);
|
||
};
|
||
|
||
const handleCustomFieldChange = field => event => {
|
||
setCustomFields({
|
||
...customFields,
|
||
[field]: event.target.value
|
||
});
|
||
};
|
||
|
||
const handleIncludeLabelsChange = event => {
|
||
setCustomFields({
|
||
...customFields,
|
||
includeLabels: event.target.checked
|
||
});
|
||
};
|
||
|
||
const handleIncludeChunkChange = event => {
|
||
setCustomFields({
|
||
...customFields,
|
||
includeChunk: event.target.checked
|
||
});
|
||
};
|
||
|
||
const handleQuestionOnlyChange = event => {
|
||
setCustomFields({
|
||
...customFields,
|
||
questionOnly: event.target.checked
|
||
});
|
||
};
|
||
|
||
// 处理 Alpaca 字段类型变更
|
||
const handleAlpacaFieldTypeChange = event => {
|
||
setAlpacaFieldType(event.target.value);
|
||
};
|
||
|
||
// 处理自定义 instruction 变更
|
||
const handleCustomInstructionChange = event => {
|
||
setCustomInstruction(event.target.value);
|
||
};
|
||
|
||
const handleExport = options => {
|
||
// 如果 LocalExportTab 传入了完整的导出配置(例如平衡导出),直接使用该配置
|
||
if (options && typeof options === 'object' && options.balanceMode) {
|
||
onExport(options);
|
||
return;
|
||
}
|
||
|
||
// 否则使用当前对话框内的状态组装导出配置
|
||
onExport({
|
||
formatType,
|
||
systemPrompt,
|
||
reasoningLanguage,
|
||
confirmedOnly,
|
||
fileFormat,
|
||
includeCOT,
|
||
alpacaFieldType, // 添加 alpaca 字段类型
|
||
customInstruction, // 添加自定义 instruction
|
||
customFields: formatType === 'custom' ? customFields : undefined
|
||
});
|
||
};
|
||
|
||
return (
|
||
<Dialog
|
||
open={open}
|
||
onClose={onClose}
|
||
maxWidth="md"
|
||
fullWidth
|
||
PaperProps={{
|
||
sx: {
|
||
borderRadius: 2
|
||
}
|
||
}}
|
||
>
|
||
<DialogTitle>{t('export.title')}</DialogTitle>
|
||
<DialogContent>
|
||
<Box sx={{ borderBottom: 1, borderColor: 'divider', mb: 2 }}>
|
||
<Tabs value={currentTab} onChange={(e, newValue) => setCurrentTab(newValue)} aria-label="export tabs">
|
||
<Tab label={t('export.localTab')} />
|
||
<Tab label={t('export.llamaFactoryTab')} />
|
||
<Tab label={t('export.huggingFaceTab')} />
|
||
</Tabs>
|
||
</Box>
|
||
|
||
{/* 第一个标签页:本地导出 */}
|
||
{currentTab === 0 && (
|
||
<LocalExportTab
|
||
fileFormat={fileFormat}
|
||
formatType={formatType}
|
||
systemPrompt={systemPrompt}
|
||
reasoningLanguage={reasoningLanguage}
|
||
confirmedOnly={confirmedOnly}
|
||
includeCOT={includeCOT}
|
||
customFields={customFields}
|
||
alpacaFieldType={alpacaFieldType}
|
||
customInstruction={customInstruction}
|
||
handleFileFormatChange={handleFileFormatChange}
|
||
handleFormatChange={handleFormatChange}
|
||
handleSystemPromptChange={handleSystemPromptChange}
|
||
handleReasoningLanguageChange={handleReasoningLanguageChange}
|
||
handleConfirmedOnlyChange={handleConfirmedOnlyChange}
|
||
handleIncludeCOTChange={handleIncludeCOTChange}
|
||
handleCustomFieldChange={handleCustomFieldChange}
|
||
handleIncludeLabelsChange={handleIncludeLabelsChange}
|
||
handleIncludeChunkChange={handleIncludeChunkChange}
|
||
handleQuestionOnlyChange={handleQuestionOnlyChange}
|
||
handleAlpacaFieldTypeChange={handleAlpacaFieldTypeChange}
|
||
handleCustomInstructionChange={handleCustomInstructionChange}
|
||
handleExport={handleExport}
|
||
projectId={projectId}
|
||
/>
|
||
)}
|
||
|
||
{/* 第二个标签页:Llama Factory */}
|
||
{currentTab === 1 && (
|
||
<LlamaFactoryTab
|
||
projectId={projectId}
|
||
systemPrompt={systemPrompt}
|
||
reasoningLanguage={reasoningLanguage}
|
||
confirmedOnly={confirmedOnly}
|
||
includeCOT={includeCOT}
|
||
formatType={formatType}
|
||
handleSystemPromptChange={handleSystemPromptChange}
|
||
handleReasoningLanguageChange={handleReasoningLanguageChange}
|
||
handleConfirmedOnlyChange={handleConfirmedOnlyChange}
|
||
handleIncludeCOTChange={handleIncludeCOTChange}
|
||
/>
|
||
)}
|
||
|
||
{/* 第三个标签页:HuggingFace */}
|
||
{currentTab === 2 && (
|
||
<HuggingFaceTab
|
||
projectId={projectId}
|
||
systemPrompt={systemPrompt}
|
||
reasoningLanguage={reasoningLanguage}
|
||
confirmedOnly={confirmedOnly}
|
||
includeCOT={includeCOT}
|
||
formatType={formatType}
|
||
fileFormat={fileFormat}
|
||
customFields={customFields}
|
||
handleSystemPromptChange={handleSystemPromptChange}
|
||
handleReasoningLanguageChange={handleReasoningLanguageChange}
|
||
handleConfirmedOnlyChange={handleConfirmedOnlyChange}
|
||
handleIncludeCOTChange={handleIncludeCOTChange}
|
||
/>
|
||
)}
|
||
</DialogContent>
|
||
</Dialog>
|
||
);
|
||
};
|
||
|
||
export default ExportDatasetDialog;
|