揭秘CangjieMagic拦截器:高效消息处理新法

目录

引言

拦截器的工作原理

使用拦截器实现敏感词检查

结束语


引言

最近一直在学习Cangjie Magic智能体框架的使用,今天分享一下拦截器(Interceptor),在官方的文档中称为“Agent 劫持机制”。

拦截器的工作原理

Agent 拥有可变属性 mut prop interceptor: Interceptor 可用于设置消息处理劫持 Agent。它的定义如下:

enum InterceptorMode {
    | Always
    | Periodic(Int64)
    | Conditional((Request) -> Bool)
}

class Interceptor {
    public init(interceptorAgent: Agent, mode!: InterceptorMode = InterceptorMode.Always)
}

当设置拦截器后,每当原本Agent 接收到消息(以 Request 类型表示)时,如果拦截条件成立,那么该消息将交由劫持 Agent 来处理,而不是原本 Agent 进行处理。有三种劫持模式判别条件是否成立:

  • Always 永远劫持
  • Periodic 周期性地劫持,即原本 Agent 每处理指定数量的消息后,下一条消息将被劫持
  • Conditional 使用判别函数进行判断,如果函数返回 true,则劫持消息

 简单的例子如下:

let ag1 = Foo()
let ag2 = Bar()
ag1.interceptor = Interceptor(ag2, mode: InterceoptorMode.Periodic(2))

ag1.chat("msg 1")
ag1.chat("msg 2")
ag1.chat("msg 3") // ag2 will handle with this request message

这里ag1和ag2 不能是同一个,否则会出现连环触发导致死机。

另外,目前拦截器只在chat函数时工作,不能用于asyncChat。

使用拦截器实现敏感词检查

拦截器中应用最灵活的应该是Conditional 。下面演示一下用拦截器实现敏感词检查。

public class WarningAgent <: BaseAgent {
    public init() {
        super (
            model: unsafe { zeroValue<ChatModel>() }, // will not use model
            name: "Warning Agent",
            description: "This is an agent that generates warning messages"
        )
    }

    override public func chat(request: AgentRequest): AgentResponse {
        return AgentResponse("Question >>> ${request.question}\n 含有敏感词")
    }
}

private func checkFunc(request: AgentRequest) : Bool {
    return request.question.indexOf("一只耳") != None
}

main() {

    let agent = BlackCatAssistant()
    let ag = WarningAgent()
    agent.interceptor = Interceptor(ag, mode: InterceptorMode.Conditional(checkFunc))
    let result = agent.chat("一只耳来啦")
    println(result)
}

这个例子是在官方的入门示例基础上修改的,我们检查到用户输入的单词中有敏感词就拦截原有Agent的执行,返回警告信息。 

程序执行结果如下

结束语

Cangjie Magic框架总体设计还是挺丰富的,基本上涵盖了最常见的各种机制。后面将尝试做一个实际的案例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神一样的老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值