mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-04 21:06:03 +00:00
Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce881372ee | ||
|
|
171ea7c375 | ||
|
|
1e9a6f813f | ||
|
|
39a7f3b2b9 | ||
|
|
8d375a02db | ||
|
|
cac8a0a414 | ||
|
|
c89623967e | ||
|
|
92aa9c1711 | ||
|
|
71f2a58acb | ||
|
|
1f07a8a9e3 | ||
|
|
cacd21bde7 | ||
|
|
a060ec66c3 | ||
|
|
fd10db3c75 | ||
|
|
db4c658980 | ||
|
|
0ee88674f8 | ||
|
|
3540759682 | ||
|
|
44cc8f15b4 | ||
|
|
59f821bf0a | ||
|
|
80858672b0 | ||
|
|
3258d5b255 |
42
.github/workflows/build-docker-image.yml
vendored
42
.github/workflows/build-docker-image.yml
vendored
@@ -17,22 +17,32 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
if [ -z "$GITHUB_REF" ]; then
|
if [ -z "$GITHUB_REF" ]; then
|
||||||
export GITHUB_REF=${{ github.ref }}
|
export GITHUB_REF=${{ github.ref }}
|
||||||
|
echo $GITHUB_REF
|
||||||
|
fi
|
||||||
|
# - name: Check GITHUB_REF env
|
||||||
|
# run: echo $GITHUB_REF
|
||||||
|
# - name: Get version # 在 GitHub Actions 运行环境
|
||||||
|
# id: get_version
|
||||||
|
# if: (startsWith(env.GITHUB_REF, 'refs/tags/')||startsWith(github.ref, 'refs/tags/')) && startsWith(github.repository, 'RockChinQ/QChatGPT')
|
||||||
|
# run: export GITHUB_REF=${GITHUB_REF/refs\/tags\//}
|
||||||
|
- name: Check version
|
||||||
|
id: check_version
|
||||||
|
run: |
|
||||||
|
echo $GITHUB_REF
|
||||||
|
# 如果是tag,则去掉refs/tags/前缀
|
||||||
|
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||||
|
echo "It's a tag"
|
||||||
|
echo $GITHUB_REF
|
||||||
|
echo $GITHUB_REF | awk -F '/' '{print $3}'
|
||||||
|
echo ::set-output name=version::$(echo $GITHUB_REF | awk -F '/' '{print $3}')
|
||||||
|
else
|
||||||
|
echo "It's not a tag"
|
||||||
|
echo $GITHUB_REF
|
||||||
|
echo ::set-output name=version::${GITHUB_REF}
|
||||||
fi
|
fi
|
||||||
- name: Check GITHUB_REF env
|
|
||||||
run: echo $GITHUB_REF
|
|
||||||
- name: Get version
|
|
||||||
id: get_version
|
|
||||||
if: (startsWith(env.GITHUB_REF, 'refs/tags/')||startsWith(github.ref, 'refs/tags/')) && startsWith(github.repository, 'RockChinQ/QChatGPT')
|
|
||||||
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}
|
|
||||||
- name: Build # image name: rockchin/qchatgpt:<VERSION>
|
|
||||||
run: docker build --network=host -t rockchin/qchatgpt:${{ steps.get_version.outputs.VERSION }} -t rockchin/qchatgpt:latest .
|
|
||||||
- name: Login to Registry
|
- name: Login to Registry
|
||||||
run: docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }}
|
run: docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
- name: Create Buildx
|
||||||
- name: Push image
|
run: docker buildx create --name mybuilder --use
|
||||||
if: (startsWith(env.GITHUB_REF, 'refs/tags/')||startsWith(github.ref, 'refs/tags/')) && startsWith(github.repository, 'RockChinQ/QChatGPT')
|
- name: Build # image name: rockchin/qchatgpt:<VERSION>
|
||||||
run: docker push rockchin/qchatgpt:${{ steps.get_version.outputs.VERSION }}
|
run: docker buildx build --platform linux/arm64,linux/amd64 -t rockchin/qchatgpt:${{ steps.check_version.outputs.version }} -t rockchin/qchatgpt:latest . --push
|
||||||
|
|
||||||
- name: Push latest image
|
|
||||||
if: (startsWith(env.GITHUB_REF, 'refs/tags/')||startsWith(github.ref, 'refs/tags/')) && startsWith(github.repository, 'RockChinQ/QChatGPT')
|
|
||||||
run: docker push rockchin/qchatgpt:latest
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ WORKDIR /app
|
|||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
RUN python -m pip install -r requirements.txt
|
RUN apt update \
|
||||||
|
&& apt install gcc -y \
|
||||||
|
&& python -m pip install -r requirements.txt
|
||||||
|
|
||||||
CMD [ "python", "main.py" ]
|
CMD [ "python", "main.py" ]
|
||||||
44
main.py
44
main.py
@@ -1,5 +1,5 @@
|
|||||||
import asyncio
|
# QChatGPT 终端启动入口
|
||||||
|
# 在此层级解决依赖项检查。
|
||||||
|
|
||||||
asciiart = r"""
|
asciiart = r"""
|
||||||
___ ___ _ _ ___ ___ _____
|
___ ___ _ _ ___ ___ _____
|
||||||
@@ -11,8 +11,44 @@ asciiart = r"""
|
|||||||
📖文档地址: https://q.rkcn.top
|
📖文档地址: https://q.rkcn.top
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
|
async def main_entry():
|
||||||
print(asciiart)
|
print(asciiart)
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# 检查依赖
|
||||||
|
|
||||||
|
from pkg.core.bootutils import deps
|
||||||
|
|
||||||
|
missing_deps = await deps.check_deps()
|
||||||
|
|
||||||
|
if missing_deps:
|
||||||
|
print("以下依赖包未安装,将自动安装,请完成后重启程序:")
|
||||||
|
for dep in missing_deps:
|
||||||
|
print("-", dep)
|
||||||
|
await deps.install_deps(missing_deps)
|
||||||
|
print("已自动安装缺失的依赖包,请重启程序。")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
# 检查配置文件
|
||||||
|
|
||||||
|
from pkg.core.bootutils import files
|
||||||
|
|
||||||
|
generated_files = await files.generate_files()
|
||||||
|
|
||||||
|
if generated_files:
|
||||||
|
print("以下文件不存在,已自动生成,请按需修改配置文件后重启:")
|
||||||
|
for file in generated_files:
|
||||||
|
print("-", file)
|
||||||
|
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
from pkg.core import boot
|
from pkg.core import boot
|
||||||
asyncio.run(boot.main())
|
await boot.main()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
asyncio.run(main_entry())
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import logging
|
|||||||
import asyncio
|
import asyncio
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
import aioconsole
|
|
||||||
|
|
||||||
from ..platform import manager as im_mgr
|
from ..platform import manager as im_mgr
|
||||||
from ..provider.session import sessionmgr as llm_session_mgr
|
from ..provider.session import sessionmgr as llm_session_mgr
|
||||||
from ..provider.requester import modelmgr as llm_model_mgr
|
from ..provider.requester import modelmgr as llm_model_mgr
|
||||||
@@ -15,8 +13,8 @@ from ..config import manager as config_mgr
|
|||||||
from ..audit.center import v2 as center_mgr
|
from ..audit.center import v2 as center_mgr
|
||||||
from ..command import cmdmgr
|
from ..command import cmdmgr
|
||||||
from ..plugin import manager as plugin_mgr
|
from ..plugin import manager as plugin_mgr
|
||||||
from . import pool, controller
|
from ..pipeline import pool
|
||||||
from ..pipeline import stagemgr
|
from ..pipeline import controller, stagemgr
|
||||||
from ..utils import version as version_mgr, proxy as proxy_mgr
|
from ..utils import version as version_mgr, proxy as proxy_mgr
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
138
pkg/core/boot.py
138
pkg/core/boot.py
@@ -1,143 +1,29 @@
|
|||||||
from __future__ import print_function
|
from __future__ import print_function
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from .bootutils import files
|
|
||||||
from .bootutils import deps
|
|
||||||
from .bootutils import log
|
|
||||||
from .bootutils import config
|
|
||||||
|
|
||||||
from . import app
|
from . import app
|
||||||
from . import pool
|
|
||||||
from . import controller
|
|
||||||
from ..pipeline import stagemgr
|
|
||||||
from ..audit import identifier
|
from ..audit import identifier
|
||||||
from ..provider.session import sessionmgr as llm_session_mgr
|
from . import stage
|
||||||
from ..provider.requester import modelmgr as llm_model_mgr
|
from .stages import load_config, setup_logger, build_app
|
||||||
from ..provider.sysprompt import sysprompt as llm_prompt_mgr
|
|
||||||
from ..provider.tools import toolmgr as llm_tool_mgr
|
|
||||||
from ..platform import manager as im_mgr
|
|
||||||
from ..command import cmdmgr
|
|
||||||
from ..plugin import manager as plugin_mgr
|
|
||||||
from ..audit.center import v2 as center_v2
|
|
||||||
from ..utils import version, proxy, announce
|
|
||||||
|
|
||||||
use_override = False
|
|
||||||
|
stage_order = [
|
||||||
|
"LoadConfigStage",
|
||||||
|
"SetupLoggerStage",
|
||||||
|
"BuildAppStage"
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
async def make_app() -> app.Application:
|
async def make_app() -> app.Application:
|
||||||
global use_override
|
|
||||||
|
|
||||||
generated_files = await files.generate_files()
|
|
||||||
|
|
||||||
if generated_files:
|
|
||||||
print("以下文件不存在,已自动生成,请按需修改配置文件后重启:")
|
|
||||||
for file in generated_files:
|
|
||||||
print("-", file)
|
|
||||||
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
missing_deps = await deps.check_deps()
|
|
||||||
|
|
||||||
if missing_deps:
|
|
||||||
print("以下依赖包未安装,将自动安装,请完成后重启程序:")
|
|
||||||
for dep in missing_deps:
|
|
||||||
print("-", dep)
|
|
||||||
await deps.install_deps(missing_deps)
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
qcg_logger = await log.init_logging()
|
|
||||||
|
|
||||||
# 生成标识符
|
# 生成标识符
|
||||||
identifier.init()
|
identifier.init()
|
||||||
|
|
||||||
# ========== 加载配置文件 ==========
|
|
||||||
|
|
||||||
command_cfg = await config.load_json_config("data/config/command.json", "templates/command.json")
|
|
||||||
pipeline_cfg = await config.load_json_config("data/config/pipeline.json", "templates/pipeline.json")
|
|
||||||
platform_cfg = await config.load_json_config("data/config/platform.json", "templates/platform.json")
|
|
||||||
provider_cfg = await config.load_json_config("data/config/provider.json", "templates/provider.json")
|
|
||||||
system_cfg = await config.load_json_config("data/config/system.json", "templates/system.json")
|
|
||||||
|
|
||||||
# ========== 构建应用实例 ==========
|
|
||||||
ap = app.Application()
|
ap = app.Application()
|
||||||
ap.logger = qcg_logger
|
|
||||||
|
|
||||||
ap.command_cfg = command_cfg
|
for stage_name in stage_order:
|
||||||
ap.pipeline_cfg = pipeline_cfg
|
stage_cls = stage.preregistered_stages[stage_name]
|
||||||
ap.platform_cfg = platform_cfg
|
stage_inst = stage_cls()
|
||||||
ap.provider_cfg = provider_cfg
|
await stage_inst.run(ap)
|
||||||
ap.system_cfg = system_cfg
|
|
||||||
|
|
||||||
proxy_mgr = proxy.ProxyManager(ap)
|
|
||||||
await proxy_mgr.initialize()
|
|
||||||
ap.proxy_mgr = proxy_mgr
|
|
||||||
|
|
||||||
ver_mgr = version.VersionManager(ap)
|
|
||||||
await ver_mgr.initialize()
|
|
||||||
ap.ver_mgr = ver_mgr
|
|
||||||
|
|
||||||
center_v2_api = center_v2.V2CenterAPI(
|
|
||||||
ap,
|
|
||||||
basic_info={
|
|
||||||
"host_id": identifier.identifier["host_id"],
|
|
||||||
"instance_id": identifier.identifier["instance_id"],
|
|
||||||
"semantic_version": ver_mgr.get_current_version(),
|
|
||||||
"platform": sys.platform,
|
|
||||||
},
|
|
||||||
runtime_info={
|
|
||||||
"admin_id": "{}".format(system_cfg.data["admin-sessions"]),
|
|
||||||
"msg_source": str([
|
|
||||||
adapter_cfg['adapter'] if 'adapter' in adapter_cfg else 'unknown'
|
|
||||||
for adapter_cfg in platform_cfg.data['platform-adapters'] if adapter_cfg['enable']
|
|
||||||
]),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
ap.ctr_mgr = center_v2_api
|
|
||||||
|
|
||||||
# 发送公告
|
|
||||||
ann_mgr = announce.AnnouncementManager(ap)
|
|
||||||
await ann_mgr.show_announcements()
|
|
||||||
|
|
||||||
ap.query_pool = pool.QueryPool()
|
|
||||||
|
|
||||||
await ap.ver_mgr.show_version_update()
|
|
||||||
|
|
||||||
plugin_mgr_inst = plugin_mgr.PluginManager(ap)
|
|
||||||
await plugin_mgr_inst.initialize()
|
|
||||||
ap.plugin_mgr = plugin_mgr_inst
|
|
||||||
|
|
||||||
cmd_mgr_inst = cmdmgr.CommandManager(ap)
|
|
||||||
await cmd_mgr_inst.initialize()
|
|
||||||
ap.cmd_mgr = cmd_mgr_inst
|
|
||||||
|
|
||||||
llm_model_mgr_inst = llm_model_mgr.ModelManager(ap)
|
|
||||||
await llm_model_mgr_inst.initialize()
|
|
||||||
ap.model_mgr = llm_model_mgr_inst
|
|
||||||
|
|
||||||
llm_session_mgr_inst = llm_session_mgr.SessionManager(ap)
|
|
||||||
await llm_session_mgr_inst.initialize()
|
|
||||||
ap.sess_mgr = llm_session_mgr_inst
|
|
||||||
|
|
||||||
llm_prompt_mgr_inst = llm_prompt_mgr.PromptManager(ap)
|
|
||||||
await llm_prompt_mgr_inst.initialize()
|
|
||||||
ap.prompt_mgr = llm_prompt_mgr_inst
|
|
||||||
|
|
||||||
llm_tool_mgr_inst = llm_tool_mgr.ToolManager(ap)
|
|
||||||
await llm_tool_mgr_inst.initialize()
|
|
||||||
ap.tool_mgr = llm_tool_mgr_inst
|
|
||||||
|
|
||||||
im_mgr_inst = im_mgr.PlatformManager(ap=ap)
|
|
||||||
await im_mgr_inst.initialize()
|
|
||||||
ap.im_mgr = im_mgr_inst
|
|
||||||
|
|
||||||
stage_mgr = stagemgr.StageManager(ap)
|
|
||||||
await stage_mgr.initialize()
|
|
||||||
ap.stage_mgr = stage_mgr
|
|
||||||
|
|
||||||
ctrl = controller.Controller(ap)
|
|
||||||
ap.ctrl = ctrl
|
|
||||||
|
|
||||||
await ap.initialize()
|
await ap.initialize()
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ required_deps = {
|
|||||||
"openai": "openai",
|
"openai": "openai",
|
||||||
"colorlog": "colorlog",
|
"colorlog": "colorlog",
|
||||||
"mirai": "yiri-mirai-rc",
|
"mirai": "yiri-mirai-rc",
|
||||||
|
"aiocqhttp": "aiocqhttp",
|
||||||
|
"botpy": "qq-botpy",
|
||||||
"PIL": "pillow",
|
"PIL": "pillow",
|
||||||
"nakuru": "nakuru-project-idk",
|
"nakuru": "nakuru-project-idk",
|
||||||
"CallingGPT": "CallingGPT",
|
"CallingGPT": "CallingGPT",
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ log_colors_config = {
|
|||||||
|
|
||||||
|
|
||||||
async def init_logging() -> logging.Logger:
|
async def init_logging() -> logging.Logger:
|
||||||
|
# 删除所有现有的logger
|
||||||
|
for handler in logging.root.handlers[:]:
|
||||||
|
logging.root.removeHandler(handler)
|
||||||
|
|
||||||
level = logging.INFO
|
level = logging.INFO
|
||||||
|
|
||||||
if "DEBUG" in os.environ and os.environ["DEBUG"] in ["true", "1"]:
|
if "DEBUG" in os.environ and os.environ["DEBUG"] in ["true", "1"]:
|
||||||
@@ -46,7 +50,7 @@ async def init_logging() -> logging.Logger:
|
|||||||
|
|
||||||
qcg_logger.debug("日志初始化完成,日志级别:%s" % level)
|
qcg_logger.debug("日志初始化完成,日志级别:%s" % level)
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=logging.INFO, # 设置日志输出格式
|
level=logging.CRITICAL, # 设置日志输出格式
|
||||||
format="[DEPR][%(asctime)s.%(msecs)03d] %(pathname)s (%(lineno)d) - [%(levelname)s] :\n%(message)s",
|
format="[DEPR][%(asctime)s.%(msecs)03d] %(pathname)s (%(lineno)d) - [%(levelname)s] :\n%(message)s",
|
||||||
# 日志输出的格式
|
# 日志输出的格式
|
||||||
# -8表示占位符,让输出左对齐,输出长度都为8位
|
# -8表示占位符,让输出左对齐,输出长度都为8位
|
||||||
|
|||||||
30
pkg/core/stage.py
Normal file
30
pkg/core/stage.py
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import abc
|
||||||
|
import typing
|
||||||
|
|
||||||
|
from . import app
|
||||||
|
|
||||||
|
|
||||||
|
preregistered_stages: dict[str, typing.Type[BootingStage]] = {}
|
||||||
|
|
||||||
|
def stage_class(
|
||||||
|
name: str
|
||||||
|
):
|
||||||
|
def decorator(cls: typing.Type[BootingStage]) -> typing.Type[BootingStage]:
|
||||||
|
preregistered_stages[name] = cls
|
||||||
|
return cls
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
|
class BootingStage(abc.ABC):
|
||||||
|
"""启动阶段
|
||||||
|
"""
|
||||||
|
name: str = None
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
async def run(self, ap: app.Application):
|
||||||
|
"""启动
|
||||||
|
"""
|
||||||
|
pass
|
||||||
0
pkg/core/stages/__init__.py
Normal file
0
pkg/core/stages/__init__.py
Normal file
95
pkg/core/stages/build_app.py
Normal file
95
pkg/core/stages/build_app.py
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from .. import stage, app
|
||||||
|
from ...utils import version, proxy, announce
|
||||||
|
from ...audit.center import v2 as center_v2
|
||||||
|
from ...audit import identifier
|
||||||
|
from ...pipeline import pool, controller, stagemgr
|
||||||
|
from ...plugin import manager as plugin_mgr
|
||||||
|
from ...command import cmdmgr
|
||||||
|
from ...provider.session import sessionmgr as llm_session_mgr
|
||||||
|
from ...provider.requester import modelmgr as llm_model_mgr
|
||||||
|
from ...provider.sysprompt import sysprompt as llm_prompt_mgr
|
||||||
|
from ...provider.tools import toolmgr as llm_tool_mgr
|
||||||
|
from ...platform import manager as im_mgr
|
||||||
|
|
||||||
|
|
||||||
|
@stage.stage_class("BuildAppStage")
|
||||||
|
class BuildAppStage(stage.BootingStage):
|
||||||
|
"""构建应用阶段
|
||||||
|
"""
|
||||||
|
|
||||||
|
async def run(self, ap: app.Application):
|
||||||
|
"""启动
|
||||||
|
"""
|
||||||
|
|
||||||
|
proxy_mgr = proxy.ProxyManager(ap)
|
||||||
|
await proxy_mgr.initialize()
|
||||||
|
ap.proxy_mgr = proxy_mgr
|
||||||
|
|
||||||
|
ver_mgr = version.VersionManager(ap)
|
||||||
|
await ver_mgr.initialize()
|
||||||
|
ap.ver_mgr = ver_mgr
|
||||||
|
|
||||||
|
center_v2_api = center_v2.V2CenterAPI(
|
||||||
|
ap,
|
||||||
|
basic_info={
|
||||||
|
"host_id": identifier.identifier["host_id"],
|
||||||
|
"instance_id": identifier.identifier["instance_id"],
|
||||||
|
"semantic_version": ver_mgr.get_current_version(),
|
||||||
|
"platform": sys.platform,
|
||||||
|
},
|
||||||
|
runtime_info={
|
||||||
|
"admin_id": "{}".format(ap.system_cfg.data["admin-sessions"]),
|
||||||
|
"msg_source": str([
|
||||||
|
adapter_cfg['adapter'] if 'adapter' in adapter_cfg else 'unknown'
|
||||||
|
for adapter_cfg in ap.platform_cfg.data['platform-adapters'] if adapter_cfg['enable']
|
||||||
|
]),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
ap.ctr_mgr = center_v2_api
|
||||||
|
|
||||||
|
# 发送公告
|
||||||
|
ann_mgr = announce.AnnouncementManager(ap)
|
||||||
|
await ann_mgr.show_announcements()
|
||||||
|
|
||||||
|
ap.query_pool = pool.QueryPool()
|
||||||
|
|
||||||
|
await ap.ver_mgr.show_version_update()
|
||||||
|
|
||||||
|
plugin_mgr_inst = plugin_mgr.PluginManager(ap)
|
||||||
|
await plugin_mgr_inst.initialize()
|
||||||
|
ap.plugin_mgr = plugin_mgr_inst
|
||||||
|
|
||||||
|
cmd_mgr_inst = cmdmgr.CommandManager(ap)
|
||||||
|
await cmd_mgr_inst.initialize()
|
||||||
|
ap.cmd_mgr = cmd_mgr_inst
|
||||||
|
|
||||||
|
llm_model_mgr_inst = llm_model_mgr.ModelManager(ap)
|
||||||
|
await llm_model_mgr_inst.initialize()
|
||||||
|
ap.model_mgr = llm_model_mgr_inst
|
||||||
|
|
||||||
|
llm_session_mgr_inst = llm_session_mgr.SessionManager(ap)
|
||||||
|
await llm_session_mgr_inst.initialize()
|
||||||
|
ap.sess_mgr = llm_session_mgr_inst
|
||||||
|
|
||||||
|
llm_prompt_mgr_inst = llm_prompt_mgr.PromptManager(ap)
|
||||||
|
await llm_prompt_mgr_inst.initialize()
|
||||||
|
ap.prompt_mgr = llm_prompt_mgr_inst
|
||||||
|
|
||||||
|
llm_tool_mgr_inst = llm_tool_mgr.ToolManager(ap)
|
||||||
|
await llm_tool_mgr_inst.initialize()
|
||||||
|
ap.tool_mgr = llm_tool_mgr_inst
|
||||||
|
|
||||||
|
im_mgr_inst = im_mgr.PlatformManager(ap=ap)
|
||||||
|
await im_mgr_inst.initialize()
|
||||||
|
ap.im_mgr = im_mgr_inst
|
||||||
|
|
||||||
|
stage_mgr = stagemgr.StageManager(ap)
|
||||||
|
await stage_mgr.initialize()
|
||||||
|
ap.stage_mgr = stage_mgr
|
||||||
|
|
||||||
|
ctrl = controller.Controller(ap)
|
||||||
|
ap.ctrl = ctrl
|
||||||
19
pkg/core/stages/load_config.py
Normal file
19
pkg/core/stages/load_config.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from .. import stage, app
|
||||||
|
from ..bootutils import config
|
||||||
|
|
||||||
|
|
||||||
|
@stage.stage_class("LoadConfigStage")
|
||||||
|
class LoadConfigStage(stage.BootingStage):
|
||||||
|
"""加载配置文件阶段
|
||||||
|
"""
|
||||||
|
|
||||||
|
async def run(self, ap: app.Application):
|
||||||
|
"""启动
|
||||||
|
"""
|
||||||
|
ap.command_cfg = await config.load_json_config("data/config/command.json", "templates/command.json")
|
||||||
|
ap.pipeline_cfg = await config.load_json_config("data/config/pipeline.json", "templates/pipeline.json")
|
||||||
|
ap.platform_cfg = await config.load_json_config("data/config/platform.json", "templates/platform.json")
|
||||||
|
ap.provider_cfg = await config.load_json_config("data/config/provider.json", "templates/provider.json")
|
||||||
|
ap.system_cfg = await config.load_json_config("data/config/system.json", "templates/system.json")
|
||||||
15
pkg/core/stages/setup_logger.py
Normal file
15
pkg/core/stages/setup_logger.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from .. import stage, app
|
||||||
|
from ..bootutils import log
|
||||||
|
|
||||||
|
|
||||||
|
@stage.stage_class("SetupLoggerStage")
|
||||||
|
class SetupLoggerStage(stage.BootingStage):
|
||||||
|
"""设置日志器阶段
|
||||||
|
"""
|
||||||
|
|
||||||
|
async def run(self, ap: app.Application):
|
||||||
|
"""启动
|
||||||
|
"""
|
||||||
|
ap.logger = await log.init_logging()
|
||||||
@@ -4,8 +4,8 @@ import asyncio
|
|||||||
import typing
|
import typing
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
from . import app, entities
|
from ..core import app, entities
|
||||||
from ..pipeline import entities as pipeline_entities
|
from . import entities as pipeline_entities
|
||||||
from ..plugin import events
|
from ..plugin import events
|
||||||
|
|
||||||
|
|
||||||
@@ -4,7 +4,7 @@ import asyncio
|
|||||||
|
|
||||||
import mirai
|
import mirai
|
||||||
|
|
||||||
from . import entities
|
from ..core import entities
|
||||||
from ..platform import adapter as msadapter
|
from ..platform import adapter as msadapter
|
||||||
|
|
||||||
|
|
||||||
@@ -23,3 +23,12 @@ class MessageHandler(metaclass=abc.ABCMeta):
|
|||||||
query: core_entities.Query,
|
query: core_entities.Query,
|
||||||
) -> entities.StageProcessResult:
|
) -> entities.StageProcessResult:
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def cut_str(self, s: str) -> str:
|
||||||
|
"""
|
||||||
|
取字符串第一行,最多20个字符,若有多行,或超过20个字符,则加省略号
|
||||||
|
"""
|
||||||
|
s0 = s.split('\n')[0]
|
||||||
|
if len(s0) > 20 or '\n' in s:
|
||||||
|
s0 = s0[:20] + '...'
|
||||||
|
return s0
|
||||||
|
|||||||
@@ -78,6 +78,8 @@ class ChatMessageHandler(handler.MessageHandler):
|
|||||||
async for result in query.use_model.requester.request(query):
|
async for result in query.use_model.requester.request(query):
|
||||||
query.resp_messages.append(result)
|
query.resp_messages.append(result)
|
||||||
|
|
||||||
|
self.ap.logger.info(f'对话({query.query_id})响应: {self.cut_str(result.readable_str())}')
|
||||||
|
|
||||||
if result.content is not None:
|
if result.content is not None:
|
||||||
text_length += len(result.content)
|
text_length += len(result.content)
|
||||||
|
|
||||||
@@ -86,6 +88,9 @@ class ChatMessageHandler(handler.MessageHandler):
|
|||||||
new_query=query
|
new_query=query
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
||||||
|
self.ap.logger.error(f'对话({query.query_id})请求失败: {str(e)}')
|
||||||
|
|
||||||
yield entities.StageProcessResult(
|
yield entities.StageProcessResult(
|
||||||
result_type=entities.ResultType.INTERRUPT,
|
result_type=entities.ResultType.INTERRUPT,
|
||||||
new_query=query,
|
new_query=query,
|
||||||
|
|||||||
@@ -91,6 +91,8 @@ class CommandHandler(handler.MessageHandler):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.ap.logger.info(f'命令({query.query_id})报错: {self.cut_str(str(ret.error))}')
|
||||||
|
|
||||||
yield entities.StageProcessResult(
|
yield entities.StageProcessResult(
|
||||||
result_type=entities.ResultType.CONTINUE,
|
result_type=entities.ResultType.CONTINUE,
|
||||||
new_query=query
|
new_query=query
|
||||||
@@ -106,6 +108,8 @@ class CommandHandler(handler.MessageHandler):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.ap.logger.info(f'命令返回: {self.cut_str(ret.text)}')
|
||||||
|
|
||||||
yield entities.StageProcessResult(
|
yield entities.StageProcessResult(
|
||||||
result_type=entities.ResultType.CONTINUE,
|
result_type=entities.ResultType.CONTINUE,
|
||||||
new_query=query
|
new_query=query
|
||||||
|
|||||||
@@ -34,7 +34,12 @@ class Processor(stage.PipelineStage):
|
|||||||
|
|
||||||
self.ap.logger.info(f"处理 {query.launcher_type.value}_{query.launcher_id} 的请求({query.query_id}): {message_text}")
|
self.ap.logger.info(f"处理 {query.launcher_type.value}_{query.launcher_id} 的请求({query.query_id}): {message_text}")
|
||||||
|
|
||||||
if message_text.startswith('!') or message_text.startswith('!'):
|
async def generator():
|
||||||
return self.cmd_handler.handle(query)
|
if message_text.startswith('!') or message_text.startswith('!'):
|
||||||
else:
|
async for result in self.cmd_handler.handle(query):
|
||||||
return self.chat_handler.handle(query)
|
yield result
|
||||||
|
else:
|
||||||
|
async for result in self.chat_handler.handle(query):
|
||||||
|
yield result
|
||||||
|
|
||||||
|
return generator()
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ class AiocqhttpEventConverter(adapter.EventConverter):
|
|||||||
name=event.sender["nickname"],
|
name=event.sender["nickname"],
|
||||||
permission=mirai.models.entities.Permission.Member,
|
permission=mirai.models.entities.Permission.Member,
|
||||||
),
|
),
|
||||||
special_title=event.sender["title"],
|
special_title=event.sender["title"] if "title" in event.sender else "",
|
||||||
join_timestamp=0,
|
join_timestamp=0,
|
||||||
last_speak_timestamp=0,
|
last_speak_timestamp=0,
|
||||||
mute_time_remaining=0,
|
mute_time_remaining=0,
|
||||||
|
|||||||
@@ -31,3 +31,13 @@ class Message(pydantic.BaseModel):
|
|||||||
tool_calls: typing.Optional[list[ToolCall]] = None
|
tool_calls: typing.Optional[list[ToolCall]] = None
|
||||||
|
|
||||||
tool_call_id: typing.Optional[str] = None
|
tool_call_id: typing.Optional[str] = None
|
||||||
|
|
||||||
|
def readable_str(self) -> str:
|
||||||
|
if self.content is not None:
|
||||||
|
return self.content
|
||||||
|
elif self.function_call is not None:
|
||||||
|
return f'{self.function_call.name}({self.function_call.arguments})'
|
||||||
|
elif self.tool_calls is not None:
|
||||||
|
return f'调用工具: {self.tool_calls[0].id}'
|
||||||
|
else:
|
||||||
|
return '未知消息'
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -4,13 +4,12 @@ colorlog~=6.6.0
|
|||||||
yiri-mirai-rc
|
yiri-mirai-rc
|
||||||
aiocqhttp
|
aiocqhttp
|
||||||
qq-botpy
|
qq-botpy
|
||||||
websockets
|
|
||||||
urllib3
|
|
||||||
Pillow
|
|
||||||
nakuru-project-idk
|
nakuru-project-idk
|
||||||
|
Pillow
|
||||||
CallingGPT
|
CallingGPT
|
||||||
tiktoken
|
tiktoken
|
||||||
PyYaml
|
PyYaml
|
||||||
aiohttp
|
aiohttp
|
||||||
pydantic
|
pydantic
|
||||||
aioconsole
|
websockets
|
||||||
|
urllib3
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
{
|
{
|
||||||
"adapter": "aiocqhttp",
|
"adapter": "aiocqhttp",
|
||||||
"enable": false,
|
"enable": false,
|
||||||
"host": "127.0.0.1",
|
"host": "0.0.0.0",
|
||||||
"port": 8080
|
"port": 8080
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user