Skip to content

消息读取

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 方法接收两个参数:

返回值 () => void 用于清理资源。

建议使用 ctx.effect(() => dispose) 确保资源被正确释放。

页面历史

在 CC-BY-SA-4.0 许可下发布