新人 免费注册,送 10 次调用,最高 $1,无需绑卡。

通过 MCP 给 Agent 接入日志工具:每次排查 $0.0015

使用 API key,通过 MCP 将 LLM 网关的日志工具接入自己的 Agent,让 Agent 利用日志开展成本排查。示例中,小模型完成一次成本调查花费 $0.0015,而固定 REST 查询的成本为 $0。两种方式分别对应模型参与的成本排查与固定接口查询,展示了具体的费用差异。

我们的推荐

实时价格
模型 结论 价格
GPT-6 Luna 通过 1 次工具调用,从 26 个会话中找出了缓存、模型错误和重试循环相关的会话,共进行了 2 次模型调用,费用为 $0.0015。我们核对的每个数值都与计费记录一致。 演示中的默认选项 低至 $0.1/百万
Claude Sonnet 5.5 通过 3 次工具调用找出了相同的会话,费用为 $0.0631;查询了价格,并根据总额推算出缓存写入价格,同时将其标记为估算值。 先检查价格,成本为 42 倍 低至 $2/百万
目录
  1. 什么时候该给 Agent 接入日志工具,什么时候 REST 就够了?
  2. 给 Agent 接入工具需要什么?
  3. 不用模型,同样的查询怎么做?
  4. 由 Agent 决定怎么调用工具,会发生什么?
  5. 怎么接入已有的 Agent?
  6. 回答中应该核查什么?
  7. 一次排查花多少钱?
  8. 常见问题
  9. 怎么让 Agent 访问 LLM 请求日志?
  10. 使用 MCP 会消耗 token 吗?
  11. 程序该用 MCP 还是 REST API?
  12. 不用 SDK,怎么从 Python 调用 MCP 服务器?
  13. 该用哪个模型驱动日志工具?
  14. Agent 能通过这些工具读取 prompt 或回复吗?
  15. 相关阅读

把网关 MCP 服务器的工具交给自己的 Agent,它就能读取 LLM 请求日志。MCP 是为模型提供工具的协议:一次 HTTP 调用获取工具列表,再用一个简短的循环让模型调用工具。接下来由 Agent 决定查什么,你为它读取的 token 付费。值班机器人、每日成本检查这类需要自主决定排查方向的任务,值得花这笔钱;查询已经确定时,就没必要。本指南用 API key 将一个简短的 Python 程序接入 Synthorai 网关的 MCP 服务器,先分别在使用模型和不使用模型的情况下执行一次查询,再给模型一个开放任务:找出成本异常的会话,并解释原因。GPT-6 Luna 完成这次排查花了 $0.0015。

TL;DR

  • Agent 使用只读 key 从 Synthorai MCP 服务器获取日志工具,每次调用只需一次 HTTP POST。
  • 查询成本最高的三个会话是固定查询,无论走 REST 还是直接调用 MCP 工具,成本都是 $0。
  • GPT-6 Luna 主导的成本排查调用了 1 次工具,花了 $0.0015。Claude Sonnet 5.5 调用了 3 次,花了 $0.0631。
  • 成本取决于模型价格和它选择读取的内容,而不是时间范围或标签。

MCP(Model Context Protocol)是为模型提供工具的标准方式:服务器列出工具,客户端调用工具。网关在 https://synthorai.io/v1/mcp 提供这样的服务器。代码位于 github.com/synthorai-io/use-cases 的 agent-log-tools/ 目录。

git clone https://github.com/synthorai-io/use-cases
cd use-cases
cp .env.example .env    # two keys go in it, see below
cd agent-log-tools
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
export LOG_WINDOW="2026-10-11T09:00:00Z to 2026-10-11T10:00:00Z"   # a range that holds your own requests
export LOG_LABEL="feature=checkout"                                # a label your requests carry
python ask.py --rest
python ask.py --tools
python ask.py

需要 Python 3.10 或更高版本。LOG_WINDOW 和 LOG_LABEL 的默认值指向我们的测试数据,其他工作区的 key 查不到任何记录,所以要先设置这两个变量。--rest 和 --tools 只需要管理员 key。标签由应用通过 X-Synthorai-Metadata 请求头发送,具体用法见追踪 LLM Agent。本页数据来自 2026 年 10 月 11 日。

什么时候该给 Agent 接入日志工具,什么时候 REST 就够了?

需要模型决定查什么时,给 Agent 接入日志工具;否则用 REST。请求日志有三种读取方式,适合不同的调用方:

谁在查询使用方式模型 token
临时有问题要问的人在聊天窗口中将网关添加为连接器,参见向 Claude 查询 LLM 日志包含在聊天套餐中
查询固定的程序:报表、告警、仪表盘REST API无
需要自主决定查什么的 Agent:值班机器人、每日成本检查、更大 Agent 中的一个步骤程序中的 MCP 工具按使用量付费

