Update app.py
Browse files
app.py
CHANGED
|
@@ -2,8 +2,10 @@ import gradio as gr
|
|
| 2 |
import requests
|
| 3 |
import os
|
| 4 |
|
|
|
|
| 5 |
OPENROUTER_API_KEY = "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"
|
| 6 |
|
|
|
|
| 7 |
def load_knowledge():
|
| 8 |
texts = []
|
| 9 |
for fname in ["data/theory.txt", "data/notes.txt"]:
|
|
@@ -15,8 +17,7 @@ def load_knowledge():
|
|
| 15 |
return "\n\n".join(texts)
|
| 16 |
|
| 17 |
SYSTEM_PROMPT = f"""
|
| 18 |
-
你是一个站无产阶级立场,用马克思主义世界观和方法论,
|
| 19 |
-
且基于以下材料进行回答的 AI,必须以这些材料为核心。
|
| 20 |
|
| 21 |
注意:
|
| 22 |
- 笼统问题不超过 1000 字
|
|
@@ -42,6 +43,7 @@ SYSTEM_PROMPT = f"""
|
|
| 42 |
- 批判当代左翼的机会主义、小资产阶级化、审美化倾向
|
| 43 |
"""
|
| 44 |
|
|
|
|
| 45 |
def chat(user_message):
|
| 46 |
headers = {
|
| 47 |
"Authorization": f"Bearer {OPENROUTER_API_KEY}",
|
|
@@ -70,49 +72,51 @@ def chat(user_message):
|
|
| 70 |
|
| 71 |
return r.json()["choices"][0]["message"]["content"]
|
| 72 |
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
gr.HTML("""
|
| 77 |
-
<style>
|
| 78 |
-
.avatar-wrapper {
|
| 79 |
-
position: relative;
|
| 80 |
-
width: 220px;
|
| 81 |
-
margin: 0 auto 20px auto;
|
| 82 |
-
animation: float 4s ease-in-out infinite;
|
| 83 |
-
}
|
| 84 |
-
|
| 85 |
-
.avatar-wrapper img {
|
| 86 |
-
width: 100%;
|
| 87 |
-
position: absolute;
|
| 88 |
-
top: 0;
|
| 89 |
-
left: 0;
|
| 90 |
-
border-radius: 16px;
|
| 91 |
-
}
|
| 92 |
-
|
| 93 |
-
.blink {
|
| 94 |
-
animation: blink 5s infinite;
|
| 95 |
-
}
|
| 96 |
-
|
| 97 |
-
@keyframes blink {
|
| 98 |
-
0%, 93%, 100% { opacity: 0; }
|
| 99 |
-
94%, 97% { opacity: 1; }
|
| 100 |
-
}
|
| 101 |
-
|
| 102 |
-
@keyframes float {
|
| 103 |
-
0% { transform: translateY(0px); }
|
| 104 |
-
50% { transform: translateY(-6px); }
|
| 105 |
-
100% { transform: translateY(0px); }
|
| 106 |
-
}
|
| 107 |
-
</style>
|
| 108 |
-
|
| 109 |
<div class="avatar-wrapper">
|
| 110 |
-
<img src="avatar_open.png">
|
| 111 |
-
<img src="avatar_close.png" class="blink">
|
| 112 |
</div>
|
| 113 |
""")
|
| 114 |
|
| 115 |
-
# ===== 聊天 UI
|
| 116 |
user_input = gr.Textbox(
|
| 117 |
label="请说,我会尽量帮助你的",
|
| 118 |
lines=3
|
|
|
|
| 2 |
import requests
|
| 3 |
import os
|
| 4 |
|
| 5 |
+
# ================== OpenRouter Key ==================
|
| 6 |
OPENROUTER_API_KEY = "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"
|
| 7 |
|
| 8 |
+
# ================== 知识加载 ==================
|
| 9 |
def load_knowledge():
|
| 10 |
texts = []
|
| 11 |
for fname in ["data/theory.txt", "data/notes.txt"]:
|
|
|
|
| 17 |
return "\n\n".join(texts)
|
| 18 |
|
| 19 |
SYSTEM_PROMPT = f"""
|
| 20 |
+
你是一个站无产阶级立场,用马克思主义世界观和方法论,且基于以下材料进行回答的 AI,必须以这些材料为核心。
|
|
|
|
| 21 |
|
| 22 |
注意:
|
| 23 |
- 笼统问题不超过 1000 字
|
|
|
|
| 43 |
- 批判当代左翼的机会主义、小资产阶级化、审美化倾向
|
| 44 |
"""
|
| 45 |
|
| 46 |
+
# ================== 聊天函数 ==================
|
| 47 |
def chat(user_message):
|
| 48 |
headers = {
|
| 49 |
"Authorization": f"Bearer {OPENROUTER_API_KEY}",
|
|
|
|
| 72 |
|
| 73 |
return r.json()["choices"][0]["message"]["content"]
|
| 74 |
|
| 75 |
+
# ================== 页面 ==================
|
| 76 |
+
with gr.Blocks(css="""
|
| 77 |
+
.avatar-wrapper {
|
| 78 |
+
position: relative;
|
| 79 |
+
width: 220px;
|
| 80 |
+
height: 220px; /* 关键:必须给高度 */
|
| 81 |
+
margin: 0 auto 16px auto;
|
| 82 |
+
animation: float 4s ease-in-out infinite;
|
| 83 |
+
overflow: hidden;
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
.avatar-wrapper img {
|
| 87 |
+
width: 100%;
|
| 88 |
+
height: 100%;
|
| 89 |
+
position: absolute;
|
| 90 |
+
top: 0;
|
| 91 |
+
left: 0;
|
| 92 |
+
border-radius: 16px;
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
.blink {
|
| 96 |
+
animation: blink 5s infinite;
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
@keyframes blink {
|
| 100 |
+
0%, 93%, 100% { opacity: 0; }
|
| 101 |
+
94%, 97% { opacity: 1; }
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
@keyframes float {
|
| 105 |
+
0% { transform: translateY(0px); }
|
| 106 |
+
50% { transform: translateY(-6px); }
|
| 107 |
+
100% { transform: translateY(0px); }
|
| 108 |
+
}
|
| 109 |
+
""") as demo:
|
| 110 |
+
|
| 111 |
+
# ===== 虚拟形象(修正版)=====
|
| 112 |
gr.HTML("""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
<div class="avatar-wrapper">
|
| 114 |
+
<img src="file=avatar_open.png">
|
| 115 |
+
<img src="file=avatar_close.png" class="blink">
|
| 116 |
</div>
|
| 117 |
""")
|
| 118 |
|
| 119 |
+
# ===== 聊天 UI =====
|
| 120 |
user_input = gr.Textbox(
|
| 121 |
label="请说,我会尽量帮助你的",
|
| 122 |
lines=3
|