现在的诸如 codex、cursor、opencode、claude code、trae 都可以支持 tools call function ,是什么原理?

首先,分清楚两个改成,agent 和 ai model

要支持 tools call function 首先 ai model 必须要支持,怎么支持?在哪里支持?什么时候支持?在 ai model 训练阶段就要支持,这些模型的天生能力,对于一些古早的模型在训练阶段就没有让他学过 tools call function 那他是不行的;现在(2026)的 ai model 都是在训练阶段加入了对 tools call function 相关训练内容,使得模型天生就是支持 tools call function 的

然后是 agent,ai model 支持后,agent 就可以使用 ai model 的 tools call function 输出来调用 function 然后把 function 的执行结果给 ai model

流程是下面的代码示例:

import os
import json
import psutil
from zhipuai import ZhipuAI
from loguru import logger

# 初始化客户端,确保环境变量中设置了 ZHIPUAI_API_KEY
client = ZhipuAI(api_key=os.getenv("ZHIPUAI_API_KEY"))


def get_disk_space():
    """获取当前电脑的磁盘空间使用情况"""
    disk_usage = psutil.disk_usage('/')
    total = disk_usage.total / (1024**3)  # GB
    used = disk_usage.used / (1024**3)    # GB
    free = disk_usage.free / (1024**3)    # GB
    percent = disk_usage.percent

    return {
        "total_gb": f"{total:.2f}",
        "used_gb": f"{used:.2f}",
        "free_gb": f"{free:.2f}",
        "percent": f"{percent}%"
    }


# 定义工具列表
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_disk_space",
            "description": "获取当前电脑剩余磁盘空间和总空间信息",
            "parameters": {
                "type": "object",
                "properties": {},
                "required": []
            },
        }
    }
]


def run_agent(query):
    print(f"\n用户提问: {query}")

    # 初始消息
    messages = [{"role": "user", "content": query}]

    # 第一次请求模型
    response = client.chat.completions.create(
        model="glm-4-flash",
        messages=messages,
        tools=tools,
        tool_choice="auto",
    )

    response_message = response.choices[0].message

    # 将模型返回的 CompletionMessage 对象转换为字典
    assistant_msg = {
        "role": "assistant",
        "content": response_message.content,
    }
    if response_message.tool_calls:
        assistant_msg["tool_calls"] = [
            {
                "id": tool_call.id,
                "type": "function",
                "function": {
                    "name": tool_call.function.name,
                    "arguments": tool_call.function.arguments
                }
            } for tool_call in response_message.tool_calls
        ]
    messages.append(assistant_msg)

    # 检查是否需要调用工具
    if response_message.tool_calls:
        for tool_call in response_message.tool_calls:
            function_name = tool_call.function.name
            if function_name == "get_disk_space":
                print(f"-> 正在执行本地工具: {function_name}...")
                function_response = get_disk_space()

                # 将工具执行结果添加到消息队列
                messages.append({
                    "role": "tool",
                    "content": json.dumps(function_response),
                    "tool_call_id": tool_call.id
                })

        # 再次请求模型,让其总结工具结果

        logger.info(
            f"-> 模型请求参数: {json.dumps(messages, ensure_ascii=False, indent=4)}")

        second_response = client.chat.completions.create(
            model="glm-4-flash",
            messages=messages,
        )
        final_answer = second_response.choices[0].message.content
        print(f"Agent 回答: {final_answer}")
    else:
        print(f"Agent 回答: {response_message.content}")


if __name__ == "__main__":
    user_input = input("请输入您的指令 (默认: 帮我统计一下现在这个电脑剩余磁盘空间还有多少): ")
    if not user_input:
        user_input = "帮我统计一下现在这个电脑剩余磁盘空间还有多少"
    run_agent(user_input)

我的需求:帮我统计一下现在这个电脑剩余磁盘空间还有多少

这个问题的答案必须是我的电脑的,而不是 ai model 云端电脑的

那运行在云端的 ai model 怎么知道我的电脑上的剩余磁盘空间呢?靠 agent

agent 作为 cli 运行在我的电脑上

ai model 作为 server 运行在云端服务器


首先 ageng 定义了一堆的 tools call function

当我问 agent「帮我统计一下现在这个电脑剩余磁盘空间还有多少」

agent 会把 「帮我统计一下现在这个电脑剩余磁盘空间还有多少」 和一堆 tools call function 的定义(函数名称、函数参数定义、函数注释、函数返回值定义)一起发给 ai model

一个支持 tools call function 的 ai model 会判断是直接回答 agent 还是告诉 agent 下一步要调用 tools call function。结合 「帮我统计一下现在这个电脑剩余磁盘空间还有多少」这个实际问题,ai model 会判断它自己本身无法直接回答这个问题,就会去看有什么 agent 传给自己的 tools call function 可以用,看了一下发现 get_disk_space 这个函数可以用,则 ai model 给 agent 的回复:调用 get_disk_space (如果有参数要求,ai model 也会要求指定,但是这里不需要参数),而且这个回复不是作为 content 给 agent ,而是结构化的参数返回,agent 可以从结构化的 response 里面知道要函数调用,不然混在 content 里面也分不清导致是直接回答还是 ai model 要 agent 调用工具

标签: none

添加新评论