assessmentService.ts 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { apiClient } from './apiClient';
  2. export interface AssessmentSession {
  3. id: string;
  4. userId: string;
  5. knowledgeBaseId: string;
  6. threadId: string;
  7. status: 'IN_PROGRESS' | 'COMPLETED';
  8. finalScore?: number;
  9. finalReport?: string;
  10. createdAt: string;
  11. updatedAt: string;
  12. knowledgeBase?: { id: string; name: string };
  13. knowledgeGroup?: { id: string; name: string };
  14. }
  15. export interface AssessmentState {
  16. messages: any[];
  17. assessmentSessionId: string;
  18. knowledgeBaseId: string;
  19. questions: any[];
  20. currentQuestionIndex: number;
  21. shouldFollowUp: boolean;
  22. scores: Record<string, number>;
  23. feedbackHistory?: any[];
  24. status?: 'IN_PROGRESS' | 'COMPLETED';
  25. report?: string;
  26. finalScore?: number;
  27. }
  28. export class AssessmentService {
  29. async startSession(knowledgeBaseId: string, language: string = 'zh', templateId?: string): Promise<AssessmentSession> {
  30. const { data } = await apiClient.post<AssessmentSession>('/assessment/start', { knowledgeBaseId, language, templateId });
  31. return data;
  32. }
  33. async submitAnswer(sessionId: string, answer: string, language: string = 'zh'): Promise<AssessmentState> {
  34. const { data } = await apiClient.post<AssessmentState>(`/assessment/${sessionId}/answer`, { answer, language });
  35. return data;
  36. }
  37. async getSessionState(sessionId: string): Promise<AssessmentState> {
  38. const { data } = await apiClient.get<AssessmentState>(`/assessment/${sessionId}/state`);
  39. return data;
  40. }
  41. async getHistory(): Promise<AssessmentSession[]> {
  42. const { data } = await apiClient.get<AssessmentSession[]>('/assessment');
  43. return data;
  44. }
  45. async *startSessionStream(sessionId: string, templateId?: string): AsyncIterableIterator<any> {
  46. const query = templateId ? `?templateId=${templateId}` : '';
  47. const response = await apiClient.request(`/assessment/${sessionId}/start-stream${query}`, {
  48. method: 'GET',
  49. });
  50. yield* this.parseStream(response);
  51. }
  52. async *submitAnswerStream(sessionId: string, answer: string, language: string = 'zh', templateId?: string): AsyncIterableIterator<any> {
  53. const query = new URLSearchParams({ answer, language, ...(templateId && { templateId }) }).toString();
  54. const response = await apiClient.request(`/assessment/${sessionId}/answer-stream?${query}`, {
  55. method: 'GET',
  56. });
  57. yield* this.parseStream(response);
  58. }
  59. private async *parseStream(response: Response): AsyncIterableIterator<any> {
  60. const reader = response.body?.getReader();
  61. if (!reader) return;
  62. const decoder = new TextDecoder();
  63. let buffer = '';
  64. while (true) {
  65. const { done, value } = await reader.read();
  66. if (done) break;
  67. buffer += decoder.decode(value, { stream: true });
  68. const lines = buffer.split('\n');
  69. buffer = lines.pop() || '';
  70. for (const line of lines) {
  71. if (line.startsWith('data: ')) {
  72. try {
  73. const data = JSON.parse(line.substring(6));
  74. yield data;
  75. } catch (e) {
  76. console.error('Failed to parse SSE data:', line);
  77. }
  78. }
  79. }
  80. }
  81. }
  82. }
  83. export const assessmentService = new AssessmentService();