"""真正艾特机器人后,用本群人格回复当前发言者。""" 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