CangjieMagic框架:使用华为仓颉编程语言编写,专门用于开发AI Agent,支持鸿蒙、Windows、macOS、Linux等系统。
这篇文章剖析一下 CangjieMagic 框架中的 AsyncAgentResponse。
1 类的定义与继承关系
public class AsyncAgentResponse <: Iterator<String> {
// 类的实现...
}
首先我们看到,AsyncAgentResponse
类实现了Iterator<String>
接口。这个设计非常巧妙,就像我们生活中的自来水管道一样,它允许数据像水流一样一点一点地流出来,而不是等到水池装满才一次性倒出。
2 核心成员变量分析
private let chunks: Iterator<String>
private let _content = StringBuilder()
public let execInfo: Option<AgentExecutionInfo>
这个类有三个关键成员变量:
chunks
: 这是一个字符串迭代器,就像一卷正在慢慢展开的画卷,每次只显示一小部分内容。_content
: 一个StringBuilder对象,用来累积所有的内容片段,就像我们记笔记时,一点一点地积累成完整的笔记本。execInfo
: 包含执行信息的可选对象,它记录了Agent执行过程的上下文信息,就像导演手中的剧本,记录着演员该做什么。
3 构造函数解析
public init(chunks: Iterator<String>) {
this.chunks = chunks
this.execInfo = None
}
public init(chunks: Iterator<String>, execInfo!: AgentExecutionInfo) {
this.chunks = chunks
this.execInfo = execInfo
}
类提供了两个构造函数,这就像餐厅提供了标准套餐和豪华套餐两种选择:
- 基础版:只需提供内容块迭代器,执行信息为空
- 高级版:同时提供内容块迭代器和执行信息
4 属性访问器分析
public prop content: String {
get() {
// Consume all chunks
for (_ in this) { }
_content.toString()
}
}
content
属性的获取器做了一件事情:它会消费迭代器中的所有内容块(通过遍历自己),然后返回完整的内容字符串。
这个过程是同步的,会阻塞直到所有内容都获取完毕,注释中也特别强调了这一点。
5 迭代器函数实现
override public func next(): Option<String> {
if (let Some(chunk) <- this.chunks.next()) {
_content.append(chunk)
return chunk
} else {
if (let Some(info) <- this.execInfo) {
info.dialog.addMessage(ChatMessage.assistant(_content.toString()))
}
return None
}
}
next()
函数是实现Iterator
接口的核心,它做了两件事:
-
当还有内容块时:
- 获取下一个内容块
- 将其添加到累积内容中
- 返回该内容块
-
当没有更多内容时:
- 如果有执行信息,则将累积的全部内容作为AI助手的消息添加到对话中
- 返回None表示迭代结束
这就像一个讲故事的人,一段一段地讲述,当故事讲完后,还会把整个故事记录在笔记本中以便回顾。
6 使用场景示例
让我们用一个生活中的例子来理解这个类的用途:
想象你在使用一个AI写作助手,你要求它写一篇文章。传统方式可能需要等待几分钟才能看到完整文章。但使用AsyncAgentResponse
,你可以看到AI一句一句地"写作",就像看着一个真人在你面前写作一样。
7 代码设计亮点
- 流式处理设计:通过实现
Iterator
接口,实现了内容的流式处理,提高了用户体验。 - 状态累积:在流式返回的同时,还在内部累积完整内容,兼顾了实时性和完整性。
- 优雅的对话集成:当迭代结束时,自动将内容添加到对话历史中,简化了开发者的工作。
- Option类型的使用:通过Option类型优雅地处理可能存在也可能不存在的执行信息。
8 小结
AsyncAgentResponse
类是CangjieMagic框架中处理异步Agent响应的核心组件,它通过迭代器模式实现了内容的流式返回,同时保存完整响应用于对话历史记录。这种设计让AI Agent的响应更加自然流畅,就像人类之间的对话一样即时反馈,大大提升了用户体验。