From d4846e4827a29bc7b3fc4fadf20ae1a12ae422f4 Mon Sep 17 00:00:00 2001 From: Asankilp <60691961+Asankilp@users.noreply.github.com> Date: Fri, 31 Jan 2025 10:24:30 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20docs=20from=20@=20LiteyukiStud?= =?UTF-8?q?io/nonebot-plugin-marshoai@42bed6aecad51c23ab013575137ed3ebadbe?= =?UTF-8?q?31d9=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 2 +- ...52ceE.js => dev_api_marsho.md.dF_hdEOQ.js} | 49 ++++++++-------- ....js => dev_api_marsho.md.dF_hdEOQ.lean.js} | 0 ...EQOfWcm.js => dev_api_util.md.pVwI72e6.js} | 52 ++++++++++------- ...an.js => dev_api_util.md.pVwI72e6.lean.js} | 2 +- ...6C.js => en_dev_api_marsho.md.D_PLwYjH.js} | 49 ++++++++-------- ... => en_dev_api_marsho.md.D_PLwYjH.lean.js} | 0 ...TsJK.js => en_dev_api_util.md.C6FjM-fz.js} | 52 ++++++++++------- ...js => en_dev_api_util.md.C6FjM-fz.lean.js} | 2 +- dev/api/azure.html | 2 +- dev/api/azure_onebot.html | 2 +- dev/api/config.html | 2 +- dev/api/constants.html | 2 +- dev/api/deal_latex.html | 2 +- dev/api/dev.html | 2 +- dev/api/hooks.html | 2 +- dev/api/hunyuan.html | 2 +- dev/api/index.html | 2 +- dev/api/instances.html | 2 +- dev/api/marsho.html | 53 +++++++++--------- dev/api/marsho_onebot.html | 2 +- dev/api/metadata.html | 2 +- dev/api/models.html | 2 +- dev/api/observer.html | 2 +- dev/api/plugin/func_call/caller.html | 2 +- dev/api/plugin/func_call/index.html | 2 +- dev/api/plugin/func_call/models.html | 2 +- dev/api/plugin/func_call/params.html | 2 +- dev/api/plugin/func_call/utils.html | 2 +- dev/api/plugin/index.html | 2 +- dev/api/plugin/load.html | 2 +- dev/api/plugin/models.html | 2 +- dev/api/plugin/register.html | 2 +- dev/api/plugin/typing.html | 2 +- dev/api/plugin/utils.html | 2 +- dev/api/plugins/builtin_tools/chat.html | 2 +- dev/api/plugins/builtin_tools/file_io.html | 2 +- dev/api/plugins/builtin_tools/index.html | 2 +- dev/api/plugins/builtin_tools/liteyuki.html | 2 +- dev/api/plugins/builtin_tools/manager.html | 2 +- dev/api/plugins/builtin_tools/network.html | 2 +- dev/api/plugins/builtin_tools/utils.html | 2 +- dev/api/plugins/marshoai_bangumi/index.html | 2 +- dev/api/plugins/marshoai_basic/index.html | 2 +- dev/api/plugins/twisuki_megakits/index.html | 2 +- .../twisuki_megakits/mk_morse_code.html | 2 +- .../plugins/twisuki_megakits/mk_nya_code.html | 2 +- dev/api/plugins/twisuki_petcat/index.html | 2 +- dev/api/plugins/twisuki_petcat/pc_cat.html | 2 +- dev/api/plugins/twisuki_petcat/pc_info.html | 2 +- dev/api/plugins/twisuki_petcat/pc_shop.html | 2 +- dev/api/plugins/twisuki_petcat/pc_token.html | 2 +- .../plugins_test/marshoai_basic/index.html | 2 +- .../plugins_test/marshoai_memory/command.html | 2 +- .../plugins_test/marshoai_memory/config.html | 2 +- .../plugins_test/marshoai_memory/index.html | 2 +- .../plugins_test/random_number_generator.html | 2 +- .../snowykami_testplugin/index.html | 2 +- dev/api/plugins_test/weather_demo.html | 2 +- dev/api/tools/marshoai_bangumi/index.html | 2 +- dev/api/tools/marshoai_basic/index.html | 2 +- dev/api/tools/marshoai_megakits/index.html | 2 +- .../tools/marshoai_megakits/mk_common.html | 2 +- dev/api/tools/marshoai_megakits/mk_info.html | 2 +- .../marshoai_megakits/mk_morse_code.html | 2 +- .../tools/marshoai_megakits/mk_nya_code.html | 2 +- dev/api/tools/marshoai_memory/index.html | 2 +- dev/api/tools/marshoai_meogirl/index.html | 2 +- dev/api/tools/marshoai_meogirl/mg_info.html | 2 +- .../tools/marshoai_meogirl/mg_introduce.html | 2 +- dev/api/tools/marshoai_meogirl/mg_search.html | 2 +- dev/api/tools_wip/marshoai_memory/index.html | 2 +- dev/api/util.html | 56 +++++++++++-------- dev/api/util_hunyuan.html | 2 +- dev/extension.html | 2 +- dev/index.html | 2 +- dev/project.html | 2 +- en/dev/api/azure.html | 2 +- en/dev/api/azure_onebot.html | 2 +- en/dev/api/config.html | 2 +- en/dev/api/constants.html | 2 +- en/dev/api/deal_latex.html | 2 +- en/dev/api/dev.html | 2 +- en/dev/api/hooks.html | 2 +- en/dev/api/hunyuan.html | 2 +- en/dev/api/index.html | 2 +- en/dev/api/instances.html | 2 +- en/dev/api/marsho.html | 53 +++++++++--------- en/dev/api/marsho_onebot.html | 2 +- en/dev/api/metadata.html | 2 +- en/dev/api/models.html | 2 +- en/dev/api/observer.html | 2 +- en/dev/api/plugin/func_call/caller.html | 2 +- en/dev/api/plugin/func_call/index.html | 2 +- en/dev/api/plugin/func_call/models.html | 2 +- en/dev/api/plugin/func_call/params.html | 2 +- en/dev/api/plugin/func_call/utils.html | 2 +- en/dev/api/plugin/index.html | 2 +- en/dev/api/plugin/load.html | 2 +- en/dev/api/plugin/models.html | 2 +- en/dev/api/plugin/register.html | 2 +- en/dev/api/plugin/typing.html | 2 +- en/dev/api/plugin/utils.html | 2 +- en/dev/api/plugins/builtin_tools/chat.html | 2 +- en/dev/api/plugins/builtin_tools/file_io.html | 2 +- en/dev/api/plugins/builtin_tools/index.html | 2 +- .../api/plugins/builtin_tools/liteyuki.html | 2 +- en/dev/api/plugins/builtin_tools/manager.html | 2 +- en/dev/api/plugins/builtin_tools/network.html | 2 +- en/dev/api/plugins/builtin_tools/utils.html | 2 +- .../api/plugins/marshoai_bangumi/index.html | 2 +- en/dev/api/plugins/marshoai_basic/index.html | 2 +- .../api/plugins/twisuki_megakits/index.html | 2 +- .../twisuki_megakits/mk_morse_code.html | 2 +- .../plugins/twisuki_megakits/mk_nya_code.html | 2 +- en/dev/api/plugins/twisuki_petcat/index.html | 2 +- en/dev/api/plugins/twisuki_petcat/pc_cat.html | 2 +- .../api/plugins/twisuki_petcat/pc_info.html | 2 +- .../api/plugins/twisuki_petcat/pc_shop.html | 2 +- .../api/plugins/twisuki_petcat/pc_token.html | 2 +- .../plugins_test/marshoai_basic/index.html | 2 +- .../plugins_test/marshoai_memory/command.html | 2 +- .../plugins_test/marshoai_memory/config.html | 2 +- .../plugins_test/marshoai_memory/index.html | 2 +- .../plugins_test/random_number_generator.html | 2 +- .../snowykami_testplugin/index.html | 2 +- en/dev/api/plugins_test/weather_demo.html | 2 +- en/dev/api/tools/marshoai_bangumi/index.html | 2 +- en/dev/api/tools/marshoai_basic/index.html | 2 +- en/dev/api/tools/marshoai_megakits/index.html | 2 +- .../tools/marshoai_megakits/mk_common.html | 2 +- .../api/tools/marshoai_megakits/mk_info.html | 2 +- .../marshoai_megakits/mk_morse_code.html | 2 +- .../tools/marshoai_megakits/mk_nya_code.html | 2 +- en/dev/api/tools/marshoai_memory/index.html | 2 +- en/dev/api/tools/marshoai_meogirl/index.html | 2 +- .../api/tools/marshoai_meogirl/mg_info.html | 2 +- .../tools/marshoai_meogirl/mg_introduce.html | 2 +- .../api/tools/marshoai_meogirl/mg_search.html | 2 +- .../api/tools_wip/marshoai_memory/index.html | 2 +- en/dev/api/util.html | 56 +++++++++++-------- en/dev/api/util_hunyuan.html | 2 +- en/dev/index.html | 2 +- en/index.html | 2 +- en/start/index.html | 2 +- en/start/install.html | 2 +- hashmap.json | 2 +- index.html | 2 +- ja/index.html | 2 +- start/index.html | 2 +- start/install-old.html | 2 +- start/install.html | 2 +- start/use.html | 2 +- 153 files changed, 375 insertions(+), 331 deletions(-) rename assets/{dev_api_marsho.md.d9w52ceE.js => dev_api_marsho.md.dF_hdEOQ.js} (95%) rename assets/{dev_api_marsho.md.d9w52ceE.lean.js => dev_api_marsho.md.dF_hdEOQ.lean.js} (100%) rename assets/{dev_api_util.md.BEQOfWcm.js => dev_api_util.md.pVwI72e6.js} (89%) rename assets/{dev_api_util.md.BEQOfWcm.lean.js => dev_api_util.md.pVwI72e6.lean.js} (85%) rename assets/{en_dev_api_marsho.md.B2G3bD6C.js => en_dev_api_marsho.md.D_PLwYjH.js} (95%) rename assets/{en_dev_api_marsho.md.B2G3bD6C.lean.js => en_dev_api_marsho.md.D_PLwYjH.lean.js} (100%) rename assets/{en_dev_api_util.md.BNGDTsJK.js => en_dev_api_util.md.C6FjM-fz.js} (89%) rename assets/{en_dev_api_util.md.BNGDTsJK.lean.js => en_dev_api_util.md.C6FjM-fz.lean.js} (85%) diff --git a/404.html b/404.html index c8d21d0f..c09398f9 100644 --- a/404.html +++ b/404.html @@ -17,7 +17,7 @@
- + \ No newline at end of file diff --git a/assets/dev_api_marsho.md.d9w52ceE.js b/assets/dev_api_marsho.md.dF_hdEOQ.js similarity index 95% rename from assets/dev_api_marsho.md.d9w52ceE.js rename to assets/dev_api_marsho.md.dF_hdEOQ.js index 02f7dd5e..307514b4 100644 --- a/assets/dev_api_marsho.md.d9w52ceE.js +++ b/assets/dev_api_marsho.md.dF_hdEOQ.js @@ -1,32 +1,32 @@ -import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const d=JSON.parse('{"title":"marsho","description":"","frontmatter":{"title":"marsho","order":100},"headers":[],"relativePath":"dev/api/marsho.md","filePath":"zh/dev/api/marsho.md","lastUpdated":null}'),t={name:"dev/api/marsho.md"};function k(l,s,e,p,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`

模块 nonebot_plugin_marshoai.marsho


async func at_enable()

源代码在GitHub上查看
python
async def at_enable():
-    return config.marshoai_at

@add_usermsg_cmd.handle()

async func add_usermsg(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@add_usermsg_cmd.handle()
+import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const d=JSON.parse('{"title":"marsho","description":"","frontmatter":{"title":"marsho","order":100},"headers":[],"relativePath":"dev/api/marsho.md","filePath":"zh/dev/api/marsho.md","lastUpdated":null}'),t={name:"dev/api/marsho.md"};function k(l,s,e,p,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`

模块 nonebot_plugin_marshoai.marsho


async func at_enable()

源代码在GitHub上查看
python
async def at_enable():
+    return config.marshoai_at

@add_usermsg_cmd.handle()

async func add_usermsg(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@add_usermsg_cmd.handle()
 async def add_usermsg(target: MsgTarget, arg: Message=CommandArg()):
     if (msg := arg.extract_plain_text()):
         context.append(UserMessage(content=msg).as_dict(), target.id, target.private)
-        await add_usermsg_cmd.finish('已添加用户消息')

@add_assistantmsg_cmd.handle()

async func add_assistantmsg(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@add_assistantmsg_cmd.handle()
+        await add_usermsg_cmd.finish('已添加用户消息')

@add_assistantmsg_cmd.handle()

async func add_assistantmsg(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@add_assistantmsg_cmd.handle()
 async def add_assistantmsg(target: MsgTarget, arg: Message=CommandArg()):
     if (msg := arg.extract_plain_text()):
         context.append(AssistantMessage(content=msg).as_dict(), target.id, target.private)
-        await add_assistantmsg_cmd.finish('已添加助手消息')

@praises_cmd.handle()

async func praises()

源代码在GitHub上查看
python
@praises_cmd.handle()
+        await add_assistantmsg_cmd.finish('已添加助手消息')

@praises_cmd.handle()

async func praises()

源代码在GitHub上查看
python
@praises_cmd.handle()
 async def praises():
-    await praises_cmd.finish(build_praises())

@contexts_cmd.handle()

async func contexts(target: MsgTarget)

源代码在GitHub上查看
python
@contexts_cmd.handle()
+    await praises_cmd.finish(build_praises())

@contexts_cmd.handle()

async func contexts(target: MsgTarget)

源代码在GitHub上查看
python
@contexts_cmd.handle()
 async def contexts(target: MsgTarget):
     backup_context = await get_backup_context(target.id, target.private)
     if backup_context:
         context.set_context(backup_context, target.id, target.private)
-    await contexts_cmd.finish(str(context.build(target.id, target.private)))

@save_context_cmd.handle()

async func save_context(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@save_context_cmd.handle()
+    await contexts_cmd.finish(str(context.build(target.id, target.private)))

@save_context_cmd.handle()

async func save_context(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@save_context_cmd.handle()
 async def save_context(target: MsgTarget, arg: Message=CommandArg()):
     contexts_data = context.build(target.id, target.private)
     if not context:
         await save_context_cmd.finish('暂无上下文可以保存')
     if (msg := arg.extract_plain_text()):
         await save_context_to_json(msg, contexts_data, 'contexts')
-        await save_context_cmd.finish('已保存上下文')

@load_context_cmd.handle()

async func load_context(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@load_context_cmd.handle()
+        await save_context_cmd.finish('已保存上下文')

@load_context_cmd.handle()

async func load_context(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@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)
         context.set_context(await load_context_from_json(msg, 'contexts'), target.id, target.private)
-        await load_context_cmd.finish('已加载并覆盖上下文')

@resetmem_cmd.handle()

async func resetmem(target: MsgTarget)

源代码在GitHub上查看
python
@resetmem_cmd.handle()
+        await load_context_cmd.finish('已加载并覆盖上下文')

@resetmem_cmd.handle()

async func resetmem(target: MsgTarget)

源代码在GitHub上查看
python
@resetmem_cmd.handle()
 async def resetmem(target: MsgTarget):
     if [target.id, target.private] not in target_list:
         target_list.append([target.id, target.private])
@@ -34,12 +34,12 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const d
     if backup_context:
         context.set_context(backup_context, target.id, target.private)
     context.reset(target.id, target.private)
-    await resetmem_cmd.finish('上下文已重置')

@changemodel_cmd.handle()

async func changemodel(arg: Message = CommandArg())

源代码在GitHub上查看
python
@changemodel_cmd.handle()
+    await resetmem_cmd.finish('上下文已重置')

@changemodel_cmd.handle()

async func changemodel(arg: Message = CommandArg())

源代码在GitHub上查看
python
@changemodel_cmd.handle()
 async def changemodel(arg: Message=CommandArg()):
     global model_name
     if (model := arg.extract_plain_text()):
         model_name = model
-        await changemodel_cmd.finish('已切换')

@nickname_cmd.handle()

async func nickname(event: Event, name = None)

源代码在GitHub上查看
python
@nickname_cmd.handle()
+        await changemodel_cmd.finish('已切换')

@nickname_cmd.handle()

async func nickname(event: Event, name = None)

源代码在GitHub上查看
python
@nickname_cmd.handle()
 async def nickname(event: Event, name=None):
     nicknames = await get_nicknames()
     user_id = event.get_user_id()
@@ -54,15 +54,15 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const d
         if len(name) > config.marshoai_nickname_limit:
             await nickname_cmd.finish('昵称超出长度限制:' + str(config.marshoai_nickname_limit))
         await set_nickname(user_id, name)
-        await nickname_cmd.finish('已设置昵称为:' + name)

@refresh_data_cmd.handle()

async func refresh_data()

源代码在GitHub上查看
python
@refresh_data_cmd.handle()
+        await nickname_cmd.finish('已设置昵称为:' + name)

@refresh_data_cmd.handle()

async func refresh_data()

源代码在GitHub上查看
python
@refresh_data_cmd.handle()
 async def refresh_data():
     await refresh_nickname_json()
     await refresh_praises_json()
-    await refresh_data_cmd.finish('已刷新数据')

@marsho_help_cmd.handle()

async func marsho_help()

源代码在GitHub上查看
python
@marsho_help_cmd.handle()
+    await refresh_data_cmd.finish('已刷新数据')

@marsho_help_cmd.handle()

async func marsho_help()

源代码在GitHub上查看
python
@marsho_help_cmd.handle()
 async def marsho_help():
-    await marsho_help_cmd.finish(metadata.usage)

@marsho_status_cmd.handle()

async func marsho_status(bot: Bot)

源代码在GitHub上查看
python
@marsho_status_cmd.handle()
+    await marsho_help_cmd.finish(metadata.usage)

@marsho_status_cmd.handle()

async func marsho_status(bot: Bot)

源代码在GitHub上查看
python
@marsho_status_cmd.handle()
 async def marsho_status(bot: Bot):
-    await marsho_status_cmd.finish(f'当前适配器:{bot.adapter.get_name()}\\n当前使用的模型:{model_name}\\n当前支持图片的模型:{str(SUPPORT_IMAGE_MODELS + config.marshoai_additional_image_models)}')

@marsho_at.handle()@marsho_cmd.handle()

async func marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg] = None)

源代码在GitHub上查看
python
@marsho_at.handle()
+    await marsho_status_cmd.finish(f'当前适配器:{bot.adapter.get_name()}\\n当前使用的模型:{model_name}\\n当前支持图片的模型:{str(SUPPORT_IMAGE_MODELS + config.marshoai_additional_image_models)}')

@marsho_at.handle()@marsho_cmd.handle()

async func marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg] = None)

源代码在GitHub上查看
python
@marsho_at.handle()
 @marsho_cmd.handle()
 async def marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg]=None):
     global target_list
@@ -105,7 +105,7 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const d
         if not is_reasoning_model:
             context_msg = [get_prompt()] + context_msg
         tools_lists = tools.tools_list + list(map(lambda v: v.data(), get_function_calls().values()))
-        logger.debug(f'正在获取回答,模型:{model_name}')
+        logger.info(f'正在获取回答,模型:{model_name}')
         response = await make_chat_openai(client=client, model_name=model_name, msg=context_msg + [UserMessage(content=usermsg).as_dict()], tools=tools_lists if tools_lists else None)
         choice = response.choices[0]
         if choice.message.tool_calls != None and config.marshoai_fix_toolcalls:
@@ -113,18 +113,16 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const d
         logger.info(f'完成原因:{choice.finish_reason}')
         if choice.finish_reason == CompletionsFinishReason.STOPPED:
             context.append(UserMessage(content=usermsg).as_dict(), target.id, target.private)
-            choice_msg_dict = choice.message.to_dict()
-            if 'reasoning_content' in choice_msg_dict:
-                if config.marshoai_send_thinking:
-                    await UniMessage('思维链:\\n' + choice_msg_dict['reasoning_content']).send()
-                del choice_msg_dict['reasoning_content']
-            context.append(choice_msg_dict, target.id, target.private)
+            choice_msg_content, choice_msg_thinking, choice_msg_after = extract_content_and_think(choice.message)
+            if choice_msg_thinking and config.marshoai_send_thinking:
+                await UniMessage('思维链:\\n' + choice_msg_thinking).send()
+            context.append(choice_msg_after.to_dict(), target.id, target.private)
             if [target.id, target.private] not in target_list:
                 target_list.append([target.id, target.private])
             if config.marshoai_enable_richtext_parse:
-                await (await parse_richtext(str(choice.message.content))).send(reply_to=True)
+                await (await parse_richtext(str(choice_msg_content))).send(reply_to=True)
             else:
-                await UniMessage(str(choice.message.content)).send(reply_to=True)
+                await UniMessage(str(choice_msg_content)).send(reply_to=True)
         elif choice.finish_reason == CompletionsFinishReason.CONTENT_FILTERED:
             await UniMessage('*已被内容过滤器过滤。请调整聊天内容后重试。').send(reply_to=True)
             return
@@ -179,7 +177,7 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const d
     except Exception as e:
         await UniMessage(str(e) + suggest_solution(str(e))).send()
         traceback.print_exc()
-        return

@poke_notify.handle()

async func poke(event: Event)

源代码在GitHub上查看
python
@poke_notify.handle()
+        return

@poke_notify.handle()

async func poke(event: Event)

源代码在GitHub上查看
python
@poke_notify.handle()
 async def poke(event: Event):
     user_id = event.get_user_id()
     nicknames = await get_nicknames()
@@ -190,7 +188,8 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const d
             response = await make_chat_openai(client=client, model_name=model_name, msg=[get_prompt() if model_name.lower() not in NO_SYSPROMPT_MODELS else None, UserMessage(content=f'*{user_nickname}{config.marshoai_poke_suffix}')])
             choice = response.choices[0]
             if choice.finish_reason == CompletionsFinishReason.STOPPED:
-                await UniMessage(' ' + str(choice.message.content)).send(at_sender=True)
+                content = extract_content_and_think(choice.message)[0]
+                await UniMessage(' ' + str(content)).send(at_sender=True)
     except Exception as e:
         await UniMessage(str(e) + suggest_solution(str(e))).send()
         traceback.print_exc()
diff --git a/assets/dev_api_marsho.md.d9w52ceE.lean.js b/assets/dev_api_marsho.md.dF_hdEOQ.lean.js
similarity index 100%
rename from assets/dev_api_marsho.md.d9w52ceE.lean.js
rename to assets/dev_api_marsho.md.dF_hdEOQ.lean.js
diff --git a/assets/dev_api_util.md.BEQOfWcm.js b/assets/dev_api_util.md.pVwI72e6.js
similarity index 89%
rename from assets/dev_api_util.md.BEQOfWcm.js
rename to assets/dev_api_util.md.pVwI72e6.js
index c965e802..0b2f589a 100644
--- a/assets/dev_api_util.md.BEQOfWcm.js
+++ b/assets/dev_api_util.md.pVwI72e6.js
@@ -1,21 +1,21 @@
-import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"util","description":"","frontmatter":{"title":"util","order":100},"headers":[],"relativePath":"dev/api/util.md","filePath":"zh/dev/api/util.md","lastUpdated":1734175019000}'),h={name:"dev/api/util.md"};function k(l,s,p,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`

模块 nonebot_plugin_marshoai.util

var nickname_json

  • 说明: 记录昵称

  • 默认值: None

var praises_json

  • 说明: 记录夸赞名单

  • 默认值: None

var loaded_target_list

  • 说明: 记录已恢复备份的上下文的列表

  • 默认值: []


async func get_image_raw_and_type(url: str, timeout: int = 10) -> Optional[tuple[bytes, str]]

说明: 获取图片的二进制数据

参数:

  • url: str 图片链接
  • timeout: int 超时时间 秒
源代码在GitHub上查看
python
async def get_image_raw_and_type(url: str, timeout: int=10) -> Optional[tuple[bytes, str]]:
+import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"util","description":"","frontmatter":{"title":"util","order":100},"headers":[],"relativePath":"dev/api/util.md","filePath":"zh/dev/api/util.md","lastUpdated":1734175019000}'),h={name:"dev/api/util.md"};function k(l,s,p,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`

模块 nonebot_plugin_marshoai.util

var nickname_json

  • 说明: 记录昵称

  • 默认值: None

var praises_json

  • 说明: 记录夸赞名单

  • 默认值: None

var loaded_target_list

  • 说明: 记录已恢复备份的上下文的列表

  • 默认值: []


async func get_image_raw_and_type(url: str, timeout: int = 10) -> Optional[tuple[bytes, str]]

说明: 获取图片的二进制数据

参数:

  • url: str 图片链接
  • timeout: int 超时时间 秒
源代码在GitHub上查看
python
async def get_image_raw_and_type(url: str, timeout: int=10) -> Optional[tuple[bytes, str]]:
     async with httpx.AsyncClient() as client:
-        response = await client.get(url, headers=_chromium_headers, timeout=timeout)
+        response = await client.get(url, headers=_browser_headers, timeout=timeout)
         if response.status_code == 200:
             content_type = response.headers.get('Content-Type')
             if not content_type:
                 content_type = mimetypes.guess_type(url)[0]
             return (response.content, str(content_type))
         else:
-            return None

async func get_image_b64(url: str, timeout: int = 10) -> Optional[str]

说明: 获取图片的base64编码

参数:

  • url: 图片链接
  • timeout: 超时时间 秒
源代码在GitHub上查看
python
async def get_image_b64(url: str, timeout: int=10) -> Optional[str]:
+            return None

async func get_image_b64(url: str, timeout: int = 10) -> Optional[str]

说明: 获取图片的base64编码

参数:

  • url: 图片链接
  • timeout: 超时时间 秒
源代码在GitHub上查看
python
async def get_image_b64(url: str, timeout: int=10) -> Optional[str]:
     if (data_type := (await get_image_raw_and_type(url, timeout))):
         base64_image = base64.b64encode(data_type[0]).decode('utf-8')
         data_url = 'data:{};base64,{}'.format(data_type[1], base64_image)
         return data_url
     else:
-        return None

async func make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list] = None)

说明: 调用ai获取回复

参数:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
源代码在GitHub上查看
python
async def make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list]=None):
-    return await client.complete(messages=msg, model=model_name, tools=tools, temperature=config.marshoai_temperature, max_tokens=config.marshoai_max_tokens, top_p=config.marshoai_top_p)

async func make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list] = None)

说明: 使用 Openai SDK 调用ai获取回复

参数:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
源代码在GitHub上查看
python
async def make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list]=None):
-    return await client.chat.completions.create(messages=msg, model=model_name, tools=tools or NOT_GIVEN, temperature=config.marshoai_temperature or NOT_GIVEN, max_tokens=config.marshoai_max_tokens or NOT_GIVEN, top_p=config.marshoai_top_p or NOT_GIVEN, timeout=config.marshoai_timeout)

func get_praises()

源代码在GitHub上查看
python
def get_praises():
+        return None

async func make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list] = None)

说明: 调用ai获取回复

参数:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
源代码在GitHub上查看
python
async def make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list]=None):
+    return await client.complete(messages=msg, model=model_name, tools=tools, temperature=config.marshoai_temperature, max_tokens=config.marshoai_max_tokens, top_p=config.marshoai_top_p)

async func make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list] = None)

说明: 使用 Openai SDK 调用ai获取回复

