mirror of
https://github.com/aiclientproxy/proxycast.git
synced 2026-09-24 23:10:56 +08:00
8.3 KiB
8.3 KiB
历史内容工作台与画布联动(归档)
概述
本说明仅作为历史治理记录保留,现役主入口已经迁到 workspace.md 与 src/components/workspace/** / src/lib/workspace/**。当前内容工作台通过 <write_file> 标签与结构化 A2UI 产物实现 Agent 响应、版本链与右侧画布联动。
当前治理结论:
src/components/workspace/**与src/lib/workspace/**是现役currentruntime,后续能力只允许继续向这里收敛- 文档导航、实现判断与后续扩展应优先参考
workspace.md,不要再把本文件当成现役入口 - 不要再直接恢复
src/components/content-creator/**旧路径;若需要共享能力,统一经src/lib/workspace/*网关访问 - 已删除的根级旧入口如
src/hooks/usePosterWorkflow.ts、src/hooks/useMultiPlatformExport.ts不应回流 - 已删除的海报 workflow 孤岛
src/components/content-creator/workflows/poster/**、src/lib/workspace/workbenchPoster.ts不应回流
核心架构
用户选择主题 → AgentChatWorkspace 生成 systemPrompt
↓
用户发送消息 → useAgentChatUnified.sendMessage()
↓
统一收口到 useAgentChatUnified / useAsterAgentChat / agent_runtime_*
↓
第一条消息时注入 systemPrompt → 发送到 Aster Agent
↓
AI 返回带 <write_file> 标签的响应
↓
StreamingRenderer / stream processor 解析标签 → 调用 onWriteFile
↓
useWorkspaceWriteFileAction → 映射为社媒 harness 产物 / 版本链
↓
右侧画布自动打开,显示文档内容
目录结构
src/
├── components/
│ ├── workspace/
│ │ ├── canvas/ # 现役画布 runtime
│ │ ├── a2ui/ # A2UI 结构与解析实现
│ │ ├── document/ # 文档画布与编辑器
│ │ ├── layout/ # 布局过渡与工作台壳
│ │ ├── media/ # 素材库与媒体面板
│ │ └── hooks/ # 工作台 Hook
│ └── agent/chat/
│ ├── hooks/
│ │ ├── index.ts # useAgentChatUnified 统一入口
│ │ └── useAsterAgentChat.ts # 现役 Aster 聊天主 Hook
│ ├── components/
│ │ └── StreamingRenderer.tsx # 流式渲染与标签解析
│ ├── workspace/
│ │ └── useWorkspaceWriteFileAction.ts
│ └── AgentChatWorkspace.tsx # 工作台主入口
└── lib/
└── workspace/
├── a2ui.ts # A2UI 外层共享网关
├── workbenchPrompt.ts # prompt 外层共享网关
├── workbenchCanvas.ts # canvas 外层共享网关
├── workbenchRuntime.ts # runtime helper 外层共享网关
├── workbenchUi.ts # 共享 UI 网关
└── workbenchWorkflow.ts # 工作流 Hook 网关
核心组件
1. workbenchPrompt.ts / systemPrompt.ts - 系统提示词生成
根据主题和工作台模式生成 AI 系统提示词。外层主链统一经 src/lib/workspace/workbenchPrompt.ts 访问,不应再恢复 content-creator 内部旧实现路径。
// 运行时代码统一从 workspace 网关进入
import {
generateSystemPrompt,
generateProjectMemoryPrompt,
} from "@/lib/workspace/workbenchPrompt";
关键指令:系统提示词要求 AI 使用 <write_file> 标签输出内容:
## 文件写入格式
当需要输出文档内容时,使用以下标签格式:
<write_file path="文件名.md">
内容...
</write_file>
**重要规则**:
- 标签前:先写一句引导语
- 标签后:写完成总结
- 标签内的内容会实时流式显示在右侧画布
2. a2ui.ts / parser.ts - write_file 标签解析
解析 AI 响应中的 <write_file> 标签。外层统一从 src/lib/workspace/a2ui.ts 读取解析器与结构类型。
// src/lib/workspace/a2ui.ts
interface ParseResult {
parts: ParsedMessageContent[];
hasA2UI: boolean;
hasWriteFile: boolean;
hasPending: boolean;
}
// 解析 AI 响应
export function parseAIResponse(
content: string,
isStreaming: boolean,
): ParseResult;
支持的标签类型:
write_file- 完整的文件写入pending_write_file- 流式传输中的文件写入
3. useAgentChatUnified / useAsterAgentChat - systemPrompt 注入
在发送第一条消息时注入 systemPrompt,并通过现役 runtime adapter 提交到 agent_runtime_*。
// src/components/agent/chat/hooks/index.ts
interface UseAgentChatOptions {
systemPrompt?: string;
onWriteFile?: (content: string, fileName: string) => void;
}
export function useAgentChatUnified(options: UseAgentChatUnifiedOptions) {
return useAsterAgentChat(options);
}
现役事实源:
- 统一入口:
src/components/agent/chat/hooks/index.ts - 底层实现:
src/components/agent/chat/hooks/useAsterAgentChat.ts - 首条 system prompt 拼装:
buildUserInputSubmitOp.ts/agentStream*
4. StreamingRenderer.tsx - 流式渲染
解析 AI 响应并触发文件写入回调。
// src/components/agent/chat/components/StreamingRenderer.tsx
interface Props {
content: string;
isStreaming: boolean;
onWriteFile?: (content: string, fileName: string) => void;
// ...
}
// 解析 write_file 并触发回调
useEffect(() => {
if (!onWriteFile) return;
for (const part of parsedContent.parts) {
if (part.type === "write_file" && part.filePath) {
onWriteFile(part.content, part.filePath);
}
}
}, [parsedContent.parts, onWriteFile]);
5. AgentChatPage - 画布联动
处理文件写入,更新画布状态。当前主入口已是 AgentChatWorkspace 与 useWorkspaceWriteFileAction,不再以旧 general-chat 兼容层作为事实源。
// src/components/agent/chat/AgentChatWorkspace.tsx
// src/components/agent/chat/workspace/useWorkspaceWriteFileAction.ts
const { sendMessage } = useAgentChatUnified({
systemPrompt,
onWriteFile: handleWriteFile,
workspaceId,
});
const handleWriteFile = useWorkspaceWriteFileAction(...);
主题类型
| 主题 | 说明 | 文件体系 |
|---|---|---|
| general | 通用对话 | 无固定文件 |
| current | 现役口径 | 旧社媒 / 文档 / 规划等主题已统一回落到 general |
创作模式
| 模式 | 说明 | AI 行为 |
|---|---|---|
| guided | 引导模式 | 通过表单逐步引导用户创作 |
| fast | 快速模式 | 收集需求后直接生成完整内容 |
| hybrid | 混合模式 | AI 写框架,用户填核心内容 |
| framework | 框架模式 | 用户提供框架,AI 按框架填充 |
注意事项
- 社媒主题已不再把
write_file仅视为“文件覆盖”,而是映射为带阶段语义的版本链产物 brief / draft / polished / platform variant / publish package应分别作为不同产物语义处理- 日志、运行轨迹、正文产物三层分离:
harness产生命名事件,日志只做投影,正文仍由画布/产物承载 - 外层主链不要再直接 import
@/components/content-creator/**,统一走src/lib/workspace/*与@/components/workspace/** - 根级旧 Hook
src/hooks/usePosterWorkflow.ts、src/hooks/useMultiPlatformExport.ts已删除,不应回流 - 海报 workflow 孤岛
src/components/content-creator/workflows/poster/**与src/lib/workspace/workbenchPoster.ts已删除,不应回流
Aster 框架限制
Aster 框架的 SessionConfig 不支持 session 级别的 system prompt,因此现役主链采用消息注入方案:
- 在第一条用户消息前注入 systemPrompt
- 后续消息不再注入(避免重复)
画布触发条件
- AI 响应包含
<write_file>标签 StreamingRenderer解析到标签- 调用
onWriteFile回调 useWorkspaceWriteFileAction更新版本链 / 画布状态layoutMode切换为chat-canvas
相关文档
- aster-integration.md - Aster 框架集成
- components.md - 组件系统
- hooks.md - React Hooks