feat: auto LLM feedback runner + problem link + 5xx retry

- Add SubmissionFeedbackRunner: async background queue for auto LLM feedback
- Enqueue feedback generation after each submission in submitProblem()
- Register runner in main.cc with CSP_FEEDBACK_AUTO_RUN env var
- Add problem_title to GET /api/v1/submissions/{id} response
- Frontend: clickable problem link on submission detail page
- Enhance LLM prompt with richer analysis dimensions
- Add 5xx/connection error retry (max 5 attempts) in Python LLM script

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
这个提交包含在:
cryptocommuniums-afk
2026-02-16 15:13:35 +08:00
父节点 bc2e085c70
当前提交 7860414ae5
修改 37 个文件,包含 312 行新增5343 行删除

查看文件

@@ -1,5 +1,6 @@
"use client";
import Link from "next/link";
import { useParams } from "next/navigation";
import { useEffect, useMemo, useState } from "react";
@@ -21,6 +22,7 @@ type Submission = {
id: number;
user_id: number;
problem_id: number;
problem_title?: string;
contest_id: number | null;
language: string;
code: string;
@@ -117,7 +119,17 @@ export default function SubmissionDetailPage() {
<section className="rounded-xl border bg-white p-4 text-sm">
<div className="grid gap-1 sm:grid-cols-2">
<p>{tx("用户", "User")}: {data.user_id}</p>
<p>{tx("题目", "Problem")}: {data.problem_id}</p>
<p>
{tx("题目", "Problem")}:{" "}
<Link
href={`/problems/${data.problem_id}`}
className="text-blue-400 hover:text-blue-300 underline"
>
{data.problem_title
? `P${data.problem_id} - ${data.problem_title}`
: `P${data.problem_id}`}
</Link>
</p>
<p>{tx("比赛", "Contest")}: {data.contest_id ?? "-"}</p>
<p>{tx("语言", "Language")}: {data.language}</p>
<p>{tx("状态", "Status")}: {data.status}</p>