assessmentService.ts 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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'): Promise<AssessmentSession> {
  30. const { data } = await apiClient.post<AssessmentSession>('/assessment/start', { knowledgeBaseId, language });
  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): AsyncIterableIterator<any> {
  46. const response = await apiClient.request(`/assessment/${sessionId}/start-stream`, {
  47. method: 'GET',
  48. });
  49. yield* this.parseStream(response);
  50. }
  51. async *submitAnswerStream(sessionId: string, answer: string, language: string = 'zh'): AsyncIterableIterator<any> {
  52. const query = new URLSearchParams({ answer, language }).toString();
  53. const response = await apiClient.request(`/assessment/${sessionId}/answer-stream?${query}`, {
  54. method: 'GET',
  55. });
  56. yield* this.parseStream(response);
  57. }
  58. private async *parseStream(response: Response): AsyncIterableIterator<any> {
  59. const reader = response.body?.getReader();
  60. if (!reader) return;
  61. const decoder = new TextDecoder();
  62. let buffer = '';
  63. while (true) {
  64. const { done, value } = await reader.read();
  65. if (done) break;
  66. buffer += decoder.decode(value, { stream: true });
  67. const lines = buffer.split('\n');
  68. buffer = lines.pop() || '';
  69. for (const line of lines) {
  70. if (line.startsWith('data: ')) {
  71. try {
  72. const data = JSON.parse(line.substring(6));
  73. yield data;
  74. } catch (e) {
  75. console.error('Failed to parse SSE data:', line);
  76. }
  77. }
  78. }
  79. }
  80. }
  81. }
  82. export const assessmentService = new AssessmentService();