exable324 commited on
Commit
5face16
·
verified ·
1 Parent(s): 3c1050b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -75
app.py CHANGED
@@ -2,99 +2,121 @@ import json
2
  import uuid
3
  import time
4
  import random
 
5
  import requests
6
- from fastapi import FastAPI, Request, HTTPException
 
7
  from fastapi.responses import StreamingResponse
 
8
 
9
- app = FastAPI()
10
-
11
- # --- 核心逻辑函数 (基于你之前的代码) ---
12
  API_KEY = "AIzaSyAZaD22Mzi9HkTcW3ErNxRA_sNEFolLBCA"
 
13
 
14
- def get_jwt():
 
15
  url = f"https://identitytoolkit.googleapis.com/v1/accounts:signUp?key={API_KEY}"
16
- resp = requests.post(url, json={"returnSecureToken": True}, headers={"origin": "https://www.aidocmaker.com"})
17
- return resp.json().get("idToken")
18
-
19
- def generate_id():
20
- return ''.join(random.choice('0123456789abcdef') for _ in range(32))
21
-
22
- # --- OpenAI 兼容逻辑 ---
23
- @app.post("/v1/chat/completions")
24
- async def chat_completions(request: Request):
25
- # 1. 解析请求内容
26
- body = await request.json()
27
- messages = body.get("messages", [])
28
- model = body.get("model", "gemini-3-flash")
29
- stream = body.get("stream", False)
30
 
31
- # 提取最后一条消息作为 content
32
- content = messages[-1]["content"] if messages else ""
 
 
 
 
 
 
 
33
 
34
- # 2. 获取临时 JWT
35
- jwt = get_jwt()
36
- if not jwt:
37
- raise HTTPException(status_code=500, detail="Failed to get JWT")
38
-
39
- # 3. 准备请求目标接口
40
  url = "https://level2labs-prod--adm-agent-send-chat-message.modal.run/"
41
- headers = {"Authorization": f"Bearer {jwt}"}
42
  form_data = {
43
  "content": (None, content),
44
- "model": (None, model),
45
- "conversation_id": (None, generate_id()),
46
- "message_id": (None, generate_id()),
47
  "max_mode": (None, "true")
48
  }
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
- # 4. 处理响应
51
- target_resp = requests.post(url, files=form_data, headers=headers, stream=True)
 
 
 
 
 
 
 
 
 
 
 
52
 
53
- def generate():
54
- chat_id = f"chatcmpl-{uuid.uuid4()}"
55
- created_time = int(time.time())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
 
57
- for line in target_resp.iter_lines():
58
- if line:
59
- try:
60
- # 解析原始接口的 text_delta 格式
61
- raw_data = json.loads(line.decode("utf-8"))
62
- delta_content = raw_data.get("data", "")
63
-
64
- # 构造 OpenAI 格式的 chunk
65
- chunk = {
66
- "id": chat_id,
67
- "object": "chat.completion.chunk",
68
- "created": created_time,
69
- "model": model,
70
- "choices": [{"index": 0, "delta": {"content": delta_content}, "finish_reason": None}]
71
- }
72
- yield f"data: {json.dumps(chunk)}\n\n"
73
- except:
74
- continue
75
 
76
- yield "data: [DONE]\n\n"
 
77
 
78
- if stream:
79
- return StreamingResponse(generate(), media_type="text/event-stream")
80
- else:
81
- # 非流式处理(简单拼接)
82
- full_text = ""
83
- for line in target_resp.iter_lines():
84
- if line:
85
- try:
86
- full_text += json.loads(line.decode("utf-8")).get("data", "")
87
- except: continue
88
-
89
- return {
90
- "id": f"chatcmpl-{uuid.uuid4()}",
91
- "object": "chat.completion",
92
- "created": int(time.time()),
93
- "model": model,
94
- "choices": [{"index": 0, "message": {"role": "assistant", "content": full_text}, "finish_reason": "stop"}]
95
- }
 
 
96
 
97
  if __name__ == "__main__":
98
  import uvicorn
99
- # 同样去掉 .py
100
- uvicorn.run("app:app", host="0.0.0.0", port=7860, reload=True)
 
2
  import uuid
3
  import time
4
  import random
5
+ import os
6
  import requests
7
+ import gradio as gr
8
+ from fastapi import FastAPI, Request, HTTPException, Depends
9
  from fastapi.responses import StreamingResponse
10
+ from fastapi.middleware.wsgi import WSGIMiddleware
11
 
12
+ # --- 核心逻辑 ---
 
 
13
  API_KEY = "AIzaSyAZaD22Mzi9HkTcW3ErNxRA_sNEFolLBCA"
14
+ current_token = "" # 用于界面的全局 Token
15
 
16
+ def get_new_jwt():
17
+ global current_token
18
  url = f"https://identitytoolkit.googleapis.com/v1/accounts:signUp?key={API_KEY}"
19
+ try:
20
+ resp = requests.post(url, json={"returnSecureToken": True}, headers={"origin": "https://www.aidocmaker.com"})
21
+ token = resp.json().get("idToken")
22
+ current_token = token
23
+ return token
24
+ except:
25
+ return "获取失败"
 
 
 
 
 
 
 
26
 
