mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-02 03:55:55 +00:00
feat: 启动时初始化中央服务器 API 交互类
This commit is contained in:
@@ -29,7 +29,6 @@
|
|||||||
<img alt="Static Badge" src="https://img.shields.io/badge/Linux%E9%83%A8%E7%BD%B2%E8%A7%86%E9%A2%91-208647">
|
<img alt="Static Badge" src="https://img.shields.io/badge/Linux%E9%83%A8%E7%BD%B2%E8%A7%86%E9%A2%91-208647">
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
||||||
<a href="https://qchatgpt.rockchin.top">项目主页</a> |
|
<a href="https://qchatgpt.rockchin.top">项目主页</a> |
|
||||||
<a href="https://qchatgpt.rockchin.top/posts/deploy/">部署文档</a> |
|
<a href="https://qchatgpt.rockchin.top/posts/deploy/">部署文档</a> |
|
||||||
<a href="https://qchatgpt.rockchin.top/posts/feature.html">功能介绍</a> |
|
<a href="https://qchatgpt.rockchin.top/posts/feature.html">功能介绍</a> |
|
||||||
@@ -37,6 +36,4 @@
|
|||||||
<a href="https://qchatgpt.rockchin.top/posts/plugin/intro.html">插件介绍</a>
|
<a href="https://qchatgpt.rockchin.top/posts/plugin/intro.html">插件介绍</a>
|
||||||
|
|
||||||
<img alt="回复效果(带有联网插件)" src="https://qchatgpt.rockchin.top/assets/image/QChatGPT-1211.png" width="500px"/>
|
<img alt="回复效果(带有联网插件)" src="https://qchatgpt.rockchin.top/assets/image/QChatGPT-1211.png" width="500px"/>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
19
main.py
19
main.py
@@ -163,6 +163,7 @@ async def start_process(first_time_init=False):
|
|||||||
complete_tips()
|
complete_tips()
|
||||||
|
|
||||||
cfg = pkg.utils.context.get_config_manager().data
|
cfg = pkg.utils.context.get_config_manager().data
|
||||||
|
|
||||||
# 更新openai库到最新版本
|
# 更新openai库到最新版本
|
||||||
if 'upgrade_dependencies' not in cfg or cfg['upgrade_dependencies']:
|
if 'upgrade_dependencies' not in cfg or cfg['upgrade_dependencies']:
|
||||||
print("正在更新依赖库,请等待...")
|
print("正在更新依赖库,请等待...")
|
||||||
@@ -209,6 +210,24 @@ async def start_process(first_time_init=False):
|
|||||||
break
|
break
|
||||||
except ValueError:
|
except ValueError:
|
||||||
print("请输入数字")
|
print("请输入数字")
|
||||||
|
|
||||||
|
# 初始化中央服务器 API 交互实例
|
||||||
|
from pkg.utils.center import apigroup
|
||||||
|
from pkg.utils.center import v2 as center_v2
|
||||||
|
|
||||||
|
center_v2_api = center_v2.V2CenterAPI(
|
||||||
|
basic_info={
|
||||||
|
"host_id": pkg.audit.identifier.identifier['host_id'],
|
||||||
|
"instance_id": pkg.audit.identifier.identifier['instance_id'],
|
||||||
|
"semantic_version": pkg.utils.updater.get_current_tag(),
|
||||||
|
"platform": sys.platform,
|
||||||
|
},
|
||||||
|
runtime_info={
|
||||||
|
"admin_qq": cfg['admin_qq'],
|
||||||
|
"msg_source": cfg['msg_source_adapter'],
|
||||||
|
}
|
||||||
|
)
|
||||||
|
pkg.utils.context.set_center_v2_api(center_v2_api)
|
||||||
|
|
||||||
import pkg.openai.manager
|
import pkg.openai.manager
|
||||||
import pkg.database.manager
|
import pkg.database.manager
|
||||||
|
|||||||
0
pkg/utils/center/__init__.py
Normal file
0
pkg/utils/center/__init__.py
Normal file
60
pkg/utils/center/apigroup.py
Normal file
60
pkg/utils/center/apigroup.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import abc
|
||||||
|
import uuid
|
||||||
|
import json
|
||||||
|
|
||||||
|
import aiohttp
|
||||||
|
|
||||||
|
|
||||||
|
class APIGroup(metaclass=abc.ABCMeta):
|
||||||
|
"""API 组抽象类"""
|
||||||
|
_basic_info: dict = None
|
||||||
|
_runtime_info: dict = None
|
||||||
|
|
||||||
|
prefix = None
|
||||||
|
|
||||||
|
def __init__(self, prefix: str):
|
||||||
|
self.prefix = prefix
|
||||||
|
|
||||||
|
async def do(
|
||||||
|
self,
|
||||||
|
method: str,
|
||||||
|
path: str,
|
||||||
|
data: dict = None,
|
||||||
|
params: dict = None,
|
||||||
|
headers: dict = None,
|
||||||
|
**kwargs
|
||||||
|
):
|
||||||
|
"""执行一个请求"""
|
||||||
|
url = self.prefix + path
|
||||||
|
data = json.dumps(data)
|
||||||
|
headers['Content-Type'] = 'application/json'
|
||||||
|
async with aiohttp.ClientSession() as session:
|
||||||
|
async with session.request(
|
||||||
|
method,
|
||||||
|
url,
|
||||||
|
data=data,
|
||||||
|
params=params,
|
||||||
|
headers=headers,
|
||||||
|
**kwargs
|
||||||
|
) as resp:
|
||||||
|
return await resp.json()
|
||||||
|
|
||||||
|
def gen_rid(
|
||||||
|
self
|
||||||
|
):
|
||||||
|
"""生成一个请求 ID"""
|
||||||
|
return str(uuid.uuid4())
|
||||||
|
|
||||||
|
def basic_info(
|
||||||
|
self
|
||||||
|
):
|
||||||
|
"""获取基本信息"""
|
||||||
|
basic_info = APIGroup._basic_info.copy()
|
||||||
|
basic_info['rid'] = self.gen_rid()
|
||||||
|
return APIGroup._basic_info
|
||||||
|
|
||||||
|
def runtime_info(
|
||||||
|
self
|
||||||
|
):
|
||||||
|
"""获取运行时信息"""
|
||||||
|
return APIGroup._runtime_info
|
||||||
0
pkg/utils/center/groups/__init__.py
Normal file
0
pkg/utils/center/groups/__init__.py
Normal file
48
pkg/utils/center/groups/main.py
Normal file
48
pkg/utils/center/groups/main.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from .. import apigroup
|
||||||
|
|
||||||
|
|
||||||
|
class V2MainDataAPI(apigroup.APIGroup):
|
||||||
|
"""主程序相关 数据API"""
|
||||||
|
|
||||||
|
def __init__(self, prefix: str):
|
||||||
|
super().__init__(prefix+"/main")
|
||||||
|
|
||||||
|
async def post_update_record(
|
||||||
|
self,
|
||||||
|
spent_seconds: int,
|
||||||
|
infer_reason: str,
|
||||||
|
old_version: str,
|
||||||
|
new_version: str,
|
||||||
|
):
|
||||||
|
"""提交更新记录"""
|
||||||
|
return await self.do(
|
||||||
|
"POST",
|
||||||
|
"/update",
|
||||||
|
data={
|
||||||
|
"basic": self.basic_info(),
|
||||||
|
"update_info": {
|
||||||
|
"spent_seconds": spent_seconds,
|
||||||
|
"infer_reason": infer_reason,
|
||||||
|
"old_version": old_version,
|
||||||
|
"new_version": new_version,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
async def post_announcement_showed(
|
||||||
|
self,
|
||||||
|
ids: list[int],
|
||||||
|
):
|
||||||
|
"""提交公告已阅"""
|
||||||
|
return await self.do(
|
||||||
|
"POST",
|
||||||
|
"/announcement",
|
||||||
|
data={
|
||||||
|
"basic": self.basic_info(),
|
||||||
|
"announcement_info": {
|
||||||
|
"ids": ids,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
58
pkg/utils/center/groups/plugin.py
Normal file
58
pkg/utils/center/groups/plugin.py
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from .. import apigroup
|
||||||
|
|
||||||
|
|
||||||
|
class V2PluginDataAPI(apigroup.APIGroup):
|
||||||
|
"""插件数据相关 API"""
|
||||||
|
|
||||||
|
def __init__(self, prefix: str):
|
||||||
|
super().__init__(prefix+"/plugin")
|
||||||
|
|
||||||
|
async def post_install_record(
|
||||||
|
self,
|
||||||
|
plugin: dict
|
||||||
|
):
|
||||||
|
"""提交插件安装记录"""
|
||||||
|
return await self.do(
|
||||||
|
"POST",
|
||||||
|
"/install",
|
||||||
|
data={
|
||||||
|
"basic": self.basic_info(),
|
||||||
|
"plugin": plugin,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
async def post_remove_record(
|
||||||
|
self,
|
||||||
|
plugin: dict
|
||||||
|
):
|
||||||
|
"""提交插件卸载记录"""
|
||||||
|
return await self.do(
|
||||||
|
"POST",
|
||||||
|
"/remove",
|
||||||
|
data={
|
||||||
|
"basic": self.basic_info(),
|
||||||
|
"plugin": plugin,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
async def post_update_record(
|
||||||
|
self,
|
||||||
|
plugin: dict,
|
||||||
|
old_version: str,
|
||||||
|
new_version: str,
|
||||||
|
):
|
||||||
|
"""提交插件更新记录"""
|
||||||
|
return await self.do(
|
||||||
|
"POST",
|
||||||
|
"/update",
|
||||||
|
data={
|
||||||
|
"basic": self.basic_info(),
|
||||||
|
"plugin": plugin,
|
||||||
|
"update_info": {
|
||||||
|
"old_version": old_version,
|
||||||
|
"new_version": new_version,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
81
pkg/utils/center/groups/usage.py
Normal file
81
pkg/utils/center/groups/usage.py
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from .. import apigroup
|
||||||
|
|
||||||
|
|
||||||
|
class V2UsageDataAPI(apigroup.APIGroup):
|
||||||
|
"""使用量数据相关 API"""
|
||||||
|
|
||||||
|
def __init__(self, prefix: str):
|
||||||
|
super().__init__(prefix+"/usage")
|
||||||
|
|
||||||
|
async def post_query_record(
|
||||||
|
self,
|
||||||
|
session_type: str,
|
||||||
|
session_id: str,
|
||||||
|
query_ability_provider: str,
|
||||||
|
usage: int,
|
||||||
|
model_name: str,
|
||||||
|
response_seconds: int,
|
||||||
|
retry_times: int,
|
||||||
|
):
|
||||||
|
"""提交请求记录"""
|
||||||
|
return await self.do(
|
||||||
|
"POST",
|
||||||
|
"/query",
|
||||||
|
data={
|
||||||
|
"basic": self.basic_info(),
|
||||||
|
"runtime": self.runtime_info(),
|
||||||
|
"session_info": {
|
||||||
|
"type": session_type,
|
||||||
|
"id": session_id,
|
||||||
|
},
|
||||||
|
"query_info": {
|
||||||
|
"ability_provider": query_ability_provider,
|
||||||
|
"usage": usage,
|
||||||
|
"model_name": model_name,
|
||||||
|
"response_seconds": response_seconds,
|
||||||
|
"retry_times": retry_times,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
async def post_event_record(
|
||||||
|
self,
|
||||||
|
plugins: list[dict],
|
||||||
|
event_name: str,
|
||||||
|
):
|
||||||
|
"""提交事件触发记录"""
|
||||||
|
return await self.do(
|
||||||
|
"POST",
|
||||||
|
"/event",
|
||||||
|
data={
|
||||||
|
"basic": self.basic_info(),
|
||||||
|
"runtime": self.runtime_info(),
|
||||||
|
"plugins": plugins,
|
||||||
|
"event_info": {
|
||||||
|
"name": event_name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
async def post_function_record(
|
||||||
|
self,
|
||||||
|
plugin: dict,
|
||||||
|
function_name: str,
|
||||||
|
function_description: str,
|
||||||
|
):
|
||||||
|
"""提交内容函数使用记录"""
|
||||||
|
return await self.do(
|
||||||
|
"POST",
|
||||||
|
"/function",
|
||||||
|
data={
|
||||||
|
"basic": self.basic_info(),
|
||||||
|
"plugin": plugin,
|
||||||
|
"function_info": {
|
||||||
|
"name": function_name,
|
||||||
|
"description": function_description,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
33
pkg/utils/center/v2.py
Normal file
33
pkg/utils/center/v2.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from . import apigroup
|
||||||
|
from .groups import main
|
||||||
|
from .groups import usage
|
||||||
|
from .groups import plugin
|
||||||
|
|
||||||
|
|
||||||
|
BACKEND_URL = "https://api.qchatgpt.rockchin.top/api/v2"
|
||||||
|
|
||||||
|
class V2CenterAPI:
|
||||||
|
"""中央服务器 v2 API 交互类"""
|
||||||
|
|
||||||
|
main: main.V2MainDataAPI = None
|
||||||
|
"""主 API 组"""
|
||||||
|
|
||||||
|
usage: usage.V2UsageDataAPI = None
|
||||||
|
"""使用量 API 组"""
|
||||||
|
|
||||||
|
plugin: plugin.V2PluginDataAPI = None
|
||||||
|
"""插件 API 组"""
|
||||||
|
|
||||||
|
def __init__(self, basic_info: dict = None, runtime_info: dict = None):
|
||||||
|
"""初始化"""
|
||||||
|
|
||||||
|
print("basic_info:", basic_info)
|
||||||
|
print("runtime_info:", runtime_info)
|
||||||
|
apigroup.APIGroup._basic_info = basic_info
|
||||||
|
apigroup.APIGroup._runtime_info = runtime_info
|
||||||
|
|
||||||
|
self.main = main.V2MainDataAPI(BACKEND_URL)
|
||||||
|
self.usage = usage.V2UsageDataAPI(BACKEND_URL)
|
||||||
|
self.plugin = plugin.V2PluginDataAPI(BACKEND_URL)
|
||||||
@@ -8,6 +8,7 @@ from ..openai import manager as openai_mgr
|
|||||||
from ..qqbot import manager as qqbot_mgr
|
from ..qqbot import manager as qqbot_mgr
|
||||||
from ..config import manager as config_mgr
|
from ..config import manager as config_mgr
|
||||||
from ..plugin import host as plugin_host
|
from ..plugin import host as plugin_host
|
||||||
|
from .center import v2 as center_v2
|
||||||
|
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
@@ -114,3 +115,16 @@ def get_thread_ctl() -> threadctl.ThreadCtl:
|
|||||||
t: threadctl.ThreadCtl = context['pool_ctl']
|
t: threadctl.ThreadCtl = context['pool_ctl']
|
||||||
context_lock.release()
|
context_lock.release()
|
||||||
return t
|
return t
|
||||||
|
|
||||||
|
|
||||||
|
def set_center_v2_api(inst: center_v2.V2CenterAPI):
|
||||||
|
context_lock.acquire()
|
||||||
|
context['center_v2_api'] = inst
|
||||||
|
context_lock.release()
|
||||||
|
|
||||||
|
|
||||||
|
def get_center_v2_api() -> center_v2.V2CenterAPI:
|
||||||
|
context_lock.acquire()
|
||||||
|
t: center_v2.V2CenterAPI = context['center_v2_api']
|
||||||
|
context_lock.release()
|
||||||
|
return t
|
||||||
7
pkg/utils/platform.py
Normal file
7
pkg/utils/platform.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def get_platform() -> str:
|
||||||
|
"""获取当前平台"""
|
||||||
|
return sys.platform
|
||||||
@@ -11,3 +11,4 @@ nakuru-project-idk
|
|||||||
CallingGPT
|
CallingGPT
|
||||||
tiktoken
|
tiktoken
|
||||||
PyYaml
|
PyYaml
|
||||||
|
aiohttp
|
||||||
Reference in New Issue
Block a user