fix: improve cross-device evidence, request diagnostics and prompt efficiency

This commit is contained in:
chenmingxuan committed 2026-10-17 14:55:45 +08:00
1 parent 621f30e437
commit a66803651a
60 files changed
+3097 -160

No files matched your search

@@ -0,0 +1,81 @@
import { fakeAsync, TestBed, tick } from '@angular/core/testing';
import { provideHttpClient } from '@angular/common/http';
import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing';
import { LlmRequestStatusComponent, ModelRequest, requestHint } from './llm-request-status.component';
const waiting: ModelRequest = {
request_id: 'call-1', attempt_id: 'attempt-1', model: 'gpt-6-luna', role: 'FlashRunner',
is_fallback: false, phase: 'waiting_output', active: true, attempt: 1, max_retries: 5,
timeout_seconds: 300, elapsed_seconds: 42, started_at: Date.now() / 1000 - 42,
http_status: 200, usage: null, images: []
};
describe('模型请求诊断', () => {
beforeEach(() => TestBed.configureTestingModule({ providers: [provideHttpClient(), provideHttpClientTesting()] }));
afterEach(() => TestBed.inject(HttpTestingController).verify());
it('收到200仍显示等待,未知用量不当作0;完成后取消轮询', fakeAsync(() => {
const fixture = TestBed.createComponent(LlmRequestStatusComponent);
fixture.componentRef.setInput('sessionId', 'task-one');
fixture.componentRef.setInput('running', true);
fixture.detectChanges();
const http = TestBed.inject(HttpTestingController);
http.expectOne('/api/sessions/task-one/request-diagnostics').flush({ requests: [waiting] });
fixture.detectChanges();
expect(fixture.nativeElement.querySelector('.request-live').textContent).toContain('等待模型输出');
expect(fixture.nativeElement.textContent).toContain('未知(服务未报告)');
expect(fixture.nativeElement.querySelector('details').open).toBeFalse();
tick(3000);
http.expectOne('/api/sessions/task-one/request-diagnostics').flush({ requests: [{ ...waiting, active: false, phase: 'completed', ended_at: Date.now() / 1000 }] });
fixture.detectChanges();
expect(fixture.nativeElement.querySelector('.request-live')).toBeNull();
fixture.destroy(); tick(5000);
http.expectNone('/api/sessions/task-one/request-diagnostics');
}));
it('切换会话取消旧请求,历史失败不会显示正在重试', () => {
const fixture = TestBed.createComponent(LlmRequestStatusComponent);
const http = TestBed.inject(HttpTestingController);
fixture.componentRef.setInput('sessionId', 'old'); fixture.detectChanges();
const old = http.expectOne('/api/sessions/old/request-diagnostics');
fixture.componentRef.setInput('sessionId', 'new'); fixture.detectChanges();
expect(old.cancelled).toBeTrue();
http.expectOne('/api/sessions/new/request-diagnostics').flush({ requests: [{ ...waiting, phase: 'retry_wait' }] });
fixture.detectChanges();
expect(fixture.nativeElement.querySelector('.request-live')).toBeNull();
expect(fixture.nativeElement.querySelector('a').href).toContain('/new/request-diagnostics?download=true');
fixture.destroy();
});
it('诊断接口失败时明确提示状态未知', () => {
const fixture = TestBed.createComponent(LlmRequestStatusComponent);
fixture.componentRef.setInput('sessionId', 'task'); fixture.detectChanges();
TestBed.inject(HttpTestingController).expectOne('/api/sessions/task/request-diagnostics').flush({}, { status: 503, statusText: 'Unavailable' });
fixture.detectChanges();
expect(fixture.nativeElement.textContent).toContain('不能据此判断任务是否卡住');
fixture.destroy();
});
it('重试倒计时到0后不谎称已发送请求', () => {
expect(requestHint({ ...waiting, phase: 'retry_wait', retry_at: 110 }, 105)).toContain('5 秒后进行第 1/5 次重试');
expect(requestHint({ ...waiting, phase: 'retry_wait', retry_at: 110 }, 111)).toContain('等待下一次请求状态');
});
it('持续生成工具参数时展示工具名和字符数,不误报工具已执行', () => {
const fixture = TestBed.createComponent(LlmRequestStatusComponent);
fixture.componentRef.setInput('sessionId', 'tool-task');
fixture.componentRef.setInput('running', true);
fixture.detectChanges();
TestBed.inject(HttpTestingController).expectOne('/api/sessions/tool-task/request-diagnostics').flush({ requests: [{
...waiting, phase: 'generating_tool_arguments', tool_argument_chars: 15000,
tools: [{ name: 'click', argument_chars: 15000 }], output_chunks: 200
}] });
fixture.detectChanges();
const text = fixture.nativeElement.querySelector('.request-live').textContent;
expect(text).toContain('正在生成工具参数');
expect(text).toContain('click');
expect(text).toContain((15000).toLocaleString());
expect(text).toContain('本次工具尚未执行');
fixture.destroy();
});
});