Commit 1a71920d authored by mhw's avatar mhw

版本提交

parent 90405591
......@@ -1886,6 +1886,11 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"@microsoft/fetch-event-source": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz",
"integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA=="
},
"@mrmlnc/readdir-enhanced": {
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
......@@ -19047,6 +19052,14 @@
"csstype": "^3.1.0"
}
},
"vue-clipboard2": {
"version": "0.3.3",
"resolved": "https://registry.npmmirror.com/vue-clipboard2/-/vue-clipboard2-0.3.3.tgz",
"integrity": "sha512-aNWXIL2DKgJyY/1OOeITwAQz1fHaCIGvUFHf9h8UcoQBG5a74MkdhS/xqoYe7DNZdQmZRL+TAdIbtUs9OyVjbw==",
"requires": {
"clipboard": "^2.0.0"
}
},
"vue-eslint-parser": {
"version": "7.11.0",
"resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz",
......
......@@ -10,6 +10,7 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"@microsoft/fetch-event-source": "^2.0.1",
"axios": "^0.18.0",
"bpmn-js-token-simulation": "^0.10.0",
"clipboard": "^2.0.11",
......@@ -31,6 +32,7 @@
"sortablejs": "^1.7.0",
"v-charts": "^1.19.0",
"vue": "^2.6.11",
"vue-clipboard2": "^0.3.3",
"vue-json-viewer": "^2.2.18",
"vue-router": "^3.1.5",
"vuedraggable": "^2.24.3",
......
......@@ -7,11 +7,11 @@
<!-- ace -->
<script src="lib/ace/ace.js"></script>
<title>大语言模型平台</title>
<title>灵境大模型平台</title>
</head>
<body class="orange-project">
<noscript>
<strong>We're sorry but 大语言模型平台 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
<strong>We're sorry but 灵境大模型平台 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
......
This source diff could not be displayed because it is too large. You can view the blob instead.
export default class BatchOptimizationController {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/promptOptimizeBatch/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/promptOptimizeBatch/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/promptOptimizeBatch/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/promptOptimizeBatch/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/promptOptimizeBatch/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/promptOptimizeBatch/delete', 'post', params, axiosOption, httpOption);
}
}
export default class myDataSet {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetDetail/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetDetail/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/datasetDetail/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetDetail/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetDetail/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetDetail/delete', 'post', params, axiosOption, httpOption);
}
}
export default class DatasetVersion {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/datasetVersion/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/delete', 'post', params, axiosOption, httpOption);
}
static importFile (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/import', 'post', params, axiosOption, httpOption);
}
static detail (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetVersion/detail', 'post', params, axiosOption, httpOption);
}
}
export default class KnowledgeManage {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/list', 'post', params, axiosOption, httpOption);
}
static listFiles (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/listFiles', 'get', params, axiosOption, httpOption);
}
static recreate (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/recreate', 'post', params, axiosOption, httpOption);
}
static searchDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/searchDocs', 'post', params, axiosOption, httpOption);
}
static updateDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/updateDocs', 'post', params, axiosOption, httpOption);
}
static uploadDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/uploadDocs', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/knowledgeManage/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/delete', 'post', params, axiosOption, httpOption);
}
static deleteDocs (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/deleteDocs', 'post', params, axiosOption, httpOption);
}
static listForTree (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/knowledgeManage/listForTree', 'post', params, axiosOption, httpOption);
}
}
export default class modelCompress {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelCompress/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelCompress/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/modelCompress/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelCompress/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelCompress/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelCompress/delete', 'post', params, axiosOption, httpOption);
}
}
export default class ModelDeploy {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelDeploy/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelDeploy/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/modelDeploy/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelDeploy/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelDeploy/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelDeploy/delete', 'post', params, axiosOption, httpOption);
}
}
import axios from 'axios';
import { getToken } from '@/utils';
import requestUrl from '@/core/http/requestUrl.js';
export default class ModelEstimate {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelEstimate/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelEstimate/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/modelEstimate/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelEstimate/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelEstimate/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelEstimate/delete', 'post', params, axiosOption, httpOption);
}
static getLog (sender, params, options) {
let token = getToken();
var config = {
method: 'get',
url: requestUrl('/admin/app/modelEstimate/getLog'),
params: params,
headers: {
'Authorization': token
}
};
return axios(config)
}
static getPreviewCommand (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelEstimate/getPreviewCommand', 'get', params, axiosOption, httpOption);
}
static getStatus (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelEstimate/getStatus', 'get', params, axiosOption, httpOption);
}
static getStatusDetail (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelEstimate/getStatusDetail', 'post', params, axiosOption, httpOption);
}
static updateById (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelEstimate/updateById', 'post', params, axiosOption, httpOption);
}
}
export default class ModelSquare {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelSquare/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelSquare/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/modelSquare/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelSquare/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelSquare/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelSquare/delete', 'post', params, axiosOption, httpOption);
}
}
export default class modelTask {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelTask/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelTask/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/modelTask/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelTask/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelTask/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelTask/delete', 'post', params, axiosOption, httpOption);
}
}
export default class ModelVersion {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelVersion/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelVersion/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/modelVersion/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelVersion/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelVersion/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelVersion/delete', 'post', params, axiosOption, httpOption);
}
}
export default class myDataSet {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetManage/list', 'post', params, axiosOption, httpOption);
}
static listForTree (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetManage/listForTree', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetManage/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/datasetManage/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetManage/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetManage/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/datasetManage/delete', 'post', params, axiosOption, httpOption);
}
}
export default class MyModel {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelManage/list', 'post', params, axiosOption, httpOption);
}
static listForTree (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelManage/listForTree', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelManage/view', 'get', params, axiosOption, httpOption);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelManage/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelManage/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/modelManage/delete', 'post', params, axiosOption, httpOption);
}
}
export default class PyApi {
static predict (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/proxy/predict', 'post', params, axiosOption, httpOption);
}
}
import axios from 'axios';
import { getToken } from '@/utils';
import requestUrl from '@/core/http/requestUrl.js';
export default class TuningRun {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningRun/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningRun/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/tuningRun/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningRun/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningRun/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningRun/delete', 'post', params, axiosOption, httpOption);
}
static publish (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningRun/publish', 'post', params, axiosOption, httpOption);
}
static listForTree (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningRun/listForTree', 'post', params, axiosOption, httpOption);
}
static getPreviewCommand (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningRun/getPreviewCommand', 'get', params, axiosOption, httpOption);
}
static getStatus (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningRun/getStatus', 'get', params, axiosOption, httpOption);
}
static getLog (sender, params, options) {
let token = getToken();
var config = {
method: 'get',
url: requestUrl('/admin/app/tuningRun/getLog'),
params: params,
headers: {
'Authorization': token
}
};
return axios(config)
}
}
export default class TuningTask {
static list (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningTask/list', 'post', params, axiosOption, httpOption);
}
static view (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningTask/view', 'get', params, axiosOption, httpOption);
}
static export (sender, params, fileName) {
return sender.download('/admin/app/tuningTask/export', params, fileName);
}
static add (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningTask/add', 'post', params, axiosOption, httpOption);
}
static update (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningTask/update', 'post', params, axiosOption, httpOption);
}
static delete (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningTask/delete', 'post', params, axiosOption, httpOption);
}
static listForTree (sender, params, axiosOption, httpOption) {
return sender.doUrl('/admin/app/tuningTask/listForTree', 'post', params, axiosOption, httpOption);
}
}
import TemplateController from './GptController/PresetTemplateController.js';
import TemplateController from './GptController/TemplateController.js';
import BatchOptimizationController from './GptController/BatchOptimizationController.js';
import ModelSquare from './GptController/ModelSquare.js';
import MyModel from './GptController/MyModel.js';
import MyDataSet from './GptController/MyDataSet.js';
import DatasetDetail from './GptController/DatasetDetail.js';
import ModelVersion from './GptController/ModelVersion.js'
import DatasetVersion from './GptController/DatasetVersion.js';
import ModelTask from './GptController/ModelTask.js';
import ModelDeploy from './GptController/ModelDeploy.js';
import ModelEstimate from './GptController/ModelEstimate.js';
import ModelCompress from './GptController/ModelCompress.js';
import TuningTask from './GptController/TuningTask.js';
import TuningRun from './GptController/TuningRun.js';
import PyApi from './GptController/PyApi.js';
import KnowledgeManage from './GptController/KnowledgeManage.js';
export {
TemplateController
TemplateController,
BatchOptimizationController,
ModelSquare,
MyModel,
MyDataSet,
DatasetDetail,
ModelVersion,
DatasetVersion,
ModelTask,
ModelDeploy,
ModelEstimate,
ModelCompress,
TuningTask,
TuningRun,
PyApi,
KnowledgeManage
}
<?xml version="1.0" encoding="UTF-8"?>
<svg width="140px" height="73px" viewBox="0 0 140 73" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>选择数据集</title>
<defs>
<rect id="path-1" x="0" y="0" width="20" height="20" rx="10"></rect>
<rect id="path-3" x="82" y="36" width="40" height="30" rx="1"></rect>
<filter x="-17.5%" y="-33.3%" width="155.0%" height="173.3%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="4" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="3" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.103182954 0 0 0 0 0.242371171 0 0 0 0 0.467360344 0 0 0 0.108555507 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="1.1-在线标注入口优化-0818" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="数据标注" transform="translate(-246.000000, -766.000000)">
<g id="页面备份" transform="translate(0.000000, 590.000000)">
<g id="流程引导备份" transform="translate(196.000000, 112.000000)">
<g id="使用流程" transform="translate(24.000000, 64.000000)">
<g id="选择数据集" transform="translate(26.000000, 0.000000)">
<rect id="矩形" x="0" y="0" width="140" height="72"></rect>
<g id="编组-36" transform="translate(19.000000, 6.000000)">
<rect id="矩形" fill="#E6F0FF" x="0" y="0" width="90" height="60.5" rx="1"></rect>
<path d="M1.50657957,0 L89.0257298,0 C89.7107976,-1.25844902e-16 90.2661547,0.555357132 90.2661547,1.24042487 L90.2661547,5 L90.2661547,5 L0.266154698,5 L0.266154698,1.24042487 C0.266154698,0.555357132 0.82151183,3.47889507e-16 1.50657957,0 Z" id="矩形备份-8" fill="#2468F2"></path>
<g id="编组-32" transform="translate(31.000000, 12.000000)">
<rect id="矩形" fill="#FFFFFF" x="0" y="0" width="52" height="40" rx="1"></rect>
<g id="编组-21" transform="translate(5.000000, 6.000000)" fill="#A8CAFF">
<g id="编组-46" transform="translate(15.000000, 1.000000)">
<rect id="矩形" x="8.17124146e-14" y="0" width="7.05128205" height="2" rx="0.5"></rect>
<rect id="矩形备份-6" x="0" y="4" width="25" height="5" rx="1"></rect>
</g>
<circle id="椭圆形" cx="5" cy="5" r="5"></circle>
</g>
<rect id="矩形" fill="#A8CAFF" x="20" y="23" width="7.05128205" height="2" rx="0.5"></rect>
<rect id="矩形备份-6" fill="#A8CAFF" x="20" y="27" width="25" height="5" rx="1"></rect>
<circle id="椭圆形" fill="#A8CAFF" cx="10" cy="27" r="5"></circle>
</g>
<g id="编组-4" transform="translate(6.000000, 14.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="蒙版备份" fill="#FFFFFF" xlink:href="#path-1"></use>
<ellipse id="椭圆形备份-4" fill="#2468F2" mask="url(#mask-2)" cx="10" cy="18.9283994" rx="9.14475907" ry="9.05370173"></ellipse>
<ellipse id="椭圆形" fill="#2468F2" mask="url(#mask-2)" cx="10" cy="6.83223303" rx="2.0222025" ry="2.00206677"></ellipse>
</g>
<path d="M15.5,34.5 L15.5,44.5 C15.5,45.0522847 15.9477153,45.5 16.5,45.5 L29.5,45.5 L29.5,45.5" id="路径-5" stroke="#2468F2" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="2"></path>
</g>
<g id="矩形">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-3"></use>
<use fill-opacity="0.159118226" fill="#ADD3FF" fill-rule="evenodd" xlink:href="#path-3"></use>
</g>
<rect id="矩形" fill="#A7C8FC" x="93" y="41.2660099" width="17.3913043" height="17.7339901" rx="2"></rect>
<path d="M102,45.2660099 C102.552285,45.2660099 103,45.7171348 103,46.2736256 L103,49.296473 L106,49.296473 C106.552285,49.296473 107,49.747598 107,50.3040888 C107,50.8605796 106.552285,51.3117046 106,51.3117046 L103,51.3117046 L103,54.334552 C103,54.8910428 102.552285,55.3421678 102,55.3421678 C101.447715,55.3421678 101,54.8910428 101,54.334552 L101,51.3117046 L98,51.3117046 C97.4477153,51.3117046 97,50.8605796 97,50.3040888 C97,49.747598 97.4477153,49.296473 98,49.296473 L101,49.296473 L101,46.2736256 C101,46.0063893 101.105357,45.7500983 101.292893,45.5611337 C101.48043,45.3721691 101.734784,45.2660099 102,45.2660099 L102,45.2660099 Z" id="形状" fill="#2468F2" fill-rule="nonzero"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="140px" height="73px" viewBox="0 0 140 73" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>标注数据集</title>
<defs>
<filter x="-24.2%" y="-44.4%" width="148.5%" height="188.9%" filterUnits="objectBoundingBox" id="filter-1">
<feOffset dx="0" dy="0" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0.104890114 0 0 0 0 0.150829946 0 0 0 0 0.330804797 0 0 0 0.0998885148 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="45" height="30" rx="2"></rect>
<filter x="-15.6%" y="-33.3%" width="148.9%" height="173.3%" filterUnits="objectBoundingBox" id="filter-3">
<feOffset dx="4" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="3" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feComposite in="shadowBlurOuter1" in2="SourceAlpha" operator="out" result="shadowBlurOuter1"></feComposite>
<feColorMatrix values="0 0 0 0 0.103182954 0 0 0 0 0.242371171 0 0 0 0 0.467360344 0 0 0 0.108555507 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="1.1-在线标注入口优化-0818" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="数据标注" transform="translate(-509.000000, -766.000000)">
<g id="页面备份" transform="translate(0.000000, 590.000000)">
<g id="流程引导备份" transform="translate(196.000000, 112.000000)">
<g id="使用流程" transform="translate(24.000000, 64.000000)">
<g id="编组-16" transform="translate(263.000000, 0.000000)">
<g id="标注数据集" transform="translate(26.000000, 0.000000)">
<rect id="矩形" x="0" y="0" width="140" height="72"></rect>
<g id="编组-49" transform="translate(8.000000, 6.000000)">
<g id="编组-48">
<rect id="矩形" fill="#E6F0FF" x="20" y="0" width="80" height="60" rx="1"></rect>
<path d="M21,0 L99,0 C99.5522847,-1.01453063e-16 100,0.44771525 100,1 L100,5 L100,5 L20,5 L20,1 C20,0.44771525 20.4477153,1.01453063e-16 21,0 Z" id="矩形备份-23" fill="#2468F2"></path>
<g id="编组-44" transform="translate(28.000000, 12.000000)" fill="#A7C8FC">
<rect id="矩形" x="0" y="0" width="17" height="3" rx="1"></rect>
<g id="编组-45" transform="translate(0.000000, 5.000000)">
<rect id="矩形备份-4" x="0" y="0" width="30.9056604" height="8" rx="1"></rect>
<rect id="矩形备份-11" x="0" y="9.5" width="30.9056604" height="8" rx="1"></rect>
<rect id="矩形备份-18" x="0" y="19" width="30.9056604" height="8" rx="1"></rect>
<rect id="矩形备份-26" x="32.4056604" y="0" width="30.9056604" height="8" rx="1"></rect>
<rect id="矩形备份-25" x="32.4056604" y="9.5" width="30.9056604" height="8" rx="1"></rect>
<rect id="矩形备份-24" x="32.4056604" y="19" width="30.9056604" height="8" rx="1"></rect>
<rect id="矩形备份-30" x="0" y="28.5" width="30.9056604" height="8" rx="1"></rect>
<rect id="矩形备份-28" x="32.4056604" y="28.5" width="30.9056604" height="8" rx="1"></rect>
</g>
</g>
<g id="编组-47" filter="url(#filter-1)" transform="translate(0.000000, 20.146418)">
<path d="M1,0 L32,0 C32.5522847,-1.01453063e-16 33,0.44771525 33,1 L33,17 C33,17.5522847 32.5522847,18 32,18 L1,18 C0.44771525,18 6.76353751e-17,17.5522847 0,17 L0,1 C-6.76353751e-17,0.44771525 0.44771525,1.01453063e-16 1,0 Z" id="矩形备份-5" fill="#FFFFFF"></path>
<g id="编组-46" transform="translate(5.032309, 4.853582)">
<rect id="矩形" fill="#2468F2" x="0" y="0" width="14" height="2.5" rx="0.5"></rect>
<rect id="矩形备份-6" fill="#A8CAFF" x="0" y="4" width="24" height="5" rx="1"></rect>
</g>
</g>
</g>
<g id="编组-51" transform="translate(73.000000, 30.000000)">
<g id="矩形">
<use fill="black" fill-opacity="1" filter="url(#filter-3)" xlink:href="#path-2"></use>
<use fill-opacity="0.159118226" fill="#ADD3FF" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<g id="编组-50" transform="translate(14.000000, 6.000000)" fill-rule="nonzero">
<path d="M1.09874512,8.65954839 L13.6587489,8.66659001 C13.9498874,8.6668315 14.229142,8.55154993 14.4348199,8.34621463 L17.6780611,5.11428669 C18.1067248,4.68711829 18.1079011,3.99355511 17.6780598,3.56521317 L14.4277527,0.326243997 C14.2216644,0.120874574 13.9437396,0.00586769778 13.651683,0.00586769778 L1.11640983,0 C0.511099014,0 0.01884236,0.488192456 0.0176647125,1.09256533 L4.54747351e-13,7.56463598 C0.0011776475,8.16900885 0.492256654,8.65837485 1.09874512,8.65954839 Z M11.8475251,3.17442252 C12.4905206,2.53366992 13.5339183,2.5336719 14.1792691,3.17677158 C14.8234423,3.81869772 14.8222646,4.8596273 14.1769158,5.50038189 C13.5327426,6.14230802 12.4881673,6.1411325 11.8451698,5.49803481 C11.2021762,4.85493315 11.2021762,3.8151771 11.8475251,3.17442252 Z" id="形状" fill="#2468F2"></path>
<path d="M1.09874512,18.992958 L13.6587489,18.9999996 C13.9498874,19.0002411 14.229142,18.8849595 14.4348199,18.6796242 L17.6780611,15.4476963 C18.1067248,15.0205279 18.1079011,14.3269647 17.6780598,13.8986228 L14.4277527,10.6596536 C14.2216644,10.4542842 13.9437396,10.3392773 13.651683,10.3392773 L1.11640983,10.3334096 C0.511099014,10.3334096 0.01884236,10.8216021 0.0176647125,11.4259749 L0,17.8980456 C0.0011776475,18.5024185 0.492256654,18.9917845 1.09874512,18.992958 Z M11.8475251,13.5078321 C12.4905206,12.8670795 13.5339183,12.8670815 14.1792691,13.5101812 C14.8234423,14.1521073 14.8222646,15.1930369 14.1769158,15.8337915 C13.5327426,16.4757176 12.4881673,16.4745421 11.8451698,15.8314444 C11.2021762,15.1883428 11.2021762,14.1485867 11.8475251,13.5078321 Z" id="形状" fill="#A7C8FC"></path>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
......@@ -130,6 +130,11 @@ body .fullscreen-dialog .layui-layer-content {
border-color: $--color-primary;
color: $--color-primary;
}
.el-button--danger.is-plain:hover, .el-button--danger.is-plain:focus {
background: #F56C6C;
border-color: #F56C6C;
color: #FFFFFF;
}
.el-select-dropdown__item.selected{
color: $--color-primary;
}
......@@ -1060,3 +1065,9 @@ body .fullscreen-dialog .layui-layer-content {
.radio-table {
display: block;
}
.el-message-box__content {
max-height: 500px;
word-break:break-all;
overflow: auto;
}
\ No newline at end of file
import axios from 'axios'
import projectConfig from '@/core/config';
axios.defaults.baseURL = projectConfig.baseUrl
// axios.defaults.baseURL = projectConfig.baseUrl
const service = axios.create({
timeout: 40000,
......@@ -9,6 +9,7 @@ const service = axios.create({
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json; charset=UTF-8'
},
baseURL:projectConfig.baseUrl
})
service.interceptors.request.use(
config => {
......
module.exports = {
baseUrl: 'http://192.168.0.34:8082/',
projectName: '大语言模型平台'
wsUrl: 'ws://192.168.0.36:7860/',
projectName: '灵境大模型平台'
}
module.exports = {
baseUrl: 'http://localhost:8082/',
projectName: '大语言模型平台'
projectName: '灵境大模型平台'
}
......@@ -4,7 +4,7 @@ import request from './request';
import requestUrl from './requestUrl';
import { globalConfig } from '@/core/config';
import { getAppId } from '@/utils';
import axios from 'axios';
function showErrorMessage (text) {
let appId = getAppId();
if (appId != null && appId !== '') {
......@@ -136,9 +136,9 @@ const fetchDownloadBlob = function (url, params, fileName, methos = 'post') {
* @param {String} fileName 下载后保存的文件名
* @returns {Promise}
*/
const fetchDownload = function (url, params, fileName) {
const fetchDownload = function (url, params, fileName, methos) {
return new Promise((resolve, reject) => {
fetchDownloadBlob(url, params).then(blobData => {
fetchDownloadBlob(url, params, fileName, methos).then(blobData => {
let blobUrl = window.URL.createObjectURL(blobData);
let linkDom = document.createElement('a');
linkDom.style.display = 'none';
......@@ -162,10 +162,10 @@ const fetchDownload = function (url, params, fileName) {
* @param {*} url 请求的url
* @param {*} params 请求参数
*/
const fetchUpload = function (url, params) {
const fetchUpload = function (url, params, isDefUrl = true) {
return new Promise((resolve, reject) => {
request({
url: requestUrl(url),
url: isDefUrl ? requestUrl(url) : url,
method: 'post',
data: params,
headers: {
......@@ -174,14 +174,22 @@ const fetchUpload = function (url, params) {
transformRequest: [
function (data) {
let formData = new FormData();
// formData.append('files', files);
Object.keys(data).map(key => {
formData.append(key, data[key]);
if (Array.isArray(data[key]) && key === 'filesArr') { // 判断多文件上传
data[key].forEach(item => {
formData.append('files', item);
});
} else {
formData.append(key, data[key]);
}
});
return formData;
}
]
}).then(res => {
if (res.data && res.data.success) {
console.log(res);
if ((res.data && res.data.success) || res.data.code === 200) {
resolve(res.data);
} else {
showErrorMessage({
......@@ -268,16 +276,32 @@ const doUrl = function (url, type, params, axiosOption, options) {
});
}
};
const streamRequest = (url, params) => {
return new Promise((resolve, reject) => {
// requestUrl(url)
console.log(url);
axios({
method: 'post',
url: url,
data: params,
responseType: 'stream'
}).then(response => {
console.log(response);
resolve(response)
});
})
}
Vue.prototype.upload = fetchUpload;
Vue.prototype.download = fetchDownload;
Vue.prototype.doUrl = doUrl;
Vue.prototype.loadingManager = loadingManager;
Vue.prototype.streamRequest = streamRequest;
export default {
fetchUpload,
doUrl,
fetchPost,
fetchGet,
fetchDownload,
fetchDownloadBlob
fetchDownloadBlob,
streamRequest
}
......@@ -10,6 +10,9 @@ import App from './App';
import router from './router';
import store from './store';
import '@/staticDict/onlineStaticDict.js';
import '@/staticDict/gptStaticDict.js';
import {SocketService} from '@/utils/websocket.js';
import TreeSelect from '@/components/TreeSelect';
import RichEditor from '@/components/RichEditor';
import InputNumberRange from '@/components/InputNumberRange';
......@@ -30,6 +33,9 @@ import OnlineCustomBlock from '@/online/components/OnlineCustomBlock.vue';
import OnlineBaseCard from '@/online/components/OnlineBaseCard.vue';
import OnlineCustomTabs from '@/online/components/OnlineCustomTabs.vue';
import OnlineCustomTableContainer from '@/online/components/OnlineTableContainer/index.vue';
import VueClipboard from 'vue-clipboard2'
Vue.prototype.$SocketService = SocketService
Vue.use(VueClipboard)
Vue.component('OnlineCustomBlock', OnlineCustomBlock);
Vue.component('OnlineBaseCard', OnlineBaseCard);
Vue.component('OnlineCustomTabs', OnlineCustomTabs);
......
......@@ -59,15 +59,14 @@ const routers = [
{ path: 'onlineAnnotation', component: _import('gptTraining/dataServices/onlineAnnotation/index'), name: 'onlineAnnotation', props: getProps, meta: { title: '在线标注' } },
{ path: 'dataCleansing', component: _import('gptTraining/dataServices/dataCleansing/index'), name: 'dataCleansing', props: getProps, meta: { title: '数据清洗' } },
{ path: 'dataEnhancement', component: _import('gptTraining/dataServices/dataEnhancement/index'), name: 'dataEnhancement', props: getProps, meta: { title: '数据增强' } },
{ path: 'dataReflux', component: _import('gptTraining/dataServices/dataReflux/index'), name: 'dataReflux', props: getProps, meta: { title: '数据回流' } },
// 模型管理
{ path: 'myModel', component: _import('gptTraining/modelManagement/myModel/index'), name: 'myModel', props: getProps, meta: { title: '我的模型' } },
{ path: 'presetModel', component: _import('gptTraining/modelManagement/presetModel/index'), name: 'presetModel', props: getProps, meta: { title: '预制模型' } },
{ path: 'modelSquare', component: _import('gptTraining/modelManagement/modelSquare/index'), name: 'modelSquare', props: getProps, meta: { title: '模型广场' } },
{ path: 'modelEvaluation', component: _import('gptTraining/modelManagement/modelEvaluation/index'), name: 'modelEvaluation', props: getProps, meta: { title: '模型评估' } },
{ path: 'modelCompression', component: _import('gptTraining/modelManagement/modelCompression/index'), name: 'modelCompression', props: getProps, meta: { title: '模型压缩' } },
// 模型服务
{ path: 'serviceManagement', component: _import('gptTraining/modelService/serviceManagement/index'), name: 'serviceManagement', props: getProps, meta: { title: '服务管理' } },
{ path: 'serviceManagement', component: _import('gptTraining/modelService/serviceManagement/index'), name: 'serviceManagement', props: getProps, meta: { title: '在线服务' } },
{ path: 'applicationAccess', component: _import('gptTraining/modelService/applicationAccess/index'), name: 'applicationAccess', props: getProps, meta: { title: '应用接入' } },
{ path: 'testOnline', component: _import('gptTraining/modelService/testOnline/index'), name: 'testOnline', props: getProps, meta: { title: '在线测试' } },
{ path: 'callStatistics', component: _import('gptTraining/modelService/callStatistics/index'), name: 'callStatistics', props: getProps, meta: { title: '调用统计' } },
......@@ -78,8 +77,31 @@ const routers = [
// { path: 'presetTemplate', component: _import('gptTraining/promptProject/presetTemplate/index'), name: 'presetTemplate', props: getProps, meta: { title: '预置模板' } },
// { path: 'homemadeTemplate', component: _import('gptTraining/promptProject/homemadeTemplate/index'), name: 'homemadeTemplate', props: getProps, meta: { title: '自制模板' } },
// { path: 'myCollection', component: _import('gptTraining/promptProject/myCollection/index'), name: 'myCollection', props: getProps, meta: { title: '我的收藏' } },
{ path: 'promptOptimization', component: _import('gptTraining/promptProject/promptOptimization/index'), name: 'promptOptimization', props: getProps, meta: { title: 'Prompt优化' } },
// 模型精调
{ path: 'sft', component: _import('gptTraining/modelFineTuning/sft/index'), name: 'sft', props: getProps, meta: { title: 'SFT' } },
{
path: 'promptOptimization',
component: _import('gptTraining/promptProject/promptOptimization/index'),
name: 'promptOptimization',
props: getProps,
meta: { title: 'Prompt优化' },
children: [
{
path: 'onLineOptimization',
name: 'onLineOptimization',
props: getProps,
component: _import('gptTraining/promptProject/promptOptimization/onLineOptimization/index')
}, {
path: 'batchOptimization',
name: 'batchOptimization',
props: getProps,
component: _import('gptTraining/promptProject/promptOptimization/batchOptimization/index')
}
]
},
// { path: 'onLineOptimization', component: _import('gptTraining/promptProject/onLineOptimization/index'), name: 'onLineOptimization', props: getProps, meta: { title: '在线优化' } },
// { path: 'batchOptimization', component: _import('gptTraining/promptProject/batchOptimization/index'), name: 'batchOptimization', props: getProps, meta: { title: '批量优化' } },
......
/**
* GTP常量字典
*/
import Vue from 'vue';
import { DictionaryBase } from './index.js';
const TemplateLabelDict = new DictionaryBase('模板标签', [
]);
Vue.prototype.TemplateLabelDict = TemplateLabelDict;
const ScenarioTypeDict = new DictionaryBase('场景类型', [
{
id: 0,
name: '文生文',
symbol: '文生文'
},
{
id: 1,
name: '文生图',
symbol: '文生图'
}
]);
Vue.prototype.ScenarioTypeDict = ScenarioTypeDict;
const ParameterFormatLabelDict = new DictionaryBase('变量识别符', [
{
id: 0,
name: '大括号{}',
symbol: '{}'
},
{
id: 1,
name: '双大括号{{}}',
symbol: '{{}}'
},
{
id: 2,
name: '中括号[]',
symbol: '[]'
},
{
id: 3,
name: '双中括号[[]]',
symbol: '[[]]'
},
{
id: 4,
name: '小括号()',
symbol: '()'
},
{
id: 5,
name: '双小括号(())',
symbol: '(())'
}
]);
Vue.prototype.ParameterFormatLabelDict = ParameterFormatLabelDict;
const TemplateFrameworkDict = new DictionaryBase('模板框架', [
{
id: 0,
name: '无',
symbol: '无'
},
{
id: 1,
name: 'Basic Prompt Framework',
symbol: 'Basic Prompt Framework'
},
{
id: 2,
name: 'CRISPE Prompt Framework',
symbol: 'CRISPE Prompt Framework'
},
{
id: 3,
name: 'Few-shot Prompt',
symbol: 'Few-shot Prompt'
}
]);
Vue.prototype.TemplateFrameworkDict = TemplateFrameworkDict;
const DataType = new DictionaryBase('数据类型', [
{
id: 0,
name: '文本',
symbol: 'text'
},
{
id: 1,
name: '跨模态',
symbol: 'crossMode'
}
]);
Vue.prototype.DataType = DataType;
const LabelType = new DictionaryBase('标注类型', [
{
id: 0,
name: '文本对话',
symbol: 'textDialogue'
},
{
id: 1,
name: '泛文本无标注',
symbol: 'universalTextWithoutAnnotations'
},
{
id: 2,
name: 'query问题集',
symbol: 'queryProblemSet'
}
]);
Vue.prototype.LabelType = LabelType;
const MarkTemplate = new DictionaryBase('标注模版', [
{
id: 0,
name: '非排序',
symbol: 'nonSorting'
},
{
id: 1,
name: '含排序',
symbol: 'inclusiveSort'
}
]);
Vue.prototype.MarkTemplate = MarkTemplate;
const InputStatus = new DictionaryBase('导入状态', [
{
id: 0,
name: '-',
symbol: '0'
},
{
id: 1,
name: '导入完成',
symbol: 'importsClosure'
},
{
id: 2,
name: '新建',
symbol: 'new'
}
]);
Vue.prototype.InputStatus = InputStatus;
const OutputStatus = new DictionaryBase('导入状态', [
{
id: 0,
name: '-',
symbol: '0'
},
{
id: 1,
name: '导出完成',
symbol: '1'
}
]);
Vue.prototype.OutputStatus = OutputStatus;
const CleanStatus = new DictionaryBase('清洗状态', [
{
id: 0,
name: '-',
symbol: '0'
},
{
id: 1,
name: '清洗完成',
symbol: '1'
}
]);
Vue.prototype.CleanStatus = CleanStatus;
const EnhanceStatus = new DictionaryBase('增强状态', [
{
id: 0,
name: '-',
symbol: '0'
},
{
id: 1,
name: '增强完成',
symbol: '1'
}
]);
Vue.prototype.EnhanceStatus = EnhanceStatus;
const ReleaseStatus = new DictionaryBase('发布状态', [
{
id: 0,
name: '未发布',
symbol: 'unpublished'
},
{
id: 1,
name: '已发布',
symbol: 'havePublished'
}
]);
Vue.prototype.ReleaseStatus = ReleaseStatus;
const ImportFormat = new DictionaryBase('导入格式', [
{
id: 0,
name: 'JSONL',
symbol: 'jsonl'
},
{
id: 1,
name: 'TEXT',
symbol: 'text'
},
{
id: 2,
name: 'CSV',
symbol: 'csv'
},
{
id: 3,
name: 'XLSX',
symbol: 'xlsx'
},
{
id: 4,
name: '压缩包',
symbol: 'rar'
}
]);
Vue.prototype.ImportFormat = ImportFormat;
const DataAnnotationState = new DictionaryBase('发布状态', [
{
id: 0,
name: '无标注信息',
symbol: 'UnmarkedInformation'
},
{
id: 1,
name: '有标注信息',
symbol: 'MarkedInformation'
}
]);
Vue.prototype.DataAnnotationState = DataAnnotationState;
const ModelTrainingMode = new DictionaryBase('发布状态', [
{
id: 0,
name: 'SFT',
symbol: 'SFT'
},
{
id: 1,
name: 'RLHF-强化学习',
symbol: 'RLHF'
}
]);
Vue.prototype.ModelTrainingMode = ModelTrainingMode;
const ModelType = new DictionaryBase('模型类型', [
{
id: 0,
name: '大语言模型',
symbol: 'LargeLanguageModel'
},
{
id: 1,
name: '文生图大模型',
symbol: 'VincennesDiagramLargeModel'
}
]);
Vue.prototype.ModelType = ModelType;
const VersionStatus = new DictionaryBase('版本状态', [
{
id: 0,
name: '创建中',
symbol: 'creating'
},
{
id: 1,
name: '就绪',
symbol: 'ready'
},
{
id: 2,
name: '创建失败',
symbol: 'creationFailure'
}
]);
Vue.prototype.VersionStatus = VersionStatus;
const ModelCreationMode = new DictionaryBase('模型创建⽅式', [
{
id: 0,
name: '创建为已有模型新版本',
symbol: 'creating'
},
{
id: 1,
name: '创建为新模型',
symbol: 'ready'
}
]);
Vue.prototype.ModelCreationMode = ModelCreationMode;
const TaskType = new DictionaryBase('任务类型', [
{
id: 0,
name: '新建版本',
symbol: 'NewVersion'
},
{
id: 1,
name: '模型评估',
symbol: 'modelEvaluation'
},
{
id: 2,
name: '模型压缩',
symbol: 'ModelCompression'
}
]);
Vue.prototype.TaskType = TaskType;
// const SftTaskType = new DictionaryBase('sft任务类型', [
// {
// id: 0,
// name: '大语言模型',
// symbol: ''
// },
// {
// id: 1,
// name: '文生图模型',
// symbol: ''
// }
// ]);
// Vue.prototype.SftTaskType = SftTaskType;
const TaskStatus = new DictionaryBase('任务状态', [
{
id: 0,
name: '待评估',
symbol: 'ToBeTrained'
},
{
id: -1,
name: '失败',
symbol: 'err'
},
{
id: 1,
name: '已完成',
symbol: 'accomplish'
},
{
id: 2,
name: '评估中断',
symbol: 'stopped'
}
]);
Vue.prototype.TaskStatus = TaskStatus;
const TrainingMethod = new DictionaryBase('训练方法', [
{
id: 0,
name: 'full',
symbol: 'full'
},
{
id: 1,
name: 'freeze',
symbol: 'freeze'
},
{
id: 2,
name: 'lora',
symbol: 'lora'
}
]);
Vue.prototype.TrainingMethod = TrainingMethod;
const PublishWay = new DictionaryBase('发布方式', [
{
id: 0,
name: '发布为新模型',
symbol: 'Publish as a new model'
},
{
id: 1,
name: '已有模型新版本',
symbol: 'New version of existing model'
}
]);
Vue.prototype.PublishWay = PublishWay;
const ModeOfSpeaking = new DictionaryBase('对话模式', [
{
id: 0,
name: 'LLM 对话',
symbol: 'llm'
},
{
id: 1,
name: '知识库问答',
symbol: 'repository'
},
{
id: 2,
name: '搜索引擎问答',
symbol: 'se'
}
]);
Vue.prototype.ModeOfSpeaking = ModeOfSpeaking;
const RunningStatus = new DictionaryBase('运行状态', [
{
id: 0,
name: '待训练',
symbol: 'ToBeTrained'
},
{
id: 1,
name: '训练完成',
symbol: 'CompletionOfTraining'
},
{
id: 2,
name: '训练中断',
symbol: 'TrainingInterruption'
},
{
id: -1,
name: '训练失败',
symbol: 'TrainingFailure'
}
]);
Vue.prototype.RunningStatus = RunningStatus;
export {
TemplateLabelDict,
ScenarioTypeDict,
ParameterFormatLabelDict,
TemplateFrameworkDict,
DataType,
LabelType,
MarkTemplate,
InputStatus,
OutputStatus,
CleanStatus,
EnhanceStatus,
ReleaseStatus,
ImportFormat,
DataAnnotationState,
ModelTrainingMode,
ModelCreationMode,
TrainingMethod,
ModeOfSpeaking,
RunningStatus
}
// import { Message } from 'element-ui';
// import projectConfig from '@/core/config';
import { getToken } from '@/utils';
class GetStreaming {
constructor (url, param, onmessage = () => {}) {
// eslint-disable-next-line no-unused-vars
this.tokrn = getToken()
this.param = param
this.url = url
this.es = null;
this.onmessage = onmessage
}
// 初始化weosocket
initeventSource () {
fetch(this.url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(this.param)
})
.then(response => {
if (response.ok) {
const reader = response.body.getReader();
return this.readStream(reader);
} else {
throw new Error(`Unexpected status code: ${response.status}`);
}
})
.catch(error => {
console.error(`Error: ${error.message}`);
});
}
readStream (reader) {
return reader.read().then(({ done, value }) => {
if (done) {
console.log('Stream ended');
return;
}
const chunk = new TextDecoder().decode(value);
this.onmessage(chunk)
// Continue reading the next chunk
return this.readStream(reader);
});
}
}
export { GetStreaming }
// import { fetchEventSource } from '@microsoft/fetch-event-source';
// submit () {
// fetchEventSource('/2api/chat/chat', {
// method: 'POST',
// signal: new AbortController().signal,
// headers: {
// 'Content-Type': 'application/json'
// },
// body: JSON.stringify(this.param),
// async onopen (response) {
// console.log('连接了:', response);
// },
// onmessage (msg) {
// console.log('消息:', msg);
// },
// onclose () {
// console.log('关闭');
// },
// onerror (err) {
// throw new Error(err)
// }
// });
// }
......@@ -521,3 +521,13 @@ export function getObjectValue (data, fieldName) {
return tempValue;
}
export function getSessionHash (length) { // 获取随机字符串
let result = '';
const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
const charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
import { Message } from 'element-ui';
import projectConfig from '@/core/config';
import { getToken } from '@/utils';
class SocketService {
constructor (url, websocketonmessage = () => {}, successful = () => {}, timeOut) {
// eslint-disable-next-line no-unused-vars
this.tokrn = getToken()
this.timeOut = timeOut || 2000
this.url = projectConfig.wsUrl + url
this.ws = null;
this.timeObj = null;
this.reconnectNumber = 0
this.websocketonmessage = websocketonmessage
this.successful = successful
}
// 初始化weosocket
async initWebSocket () {
this.ws = await new WebSocket(this.url);
this.ws.onopen = await this.websocketonopen.bind(this);
this.ws.onerror = await this.websocketonerror.bind(this);
this.ws.onmessage = await this.websocketonmessage;
this.ws.onclose = await this.websocketclose.bind(this);
}
// 心跳
startHeartbeat () {
clearInterval(this.timeObj)
this.timeObj = null
this.timeObj = setInterval(() => {
this.websocketsend('link')
}, this.timeOut);
}
// 重连
reconnect () {
setTimeout(() => {
Message('尝试重连')
this.reconnectNumber++
// 建立新连接
if (this.reconnectNumber >= 5) return
this.initWebSocket();
}, 5000);
}
websocketonopen () { // 连接成功
// this.startHeartbeat()
Message({
message: 'WebSocket连接成功',
type: 'success'
})
this.successful()
}
websocketonerror (e) { // 错误
this.reconnect()
Message({
message: 'WebSocket连接发生错误',
type: 'error'
})
}
// websocketonmessage (e) { // 数据接收
// this.redata = e;
// }
websocketsend (agentData) { // 数据发送
this.ws.send(agentData);
}
websocketclose (e) { // 关闭
// Message('connection closed (' + e.code + ')')
}
}
export { SocketService }
......@@ -144,6 +144,7 @@ export class TableWidget {
* @param {Integer} newCurrentPage 变化后的显示页面
*/
onCurrentPageChange (newCurrentPage) {
console.log(newCurrentPage, this.pageSize);
this.loadTableDataImpl(newCurrentPage, this.pageSize).then(() => {
this.oldPage = this.currentPage = newCurrentPage;
}).catch(() => {
......
<!-- 创建 -->
<template>
<el-form label-position="left" ref="form" label-width="80px" :model="form" :size="defaultFormItemSize">
<el-row class="title">基本信息</el-row>
<el-form-item label="任务名称:" >
<el-input v-model="form.taskName" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-form-item label="描述:">
<el-input v-model="form.taskDescribe" type="textarea" :rows="4" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button>
</el-row>
</el-form>
</template>
<script>
import { BatchOptimizationController } from '@/api/gptController.js';
export default {
data () {
return {
form: {
'chain': 0,
'destDatasetId': 0,
'destDatasetName': '',
'destDatasetVersion': 0,
'epoch': 0,
'failCount': 0,
'finishTime': '',
'qualityQptimality': 0,
'shortenPrompt': 0,
'sourceDatasetId': 0,
'sourceDatasetName': '',
'sourceDatasetVersion': 0,
'successCount': 0,
'taskDescribe': '',
'taskName': '',
'taskStatus': 0
}
};
},
props: ['isEdit', 'item'],
components: { },
computed: {
},
mounted () {
this.intFrom()
},
methods: {
intFrom () {
this.form = { ...this.form, ...this.item }
try {
this.form.templateLabel = JSON.parse(this.item.templateLabel)
} catch (error) {
// console.log(error);
}
},
onCancel (isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
}
},
onSubmit () {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {};
params.promptOptimizeBatchDto = { ...this.form };
if (this.isEdit) {
BatchOptimizationController.update(this, params).then(res => {
resolve(res);
this.$message.success('编辑成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
} else {
BatchOptimizationController.add(this, params).then(res => {
resolve(res);
this.$message.success('添加成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
}
} else {
reject();
}
});
});
}
}
};
</script>
<style scoped>
.inputWidth {
width: 600px;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
.introduce{
font-size: 12px;
color: #909399;
}
</style>
......@@ -29,57 +29,57 @@
</el-collapse-item>
</el-collapse>
<div class="tableBox" :style="{ height: tableHeight }">
<el-form
ref="myDataSetPage"
:model="myDataSetPage"
label-width="75px"
:size="defaultFormItemSize"
label-position="right"
@submit.native.prevent
>
<filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label-width="0px">
<el-button
class="add"
type="primary"
icon="el-icon-plus"
<el-form
ref="myDataSetPage"
:model="myDataSetPage"
label-width="75px"
:size="defaultFormItemSize"
>创建任务</el-button
label-position="right"
@submit.native.prevent
>
</el-form-item>
<el-form-item
label="数据集名称或id"
prop="formFilter.dataName"
label-width="120px"
>
<el-input
class="filter-item"
v-model="myDataSetPage.formFilter.dataName"
:clearable="true"
placeholder="数据集名称或id"
/>
<filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label-width="0px">
<el-button
class="add"
type="primary"
icon="el-icon-plus"
:size="defaultFormItemSize"
@click="add()"
>创建任务</el-button
>
</el-form-item>
</filter-box>
</el-form>
<el-form-item
label="数据集名称或id"
prop="formFilter.dataName"
label-width="120px"
>
<el-input
class="filter-item"
v-model="myDataSetPage.formFilter.dataName"
:clearable="true"
placeholder="数据集名称或id"
/>
</el-form-item>
</filter-box>
</el-form>
<vxe-table
border
show-header-overflow
show-overflow
:row-config="{ isHover: true }"
:data="tableData"
:data="myDataSetPage.tableData.impl.dataList"
min-height="96"
>
<vxe-column field="versions" title="版本"></vxe-column>
<vxe-column field="versionsId" title="版本ID"></vxe-column>
<vxe-column field="importState" title="导入状态"></vxe-column>
<vxe-column field="derivedState" title="导出状态"></vxe-column>
<vxe-column field="cleanCondition" title="清洗状态"></vxe-column>
<vxe-column field="enhancedState" title="增强状态"></vxe-column>
<vxe-column field="publishStatus" title="发布状态"></vxe-column>
<vxe-column field="AnnotationType" title="标注类型>模板"></vxe-column>
<vxe-column field="cleanCondition" title="增强状态"></vxe-column>
<vxe-column field="cleanCondition" title="发布状态"></vxe-column>
<vxe-column field="cleanCondition" title="标注类型>模板"></vxe-column>
<vxe-column field="operation" title="操作">
<!-- <template slot-scope="scope">
<el-button
......@@ -97,12 +97,20 @@
</template> -->
</vxe-column>
</vxe-table>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;">
<el-pagination :total="myDataSetPage.tableData.impl.totalCount" :current-page="myDataSetPage.tableData.impl.currentPage" :page-size="myDataSetPage.tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="myDataSetPage.tableData.impl.onCurrentPageChange" @size-change="myDataSetPage.tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js';
import { ModelSquare } from '@/api/gptController.js';
import editOrAdd from './dialog/editOrAdd';
export default {
data () {
return {
......@@ -137,19 +145,17 @@ export default {
],
myDataSetPage: {
formFilter: {
dataName: '1'
}
},
tableData: [
{
id: 10001,
name: 'Test1',
role: 'Develop',
sex: 'Man',
age: 28,
address: 'test abc'
'modelDescribe': '',
'modelId': 0,
'modelName': '',
'modelType': 0,
'versionCount': 0
},
tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false)
}
]
}
};
},
......@@ -157,24 +163,98 @@ export default {
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - this.collapseHeight - 34 + 'px';
return this.getMainContextHeight - this.collapseHeight - 35 + 'px';
}
},
mounted () {
},
methods: {
getwidgetData (params) {
if (params == null) params = {};
params = {
...params,
// orderParam: [
// {
// asc: true,
// dateAggregateBy: '',
// fieldName: ''
// }
// ],
// pageParam: {
// pageNum: 0,
// pageSize: 0
// },
modelSquareDtoFilter: { ...this.myDataSetPage.formFilter }
}
return new Promise((resolve, reject) => {
ModelSquare.list(this, params).then(res => {
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
});
}).catch(e => {
reject(e);
});
});
},
add () {
this.$dialog.show('创建模版', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: false }).then(res => {
this.refresh();
}).catch(e => { });
},
edit (item) {
this.$dialog.show('修改模版', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { });
},
del (item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { batchTaskId: item.batchTaskId }
ModelSquare.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
},
refresh (reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1);
} else {
this.myDataSetPage.tableData.impl.refreshTable();
}
},
onReset () {
this.$refs.myDataSetPage.resetFields();
this.refresh(true);
},
formInit () {
this.refresh();
},
resize (e) {
setTimeout(() => {
this.collapseHeight = e.height
this.collapseHeight = e?.height
}, 300);
}
},
mounted () {
this.resize()
this.formInit()
}
};
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
......@@ -182,12 +262,13 @@ export default {
background-color: white;
width: 100%;
padding: 0px 20px 20px 20px;
height: 280px;
height: 250px;
.instructionsList {
display: flex;
flex-direction: row;
justify-content: space-around;
}
.title {
color: $--color-text-primary;
......@@ -223,6 +304,7 @@ export default {
background-color: white;
width: 100%;
padding: 20px;
overflow: auto;
.add {
margin-bottom: 20px;
}
......
......@@ -70,7 +70,11 @@
min-height="96"
>
<vxe-column field="taskName" title="任务名称"></vxe-column>
<vxe-column field="taskStatus" title="任务状态"></vxe-column>
<vxe-column field="taskStatus" title="任务状态">
<template slot-scope="scope">
{{ TaskStatus.getValue(scope.row.taskStatus) }}
</template>
</vxe-column>
<vxe-column field="enhancementType" title="增强类型"></vxe-column>
<vxe-column field="enhancementMode" title="增强方式"></vxe-column>
<vxe-column field="dependencyModel" title="依赖模型"></vxe-column>
......@@ -215,6 +219,7 @@ export default {
background-color: white;
width: 100%;
padding: 20px;
overflow: auto;
.add {
margin-bottom: 20px;
}
......
<!-- 数据回流 -->
<template>
<div style="position: relative">
<div class="topBox">
<div class="title">数据回流</div>
<div class="instructions">支持将线上预测服务的结果保存回数据集,经人工筛选、调整以及处理后,用于下一次的模型优化训练。</div>
</div>
<div class="tableBox" :style="{ height: tableHeight }">
<el-button class="add" type="primary" icon="el-icon-plus" :size="defaultFormItemSize">创建回流配置</el-button>
<vxe-table
border
show-header-overflow
show-overflow
:row-config="{ isHover: true }"
:data="tableData"
min-height="96"
>
<vxe-column field="serviceName" title="服务名称"></vxe-column>
<vxe-column field="serviceType" title="服务类型"></vxe-column>
<vxe-column field="evaluationQuantity" title="评价数量"></vxe-column>
<vxe-column field="creator" title="创建人"></vxe-column>
<vxe-column field="creationTime" title="创建时间"></vxe-column>
<vxe-column field="operation" title="操作">
<!-- <template slot-scope="scope">
<el-button
type="text"
:size="defaultFormItemSize"
@click="dataImport(scope.row)"
>导入</el-button
>
<el-button
type="text"
:size="defaultFormItemSize"
@click="del(scope.row)"
>删除</el-button
>
</template> -->
</vxe-column>
</vxe-table>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
export default {
data () {
return {
tableData: [
{
id: 10001,
name: 'Test1',
role: 'Develop',
sex: 'Man',
age: 28,
address: 'test abc'
}
]
};
},
components: {},
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - 95 + 'px';
}
},
mounted () {
},
methods: {
resize (e) {
setTimeout(() => {
this.collapseHeight = e.height
}, 300);
}
}
};
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
.topBox{
background-color: white;
width: 100%;
height: 95px;
margin-bottom: 16px;
.title {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
padding: 20px 20px 10px 20px;
}
}
.instructions {
padding: 0px 20px 20px 20px;
.describe {
color: $--color-text-secondary;
margin-bottom: 16px;
}
.itemTitle {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
}
.head-index {
font-size: 24px;
color: #e8e9eb;
line-height: 32px;
}
.itemDescribe {
width: 170px;
color: $--color-text-secondary;
}
.img {
height: 72px;
width: 140px;
}
}
.tableBox {
background-color: white;
width: 100%;
padding: 20px;
.add {
margin-bottom: 20px;
}
}
</style>
<!-- 创建数据集 -->
<template>
<el-form label-position="left" ref="form" label-width="100px" :model="form" :size="defaultFormItemSize">
<el-row class="title">基本信息</el-row>
<el-form-item label="数据集名称:">
<el-input v-model="form.datasetName" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-form-item label="数据类型:">
<el-radio v-for="item in DataType.getList()" :key="item.id" v-model="form.dataType" :label="item.id">{{item.name}}</el-radio>
</el-form-item>
<el-form-item label="数据集版本:">
{{ 'V1' }}
</el-form-item>
<el-form-item label="标注类型:">
<el-radio v-for="item in LabelType.getList()" :key="item.id" v-model="form.dimensionType" :label="item.id">{{item.name}}</el-radio>
</el-form-item>
<el-form-item label="标注模版:" v-if="form.dimensionType===0">
<el-radio v-for="item in MarkTemplate.getList()" :key="item.id" v-model="form.template" :label="item.id">{{item.name}}</el-radio>
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button>
</el-row>
</el-form>
</template>
<script>
import { MyDataSet } from '@/api/gptController.js';
export default {
data () {
return {
form: {
'dataType': 0,
'datasetName': '',
'deletedFlag': 0,
'dimensionType': 0,
'template': 0
}
};
},
props: ['isEdit', 'item'],
components: {},
computed: {
},
mounted () {
this.intFrom()
},
methods: {
intFrom () {
this.form = { ...this.form, ...this.item }
try {
this.form.templateLabel = JSON.parse(this.item.templateLabel)
} catch (error) {
// console.log(error);
}
},
onCancel (isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
}
},
onSubmit () {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {};
params.datasetManageDto = { ...this.form };
if (this.isEdit) {
MyDataSet.update(this, params).then(res => {
resolve(res);
this.$message.success('编辑成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
} else {
MyDataSet.add(this, params).then(res => {
resolve(res);
this.$message.success('添加成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
}
} else {
reject();
}
});
});
}
}
};
</script>
<style scoped>
.inputWidth {
width: 600px;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
.introduce{
font-size: 12px;
color: #909399;
}
</style>
<!-- 我的数据集 -->
<template>
<div style="position: relative">
<el-form
ref="myDataSetPage"
:model="myDataSetPage"
label-width="75px"
:size="defaultFormItemSize"
label-position="right"
@submit.native.prevent
>
<filter-box :item-width="350" @search="search()" @reset="onReset">
<el-form-item label="标注类型" prop="formFilter.annotationType">
<el-cascader
v-model="myDataSetPage.formFilter.annotationType"
:options="myDataSetPage.options"
@change="handleChange"
></el-cascader>
<el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
<filter-box :item-width="350" @search="refresh()" @reset="onReset">
<el-form-item label="标注类型" prop="formFilter.dimensionType">
<el-select v-model="myDataSetPage.formFilter.dimensionType" placeholder="请选择">
<el-option v-for="item in LabelType.getList()" :key="item.value" :label="item.name" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item
label="数据集名称或id"
prop="formFilter.dataName"
label-width="120px"
>
<el-input
class="filter-item"
v-model="myDataSetPage.formFilter.dataName"
:clearable="true"
placeholder="数据集名称或id"
/>
<el-form-item label="数据集名称或id" prop="formFilter.searchString" label-width="120px">
<el-input class="filter-item" v-model="myDataSetPage.formFilter.searchString" :clearable="true" placeholder="数据集名称或id" />
</el-form-item>
</filter-box>
</el-form>
<div class="tableBox" :style="{ height: tableHeight }">
<el-button
class="add"
type="primary"
icon="el-icon-plus"
:size="defaultFormItemSize"
>创建数据集</el-button
>
<div class="tableItem">
<div class="operation">
<div>
<span>数据集名称:{{ 111111111111 }}</span>
<span style="margin-left: 20px">数据集ID:{{ 2222222222 }}</span>
</div>
<div>
<el-button type="text" icon="el-icon-plus">新增版本</el-button>
<el-button type="text" icon="el-icon-menu">全部版本</el-button>
<el-button type="text" icon="el-icon-delete">删除</el-button>
</div>
<el-button class="add" type="primary" icon="el-icon-plus" :size="defaultFormItemSize" @click="add()">创建数据集</el-button>
<div v-for="(item,index) in myDataSetPage.tableData.impl.dataList" :key="item.datasetId">
<tableItem v-model="myDataSetPage.tableData.impl.dataList[index]" @refresh="refresh" />
</div>
<vxe-table
border
show-header-overflow
show-overflow
:row-config="{ isHover: true }"
:data="tableData"
min-height="96"
>
<vxe-column field="versions" title="版本"></vxe-column>
<vxe-column field="versionsId" title="版本ID"></vxe-column>
<vxe-column field="importState" title="导入状态"></vxe-column>
<vxe-column field="derivedState" title="导出状态"></vxe-column>
<vxe-column field="cleanCondition" title="清洗状态"></vxe-column>
<vxe-column field="enhancedState" title="增强状态"></vxe-column>
<vxe-column field="publishStatus" title="发布状态"></vxe-column>
<vxe-column field="AnnotationType" title="标注类型>模板"></vxe-column>
<vxe-column field="operation" title="操作">
<template slot-scope="scope">
<el-button
type="text"
:size="defaultFormItemSize"
@click="dataImport(scope.row)"
>导入</el-button
>
<el-button
type="text"
:size="defaultFormItemSize"
@click="del(scope.row)"
>删除</el-button
>
</template>
</vxe-column>
</vxe-table>
</div>
<template v-if="this.myDataSetPage.tableData.impl.dataList.length<1" >
<div class="table-empty unified-font">
<img src="@/assets/img/empty.png">
<span>暂无数据</span>
</div>
</template>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js';
import { MyDataSet } from '@/api/gptController.js';
import editOrAdd from './dialog/editOrAdd';
import tableItem from './tableItem';
export default {
data () {
return {
myDataSetPage: {
formFilter: {
annotationType: undefined,
dataName: undefined
'searchString': '',
'dimensionType': undefined
},
options: [
{
value: 'shejiyuanze',
label: '设计原则'
},
{
value: 'daohang',
label: '导航',
children: [
{
value: 'cexiangdaohang',
label: '侧向导航'
},
{
value: 'dingbudaohang',
label: '顶部导航'
}
]
}
],
isInit: false
},
filterBoxheight: 0,
tableData: [
]
tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, 'datasetId', false)
}
}
};
},
components: {},
provide () {
return {
refresh: this.refresh
}
},
components: { tableItem },
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - this.filterBoxheight - 32 + 'px';
return this.getMainContextHeight - 118 + 'px';
}
},
mounted () {
this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight;
window.addEventListener('resize', () => {
this.filterBoxheight = this.$refs.myDataSetPage?.$el.clientHeight;
});
},
methods: {
onReset () {},
search () {},
handleChange () {},
dataImport () {
getwidgetData (params) {
if (params == null) params = {};
params = {
...params,
// orderParam: [
// {
// asc: true,
// dateAggregateBy: '',
// fieldName: ''
// }
// ],
// pageParam: {
// pageNum: 0,
// pageSize: 0
// },
datasetManageDtoFilter: { ...this.myDataSetPage.formFilter }
}
return new Promise((resolve, reject) => {
MyDataSet.list(this, params).then(res => {
resolve({
dataList: res.data.dataList.map((item) => {
return {...item, isEdit: false }
}),
totalCount: res.data.totalCount
});
}).catch(e => {
reject(e);
});
});
},
del () {
add () {
this.$dialog.show('创建模版', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: false }).then(res => {
this.refresh();
}).catch(e => { });
},
edit (item) {
this.$dialog.show('修改模版', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { });
},
del (item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { batchTaskId: item.batchTaskId }
MyDataSet.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
},
refresh (reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1);
} else {
this.myDataSetPage.tableData.impl.refreshTable();
}
},
onReset () {
this.$refs.myDataSetPage.resetFields();
this.refresh(true);
},
formInit () {
this.refresh();
}
},
mounted () {
this.formInit()
}
};
}
</script>
<style scoped>
.tableBox {
background-color: white;
width: 100%;
padding: 20px;
overflow: auto;
}
.add {
margin: 0 0 20px 0;
}
.operation {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f8f8f9;
border-bottom: 1px solid #eee;
height: 50px;
}
.operation > div {
margin: 0 20px 0 20px;
}
</style>
<!-- -->
<template>
<el-form label-position="left" ref="form" label-width="80px" :model="form" :size="defaultFormItemSize">
<el-form-item label="数据集版本:">
V {{ form.datasetVersion }}
</el-form-item>
<el-form-item label="备注信息:">
<el-input v-model="form.remark" style="width:70%" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
placeholder="请备注本次版本主要做的修改,如添加数据、更换标注方式等,限制50字符内" maxlength="50">
</el-input>
</el-form-item>
<el-form-item label="继承历史版本:">
<el-switch v-model="form.isInherit" active-color="#13ce66" inactive-color="#ff4949" :active-value="1"
:inactive-value="0">
</el-switch>
</el-form-item>
<el-form-item label="历史版本:" v-if="form.isInherit == 1">
<el-select v-model="form.hisVersion" placeholder="请选择">
<el-option v-for="item in tableData.datasetVersionList" :key="item.datasetVersion"
:label="'V' + item.datasetVersion" :value="item.datasetVersion">
</el-option>
</el-select>
</el-form-item>
<template v-else>
<el-form-item label="标注类型:">
<el-radio v-for="item in LabelType.getList()" :key="item.id" v-model="form.dimensionType"
:label="item.id">{{ item.name }}</el-radio>
</el-form-item>
<el-form-item label="标注模版:" v-if="form.dimensionType === 0">
<el-radio v-for="item in MarkTemplate.getList()" :key="item.id" v-model="form.template"
:label="item.id">{{ item.name }}</el-radio>
</el-form-item>
</template>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button>
</el-row>
</el-form>
</template>
<script>
import { DatasetVersion } from '@/api/gptController.js';
export default {
data () {
return {
form: {
'cleanStatus': 0,
'dataVolume': 0,
'datasetId': 0,
'datasetVersion': this.tableData.datasetVersionList.slice(-1)[0].datasetVersion + 1,
'enhanceStatus': 0,
'inputStatus': 0,
'markProgress': 0,
'outputStatus': 0,
'releaseStatus': 0
}
};
},
props: ['isEdit', 'tableData'],
components: {},
computed: {
},
mounted () {
this.intFrom()
},
methods: {
intFrom () {
this.form = { ...this.form, datasetId: this.tableData.datasetId }
},
onCancel (isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
}
},
onSubmit () {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {};
params.datasetVersionDto = { ...this.form };
if (this.isEdit) {
DatasetVersion.update(this, params).then(res => {
resolve(res);
this.$message.success('编辑成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
} else {
DatasetVersion.add(this, params).then(res => {
resolve(res);
this.$message.success('添加成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
}
} else {
reject();
}
});
});
}
}
};
</script>
<style scoped>
.inputWidth {
width: 600px;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
.introduce {
font-size: 12px;
color: #909399;
}</style>
<!--导入 -->
<template>
<el-form label-position="left" ref="form" label-width="120px" :model="form" :size="defaultFormItemSize">
<!-- <el-form-item label="数据标注状态:">
<el-radio v-for="item in DataAnnotationState.getList()" :key="item.id" v-model="form.dimensionType"
:label="item.id">{{ item.name }}</el-radio>
</el-form-item>
<el-form-item label="导入格式:">
<el-radio v-for="item in ImportFormat.getList()" :key="item.id" v-model="form.dimensionType"
:label="item.id">{{ item.name }}</el-radio>
</el-form-item> -->
<el-form-item label="上传jsonl文件:">
<input type="file" accept="application/json" @change="fileinfo($event.target.files)">
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button>
</el-row>
</el-form>
</template>
<script>
// import { DatasetVersion } from '@/api/gptController.js';
export default {
data () {
return {
form: {
importFile: ''
}
};
},
props: ['isEdit', 'row'],
components: {},
computed: {
},
mounted () {
this.intFrom()
},
methods: {
fileinfo (files) {
this.form.importFile = files[0]
console.log(this.form.importFile);
},
intFrom () {
this.form = { ...this.form, datasetId: this.row.datasetId, versionId: this.row.versionId }
},
onCancel (isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
}
},
onSubmit () {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {};
params = { ...this.form };
console.log(this.fetchUpload);
this.upload('/admin/app/datasetVersion/import', params).then(res => {
resolve(res);
this.$message.success('上传成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
// if (this.isEdit) {
// DatasetVersion.importFile(this, params).then(res => {
// resolve(res);
// this.$message.success('编辑成功');
// this.onCancel(true);
// }).catch(e => {
// reject(e);
// });
// } else {
// DatasetVersion.importFile(this, params).then(res => {
// resolve(res);
// this.$message.success('添加成功');
// this.onCancel(true);
// }).catch(e => {
// reject(e);
// });
// }
} else {
reject();
}
});
});
}
}
};
</script>
<style scoped>
.inputWidth {
width: 600px;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
.introduce {
font-size: 12px;
color: #909399;
}
</style>
<!--导出 -->
<template>
<el-form label-position="left" ref="form" label-width="100px" :model="form" :size="defaultFormItemSize">
<el-form-item label="导出文件格式:">
<el-select v-model="form.format" placeholder="请选择">
<el-option
v-for="item in ImportFormat.getList()"
:key="item.id"
:label="item.name"
:value="item.symbol">
</el-option>
</el-select>
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="downloadFile">开始导出</el-button>
</el-row>
</el-form>
</template>
<script>
// import { DatasetVersion } from '@/api/gptController.js';
export default {
data () {
return {
form: {
format: 'jsonl'
}
};
},
props: ['isEdit', 'row'],
components: {},
computed: {
},
mounted () {
},
methods: {
onCancel (isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
}
},
downloadFile () {
let params = {
versionId: this.row.versionId
}
this.download('/admin/app/datasetVersion/export', params, '下载文件.' + this.form.format, 'get').then(res => {
// resolve(res);
console.log(res);
this.$message.success('下载成功');
this.onCancel(true);
}).catch(e => {
// reject(e);
});
}
}
};
</script>
<style scoped>
.inputWidth {
width: 600px;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
.introduce {
font-size: 12px;
color: #909399;
}
</style>
<!--详情 -->
<template>
<div class="tableBox" >
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true }" :data="myDataSetPage.tableData.impl.dataList" min-height="96">
<!-- <vxe-column field="index" title="序号"></vxe-column> -->
<vxe-column field="content" title="文本内容摘要"></vxe-column>
<vxe-column field="operation" title="操作" width="100px">
<template slot-scope="scope">
<el-button type="text" :size="defaultFormItemSize" @click="check(scope.row)">查看</el-button>
</template>
</vxe-column>
</vxe-table>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;">
<el-pagination :total="myDataSetPage.tableData.impl.totalCount" :current-page="myDataSetPage.tableData.impl.currentPage" :page-size="myDataSetPage.tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="myDataSetPage.tableData.impl.onCurrentPageChange" @size-change="myDataSetPage.tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js';
import { DatasetVersion } from '@/api/gptController.js';
export default {
data () {
return {
myDataSetPage: {
tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false)
}
}
};
},
components: {},
props: ['row'],
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight + 'px';
}
},
methods: {
getwidgetData (params) {
if (params == null) params = {};
params = {
...params,
// orderParam: [
// {
// asc: true,
// dateAggregateBy: '',
// fieldName: ''
// }
// ],
// pageParam: {
// pageNum: 0,
// pageSize: 0
// },
versionId: this.row.versionId
}
return new Promise((resolve, reject) => {
DatasetVersion.detail(this, params).then(res => {
resolve({
dataList: res.data.dataList.map((item) => { return {content: item} }),
totalCount: res.data.totalCount
});
}).catch(e => {
reject(e);
});
});
},
check (row) {
this.$alert(row.content, '详情', {
confirmButtonText: '确定',
callback: action => {
}
});
},
// del (item) {
// this.$confirm('是否确认删除', '提示', {
// confirmButtonText: '确定',
// cancelButtonText: '取消',
// type: 'warning'
// }).then(() => {
// let params = { batchTaskId: item.batchTaskId }
// DatasetVersion.delete(this, params).then(res => {
// this.$message.success('删除成功');
// this.refresh()
// }).catch(e => {
// console.log(e);
// });
// }
// );
// },
refresh (reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1);
} else {
this.myDataSetPage.tableData.impl.refreshTable();
}
},
onReset () {
this.$refs.myDataSetPage.resetFields();
this.refresh(true);
},
formInit () {
this.refresh();
}
},
mounted () {
this.formInit()
}
};
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
.topBox {
background-color: white;
width: 100%;
height: 95px;
margin-bottom: 16px;
.title {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
padding: 20px 20px 10px 20px;
}
}
.instructions {
padding: 0px 20px 20px 20px;
.describe {
color: $--color-text-secondary;
margin-bottom: 16px;
}
.itemTitle {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
}
.head-index {
font-size: 24px;
color: #e8e9eb;
line-height: 32px;
}
.itemDescribe {
width: 170px;
color: $--color-text-secondary;
}
.img {
height: 72px;
width: 140px;
}
}
.tableBox {
position: relative;
background-color: white;
width: 100%;
padding: 20px;
height: 100%;
overflow: auto;
.add {
margin-bottom: 20px;
}
}
</style>
<!-- -->
<template>
<div class="tableItem">
<div class="operation">
<div>
<span @dblclick="value.isEdit=true">
数据集名称:
<span v-if="!value.isEdit">{{ value.datasetName }}</span>
<el-input v-else v-model="value.datasetName" placeholder="请输入内容" :size="defaultFormItemSize" style="width:200px" @change="editName()" ></el-input>
</span>
<span style="margin-left: 20px">数据集ID:{{ value.datasetId }}</span>
</div>
<div>
<el-button type="text" icon="el-icon-plus" @click="addVersions">新增版本</el-button>
<el-button type="text" icon="el-icon-menu" @click="all">全部版本</el-button>
<el-button type="text" icon="el-icon-delete" @click="delDataset(value)">删除</el-button>
</div>
</div>
<tableBox :tableData="value" :refresh="refresh" />
</div>
</template>
<script>
import { MyDataSet } from '@/api/gptController.js';
import addVersions from './dialog/add.vue'
import tableBox from './tableBox/index.vue'
export default {
data () {
return {
dialogVisible: false,
dialogTitle: ''
};
},
inject: ['refresh'],
props: {
value: {
type: Object,
default: () => { }
}
},
components: { tableBox },
computed: {},
mounted () {
},
methods: {
addVersions () {
this.$dialog.show('新增数据集版本', addVersions, {
area: ['600px', 'auto']
}, { isEdit: false, tableData: this.value }).then(res => {
this.refresh()
}).catch(e => { });
},
delDataset (item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { datasetId: item.datasetId }
MyDataSet.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
},
all () {
// this.dialogTitle = this.value.datasetName
// this.dialogVisible = true
this.$dialog.show(this.value.datasetName, tableBox, {
area: ['100%', '100%']
}, { tableData: this.value, refresh: this.refresh }).then(res => {
this.refresh()
}).catch(e => { });
},
editName () {
this.value.isEdit = false
let params = {
datasetManageDto: {
datasetName: this.value.datasetName,
datasetId: this.value.datasetId
}
}
MyDataSet.update(this, params).then(res => {
this.$message.success('修改成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
}
}
</script>
<style scoped>
.operation {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #f8f8f9;
border-bottom: 1px solid #eee;
height: 50px;
}
.operation > div {
margin: 0 20px 0 20px;
}
.tableItem {
margin-bottom: 10px;
}
</style>
<!-- -->
<template>
<div>
<vxe-table border show-header-overflow show-overflow :row-config="{ isHover: true }"
:data="tableData.datasetVersionList" min-height="96">
<vxe-column field="datasetVersion" title="版本">
<template slot-scope="scope">
V{{ scope.row.datasetVersion }}
</template>
</vxe-column>
<vxe-column field="versionId" title="版本ID"></vxe-column>
<vxe-column field="inputStatus" title="导入状态">
<template slot-scope="scope">{{ InputStatus.getValue(scope.row.inputStatus) }}</template>
</vxe-column>
<vxe-column field="derivedState" title="导出状态">
<template slot-scope="scope">{{ OutputStatus.getValue(scope.row.outputStatus) }}</template>
</vxe-column>
<vxe-column field="cleanStatus" title="清洗状态">
<template slot-scope="scope">{{ CleanStatus.getValue(scope.row.cleanStatus) }}</template>
</vxe-column>
<vxe-column field="enhanceStatus" title="增强状态">
<template slot-scope="scope">{{ EnhanceStatus.getValue(scope.row.enhanceStatus) }}</template>
</vxe-column>
<vxe-column field="releaseStatus" title="发布状态">
<template slot-scope="scope">{{ ReleaseStatus.getValue(scope.row.releaseStatus) }}</template>
</vxe-column>
<vxe-column field="dimensionType" title="标注类型>模板">
<template slot-scope="scope">{{ LabelType.getValue(scope.row.dimensionType ) }} <span v-if="scope.row.template!==undefined">--</span> {{ MarkTemplate.getValue(scope.row.template ) }}</template>
</vxe-column>
<vxe-column field="dataVolume" title="数据量"></vxe-column>
<vxe-column field="markProgress" title="标注进度"></vxe-column>
<vxe-column field="updateTime" title="最后更新时间"></vxe-column>
<vxe-column field="operation" title="操作" width="230">
<template slot-scope="scope">
<el-button type="text" :size="defaultFormItemSize" @click="dataImport(scope.row)">导入</el-button>
<el-button type="text" :size="defaultFormItemSize" @click="del(scope.row)">删除</el-button>
<template v-if="scope.row.inputStatus !== 0">
<el-button type="text" :size="defaultFormItemSize" @click="particulars(scope.row)">详情</el-button>
<el-button type="text" :size="defaultFormItemSize" @click="label(scope.row)">标注</el-button>
<el-dropdown style="margin-left:15px;font-size: 12px;color: #0092FF;" :size="defaultFormItemSize">
<span class="el-dropdown-link">
更多<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="derived(scope.row)">导出</el-dropdown-item>
<el-dropdown-item @click.native="analyse(scope.row)">分析</el-dropdown-item>
<el-dropdown-item @click.native="enhance(scope.row)">增强</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</template>
</vxe-column>
</vxe-table>
</div>
</template>
<script>
import derived from '../dialog/derived.vue'
import dataImport from '../dialog/dataImport.vue'
import particulars from '../dialog/particulars.vue'
import { DatasetVersion } from '@/api/gptController.js';
export default {
data () {
return {
};
},
props: ['tableData', 'refresh'],
components: {},
computed: {},
mounted () { },
methods: {
dataImport (data) {
this.$dialog.show('导入', dataImport, {
area: ['600px', 'auto']
}, { row: data }).then(res => {
this.refresh()
}).catch(e => { });
},
del (data) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { versionId: data.versionId }
DatasetVersion.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
},
particulars (data) { // 详情
this.$dialog.show('详情', particulars, {
area: ['100%', '100%']
}, { row: data }).then(res => {
this.refresh()
}).catch(e => { });
},
label (data) { // 标注
},
derived (data) { // 导出
this.$dialog.show('导出', derived, {
area: ['600px', 'auto']
}, { row: data }).then(res => {
this.refresh()
}).catch(e => { });
},
analyse (data) { // 分析
},
enhance (data) { // 增强
}
}
}
</script>
<style scoped></style>
<!-- 创建Prompt模板 -->
<template>
<el-form label-position="left" ref="form" label-width="80px" :model="form" :size="defaultFormItemSize">
<el-row class="title">基本信息</el-row>
<el-form-item label="任务名称:">
<el-input v-model="form.taskName" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-form-item label="任务描述:">
<el-input v-model="form.taskDescribe" type="textarea" :rows="4" class="inputWidth" :size="defaultFormItemSize"></el-input>
</el-form-item>
<el-row class="title">压缩配置</el-row>
<el-form-item label="选择源模型:">
<el-select v-model="value" placeholder="请选择">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-row> <span class="introduce">启用此功能可能会为您提供更好质量的提示词,但也会花费更长的时间进行优化</span></el-row>
</el-form-item>
<el-form-item label="模型创建⽅式:">
<el-radio v-model="radio" label="0">创建为已有模型新版本</el-radio>
<el-radio v-model="radio" label="1">创建为新模型</el-radio>
</el-form-item>
<el-form-item label="选择已有模型:">
<el-select v-model="value" placeholder="请选择">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="压缩策略:">
<el-select v-model="value" placeholder="请选择">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-row class="title">资源配置</el-row>
<el-form-item label="压缩任务运⾏环境:">
<el-radio v-model="radio" label="0">GPU A800 -------- TeslaGPU_A800_80G显存单卡_16核_128G内存</el-radio>
</el-form-item>
<el-form-item label="选择计算节点数:">
<el-input-number v-model="form.epoch" :min="1" label="迭代轮次" :size="defaultFormItemSize"></el-input-number>
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button>
</el-row>
</el-form>
</template>
<script>
import { BatchOptimizationController } from '@/api/gptController.js';
export default {
data () {
return {
form: {
'chain': 0,
'destDatasetId': 0,
'destDatasetName': '',
'destDatasetVersion': 0,
'epoch': 0,
'failCount': 0,
'finishTime': '',
'qualityQptimality': 0,
'shortenPrompt': 0,
'sourceDatasetId': 0,
'sourceDatasetName': '',
'sourceDatasetVersion': 0,
'successCount': 0,
'taskDescribe': '',
'taskName': '',
'taskStatus': 0
}
};
},
props: ['isEdit', 'item'],
components: {},
computed: {
},
mounted () {
this.intFrom()
},
methods: {
intFrom () {
this.form = { ...this.form, ...this.item }
try {
this.form.templateLabel = JSON.parse(this.item.templateLabel)
} catch (error) {
// console.log(error);
}
},
onCancel (isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
}
},
onSubmit () {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {};
params.promptOptimizeBatchDto = { ...this.form };
if (this.isEdit) {
BatchOptimizationController.update(this, params).then(res => {
resolve(res);
this.$message.success('编辑成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
} else {
BatchOptimizationController.add(this, params).then(res => {
resolve(res);
this.$message.success('添加成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
}
} else {
reject();
}
});
});
}
}
};
</script>
<style scoped>
.inputWidth {
width: 600px;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
.introduce{
font-size: 12px;
color: #909399;
}
</style>
<!-- -->
<template>
<div class="cardBox">
<el-card class="box-card" v-for="item in dataList" :key="item.knowledgeId">
<div class="titleBox">
<div class="title omit">{{item.knowledgeName}}</div>
<!-- <div>
<el-button size="mini" v-if="isPreset">复制</el-button>
<el-dropdown v-else @command="handleCommand($event,item)">
<span class="el-dropdown-link">
<i class="el-icon-more el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown" >
<el-dropdown-item command="particulars">详情</el-dropdown-item>
<el-dropdown-item command="edit">编辑</el-dropdown-item>
<el-dropdown-item command="del">命中测试</el-dropdown-item>
<el-dropdown-item command="del">删除</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div> -->
</div>
<div class="tagBox">
<el-tag class="tag" type="info" size="mini" v-for="item2 in getTemplateLabel(item)" :key="item2">{{ item2 }}</el-tag>
</div>
<div class="content omit_2">{{ item.knowledgeDescribe }}</div>
<el-divider style="margin: 14px 0"></el-divider>
<div class="buttonBox">
<!-- <div>
<el-tooltip :content="'收藏量'+item.viewCount" placement="top">
<el-button type="text" :icon="item.isCollect==0?'el-icon-star-off':'el-icon-star-on'" @click="collect(item)" :style="{color:item.isCollect==0?'#333':'#ff9326'}">{{ item.isCollect==0?'收藏':'已收藏' }}</el-button>
</el-tooltip>
<el-tooltip :content="'浏览量'+item.viewCount" placement="top">
<el-button type="text" style="color: #333" icon="el-icon-view">{{ item.viewCount}}</el-button>
</el-tooltip>
</div> -->
<div style="margin-bottom:10px">
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('edit',item)" >编辑</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="handleCommand('del',item)">删除</el-button>
</div>
</div>
</el-card>
<div class="box-card-2" v-for="item in 3" :key="item"></div>
</div>
</template>
<script>
import { KnowledgeManage } from '@/api/gptController.js';
import editOrAdd from '../dialog/editOrAdd';
export default {
data () {
return {
};
},
props: ['dataList', 'isPreset', 'refresh'],
components: {},
computed: {
getTemplateLabel () {
return (item) => {
if (item.templateLabel) {
return JSON.parse(item.templateLabel)
} else {
return []
}
}
}
},
mounted () { },
methods: {
collect (item) {
let params = {templateId: item.templateId }
if (item.isCollect) {
KnowledgeManage.deleteCollect(this, params).then(res => {
this.$message.success('取消收藏');
this.refresh()
}).catch(e => {
console.log(e);
});
} else {
KnowledgeManage.addCollect(this, params).then(res => {
this.$message.success('收藏成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
},
edit (item) {
this.$dialog.show('修改模版', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { });
},
del (item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { knowledgeId: item.knowledgeId}
KnowledgeManage.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
},
copy (item) {
this.$copyText(item.templateContent + '\n' + item.negativeTemplateContent).then(() => {
this.$message.success('复制成功!')
})
},
handleCommand (command, item) {
if (command === 'edit') {
this.edit(item)
} else if (command === 'del') {
this.del(item)
} else if (command === 'copy') {
this.copy(item)
}
}
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
.box-card {
width: calc(100% / 4 - 20px);
height: 180px;
flex-shrink: 0;
margin-bottom: 20px;
min-width: 300px;
background: linear-gradient(to bottom, #e7efff 10%, #fff 50%);
}
.box-card-2 {
width: calc(100% / 4 - 20px);
min-width: 300px;
flex-shrink: 0;
height: 0;
}
div /deep/.el-divider--horizontal {
margin: 14px 0 0 0;
}
.title {
font-size: 16px;
color: $--color-text-primary;
}
.content {
margin-bottom: 10px;
color: $--color-text-secondary;
}
/deep/ .el-card__body {
height: 100%;
width: 100%;
position: relative;
}
.buttonBox {
display: flex;
justify-content: space-between;
position: absolute;
bottom: 0;
right: 20px;
}
.tag:not(:last-child) {
margin-right: 10px;
}
.titleBox {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 16px;
}
.cardBox {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
align-content: flex-start;
justify-content: space-between;
}
.tagBox {
margin-bottom: 10px;
}
/deep/ .el-icon-star-on {
font-size: 14px !important;
overflow: hidden;
position: relative;
top: 4px;
left: 3px;
}
/deep/ .el-icon-star-on:before{
zoom: 1.3;
}
/deep/ .el-icon-star-off{
font-size: 14px !important;
}
</style>
<!-- 创建知识库 -->
<template>
<div>
<el-steps :active="active">
<el-step title="基本信息"></el-step>
<el-step title="导入配置"></el-step>
<!-- <el-step title="索引配置"></el-step> -->
</el-steps>
<essentialInformation v-if="active==1" :item="item" :isEdit="isEdit" />
<importConfiguration v-if="active==2" :item="item" :knowledgeName="knowledgeName" />
</div>
</template>
<script>
// import indexConfiguration from './indexConfiguration/index';
import importConfiguration from './importConfiguration/index';
import essentialInformation from './essentialInformation/index';
export default {
data () {
return {
active: 1,
knowledgeName: ''
};
},
props: ['isEdit', 'item'],
components: { importConfiguration, essentialInformation},
computed: {
},
mounted () {
},
methods: {
onCancel (isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
}
}
}
};
</script>
<style scoped>
.inputWidth {
width: 600px;
}
form /deep/ .dialog-btn-layer {
position: absolute;
bottom: 20px;
right: 20px;
background: #fff;
}</style>
<!-- 基本信息 -->
<template>
<el-form label-position="left" ref="form" label-width="80px" :model="form" :size="defaultFormItemSize" :rules="rules">
<el-row class="title">基本信息</el-row>
<el-form-item label="知识库名称:" prop="knowledgeName">
<el-input :disabled="this.isEdit" v-model="form.knowledgeName" class="inputWidth" :size="defaultFormItemSize" ></el-input>
</el-form-item>
<el-form-item label="知识库描述:" prop="knowledgeDescribe">
<el-input v-model="form.knowledgeDescribe" type="textarea" :rows="4" class="inputWidth" :size="defaultFormItemSize" placeholder="描述这个知识库的内容,详细的描述可以让AI及时访问知识库的内容。如果为空,将影响该知识库在知识问答中被检索到的概率,因此建议尽可能对知识库详细地总结描述。"></el-input>
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<template>
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel()" >取消</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="onSubmit()">下一步</el-button>
</template>
</el-row>
</el-form >
</template>
<script>
import { KnowledgeManage } from '@/api/gptController.js';
export default {
data () {
return {
form: {
'knowledgeDescribe': undefined,
'knowledgeName': undefined,
knowledgeId: undefined
},
rules: {
// taskName: [
// { required: true, message: '请填写知识库名称', trigger: 'blur' }
// ]
}
};
},
props: ['isEdit', 'item'],
components: {},
computed: {},
mounted () {
this.init()
},
methods: {
init () {
if (this.isEdit) {
this.form.knowledgeDescribe = this.item.knowledgeDescribe
this.form.knowledgeName = this.item.knowledgeName
this.form.knowledgeId = this.item?.knowledgeId
}
},
onSubmit () {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {};
params.knowledgeManageDto = { ...this.form };
if (this.isEdit) {
KnowledgeManage.update(this, params).then(res => {
resolve(res);
this.$message.success('编辑成功');
this.next()
}).catch(e => {
reject(e);
});
} else {
KnowledgeManage.add(this, params).then(res => {
resolve(res);
this.$message.success('添加成功');
this.next()
}).catch(e => {
reject(e);
});
}
} else {
this.$message.error('请完善必填信息');
reject();
}
});
});
},
onCancel () {
this.$parent.onCancel(false)
},
next () {
this.$parent.knowledgeName = this.form.knowledgeName
this.$parent.active++
}
}
}
</script>
<style scoped>
.introduce{
font-size: 12px;
color: #909399;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
</style>
<!--导入配置 -->
<template>
<el-form label-position="left" ref="form" label-width="120px" :model="form" :size="defaultFormItemSize" :rules="rules">
{{ form.knowledge_base_name }}
<el-form-item label="上传知识库文件:" prop="filesArr">
<el-button @click="clickUp" :size="defaultFormItemSize" type="primary">上传</el-button>
<input style="display:none" ref="upFile" type="file" @change="fileinfo($event.target.files)">
<div v-for="item in files" :key="item.name">{{ item.name }}</div>
</el-form-item>
<el-form-item label="单段文本最大长度:">
<el-slider :min="0" :max="1000" v-model="form.chunk_size" show-input>
</el-slider>
</el-form-item>
<el-form-item label="相邻文本重合长度:">
<el-slider :min="0" :max="12" v-model="form.chunk_overlap" show-input>
</el-slider>
</el-form-item>
<el-form-item label="开启中文标题加强:">
<el-checkbox v-model="form.zh_title_enhance"></el-checkbox>
</el-form-item>
<el-form-item label="已有文件:">
<el-table
:data="listFiles"
style="width: 100%">
<el-table-column
type="index"
width="50">
</el-table-column>
<el-table-column
prop="name"
label="名称"
>
</el-table-column>
<el-table-column label="操作" width="90px" >
<template slot-scope="scope">
<el-button type="text" @click="delFile(scope.row)" :size="defaultFormItemSize" >删除</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<template>
<el-button :size="defaultFormItemSize" :plain="true" @click="back" >上一步</el-button>
<el-button :size="defaultFormItemSize" :plain="true" @click="onSubmit">确认上传</el-button>
</template>
</el-row>
</el-form>
<!-- </template> -->
</template>
<script>
import { KnowledgeManage } from '@/api/gptController.js';
export default {
data () {
return {
form: {
filesArr: undefined,
knowledge_base_name: '',
override: false,
to_vector_store: true,
chunk_size: 250,
chunk_overlap: 0,
zh_title_enhance: true,
not_refresh_vs_cache: false
},
files: [],
listFiles: [],
rules: {
filesArr: [
{ required: true, message: '请选择文件', trigger: 'blur' }
]
}
};
},
props: ['item'],
components: {},
computed: {},
mounted () {
this.getFiles()
},
watch: {
},
methods: {
fileinfo (files) {
if (this.files.map((item) => item.name).indexOf(files[0].name) === -1) {
this.files.push(files[0])
} else {
console.log('重复上传');
}
this.form.filesArr = this.files
},
clickUp () {
this.$refs.upFile.click()
},
onSubmit () {
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
this.form.knowledge_base_name = this.$parent.knowledgeName
let params = {};
params = { ...this.form };
this.upload('/2api/knowledge_base/upload_docs', params, false).then(res => {
resolve(res);
this.$message.success('上传成功');
this.$parent.onCancel(false)
}).catch(e => {
reject(e);
});
}
});
});
},
getFiles () {
let params = {knowledgeName: this.$parent.knowledgeName};
KnowledgeManage.listFiles(this, params).then(res => {
this.listFiles = res.data.map((item) => {
return {
name: item
}
})
}).catch(e => {
console.log(e);
});
},
delFile (row) {
let params = {
'knowledge_base_name': this.$parent.knowledgeName,
'file_names': [
row.name
],
'delete_content': false,
'not_refresh_vs_cache': false
};
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
KnowledgeManage.deleteDocs(this, params).then(res => {
if (res.success) {
this.getFiles()
}
}).catch(e => {
console.log(e);
});
})
},
back () {
this.$parent.active--
}
}
}
</script>
<style scoped>
.introduce{
font-size: 12px;
color: #909399;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
</style>
<!--知识库-->
<template>
<div>知识库</div>
<div style="position: relative">
<div class="topBox">
<div class="title">知识库</div>
<div class="instructions">面向客户构建私域文档或知识管理的能力,实现本地或BOS等多种数据源文档的上传、分段和清洗并储存至向量数据库中。</div>
</div>
<div class="tableBox" :style="{ height: tableHeight }">
<el-form ref="myDataSetPage" :model="myDataSetPage" label-width="75px" :size="defaultFormItemSize" label-position="right" @submit.native.prevent>
<filter-box :item-width="350" @search="refresh()" @reset="onReset">
<el-form-item label-width="0px">
<el-button class="add" type="primary" icon="el-icon-plus" :size="defaultFormItemSize" @click="add()">创建知识库</el-button>
</el-form-item>
<el-form-item label="知识库名称" prop="formFilter.searchString" label-width="120px">
<el-input class="filter-item" v-model="myDataSetPage.formFilter.searchString" :clearable="true" placeholder="知识库名称" />
</el-form-item>
</filter-box>
</el-form>
<card :dataList='myDataSetPage.tableData.impl.dataList' :refresh="refresh"></card>
<el-row slot="pagination" type="flex" justify="end" style="margin-top: 16px;">
<el-pagination :total="myDataSetPage.tableData.impl.totalCount" :current-page="myDataSetPage.tableData.impl.currentPage" :page-size="myDataSetPage.tableData.impl.pageSize" :page-sizes="[10, 20, 50, 100]" layout="total, prev, pager, next, sizes" @current-change="myDataSetPage.tableData.impl.onCurrentPageChange" @size-change="myDataSetPage.tableData.impl.onPageSizeChange">
</el-pagination>
</el-row>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
/* eslint-disable-next-line */
import { DropdownWidget, TableWidget, UploadWidget, ChartWidget } from '@/utils/widget.js';
import { KnowledgeManage } from '@/api/gptController.js';
import editOrAdd from './dialog/editOrAdd';
import card from './card/index';
export default {
data () {
return {
myDataSetPage: {
formFilter: {
'searchString': ''
},
tableData: {
impl: new TableWidget(this.getwidgetData, true, true, false, undefined, false)
}
}
};
},
components: {},
components: {card},
computed: {},
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - 145 + 'px';
}
mounted () {},
},
methods: {}
}
methods: {
getwidgetData (params) {
if (params == null) params = {};
params = {
...params,
knowledgeManageDtoFilter: { ...this.myDataSetPage.formFilter }
}
return new Promise((resolve, reject) => {
KnowledgeManage.list(this, params).then(res => {
resolve({
dataList: res.data.dataList,
totalCount: res.data.totalCount
});
}).catch(e => {
reject(e);
});
});
},
add () {
this.$dialog.show('创建知识库', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: false }).then(res => {
this.refresh();
}).catch(e => { });
},
edit (item) {
this.$dialog.show('修改知识库', editOrAdd, {
area: ['100%', '100%']
}, { isEdit: true, item: item }).then(res => {
this.refresh();
}).catch(e => { });
},
del (item) {
this.$confirm('是否确认删除', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let params = { knowledgeId: item.knowledgeId }
KnowledgeManage.delete(this, params).then(res => {
this.$message.success('删除成功');
this.refresh()
}).catch(e => {
console.log(e);
});
}
);
},
refresh (reloadData = false) {
if (reloadData) {
this.myDataSetPage.tableData.impl.refreshTable(true, 1);
} else {
this.myDataSetPage.tableData.impl.refreshTable();
}
},
onReset () {
this.$refs.myDataSetPage.resetFields();
this.refresh(true);
},
formInit () {
this.refresh();
}
},
mounted () {
this.formInit()
}
};
</script>
<style scoped>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
.topBox {
background-color: white;
width: 100%;
height: 95px;
margin-bottom: 16px;
.title {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
padding: 20px 20px 10px 20px;
}
}
.instructions {
padding: 0px 20px 20px 20px;
.describe {
color: $--color-text-secondary;
margin-bottom: 16px;
}
.itemTitle {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
}
.head-index {
font-size: 24px;
color: #e8e9eb;
line-height: 32px;
}
.itemDescribe {
width: 170px;
color: $--color-text-secondary;
}
.img {
height: 72px;
width: 140px;
}
}
.tableBox {
background-color: white;
width: 100%;
padding: 20px;
overflow: auto;
.add {
margin-bottom: 20px;
}
}
</style>
<!-- 创建sft模板 -->
<template>
<el-form label-position="left" ref="form" label-width="100px" :model="form" :size="defaultFormItemSize">
<el-row class="title">基本信息</el-row>
<el-form-item label="任务名称:">
<el-input v-model="form.tuningTaskDto.taskName" :readonly="isEdit||existingTask" class="inputWidth" :size="defaultFormItemSize" v-if="!(isEdit||existingTask)" ></el-input>
<span v-else>{{ form.tuningTaskDto.taskName }}</span>
</el-form-item>
<!-- <el-form-item label="任务类型:">
<el-select v-model="form.tuningTaskDto.taskType" placeholder="请选择">
<el-option v-for="item in ModelType.getList()" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item> -->
<el-form-item label="任务描述:">
<el-input v-model="form.tuningTaskDto.taskDescribe" :readonly="isEdit||existingTask" type="textarea" :rows="4" class="inputWidth" :size="defaultFormItemSize" v-if="!(isEdit||existingTask)"></el-input>
<span v-else>{{ form.tuningTaskDto.taskDescribe }}</span>
</el-form-item>
<el-row class="title">训练配置</el-row>
<el-row> <span class="introduce">训练任务的算法选择、参数及相关配置,训练配置参数影响训练速度及模型效果。</span></el-row>
<el-form-item label="选择基础模型版本:">
<el-cascader v-model="form.tuningRunDto.modelVersionId" :options="modelList"
:props='{ label: "name", value: "id", emitPath: false }'></el-cascader>
</el-form-item>
<el-form-item label="训练方法:">
<el-radio v-for="item in TrainingMethod.getList()" :key="item.id" v-model="form.tuningRunDto.trainMethod" :label="item.name">{{ item.name}}</el-radio>
</el-form-item>
<el-form-item label="参数配置:">
<parameterConfiguration v-model="form.tuningRunDto.configuration" :existingTask="existingTask"/>
</el-form-item>
<el-row class="title">数据配置</el-row>
<el-row> <span class="introduce"> 训练任务的选择数据及相关配置,支持选择该模型可使用的数据。</span></el-row>
<el-form-item label="选择数据集版本">
<el-cascader v-model="form.tuningRunDto.datasetVersionId" :options="dataList"
:props='{ label: "name", value: "id", emitPath: false }'></el-cascader>
</el-form-item>
<el-form-item label="数据拆分比例:">
<el-input-number v-model="form.tuningRunDto.splitRatio" class="inputWidth" :size="defaultFormItemSize" :min="0" :max="100"></el-input-number>
</el-form-item>
<el-row type="flex" justify="end" class="dialog-btn-layer mt20">
<el-button :size="defaultFormItemSize" :plain="true" @click="onCancel(false)">取消</el-button>
<el-button type="primary" :size="defaultFormItemSize" @click="onSubmit">确定</el-button>
</el-row>
</el-form>
</template>
<script>
import { TuningTask, TuningRun, MyModel, MyDataSet } from '@/api/gptController.js';
import parameterConfiguration from './parameterConfiguration/index.vue';
export default {
data () {
return {
modelList: [],
dataList: [],
form: {
'tuningRunDto': {
'configuration': undefined,
'modelId': undefined,
'publishStatus': 0,
'runName': '',
'runStatus': 0,
'runTime': 0,
'runVersion': 0,
'splitRatio': 0,
'taskId': undefined,
'trainMethod': 'full',
'trainMode': ''
},
'tuningTaskDto': {
'taskDescribe': '',
'taskName': '',
'taskType': 0
}
}
};
},
props: ['isEdit', 'item', 'existingTask'],
components: {parameterConfiguration},
computed: {
},
mounted () {
this.getModelList()
this.getDataList()
this.intFrom()
},
methods: {
intFrom () {
if (this.item) {
this.form.tuningTaskDto = this.item.tuningTaskDto
if (this.isEdit) {
this.form.tuningRunDto = {...this.form.tuningRunDto, ...this.item.tuningRunDto}
}
if (this.existingTask) {
this.form.tuningRunDto.taskId = this.item.tuningTaskDto.taskId
}
}
},
onCancel (isSuccess) {
if (this.observer != null) {
this.observer.cancel(isSuccess);
}
},
onSubmit () {
let apiFunction = this.existingTask || this.isEdit ? TuningRun : TuningTask
return new Promise((resolve, reject) => {
this.$refs['form'].validate((valid) => {
if (valid) {
let params = {};
params = this.existingTask ? {tuningRunDto: this.form.tuningRunDto} : { ...this.form };
console.log(params);
if (this.isEdit) {
apiFunction.update(this, params).then(res => {
resolve(res);
this.$message.success('编辑成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
} else {
apiFunction.add(this, params).then(res => {
resolve(res);
this.$message.success('添加成功');
this.onCancel(true);
}).catch(e => {
reject(e);
});
}
} else {
reject();
}
});
});
},
getModelList () {
MyModel.listForTree(this, {}).then(res => {
this.modelList = res.data.filter((item) => item.isBaseModel === 1).map((item) => {
return { id: item.modelId, name: item.modelName, children: item.modelVersionList === [] ? [] : item.modelVersionList.map((item2) => { return { id: item2.versionId, name: 'V' + item2.modelVersion } }) }
})
}).catch(e => {
console.log(e);
});
},
getDataList () {
MyDataSet.listForTree(this, {}).then(res => {
this.dataList = res.data.map((item) => {
return { id: item.datasetId, name: item.datasetName, children: item.datasetVersionList === [] ? [] : item.datasetVersionList.map((item2) => { return { id: item2.versionId, name: 'V' + item2.datasetVersion } }) }
})
}).catch(e => {
console.log(e);
});
}
}
};
</script>
<style scoped>
.inputWidth {
width: 600px;
}
.title {
font-size: 20px;
margin-bottom: 16px;
}
.introduce {
font-size: 12px;
color: #909399;
margin-bottom: 10px;
display: block;
}
.isReadonly input{
border: none;
}
</style>
This diff is collapsed.
<!-- 详情 -->
<template>
<div style="position: relative">
<div class="topBox">
<el-descriptions title="基本信息" style="width: 100%;line-height: 30px;">
<el-descriptions-item label="任务名称:">{{tableItem.taskName}}</el-descriptions-item>
<el-descriptions-item label="任务ID:">{{tableItem.taskId}}</el-descriptions-item>
<el-descriptions-item label="创建人:">{{tableItem.updateUserId}}</el-descriptions-item>
<el-descriptions-item label="创建时间:">{{tableItem.createTime}}</el-descriptions-item>
<el-descriptions-item label="任务描述:">{{tableItem.taskDescribe}}</el-descriptions-item>
<el-descriptions-item label="任务类型:">{{ModelType.getValue(tableItem.taskType) }}</el-descriptions-item>
</el-descriptions>
</div>
<div class="tableBox" :style="{ height: tableHeight }">
<taskList ref="taskList" :tableItem="tableItem" />
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex';
import taskList from './taskList/index';
export default {
data () {
return {
};
},
components: { taskList},
props: ['tableItem'],
computed: {
...mapGetters(['getMainContextHeight']),
tableHeight () {
return this.getMainContextHeight - 95 + 'px';
}
},
methods: {
},
mounted () {
}
};
</script>
<style lang="scss" scoped>
@import "@/assets/style/element-variables.scss";
.topBox {
background-color: white;
width: 100%;
height: 95px;
margin-bottom: 16px;
.title {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
padding: 20px 20px 10px 20px;
}
}
.instructions {
padding: 0px 20px 20px 20px;
.describe {
color: $--color-text-secondary;
margin-bottom: 16px;
}
.itemTitle {
color: $--color-text-primary;
font-size: 16px;
font-weight: 500;
margin-bottom: 8px;
}
.head-index {
font-size: 24px;
color: #e8e9eb;
line-height: 32px;
}
.itemDescribe {
width: 170px;
color: $--color-text-secondary;
}
.img {
height: 72px;
width: 140px;
}
}
.tableBox {
background-color: white;
width: 100%;
padding: 20px;
overflow: auto;
.add {
margin-bottom: 20px;
}
}
/deep/ .el-descriptions__table{
width: 100%;
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment