Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 17 additions & 20 deletions src/gradio_server.py
Original file line number Diff line number Diff line change
@@ -1,41 +1,38 @@
import gradio as gr # 导入gradio库用于创建GUI
import gradio as gr

from config import Config # 导入配置管理模块
from github_client import GitHubClient # 导入用于GitHub API操作的客户端
from report_generator import ReportGenerator # 导入报告生成器模块
from llm import LLM # 导入可能用于处理语言模型的LLM类
from subscription_manager import SubscriptionManager # 导入订阅管理器
from logger import LOG # 导入日志记录器
from config import Config
from github_client import GitHubClient
from report_generator import ReportGenerator
from llm import LLM
from subscription_manager import SubscriptionManager
from logger import LOG

# 创建各个组件的实例
config = Config()
github_client = GitHubClient(config.github_token)
llm = LLM()
report_generator = ReportGenerator(llm)
subscription_manager = SubscriptionManager(config.subscriptions_file)


def export_progress_by_date_range(repo, days):
# 定义一个函数,用于导出和生成指定时间范围内项目的进展报告
raw_file_path = github_client.export_progress_by_date_range(repo, days) # 导出原始数据文件路径
report, report_file_path = report_generator.generate_report_by_date_range(raw_file_path, days) # 生成并获取报告内容及文件路径
raw_file_path = github_client.export_progress_by_date_range(repo, days)
report, report_file_path = report_generator.generate_report_by_date_range(raw_file_path, days)

return report, report_file_path # 返回报告内容和报告文件路径
return report, report_file_path

# 创建Gradio界面
demo = gr.Interface(
fn=export_progress_by_date_range, # 指定界面调用的函数
title="GitHubSentinel", # 设置界面标题
fn=export_progress_by_date_range,
title="GitHubSentinel",
inputs=[
gr.Dropdown(
subscription_manager.list_subscriptions(), label="订阅列表", info="已订阅GitHub项目"
), # 下拉菜单选择订阅的GitHub项目
),
gr.Slider(value=2, minimum=1, maximum=7, step=1, label="报告周期", info="生成项目过去一段时间进展,单位:天"),
# 滑动条选择报告的时间范围

],
outputs=[gr.Markdown(), gr.File(label="下载报告")], # 输出格式:Markdown文本和文件下载
outputs=[gr.Markdown(), gr.File(label="下载报告")],
)

if __name__ == "__main__":
demo.launch(share=True, server_name="0.0.0.0") # 启动界面并设置为公共可访问
# 可选带有用户认证的启动方式
demo.launch(share=True, server_name="0.0.0.0")
# demo.launch(share=True, server_name="0.0.0.0", auth=("django", "1234"))
42 changes: 30 additions & 12 deletions src/llm.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
import os
import json
from openai import OpenAI # 导入OpenAI库用于访问GPT模型
import requests # 用于调用DeepSeek API
from logger import LOG # 导入日志模块


class LLM:
def __init__(self):
# 创建一个OpenAI客户端实例
self.client = OpenAI()
# 初始化DeepSeek API配置
self.api_key = os.getenv("DEEPSEEK_API_KEY", "sk-da4403c03da1440db45dc626a781747b") # 优先从环境变量获取API密钥
self.api_url = "https://api.deepseek.com/v1/chat/completions"
# 从TXT文件加载提示信息
with open("prompts/report_prompt.txt", "r", encoding='utf-8') as file:
with open("./../prompts/report_prompt.txt", "r", encoding='utf-8') as file:
self.system_prompt = file.read()
# 配置日志文件,当文件大小达到1MB时自动轮转,日志级别为DEBUG
LOG.add("logs/llm_logs.log", rotation="1 MB", level="DEBUG")
Expand All @@ -31,16 +33,32 @@ def generate_daily_report(self, markdown_content, dry_run=False):

# 日志记录开始生成报告
LOG.info("Starting report generation using GPT model.")

try:
# 调用OpenAI GPT模型生成报告
response = self.client.chat.completions.create(
model="gpt-4o-mini", # 指定使用的模型版本
messages=messages
)
LOG.debug("GPT response: {}", response)
# 调用DeepSeek API生成报告
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": "deepseek-chat",
"messages": messages
}
response = requests.post(self.api_url, headers=headers, json=payload)
response_data = response.json()
LOG.debug("GPT response: {}", response_data)

# 检查API响应是否包含错误
if response.status_code != 200 or 'error' in response_data:
error_msg = response_data.get('error', {}).get('message', 'Unknown API error')
LOG.error("API Error: {}", error_msg)
if 'Insufficient Balance' in error_msg:
raise Exception("DeepSeek API余额不足,请充值后再试。")
else:
raise Exception(f"API Error: {error_msg}")

# 返回模型生成的内容
return response.choices[0].message.content
return response_data['choices'][0]['message']['content']
except Exception as e:
# 如果在请求过程中出现异常,记录错误并抛出
LOG.error("An error occurred while generating the report: {}", e)
Expand Down