diff --git a/nonebot_plugin_marshoai/__init__.py b/nonebot_plugin_marshoai/__init__.py index d5dc923..228a0cf 100755 --- a/nonebot_plugin_marshoai/__init__.py +++ b/nonebot_plugin_marshoai/__init__.py @@ -26,17 +26,19 @@ from nonebot.plugin import require require("nonebot_plugin_alconna") require("nonebot_plugin_localstore") +require("nonebot_plugin_argot") import nonebot_plugin_localstore as store # type: ignore from nonebot import get_driver, logger # type: ignore from .config import config - -# from .hunyuan import * from .dev import * from .marsho import * from .metadata import metadata +# from .hunyuan import * + + __author__ = "Asankilp" __plugin_meta__ = metadata diff --git a/nonebot_plugin_marshoai/dev.py b/nonebot_plugin_marshoai/dev.py index 91bdaf6..956fc30 100644 --- a/nonebot_plugin_marshoai/dev.py +++ b/nonebot_plugin_marshoai/dev.py @@ -1,15 +1,16 @@ import os from pathlib import Path -from nonebot import get_driver, logger, require +from nonebot import get_driver, logger, on_command, require from nonebot.adapters import Bot, Event from nonebot.matcher import Matcher from nonebot.typing import T_State +from nonebot_plugin_argot import add_argot, get_message_id from nonebot_plugin_marshoai.plugin.load import reload_plugin from .config import config -from .marsho import context +from .instances import context from .plugin.func_call.models import SessionContext require("nonebot_plugin_alconna") @@ -48,6 +49,21 @@ function_call = on_alconna( permission=SUPERUSER, ) +argot_test = on_command("argot", permission=SUPERUSER) + + +@argot_test.handle() +async def _(): + await argot_test.send( + "aa", + argot={ + "name": "test", + "command": "test", + "segment": f"{os.getcwd()}", + "expired_at": 1000, + }, + ) + @function_call.assign("list") async def list_functions(): diff --git a/nonebot_plugin_marshoai/handler.py b/nonebot_plugin_marshoai/handler.py index afa1704..a47e409 100644 --- a/nonebot_plugin_marshoai/handler.py +++ b/nonebot_plugin_marshoai/handler.py @@ -1,4 +1,5 @@ import json +from datetime import timedelta from typing import Optional, Tuple, Union from azure.ai.inference.models import ( @@ -17,7 +18,13 @@ from nonebot.matcher import ( current_event, current_matcher, ) -from nonebot_plugin_alconna.uniseg import UniMessage, UniMsg, get_message_id, get_target +from nonebot_plugin_alconna.uniseg import ( + Text, + UniMessage, + UniMsg, + get_target, +) +from nonebot_plugin_argot import Argot # type: ignore from openai import AsyncOpenAI, AsyncStream from openai.types.chat import ChatCompletion, ChatCompletionChunk, ChatCompletionMessage @@ -35,7 +42,7 @@ from .util import ( make_chat_openai, parse_richtext, ) -from .utils.processor import process_chat_stream +from .utils.processor import process_chat_stream, process_completion_to_details class MarshoHandler: @@ -230,12 +237,28 @@ class MarshoHandler: target_list.append([self.target.id, self.target.private]) # 对话成功发送消息 + send_message = UniMessage() if config.marshoai_enable_richtext_parse: - await (await parse_richtext(str(choice_msg_content))).send( - reply_to=True - ) + send_message = await parse_richtext(str(choice_msg_content)) else: - await UniMessage(str(choice_msg_content)).send(reply_to=True) + send_message = UniMessage(str(choice_msg_content)) + send_message.append( + Argot( + "detail", + Text(await process_completion_to_details(response)), + command="detail", + expired_at=timedelta(minutes=5), + ) + ) + # send_message.append( + # Argot( + # "debug", + # Text(str(response)), + # command=f"debug", + # expired_at=timedelta(minutes=5), + # ) + # ) + await send_message.send(reply_to=True) return UserMessage(content=user_message), choice_msg_after elif choice.finish_reason == CompletionsFinishReason.CONTENT_FILTERED: diff --git a/nonebot_plugin_marshoai/marsho.py b/nonebot_plugin_marshoai/marsho.py index e3556aa..241d4ee 100644 --- a/nonebot_plugin_marshoai/marsho.py +++ b/nonebot_plugin_marshoai/marsho.py @@ -23,6 +23,7 @@ from nonebot_plugin_alconna import ( message_reaction, on_alconna, ) +from nonebot_plugin_argot.extension import ArgotExtension # type: ignore from .config import config from .constants import INTRODUCTION, SUPPORT_IMAGE_MODELS @@ -63,6 +64,7 @@ marsho_cmd = on_alconna( aliases=tuple(config.marshoai_aliases), priority=96, block=True, + extensions=[ArgotExtension()], ) resetmem_cmd = on_alconna( Alconna( diff --git a/nonebot_plugin_marshoai/utils/processor.py b/nonebot_plugin_marshoai/utils/processor.py index ae83d11..8d49835 100644 --- a/nonebot_plugin_marshoai/utils/processor.py +++ b/nonebot_plugin_marshoai/utils/processor.py @@ -16,7 +16,7 @@ async def process_chat_stream( last_chunk = chunk # print(chunk) if not is_first_token_appeared: - logger.debug(f"{chunk.id}: 第一个 token 已出现") + logger.info(f"{chunk.id}: 第一个 token 已出现") is_first_token_appeared = True if not chunk.choices: logger.info("Usage:", chunk.usage) @@ -29,7 +29,7 @@ async def process_chat_stream( reasoning_contents += delta.reasoning_content else: if not is_answering: - logger.debug( + logger.info( f"{chunk.id}: 思维链已输出完毕或无 reasoning_content 字段输出" ) is_answering = True @@ -69,3 +69,19 @@ async def process_chat_stream( object="chat.completion", usage=None, ) + + +async def process_completion_to_details(completion: ChatCompletion) -> str: + usage_text = "" + usage = completion.usage + if usage is None: + usage_text = "无" + else: + usage_text = str(usage) + + details_text = f"""=========消息详情========= + 模型: {completion.model} + 消息 ID: {completion.id} + 用量信息: {usage_text}""" + # print(details_text) + return details_text diff --git a/pdm.lock b/pdm.lock index a4b3650..2f506ec 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev", "test"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:9dd3edfe69c332deac360af2685358e82c5dac0870900668534fc6f1d34040f8" +content_hash = "sha256:6aa043fb1d2d4d384e0d0c698c02a27f22e099828d2973a4baef05c5316f4ee0" [[metadata.targets]] requires_python = "~=3.10" @@ -1519,9 +1519,27 @@ files = [ {file = "nonebot_plugin_apscheduler-0.5.0.tar.gz", hash = "sha256:6c0230e99765f275dc83d6639ff33bd6f71203fa10cd1b8a204b0f95530cda86"}, ] +[[package]] +name = "nonebot-plugin-argot" +version = "0.1.7" +requires_python = ">=3.10" +summary = "NoneBot 暗语" +groups = ["default"] +dependencies = [ + "aiofiles>=24.1.0", + "nonebot-plugin-alconna>=0.51.1", + "nonebot-plugin-apscheduler>=0.5.0", + "nonebot-plugin-localstore>=0.7.4", + "nonebot2>=2.3.2", +] +files = [ + {file = "nonebot_plugin_argot-0.1.7-py3-none-any.whl", hash = "sha256:1af939a60967e27aff6f7ce97150d26cba8f1ef0cf216b44372cc0d8e5937204"}, + {file = "nonebot_plugin_argot-0.1.7.tar.gz", hash = "sha256:f76c2139c9af1e2de6efdc487b728fbad84737d272bf1f600d085bbe6ed79094"}, +] + [[package]] name = "nonebot-plugin-localstore" -version = "0.7.3" +version = "0.7.4" requires_python = "<4.0,>=3.9" summary = "Local Storage Support for NoneBot2" groups = ["default"] @@ -1532,8 +1550,8 @@ dependencies = [ "typing-extensions<5.0.0,>=4.0.0", ] files = [ - {file = "nonebot_plugin_localstore-0.7.3-py3-none-any.whl", hash = "sha256:1bc239b4b5320df0dc08eada7c4f8ba4cb92d4dc3134bf4646ab5e297bd7e575"}, - {file = "nonebot_plugin_localstore-0.7.3.tar.gz", hash = "sha256:1aff10e2dacfc5bc9ce239fd34849f8d7172a118135dbc5aeba1c97605d9959d"}, + {file = "nonebot_plugin_localstore-0.7.4-py3-none-any.whl", hash = "sha256:3b08030878eadcdd8b9ce3d079da0dc2d0e41dc91f0b2d8cf7fa862a27de9090"}, + {file = "nonebot_plugin_localstore-0.7.4.tar.gz", hash = "sha256:85ddc13814bfcd484ab311306823651390020bf44f4fb4733b343a58e72723ce"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 57d9167..878b596 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ authors = [ ] dependencies = [ "nonebot2>=2.4.0", - "nonebot-plugin-alconna>=0.57.0", + "nonebot-plugin-alconna>=0.57.1", "nonebot-plugin-localstore>=0.7.1", "zhDatetime>=2.0.0", "aiohttp>=3.9", @@ -28,7 +28,8 @@ dependencies = [ "azure-ai-inference>=1.0.0b6", "watchdog>=6.0.0", "nonebot-plugin-apscheduler>=0.5.0", - "openai>=1.58.1" + "openai>=1.58.1", + "nonebot-plugin-argot>=0.1.7" ] license = { text = "MIT, Mulan PSL v2" }