---
title: "AI SDK 集成"
description: "将 Vercel AI SDK 的令牌使用量、工具调用、模型信息和流式指标捕获到宽事件中。包装你的模型，其余内容自动获得。"
canonical_url: "https://evlog.zhcndoc.com/use-cases/ai-sdk/overview"
---
# AI SDK 集成

> 将 Vercel AI SDK 的令牌使用量、工具调用、模型信息和流式指标捕获到宽事件中。包装你的模型，其余内容自动获得。

`evlog/ai` 通过使用中间件包装你的模型，为你提供完整的 AI 可观测性。令牌使用量、工具调用、流式性能、缓存命中、推理令牌和成本估算都会自动捕获到宽事件中。

<prompt :actions="["copy","cursor","claude"]" description="使用 evlog 添加 AI 可观测性" icon="i-simple-icons-vercel">

使用 evlog 为我的应用添加 AI 可观测性。

- 安装 AI SDK：pnpm add ai
- 从 'evlog/ai' 导入 createAILogger
- 使用 createAILogger(log) 创建 AI 日志记录器，其中 log 是你的请求日志记录器
- 使用 ai.wrap('anthropic/claude-sonnet-4.6') 包装模型，并将其传递给 generateText、streamText 等函数
- Token 使用量、工具调用、流式指标和错误会自动捕获到宽事件中
- 如需更深入的可观测性（工具执行耗时、生成总墙钟时间），请将 createEvlogIntegration(ai) 添加到 telemetry.integrations
- 对于嵌入调用，请在 embed() 或 embedMany() 之后使用 ai.captureEmbed({ usage, model, dimensions, count })
- 如需成本估算，请传入成本映射：createAILogger(log, { cost: { 'claude-sonnet-4.6': { input: 3, output: 15 } } })
- 支持所有框架：Nuxt、Express、Hono、Fastify、NestJS、Elysia，以及独立运行环境