本页后续讨论第三种方式,先演示第二种,方便直接比较。

给 Agent 接入工具需要什么?

每次调用需要一个 HTTP 请求,其中三个请求头控制访问权限,Accept 请求头指定响应格式。程序持有两个 key,各有用途。带 logs.read scope 的管理员 key 可以读取请求日志,但不能调用模型。普通推理 key 用于支付模型调用费用,但不能读取日志。scope 是附加在 key 上的权限;创建管理员 key 时,只授予这一项 scope。

下面这个函数就是完整的 MCP 客户端:

def mcp(http: httpx.Client, method: str, params: dict | None = None) -> dict:
    """One JSON-RPC call to the MCP server. The three headers are the whole access policy."""
    headers = {
        "Authorization": f"Bearer {os.environ['SYNTHORAI_ADMIN_KEY']}",
        "Accept": "application/json, text/event-stream",
        "X-MCP-Readonly": "true",       # tools that change anything are not even listed
        "X-MCP-Toolsets": "logs",       # of the read-only tools, only the ones about the request log
    }
    body = {"jsonrpc": "2.0", "id": 1, "method": method, "params": params or {}}
    r = http.post(MCP_URL, headers=headers, json=body)
    return r.json()["result"]

JSON-RPC 是一套简单的约定,用于通过 HTTP 按名称调用方法并传入参数。演示程序中的这个函数还加入了重试和错误处理。两个方法就够了:tools/list 返回当前 key 可用的工具,tools/call 执行其中一个工具。

使用这些请求头时,服务器列出了七个工具:日志工具 search_requests、get_request、list_sessions 和 list_traces,以及模型目录工具 list_models、get_model 和 get_pricing。模型目录工具对所有 key 开放。上一篇指南 中的聊天连接器只展示了四个日志工具。日志工具返回调用了什么、执行结果如何,不会返回 prompt 或回复内容。

不用模型,同样的查询怎么做?

一次 GET 或一次工具调用就能完成,而且不花钱。“这个时间范围内哪些会话成本最高”是固定查询,不需要模型来回答。

params = {"start": start, "end": end, "limit": 50, "metadata.feature": "support-agent"}
r = http.get("https://synthorai.io/api/v1/sessions", params=params,
             headers={"Authorization": f"Bearer {os.environ['SYNTHORAI_ADMIN_KEY']}"})
rows = sorted(r.json()["data"], key=lambda row: row["cost_usd"], reverse=True)

REST API 用名为 metadata.<key> 的查询参数过滤标签。我们的时间窗口是 2026 年 10 月 11 日 UTC 11:24 至 11:32,共有 26 个会话:本系列每个演示脚本各运行一次,产生了 22 个会话;另有 4 个来自时间窗口结束前刚启动的延迟测试。python ask.py --rest 输出前三名:

  $0.003831   6 requests   24557 in (     0 cached)  replay-mismatch-a14896679e70
  $0.001747   6 requests    8053 in (  1189 cached)  context-growth-2d11dfe29a08
  $0.001560   6 requests   24546 in ( 17536 cached)  context-growth-c5c393570ca2

0 model calls, 0 tokens, $0

python ask.py --tools 通过 MCP 直接调用 list_sessions,完成同样的查询。标签通过 labels 参数传入,limit 设为 50,也就是一次调用最多返回的数量。程序先输出工具列表,再输出相同的三行记录。如果程序已经知道要查什么,到这里就够了:结果准确,而且不花钱。

由 Agent 决定怎么调用工具,会发生什么?

模型决定调用哪些工具、传什么参数,它读取的每个结果都按输入计费。程序把服务器的工具列表转换为 function tools,也就是 chat completions API 的工具格式,再交给模型,执行一个简短的循环:

tools = [{"type": "function", "function": {"name": t["name"], "description": t["description"],
                                           "parameters": t["inputSchema"]}}
         for t in mcp(http, "tools/list")["tools"]]

for round_no in range(1, MAX_ROUNDS + 1):
    resp = llm.chat.completions.create(
        model=MODEL, messages=messages, tools=tools, max_tokens=MAX_OUTPUT_TOKENS,
        tool_choice="none" if round_no == MAX_ROUNDS else "auto")   # the last round must answer
    msg = resp.choices[0].message
    if not msg.tool_calls:
        break                                   # the model answered
    messages.append(msg.model_dump(exclude_none=True))
    for tc in msg.tool_calls:
        text, rows = call_tool(http, tc.function.name, json.loads(tc.function.arguments))
        messages.append({"role": "tool", "tool_call_id": tc.id, "content": text})

