Yash030/claude-code-proxy
2
1"""Safe metadata summaries for HTTP 422 validation logging (no raw text content)."""2 3from __future__ import annotations4 5from typing import Any6 7 8def summarize_request_validation_body(9 body: Any,10) -> tuple[list[dict[str, Any]], list[str]]:11 """Return message shape summary and tool name list for debug logs."""12 messages = body.get("messages") if isinstance(body, dict) else None13 message_summary: list[dict[str, Any]] = []14 if isinstance(messages, list):15 for msg in messages:16 if not isinstance(msg, dict):17 message_summary.append({"message_kind": type(msg).__name__})18 continue19 content = msg.get("content")20 item: dict[str, Any] = {21 "role": msg.get("role"),22 "content_kind": type(content).__name__,23 }24 if isinstance(content, list):25 item["block_types"] = [26 block.get("type", "dict")27 if isinstance(block, dict)28 else type(block).__name__29 for block in content[:12]30 ]31 item["block_keys"] = [32 sorted(str(key) for key in block)[:12]33 for block in content[:5]34 if isinstance(block, dict)35 ]36 elif isinstance(content, str):37 item["content_length"] = len(content)38 message_summary.append(item)39 40 tool_names: list[str] = []41 if isinstance(body, dict) and isinstance(body.get("tools"), list):42 tool_names = [43 str(tool.get("name", ""))44 for tool in body["tools"]45 if isinstance(tool, dict)46 ]47 48 return message_summary, tool_names49 