文档：[https://www.evlog.dev/use-cases/ai-sdk/overview](https://www.evlog.dev/use-cases/ai-sdk/overview)
适配器：[https://www.evlog.dev/integrate/adapters/overview](https://www.evlog.dev/integrate/adapters/overview)

</prompt>

## 安装

将 AI SDK 作为依赖添加：

<code-group>

```bash [pnpm]
pnpm add ai
```

```bash [bun]
bun add ai
```

```bash [yarn]
yarn add ai
```

```bash [npm]
npm install ai
```

</code-group>

## 快速开始

<ai-sdk-wide-event>



</ai-sdk-wide-event>

需要添加两行，修改一个参数：

<code-group>

```typescript [Before]
export default defineEventHandler(async (event) => {
  const result = streamText({
    model: 'anthropic/claude-sonnet-4.6',
    messages,
  })
  return result.toTextStreamResponse()
})
```

```typescript [After]
import { useLogger } from 'evlog'
import { createAILogger } from 'evlog/ai'

export default defineEventHandler(async (event) => {
  const log = useLogger(event)
  const ai = createAILogger(log)

  const result = streamText({
    model: ai.wrap('anthropic/claude-sonnet-4.6'),
    messages,
  })
  return result.toTextStreamResponse()
})
```

</code-group>

你的宽事件现在包括：

```json [Wide Event]
{
  "method": "POST",
  "path": "/api/chat",
  "status": 200,
  "duration": "4.5s",
  "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
  }
}
```

## 工作原理

`createAILogger(log, options?)` 会返回一个 `AILogger`，包含以下方法：

<table>
<thead>
  <tr>
    <th>
      方法
    </th>
    
    <th>
      描述
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        wrap(model)
      </code>
    </td>
    
    <td>
      使用中间件包装语言模型。接受模型字符串（例如 <code>
        'anthropic/claude-sonnet-4.6'
      </code>
      
      ）或 <code>
        LanguageModelV3
      </code>
      
       / <code>
        LanguageModelV4
      </code>
      
       对象。适用于 <code>
        generateText
      </code>
      
      、<code>
        streamText
      </code>
      
       和 <code>
        ToolLoopAgent
      </code>
      
      。
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        captureEmbed(result)
      </code>
    </td>
    
    <td>
      手动从 <code>
        embed()
      </code>
      
       或 <code>
        embedMany()
      </code>
      
       结果中捕获令牌用量、模型信息和维度。
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        getMetadata()
      </code>
    </td>
    
    <td>
      返回当前执行元数据的快照。请参阅<a href="https://evlog.zhcndoc.com/use-cases/ai-sdk/metadata">
        访问元数据
      </a>
      
      。
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        getEstimatedCost()
      </code>
    </td>
    
    <td>
      配置了 <code>
        cost
      </code>
      
       映射时，返回当前以美元计的预估成本。
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        onUpdate(callback)
      </code>
    </td>
    
    <td>
      订阅元数据更新。每个步骤、嵌入、错误和集成完成时触发。
    </td>
  </tr>
</tbody>
</table>

该中间件在提供方层拦截调用。它不会触碰你的回调、提示词或响应。捕获的数据会通过正常的 evlog 管道流动（采样、增强器、drain），并落入 Axiom、Better Stack 或你输出到的任何地方。

## 下一步

<card-group>
<card icon="i-lucide-code" title="使用模式" to="https://evlog.zhcndoc.com/use-cases/ai-sdk/usage">

`streamText`、`generateText`、多步骤代理、RAG、多模型：每种常见模式都已准备好，可直接复制。

</card>

<card icon="i-lucide-sliders" title="选项" to="https://evlog.zhcndoc.com/use-cases/ai-sdk/options">

捕获工具输入（支持脱敏和截断）、启用成本估算并处理错误。

</card>

<card icon="i-lucide-database" title="访问元数据" to="https://evlog.zhcndoc.com/use-cases/ai-sdk/metadata">

在处理程序中读取捕获的 `ai` 数据：持久化数据、据此计费，或将其流式传输给客户端。

</card>

<card icon="i-lucide-activity" title="更深入的遥测" to="https://evlog.zhcndoc.com/use-cases/ai-sdk/telemetry">

使用 `createEvlogIntegration` 添加工具执行时间和总墙钟时间。可与其他中间件组合使用。

</card>
</card-group>

## 适用于所有框架

`evlog/ai` 适用于 evlog 支持的任何框架：

<framework-tabs>

```typescript [Nuxt]
import { useLogger } from 'evlog'
import { createAILogger } from 'evlog/ai'

const log = useLogger(event)
const ai = createAILogger(log)
```

```typescript [Next.js]
import { withEvlog, useLogger } from '@/lib/evlog'
import { createAILogger } from 'evlog/ai'

export const POST = withEvlog(async () => {
  const log = useLogger()
  const ai = createAILogger(log)
  // ...
})
```

```typescript [Express]src/index.ts
import { createAILogger } from 'evlog/ai'

app.post('/api/chat', (req, res) => {
  const ai = createAILogger(req.log)
  // ...
})
```

```typescript [Hono]src/index.ts
import { createAILogger } from 'evlog/ai'

app.post('/api/chat', (c) => {
  const ai = createAILogger(c.get('log'))
  // ...
})
```

```typescript [Fastify]src/index.ts
import { createAILogger } from 'evlog/ai'

app.post('/api/chat', async (request) => {
  const ai = createAILogger(request.log)
  // ...
})
```

```typescript [NestJS]src/app.module.ts
import { useLogger } from 'evlog/nestjs'
import { createAILogger } from 'evlog/ai'

const log = useLogger()
const ai = createAILogger(log)
```

```typescript [Standalone]
import { createLogger } from 'evlog'
import { createAILogger } from 'evlog/ai'

const log = createLogger()
const ai = createAILogger(log)
// ...
log.emit()
```

</framework-tabs>

---

- [使用模式](https://evlog.zhcndoc.com/use-cases/ai-sdk/usage)
- [选项](https://evlog.zhcndoc.com/use-cases/ai-sdk/options)
- [访问元数据](https://evlog.zhcndoc.com/use-cases/ai-sdk/metadata)
- [更深入的遥测](https://evlog.zhcndoc.com/use-cases/ai-sdk/telemetry)


## Sitemap

See the full [sitemap](https://evlog.zhcndoc.com/sitemap.md) for all pages.
