Files
helper/plugins/mention_chat/__init__.py
T
2026-10-15 18:27:46 +08:00

43 lines
2.3 KiB
Python

"""真正艾特机器人后,用本群人格回复当前发言者。"""
from wxbot_framework.dialogue import Dialogue
from wxbot_framework.llm import LLMError
from wxbot_framework.members import SnapshotExpired
from wxbot_framework.personality import personality_text
from wxbot_framework.summary import split_text
class Plugin:
def on_load(self, ctx):
self.members = ctx.members
if not self.members.history_enabled:
raise ValueError("艾特上下文对话需要 history_enabled: true")
ctx.llm # 启动时核对配置,不请求接口。
def on_message(self, message, ctx):
if (message.type != 1 or not message.is_group or message.chat_id not in self.members.groups or
"WXBOT_AT_CHAT_PROBE" in message.text or
message.data.get("bot_generated") or not message.data.get("is_at_self") or
self.members.account not in message.data.get("at_members", ())):
return
personality = ctx.personality(message)
try:
snapshot = self.members.conversation_snapshot(message)
guard = lambda: ctx.response_guard(snapshot, personality)
reply = personality_text(Dialogue(ctx.llm_for(message, personality=personality)).reply(snapshot),
personality.name)
display = self.members.display_name(message.sender_id, message.chat_id) or snapshot.speaker_name
budget = 1023 - len(("@" + display + "\u2005\n").encode("utf-8"))
for part in split_text(reply, byte_limit=budget):
if not ctx.reply_at(message, part, display_name=display, delivery_guard=guard):
raise RuntimeError("原生艾特发送未成功")
ctx.logger.info("艾特对话完成:room=%s persona=%s context=%d", message.chat_id,
personality.name, len(snapshot.messages))
except SnapshotExpired:
ctx.logger.info("艾特对话已取消:记录或人格状态已变更")
except LLMError as error:
ctx.logger.warning("艾特对话失败:%s", error)
try:
ctx.reply(message, "暂时无法回复,请稍后再艾特我。", delivery_guard=guard)
except SnapshotExpired:
pass