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 正在分析中 - - - - +
+ 正在处理 +