"""Router Agent 命令行交互客户端 用法: uv run python chat_with_router.py """ import asyncio import sys import httpx # 修复 Windows 控制台编码问题 if sys.platform == 'win32': import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') BASE_URL = "http://127.0.0.1:8001" async def chat_loop(): """交互式对话循环""" print("=" * 60) print("Router Agent - 命令行客户端") print("=" * 60) print("提示:") print(" - 输入你的问题或请求") print(" - 输入 'exit' 或 'quit' 退出") print(" - 输入 'help' 查看可用命令") print("-" * 60) session_id = None async with httpx.AsyncClient(timeout=120.0) as client: # 检查服务是否可用 try: await client.get(f"{BASE_URL}/health") except Exception as e: print(f"\n错误: 无法连接到 Router Agent 服务") print(f"请确保服务已启动: uv run python -m tool_agent") print(f"详细错误: {e}") return while True: try: # 读取用户输入 user_input = await asyncio.to_thread(input, "\n[You] > ") user_input = user_input.strip() if not user_input: continue # 处理退出命令 if user_input.lower() in ("exit", "quit"): print("\n再见!") break # 处理帮助命令 if user_input.lower() == "help": print("\n可用命令:") print(" list - 列出所有工具") print(" search <关键词> - 搜索工具") print(" status - 查看工具状态") print(" exit/quit - 退出") print("\n你也可以直接用自然语言提问,例如:") print(" - 我需要一个图片压缩工具") print(" - image_stitcher 怎么用?") print(" - 帮我调用 XXX 工具") continue # 发送消息给 Router Agent print("\n[Router Agent] 思考中...") response = await client.post( f"{BASE_URL}/chat", json={ "message": user_input, "session_id": session_id } ) if response.status_code == 200: result = response.json() session_id = result.get("session_id") print(f"\n[Router Agent]\n{result['response']}") else: print(f"\n错误: {response.status_code} - {response.text}") except KeyboardInterrupt: print("\n\n按 Ctrl+C 退出,或输入 'exit'") except EOFError: print("\n\n再见!") break except Exception as e: print(f"\n错误: {e}") if __name__ == "__main__": asyncio.run(chat_loop())