Niansuh commited on
Commit
1488dea
·
verified ·
1 Parent(s): dd92e46

Update api/utils.py

Browse files
Files changed (1) hide show
  1. api/utils.py +60 -49
api/utils.py CHANGED
@@ -2,16 +2,37 @@ from datetime import datetime
2
  import json
3
  from typing import Any, Dict, Optional
4
  import uuid
 
5
 
6
  import httpx
7
  from api.config import MODEL_MAPPING, headers, AGENT_MODE, TRENDING_AGENT_MODE, BASE_URL
8
  from fastapi import HTTPException
9
- from api.models import ChatRequest
10
 
11
  from api.logger import setup_logger
12
 
13
  logger = setup_logger(__name__)
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  def create_chat_completion_data(
17
  content: str, model: str, timestamp: int, finish_reason: Optional[str] = None
@@ -38,9 +59,9 @@ def message_to_dict(message):
38
  elif isinstance(message.content, list) and len(message.content) == 2:
39
  return {
40
  "role": message.role,
41
- "content": message.content[0]["text"],
42
  "data": {
43
- "imageBase64": message.content[1]["image_url"]["url"],
44
  "fileText": "",
45
  "title": "snapshot",
46
  },
@@ -55,27 +76,6 @@ async def process_streaming_response(request: ChatRequest):
55
  model = MODEL_MAPPING.get(request.model, request.model)
56
 
57
  # Add prefix if applicable
58
- prefix = ""
59
- model_prefixes = {
60
- 'gpt-4o': '@GPT-4o',
61
- 'gemini-pro': '@Gemini-PRO',
62
- 'claude-sonnet-3.5': '@Claude-Sonnet-3.5',
63
- 'PythonAgent': '@Python Agent',
64
- 'JavaAgent': '@Java Agent',
65
- 'JavaScriptAgent': '@JavaScript Agent',
66
- 'HTMLAgent': '@HTML Agent',
67
- 'GoogleCloudAgent': '@Google Cloud Agent',
68
- 'AndroidDeveloper': '@Android Developer',
69
- 'SwiftDeveloper': '@Swift Developer',
70
- 'Next.jsAgent': '@Next.js Agent',
71
- 'MongoDBAgent': '@MongoDB Agent',
72
- 'PyTorchAgent': '@PyTorch Agent',
73
- 'ReactAgent': '@React Agent',
74
- 'XcodeAgent': '@Xcode Agent',
75
- 'AngularJSAgent': '@AngularJS Agent',
76
- 'blackboxai-pro': '@BLACKBOXAI-PRO',
77
- 'ImageGeneration': '@Image Generation',
78
- }
79
  prefix = model_prefixes.get(request.model, "")
80
 
81
  # Format messages with prefix
@@ -84,10 +84,12 @@ async def process_streaming_response(request: ChatRequest):
84
  formatted_content = msg.content
85
  if prefix and msg.role.lower() == "user":
86
  formatted_content = f"{prefix} {formatted_content}"
 
 
87
  formatted_messages.append({
88
  "role": msg.role,
89
  "content": formatted_content,
90
- "data": msg.content.get('data') if isinstance(msg.content, dict) else None
91
  })
92
 
93
  json_data = {
@@ -129,7 +131,15 @@ async def process_streaming_response(request: ChatRequest):
129
  content = line
130
  if content.startswith("$@$v=undefined-rv1$@$"):
131
  content = content[21:]
132
- yield f"data: {json.dumps(create_chat_completion_data(content, request.model, timestamp))}\n\n"
 
 
 
 
 
 
 
 
133
 
134
  yield f"data: {json.dumps(create_chat_completion_data('', request.model, timestamp, 'stop'))}\n\n"
135
  yield "data: [DONE]\n\n"
@@ -147,27 +157,6 @@ async def process_non_streaming_response(request: ChatRequest):
147
  model = MODEL_MAPPING.get(request.model, request.model)
148
 
149
  # Add prefix if applicable
150
- prefix = ""
151
- model_prefixes = {
152
- 'gpt-4o': '@GPT-4o',
153
- 'gemini-pro': '@Gemini-PRO',
154
- 'claude-sonnet-3.5': '@Claude-Sonnet-3.5',
155
- 'PythonAgent': '@Python Agent',
156
- 'JavaAgent': '@Java Agent',
157
- 'JavaScriptAgent': '@JavaScript Agent',
158
- 'HTMLAgent': '@HTML Agent',
159
- 'GoogleCloudAgent': '@Google Cloud Agent',
160
- 'AndroidDeveloper': '@Android Developer',
161
- 'SwiftDeveloper': '@Swift Developer',
162
- 'Next.jsAgent': '@Next.js Agent',
163
- 'MongoDBAgent': '@MongoDB Agent',
164
- 'PyTorchAgent': '@PyTorch Agent',
165
- 'ReactAgent': '@React Agent',
166
- 'XcodeAgent': '@Xcode Agent',
167
- 'AngularJSAgent': '@AngularJS Agent',
168
- 'blackboxai-pro': '@BLACKBOXAI-PRO',
169
- 'ImageGeneration': '@Image Generation',
170
- }
171
  prefix = model_prefixes.get(request.model, "")
172
 
173
  # Format messages with prefix
@@ -176,10 +165,12 @@ async def process_non_streaming_response(request: ChatRequest):
176
  formatted_content = msg.content
177
  if prefix and msg.role.lower() == "user":
178
  formatted_content = f"{prefix} {formatted_content}"
 
 
179
  formatted_messages.append({
180
  "role": msg.role,
181
  "content": formatted_content,
182
- "data": msg.content.get('data') if isinstance(msg.content, dict) else None
183
  })
184
 
185
  json_data = {
@@ -204,7 +195,6 @@ async def process_non_streaming_response(request: ChatRequest):
204
  "webSearchMode": False, # Set to True if web search is needed
205
  "userSelectedModel": model,
206
  }
207
-
208
  full_response = ""
209
  async with httpx.AsyncClient() as client:
210
  try:
@@ -226,6 +216,27 @@ async def process_non_streaming_response(request: ChatRequest):
226
  if full_response.startswith("$@$v=undefined-rv1$@$"):
227
  full_response = full_response[21:]
228
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
  return {
230
  "id": f"chatcmpl-{uuid.uuid4()}",
231
  "object": "chat.completion",
 
2
  import json
3
  from typing import Any, Dict, Optional
4
  import uuid
5
+ import re
6
 
7
  import httpx
8
  from api.config import MODEL_MAPPING, headers, AGENT_MODE, TRENDING_AGENT_MODE, BASE_URL
9
  from fastapi import HTTPException
10
+ from api.models import ChatRequest, ImageResponse
11
 
12
  from api.logger import setup_logger
13
 
14
  logger = setup_logger(__name__)
15
 
16
+ model_prefixes = {
17
+ 'gpt-4o': '@GPT-4o',
18
+ 'gemini-pro': '@Gemini-PRO',
19
+ 'claude-sonnet-3.5': '@Claude-Sonnet-3.5',
20
+ 'PythonAgent': '@Python Agent',
21
+ 'JavaAgent': '@Java Agent',
22
+ 'JavaScriptAgent': '@JavaScript Agent',
23
+ 'HTMLAgent': '@HTML Agent',
24
+ 'GoogleCloudAgent': '@Google Cloud Agent',
25
+ 'AndroidDeveloper': '@Android Developer',
26
+ 'SwiftDeveloper': '@Swift Developer',
27
+ 'Next.jsAgent': '@Next.js Agent',
28
+ 'MongoDBAgent': '@MongoDB Agent',
29
+ 'PyTorchAgent': '@PyTorch Agent',
30
+ 'ReactAgent': '@React Agent',
31
+ 'XcodeAgent': '@Xcode Agent',
32
+ 'AngularJSAgent': '@AngularJS Agent',
33
+ 'blackboxai-pro': '@BLACKBOXAI-PRO',
34
+ 'ImageGeneration': '@Image Generation',
35
+ }
36
 
37
  def create_chat_completion_data(
38
  content: str, model: str, timestamp: int, finish_reason: Optional[str] = None
 
59
  elif isinstance(message.content, list) and len(message.content) == 2:
60
  return {
61
  "role": message.role,
62
+ "content": message.content[0].get("text", ""),
63
  "data": {
64
+ "imageBase64": message.content[1].get("imageBase64", ""),
65
  "fileText": "",
66
  "title": "snapshot",
67
  },
 
76
  model = MODEL_MAPPING.get(request.model, request.model)
77
 
78
  # Add prefix if applicable
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  prefix = model_prefixes.get(request.model, "")
80
 
81
  # Format messages with prefix
 
84
  formatted_content = msg.content
85
  if prefix and msg.role.lower() == "user":
86
  formatted_content = f"{prefix} {formatted_content}"
87
+ # Ensure 'data' is included if present
88
+ data = msg.content.get('data') if isinstance(msg.content, dict) else None
89
  formatted_messages.append({
90
  "role": msg.role,
91
  "content": formatted_content,
92
+ "data": data
93
  })
94
 
95
  json_data = {
 
131
  content = line
132
  if content.startswith("$@$v=undefined-rv1$@$"):
133
  content = content[21:]
134
+
135
+ # Check for Base64 image data
136
+ match_data_uri = re.search(r'!\[.*?\]\((data:image/[^;]+;base64,[^\)]+)\)', content)
137
+ if match_data_uri:
138
+ image_data = match_data_uri.group(1)
139
+ image_response = ImageResponse(images=image_data, alt="Generated Image")
140
+ yield image_response
141
+ else:
142
+ yield f"data: {json.dumps(create_chat_completion_data(content, request.model, timestamp))}\n\n"
143
 
144
  yield f"data: {json.dumps(create_chat_completion_data('', request.model, timestamp, 'stop'))}\n\n"
145
  yield "data: [DONE]\n\n"
 
157
  model = MODEL_MAPPING.get(request.model, request.model)
158
 
159
  # Add prefix if applicable
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160
  prefix = model_prefixes.get(request.model, "")
161
 
162
  # Format messages with prefix
 
165
  formatted_content = msg.content
166
  if prefix and msg.role.lower() == "user":
167
  formatted_content = f"{prefix} {formatted_content}"
168
+ # Ensure 'data' is included if present
169
+ data = msg.content.get('data') if isinstance(msg.content, dict) else None
170
  formatted_messages.append({
171
  "role": msg.role,
172
  "content": formatted_content,
173
+ "data": data
174
  })
175
 
176
  json_data = {
 
195
  "webSearchMode": False, # Set to True if web search is needed
196
  "userSelectedModel": model,
197
  }
 
198
  full_response = ""
199
  async with httpx.AsyncClient() as client:
200
  try:
 
216
  if full_response.startswith("$@$v=undefined-rv1$@$"):
217
  full_response = full_response[21:]
218
 
219
+ # Handle Base64 image data in the response
220
+ match_data_uri = re.search(r'!\[.*?\]\((data:image/[^;]+;base64,[^\)]+)\)', full_response)
221
+ if match_data_uri:
222
+ image_data = match_data_uri.group(1)
223
+ # Optionally, you can convert data URI to a more usable format or pass it directly
224
+ return {
225
+ "id": f"chatcmpl-{uuid.uuid4()}",
226
+ "object": "chat.completion",
227
+ "created": int(datetime.now().timestamp()),
228
+ "model": request.model,
229
+ "choices": [
230
+ {
231
+ "index": 0,
232
+ "message": {"role": "assistant", "content": full_response},
233
+ "finish_reason": "stop",
234
+ }
235
+ ],
236
+ "usage": None,
237
+ "imageData": image_data # Add image data to the response if needed
238
+ }
239
+
240
  return {
241
  "id": f"chatcmpl-{uuid.uuid4()}",
242
  "object": "chat.completion",