Spaces:
Sleeping
Sleeping
Upload custom_rich_aworld_ui.py
Browse files
examples/stream/custom/custom_rich_aworld_ui.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import asyncio
|
| 2 |
+
import time
|
| 3 |
+
from dataclasses import dataclass, field
|
| 4 |
+
from time import sleep
|
| 5 |
+
|
| 6 |
+
from rich.table import Table
|
| 7 |
+
|
| 8 |
+
from aworld.output.utils import consume_content
|
| 9 |
+
from rich.status import Status
|
| 10 |
+
from rich.console import Console
|
| 11 |
+
|
| 12 |
+
from aworld.output import MessageOutput, WorkSpace
|
| 13 |
+
from aworld.output.base import StepOutput, ToolResultOutput
|
| 14 |
+
from aworld.output.ui.base import AworldUI
|
| 15 |
+
|
| 16 |
+
@dataclass
|
| 17 |
+
class RichAworldUI(AworldUI):
|
| 18 |
+
console: Console = field(default_factory=Console)
|
| 19 |
+
status: Status = None
|
| 20 |
+
workspace: WorkSpace = None
|
| 21 |
+
|
| 22 |
+
async def message_output(self, __output__: MessageOutput):
|
| 23 |
+
result = []
|
| 24 |
+
async def __log_item(item):
|
| 25 |
+
result.append(item)
|
| 26 |
+
self.console.print(item, end="")
|
| 27 |
+
|
| 28 |
+
if __output__.reason_generator or __output__.response_generator:
|
| 29 |
+
if __output__.reason_generator:
|
| 30 |
+
await consume_content(__output__.reason_generator, __log_item)
|
| 31 |
+
if __output__.reason_generator:
|
| 32 |
+
await consume_content(__output__.response_generator, __log_item)
|
| 33 |
+
else:
|
| 34 |
+
await consume_content(__output__.reasoning, __log_item)
|
| 35 |
+
await consume_content(__output__.response, __log_item)
|
| 36 |
+
# if __output__.tool_calls:
|
| 37 |
+
# await consume_content(__output__.tool_calls, __log_item)
|
| 38 |
+
self.console.print("")
|
| 39 |
+
|
| 40 |
+
async def tool_result(self, output: ToolResultOutput):
|
| 41 |
+
"""
|
| 42 |
+
tool_result
|
| 43 |
+
"""
|
| 44 |
+
table = Table(show_header=False, header_style="bold magenta", title=f"Call Tools#ID_{output.origin_tool_call.id}")
|
| 45 |
+
table.add_column("name", style="dim", width=12)
|
| 46 |
+
table.add_column("content")
|
| 47 |
+
table.add_row("function_name", output.origin_tool_call.function.name)
|
| 48 |
+
table.add_row("arguments", output.origin_tool_call.function.arguments)
|
| 49 |
+
table.add_row("result", output.data)
|
| 50 |
+
self.console.print(table)
|
| 51 |
+
|
| 52 |
+
async def step(self, output: StepOutput):
|
| 53 |
+
if output.status == "START":
|
| 54 |
+
self.console.print(f"[bold green]{output.name} ✈️START ...")
|
| 55 |
+
self.status = self.console.status(f"[bold green]{output.name} RUNNING ...")
|
| 56 |
+
self.status.start()
|
| 57 |
+
elif output.status == "FINISHED":
|
| 58 |
+
self.status.stop()
|
| 59 |
+
self.console.print(f"[bold green]{output.name} 🛬FINISHED ...")
|
| 60 |
+
elif output.status == "FAILED":
|
| 61 |
+
self.status.stop()
|
| 62 |
+
self.console.print(f"[bold red]{output.name} 💥FAILED ...")
|
| 63 |
+
else:
|
| 64 |
+
self.status.stop()
|
| 65 |
+
self.console.print(f"============={output.name} ❓❓❓UNKNOWN#{output.status} ======================")
|