Repair multimodal vision parsing and rerun fallback history

这个提交包含在:
cryptocommuniums-afk
2026-03-15 02:31:44 +08:00
父节点 f4f425de42
当前提交 ae93269c62
修改 10 个文件,包含 417 行新增21 行删除

查看文件

@@ -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) => (