fix: improve cross-device evidence, request diagnostics and prompt efficiency
This commit is contained in:
1 parent
621f30e437
commit
a66803651a
60 files changed
+3097
-160
No files matched your search
+81
@@ -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();
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user