fix: give final acceptance a shared retry budget and diagnostics
This commit is contained in:
1 parent
50638d4130
commit
32441e79c4
18 files changed
+779
-40
No files matched your search
+32
-2
@@ -14,6 +14,23 @@ export interface ModelRequest {
|
||||
tools?: { name: string | null; argument_chars: number }[];
|
||||
usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number } | null;
|
||||
images: { width: number | null; height: number | null }[];
|
||||
final_review?: FinalReview;
|
||||
category?: string;
|
||||
}
|
||||
|
||||
export interface FinalReview {
|
||||
review_id: string; attempt_id: string; status: string; stage: string; active: boolean;
|
||||
started_at: number; deadline_at: number; ended_at?: number;
|
||||
total_seconds: number; elapsed_seconds: number; remaining_seconds: number;
|
||||
request_count: number; retry_count: number; request_attempt?: number; max_retries: number;
|
||||
request_phase?: string; last_failure_category?: string;
|
||||
}
|
||||
|
||||
export function reviewStage(review: FinalReview): string {
|
||||
if (review.status !== 'running') {
|
||||
return ({ completed: '验收完成', budget_exhausted: '验收总预算已用尽', request_retries_exhausted: '验收请求重试已用尽', cancelled: '验收已中断', failed: '验收未完成' } as Record<string, string>)[review.status] || '验收状态待核实';
|
||||
}
|
||||
return ({ preparing_evidence: '正在准备验收证据', reviewing_evidence: '正在核对证据与结论', reading_evidence: '正在读取验收证据', structuring_verdict: '正在整理验收结论', validating_verdict: '正在校验完整结论' } as Record<string, string>)[review.stage] || '正在进行最终验收';
|
||||
}
|
||||
|
||||
export function requestPhase(request: ModelRequest | string): string {
|
||||
@@ -46,20 +63,24 @@ export class LlmRequestStatusComponent {
|
||||
running = input(false);
|
||||
activeChange = output<boolean>();
|
||||
requests = signal<ModelRequest[]>([]);
|
||||
reviews = signal<FinalReview[]>([]);
|
||||
now = signal(Date.now() / 1000);
|
||||
unavailable = signal(false);
|
||||
loading = signal(false);
|
||||
active = computed(() => this.running() ? this.requests().filter(r => r.active) : []);
|
||||
activeReviews = computed(() => this.running() ? this.reviews().filter(r => r.active) : []);
|
||||
downloadUrl = computed(() => `/api/sessions/${encodeURIComponent(this.sessionId() || '')}/request-diagnostics?download=true`);
|
||||
phase = requestPhase;
|
||||
hint = requestHint;
|
||||
reviewStage = reviewStage;
|
||||
|
||||
constructor() {
|
||||
effect(() => this.activeChange.emit(this.active().length > 0));
|
||||
effect(() => this.activeChange.emit(this.active().length > 0 || this.activeReviews().length > 0));
|
||||
effect(onCleanup => {
|
||||
const id = this.sessionId();
|
||||
const running = this.running();
|
||||
this.requests.set([]);
|
||||
this.reviews.set([]);
|
||||
this.unavailable.set(false);
|
||||
this.loading.set(!!id);
|
||||
if (!id) return;
|
||||
@@ -68,9 +89,10 @@ export class LlmRequestStatusComponent {
|
||||
let subscription: Subscription | undefined;
|
||||
const schedule = () => { if (running && !stopped) timer = setTimeout(load, 3000); };
|
||||
const load = () => {
|
||||
subscription = this.http.get<{ requests: ModelRequest[] }>(`/api/sessions/${encodeURIComponent(id)}/request-diagnostics`).subscribe({
|
||||
subscription = this.http.get<{ requests: ModelRequest[]; final_reviews?: FinalReview[] }>(`/api/sessions/${encodeURIComponent(id)}/request-diagnostics`).subscribe({
|
||||
next: data => {
|
||||
this.requests.set(data.requests || []);
|
||||
this.reviews.set(data.final_reviews || []);
|
||||
this.unavailable.set(false);
|
||||
this.loading.set(false);
|
||||
schedule();
|
||||
@@ -88,6 +110,14 @@ export class LlmRequestStatusComponent {
|
||||
return Math.max(0, Math.floor(request.ended_at ? request.elapsed_seconds : this.now() - request.started_at));
|
||||
}
|
||||
|
||||
reviewElapsed(review: FinalReview): number {
|
||||
return Math.max(0, Math.floor(review.ended_at ? review.elapsed_seconds : this.now() - review.started_at));
|
||||
}
|
||||
|
||||
reviewRemaining(review: FinalReview): number {
|
||||
return Math.max(0, Math.ceil(review.deadline_at - this.now()));
|
||||
}
|
||||
|
||||
role(request: ModelRequest): string {
|
||||
return ({ FlashRunner: '任务执行', operator: '任务执行', planner: '规划', checker: '结果检查', outputter: '报告整理', step_summarizer: '步骤整理' } as Record<string, string>)[request.role] || request.role;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user