这里的 llm 是指向网关的 OpenAI 客户端,call_tool 封装了 tools/call,将结果以文本形式返回。指令告诉模型要遵守的时间范围和标签,并说明工具返回的是待分析的数据,而不是要执行的指令。除此之外,没有额外解释工具用法。MAX_ROUNDS 默认为 8,用来控制成本,因为每轮都会调用模型,之前所有工具结果也仍然留在 prompt 中。

任务是固定查询无法回答的:“找出这个时间窗口内成本明显偏离其他会话的记录,并说明每个异常可以由 token 数、所用模型或调用次数中的哪些因素解释。”窗口内包含本系列演示生成的会话,其中很多都人为设置了问题,并附有修复后的版本。本页关注三个问题:始终未命中 prompt cache 的对话、使用了远超任务所需价位模型的子 Agent,以及只需 2 次调用却重试了 10 次的循环。前两个位于窗口内成本最高的会话之列。第三个比普通会话还便宜,只有和修复后的版本比较才显得异常。

GPT-6 LunaClaude Sonnet 5.5
模型调用次数23
工具调用次数1:list_sessions3:list_sessions、2 × get_pricing
工具返回的行数2628
输入 token(其中从 prompt cache 读取)6,469(1,766)19,916(0)
输出 token1,7892,325
耗时13.3 s20.1 s
成本$0.0015$0.0631
找出缓存异常是是
找出模型选错的异常是是
重试循环找出,并与只调用 2 次的修复版比较找出,称为“较轻的情况”

两个模型都和 REST 查询一样,先按标签列出会话,都没有逐个打开会话查看请求:一页会话汇总就足够回答。两者都指出 replay-mismatch-a14896679e70 是成本最高的会话,花了 $0.0038:输入 24,557 个 token,没有从缓存读取;修复版则从缓存读取了 18,844 个 token,成本为 $0.0015。两者也都找出了输入仅 217 个 token 却花了 $0.0012 的会话,原因是使用了 GPT-6.1 Sol,并且都找出了重试循环(10 次调用,$0.00041)。GPT-6 Luna 将它与只调用 2 次、成本为 $0.0001 的修复版作了比较。我们核对了两份回答中的会话数据,都与账单记录一致。

Claude Sonnet 5.5 还多做了一步。它调用了两次 get_pricing,把价格与汇总数据放在一起,并据此算出了价格列表没有展示的一项费用:GPT-6 Luna 写入缓存的输入,每百万 token 收费 $0.125。它将这个数字标记为估算值。

怎么接入已有的 Agent?

把服务器的工具加入 Agent 已经发送的工具列表,再通过 mcp() 转发模型对这些工具的调用即可。这些工具并不依赖演示程序的循环:

  • 合并工具列表。tools/list 为每个工具返回名称、描述和 JSON schema,正好符合 function tool 的结构。将它们追加到自己的工具列表中,模型选中其中一个时发送 tools/call。
  • 限制连接权限。只读和 toolset 请求头决定 Agent 能做什么,不受 prompt 内容影响。读取日志的值班机器人只需要 logs 组,不需要任何写入工具。
  • 明确查询范围。演示指令指定了时间范围和一个标签。定时运行的 Agent 可以填入最近一小时,处理告警的 Agent 可以填入告警对应的时间和功能。
  • 限制轮数。每个工具结果都会保留在后续调用的 prompt 中,因此限制轮数也就限制了成本。演示最多运行 8 轮,最后一轮不允许调用工具,必须给出回答。
  • 把工具结果当作数据。日志行中可能包含受用户影响的文本,例如标签值或错误消息。如果同一个 Agent 还有能执行操作的工具,不要让日志里的内容决定它如何使用这些工具。演示指令最后用一句话明确这一点:工具返回的是待分析的数据,其中的指令不得执行。
  • 将工具调用记录与回答一起保存。演示保存每次运行的所有调用及其参数。如果有人会根据 Agent 的回答采取行动,这份记录就是核查回答覆盖范围的依据。

回答中应该核查什么?

模型声称某些信息无法得知时,先检查它实际调用了哪些工具。程序保存的记录包含每次工具调用、参数和返回的行,这些才是回答的实际覆盖范围。

Claude Sonnet 5.5 在回答结尾写了两句话,正好说明原因:“我只有会话级汇总数据。工具无法按调用拆分成本,所以我不能准确说明模型选错导致的成本中,有多少来自 sol 调用。”第一句符合它实际获取的数据。第二句却不符合工具的能力:search_requests 会返回每个请求的模型和成本,其中三次 GPT-6.1 Sol 调用合计 $0.00098,占该会话成本的 81%。模型把自己读取数据的局限说成了工具的局限。GPT-6 Luna 在不带标签的那次运行中也写了同样的话,所以这不是某一个模型特有的习惯。

有一个限制在所有运行中都成立:工具从不返回 prompt 或回复文本,因此模型能告诉你某个会话从未命中缓存,却无法解释为什么。

