Skip to content

Commit 2dd1a70

Browse files
committed
Citation issue fix version2
1 parent cd8180b commit 2dd1a70

File tree

2 files changed

+30
-10
lines changed

2 files changed

+30
-10
lines changed

app/frontend/src/components/Answer/Answer.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ export const Answer = ({
4343
showSpeechOutputBrowser
4444
}: Props) => {
4545
const followupQuestions = answer.context?.followup_questions;
46-
const messageContent = answer.message.content;
47-
const parsedAnswer = useMemo(() => parseAnswerToHtml(messageContent, isStreaming, onCitationClicked), [answer]);
46+
const parsedAnswer = useMemo(() => parseAnswerToHtml(answer, isStreaming, onCitationClicked), [answer]);
4847
const { t } = useTranslation();
4948
const sanitizedAnswerHtml = DOMPurify.sanitize(parsedAnswer.answerHtml);
5049

app/frontend/src/components/Answer/AnswerParser.tsx

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,44 @@
11
import { renderToStaticMarkup } from "react-dom/server";
2-
import { getCitationFilePath } from "../../api";
2+
import { ChatAppResponse, getCitationFilePath } from "../../api";
33

44
type HtmlParsedAnswer = {
55
answerHtml: string;
66
citations: string[];
77
};
88

9-
// Function to check citation format
10-
// Citation format: AnyFileName.anyExtension
11-
function isValidCitation(citation: string): boolean {
9+
// Function to validate citation format and check if it is a valid citation within the context
10+
function isCitationValid(contextDataPoints: any, citationCandidate: string): boolean {
1211
const regex = /^[^\s]+\.[a-zA-Z0-9]+/;
13-
return regex.test(citation);
12+
if (!regex.test(citationCandidate)) {
13+
return false;
14+
}
15+
16+
// Check if contextDataPoints is an object with a text property that is an array
17+
let dataPointsArray: string[];
18+
if (Array.isArray(contextDataPoints)) {
19+
dataPointsArray = contextDataPoints;
20+
} else if (contextDataPoints && Array.isArray(contextDataPoints.text)) {
21+
dataPointsArray = contextDataPoints.text;
22+
} else {
23+
return false;
24+
}
25+
26+
// Check if the citation is included in any of the strings within the text array
27+
const isValidCitation = dataPointsArray.some(dataPoint => dataPoint.includes(citationCandidate));
28+
29+
if (!isValidCitation) {
30+
return false;
31+
}
32+
33+
return true;
1434
}
1535

16-
export function parseAnswerToHtml(answer: string, isStreaming: boolean, onCitationClicked: (citationFilePath: string) => void): HtmlParsedAnswer {
36+
export function parseAnswerToHtml(answer: ChatAppResponse, isStreaming: boolean, onCitationClicked: (citationFilePath: string) => void): HtmlParsedAnswer {
37+
const contextDataPoints = answer.context.data_points;
1738
const citations: string[] = [];
1839

1940
// trim any whitespace from the end of the answer after removing follow-up questions
20-
let parsedAnswer = answer.trim();
41+
let parsedAnswer = answer.message.content.trim();
2142

2243
// Omit a citation that is still being typed during streaming
2344
if (isStreaming) {
@@ -42,7 +63,7 @@ export function parseAnswerToHtml(answer: string, isStreaming: boolean, onCitati
4263
} else {
4364
let citationIndex: number;
4465

45-
if (!isValidCitation(part)) {
66+
if (!isCitationValid(contextDataPoints, part)) {
4667
return `[${part}]`;
4768
}
4869

0 commit comments

Comments
 (0)