11from fastapi import APIRouter , Depends
22from fastapi .responses import StreamingResponse
33from typing import List , Union , Dict
4- from .schemas import ChatRequestSchema , ChatResponseSchema , MessageSchema , TextContentSchema , ImageContentSchema
4+ from .schemas import (
5+ ChatRequestSchema ,
6+ ChatResponseSchema ,
7+ MessageSchema ,
8+ TextContentSchema ,
9+ ImageContentSchema ,
10+ )
511from .service import ChatService
612from .models import Message , TextContent , ImageContent
713from datetime import datetime
1218
1319router = APIRouter (prefix = "/chat" , tags = ["chat" ])
1420
21+
1522async def get_chat_service () -> ChatService :
1623 # This will be overridden in main.py
1724 raise NotImplementedError ("Chat service not configured" )
1825
26+
1927def extract_message_content (message : MessageSchema ) -> tuple [str , List [str ]]:
2028 """Extract text and image URLs from a message"""
2129 if isinstance (message .content , str ):
2230 return message .content , []
23-
31+
2432 text = ""
2533 images = []
26-
34+
2735 for content in message .content :
2836 if content .type == "text" :
2937 text = content .text
3038 elif content .type == "image_url" :
3139 images .append (content .image_url .url )
32-
40+
3341 return text , images
3442
43+
3544@router .post ("/" , response_model = ChatResponseSchema )
3645async def chat (
37- request : ChatRequestSchema ,
38- chat_service : ChatService = Depends (get_chat_service )
46+ request : ChatRequestSchema , chat_service : ChatService = Depends (get_chat_service )
3947) -> ChatResponseSchema :
4048 # Convert request messages to domain models
4149 messages = []
@@ -44,36 +52,37 @@ async def chat(
4452 content = msg .content
4553 else :
4654 content = [
47- TextContent (text = c .text ) if c .type == "text"
48- else ImageContent (image_url = {"url" : c .image_url .url })
55+ (
56+ TextContent (text = c .text )
57+ if c .type == "text"
58+ else ImageContent (image_url = {"url" : c .image_url .url })
59+ )
4960 for c in msg .content
5061 ]
51- messages .append (Message (
52- role = msg .role ,
53- content = content ,
54- model = msg .model ,
55- timestamp = msg .timestamp or datetime .utcnow ()
56- ))
57-
62+ messages .append (
63+ Message (
64+ role = msg .role ,
65+ content = content ,
66+ model = msg .model ,
67+ timestamp = msg .timestamp or datetime .utcnow (),
68+ )
69+ )
70+
5871 # Extract content from the last message
5972 text , images = extract_message_content (request .messages [- 1 ])
60-
73+
6174 response = await chat_service .process_message (
62- text = text ,
63- images = images ,
64- conversation_messages = messages
75+ text = text , images = images , conversation_messages = messages
6576 )
66-
77+
6778 return ChatResponseSchema (
68- reply = response .content ,
69- model = response .model ,
70- timestamp = response .timestamp
79+ reply = response .content , model = response .model , timestamp = response .timestamp
7180 )
7281
82+
7383@router .post ("/stream" )
7484async def stream_chat (
75- request : ChatRequestSchema ,
76- chat_service : ChatService = Depends (get_chat_service )
85+ request : ChatRequestSchema , chat_service : ChatService = Depends (get_chat_service )
7786):
7887 # Convert request messages to domain models
7988 messages = []
@@ -82,26 +91,29 @@ async def stream_chat(
8291 content = msg .content
8392 else :
8493 content = [
85- TextContent (text = c .text ) if c .type == "text"
86- else ImageContent (image_url = {"url" : c .image_url .url })
94+ (
95+ TextContent (text = c .text )
96+ if c .type == "text"
97+ else ImageContent (image_url = {"url" : c .image_url .url })
98+ )
8799 for c in msg .content
88100 ]
89- messages .append (Message (
90- role = msg .role ,
91- content = content ,
92- model = msg .model ,
93- timestamp = msg .timestamp or datetime .utcnow ()
94- ))
95-
101+ messages .append (
102+ Message (
103+ role = msg .role ,
104+ content = content ,
105+ model = msg .model ,
106+ timestamp = msg .timestamp or datetime .utcnow (),
107+ )
108+ )
109+
96110 # Extract content from the last message
97111 text , images = extract_message_content (request .messages [- 1 ])
98112
99113 async def generate ():
100114 try :
101115 async for chunk in chat_service .stream_response (
102- text = text ,
103- images = images ,
104- conversation_messages = messages
116+ text = text , images = images , conversation_messages = messages
105117 ):
106118 yield f"data: { json .dumps ({'content' : chunk })} \n \n "
107119 except Exception as e :
@@ -114,6 +126,6 @@ async def generate():
114126 headers = {
115127 "Cache-Control" : "no-cache" ,
116128 "Connection" : "keep-alive" ,
117- "X-Accel-Buffering" : "no"
118- }
119- )
129+ "X-Accel-Buffering" : "no" ,
130+ },
131+ )
0 commit comments