Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -71,14 +71,20 @@ async def stream_or_async_response(messages: Union[Iterable[ResponseChunk], Asyn
|
|
| 71 |
layer_outputs = {}
|
| 72 |
|
| 73 |
async def process_message(message):
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
if layer not in layer_outputs:
|
| 78 |
layer_outputs[layer] = []
|
| 79 |
-
layer_outputs[layer].append(message
|
| 80 |
return "" # Intermediate messages don't contribute to the final response
|
| 81 |
-
elif message
|
| 82 |
# Final message processing
|
| 83 |
for layer, outputs in layer_outputs.items():
|
| 84 |
st.write(f"Layer {layer}")
|
|
@@ -87,22 +93,25 @@ async def stream_or_async_response(messages: Union[Iterable[ResponseChunk], Asyn
|
|
| 87 |
with cols[i]:
|
| 88 |
st.expander(label=f"Agent {i + 1}", expanded=False).write(output)
|
| 89 |
layer_outputs.clear()
|
| 90 |
-
return message
|
| 91 |
else:
|
| 92 |
-
|
|
|
|
|
|
|
| 93 |
|
| 94 |
# Check if the input is an async or sync iterable
|
| 95 |
if hasattr(messages, "__aiter__"): # Asynchronous iterable
|
| 96 |
async for message in messages:
|
| 97 |
resolved_message = await process_message(message)
|
| 98 |
-
yield resolved_message
|
| 99 |
elif hasattr(messages, "__iter__"): # Synchronous iterable
|
| 100 |
for message in messages:
|
| 101 |
resolved_message = process_message(message) # Do not `await` sync messages
|
| 102 |
-
yield resolved_message
|
| 103 |
else:
|
| 104 |
raise TypeError("'messages' must be an Iterable or AsyncIterable.")
|
| 105 |
|
|
|
|
| 106 |
# Set up the MOAgent
|
| 107 |
def set_moa_agent(
|
| 108 |
main_model: str = default_config['main_model'],
|
|
@@ -267,20 +276,28 @@ if query := st.chat_input("Ask a question"):
|
|
| 267 |
|
| 268 |
# Get messages from MOAgent (supports async streaming)
|
| 269 |
messages = moa_agent.chat(query, output_format='json')
|
| 270 |
-
|
| 271 |
try:
|
| 272 |
# Stream and display responses from `stream_or_async_response`
|
| 273 |
final_response = ""
|
| 274 |
async for response in stream_or_async_response(messages):
|
| 275 |
# Skip None or empty responses
|
| 276 |
-
if response:
|
| 277 |
final_response += response
|
| 278 |
message_placeholder.markdown(final_response)
|
|
|
|
|
|
|
|
|
|
| 279 |
|
| 280 |
# Save the final response to session state
|
| 281 |
-
|
|
|
|
|
|
|
|
|
|
| 282 |
except Exception as e:
|
| 283 |
st.error(f"Error processing response: {e}")
|
|
|
|
|
|
|
| 284 |
|
| 285 |
# Run the asynchronous handle_query function
|
| 286 |
asyncio.run(handle_query())
|
|
@@ -288,6 +305,7 @@ if query := st.chat_input("Ask a question"):
|
|
| 288 |
|
| 289 |
|
| 290 |
|
|
|
|
| 291 |
# Add acknowledgment at the bottom
|
| 292 |
st.markdown("---")
|
| 293 |
st.markdown("""
|
|
|
|
| 71 |
layer_outputs = {}
|
| 72 |
|
| 73 |
async def process_message(message):
|
| 74 |
+
"""
|
| 75 |
+
Process an individual message and return the content for streaming.
|
| 76 |
+
Returns an empty string if the message type is intermediate or invalid.
|
| 77 |
+
"""
|
| 78 |
+
# Debug: Log the incoming message
|
| 79 |
+
st.write(f"Processing message: {message}")
|
| 80 |
+
|
| 81 |
+
if message.get('response_type') == 'intermediate':
|
| 82 |
+
layer = message['metadata'].get('layer', "Unknown")
|
| 83 |
if layer not in layer_outputs:
|
| 84 |
layer_outputs[layer] = []
|
| 85 |
+
layer_outputs[layer].append(message.get('delta', ""))
|
| 86 |
return "" # Intermediate messages don't contribute to the final response
|
| 87 |
+
elif message.get('response_type') == 'final':
|
| 88 |
# Final message processing
|
| 89 |
for layer, outputs in layer_outputs.items():
|
| 90 |
st.write(f"Layer {layer}")
|
|
|
|
| 93 |
with cols[i]:
|
| 94 |
st.expander(label=f"Agent {i + 1}", expanded=False).write(output)
|
| 95 |
layer_outputs.clear()
|
| 96 |
+
return message.get('delta', "") # Ensure no None value is returned
|
| 97 |
else:
|
| 98 |
+
# Debug: Log unexpected message types
|
| 99 |
+
st.write(f"Unexpected message type: {message}")
|
| 100 |
+
return "" # Default to empty string for invalid types
|
| 101 |
|
| 102 |
# Check if the input is an async or sync iterable
|
| 103 |
if hasattr(messages, "__aiter__"): # Asynchronous iterable
|
| 104 |
async for message in messages:
|
| 105 |
resolved_message = await process_message(message)
|
| 106 |
+
yield resolved_message or "" # Yield empty string if None
|
| 107 |
elif hasattr(messages, "__iter__"): # Synchronous iterable
|
| 108 |
for message in messages:
|
| 109 |
resolved_message = process_message(message) # Do not `await` sync messages
|
| 110 |
+
yield resolved_message or "" # Yield empty string if None
|
| 111 |
else:
|
| 112 |
raise TypeError("'messages' must be an Iterable or AsyncIterable.")
|
| 113 |
|
| 114 |
+
|
| 115 |
# Set up the MOAgent
|
| 116 |
def set_moa_agent(
|
| 117 |
main_model: str = default_config['main_model'],
|
|
|
|
| 276 |
|
| 277 |
# Get messages from MOAgent (supports async streaming)
|
| 278 |
messages = moa_agent.chat(query, output_format='json')
|
| 279 |
+
|
| 280 |
try:
|
| 281 |
# Stream and display responses from `stream_or_async_response`
|
| 282 |
final_response = ""
|
| 283 |
async for response in stream_or_async_response(messages):
|
| 284 |
# Skip None or empty responses
|
| 285 |
+
if response is not None and response.strip():
|
| 286 |
final_response += response
|
| 287 |
message_placeholder.markdown(final_response)
|
| 288 |
+
else:
|
| 289 |
+
# Debug: Log skipped empty/None responses
|
| 290 |
+
st.write(f"Skipped empty or None response: {response}")
|
| 291 |
|
| 292 |
# Save the final response to session state
|
| 293 |
+
if final_response.strip(): # Only save non-empty responses
|
| 294 |
+
st.session_state.messages.append({"role": "assistant", "content": final_response})
|
| 295 |
+
else:
|
| 296 |
+
st.error("Received no valid response from the assistant.")
|
| 297 |
except Exception as e:
|
| 298 |
st.error(f"Error processing response: {e}")
|
| 299 |
+
# Debug: Log the exception
|
| 300 |
+
st.write(f"Exception details: {e}")
|
| 301 |
|
| 302 |
# Run the asynchronous handle_query function
|
| 303 |
asyncio.run(handle_query())
|
|
|
|
| 305 |
|
| 306 |
|
| 307 |
|
| 308 |
+
|
| 309 |
# Add acknowledgment at the bottom
|
| 310 |
st.markdown("---")
|
| 311 |
st.markdown("""
|