Update main.py
Browse files
main.py
CHANGED
@@ -22,10 +22,24 @@ with open("model_map.json", "r", encoding="utf-8") as f:
|
|
22 |
MODEL_PROMPTS = json.load(f)
|
23 |
|
24 |
# Request schema
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
class Message(BaseModel):
|
26 |
role: str
|
27 |
-
content: str
|
28 |
|
|
|
29 |
class ChatRequest(BaseModel):
|
30 |
model: str
|
31 |
messages: List[Message]
|
@@ -41,9 +55,38 @@ class ChatRequest(BaseModel):
|
|
41 |
def build_payload(chat: ChatRequest):
|
42 |
system_prompt = MODEL_PROMPTS.get(chat.model, "You are a helpful assistant.")
|
43 |
filtered_messages = [msg for msg in chat.messages if msg.role != "system"]
|
44 |
-
|
45 |
-
|
46 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
return {
|
48 |
"model": BACKEND_MODEL,
|
49 |
"messages": payload_messages,
|
|
|
22 |
MODEL_PROMPTS = json.load(f)
|
23 |
|
24 |
# Request schema
|
25 |
+
|
26 |
+
# Define ContentType for vision
|
27 |
+
class ContentImage(BaseModel):
|
28 |
+
type: str # must be "image_url"
|
29 |
+
image_url: dict # {"url": "https://..." or "data:image/...;base64,..."}
|
30 |
+
|
31 |
+
class ContentText(BaseModel):
|
32 |
+
type: str # must be "text"
|
33 |
+
text: str
|
34 |
+
|
35 |
+
ContentType = Union[ContentText, ContentImage]
|
36 |
+
|
37 |
+
# Message model allows BOTH old and new formats
|
38 |
class Message(BaseModel):
|
39 |
role: str
|
40 |
+
content: Union[str, List[ContentType]] # str (legacy) or list of ContentType
|
41 |
|
42 |
+
# ChatRequest model
|
43 |
class ChatRequest(BaseModel):
|
44 |
model: str
|
45 |
messages: List[Message]
|
|
|
55 |
def build_payload(chat: ChatRequest):
|
56 |
system_prompt = MODEL_PROMPTS.get(chat.model, "You are a helpful assistant.")
|
57 |
filtered_messages = [msg for msg in chat.messages if msg.role != "system"]
|
58 |
+
|
59 |
+
payload_messages = [{"role": "system", "content": system_prompt}]
|
60 |
+
|
61 |
+
for msg in filtered_messages:
|
62 |
+
# Legacy format: string
|
63 |
+
if isinstance(msg.content, str):
|
64 |
+
payload_messages.append({"role": msg.role, "content": msg.content})
|
65 |
+
|
66 |
+
# Multimodal format
|
67 |
+
elif isinstance(msg.content, list):
|
68 |
+
content_payload = []
|
69 |
+
for content_item in msg.content:
|
70 |
+
# ContentText
|
71 |
+
if content_item.type == "text":
|
72 |
+
content_payload.append({
|
73 |
+
"type": "text",
|
74 |
+
"text": content_item.text
|
75 |
+
})
|
76 |
+
# ContentImage
|
77 |
+
elif content_item.type == "image_url":
|
78 |
+
content_payload.append({
|
79 |
+
"type": "image_url",
|
80 |
+
"image_url": content_item.image_url
|
81 |
+
})
|
82 |
+
else:
|
83 |
+
logger.warning(f"Unknown content type: {content_item.type}, skipping.")
|
84 |
+
|
85 |
+
payload_messages.append({"role": msg.role, "content": content_payload})
|
86 |
+
|
87 |
+
else:
|
88 |
+
logger.warning(f"Unknown message content format: {msg.content}")
|
89 |
+
|
90 |
return {
|
91 |
"model": BACKEND_MODEL,
|
92 |
"messages": payload_messages,
|