
1. 浏览器 Agent 的钱到底被谁赚走了浏览器 Agent 这个词2026 年已经不算新鲜。它能做什么简单说就是让模型直接操控浏览器——打开页面、点击按钮、填表单、抓数据、走完一个完整的任务流。适合谁适合那些想把重复性网页操作自动化的人做数据采集的、跑运营流程的、搭企业内部工具的以及想验证 Agent 单位经济模型的开发者。但真正值得聊的不是能不能做而是做了之后钱落在哪一层。过去一年单任务成本从 0.5 到 1.5 美元掉到 0.05 到 0.15 美元跌了大约一个数量级。与此同时Agent 的壳也在极小化——用 Zig 写的编码 Agent 壳能压到 6.39MB甚至编译成 WebAssembly 直接在浏览器标签页里跑。当能做不再稀缺当壳变成开源二进制、模型变成公共 API价值捕获就变成了一个纯粹的工程经济学问题每一步任务的 token 账单、沙箱执行开销、支付抽成到底沉淀在哪一层这篇文章不聊宏观叙事聊可复现的东西。我会用 TaoToken 的统一 Key/API 通道搭一个最小可跑的浏览器 Agent 计费骨架把 settings.json 和 config.toml 两份配置给全然后一步步验证每步任务的成本链路。你可以在本地跟着跑一遍看清楚钱是怎么在模型层、运行时层和任务层之间流动的。2. TaoToken 前置统一 Key 与 API 通道在开始配之前先说清楚 TaoToken 在这里扮演什么角色。浏览器 Agent 的一个核心痛点是你往往要同时调多个模型——规划用强的、执行用快的、视觉理解用多模态的。如果每个模型都单独申请 Key、单独配 endpoint配置会散得到处都是成本也没法统一归集。TaoToken 提供的是一个统一的 API 通道。你申请一个 Key就能通过同一个 base URL 访问不同的模型计费也集中在一处。这对浏览器 Agent 这种每步任务都要算钱的场景特别重要——因为你需要一个统一的账单视角才能看清楚每一步到底花了多少。你需要准备的东西一个 TaoToken 账号在控制台创建一个 API Key本地装好 Python 3.10 或 Node 20下面以 Python 为例一个能跑浏览器的环境Playwright 或本地 Chrome 都行API Key 的创建入口在控制台的 API Keys 页面。拿到 Key 之后base URL 统一用https://taotoken.net/api不要带任何多余路径。模型名按你实际要用的填比如规划类任务用一个推理强的模型执行类任务用一个响应快的模型。注意Key 只创建一次就够不要每个模型建一个。统一 Key 的意义就在于账单归集和配置收敛。3. 可复制配置settings.json 与 config.toml这一节给两份可直接复制的配置骨架。settings.json 用于 Agent 运行时的模型路由config.toml 用于计费与沙箱参数。两份文件放在项目根目录即可。3.1 settings.json模型路由与统一通道{ provider: { name: taotoken, base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, timeout_seconds: 60, max_retries: 2 }, model_routing: { planner: { model: your-reasoning-model, temperature: 0.2, max_tokens: 2048 }, executor: { model: your-fast-model, temperature: 0.0, max_tokens: 1024 }, vision: { model: your-vision-model, temperature: 0.0, max_tokens: 512 } }, billing: { track_per_step: true, log_path: ./logs/step_cost.jsonl, currency: USD } }这里的关键是track_per_step。打开之后Agent 每执行一步一次模型调用 一次浏览器动作都会往step_cost.jsonl里写一条记录包含模型名、输入输出 token 数、估算成本。这样你就能在任务结束后把整条链路的成本拆开看。3.2 config.toml沙箱与执行参数[agent] name browser-agent-min max_steps 30 step_timeout_ms 15000 [sandbox] enabled true runtime wasm wasm_module_path ./sandbox/agent_shell.wasm memory_limit_mb 256 allow_network true allowed_domains [*] [billing] provider taotoken base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY record_granularity per_step export_format jsonl [browser] headless true viewport_width 1280 viewport_height 800 user_data_dir ./chrome-profileruntime wasm这一行是重点。把 Agent 的执行壳放进 WebAssembly 沙箱意味着每一步动作都在一个受限的内存和权限边界内跑。这既对应了壳极小化的趋势也让每步任务的资源开销变得可计量——沙箱的 CPU 时间、内存峰值都能作为成本的一部分记进账单。3.3 环境变量与启动export TAOTOKEN_API_KEYsk-your-key-here mkdir -p logs sandbox python -m browser_agent.run --config config.toml --settings settings.json启动后Agent 会读取两份配置把模型调用统一走 TaoToken 通道把每步成本写进日志。4. 验证请求跑通每步计费链路配置写完不算完得验证它真的在按步计费。这一节给一个最小任务让 Agent 打开一个页面抓取标题然后返回。整个过程应该产生 3 到 4 步每步都有成本记录。4.1 最小任务脚本import json import os import time from pathlib import Path import httpx API_BASE https://taotoken.net/api API_KEY os.environ[TAOTOKEN_API_KEY] def call_model(model: str, messages: list, step: int) - dict: headers { Authorization: fBearer {API_KEY}, Content-Type: application/json, } payload { model: model, messages: messages, temperature: 0.0, } start time.time() resp httpx.post(f{API_BASE}/v1/chat/completions, headersheaders, jsonpayload, timeout60) resp.raise_for_status() data resp.json() elapsed time.time() - start usage data.get(usage, {}) record { step: step, model: model, prompt_tokens: usage.get(prompt_tokens, 0), completion_tokens: usage.get(completion_tokens, 0), elapsed_sec: round(elapsed, 3), ts: time.time(), } Path(logs).mkdir(exist_okTrue) with open(logs/step_cost.jsonl, a) as f: f.write(json.dumps(record) \n) return data if __name__ __main__: msgs [{role: user, content: Return the word: ready}] out call_model(your-fast-model, msgs, step1) print(out[choices][0][message][content])跑这个脚本你会看到logs/step_cost.jsonl里多了一行记录包含 token 数和耗时。4.2 查看每步成本cat logs/step_cost.jsonl | python -m json.tool --json-lines输出类似{step: 1, model: your-fast-model, prompt_tokens: 12, completion_tokens: 3, elapsed_sec: 0.842, ts: 1750000000.0}把多步的记录拼起来你就能算出整个任务的总 token 消耗和总耗时。这就是每步任务都算钱的最小闭环——每一步的模型调用都被记录成本可归集、可拆解。4.3 接入浏览器动作把上面的模型调用和 Playwright 结合每一步模型决策 浏览器执行都写一条记录from playwright.sync_api import sync_playwright def run_task(url: str): with sync_playwright() as p: browser p.chromium.launch(headlessTrue) page browser.new_page() page.goto(url) title page.title() browser.close() return title if __name__ __main__: title run_task(https://example.com) print(page title:, title)把run_task的耗时也记进step_cost.jsonl你就有了一个包含模型成本和执行成本的完整账单。5. 本篇常见错排查配这套东西的时候有几个坑我踩过列出来帮你省时间。第一个坑base URL 写错。TaoToken 的 API 地址是https://taotoken.net/api不要在后面加/v1之外的路径也不要用官网首页地址去拼。如果你在 settings.json 里写了https://taotoken.net/api/v1/chat/completions作为 base再让 SDK 自己拼/v1/chat/completions就会变成双/v1直接 404。第二个坑Key 没进环境变量。api_key_env里写的是变量名不是 Key 本身。如果你把 Key 直接写进 settings.json一是泄露风险二是换环境时要改文件。正确做法是export TAOTOKEN_API_KEY...配置文件只引用变量名。第三个坑WASM 沙箱模块路径不对。wasm_module_path指向的文件必须真实存在否则 Agent 启动时会静默降级到非沙箱模式你以为在跑沙箱其实没有。启动后检查日志里有没有sandbox: wasm enabled这一行。第四个坑计费日志没开。track_per_step默认可能是 false如果你没显式打开step_cost.jsonl会是空的。跑完任务先ls -la logs/确认文件存在且有内容。第五个坑模型名填错。不同模型的名称不一样填错了会返回 400。先用一个最简单的请求验证模型名可用再写进路由配置。第六个坑超时设置太短。浏览器 Agent 的规划步骤可能比较慢timeout_seconds设 60 比较稳。如果设 10复杂任务会频繁超时重试成本反而上去。6. 把成本链路跑通之后到这里你已经有了一个可复现的最小骨架统一 Key 走 TaoToken 通道settings.json 管模型路由config.toml 管沙箱和计费每步任务的 token 和耗时都落进 jsonl 日志。接下来你可以做几件事把它用起来。一是把日志接进一个简单的汇总脚本按任务 ID 聚合算出每个任务的平均成本和成功率。二是把沙箱的内存和 CPU 时间也记进账单这样你就能看到模型成本和执行成本各占多少。三是换不同的模型组合跑同一批任务对比单位经济——这一步做完你就知道钱到底落在哪一层了。如果你要长期跑编码类或 Agent 类任务可以看看 Coding Plan 这条线它更适合持续性的开发场景。如果只是想先验证模型对话和计费链路模型对话入口更直接。Key 的管理和创建在 API Keys 页面接入细节在接入文档里都有。把配置跑起来看日志算成本。这比任何宏观判断都实在。