MGGroup commited on
Commit
5dcf751
·
verified ·
1 Parent(s): 402892d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -48
app.py CHANGED
@@ -4,84 +4,69 @@ import os
4
  import json
5
  import fitz # PyMuPDF
6
  import re
7
- from huggingface_hub import HfApi, hf_hub_download
8
 
9
  # --- 核心配置 ---
10
- # 建议在 Hugging Face 的 Settings -> Secrets 中设置这些变量
11
  OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY")
12
- HF_TOKEN = os.environ.get("HF_TOKEN")
13
-
14
- # 推荐使用 OpenRouter 的免费模型,稳定性比直连好
15
- # 备选: "deepseek/deepseek-chat:free" 或 "meta-llama/llama-3.3-70b-instruct:free"
16
  MODEL_ID = "google/gemini-2.0-flash-001"
17
 
18
- # --- PDF 处理逻辑 ---
19
- def extract_text_from_pdf(pdf_path):
20
- text = ""
21
- try:
22
- with fitz.open(pdf_path) as doc:
23
- for page in doc:
24
- text += page.get_text()
25
- except Exception as e:
26
- print(f"读取 PDF 出错: {e}")
27
- return text
 
 
 
28
 
29
- # --- OpenRouter API 调用逻辑 ---
30
- def ask_ai(user_query, context=""):
31
  if not OPENROUTER_API_KEY:
32
- return "错误:未配置 OPENROUTER_API_KEY请在环境变量中置。"
33
 
34
  url = "https://openrouter.ai/api/v1/chat/completions"
35
  headers = {
36
  "Authorization": f"Bearer {OPENROUTER_API_KEY}",
37
- "HTTP-Referer": "https://mgconsult.net", # 可选
38
- "X-Title": "TaxAI Assistant", # 可选
39
  "Content-Type": "application/json"
40
  }
41
 
42
- # 构造 Prompt,将 PDF 内容作为背景知识
43
- full_prompt = f"背景知识:\n{context}\n\n问题:\n{user_query}" if context else user_query
44
-
45
  payload = {
46
  "model": MODEL_ID,
47
  "messages": [
48
- {"role": "system", "content": "你是一个专业的国际税务与贸易合规专家基于提供背景知识回答问题。"},
49
- {"role": "user", "content": full_prompt}
50
  ],
51
- "temperature": 0.7
52
  }
53
 
54
  try:
55
- response = requests.post(url, headers=headers, data=json.dumps(payload), timeout=30)
56
  if response.status_code == 200:
57
  result = response.json()
58
  return result['choices'][0]['message']['content']
59
- elif response.status_code == 429:
60
- return "系统繁忙 (429):OpenRouter 的免费额度也暂时达到上限,请等待一分钟再试。"
61
  else:
62
- return f"API 报错: {response.status_code} - {response.text}"
63
  except Exception as e:
64
- return f"请求失败: {str(e)}"
65
-
66
- # --- Gradio 界面处理 ---
67
- def chat_handler(message, history):
68
- # 这里可以添加你之前的数据集检索逻辑 (RAG)
69
- # 目前演示直接调用 AI
70
- response = ask_ai(message)
71
- return response
72
 
73
  # --- 构建 Gradio UI ---
74
- with gr.Blocks(title="MG Consulting TaxAI") as demo:
75
- gr.Markdown("# 🌍 MG Consulting 国际税务 AI 助手")
76
- gr.Markdown("基于 OpenRouter 引擎,支持国际税收协定与投资指南查询。")
77
 
78
- chatbot = gr.ChatInterface(
79
- fn=chat_handler,
80
- examples=["美国个人所得税税率是多少?", "如何查询丹麦的税收协定?"],
81
- cache_examples=False,
82
- )
 
83
 
84
  # --- 启动应用 ---
85
  if __name__ == "__main__":
86
- # 这里的缩进非常重要,确保 demo.launch() 在 if 语句块内
87
  demo.launch()
 
4
  import json
5
  import fitz # PyMuPDF
6
  import re
 
7
 
8
  # --- 核心配置 ---
 
9
  OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY")
10
+ # 默认使用 Gemini 2.0 Flash (OpenRouter 托管),如遇繁忙可改为 "deepseek/deepseek-chat:free"
 
 
 
11
  MODEL_ID = "google/gemini-2.0-flash-001"
12
 
13
+ # --- 核心声明 HTML ---
14
+ INFO_HTML = """
15
+ <div style="text-align: left; border-left: 4px solid #2196F3; padding-left: 15px; margin-bottom: 20px;">
16
+ <h3>MG TaxAI | 跨境财税合规实验室 (Beta)</h3>
17
+ <p>本系统依托 <b>MG 核心智库</b> 构建,旨在实现解析结果实时溯源至各国官方税收协定与法律文本。目前系统正处于<b>知识库全量装载阶段</b>,已优先上线核心业务国家的官方协定库。</p>
18
+ <p>我们正持续同步全球各主要经济体的国别投资税收指南及多税种年度税收报告。受限于测试版的数据填充进度,相关解析结果仅供专业参考。MG团队正加速完善每一条咨询建议的合规证据链,以确保交付专家级的数字化合规支持。</p>
19
+ <hr style="border: 0; border-top: 1px solid #eee; margin: 10px 0;">
20
+ <p style="font-size: 0.85em; color: #666;">
21
+ <b>⚠️ AI 免责声明:</b><br>
22
+ 本系统生成的内容由人工智能根据现有库文件分析得出,不构成正式的法律或税务建议。在使用本系统结果进行任何商业决策前,请务必咨询 MG Consult 专业团队。
23
+ </p>
24
+ </div>
25
+ """
26
 
27
+ # --- API 调用逻辑 ---
28
+ def ask_ai(user_query):
29
  if not OPENROUTER_API_KEY:
30
+ return "错误:未检测到 OPENROUTER_API_KEY请在环境变量中置。"
31
 
32
  url = "https://openrouter.ai/api/v1/chat/completions"
33
  headers = {
34
  "Authorization": f"Bearer {OPENROUTER_API_KEY}",
 
 
35
  "Content-Type": "application/json"
36
  }
37
 
 
 
 
38
  payload = {
39
  "model": MODEL_ID,
40
  "messages": [
41
+ {"role": "system", "content": "你是一个专业的国际税务与贸易合规专家用专业、严谨中文回答。"},
42
+ {"role": "user", "content": user_query}
43
  ],
44
+ "temperature": 0.5
45
  }
46
 
47
  try:
48
+ response = requests.post(url, headers=headers, data=json.dumps(payload), timeout=40)
49
  if response.status_code == 200:
50
  result = response.json()
51
  return result['choices'][0]['message']['content']
 
 
52
  else:
53
+ return f"API 访问异常 (Code {response.status_code}): {response.text}"
54
  except Exception as e:
55
+ return f"系统连接失败: {str(e)}"
 
 
 
 
 
 
 
56
 
57
  # --- 构建 Gradio UI ---
58
+ with gr.Blocks(title="MG Consulting TaxAI", css="footer {visibility: hidden}") as demo:
59
+ # 嵌入你提供的 HTML 声明
60
+ gr.HTML(INFO_HTML)
61
 
62
+ with gr.Row():
63
+ with gr.Column():
64
+ chatbot = gr.ChatInterface(
65
+ fn=lambda message, history: ask_ai(message),
66
+ fill_height=True
67
+ )
68
 
69
  # --- 启动应用 ---
70
  if __name__ == "__main__":
71
+ # 确保 demo.launch() 缩进正确
72
  demo.launch()