Compare commits

..
2 Commits
Author SHA1 Message Date
Wbucket d4fd53ed4b dev 2026-11-05 21:40:00 +08:00
Wbucket a892390300 stlyle:context 2026-11-05 16:11:21 +08:00
2 changed files with 65 additions and 4 deletions
+17 -4
View File
@@ -1,9 +1,11 @@
from astrbot.api.event import filter, AstrMessageEvent, MessageEventResult from astrbot.api.event import filter, AstrMessageEvent, MessageEventResult
from astrbot.core.message.message_event_result import MessageChain
from astrbot.api.star import Context, Star, register from astrbot.api.star import Context, Star, register
from astrbot.api import logger from astrbot.api import logger
from astrbot.api.provider import ProviderRequest from astrbot.api.provider import (ProviderRequest,LLMResponse )
from astrbot.core.agent.message import TextPart from astrbot.core.agent.message import TextPart
@register("helloworld", "YourName", "一个简单的 Hello World 插件", "1.0.0") from tool.pattern import Pattern
@register("wait_msg", "Wbucket", "一个简单的 llm等待回复插件", "0.0.1")
class MyPlugin(Star): class MyPlugin(Star):
def __init__(self, context: Context): def __init__(self, context: Context):
super().__init__(context) super().__init__(context)
@@ -13,27 +15,38 @@ class MyPlugin(Star):
# 注册指令的装饰器。指令名为 helloworld。注册成功后,发送 `/helloworld` 就会触发这个指令,并回复 `你好, {user_name}!` # 注册指令的装饰器。指令名为 helloworld。注册成功后,发送 `/helloworld` 就会触发这个指令,并回复 `你好, {user_name}!`
@filter.on_llm_request() @filter.on_llm_request()
async def helloworld(self, event: AstrMessageEvent,req : ProviderRequest): async def content_inject(self, event: AstrMessageEvent,req : ProviderRequest):
"""这是一个 hello world 指令""" # 这是 handler 的描述,将会被解析方便用户了解插件内容。建议填写。 """这是一个 hello world 指令""" # 这是 handler 的描述,将会被解析方便用户了解插件内容。建议填写。
# logger.info("系统提示词:"+req.system_prompt) # logger.info("系统提示词:"+req.system_prompt)
req.extra_user_content_parts.append(TextPart( req.extra_user_content_parts.append(TextPart(
text=( text=(
"-----wt使用----"
"在回复内容中加入<wt>n</wt>模板输入想要等待的时间,n=等待秒数\n" "在回复内容中加入<wt>n</wt>模板输入想要等待的时间,n=等待秒数\n"
"最短2s最长30min(1800s),不添加则正常回复(只有对方回复你才会被唤醒)\n" "最短2s最长30min(1800s),不添加则正常回复(只有对方回复你才会被唤醒)\n"
"例如'<wt>5</wt>'-->等待5秒后再次唤醒.\n" "例如'<wt>5</wt>'-->等待5秒后再次唤醒.\n"
"使用场景:希望对方在多久之后能回你,或者希望这个话题能在短期内继续而不是因为对方的不回复就夭折\n" "使用场景:希望对方在多久之后能回你,或者希望这个话题能在短期内继续而不是因为对方的不回复就夭折\n"
"例如如下场景:\n" "例如如下场景:\n"
"--\n"
"assistant:'你觉得咸粽子好吃韩式甜粽子好吃?<wt>40</wt>'\n" "assistant:'你觉得咸粽子好吃韩式甜粽子好吃?<wt>40</wt>'\n"
"(系统时间:四十秒后,系统定时唤醒)\n" "(系统时间:四十秒后,系统定时唤醒)\n"
"user:'<wt>无回应</wt>'\n" "user:'<wt>无回应</wt>'\n"
"assistant:'你怎么不理我<wt>40</wt>'\n" "assistant:'你怎么不理我<wt>40</wt>'\n"
"(系统时间:二十秒后,用户回复,定时任务取消)\n" "(系统时间:二十秒后,用户回复,定时任务取消)\n"
"user:'抱歉啊刚看到,我觉得咸的好吃awa'" "user:'抱歉啊刚看到,我觉得咸的好吃awa'\n"
"每主动回复消息必须带上wt标签,标签必须闭合且只包裹你要等待的秒数!\n"
"-------"
) )
)) ))
# @filter.event_message_type(filter.EventMessageType.PRIVATE_MESSAGE) # @filter.event_message_type(filter.EventMessageType.PRIVATE_MESSAGE)
# async def awa(self,event:AstrMessageEvent): # async def awa(self,event:AstrMessageEvent):
# yield event.plain_result(event.get_message_str()) # yield event.plain_result(event.get_message_str())
@filter.on_llm_response()
async def pattern_extract(self,event:AstrMessageEvent,req:LLMResponse):
if not req.role == 'assistant':
return
llm_res = req.completion_text
dump = Pattern(llm_res)
await event.send(MessageChain().message("awa定时时间消息:{0}过滤后:{1}".format(dump.count,dump.string)))
async def terminate(self): async def terminate(self):
"""可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。""" """可选择实现异步的插件销毁方法,当插件被卸载/停用时会调用。"""
+48
View File
@@ -0,0 +1,48 @@
import re
class Pattern:
_pattern = r'<wt>((?!wt).)*</wt>'
_MAX_SEC = 1800
_MIN_SEC = 10
# 定义最大与最小的范围,固定输入的规范
def __init__(self,o_str:str) -> None:
res = self.extract(o_str)
self.count:int|None = res['second']
self.string:str = res["content"]
def sec_range(self,i)->int:
if i > Pattern._MAX_SEC:
return Pattern._MAX_SEC
if i < Pattern._MIN_SEC :
return Pattern._MIN_SEC
return i
def load(self,pattern_str:str)->int|None:
content = pattern_str.strip().removeprefix("<wt>").removesuffix("</wt>").strip()
print(content)
try:
num = int(content)
return self.sec_range(num)
except:
return None
def extract(self,o_str:str):
# 多次匹配防止重复模板
timerSec :None|int = None
res=re.finditer(Pattern._pattern,o_str)
for i in res :
# 对结果和源字符串处理
o_str = o_str.replace(i.group(),"",1)
num = self.load(i.group())
if num and timerSec:
timerSec = num
#消除不完整/非法模板
o_str= o_str.replace("<wt>","")
o_str=o_str.replace("</wt>","")
return {
"content":o_str,
"second":timerSec
}