cli_debug.py 2.97 KB
import json
from typing import Optional

from app.agents.shopping_agent import ShoppingAgent


def run_once(agent: ShoppingAgent, query: str, image_path: Optional[str] = None) -> None:
    """Run a single query through the agent and pretty-print details."""
    result = agent.chat(query=query, image_path=image_path)

    print("\n=== Assistant Response ===")
    print(result.get("response", ""))

    print("\n=== Tool Calls ===")
    tool_calls = result.get("tool_calls", []) or []
    if not tool_calls:
        print("(no tool calls)")
    else:
        for i, tc in enumerate(tool_calls, 1):
            print(f"[{i}] {tc.get('name')}")
            print("  args:")
            print("  " + json.dumps(tc.get("args", {}), ensure_ascii=False, indent=2).replace("\n", "\n  "))
            if "result" in tc:
                print("  result (truncated):")
                print("  " + str(tc.get("result")).replace("\n", "\n  "))

    print("\n=== Debug Steps ===")
    debug_steps = result.get("debug_steps", []) or []
    if not debug_steps:
        print("(no debug steps)")
    else:
        for idx, step in enumerate(debug_steps, 1):
            node = step.get("node", "unknown")
            print(f"\n--- Step {idx} [{node}] ---")

            if node == "agent":
                msgs = step.get("messages", []) or []
                if msgs:
                    print("  Agent messages:")
                    for m in msgs:
                        role = m.get("type", "assistant")
                        content = m.get("content", "")
                        print(f"    - {role}: {content}")

                tcs = step.get("tool_calls", []) or []
                if tcs:
                    print("  Planned tool calls:")
                    for j, tc in enumerate(tcs, 1):
                        print(f"    [{j}] {tc.get('name')}")
                        print(
                            "      args: "
                            + json.dumps(tc.get("args", {}), ensure_ascii=False)
                        )

            elif node == "tools":
                results = step.get("results", []) or []
                if results:
                    print("  Tool results:")
                    for j, r in enumerate(results, 1):
                        content = r.get("content", "")
                        print(f"    [{j}] {content}")


def main() -> None:
    """Simple CLI debugger to inspect agent reasoning and tool usage."""
    agent = ShoppingAgent(session_id="cli-debug")
    print("ShopAgent CLI Debugger")
    print("输入你的问题,或者输入 `exit` 退出。\n")

    while True:
        try:
            query = input("你:").strip()
        except (EOFError, KeyboardInterrupt):
            print("\n再见 👋")
            break

        if not query:
            continue
        if query.lower() in {"exit", "quit"}:
            print("再见 👋")
            break

        run_once(agent, query=query)
        print("\n" + "=" * 60 + "\n")


if __name__ == "__main__":
    main()