new file: dependence.py
new file: package.py new file: packup.bat new file: packup.sh new file: requirements.txt new file: scripts/__init__.py new file: scripts/file_store_api.py new file: src/__init__.py new file: src/config.toml new file: src/modules/__init__.py new file: src/modules/plugin_modules.py new file: src/modules/user_module.py new file: src/process.py new file: test.py
This commit is contained in:
0
src/__init__.py
Normal file
0
src/__init__.py
Normal file
4
src/config.toml
Normal file
4
src/config.toml
Normal file
@ -0,0 +1,4 @@
|
||||
[siloconflow]
|
||||
api_key = ""
|
||||
modules = ["Qwen/Qwen2.5-7B-Instruct", "Qwen/Qwen2.5-Coder-7B-Instruct"]
|
||||
base_url = "https://api.siliconflow.cn/v1"
|
||||
0
src/modules/__init__.py
Normal file
0
src/modules/__init__.py
Normal file
55
src/modules/plugin_modules.py
Normal file
55
src/modules/plugin_modules.py
Normal file
@ -0,0 +1,55 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from typing import Optional
|
||||
from dataclasses import dataclass
|
||||
from src.modules import user_module as usermod
|
||||
import scripts.file_store_api as file_M
|
||||
|
||||
class MessageContext:
|
||||
"""封装消息处理的上下文数据"""
|
||||
def __init__(self, uid: str, gid: Optional[str], raw_message: str,id:str):
|
||||
self.raw_message = raw_message
|
||||
self._processed = False
|
||||
self.response: Optional[str] = None
|
||||
# 核心服务实例化
|
||||
self.chat_manager = file_M.ChatManager()
|
||||
self.user = usermod.User(user_id=uid)
|
||||
self.rebot_id = id
|
||||
|
||||
# 动态加载数据
|
||||
if gid:
|
||||
self.group = usermod.Group(group_id=gid)
|
||||
self.group.current_user = self.user
|
||||
else:
|
||||
self.group = None
|
||||
|
||||
|
||||
@dataclass
|
||||
class PluginPermission:
|
||||
access_private: bool = False # 允许处理私聊消息
|
||||
access_group: bool = True # 允许处理群消息
|
||||
read_history: bool = False # 允许读取历史记录
|
||||
|
||||
from pathlib import Path
|
||||
import os
|
||||
|
||||
class BasePlugin(ABC):
|
||||
def __init__(self, ctx: MessageContext):
|
||||
self.ctx = ctx
|
||||
self._config_manager = file_M.ConfigManager(self._get_plugin_config_path())
|
||||
|
||||
@property
|
||||
def config(self) -> dict:
|
||||
"""直接访问插件配置的快捷方式"""
|
||||
return self._config_manager.load_config(self.name)
|
||||
|
||||
def _get_plugin_config_path(self) -> str:
|
||||
"""获取插件配置目录路径(config/插件名)"""
|
||||
plugin_name = self.__class__.__name__.lower()
|
||||
|
||||
return str(Path("config") / plugin_name)
|
||||
|
||||
def save_config(self, config_dict: dict = None) -> bool:
|
||||
"""快捷保存配置"""
|
||||
if config_dict:
|
||||
self._config_manager.update_config({"config": config_dict})
|
||||
return self._config_manager.save_config()
|
||||
42
src/modules/user_module.py
Normal file
42
src/modules/user_module.py
Normal file
@ -0,0 +1,42 @@
|
||||
import json
|
||||
import time
|
||||
|
||||
|
||||
|
||||
class User:
|
||||
def __init__(self, user_id):
|
||||
self.user_id = user_id
|
||||
self.nickname = "test"
|
||||
self.messages = []
|
||||
self.signal = True
|
||||
|
||||
def set_input_status(self, status):
|
||||
payload = json.dumps({
|
||||
"user_id": self.user_id,
|
||||
"event_type": status
|
||||
})
|
||||
headers = {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
while self.signal:
|
||||
print(f"刷新 {self.nickname} 的输入状态为: {status}")
|
||||
time.sleep(0.5)
|
||||
|
||||
def send_message(self, message):
|
||||
print(f"send message{0}".format(message))
|
||||
|
||||
class Group:
|
||||
def __init__(self, group_id,user=None,users=None):
|
||||
self.group_id = group_id
|
||||
self.current_user = user
|
||||
self.nickname = "test"
|
||||
self.users = users
|
||||
self.get_group_users()
|
||||
self.messages =[]
|
||||
|
||||
|
||||
def get_group_users(self):
|
||||
return(["user1","user2"])
|
||||
|
||||
def send_message(self,message):
|
||||
print(f"send message{0}".format(message))
|
||||
63
src/process.py
Normal file
63
src/process.py
Normal file
@ -0,0 +1,63 @@
|
||||
import threading
|
||||
from src.modules.plugin_modules import BasePlugin, MessageContext
|
||||
from openai import OpenAI
|
||||
import time
|
||||
|
||||
|
||||
class SiloconFlowAPI:
|
||||
def __init__(self, api_key,modules,base_url):
|
||||
self.client = OpenAI(api_key=api_key, base_url=base_url)
|
||||
self.api_key = api_key
|
||||
self.module = modules
|
||||
|
||||
def get_ai_message(self, message,i=0):
|
||||
try:
|
||||
response = self.client.chat.completions.create(
|
||||
model=self.module[i],
|
||||
messages=message,
|
||||
temperature=0.7,
|
||||
max_tokens=4096
|
||||
)
|
||||
print("token usage {0}".format(response.usage.total_tokens))
|
||||
return response.choices[0].message.content
|
||||
except:
|
||||
if i<len(self.module)-1:
|
||||
i+=1
|
||||
self.get_ai_message(message,i)
|
||||
else:
|
||||
print("server busy,waiting")
|
||||
time.sleep(10)
|
||||
i = 0
|
||||
self.get_ai_message(message,i)
|
||||
|
||||
|
||||
|
||||
class Ai_reply(BasePlugin):
|
||||
def after_save(self):
|
||||
config = self.config.get("siloconflow")
|
||||
ai_server = SiloconFlowAPI(base_url= config.get("base_url"), api_key= config.get("api_key"), modules= config.get("modules"))
|
||||
if self.ctx.group is None:
|
||||
self.ctx.user.messages.append({'role': 'user',
|
||||
'content': f"当前用户为:{self.ctx.user.nickname},其uid为:{self.ctx.user.user_id},以上为背景信息,根据背景信息回复用户消息。用户消息:{self.ctx.raw_message}"})
|
||||
message = ai_server.get_ai_message(self.ctx.user.messages)
|
||||
typing_thread = threading.Thread(target=self.ctx.user.set_input_status, args=(1,))
|
||||
typing_thread.start()
|
||||
#获取ai返回值
|
||||
message = ai_server.get_ai_message(self.ctx.user.messages)
|
||||
#结束刷新状态
|
||||
self.ctx.user.signal = False
|
||||
#回收线程
|
||||
typing_thread.join()
|
||||
#指示器归零
|
||||
self.ctx.user.signal = True
|
||||
#发送消息
|
||||
self.ctx.user.send_message(message)
|
||||
else:
|
||||
if "CQ:at,qq={0}".format(self.ctx.rebot_id) in self.ctx.raw_message:
|
||||
self.ctx.group.messages.append({'role': 'user',
|
||||
'content':
|
||||
f"群聊名称为:{self.ctx.group.nickname},用户在群中的近十条消息为:{self.ctx.group.current_user.messages},用户名叫:{self.ctx.group.current_user.nickname},以上为背景信息,根据背景信息回复消息。消息为:{self.ctx.raw_message}"})
|
||||
message = ai_server.get_ai_message(self.ctx.group.messages)
|
||||
|
||||
self.ctx.group.send_message(message)
|
||||
return "ok"
|
||||
Reference in New Issue
Block a user