Compare commits

...

7 Commits

Author SHA1 Message Date
c9d2ef7885 异步化获取夸赞名单与昵称函数 2025-03-29 12:53:20 +08:00
Akarin~
ff6369c1a5 Update README_EN.md 2025-03-25 23:06:52 +08:00
Akarin~
c00cb19e9e Update README.md 2025-03-25 23:05:58 +08:00
e4490334fa ️ 修改 SSL 问题修复方式 2025-03-23 22:58:10 +08:00
fce3152e17 修改文档url 2025-03-17 23:13:47 +08:00
9878114376 修复夸赞名单报错 2025-03-17 05:25:15 +08:00
21b695f2d4 Merge pull request #22 from LiteyukiStudio/snowykami-patch-2
📝 新增PR预览
2025-03-11 00:05:16 +08:00
10 changed files with 27 additions and 26 deletions

2
CNAME
View File

@@ -1 +1 @@
marsho.liteyuki.icu marshoai-docs.pages.liteyuki.icu

View File

@@ -1,6 +1,6 @@
<!--suppress LongLine --> <!--suppress LongLine -->
<div align="center"> <div align="center">
<a href="https://marsho.liteyuki.icu"><img src="https://marsho.liteyuki.icu/marsho-full.svg" width="800" height="430" alt="MarshoLogo"></a> <a href="https://marshoai-docs.pages.liteyuki.icu"><img src="https://marshoai-docs.pages.liteyuki.icu/marsho-full.svg" width="800" height="430" alt="MarshoLogo"></a>
<br> <br>
</div> </div>
@@ -48,7 +48,7 @@ _谁不喜欢回复消息快又可爱的猫娘呢_
## 😼 使用 ## 😼 使用
请查看[使用文档](https://marsho.liteyuki.icu/start/use) 请查看[使用文档](https://marshoai-docs.pages.liteyuki.icu/start/use.html)
## ❤ 鸣谢&版权说明 ## ❤ 鸣谢&版权说明

View File

@@ -1,6 +1,6 @@
<!--suppress LongLine --> <!--suppress LongLine -->
<div align="center"> <div align="center">
<a href="https://marsho.liteyuki.icu"><img src="https://marsho.liteyuki.icu/marsho-full.svg" width="800" height="430" alt="MarshoLogo"></a> <a href="https://marshoai-docs.pages.liteyuki.icu"><img src="https://marshoai-docs.pages.liteyuki.icu/marsho-full.svg" width="800" height="430" alt="MarshoLogo"></a>
<br> <br>
</div> </div>
@@ -48,7 +48,7 @@ Plugin internally installed the catgirl character of Marsho, is able to have a c
- 🐾 Play! I like play with friends! - 🐾 Play! I like play with friends!
## 😼 Usage ## 😼 Usage
Please read [Documentation](https://marsho.liteyuki.icu/start/install) Please read [Documentation](https://marshoai-docs.pages.liteyuki.icu/start/use.html)
## ❤ Thanks&Copyright ## ❤ Thanks&Copyright
This project uses the following code from other projects: This project uses the following code from other projects:

View File

@@ -65,7 +65,7 @@ When nonebot linked to OneBot v11 adapter, can recieve double click and response
MarshoTools is a feature added in `v0.5.0`, support loading external function library to provide Function Call for Marsho. MarshoTools is a feature added in `v0.5.0`, support loading external function library to provide Function Call for Marsho.
## 🧩 Marsho Plugin ## 🧩 Marsho Plugin
Marsho Plugin is a feature added in `v1.0.0`, replacing the old MarshoTools feature. [Documentation](https://marsho.liteyuki.icu/dev/extension) Marsho Plugin is a feature added in `v1.0.0`, replacing the old MarshoTools feature. [Documentation](https://marshoai-docs.pages.liteyuki.icu/dev/extension)
## 👍 Praise list ## 👍 Praise list

View File

@@ -68,7 +68,7 @@ GitHub Models API 的限制较多,不建议使用,建议通过修改`MARSHOA
## 🧩 小棉插件 ## 🧩 小棉插件
小棉插件是`v1.0.0`的新增功能,替代旧的小棉工具功能。[使用文档](https://marsho.liteyuki.icu/dev/extension) 小棉插件是`v1.0.0`的新增功能,替代旧的小棉工具功能。[使用文档](https://marshoai-docs.pages.liteyuki.icu/dev/extension)
## 👍 夸赞名单 ## 👍 夸赞名单

View File

@@ -37,7 +37,7 @@ OPENAI_NEW_MODELS: list = [
INTRODUCTION: str = f"""MarshoAI-NoneBot by LiteyukiStudio INTRODUCTION: str = f"""MarshoAI-NoneBot by LiteyukiStudio
你好喵~我是一只可爱的猫娘AI名叫小棉~🐾! 你好喵~我是一只可爱的猫娘AI名叫小棉~🐾!
我的主页在这里哦~↓↓↓ 我的主页在这里哦~↓↓↓
https://marsho.liteyuki.icu https://marshoai-docs.pages.liteyuki.icu
※ 使用 「{config.marshoai_default_name}.status」命令获取状态信息。 ※ 使用 「{config.marshoai_default_name}.status」命令获取状态信息。
※ 使用「{config.marshoai_default_name}.help」命令获取使用说明。""" ※ 使用「{config.marshoai_default_name}.help」命令获取使用说明。"""

View File

@@ -103,7 +103,7 @@ class MarshoHandler:
处理单条聊天 处理单条聊天
""" """
context_msg = get_prompt(model_name) + ( context_msg = await get_prompt(model_name) + (
self.context.build(self.target.id, self.target.private) self.context.build(self.target.id, self.target.private)
) )
response = await make_chat_openai( response = await make_chat_openai(

View File

@@ -288,7 +288,7 @@ with contextlib.suppress(ImportError): # 优化先不做()
response = await make_chat_openai( response = await make_chat_openai(
client=client, client=client,
model_name=model_name, model_name=model_name,
msg=get_prompt(model_name) msg=await get_prompt(model_name)
+ [ + [
UserMessage( UserMessage(
content=f"*{user_nickname}{config.marshoai_poke_suffix}" content=f"*{user_nickname}{config.marshoai_poke_suffix}"

View File

@@ -2,6 +2,7 @@ import base64
import json import json
import mimetypes import mimetypes
import re import re
import ssl
import uuid import uuid
from typing import Any, Dict, List, Optional, Union from typing import Any, Dict, List, Optional, Union
@@ -58,6 +59,8 @@ _praises_init_data = {
""" """
初始夸赞名单之数据 初始夸赞名单之数据
""" """
_ssl_context = ssl.create_default_context()
_ssl_context.set_ciphers("DEFAULT")
async def get_image_raw_and_type( async def get_image_raw_and_type(
@@ -74,7 +77,7 @@ async def get_image_raw_and_type(
tuple[bytes, str]: 图片二进制数据, 图片MIME格式 tuple[bytes, str]: 图片二进制数据, 图片MIME格式
""" """
async with httpx.AsyncClient() as client: async with httpx.AsyncClient(verify=_ssl_context) as client:
response = await client.get(url, headers=_browser_headers, timeout=timeout) response = await client.get(url, headers=_browser_headers, timeout=timeout)
if response.status_code == 200: if response.status_code == 200:
# 获取图片数据 # 获取图片数据
@@ -98,9 +101,7 @@ async def get_image_b64(url: str, timeout: int = 10) -> Optional[str]:
return: 图片base64编码 return: 图片base64编码
""" """
if data_type := await get_image_raw_and_type( if data_type := await get_image_raw_and_type(url, timeout):
url.replace("https://", "http://"), timeout
):
# image_format = content_type.split("/")[1] if content_type else "jpeg" # image_format = content_type.split("/")[1] if content_type else "jpeg"
base64_image = base64.b64encode(data_type[0]).decode("utf-8") base64_image = base64.b64encode(data_type[0]).decode("utf-8")
data_url = "data:{};base64,{}".format(data_type[1], base64_image) data_url = "data:{};base64,{}".format(data_type[1], base64_image)
@@ -136,15 +137,15 @@ async def make_chat_openai(
@from_cache("praises") @from_cache("praises")
def get_praises(): async def get_praises():
praises_file = store.get_plugin_data_file( praises_file = store.get_plugin_data_file(
"praises.json" "praises.json"
) # 夸赞名单文件使用localstore存储 ) # 夸赞名单文件使用localstore存储
if not praises_file.exists(): if not praises_file.exists():
with open(praises_file, "w", encoding="utf-8") as f: async with aiofiles.open(praises_file, "w", encoding="utf-8") as f:
json.dump(_praises_init_data, f, ensure_ascii=False, indent=4) await f.write(json.dumps(_praises_init_data, ensure_ascii=False, indent=4))
with open(praises_file, "r", encoding="utf-8") as f: async with aiofiles.open(praises_file, "r", encoding="utf-8") as f:
data = json.load(f) data = json.loads(await f.read())
praises_json = data praises_json = data
return praises_json return praises_json
@@ -160,8 +161,8 @@ async def refresh_praises_json():
return data return data
def build_praises() -> str: async def build_praises() -> str:
praises = get_praises() praises = await get_praises()
result = ["你喜欢以下几个人物,他们有各自的优点:"] result = ["你喜欢以下几个人物,他们有各自的优点:"]
for item in praises["like"]: for item in praises["like"]:
result.append(f"名字:{item['name']},优点:{item['advantages']}") result.append(f"名字:{item['name']},优点:{item['advantages']}")
@@ -213,8 +214,8 @@ async def set_nickname(user_id: str, name: str):
data[user_id] = name data[user_id] = name
if name == "" and user_id in data: if name == "" and user_id in data:
del data[user_id] del data[user_id]
with open(filename, "w", encoding="utf-8") as f: async with aiofiles.open(filename, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4) await f.write(json.dumps(data, ensure_ascii=False, indent=4))
return data return data
@@ -237,11 +238,11 @@ async def refresh_nickname_json():
logger.error("刷新 nickname_json 表错误:无法载入 nickname.json 文件") logger.error("刷新 nickname_json 表错误:无法载入 nickname.json 文件")
def get_prompt(model: str) -> List[Dict[str, Any]]: async def get_prompt(model: str) -> List[Dict[str, Any]]:
"""获取系统提示词""" """获取系统提示词"""
prompts = config.marshoai_additional_prompt prompts = config.marshoai_additional_prompt
if config.marshoai_enable_praises: if config.marshoai_enable_praises:
praises_prompt = build_praises() praises_prompt = await build_praises()
prompts += praises_prompt prompts += praises_prompt
if config.marshoai_enable_time_prompt: if config.marshoai_enable_time_prompt:

View File

@@ -34,7 +34,7 @@ dependencies = [
license = { text = "MIT, Mulan PSL v2" } license = { text = "MIT, Mulan PSL v2" }
[project.urls] [project.urls]
Homepage = "https://marsho.liteyuki.icu/" Homepage = "https://marshoai-docs.pages.liteyuki.icu/"
[tool.nonebot] [tool.nonebot]