From d0d36b11204d83601e58cdab8551491da937fb5f Mon Sep 17 00:00:00 2001 From: Doiiars Date: Wed, 5 Nov 2025 15:51:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0github=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../insight_engine_streamlit_app.py | 8 +- SingleEngineApp/media_engine_streamlit_app.py | 8 +- SingleEngineApp/query_engine_streamlit_app.py | 8 +- utils/github_issues.py | 80 +++++++++++++++++++ 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 utils/github_issues.py diff --git a/SingleEngineApp/insight_engine_streamlit_app.py b/SingleEngineApp/insight_engine_streamlit_app.py index 7f5dcef..ed02c86 100644 --- a/SingleEngineApp/insight_engine_streamlit_app.py +++ b/SingleEngineApp/insight_engine_streamlit_app.py @@ -29,6 +29,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from InsightEngine import DeepSearchAgent, Settings from config import settings +from utils.github_issues import error_with_issue_link def main(): @@ -183,7 +184,12 @@ def execute_research(query: str, config: Settings): except Exception as e: import traceback error_traceback = traceback.format_exc() - st.error(f"研究过程中发生错误: {str(e)} \n错误堆栈: {error_traceback}") + error_display = error_with_issue_link( + f"研究过程中发生错误: {str(e)}", + error_traceback, + app_name="Insight Engine Streamlit App" + ) + st.error(error_display) logger.exception(f"研究过程中发生错误: {str(e)}") diff --git a/SingleEngineApp/media_engine_streamlit_app.py b/SingleEngineApp/media_engine_streamlit_app.py index 8925dcf..eaa5e64 100644 --- a/SingleEngineApp/media_engine_streamlit_app.py +++ b/SingleEngineApp/media_engine_streamlit_app.py @@ -29,6 +29,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from MediaEngine import DeepSearchAgent, Settings from config import settings +from utils.github_issues import error_with_issue_link def main(): @@ -180,7 +181,12 @@ def execute_research(query: str, config: Settings): except Exception as e: import traceback error_traceback = traceback.format_exc() - st.error(f"研究过程中发生错误: {str(e)} \n错误堆栈: {error_traceback}") + error_display = error_with_issue_link( + f"研究过程中发生错误: {str(e)}", + error_traceback, + app_name="Media Engine Streamlit App" + ) + st.error(error_display) logger.exception(f"研究过程中发生错误: {str(e)}") diff --git a/SingleEngineApp/query_engine_streamlit_app.py b/SingleEngineApp/query_engine_streamlit_app.py index 47155cb..1af77f2 100644 --- a/SingleEngineApp/query_engine_streamlit_app.py +++ b/SingleEngineApp/query_engine_streamlit_app.py @@ -29,6 +29,7 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from QueryEngine import DeepSearchAgent, Settings from config import settings +from utils.github_issues import error_with_issue_link def main(): @@ -174,7 +175,12 @@ def execute_research(query: str, config: Settings): except Exception as e: import traceback error_traceback = traceback.format_exc() - st.error(f"研究过程中发生错误: {str(e)} \n错误堆栈: {error_traceback}") + error_display = error_with_issue_link( + f"研究过程中发生错误: {str(e)}", + error_traceback, + app_name="Query Engine Streamlit App" + ) + st.error(error_display) logger.exception(f"研究过程中发生错误: {str(e)}") diff --git a/utils/github_issues.py b/utils/github_issues.py new file mode 100644 index 0000000..57e10b1 --- /dev/null +++ b/utils/github_issues.py @@ -0,0 +1,80 @@ +""" +GitHub Issues 工具模块 + +提供创建 GitHub Issues URL 和显示带链接的错误信息的功能 +数据模型定义位置: +- 无数据模型 +""" + +from datetime import datetime +from urllib.parse import quote + +# GitHub 仓库信息 +GITHUB_REPO = "666ghj/BettaFish" +GITHUB_ISSUES_URL = f"https://github.com/{GITHUB_REPO}/issues/new" + + +def create_issue_url(title: str, body: str = "") -> str: + """ + 创建 GitHub Issues URL,预填充标题和内容 + + Args: + title: Issue 标题 + body: Issue 内容(可选) + + Returns: + 完整的 GitHub Issues URL + """ + encoded_title = quote(title) + encoded_body = quote(body) if body else "" + + if encoded_body: + return f"{GITHUB_ISSUES_URL}?title={encoded_title}&body={encoded_body}" + else: + return f"{GITHUB_ISSUES_URL}?title={encoded_title}" + + +def error_with_issue_link( + error_message: str, + error_details: str = "", + app_name: str = "Streamlit App" +) -> str: + """ + 生成带 GitHub Issues 链接的错误信息字符串 + + 仅在通用异常处理中使用,不用于用户配置错误 + + Args: + error_message: 错误消息 + error_details: 错误详情(可选,用于填充到 Issue body) + app_name: 应用名称,用于标识错误来源 + + Returns: + 包含错误信息和 GitHub Issues 链接的 Markdown 格式字符串 + """ + issue_title = f"[{app_name}] {error_message[:50]}" + issue_body = f"## 错误信息\n\n{error_message}\n\n" + + if error_details: + issue_body += f"## 错误详情\n\n```\n{error_details}\n```\n\n" + + issue_body += f"## 环境信息\n\n- 应用: {app_name}\n- 时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" + + issue_url = create_issue_url(issue_title, issue_body) + + # 使用 markdown 格式添加超链接 + error_display = f"{error_message}\n\n[📝 提交错误报告]({issue_url})" + + if error_details: + error_display = f"{error_message}\n\n```\n{error_details}\n```\n\n[📝 提交错误报告]({issue_url})" + + return error_display + + +__all__ = [ + "create_issue_url", + "error_with_issue_link", + "GITHUB_REPO", + "GITHUB_ISSUES_URL", +] +