mirror of
https://github.com/aiclientproxy/proxycast.git
synced 2026-10-24 12:04:22 +08:00
7.5 KiB
7.5 KiB
内容创作系统
概述
内容创作系统支持多种主题(社媒内容、图文海报、歌词曲谱等),通过 <write_file> 标签实现 AI 响应与右侧画布的联动。
核心架构
用户选择主题 → AgentChatPage 生成 systemPrompt
↓
用户发送消息 → useAgentChatUnified.sendMessage()
↓
统一收口到 useAgentChatUnified / useAsterAgentChat / agent_runtime_*
↓
第一条消息时注入 systemPrompt → 发送到 Aster Agent
↓
AI 返回带 <write_file> 标签的响应
↓
StreamingRenderer 解析标签 → 调用 onWriteFile
↓
AgentChatPage.handleWriteFile → 映射为社媒 harness 产物 / 版本链
↓
右侧画布自动打开,显示文档内容
目录结构
src/components/
├── content-creator/
│ ├── canvas/ # 画布组件
│ │ ├── CanvasFactory.tsx # 画布工厂
│ │ ├── canvasUtils.ts # 画布工具
│ │ ├── document/ # 文档画布
│ │ └── music/ # 音乐画布
│ ├── utils/
│ │ └── systemPrompt.ts # 系统提示词生成
│ └── a2ui/
│ └── parser.ts # A2UI 和 write_file 解析器
├── agent/chat/
│ ├── hooks/
│ │ ├── index.ts # Agent chat hooks 导出入口
│ │ └── useAsterAgentChat.ts # Agent 聊天主 Hook
│ ├── components/
│ │ ├── StreamingRenderer.tsx # 流式渲染(解析 write_file)
│ │ └── MessageList.tsx # 消息列表
│ └── index.tsx # AgentChatPage
└── general-chat/
├── bridge.ts # 兼容桥接层
├── canvas/
│ └── CanvasPanel.tsx # 复用画布面板
└── types.ts # CanvasState / DEFAULT_CANVAS_STATE
核心组件
1. systemPrompt.ts - 系统提示词生成
根据主题和创作模式生成 AI 系统提示词。
// src/components/content-creator/utils/systemPrompt.ts
// 主题类型
type ThemeType = "general" | "social-media" | "poster" | "music" | ...;
// 创作模式
type CreationMode = "guided" | "fast" | "hybrid" | "framework";
// 生成系统提示词
export function generateContentCreationPrompt(
theme: ThemeType,
mode: CreationMode
): string;
关键指令:系统提示词要求 AI 使用 <write_file> 标签输出内容:
## 文件写入格式
当需要输出文档内容时,使用以下标签格式:
<write_file path="文件名.md">
内容...
</write_file>
**重要规则**:
- 标签前:先写一句引导语
- 标签后:写完成总结
- 标签内的内容会实时流式显示在右侧画布
2. parser.ts - write_file 标签解析
解析 AI 响应中的 <write_file> 标签。
// src/components/content-creator/a2ui/parser.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. useAsterAgentChat - systemPrompt 注入
在发送第一条消息时注入 systemPrompt,并通过现役 runtime adapter 提交到 agent_runtime_*。
// src/components/agent/chat/hooks/useAsterAgentChat.ts
interface UseAgentChatOptions {
systemPrompt?: string;
onWriteFile?: (content: string, fileName: string) => void;
}
// 关键逻辑:第一条消息注入 systemPrompt
const sendMessage = async (content: string, ...) => {
let messageToSend = content;
const isFirstMessage = messages.filter(m => m.role === "user").length === 0;
if (systemPrompt && isFirstMessage) {
messageToSend = `${systemPrompt}\n\n---\n\n用户请求:${content}`;
}
await runtime.submitOp({
type: "user_input",
text: messageToSend,
sessionId,
eventName,
workspaceId,
systemPrompt,
preferences: {},
});
};
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 - 画布联动
处理文件写入,更新画布状态。
// src/components/agent/chat/index.tsx
const handleWriteFile = useCallback(
(content: string, fileName: string) => {
// General 主题使用专门的画布
if (activeTheme === "general") {
setGeneralCanvasState({
isOpen: true,
contentType: "markdown",
content,
filename: fileName,
});
setLayoutMode("chat-canvas");
return;
}
// 其他主题使用 CanvasFactory
setCanvasState(createInitialDocumentState(content));
setLayoutMode("chat-canvas");
},
[activeTheme],
);
主题类型
| 主题 | 说明 | 文件体系 |
|---|---|---|
| general | 通用对话 | 无固定文件 |
| social-media | 社媒内容 | brief.md → draft.md → article.md |
| poster | 图文海报 | brief.md → copywriting.md → design.md |
| music | 歌词曲谱 | song-spec.md → lyrics-draft.md → lyrics-final.txt |
| video | 短视频 | brief.md → outline.md → script.md |
| novel | 小说创作 | brief.md → outline.md → chapter.md |
| document | 办公文档 | brief.md → outline.md → draft.md |
创作模式
| 模式 | 说明 | AI 行为 |
|---|---|---|
| guided | 引导模式 | 通过表单逐步引导用户创作 |
| fast | 快速模式 | 收集需求后直接生成完整内容 |
| hybrid | 混合模式 | AI 写框架,用户填核心内容 |
| framework | 框架模式 | 用户提供框架,AI 按框架填充 |
注意事项
- 社媒主题已不再把
write_file仅视为“文件覆盖”,而是映射为带阶段语义的版本链产物 brief / draft / polished / platform variant / publish package应分别作为不同产物语义处理- 日志、运行轨迹、正文产物三层分离:
harness产生命名事件,日志只做投影,正文仍由画布/产物承载
Aster 框架限制
Aster 框架的 SessionConfig 不支持 session 级别的 system prompt,因此现役主链采用消息注入方案:
- 在第一条用户消息前注入 systemPrompt
- 后续消息不再注入(避免重复)
画布触发条件
- AI 响应包含
<write_file>标签 StreamingRenderer解析到标签- 调用
onWriteFile回调 AgentChatPage更新画布状态layoutMode切换为chat-canvas
相关文档
- aster-integration.md - Aster 框架集成
- components.md - 组件系统
- hooks.md - React Hooks