"""
第 5 步：让 Qwen Agent 自己决定是否调用 MCP 工具。

前面 step2/step3 是我们在代码里手动调用工具：
    tool_map["search_hotels"].ainvoke(...)

这一步变成：
    用户用自然语言提问
    Qwen 判断该调用 search_transport 还是 search_hotels
    MCP Server 执行工具
    Qwen 根据工具结果回答

运行：
python step5_qwen_agent_use_mcp.py
"""

from __future__ import annotations

import asyncio
import os
import sys
from pathlib import Path

from dotenv import load_dotenv
from langchain.agents import create_agent
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain_openai import ChatOpenAI


def build_qwen_model() -> ChatOpenAI:
    load_dotenv()

    api_key = os.getenv("DASHSCOPE_API_KEY")
    if not api_key:
        raise RuntimeError("请先在 .env 里填写 DASHSCOPE_API_KEY。")

    return ChatOpenAI(
        api_key=api_key,
        base_url=os.getenv("QWEN_BASE_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1"),
        model=os.getenv("QWEN_MODEL", "qwen-plus"),
        temperature=0.2,
    )


async def main() -> None:
    server_file = Path(__file__).with_name("my_mcp_demo.py").resolve()

    client = MultiServerMCPClient(
        {
            "travel-tools": {
                "transport": "stdio",
                "command": sys.executable,
                "args": [str(server_file)],
            }
        }
    )

    tools = await client.get_tools()
    print("Qwen Agent 可用的 MCP 工具：", [tool.name for tool in tools])

    model = build_qwen_model()

    agent = create_agent(
        model=model,
        tools=tools,
        system_prompt=(
            "你是一个旅行助手。"
            "当用户询问住宿时，优先使用 search_hotels 工具；"
            "当用户询问城市间交通时，优先使用 search_transport 工具；"
            "拿到工具结果后，用中文自然语言回答。"
        ),
    )

    result = await agent.ainvoke(
        {
            "messages": [
                {
                    "role": "user",
                    "content": "我想 2026-08-15 从成都去重庆玩 3 天 2 晚，帮我看看交通和住宿怎么安排。",
                }
            ]
        }
    )

    print("\nQwen Agent 最终回答：")
    print(result["messages"][-1].content)


if __name__ == "__main__":
    asyncio.run(main())