参数:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
源代码在GitHub上查看
python
async def make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list]=None):
+    return await client.chat.completions.create(messages=msg, model=model_name, tools=tools or NOT_GIVEN, temperature=config.marshoai_temperature or NOT_GIVEN, max_tokens=config.marshoai_max_tokens or NOT_GIVEN, top_p=config.marshoai_top_p or NOT_GIVEN, timeout=config.marshoai_timeout)

func get_praises()

源代码在GitHub上查看
python
def get_praises():
     global praises_json
     if praises_json is None:
         praises_file = store.get_plugin_data_file('praises.json')
@@ -25,7 +25,7 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
         with open(praises_file, 'r', encoding='utf-8') as f:
             data = json.load(f)
         praises_json = data
-    return praises_json

async func refresh_praises_json()

源代码在GitHub上查看
python
async def refresh_praises_json():
+    return praises_json

async func refresh_praises_json()

源代码在GitHub上查看
python
async def refresh_praises_json():
     global praises_json
     praises_file = store.get_plugin_data_file('praises.json')
     if not praises_file.exists():
@@ -33,21 +33,21 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
             json.dump(_praises_init_data, f, ensure_ascii=False, indent=4)
     async with aiofiles.open(praises_file, 'r', encoding='utf-8') as f:
         data = json.loads(await f.read())
-    praises_json = data

func build_praises()

源代码在GitHub上查看
python
def build_praises():
+    praises_json = data

func build_praises() -> str

源代码在GitHub上查看
python
def build_praises() -> str:
     praises = get_praises()
     result = ['你喜欢以下几个人物,他们有各自的优点:']
     for item in praises['like']:
         result.append(f"名字:{item['name']},优点:{item['advantages']}")
-    return '\\n'.join(result)

async func save_context_to_json(name: str, context: Any, path: str)

源代码在GitHub上查看
python
async def save_context_to_json(name: str, context: Any, path: str):
+    return '\\n'.join(result)

async func save_context_to_json(name: str, context: Any, path: str)

源代码在GitHub上查看
python
async def save_context_to_json(name: str, context: Any, path: str):
     (context_dir := (store.get_plugin_data_dir() / path)).mkdir(parents=True, exist_ok=True)
     with open(context_dir / f'{name}.json', 'w', encoding='utf-8') as json_file:
-        json.dump(context, json_file, ensure_ascii=False, indent=4)

async func load_context_from_json(name: str, path: str) -> list

说明: 从指定路径加载历史记录

源代码在GitHub上查看
python
async def load_context_from_json(name: str, path: str) -> list:
+        json.dump(context, json_file, ensure_ascii=False, indent=4)

async func load_context_from_json(name: str, path: str) -> list

说明: 从指定路径加载历史记录

源代码在GitHub上查看
python
async def load_context_from_json(name: str, path: str) -> list:
     (context_dir := (store.get_plugin_data_dir() / path)).mkdir(parents=True, exist_ok=True)
     if (file_path := (context_dir / f'{name}.json')).exists():
         async with aiofiles.open(file_path, 'r', encoding='utf-8') as json_file:
             return json.loads(await json_file.read())
     else:
-        return []

async func get_nicknames()

说明: 获取nickname_json, 优先来源于全局变量

源代码在GitHub上查看
python
async def get_nicknames():
+        return []

async func get_nicknames()

说明: 获取nickname_json, 优先来源于全局变量

源代码在GitHub上查看
python
async def get_nicknames():
     global nickname_json
     if nickname_json is None:
         filename = store.get_plugin_data_file('nickname.json')
@@ -56,7 +56,7 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
                 nickname_json = json.loads(await f.read())
         except Exception:
             nickname_json = {}
-    return nickname_json

async func set_nickname(user_id: str, name: str)

源代码在GitHub上查看
python
async def set_nickname(user_id: str, name: str):
+    return nickname_json

async func set_nickname(user_id: str, name: str)

源代码在GitHub上查看
python
async def set_nickname(user_id: str, name: str):
     global nickname_json
     filename = store.get_plugin_data_file('nickname.json')
     if not filename.exists():
@@ -69,13 +69,13 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
         del data[user_id]
     with open(filename, 'w', encoding='utf-8') as f:
         json.dump(data, f, ensure_ascii=False, indent=4)
-    nickname_json = data

async func refresh_nickname_json()

说明: 强制刷新nickname_json, 刷新全局变量

源代码在GitHub上查看
python
async def refresh_nickname_json():
+    nickname_json = data

async func refresh_nickname_json()

说明: 强制刷新nickname_json, 刷新全局变量

源代码在GitHub上查看
python
async def refresh_nickname_json():
     global nickname_json
     try:
         async with aiofiles.open(store.get_plugin_data_file('nickname.json'), 'r', encoding='utf-8') as f:
             nickname_json = json.loads(await f.read())
     except Exception:
-        logger.error('刷新 nickname_json 表错误:无法载入 nickname.json 文件')

func get_prompt()

说明: 获取系统提示词

源代码在GitHub上查看
python
def get_prompt():
+        logger.error('刷新 nickname_json 表错误:无法载入 nickname.json 文件')

func get_prompt()

说明: 获取系统提示词

源代码在GitHub上查看
python
def get_prompt():
     prompts = config.marshoai_additional_prompt
     if config.marshoai_enable_praises:
         praises_prompt = build_praises()
@@ -84,12 +84,12 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
         prompts += _time_prompt.format(date_time=(current_time := DateTime.now()).strftime('%Y年%m月%d日 %H:%M:%S'), weekday_name=_weekdays[current_time.weekday()], lunar_date=current_time.chinesize.date_hanzify('农历{干支年}{生肖}{月份}{日期}'))
     marsho_prompt = config.marshoai_prompt
     spell = SystemMessage(content=marsho_prompt + prompts).as_dict()
-    return spell

func suggest_solution(errinfo: str) -> str

源代码在GitHub上查看
python
def suggest_solution(errinfo: str) -> str:
+    return spell

func suggest_solution(errinfo: str) -> str

源代码在GitHub上查看
python
def suggest_solution(errinfo: str) -> str:
     suggestions = {'content_filter': '消息已被内容过滤器过滤。请调整聊天内容后重试。', 'RateLimitReached': '模型达到调用速率限制。请稍等一段时间或联系Bot管理员。', 'tokens_limit_reached': '请求token达到上限。请重置上下文。', 'content_length_limit': '请求体过大。请重置上下文。', 'unauthorized': '访问token无效。请联系Bot管理员。', 'invalid type: parameter messages.content is of type array but should be of type string.': '聊天请求体包含此模型不支持的数据类型。请重置上下文。', 'At most 1 image(s) may be provided in one request.': '此模型只能在上下文中包含1张图片。如果此前的聊天已经发送过图片,请重置上下文。'}
     for key, suggestion in suggestions.items():
         if key in errinfo:
             return f'\\n{suggestion}'
-    return ''

async func get_backup_context(target_id: str, target_private: bool) -> list

说明: 获取历史上下文

源代码在GitHub上查看
python
async def get_backup_context(target_id: str, target_private: bool) -> list:
+    return ''

async func get_backup_context(target_id: str, target_private: bool) -> list

说明: 获取历史上下文

源代码在GitHub上查看
python
async def get_backup_context(target_id: str, target_private: bool) -> list:
     global loaded_target_list
     if target_private:
         target_uid = f'private_{target_id}'
@@ -98,12 +98,24 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
     if target_uid not in loaded_target_list:
         loaded_target_list.append(target_uid)
         return await load_context_from_json(f'back_up_context_{target_uid}', 'contexts/backup')
-    return []

var latex_convert

  • 说明: 开启一个转换实例

  • 默认值: ConvertLatex()


@get_driver().on_bot_connect

async func load_latex_convert()

源代码在GitHub上查看
python
@get_driver().on_bot_connect
+    return []

func extract_content_and_think(message: ChatCompletionMessage) -> tuple[str, str | None, ChatCompletionMessage]

说明: 处理 API 返回的消息对象,提取其中的内容和思维链,并返回处理后的消息,思维链,消息对象。

参数:

  • message (ChatCompletionMessage): API 返回的消息对象。
源代码在GitHub上查看
python
def extract_content_and_think(message: ChatCompletionMessage) -> tuple[str, str | None, ChatCompletionMessage]:
+    try:
+        thinking = message.reasoning_content
+    except AttributeError:
+        thinking = None
+    if thinking:
+        delattr(message, 'reasoning_content')
+    else:
+        think_blocks = re.findall('<think>(.*?)</think>', message.content or '', flags=re.DOTALL)
+        thinking = '\\n'.join([block.strip() for block in think_blocks if block.strip()])
+    content = re.sub('<think>.*?</think>', '', message.content or '', flags=re.DOTALL).strip()
+    message.content = content
+    return (content, thinking, message)

var latex_convert

  • 说明: 开启一个转换实例

  • 默认值: ConvertLatex()


@get_driver().on_bot_connect

async func load_latex_convert()

源代码在GitHub上查看
python
@get_driver().on_bot_connect
 async def load_latex_convert():
-    await latex_convert.load_channel(None)

async func get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]])

源代码在GitHub上查看
python
async def get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]]):
+    await latex_convert.load_channel(None)

async func get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]])

源代码在GitHub上查看
python
async def get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]]):
     for torep, rep in code_blank_uuid_map:
         msg = msg.replace(torep, rep)
-    return msg

async func parse_richtext(msg: str) -> UniMessage

说明: 人工智能给出的回答一般不会包含 HTML 嵌入其中,但是包含图片或者 LaTeX 公式、代码块,都很正常。 这个函数会把这些都以图片形式嵌入消息体。

源代码在GitHub上查看
python
async def parse_richtext(msg: str) -> UniMessage:
+    return msg

async func parse_richtext(msg: str) -> UniMessage

说明: 人工智能给出的回答一般不会包含 HTML 嵌入其中,但是包含图片或者 LaTeX 公式、代码块,都很正常。 这个函数会把这些都以图片形式嵌入消息体。

源代码在GitHub上查看
python
async def parse_richtext(msg: str) -> UniMessage:
     if not IMG_LATEX_PATTERN.search(msg):
         return UniMessage(msg)
     result_msg = UniMessage()
@@ -137,4 +149,4 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
         else:
             result_msg.append(TextMsg(tag_found + '(未知内容解析失败)'))
     result_msg.append(TextMsg(await get_uuid_back2codeblock(msg[last_tag_index:], code_blank_uuid_map)))
-    return result_msg
`,82)]))}const y=i(h,[["render",k]]);export{g as __pageData,y as default}; + return result_msg

var thinking

  • 说明: type: ignore

  • 默认值: message.reasoning_content

`,90)]))}const y=i(h,[["render",k]]);export{g as __pageData,y as default}; diff --git a/assets/dev_api_util.md.BEQOfWcm.lean.js b/assets/dev_api_util.md.pVwI72e6.lean.js similarity index 85% rename from assets/dev_api_util.md.BEQOfWcm.lean.js rename to assets/dev_api_util.md.pVwI72e6.lean.js index 92cdf64a..370dc564 100644 --- a/assets/dev_api_util.md.BEQOfWcm.lean.js +++ b/assets/dev_api_util.md.pVwI72e6.lean.js @@ -1 +1 @@ -import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"util","description":"","frontmatter":{"title":"util","order":100},"headers":[],"relativePath":"dev/api/util.md","filePath":"zh/dev/api/util.md","lastUpdated":1734175019000}'),h={name:"dev/api/util.md"};function k(l,s,p,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n("",82)]))}const y=i(h,[["render",k]]);export{g as __pageData,y as default}; +import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"util","description":"","frontmatter":{"title":"util","order":100},"headers":[],"relativePath":"dev/api/util.md","filePath":"zh/dev/api/util.md","lastUpdated":1734175019000}'),h={name:"dev/api/util.md"};function k(l,s,p,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n("",90)]))}const y=i(h,[["render",k]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_api_marsho.md.B2G3bD6C.js b/assets/en_dev_api_marsho.md.D_PLwYjH.js similarity index 95% rename from assets/en_dev_api_marsho.md.B2G3bD6C.js rename to assets/en_dev_api_marsho.md.D_PLwYjH.js index 31a815e9..2eaf2e0c 100644 --- a/assets/en_dev_api_marsho.md.B2G3bD6C.js +++ b/assets/en_dev_api_marsho.md.D_PLwYjH.js @@ -1,32 +1,32 @@ -import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"marsho","description":"","frontmatter":{"title":"marsho","order":100},"headers":[],"relativePath":"en/dev/api/marsho.md","filePath":"en/dev/api/marsho.md","lastUpdated":null}'),t={name:"en/dev/api/marsho.md"};function k(l,s,e,p,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`

Module nonebot_plugin_marshoai.marsho


async func at_enable()

Source code or View on GitHub
python
async def at_enable():
-    return config.marshoai_at

@add_usermsg_cmd.handle()

async func add_usermsg(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@add_usermsg_cmd.handle()
+import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"marsho","description":"","frontmatter":{"title":"marsho","order":100},"headers":[],"relativePath":"en/dev/api/marsho.md","filePath":"en/dev/api/marsho.md","lastUpdated":null}'),t={name:"en/dev/api/marsho.md"};function k(l,s,e,p,E,r){return h(),a("div",null,s[0]||(s[0]=[n(`

Module nonebot_plugin_marshoai.marsho


async func at_enable()

Source code or View on GitHub
python
async def at_enable():
+    return config.marshoai_at

@add_usermsg_cmd.handle()

async func add_usermsg(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@add_usermsg_cmd.handle()
 async def add_usermsg(target: MsgTarget, arg: Message=CommandArg()):
     if (msg := arg.extract_plain_text()):
         context.append(UserMessage(content=msg).as_dict(), target.id, target.private)
-        await add_usermsg_cmd.finish('已添加用户消息')

@add_assistantmsg_cmd.handle()

async func add_assistantmsg(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@add_assistantmsg_cmd.handle()
+        await add_usermsg_cmd.finish('已添加用户消息')

@add_assistantmsg_cmd.handle()

async func add_assistantmsg(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@add_assistantmsg_cmd.handle()
 async def add_assistantmsg(target: MsgTarget, arg: Message=CommandArg()):
     if (msg := arg.extract_plain_text()):
         context.append(AssistantMessage(content=msg).as_dict(), target.id, target.private)
-        await add_assistantmsg_cmd.finish('已添加助手消息')

@praises_cmd.handle()

async func praises()

Source code or View on GitHub
python
@praises_cmd.handle()
+        await add_assistantmsg_cmd.finish('已添加助手消息')

@praises_cmd.handle()

async func praises()

Source code or View on GitHub
python
@praises_cmd.handle()
 async def praises():
-    await praises_cmd.finish(build_praises())

@contexts_cmd.handle()

async func contexts(target: MsgTarget)

Source code or View on GitHub
python
@contexts_cmd.handle()
+    await praises_cmd.finish(build_praises())

@contexts_cmd.handle()

async func contexts(target: MsgTarget)

Source code or View on GitHub
python
@contexts_cmd.handle()
 async def contexts(target: MsgTarget):
     backup_context = await get_backup_context(target.id, target.private)
     if backup_context:
         context.set_context(backup_context, target.id, target.private)
-    await contexts_cmd.finish(str(context.build(target.id, target.private)))

@save_context_cmd.handle()

async func save_context(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@save_context_cmd.handle()
+    await contexts_cmd.finish(str(context.build(target.id, target.private)))

@save_context_cmd.handle()

async func save_context(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@save_context_cmd.handle()
 async def save_context(target: MsgTarget, arg: Message=CommandArg()):
     contexts_data = context.build(target.id, target.private)
     if not context:
         await save_context_cmd.finish('暂无上下文可以保存')
     if (msg := arg.extract_plain_text()):
         await save_context_to_json(msg, contexts_data, 'contexts')
-        await save_context_cmd.finish('已保存上下文')

@load_context_cmd.handle()

async func load_context(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@load_context_cmd.handle()
+        await save_context_cmd.finish('已保存上下文')

@load_context_cmd.handle()

async func load_context(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@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)
         context.set_context(await load_context_from_json(msg, 'contexts'), target.id, target.private)
-        await load_context_cmd.finish('已加载并覆盖上下文')

@resetmem_cmd.handle()

async func resetmem(target: MsgTarget)

Source code or View on GitHub
python
@resetmem_cmd.handle()
+        await load_context_cmd.finish('已加载并覆盖上下文')

@resetmem_cmd.handle()

async func resetmem(target: MsgTarget)

Source code or View on GitHub
python
@resetmem_cmd.handle()
 async def resetmem(target: MsgTarget):
     if [target.id, target.private] not in target_list:
         target_list.append([target.id, target.private])
@@ -34,12 +34,12 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const g
     if backup_context:
         context.set_context(backup_context, target.id, target.private)
     context.reset(target.id, target.private)
-    await resetmem_cmd.finish('上下文已重置')

@changemodel_cmd.handle()

async func changemodel(arg: Message = CommandArg())

Source code or View on GitHub
python
@changemodel_cmd.handle()
+    await resetmem_cmd.finish('上下文已重置')

@changemodel_cmd.handle()

async func changemodel(arg: Message = CommandArg())

Source code or View on GitHub
python
@changemodel_cmd.handle()
 async def changemodel(arg: Message=CommandArg()):
     global model_name
     if (model := arg.extract_plain_text()):
         model_name = model
-        await changemodel_cmd.finish('已切换')

@nickname_cmd.handle()

async func nickname(event: Event, name = None)

Source code or View on GitHub
python
@nickname_cmd.handle()
+        await changemodel_cmd.finish('已切换')

@nickname_cmd.handle()

async func nickname(event: Event, name = None)

Source code or View on GitHub
python
@nickname_cmd.handle()
 async def nickname(event: Event, name=None):
     nicknames = await get_nicknames()
     user_id = event.get_user_id()
@@ -54,15 +54,15 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const g
         if len(name) > config.marshoai_nickname_limit:
             await nickname_cmd.finish('昵称超出长度限制:' + str(config.marshoai_nickname_limit))
         await set_nickname(user_id, name)
-        await nickname_cmd.finish('已设置昵称为:' + name)

@refresh_data_cmd.handle()

async func refresh_data()

Source code or View on GitHub
python
@refresh_data_cmd.handle()
+        await nickname_cmd.finish('已设置昵称为:' + name)

@refresh_data_cmd.handle()

async func refresh_data()

Source code or View on GitHub
python
@refresh_data_cmd.handle()
 async def refresh_data():
     await refresh_nickname_json()
     await refresh_praises_json()
-    await refresh_data_cmd.finish('已刷新数据')

@marsho_help_cmd.handle()

async func marsho_help()

Source code or View on GitHub
python
@marsho_help_cmd.handle()
+    await refresh_data_cmd.finish('已刷新数据')

@marsho_help_cmd.handle()

async func marsho_help()

Source code or View on GitHub
python
@marsho_help_cmd.handle()
 async def marsho_help():
-    await marsho_help_cmd.finish(metadata.usage)

@marsho_status_cmd.handle()

async func marsho_status(bot: Bot)

Source code or View on GitHub
python
@marsho_status_cmd.handle()
+    await marsho_help_cmd.finish(metadata.usage)

@marsho_status_cmd.handle()

async func marsho_status(bot: Bot)

Source code or View on GitHub
python
@marsho_status_cmd.handle()
 async def marsho_status(bot: Bot):
-    await marsho_status_cmd.finish(f'当前适配器:{bot.adapter.get_name()}\\n当前使用的模型:{model_name}\\n当前支持图片的模型:{str(SUPPORT_IMAGE_MODELS + config.marshoai_additional_image_models)}')

@marsho_at.handle()@marsho_cmd.handle()

async func marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg] = None)

Source code or View on GitHub
python
@marsho_at.handle()
+    await marsho_status_cmd.finish(f'当前适配器:{bot.adapter.get_name()}\\n当前使用的模型:{model_name}\\n当前支持图片的模型:{str(SUPPORT_IMAGE_MODELS + config.marshoai_additional_image_models)}')

@marsho_at.handle()@marsho_cmd.handle()

async func marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg] = None)

Source code or View on GitHub
python
@marsho_at.handle()
 @marsho_cmd.handle()
 async def marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg]=None):
     global target_list
@@ -105,7 +105,7 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const g
         if not is_reasoning_model:
             context_msg = [get_prompt()] + context_msg
         tools_lists = tools.tools_list + list(map(lambda v: v.data(), get_function_calls().values()))
-        logger.debug(f'正在获取回答,模型:{model_name}')
+        logger.info(f'正在获取回答,模型:{model_name}')
         response = await make_chat_openai(client=client, model_name=model_name, msg=context_msg + [UserMessage(content=usermsg).as_dict()], tools=tools_lists if tools_lists else None)
         choice = response.choices[0]
         if choice.message.tool_calls != None and config.marshoai_fix_toolcalls:
@@ -113,18 +113,16 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const g
         logger.info(f'完成原因:{choice.finish_reason}')
         if choice.finish_reason == CompletionsFinishReason.STOPPED:
             context.append(UserMessage(content=usermsg).as_dict(), target.id, target.private)
-            choice_msg_dict = choice.message.to_dict()
-            if 'reasoning_content' in choice_msg_dict:
-                if config.marshoai_send_thinking:
-                    await UniMessage('思维链:\\n' + choice_msg_dict['reasoning_content']).send()
-                del choice_msg_dict['reasoning_content']
-            context.append(choice_msg_dict, target.id, target.private)
+            choice_msg_content, choice_msg_thinking, choice_msg_after = extract_content_and_think(choice.message)
+            if choice_msg_thinking and config.marshoai_send_thinking:
+                await UniMessage('思维链:\\n' + choice_msg_thinking).send()
+            context.append(choice_msg_after.to_dict(), target.id, target.private)
             if [target.id, target.private] not in target_list:
                 target_list.append([target.id, target.private])
             if config.marshoai_enable_richtext_parse:
-                await (await parse_richtext(str(choice.message.content))).send(reply_to=True)
+                await (await parse_richtext(str(choice_msg_content))).send(reply_to=True)
             else:
-                await UniMessage(str(choice.message.content)).send(reply_to=True)
+                await UniMessage(str(choice_msg_content)).send(reply_to=True)
         elif choice.finish_reason == CompletionsFinishReason.CONTENT_FILTERED:
             await UniMessage('*已被内容过滤器过滤。请调整聊天内容后重试。').send(reply_to=True)
             return
@@ -179,7 +177,7 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const g
     except Exception as e:
         await UniMessage(str(e) + suggest_solution(str(e))).send()
         traceback.print_exc()
-        return

@poke_notify.handle()

async func poke(event: Event)

Source code or View on GitHub
python
@poke_notify.handle()
+        return

@poke_notify.handle()

async func poke(event: Event)

Source code or View on GitHub
python
@poke_notify.handle()
 async def poke(event: Event):
     user_id = event.get_user_id()
     nicknames = await get_nicknames()
@@ -190,7 +188,8 @@ import{_ as i,c as a,ae as n,o as h}from"./chunks/framework.BzDBnRMZ.js";const g
             response = await make_chat_openai(client=client, model_name=model_name, msg=[get_prompt() if model_name.lower() not in NO_SYSPROMPT_MODELS else None, UserMessage(content=f'*{user_nickname}{config.marshoai_poke_suffix}')])
             choice = response.choices[0]
             if choice.finish_reason == CompletionsFinishReason.STOPPED:
-                await UniMessage(' ' + str(choice.message.content)).send(at_sender=True)
+                content = extract_content_and_think(choice.message)[0]
+                await UniMessage(' ' + str(content)).send(at_sender=True)
     except Exception as e:
         await UniMessage(str(e) + suggest_solution(str(e))).send()
         traceback.print_exc()
diff --git a/assets/en_dev_api_marsho.md.B2G3bD6C.lean.js b/assets/en_dev_api_marsho.md.D_PLwYjH.lean.js
similarity index 100%
rename from assets/en_dev_api_marsho.md.B2G3bD6C.lean.js
rename to assets/en_dev_api_marsho.md.D_PLwYjH.lean.js
diff --git a/assets/en_dev_api_util.md.BNGDTsJK.js b/assets/en_dev_api_util.md.C6FjM-fz.js
similarity index 89%
rename from assets/en_dev_api_util.md.BNGDTsJK.js
rename to assets/en_dev_api_util.md.C6FjM-fz.js
index 1cf48f7f..e85dce0d 100644
--- a/assets/en_dev_api_util.md.BNGDTsJK.js
+++ b/assets/en_dev_api_util.md.C6FjM-fz.js
@@ -1,21 +1,21 @@
-import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"util","description":"","frontmatter":{"title":"util","order":100},"headers":[],"relativePath":"en/dev/api/util.md","filePath":"en/dev/api/util.md","lastUpdated":1734175019000}'),h={name:"en/dev/api/util.md"};function k(l,s,p,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`

Module nonebot_plugin_marshoai.util

var nickname_json

  • Description: 记录昵称

  • Default: None

var praises_json

  • Description: 记录夸赞名单

  • Default: None

var loaded_target_list

  • Description: 记录已恢复备份的上下文的列表

  • Default: []


async func get_image_raw_and_type(url: str, timeout: int = 10) -> Optional[tuple[bytes, str]]

Description: 获取图片的二进制数据

Arguments:

  • url: str 图片链接
  • timeout: int 超时时间 秒
Source code or View on GitHub
python
async def get_image_raw_and_type(url: str, timeout: int=10) -> Optional[tuple[bytes, str]]:
+import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"util","description":"","frontmatter":{"title":"util","order":100},"headers":[],"relativePath":"en/dev/api/util.md","filePath":"en/dev/api/util.md","lastUpdated":1734175019000}'),h={name:"en/dev/api/util.md"};function k(l,s,p,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n(`

Module nonebot_plugin_marshoai.util

var nickname_json

  • Description: 记录昵称

  • Default: None

var praises_json

  • Description: 记录夸赞名单

  • Default: None

var loaded_target_list

  • Description: 记录已恢复备份的上下文的列表

  • Default: []


async func get_image_raw_and_type(url: str, timeout: int = 10) -> Optional[tuple[bytes, str]]

Description: 获取图片的二进制数据

Arguments:

  • url: str 图片链接
  • timeout: int 超时时间 秒
Source code or View on GitHub
python
async def get_image_raw_and_type(url: str, timeout: int=10) -> Optional[tuple[bytes, str]]:
     async with httpx.AsyncClient() as client:
-        response = await client.get(url, headers=_chromium_headers, timeout=timeout)
+        response = await client.get(url, headers=_browser_headers, timeout=timeout)
         if response.status_code == 200:
             content_type = response.headers.get('Content-Type')
             if not content_type:
                 content_type = mimetypes.guess_type(url)[0]
             return (response.content, str(content_type))
         else:
-            return None

async func get_image_b64(url: str, timeout: int = 10) -> Optional[str]

Description: 获取图片的base64编码

Arguments:

  • url: 图片链接
  • timeout: 超时时间 秒
Source code or View on GitHub
python
async def get_image_b64(url: str, timeout: int=10) -> Optional[str]:
+            return None

async func get_image_b64(url: str, timeout: int = 10) -> Optional[str]

Description: 获取图片的base64编码

Arguments:

  • url: 图片链接
  • timeout: 超时时间 秒
Source code or View on GitHub
python
async def get_image_b64(url: str, timeout: int=10) -> Optional[str]:
     if (data_type := (await get_image_raw_and_type(url, timeout))):
         base64_image = base64.b64encode(data_type[0]).decode('utf-8')
         data_url = 'data:{};base64,{}'.format(data_type[1], base64_image)
         return data_url
     else:
-        return None

async func make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list] = None)

Description: 调用ai获取回复

Arguments:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
Source code or View on GitHub
python
async def make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list]=None):
-    return await client.complete(messages=msg, model=model_name, tools=tools, temperature=config.marshoai_temperature, max_tokens=config.marshoai_max_tokens, top_p=config.marshoai_top_p)

