画 Baseten Hosted Tools 调用图,TaoToken Key 标出 Token 消耗
2026/9/17 18:13:10 网站建设 项目流程

1. 从 Grounded Inference 的配置入口开始:为什么调用图比“能不能搜”更重要

在 Baseten Hosted Tools 里给 Grounded Inference 配搜索时,最难受的是调用图不透明:模型侧、搜索侧、重试和缓存都在吃 Token,账单却只给一个总数。本文用 TaoToken 拿 Key(官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=baseten_topo_intro),Base URL 用 https://taotoken.net/api,把 Baseten Hosted Tools 的 Grounded Inference 调用拓扑、Token 消耗标注和 Key 入口一次画清。

这篇面向 csdn_ugc 场景的实战笔记,不复述发布新闻,而是直接解决三个问题:第一,Baseten Hosted Tools 的 Grounded Inference 从模型到搜索提供商之间到底经过哪些节点;第二,TaoToken Key 应该标在哪条边上,才能让模型 Token 消耗有归属;第三,怎么用可维护的 Graphviz DOT 画出调用图,并把 Exa、Keenable、Parallel、You.com 四家搜索提供商、重试、缓存、计量节点都放进同一张拓扑里。

Baseten 的 Hosted Tools 可以理解为给托管模型加工具调用能力的托管层,首个工具是 Grounded Inference。它的目标很明确:托管在 Baseten 上的开源模型不必自己手写搜索编排,而是通过配置接入网络搜索;搜索后端可以选择 Exa、Keenable、Parallel、You.com。对架构可视化来说,这里有两个 Token 消耗方:一个是 Baseten 托管模型本身产生的推理 Token,另一个是搜索链路产生的查询调用与结果处理开销。TaoToken Key 在这里不是搜索提供商的替代品,而是模型调用侧的鉴权入口和成本标注锚点:客户端、Claude Code、Codex、脚本通过YOUR_API_KEY调用https://taotoken.net/api,这条边记model_tokens;Baseten 托管模型到 Grounded Inference 再到搜索提供商的边,记tool_router_tokenssearch_callsretry_tokenscache_saved_tokens

如果把所有调用都画成一条直线,排障时就会变成“搜不到就怪模型,账单高了就怪搜索”。实际拓扑至少是分层的:本地开发工具负责发起任务,TaoToken Key 负责模型 API 鉴权,Baseten 托管模型负责推理和决定是否调用工具,Grounded Inference 负责把工具调用翻译成搜索请求,搜索提供商负责返回结果,缓存与计量负责减少重复和归因。只有把这些边分开,才能回答“这次搜索结果为什么贵”“为什么 tool_call 没触发”“为什么 401 出现在模型侧而不是搜索侧”。

2. 调用拓扑拆解:Baseten 托管模型、四家搜索提供商与 TaoToken Key 的 Token 归属

先固定关键入口。TaoToken 官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=baseten_key_entry 。登录后创建 Key,把返回值替换成YOUR_API_KEY。模型调用的 Base URL 固定为https://taotoken.net/api,这个地址在 Claude Code、Codex、通用 OpenAI 兼容客户端里都可以作为模型侧地址使用。注意,Base URL 是模型 API 地址,不是 Baseten Hosted Tools 搜索提供商地址,也不是 Exa、Keenable、Parallel、You.com 的搜索接口地址。

建议把拓扑节点拆成七类:

节点作用Token/计费标注是否直接使用 TaoToken Key
客户端/IDE/CIClaude Code、Codex、本地脚本发起任务无直接 Token是,模型调用侧
TaoToken Key 接入点模型 API 鉴权,Base URL 为https://taotoken.net/apimodel_tokens
Baseten 托管模型运行开源模型,输出 tool_call 或最终回答prompt_tokenscompletion_tokenstool_schema_tokens模型侧使用
Grounded Inference 路由把工具调用转成搜索查询,选择搜索提供商tool_router_tokenstool_choice_tokens不直接
搜索提供商Exa、Keenable、Parallel、You.com 返回结果search_callsresult_tokens否,按 Baseten 侧配置
缓存/去重相同查询命中缓存,减少搜索和模型重复调用cache_saved_tokens
计量与日志汇总模型 Token、搜索调用、重试和缓存retry_tokenstotal_tokens部分,模型侧可关联 Key

