Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -2,32 +2,29 @@ import gradio as gr
|
|
| 2 |
import requests
|
| 3 |
import os
|
| 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>
|
| 18 |
-
<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 |
-
本系统生成的内容由人工智能根据现有库文件分析得出,不构成正式的法律或税务建议。
|
| 23 |
</p>
|
| 24 |
</div>
|
| 25 |
"""
|
| 26 |
|
| 27 |
# --- API 调用逻辑 ---
|
| 28 |
-
def ask_ai(
|
| 29 |
if not OPENROUTER_API_KEY:
|
| 30 |
-
return "错误:未检测到
|
| 31 |
|
| 32 |
url = "https://openrouter.ai/api/v1/chat/completions"
|
| 33 |
headers = {
|
|
@@ -37,36 +34,35 @@ def ask_ai(user_query):
|
|
| 37 |
|
| 38 |
payload = {
|
| 39 |
"model": MODEL_ID,
|
| 40 |
-
"messages": [
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
],
|
| 44 |
"temperature": 0.5
|
| 45 |
}
|
| 46 |
|
| 47 |
try:
|
| 48 |
-
response = requests.post(url, headers=headers, data=json.dumps(payload), timeout=
|
| 49 |
if response.status_code == 200:
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
else:
|
| 53 |
-
return f"API 访问异常 (Code {response.status_code}): {response.text}"
|
| 54 |
except Exception as e:
|
| 55 |
-
return f"
|
| 56 |
|
| 57 |
-
# --- 构建
|
| 58 |
-
|
| 59 |
-
|
|
|
|
| 60 |
gr.HTML(INFO_HTML)
|
| 61 |
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
|
|
|
|
|
|
|
|
|
| 68 |
|
| 69 |
-
# --- 启动应用 ---
|
| 70 |
if __name__ == "__main__":
|
| 71 |
-
# 确保 demo.launch() 缩进正确
|
| 72 |
demo.launch()
|
|
|
|
| 2 |
import requests
|
| 3 |
import os
|
| 4 |
import json
|
|
|
|
|
|
|
| 5 |
|
| 6 |
# --- 核心配置 ---
|
| 7 |
OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY")
|
|
|
|
| 8 |
MODEL_ID = "google/gemini-2.0-flash-001"
|
| 9 |
|
| 10 |
# --- 核心声明 HTML ---
|
| 11 |
INFO_HTML = """
|
| 12 |
<div style="text-align: left; border-left: 4px solid #2196F3; padding-left: 15px; margin-bottom: 20px;">
|
| 13 |
<h3>MG TaxAI | 跨境财税合规实验室 (Beta)</h3>
|
| 14 |
+
<p>本系统依托 <b>MG 核心智库</b> 构建,旨在实现解析结果实时溯源至各国官方税收协定与法律文本。目前系统正处于<b>知识库全量装载阶段</b>。</p>
|
| 15 |
+
<p>受限于测试版的数据填充进度,相关解析结果仅供专业参考。MG团队正加速完善每一条咨询建议的合规证据链,以确保交付专家级的数字化合规支持。</p>
|
| 16 |
<hr style="border: 0; border-top: 1px solid #eee; margin: 10px 0;">
|
| 17 |
<p style="font-size: 0.85em; color: #666;">
|
| 18 |
<b>⚠️ AI 免责声明:</b><br>
|
| 19 |
+
本系统生成的内容由人工智能根据现有库文件分析得出,不构成正式的法律或税务建议。
|
| 20 |
</p>
|
| 21 |
</div>
|
| 22 |
"""
|
| 23 |
|
| 24 |
# --- API 调用逻辑 ---
|
| 25 |
+
def ask_ai(message, history):
|
| 26 |
if not OPENROUTER_API_KEY:
|
| 27 |
+
return "错误:未检测到 API Key。"
|
| 28 |
|
| 29 |
url = "https://openrouter.ai/api/v1/chat/completions"
|
| 30 |
headers = {
|
|
|
|
| 34 |
|
| 35 |
payload = {
|
| 36 |
"model": MODEL_ID,
|
| 37 |
+
"messages": [{"role": "system", "content": "你是一个专业的国际税务专家。"}] +
|
| 38 |
+
[{"role": "user" if i%2==0 else "assistant", "content": h[0] if i%2==0 else h[1]} for i, h in enumerate(history)] +
|
| 39 |
+
[{"role": "user", "content": message}],
|
|
|
|
| 40 |
"temperature": 0.5
|
| 41 |
}
|
| 42 |
|
| 43 |
try:
|
| 44 |
+
response = requests.post(url, headers=headers, data=json.dumps(payload), timeout=60)
|
| 45 |
if response.status_code == 200:
|
| 46 |
+
return response.json()['choices'][0]['message']['content']
|
| 47 |
+
return f"接口异常: {response.status_code}"
|
|
|
|
|
|
|
| 48 |
except Exception as e:
|
| 49 |
+
return f"连接失败: {str(e)}"
|
| 50 |
|
| 51 |
+
# --- 构建界面 ---
|
| 52 |
+
# 使用 fill_height=True 让容器占满浏览器高度
|
| 53 |
+
with gr.Blocks(title="MG Consulting TaxAI", fill_height=True) as demo:
|
| 54 |
+
|
| 55 |
gr.HTML(INFO_HTML)
|
| 56 |
|
| 57 |
+
# 这里的 ChatInterface 设置 fill_height=True
|
| 58 |
+
# 它会自动根据屏幕大小调整高度,不再是短短的一截
|
| 59 |
+
chat_interface = gr.ChatInterface(
|
| 60 |
+
fn=ask_ai,
|
| 61 |
+
fill_height=True,
|
| 62 |
+
retry_btn="🔄 重试",
|
| 63 |
+
undo_btn="↩️ 撤回",
|
| 64 |
+
clear_btn="🗑️ 清除记录",
|
| 65 |
+
)
|
| 66 |
|
|
|
|
| 67 |
if __name__ == "__main__":
|
|
|
|
| 68 |
demo.launch()
|