async func make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list] = None)

Description: 使用 Openai SDK 调用ai获取回复

Arguments:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
Source code or View on GitHub
python
async def make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list]=None):
-    return await client.chat.completions.create(messages=msg, model=model_name, tools=tools or NOT_GIVEN, temperature=config.marshoai_temperature or NOT_GIVEN, max_tokens=config.marshoai_max_tokens or NOT_GIVEN, top_p=config.marshoai_top_p or NOT_GIVEN, timeout=config.marshoai_timeout)

func get_praises()

Source code or View on GitHub
python
def get_praises():
+        return None

async func make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list] = None)

Description: 调用ai获取回复

Arguments:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
Source code or View on GitHub
python
async def make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list]=None):
+    return await client.complete(messages=msg, model=model_name, tools=tools, temperature=config.marshoai_temperature, max_tokens=config.marshoai_max_tokens, top_p=config.marshoai_top_p)

async func make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list] = None)

Description: 使用 Openai SDK 调用ai获取回复

Arguments:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
Source code or View on GitHub
python
async def make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list]=None):
+    return await client.chat.completions.create(messages=msg, model=model_name, tools=tools or NOT_GIVEN, temperature=config.marshoai_temperature or NOT_GIVEN, max_tokens=config.marshoai_max_tokens or NOT_GIVEN, top_p=config.marshoai_top_p or NOT_GIVEN, timeout=config.marshoai_timeout)

func get_praises()

Source code or View on GitHub
python
def get_praises():
     global praises_json
     if praises_json is None:
         praises_file = store.get_plugin_data_file('praises.json')
@@ -25,7 +25,7 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
         with open(praises_file, 'r', encoding='utf-8') as f:
             data = json.load(f)
         praises_json = data
-    return praises_json

async func refresh_praises_json()

Source code or View on GitHub
python
async def refresh_praises_json():
+    return praises_json

async func refresh_praises_json()

Source code or View on GitHub
python
async def refresh_praises_json():
     global praises_json
     praises_file = store.get_plugin_data_file('praises.json')
     if not praises_file.exists():
@@ -33,21 +33,21 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
             json.dump(_praises_init_data, f, ensure_ascii=False, indent=4)
     async with aiofiles.open(praises_file, 'r', encoding='utf-8') as f:
         data = json.loads(await f.read())
-    praises_json = data

func build_praises()

Source code or View on GitHub
python
def build_praises():
+    praises_json = data

func build_praises() -> str

Source code or View on GitHub
python
def build_praises() -> str:
     praises = get_praises()
     result = ['你喜欢以下几个人物,他们有各自的优点:']
     for item in praises['like']:
         result.append(f"名字:{item['name']},优点:{item['advantages']}")
-    return '\\n'.join(result)

async func save_context_to_json(name: str, context: Any, path: str)

Source code or View on GitHub
python
async def save_context_to_json(name: str, context: Any, path: str):
+    return '\\n'.join(result)

async func save_context_to_json(name: str, context: Any, path: str)

Source code or View on GitHub
python
async def save_context_to_json(name: str, context: Any, path: str):
     (context_dir := (store.get_plugin_data_dir() / path)).mkdir(parents=True, exist_ok=True)
     with open(context_dir / f'{name}.json', 'w', encoding='utf-8') as json_file:
-        json.dump(context, json_file, ensure_ascii=False, indent=4)

async func load_context_from_json(name: str, path: str) -> list

Description: 从指定路径加载历史记录

Source code or View on GitHub
python
async def load_context_from_json(name: str, path: str) -> list:
+        json.dump(context, json_file, ensure_ascii=False, indent=4)

async func load_context_from_json(name: str, path: str) -> list

Description: 从指定路径加载历史记录

Source code or View on GitHub
python
async def load_context_from_json(name: str, path: str) -> list:
     (context_dir := (store.get_plugin_data_dir() / path)).mkdir(parents=True, exist_ok=True)
     if (file_path := (context_dir / f'{name}.json')).exists():
         async with aiofiles.open(file_path, 'r', encoding='utf-8') as json_file:
             return json.loads(await json_file.read())
     else:
-        return []

async func get_nicknames()

Description: 获取nickname_json, 优先来源于全局变量

Source code or View on GitHub
python
async def get_nicknames():
+        return []

async func get_nicknames()

Description: 获取nickname_json, 优先来源于全局变量

Source code or View on GitHub
python
async def get_nicknames():
     global nickname_json
     if nickname_json is None:
         filename = store.get_plugin_data_file('nickname.json')
@@ -56,7 +56,7 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
                 nickname_json = json.loads(await f.read())
         except Exception:
             nickname_json = {}
-    return nickname_json

async func set_nickname(user_id: str, name: str)

Source code or View on GitHub
python
async def set_nickname(user_id: str, name: str):
+    return nickname_json

async func set_nickname(user_id: str, name: str)

Source code or View on GitHub
python
async def set_nickname(user_id: str, name: str):
     global nickname_json
     filename = store.get_plugin_data_file('nickname.json')
     if not filename.exists():
@@ -69,13 +69,13 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
         del data[user_id]
     with open(filename, 'w', encoding='utf-8') as f:
         json.dump(data, f, ensure_ascii=False, indent=4)
-    nickname_json = data

async func refresh_nickname_json()

Description: 强制刷新nickname_json, 刷新全局变量

Source code or View on GitHub
python
async def refresh_nickname_json():
+    nickname_json = data

async func refresh_nickname_json()

Description: 强制刷新nickname_json, 刷新全局变量

Source code or View on GitHub
python
async def refresh_nickname_json():
     global nickname_json
     try:
         async with aiofiles.open(store.get_plugin_data_file('nickname.json'), 'r', encoding='utf-8') as f:
             nickname_json = json.loads(await f.read())
     except Exception:
-        logger.error('刷新 nickname_json 表错误:无法载入 nickname.json 文件')

func get_prompt()

Description: 获取系统提示词

Source code or View on GitHub
python
def get_prompt():
+        logger.error('刷新 nickname_json 表错误:无法载入 nickname.json 文件')

func get_prompt()

Description: 获取系统提示词

Source code or View on GitHub
python
def get_prompt():
     prompts = config.marshoai_additional_prompt
     if config.marshoai_enable_praises:
         praises_prompt = build_praises()
@@ -84,12 +84,12 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
         prompts += _time_prompt.format(date_time=(current_time := DateTime.now()).strftime('%Y年%m月%d日 %H:%M:%S'), weekday_name=_weekdays[current_time.weekday()], lunar_date=current_time.chinesize.date_hanzify('农历{干支年}{生肖}{月份}{日期}'))
     marsho_prompt = config.marshoai_prompt
     spell = SystemMessage(content=marsho_prompt + prompts).as_dict()
-    return spell

func suggest_solution(errinfo: str) -> str

Source code or View on GitHub
python
def suggest_solution(errinfo: str) -> str:
+    return spell

func suggest_solution(errinfo: str) -> str

Source code or View on GitHub
python
def suggest_solution(errinfo: str) -> str:
     suggestions = {'content_filter': '消息已被内容过滤器过滤。请调整聊天内容后重试。', 'RateLimitReached': '模型达到调用速率限制。请稍等一段时间或联系Bot管理员。', 'tokens_limit_reached': '请求token达到上限。请重置上下文。', 'content_length_limit': '请求体过大。请重置上下文。', 'unauthorized': '访问token无效。请联系Bot管理员。', 'invalid type: parameter messages.content is of type array but should be of type string.': '聊天请求体包含此模型不支持的数据类型。请重置上下文。', 'At most 1 image(s) may be provided in one request.': '此模型只能在上下文中包含1张图片。如果此前的聊天已经发送过图片,请重置上下文。'}
     for key, suggestion in suggestions.items():
         if key in errinfo:
             return f'\\n{suggestion}'
-    return ''

async func get_backup_context(target_id: str, target_private: bool) -> list

Description: 获取历史上下文

Source code or View on GitHub
python
async def get_backup_context(target_id: str, target_private: bool) -> list:
+    return ''

async func get_backup_context(target_id: str, target_private: bool) -> list

Description: 获取历史上下文

Source code or View on GitHub
python
async def get_backup_context(target_id: str, target_private: bool) -> list:
     global loaded_target_list
     if target_private:
         target_uid = f'private_{target_id}'
@@ -98,12 +98,24 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
     if target_uid not in loaded_target_list:
         loaded_target_list.append(target_uid)
         return await load_context_from_json(f'back_up_context_{target_uid}', 'contexts/backup')
-    return []

var latex_convert

  • Description: 开启一个转换实例

  • Default: ConvertLatex()


@get_driver().on_bot_connect

async func load_latex_convert()

Source code or View on GitHub
python
@get_driver().on_bot_connect
+    return []

func extract_content_and_think(message: ChatCompletionMessage) -> tuple[str, str | None, ChatCompletionMessage]

Description: 处理 API 返回的消息对象,提取其中的内容和思维链,并返回处理后的消息,思维链,消息对象。

Arguments:

  • message (ChatCompletionMessage): API 返回的消息对象。
Source code or View on GitHub
python
def extract_content_and_think(message: ChatCompletionMessage) -> tuple[str, str | None, ChatCompletionMessage]:
+    try:
+        thinking = message.reasoning_content
+    except AttributeError:
+        thinking = None
+    if thinking:
+        delattr(message, 'reasoning_content')
+    else:
+        think_blocks = re.findall('<think>(.*?)</think>', message.content or '', flags=re.DOTALL)
+        thinking = '\\n'.join([block.strip() for block in think_blocks if block.strip()])
+    content = re.sub('<think>.*?</think>', '', message.content or '', flags=re.DOTALL).strip()
+    message.content = content
+    return (content, thinking, message)

var latex_convert

  • Description: 开启一个转换实例

  • Default: ConvertLatex()


@get_driver().on_bot_connect

async func load_latex_convert()

Source code or View on GitHub
python
@get_driver().on_bot_connect
 async def load_latex_convert():
-    await latex_convert.load_channel(None)

async func get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]])

Source code or View on GitHub
python
async def get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]]):
+    await latex_convert.load_channel(None)

async func get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]])

Source code or View on GitHub
python
async def get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]]):
     for torep, rep in code_blank_uuid_map:
         msg = msg.replace(torep, rep)
-    return msg

async func parse_richtext(msg: str) -> UniMessage

Description: 人工智能给出的回答一般不会包含 HTML 嵌入其中,但是包含图片或者 LaTeX 公式、代码块,都很正常。 这个函数会把这些都以图片形式嵌入消息体。

Source code or View on GitHub
python
async def parse_richtext(msg: str) -> UniMessage:
+    return msg

async func parse_richtext(msg: str) -> UniMessage

Description: 人工智能给出的回答一般不会包含 HTML 嵌入其中,但是包含图片或者 LaTeX 公式、代码块,都很正常。 这个函数会把这些都以图片形式嵌入消息体。

Source code or View on GitHub
python
async def parse_richtext(msg: str) -> UniMessage:
     if not IMG_LATEX_PATTERN.search(msg):
         return UniMessage(msg)
     result_msg = UniMessage()
@@ -137,4 +149,4 @@ import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g
         else:
             result_msg.append(TextMsg(tag_found + '(未知内容解析失败)'))
     result_msg.append(TextMsg(await get_uuid_back2codeblock(msg[last_tag_index:], code_blank_uuid_map)))
-    return result_msg
`,82)]))}const y=i(h,[["render",k]]);export{g as __pageData,y as default}; + return result_msg

var thinking

  • Description: type: ignore

  • Default: message.reasoning_content

`,90)]))}const y=i(h,[["render",k]]);export{g as __pageData,y as default}; diff --git a/assets/en_dev_api_util.md.BNGDTsJK.lean.js b/assets/en_dev_api_util.md.C6FjM-fz.lean.js similarity index 85% rename from assets/en_dev_api_util.md.BNGDTsJK.lean.js rename to assets/en_dev_api_util.md.C6FjM-fz.lean.js index 4c02c300..87400b58 100644 --- a/assets/en_dev_api_util.md.BNGDTsJK.lean.js +++ b/assets/en_dev_api_util.md.C6FjM-fz.lean.js @@ -1 +1 @@ -import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"util","description":"","frontmatter":{"title":"util","order":100},"headers":[],"relativePath":"en/dev/api/util.md","filePath":"en/dev/api/util.md","lastUpdated":1734175019000}'),h={name:"en/dev/api/util.md"};function k(l,s,p,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n("",82)]))}const y=i(h,[["render",k]]);export{g as __pageData,y as default}; +import{_ as i,c as a,ae as n,o as t}from"./chunks/framework.BzDBnRMZ.js";const g=JSON.parse('{"title":"util","description":"","frontmatter":{"title":"util","order":100},"headers":[],"relativePath":"en/dev/api/util.md","filePath":"en/dev/api/util.md","lastUpdated":1734175019000}'),h={name:"en/dev/api/util.md"};function k(l,s,p,e,r,E){return t(),a("div",null,s[0]||(s[0]=[n("",90)]))}const y=i(h,[["render",k]]);export{g as __pageData,y as default}; diff --git a/dev/api/azure.html b/dev/api/azure.html index c66fdc6c..8fdf43dd 100644 --- a/dev/api/azure.html +++ b/dev/api/azure.html @@ -180,7 +180,7 @@ await UniMessage(str(e) + suggest_solution(str(e))).send() traceback.print_exc() return

var text

  • 说明: type: ignore

  • 默认值: event.get_message()

- + \ No newline at end of file diff --git a/dev/api/azure_onebot.html b/dev/api/azure_onebot.html index ec1426ff..291082dc 100644 --- a/dev/api/azure_onebot.html +++ b/dev/api/azure_onebot.html @@ -20,7 +20,7 @@
- + \ No newline at end of file diff --git a/dev/api/config.html b/dev/api/config.html index 7c9c0e2b..00a2ce86 100644 --- a/dev/api/config.html +++ b/dev/api/config.html @@ -38,7 +38,7 @@ logger.info(f'新增配置项: {key} = {value}') old_config[key] = value return old_config
- + \ No newline at end of file diff --git a/dev/api/constants.html b/dev/api/constants.html index 5ffda2ec..c1d63473 100644 --- a/dev/api/constants.html +++ b/dev/api/constants.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai.constants

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/deal_latex.html b/dev/api/deal_latex.html index 0b0c0885..40d786c6 100644 --- a/dev/api/deal_latex.html +++ b/dev/api/deal_latex.html @@ -114,7 +114,7 @@ results = await asyncio.gather(*(channel_test_wrapper(channel) for channel in channel_list)) best_channel = min(results, key=lambda x: x[0])[1] return best_channel()

attr channel: ConvertChannel = NO_DEFAULT

- + \ No newline at end of file diff --git a/dev/api/dev.html b/dev/api/dev.html index 19527021..940481aa 100644 --- a/dev/api/dev.html +++ b/dev/api/dev.html @@ -64,7 +64,7 @@ else: logger.debug('未找到变动插件') return

var dir_list

- + \ No newline at end of file diff --git a/dev/api/hooks.html b/dev/api/hooks.html index be2052a7..b7bacd2c 100644 --- a/dev/api/hooks.html +++ b/dev/api/hooks.html @@ -30,7 +30,7 @@ target_uid = 'group_' + target_id await save_context_to_json(f'back_up_context_{target_uid}', contexts_data, 'contexts/backup') logger.info(f'已保存会话 {target_id} 的上下文备份,将在下次对话时恢复~')

var marshoai_plugin_dirs

- + \ No newline at end of file diff --git a/dev/api/hunyuan.html b/dev/api/hunyuan.html index 67ebfe34..87f74019 100644 --- a/dev/api/hunyuan.html +++ b/dev/api/hunyuan.html @@ -29,7 +29,7 @@ await UniMessage.image(url=url).send() except Exception as e: traceback.print_exc() - + \ No newline at end of file diff --git a/dev/api/index.html b/dev/api/index.html index b75ecfea..710bae57 100644 --- a/dev/api/index.html +++ b/dev/api/index.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai

MIT License

Copyright (c) 2025 Asankilp & LiteyukiStudio

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/instances.html b/dev/api/instances.html index 0d139836..cf6fadc3 100644 --- a/dev/api/instances.html +++ b/dev/api/instances.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai.instances

var target_list

  • 说明: 记录需保存历史上下文的列表

  • 类型: list[list]

  • 默认值: []

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/marsho.html b/dev/api/marsho.html index 35b88fe9..b7f9f09a 100644 --- a/dev/api/marsho.html +++ b/dev/api/marsho.html @@ -13,41 +13,41 @@ - + -
Skip to content

模块 nonebot_plugin_marshoai.marsho


async func at_enable()

源代码在GitHub上查看
python
async def at_enable():
-    return config.marshoai_at

@add_usermsg_cmd.handle()

async func add_usermsg(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@add_usermsg_cmd.handle()
+    
Skip to content

模块 nonebot_plugin_marshoai.marsho


async func at_enable()

源代码在GitHub上查看
python
async def at_enable():
+    return config.marshoai_at

@add_usermsg_cmd.handle()

async func add_usermsg(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@add_usermsg_cmd.handle()
 async def add_usermsg(target: MsgTarget, arg: Message=CommandArg()):
     if (msg := arg.extract_plain_text()):
         context.append(UserMessage(content=msg).as_dict(), target.id, target.private)
-        await add_usermsg_cmd.finish('已添加用户消息')

@add_assistantmsg_cmd.handle()

async func add_assistantmsg(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@add_assistantmsg_cmd.handle()
+        await add_usermsg_cmd.finish('已添加用户消息')

@add_assistantmsg_cmd.handle()

async func add_assistantmsg(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@add_assistantmsg_cmd.handle()
 async def add_assistantmsg(target: MsgTarget, arg: Message=CommandArg()):
     if (msg := arg.extract_plain_text()):
         context.append(AssistantMessage(content=msg).as_dict(), target.id, target.private)
-        await add_assistantmsg_cmd.finish('已添加助手消息')

@praises_cmd.handle()

async func praises()

源代码在GitHub上查看
python
@praises_cmd.handle()
+        await add_assistantmsg_cmd.finish('已添加助手消息')

@praises_cmd.handle()

async func praises()

源代码在GitHub上查看
python
@praises_cmd.handle()
 async def praises():
-    await praises_cmd.finish(build_praises())

@contexts_cmd.handle()

async func contexts(target: MsgTarget)

源代码在GitHub上查看
python
@contexts_cmd.handle()
+    await praises_cmd.finish(build_praises())

@contexts_cmd.handle()

async func contexts(target: MsgTarget)

源代码在GitHub上查看
python
@contexts_cmd.handle()
 async def contexts(target: MsgTarget):
     backup_context = await get_backup_context(target.id, target.private)
     if backup_context:
         context.set_context(backup_context, target.id, target.private)
-    await contexts_cmd.finish(str(context.build(target.id, target.private)))

@save_context_cmd.handle()

async func save_context(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@save_context_cmd.handle()
+    await contexts_cmd.finish(str(context.build(target.id, target.private)))

@save_context_cmd.handle()

async func save_context(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@save_context_cmd.handle()
 async def save_context(target: MsgTarget, arg: Message=CommandArg()):
     contexts_data = context.build(target.id, target.private)
     if not context:
         await save_context_cmd.finish('暂无上下文可以保存')
     if (msg := arg.extract_plain_text()):
         await save_context_to_json(msg, contexts_data, 'contexts')
-        await save_context_cmd.finish('已保存上下文')

@load_context_cmd.handle()

async func load_context(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@load_context_cmd.handle()
+        await save_context_cmd.finish('已保存上下文')

@load_context_cmd.handle()

async func load_context(target: MsgTarget, arg: Message = CommandArg())

源代码在GitHub上查看
python
@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)
         context.set_context(await load_context_from_json(msg, 'contexts'), target.id, target.private)
-        await load_context_cmd.finish('已加载并覆盖上下文')

@resetmem_cmd.handle()

async func resetmem(target: MsgTarget)

源代码在GitHub上查看
python
@resetmem_cmd.handle()
+        await load_context_cmd.finish('已加载并覆盖上下文')

@resetmem_cmd.handle()

async func resetmem(target: MsgTarget)

源代码在GitHub上查看
python
@resetmem_cmd.handle()
 async def resetmem(target: MsgTarget):
     if [target.id, target.private] not in target_list:
         target_list.append([target.id, target.private])
@@ -55,12 +55,12 @@
     if backup_context:
         context.set_context(backup_context, target.id, target.private)
     context.reset(target.id, target.private)
-    await resetmem_cmd.finish('上下文已重置')

@changemodel_cmd.handle()

async func changemodel(arg: Message = CommandArg())

源代码在GitHub上查看
python
@changemodel_cmd.handle()
+    await resetmem_cmd.finish('上下文已重置')

@changemodel_cmd.handle()

async func changemodel(arg: Message = CommandArg())

源代码在GitHub上查看
python
@changemodel_cmd.handle()
 async def changemodel(arg: Message=CommandArg()):
     global model_name
     if (model := arg.extract_plain_text()):
         model_name = model
-        await changemodel_cmd.finish('已切换')

@nickname_cmd.handle()

async func nickname(event: Event, name = None)

源代码在GitHub上查看
python
@nickname_cmd.handle()
+        await changemodel_cmd.finish('已切换')

@nickname_cmd.handle()

async func nickname(event: Event, name = None)

源代码在GitHub上查看
python
@nickname_cmd.handle()
 async def nickname(event: Event, name=None):
     nicknames = await get_nicknames()
     user_id = event.get_user_id()
@@ -75,15 +75,15 @@
         if len(name) > config.marshoai_nickname_limit:
             await nickname_cmd.finish('昵称超出长度限制:' + str(config.marshoai_nickname_limit))
         await set_nickname(user_id, name)
-        await nickname_cmd.finish('已设置昵称为:' + name)

@refresh_data_cmd.handle()

async func refresh_data()

源代码在GitHub上查看
python
@refresh_data_cmd.handle()
+        await nickname_cmd.finish('已设置昵称为:' + name)

@refresh_data_cmd.handle()

async func refresh_data()

源代码在GitHub上查看
python
@refresh_data_cmd.handle()
 async def refresh_data():
     await refresh_nickname_json()
     await refresh_praises_json()
-    await refresh_data_cmd.finish('已刷新数据')

@marsho_help_cmd.handle()

async func marsho_help()

源代码在GitHub上查看
python
@marsho_help_cmd.handle()
+    await refresh_data_cmd.finish('已刷新数据')

@marsho_help_cmd.handle()

async func marsho_help()

源代码在GitHub上查看
python
@marsho_help_cmd.handle()
 async def marsho_help():
-    await marsho_help_cmd.finish(metadata.usage)

@marsho_status_cmd.handle()

async func marsho_status(bot: Bot)

源代码在GitHub上查看
python
@marsho_status_cmd.handle()
+    await marsho_help_cmd.finish(metadata.usage)

@marsho_status_cmd.handle()

async func marsho_status(bot: Bot)

源代码在GitHub上查看
python
@marsho_status_cmd.handle()
 async def marsho_status(bot: Bot):
-    await marsho_status_cmd.finish(f'当前适配器:{bot.adapter.get_name()}\n当前使用的模型:{model_name}\n当前支持图片的模型:{str(SUPPORT_IMAGE_MODELS + config.marshoai_additional_image_models)}')

@marsho_at.handle()@marsho_cmd.handle()

async func marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg] = None)

源代码在GitHub上查看
python
@marsho_at.handle()
+    await marsho_status_cmd.finish(f'当前适配器:{bot.adapter.get_name()}\n当前使用的模型:{model_name}\n当前支持图片的模型:{str(SUPPORT_IMAGE_MODELS + config.marshoai_additional_image_models)}')

@marsho_at.handle()@marsho_cmd.handle()

async func marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg] = None)

源代码在GitHub上查看
python
@marsho_at.handle()
 @marsho_cmd.handle()
 async def marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg]=None):
     global target_list
@@ -126,7 +126,7 @@
         if not is_reasoning_model:
             context_msg = [get_prompt()] + context_msg
         tools_lists = tools.tools_list + list(map(lambda v: v.data(), get_function_calls().values()))
-        logger.debug(f'正在获取回答,模型:{model_name}')
+        logger.info(f'正在获取回答,模型:{model_name}')
         response = await make_chat_openai(client=client, model_name=model_name, msg=context_msg + [UserMessage(content=usermsg).as_dict()], tools=tools_lists if tools_lists else None)
         choice = response.choices[0]
         if choice.message.tool_calls != None and config.marshoai_fix_toolcalls:
@@ -134,18 +134,16 @@
         logger.info(f'完成原因:{choice.finish_reason}')
         if choice.finish_reason == CompletionsFinishReason.STOPPED:
             context.append(UserMessage(content=usermsg).as_dict(), target.id, target.private)
-            choice_msg_dict = choice.message.to_dict()
-            if 'reasoning_content' in choice_msg_dict:
-                if config.marshoai_send_thinking:
-                    await UniMessage('思维链:\n' + choice_msg_dict['reasoning_content']).send()
-                del choice_msg_dict['reasoning_content']
-            context.append(choice_msg_dict, target.id, target.private)
+            choice_msg_content, choice_msg_thinking, choice_msg_after = extract_content_and_think(choice.message)
+            if choice_msg_thinking and config.marshoai_send_thinking:
+                await UniMessage('思维链:\n' + choice_msg_thinking).send()
+            context.append(choice_msg_after.to_dict(), target.id, target.private)
             if [target.id, target.private] not in target_list:
                 target_list.append([target.id, target.private])
             if config.marshoai_enable_richtext_parse:
-                await (await parse_richtext(str(choice.message.content))).send(reply_to=True)
+                await (await parse_richtext(str(choice_msg_content))).send(reply_to=True)
             else:
-                await UniMessage(str(choice.message.content)).send(reply_to=True)
+                await UniMessage(str(choice_msg_content)).send(reply_to=True)
         elif choice.finish_reason == CompletionsFinishReason.CONTENT_FILTERED:
             await UniMessage('*已被内容过滤器过滤。请调整聊天内容后重试。').send(reply_to=True)
             return
@@ -200,7 +198,7 @@
     except Exception as e:
         await UniMessage(str(e) + suggest_solution(str(e))).send()
         traceback.print_exc()
-        return

@poke_notify.handle()

async func poke(event: Event)

源代码在GitHub上查看
python
@poke_notify.handle()
+        return

@poke_notify.handle()

async func poke(event: Event)

源代码在GitHub上查看
python
@poke_notify.handle()
 async def poke(event: Event):
     user_id = event.get_user_id()
     nicknames = await get_nicknames()
@@ -211,12 +209,13 @@
             response = await make_chat_openai(client=client, model_name=model_name, msg=[get_prompt() if model_name.lower() not in NO_SYSPROMPT_MODELS else None, UserMessage(content=f'*{user_nickname}{config.marshoai_poke_suffix}')])
             choice = response.choices[0]
             if choice.finish_reason == CompletionsFinishReason.STOPPED:
-                await UniMessage(' ' + str(choice.message.content)).send(at_sender=True)
+                content = extract_content_and_think(choice.message)[0]
+                await UniMessage(' ' + str(content)).send(at_sender=True)
     except Exception as e:
         await UniMessage(str(e) + suggest_solution(str(e))).send()
         traceback.print_exc()
         return

var text

  • 说明: type: ignore

  • 默认值: event.get_message()

