使用文档

AI Tracker SDK

AntDock AI Tracker 专为 LLM 调用追踪设计,帮助您监控和分析 AI 应用的使用情况和成本。

特点

  • 元数据优先: 默认只追踪调用元数据,不记录 prompt 和 response 内容;请勿在自定义标签中传入敏感信息
  • 费用来源可追溯: 区分提供方上报、内置单价估算和无法计算;估算金额不等同账单
  • 性能指标: 延迟、TTFT、tokens/秒 等关键指标
  • 多模型支持: OpenAI、Anthropic、DeepSeek 等主流模型

安装

控制台的「AI 调用 → 接入指南」为 Node SDK、浏览器 SDK 和 HTTP API 分别提供「复制给 AI 的接入说明」。说明随当前应用及采集域名生成,要求复用实际模型调用,不发送示例请求或编造 Token、费用;不包含模型 API Key。AI 完成代码修改后,需确认一条真实调用在控制台可查询。

Script 标签

<script defer src="https://your-domain.com/static/antdock-ai.js"
  data-app-id="your-app-id"
  data-endpoint="https://your-domain.com">
</script>

npm

npm install https://antdock.com/static/sdk/antdock-ai-tracker-0.1.0.tgz
import { AntDockAI } from '@antdock/ai-tracker'

const tracker = new AntDockAI({
  appId: 'your-app-id',
  endpoint: 'https://your-domain.com'
})

快速开始

手动追踪

import { AntDockAI } from '@antdock/ai-tracker'

const tracker = new AntDockAI({
  appId: 'your-app-id',
  endpoint: 'https://your-domain.com'
})

// 开始计时
const timer = tracker.startTimer()

// 调用 LLM
const response = await openai.chat.completions.create({
  model: 'gpt-4o',
  messages: [{ role: 'user', content: 'Hello' }]
})

// 追踪调用
tracker.trace({
  provider: 'openai',
  model: 'gpt-4o',
  promptTokens: response.usage.prompt_tokens,
  completionTokens: response.usage.completion_tokens,
  latencyMs: timer.elapsed(),
  status: 'success'
})

OpenAI 自动追踪

import OpenAI from 'openai'
import { AntDockAI } from '@antdock/ai-tracker'

const openai = new OpenAI()
const tracker = new AntDockAI({
  appId: 'your-app-id',
  endpoint: 'https://your-domain.com'
})

// 包装 OpenAI 客户端
const wrappedOpenAI = tracker.wrapOpenAI(openai)

// 正常使用,自动追踪
const response = await wrappedOpenAI.chat.completions.create({
  model: 'gpt-4o',
  messages: [{ role: 'user', content: 'Hello' }]
})

API 参考

trace(data)

追踪 LLM 调用。

tracker.trace({
  // 必填字段
  provider: 'openai',           // 提供商: openai, anthropic, deepseek, etc.
  model: 'gpt-4o',              // 模型名称

  // Token 使用
  promptTokens: 150,            // 输入 token 数
  completionTokens: 50,         // 输出 token 数
  costUsd: 0.0005,              // 可选:提供方上报的实际金额(含 0)

  // 性能指标
  latencyMs: 1500,              // 总延迟 (毫秒)
  timeToFirstTokenMs: 200,      // 首个 token 时间 (毫秒)

  // 参数配置
  temperature: 0.7,
  topP: 1.0,
  maxTokens: 1000,
  frequencyPenalty: 0,
  presencePenalty: 0,

  // 状态
  status: 'success',            // success, error
  errorType: '',                // timeout, rate_limit, invalid_request, etc.
  errorCode: '',
  finishReason: 'stop',         // stop, length, content_filter

  // 元数据
  promptTemplate: 'chat',       // 模板名称
  feature: 'customer_support',  // 功能标签
  userId: 'user_123',           // 用户 ID

  // 流式响应
  streaming: false,
  streamChunks: null
})

startTimer()

创建计时器用于测量延迟。

const timer = tracker.startTimer()

// 执行操作...

const elapsedMs = timer.elapsed()
console.log(`耗时: ${elapsedMs}ms`)

wrapOpenAI(client)

包装 OpenAI 客户端实现自动追踪。

const openai = new OpenAI()
const wrappedOpenAI = tracker.wrapOpenAI(openai)

// 自动追踪所有调用
const response = await wrappedOpenAI.chat.completions.create({...})

flush()

立即发送队列中的数据。

await tracker.flush()

费用口径

优先传入提供方实际返回的 costUsd(包括免费调用的 0)。未传入时,SDK 仅对内置价目表中可识别的模型按输入/输出 Token 估算;未知模型标记为“无法计算”,不会套用默认价格。页面会分别显示上报、估算、旧版未标注来源和无法计算的请求数。

直接调用 /api/ai/trace 时,如传入提供方金额,请同时传 "costSource":"reported",才能区分明确的零费用与未提供费用。

