From e860357563df68a607eea82faae850a9c6978e05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=91=A3=E5=AE=8F=E5=87=AF?= Date: Wed, 19 Aug 2026 21:21:22 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=E5=8D=95=E8=BD=AE=20RAG=20=E6=AD=A5?= =?UTF-8?q?=E9=AA=A4=E6=9D=A1=E6=80=9D=E8=80=83=E5=86=85=E5=AE=B9=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=8F=AF=E7=82=B9=E5=87=BB=E5=8F=82=E8=80=83=E5=BA=8F?= =?UTF-8?q?=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把思考区的 `[n]` 按正文同一套引用规则渲染,并去掉回答气泡里重复的 Thought for a few seconds。 Co-authored-by: Cursor --- .../workspace/messages/message-group.tsx | 96 ++++++++++- .../workspace/messages/message-list-item.tsx | 48 +++--- .../workspace/messages/message-list.tsx | 163 ++++++++++-------- 3 files changed, 196 insertions(+), 111 deletions(-) diff --git a/frontend-web/src/components/workspace/messages/message-group.tsx b/frontend-web/src/components/workspace/messages/message-group.tsx index f94c157c..1ed5ab3b 100644 --- a/frontend-web/src/components/workspace/messages/message-group.tsx +++ b/frontend-web/src/components/workspace/messages/message-group.tsx @@ -15,7 +15,7 @@ import { SquareTerminalIcon, WrenchIcon, } from "lucide-react"; -import { useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo, useState, type AnchorHTMLAttributes } from "react"; import { ChainOfThought, @@ -58,6 +58,7 @@ import { useRehypeSplitWordsIntoSpans } from "@/core/rehype"; import { useLocalSettings } from "@/core/settings"; import { useSkills } from "@/core/skills/hooks"; import { + applyInlineCitations, buildSkillDisplayMap, findDisplayConfigForTool, isDisplaySamplePayload, @@ -71,20 +72,24 @@ import { env } from "@/env"; import { cn } from "@/lib/utils"; import { useArtifactsOptional } from "../artifacts"; +import { CitationLink } from "../citations/citation-link"; import { FlipDisplay } from "../flip-display"; import { Tooltip } from "../tooltip"; import { SourceCard } from "../skill-display-sources"; import { MarkdownContent } from "./markdown-content"; +import { SingleRoundRagCitationDialog } from "./message-list-item"; export function MessageGroup({ className, messages, isLoading = false, + displaySources = [], }: { className?: string; messages: Message[]; isLoading?: boolean; + displaySources?: RuntimeDisplaySource[]; }) { const { t } = useI18n(); const [showAbove, setShowAbove] = useState( @@ -121,11 +126,29 @@ export function MessageGroup({ } }, [lastToolCallStep, steps]); const rehypePlugins = useRehypeSplitWordsIntoSpans(isLoading); + const [selectedCitation, setSelectedCitation] = + useState(null); + const handleCitationClick = useCallback( + (referenceId: string) => { + const referenceIndex = Number(referenceId); + if (!Number.isInteger(referenceIndex) || referenceIndex < 1) return; + const source = + displaySources.find((item) => item.index === referenceIndex) ?? + displaySources[referenceIndex - 1]; + if (source) setSelectedCitation(source); + }, + [displaySources], + ); + const reasoningId = + lastReasoningStep?.id ?? + messages.find((message) => message.type === "ai")?.id; return ( - + <> + {aboveLastToolCallSteps.length > 0 && (