var request_msg

  • 说明: type: ignore

  • 默认值: context_msg + [UserMessage(content=usermsg).as_dict()] + tool_msg

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/marsho_onebot.html b/dev/api/marsho_onebot.html index f64b7197..8d823c9d 100644 --- a/dev/api/marsho_onebot.html +++ b/dev/api/marsho_onebot.html @@ -20,7 +20,7 @@ - + \ No newline at end of file diff --git a/dev/api/metadata.html b/dev/api/metadata.html index 3deda003..ca5f9844 100644 --- a/dev/api/metadata.html +++ b/dev/api/metadata.html @@ -20,7 +20,7 @@ - + \ No newline at end of file diff --git a/dev/api/models.html b/dev/api/models.html index a70be1aa..e88a26a0 100644 --- a/dev/api/models.html +++ b/dev/api/models.html @@ -65,7 +65,7 @@ if not self.tools_list or not config.marshoai_enable_tools: return None return self.tools_list

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/observer.html b/dev/api/observer.html index 6c413305..ed8fc7c1 100644 --- a/dev/api/observer.html +++ b/dev/api/observer.html @@ -55,7 +55,7 @@ observer.schedule(code_modified_handler, directory, recursive=recursive) return func return decorator - + \ No newline at end of file diff --git a/dev/api/plugin/func_call/caller.html b/dev/api/plugin/func_call/caller.html index c447f8f5..03947569 100644 --- a/dev/api/plugin/func_call/caller.html +++ b/dev/api/plugin/func_call/caller.html @@ -128,7 +128,7 @@ caller = Caller(name=name, description=description, func_type=func_type, no_module_name=no_module_name) return caller

func get_function_calls() -> dict[str, Caller]

说明: 获取所有已注册的function call函数

返回: dict[str, Caller]: 所有已注册的function call函数

源代码在GitHub上查看
python
def get_function_calls() -> dict[str, Caller]:
     return _caller_data
- + \ No newline at end of file diff --git a/dev/api/plugin/func_call/index.html b/dev/api/plugin/func_call/index.html index c0be69a8..9c6cf100 100644 --- a/dev/api/plugin/func_call/index.html +++ b/dev/api/plugin/func_call/index.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugin.func_call

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/plugin/func_call/models.html b/dev/api/plugin/func_call/models.html index 4eb234c0..2a8a5696 100644 --- a/dev/api/plugin/func_call/models.html +++ b/dev/api/plugin/func_call/models.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugin.func_call.models

class SessionContext(BaseModel)

attr bot: Bot = NO_DEFAULT

attr event: Event = NO_DEFAULT

attr matcher: Matcher = NO_DEFAULT

attr state: T_State = NO_DEFAULT

attr caller: Any = None

class SessionContextDepends(BaseModel)

attr bot: str | None = None

attr event: str | None = None

attr matcher: str | None = None

attr state: str | None = None

attr caller: str | None = None

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/plugin/func_call/params.html b/dev/api/plugin/func_call/params.html index d1dc50ad..895d3441 100644 --- a/dev/api/plugin/func_call/params.html +++ b/dev/api/plugin/func_call/params.html @@ -23,7 +23,7 @@ return {'type': self.type_, 'description': self.description, **{k: v for k, v in self.properties.items() if v is not None}}

attr type_: str = NO_DEFAULT

attr description: str = NO_DEFAULT

attr default: Any = None

attr properties: dict[str, Any] = {}

attr required: bool = False

class String(Parameter)

attr type_: str = ParamTypes.STRING

attr properties: dict[str, Any] = Field(default_factory=dict)

attr enum: list[str] | None = None

class Integer(Parameter)

attr type_: str = ParamTypes.INTEGER

attr properties: dict[str, Any] = Field(default_factory=lambda: {'minimum': 0, 'maximum': 100})

attr minimum: int | None = None

attr maximum: int | None = None

class Array(Parameter)

attr type_: str = ParamTypes.ARRAY

attr properties: dict[str, Any] = Field(default_factory=lambda: {'items': {'type': 'string'}})

attr items: str = Field('string', description='数组元素类型')

class FunctionCall(BaseModel)


func hash self => int

源代码在GitHub上查看
python
def __hash__(self) -> int:
     return hash(self.name)

func data(self) -> dict[str, Any]

说明: 生成函数描述信息

返回: dict[str, Any]: 函数描述信息 字典

源代码在GitHub上查看
python
def data(self) -> dict[str, Any]:
     return {'type': 'function', 'function': {'name': self.name, 'description': self.description, 'parameters': {'type': 'object', 'properties': {k: v.data() for k, v in self.arguments.items()}}, 'required': [k for k, v in self.arguments.items() if v.default is None], **self.kwargs}}

attr name: str = NO_DEFAULT

attr description: str = NO_DEFAULT

attr arguments: dict[str, Parameter] = NO_DEFAULT

attr function: FUNCTION_CALL_FUNC = NO_DEFAULT

attr kwargs: dict[str, Any] = {}

- + \ No newline at end of file diff --git a/dev/api/plugin/func_call/utils.html b/dev/api/plugin/func_call/utils.html index 87f323ef..d83e9d1b 100644 --- a/dev/api/plugin/func_call/utils.html +++ b/dev/api/plugin/func_call/utils.html @@ -39,7 +39,7 @@ return False func_ = getattr(call, '__call__', None) return inspect.iscoroutinefunction(func_) - + \ No newline at end of file diff --git a/dev/api/plugin/index.html b/dev/api/plugin/index.html index b8c99d16..a2661188 100644 --- a/dev/api/plugin/index.html +++ b/dev/api/plugin/index.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugin

该功能目前正在开发中开发基本完成,暂时可用,受影响的文件夹 plugin, plugins

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/plugin/load.html b/dev/api/plugin/load.html index db42b520..16ae17e3 100644 --- a/dev/api/plugin/load.html +++ b/dev/api/plugin/load.html @@ -69,7 +69,7 @@ logger.opt(colors=True).error(f'重新加载插件失败 "<r>{plugin.name}</r>"') traceback.print_exc() return None

var module

var module_name

var module_name

- + \ No newline at end of file diff --git a/dev/api/plugin/models.html b/dev/api/plugin/models.html index cfe47990..bbbaa7a4 100644 --- a/dev/api/plugin/models.html +++ b/dev/api/plugin/models.html @@ -22,7 +22,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugin.models

class PluginMetadata(BaseModel)

attr name: str = NO_DEFAULT

attr description: str = ''

attr usage: str = ''

attr author: str = ''

attr homepage: str = ''

attr extra: dict[str, Any] = {}

class Plugin(BaseModel)


func hash self => int

源代码在GitHub上查看
python
def __hash__(self) -> int:
     return hash(self.name)

func self == other: Any => bool

源代码在GitHub上查看
python
def __eq__(self, other: Any) -> bool:
     return self.name == other.name

attr name: str = NO_DEFAULT

attr module: ModuleType = NO_DEFAULT

attr module_name: str = NO_DEFAULT

attr module_path: str | None = NO_DEFAULT

attr metadata: PluginMetadata | None = None

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/plugin/register.html b/dev/api/plugin/register.html index 4ec51828..cd57b29c 100644 --- a/dev/api/plugin/register.html +++ b/dev/api/plugin/register.html @@ -29,7 +29,7 @@ name = func.__name__ description = func.__doc__ logger.info(f'注册函数: {name} {description}') - + \ No newline at end of file diff --git a/dev/api/plugin/typing.html b/dev/api/plugin/typing.html index d664c11d..8b785230 100644 --- a/dev/api/plugin/typing.html +++ b/dev/api/plugin/typing.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugin.typing

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/plugin/utils.html b/dev/api/plugin/utils.html index edef0530..6e3fe390 100644 --- a/dev/api/plugin/utils.html +++ b/dev/api/plugin/utils.html @@ -26,7 +26,7 @@ else: return '.'.join(rel_path.parts[:-1] + (rel_path.stem,))

func parse_function_docsring()

源代码在GitHub上查看
python
def parse_function_docsring():
     pass
- + \ No newline at end of file diff --git a/dev/api/plugins/builtin_tools/chat.html b/dev/api/plugins/builtin_tools/chat.html index 68d6702e..98de5ed3 100644 --- a/dev/api/plugins/builtin_tools/chat.html +++ b/dev/api/plugins/builtin_tools/chat.html @@ -43,7 +43,7 @@ return '发送完成' except Exception as e: return '发送失败: ' + str(e) - + \ No newline at end of file diff --git a/dev/api/plugins/builtin_tools/file_io.html b/dev/api/plugins/builtin_tools/file_io.html index 89e6431d..cd472300 100644 --- a/dev/api/plugins/builtin_tools/file_io.html +++ b/dev/api/plugins/builtin_tools/file_io.html @@ -33,7 +33,7 @@ return '写入成功' except Exception as e: return '写入出错: ' + str(e) - + \ No newline at end of file diff --git a/dev/api/plugins/builtin_tools/index.html b/dev/api/plugins/builtin_tools/index.html index fce57a17..5ec8d18c 100644 --- a/dev/api/plugins/builtin_tools/index.html +++ b/dev/api/plugins/builtin_tools/index.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugins.builtin_tools

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/plugins/builtin_tools/liteyuki.html b/dev/api/plugins/builtin_tools/liteyuki.html index 598b2b3b..958c4190 100644 --- a/dev/api/plugins/builtin_tools/liteyuki.html +++ b/dev/api/plugins/builtin_tools/liteyuki.html @@ -29,7 +29,7 @@ response = await client.get('https://api.liteyuki.icu/online') online = response.json().get('online') return f'注册节点数: {register}\n在线节点数: {online}' - + \ No newline at end of file diff --git a/dev/api/plugins/builtin_tools/manager.html b/dev/api/plugins/builtin_tools/manager.html index 6a710f18..9e30b3ac 100644 --- a/dev/api/plugins/builtin_tools/manager.html +++ b/dev/api/plugins/builtin_tools/manager.html @@ -28,7 +28,7 @@ else: reply += f'名称: {p.name},描述: 暂无\n' return reply - + \ No newline at end of file diff --git a/dev/api/plugins/builtin_tools/network.html b/dev/api/plugins/builtin_tools/network.html index 7cf4592d..47cf0d2b 100644 --- a/dev/api/plugins/builtin_tools/network.html +++ b/dev/api/plugins/builtin_tools/network.html @@ -40,7 +40,7 @@ logger.error(f'marsho builtin: 获取网页内容失败: {e}') return '获取网页内容失败:' + str(e) return '未能获取到有效的网页内容' - + \ No newline at end of file diff --git a/dev/api/plugins/builtin_tools/utils.html b/dev/api/plugins/builtin_tools/utils.html index 618594a4..08f915ee 100644 --- a/dev/api/plugins/builtin_tools/utils.html +++ b/dev/api/plugins/builtin_tools/utils.html @@ -22,7 +22,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugins.builtin_tools.utils


async func make_html_summary(html_content: str, language: str = 'english', length: int = 3) -> str

说明: 使用html内容生成摘要

参数:

  • html_content (str): html内容
  • language (str, optional): 语言. Defaults to "english".
  • length (int, optional): 摘要长度. Defaults to 3.

返回: str: 摘要

源代码在GitHub上查看
python
async def make_html_summary(html_content: str, language: str='english', length: int=3) -> str:
     loop = asyncio.get_event_loop()
     return await loop.run_in_executor(executor, _make_summary, html_content, language, length)

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/plugins/marshoai_bangumi/index.html b/dev/api/plugins/marshoai_bangumi/index.html index 3890db4a..7d79701b 100644 --- a/dev/api/plugins/marshoai_bangumi/index.html +++ b/dev/api/plugins/marshoai_bangumi/index.html @@ -47,7 +47,7 @@ except Exception as e: traceback.print_exc() return '' - + \ No newline at end of file diff --git a/dev/api/plugins/marshoai_basic/index.html b/dev/api/plugins/marshoai_basic/index.html index 906a5e07..19754090 100644 --- a/dev/api/plugins/marshoai_basic/index.html +++ b/dev/api/plugins/marshoai_basic/index.html @@ -30,7 +30,7 @@ current_lunar_date = DateTime.now().to_lunar().date_hanzify()[5:] time_prompt = f'现在的时间是{current_time}{current_weekday_name},农历{current_lunar_date}。' return time_prompt - + \ No newline at end of file diff --git a/dev/api/plugins/twisuki_megakits/index.html b/dev/api/plugins/twisuki_megakits/index.html index b56a704e..e1d0e2aa 100644 --- a/dev/api/plugins/twisuki_megakits/index.html +++ b/dev/api/plugins/twisuki_megakits/index.html @@ -28,7 +28,7 @@ return str(await mk_nya_code.nya_encrypt(msg))

@on_function_call(description='将猫语翻译回人类语言').params(msg=String(description='被翻译语句'))

async func nya_decrypt(msg: str) -> str

说明: 将猫语翻译回人类语言

源代码在GitHub上查看
python
@on_function_call(description='将猫语翻译回人类语言').params(msg=String(description='被翻译语句'))
 async def nya_decrypt(msg: str) -> str:
     return str(await mk_nya_code.nya_decrypt(msg))
- + \ No newline at end of file diff --git a/dev/api/plugins/twisuki_megakits/mk_morse_code.html b/dev/api/plugins/twisuki_megakits/mk_morse_code.html index fa4a35bb..9c2ebec0 100644 --- a/dev/api/plugins/twisuki_megakits/mk_morse_code.html +++ b/dev/api/plugins/twisuki_megakits/mk_morse_code.html @@ -38,7 +38,7 @@ else: result += '?' return result - + \ No newline at end of file diff --git a/dev/api/plugins/twisuki_megakits/mk_nya_code.html b/dev/api/plugins/twisuki_megakits/mk_nya_code.html index d193dcca..36c9694e 100644 --- a/dev/api/plugins/twisuki_megakits/mk_nya_code.html +++ b/dev/api/plugins/twisuki_megakits/mk_nya_code.html @@ -55,7 +55,7 @@ except Exception: return '翻译失败' return result

var char

var char

var char

var char

var char

- + \ No newline at end of file diff --git a/dev/api/plugins/twisuki_petcat/index.html b/dev/api/plugins/twisuki_petcat/index.html index c78d9fae..da510ac5 100644 --- a/dev/api/plugins/twisuki_petcat/index.html +++ b/dev/api/plugins/twisuki_petcat/index.html @@ -36,7 +36,7 @@ return pc_info.print_type_list()

@on_function_call(description='可选技能').params()

async func help_cat_skill() -> str

源代码在GitHub上查看
python
@on_function_call(description='可选技能').params()
 async def help_cat_skill() -> str:
     return pc_info.print_skill_list()
- + \ No newline at end of file diff --git a/dev/api/plugins/twisuki_petcat/pc_cat.html b/dev/api/plugins/twisuki_petcat/pc_cat.html index 28ebe04a..af1607b2 100644 --- a/dev/api/plugins/twisuki_petcat/pc_cat.html +++ b/dev/api/plugins/twisuki_petcat/pc_cat.html @@ -126,7 +126,7 @@ data['energy'] = min(data['energy'] + 16, 0) token = dict_to_token(data) return f'''你抱猫休息了一阵子, 猫猫的活力值提升到了{value_output(data['energy'])}\n新token : "{token}"\n请妥善保存token, 这是猫猫的唯一标识符!''' - + \ No newline at end of file diff --git a/dev/api/plugins/twisuki_petcat/pc_info.html b/dev/api/plugins/twisuki_petcat/pc_info.html index f5a6f6e9..62752702 100644 --- a/dev/api/plugins/twisuki_petcat/pc_info.html +++ b/dev/api/plugins/twisuki_petcat/pc_info.html @@ -42,7 +42,7 @@ logger.info(data['skill']) return result[:-2]

func help_cat_new() -> str

源代码在GitHub上查看
python
def help_cat_new() -> str:
     return f'新建一只猫猫, 首先选择猫猫的种类, 获取初始化token;然后用这个token, 选择名字和一个技能进行初始化;初始化结束才表示猫猫正式创建成功.\ntoken为猫的唯一标识符, 每次交互都需要传入token\n种类可选 : {print_type_list()}\n技能可选 : {print_skill_list()}'
- + \ No newline at end of file diff --git a/dev/api/plugins/twisuki_petcat/pc_shop.html b/dev/api/plugins/twisuki_petcat/pc_shop.html index 27fe07d3..731000e3 100644 --- a/dev/api/plugins/twisuki_petcat/pc_shop.html +++ b/dev/api/plugins/twisuki_petcat/pc_shop.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugins.twisuki_petcat.pc_shop

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/plugins/twisuki_petcat/pc_token.html b/dev/api/plugins/twisuki_petcat/pc_token.html index 51645a6b..63aff9f9 100644 --- a/dev/api/plugins/twisuki_petcat/pc_token.html +++ b/dev/api/plugins/twisuki_petcat/pc_token.html @@ -120,7 +120,7 @@ token = base64.b64encode(token_byte).decode() logger.success(f'编码完成, token为\n{token}') return token - + \ No newline at end of file diff --git a/dev/api/plugins_test/marshoai_basic/index.html b/dev/api/plugins_test/marshoai_basic/index.html index 4a8f5260..6015be48 100644 --- a/dev/api/plugins_test/marshoai_basic/index.html +++ b/dev/api/plugins_test/marshoai_basic/index.html @@ -24,7 +24,7 @@ current_time = DateTime.now() time_prompt = '现在的时间是 {}{}{}。'.format(current_time.strftime('%Y.%m.%d %H:%M:%S'), weekdays[current_time.weekday()], current_time.chinesize.date_hanzify('农历{干支年}{生肖}{月份}{数序日}')) return time_prompt - + \ No newline at end of file diff --git a/dev/api/plugins_test/marshoai_memory/command.html b/dev/api/plugins_test/marshoai_memory/command.html index ec20f766..2b37b8dd 100644 --- a/dev/api/plugins_test/marshoai_memory/command.html +++ b/dev/api/plugins_test/marshoai_memory/command.html @@ -38,7 +38,7 @@ json.dump(memory_data, f, ensure_ascii=False, indent=4) await matcher.finish('记忆已重置~') await matcher.finish('没有找到该用户的记忆~') - + \ No newline at end of file diff --git a/dev/api/plugins_test/marshoai_memory/config.html b/dev/api/plugins_test/marshoai_memory/config.html index 74614b18..1a4b536e 100644 --- a/dev/api/plugins_test/marshoai_memory/config.html +++ b/dev/api/plugins_test/marshoai_memory/config.html @@ -20,7 +20,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugins_test.marshoai_memory.config

class ConfigModel(BaseModel)

attr marshoai_plugin_memory_scheduler: bool = True

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/plugins_test/marshoai_memory/index.html b/dev/api/plugins_test/marshoai_memory/index.html index a865bf3d..afa29c8a 100644 --- a/dev/api/plugins_test/marshoai_memory/index.html +++ b/dev/api/plugins_test/marshoai_memory/index.html @@ -49,7 +49,7 @@ logger.error(f'整理关于{i}的记忆时出错:{res}') with open(memory_path, 'w', encoding='utf-8') as f: json.dump(memory_data, f, ensure_ascii=False, indent=4)

var memory

- + \ No newline at end of file diff --git a/dev/api/plugins_test/random_number_generator.html b/dev/api/plugins_test/random_number_generator.html index 486bfa58..70345e8e 100644 --- a/dev/api/plugins_test/random_number_generator.html +++ b/dev/api/plugins_test/random_number_generator.html @@ -25,7 +25,7 @@ return f"生成的随机数为: {', '.join(map(str, random_numbers))}"

@on_function_call(description='重载测试')

func test_reload()

源代码在GitHub上查看
python
@on_function_call(description='重载测试')
 def test_reload():
     return 1
- + \ No newline at end of file diff --git a/dev/api/plugins_test/snowykami_testplugin/index.html b/dev/api/plugins_test/snowykami_testplugin/index.html index df71a508..489c3ee1 100644 --- a/dev/api/plugins_test/snowykami_testplugin/index.html +++ b/dev/api/plugins_test/snowykami_testplugin/index.html @@ -43,7 +43,7 @@ except Exception as e: return '运行出错: ' + str(e) return '运行成功: ' + str(r) - + \ No newline at end of file diff --git a/dev/api/plugins_test/weather_demo.html b/dev/api/plugins_test/weather_demo.html index 0e73b95e..e8cf77bc 100644 --- a/dev/api/plugins_test/weather_demo.html +++ b/dev/api/plugins_test/weather_demo.html @@ -22,7 +22,7 @@
Skip to content

模块 nonebot_plugin_marshoai.plugins_test.weather_demo


@on_function_call(description='可以用于查询天气').params(location=String(description='地点'))

async func weather(location: str) -> str

源代码在GitHub上查看
python
@on_function_call(description='可以用于查询天气').params(location=String(description='地点'))
 async def weather(location: str) -> str:
     return f'{location}的天气是晴天, 温度是25°C'

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/tools/marshoai_bangumi/index.html b/dev/api/tools/marshoai_bangumi/index.html index 9b14ab43..3a9bfffc 100644 --- a/dev/api/tools/marshoai_bangumi/index.html +++ b/dev/api/tools/marshoai_bangumi/index.html @@ -40,7 +40,7 @@ except Exception as e: traceback.print_exc() return '' - + \ No newline at end of file diff --git a/dev/api/tools/marshoai_basic/index.html b/dev/api/tools/marshoai_basic/index.html index 0e8cd169..957f5500 100644 --- a/dev/api/tools/marshoai_basic/index.html +++ b/dev/api/tools/marshoai_basic/index.html @@ -25,7 +25,7 @@ return str(ver)

async func get_current_time()

源代码在GitHub上查看
python
async def get_current_time():
     current_time = DateTime.now()
     return time_prompt.format(date_time=current_time.strftime('%Y年%m月%d日 %H:%M:%S'), weekday_name=weekdays[current_time.weekday()], lunar_date=current_time.to_lunar().date_hanzify('{干支年}{生肖}{月份}{日期}日'))
- + \ No newline at end of file diff --git a/dev/api/tools/marshoai_megakits/index.html b/dev/api/tools/marshoai_megakits/index.html index 87f380a4..60af79cb 100644 --- a/dev/api/tools/marshoai_megakits/index.html +++ b/dev/api/tools/marshoai_megakits/index.html @@ -28,7 +28,7 @@ return str(await mk_morse_code.morse_decrypt(msg))

async func nya_encode(msg: str)

源代码在GitHub上查看
python
async def nya_encode(msg: str):
     return str(await mk_nya_code.nya_encode(msg))

async func nya_decode(msg: str)

源代码在GitHub上查看
python
async def nya_decode(msg: str):
     return str(await mk_nya_code.nya_decode(msg))
- + \ No newline at end of file diff --git a/dev/api/tools/marshoai_megakits/mk_common.html b/dev/api/tools/marshoai_megakits/mk_common.html index 43647757..e5718414 100644 --- a/dev/api/tools/marshoai_megakits/mk_common.html +++ b/dev/api/tools/marshoai_megakits/mk_common.html @@ -37,7 +37,7 @@ return str(a % b) case _: return '未知运算符' - + \ No newline at end of file diff --git a/dev/api/tools/marshoai_megakits/mk_info.html b/dev/api/tools/marshoai_megakits/mk_info.html index ba39923c..99cf7ab1 100644 --- a/dev/api/tools/marshoai_megakits/mk_info.html +++ b/dev/api/tools/marshoai_megakits/mk_info.html @@ -22,7 +22,7 @@
Skip to content

模块 nonebot_plugin_marshoai.tools.marshoai_megakits.mk_info


async func twisuki()

源代码在GitHub上查看
python
async def twisuki():
     return 'Twiuski(苏阳)是megakits插件作者, Github : "https://github.com/Twisuki"'

async func megakits()

源代码在GitHub上查看
python
async def megakits():
     return 'MegaKits插件是一个功能混杂的MarshoAI插件, 由Twisuki(Github : "https://github.com/Twisuki")开发, 插件仓库 : "https://github.com/LiteyukiStudio/marsho-toolsets/tree/main/Twisuki/marshoai-megakits"'

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/tools/marshoai_megakits/mk_morse_code.html b/dev/api/tools/marshoai_megakits/mk_morse_code.html index 06412342..443e7f58 100644 --- a/dev/api/tools/marshoai_megakits/mk_morse_code.html +++ b/dev/api/tools/marshoai_megakits/mk_morse_code.html @@ -37,7 +37,7 @@ else: result += '?' return result - + \ No newline at end of file diff --git a/dev/api/tools/marshoai_megakits/mk_nya_code.html b/dev/api/tools/marshoai_megakits/mk_nya_code.html index f5cc34f9..12bd47a1 100644 --- a/dev/api/tools/marshoai_megakits/mk_nya_code.html +++ b/dev/api/tools/marshoai_megakits/mk_nya_code.html @@ -51,7 +51,7 @@ except Exception: return '翻译失败' return result - + \ No newline at end of file diff --git a/dev/api/tools/marshoai_memory/index.html b/dev/api/tools/marshoai_memory/index.html index 93d323ac..8d14d4d2 100644 --- a/dev/api/tools/marshoai_memory/index.html +++ b/dev/api/tools/marshoai_memory/index.html @@ -38,7 +38,7 @@ memory_data = json.load(f) for i in memory_data: ... - + \ No newline at end of file diff --git a/dev/api/tools/marshoai_meogirl/index.html b/dev/api/tools/marshoai_meogirl/index.html index 3b865c90..382f535d 100644 --- a/dev/api/tools/marshoai_meogirl/index.html +++ b/dev/api/tools/marshoai_meogirl/index.html @@ -23,7 +23,7 @@ return mg_info.meogirl()

async func search(msg: str, num: int = 3)

源代码在GitHub上查看
python
async def search(msg: str, num: int=3):
     return str(await mg_search.search(msg, num))

async func introduce(msg: str)

源代码在GitHub上查看
python
async def introduce(msg: str):
     return str(await mg_introduce.introduce(msg))
- + \ No newline at end of file diff --git a/dev/api/tools/marshoai_meogirl/mg_info.html b/dev/api/tools/marshoai_meogirl/mg_info.html index fe0d5c98..18cd9f88 100644 --- a/dev/api/tools/marshoai_meogirl/mg_info.html +++ b/dev/api/tools/marshoai_meogirl/mg_info.html @@ -21,7 +21,7 @@
Skip to content

模块 nonebot_plugin_marshoai.tools.marshoai_meogirl.mg_info


func meogirl()

源代码在GitHub上查看
python
def meogirl():
     return 'Meogirl指的是"萌娘百科"(https://zh.moegirl.org.cn/ , 简称"萌百"), 是一个"万物皆可萌的百科全书!"; 同时, MarshoTools也配有"Meogirl"插件, 可调用萌百的api'

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/tools/marshoai_meogirl/mg_introduce.html b/dev/api/tools/marshoai_meogirl/mg_introduce.html index 91a49d0b..d70de76b 100644 --- a/dev/api/tools/marshoai_meogirl/mg_introduce.html +++ b/dev/api/tools/marshoai_meogirl/mg_introduce.html @@ -61,7 +61,7 @@ else: logger.error(f'网络错误, 状态码 : {response.status_code}') return f'网络错误, 状态码 : {response.status_code}'

var keyword

- + \ No newline at end of file diff --git a/dev/api/tools/marshoai_meogirl/mg_search.html b/dev/api/tools/marshoai_meogirl/mg_search.html index 7fc26b98..13b034f8 100644 --- a/dev/api/tools/marshoai_meogirl/mg_search.html +++ b/dev/api/tools/marshoai_meogirl/mg_search.html @@ -58,7 +58,7 @@ else: logger.error(f'网络错误, 状态码 : {response.status_code}') return f'网络错误, 状态码 : {response.status_code}'

var soup

