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} ======================")
|