Bắt đầu ngayBắt đầu miễn phí

Xây dựng thông điệp và gọi LLM

Với hàm trợ giúp get_context_from_mcp(user_query) của bạn đã được tạo để trả về resource text và prompt text, giờ là lúc truyền thông tin đó cho LLM!

Currency server, get_context_from_mcp(), get_tools_from_mcp(), call_mcp_tool(), và Claude client đã được thiết lập sẵn ở nền. Bạn cần hoàn thiện hàm để xây dựng prompt, gọi model, và xử lý trường hợp trả về tin nhắn trực tiếp hoặc gọi tool. Bạn đã được cung cấp một đầu vào mơ hồ và một đầu vào rõ ràng để xem liệu các MCP prompt của bạn có tạo khác biệt hay không!

Bài tập này là một phần của khóa học

Giới thiệu về Model Context Protocol (MCP)

Xem khóa học

Hướng dẫn bài tập

  • dòng 37, xây dựng full_prompt bằng cách nối prompt_text, chuỗi "\n\nSupported currencies:\n", và resource_text.
  • dòng 47, gửi full_prompt (làm nội dung tin nhắn user) và danh sách anthropic_tools tới model.
  • dòng 52-55, nếu stop_reason của phản hồi là "end_turn", trả về str(text).
  • dòng 58-60, nếu stop_reason của phản hồi là "tool_use", truyền .name.input của khối tool use vào call_mcp_tool().

Bài tập tương tác thực hành trực tiếp

Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def get_context_from_mcp(user_query: str) -> tuple[str, str]:
    params = StdioServerParameters(command=sys.executable, args=["currency_server.py"])
    async with stdio_client(params) as (reader, writer):
        async with ClientSession(reader, writer) as session:
            await session.initialize()
            resource_result = await session.read_resource("file://currencies.txt")
            resource_text = resource_result.contents[0].text
            prompt_result = await session.get_prompt("convert_currency_prompt",
                arguments={"currency_request": user_query})
            prompt_text = prompt_result.messages[0].content.text
            return resource_text, prompt_text

async def get_tools_from_mcp():
    params = StdioServerParameters(command=sys.executable, args=["currency_server.py"])
    async with stdio_client(params) as (reader, writer):
        async with ClientSession(reader, writer) as session:
            await session.initialize()
            response = await session.list_tools()
            return response.tools

async def call_mcp_tool(tool_name: str, arguments: dict) -> str:
    params = StdioServerParameters(command=sys.executable, args=["currency_server.py"])
    async with stdio_client(params) as (reader, writer):
        async with ClientSession(reader, writer) as session:
            await session.initialize()
            result = await session.call_tool(tool_name, arguments)
            return str(result.content[0].text)

async def call_llm_with_context(user_query: str):
    """Call the LLM with resource and prompt context from MCP."""
    resource_text, prompt_text = await get_context_from_mcp(user_query)

    # Combine the resource and prompt text
    full_prompt = ____ + "\n\nSupported currencies:\n" + ____

    client = AsyncAnthropic(api_key="")
    mcp_tools = await get_tools_from_mcp()
    anthropic_tools = [{"name": t.name, "description": t.description or "", "input_schema": t.inputSchema} for t in mcp_tools]

    # Send full_prompt (as a user message) and the tools list to the model
    response = await client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        messages=[{"role": "user", "content": ____}],
        tools=anthropic_tools,
    )

    # Return the text response
    if response.stop_reason == "____":
        text = next((block.text for block in response.content if block.type == "text"), "")
        print(f"\nAssistant: {text}")
        return str(____)

    # Call the tool requested in the LLM's tool use
    if response.stop_reason == "____":
        tool_use = next(block for block in response.content if block.type == "tool_use")
        result = await call_mcp_tool(____.name, ____)
        followup = await client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=1024,
            messages=[
                {"role": "user", "content": full_prompt},
                {"role": "assistant", "content": response.content},
                {"role": "user", "content": [{"type": "tool_result", "tool_use_id": tool_use.id, "content": result}]},
            ],
            tools=anthropic_tools,
        )
        final_text = next((block.text for block in followup.content if block.type == "text"), None)
        if final_text:
            print(f"\nAssistant: {final_text}")
            return str(final_text)

print("=== Ambiguous request (prompt asks for clarification) ===")
asyncio.run(call_llm_with_context("Convert some euros to dollars"))
print("\n=== Unambiguous request (model calls tool) ===")
asyncio.run(call_llm_with_context("How much is 50 GBP in euros?"))
Chỉnh sửa và Chạy Mã