| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import { apiClient } from './apiClient';
- export interface AssessmentSession {
- id: string;
- userId: string;
- knowledgeBaseId: string;
- threadId: string;
- status: 'IN_PROGRESS' | 'COMPLETED';
- finalScore?: number;
- finalReport?: string;
- createdAt: string;
- updatedAt: string;
- knowledgeBase?: { id: string; name: string };
- knowledgeGroup?: { id: string; name: string };
- }
- export interface AssessmentState {
- messages: any[];
- assessmentSessionId: string;
- knowledgeBaseId: string;
- questions: any[];
- currentQuestionIndex: number;
- shouldFollowUp: boolean;
- scores: Record<string, number>;
- feedbackHistory?: any[];
- status?: 'IN_PROGRESS' | 'COMPLETED';
- report?: string;
- finalScore?: number;
- }
- export class AssessmentService {
- async startSession(knowledgeBaseId: string, language: string = 'zh'): Promise<AssessmentSession> {
- const { data } = await apiClient.post<AssessmentSession>('/assessment/start', { knowledgeBaseId, language });
- return data;
- }
- async submitAnswer(sessionId: string, answer: string, language: string = 'zh'): Promise<AssessmentState> {
- const { data } = await apiClient.post<AssessmentState>(`/assessment/${sessionId}/answer`, { answer, language });
- return data;
- }
- async getSessionState(sessionId: string): Promise<AssessmentState> {
- const { data } = await apiClient.get<AssessmentState>(`/assessment/${sessionId}/state`);
- return data;
- }
- async getHistory(): Promise<AssessmentSession[]> {
- const { data } = await apiClient.get<AssessmentSession[]>('/assessment');
- return data;
- }
- async *startSessionStream(sessionId: string): AsyncIterableIterator<any> {
- const response = await apiClient.request(`/assessment/${sessionId}/start-stream`, {
- method: 'GET',
- });
- yield* this.parseStream(response);
- }
- async *submitAnswerStream(sessionId: string, answer: string, language: string = 'zh'): AsyncIterableIterator<any> {
- const query = new URLSearchParams({ answer, language }).toString();
- const response = await apiClient.request(`/assessment/${sessionId}/answer-stream?${query}`, {
- method: 'GET',
- });
- yield* this.parseStream(response);
- }
- private async *parseStream(response: Response): AsyncIterableIterator<any> {
- const reader = response.body?.getReader();
- if (!reader) return;
- const decoder = new TextDecoder();
- let buffer = '';
- while (true) {
- const { done, value } = await reader.read();
- if (done) break;
- buffer += decoder.decode(value, { stream: true });
- const lines = buffer.split('\n');
- buffer = lines.pop() || '';
- for (const line of lines) {
- if (line.startsWith('data: ')) {
- try {
- const data = JSON.parse(line.substring(6));
- yield data;
- } catch (e) {
- console.error('Failed to parse SSE data:', line);
- }
- }
- }
- }
- }
- }
- export const assessmentService = new AssessmentService();
|