dan92 commited on
Commit
a745a89
·
verified ·
1 Parent(s): 995afc3

Update api/utils.py

Browse files
Files changed (1) hide show
  1. api/utils.py +180 -169
api/utils.py CHANGED
@@ -1,169 +1,180 @@
1
- from datetime import datetime
2
- from http.client import HTTPException
3
- import json
4
- from typing import Any, Dict, Optional
5
- import uuid
6
-
7
- import httpx
8
- from api import validate
9
- from api.config import MODEL_MAPPING, headers
10
- from fastapi import Depends, security
11
- from fastapi.security import HTTPAuthorizationCredentials
12
-
13
- from api.config import APP_SECRET, BASE_URL
14
- from api.models import ChatRequest
15
-
16
- from api.logger import setup_logger
17
-
18
- logger = setup_logger(__name__)
19
-
20
-
21
- def create_chat_completion_data(
22
- content: str, model: str, timestamp: int, finish_reason: Optional[str] = None
23
- ) -> Dict[str, Any]:
24
- return {
25
- "id": f"chatcmpl-{uuid.uuid4()}",
26
- "object": "chat.completion.chunk",
27
- "created": timestamp,
28
- "model": model,
29
- "choices": [
30
- {
31
- "index": 0,
32
- "delta": {"content": content, "role": "assistant"},
33
- "finish_reason": finish_reason,
34
- }
35
- ],
36
- "usage": None,
37
- }
38
-
39
-
40
- def verify_app_secret(credentials: HTTPAuthorizationCredentials = Depends(security)):
41
- if credentials.credentials != APP_SECRET:
42
- raise HTTPException(status_code=403, detail="Invalid APP_SECRET")
43
- return credentials.credentials
44
-
45
-
46
- def message_to_dict(message):
47
- if isinstance(message.content, str):
48
- return {"role": message.role, "content": message.content}
49
- elif isinstance(message.content, list) and len(message.content) == 2:
50
- return {
51
- "role": message.role,
52
- "content": message.content[0]["text"],
53
- "data": {
54
- "imageBase64": message.content[1]["image_url"]["url"],
55
- "fileText": "",
56
- "title": "snapshoot",
57
- },
58
- }
59
- else:
60
- return {"role": message.role, "content": message.content}
61
-
62
-
63
- async def process_streaming_response(request: ChatRequest):
64
- json_data = {
65
- "messages": [message_to_dict(msg) for msg in request.messages],
66
- "previewToken": None,
67
- "userId": None,
68
- "codeModelMode": True,
69
- "agentMode": {},
70
- "trendingAgentMode": {},
71
- "isMicMode": False,
72
- "userSystemPrompt": None,
73
- "maxTokens": request.max_tokens,
74
- "playgroundTopP": request.top_p,
75
- "playgroundTemperature": request.temperature,
76
- "isChromeExt": False,
77
- "githubToken": None,
78
- "clickedAnswer2": False,
79
- "clickedAnswer3": False,
80
- "clickedForceWebSearch": False,
81
- "visitFromDelta": False,
82
- "mobileClient": False,
83
- "userSelectedModel": MODEL_MAPPING.get(request.model),
84
- "validated": validate.getHid()
85
- }
86
-
87
- async with httpx.AsyncClient() as client:
88
- try:
89
- async with client.stream(
90
- "POST",
91
- f"{BASE_URL}/api/chat",
92
- headers=headers,
93
- json=json_data,
94
- timeout=100,
95
- ) as response:
96
- response.raise_for_status()
97
- async for line in response.aiter_lines():
98
- timestamp = int(datetime.now().timestamp())
99
- if line:
100
- content = line + "\n"
101
- if "https://www.blackbox.ai" in content:
102
- validate.getHid(True)
103
- content = "hid已刷新,重新对话即可\n"
104
- yield f"data: {json.dumps(create_chat_completion_data(content, request.model, timestamp))}\n\n"
105
- break
106
- if content.startswith("$@$v=undefined-rv1$@$"):
107
- yield f"data: {json.dumps(create_chat_completion_data(content[21:], request.model, timestamp))}\n\n"
108
- else:
109
- yield f"data: {json.dumps(create_chat_completion_data(content, request.model, timestamp))}\n\n"
110
-
111
- yield f"data: {json.dumps(create_chat_completion_data('', request.model, timestamp, 'stop'))}\n\n"
112
- yield "data: [DONE]\n\n"
113
- except httpx.HTTPStatusError as e:
114
- logger.error(f"HTTP error occurred: {e}")
115
- raise HTTPException(status_code=e.response.status_code, detail=str(e))
116
- except httpx.RequestError as e:
117
- logger.error(f"Error occurred during request: {e}")
118
- raise HTTPException(status_code=500, detail=str(e))
119
-
120
-
121
- async def process_non_streaming_response(request: ChatRequest):
122
- json_data = {
123
- "messages": [message_to_dict(msg) for msg in request.messages],
124
- "previewToken": None,
125
- "userId": None,
126
- "codeModelMode": True,
127
- "agentMode": {},
128
- "trendingAgentMode": {},
129
- "isMicMode": False,
130
- "userSystemPrompt": None,
131
- "maxTokens": request.max_tokens,
132
- "playgroundTopP": request.top_p,
133
- "playgroundTemperature": request.temperature,
134
- "isChromeExt": False,
135
- "githubToken": None,
136
- "clickedAnswer2": False,
137
- "clickedAnswer3": False,
138
- "clickedForceWebSearch": False,
139
- "visitFromDelta": False,
140
- "mobileClient": False,
141
- "userSelectedModel": MODEL_MAPPING.get(request.model),
142
- "validated": validate.getHid()
143
- }
144
- full_response = ""
145
- async with httpx.AsyncClient() as client:
146
- async with client.stream(
147
- method="POST", url=f"{BASE_URL}/api/chat", headers=headers, json=json_data
148
- ) as response:
149
- async for chunk in response.aiter_text():
150
- full_response += chunk
151
- if "https://www.blackbox.ai" in full_response:
152
- validate.getHid(True)
153
- full_response = "hid已刷新,重新对话即可"
154
- if full_response.startswith("$@$v=undefined-rv1$@$"):
155
- full_response = full_response[21:]
156
- return {
157
- "id": f"chatcmpl-{uuid.uuid4()}",
158
- "object": "chat.completion",
159
- "created": int(datetime.now().timestamp()),
160
- "model": request.model,
161
- "choices": [
162
- {
163
- "index": 0,
164
- "message": {"role": "assistant", "content": full_response},
165
- "finish_reason": "stop",
166
- }
167
- ],
168
- "usage": None,
169
- }
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from datetime import datetime
2
+ from http.client import HTTPException
3
+ import json
4
+ from typing import Any, Dict, Optional
5
+ import uuid
6
+
7
+ import httpx
8
+ from api import validate
9
+ from api.config import MODEL_MAPPING, headers
10
+ from fastapi import Depends, security
11
+ from fastapi.security import HTTPAuthorizationCredentials
12
+
13
+ from api.config import APP_SECRET, BASE_URL
14
+ from api.models import ChatRequest
15
+
16
+ from api.logger import setup_logger
17
+
18
+ logger = setup_logger(__name__)
19
+
20
+
21
+ def create_chat_completion_data(
22
+ content: str, model: str, timestamp: int, finish_reason: Optional[str] = None
23
+ ) -> Dict[str, Any]:
24
+ return {
25
+ "id": f"chatcmpl-{uuid.uuid4()}",
26
+ "object": "chat.completion.chunk",
27
+ "created": timestamp,
28
+ "model": model,
29
+ "choices": [
30
+ {
31
+ "index": 0,
32
+ "delta": {"content": content, "role": "assistant"},
33
+ "finish_reason": finish_reason,
34
+ }
35
+ ],
36
+ "usage": None,
37
+ }
38
+
39
+
40
+ def verify_app_secret(credentials: HTTPAuthorizationCredentials = Depends(security)):
41
+ if credentials.credentials != APP_SECRET:
42
+ raise HTTPException(status_code=403, detail="Invalid APP_SECRET")
43
+ return credentials.credentials
44
+
45
+
46
+ def message_to_dict(message):
47
+ if isinstance(message.content, str):
48
+ return {"role": message.role, "content": message.content}
49
+ elif isinstance(message.content, list) and len(message.content) == 2:
50
+ if "image_url" in message.content[1]:
51
+ return {
52
+ "role": message.role,
53
+ "content": message.content[0]["text"],
54
+ "data": {
55
+ "imageBase64": message.content[1]["image_url"]["url"],
56
+ "fileText": "",
57
+ "title": "snapshoot",
58
+ },
59
+ }
60
+ else:
61
+ return {
62
+ "role": message.role,
63
+ "content": message.content[0]["text"],
64
+ "data": {
65
+ "imageBase64": "",
66
+ "fileText": "",
67
+ "title": "snapshoot",
68
+ },
69
+ }
70
+ else:
71
+ return {"role": message.role, "content": message.content}
72
+
73
+
74
+ async def process_streaming_response(request: ChatRequest):
75
+ json_data = {
76
+ "messages": [message_to_dict(msg) for msg in request.messages],
77
+ "previewToken": None,
78
+ "userId": None,
79
+ "codeModelMode": True,
80
+ "agentMode": {},
81
+ "trendingAgentMode": {},
82
+ "isMicMode": False,
83
+ "userSystemPrompt": None,
84
+ "maxTokens": request.max_tokens,
85
+ "playgroundTopP": request.top_p,
86
+ "playgroundTemperature": request.temperature,
87
+ "isChromeExt": False,
88
+ "githubToken": None,
89
+ "clickedAnswer2": False,
90
+ "clickedAnswer3": False,
91
+ "clickedForceWebSearch": False,
92
+ "visitFromDelta": False,
93
+ "mobileClient": False,
94
+ "userSelectedModel": MODEL_MAPPING.get(request.model),
95
+ "validated": validate.getHid()
96
+ }
97
+
98
+ async with httpx.AsyncClient() as client:
99
+ try:
100
+ async with client.stream(
101
+ "POST",
102
+ f"{BASE_URL}/api/chat",
103
+ headers=headers,
104
+ json=json_data,
105
+ timeout=100,
106
+ ) as response:
107
+ response.raise_for_status()
108
+ async for line in response.aiter_lines():
109
+ timestamp = int(datetime.now().timestamp())
110
+ if line:
111
+ content = line + "\n"
112
+ if "https://www.blackbox.ai" in content:
113
+ validate.getHid(True)
114
+ content = "hid已刷新,重新对话即可\n"
115
+ yield f"data: {json.dumps(create_chat_completion_data(content, request.model, timestamp))}\n\n"
116
+ break
117
+ if content.startswith("$@$v=undefined-rv1$@$"):
118
+ yield f"data: {json.dumps(create_chat_completion_data(content[21:], request.model, timestamp))}\n\n"
119
+ else:
120
+ yield f"data: {json.dumps(create_chat_completion_data(content, request.model, timestamp))}\n\n"
121
+
122
+ yield f"data: {json.dumps(create_chat_completion_data('', request.model, timestamp, 'stop'))}\n\n"
123
+ yield "data: [DONE]\n\n"
124
+ except httpx.HTTPStatusError as e:
125
+ logger.error(f"HTTP error occurred: {e}")
126
+ raise HTTPException(status_code=e.response.status_code, detail=str(e))
127
+ except httpx.RequestError as e:
128
+ logger.error(f"Error occurred during request: {e}")
129
+ raise HTTPException(status_code=500, detail=str(e))
130
+
131
+
132
+ async def process_non_streaming_response(request: ChatRequest):
133
+ json_data = {
134
+ "messages": [message_to_dict(msg) for msg in request.messages],
135
+ "previewToken": None,
136
+ "userId": None,
137
+ "codeModelMode": True,
138
+ "agentMode": {},
139
+ "trendingAgentMode": {},
140
+ "isMicMode": False,
141
+ "userSystemPrompt": None,
142
+ "maxTokens": request.max_tokens,
143
+ "playgroundTopP": request.top_p,
144
+ "playgroundTemperature": request.temperature,
145
+ "isChromeExt": False,
146
+ "githubToken": None,
147
+ "clickedAnswer2": False,
148
+ "clickedAnswer3": False,
149
+ "clickedForceWebSearch": False,
150
+ "visitFromDelta": False,
151
+ "mobileClient": False,
152
+ "userSelectedModel": MODEL_MAPPING.get(request.model),
153
+ "validated": validate.getHid()
154
+ }
155
+ full_response = ""
156
+ async with httpx.AsyncClient() as client:
157
+ async with client.stream(
158
+ method="POST", url=f"{BASE_URL}/api/chat", headers=headers, json=json_data
159
+ ) as response:
160
+ async for chunk in response.aiter_text():
161
+ full_response += chunk
162
+ if "https://www.blackbox.ai" in full_response:
163
+ validate.getHid(True)
164
+ full_response = "hid已刷新,重新对话即可"
165
+ if full_response.startswith("$@$v=undefined-rv1$@$"):
166
+ full_response = full_response[21:]
167
+ return {
168
+ "id": f"chatcmpl-{uuid.uuid4()}",
169
+ "object": "chat.completion",
170
+ "created": int(datetime.now().timestamp()),
171
+ "model": request.model,
172
+ "choices": [
173
+ {
174
+ "index": 0,
175
+ "message": {"role": "assistant", "content": full_response},
176
+ "finish_reason": "stop",
177
+ }
178
+ ],
179
+ "usage": None,
180
+ }