;
}) {
if (language === "markdown") {
- const components = createCitationMarkdownComponents({
- citationMap,
- syntheticExternal: true,
- });
return (
-
- {cleanContent ?? ""}
+
+ {content ?? ""}
);
```
- 删除:React 命名空间、inline-citation、core/citations、SafeCitationContent、useThread;parsed/cleanContent/contentWithoutCitations 及引用解析逻辑。
- 新增:`displayContent = content ?? ""`;预览与复制、CodeEditor 均使用 `displayContent`;`ArtifactFilePreview` 仅保留 `content`/`language` 等,去掉 `cleanContent`/`citationMap` 与 `createCitationMarkdownComponents`。
---
### 10. `frontend/src/components/workspace/messages/message-group.tsx`
```diff
@@ -39,9 +39,7 @@ import { useArtifacts } from "../artifacts";
import { FlipDisplay } from "../flip-display";
import { Tooltip } from "../tooltip";
-import { useThread } from "./context";
-
-import { SafeCitationContent } from "./safe-citation-content";
+import { MarkdownContent } from "./markdown-content";
export function MessageGroup({
```
```diff
@@ -120,7 +118,7 @@ export function MessageGroup({
) : (
-
+
),
)}
{lastToolCallStep && (
@@ -143,7 +136,6 @@ export function MessageGroup({
{...lastToolCallStep}
isLast={true}
isLoading={isLoading}
- rehypePlugins={rehypePlugins}
/>
)}
@@ -178,7 +170,7 @@ export function MessageGroup({
;
isLast?: boolean;
isLoading?: boolean;
- rehypePlugins: ReturnType;
}) {
const { t } = useI18n();
const { setOpen, autoOpen, autoSelect, selectedArtifact, select } =
useArtifacts();
- const { thread } = useThread();
- const threadIsLoading = thread.isLoading;
-
- const fileContent = typeof args.content === "string" ? args.content : "";
if (name === "web_search") {
```
```diff
@@ -364,42 +350,27 @@ function ToolCall({
}, 100);
}
- const isMarkdown =
- path?.toLowerCase().endsWith(".md") ||
- path?.toLowerCase().endsWith(".markdown");
-
return (
- <>
- {
- select(
- new URL(
- `write-file:${path}?message_id=${messageId}&tool_call_id=${id}`,
- ).toString(),
- );
- setOpen(true);
- }}
- >
- {path && (
-
- {path}
-
- )}
-
- {isMarkdown && (
-
+ {
+ select(
+ new URL(
+ `write-file:${path}?message_id=${messageId}&tool_call_id=${id}`,
+ ).toString(),
+ );
+ setOpen(true);
+ }}
+ >
+ {path && (
+
+ {path}
+
)}
- >
+
);
} else if (name === "bash") {
```
- 两处 `SafeCitationContent` → `MarkdownContent`;ToolCall 去掉 `rehypePlugins` 及内部 `useThread`/`fileContent`;write_file 分支去掉 markdown 预览块(`isMarkdown` + `SafeCitationContent`),仅保留 `ChainOfThoughtStep` + path。
---
### 11. `frontend/src/components/workspace/messages/message-list-item.tsx`
```diff
@@ -12,7 +12,6 @@ import {
} from "@/components/ai-elements/message";
import { Badge } from "@/components/ui/badge";
import { resolveArtifactURL } from "@/core/artifacts/utils";
-import { removeAllCitations } from "@/core/citations";
import {
extractContentFromMessage,
extractReasoningContentFromMessage,
@@ -24,7 +23,7 @@ import { humanMessagePlugins } from "@/core/streamdown";
import { cn } from "@/lib/utils";
import { CopyButton } from "../copy-button";
-import { SafeCitationContent } from "./safe-citation-content";
+import { MarkdownContent } from "./markdown-content";
...
@@ -54,11 +53,11 @@ export function MessageListItem({
>
@@ -154,7 +153,7 @@ function MessageContent_({
return (
{filesList}
-
{group.messages[0] && hasContent(group.messages[0]) && (
- & { threadId?: string; maxWidth?: string }) => ReactNode;
};
/** Renders markdown content. */
export function MarkdownContent({
content,
rehypePlugins,
className,
remarkPlugins = streamdownPlugins.remarkPlugins,
img,
}: MarkdownContentProps) {
if (!content) return null;
const components = img ? { img } : undefined;
return (
{content}
);
}
```
- 纯 Markdown 渲染组件,无引用解析或 loading 占位逻辑。
---
### 15. 删除 `frontend/src/components/workspace/messages/safe-citation-content.tsx`
- 原约 85 行;提供引用解析、loading、renderBody/loadingOnly、cleanContent/citationMap。已由 `MarkdownContent` 替代,整文件删除。
---
### 16. 删除 `frontend/src/components/ai-elements/inline-citation.tsx`
- 原约 289 行;提供 `createCitationMarkdownComponents` 等,用于将 `[cite-N]`/URL 渲染为可点击引用。仅被 artifact 预览使用,已移除后整文件删除。
---
## 四、前端 core
### 17. 删除 `frontend/src/core/citations/index.ts`
- 原 13 行,导出:`contentWithoutCitationsFromParsed`、`extractDomainFromUrl`、`isExternalUrl`、`parseCitations`、`removeAllCitations`、`shouldShowCitationLoading`、`syntheticCitationFromLink`、`useParsedCitations`、类型 `Citation`/`ParseCitationsResult`/`UseParsedCitationsResult`。整文件删除。
---
### 18. 删除 `frontend/src/core/citations/use-parsed-citations.ts`
- 原 28 行,`useParsedCitations(content)` 与 `UseParsedCitationsResult`。整文件删除。
---
### 19. 删除 `frontend/src/core/citations/utils.ts`
- 原 226 行,解析 ``/`[cite-N]`、buildCitationMap、removeAllCitations、contentWithoutCitationsFromParsed 等。整文件删除。
---
### 20. `frontend/src/core/i18n/locales/types.ts`
```diff
@@ -115,12 +115,6 @@ export interface Translations {
startConversation: string;
};
- // Citations
- citations: {
- loadingCitations: string;
- loadingCitationsWithCount: (count: number) => string;
- };
-
// Chats
chats: {
```
- 删除 `Translations.citations` 及其两个字段。
---
### 21. `frontend/src/core/i18n/locales/zh-CN.ts`
```diff
@@ -164,12 +164,6 @@ export const zhCN: Translations = {
startConversation: "开始新的对话以查看消息",
},
- // Citations
- citations: {
- loadingCitations: "正在整理引用...",
- loadingCitationsWithCount: (count: number) => `正在整理 ${count} 个引用...`,
- },
-
// Chats
chats: {
```
- 删除 `citations` 命名空间。
---
### 22. `frontend/src/core/i18n/locales/en-US.ts`
```diff
@@ -167,13 +167,6 @@ export const enUS: Translations = {
startConversation: "Start a conversation to see messages here",
},
- // Citations
- citations: {
- loadingCitations: "Organizing citations...",
- loadingCitationsWithCount: (count: number) =>
- `Organizing ${count} citation${count === 1 ? "" : "s"}...`,
- },
-
// Chats
chats: {
```
- 删除 `citations` 命名空间。
---
## 五、技能与 Demo
### 23. `skills/public/github-deep-research/SKILL.md`
```diff
@@ -147,5 +147,5 @@ Save report as: `research_{topic}_{YYYYMMDD}.md`
3. **Triangulate claims** - 2+ independent sources
4. **Note conflicting info** - Don't hide contradictions
5. **Distinguish fact vs opinion** - Label speculation clearly
-6. **Cite inline** - Reference sources near claims
+6. **Reference sources** - Add source references near claims where applicable
7. **Update as you go** - Don't wait until end to synthesize
```
- 第 150 行:一条措辞修改。
---
### 24. `skills/public/market-analysis/SKILL.md`
```diff
@@ -15,7 +15,7 @@ This skill generates professional, consulting-grade market analysis reports in M
- Follow the **"Visual Anchor → Data Contrast → Integrated Analysis"** flow per sub-chapter
- Produce insights following the **"Data → User Psychology → Strategy Implication"** chain
- Embed pre-generated charts and construct comparison tables
-- Generate inline citations formatted per **GB/T 7714-2015** standards
+- Include references formatted per **GB/T 7714-2015** where applicable
- Output reports entirely in Chinese with professional consulting tone
...
@@ -36,7 +36,7 @@ The skill expects the following inputs from the upstream agentic workflow:
| **Analysis Framework Outline** | Defines the logic flow and general topics for the report | Yes |
| **Data Summary** | The source of truth containing raw numbers and metrics | Yes |
| **Chart Files** | Local file paths for pre-generated chart images | Yes |
-| **External Search Findings** | URLs and summaries for inline citations | Optional |
+| **External Search Findings** | URLs and summaries for inline references | Optional |
...
@@ -87,7 +87,7 @@ The report **MUST NOT** stop after the Conclusion — it **MUST** include Refere
- **Tone**: McKinsey/BCG — Authoritative, Objective, Professional
- **Language**: All headings and content strictly in **Chinese**
- **Number Formatting**: Use English commas for thousands separators (`1,000` not `1,000`)
-- **Data Citation**: **Bold** important viewpoints and key numbers
+- **Data emphasis**: **Bold** important viewpoints and key numbers
...
@@ -109,11 +109,9 @@ Every insight must connect **Data → User Psychology → Strategy Implication**
treating male audiences only as a secondary gift-giving segment."
```
-### Citations & References
-- **Inline**: Use `[\[Index\]](URL)` format (e.g., `[\[1\]](https://example.com)`)
-- **Placement**: Append citations at the end of sentences using information from External Search Findings
-- **Index Assignment**: Sequential starting from **1** based on order of appearance
-- **References Section**: Formatted strictly per **GB/T 7714-2015**
+### References
+- **Inline**: Use markdown links for sources (e.g. `[Source Title](URL)`) when using External Search Findings
+- **References section**: Formatted strictly per **GB/T 7714-2015**
...
@@ -183,7 +181,7 @@ Before considering the report complete, verify:
- [ ] All headings are in Chinese with proper numbering (no "Chapter/Part/Section")
- [ ] Charts are embedded with `` syntax
- [ ] Numbers use English commas for thousands separators
-- [ ] Inline citations use `[\[N\]](URL)` format
+- [ ] Inline references use markdown links where applicable
- [ ] References section follows GB/T 7714-2015
```
- 多处:核心能力、输入表、Data Citation、Citations & References 小节与检查项,改为「references / 引用」表述并去掉 `[\[N\]](URL)` 格式要求。
---
### 25. `frontend/public/demo/threads/.../user-data/outputs/research_deerflow_20260201.md`
```diff
@@ -1,12 +1,3 @@
-
-{"id": "cite-1", "title": "DeerFlow GitHub Repository", "url": "https://github.com/bytedance/deer-flow", "snippet": "..."}
-...(共 7 条 JSONL)
-
# DeerFlow Deep Research Report
- **Research Date:** 2026-02-01
```
- 删除文件开头的 `...` 整块(9 行),正文从 `# DeerFlow Deep Research Report` 开始。
---
### 26. `frontend/public/demo/threads/.../thread.json`
- **主要变更**:某条 `write_file` 的 `args.content` 中,将原来的「`...\n\n# DeerFlow Deep Research Report\n\n...`」改为「`# DeerFlow Deep Research Report\n\n...`」,即去掉 `...` 块,保留其后全文。
- **其他**:一处 `present_files` 的 `filepaths` 由单行数组改为多行格式;文件末尾增加/统一换行。
- 消息顺序、结构及其他字段未改。
---
## 六、统计
| 项目 | 数量 |
|------|------|
| 修改文件 | 18 |
| 新增文件 | 1(markdown-content.tsx) |
| 删除文件 | 5(safe-citation-content.tsx, inline-citation.tsx, core/citations/* 共 3 个) |
| 总行数变化 | +62 / -894(diff stat) |
以上为按文件、细到每一行 diff 的代码更改总结。