CangjieMagic框架:使用华为仓颉编程语言编写,专门用于开发AI Agent,支持鸿蒙、Windows、macOS、Linux等系统。
这篇文章剖析一下 CangjieMagic 框架中的 Interceptor。
1 Interceptor类的整体介绍
首先,让我们看一下interceptor.cj文件的整体结构。这个文件定义了Interceptor
类,它位于magic.core.agent
包中。这个类的主要作用是什么呢?简单来说,它就像是在Agent和用户之间设置的一个"关卡",可以根据不同的条件决定是否要拦截用户的请求。
2 类的成员变量分析
让我们来看看这个类有哪些成员变量:
agent: Agent
- 这是被拦截器包装的Agent对象mode: InterceptorMode
- 拦截模式,决定何时拦截请求numOfBypass: Int
- 记录已经跳过(未拦截)的请求数量
3 构造函数解析
public init(agent: Agent, mode!: InterceptorMode = InterceptorMode.Always) {
this.agent = agent
this.mode = mode
}
构造函数接收两个参数:
agent
:被拦截的Agent对象mode
:拦截模式,默认为InterceptorMode.Always
(总是拦截)
4 核心成员函数解析
4.1 shouldIntercept函数
protected func shouldIntercept(request: AgentRequest): Bool {
match (mode) {
case InterceptorMode.Always => return true
case InterceptorMode.Periodic(freq) => return numOfBypass >= freq
case InterceptorMode.Conditional(fn) => return fn(request)
}
}
这个函数决定是否应该拦截请求,根据不同的模式有不同的判断逻辑:
Always
模式:总是返回true
,即总是拦截Periodic
模式:当跳过的请求数量达到指定频率(freq
)时拦截Conditional
模式:使用传入的函数(fn
)对请求进行评估,决定是否拦截
这就像交通警察,可以选择"总是拦车检查"、“每10辆车拦一辆"或者"看车的状态决定是否拦”。
4.2 doIntercept函数
protected func doIntercept(request: AgentRequest): AgentResponse {
// Each time intercepting a request, the number of bypassed requests is reset
numOfBypass = 0
return agent.chat(request)
}
当决定拦截请求时,这个函数会被调用:
- 重置跳过请求的计数器
- 将请求转发给agent处理
- 返回agent的响应
4.3 doBypass函数
protected func doBypass(_request: AgentRequest) {
numOfBypass += 1
}
当决定不拦截请求时,这个函数会被调用,它只是简单地增加跳过请求的计数。
5 实际应用场景
让我们来看几个实际应用的例子:
- 日志记录:可以使用
Always
模式拦截所有请求,记录用户与Agent的所有交互。 - 性能采样:使用
Periodic
模式,比如每10次请求采样一次,计算响应时间。 - 内容过滤:使用
Conditional
模式,检查用户输入是否包含敏感词,如果有则交给特殊的Agent处理。 - 负载均衡:根据系统负载动态决定是将请求发送给主Agent还是备用Agent。
6 拦截器的工作流程
我们可以用以下流程图来理解拦截器的工作方式:
7 总结
Interceptor
类是CangjieMagic框架中实现Agent请求拦截的核心类,它提供了灵活的拦截策略,可以根据不同的场景进行配置。通过拦截器,我们可以实现请求的过滤、转发、日志记录等功能,是构建复杂AI Agent系统的重要组件。
就像在我们的日常生活中,有时候你打电话给客服,可能会先经过一个智能机器人的筛选,然后再决定是直接回答你的问题,还是转接给人工客服。这个智能机器人就相当于我们这里的拦截器,它根据不同的规则决定如何处理你的请求。