aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/ChatBox/response_parsers
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/ChatBox/response_parsers')
-rw-r--r--src/client/views/nodes/ChatBox/response_parsers/AnswerParser.ts125
-rw-r--r--src/client/views/nodes/ChatBox/response_parsers/StreamedAnswerParser.ts73
2 files changed, 0 insertions, 198 deletions
diff --git a/src/client/views/nodes/ChatBox/response_parsers/AnswerParser.ts b/src/client/views/nodes/ChatBox/response_parsers/AnswerParser.ts
deleted file mode 100644
index 79b53b0a3..000000000
--- a/src/client/views/nodes/ChatBox/response_parsers/AnswerParser.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-import { ASSISTANT_ROLE, AssistantMessage, Citation, CHUNK_TYPE, TEXT_TYPE, getChunkType, ProcessingInfo } from '../types';
-import { v4 as uuid } from 'uuid';
-
-export class AnswerParser {
- static parse(xml: string, processingInfo: ProcessingInfo[]): AssistantMessage {
- const answerRegex = /<answer>([\s\S]*?)<\/answer>/;
- const citationsRegex = /<citations>([\s\S]*?)<\/citations>/;
- const citationRegex = /<citation index="([^"]+)" chunk_id="([^"]+)" type="([^"]+)">([\s\S]*?)<\/citation>/g;
- const followUpQuestionsRegex = /<follow_up_questions>([\s\S]*?)<\/follow_up_questions>/;
- const questionRegex = /<question>(.*?)<\/question>/g;
- const groundedTextRegex = /<grounded_text citation_index="([^"]+)">([\s\S]*?)<\/grounded_text>/g;
- const normalTextRegex = /<normal_text>([\s\S]*?)<\/normal_text>/g;
- const loopSummaryRegex = /<loop_summary>([\s\S]*?)<\/loop_summary>/;
-
- const answerMatch = answerRegex.exec(xml);
- const citationsMatch = citationsRegex.exec(xml);
- const followUpQuestionsMatch = followUpQuestionsRegex.exec(xml);
- const loopSummaryMatch = loopSummaryRegex.exec(xml);
-
- if (!answerMatch) {
- throw new Error('Invalid XML: Missing <answer> tag.');
- }
-
- let rawTextContent = answerMatch[1].trim();
- let content: AssistantMessage['content'] = [];
- let citations: Citation[] = [];
- let contentIndex = 0;
-
- // Remove citations and follow-up questions from rawTextContent
- if (citationsMatch) {
- rawTextContent = rawTextContent.replace(citationsMatch[0], '').trim();
- }
- if (followUpQuestionsMatch) {
- rawTextContent = rawTextContent.replace(followUpQuestionsMatch[0], '').trim();
- }
- if (loopSummaryMatch) {
- rawTextContent = rawTextContent.replace(loopSummaryMatch[0], '').trim();
- }
-
- // Parse citations
- let citationMatch;
- const citationMap = new Map<string, string>();
- if (citationsMatch) {
- const citationsContent = citationsMatch[1];
- while ((citationMatch = citationRegex.exec(citationsContent)) !== null) {
- const [_, index, chunk_id, type, direct_text] = citationMatch;
- const citation_id = uuid();
- citationMap.set(index, citation_id);
- citations.push({
- direct_text: direct_text.trim(),
- type: getChunkType(type),
- chunk_id,
- citation_id,
- });
- }
- }
-
- rawTextContent = rawTextContent.replace(normalTextRegex, '$1');
-
- // Parse text content (normal and grounded)
- let lastIndex = 0;
- let match;
-
- while ((match = groundedTextRegex.exec(rawTextContent)) !== null) {
- const [fullMatch, citationIndex, groundedText] = match;
-
- // Add normal text that is before the grounded text
- if (match.index > lastIndex) {
- const normalText = rawTextContent.slice(lastIndex, match.index).trim();
- if (normalText) {
- content.push({
- index: contentIndex++,
- type: TEXT_TYPE.NORMAL,
- text: normalText,
- citation_ids: null,
- });
- }
- }
-
- // Add grounded text
- const citation_ids = citationIndex.split(',').map(index => citationMap.get(index) || '');
- content.push({
- index: contentIndex++,
- type: TEXT_TYPE.GROUNDED,
- text: groundedText.trim(),
- citation_ids,
- });
-
- lastIndex = match.index + fullMatch.length;
- }
-
- // Add any remaining normal text after the last grounded text
- if (lastIndex < rawTextContent.length) {
- const remainingText = rawTextContent.slice(lastIndex).trim();
- if (remainingText) {
- content.push({
- index: contentIndex++,
- type: TEXT_TYPE.NORMAL,
- text: remainingText,
- citation_ids: null,
- });
- }
- }
-
- let followUpQuestions: string[] = [];
- if (followUpQuestionsMatch) {
- const questionsText = followUpQuestionsMatch[1];
- let questionMatch;
- while ((questionMatch = questionRegex.exec(questionsText)) !== null) {
- followUpQuestions.push(questionMatch[1].trim());
- }
- }
-
- const assistantResponse: AssistantMessage = {
- role: ASSISTANT_ROLE.ASSISTANT,
- content,
- follow_up_questions: followUpQuestions,
- citations,
- processing_info: processingInfo,
- loop_summary: loopSummaryMatch ? loopSummaryMatch[1].trim() : undefined,
- };
-
- return assistantResponse;
- }
-}
diff --git a/src/client/views/nodes/ChatBox/response_parsers/StreamedAnswerParser.ts b/src/client/views/nodes/ChatBox/response_parsers/StreamedAnswerParser.ts
deleted file mode 100644
index 3585cab4a..000000000
--- a/src/client/views/nodes/ChatBox/response_parsers/StreamedAnswerParser.ts
+++ /dev/null
@@ -1,73 +0,0 @@
-import { threadId } from 'worker_threads';
-
-enum ParserState {
- Outside,
- InGroundedText,
- InNormalText,
-}
-
-export class StreamedAnswerParser {
- private state: ParserState = ParserState.Outside;
- private buffer: string = '';
- private result: string = '';
- private isStartOfLine: boolean = true;
-
- public parse(char: string): string {
- switch (this.state) {
- case ParserState.Outside:
- if (char === '<') {
- this.buffer = '<';
- } else if (char === '>') {
- if (this.buffer.startsWith('<grounded_text')) {
- this.state = ParserState.InGroundedText;
- } else if (this.buffer.startsWith('<normal_text')) {
- this.state = ParserState.InNormalText;
- }
- this.buffer = '';
- } else {
- this.buffer += char;
- }
- break;
-
- case ParserState.InGroundedText:
- case ParserState.InNormalText:
- if (char === '<') {
- this.buffer = '<';
- } else if (this.buffer.startsWith('</grounded_text') && char === '>') {
- this.state = ParserState.Outside;
- this.buffer = '';
- } else if (this.buffer.startsWith('</normal_text') && char === '>') {
- this.state = ParserState.Outside;
- this.buffer = '';
- } else if (this.buffer.startsWith('<')) {
- this.buffer += char;
- } else {
- this.processChar(char);
- }
- break;
- }
-
- return this.result.trim();
- }
-
- private processChar(char: string): void {
- if (this.isStartOfLine && char === ' ') {
- // Skip leading spaces
- return;
- }
- if (char === '\n') {
- this.result += char;
- this.isStartOfLine = true;
- } else {
- this.result += char;
- this.isStartOfLine = false;
- }
- }
-
- public reset(): void {
- this.state = ParserState.Outside;
- this.buffer = '';
- this.result = '';
- this.isStartOfLine = true;
- }
-}