Spaces:
Sleeping
Sleeping
File size: 4,232 Bytes
8826866 6320dd4 8826866 b3409ca 6320dd4 b3409ca 6320dd4 b3409ca e491433 b3409ca 6320dd4 b3409ca 6320dd4 b3409ca 6320dd4 35d4d27 6320dd4 b3409ca 6320dd4 db2e73c 6320dd4 b3409ca 6320dd4 8826866 6320dd4 8826866 d33a38e 8826866 6320dd4 8826866 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | import os
import gradio as gr
import spaces
import fitz
import docx
from huggingface_hub import InferenceClient
# 1. 引擎配置:DeepSeek-V3.2-Exp (685B 逻辑核弹)
model_id = "deepseek-ai/DeepSeek-V3.2-Exp"
hf_token = os.getenv("HF_TOKEN")
# 强制授权连接
client = InferenceClient(
model=model_id,
token=hf_token,
headers={"Authorization": f"Bearer {hf_token}"} if hf_token else None
)
def extract_text(file_path):
if not file_path: return ""
try:
ext = str(file_path).lower()
if ext.endswith(".pdf"):
doc = fitz.open(file_path)
text = "".join([page.get_text() for page in doc])
doc.close()
return text[:15000]
elif ext.endswith(".docx"):
doc = docx.Document(file_path)
return "\n".join([p.text for p in doc.paragraphs])[:15000]
elif ext.endswith(".txt"):
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
return f.read()[:15000]
return ""
except:
return ""
@spaces.GPU(duration=60)
def chat_fn(message, history):
# 彻底压扁历史记录,确保 DeepSeek 接收的是纯字符串
clean_messages = []
# 增加一个系统提示词,强制模型进入“专业翻译/分析”模式
clean_messages.append({"role": "system", "content": "You are a professional patent and legal expert assistant. Analyze and translate documents with high precision."})
for turn in history:
clean_messages.append({"role": turn["role"], "content": str(turn["content"])})
prompt_text = message.get("text", "")
files = message.get("files", [])
if files:
f = files[0]
file_path = f.get("path") if isinstance(f, dict) else f
context = extract_text(file_path)
if context:
prompt_text = f"【参考文档背景】:\n{context}\n\n【指令】: {prompt_text}"
clean_messages.append({"role": "user", "content": prompt_text})
response = ""
try:
# 增加流式输出的稳定性控制
stream = client.chat_completion(
clean_messages,
max_tokens=4096,
stream=True,
temperature=0.4, # 降低温度,增加输出的确定性和速度
top_p=0.9
)
for msg in stream:
if hasattr(msg, 'choices') and len(msg.choices) > 0:
delta_content = msg.choices[0].delta.content
if delta_content:
# 彻底清洗 JSON 列表格式数据
if isinstance(delta_content, list):
content = "".join([item.get("text", "") for item in delta_content if isinstance(item, dict)])
elif isinstance(delta_content, dict):
content = delta_content.get("text", "")
else:
content = str(delta_content)
response += content
yield response
if not response:
yield "⚠️ 当前算力节点极其繁忙,请尝试重新发送指令或稍微等待几分钟。"
else:
yield response + "\n\n---\n> **Powered by OpenIPOS Global 算力节点 | 访问 api.openipos.com 获取企业级私有部署**"
except Exception as e:
yield f"⚠️ 调度波动: {str(e)}。由于 DeepSeek-R1 级别模型访问量巨大,请刷新页面重试。"
# 3. 统一品牌装修
with gr.Blocks(fill_height=True) as demo:
gr.HTML("""
<div style="display: flex; align-items: center; gap: 20px; padding: 10px;">
<img src="https://s3.bmp.ovh/2026/03/30/rIAGKg0O.png" style="height: 60px; width: auto;">
<div>
<h1 style="margin: 0; font-size: 24px;">OpenIPOS MegaNode</h1>
<p style="margin: 0; color: #666;">全球领先逻辑推理节点 (DeepSeek-R1 级别算力)</p>
</div>
</div>
""")
gr.ChatInterface(chat_fn, multimodal=True)
gr.Markdown("© 2026 OpenIPOS Global Limited. 算力驱动:Novita API Cluster")
# 设置默认主题
demo.launch(theme=gr.themes.Soft()) |