@@ -15,10 +15,11 @@ from azure.ai.inference.models import (
ChatCompletionsToolCall ,
)
from azure . core . credentials import AzureKeyCredential
from nonebot import on_command , logger
from nonebot import on_command , on_message , logger
from nonebot . adapters import Message , Event
from nonebot . params import CommandArg
from nonebot . permission import SUPERUSER
from nonebot . rule import Rule , to_me
from nonebot_plugin_alconna import on_alconna , MsgTarget
from nonebot_plugin_alconna . uniseg import UniMessage , UniMsg
import nonebot_plugin_localstore as store
@@ -29,32 +30,43 @@ from .metadata import metadata
from . models import MarshoContext , MarshoTools
from . util import *
async def at_enable ( ) :
return config . marshoai_at
driver = get_driver ( )
changemodel_cmd = on_command ( " changemodel " , permission = SUPERUSER )
resetmem_cmd = on_command ( " reset " )
changemodel_cmd = on_command ( " changemodel " , permission = SUPERUSER , priority = 10 , block = True )
resetmem_cmd = on_command ( " reset " , priority = 10 , block = True )
# setprompt_cmd = on_command("prompt",permission=SUPERUSER)
praises_cmd = on_command ( " praises " , permission = SUPERUSER )
add_usermsg_cmd = on_command ( " usermsg " , permission = SUPERUSER )
add_assistantmsg_cmd = on_command ( " assistantmsg " , permission = SUPERUSER )
contexts_cmd = on_command ( " contexts " , permission = SUPERUSER )
save_context_cmd = on_command ( " savecontext " , permission = SUPERUSER )
load_context_cmd = on_command ( " loadcontext " , permission = SUPERUSER )
praises_cmd = on_command ( " praises " , permission = SUPERUSER , priority = 10 , block = True )
add_usermsg_cmd = on_command ( " usermsg " , permission = SUPERUSER , priority = 10 , block = True )
add_assistantmsg_cmd = on_command ( " assistantmsg " , permission = SUPERUSER , priority = 10 , block = True )
contexts_cmd = on_command ( " contexts " , permission = SUPERUSER , priority = 10 , block = True )
save_context_cmd = on_command ( " savecontext " , permission = SUPERUSER , priority = 10 , block = True )
load_context_cmd = on_command ( " loadcontext " , permission = SUPERUSER , priority = 10 , block = True )
marsho_cmd = on_alconna (
Alconna (
config . marshoai_default_name ,
Args [ " text? " , AllParam ] ,
) ,
aliases = config . marshoai_aliases ,
priority = 10 ,
block = True
)
marsho_at = on_message ( rule = to_me ( ) & at_enable , priority = 11 )
nickname_cmd = on_alconna (
Alconna (
" nickname " ,
Args [ " name? " , str ] ,
)
) ,
priority = 10 ,
block = True
)
refresh_data_cmd = on_command ( " refresh_data " , permission = SUPERUSER )
refresh_data_cmd = on_command ( " refresh_data " , permission = SUPERUSER , priority = 10 , block = True )
command_start = driver . config . command_start
model_name = config . marshoai_default_model
context = MarshoContext ( )
tools = MarshoTools ( )
@@ -63,6 +75,7 @@ endpoint = config.marshoai_azure_endpoint
client = ChatCompletionsClient ( endpoint = endpoint , credential = AzureKeyCredential ( token ) )
target_list = [ ] # 记录需保存历史上下文的列表
@driver.on_startup
async def _preload_tools ( ) :
tools_dir = store . get_plugin_data_dir ( ) / " tools "
@@ -71,6 +84,7 @@ async def _preload_tools():
tools . load_tools ( Path ( __file__ ) . parent / " tools " )
tools . load_tools ( store . get_plugin_data_dir ( ) / " tools " )
@add_usermsg_cmd.handle ( )
async def add_usermsg ( target : MsgTarget , arg : Message = CommandArg ( ) ) :
if msg := arg . extract_plain_text ( ) :
@@ -89,7 +103,7 @@ async def add_assistantmsg(target: MsgTarget, arg: Message = CommandArg()):
@praises_cmd.handle ( )
async def praises ( ) :
#await UniMessage(await tools.call("marshoai-weather.get_weather", {"location":"杭州"})).send()
# await UniMessage(await tools.call("marshoai-weather.get_weather", {"location":"杭州"})).send()
await praises_cmd . finish ( build_praises ( ) )
@@ -114,7 +128,7 @@ async def save_context(target: MsgTarget, arg: Message = CommandArg()):
@load_context_cmd.handle ( )
async def load_context ( target : MsgTarget , arg : Message = CommandArg ( ) ) :
if msg := arg . extract_plain_text ( ) :
await get_backup_context ( target . id , target . private ) # 为了将当前会话添加到"已恢复过备份"的列表而添加, 防止上下文被覆盖( 好奇怪QwQ
await get_backup_context ( target . id , target . private ) # 为了将当前会话添加到"已恢复过备份"的列表而添加, 防止上下文被覆盖( 好奇怪QwQ
context . set_context (
await load_context_from_json ( msg , " contexts " ) , target . id , target . private
)
@@ -160,9 +174,12 @@ async def refresh_data():
await refresh_data_cmd . finish ( " 已刷新数据 " )
@marsho_at.handle ( )
@marsho_cmd.handle ( )
async def marsho ( target : MsgTarget , event : Event , text : Optional [ UniMsg ] = None ) :
global target_list
if event . get_message ( ) . extract_plain_text ( ) and ( not text and event . get_message ( ) . extract_plain_text ( ) != config . marshoai_default_name ) :
text = event . get_message ( )
if not text :
# 发送说明
await UniMessage ( metadata . usage + " \n 当前使用的模型: " + model_name ) . send ( )
@@ -175,9 +192,9 @@ async def marsho(target: MsgTarget, event: Event, text: Optional[UniMsg] = None)
nickname_prompt = f " \n *此消息的说话者: { user_nickname } * "
else :
nickname_prompt = " "
#用户名无法获取,暂时注释
#user_nickname = event.sender.nickname # 未设置昵称时获取用户名
#nickname_prompt = f"\n*此消息的说话者:{user_nickname}"
# 用户名无法获取,暂时注释
# user_nickname = event.sender.nickname # 未设置昵称时获取用户名
# nickname_prompt = f"\n*此消息的说话者:{user_nickname}"
if config . marshoai_enable_nickname_tip :
await UniMessage (
" *你未设置自己的昵称。推荐使用 ' nickname [昵称] ' 命令设置昵称来获得个性化(可能)回答。 "
@@ -242,14 +259,14 @@ async def marsho(target: MsgTarget, event: Event, text: Optional[UniMsg] = None)
response = await make_chat (
client = client ,
model_name = model_name ,
msg = context_msg + [ UserMessage ( content = usermsg ) ] + tool_msg ,
msg = context_msg + [ UserMessage ( content = usermsg ) ] + tool_msg ,
tools = tools . get_tools_list ( )
)
)
choice = response . choices [ 0 ]
context . append (
UserMessage ( content = usermsg ) . as_dict ( ) , target . id , target . private
)
#context.append(tool_msg, target.id, target.private)
# context.append(tool_msg, target.id, target.private)
context . append ( choice . message . as_dict ( ) , target . id , target . private )
await UniMessage ( str ( choice . message . content ) ) . send ( reply_to = True )
except Exception as e :