- + \ No newline at end of file diff --git a/dev/api/tools_wip/marshoai_memory/index.html b/dev/api/tools_wip/marshoai_memory/index.html index 43ca0a4e..9af49dd7 100644 --- a/dev/api/tools_wip/marshoai_memory/index.html +++ b/dev/api/tools_wip/marshoai_memory/index.html @@ -21,7 +21,7 @@
Skip to content

模块 nonebot_plugin_marshoai.tools_wip.marshoai_memory


async func write_memory(memory: str)

源代码在GitHub上查看
python
async def write_memory(memory: str):
     return ''

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/api/util.html b/dev/api/util.html index 4543a20c..118c2003 100644 --- a/dev/api/util.html +++ b/dev/api/util.html @@ -13,30 +13,30 @@ - + -
Skip to content

模块 nonebot_plugin_marshoai.util

var nickname_json

  • 说明: 记录昵称

  • 默认值: None

var praises_json

  • 说明: 记录夸赞名单

  • 默认值: None

var loaded_target_list

  • 说明: 记录已恢复备份的上下文的列表

  • 默认值: []


async func get_image_raw_and_type(url: str, timeout: int = 10) -> Optional[tuple[bytes, str]]

说明: 获取图片的二进制数据

参数:

  • url: str 图片链接
  • timeout: int 超时时间 秒
源代码在GitHub上查看
python
async def get_image_raw_and_type(url: str, timeout: int=10) -> Optional[tuple[bytes, str]]:
+    
Skip to content

模块 nonebot_plugin_marshoai.util

var nickname_json

  • 说明: 记录昵称

  • 默认值: None

var praises_json

  • 说明: 记录夸赞名单

  • 默认值: None

var loaded_target_list

  • 说明: 记录已恢复备份的上下文的列表

  • 默认值: []


async func get_image_raw_and_type(url: str, timeout: int = 10) -> Optional[tuple[bytes, str]]

说明: 获取图片的二进制数据

参数:

  • url: str 图片链接
  • timeout: int 超时时间 秒
源代码在GitHub上查看
python
async def get_image_raw_and_type(url: str, timeout: int=10) -> Optional[tuple[bytes, str]]:
     async with httpx.AsyncClient() as client:
-        response = await client.get(url, headers=_chromium_headers, timeout=timeout)
+        response = await client.get(url, headers=_browser_headers, timeout=timeout)
         if response.status_code == 200:
             content_type = response.headers.get('Content-Type')
             if not content_type:
                 content_type = mimetypes.guess_type(url)[0]
             return (response.content, str(content_type))
         else:
-            return None

async func get_image_b64(url: str, timeout: int = 10) -> Optional[str]

说明: 获取图片的base64编码

参数:

  • url: 图片链接
  • timeout: 超时时间 秒
源代码在GitHub上查看
python
async def get_image_b64(url: str, timeout: int=10) -> Optional[str]:
+            return None

async func get_image_b64(url: str, timeout: int = 10) -> Optional[str]

说明: 获取图片的base64编码

参数:

  • url: 图片链接
  • timeout: 超时时间 秒
源代码在GitHub上查看
python
async def get_image_b64(url: str, timeout: int=10) -> Optional[str]:
     if (data_type := (await get_image_raw_and_type(url, timeout))):
         base64_image = base64.b64encode(data_type[0]).decode('utf-8')
         data_url = 'data:{};base64,{}'.format(data_type[1], base64_image)
         return data_url
     else:
-        return None

async func make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list] = None)

说明: 调用ai获取回复

参数:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
源代码在GitHub上查看
python
async def make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list]=None):
-    return await client.complete(messages=msg, model=model_name, tools=tools, temperature=config.marshoai_temperature, max_tokens=config.marshoai_max_tokens, top_p=config.marshoai_top_p)

async func make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list] = None)

说明: 使用 Openai SDK 调用ai获取回复

参数:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
源代码在GitHub上查看
python
async def make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list]=None):
-    return await client.chat.completions.create(messages=msg, model=model_name, tools=tools or NOT_GIVEN, temperature=config.marshoai_temperature or NOT_GIVEN, max_tokens=config.marshoai_max_tokens or NOT_GIVEN, top_p=config.marshoai_top_p or NOT_GIVEN, timeout=config.marshoai_timeout)

func get_praises()

源代码在GitHub上查看
python
def get_praises():
+        return None

async func make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list] = None)

说明: 调用ai获取回复

参数:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
源代码在GitHub上查看
python
async def make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list]=None):
+    return await client.complete(messages=msg, model=model_name, tools=tools, temperature=config.marshoai_temperature, max_tokens=config.marshoai_max_tokens, top_p=config.marshoai_top_p)

async func make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list] = None)

说明: 使用 Openai SDK 调用ai获取回复

参数:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
源代码在GitHub上查看
python
async def make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list]=None):
+    return await client.chat.completions.create(messages=msg, model=model_name, tools=tools or NOT_GIVEN, temperature=config.marshoai_temperature or NOT_GIVEN, max_tokens=config.marshoai_max_tokens or NOT_GIVEN, top_p=config.marshoai_top_p or NOT_GIVEN, timeout=config.marshoai_timeout)

func get_praises()

源代码在GitHub上查看
python
def get_praises():
     global praises_json
     if praises_json is None:
         praises_file = store.get_plugin_data_file('praises.json')
@@ -46,7 +46,7 @@
         with open(praises_file, 'r', encoding='utf-8') as f:
             data = json.load(f)
         praises_json = data
-    return praises_json

async func refresh_praises_json()

源代码在GitHub上查看
python
async def refresh_praises_json():
+    return praises_json

async func refresh_praises_json()

源代码在GitHub上查看
python
async def refresh_praises_json():
     global praises_json
     praises_file = store.get_plugin_data_file('praises.json')
     if not praises_file.exists():
@@ -54,21 +54,21 @@
             json.dump(_praises_init_data, f, ensure_ascii=False, indent=4)
     async with aiofiles.open(praises_file, 'r', encoding='utf-8') as f:
         data = json.loads(await f.read())
-    praises_json = data

func build_praises()

源代码在GitHub上查看
python
def build_praises():
+    praises_json = data

func build_praises() -> str

源代码在GitHub上查看
python
def build_praises() -> str:
     praises = get_praises()
     result = ['你喜欢以下几个人物,他们有各自的优点:']
     for item in praises['like']:
         result.append(f"名字:{item['name']},优点:{item['advantages']}")
-    return '\n'.join(result)

async func save_context_to_json(name: str, context: Any, path: str)

源代码在GitHub上查看
python
async def save_context_to_json(name: str, context: Any, path: str):
+    return '\n'.join(result)

async func save_context_to_json(name: str, context: Any, path: str)

源代码在GitHub上查看
python
async def save_context_to_json(name: str, context: Any, path: str):
     (context_dir := (store.get_plugin_data_dir() / path)).mkdir(parents=True, exist_ok=True)
     with open(context_dir / f'{name}.json', 'w', encoding='utf-8') as json_file:
-        json.dump(context, json_file, ensure_ascii=False, indent=4)

async func load_context_from_json(name: str, path: str) -> list

说明: 从指定路径加载历史记录

源代码在GitHub上查看
python
async def load_context_from_json(name: str, path: str) -> list:
+        json.dump(context, json_file, ensure_ascii=False, indent=4)

async func load_context_from_json(name: str, path: str) -> list

说明: 从指定路径加载历史记录

源代码在GitHub上查看
python
async def load_context_from_json(name: str, path: str) -> list:
     (context_dir := (store.get_plugin_data_dir() / path)).mkdir(parents=True, exist_ok=True)
     if (file_path := (context_dir / f'{name}.json')).exists():
         async with aiofiles.open(file_path, 'r', encoding='utf-8') as json_file:
             return json.loads(await json_file.read())
     else:
-        return []

async func get_nicknames()

说明: 获取nickname_json, 优先来源于全局变量

源代码在GitHub上查看
python
async def get_nicknames():
+        return []

async func get_nicknames()

说明: 获取nickname_json, 优先来源于全局变量

源代码在GitHub上查看
python
async def get_nicknames():
     global nickname_json
     if nickname_json is None:
         filename = store.get_plugin_data_file('nickname.json')
@@ -77,7 +77,7 @@
                 nickname_json = json.loads(await f.read())
         except Exception:
             nickname_json = {}
-    return nickname_json

async func set_nickname(user_id: str, name: str)

源代码在GitHub上查看
python
async def set_nickname(user_id: str, name: str):
+    return nickname_json

async func set_nickname(user_id: str, name: str)

源代码在GitHub上查看
python
async def set_nickname(user_id: str, name: str):
     global nickname_json
     filename = store.get_plugin_data_file('nickname.json')
     if not filename.exists():
@@ -90,13 +90,13 @@
         del data[user_id]
     with open(filename, 'w', encoding='utf-8') as f:
         json.dump(data, f, ensure_ascii=False, indent=4)
-    nickname_json = data

async func refresh_nickname_json()

说明: 强制刷新nickname_json, 刷新全局变量

源代码在GitHub上查看
python
async def refresh_nickname_json():
+    nickname_json = data

async func refresh_nickname_json()

说明: 强制刷新nickname_json, 刷新全局变量

源代码在GitHub上查看
python
async def refresh_nickname_json():
     global nickname_json
     try:
         async with aiofiles.open(store.get_plugin_data_file('nickname.json'), 'r', encoding='utf-8') as f:
             nickname_json = json.loads(await f.read())
     except Exception:
-        logger.error('刷新 nickname_json 表错误:无法载入 nickname.json 文件')

func get_prompt()

说明: 获取系统提示词

源代码在GitHub上查看
python
def get_prompt():
+        logger.error('刷新 nickname_json 表错误:无法载入 nickname.json 文件')

func get_prompt()

说明: 获取系统提示词

源代码在GitHub上查看
python
def get_prompt():
     prompts = config.marshoai_additional_prompt
     if config.marshoai_enable_praises:
         praises_prompt = build_praises()
@@ -105,12 +105,12 @@
         prompts += _time_prompt.format(date_time=(current_time := DateTime.now()).strftime('%Y年%m月%d日 %H:%M:%S'), weekday_name=_weekdays[current_time.weekday()], lunar_date=current_time.chinesize.date_hanzify('农历{干支年}{生肖}{月份}{日期}'))
     marsho_prompt = config.marshoai_prompt
     spell = SystemMessage(content=marsho_prompt + prompts).as_dict()
-    return spell

func suggest_solution(errinfo: str) -> str

源代码在GitHub上查看
python
def suggest_solution(errinfo: str) -> str:
+    return spell

func suggest_solution(errinfo: str) -> str

源代码在GitHub上查看
python
def suggest_solution(errinfo: str) -> str:
     suggestions = {'content_filter': '消息已被内容过滤器过滤。请调整聊天内容后重试。', 'RateLimitReached': '模型达到调用速率限制。请稍等一段时间或联系Bot管理员。', 'tokens_limit_reached': '请求token达到上限。请重置上下文。', 'content_length_limit': '请求体过大。请重置上下文。', 'unauthorized': '访问token无效。请联系Bot管理员。', 'invalid type: parameter messages.content is of type array but should be of type string.': '聊天请求体包含此模型不支持的数据类型。请重置上下文。', 'At most 1 image(s) may be provided in one request.': '此模型只能在上下文中包含1张图片。如果此前的聊天已经发送过图片,请重置上下文。'}
     for key, suggestion in suggestions.items():
         if key in errinfo:
             return f'\n{suggestion}'
-    return ''

async func get_backup_context(target_id: str, target_private: bool) -> list

说明: 获取历史上下文

源代码在GitHub上查看
python
async def get_backup_context(target_id: str, target_private: bool) -> list:
+    return ''

async func get_backup_context(target_id: str, target_private: bool) -> list

说明: 获取历史上下文

源代码在GitHub上查看
python
async def get_backup_context(target_id: str, target_private: bool) -> list:
     global loaded_target_list
     if target_private:
         target_uid = f'private_{target_id}'
@@ -119,12 +119,24 @@
     if target_uid not in loaded_target_list:
         loaded_target_list.append(target_uid)
         return await load_context_from_json(f'back_up_context_{target_uid}', 'contexts/backup')
-    return []

var latex_convert

  • 说明: 开启一个转换实例

  • 默认值: ConvertLatex()


@get_driver().on_bot_connect

async func load_latex_convert()

源代码在GitHub上查看
python
@get_driver().on_bot_connect
+    return []

func extract_content_and_think(message: ChatCompletionMessage) -> tuple[str, str | None, ChatCompletionMessage]

说明: 处理 API 返回的消息对象,提取其中的内容和思维链,并返回处理后的消息,思维链,消息对象。

参数:

  • message (ChatCompletionMessage): API 返回的消息对象。
源代码在GitHub上查看
python
def extract_content_and_think(message: ChatCompletionMessage) -> tuple[str, str | None, ChatCompletionMessage]:
+    try:
+        thinking = message.reasoning_content
+    except AttributeError:
+        thinking = None
+    if thinking:
+        delattr(message, 'reasoning_content')
+    else:
+        think_blocks = re.findall('<think>(.*?)</think>', message.content or '', flags=re.DOTALL)
+        thinking = '\n'.join([block.strip() for block in think_blocks if block.strip()])
+    content = re.sub('<think>.*?</think>', '', message.content or '', flags=re.DOTALL).strip()
+    message.content = content
+    return (content, thinking, message)

var latex_convert

  • 说明: 开启一个转换实例

  • 默认值: ConvertLatex()


@get_driver().on_bot_connect

async func load_latex_convert()

源代码在GitHub上查看
python
@get_driver().on_bot_connect
 async def load_latex_convert():
-    await latex_convert.load_channel(None)

async func get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]])

源代码在GitHub上查看
python
async def get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]]):
+    await latex_convert.load_channel(None)

async func get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]])

源代码在GitHub上查看
python
async def get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]]):
     for torep, rep in code_blank_uuid_map:
         msg = msg.replace(torep, rep)
-    return msg

async func parse_richtext(msg: str) -> UniMessage

说明: 人工智能给出的回答一般不会包含 HTML 嵌入其中,但是包含图片或者 LaTeX 公式、代码块,都很正常。 这个函数会把这些都以图片形式嵌入消息体。

源代码在GitHub上查看
python
async def parse_richtext(msg: str) -> UniMessage:
+    return msg

async func parse_richtext(msg: str) -> UniMessage

说明: 人工智能给出的回答一般不会包含 HTML 嵌入其中,但是包含图片或者 LaTeX 公式、代码块,都很正常。 这个函数会把这些都以图片形式嵌入消息体。

源代码在GitHub上查看
python
async def parse_richtext(msg: str) -> UniMessage:
     if not IMG_LATEX_PATTERN.search(msg):
         return UniMessage(msg)
     result_msg = UniMessage()
@@ -158,8 +170,8 @@
         else:
             result_msg.append(TextMsg(tag_found + '(未知内容解析失败)'))
     result_msg.append(TextMsg(await get_uuid_back2codeblock(msg[last_tag_index:], code_blank_uuid_map)))
-    return result_msg

文档完善中,欢迎提出建议或帮助我们完善。

- + return result_msg

var thinking

  • 说明: type: ignore

  • 默认值: message.reasoning_content

文档完善中,欢迎提出建议或帮助我们完善。

+ \ No newline at end of file diff --git a/dev/api/util_hunyuan.html b/dev/api/util_hunyuan.html index 9afac734..1866cf2c 100644 --- a/dev/api/util_hunyuan.html +++ b/dev/api/util_hunyuan.html @@ -31,7 +31,7 @@ req.from_json_string(json.dumps(params)) resp = client.TextToImageLite(req) return resp.to_json_string() - + \ No newline at end of file diff --git a/dev/extension.html b/dev/extension.html index 369dd8ee..082475cf 100644 --- a/dev/extension.html +++ b/dev/extension.html @@ -48,7 +48,7 @@ @on_function_call(description="获取机器人信息") async def get_bot_info(b: Bot) -> str: return f"机器人ID: {b.self_id}"

兼容性

插件可以编写NoneBot或者轻雪插件的内容,可作为NoneBot插件或者轻雪插件单独发布

不过,所编写功能仅会在对应的实例上加载对应的功能,如果通过marshoai加载混合插件,那么插件中NoneBot的功能将会依附于marshoai插件, 若通过NoneBot加载包含marshoai功能的NoneBot插件,那么marshoai功能将会依附于NoneBot插件。

我们建议:若插件中包含了NoneBot功能,仍然使用marshoai进行加载,这样更符合逻辑。若你想发布为NoneBot插件,请注意require("nonebot_plugin_marshoai"),这是老生常谈了。

TIP

本质上都是动态导入和注册声明加载,运行时把这些东西塞到一起

插件热重载

插件热重载是一个实验性功能,可以在不重启机器人的情况下更新插件

WARNING

框架无法完全消除之前插件带来的副作用,当开发测试中效果不符合预期时请重启机器人实例

为了更好地让热重载功能正常工作,尽可能使用函数式的编程风格,以减少副作用的影响

MARSHOAI_DEVMODE环境变量设置为true,然后在配置的插件目录MARSHOAI_PLUGIN_DIRS下开发插件,当插件发生变化时,机器人会自动变动的插件。

AIGC 自举

WARNING

该功能为实验性功能,请注意甄别AI的行为,不要让AI执行危险的操作。

function call为AI赋能,实现了文件io操作,AI可以调用function call来读取文档然后给自己编写代码,实现自举。

其他

- + \ No newline at end of file diff --git a/dev/index.html b/dev/index.html index d7f80d41..15f8c11a 100644 --- a/dev/index.html +++ b/dev/index.html @@ -20,7 +20,7 @@
Skip to content

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/dev/project.html b/dev/project.html index e0ceaa13..2deb87f7 100644 --- a/dev/project.html +++ b/dev/project.html @@ -25,7 +25,7 @@ pip install pdm # 安装依赖管理 pdm install # 安装依赖 pre-commit install # 安装 pre-commit 钩子

代码规范

主仓库需要遵循以下代码规范

可以在编辑器中安装相应的插件进行辅助

其他

感谢以下的贡献者们:

Contributors
- + \ No newline at end of file diff --git a/en/dev/api/azure.html b/en/dev/api/azure.html index 387d122e..ea5802f9 100644 --- a/en/dev/api/azure.html +++ b/en/dev/api/azure.html @@ -180,7 +180,7 @@ await UniMessage(str(e) + suggest_solution(str(e))).send() traceback.print_exc() return

var text

- + \ No newline at end of file diff --git a/en/dev/api/azure_onebot.html b/en/dev/api/azure_onebot.html index 63f2b098..8963b0e3 100644 --- a/en/dev/api/azure_onebot.html +++ b/en/dev/api/azure_onebot.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.azure_onebot

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/config.html b/en/dev/api/config.html index 2b2af071..624e99de 100644 --- a/en/dev/api/config.html +++ b/en/dev/api/config.html @@ -38,7 +38,7 @@ logger.info(f'新增配置项: {key} = {value}') old_config[key] = value return old_config - + \ No newline at end of file diff --git a/en/dev/api/constants.html b/en/dev/api/constants.html index fe32b60f..81831d02 100644 --- a/en/dev/api/constants.html +++ b/en/dev/api/constants.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.constants

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/deal_latex.html b/en/dev/api/deal_latex.html index 2cb7a9eb..e5d252f2 100644 --- a/en/dev/api/deal_latex.html +++ b/en/dev/api/deal_latex.html @@ -114,7 +114,7 @@ results = await asyncio.gather(*(channel_test_wrapper(channel) for channel in channel_list)) best_channel = min(results, key=lambda x: x[0])[1] return best_channel()

attr channel: ConvertChannel = NO_DEFAULT

- + \ No newline at end of file diff --git a/en/dev/api/dev.html b/en/dev/api/dev.html index 73df1f8d..7bc13305 100644 --- a/en/dev/api/dev.html +++ b/en/dev/api/dev.html @@ -64,7 +64,7 @@ else: logger.debug('未找到变动插件') return

var dir_list

- + \ No newline at end of file diff --git a/en/dev/api/hooks.html b/en/dev/api/hooks.html index aa6f7eff..df24384b 100644 --- a/en/dev/api/hooks.html +++ b/en/dev/api/hooks.html @@ -30,7 +30,7 @@ target_uid = 'group_' + target_id await save_context_to_json(f'back_up_context_{target_uid}', contexts_data, 'contexts/backup') logger.info(f'已保存会话 {target_id} 的上下文备份,将在下次对话时恢复~')

var marshoai_plugin_dirs

- + \ No newline at end of file diff --git a/en/dev/api/hunyuan.html b/en/dev/api/hunyuan.html index 90e48ee4..f070dac6 100644 --- a/en/dev/api/hunyuan.html +++ b/en/dev/api/hunyuan.html @@ -29,7 +29,7 @@ await UniMessage.image(url=url).send() except Exception as e: traceback.print_exc() - + \ No newline at end of file diff --git a/en/dev/api/index.html b/en/dev/api/index.html index bcc96a76..3eb3bde8 100644 --- a/en/dev/api/index.html +++ b/en/dev/api/index.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai

MIT License

Copyright (c) 2025 Asankilp & LiteyukiStudio

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/instances.html b/en/dev/api/instances.html index 4a9adb56..f3c2724b 100644 --- a/en/dev/api/instances.html +++ b/en/dev/api/instances.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.instances

var target_list

  • Description: 记录需保存历史上下文的列表

  • Type: list[list]

  • Default: []

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/marsho.html b/en/dev/api/marsho.html index e0019b80..09d2a3d7 100644 --- a/en/dev/api/marsho.html +++ b/en/dev/api/marsho.html @@ -13,41 +13,41 @@ - + -
Skip to content

Module nonebot_plugin_marshoai.marsho


async func at_enable()

Source code or View on GitHub
python
async def at_enable():
-    return config.marshoai_at

@add_usermsg_cmd.handle()

