@@ -2904,7 +2904,8 @@ def result_requires_message_reload(result: Any) -> bool:
29042904 'conversation_id' : conversation_id ,
29052905 'conversation_title' : conversation_item ['title' ],
29062906 'model_deployment_name' : image_gen_model ,
2907- 'message_id' : image_message_id
2907+ 'message_id' : image_message_id ,
2908+ 'user_message_id' : user_message_id
29082909 }), 200
29092910 except Exception as e :
29102911 debug_print (f"Image generation error: { str (e )} " )
@@ -4361,6 +4362,94 @@ def chat_stream_api():
43614362 request_start_time = time .time ()
43624363 except Exception as e :
43634364 return jsonify ({'error' : f'Failed to parse request: { str (e )} ' }), 400
4365+
4366+ compatibility_mode = bool (data .get ('image_generation' )) or bool (
4367+ data .get ('retry_user_message_id' ) or data .get ('edited_user_message_id' )
4368+ )
4369+
4370+ def normalize_legacy_chat_payload (payload ):
4371+ """Convert the legacy JSON response shape into the streaming terminal payload."""
4372+ return {
4373+ 'done' : True ,
4374+ 'conversation_id' : payload .get ('conversation_id' ),
4375+ 'conversation_title' : payload .get ('conversation_title' ),
4376+ 'classification' : payload .get ('classification' , []),
4377+ 'model_deployment_name' : payload .get ('model_deployment_name' ),
4378+ 'message_id' : payload .get ('message_id' ),
4379+ 'user_message_id' : payload .get ('user_message_id' ),
4380+ 'augmented' : payload .get ('augmented' , False ),
4381+ 'hybrid_citations' : payload .get ('hybrid_citations' , []),
4382+ 'web_search_citations' : payload .get ('web_search_citations' , []),
4383+ 'agent_citations' : payload .get ('agent_citations' , []),
4384+ 'agent_display_name' : payload .get ('agent_display_name' ),
4385+ 'agent_name' : payload .get ('agent_name' ),
4386+ 'full_content' : payload .get ('reply' , '' ),
4387+ 'image_url' : payload .get ('image_url' ),
4388+ 'reload_messages' : payload .get ('reload_messages' , False ),
4389+ 'kernel_fallback_notice' : payload .get ('kernel_fallback_notice' ),
4390+ 'thoughts_enabled' : payload .get ('thoughts_enabled' , False ),
4391+ 'blocked' : payload .get ('blocked' , False ),
4392+ }
4393+
4394+ def generate_compatibility_response ():
4395+ """Bridge legacy JSON chat handling into a terminal SSE event for parity cases."""
4396+ try :
4397+ if data .get ('image_generation' ):
4398+ prompt_text = (data .get ('message' ) or '' ).strip ()
4399+ prompt_preview = prompt_text [:120 ] + '...' if len (prompt_text ) > 120 else prompt_text
4400+
4401+ yield f"data: { json .dumps ({
4402+ 'type' : 'thought' ,
4403+ 'step_type' : 'generation' ,
4404+ 'content' : f'Generating image based on \" { prompt_preview } \" ' if prompt_preview else 'Generating image from your prompt'
4405+ })} \n \n "
4406+
4407+ yield f"data: { json .dumps ({
4408+ 'type' : 'thought' ,
4409+ 'step_type' : 'generation' ,
4410+ 'content' : 'Preparing image model request'
4411+ })} \n \n "
4412+
4413+ legacy_result = chat_api ()
4414+ legacy_response = legacy_result
4415+ status_code = 200
4416+
4417+ if isinstance (legacy_result , tuple ):
4418+ legacy_response = legacy_result [0 ]
4419+ if len (legacy_result ) > 1 and isinstance (legacy_result [1 ], int ):
4420+ status_code = legacy_result [1 ]
4421+
4422+ if hasattr (legacy_response , 'get_json' ):
4423+ payload = legacy_response .get_json (silent = True ) or {}
4424+ else :
4425+ payload = {}
4426+
4427+ if status_code >= 400 :
4428+ error_message = payload .get ('error' ) or f'Compatibility chat request failed ({ status_code } )'
4429+ yield f"data: { json .dumps ({'error' : error_message })} \n \n "
4430+ return
4431+
4432+ if payload .get ('image_url' ):
4433+ yield f"data: { json .dumps ({
4434+ 'type' : 'thought' ,
4435+ 'step_type' : 'generation' ,
4436+ 'content' : 'Image generated and ready to display'
4437+ })} \n \n "
4438+
4439+ yield f"data: { json .dumps (normalize_legacy_chat_payload (payload ))} \n \n "
4440+ except Exception as compatibility_error :
4441+ yield f"data: { json .dumps ({'error' : str (compatibility_error )})} \n \n "
4442+
4443+ if compatibility_mode :
4444+ return Response (
4445+ stream_with_context (generate_compatibility_response ()),
4446+ mimetype = 'text/event-stream' ,
4447+ headers = {
4448+ 'Cache-Control' : 'no-cache' ,
4449+ 'X-Accel-Buffering' : 'no' ,
4450+ 'Connection' : 'keep-alive'
4451+ }
4452+ )
43644453
43654454 def generate ():
43664455 try :
0 commit comments