这张表的核心是:TaoToken Key 主要标在“客户端到模型 API”的边上。它告诉你模型推理走了哪个 Key、消耗了多少 Token。搜索提供商的选择和调用发生在 Baseten Hosted Tools 内部,Exa、Keenable、Parallel、You.com 的查询次数要单独记search_calls。如果你把搜索提供商的密钥和 TaoToken Key 混成一个字段,排障时会出现 401 来源不明;如果只记一个总 Token,模型 Token 和搜索调用又会糊在一起。

调用边可以这样定义:

  1. Client -> TaoToken API Key:客户端携带YOUR_API_KEY,请求https://taotoken.net/api。边标签:model_tokensrequest_id
  2. TaoToken API Key -> Baseten Hosted Model:模型侧鉴权通过,进入 Baseten 托管模型推理。边标签:prompt_tokenscompletion_tokens
  3. Baseten Hosted Model -> Grounded Inference Router:模型决定调用工具,产生tool_call。边标签:tool_name=grounded_inferencetool_schema_tokens
  4. Grounded Inference Router -> Exa:搜索后端为 Exa 时走这条边。边标签:provider=exasearch_calls
  5. Grounded Inference Router -> Keenable:搜索后端为 Keenable 时走这条边。边标签:provider=keenablesearch_calls
  6. Grounded Inference Router -> Parallel:搜索后端为 Parallel 时走这条边。边标签:provider=parallelsearch_calls
  7. Grounded Inference Router -> You.com:搜索后端为 You.com 时走这条边。边标签:provider=you_comsearch_calls
  8. Grounded Inference Router -> Cache:先查缓存,命中则跳过外部搜索。边标签:cache_hitcache_saved_tokens
  9. Cache -> MeterRouter -> MeterModel -> Meter:所有计量汇入同一个 trace,便于把 Token 消耗画回图。

这样拆完以后,调用图就不再是“模型调搜索”四个字,而是一张可以排障、可以归因、可以换 provider 的拓扑。

3. 用 Graphviz DOT 画出可维护的 Baseten Hosted Tools 调用图

下面这份 DOT 可以直接保存为baseten_grounded_inference.dot。没有使用 mermaid,因为 DOT 更适合放在工程仓库里,配合 CI 渲染成 SVG 或 PNG。节点里标出了 TaoToken Key、Base URL 和 Token 消耗类型,边里标出了搜索提供商和重试、缓存。

digraph BasetenGroundedInference { rankdir=LR; graph [fontname="Helvetica", bgcolor="white", pad="0.3"]; node [shape=box, style="rounded,filled", fontname="Helvetica", fontsize=11]; edge [fontname="Helvetica", fontsize=10]; subgraph cluster_client { label="客户端 / IDE / CI"; color="#D0D7DE"; style="rounded"; Client [label="Claude Code / Codex / 本地脚本\n执行位置:读者本地", fillcolor="#F6F8FA"]; } subgraph cluster_taotoken { label="TaoToken 模型接入层"; color="#0969DA"; style="rounded"; TaoKey [label="TaoToken API Key\nYOUR_API_KEY\nBase URL: https://taotoken.net/api\n标注:model_tokens", fillcolor="#DDF4FF"]; } subgraph cluster_baseten { label="Baseten Hosted Tools"; color="#BF8700"; style="rounded"; Model [label="Baseten 托管开源模型\nprompt_tokens / completion_tokens\ntool_schema_tokens", fillcolor="#FFF8C5"]; Router [label="Grounded Inference\n工具路由\ntool_router_tokens / tool_choice_tokens", fillcolor="#FFF8C5"]; } subgraph cluster_search { label="搜索提供商"; color="#CF222E"; style="rounded"; Exa [label="Exa\nsearch_calls / result_tokens", fillcolor="#FFEBE9"]; Keenable [label="Keenable\nsearch_calls / result_tokens", fillcolor="#FFEBE9"]; Parallel [label="Parallel\nsearch_calls / result_tokens", fillcolor="#FFEBE9"]; YouCom [label="You.com\nsearch_calls / result_tokens", fillcolor="#FFEBE9"]; } Cache [label="缓存 / 去重\ncache_hit / cache_saved_tokens", shape=cylinder, fillcolor="#DAFBE1"]; Meter [label="Token 计量与 Trace\nmodel_tokens\nsearch_calls\nretry_tokens\ntotal_tokens", shape=note, fillcolor="#EAEFF5"]; Client -> TaoKey [label="携带 YOUR_API_KEY\nmodel_tokens", color="#0969DA", penwidth=2.0]; TaoKey -> Model [label="模型推理\nprompt_tokens + completion_tokens", color="#0969DA", penwidth=2.5]; Model -> Router [label="tool_call\ngrounded_inference", color="#BF8700", penwidth=2.0]; Router -> Exa [label="provider=exa\nsearch_calls", color="#CF222E"]; Router -> Keenable [label="provider=keenable\nsearch_calls", color="#CF222E"]; Router -> Parallel [label="provider=parallel\nsearch_calls", color="#CF222E"]; Router -> YouCom [label="provider=you_com\nsearch_calls", color="#CF222E"]; Router -> Cache [label="先查缓存\ncache_hit / miss", color="#1A7F37", style=dashed]; Model -> Meter [label="模型 Token 上报", color="#57606A", style=dotted]; Router -> Meter [label="搜索调用上报", color="#57606A", style=dotted]; Cache -> Meter [label="节省量上报", color="#1A7F37", style=dotted]; }