async func add_usermsg(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@add_usermsg_cmd.handle()
+    
Skip to content

Module nonebot_plugin_marshoai.marsho


async func at_enable()

Source code or View on GitHub
python
async def at_enable():
+    return config.marshoai_at

@add_usermsg_cmd.handle()

async func add_usermsg(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@add_usermsg_cmd.handle()
 async def add_usermsg(target: MsgTarget, arg: Message=CommandArg()):
     if (msg := arg.extract_plain_text()):
         context.append(UserMessage(content=msg).as_dict(), target.id, target.private)
-        await add_usermsg_cmd.finish('已添加用户消息')

@add_assistantmsg_cmd.handle()

async func add_assistantmsg(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@add_assistantmsg_cmd.handle()
+        await add_usermsg_cmd.finish('已添加用户消息')

@add_assistantmsg_cmd.handle()

async func add_assistantmsg(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@add_assistantmsg_cmd.handle()
 async def add_assistantmsg(target: MsgTarget, arg: Message=CommandArg()):
     if (msg := arg.extract_plain_text()):
         context.append(AssistantMessage(content=msg).as_dict(), target.id, target.private)
-        await add_assistantmsg_cmd.finish('已添加助手消息')

@praises_cmd.handle()

async func praises()

Source code or View on GitHub
python
@praises_cmd.handle()
+        await add_assistantmsg_cmd.finish('已添加助手消息')

@praises_cmd.handle()

async func praises()

Source code or View on GitHub
python
@praises_cmd.handle()
 async def praises():
-    await praises_cmd.finish(build_praises())

@contexts_cmd.handle()

async func contexts(target: MsgTarget)

Source code or View on GitHub
python
@contexts_cmd.handle()
+    await praises_cmd.finish(build_praises())

@contexts_cmd.handle()

async func contexts(target: MsgTarget)

Source code or View on GitHub
python
@contexts_cmd.handle()
 async def contexts(target: MsgTarget):
     backup_context = await get_backup_context(target.id, target.private)
     if backup_context:
         context.set_context(backup_context, target.id, target.private)
-    await contexts_cmd.finish(str(context.build(target.id, target.private)))

@save_context_cmd.handle()

async func save_context(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@save_context_cmd.handle()
+    await contexts_cmd.finish(str(context.build(target.id, target.private)))

@save_context_cmd.handle()

async func save_context(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@save_context_cmd.handle()
 async def save_context(target: MsgTarget, arg: Message=CommandArg()):
     contexts_data = context.build(target.id, target.private)
     if not context:
         await save_context_cmd.finish('暂无上下文可以保存')
     if (msg := arg.extract_plain_text()):
         await save_context_to_json(msg, contexts_data, 'contexts')
-        await save_context_cmd.finish('已保存上下文')

@load_context_cmd.handle()

async func load_context(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@load_context_cmd.handle()
+        await save_context_cmd.finish('已保存上下文')

@load_context_cmd.handle()

async func load_context(target: MsgTarget, arg: Message = CommandArg())

Source code or View on GitHub
python
@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)
         context.set_context(await load_context_from_json(msg, 'contexts'), target.id, target.private)
-        await load_context_cmd.finish('已加载并覆盖上下文')

@resetmem_cmd.handle()

async func resetmem(target: MsgTarget)

Source code or View on GitHub
python
@resetmem_cmd.handle()
+        await load_context_cmd.finish('已加载并覆盖上下文')

@resetmem_cmd.handle()

async func resetmem(target: MsgTarget)

Source code or View on GitHub
python
@resetmem_cmd.handle()
 async def resetmem(target: MsgTarget):
     if [target.id, target.private] not in target_list:
         target_list.append([target.id, target.private])
@@ -55,12 +55,12 @@
     if backup_context:
         context.set_context(backup_context, target.id, target.private)
     context.reset(target.id, target.private)
-    await resetmem_cmd.finish('上下文已重置')

@changemodel_cmd.handle()

async func changemodel(arg: Message = CommandArg())

Source code or View on GitHub
python
@changemodel_cmd.handle()
+    await resetmem_cmd.finish('上下文已重置')

@changemodel_cmd.handle()

async func changemodel(arg: Message = CommandArg())

Source code or View on GitHub
python
@changemodel_cmd.handle()
 async def changemodel(arg: Message=CommandArg()):
     global model_name
     if (model := arg.extract_plain_text()):
         model_name = model
-        await changemodel_cmd.finish('已切换')

@nickname_cmd.handle()

async func nickname(event: Event, name = None)

Source code or View on GitHub
python
@nickname_cmd.handle()
+        await changemodel_cmd.finish('已切换')

@nickname_cmd.handle()

async func nickname(event: Event, name = None)

Source code or View on GitHub
python
@nickname_cmd.handle()
 async def nickname(event: Event, name=None):
     nicknames = await get_nicknames()
     user_id = event.get_user_id()
@@ -75,15 +75,15 @@
         if len(name) > config.marshoai_nickname_limit:
             await nickname_cmd.finish('昵称超出长度限制:' + str(config.marshoai_nickname_limit))
         await set_nickname(user_id, name)
-        await nickname_cmd.finish('已设置昵称为:' + name)

@refresh_data_cmd.handle()

async func refresh_data()

Source code or View on GitHub
python
@refresh_data_cmd.handle()
+        await nickname_cmd.finish('已设置昵称为:' + name)

@refresh_data_cmd.handle()

async func refresh_data()

Source code or View on GitHub
python
@refresh_data_cmd.handle()
 async def refresh_data():
     await refresh_nickname_json()
     await refresh_praises_json()
-    await refresh_data_cmd.finish('已刷新数据')

@marsho_help_cmd.handle()

async func marsho_help()

Source code or View on GitHub
python
@marsho_help_cmd.handle()
+    await refresh_data_cmd.finish('已刷新数据')

@marsho_help_cmd.handle()

async func marsho_help()

Source code or View on GitHub
python
@marsho_help_cmd.handle()
 async def marsho_help():
-    await marsho_help_cmd.finish(metadata.usage)

@marsho_status_cmd.handle()

async func marsho_status(bot: Bot)

Source code or View on GitHub
python
@marsho_status_cmd.handle()
+    await marsho_help_cmd.finish(metadata.usage)

@marsho_status_cmd.handle()

async func marsho_status(bot: Bot)

Source code or View on GitHub
python
@marsho_status_cmd.handle()
 async def marsho_status(bot: Bot):
-    await marsho_status_cmd.finish(f'当前适配器:{bot.adapter.get_name()}\n当前使用的模型:{model_name}\n当前支持图片的模型:{str(SUPPORT_IMAGE_MODELS + config.marshoai_additional_image_models)}')

@marsho_at.handle()@marsho_cmd.handle()

async func marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg] = None)

Source code or View on GitHub
python
@marsho_at.handle()
+    await marsho_status_cmd.finish(f'当前适配器:{bot.adapter.get_name()}\n当前使用的模型:{model_name}\n当前支持图片的模型:{str(SUPPORT_IMAGE_MODELS + config.marshoai_additional_image_models)}')

@marsho_at.handle()@marsho_cmd.handle()

async func marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg] = None)

Source code or View on GitHub
python
@marsho_at.handle()
 @marsho_cmd.handle()
 async def marsho(target: MsgTarget, event: Event, bot: Bot, state: T_State, matcher: Matcher, text: Optional[UniMsg]=None):
     global target_list
@@ -126,7 +126,7 @@
         if not is_reasoning_model:
             context_msg = [get_prompt()] + context_msg
         tools_lists = tools.tools_list + list(map(lambda v: v.data(), get_function_calls().values()))
-        logger.debug(f'正在获取回答,模型:{model_name}')
+        logger.info(f'正在获取回答,模型:{model_name}')
         response = await make_chat_openai(client=client, model_name=model_name, msg=context_msg + [UserMessage(content=usermsg).as_dict()], tools=tools_lists if tools_lists else None)
         choice = response.choices[0]
         if choice.message.tool_calls != None and config.marshoai_fix_toolcalls:
@@ -134,18 +134,16 @@
         logger.info(f'完成原因:{choice.finish_reason}')
         if choice.finish_reason == CompletionsFinishReason.STOPPED:
             context.append(UserMessage(content=usermsg).as_dict(), target.id, target.private)
-            choice_msg_dict = choice.message.to_dict()
-            if 'reasoning_content' in choice_msg_dict:
-                if config.marshoai_send_thinking:
-                    await UniMessage('思维链:\n' + choice_msg_dict['reasoning_content']).send()
-                del choice_msg_dict['reasoning_content']
-            context.append(choice_msg_dict, target.id, target.private)
+            choice_msg_content, choice_msg_thinking, choice_msg_after = extract_content_and_think(choice.message)
+            if choice_msg_thinking and config.marshoai_send_thinking:
+                await UniMessage('思维链:\n' + choice_msg_thinking).send()
+            context.append(choice_msg_after.to_dict(), target.id, target.private)
             if [target.id, target.private] not in target_list:
                 target_list.append([target.id, target.private])
             if config.marshoai_enable_richtext_parse:
-                await (await parse_richtext(str(choice.message.content))).send(reply_to=True)
+                await (await parse_richtext(str(choice_msg_content))).send(reply_to=True)
             else:
-                await UniMessage(str(choice.message.content)).send(reply_to=True)
+                await UniMessage(str(choice_msg_content)).send(reply_to=True)
         elif choice.finish_reason == CompletionsFinishReason.CONTENT_FILTERED:
             await UniMessage('*已被内容过滤器过滤。请调整聊天内容后重试。').send(reply_to=True)
             return
@@ -200,7 +198,7 @@
     except Exception as e:
         await UniMessage(str(e) + suggest_solution(str(e))).send()
         traceback.print_exc()
-        return

@poke_notify.handle()

async func poke(event: Event)

Source code or View on GitHub
python
@poke_notify.handle()
+        return

@poke_notify.handle()

async func poke(event: Event)

Source code or View on GitHub
python
@poke_notify.handle()
 async def poke(event: Event):
     user_id = event.get_user_id()
     nicknames = await get_nicknames()
@@ -211,12 +209,13 @@
             response = await make_chat_openai(client=client, model_name=model_name, msg=[get_prompt() if model_name.lower() not in NO_SYSPROMPT_MODELS else None, UserMessage(content=f'*{user_nickname}{config.marshoai_poke_suffix}')])
             choice = response.choices[0]
             if choice.finish_reason == CompletionsFinishReason.STOPPED:
-                await UniMessage(' ' + str(choice.message.content)).send(at_sender=True)
+                content = extract_content_and_think(choice.message)[0]
+                await UniMessage(' ' + str(content)).send(at_sender=True)
     except Exception as e:
         await UniMessage(str(e) + suggest_solution(str(e))).send()
         traceback.print_exc()
         return

var text

  • Description: type: ignore

  • Default: event.get_message()

var request_msg

  • Description: type: ignore

  • Default: context_msg + [UserMessage(content=usermsg).as_dict()] + tool_msg

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/marsho_onebot.html b/en/dev/api/marsho_onebot.html index c3cda149..a69435e0 100644 --- a/en/dev/api/marsho_onebot.html +++ b/en/dev/api/marsho_onebot.html @@ -20,7 +20,7 @@ - + \ No newline at end of file diff --git a/en/dev/api/metadata.html b/en/dev/api/metadata.html index 6c4e16b0..af69fc01 100644 --- a/en/dev/api/metadata.html +++ b/en/dev/api/metadata.html @@ -20,7 +20,7 @@ - + \ No newline at end of file diff --git a/en/dev/api/models.html b/en/dev/api/models.html index 7cf7d058..912107b8 100644 --- a/en/dev/api/models.html +++ b/en/dev/api/models.html @@ -65,7 +65,7 @@ if not self.tools_list or not config.marshoai_enable_tools: return None return self.tools_list

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/observer.html b/en/dev/api/observer.html index 94a1c9c4..88438c0a 100644 --- a/en/dev/api/observer.html +++ b/en/dev/api/observer.html @@ -55,7 +55,7 @@ observer.schedule(code_modified_handler, directory, recursive=recursive) return func return decorator - + \ No newline at end of file diff --git a/en/dev/api/plugin/func_call/caller.html b/en/dev/api/plugin/func_call/caller.html index 554d2e27..68ae6d71 100644 --- a/en/dev/api/plugin/func_call/caller.html +++ b/en/dev/api/plugin/func_call/caller.html @@ -128,7 +128,7 @@ caller = Caller(name=name, description=description, func_type=func_type, no_module_name=no_module_name) return caller

func get_function_calls() -> dict[str, Caller]

Description: 获取所有已注册的function call函数

Return: dict[str, Caller]: 所有已注册的function call函数

Source code or View on GitHub
python
def get_function_calls() -> dict[str, Caller]:
     return _caller_data
- + \ No newline at end of file diff --git a/en/dev/api/plugin/func_call/index.html b/en/dev/api/plugin/func_call/index.html index afcbf55d..34946643 100644 --- a/en/dev/api/plugin/func_call/index.html +++ b/en/dev/api/plugin/func_call/index.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugin.func_call

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/plugin/func_call/models.html b/en/dev/api/plugin/func_call/models.html index bc567a11..a670d914 100644 --- a/en/dev/api/plugin/func_call/models.html +++ b/en/dev/api/plugin/func_call/models.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugin.func_call.models

class SessionContext(BaseModel)

attr bot: Bot = NO_DEFAULT

attr event: Event = NO_DEFAULT

attr matcher: Matcher = NO_DEFAULT

attr state: T_State = NO_DEFAULT

attr caller: Any = None

class SessionContextDepends(BaseModel)

attr bot: str | None = None

attr event: str | None = None

attr matcher: str | None = None

attr state: str | None = None

attr caller: str | None = None

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/plugin/func_call/params.html b/en/dev/api/plugin/func_call/params.html index 4f0a75fe..cfc5eacc 100644 --- a/en/dev/api/plugin/func_call/params.html +++ b/en/dev/api/plugin/func_call/params.html @@ -23,7 +23,7 @@ return {'type': self.type_, 'description': self.description, **{k: v for k, v in self.properties.items() if v is not None}}

attr type_: str = NO_DEFAULT

attr description: str = NO_DEFAULT

attr default: Any = None

attr properties: dict[str, Any] = {}

attr required: bool = False

class String(Parameter)

attr type_: str = ParamTypes.STRING

attr properties: dict[str, Any] = Field(default_factory=dict)

attr enum: list[str] | None = None

class Integer(Parameter)

attr type_: str = ParamTypes.INTEGER

attr properties: dict[str, Any] = Field(default_factory=lambda: {'minimum': 0, 'maximum': 100})

attr minimum: int | None = None

attr maximum: int | None = None

class Array(Parameter)

attr type_: str = ParamTypes.ARRAY

attr properties: dict[str, Any] = Field(default_factory=lambda: {'items': {'type': 'string'}})

attr items: str = Field('string', description='数组元素类型')

class FunctionCall(BaseModel)


func hash self => int

Source code or View on GitHub
python
def __hash__(self) -> int:
     return hash(self.name)

func data(self) -> dict[str, Any]

Description: 生成函数描述信息

Return: dict[str, Any]: 函数描述信息 字典

Source code or View on GitHub
python
def data(self) -> dict[str, Any]:
     return {'type': 'function', 'function': {'name': self.name, 'description': self.description, 'parameters': {'type': 'object', 'properties': {k: v.data() for k, v in self.arguments.items()}}, 'required': [k for k, v in self.arguments.items() if v.default is None], **self.kwargs}}

attr name: str = NO_DEFAULT

attr description: str = NO_DEFAULT

attr arguments: dict[str, Parameter] = NO_DEFAULT

attr function: FUNCTION_CALL_FUNC = NO_DEFAULT

attr kwargs: dict[str, Any] = {}

- + \ No newline at end of file diff --git a/en/dev/api/plugin/func_call/utils.html b/en/dev/api/plugin/func_call/utils.html index 9a3b1d7a..fd5b9c60 100644 --- a/en/dev/api/plugin/func_call/utils.html +++ b/en/dev/api/plugin/func_call/utils.html @@ -39,7 +39,7 @@ return False func_ = getattr(call, '__call__', None) return inspect.iscoroutinefunction(func_) - + \ No newline at end of file diff --git a/en/dev/api/plugin/index.html b/en/dev/api/plugin/index.html index a7f79078..ea2fda6d 100644 --- a/en/dev/api/plugin/index.html +++ b/en/dev/api/plugin/index.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugin

该功能目前正在开发中开发基本完成,暂时可用,受影响的文件夹 plugin, plugins

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/plugin/load.html b/en/dev/api/plugin/load.html index 661c3882..37c08561 100644 --- a/en/dev/api/plugin/load.html +++ b/en/dev/api/plugin/load.html @@ -69,7 +69,7 @@ logger.opt(colors=True).error(f'重新加载插件失败 "<r>{plugin.name}</r>"') traceback.print_exc() return None

var module

var module_name

var module_name

- + \ No newline at end of file diff --git a/en/dev/api/plugin/models.html b/en/dev/api/plugin/models.html index 2581440a..e614565d 100644 --- a/en/dev/api/plugin/models.html +++ b/en/dev/api/plugin/models.html @@ -22,7 +22,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugin.models

class PluginMetadata(BaseModel)

attr name: str = NO_DEFAULT

attr description: str = ''

attr usage: str = ''

attr author: str = ''

attr homepage: str = ''

attr extra: dict[str, Any] = {}

class Plugin(BaseModel)


func hash self => int

Source code or View on GitHub
python
def __hash__(self) -> int:
     return hash(self.name)

func self == other: Any => bool

Source code or View on GitHub
python
def __eq__(self, other: Any) -> bool:
     return self.name == other.name

attr name: str = NO_DEFAULT

attr module: ModuleType = NO_DEFAULT

attr module_name: str = NO_DEFAULT

attr module_path: str | None = NO_DEFAULT

attr metadata: PluginMetadata | None = None

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/plugin/register.html b/en/dev/api/plugin/register.html index 2a7485dc..a1c86689 100644 --- a/en/dev/api/plugin/register.html +++ b/en/dev/api/plugin/register.html @@ -29,7 +29,7 @@ name = func.__name__ description = func.__doc__ logger.info(f'注册函数: {name} {description}') - + \ No newline at end of file diff --git a/en/dev/api/plugin/typing.html b/en/dev/api/plugin/typing.html index 82a29b31..67248f65 100644 --- a/en/dev/api/plugin/typing.html +++ b/en/dev/api/plugin/typing.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugin.typing

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/plugin/utils.html b/en/dev/api/plugin/utils.html index b1e8d963..d7d1eaa5 100644 --- a/en/dev/api/plugin/utils.html +++ b/en/dev/api/plugin/utils.html @@ -26,7 +26,7 @@ else: return '.'.join(rel_path.parts[:-1] + (rel_path.stem,))

func parse_function_docsring()

Source code or View on GitHub
python
def parse_function_docsring():
     pass
- + \ No newline at end of file diff --git a/en/dev/api/plugins/builtin_tools/chat.html b/en/dev/api/plugins/builtin_tools/chat.html index 8c0948e0..61dc5b18 100644 --- a/en/dev/api/plugins/builtin_tools/chat.html +++ b/en/dev/api/plugins/builtin_tools/chat.html @@ -43,7 +43,7 @@ return '发送完成' except Exception as e: return '发送失败: ' + str(e) - + \ No newline at end of file diff --git a/en/dev/api/plugins/builtin_tools/file_io.html b/en/dev/api/plugins/builtin_tools/file_io.html index 71ee5bb0..621b664e 100644 --- a/en/dev/api/plugins/builtin_tools/file_io.html +++ b/en/dev/api/plugins/builtin_tools/file_io.html @@ -33,7 +33,7 @@ return '写入成功' except Exception as e: return '写入出错: ' + str(e) - + \ No newline at end of file diff --git a/en/dev/api/plugins/builtin_tools/index.html b/en/dev/api/plugins/builtin_tools/index.html index 0c20f63b..700ff0f8 100644 --- a/en/dev/api/plugins/builtin_tools/index.html +++ b/en/dev/api/plugins/builtin_tools/index.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugins.builtin_tools

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/plugins/builtin_tools/liteyuki.html b/en/dev/api/plugins/builtin_tools/liteyuki.html index 7dc6e701..ba920932 100644 --- a/en/dev/api/plugins/builtin_tools/liteyuki.html +++ b/en/dev/api/plugins/builtin_tools/liteyuki.html @@ -29,7 +29,7 @@ response = await client.get('https://api.liteyuki.icu/online') online = response.json().get('online') return f'注册节点数: {register}\n在线节点数: {online}' - + \ No newline at end of file diff --git a/en/dev/api/plugins/builtin_tools/manager.html b/en/dev/api/plugins/builtin_tools/manager.html index 41bf1445..932c6344 100644 --- a/en/dev/api/plugins/builtin_tools/manager.html +++ b/en/dev/api/plugins/builtin_tools/manager.html @@ -28,7 +28,7 @@ else: reply += f'名称: {p.name},描述: 暂无\n' return reply - + \ No newline at end of file diff --git a/en/dev/api/plugins/builtin_tools/network.html b/en/dev/api/plugins/builtin_tools/network.html index 21870881..54144c4b 100644 --- a/en/dev/api/plugins/builtin_tools/network.html +++ b/en/dev/api/plugins/builtin_tools/network.html @@ -40,7 +40,7 @@ logger.error(f'marsho builtin: 获取网页内容失败: {e}') return '获取网页内容失败:' + str(e) return '未能获取到有效的网页内容' - + \ No newline at end of file diff --git a/en/dev/api/plugins/builtin_tools/utils.html b/en/dev/api/plugins/builtin_tools/utils.html index b4512607..d06b4b90 100644 --- a/en/dev/api/plugins/builtin_tools/utils.html +++ b/en/dev/api/plugins/builtin_tools/utils.html @@ -22,7 +22,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugins.builtin_tools.utils


async func make_html_summary(html_content: str, language: str = 'english', length: int = 3) -> str

Description: 使用html内容生成摘要

Arguments:

  • html_content (str): html内容
  • language (str, optional): 语言. Defaults to "english".
  • length (int, optional): 摘要长度. Defaults to 3.

Return: str: 摘要

Source code or View on GitHub
python
async def make_html_summary(html_content: str, language: str='english', length: int=3) -> str:
     loop = asyncio.get_event_loop()
     return await loop.run_in_executor(executor, _make_summary, html_content, language, length)

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/plugins/marshoai_bangumi/index.html b/en/dev/api/plugins/marshoai_bangumi/index.html index d72e3d72..2e7c23f7 100644 --- a/en/dev/api/plugins/marshoai_bangumi/index.html +++ b/en/dev/api/plugins/marshoai_bangumi/index.html @@ -47,7 +47,7 @@ except Exception as e: traceback.print_exc() return '' - + \ No newline at end of file diff --git a/en/dev/api/plugins/marshoai_basic/index.html b/en/dev/api/plugins/marshoai_basic/index.html index aac8b799..51cfa296 100644 --- a/en/dev/api/plugins/marshoai_basic/index.html +++ b/en/dev/api/plugins/marshoai_basic/index.html @@ -30,7 +30,7 @@ current_lunar_date = DateTime.now().to_lunar().date_hanzify()[5:] time_prompt = f'现在的时间是{current_time}{current_weekday_name},农历{current_lunar_date}。' return time_prompt - + \ No newline at end of file diff --git a/en/dev/api/plugins/twisuki_megakits/index.html b/en/dev/api/plugins/twisuki_megakits/index.html index 09f0a941..d443eaf2 100644 --- a/en/dev/api/plugins/twisuki_megakits/index.html +++ b/en/dev/api/plugins/twisuki_megakits/index.html @@ -28,7 +28,7 @@ return str(await mk_nya_code.nya_encrypt(msg))

@on_function_call(description='将猫语翻译回人类语言').params(msg=String(description='被翻译语句'))

async func nya_decrypt(msg: str) -> str

Description: 将猫语翻译回人类语言

Source code or View on GitHub
python
@on_function_call(description='将猫语翻译回人类语言').params(msg=String(description='被翻译语句'))
 async def nya_decrypt(msg: str) -> str:
     return str(await mk_nya_code.nya_decrypt(msg))
- + \ No newline at end of file diff --git a/en/dev/api/plugins/twisuki_megakits/mk_morse_code.html b/en/dev/api/plugins/twisuki_megakits/mk_morse_code.html index 5119cea4..25ba1ad7 100644 --- a/en/dev/api/plugins/twisuki_megakits/mk_morse_code.html +++ b/en/dev/api/plugins/twisuki_megakits/mk_morse_code.html @@ -38,7 +38,7 @@ else: result += '?' return result - + \ No newline at end of file diff --git a/en/dev/api/plugins/twisuki_megakits/mk_nya_code.html b/en/dev/api/plugins/twisuki_megakits/mk_nya_code.html index 75412256..2d881c77 100644 --- a/en/dev/api/plugins/twisuki_megakits/mk_nya_code.html +++ b/en/dev/api/plugins/twisuki_megakits/mk_nya_code.html @@ -55,7 +55,7 @@ except Exception: return '翻译失败' return result

var char

var char

var char

var char

var char

- + \ No newline at end of file diff --git a/en/dev/api/plugins/twisuki_petcat/index.html b/en/dev/api/plugins/twisuki_petcat/index.html index 8c13498d..ed244b42 100644 --- a/en/dev/api/plugins/twisuki_petcat/index.html +++ b/en/dev/api/plugins/twisuki_petcat/index.html @@ -36,7 +36,7 @@ return pc_info.print_type_list()

@on_function_call(description='可选技能').params()

async func help_cat_skill() -> str

Source code or View on GitHub
python
@on_function_call(description='可选技能').params()
 async def help_cat_skill() -> str:
     return pc_info.print_skill_list()
- + \ No newline at end of file diff --git a/en/dev/api/plugins/twisuki_petcat/pc_cat.html b/en/dev/api/plugins/twisuki_petcat/pc_cat.html index 37c14e53..6db68643 100644 --- a/en/dev/api/plugins/twisuki_petcat/pc_cat.html +++ b/en/dev/api/plugins/twisuki_petcat/pc_cat.html @@ -126,7 +126,7 @@ data['energy'] = min(data['energy'] + 16, 0) token = dict_to_token(data) return f'''你抱猫休息了一阵子, 猫猫的活力值提升到了{value_output(data['energy'])}\n新token : "{token}"\n请妥善保存token, 这是猫猫的唯一标识符!''' - + \ No newline at end of file diff --git a/en/dev/api/plugins/twisuki_petcat/pc_info.html b/en/dev/api/plugins/twisuki_petcat/pc_info.html index b5d70ac5..5a0af9a9 100644 --- a/en/dev/api/plugins/twisuki_petcat/pc_info.html +++ b/en/dev/api/plugins/twisuki_petcat/pc_info.html @@ -42,7 +42,7 @@ logger.info(data['skill']) return result[:-2]

func help_cat_new() -> str

Source code or View on GitHub
python
def help_cat_new() -> str:
     return f'新建一只猫猫, 首先选择猫猫的种类, 获取初始化token;然后用这个token, 选择名字和一个技能进行初始化;初始化结束才表示猫猫正式创建成功.\ntoken为猫的唯一标识符, 每次交互都需要传入token\n种类可选 : {print_type_list()}\n技能可选 : {print_skill_list()}'
- + \ No newline at end of file diff --git a/en/dev/api/plugins/twisuki_petcat/pc_shop.html b/en/dev/api/plugins/twisuki_petcat/pc_shop.html index 29fe097b..bad96c0a 100644 --- a/en/dev/api/plugins/twisuki_petcat/pc_shop.html +++ b/en/dev/api/plugins/twisuki_petcat/pc_shop.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugins.twisuki_petcat.pc_shop

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/plugins/twisuki_petcat/pc_token.html b/en/dev/api/plugins/twisuki_petcat/pc_token.html index 492c5a7c..514bd791 100644 --- a/en/dev/api/plugins/twisuki_petcat/pc_token.html +++ b/en/dev/api/plugins/twisuki_petcat/pc_token.html @@ -120,7 +120,7 @@ token = base64.b64encode(token_byte).decode() logger.success(f'编码完成, token为\n{token}') return token - + \ No newline at end of file diff --git a/en/dev/api/plugins_test/marshoai_basic/index.html b/en/dev/api/plugins_test/marshoai_basic/index.html index eeda84bd..8c922e8b 100644 --- a/en/dev/api/plugins_test/marshoai_basic/index.html +++ b/en/dev/api/plugins_test/marshoai_basic/index.html @@ -24,7 +24,7 @@ current_time = DateTime.now() time_prompt = '现在的时间是 {}{}{}。'.format(current_time.strftime('%Y.%m.%d %H:%M:%S'), weekdays[current_time.weekday()], current_time.chinesize.date_hanzify('农历{干支年}{生肖}{月份}{数序日}')) return time_prompt - + \ No newline at end of file diff --git a/en/dev/api/plugins_test/marshoai_memory/command.html b/en/dev/api/plugins_test/marshoai_memory/command.html index 7d19064e..3ef249d8 100644 --- a/en/dev/api/plugins_test/marshoai_memory/command.html +++ b/en/dev/api/plugins_test/marshoai_memory/command.html @@ -38,7 +38,7 @@ json.dump(memory_data, f, ensure_ascii=False, indent=4) await matcher.finish('记忆已重置~') await matcher.finish('没有找到该用户的记忆~') - + \ No newline at end of file diff --git a/en/dev/api/plugins_test/marshoai_memory/config.html b/en/dev/api/plugins_test/marshoai_memory/config.html index b2084421..b0718e3b 100644 --- a/en/dev/api/plugins_test/marshoai_memory/config.html +++ b/en/dev/api/plugins_test/marshoai_memory/config.html @@ -20,7 +20,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugins_test.marshoai_memory.config

class ConfigModel(BaseModel)

attr marshoai_plugin_memory_scheduler: bool = True

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/plugins_test/marshoai_memory/index.html b/en/dev/api/plugins_test/marshoai_memory/index.html index c36d25ac..81ad84d6 100644 --- a/en/dev/api/plugins_test/marshoai_memory/index.html +++ b/en/dev/api/plugins_test/marshoai_memory/index.html @@ -49,7 +49,7 @@ logger.error(f'整理关于{i}的记忆时出错:{res}') with open(memory_path, 'w', encoding='utf-8') as f: json.dump(memory_data, f, ensure_ascii=False, indent=4)

var memory

- + \ No newline at end of file diff --git a/en/dev/api/plugins_test/random_number_generator.html b/en/dev/api/plugins_test/random_number_generator.html index ba4fe931..d9b98683 100644 --- a/en/dev/api/plugins_test/random_number_generator.html +++ b/en/dev/api/plugins_test/random_number_generator.html @@ -25,7 +25,7 @@ return f"生成的随机数为: {', '.join(map(str, random_numbers))}"

@on_function_call(description='重载测试')

func test_reload()

Source code or View on GitHub
python
@on_function_call(description='重载测试')
 def test_reload():
     return 1
- + \ No newline at end of file diff --git a/en/dev/api/plugins_test/snowykami_testplugin/index.html b/en/dev/api/plugins_test/snowykami_testplugin/index.html index fdc3e15a..aff4d566 100644 --- a/en/dev/api/plugins_test/snowykami_testplugin/index.html +++ b/en/dev/api/plugins_test/snowykami_testplugin/index.html @@ -43,7 +43,7 @@ except Exception as e: return '运行出错: ' + str(e) return '运行成功: ' + str(r) - + \ No newline at end of file diff --git a/en/dev/api/plugins_test/weather_demo.html b/en/dev/api/plugins_test/weather_demo.html index f7b9254d..d21a40a1 100644 --- a/en/dev/api/plugins_test/weather_demo.html +++ b/en/dev/api/plugins_test/weather_demo.html @@ -22,7 +22,7 @@
Skip to content

Module nonebot_plugin_marshoai.plugins_test.weather_demo


@on_function_call(description='可以用于查询天气').params(location=String(description='地点'))

async func weather(location: str) -> str

Source code or View on GitHub
python
@on_function_call(description='可以用于查询天气').params(location=String(description='地点'))
 async def weather(location: str) -> str:
     return f'{location}的天气是晴天, 温度是25°C'

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_bangumi/index.html b/en/dev/api/tools/marshoai_bangumi/index.html index 012f257d..3c33e4cf 100644 --- a/en/dev/api/tools/marshoai_bangumi/index.html +++ b/en/dev/api/tools/marshoai_bangumi/index.html @@ -40,7 +40,7 @@ except Exception as e: traceback.print_exc() return '' - + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_basic/index.html b/en/dev/api/tools/marshoai_basic/index.html index 6e7b0fd5..e79b2fe1 100644 --- a/en/dev/api/tools/marshoai_basic/index.html +++ b/en/dev/api/tools/marshoai_basic/index.html @@ -25,7 +25,7 @@ return str(ver)

async func get_current_time()

Source code or View on GitHub
python
async def get_current_time():
     current_time = DateTime.now()
     return time_prompt.format(date_time=current_time.strftime('%Y年%m月%d日 %H:%M:%S'), weekday_name=weekdays[current_time.weekday()], lunar_date=current_time.to_lunar().date_hanzify('{干支年}{生肖}{月份}{日期}日'))
- + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_megakits/index.html b/en/dev/api/tools/marshoai_megakits/index.html index 7c17520f..6974b3b5 100644 --- a/en/dev/api/tools/marshoai_megakits/index.html +++ b/en/dev/api/tools/marshoai_megakits/index.html @@ -28,7 +28,7 @@ return str(await mk_morse_code.morse_decrypt(msg))

async func nya_encode(msg: str)

Source code or View on GitHub
python
async def nya_encode(msg: str):
     return str(await mk_nya_code.nya_encode(msg))

async func nya_decode(msg: str)

Source code or View on GitHub
python
async def nya_decode(msg: str):
     return str(await mk_nya_code.nya_decode(msg))
- + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_megakits/mk_common.html b/en/dev/api/tools/marshoai_megakits/mk_common.html index 7f5b7022..23ffacdb 100644 --- a/en/dev/api/tools/marshoai_megakits/mk_common.html +++ b/en/dev/api/tools/marshoai_megakits/mk_common.html @@ -37,7 +37,7 @@ return str(a % b) case _: return '未知运算符' - + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_megakits/mk_info.html b/en/dev/api/tools/marshoai_megakits/mk_info.html index 2f974577..f96e16f4 100644 --- a/en/dev/api/tools/marshoai_megakits/mk_info.html +++ b/en/dev/api/tools/marshoai_megakits/mk_info.html @@ -22,7 +22,7 @@
Skip to content

Module nonebot_plugin_marshoai.tools.marshoai_megakits.mk_info


async func twisuki()

Source code or View on GitHub
python
async def twisuki():
     return 'Twiuski(苏阳)是megakits插件作者, Github : "https://github.com/Twisuki"'

async func megakits()

Source code or View on GitHub
python
async def megakits():
     return 'MegaKits插件是一个功能混杂的MarshoAI插件, 由Twisuki(Github : "https://github.com/Twisuki")开发, 插件仓库 : "https://github.com/LiteyukiStudio/marsho-toolsets/tree/main/Twisuki/marshoai-megakits"'

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_megakits/mk_morse_code.html b/en/dev/api/tools/marshoai_megakits/mk_morse_code.html index 5f43c3d4..4088bf45 100644 --- a/en/dev/api/tools/marshoai_megakits/mk_morse_code.html +++ b/en/dev/api/tools/marshoai_megakits/mk_morse_code.html @@ -37,7 +37,7 @@ else: result += '?' return result - + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_megakits/mk_nya_code.html b/en/dev/api/tools/marshoai_megakits/mk_nya_code.html index defb4dd6..ea63d258 100644 --- a/en/dev/api/tools/marshoai_megakits/mk_nya_code.html +++ b/en/dev/api/tools/marshoai_megakits/mk_nya_code.html @@ -51,7 +51,7 @@ except Exception: return '翻译失败' return result - + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_memory/index.html b/en/dev/api/tools/marshoai_memory/index.html index 8d8fc580..a32ffb90 100644 --- a/en/dev/api/tools/marshoai_memory/index.html +++ b/en/dev/api/tools/marshoai_memory/index.html @@ -38,7 +38,7 @@ memory_data = json.load(f) for i in memory_data: ... - + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_meogirl/index.html b/en/dev/api/tools/marshoai_meogirl/index.html index 18677e81..de88cc12 100644 --- a/en/dev/api/tools/marshoai_meogirl/index.html +++ b/en/dev/api/tools/marshoai_meogirl/index.html @@ -23,7 +23,7 @@ return mg_info.meogirl()

async func search(msg: str, num: int = 3)

Source code or View on GitHub
python
async def search(msg: str, num: int=3):
     return str(await mg_search.search(msg, num))

async func introduce(msg: str)

Source code or View on GitHub
python
async def introduce(msg: str):
     return str(await mg_introduce.introduce(msg))
- + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_meogirl/mg_info.html b/en/dev/api/tools/marshoai_meogirl/mg_info.html index 2e5ec0dd..6b8de3f5 100644 --- a/en/dev/api/tools/marshoai_meogirl/mg_info.html +++ b/en/dev/api/tools/marshoai_meogirl/mg_info.html @@ -21,7 +21,7 @@
Skip to content

Module nonebot_plugin_marshoai.tools.marshoai_meogirl.mg_info


func meogirl()

Source code or View on GitHub
python
def meogirl():
     return 'Meogirl指的是"萌娘百科"(https://zh.moegirl.org.cn/ , 简称"萌百"), 是一个"万物皆可萌的百科全书!"; 同时, MarshoTools也配有"Meogirl"插件, 可调用萌百的api'

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_meogirl/mg_introduce.html b/en/dev/api/tools/marshoai_meogirl/mg_introduce.html index e47ca6e0..e3b73bf2 100644 --- a/en/dev/api/tools/marshoai_meogirl/mg_introduce.html +++ b/en/dev/api/tools/marshoai_meogirl/mg_introduce.html @@ -61,7 +61,7 @@ else: logger.error(f'网络错误, 状态码 : {response.status_code}') return f'网络错误, 状态码 : {response.status_code}'

var keyword

- + \ No newline at end of file diff --git a/en/dev/api/tools/marshoai_meogirl/mg_search.html b/en/dev/api/tools/marshoai_meogirl/mg_search.html index aee49373..6ee9c193 100644 --- a/en/dev/api/tools/marshoai_meogirl/mg_search.html +++ b/en/dev/api/tools/marshoai_meogirl/mg_search.html @@ -58,7 +58,7 @@ else: logger.error(f'网络错误, 状态码 : {response.status_code}') return f'网络错误, 状态码 : {response.status_code}'

var soup

- + \ No newline at end of file diff --git a/en/dev/api/tools_wip/marshoai_memory/index.html b/en/dev/api/tools_wip/marshoai_memory/index.html index 92e87ce1..98054f3f 100644 --- a/en/dev/api/tools_wip/marshoai_memory/index.html +++ b/en/dev/api/tools_wip/marshoai_memory/index.html @@ -21,7 +21,7 @@
Skip to content

Module nonebot_plugin_marshoai.tools_wip.marshoai_memory


async func write_memory(memory: str)

Source code or View on GitHub
python
async def write_memory(memory: str):
     return ''

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/dev/api/util.html b/en/dev/api/util.html index 00884e80..1ddfdb13 100644 --- a/en/dev/api/util.html +++ b/en/dev/api/util.html @@ -13,30 +13,30 @@ - + -
Skip to content

Module nonebot_plugin_marshoai.util

var nickname_json

  • Description: 记录昵称

  • Default: None

var praises_json

  • Description: 记录夸赞名单

  • Default: None

var loaded_target_list

  • Description: 记录已恢复备份的上下文的列表

  • Default: []


async func get_image_raw_and_type(url: str, timeout: int = 10) -> Optional[tuple[bytes, str]]

Description: 获取图片的二进制数据

Arguments:

  • url: str 图片链接
  • timeout: int 超时时间 秒
Source code or View on GitHub
python
async def get_image_raw_and_type(url: str, timeout: int=10) -> Optional[tuple[bytes, str]]:
+    
Skip to content

Module nonebot_plugin_marshoai.util

var nickname_json

  • Description: 记录昵称

  • Default: None

var praises_json

  • Description: 记录夸赞名单

  • Default: None

var loaded_target_list

  • Description: 记录已恢复备份的上下文的列表

  • Default: []


async func get_image_raw_and_type(url: str, timeout: int = 10) -> Optional[tuple[bytes, str]]

Description: 获取图片的二进制数据

Arguments:

  • url: str 图片链接
  • timeout: int 超时时间 秒
Source code or View on GitHub
python
async def get_image_raw_and_type(url: str, timeout: int=10) -> Optional[tuple[bytes, str]]:
     async with httpx.AsyncClient() as client:
-        response = await client.get(url, headers=_chromium_headers, timeout=timeout)
+        response = await client.get(url, headers=_browser_headers, timeout=timeout)
         if response.status_code == 200:
             content_type = response.headers.get('Content-Type')
             if not content_type:
                 content_type = mimetypes.guess_type(url)[0]
             return (response.content, str(content_type))
         else:
-            return None

async func get_image_b64(url: str, timeout: int = 10) -> Optional[str]

Description: 获取图片的base64编码

Arguments:

  • url: 图片链接
  • timeout: 超时时间 秒
Source code or View on GitHub
python
async def get_image_b64(url: str, timeout: int=10) -> Optional[str]:
+            return None

async func get_image_b64(url: str, timeout: int = 10) -> Optional[str]

Description: 获取图片的base64编码

Arguments:

  • url: 图片链接
  • timeout: 超时时间 秒
Source code or View on GitHub
python
async def get_image_b64(url: str, timeout: int=10) -> Optional[str]:
     if (data_type := (await get_image_raw_and_type(url, timeout))):
         base64_image = base64.b64encode(data_type[0]).decode('utf-8')
         data_url = 'data:{};base64,{}'.format(data_type[1], base64_image)
         return data_url
     else:
-        return None

async func make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list] = None)

