AI SDK + evlog:每次AI调用一条完整事件,token、工具调用与成本尽收眼底

发布时间:2026/10/10 14:12:50

AI SDK + evlog:每次AI调用一条完整事件,token、工具调用与成本尽收眼底 【免费下载链接】evlogDigging through logs is not observability. Its hope — wide events, structured errors, TypeScript-first, every runtime.项目地址https://gitcode.com/gh_mirrors/ev/evlog点击查看免费下载evlog 是一个 TypeScript 优先的结构化日志库核心理念是每个请求一条宽事件wide event。配合官方 AI SDKevlog/ai会把每次 AI 调用的 token 用量、工具调用、流式速度与成本自动汇总进同一条宽事件——无需手写埋点也无需额外追踪。你是否遇到过这样的场景AI 接口跑了一分钟你却不知道它消耗了多少 token、调了哪些工具、花了多少钱本文带你用 3 步完成接入让 AI 调用可观测变得简单。一、为什么 AI 调用需要一条完整事件 AI 应用里的传统埋点方式痛点很明显token 是散的输入、输出、推理 token 藏在响应各处翻账单要逐个对成本是黑盒单次请求花了多少钱无法实时知道做预算告警和计费都很吃力工具调用难复盘一个多步 Agent 调了 5 次工具却看不出哪一步慢、哪一步失败日志是碎的一次聊天请求散落几十行日志凌晨三点只能靠 grep 找信号。evlog 的思路正好相反与其翻日志找线索不如每次只留一条完整事件。二、三步接入两行代码开始记录 AI 调用 ⚡2.1 安装依赖添加 AI SDK 即可evlog 通常在项目中已就绪npm install ai2.2 用中间件包裹模型加两行、改一个参数接入即完成import { useLogger } from evlog import { createAILogger } from evlog/ai const log useLogger(event) // evlog 的请求日志器 const ai createAILogger(log) // AI 可观测日志器 const result streamText({ model: ai.wrap(anthropic/claude-sonnet-4.6), messages, })ai.wrap()返回一个带中间件的模型之后generateText、streamText、ToolLoopAgent的每次调用都会自动累计数据。中间件不触碰你的onFinish回调、提示词和响应属于纯旁观式记录。2.3 拿回完整事件请求结束时宽事件自动携带ai字段发出{ method: POST, path: /api/chat, status: 200, durationMs: 4512, ai: { calls: 1, model: claude-sonnet-4.6, provider: anthropic, inputTokens: 3312, outputTokens: 814, totalTokens: 4126, reasoningTokens: 225, finishReason: stop, msToFirstChunk: 234, msToFinish: 4500, tokensPerSecond: 180 } }三、evlog/ai 会自动捕获哪些数据 不做任何额外配置ai.wrap()就已经记录了这些内容数据宽事件字段说明token 用量ai.inputTokens/ai.outputTokens/ai.totalTokens同一请求内多次调用自动累计缓存命中ai.cacheReadTokens/ai.cacheWriteTokens提示词缓存的读写 token推理 tokenai.reasoningTokens扩展思考产生的 token模型信息ai.model/ai.provider/ai.models最后使用的模型、提供方、多模型场景的全部模型工具调用ai.toolCalls默认记录工具名开启后可附带调用入参流式指标ai.msToFirstChunk/ai.tokensPerSecond首 token 时延、输出速度结束原因ai.finishReasonstop、tool-calls、error等错误ai.error模型调用失败信息先写入事件再重新抛出对流式响应evlog 在 Nuxt、Nitro、Next.js 等框架上会把宽事件的发出延迟到流结束后保证最终的 token 数据和请求上下文落在同一条事件上。四、估算 AI 调用成本加一张价格表 cost选项接受按每百万 token 美元计价的价格表宽事件会自动算出ai.estimatedCostconst ai createAILogger(log, { cost: { claude-sonnet-4.6: { input: 3, output: 15 }, gpt-4o: { input: 2.5, output: 10 }, }, }) // 在处理器里随时读取本次调用的成本 const cost ai.getEstimatedCost() console.log(本次调用花费 $${cost?.toFixed(4)})由此可以实现昂贵调用前先提醒用户、按用户汇总 AI 支出等场景。小建议把价格表和模型选择放在同一个文件里维护换模型时价格同步更新避免多条路由各自维护导致漂移。五、多步 Agent、RAG 与多模型场景 5.1 多步 Agent 全程留痕使用ToolLoopAgent时中间件对每一步自动记录宽事件里能看到逐步明细{ ai: { calls: 3, steps: 3, toolCalls: [searchWeb, queryDatabase, searchWeb], stepsUsage: [ { model: claude-sonnet-4.6, inputTokens: 1200, outputTokens: 300, toolCalls: [searchWeb] }, { model: claude-sonnet-4.6, inputTokens: 1500, outputTokens: 400, toolCalls: [queryDatabase, searchWeb] } ] } }想看到每个工具收到的入参调试 Agent 行为时非常有用开启toolInputsconst ai createAILogger(log, { toolInputs: { maxLength: 500 } })5.2 RAG 里的 embedding 调用embedding 模型不能通过中间件包裹用专门方法手动上报即可const { embedding, usage } await embed({ model: embeddingModel, value: query }) ai.captureEmbed({ usage, model: text-embedding-3-small, dimensions: 1536 })5.3 多模型路由每个模型各自wrap一次即可它们共享同一个累计器。事件里会同时出现ai.model最后一次使用的模型和ai.models出现过的全部模型路由行为一目了然。六、更深度的遥测工具执行耗时与总生成时长 ai.wrap()覆盖 token、模型与流式指标若还想拿到每个工具的执行耗时、成功/失败以及整次生成的总墙上时间再叠加一个集成即可const result await generateText({ model: ai.wrap(anthropic/claude-sonnet-4.6), tools: { getWeather, searchDB }, telemetry: { integrations: [createEvlogIntegration(ai)], }, })宽事件随之多出这些字段{ ai: { tools: [ { name: getWeather, durationMs: 150, success: true }, { name: searchDB, durationMs: 45, success: true } ], totalDurationMs: 2340 } }在 AI SDK v7 上该集成还会自动捕获 embedding、流式中止ai.finishReason: abort和不可恢复错误两者组合即完整的 AI 可观测。七、新手避坑4 条最佳实践 ✅敏感内容默认不开启prompt、output、toolInputs三个选项默认关闭模型收发过的内容不会流入日志目的地除非你点名要要捕获就先加maxLength和transform两者内置支持截断与脱敏。工具入参常含 SQL、密钥和用户数据生产环境建议先开截断再开捕获价格表单一来源cost表与模型配置放一起维护改模型和改价格发生在同一处错误也在同一条事件模型调用失败会先写入ai.error再重新抛出你的try/catch照常工作排查时一条事件同时看到错误、token 和工具调用。八、相关资源 官方文档 · AI SDK 集成总览apps/docs/content/5.use-cases/2.ai-sdk/01.overview.md用法模式流式、Agent、RAG、多模型apps/docs/content/5.use-cases/2.ai-sdk/02.usage.md全部选项工具入参、提示词/输出捕获、成本表apps/docs/content/5.use-cases/2.ai-sdk/03.options.md在处理器内读取元数据getMetadata/getEstimatedCost/onUpdateapps/docs/content/5.use-cases/2.ai-sdk/04.metadata.md深度遥测工具耗时、总生成时长apps/docs/content/5.use-cases/2.ai-sdk/05.telemetry.md核心实现createAILogger入口packages/evlog/src/ai/index.ts#L490-L531宽事件概念详解apps/docs/content/2.learn/2.wide-events.md从今天起让每次 AI 调用都留下一条完整、可检索、可分析的事件——token、工具调用与成本尽收眼底。赞分享【免费下载链接】evlogDigging through logs is not observability. Its hope — wide events, structured errors, TypeScript-first, every runtime.项目地址https://gitcode.com/gh_mirrors/ev/evlog点击查看免费下载相关推荐evlog × eve agent可观测性每轮对话一条宽事件token与工具调用全透明evlog × eve agent可观测性每轮对话一条宽事件token与工具调用全透明 evlog 是 TypeScript 优先的宽事件Wide EveDLSS Swapper 完整教程不等游戏更新一键切换 DLSS 版本DLSS Swapper 完整教程不等游戏更新一键切换 DLSS 版本 你想让老游戏用上新版 DLSS但游戏自带的 DLL 还停在旧版本甚至不知道文件藏桌面应用PostHog 前端中的 Tool 调用事件总线用 toolStreamEventsLogic 让页面实时响应 AI Agent 的每一次工具调用PostHog 前端中的 Tool 调用事件总线用 toolStreamEventsLogic 让页面实时响应 AI Agent 的每一次工具调用 导读 当用数据分析后端前端数据可视化大数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/10 14:12:50