渲染命令在本地执行即可,不需要把生产库或敏感数据接进来:

dot -Tsvg baseten_grounded_inference.dot -o baseten_grounded_inference.svg

如果你想把真实日志里的 Token 数写回图,可以用一段小脚本读取 JSON 日志并替换 DOT 变量。下面示例只处理本地文件:

import json from pathlib import Path trace = json.loads(Path("trace.json").read_text(encoding="utf-8")) model_tokens = trace["usage"]["prompt_tokens"] + trace["usage"]["completion_tokens"] search_calls = trace["search"]["queries"] retry_tokens = trace["retry"]["tokens"] dot = Path("baseten_grounded_inference.dot").read_text(encoding="utf-8") dot = dot.replace("model_tokens", f"model_tokens={model_tokens}") dot = dot.replace("search_calls", f"search_calls={search_calls}") dot = dot.replace("retry_tokens", f"retry_tokens={retry_tokens}") Path("baseten_grounded_inference.rendered.dot").write_text(dot, encoding="utf-8") print("已生成本地渲染版 DOT")

这段脚本只做一件事:把 trace 里的模型 Token、搜索查询数、重试 Token 注入图标签。后续你可以在 CI 里渲染成 SVG,放进架构文档。调用图的价值不在于好看,而在于每次换搜索提供商、加重试策略、开缓存时,都能看到哪条边变粗、哪个节点开始吃 Token。

4. 复现步骤:从 TaoToken 创建 Key 到 Baseten 侧配置 Grounded Inference

注册、登录、申请 Key、进入控制台这些动作,统一走 TaoToken 官网,不要散落在多个平台。入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=baseten_setup_intro 。进入控制台后创建 API Key,也可以用 API Keys 页面直达:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=baseten_setup_key 。复制出来的值就是后文所有配置里的YOUR_API_KEY

第一步,确认模型侧地址。Base URL 固定为:

https://taotoken.net/api

这个地址不要加 UTM,也不要拼成搜索提供商的地址。它用于 Claude Code、Codex、通用 OpenAI 兼容客户端和本地脚本。

第二步,写入本地环境变量。建议不要把 Key 硬编码到仓库:

export TAOTOKEN_API_KEY="YOUR_API_KEY" export TAOTOKEN_BASE_URL="https://taotoken.net/api"

Windows PowerShell 可以这样:

$env:TAOTOKEN_API_KEY="YOUR_API_KEY" $env:TAOTOKEN_BASE_URL="https://taotoken.net/api"

第三步,在 Baseten Hosted Tools 的 Grounded Inference 配置里选择搜索提供商。四家候选是 Exa、Keenable、Parallel、You.com。模型侧如果使用 OpenAI 兼容配置,就把 base_url 指向https://taotoken.net/api,api_key 填YOUR_API_KEY。搜索提供商如果需要在 Baseten 侧单独填写密钥,就按 Baseten 控制台要求填写,不要和 TaoToken Key 混用。一个常见错误是:模型侧 401 了,却去检查 Exa Key;或者搜索侧报错,却重新生成 TaoToken Key。调用图里把这两条边分开,就是为了避免这种排障错位。

第四步,发一个最小搜索问题验证 tool_call。比如让托管模型回答“最近一周某开源模型发布了哪些更新,需要联网检索”。验证时重点看日志里有没有这些字段:

