diff --git a/llmops/app_factory.py b/llmops/app_factory.py index 9c207c3885220ade673ac3406fa85dfe8e907189..4c953ed071b5b1b986825ce7891fcb526aef7c7d 100644 --- a/llmops/app_factory.py +++ b/llmops/app_factory.py @@ -1,5 +1,11 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Thu Nov 7 15:01:23 2024 +0800 from flask import Flask from config.config import init_config +from llmops.router.log_analysis_router import log_analysis_router from utils.logger import setup_logger from router.task import task_blueprint @@ -19,6 +25,7 @@ def create_app() -> Flask: # 注册蓝图 app.register_blueprint(task_blueprint, url_prefix="/task") + app.register_blueprint(log_analysis_router) return app diff --git a/llmops/config/config.py b/llmops/config/config.py index 7b8e00c5677dd8ae7fc9a95cfc7ebd9aadc81d2b..20db29de89386830c5a434cd815d1416d5aa0f67 100644 --- a/llmops/config/config.py +++ b/llmops/config/config.py @@ -1,3 +1,8 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Thu Nov 7 15:01:23 2024 +0800 import os import yaml from dataclasses import dataclass @@ -9,16 +14,22 @@ class AppConf: port: str debug: bool +@dataclass +class LlmConf: + model: str + apikey: str + baseurl: str + current_model: str + class Config: - filename = "../llm-ops.yaml" + filename = "llm-ops.yaml" def __init__(self): self.app_conf: AppConf = None - + self.llm_conf: LlmConf = None def load_config(self): - current_dir = os.path.dirname(os.path.abspath(__file__)) - config_path = os.path.join(current_dir, self.filename) + config_path = os.path.join(os.path.dirname(__file__), Config.filename) try: with open(config_path, "r") as f: @@ -27,9 +38,10 @@ class Config: raise ValueError("Load llm-ops config file failed") from e self.app_conf = AppConf(**conf["app"]) - + self.llm_conf = LlmConf(**conf["llm"]) def init_config() -> Config: + """initialize llm-ops config""" conf = Config() conf.load_config() return conf diff --git a/llmops/controller/log_analysis_controller.py b/llmops/controller/log_analysis_controller.py new file mode 100644 index 0000000000000000000000000000000000000000..d27cbea5245d00a8bd546166c5fe43541dc3fe0e --- /dev/null +++ b/llmops/controller/log_analysis_controller.py @@ -0,0 +1,18 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: yzy_dev +# * Date: Thu Nov 28 15:00:41 2024 +0800 +from flask import jsonify + +from llmops.service.log_analysis_service import LogAnalysisService +from llmops.utils.response import success + + +class LogAnalysisController: + def __init__(self): + self.logAnalysis = LogAnalysisService() + + def log_analysis(self,user_input): + log_analysis = self.logAnalysis.loganalysis(user_input) + return success(log_analysis,"返回成功") \ No newline at end of file diff --git a/llmops/controller/task.py b/llmops/controller/task.py index 0f37724eba7b1a76eb90287047ea144c19cd9b0b..90ca54eb6a3c2be11339f06d87aacc50b9059203 100644 --- a/llmops/controller/task.py +++ b/llmops/controller/task.py @@ -1,3 +1,8 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Thu Nov 7 16:30:24 2024 +0800 from flask import request from utils.response import success, fail, not_found from service.task import create_new_task, get_task_status, confirm_task_option diff --git a/llmops/llm_tools/log_analysis/agentfactory.py b/llmops/llm_tools/log_analysis/agentfactory.py new file mode 100644 index 0000000000000000000000000000000000000000..460f8a7a6161943cc8f6b5f3b42d0fb541ae2b7a --- /dev/null +++ b/llmops/llm_tools/log_analysis/agentfactory.py @@ -0,0 +1,20 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: yzy_dev +# * Date: Thu Nov 28 15:00:41 2024 +0800 +import Agently + +from llmops.config.config import Config + + +def agentfactory(config: Config): + agent_factory = ( + Agently.AgentFactory() + .set_settings("current_model", config.llm_conf.current_model) + # .set_settings("model.OAIClient.auth.api_key", config.llm_conf.apikey) + .set_settings("model.OAIClient.options.model", config.llm_conf.model) + .set_settings("model.OAIClient.url", config.llm_conf.baseurl) + ) + return agent_factory + diff --git a/llmops/llm_tools/log_analysis/la_test.py b/llmops/llm_tools/log_analysis/la_test.py index 6e85df853b5b157fb34b1ea4597a0488f5932d11..8bfc2e7183eb849e5207013e97fb16e2a9281b5c 100644 --- a/llmops/llm_tools/log_analysis/la_test.py +++ b/llmops/llm_tools/log_analysis/la_test.py @@ -1 +1,6 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Fri Nov 8 11:39:53 2024 +0800 # 日志分析 diff --git a/llmops/llm_tools/log_analysis/log_analysis_workflow.py b/llmops/llm_tools/log_analysis/log_analysis_workflow.py new file mode 100644 index 0000000000000000000000000000000000000000..43402886e4c0a48172395c69e15d472863af1b0f --- /dev/null +++ b/llmops/llm_tools/log_analysis/log_analysis_workflow.py @@ -0,0 +1,93 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: yzy_dev +# * Date: Thu Nov 28 15:00:41 2024 +0800 +# 日志分析 +import os + +import Agently + +from llmops.config.config import init_config +from llmops.llm_tools.log_analysis.agentfactory import agentfactory + + +def logworkflow(user_input): + conf = init_config() # 初始化配置 + factory = agentfactory(conf) # 初始化agentfactory工厂类 + agent = factory.create_agent(); # 初始化agent + main_workflow = Agently.Workflow() + + # @main_workflow.chunk("user_input") + # def user_input(inputs, storage): + # storage.set( + # "user_input", + # # input("[请输入你的问题]: ") + # user_input + # ) + + # 返回shell脚本 + @main_workflow.chunk("assistant_reply") + def assistant_shell_reply(inputs, storage): + print("分析中.....") + # assistant_reason_reply = ( + # agent + # .info("回答尽量精简") + # .user_info("用户是服务器运维人员,操作系统是macOs") + # .input({ + # "user_input": storage.get("user_input"), + # }) + # .instruct([ + # "replay中输出语言为中文", + # f"请根据:{user_input}找出日志的问题", + # "用简洁的方式说明问题" + # "操作系统是maoOs" + # ]) + # .output({ + # "replay": ("str", "对{user_input}进行解释"), + # "improvement": ([("str", "根据用户输入{input}输出相应脚本处理用户的要求"), "找出改进方案"]) + # }) + # .start_async() + # ) + # storage.set("replay", assistant_reason_reply.get("replay")) + # print("*" * 50) + # print("一.大模型分析:") + # print(assistant_reason_reply.get("replay")) + # print("*" * 50) + # print("二.生成的脚本内容:") + # storage.set("shell", assistant_reason_reply.get("improvement")) + # print(assistant_reason_reply.get("improvement")) + # print("*" * 50) + # return assistant_reason_reply.get("improvement") + assistant_reason_reply = ( + agent + .input(user_input) + .info("用中文对系统日志进行解释,结果用字典形式例如:{reason:'解释'}") + .instruct("目标语言:中文") + .output({ + "info_list": [ + { + "知识对象": ("str", "回答{input}问题时,需要了解相关知识的具体对象"), + "关键知识点": ("str", "回答{input}问题时,需要了解的关键知识") + } + ], + "analyse": ("str", "根据{info_list}出现的问题进行解释和分析"), + "reasons": [("str", "{info_list}根据找出报错的原因并按列表格式输出,添加编号")] + }) + .start() + ) + return assistant_reason_reply + + ( + main_workflow + # .connect_to("user_input") + .connect_to("assistant_reply") + .connect_to("END") + ) + print(main_workflow.draw()) + result = main_workflow.start() + return result + + +# r = logworkflow("Can not connect to MySQL server. Too many connections -mysql 1040错误") +# print(r['default']) diff --git a/llmops/llm_tools/nlp/nlp_test.py b/llmops/llm_tools/nlp/nlp_test.py index 9dd4dd94052a2638c29892334c24026377489184..4e6d5e9d52b7ff85a537a5db52c608f5a463b0e9 100644 --- a/llmops/llm_tools/nlp/nlp_test.py +++ b/llmops/llm_tools/nlp/nlp_test.py @@ -1 +1,6 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Fri Nov 8 11:39:53 2024 +0800 # 自然语言交互 diff --git a/llmops/llm_tools/rca/rca_test.py b/llmops/llm_tools/rca/rca_test.py index 327cce23e627384859e7ca0ead7d7e74344837e4..3da6803011cdd69aa67cf2d5fd2b07d80753376e 100644 --- a/llmops/llm_tools/rca/rca_test.py +++ b/llmops/llm_tools/rca/rca_test.py @@ -1 +1,6 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Fri Nov 8 11:39:53 2024 +0800 # 故障定位 diff --git a/llmops/main.py b/llmops/main.py index f2a0ca047ac629f4172edc8c8ae7699c93089763..6227462f80e122917891db2c1d255c7be4fdc85c 100644 --- a/llmops/main.py +++ b/llmops/main.py @@ -1,3 +1,8 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Thu Nov 7 15:01:23 2024 +0800 from app_factory import run_app if __name__ == "__main__": diff --git a/llmops/router/log_analysis_router.py b/llmops/router/log_analysis_router.py new file mode 100644 index 0000000000000000000000000000000000000000..ed7ffa5ca1efa9aa15bb7a60d4b6e59657356472 --- /dev/null +++ b/llmops/router/log_analysis_router.py @@ -0,0 +1,18 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: yzy_dev +# * Date: Thu Nov 28 15:00:41 2024 +0800 +from flask import Blueprint,request + +from llmops.controller.log_analysis_controller import LogAnalysisController + +log_analysis_router = Blueprint("log_analysis", __name__) +logAnalysisController = LogAnalysisController() + + +@log_analysis_router.route("/log_analysis", methods=["POST"]) +def log_analysis(): + user_input = request.get_json("user_input") + print(user_input) + return logAnalysisController.log_analysis(user_input) diff --git a/llmops/router/task.py b/llmops/router/task.py index 5aadea70329c0df01eca24aca29ba34f338478f0..8b47cff3e17be5f362e05ef990bc79685de13d44 100644 --- a/llmops/router/task.py +++ b/llmops/router/task.py @@ -1,3 +1,8 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Thu Nov 7 16:30:24 2024 +0800 from flask import Blueprint from controller.task import create_task, task_status, confirm_option diff --git a/llmops/service/log_analysis_service.py b/llmops/service/log_analysis_service.py new file mode 100644 index 0000000000000000000000000000000000000000..03aecccaa5e7eb7ee893ad6e7c2d24a14ffb03aa --- /dev/null +++ b/llmops/service/log_analysis_service.py @@ -0,0 +1,12 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: yzy_dev +# * Date: Thu Nov 28 15:00:41 2024 +0800 +from llm_tools.log_analysis import log_analysis_workflow + + +class LogAnalysisService: + def loganalysis(self, userinput: str): + result = log_analysis_workflow.logworkflow(userinput) + return result diff --git a/llmops/service/task.py b/llmops/service/task.py index cdcf63d58953647c98c299a1273eb0fac925d023..840c56c9353445f649786832705a52c94204f03b 100644 --- a/llmops/service/task.py +++ b/llmops/service/task.py @@ -1,3 +1,8 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Thu Nov 7 16:30:24 2024 +0800 import uuid import time from threading import Thread diff --git a/llmops/utils/command.py b/llmops/utils/command.py index 43d07e5680290af63a6eb0948be4fd7551a27f6a..eacdbdab7bc200df1e79415a147dbe05e344b5c4 100644 --- a/llmops/utils/command.py +++ b/llmops/utils/command.py @@ -1,3 +1,8 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Thu Nov 7 15:53:47 2024 +0800 import subprocess diff --git a/llmops/utils/logger.py b/llmops/utils/logger.py index a9a5fb72dc6cf6f3eb33a66b5986b186188e604e..c63861f3f0a491a6f64d41836ca9f87faa0c180d 100644 --- a/llmops/utils/logger.py +++ b/llmops/utils/logger.py @@ -1,3 +1,8 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Thu Nov 7 15:53:47 2024 +0800 import logging diff --git a/llmops/utils/response.py b/llmops/utils/response.py index 8daf6241caae934026094e07d045a34ad1b7623a..12ed02e66c28db516e4000da5663f8715dd608f3 100644 --- a/llmops/utils/response.py +++ b/llmops/utils/response.py @@ -1,3 +1,8 @@ +# * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. +# * PilotGo-plugins licensed under the Mulan Permissive Software License, Version 2. +# * See LICENSE file for more details. +# * Author: zhanghan2021 +# * Date: Thu Nov 7 15:53:47 2024 +0800 from flask import jsonify