Description: 调用ai获取回复

Arguments:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
Source code or View on GitHub
python
async def make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list]=None):
-    return await client.complete(messages=msg, model=model_name, tools=tools, temperature=config.marshoai_temperature, max_tokens=config.marshoai_max_tokens, top_p=config.marshoai_top_p)

async func make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list] = None)

Description: 使用 Openai SDK 调用ai获取回复

Arguments:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
Source code or View on GitHub
python
async def make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list]=None):
-    return await client.chat.completions.create(messages=msg, model=model_name, tools=tools or NOT_GIVEN, temperature=config.marshoai_temperature or NOT_GIVEN, max_tokens=config.marshoai_max_tokens or NOT_GIVEN, top_p=config.marshoai_top_p or NOT_GIVEN, timeout=config.marshoai_timeout)

func get_praises()

Source code or View on GitHub
python
def get_praises():
+        return None

async func make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list] = None)

Description: 调用ai获取回复

Arguments:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
Source code or View on GitHub
python
async def make_chat(client: ChatCompletionsClient, msg: list, model_name: str, tools: Optional[list]=None):
+    return await client.complete(messages=msg, model=model_name, tools=tools, temperature=config.marshoai_temperature, max_tokens=config.marshoai_max_tokens, top_p=config.marshoai_top_p)

async func make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list] = None)

Description: 使用 Openai SDK 调用ai获取回复

Arguments:

  • client: 用于与AI模型进行通信
  • msg: 消息内容
  • model_name: 指定AI模型名
  • tools: 工具列表
Source code or View on GitHub
python
async def make_chat_openai(client: AsyncOpenAI, msg: list, model_name: str, tools: Optional[list]=None):
+    return await client.chat.completions.create(messages=msg, model=model_name, tools=tools or NOT_GIVEN, temperature=config.marshoai_temperature or NOT_GIVEN, max_tokens=config.marshoai_max_tokens or NOT_GIVEN, top_p=config.marshoai_top_p or NOT_GIVEN, timeout=config.marshoai_timeout)

func get_praises()

Source code or View on GitHub
python
def get_praises():
     global praises_json
     if praises_json is None:
         praises_file = store.get_plugin_data_file('praises.json')
@@ -46,7 +46,7 @@
         with open(praises_file, 'r', encoding='utf-8') as f:
             data = json.load(f)
         praises_json = data
-    return praises_json

async func refresh_praises_json()

Source code or View on GitHub
python
async def refresh_praises_json():
+    return praises_json

async func refresh_praises_json()

Source code or View on GitHub
python
async def refresh_praises_json():
     global praises_json
     praises_file = store.get_plugin_data_file('praises.json')
     if not praises_file.exists():
@@ -54,21 +54,21 @@
             json.dump(_praises_init_data, f, ensure_ascii=False, indent=4)
     async with aiofiles.open(praises_file, 'r', encoding='utf-8') as f:
         data = json.loads(await f.read())
-    praises_json = data

func build_praises()

Source code or View on GitHub
python
def build_praises():
+    praises_json = data

func build_praises() -> str

Source code or View on GitHub
python
def build_praises() -> str:
     praises = get_praises()
     result = ['你喜欢以下几个人物,他们有各自的优点:']
     for item in praises['like']:
         result.append(f"名字:{item['name']},优点:{item['advantages']}")
-    return '\n'.join(result)

async func save_context_to_json(name: str, context: Any, path: str)

Source code or View on GitHub
python
async def save_context_to_json(name: str, context: Any, path: str):
+    return '\n'.join(result)

async func save_context_to_json(name: str, context: Any, path: str)

Source code or View on GitHub
python
async def save_context_to_json(name: str, context: Any, path: str):
     (context_dir := (store.get_plugin_data_dir() / path)).mkdir(parents=True, exist_ok=True)
     with open(context_dir / f'{name}.json', 'w', encoding='utf-8') as json_file:
-        json.dump(context, json_file, ensure_ascii=False, indent=4)

async func load_context_from_json(name: str, path: str) -> list

Description: 从指定路径加载历史记录

Source code or View on GitHub
python
async def load_context_from_json(name: str, path: str) -> list:
+        json.dump(context, json_file, ensure_ascii=False, indent=4)

async func load_context_from_json(name: str, path: str) -> list

Description: 从指定路径加载历史记录

Source code or View on GitHub
python
async def load_context_from_json(name: str, path: str) -> list:
     (context_dir := (store.get_plugin_data_dir() / path)).mkdir(parents=True, exist_ok=True)
     if (file_path := (context_dir / f'{name}.json')).exists():
         async with aiofiles.open(file_path, 'r', encoding='utf-8') as json_file:
             return json.loads(await json_file.read())
     else:
-        return []

async func get_nicknames()

Description: 获取nickname_json, 优先来源于全局变量

Source code or View on GitHub
python
async def get_nicknames():
+        return []

async func get_nicknames()

Description: 获取nickname_json, 优先来源于全局变量

Source code or View on GitHub
python
async def get_nicknames():
     global nickname_json
     if nickname_json is None:
         filename = store.get_plugin_data_file('nickname.json')
@@ -77,7 +77,7 @@
                 nickname_json = json.loads(await f.read())
         except Exception:
             nickname_json = {}
-    return nickname_json

async func set_nickname(user_id: str, name: str)

Source code or View on GitHub
python
async def set_nickname(user_id: str, name: str):
+    return nickname_json

async func set_nickname(user_id: str, name: str)

Source code or View on GitHub
python
async def set_nickname(user_id: str, name: str):
     global nickname_json
     filename = store.get_plugin_data_file('nickname.json')
     if not filename.exists():
@@ -90,13 +90,13 @@
         del data[user_id]
     with open(filename, 'w', encoding='utf-8') as f:
         json.dump(data, f, ensure_ascii=False, indent=4)
-    nickname_json = data

async func refresh_nickname_json()

Description: 强制刷新nickname_json, 刷新全局变量

Source code or View on GitHub
python
async def refresh_nickname_json():
+    nickname_json = data

async func refresh_nickname_json()

Description: 强制刷新nickname_json, 刷新全局变量

Source code or View on GitHub
python
async def refresh_nickname_json():
     global nickname_json
     try:
         async with aiofiles.open(store.get_plugin_data_file('nickname.json'), 'r', encoding='utf-8') as f:
             nickname_json = json.loads(await f.read())
     except Exception:
-        logger.error('刷新 nickname_json 表错误:无法载入 nickname.json 文件')

func get_prompt()

Description: 获取系统提示词

Source code or View on GitHub
python
def get_prompt():
+        logger.error('刷新 nickname_json 表错误:无法载入 nickname.json 文件')

func get_prompt()

Description: 获取系统提示词

Source code or View on GitHub
python
def get_prompt():
     prompts = config.marshoai_additional_prompt
     if config.marshoai_enable_praises:
         praises_prompt = build_praises()
@@ -105,12 +105,12 @@
         prompts += _time_prompt.format(date_time=(current_time := DateTime.now()).strftime('%Y年%m月%d日 %H:%M:%S'), weekday_name=_weekdays[current_time.weekday()], lunar_date=current_time.chinesize.date_hanzify('农历{干支年}{生肖}{月份}{日期}'))
     marsho_prompt = config.marshoai_prompt
     spell = SystemMessage(content=marsho_prompt + prompts).as_dict()
-    return spell

func suggest_solution(errinfo: str) -> str

Source code or View on GitHub
python
def suggest_solution(errinfo: str) -> str:
+    return spell

func suggest_solution(errinfo: str) -> str

Source code or View on GitHub
python
def suggest_solution(errinfo: str) -> str:
     suggestions = {'content_filter': '消息已被内容过滤器过滤。请调整聊天内容后重试。', 'RateLimitReached': '模型达到调用速率限制。请稍等一段时间或联系Bot管理员。', 'tokens_limit_reached': '请求token达到上限。请重置上下文。', 'content_length_limit': '请求体过大。请重置上下文。', 'unauthorized': '访问token无效。请联系Bot管理员。', 'invalid type: parameter messages.content is of type array but should be of type string.': '聊天请求体包含此模型不支持的数据类型。请重置上下文。', 'At most 1 image(s) may be provided in one request.': '此模型只能在上下文中包含1张图片。如果此前的聊天已经发送过图片,请重置上下文。'}
     for key, suggestion in suggestions.items():
         if key in errinfo:
             return f'\n{suggestion}'
-    return ''

async func get_backup_context(target_id: str, target_private: bool) -> list

Description: 获取历史上下文

Source code or View on GitHub
python
async def get_backup_context(target_id: str, target_private: bool) -> list:
+    return ''

async func get_backup_context(target_id: str, target_private: bool) -> list

Description: 获取历史上下文

Source code or View on GitHub
python
async def get_backup_context(target_id: str, target_private: bool) -> list:
     global loaded_target_list
     if target_private:
         target_uid = f'private_{target_id}'
@@ -119,12 +119,24 @@
     if target_uid not in loaded_target_list:
         loaded_target_list.append(target_uid)
         return await load_context_from_json(f'back_up_context_{target_uid}', 'contexts/backup')
-    return []

var latex_convert

  • Description: 开启一个转换实例

  • Default: ConvertLatex()


@get_driver().on_bot_connect

async func load_latex_convert()

Source code or View on GitHub
python
@get_driver().on_bot_connect
+    return []

func extract_content_and_think(message: ChatCompletionMessage) -> tuple[str, str | None, ChatCompletionMessage]

Description: 处理 API 返回的消息对象,提取其中的内容和思维链,并返回处理后的消息,思维链,消息对象。

Arguments:

  • message (ChatCompletionMessage): API 返回的消息对象。
Source code or View on GitHub
python
def extract_content_and_think(message: ChatCompletionMessage) -> tuple[str, str | None, ChatCompletionMessage]:
+    try:
+        thinking = message.reasoning_content
+    except AttributeError:
+        thinking = None
+    if thinking:
+        delattr(message, 'reasoning_content')
+    else:
+        think_blocks = re.findall('<think>(.*?)</think>', message.content or '', flags=re.DOTALL)
+        thinking = '\n'.join([block.strip() for block in think_blocks if block.strip()])
+    content = re.sub('<think>.*?</think>', '', message.content or '', flags=re.DOTALL).strip()
+    message.content = content
+    return (content, thinking, message)

var latex_convert

  • Description: 开启一个转换实例

  • Default: ConvertLatex()


@get_driver().on_bot_connect

async func load_latex_convert()

Source code or View on GitHub
python
@get_driver().on_bot_connect
 async def load_latex_convert():
-    await latex_convert.load_channel(None)

async func get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]])

Source code or View on GitHub
python
async def get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]]):
+    await latex_convert.load_channel(None)

async func get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]])

Source code or View on GitHub
python
async def get_uuid_back2codeblock(msg: str, code_blank_uuid_map: list[tuple[str, str]]):
     for torep, rep in code_blank_uuid_map:
         msg = msg.replace(torep, rep)
-    return msg

async func parse_richtext(msg: str) -> UniMessage

Description: 人工智能给出的回答一般不会包含 HTML 嵌入其中,但是包含图片或者 LaTeX 公式、代码块,都很正常。 这个函数会把这些都以图片形式嵌入消息体。

Source code or View on GitHub
python
async def parse_richtext(msg: str) -> UniMessage:
+    return msg

async func parse_richtext(msg: str) -> UniMessage

Description: 人工智能给出的回答一般不会包含 HTML 嵌入其中,但是包含图片或者 LaTeX 公式、代码块,都很正常。 这个函数会把这些都以图片形式嵌入消息体。

Source code or View on GitHub
python
async def parse_richtext(msg: str) -> UniMessage:
     if not IMG_LATEX_PATTERN.search(msg):
         return UniMessage(msg)
     result_msg = UniMessage()
@@ -158,8 +170,8 @@
         else:
             result_msg.append(TextMsg(tag_found + '(未知内容解析失败)'))
     result_msg.append(TextMsg(await get_uuid_back2codeblock(msg[last_tag_index:], code_blank_uuid_map)))
-    return result_msg

The document is being improved. Suggestions are welcome.

- + return result_msg

var thinking

  • Description: type: ignore

  • Default: message.reasoning_content

The document is being improved. Suggestions are welcome.

+ \ No newline at end of file diff --git a/en/dev/api/util_hunyuan.html b/en/dev/api/util_hunyuan.html index dc6f1eb8..1dbed555 100644 --- a/en/dev/api/util_hunyuan.html +++ b/en/dev/api/util_hunyuan.html @@ -31,7 +31,7 @@ req.from_json_string(json.dumps(params)) resp = client.TextToImageLite(req) return resp.to_json_string() - + \ No newline at end of file diff --git a/en/dev/index.html b/en/dev/index.html index 5b40c1a1..f28deedc 100644 --- a/en/dev/index.html +++ b/en/dev/index.html @@ -20,7 +20,7 @@
Skip to content

DEV

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/index.html b/en/index.html index 3d0b2f86..fd7cdc84 100644 --- a/en/index.html +++ b/en/index.html @@ -20,7 +20,7 @@
Skip to content

MarshoAIA kawaii cat

Kawaii, intelligent and extensible AI service plugin

Marsho LogoMarsho Logo

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/start/index.html b/en/start/index.html index 2f9b2f63..ed9ec19b 100644 --- a/en/start/index.html +++ b/en/start/index.html @@ -20,7 +20,7 @@
Skip to content

The document is being improved. Suggestions are welcome.

- + \ No newline at end of file diff --git a/en/start/install.html b/en/start/install.html index 3db18835..1ede2b0e 100644 --- a/en/start/install.html +++ b/en/start/install.html @@ -38,7 +38,7 @@ ... ] }

⚙️ Configurable options

Add options in the .env file from the diagram below in nonebot2 project.

plugin behaviour

OptionTypeDefaultDescription
MARSHOAI_USE_YAML_CONFIGboolfalseUse YAML config format
MARSHOAI_DEVMODEbooltrueTurn on Development Mode or not

Marsho usage

OptionTypeDefaultDescription
MARSHOAI_DEFAULT_NAMEstrmarshoCommand to call Marsho
MARSHOAI_ALIASESset[str]list["小棉"]Other name(Alias) to call Marsho
MARSHOAI_ATboolfalseCall by @ or not
MARSHOAI_MAIN_COLOURstrFEABA9Theme color, used by some tools and features

AI call

OptionTypeDefaultDescription
MARSHOAI_TOKENstrThe token needed to call AI API
MARSHOAI_DEFAULT_MODELstrgpt-4o-miniThe default model of Marsho
MARSHOAI_PROMPTstrCatgirl Marsho's character promptMarsho's basic system prompt ※Some models(o1 and so on) don't support it
MARSHOAI_ADDITIONAL_PROMPTstrMarsho's external system prompt
MARSHOAI_ENFORCE_NICKNAMEbooltrueEnforce user to set nickname or not
MARSHOAI_POKE_SUFFIXstr揉了揉你的猫耳When double click Marsho who connected to OneBot adapter, the chat content. When it's empty string, double click function is off. Such as, the default content is *[昵称]揉了揉你的猫耳。
MARSHOAI_AZURE_ENDPOINTstrhttps://models.inference.ai.azure.comOpenAI standard API
MARSHOAI_TEMPERATUREfloatnulltemperature parameter
MARSHOAI_TOP_PfloatnullNucleus Sampling parameter
MARSHOAI_MAX_TOKENSintnullMax token number
MARSHOAI_ADDITIONAL_IMAGE_MODELSlist[]External image-support model list, such as hunyuan-vision
MARSHOAI_NICKNAME_LIMITint16Limit for nickname length
MARSHOAI_TIMEOUTfloat50AI request timeout (seconds)

Feature Switches