{ "trace_id": "local-001", "model": "baseten-hosted-open-model", "tool": "grounded_inference", "provider": "exa", "usage": { "prompt_tokens": 1820, "completion_tokens": 410, "tool_schema_tokens": 260 }, "search": { "queries": 3, "results": 12 }, "retry": { "count": 1, "tokens": 620 }, "cache": { "hit": false } }

usage里的字段归到模型 Token,search.queries归到搜索调用,retry.tokens单独标红,cache.hit为 true 时在图上画绿色虚线并记cache_saved_tokens

第五步,排障时按边排查:

  • Client -> TaoToken返回 401:检查YOUR_API_KEY是否正确,Key 是否被删除,请求头是否是模型侧鉴权头。
  • TaoToken -> Baseten Model超时:检查 Base URL 是否为https://taotoken.net/api,网络与本地代理配置是否影响请求。
  • Model -> Router没有 tool_call:检查模型是否支持工具调用、提示词是否明确要求联网、Grounded Inference 是否已在 Hosted Tools 中启用。
  • Router -> Search Provider返回空结果:切换 Exa、Keenable、Parallel、You.com 中另一家做对照,不要先改模型侧 Base URL。
  • Router -> Meter计数与账单不一致:确认搜索调用和模型 Token 是否分开统计,重试是否被重复计入总 Token。

这套复现产出的不是一篇新闻摘要,而是三件可维护的东西:一张调用拓扑图、一张 Token 消耗标注表、一份 Key 入口说明。来源平台标记为 csdn_ugc,适合直接作为团队内部架构文档的初稿。

5. Claude Code、Codex、CC Switch 三件套:把 TaoToken Base URL 固化到本地

模型侧配置最容易混工具。Claude Code 用settings.jsonANTHROPIC_*,Codex 用config.toml,不要把ANTHROPIC_*套到 Codex 上。

Claude Code 的~/.claude/settings.json可以这样写:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }

这里ANTHROPIC_BASE_URL指向 TaoToken 的模型 API 地址,ANTHROPIC_AUTH_TOKENYOUR_API_KEY。模型名按你在 TaoToken 模型页实际可用的标识替换,不要照抄一个不可用的别名。

Codex 的~/.codex/config.toml用另一套写法:

model = "gpt-4.1" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"

然后在终端里设置:

export TAOTOKEN_API_KEY="YOUR_API_KEY"

Codex 读取的是TAOTOKEN_API_KEY,不是ANTHROPIC_AUTH_TOKEN。如果你在 Codex 配置里看到ANTHROPIC_*,那基本是复制错了工具模板,需要删掉。

CC Switch 三件套可以理解成三份独立 profile:Claude Code、Codex、通用 OpenAI 兼容。一个示意 YAML 如下,字段名按你本地 CC Switch 版本调整:

profiles: - name: taotoken-claude tool: claude-code settings: ~/.claude/settings.json - name: taotoken-codex tool: codex config: ~/.codex/config.toml env: TAOTOKEN_API_KEY: YOUR_API_KEY - name: taotoken-openai-compatible tool: generic base_url: https://taotoken.net/api api_key: YOUR_API_KEY

三件套的要点不是文件数量,而是边界:Claude Code 用ANTHROPIC_*,Codex 用config.toml + TAOTOKEN_API_KEY,通用兼容客户端用base_url + api_key。切换 profile 后重启对应工具或新开终端,避免旧环境变量残留。这样做完,调用图里的Client -> TaoToken边就有明确来源:Claude Code、Codex 或通用脚本,而不是一个模糊的“本地工具”。

6. Token 消耗标注与成本归因:模型 Token、搜索调用、重试、缓存怎么落到图上

调用图要能反映成本,不能只画节点。建议用边宽和颜色表达消耗:

  • 模型 Token 边用蓝色,penwidth = 1 + log(1 + model_tokens / 1000),这样 1k Token 和 100k Token 不会把图压垮。
  • 搜索调用边用红色,penwidth = 1 + log(1 + search_calls),因为搜索按查询次数计费时,次数比 Token 更直观。
  • 重试边用橙红色虚线,单独标retry_tokens。重试越多,边越粗,排障时第一眼能看到。
  • 缓存命中用绿色虚线,标cache_saved_tokens。它不是消耗,而是减少量,所以不要并进总 Token。
  • 模型工具 schema 用灰色小标签,标tool_schema_tokens。这部分容易被忽略,但复杂工具定义会稳定增加每轮 prompt 长度。