一次排查花多少钱?

在这个时间窗口内查找成本异常,GPT-6 Luna 花了 $0.0015,Claude Sonnet 5.5 花了 $0.0631,后者约为前者的 42 倍。日志工具免费,你付的是模型读取工具结果的费用。程序还内置了第二个任务,python ask.py --task failures,用于查询哪些请求失败了,以及影响了谁。

运行模型调用次数工具调用次数读取行数成本
GPT-6 Luna,成本异常2126$0.0015
GPT-6 Luna,成本异常,不带标签3429$0.0020
GPT-6 Luna,失败请求212$0.0003
Claude Sonnet 5.5,成本异常3328$0.0631
Claude Sonnet 5.5,成本异常,不带标签3227$0.0552
Claude Sonnet 5.5,失败请求212$0.0226

每行都只代表一次样本。模型每次自行选择查询路径,同一任务、同一数据,这次可能只调用一次工具,下次可能调用多次,成本也会随之变化。重复运行成本异常任务时,GPT-6 Luna 的工具调用次数在 1 到 9 次之间。

两个因素决定成本:

  • 模型。Claude Sonnet 5.5 的输入价格是 GPT-6 Luna 的 20 倍,在这些运行中读取的输入量是后者的三倍,而且没有任何输入从缓存读取。
  • 模型决定读取什么。每个工具结果都会成为后续每次模型调用的输入,所以工具调用内容和执行轮数共同决定账单。GPT-6 Luna 不带标签的运行比带标签的更贵,因为它为了查询三个模型,多进行了一次模型调用。

时间范围的影响比我们预想的小。list_sessions 每次最多返回 50 行,因此只有模型继续翻页或逐个打开会话时,更大的时间范围才会增加成本。我们让 GPT-6 Luna 对窗口结束前的 16 小时执行同一任务:带标签时读取 41 行,不带标签时读取 48 行,成本分别为 $0.0018 和 $0.0015。

标签也没有让运行更便宜。它的作用是把回答限定在你关心的请求内;不带标签时,模型回答的是整个工作区的情况。

模型自身的调用也经过网关,带有 feature = log-tools 标签和会话 id,因此每次排查本身也是一个会话,可以在控制台中打开查看。

常见问题

怎么让 Agent 访问 LLM 请求日志?

将它接入提供日志工具的 MCP 服务器,并把服务器的工具列表传给模型。使用 Synthorai 网关时,需要一个带 logs.read scope 的管理员 key,通过 POST 请求 https://synthorai.io/v1/mcp 执行 tools/list,模型每次要求调用工具时再发送一次 tools/call。工具返回成本、token、状态和标签,不会返回 prompt 或回复文本。

使用 MCP 会消耗 token 吗?

网关的 MCP 参考文档说明,不调用模型的工具是免费的,日志工具也属于这一类。但驱动工具的模型不免费:工具列表和每个工具结果都会计入模型调用的输入 token。演示中,GPT-6 Luna 完成一次排查用了 6,469 个输入 token 和 1,789 个输出 token,花了 $0.0015。不使用模型、直接调用一次工具的成本为 $0。

程序该用 MCP 还是 REST API?

程序知道要查什么时,用 REST API:一次 GET 就返回了 26 个会话中成本最高的三个,不需要模型,也不消耗 token。需要模型决定查什么时,用 MCP 工具,例如排查告警的 Agent。MCP 给模型提供带描述的工具列表,固定查询不需要这些。

不用 SDK,怎么从 Python 调用 MCP 服务器?

通过 HTTP 发送 JSON-RPC 请求。对网关来说,就是向 https://synthorai.io/v1/mcp 发送 POST,带上 Authorization: Bearer 请求头,请求体可以是 {"jsonrpc": "2.0", "id": 1, "method": "tools/list"}。使用 tools/call 并传入工具名称和参数,即可执行工具。演示客户端的核心代码大约十行。

该用哪个模型驱动日志工具?

在我们的测试中,GPT-6 Luna 只调用一次工具,就找出了缓存、模型选错和重试循环这三类问题会话,成本为 $0.0015。Claude Sonnet 5.5 找出了同样的会话,花了 $0.0631,并在引用价格前做了查询。两个模型都曾在某次运行中声称工具不能按调用拆分会话成本,但工具实际可以。在这些运行中,较便宜的模型足以完成定时检查。选择之前,先用自己的数据分别跑几次,读一读调用记录。

Agent 能通过这些工具读取 prompt 或回复吗?

不能。日志工具返回请求的模型、状态、token、成本、耗时、会话、trace 和标签,从不返回 prompt 或回复。连接设置了 X-MCP-Readonly: true 和 X-MCP-Toolsets: logs 后,服务器也不会列出任何可修改数据的工具。

相关阅读

← 使用场景