Python字符串处理实战:大小写切换与上下标转换详解

1. 先把字符的老底摸清,后面才不会翻车1.1 字符与数字之间只隔着一层映射处理字符这件事,说难不难,说简单也真容易翻车。大小写切换、上下角标这俩需求,几乎每个写脚本的人都躲不开——前者是各种实验题和算法题里的常客&#xff…

2026/10/10 14:12:50

AIAgent高可用架构与自愈实战

我将围绕标题撰写精简的技术文档,讲解AIAgent高可用核心架构、关键方案并搭配可落地代码演示,严控字数在1500字内,文末按要求添加指定文案。 # AIAgent高可用架构:弹性容错与故障自愈的落地实践 ## 一、概述 随着智能Agent在自动化…

2026/10/10 15:23:12

程序员真实工作流:从写代码到让系统持续运转

1. 这不是职业说明书,而是一份“程序员生存实录”“程序员是做什么的”——这个问题我被问过至少两百次。问的人里,有刚高考完填志愿的高中生,有想转行的35岁销售主管,有给孩子挑兴趣班的家长,甚至还有某高校教务处老师…

2026/10/10 15:23:12

WinCC用户归档实战:从建表到SQL查询的完整指南

简介:WinCC用户归档案例是一份面向工业自动化工程师的SCADA数据管理实践资源,聚焦西门子WinCC中用户归档功能与动作、标准模块的协同应用。资源通过具体项目演示如何配置归档触发条件,利用动作响应变量变化或按钮事件来启动归档,同…

