Add tool call log

This commit is contained in:
Xin Wang
2026-02-12 15:44:01 +08:00
parent 6744704c7e
commit 399c9c97b1

View File

@@ -938,6 +938,15 @@ class DuplexPipeline:
return "server" return "server"
async def _emit_tool_result(self, result: Dict[str, Any], source: str) -> None: async def _emit_tool_result(self, result: Dict[str, Any], source: str) -> None:
tool_name = str(result.get("name") or "unknown_tool")
call_id = str(result.get("tool_call_id") or result.get("id") or "")
status = result.get("status") if isinstance(result.get("status"), dict) else {}
status_code = int(status.get("code") or 0) if status else 0
status_message = str(status.get("message") or "") if status else ""
logger.info(
f"[Tool] emit result source={source} name={tool_name} call_id={call_id} "
f"status={status_code} {status_message}".strip()
)
await self._send_event( await self._send_event(
{ {
**ev( **ev(
@@ -962,7 +971,16 @@ class DuplexPipeline:
if not call_id: if not call_id:
continue continue
if call_id in self._completed_tool_call_ids: if call_id in self._completed_tool_call_ids:
logger.debug(f"[Tool] ignore duplicate client result call_id={call_id}")
continue continue
status = item.get("status") if isinstance(item.get("status"), dict) else {}
status_code = int(status.get("code") or 0) if status else 0
status_message = str(status.get("message") or "") if status else ""
tool_name = str(item.get("name") or "unknown_tool")
logger.info(
f"[Tool] received client result name={tool_name} call_id={call_id} "
f"status={status_code} {status_message}".strip()
)
waiter = self._pending_tool_waiters.get(call_id) waiter = self._pending_tool_waiters.get(call_id)
if waiter and not waiter.done(): if waiter and not waiter.done():
@@ -1060,6 +1078,15 @@ class DuplexPipeline:
executor = self._tool_executor(tool_call) executor = self._tool_executor(tool_call)
enriched_tool_call = dict(tool_call) enriched_tool_call = dict(tool_call)
enriched_tool_call["executor"] = executor enriched_tool_call["executor"] = executor
tool_name = self._tool_name(enriched_tool_call) or "unknown_tool"
call_id = str(enriched_tool_call.get("id") or "").strip()
fn_payload = enriched_tool_call.get("function")
raw_args = str(fn_payload.get("arguments") or "") if isinstance(fn_payload, dict) else ""
args_preview = raw_args if len(raw_args) <= 160 else f"{raw_args[:160]}..."
logger.info(
f"[Tool] call requested name={tool_name} call_id={call_id} "
f"executor={executor} args={args_preview}"
)
tool_calls.append(enriched_tool_call) tool_calls.append(enriched_tool_call)
await self._send_event( await self._send_event(
{ {
@@ -1178,6 +1205,8 @@ class DuplexPipeline:
if not call_id: if not call_id:
continue continue
executor = str(call.get("executor") or "server").strip().lower() executor = str(call.get("executor") or "server").strip().lower()
tool_name = self._tool_name(call) or "unknown_tool"
logger.info(f"[Tool] execute start name={tool_name} call_id={call_id} executor={executor}")
if executor == "client": if executor == "client":
result = await self._wait_for_single_tool_result(call_id) result = await self._wait_for_single_tool_result(call_id)
await self._emit_tool_result(result, source="client") await self._emit_tool_result(result, source="client")