Repair multimodal vision parsing and rerun fallback history
这个提交包含在:
@@ -100,6 +100,22 @@ export default function VisionLab() {
|
||||
onError: (error) => toast.error(`批量视觉测试提交失败: ${error.message}`),
|
||||
});
|
||||
|
||||
const retryRunMutation = trpc.vision.retryRun.useMutation({
|
||||
onSuccess: () => {
|
||||
toast.success("视觉记录已重新加入队列");
|
||||
utils.vision.runs.invalidate();
|
||||
},
|
||||
onError: (error) => toast.error(`重新执行失败: ${error.message}`),
|
||||
});
|
||||
|
||||
const retryFallbacksMutation = trpc.vision.retryFallbacks.useMutation({
|
||||
onSuccess: (data) => {
|
||||
toast.success(`已重新排队 ${data.count} 条历史视觉记录`);
|
||||
utils.vision.runs.invalidate();
|
||||
},
|
||||
onError: (error) => toast.error(`批量修复失败: ${error.message}`),
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
if (activeTask.data?.status === "succeeded" || activeTask.data?.status === "failed") {
|
||||
utils.vision.runs.invalidate();
|
||||
@@ -131,15 +147,26 @@ export default function VisionLab() {
|
||||
</div>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{user?.role === "admin" ? (
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={() => seedMutation.mutate()}
|
||||
disabled={seedMutation.isPending}
|
||||
className="gap-2"
|
||||
>
|
||||
{seedMutation.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <Database className="h-4 w-4" />}
|
||||
初始化标准库
|
||||
</Button>
|
||||
<>
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={() => seedMutation.mutate()}
|
||||
disabled={seedMutation.isPending}
|
||||
className="gap-2"
|
||||
>
|
||||
{seedMutation.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <Database className="h-4 w-4" />}
|
||||
初始化标准库
|
||||
</Button>
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={() => retryFallbacksMutation.mutate({ limit: 20 })}
|
||||
disabled={retryFallbacksMutation.isPending}
|
||||
className="gap-2"
|
||||
>
|
||||
{retryFallbacksMutation.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <Sparkles className="h-4 w-4" />}
|
||||
修复历史降级
|
||||
</Button>
|
||||
</>
|
||||
) : null}
|
||||
<Button
|
||||
onClick={() => runAllMutation.mutate()}
|
||||
@@ -270,6 +297,21 @@ export default function VisionLab() {
|
||||
<p className="text-sm text-destructive">错误:{run.error}</p>
|
||||
) : null}
|
||||
|
||||
{(run.visionStatus === "fallback" || run.status === "failed") ? (
|
||||
<div className="flex justify-end">
|
||||
<Button
|
||||
size="sm"
|
||||
variant="outline"
|
||||
className="gap-2"
|
||||
onClick={() => retryRunMutation.mutate({ runId: run.id })}
|
||||
disabled={retryRunMutation.isPending}
|
||||
>
|
||||
{retryRunMutation.isPending ? <Loader2 className="h-4 w-4 animate-spin" /> : <Microscope className="h-4 w-4" />}
|
||||
重新视觉识别
|
||||
</Button>
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{run.expectedFocus?.length ? (
|
||||
<div className="flex flex-wrap gap-2">
|
||||
{run.expectedFocus.map((item) => (
|
||||
|
||||
在新工单中引用
屏蔽一个用户