消息读取
ChatLuna 是在 Koishi 下的插件。Koishi 作为一个聊天机器人框架,自身也有一套消息元素的机制。
为了让 LLM 能够正确理解各种消息元素(如@提及、表情、图片等),ChatLuna 提供了一个消息转换机制,将这些元素转换为文本形式。
用法
在 messageTransformer 中添加消息转换器即可:
ts
import { ChatLunaPlugin } from 'koishi-plugin-chatluna/services/chat'
import { Context, Schema } from 'koishi'
import { Message } from 'koishi-plugin-chatluna'
import { MessageContent, MessageContentComplex } from '@langchain/core/messages'
const dispose = ctx.chatluna.messageTransformer.intercept(
'at',
async (session, element, message) => {
const name = element.attrs['name']
const id = element.attrs['id']
if (id !== session.bot.selfId) {
addMessageContent(
message,
`<at ${name != null ? `name="${name}"` : ''} id="${id}"/>`
)
}
}
)
ctx.effect(() => dispose)
function addMessageContent(message: Message, content: MessageContent) {
if (typeof message.content === 'string' && typeof content === 'string') {
message.content += content
return
}
message.content = [
...(typeof message.content === 'string'
? [{ type: 'text', text: message.content }]
: message.content),
...(typeof content === 'string'
? [{ type: 'text', text: content }]
: content)
]
}需要注意的是,message.content 的类型为 string | MessageContentComplex。我们需要判断类型并具体处理。
一般直接参考上面的 addMessageContent 函数处理即可。
API 参考
intercept 方法接收两个参数:
type: string- 消息元素的类型,支持的类型请参考 Koishi 文档。handler: (session, element, message) => Promise<void>- 处理函数,包含:session: 当前的 会话对象element: 当前的 消息元素对象message: 当前的 ChatLuna 消息对象
返回值 () => void 用于清理资源。
建议使用 ctx.effect(() => dispose) 确保资源被正确释放。