agentscope-ai / agentscope-ai/QwenPaw

feat: add tool_call_format config for compact tool call display in IM channels

Aperta
#7,436 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
TypeScript
Stelle
35k
Fork
3.1k
Merge medio
1g 13h
PR unite (30g)
228

Descrizione

## Feature Request: Add `tool_call_format` config to control tool call display format

### Problem

Currently, tool call messages in channels (Feishu, DingTalk, etc.) always render with the full format:

```
🔧 **execute_shell_command**
```
{"command": "cd ~/.qwenpaw && python3 -c \"import json; ...\""}
```
```

This is **3 lines per tool call**, which becomes very noisy in IM channels where users want a lightweight progress trace — "I want to know you're alive, not see every argument."

The existing config fields (`show_tool_calls`, `show_tool_details`, `tool_call_max_length`) only control **visibility** and **truncation**, not the **format** itself. There's no way to get a compact single-line output like `🔧 **execute_shell_command**` without patching source code.

### Proposed Solution

Add a new config field `tool_call_format` to `ChannelDisplayConfig`:

```python
@dataclass
class ChannelDisplayConfig:
show_tool_details: bool = True
show_thinking: bool = True
show_tool_calls: bool = True
show_tool_results: bool = True
tool_call_max_length: int = 200
tool_result_max_length: int = 500
tool_call_format: str = "full" # NEW: "full" | "name_only" | "compact"
```

**Format modes:**

| Mode | Output | Use case |
|------|--------|----------|
| `"full"` (default) | `🔧 **name**` + code fence + args | Current behavior, no breaking change |
| `"name_only"` | `🔧 **name**` (single line, no args) | IM channels: lightweight progress trace |
| `"compact"` | `🔧 **name**: {first 80 chars}` | Balance between info and brevity |

**Implementation sketch** (in `renderer.py`):

```python
def _fmt_tool_call(
name: str,
args_preview: str,
style: RenderStyle,
) -> str:
fmt = getattr(style.display_config, "tool_call_format", "full")

if fmt == "name_only":
if style.use_emoji:
return f"🔧 **{name}**"
return f"**{name}**"

if fmt == "compact":
truncated = args_preview[:80] + ("..." if len(args_preview) > 80 else "")
if style.supports_markdown and style.use_emoji:
return f"🔧 **{name}**: `{truncated}`"
if style.supports_markdown:
return f"**{name}**: `{truncated}`"
return f"{name}: {truncated}"

# Default: "full" (current behavior)
if style.supports_markdown and style.use_emoji:
return f"🔧 **{name}**\n```\n{args_preview}\n```"
if style.supports_markdown:
return f"**{name}**\n```\n{args_preview}\n```"
if style.supports_code_fence:
return f"{name}\n```\n{args_preview}\n```"
return f"{name}: {args_preview}"
```

### Why not just `show_tool_details=false`?

I tried that approach. When `show_tool_details=false`, `args_preview` becomes `"..."`, but the code fence is still emitted:

```
🔧 **execute_shell_command**
```
...
```
```

That's still 3 lines with no information gain. The user wants **just the name** — a single line per tool call.

### Config usage

Per-channel config (e.g. `agent.json` → `channels.feishu`):

```json
{
"channels": {
"feishu": {
"tool_call_format": "name_only"
}
}
}
```

### Impact

- **Backward compatible**: Default is `"full"` (current behavior unchanged)
- **Per-channel**: Each channel can choose its own format
- **No global side effects**: Unlike `show_tool_details=false` which affects all channels

### Context

- QwenPaw version: v2.1.0 (installed via pip)
- Affected file: `src/qwenpaw/app/channels/renderer.py`, function `_fmt_tool_call`
- Related config: `ChannelDisplayConfig` in same file
- User scenario: Feishu (Lark) channel where tool call noise degrades mobile UX

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Start in src/qwenpaw/app/channels/renderer.py by reading ChannelDisplayConfig and the _fmt_tool_call function. Trace how the per-channel channels.feishu configuration reaches the renderer, then verify the full, name_only, and compact outputs across the markdown and emoji cases shown in the issue. Done means the default remains unchanged and each configured mode produces its documented format.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
backend
Tipo di issue
Funzionalità
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Attiva
Chiarezza
Specificata chiaramente
Idoneità per principianti
76/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.