diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts
index 0bf988f63..38a91000a 100644
--- a/app/(chat)/api/chat/route.ts
+++ b/app/(chat)/api/chat/route.ts
@@ -11976,18 +11976,6 @@ export async function POST(request: Request) {
},
"protocol:request"
);
- writeAgentProgressChunk(
- dataStream,
- {
- stage: "planning",
- currentStep: "analyze",
- title: "正在理解你的需求",
- message: "我会先结合当前图、历史结果和画布上下文整理执行方案。",
- toolName: "agentConversation",
- capability: smartAutoExecution?.preferredCapability || undefined,
- },
- "chat-default:progress-planning",
- );
writeCurrentAgentTargetLockChunk(dataStream, "chat-default:target-lock");
for (const event of pendingProtocolDebugEvents) {
writeProtocolDebugChunk(
diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx
index 1d778e55d..707689ee0 100644
--- a/components/canvas/CanvasChatPanel.tsx
+++ b/components/canvas/CanvasChatPanel.tsx
@@ -91,6 +91,7 @@ import { getCanvasSkillIconComponent } from "@/components/canvas/canvas-skill-ic
import { ImageParamsBar, type ImageGenerationParams } from "@/components/image-params-bar";
import { VideoParamsBar, type VideoGenerationParams } from "@/components/video-params-bar";
import { ImageGenerationLoading } from "@/components/image-generation-loading";
+import { Response } from "@/components/elements/response";
import type { VideoToolCapabilityContract } from "@/types/video-tool-capability";
import { DetailUiValidationPanel } from "@/components/canvas/DetailUiValidationPanel";
import { DetailSurfaceInspectorPanel } from "@/components/canvas/DetailSurfaceInspectorPanel";
@@ -1019,6 +1020,7 @@ type CanvasTypewriterTextProps = {
typingKey: string;
enabled: boolean;
className?: string;
+ renderMarkdown?: boolean;
onActiveChange?: (typingKey: string, active: boolean) => void;
onComplete?: (typingKey: string) => void;
};
@@ -1028,6 +1030,7 @@ function CanvasTypewriterText({
typingKey,
enabled,
className,
+ renderMarkdown = false,
onActiveChange,
onComplete,
}: CanvasTypewriterTextProps) {
@@ -1074,18 +1077,33 @@ function CanvasTypewriterText({
};
}, [content, enabled, onActiveChange, onComplete, typingKey]);
+ if (renderMarkdown) {
+ return {displayText};
+ }
+
return
{displayText}
;
}
function normalizeCanvasAgentText(value: string): string {
return String(value || "")
.replace(/\r\n/g, "\n")
- .replace(/^#{1,6}\s*/gm, "")
- .replace(/^\*\*(.+)\*\*$/gm, "$1")
.replace(/\n{3,}/g, "\n\n")
.trim();
}
+function hasCanvasRenderableMarkdown(value: string): boolean {
+ const text = String(value || "");
+ if (!text) return false;
+
+ return (
+ /(^|\n)\s*#{1,6}\s+/.test(text) ||
+ /\*\*[^*]+\*\*/.test(text) ||
+ /(^|\n)\s*[-*+]\s+/.test(text) ||
+ /(^|\n)\s*\d+\.\s+/.test(text) ||
+ /\[[^\]]+\]\([^)]+\)/.test(text)
+ );
+}
+
function normalizeCanvasSectionTitle(line: string): string {
let normalized = line.trim();
if (!normalized) return "";
@@ -9285,8 +9303,7 @@ export function CanvasChatPanel({
!isPresetAgentSelection &&
Boolean(activeAgentProgress) &&
!(activeAgentProgress?.stage === "clarify" && isAgentTargetClarificationActive) &&
- (isLoading ||
- activeAgentProgress?.stage === "clarify" ||
+ (activeAgentProgress?.stage === "clarify" ||
activeAgentProgress?.stage === "failed");
const agentTargetLockPreviewItems = useMemo(() => {
if (!activeAgentTargetLock) return [] as AgentTargetLockRefPreview[];
@@ -10111,11 +10128,13 @@ export function CanvasChatPanel({
const shouldAnimateAnalysis =
shouldTypeAssistantMessage &&
Boolean(analysisSection?.analysis) &&
+ !hasCanvasRenderableMarkdown(analysisSection?.analysis || "") &&
!typedAssistantSections[analysisTypingKey];
const shouldAnimatePlainText =
shouldTypeAssistantMessage &&
!analysisSection &&
Boolean(plainText) &&
+ !hasCanvasRenderableMarkdown(plainText) &&
!typedAssistantSections[plainTextTypingKey];
const shouldShowDoneSummary =
!isDetailGenerationMode &&
@@ -10123,12 +10142,12 @@ export function CanvasChatPanel({
!plainText.includes(CANVAS_IMAGE_DONE_SUMMARY) &&
!isLatestAssistantDuringGeneration;
const renderPlainText = (text: string, key: string) => (
-
{text}
-
+
);
return (
@@ -10185,6 +10204,7 @@ export function CanvasChatPanel({
typingKey={analysisTypingKey}
enabled={shouldAnimateAnalysis}
className="whitespace-pre-wrap break-words [overflow-wrap:anywhere]"
+ renderMarkdown
onActiveChange={handleTypewriterActiveChange}
onComplete={handleTypewriterComplete}
/>
@@ -10200,6 +10220,7 @@ export function CanvasChatPanel({
typingKey={plainTextTypingKey}
enabled={shouldAnimatePlainText}
className="break-words [overflow-wrap:anywhere]"
+ renderMarkdown
onActiveChange={handleTypewriterActiveChange}
onComplete={handleTypewriterComplete}
/>
@@ -11348,11 +11369,7 @@ export function CanvasChatPanel({
Auto Agent
)}
- {!isPresetAgentSelection ? (
-
- 直接对话即可,也可上传图片让我分析、修图或继续生成
-
- ) : selectedAgentPreset?.type === "text" ? (
+ {isPresetAgentSelection && selectedAgentPreset?.type === "text" ? (
可上传图片做分析,也可直接输入文案需求
diff --git a/components/message.tsx b/components/message.tsx
index 80fb7032c..3224e530d 100644
--- a/components/message.tsx
+++ b/components/message.tsx
@@ -776,13 +776,12 @@ export const ThinkingMessage = () => {
- {/* 简洁明了的文本 + 动态点 */}
-
-
AI 正在分析中
-
-
-
-
+
+ 正在处理
+
+
+
+