Spaces:
Sleeping
Sleeping
import gradio as gr # 导入gradio库用于创建GUI | |
from config import Config # 导入配置管理模块 | |
from github_client import GitHubClient # 导入用于GitHub API操作的客户端 | |
from hacker_news_client import HackerNewsClient | |
from report_generator import ReportGenerator # 导入报告生成器模块 | |
from llm import LLM # 导入可能用于处理语言模型的LLM类 | |
from subscription_manager import SubscriptionManager # 导入订阅管理器 | |
from logger import LOG # 导入日志记录器 | |
# 创建各个组件的实例 | |
config = Config() | |
github_client = GitHubClient(config.github_token) | |
hacker_news_client = HackerNewsClient() # 创建 Hacker News 客户端实例 | |
subscription_manager = SubscriptionManager(config.subscriptions_file) | |
def generate_github_report(model_type, model_name, repo, days): | |
config.llm_model_type = model_type | |
if model_type == "openai": | |
config.openai_model_name = model_name | |
else: | |
config.ollama_model_name = model_name | |
llm = LLM(config) # 创建语言模型实例 | |
report_generator = ReportGenerator(llm, config.report_types) # 创建报告生成器实例 | |
# 定义一个函数,用于导出和生成指定时间范围内项目的进展报告 | |
raw_file_path = github_client.export_progress_by_date_range(repo, days) # 导出原始数据文件路径 | |
report, report_file_path = report_generator.generate_github_report(raw_file_path) # 生成并获取报告内容及文件路径 | |
return report, report_file_path # 返回报告内容和报告文件路径 | |
def generate_hn_hour_topic(model_type, model_name): | |
config.llm_model_type = model_type | |
if model_type == "openai": | |
config.openai_model_name = model_name | |
else: | |
config.ollama_model_name = model_name | |
llm = LLM(config) # 创建语言模型实例 | |
report_generator = ReportGenerator(llm, config.report_types) # 创建报告生成器实例 | |
markdown_file_path = hacker_news_client.export_top_stories() | |
report, report_file_path = report_generator.generate_hn_topic_report(markdown_file_path) | |
return report, report_file_path # 返回报告内容和报告文件路径 | |
# 定义一个回调函数,用于根据 Radio 组件的选择返回不同的 Dropdown 选项 | |
def update_model_list(model_type): | |
if model_type == "openai": | |
return gr.Dropdown(choices=["gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo"], label="选择模型") | |
elif model_type == "ollama": | |
return gr.Dropdown(choices=["llama3.1", "gemma2:2b", "qwen2:7b"], label="选择模型") | |
# 创建 Gradio 界面 | |
with gr.Blocks(title="GitHubSentinel") as demo: | |
# 创建 GitHub 项目进展 Tab | |
with gr.Tab("GitHub 项目进展"): | |
gr.Markdown("## GitHub 项目进展") # 添加小标题 | |
# 创建 Radio 组件 | |
model_type = gr.Radio(["openai", "ollama"], label="模型类型", info="使用 OpenAI GPT API 或 Ollama 私有化模型服务") | |
# 创建 Dropdown 组件 | |
model_name = gr.Dropdown(choices=["gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo"], label="选择模型") | |
# 创建订阅列表的 Dropdown 组件 | |
subscription_list = gr.Dropdown(subscription_manager.list_subscriptions(), label="订阅列表", info="已订阅GitHub项目") | |
# 创建 Slider 组件 | |
days = gr.Slider(value=2, minimum=1, maximum=7, step=1, label="报告周期", info="生成项目过去一段时间进展,单位:天") | |
# 使用 radio 组件的值来更新 dropdown 组件的选项 | |
model_type.change(fn=update_model_list, inputs=model_type, outputs=model_name) | |
# 创建按钮来生成报告 | |
button = gr.Button("生成报告") | |
# 设置输出组件 | |
markdown_output = gr.Markdown() | |
file_output = gr.File(label="下载报告") | |
# 将按钮点击事件与导出函数绑定 | |
button.click(generate_github_report, inputs=[model_type, model_name, subscription_list, days], outputs=[markdown_output, file_output]) | |
# 创建 Hacker News 热点话题 Tab | |
with gr.Tab("Hacker News 热点话题"): | |
gr.Markdown("## Hacker News 热点话题") # 添加小标题 | |
# 创建 Radio 组件 | |
model_type = gr.Radio(["openai", "ollama"], label="模型类型", info="使用 OpenAI GPT API 或 Ollama 私有化模型服务") | |
# 创建 Dropdown 组件 | |
model_name = gr.Dropdown(choices=["gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo"], label="选择模型") | |
# 使用 radio 组件的值来更新 dropdown 组件的选项 | |
model_type.change(fn=update_model_list, inputs=model_type, outputs=model_name) | |
# 创建按钮来生成报告 | |
button = gr.Button("生成最新热点话题") | |
# 设置输出组件 | |
markdown_output = gr.Markdown() | |
file_output = gr.File(label="下载报告") | |
# 将按钮点击事件与导出函数绑定 | |
button.click(generate_hn_hour_topic, inputs=[model_type, model_name,], outputs=[markdown_output, file_output]) | |
if __name__ == "__main__": | |
demo.launch(share=True, server_name="0.0.0.0") # 启动界面并设置为公共可访问 | |
# 可选带有用户认证的启动方式 | |
# demo.launch(share=True, server_name="0.0.0.0", auth=("django", "1234")) |