Token 消耗方要分成三本账:

第一本账是 Baseten 托管模型。它包含 prompt、completion、tool schema、模型决定是否调用工具时的输出。只要请求经过 TaoToken Key,模型侧就可以关联到 Key 和 trace_id。

第二本账是搜索链路。Grounded Inference 路由到 Exa、Keenable、Parallel、You.com 后,可能按搜索查询次数、结果条数、结果长度计费。它不一定走 TaoToken Key,所以图上必须单独画搜索提供商边。

第三本账是重试和缓存。重试会同时放大模型 Token 和搜索调用:模型重试一次,prompt 再算一次;搜索重试一次,查询次数再加一次;如果缓存命中,搜索边被绿色虚线截断,成本下降。

一个可落地的归因规则如下:

model_tokens = prompt_tokens + completion_tokens + tool_schema_tokens search_calls = exa_calls + keenable_calls + parallel_calls + you_com_calls retry_tokens = 每次重试的 model_tokens 之和 cache_saved_tokens = 命中缓存时本应发生的 model_tokens + search_calls 估算值 total_visible = model_tokens + retry_tokens

注意total_visible不等于全部成本,因为搜索调用可能按次计费,不按 Token 计费。调用图里要允许两种计量单位共存:模型侧用 Token,搜索侧用 calls。把它们强行换算成一个数,反而会掩盖问题。

常见排障场景可以这样定位:

  • 账单突然升高,模型边和搜索边都变粗:先看是不是重试增多。重试边如果是橙红色且比模型边还粗,优先检查超时、限流、搜索提供商稳定性。
  • 模型边正常,搜索边异常粗:说明搜索查询次数过多,可能是 prompt 让模型反复搜索,或者 Grounded Inference 路由没有去重。
  • 模型边异常粗,搜索边很细:说明搜索没怎么触发,但模型 prompt 变长,检查是否把大量搜索结果直接塞回上下文。
  • 缓存边出现绿色但总成本没降:检查缓存 key 是否包含用户、时间、模型版本等强变量,导致命中率虚高但实际没复用结果。
  • 图上有搜索提供商节点,但日志没有 provider 字段:检查 Grounded Inference 是否真的启用了,还是模型直接回答。

这些判断都建立在“边分开”的前提上。如果只有一张总账单,你只能猜;有了调用图和 Token 标注,就能按节点、按边、按 provider 归因。

7. CTA:从模型对话到 Coding Plan,再到创建 Key 和 Claude Code 文档

如果你想先验证模型侧链路,可以先打开模型对话,用最小提示词测试https://taotoken.net/api是否可用:https://taotoken.net/models/detail/chat?utm_source=taotoken_aicg_blog_end&utm_content=baseten_chat_cta 。模型对话适合快速确认 Key、模型名、Base URL 三项是否匹配,再回到 Baseten Hosted Tools 配置里排查 Grounded Inference 搜索链路。

如果你准备把 Claude Code、Codex、CC Switch 三件套长期用于日常开发,建议直接看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=baseten_coding_plan_cta 。Coding Plan 更适合固定工具链和长期调用,把模型侧配置一次固化,避免每次临时改环境变量。

下一步是创建或轮换 Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=baseten_api_keys_cta 。创建后把YOUR_API_KEY替换到 Claude Code 的ANTHROPIC_AUTH_TOKEN、Codex 的TAOTOKEN_API_KEY、以及 Baseten 模型侧 OpenAI 兼容配置中。搜索提供商 Exa、Keenable、Parallel、You.com 的密钥按 Baseten 侧要求单独管理。

Claude Code 的完整配置可以对照文档:https://taotoken.net/doc/ClaudeCodeAnthropic?utm_source=taotoken_aicg_blog_end&utm_content=baseten_claude_code_doc_cta 。文档里重点确认settings.jsonANTHROPIC_BASE_URLANTHROPIC_AUTH_TOKEN三项,再回到本文的 DOT 调用图,把Client -> TaoToken -> Baseten Hosted Model -> Grounded Inference -> Search Provider这条链路画出来。TaoToken 官网入口再放一次:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=baseten_final_cta ,从控制台创建 Key 后,你就能把模型 Token、搜索调用、重试和缓存四类标注落到同一张 Baseten Hosted Tools 调用图上。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询