tool_logging.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. """工具调用日志的通用封装。"""
  2. from __future__ import annotations
  3. import json
  4. from typing import Any, Dict
  5. from .log_capture import log, log_fold
  6. def format_tool_result_for_log(result: Any) -> str:
  7. """将 ToolResult 或普通字符串格式化为可写入日志的文本(避免过长 metadata 刷屏)。"""
  8. if result is None:
  9. return ""
  10. if isinstance(result, str):
  11. s = result
  12. return s if len(s) <= 8000 else s[:8000] + "\n...(truncated)"
  13. title = getattr(result, "title", "") or ""
  14. output = getattr(result, "output", None) or ""
  15. err = getattr(result, "error", None)
  16. truncated = output if len(output) <= 6000 else output[:6000] + "\n...(truncated)"
  17. payload: Dict[str, Any] = {"title": title, "output": truncated}
  18. if err:
  19. payload["error"] = err
  20. md = getattr(result, "metadata", None)
  21. if isinstance(md, dict) and md:
  22. payload["metadata_keys"] = list(md.keys())
  23. return json.dumps(payload, ensure_ascii=False)
  24. def log_tool_call(tool_name: str, params: Dict[str, Any], result: str) -> None:
  25. """以折叠块结构化输出工具调用参数与返回内容。"""
  26. with log_fold(f"🔧 {tool_name}"):
  27. with log_fold("📥 调用参数"):
  28. log(json.dumps(params, ensure_ascii=False, indent=2))
  29. with log_fold("📤 返回内容"):
  30. log(result)