Show in tui and nextjs app what is being requested from a skill
This commit is contained in:
parent
492f5cf1e4
commit
cb5935a6fa
3 changed files with 44 additions and 1 deletions
|
|
@ -152,6 +152,8 @@ function ToolCallIndicator({
|
||||||
return <MessageIcon />;
|
return <MessageIcon />;
|
||||||
case "get_document":
|
case "get_document":
|
||||||
return <FileIcon />;
|
return <FileIcon />;
|
||||||
|
case "execute_skill":
|
||||||
|
return <MessageIcon />;
|
||||||
default:
|
default:
|
||||||
return <SearchIcon />;
|
return <SearchIcon />;
|
||||||
}
|
}
|
||||||
|
|
@ -165,6 +167,8 @@ function ToolCallIndicator({
|
||||||
return "Ask";
|
return "Ask";
|
||||||
case "get_document":
|
case "get_document":
|
||||||
return "Document";
|
return "Document";
|
||||||
|
case "execute_skill":
|
||||||
|
return "Skill";
|
||||||
case "analyze":
|
case "analyze":
|
||||||
return "Analyze";
|
return "Analyze";
|
||||||
case "research":
|
case "research":
|
||||||
|
|
@ -176,6 +180,16 @@ function ToolCallIndicator({
|
||||||
|
|
||||||
const getDescription = () => {
|
const getDescription = () => {
|
||||||
switch (toolName) {
|
switch (toolName) {
|
||||||
|
case "execute_skill": {
|
||||||
|
const skill = args.skill_name as string | undefined;
|
||||||
|
const request = args.request as string | undefined;
|
||||||
|
return (
|
||||||
|
<span className="tool-query">
|
||||||
|
{skill ? `${skill}: ` : ""}
|
||||||
|
{request ?? "Processing..."}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
case "search": {
|
case "search": {
|
||||||
const query = args.query as string;
|
const query = args.query as string;
|
||||||
return <span className="tool-query">{query}</span>;
|
return <span className="tool-query">{query}</span>;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
# pyright: reportPossiblyUnboundVariable=false
|
# pyright: reportPossiblyUnboundVariable=false
|
||||||
import asyncio
|
import asyncio
|
||||||
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
from collections.abc import Iterable
|
from collections.abc import Iterable
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
@ -32,6 +33,7 @@ try:
|
||||||
RunAgentInput,
|
RunAgentInput,
|
||||||
StateDeltaEvent,
|
StateDeltaEvent,
|
||||||
TextMessageContentEvent,
|
TextMessageContentEvent,
|
||||||
|
ToolCallArgsEvent,
|
||||||
ToolCallEndEvent,
|
ToolCallEndEvent,
|
||||||
ToolCallStartEvent,
|
ToolCallStartEvent,
|
||||||
UserMessage,
|
UserMessage,
|
||||||
|
|
@ -218,6 +220,7 @@ class ChatApp(App):
|
||||||
|
|
||||||
message = None
|
message = None
|
||||||
accumulated_text = ""
|
accumulated_text = ""
|
||||||
|
tool_args_deltas: dict[str, str] = {}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
async for event in adapter.run_stream():
|
async for event in adapter.run_stream():
|
||||||
|
|
@ -249,7 +252,18 @@ class ChatApp(App):
|
||||||
await chat_history.add_tool_call(
|
await chat_history.add_tool_call(
|
||||||
event.tool_call_id, event.tool_call_name
|
event.tool_call_id, event.tool_call_name
|
||||||
)
|
)
|
||||||
|
tool_args_deltas[event.tool_call_id] = ""
|
||||||
await chat_history.show_thinking("Executing tasks...")
|
await chat_history.show_thinking("Executing tasks...")
|
||||||
|
elif event.type == EventType.TOOL_CALL_ARGS:
|
||||||
|
assert isinstance(event, ToolCallArgsEvent)
|
||||||
|
tool_args_deltas[event.tool_call_id] = (
|
||||||
|
tool_args_deltas.get(event.tool_call_id, "") + event.delta
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
args = json.loads(tool_args_deltas[event.tool_call_id])
|
||||||
|
chat_history.update_tool_args(event.tool_call_id, args)
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
pass
|
||||||
elif event.type == EventType.TOOL_CALL_END:
|
elif event.type == EventType.TOOL_CALL_END:
|
||||||
assert isinstance(event, ToolCallEndEvent)
|
assert isinstance(event, ToolCallEndEvent)
|
||||||
chat_history.mark_tool_complete(event.tool_call_id)
|
chat_history.mark_tool_complete(event.tool_call_id)
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,12 @@ class ToolCallWidget(Static):
|
||||||
yield Static(desc, classes="tool-desc")
|
yield Static(desc, classes="tool-desc")
|
||||||
|
|
||||||
def _build_description(self) -> str:
|
def _build_description(self) -> str:
|
||||||
if self.tool_name == "search":
|
if self.tool_name == "execute_skill":
|
||||||
|
skill = self.args.get("skill_name", "")
|
||||||
|
request = self.args.get("request", "...")
|
||||||
|
prefix = f"{skill}: " if skill else ""
|
||||||
|
return f'{prefix}"{request}"'
|
||||||
|
elif self.tool_name == "search":
|
||||||
query = self.args.get("query", "...")
|
query = self.args.get("query", "...")
|
||||||
return f'"{query}"'
|
return f'"{query}"'
|
||||||
elif self.tool_name == "ask":
|
elif self.tool_name == "ask":
|
||||||
|
|
@ -72,6 +77,10 @@ class ToolCallWidget(Static):
|
||||||
return str(self.args)
|
return str(self.args)
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
def update_args(self, args: dict[str, Any]) -> None:
|
||||||
|
self.args = args
|
||||||
|
self.refresh(recompose=True)
|
||||||
|
|
||||||
def mark_completed(self) -> None:
|
def mark_completed(self) -> None:
|
||||||
self._completed = True
|
self._completed = True
|
||||||
self.refresh(recompose=True)
|
self.refresh(recompose=True)
|
||||||
|
|
@ -333,6 +342,12 @@ class ChatHistory(VerticalScroll):
|
||||||
self.scroll_end(animate=False)
|
self.scroll_end(animate=False)
|
||||||
return widget
|
return widget
|
||||||
|
|
||||||
|
def update_tool_args(self, tool_call_id: str, args: dict[str, Any]) -> None:
|
||||||
|
"""Update the args of a tool call widget."""
|
||||||
|
widget = self._tool_widgets.get(tool_call_id)
|
||||||
|
if widget:
|
||||||
|
widget.update_args(args)
|
||||||
|
|
||||||
def mark_tool_complete(self, tool_call_id: str) -> None:
|
def mark_tool_complete(self, tool_call_id: str) -> None:
|
||||||
"""Mark a tool call as complete by its ID."""
|
"""Mark a tool call as complete by its ID."""
|
||||||
widget = self._tool_widgets.get(tool_call_id)
|
widget = self._tool_widgets.get(tool_call_id)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue