{
prsetList.length ? prsetList.map((data, i) =>
-
+
handleChangePrsetList(data.id, 'checked', val)} />
{data.name}
+ className="rounded-full h-6 px-4 ml-auto">
+ {downloadMap[data.id] &&
}
+ {t('finetune.download')}
{isCustom ?
{
const HeadButtonView = ({ name, status, online, onPublish, onUnPublish, onDelete, onStop }) => {
const { t } = useTranslation()
+ const [loading, setLoading] = useState(false)
- const cancelPublish = () => {
- online ? bsconfirm({
- desc: t('finetune.confirmCancelPublish'),
- onOk(next) {
- onUnPublish()
- next()
- }
- }) : onUnPublish()
+ const cancelPublish = async () => {
+ if (online) {
+ bsconfirm({
+ desc: t('finetune.confirmCancelPublish'),
+ async onOk(next) {
+ next()
+ setLoading(true)
+ await onUnPublish()
+ setLoading(false)
+ }
+ })
+ } else {
+ setLoading(true)
+ await onUnPublish()
+ setLoading(false)
+ }
+ }
+
+ const handlePublish = async () => {
+ setLoading(true)
+ await onPublish()
+ setLoading(false)
}
const deleteClick = () => {
@@ -69,9 +90,15 @@ const HeadButtonView = ({ name, status, online, onPublish, onUnPublish, onDelete
return
{status === TaskStatus.PUBLISH_SUCCESS ?
- :
+ :
status === TaskStatus.TRAIN_SUCCESS ?
- : null
+ : null
}
{status === TaskStatus.TRAINING_IN_PROGRESS ?
:
@@ -92,8 +119,10 @@ export default function FinetuneDetail({ id, onDelete, onStatusChange }) {
useEffect(() => {
- getTaskInfoApi(id).then((data) => {
+ captureAndAlertRequestErrorHoc(getTaskInfoApi(id).then((data) => {
setBaseInfo(data.finetune)
+ }), (err) => {
+ setBaseInfo(null)
})
}, [id])
@@ -147,7 +176,7 @@ export default function FinetuneDetail({ id, onDelete, onStatusChange }) {
-
+ {
+ setBaseInfo({ ...baseInfo, status });
+ onStatusChange(status)
+ }}
+ >
};
diff --git a/src/frontend/src/pages/ModelPage/components/FinetuneHead.tsx b/src/frontend/src/pages/ModelPage/components/FinetuneHead.tsx
index ea17099b..65fa3c6e 100644
--- a/src/frontend/src/pages/ModelPage/components/FinetuneHead.tsx
+++ b/src/frontend/src/pages/ModelPage/components/FinetuneHead.tsx
@@ -1,7 +1,8 @@
-import { useEffect, useState } from "react";
+import { useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { Button } from "../../../components/ui/button";
+import { Input } from "../../../components/ui/input";
import {
Select,
SelectContent,
@@ -12,26 +13,29 @@ import {
} from "../../../components/ui/select1";
import { ToggleGroup, ToggleGroupItem } from "../../../components/ui/toggle-group";
import { getServicesApi } from "../../../controllers/API";
+import { useDebounce } from "../../../util/hook";
interface IProps {
- onChange: (type, rt) => void,
+ onSearch: (searchkey) => void,
+ onFilter: ({ type, rt }) => void,
rtClick: () => void,
onCreate: () => void,
}
-export default function FinetuneHead({ onChange, rtClick, onCreate }: IProps) {
+export default function FinetuneHead({ onSearch, onFilter, rtClick, onCreate }: IProps) {
const { t } = useTranslation()
const [type, setType] = useState('all')
const [rt, setRt] = useState('all')
+ const inputRef = useRef(null)
const handleTypeChange = (val) => {
setType(val)
- onChange(val, rt)
+ onFilter({ type: val, rt })
}
const handleRtChange = (val) => {
setRt(val)
- onChange(type, val)
+ onFilter({ type, rt: val })
}
// rts
@@ -45,9 +49,13 @@ export default function FinetuneHead({ onChange, rtClick, onCreate }: IProps) {
})))
})
- onChange(type, rt)
+ onFilter({ type, rt })
}, [])
+ const handleSearch = () => {
+ onSearch(inputRef.current.value)
+ }
+
return
};
diff --git a/src/frontend/src/pages/ModelPage/components/FinetuneResult.tsx b/src/frontend/src/pages/ModelPage/components/FinetuneResult.tsx
index fefb96e9..1731e717 100644
--- a/src/frontend/src/pages/ModelPage/components/FinetuneResult.tsx
+++ b/src/frontend/src/pages/ModelPage/components/FinetuneResult.tsx
@@ -3,8 +3,9 @@ import { useTranslation } from "react-i18next";
import { Area, AreaChart, CartesianGrid, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../../../components/ui/card";
import { getTaskInfoApi } from "../../../controllers/API/finetune";
+import { TaskStatus } from "./FinetuneDetail";
-export default function FinetuneResult({ id, training, failed }) {
+export default function FinetuneResult({ id, training, isStop, failed, onChange }) {
const { t } = useTranslation()
const timerRef = useRef(null)
@@ -19,7 +20,7 @@ export default function FinetuneResult({ id, training, failed }) {
clearTimeout(timerRef.current)
timerRef.current = setTimeout(() => {
console.log('2s');
- loadData()
+ loadData(true)
setCount(count + 1)
}, 2000)
@@ -27,12 +28,14 @@ export default function FinetuneResult({ id, training, failed }) {
return () => clearTimeout(timerRef.current)
}, [id, training, count])
- const loadData = () => {
+ const loadData = (loop?) => {
getTaskInfoApi(id).then((data) => {
- const { log, report, loss_data } = data
+ const { log, report, loss_data, finetune } = data
setLogs(log)
setReport(report)
setLoss(loss_data)
+ // 状态变更停止轮训
+ loop && finetune.status !== TaskStatus.TRAINING_IN_PROGRESS && onChange(finetune.status)
})
}
@@ -42,12 +45,13 @@ export default function FinetuneResult({ id, training, failed }) {
{t('finetune.evaluationReport')}
- {failed && --}
+ {(failed || isStop) && --}
{/* cards */}
{
- !failed && report &&
+ // 失败 中止不展示 cards
+ !failed && !isStop && report &&
{
processKeys.map(key =>
@@ -55,7 +59,7 @@ export default function FinetuneResult({ id, training, failed }) {
{training ? '--' : report[`predict_${key}`].toFixed(2)}%
-
+
)
}
@@ -63,7 +67,7 @@ export default function FinetuneResult({ id, training, failed }) {
}
{/* chart */}
{
- !failed && report &&
+ !failed && !isStop && report &&
@@ -88,8 +92,8 @@ export default function FinetuneResult({ id, training, failed }) {
{t('finetune.trainingLogs')}
-
diff --git a/src/frontend/src/pages/ModelPage/components/RTConfig.tsx b/src/frontend/src/pages/ModelPage/components/RTConfig.tsx
index e78c60fd..5cfb9d11 100644
--- a/src/frontend/src/pages/ModelPage/components/RTConfig.tsx
+++ b/src/frontend/src/pages/ModelPage/components/RTConfig.tsx
@@ -19,30 +19,33 @@ export default function RTConfig({ open, onChange }) {
const nameRef = useRef(null)
const urlRef = useRef(null)
+ const ftUrlRef = useRef(null)
const { services, showAdd, addItem, handleDel, create, setShowAdd } = useRTService(onChange)
const handleAdd = () => {
- const [name, url] = [nameRef.current.value, urlRef.current.value]
+ const [name, url, ftUrl] = [nameRef.current.value, urlRef.current.value, ftUrlRef.current.value]
if (!name || !url) return
- addItem(name, url)
+ addItem(name, url, ftUrl)
nameRef.current.value = ''
urlRef.current.value = ''
+ ftUrlRef.current.value = ''
}
const { t } = useTranslation()
const copyText = useCopyText()
return