Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -249,6 +249,7 @@ class WritableQueue:
|
|
| 249 |
pass
|
| 250 |
# --- END OF HELPER CLASS ---
|
| 251 |
|
|
|
|
| 252 |
# --- REPLACE THE EXISTING run_agent_wrapper FUNCTION WITH THIS ---
|
| 253 |
|
| 254 |
def agent_thread_func(agent, query, log_queue, result_queue):
|
|
@@ -270,26 +271,31 @@ def agent_thread_func(agent, query, log_queue, result_queue):
|
|
| 270 |
# Signal that logging is finished by putting None in the log queue
|
| 271 |
log_queue.put(None)
|
| 272 |
|
| 273 |
-
#
|
| 274 |
-
|
|
|
|
| 275 |
"""
|
| 276 |
Runs the agent in a thread, captures stdout via a queue, and yields updates
|
| 277 |
-
for Gradio streaming. Uses Chatbot format for reasoning.
|
| 278 |
-
|
| 279 |
"""
|
| 280 |
if height_agent is None:
|
| 281 |
error_msg = initialization_error_message or "Agent not initialized."
|
| 282 |
-
|
|
|
|
| 283 |
return # Stop the generator
|
| 284 |
|
| 285 |
log_queue = queue.Queue()
|
| 286 |
result_queue = queue.Queue()
|
| 287 |
-
|
|
|
|
|
|
|
| 288 |
current_log_message = "" # Accumulate lines into one message block
|
| 289 |
final_answer = "⏳ Running..." # Initial status
|
| 290 |
|
| 291 |
# Initial yield to clear previous state and show "Running"
|
| 292 |
-
|
|
|
|
| 293 |
|
| 294 |
# Start the agent thread
|
| 295 |
thread = threading.Thread(
|
|
@@ -307,13 +313,12 @@ def run_agent_wrapper(query: str) -> Iterator[Tuple[List[Tuple[str, str]], str]]
|
|
| 307 |
break
|
| 308 |
|
| 309 |
# Append new line to the current log message block
|
| 310 |
-
|
|
|
|
|
|
|
| 311 |
# Update the chatbot history: Replace the last message or add a new one
|
| 312 |
-
#
|
| 313 |
-
|
| 314 |
-
chatbot_history[-1] = (None, current_log_message) # Update last bot message
|
| 315 |
-
else:
|
| 316 |
-
chatbot_history.append((None, current_log_message)) # Add new bot message if history is empty or last was user
|
| 317 |
|
| 318 |
yield (chatbot_history, final_answer) # Yield updated log
|
| 319 |
|
|
@@ -323,13 +328,15 @@ def run_agent_wrapper(query: str) -> Iterator[Tuple[List[Tuple[str, str]], str]]
|
|
| 323 |
if not thread.is_alive() and result_queue.empty():
|
| 324 |
print("Warning: Agent thread finished unexpectedly without result.")
|
| 325 |
# Attempt to retrieve any remaining logs
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
|
|
|
|
|
|
| 333 |
final_answer = "Error: Agent stopped unexpectedly."
|
| 334 |
yield (chatbot_history, final_answer)
|
| 335 |
return # Stop
|
|
@@ -345,25 +352,25 @@ def run_agent_wrapper(query: str) -> Iterator[Tuple[List[Tuple[str, str]], str]]
|
|
| 345 |
if isinstance(final_result, Exception):
|
| 346 |
final_answer = f"Error during execution: {final_result}"
|
| 347 |
# Append error to the chatbot log
|
| 348 |
-
error_log = f"\n--- EXECUTION ERROR ---\n{final_result}"
|
| 349 |
current_log_message += error_log
|
| 350 |
-
|
| 351 |
-
chatbot_history[-1] = (None, current_log_message)
|
| 352 |
-
else:
|
| 353 |
-
chatbot_history.append((None, current_log_message))
|
| 354 |
else:
|
| 355 |
-
final_answer = final_result
|
| 356 |
|
| 357 |
# Final yield with the complete log and the final answer
|
|
|
|
|
|
|
| 358 |
yield (chatbot_history, final_answer)
|
| 359 |
|
|
|
|
|
|
|
| 360 |
# --- Build Gradio Interface Manually with gr.Blocks ---
|
| 361 |
print("--- Building Gradio Interface with gr.Blocks ---")
|
| 362 |
|
| 363 |
# Make sure theme is applied correctly if desired
|
| 364 |
# theme = gr.themes.Default() # Or another theme
|
| 365 |
# with gr.Blocks(theme=theme, css="footer {visibility: hidden}") as demo:
|
| 366 |
-
# --- MODIFY THE gr.Blocks SECTION ---
|
| 367 |
|
| 368 |
with gr.Blocks(css="footer {visibility: hidden}") as demo:
|
| 369 |
gr.Markdown("# Height Comparison Agent")
|
|
@@ -381,13 +388,13 @@ with gr.Blocks(css="footer {visibility: hidden}") as demo:
|
|
| 381 |
# --- CHANGE THIS ---
|
| 382 |
# reasoning_output = gr.Code(label="Reasoning Log", language="markdown", interactive=False, lines=20)
|
| 383 |
reasoning_output_chatbot = gr.Chatbot(
|
| 384 |
-
|
| 385 |
-
|
|
|
|
|
|
|
| 386 |
)
|
| 387 |
-
# --- END OF CHANGE ---
|
| 388 |
|
| 389 |
|
| 390 |
-
# --- CHANGE THIS ---
|
| 391 |
# Link components - ensure outputs match the function's yield tuple order
|
| 392 |
submit_button.click(
|
| 393 |
fn=run_agent_wrapper,
|
|
|
|
| 249 |
pass
|
| 250 |
# --- END OF HELPER CLASS ---
|
| 251 |
|
| 252 |
+
# --- REPLACE THE EXISTING run_agent_wrapper FUNCTION WITH THIS ---
|
| 253 |
# --- REPLACE THE EXISTING run_agent_wrapper FUNCTION WITH THIS ---
|
| 254 |
|
| 255 |
def agent_thread_func(agent, query, log_queue, result_queue):
|
|
|
|
| 271 |
# Signal that logging is finished by putting None in the log queue
|
| 272 |
log_queue.put(None)
|
| 273 |
|
| 274 |
+
# Generator function for Gradio streaming
|
| 275 |
+
# REMOVED the return type hint -> Iterator[...]
|
| 276 |
+
def run_agent_wrapper(query: str):
|
| 277 |
"""
|
| 278 |
Runs the agent in a thread, captures stdout via a queue, and yields updates
|
| 279 |
+
for Gradio streaming. Uses Chatbot 'messages' format for reasoning.
|
| 280 |
+
Yields: (chatbot_history, final_answer_status)
|
| 281 |
"""
|
| 282 |
if height_agent is None:
|
| 283 |
error_msg = initialization_error_message or "Agent not initialized."
|
| 284 |
+
# Yield error in the 'messages' format
|
| 285 |
+
yield ([{"role": "assistant", "content": error_msg}], "Error: Agent not initialized.")
|
| 286 |
return # Stop the generator
|
| 287 |
|
| 288 |
log_queue = queue.Queue()
|
| 289 |
result_queue = queue.Queue()
|
| 290 |
+
# History will be a list of dictionaries: [{"role": "assistant", "content": "..."}]
|
| 291 |
+
# We'll just use one dictionary and update its content for the streaming log
|
| 292 |
+
chatbot_history = []
|
| 293 |
current_log_message = "" # Accumulate lines into one message block
|
| 294 |
final_answer = "⏳ Running..." # Initial status
|
| 295 |
|
| 296 |
# Initial yield to clear previous state and show "Running"
|
| 297 |
+
# Yield empty history initially, or a starting message
|
| 298 |
+
yield ([], final_answer)
|
| 299 |
|
| 300 |
# Start the agent thread
|
| 301 |
thread = threading.Thread(
|
|
|
|
| 313 |
break
|
| 314 |
|
| 315 |
# Append new line to the current log message block
|
| 316 |
+
# Add line breaks for readability in the chatbot
|
| 317 |
+
current_log_message += log_line + "\n"
|
| 318 |
+
|
| 319 |
# Update the chatbot history: Replace the last message or add a new one
|
| 320 |
+
# Simplified: Update a single assistant message with the whole log
|
| 321 |
+
chatbot_history = [{"role": "assistant", "content": current_log_message}]
|
|
|
|
|
|
|
|
|
|
| 322 |
|
| 323 |
yield (chatbot_history, final_answer) # Yield updated log
|
| 324 |
|
|
|
|
| 328 |
if not thread.is_alive() and result_queue.empty():
|
| 329 |
print("Warning: Agent thread finished unexpectedly without result.")
|
| 330 |
# Attempt to retrieve any remaining logs
|
| 331 |
+
try:
|
| 332 |
+
while True: # Get all remaining logs
|
| 333 |
+
log_line = log_queue.get_nowait()
|
| 334 |
+
if log_line: current_log_message += log_line + "\n"
|
| 335 |
+
else: break # Should not happen if None was already processed, but safety
|
| 336 |
+
except queue.Empty:
|
| 337 |
+
pass # No more logs
|
| 338 |
+
current_log_message += "\nError: Agent stopped unexpectedly."
|
| 339 |
+
chatbot_history = [{"role": "assistant", "content": current_log_message}]
|
| 340 |
final_answer = "Error: Agent stopped unexpectedly."
|
| 341 |
yield (chatbot_history, final_answer)
|
| 342 |
return # Stop
|
|
|
|
| 352 |
if isinstance(final_result, Exception):
|
| 353 |
final_answer = f"Error during execution: {final_result}"
|
| 354 |
# Append error to the chatbot log
|
| 355 |
+
error_log = f"\n\n--- EXECUTION ERROR ---\n{final_result}"
|
| 356 |
current_log_message += error_log
|
| 357 |
+
chatbot_history = [{"role": "assistant", "content": current_log_message}]
|
|
|
|
|
|
|
|
|
|
| 358 |
else:
|
| 359 |
+
final_answer = final_result # This is the actual final answer string
|
| 360 |
|
| 361 |
# Final yield with the complete log and the final answer
|
| 362 |
+
# Ensure history is in the correct format before the final yield
|
| 363 |
+
chatbot_history = [{"role": "assistant", "content": current_log_message}]
|
| 364 |
yield (chatbot_history, final_answer)
|
| 365 |
|
| 366 |
+
# --- END OF REPLACEMENT ---
|
| 367 |
+
|
| 368 |
# --- Build Gradio Interface Manually with gr.Blocks ---
|
| 369 |
print("--- Building Gradio Interface with gr.Blocks ---")
|
| 370 |
|
| 371 |
# Make sure theme is applied correctly if desired
|
| 372 |
# theme = gr.themes.Default() # Or another theme
|
| 373 |
# with gr.Blocks(theme=theme, css="footer {visibility: hidden}") as demo:
|
|
|
|
| 374 |
|
| 375 |
with gr.Blocks(css="footer {visibility: hidden}") as demo:
|
| 376 |
gr.Markdown("# Height Comparison Agent")
|
|
|
|
| 388 |
# --- CHANGE THIS ---
|
| 389 |
# reasoning_output = gr.Code(label="Reasoning Log", language="markdown", interactive=False, lines=20)
|
| 390 |
reasoning_output_chatbot = gr.Chatbot(
|
| 391 |
+
label="Reasoning Log",
|
| 392 |
+
height=500,
|
| 393 |
+
type="messages" # <<< ADD THIS
|
| 394 |
+
`)
|
| 395 |
)
|
|
|
|
| 396 |
|
| 397 |
|
|
|
|
| 398 |
# Link components - ensure outputs match the function's yield tuple order
|
| 399 |
submit_button.click(
|
| 400 |
fn=run_agent_wrapper,
|