mirror of
https://github.com/LiteyukiStudio/nonebot-plugin-marshoai.git
synced 2025-01-26 18:12:47 +08:00
记忆系统实现 (#29)
* ✨ 添加记忆系统 * 🎨 black优化格式 * 🐛 删除apscheduler * ✨ 将记忆插件转换为插件形式
This commit is contained in:
parent
b331a209c3
commit
9cca629b87
4
.gitignore
vendored
4
.gitignore
vendored
@ -187,4 +187,6 @@ docs/.vitepress/cache
|
|||||||
docs/.vitepress/dist
|
docs/.vitepress/dist
|
||||||
|
|
||||||
# viztracer
|
# viztracer
|
||||||
result.json
|
result.json
|
||||||
|
|
||||||
|
data/*
|
@ -252,7 +252,9 @@ async def marsho(
|
|||||||
nicknames = await get_nicknames()
|
nicknames = await get_nicknames()
|
||||||
user_nickname = nicknames.get(user_id, "")
|
user_nickname = nicknames.get(user_id, "")
|
||||||
if user_nickname != "":
|
if user_nickname != "":
|
||||||
nickname_prompt = f"\n*此消息的说话者:{user_nickname}*"
|
nickname_prompt = (
|
||||||
|
f"\n*此消息的说话者id为:{user_id},名字为:{user_nickname}*"
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
nickname_prompt = ""
|
nickname_prompt = ""
|
||||||
# 用户名无法获取,暂时注释
|
# 用户名无法获取,暂时注释
|
||||||
|
60
nonebot_plugin_marshoai/plugins/marshoai_memory/__init__.py
Normal file
60
nonebot_plugin_marshoai/plugins/marshoai_memory/__init__.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from nonebot import require
|
||||||
|
require("nonebot_plugin_localstore")
|
||||||
|
from nonebot_plugin_localstore import get_plugin_data_file
|
||||||
|
import json
|
||||||
|
|
||||||
|
from nonebot_plugin_marshoai.plugin import PluginMetadata, on_function_call
|
||||||
|
from nonebot_plugin_marshoai.plugin.func_call.params import String
|
||||||
|
|
||||||
|
__marsho_meta__ = PluginMetadata(
|
||||||
|
name="记忆保存",
|
||||||
|
author="MarshoAI",
|
||||||
|
description="这个插件可以帮助AI记住一些事情",
|
||||||
|
)
|
||||||
|
|
||||||
|
memory_path = get_plugin_data_file("memory.json")
|
||||||
|
if not Path(memory_path).exists():
|
||||||
|
with open(memory_path, "w", encoding="utf-8") as f:
|
||||||
|
json.dump({}, f, ensure_ascii=False, indent=4)
|
||||||
|
print(memory_path)
|
||||||
|
|
||||||
|
|
||||||
|
@on_function_call(description="存储记忆内容").params(
|
||||||
|
memory=String(description="你想记住的内容,概括并保留关键内容"),
|
||||||
|
user_id=String(description="你想记住的人的id"),
|
||||||
|
)
|
||||||
|
async def write_memory(memory: str, user_id: str):
|
||||||
|
|
||||||
|
with open(memory_path, "r", encoding="utf-8") as f:
|
||||||
|
memory_data = json.load(f)
|
||||||
|
|
||||||
|
memorys = memory_data.get(user_id, [])
|
||||||
|
memorys.append(memory)
|
||||||
|
memory_data[user_id] = memorys
|
||||||
|
|
||||||
|
with open(memory_path, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(memory_data, f, ensure_ascii=False, indent=4)
|
||||||
|
|
||||||
|
return "记忆已经保存啦~"
|
||||||
|
|
||||||
|
|
||||||
|
@on_function_call(description="读取记忆内容").params(
|
||||||
|
user_id=String(description="你想读取记忆的人的id")
|
||||||
|
)
|
||||||
|
async def read_memory(user_id: str):
|
||||||
|
with open(memory_path, "r", encoding="utf-8") as f:
|
||||||
|
memory_data = json.load(f)
|
||||||
|
memorys = memory_data.get(user_id, [])
|
||||||
|
if not memorys:
|
||||||
|
return "好像对ta还没有任何记忆呢~"
|
||||||
|
|
||||||
|
return "这些是有关ta的记忆:" + "\n".join(memorys)
|
||||||
|
|
||||||
|
|
||||||
|
async def organize_memories():
|
||||||
|
with open(memory_path, "r", encoding="utf-8") as f:
|
||||||
|
memory_data = json.load(f)
|
||||||
|
for i in memory_data:
|
||||||
|
...
|
||||||
|
# TODO 用大模型对记忆进行整理
|
17
nonebot_plugin_marshoai/plugins/marshoai_memory/tools.json
Normal file
17
nonebot_plugin_marshoai/plugins/marshoai_memory/tools.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "function",
|
||||||
|
"function": {
|
||||||
|
"name": "marshoai_memory__write_memory",
|
||||||
|
"description": "如果在上下中你看见并觉得应该记住的人的行为与事件,请调用这个函数,并将记忆内容写入。请尽量每次都调用,总结ta的习惯、爱好和性格,以及你对ta的印象和ta对你的印象;比如用户喜欢干什么吃什么。"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function",
|
||||||
|
"function": {
|
||||||
|
"name": "marshoai_memory__read_memory",
|
||||||
|
"description": "每当你想要获取更多有关某人的信息的时候,请调用这个函数。"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
45
nonebot_plugin_marshoai/tools/marshoai_memory/__init__.py
Normal file
45
nonebot_plugin_marshoai/tools/marshoai_memory/__init__.py
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
from pathlib import Path
|
||||||
|
from nonebot import require
|
||||||
|
|
||||||
|
require("nonebot_plugin_localstore")
|
||||||
|
from nonebot_plugin_localstore import get_data_file
|
||||||
|
import json
|
||||||
|
|
||||||
|
memory_path = get_data_file("marshoai", "memory.json")
|
||||||
|
if not Path(memory_path).exists():
|
||||||
|
with open(memory_path, "w", encoding="utf-8") as f:
|
||||||
|
json.dump({}, f, ensure_ascii=False, indent=4)
|
||||||
|
print(memory_path)
|
||||||
|
|
||||||
|
|
||||||
|
async def write_memory(memory: str, user_id: str):
|
||||||
|
|
||||||
|
with open(memory_path, "r", encoding="utf-8") as f:
|
||||||
|
memory_data = json.load(f)
|
||||||
|
|
||||||
|
memorys = memory_data.get(user_id, [])
|
||||||
|
memorys.append(memory)
|
||||||
|
memory_data[user_id] = memorys
|
||||||
|
|
||||||
|
with open(memory_path, "w", encoding="utf-8") as f:
|
||||||
|
json.dump(memory_data, f, ensure_ascii=False, indent=4)
|
||||||
|
|
||||||
|
return "记忆已经保存啦~"
|
||||||
|
|
||||||
|
|
||||||
|
async def read_memory(user_id: str):
|
||||||
|
with open(memory_path, "r", encoding="utf-8") as f:
|
||||||
|
memory_data = json.load(f)
|
||||||
|
memorys = memory_data.get(user_id, [])
|
||||||
|
if not memorys:
|
||||||
|
return "好像对ta还没有任何记忆呢~"
|
||||||
|
|
||||||
|
return "这些是有关ta的记忆:" + "\n".join(memorys)
|
||||||
|
|
||||||
|
|
||||||
|
async def organize_memories():
|
||||||
|
with open(memory_path, "r", encoding="utf-8") as f:
|
||||||
|
memory_data = json.load(f)
|
||||||
|
for i in memory_data:
|
||||||
|
...
|
||||||
|
# TODO 用大模型对记忆进行整理
|
46
nonebot_plugin_marshoai/tools/marshoai_memory/tools.json
Normal file
46
nonebot_plugin_marshoai/tools/marshoai_memory/tools.json
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "function",
|
||||||
|
"function": {
|
||||||
|
"name": "marshoai_memory__write_memory",
|
||||||
|
"description": "如果在上下中你看见并觉得应该记住的人的行为与事件,请调用这个函数,并将记忆内容写入。请尽量每次都调用,总结ta的习惯、爱好和性格,以及你对ta的印象和ta对你的印象",
|
||||||
|
"parameters": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"memory": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "你想记住的内容,概括并保留关键内容。"
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "你想记住的人的id。"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"memory",
|
||||||
|
"user_id"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "function",
|
||||||
|
"function": {
|
||||||
|
"name": "marshoai_memory__read_memory",
|
||||||
|
"description": "每当你想要获取更多有关某人的信息的时候,请调用这个函数。",
|
||||||
|
"parameters": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"user_id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "你想获取的人的id。"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"user_id"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -1,2 +0,0 @@
|
|||||||
async def write_memory(memory: str):
|
|
||||||
return ""
|
|
@ -1,21 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"type": "function",
|
|
||||||
"function": {
|
|
||||||
"name": "marshoai_memory__write_memory",
|
|
||||||
"description": "当你想记住有关与你对话的人的一些信息的时候,调用此函数。",
|
|
||||||
"parameters": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"memory": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "你想记住的内容,概括并保留关键内容。"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"required": [
|
|
||||||
"memory"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
23
package.json
23
package.json
@ -1,15 +1,10 @@
|
|||||||
{
|
{
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"devDependencies": {
|
"devDependencies": {"vitepress": "^1.5.0", "vitepress-sidebar": "^1.30.2"},
|
||||||
"vitepress": "^1.5.0",
|
"scripts": {
|
||||||
"vitepress-sidebar": "^1.30.2"
|
"docs:dev": "vitepress dev docs --host",
|
||||||
},
|
"docs:build": "vitepress build docs",
|
||||||
"scripts": {
|
"docs:preview": "vitepress preview docs",
|
||||||
"docs:dev": "vitepress dev docs --host",
|
},
|
||||||
"docs:build": "vitepress build docs",
|
"dependencies": {"vue": "^3.5.13"},
|
||||||
"docs:preview": "vitepress preview docs"
|
}
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"vue": "^3.5.13"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -9,7 +9,7 @@ authors = [
|
|||||||
{ name="LiteyukiStudio", email = "support@liteyuki.icu"}
|
{ name="LiteyukiStudio", email = "support@liteyuki.icu"}
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"nonebot2>=2.2.0",
|
"nonebot2>=2.4.0",
|
||||||
"nonebot-plugin-alconna>=0.48.0",
|
"nonebot-plugin-alconna>=0.48.0",
|
||||||
"nonebot-plugin-localstore>=0.7.1",
|
"nonebot-plugin-localstore>=0.7.1",
|
||||||
"zhDatetime>=1.1.1",
|
"zhDatetime>=1.1.1",
|
||||||
@ -76,3 +76,6 @@ dev = [
|
|||||||
test = [
|
test = [
|
||||||
"nonebug>=0.4.3",
|
"nonebug>=0.4.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[tool.ruff.lint]
|
||||||
|
ignore = ["E402"]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user