feat: show detailed tool call args in gateway based on config

Issue #263: Telegram/Discord/WhatsApp/Slack now show tool call details
based on display.tool_progress in config.yaml.

Changes:
- gateway/run.py: 'verbose' mode shows full args (keys + JSON, 200 char
  max). 'all' mode preview increased from 40 to 80 chars. Added missing
  tool emojis (execute_code, delegate_task, clarify, skill_manage,
  search_files).
- agent/display.py: Added execute_code, delegate_task, clarify,
  skill_manage to primary_args. Added 'code' and 'goal' to fallback keys.
- run_agent.py: Pass function_args dict to tool_progress_callback so
  gateway can format based on its own verbosity config.

Config usage:
  display:
    tool_progress: verbose  # off | new | all | verbose
This commit is contained in:
teknium1 2026-03-02 05:23:15 -08:00
parent 7652afb8de
commit 3c13feed4c
3 changed files with 23 additions and 6 deletions

View file

@ -31,6 +31,8 @@ def build_tool_preview(tool_name: str, args: dict, max_len: int = 40) -> str:
"vision_analyze": "question", "mixture_of_agents": "user_prompt", "vision_analyze": "question", "mixture_of_agents": "user_prompt",
"skill_view": "name", "skills_list": "category", "skill_view": "name", "skills_list": "category",
"schedule_cronjob": "name", "schedule_cronjob": "name",
"execute_code": "code", "delegate_task": "goal",
"clarify": "question", "skill_manage": "name",
} }
if tool_name == "process": if tool_name == "process":
@ -97,7 +99,7 @@ def build_tool_preview(tool_name: str, args: dict, max_len: int = 40) -> str:
key = primary_args.get(tool_name) key = primary_args.get(tool_name)
if not key: if not key:
for fallback_key in ("query", "text", "command", "path", "name", "prompt"): for fallback_key in ("query", "text", "command", "path", "name", "prompt", "code", "goal"):
if fallback_key in args: if fallback_key in args:
key = fallback_key key = fallback_key
break break

View file

@ -1672,7 +1672,7 @@ class GatewayRunner:
progress_queue = queue.Queue() if tool_progress_enabled else None progress_queue = queue.Queue() if tool_progress_enabled else None
last_tool = [None] # Mutable container for tracking in closure last_tool = [None] # Mutable container for tracking in closure
def progress_callback(tool_name: str, preview: str = None): def progress_callback(tool_name: str, preview: str = None, args: dict = None):
"""Callback invoked by agent when a tool is called.""" """Callback invoked by agent when a tool is called."""
if not progress_queue: if not progress_queue:
return return
@ -1692,6 +1692,7 @@ class GatewayRunner:
"write_file": "✍️", "write_file": "✍️",
"patch": "🔧", "patch": "🔧",
"search": "🔎", "search": "🔎",
"search_files": "🔎",
"list_directory": "📂", "list_directory": "📂",
"image_generate": "🎨", "image_generate": "🎨",
"text_to_speech": "🔊", "text_to_speech": "🔊",
@ -1717,14 +1718,28 @@ class GatewayRunner:
"schedule_cronjob": "", "schedule_cronjob": "",
"list_cronjobs": "", "list_cronjobs": "",
"remove_cronjob": "", "remove_cronjob": "",
"execute_code": "🐍",
"delegate_task": "🔀",
"clarify": "",
"skill_manage": "📝",
} }
emoji = tool_emojis.get(tool_name, "⚙️") emoji = tool_emojis.get(tool_name, "⚙️")
# Verbose mode: show detailed arguments
if progress_mode == "verbose" and args:
import json as _json
args_str = _json.dumps(args, ensure_ascii=False, default=str)
if len(args_str) > 200:
args_str = args_str[:197] + "..."
msg = f"{emoji} {tool_name}({list(args.keys())})\n{args_str}"
progress_queue.put(msg)
return
if preview: if preview:
# Truncate preview to keep messages clean # Truncate preview to keep messages clean
if len(preview) > 40: if len(preview) > 80:
preview = preview[:37] + "..." preview = preview[:77] + "..."
msg = f"{emoji} {tool_name}... \"{preview}\"" msg = f"{emoji} {tool_name}: \"{preview}\""
else: else:
msg = f"{emoji} {tool_name}..." msg = f"{emoji} {tool_name}..."

View file

@ -2442,7 +2442,7 @@ class AIAgent:
if self.tool_progress_callback: if self.tool_progress_callback:
try: try:
preview = _build_tool_preview(function_name, function_args) preview = _build_tool_preview(function_name, function_args)
self.tool_progress_callback(function_name, preview) self.tool_progress_callback(function_name, preview, function_args)
except Exception as cb_err: except Exception as cb_err:
logging.debug(f"Tool progress callback error: {cb_err}") logging.debug(f"Tool progress callback error: {cb_err}")