15
15
logger : logging .Logger = logging .getLogger ("uvicorn.error" )
16
16
logger .setLevel (logging .DEBUG )
17
17
18
-
19
-
20
18
router : APIRouter = APIRouter (
21
19
prefix = "/assistants/{assistant_id}/messages/{thread_id}" ,
22
20
tags = ["assistants_messages" ]
@@ -29,7 +27,26 @@ class ToolCallOutputs(BaseModel):
29
27
tool_outputs : Any
30
28
runId : str
31
29
30
+ user_message_html = (
31
+ "<div class=\" chat-turn\" hx-swap=\" beforeend\" "
32
+ "sse-connect=\" /assistants/{assistant_id}/messages/{thread_id}/receive\" "
33
+ "sse-swap=\" messageCreated\" "
34
+ "sse-close=\" endStream\" >"
35
+ "<div class=\" userMessage\" >"
36
+ "{user_input}"
37
+ "</div>"
38
+ "</div>"
39
+ )
40
+
41
+ assistant_step_html = (
42
+ "<div class=\" {event_type}\" " # assistantMessage or toolCall
43
+ "sse-swap=\" {event_name}\" " #event_type plus a counter
44
+ "hx-swap=\" beforeend\" >"
45
+ "</div>"
46
+ )
47
+
32
48
async def post_tool_outputs (client : AsyncOpenAI , data : dict , thread_id : str ):
49
+
33
50
try :
34
51
# Parse the JSON body into the ToolCallOutputs model
35
52
tool_call_outputs = ToolCallOutputs (** data )
@@ -88,16 +105,18 @@ async def post_message(
88
105
89
106
)
90
107
91
- return templates . TemplateResponse (
92
- "components/chat-turn.html" ,
93
- {
94
- "request" : request ,
95
- "user_input" : userInput ,
96
- " assistant_id" : assistant_id ,
97
- " thread_id" : thread_id
98
- }
108
+ return (
109
+ user_message_html . format ( user_input = userInput ) +
110
+ assistant_step_html . format (
111
+ event_type = "assistantMessage" ,
112
+ event_name = "message" ,
113
+ assistant_id = assistant_id ,
114
+ thread_id = thread_id
115
+ )
99
116
)
100
117
118
+
119
+
101
120
@router .get ("/receive" )
102
121
async def stream_response (
103
122
assistant_id : str ,
0 commit comments