内置单价可能落后于提供方调整,且不包含缓存 Token、阶梯价、折扣、渠道加价或汇率。请以提供方账单为准;需要对账时,在服务端上报实际金额。浏览器不应持有提供方密钥。

框架集成

LangChain

import { ChatOpenAI } from '@langchain/openai'
import { AntDockAI } from '@antdock/ai-tracker'

const tracker = new AntDockAI({...})

const model = new ChatOpenAI({
  modelName: 'gpt-4o',
  callbacks: [{
    handleLLMEnd(output) {
      const usage = output.llmOutput?.tokenUsage
      tracker.trace({
        provider: 'openai',
        model: 'gpt-4o',
        promptTokens: usage?.promptTokens,
        completionTokens: usage?.completionTokens,
        status: 'success'
      })
    },
    handleLLMError(error) {
      tracker.trace({
        provider: 'openai',
        model: 'gpt-4o',
        status: 'error',
        errorType: 'api_error'
      })
    }
  }]
})

Vercel AI SDK

import { openai } from '@ai-sdk/openai'
import { generateText } from 'ai'
import { AntDockAI } from '@antdock/ai-tracker'

const tracker = new AntDockAI({...})

const timer = tracker.startTimer()

const { text, usage } = await generateText({
  model: openai('gpt-4o'),
  prompt: 'Hello'
})

tracker.trace({
  provider: 'openai',
  model: 'gpt-4o',
  promptTokens: usage.promptTokens,
  completionTokens: usage.completionTokens,
  latencyMs: timer.elapsed(),
  status: 'success'
})

Node.js 服务端

import { AntDockAI } from '@antdock/ai-tracker'
import OpenAI from 'openai'

const tracker = new AntDockAI({
  appId: 'your-app-id',
  endpoint: 'https://your-domain.com'
})

const openai = new OpenAI()

export async function chat(messages, userId) {
  const timer = tracker.startTimer()

  try {
    const response = await openai.chat.completions.create({
      model: 'gpt-4o',
      messages
    })

    tracker.trace({
      provider: 'openai',
      model: 'gpt-4o',
      promptTokens: response.usage.prompt_tokens,
      completionTokens: response.usage.completion_tokens,
      latencyMs: timer.elapsed(),
      status: 'success',
      finishReason: response.choices[0].finish_reason,
      userId
    })

    return response.choices[0].message.content
  } catch (error) {
    tracker.trace({
      provider: 'openai',
      model: 'gpt-4o',
      latencyMs: timer.elapsed(),
      status: 'error',
      errorType: error.code || 'unknown',
      errorCode: error.status,
      userId
    })
    throw error
  }
}

流式响应追踪

const timer = tracker.startTimer()
let ttft = null
let chunks = 0
let completionTokens = 0

const stream = await openai.chat.completions.create({
  model: 'gpt-4o',
  messages: [...],
  stream: true
})

for await (const chunk of stream) {
  if (ttft === null) {
    ttft = timer.elapsed()
  }
  chunks++

  // 处理 chunk...
}

tracker.trace({
  provider: 'openai',
  model: 'gpt-4o',
  latencyMs: timer.elapsed(),
  ttftMs: ttft,
  streaming: true,
  streamChunks: chunks,
  status: 'success'
})

配置选项

interface AntDockAIConfig {
  appId: string        // 必填,App ID
  endpoint?: string        // API 端点
  batchSize?: number       // 批量大小,默认 10
  flushInterval?: number   // 刷新间隔 (ms),默认 5000
  debug?: boolean          // 调试模式
}

追踪数据结构

interface LLMTrace {
  // 基础信息
  provider: string
  model: string
  modelVersion?: string

  // Token 使用
  promptTokens?: number
  completionTokens?: number
  totalTokens?: number

  // 费用:优先填入提供方上报值;不填时可能估算或无法计算
  costUsd?: number
  costInputUsd?: number
  costOutputUsd?: number

  // 性能指标
  latencyMs?: number
  ttftMs?: number
  tokensPerSecond?: number

  // 参数
  temperature?: number
  topP?: number
  maxTokens?: number
  frequencyPenalty?: number
  presencePenalty?: number

  // 状态
  status: 'success' | 'error'
  errorType?: string
  errorCode?: string | number
  finishReason?: string

  // 流式相关
  streaming?: boolean
  streamChunks?: number

  // 元数据
  promptTemplate?: string
  feature?: string
  userId?: string

  // 时间戳 (自动填充)
  timestamp?: number
}

分析指标

追踪数据可在 AntDock 面板中查看以下指标:

  • 调用量: 按模型、提供商、时间分布
  • Token 使用: 输入/输出 token 趋势
  • 成本分析: 按模型、功能的成本明细
  • 性能指标: 平均延迟、P95、TTFT
  • 错误率: 错误类型分布、趋势
  • 用户分析: 按用户的使用量和成本

调试

const tracker = new AntDockAI({
  appId: 'your-app-id',
  endpoint: 'https://your-domain.com',
  debug: true
})

调试模式下,所有追踪数据会输出到控制台。