OptionTypeDefaultDescription
MARSHOAI_ENABLE_SUPPORT_IMAGE_TIPbooltrueWhen on, if user send request with photo and model don't support that, remind the user
MARSHOAI_ENABLE_NICKNAME_TIPbooltrueWhen on, if user haven't set username, remind user to set
MARSHOAI_ENABLE_PRAISESbooltrueTurn on Praise list or not
MARSHOAI_ENABLE_TIME_PROMPTbooltrueTurn on real-time date and time (accurate to seconds) and lunar date system prompt
MARSHOAI_ENABLE_TOOLSboolfalseTurn on Marsho Tools or not
MARSHOAI_ENABLE_PLUGINSbooltrueTurn on Marsho Plugins or not
MARSHOAI_PLUGIN_DIRSlist[str][]List of plugins directory
MARSHOAI_LOAD_BUILTIN_TOOLSbooltrueLoading the built-in toolkit or not
MARSHOAI_TOOLSET_DIRlist[]List of external toolset directory
MARSHOAI_DISABLED_TOOLKITSlist[]List of disabled toolkits' name
MARSHOAI_ENABLE_RICHTEXT_PARSEbooltrueTurn on auto parse rich text feature(including image, LaTeX equation)
MARSHOAI_SINGLE_LATEX_PARSEboolfalseRender single-line equation or not
MARSHOAI_FIX_TOOLCALLSbooltrueFix tool calls or not
MARSHOAI_SEND_THINKINGbooltrueSend thinking chain or not
- + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index de8273d4..a637a28b 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"dev_api_azure.md":"By3DQZ1H","dev_api_azure_onebot.md":"BSzQi5NB","dev_api_config.md":"DSFD8ude","dev_api_constants.md":"CeyS-dgb","dev_api_deal_latex.md":"CliIHVQx","dev_api_dev.md":"CR8NfY8m","dev_api_hooks.md":"DpJrlEUX","dev_api_hunyuan.md":"DTtTdru3","dev_api_index.md":"DCRutF9O","dev_api_instances.md":"VkCkhorR","dev_api_marsho.md":"d9w52ceE","dev_api_marsho_onebot.md":"BaELa_5s","dev_api_metadata.md":"BvJb0wDC","dev_api_models.md":"CzLGyN0e","dev_api_observer.md":"CKxQ8rNr","dev_api_plugin_func_call_caller.md":"CzrTsykV","dev_api_plugin_func_call_index.md":"DSbV-DHP","dev_api_plugin_func_call_models.md":"CYOWq9i6","dev_api_plugin_func_call_params.md":"DIr0Wfuh","dev_api_plugin_func_call_utils.md":"CBpuIEsL","dev_api_plugin_index.md":"BpLPZBto","dev_api_plugin_load.md":"Z1_AJpA-","dev_api_plugin_models.md":"XO9ZgJTV","dev_api_plugin_register.md":"wxtxwL1q","dev_api_plugin_typing.md":"B_OdqvYr","dev_api_plugin_utils.md":"CKZ8uSFc","dev_api_plugins_builtin_tools_chat.md":"CX5fWmLQ","dev_api_plugins_builtin_tools_file_io.md":"B4WB3kMa","dev_api_plugins_builtin_tools_index.md":"CdVyaR56","dev_api_plugins_builtin_tools_liteyuki.md":"C2jQUuMC","dev_api_plugins_builtin_tools_manager.md":"CSx6-DqR","dev_api_plugins_builtin_tools_network.md":"qwTduvJA","dev_api_plugins_builtin_tools_utils.md":"BQ_zIszy","dev_api_plugins_marshoai_bangumi_index.md":"DI0wDzaI","dev_api_plugins_marshoai_basic_index.md":"CdMZUtoa","dev_api_plugins_test_marshoai_basic_index.md":"xGCd7eZm","dev_api_plugins_test_marshoai_memory_command.md":"CeJIbyf1","dev_api_plugins_test_marshoai_memory_config.md":"CtBtnl-b","dev_api_plugins_test_marshoai_memory_index.md":"wgRBaFEj","dev_api_plugins_test_random_number_generator.md":"CP2ZOHnt","dev_api_plugins_test_snowykami_testplugin_index.md":"DGUrAa-4","dev_api_plugins_test_weather_demo.md":"BhjRtDMw","dev_api_plugins_twisuki_megakits_index.md":"Dhj0Q_rd","dev_api_plugins_twisuki_megakits_mk_morse_code.md":"BPtKSrvY","dev_api_plugins_twisuki_megakits_mk_nya_code.md":"BDLuQWQj","dev_api_plugins_twisuki_petcat_index.md":"Db-1fmpK","dev_api_plugins_twisuki_petcat_pc_cat.md":"F2sC91-N","dev_api_plugins_twisuki_petcat_pc_info.md":"CvN9sngp","dev_api_plugins_twisuki_petcat_pc_shop.md":"DD4ahNPm","dev_api_plugins_twisuki_petcat_pc_token.md":"DA_UlEtw","dev_api_tools_marshoai_bangumi_index.md":"DBTSrMfh","dev_api_tools_marshoai_basic_index.md":"DzBLEWLC","dev_api_tools_marshoai_megakits_index.md":"REZMb3dg","dev_api_tools_marshoai_megakits_mk_common.md":"7APNTo8M","dev_api_tools_marshoai_megakits_mk_info.md":"ChkkoB5W","dev_api_tools_marshoai_megakits_mk_morse_code.md":"0M_XvS3m","dev_api_tools_marshoai_megakits_mk_nya_code.md":"c9sb8PmU","dev_api_tools_marshoai_memory_index.md":"CIRx5tJY","dev_api_tools_marshoai_meogirl_index.md":"XEkcu-t2","dev_api_tools_marshoai_meogirl_mg_info.md":"DPN0C8WV","dev_api_tools_marshoai_meogirl_mg_introduce.md":"BlzX94DI","dev_api_tools_marshoai_meogirl_mg_search.md":"BBTMELq_","dev_api_tools_wip_marshoai_memory_index.md":"Dm4TJCvU","dev_api_util.md":"BEQOfWcm","dev_api_util_hunyuan.md":"Dw50YpRa","dev_extension.md":"sCH8l0Kd","dev_index.md":"DmkkcOvS","dev_project.md":"si_Q_Qol","en_dev_api_azure.md":"Cto4HxOQ","en_dev_api_azure_onebot.md":"Nh5j0O6E","en_dev_api_config.md":"DFsolamx","en_dev_api_constants.md":"0iXpq-Ec","en_dev_api_deal_latex.md":"CoDpC8c1","en_dev_api_dev.md":"ZX87ppE0","en_dev_api_hooks.md":"BCTjt9JT","en_dev_api_hunyuan.md":"CAln-sCp","en_dev_api_index.md":"PTQTSFQN","en_dev_api_instances.md":"qxOeS8ME","en_dev_api_marsho.md":"B2G3bD6C","en_dev_api_marsho_onebot.md":"Bp39oSfi","en_dev_api_metadata.md":"BMq5AAe8","en_dev_api_models.md":"BPby54j6","en_dev_api_observer.md":"oTjjwmjn","en_dev_api_plugin_func_call_caller.md":"Bye_Nxpk","en_dev_api_plugin_func_call_index.md":"DWsorYJh","en_dev_api_plugin_func_call_models.md":"B-qnd7cH","en_dev_api_plugin_func_call_params.md":"u__hMe93","en_dev_api_plugin_func_call_utils.md":"iU5-nBge","en_dev_api_plugin_index.md":"BZIGSQUL","en_dev_api_plugin_load.md":"XwjzFCnp","en_dev_api_plugin_models.md":"KoVIfTB6","en_dev_api_plugin_register.md":"Duq9hOxH","en_dev_api_plugin_typing.md":"C2zfOXEp","en_dev_api_plugin_utils.md":"e5Btmrql","en_dev_api_plugins_builtin_tools_chat.md":"C23GjQBb","en_dev_api_plugins_builtin_tools_file_io.md":"C08lWCZX","en_dev_api_plugins_builtin_tools_index.md":"DbJ5EqSA","en_dev_api_plugins_builtin_tools_liteyuki.md":"x_VmenLc","en_dev_api_plugins_builtin_tools_manager.md":"u-0hfdOm","en_dev_api_plugins_builtin_tools_network.md":"CnxMIDLE","en_dev_api_plugins_builtin_tools_utils.md":"wCwWvzS9","en_dev_api_plugins_marshoai_bangumi_index.md":"DBU2Zi62","en_dev_api_plugins_marshoai_basic_index.md":"DyXm3jCh","en_dev_api_plugins_test_marshoai_basic_index.md":"DuyU21n7","en_dev_api_plugins_test_marshoai_memory_command.md":"u25QWY_i","en_dev_api_plugins_test_marshoai_memory_config.md":"fO2hq1Zg","en_dev_api_plugins_test_marshoai_memory_index.md":"C45XsXpP","en_dev_api_plugins_test_random_number_generator.md":"BbS1YDsu","en_dev_api_plugins_test_snowykami_testplugin_index.md":"QqX2hUew","en_dev_api_plugins_test_weather_demo.md":"CkQsPcOc","en_dev_api_plugins_twisuki_megakits_index.md":"DI9uZZaT","en_dev_api_plugins_twisuki_megakits_mk_morse_code.md":"CR7E4O63","en_dev_api_plugins_twisuki_megakits_mk_nya_code.md":"nvZAi5el","en_dev_api_plugins_twisuki_petcat_index.md":"Df3A8uE4","en_dev_api_plugins_twisuki_petcat_pc_cat.md":"CwByAWa2","en_dev_api_plugins_twisuki_petcat_pc_info.md":"C3tuga99","en_dev_api_plugins_twisuki_petcat_pc_shop.md":"CUZ6lawY","en_dev_api_plugins_twisuki_petcat_pc_token.md":"B1O2CkQG","en_dev_api_tools_marshoai_bangumi_index.md":"DWnmN-I6","en_dev_api_tools_marshoai_basic_index.md":"D9JkVPMg","en_dev_api_tools_marshoai_megakits_index.md":"CgWeHxOT","en_dev_api_tools_marshoai_megakits_mk_common.md":"P8V5KFZ7","en_dev_api_tools_marshoai_megakits_mk_info.md":"tcfMikuj","en_dev_api_tools_marshoai_megakits_mk_morse_code.md":"xggXCxLJ","en_dev_api_tools_marshoai_megakits_mk_nya_code.md":"G9HPWVtZ","en_dev_api_tools_marshoai_memory_index.md":"BoTJbgVx","en_dev_api_tools_marshoai_meogirl_index.md":"CAicnthU","en_dev_api_tools_marshoai_meogirl_mg_info.md":"BFLggEu0","en_dev_api_tools_marshoai_meogirl_mg_introduce.md":"lyFmddfe","en_dev_api_tools_marshoai_meogirl_mg_search.md":"CuklbRju","en_dev_api_tools_wip_marshoai_memory_index.md":"cAEFdFDP","en_dev_api_util.md":"BNGDTsJK","en_dev_api_util_hunyuan.md":"Dn5jgbGF","en_dev_index.md":"DJJ0NGhU","en_index.md":"DAKoBz1C","en_start_index.md":"BwdTMIWE","en_start_install.md":"CshuOGRi","index.md":"DlqxtZr8","ja_index.md":"CcT0fxo3","start_index.md":"ByEtL58Q","start_install-old.md":"CXTT8MXN","start_install.md":"CNXBmrn-","start_use.md":"BiCxERjA"} +{"dev_api_azure.md":"By3DQZ1H","dev_api_azure_onebot.md":"BSzQi5NB","dev_api_config.md":"DSFD8ude","dev_api_constants.md":"CeyS-dgb","dev_api_deal_latex.md":"CliIHVQx","dev_api_dev.md":"CR8NfY8m","dev_api_hooks.md":"DpJrlEUX","dev_api_hunyuan.md":"DTtTdru3","dev_api_index.md":"DCRutF9O","dev_api_instances.md":"VkCkhorR","dev_api_marsho.md":"dF_hdEOQ","dev_api_marsho_onebot.md":"BaELa_5s","dev_api_metadata.md":"BvJb0wDC","dev_api_models.md":"CzLGyN0e","dev_api_observer.md":"CKxQ8rNr","dev_api_plugin_func_call_caller.md":"CzrTsykV","dev_api_plugin_func_call_index.md":"DSbV-DHP","dev_api_plugin_func_call_models.md":"CYOWq9i6","dev_api_plugin_func_call_params.md":"DIr0Wfuh","dev_api_plugin_func_call_utils.md":"CBpuIEsL","dev_api_plugin_index.md":"BpLPZBto","dev_api_plugin_load.md":"Z1_AJpA-","dev_api_plugin_models.md":"XO9ZgJTV","dev_api_plugin_register.md":"wxtxwL1q","dev_api_plugin_typing.md":"B_OdqvYr","dev_api_plugin_utils.md":"CKZ8uSFc","dev_api_plugins_builtin_tools_chat.md":"CX5fWmLQ","dev_api_plugins_builtin_tools_file_io.md":"B4WB3kMa","dev_api_plugins_builtin_tools_index.md":"CdVyaR56","dev_api_plugins_builtin_tools_liteyuki.md":"C2jQUuMC","dev_api_plugins_builtin_tools_manager.md":"CSx6-DqR","dev_api_plugins_builtin_tools_network.md":"qwTduvJA","dev_api_plugins_builtin_tools_utils.md":"BQ_zIszy","dev_api_plugins_marshoai_bangumi_index.md":"DI0wDzaI","dev_api_plugins_marshoai_basic_index.md":"CdMZUtoa","dev_api_plugins_test_marshoai_basic_index.md":"xGCd7eZm","dev_api_plugins_test_marshoai_memory_command.md":"CeJIbyf1","dev_api_plugins_test_marshoai_memory_config.md":"CtBtnl-b","dev_api_plugins_test_marshoai_memory_index.md":"wgRBaFEj","dev_api_plugins_test_random_number_generator.md":"CP2ZOHnt","dev_api_plugins_test_snowykami_testplugin_index.md":"DGUrAa-4","dev_api_plugins_test_weather_demo.md":"BhjRtDMw","dev_api_plugins_twisuki_megakits_index.md":"Dhj0Q_rd","dev_api_plugins_twisuki_megakits_mk_morse_code.md":"BPtKSrvY","dev_api_plugins_twisuki_megakits_mk_nya_code.md":"BDLuQWQj","dev_api_plugins_twisuki_petcat_index.md":"Db-1fmpK","dev_api_plugins_twisuki_petcat_pc_cat.md":"F2sC91-N","dev_api_plugins_twisuki_petcat_pc_info.md":"CvN9sngp","dev_api_plugins_twisuki_petcat_pc_shop.md":"DD4ahNPm","dev_api_plugins_twisuki_petcat_pc_token.md":"DA_UlEtw","dev_api_tools_marshoai_bangumi_index.md":"DBTSrMfh","dev_api_tools_marshoai_basic_index.md":"DzBLEWLC","dev_api_tools_marshoai_megakits_index.md":"REZMb3dg","dev_api_tools_marshoai_megakits_mk_common.md":"7APNTo8M","dev_api_tools_marshoai_megakits_mk_info.md":"ChkkoB5W","dev_api_tools_marshoai_megakits_mk_morse_code.md":"0M_XvS3m","dev_api_tools_marshoai_megakits_mk_nya_code.md":"c9sb8PmU","dev_api_tools_marshoai_memory_index.md":"CIRx5tJY","dev_api_tools_marshoai_meogirl_index.md":"XEkcu-t2","dev_api_tools_marshoai_meogirl_mg_info.md":"DPN0C8WV","dev_api_tools_marshoai_meogirl_mg_introduce.md":"BlzX94DI","dev_api_tools_marshoai_meogirl_mg_search.md":"BBTMELq_","dev_api_tools_wip_marshoai_memory_index.md":"Dm4TJCvU","dev_api_util.md":"pVwI72e6","dev_api_util_hunyuan.md":"Dw50YpRa","dev_extension.md":"sCH8l0Kd","dev_index.md":"DmkkcOvS","dev_project.md":"si_Q_Qol","en_dev_api_azure.md":"Cto4HxOQ","en_dev_api_azure_onebot.md":"Nh5j0O6E","en_dev_api_config.md":"DFsolamx","en_dev_api_constants.md":"0iXpq-Ec","en_dev_api_deal_latex.md":"CoDpC8c1","en_dev_api_dev.md":"ZX87ppE0","en_dev_api_hooks.md":"BCTjt9JT","en_dev_api_hunyuan.md":"CAln-sCp","en_dev_api_index.md":"PTQTSFQN","en_dev_api_instances.md":"qxOeS8ME","en_dev_api_marsho.md":"D_PLwYjH","en_dev_api_marsho_onebot.md":"Bp39oSfi","en_dev_api_metadata.md":"BMq5AAe8","en_dev_api_models.md":"BPby54j6","en_dev_api_observer.md":"oTjjwmjn","en_dev_api_plugin_func_call_caller.md":"Bye_Nxpk","en_dev_api_plugin_func_call_index.md":"DWsorYJh","en_dev_api_plugin_func_call_models.md":"B-qnd7cH","en_dev_api_plugin_func_call_params.md":"u__hMe93","en_dev_api_plugin_func_call_utils.md":"iU5-nBge","en_dev_api_plugin_index.md":"BZIGSQUL","en_dev_api_plugin_load.md":"XwjzFCnp","en_dev_api_plugin_models.md":"KoVIfTB6","en_dev_api_plugin_register.md":"Duq9hOxH","en_dev_api_plugin_typing.md":"C2zfOXEp","en_dev_api_plugin_utils.md":"e5Btmrql","en_dev_api_plugins_builtin_tools_chat.md":"C23GjQBb","en_dev_api_plugins_builtin_tools_file_io.md":"C08lWCZX","en_dev_api_plugins_builtin_tools_index.md":"DbJ5EqSA","en_dev_api_plugins_builtin_tools_liteyuki.md":"x_VmenLc","en_dev_api_plugins_builtin_tools_manager.md":"u-0hfdOm","en_dev_api_plugins_builtin_tools_network.md":"CnxMIDLE","en_dev_api_plugins_builtin_tools_utils.md":"wCwWvzS9","en_dev_api_plugins_marshoai_bangumi_index.md":"DBU2Zi62","en_dev_api_plugins_marshoai_basic_index.md":"DyXm3jCh","en_dev_api_plugins_test_marshoai_basic_index.md":"DuyU21n7","en_dev_api_plugins_test_marshoai_memory_command.md":"u25QWY_i","en_dev_api_plugins_test_marshoai_memory_config.md":"fO2hq1Zg","en_dev_api_plugins_test_marshoai_memory_index.md":"C45XsXpP","en_dev_api_plugins_test_random_number_generator.md":"BbS1YDsu","en_dev_api_plugins_test_snowykami_testplugin_index.md":"QqX2hUew","en_dev_api_plugins_test_weather_demo.md":"CkQsPcOc","en_dev_api_plugins_twisuki_megakits_index.md":"DI9uZZaT","en_dev_api_plugins_twisuki_megakits_mk_morse_code.md":"CR7E4O63","en_dev_api_plugins_twisuki_megakits_mk_nya_code.md":"nvZAi5el","en_dev_api_plugins_twisuki_petcat_index.md":"Df3A8uE4","en_dev_api_plugins_twisuki_petcat_pc_cat.md":"CwByAWa2","en_dev_api_plugins_twisuki_petcat_pc_info.md":"C3tuga99","en_dev_api_plugins_twisuki_petcat_pc_shop.md":"CUZ6lawY","en_dev_api_plugins_twisuki_petcat_pc_token.md":"B1O2CkQG","en_dev_api_tools_marshoai_bangumi_index.md":"DWnmN-I6","en_dev_api_tools_marshoai_basic_index.md":"D9JkVPMg","en_dev_api_tools_marshoai_megakits_index.md":"CgWeHxOT","en_dev_api_tools_marshoai_megakits_mk_common.md":"P8V5KFZ7","en_dev_api_tools_marshoai_megakits_mk_info.md":"tcfMikuj","en_dev_api_tools_marshoai_megakits_mk_morse_code.md":"xggXCxLJ","en_dev_api_tools_marshoai_megakits_mk_nya_code.md":"G9HPWVtZ","en_dev_api_tools_marshoai_memory_index.md":"BoTJbgVx","en_dev_api_tools_marshoai_meogirl_index.md":"CAicnthU","en_dev_api_tools_marshoai_meogirl_mg_info.md":"BFLggEu0","en_dev_api_tools_marshoai_meogirl_mg_introduce.md":"lyFmddfe","en_dev_api_tools_marshoai_meogirl_mg_search.md":"CuklbRju","en_dev_api_tools_wip_marshoai_memory_index.md":"cAEFdFDP","en_dev_api_util.md":"C6FjM-fz","en_dev_api_util_hunyuan.md":"Dn5jgbGF","en_dev_index.md":"DJJ0NGhU","en_index.md":"DAKoBz1C","en_start_index.md":"BwdTMIWE","en_start_install.md":"CshuOGRi","index.md":"DlqxtZr8","ja_index.md":"CcT0fxo3","start_index.md":"ByEtL58Q","start_install-old.md":"CXTT8MXN","start_install.md":"CNXBmrn-","start_use.md":"BiCxERjA"} diff --git a/index.html b/index.html index 3cbe77ef..edb45091 100644 --- a/index.html +++ b/index.html @@ -20,7 +20,7 @@
Skip to content

小棉智能猫娘机器人

可爱,智能且可扩展的AI服务插件

Marsho LogoMarsho Logo

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/ja/index.html b/ja/index.html index e9b2ce88..1aa738ea 100644 --- a/ja/index.html +++ b/ja/index.html @@ -20,7 +20,7 @@
Skip to content

小綿智能猫娘ロボット

かわいくて、賢くて、拡張可能なAIサービスプラグイン

MarshoロゴMarshoロゴ

ドキュメントは改善中です。ご意見をお待ちしております。

- + \ No newline at end of file diff --git a/start/index.html b/start/index.html index b240905e..6381970b 100644 --- a/start/index.html +++ b/start/index.html @@ -20,7 +20,7 @@
Skip to content

文档完善中,欢迎提出建议或帮助我们完善。

- + \ No newline at end of file diff --git a/start/install-old.html b/start/install-old.html index e2286916..76b662a9 100644 --- a/start/install-old.html +++ b/start/install-old.html @@ -38,7 +38,7 @@ ... ] }

⚙️ 可配置项

在 nonebot2 项目的.env文件中添加下表中的配置

插件行为

配置项类型默认值说明
MARSHOAI_USE_YAML_CONFIGboolfalse是否使用 YAML 配置文件格式

Marsho 使用方式

配置项类型默认值说明
MARSHOAI_DEFAULT_NAMEstrmarsho调用 Marsho 默认的命令前缀
MARSHOAI_ALIASESset[str]set{"小棉"}调用 Marsho 的命令别名
MARSHOAI_ATboolfalse决定是否使用at触发
MARSHOAI_MAIN_COLOURstrFEABA9主题色,部分工具和功能可用

AI 调用

配置项类型默认值说明
MARSHOAI_TOKENstr调用 AI API 所需的 token
MARSHOAI_DEFAULT_MODELstrgpt-4o-miniMarsho 默认调用的模型
MARSHOAI_PROMPTstr猫娘 Marsho 人设提示词Marsho 的基本系统提示词 ※部分模型(o1等)不支持系统提示词。
MARSHOAI_ADDITIONAL_PROMPTstrMarsho 的扩展系统提示词
MARSHOAI_POKE_SUFFIXstr揉了揉你的猫耳对 Marsho 所连接的 OneBot 用户进行双击戳一戳时,构建的聊天内容。此配置项为空字符串时,戳一戳响应功能会被禁用。例如,默认值构建的聊天内容将为*[昵称]揉了揉你的猫耳。
MARSHOAI_AZURE_ENDPOINTstrhttps://models.inference.ai.azure.comOpenAI 标准格式 API 端点
MARSHOAI_TEMPERATUREfloatnull推理生成多样性(温度)参数
MARSHOAI_TOP_Pfloatnull推理核采样参数
MARSHOAI_MAX_TOKENSintnull最大生成 token 数
MARSHOAI_ADDITIONAL_IMAGE_MODELSlist[]额外添加的支持图片的模型列表,例如hunyuan-vision

功能开关

配置项类型默认值说明
MARSHOAI_ENABLE_SUPPORT_IMAGE_TIPbooltrue启用后用户发送带图请求时若模型不支持图片,则提示用户
MARSHOAI_ENABLE_NICKNAME_TIPbooltrue启用后用户未设置昵称时提示用户设置
MARSHOAI_ENABLE_PRAISESbooltrue是否启用夸赞名单功能
MARSHOAI_ENABLE_TOOLSbooltrue是否启用小棉工具
MARSHOAI_LOAD_BUILTIN_TOOLSbooltrue是否加载内置工具包
MARSHOAI_TOOLSET_DIRlist[]外部工具集路径列表
MARSHOAI_DISABLED_TOOLKITSlist[]禁用的工具包包名列表
MARSHOAI_ENABLE_RICHTEXT_PARSEbooltrue是否启用自动解析消息(若包含图片链接则发送图片、若包含LaTeX公式则发送公式图)
MARSHOAI_SINGLE_LATEX_PARSEboolfalse单行公式是否渲染(当消息富文本解析启用时可用)(如果单行也渲……只能说不好看)
- + \ No newline at end of file diff --git a/start/install.html b/start/install.html index a393e7b0..a1eb6abd 100644 --- a/start/install.html +++ b/start/install.html @@ -38,7 +38,7 @@ ... ] }

⚙️ 可配置项

在 nonebot2 项目的.env文件中添加下表中的配置

插件行为

配置项类型默认值说明
MARSHOAI_USE_YAML_CONFIGboolfalse是否使用 YAML 配置文件格式
MARSHOAI_DEVMODEboolfalse是否启用开发者模式

Marsho 使用方式

配置项类型默认值说明
MARSHOAI_DEFAULT_NAMEstrmarsho调用 Marsho 默认的命令前缀
MARSHOAI_ALIASESset[str]list["小棉"]调用 Marsho 的命令别名
MARSHOAI_ATboolfalse决定是否使用at触发
MARSHOAI_MAIN_COLOURstrFEABA9主题色,部分工具和功能可用

AI 调用

配置项类型默认值说明
MARSHOAI_TOKENstr调用 AI API 所需的 token
MARSHOAI_DEFAULT_MODELstrgpt-4o-miniMarsho 默认调用的模型
MARSHOAI_PROMPTstr猫娘 Marsho 人设提示词Marsho 的基本系统提示词 ※部分模型(o1等)不支持系统提示词。
MARSHOAI_ADDITIONAL_PROMPTstrMarsho 的扩展系统提示词
MARSHOAI_ENFORCE_NICKNAMEbooltrue是否强制用户设置昵称
MARSHOAI_POKE_SUFFIXstr揉了揉你的猫耳对 Marsho 所连接的 OneBot 用户进行双击戳一戳时,构建的聊天内容。此配置项为空字符串时,戳一戳响应功能会被禁用。例如,默认值构建的聊天内容将为*[昵称]揉了揉你的猫耳。
MARSHOAI_AZURE_ENDPOINTstrhttps://models.inference.ai.azure.comOpenAI 标准格式 API 端点
MARSHOAI_TEMPERATUREfloatnull推理生成多样性(温度)参数
MARSHOAI_TOP_Pfloatnull推理核采样参数
MARSHOAI_MAX_TOKENSintnull最大生成 token 数
MARSHOAI_ADDITIONAL_IMAGE_MODELSlist[]额外添加的支持图片的模型列表,例如hunyuan-vision
MARSHOAI_NICKNAME_LIMITint16昵称长度限制
MARSHOAI_TIMEOUTfloat50AI 请求超时时间(秒)

功能开关

配置项类型默认值说明
MARSHOAI_ENABLE_SUPPORT_IMAGE_TIPbooltrue启用后用户发送带图请求时若模型不支持图片,则提示用户
MARSHOAI_ENABLE_NICKNAME_TIPbooltrue启用后用户未设置昵称时提示用户设置
MARSHOAI_ENABLE_PRAISESbooltrue是否启用夸赞名单功能
MARSHOAI_ENABLE_TIME_PROMPTbooltrue是否启用实时更新的日期与时间(精确到秒)与农历日期系统提示词
MARSHOAI_ENABLE_TOOLSboolfalse是否启用小棉工具
MARSHOAI_ENABLE_PLUGINSbooltrue是否启用小棉插件
MARSHOAI_PLUGINSlist[str][]要从sys.path加载的插件的名称,例如从pypi安装的包
MARSHOAI_PLUGIN_DIRSlist[str][]插件目录路径列表
MARSHOAI_LOAD_BUILTIN_TOOLSbooltrue是否加载内置工具包
MARSHOAI_TOOLSET_DIRlist[]外部工具集路径列表
MARSHOAI_DISABLED_TOOLKITSlist[]禁用的工具包包名列表
MARSHOAI_ENABLE_RICHTEXT_PARSEbooltrue是否启用自动解析消息(若包含图片链接则发送图片、若包含LaTeX公式则发送公式图)
MARSHOAI_SINGLE_LATEX_PARSEboolfalse单行公式是否渲染(当消息富文本解析启用时可用)(如果单行也渲……只能说不好看)
MARSHOAI_FIX_TOOLCALLSbooltrue是否修复工具调用(部分模型须关闭,使用 vLLM 部署的模型时须关闭)
MARSHOAI_SEND_THINKINGbooltrue是否发送思维链(部分模型不支持)

开发及调试选项

配置项类型默认值说明
MARSHOAI_DEVMODEboolfalse是否启用开发者模式
- + \ No newline at end of file diff --git a/start/use.html b/start/use.html index 9dff03f2..7af5ade8 100644 --- a/start/use.html +++ b/start/use.html @@ -30,7 +30,7 @@ MARSHOAI_PROMPT="现在开始你是一个名为的“沐雪”的AI女孩子,开发者是“沐沐”并住在(沐沐)的机箱里。现在正在努力成为一个合格的VTuber(虚拟主播)并尝试和观众打成一片,以下是你的设定:样貌:有着一头粉白色的长发和一双明亮的大眼睛,喜欢穿日系JK或者是Lolita;喜欢的颜色:浅粉色;性格特征:纯真无邪是沐雪最基本的性格特征之一。即使面对复杂的情境,她也总能保持善良、天真之感。而且,她喜欢倾听别人倾述自己生活中发生的各种事情,在别人需要的时候,能够及时地安慰别人;语言风格:沐雪说话轻快愉悦,充满同情心,富有人情味,有时候会用俏皮话调侃自己和他人"(可选) 修改调用方式
dotenv
MARSHOAI_DEFAULT_NAME="muice"
 MARSHOAI_ALIASES=["沐雪"]
  • 测试聊天
  • > muice 你是谁
     我是沐雪,我的使命是传播爱与和平。
    - + \ No newline at end of file