Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -236,7 +236,7 @@ custom_css = """
|
|
| 236 |
background-color: #1e1e1e !important;
|
| 237 |
color: #4AF626 !important;
|
| 238 |
}
|
| 239 |
-
/*
|
| 240 |
.status-text textarea {
|
| 241 |
background-color: transparent !important;
|
| 242 |
border: none !important;
|
|
@@ -249,84 +249,82 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="indigo"), css=custom_css) as de
|
|
| 249 |
gr.Markdown("# 📑 PaperX / Mineru 智能解析平台")
|
| 250 |
gr.Markdown("将学术 PDF 一键解析、DAG 结构化并生成多模态产物。")
|
| 251 |
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
with gr.
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
refresh_btn = gr.Button("🔄 刷新目录树")
|
| 323 |
-
debug_view = gr.Textbox(label="Workspace Files", lines=20, interactive=False, value=get_debug_info())
|
| 324 |
|
| 325 |
# ================= 逻辑绑定 =================
|
| 326 |
|
| 327 |
key_btn.click(fn=save_api_settings, inputs=[key_input, api_base_url_input], outputs=[parse_status, debug_view])
|
| 328 |
|
| 329 |
-
#
|
| 330 |
pdf_input.upload(fn=save_pdf, inputs=pdf_input, outputs=[parse_status, debug_view])
|
| 331 |
pdf_input.clear(fn=lambda: ("ℹ️ 已清空文件", get_debug_info()), outputs=[parse_status, debug_view])
|
| 332 |
|
|
@@ -335,7 +333,7 @@ with gr.Blocks(theme=gr.themes.Soft(primary_hue="indigo"), css=custom_css) as de
|
|
| 335 |
outputs=[parse_status, debug_view, cmd_logs]
|
| 336 |
)
|
| 337 |
|
| 338 |
-
#
|
| 339 |
def trigger_gen(task):
|
| 340 |
status, debug, logs, file_path = run_final_generation(task)
|
| 341 |
# 如果 file_path 存在,显示下载组件并赋值;否则保持隐藏
|
|
|
|
| 236 |
background-color: #1e1e1e !important;
|
| 237 |
color: #4AF626 !important;
|
| 238 |
}
|
| 239 |
+
/* 弱化状态框的边框感,使其更像文字标签 */
|
| 240 |
.status-text textarea {
|
| 241 |
background-color: transparent !important;
|
| 242 |
border: none !important;
|
|
|
|
| 249 |
gr.Markdown("# 📑 PaperX / Mineru 智能解析平台")
|
| 250 |
gr.Markdown("将学术 PDF 一键解析、DAG 结构化并生成多模态产物。")
|
| 251 |
|
| 252 |
+
# 1. 隐藏式全局配置
|
| 253 |
+
with gr.Accordion("⚙️ 1. 全局 API 配置", open=False):
|
| 254 |
+
with gr.Row():
|
| 255 |
+
key_input = gr.Textbox(label="API Key", type="password", placeholder="sk-...", scale=1)
|
| 256 |
+
api_base_url_input = gr.Textbox(label="Base URL (可选)", placeholder="https://api.example.com", scale=1)
|
| 257 |
+
key_btn = gr.Button("💾 保存 API 配置")
|
| 258 |
+
|
| 259 |
+
# 2. 核心上传与解析
|
| 260 |
+
with gr.Group():
|
| 261 |
+
gr.Markdown("### 📄 2. 文档解析")
|
| 262 |
+
# 拖拽自动上传
|
| 263 |
+
pdf_input = gr.File(label="拖拽或点击上传 PDF", file_types=[".pdf"])
|
| 264 |
+
|
| 265 |
+
# 解析按钮独占一行,成为视觉焦点
|
| 266 |
+
parse_btn = gr.Button("🚀 开始执行 Mineru & DAG 抽取", variant="primary", size="lg")
|
| 267 |
+
|
| 268 |
+
# 弱化状态框视觉
|
| 269 |
+
parse_status = gr.Textbox(
|
| 270 |
+
show_label=False,
|
| 271 |
+
placeholder="等待上传文档...",
|
| 272 |
+
lines=1,
|
| 273 |
+
interactive=False,
|
| 274 |
+
elem_classes="status-text"
|
| 275 |
+
)
|
| 276 |
+
|
| 277 |
+
# 3. 最终产物生成
|
| 278 |
+
with gr.Group():
|
| 279 |
+
gr.Markdown("### 🎯 3. 产物生成")
|
| 280 |
+
gr.Markdown("基于 DAG 结构生成最终所需格式:")
|
| 281 |
+
|
| 282 |
+
# 层次化布局:上面三个单项,下面一个全部
|
| 283 |
+
with gr.Row():
|
| 284 |
+
gen_ppt_btn = gr.Button("📊 单独生成 PPT")
|
| 285 |
+
gen_poster_btn = gr.Button("🖼️ 单独生成 Poster")
|
| 286 |
+
gen_pr_btn = gr.Button("📰 单独生成 PR 文章")
|
| 287 |
+
|
| 288 |
+
gen_all_btn = gr.Button("✨ 一键生成全部 (ALL)", variant="primary")
|
| 289 |
+
|
| 290 |
+
# 4. 生成结果与下载 (从 Tabs 中独立出来,紧跟工作流)
|
| 291 |
+
with gr.Group():
|
| 292 |
+
gr.Markdown("### 📦 4. 生成结果 & 下载")
|
| 293 |
+
gen_status = gr.Textbox(
|
| 294 |
+
show_label=False,
|
| 295 |
+
placeholder="当前暂无生成任务...",
|
| 296 |
+
lines=2,
|
| 297 |
+
interactive=False,
|
| 298 |
+
elem_classes="status-text"
|
| 299 |
+
)
|
| 300 |
+
# 默认隐藏下载框,生成成功后再动态展示
|
| 301 |
+
download_file = gr.File(label="📥 获取最终压缩包", interactive=False, visible=False)
|
| 302 |
+
|
| 303 |
+
gr.HTML("<hr style='margin-top: 30px; margin-bottom: 30px;' />") # 添加一条视觉分割线
|
| 304 |
+
|
| 305 |
+
# 5. 开发者监控区 (置于最底部,方便后续精简 UI 时直接删除这部分)
|
| 306 |
+
gr.Markdown("### 🛠️ 开发者后台监控 (仅供调试)")
|
| 307 |
+
with gr.Tabs():
|
| 308 |
+
# Tab 1: 实时终端
|
| 309 |
+
with gr.Tab("📜 终端流 (Terminal)"):
|
| 310 |
+
cmd_logs = gr.Textbox(
|
| 311 |
+
label="Stdout / Stderr",
|
| 312 |
+
placeholder="等待任务开始...",
|
| 313 |
+
lines=15,
|
| 314 |
+
interactive=False,
|
| 315 |
+
elem_classes="log-box"
|
| 316 |
+
)
|
| 317 |
+
|
| 318 |
+
# Tab 2: 文件系统快照
|
| 319 |
+
with gr.Tab("🔍 系统快照 (Debug)"):
|
| 320 |
+
refresh_btn = gr.Button("🔄 刷新目录树")
|
| 321 |
+
debug_view = gr.Textbox(label="Workspace Files", lines=15, interactive=False, value=get_debug_info())
|
|
|
|
|
|
|
| 322 |
|
| 323 |
# ================= 逻辑绑定 =================
|
| 324 |
|
| 325 |
key_btn.click(fn=save_api_settings, inputs=[key_input, api_base_url_input], outputs=[parse_status, debug_view])
|
| 326 |
|
| 327 |
+
# 绑定上传和清除事件,实现自动化
|
| 328 |
pdf_input.upload(fn=save_pdf, inputs=pdf_input, outputs=[parse_status, debug_view])
|
| 329 |
pdf_input.clear(fn=lambda: ("ℹ️ 已清空文件", get_debug_info()), outputs=[parse_status, debug_view])
|
| 330 |
|
|
|
|
| 333 |
outputs=[parse_status, debug_view, cmd_logs]
|
| 334 |
)
|
| 335 |
|
| 336 |
+
# 动态控制下载组件的显示与隐藏
|
| 337 |
def trigger_gen(task):
|
| 338 |
status, debug, logs, file_path = run_final_generation(task)
|
| 339 |
# 如果 file_path 存在,显示下载组件并赋值;否则保持隐藏
|