2026/10/10 15:23:12

个人知识管理进阶:从笔记库存到可调用资产的版本迭代实践

“1.27的学习笔记”这个标题,如果你以为是某个人在某年1月27号随手记的流水账,那恐怕要失望了。对我来说,“1.27”是我个人知识管理系统的版本号——从我开始正经搭这套学习笔记体系起,已经迭代到第1.27个小版本了。这篇笔记不打算…

2026/10/10 15:23:12

SAP BTP ABAP环境证书配置实战:从信任链到TLS排障的完整指南

从一次半夜的“证书报错”说起。我负责的一个ABAP环境(SAP BTP ABAP environment)集成项目里,某天凌晨出站接口突然大面积失败,日志里只有一句话:证书校验失败。当时大家第一反应都是“证书不是云平台自动管的吗&#…

2026/10/10 15:23:12

SOAP/OData/Event错误日志业务目录:角色分配与权限治理实战

我先把这个标题拆开聊两句。很多人一看到“SOAP / OData / Event 错误日志业务目录”这种说法,第一反应是“这不就是给接口配几个错误码嘛”,结果真正上手才发现,事情远没有那么简单——数据接口报错不是只有一个日志文件,而是散落…

2026/10/10 15:18:11

编译原理实验:手写DFA词法分析器与递归下降语法分析器实践

简介:一份面向计算机专业学生与编译器初学者的C实现资源,围绕编译原理课程中的核心实验展开,完整演示了词法分析器与语法分析器的设计与编码过程。压缩包共9个文件,包括两个cpp源程序、两个可直接运行的exe程序,以及文…

2026/10/10 7:31:36

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