Merge branch 'worktree-agent-a1c799645a0ade657' into wartung/restarbeiten
This commit is contained in:
@@ -250,10 +250,11 @@ export const useRadarAktion = () =>
|
||||
},
|
||||
)
|
||||
|
||||
/** „Jetzt suchen“: Die Box startet die Suche als Auftrag (Gruppe „radar“) und antwortet sofort. */
|
||||
export const useRadarSuche = () =>
|
||||
useAktion(() => post<AktionsErgebnis>("/api/radar/suche"), {
|
||||
erfolg: () => "Radar sucht nach neuen Modellen.",
|
||||
neuLaden: ["radar"],
|
||||
erfolg: (_, e) => (e as AktionsErgebnis).text ?? "Das Radar sucht jetzt nach neuen Modellen.",
|
||||
neuLaden: ["jobs"],
|
||||
})
|
||||
|
||||
/** Wer liefert die Seite aus, und gibt es die zweite Instanz? (ändert sich nur mit einem Deploy) */
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { useEffect, useState } from "react"
|
||||
import { useEffect, useRef, useState } from "react"
|
||||
import { useQueryClient } from "@tanstack/react-query"
|
||||
import { useLocation } from "@tanstack/react-router"
|
||||
import { Search } from "lucide-react"
|
||||
import { Auftraege } from "@/components/cockpit/Auftraege"
|
||||
@@ -10,10 +11,11 @@ import {
|
||||
useAufraeumen, useAufraeumenLoeschen, useJobs, useModellLaden, useModelle, useNutzung, useRadar, useRadarAktion,
|
||||
useRadarSuche, useStart,
|
||||
} from "@/lib/abfragen"
|
||||
import { messwert, RADAR_STATUS_TEXT, rolleVon } from "@/lib/anzeige"
|
||||
import { laeuftNoch, messwert, RADAR_STATUS_TEXT, rolleVon } from "@/lib/anzeige"
|
||||
import { ApiFehler } from "@/lib/api"
|
||||
import { useLetzteMetrik } from "@/lib/strom"
|
||||
import type { AufraeumKandidat, Modell, Nutzung, RadarKandidat, RadarTest } from "@/lib/typen"
|
||||
import { letzteMeldung } from "@/lib/wartung"
|
||||
import { flugplanZeit, gb, gbText, zahl } from "@/lib/zeit"
|
||||
import { ModellSuche } from "./ModellSuche"
|
||||
|
||||
@@ -243,6 +245,21 @@ function Kandidat({ k, test, heute }: { k: RadarKandidat; test: RadarTest | unde
|
||||
function RadarPanel({ hirn, coder }: { hirn: string | undefined; coder: string | undefined }) {
|
||||
const radar = useRadar()
|
||||
const suche = useRadarSuche()
|
||||
const jobs = useJobs()
|
||||
const qc = useQueryClient()
|
||||
// „Jetzt suchen“ läuft als Auftrag (Gruppe „radar“); der jüngste sagt, ob gerade gesucht wird. Bis die Liste
|
||||
// der Aufträge den eben gestarteten kennt, gilt er als laufend (sonst sprang der Knopf kurz zurück).
|
||||
const liste = jobs.data?.jobs
|
||||
const auftrag = (liste ?? []).filter((j) => j.group === "radar").at(-1)
|
||||
const gestartet = suche.data?.job_id
|
||||
const nochNichtGelistet = !!gestartet && !!liste && !liste.some((j) => j.id === gestartet)
|
||||
const sucht = suche.isPending || nochNichtGelistet || (auftrag !== undefined && laeuftNoch(auftrag))
|
||||
// Ist die Suche eben fertig geworden, das Radar gleich neu lesen (sonst erst nach fünf Minuten).
|
||||
const suchteEben = useRef(sucht)
|
||||
useEffect(() => {
|
||||
if (suchteEben.current && !sucht) qc.invalidateQueries({ queryKey: ["radar"] })
|
||||
suchteEben.current = sucht
|
||||
}, [sucht, qc])
|
||||
if (radar.isError && !radar.data) {
|
||||
// 404 heißt: Diese Box hat kein Radar. Alles andere ist ein Fehler, kein fehlendes Radar.
|
||||
const fehlt = radar.error instanceof ApiFehler && radar.error.status === 404
|
||||
@@ -263,15 +280,21 @@ function RadarPanel({ hirn, coder }: { hirn: string | undefined; coder: string |
|
||||
id="radar"
|
||||
className="scroll-mt-4"
|
||||
rechts={
|
||||
<Button variant="info" size="sm" onClick={() => suche.mutate(undefined)} disabled={suche.isPending}>
|
||||
{suche.isPending ? "Sucht …" : "Jetzt suchen"}
|
||||
<Button variant="info" size="sm" onClick={() => suche.mutate(undefined)} disabled={sucht}>
|
||||
{sucht ? "Sucht …" : "Jetzt suchen"}
|
||||
</Button>
|
||||
}
|
||||
>
|
||||
<p className="-mt-2 text-sm text-text-2">
|
||||
Testet nachts zwischen 00:30 und 02:30 selbst, höchstens einen Kandidaten pro Woche.
|
||||
{d?.naechster_test ? ` Nächster Test: ${flugplanZeit(d.naechster_test)}.` : ""}
|
||||
{sucht ? " Sucht gerade bei Hugging Face. Das dauert ein paar Minuten; den Stand zeigt der Auftrag oben unter „Aufträge“." : ""}
|
||||
</p>
|
||||
{!sucht && auftrag?.state === "failed" && (
|
||||
<p role="alert" className="text-sm text-rot-text">
|
||||
Die letzte Suche ist gescheitert: {letzteMeldung(auftrag) ?? "ohne Meldung"}
|
||||
</p>
|
||||
)}
|
||||
{!d ? (
|
||||
<p className="text-[15px] text-text-2">Wird gelesen …</p>
|
||||
) : d.kandidaten.length === 0 ? (
|
||||
|
||||
Reference in New Issue
Block a user