Update app.py
Browse files
app.py
CHANGED
@@ -162,7 +162,16 @@ def messages():
|
|
162 |
def generate():
|
163 |
nonlocal total_output_tokens
|
164 |
|
165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
"type": "message_start",
|
167 |
"message": {
|
168 |
"id": msg_id,
|
@@ -175,25 +184,8 @@ def messages():
|
|
175 |
"usage": {"input_tokens": input_tokens, "output_tokens": total_output_tokens},
|
176 |
},
|
177 |
})
|
178 |
-
|
179 |
-
|
180 |
-
'data': {'content': start_event}
|
181 |
-
})
|
182 |
-
yield start_event
|
183 |
-
|
184 |
-
block_start_event = create_event("content_block_start", {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}})
|
185 |
-
logger.info("Sending content_block_start event", extra={
|
186 |
-
'event_type': 'content_block_start',
|
187 |
-
'data': {'content': block_start_event}
|
188 |
-
})
|
189 |
-
yield block_start_event
|
190 |
-
|
191 |
-
ping_event = create_event("ping", {"type": "ping"})
|
192 |
-
logger.info("Sending ping event", extra={
|
193 |
-
'event_type': 'ping',
|
194 |
-
'data': {'content': ping_event}
|
195 |
-
})
|
196 |
-
yield ping_event
|
197 |
|
198 |
def on_query_progress(data):
|
199 |
nonlocal total_output_tokens, response_text
|
@@ -204,23 +196,22 @@ def messages():
|
|
204 |
response_text.append(chunk)
|
205 |
chunk_tokens = calculate_tokens(chunk)
|
206 |
total_output_tokens += chunk_tokens
|
207 |
-
|
208 |
-
|
209 |
-
"index": 0,
|
210 |
-
"delta": {"type": "text_delta", "text": chunk},
|
211 |
-
})
|
212 |
-
logger.info("Sending content_block_delta event", extra={
|
213 |
-
'event_type': 'content_block_delta',
|
214 |
'data': {
|
215 |
'chunk': chunk,
|
216 |
'tokens': chunk_tokens,
|
217 |
-
'total_tokens': total_output_tokens
|
218 |
-
'content': delta_event
|
219 |
}
|
220 |
})
|
221 |
-
yield delta_event
|
222 |
|
223 |
if data.get('final', False):
|
|
|
|
|
|
|
|
|
|
|
|
|
224 |
response_event.set()
|
225 |
|
226 |
def on_connect():
|
@@ -255,13 +246,17 @@ def messages():
|
|
255 |
|
256 |
while not response_event.is_set():
|
257 |
sio.sleep(0.1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
258 |
|
259 |
except Exception as e:
|
260 |
-
logger.error(f"Error during socket connection: {str(e)}",
|
261 |
-
|
262 |
-
'data': {'error': str(e)}
|
263 |
-
})
|
264 |
-
yield create_event("content_block_delta", {
|
265 |
"type": "content_block_delta",
|
266 |
"index": 0,
|
267 |
"delta": {"type": "text_delta", "text": f"Error during socket connection: {str(e)}"},
|
@@ -270,38 +265,19 @@ def messages():
|
|
270 |
if sio.connected:
|
271 |
sio.disconnect()
|
272 |
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
'data': {'content': stop_event}
|
277 |
-
})
|
278 |
-
yield stop_event
|
279 |
-
|
280 |
-
message_delta_event = create_event("message_delta", {
|
281 |
"type": "message_delta",
|
282 |
"delta": {"stop_reason": "end_turn", "stop_sequence": None},
|
283 |
"usage": {"output_tokens": total_output_tokens},
|
284 |
})
|
285 |
-
|
286 |
-
'event_type': 'message_delta',
|
287 |
-
'data': {'content': message_delta_event}
|
288 |
-
})
|
289 |
-
yield message_delta_event
|
290 |
-
|
291 |
-
message_stop_event = create_event("message_stop", {"type": "message_stop"})
|
292 |
-
logger.info("Sending message_stop event", extra={
|
293 |
-
'event_type': 'message_stop',
|
294 |
-
'data': {'content': message_stop_event}
|
295 |
-
})
|
296 |
-
yield message_stop_event
|
297 |
|
298 |
return Response(generate(), content_type='text/event-stream')
|
299 |
|
300 |
except Exception as e:
|
301 |
-
logger.error(f"Request error: {str(e)}",
|
302 |
-
'event_type': 'request_error',
|
303 |
-
'data': {'error': str(e)}
|
304 |
-
})
|
305 |
log_request(request.remote_addr, request.path, 400)
|
306 |
return jsonify({"error": str(e)}), 400
|
307 |
|
|
|
162 |
def generate():
|
163 |
nonlocal total_output_tokens
|
164 |
|
165 |
+
def send_event(event_type, data):
|
166 |
+
event = create_event(event_type, data)
|
167 |
+
logger.info(f"Sending {event_type} event", extra={
|
168 |
+
'event_type': event_type,
|
169 |
+
'data': {'content': event}
|
170 |
+
})
|
171 |
+
yield event
|
172 |
+
|
173 |
+
# Send initial events
|
174 |
+
yield from send_event("message_start", {
|
175 |
"type": "message_start",
|
176 |
"message": {
|
177 |
"id": msg_id,
|
|
|
184 |
"usage": {"input_tokens": input_tokens, "output_tokens": total_output_tokens},
|
185 |
},
|
186 |
})
|
187 |
+
yield from send_event("content_block_start", {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}})
|
188 |
+
yield from send_event("ping", {"type": "ping"})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
189 |
|
190 |
def on_query_progress(data):
|
191 |
nonlocal total_output_tokens, response_text
|
|
|
196 |
response_text.append(chunk)
|
197 |
chunk_tokens = calculate_tokens(chunk)
|
198 |
total_output_tokens += chunk_tokens
|
199 |
+
logger.info("Received chunk", extra={
|
200 |
+
'event_type': 'chunk_received',
|
|
|
|
|
|
|
|
|
|
|
201 |
'data': {
|
202 |
'chunk': chunk,
|
203 |
'tokens': chunk_tokens,
|
204 |
+
'total_tokens': total_output_tokens
|
|
|
205 |
}
|
206 |
})
|
|
|
207 |
|
208 |
if data.get('final', False):
|
209 |
+
logger.info("Final response received", extra={
|
210 |
+
'event_type': 'response_complete',
|
211 |
+
'data': {
|
212 |
+
'total_tokens': total_output_tokens
|
213 |
+
}
|
214 |
+
})
|
215 |
response_event.set()
|
216 |
|
217 |
def on_connect():
|
|
|
246 |
|
247 |
while not response_event.is_set():
|
248 |
sio.sleep(0.1)
|
249 |
+
while response_text:
|
250 |
+
chunk = response_text.pop(0)
|
251 |
+
yield from send_event("content_block_delta", {
|
252 |
+
"type": "content_block_delta",
|
253 |
+
"index": 0,
|
254 |
+
"delta": {"type": "text_delta", "text": chunk},
|
255 |
+
})
|
256 |
|
257 |
except Exception as e:
|
258 |
+
logger.error(f"Error during socket connection: {str(e)}", exc_info=True)
|
259 |
+
yield from send_event("content_block_delta", {
|
|
|
|
|
|
|
260 |
"type": "content_block_delta",
|
261 |
"index": 0,
|
262 |
"delta": {"type": "text_delta", "text": f"Error during socket connection: {str(e)}"},
|
|
|
265 |
if sio.connected:
|
266 |
sio.disconnect()
|
267 |
|
268 |
+
# Send final events
|
269 |
+
yield from send_event("content_block_stop", {"type": "content_block_stop", "index": 0})
|
270 |
+
yield from send_event("message_delta", {
|
|
|
|
|
|
|
|
|
|
|
271 |
"type": "message_delta",
|
272 |
"delta": {"stop_reason": "end_turn", "stop_sequence": None},
|
273 |
"usage": {"output_tokens": total_output_tokens},
|
274 |
})
|
275 |
+
yield from send_event("message_stop", {"type": "message_stop"})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
276 |
|
277 |
return Response(generate(), content_type='text/event-stream')
|
278 |
|
279 |
except Exception as e:
|
280 |
+
logger.error(f"Request error: {str(e)}", exc_info=True)
|
|
|
|
|
|
|
281 |
log_request(request.remote_addr, request.path, 400)
|
282 |
return jsonify({"error": str(e)}), 400
|
283 |
|