27
+ def check_balance(token):
28
+ if not token: return "请先获取 Token"
29
+ url = "https://level2labs-prod--adm-agent-helper-user-get-credits.modal.run/"
30
+ headers = {"Authorization": f"Bearer {token}"}
31
+ try:
32
+ data = requests.post(url, headers=headers).json()
33
+ return f"Token (有效): 当前账号剩余额度: {data.get('premium_quota', 0)}"
34
+ except:
35
+ return "查询失败,Token 可能已过期"
36
 
37
+ def chat_stream(token, content):
38
+ if not token: yield "请先获取 Token", ""; return
 
 
 
 
39
  url = "https://level2labs-prod--adm-agent-send-chat-message.modal.run/"
40
+ headers = {"Authorization": f"Bearer {token}"}
41
  form_data = {
42
  "content": (None, content),
43
+ "model": (None, "gemini-3-flash"),
44
+ "conversation_id": (None, "".join(random.choice('0123456789abcdef') for _ in range(32))),
45
+ "message_id": (None, "".join(random.choice('0123456789abcdef') for _ in range(32))),
46
  "max_mode": (None, "true")
47
  }
48
+
49
+ full_text = ""
50
+ try:
51
+ resp = requests.post(url, files=form_data, headers=headers, stream=True)
52
+ for line in resp.iter_lines():
53
+ if line:
54
+ raw = json.loads(line.decode("utf-8"))
55
+ delta = raw.get("data", "")
56
+ full_text += delta
57
+ yield full_text, json.dumps(raw, ensure_ascii=False)
58
+ except Exception as e:
59
+ yield f"出错啦: {e}", ""
60
 
61
+ def create_tts(token, prompt):
62
+ if not token: return "请先获取 Token", None
63
+ url = "https://level2labs-prod--adm-agent-audio-create-audio-with-assistant.modal.run/"
64
+ headers = {"Authorization": f"Bearer {token}"}
65
+ data = {"prompt": (None, prompt), "voice_id": (None, "clear"), "speed": (None, "1")}
66
+ try:
67
+ resp = requests.post(url, files=data, headers=headers).json()
68
+ name = resp.get("name")
69
+ audio_url_api = f"https://level2labs-prod--adm-agent-audio-get-audio-playback-url.modal.run/?name={name}"
70
+ audio_url = requests.get(audio_url_api, headers=headers).json().get("url")
71
+ return json.dumps(resp, indent=2), audio_url
72
+ except:
73
+ return "生成失败", None
74
 
75
+ # --- Gradio UI 构建 ---
76
+ with gr.Blocks(title="AI Doc Maker 管理面板", theme=gr.themes.Soft()) as demo:
77
+ gr.Markdown("# 🚀 AI Doc Maker 管理面板")
78
+
79
+ with gr.Group():
80
+ gr.Markdown("### 📊 查询额度")
81
+ with gr.Row():
82
+ btn_check = gr.Button("查询额度", variant="primary")
83
+ balance_display = gr.Textbox(label="查询当前 Token 的剩余使用额度", placeholder="等待查询...", interactive=False)
84
+
85
+ with gr.Group():
86
+ gr.Markdown("### 💬 AI 聊天(流式输出)")
87
+ input_msg = gr.Textbox(label="输入消息 (支持多行)", lines=5, placeholder="a joke")
88
+ with gr.Row():
89
+ btn_send = gr.Button("发送消息", variant="primary")
90
+ btn_clear = gr.Button("清空输出")
91
+ btn_audio = gr.Button("✨ 生成音频", variant="secondary")
92
 
93
+ ai_reply = gr.Textbox(label="AI 回复:", interactive=False)
94
+ raw_json = gr.Textbox(label="原始数据 (JSON):", interactive=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
+ audio_json = gr.Textbox(label="音频数据 (JSON):", interactive=False)
97
+ audio_out = gr.Audio(label="播放音频", interactive=False)
98
 
99
+ with gr.Group():
100
+ gr.Markdown("### 🆕 创建新账号")
101
+ btn_reg = gr.Button("创建/获取 Token")
102
+ token_display = gr.Textbox(label="注册新账号并获取 IdToken", interactive=False)
103
+
104
+ # 绑定逻辑
105
+ btn_reg.click(get_new_jwt, outputs=token_display)
106
+ btn_check.click(check_balance, inputs=token_display, outputs=balance_display)
107
+ btn_send.click(chat_stream, inputs=[token_display, input_msg], outputs=[ai_reply, raw_json])
108
+ btn_audio.click(create_tts, inputs=[token_display, input_msg], outputs=[audio_json, audio_out])
109
+ btn_clear.click(lambda: ("", ""), outputs=[ai_reply, raw_json])
110
+
111
+ # --- FastAPI 整合 ---
112
+ app = FastAPI()
113
+
114
+ # 挂载 Gradio 到根路径
115
+ app = gr.mount_gradio_app(app, demo, path="/")
116
+
117
+ # 这里可以保留你之前的 /v1/chat/completions 路由代码...
118
+ # (篇幅原因此处省略,只需将之前的 FastAPI 路由贴在下面即可)
119
 
120
  if __name__ == "__main__":
121
  import uvicorn
122
+ uvicorn.run(app, host="0.0.0.0", port=7860)