我构建了 react-native-llm-meter,针对 Expo 应用的 LLM 成本跟踪

发布: (2026年5月2日 GMT+8 07:29)
5 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您想要翻译的文章正文(除代码块和 URL 之外的文本),我将把它翻译成简体中文并保持原有的 Markdown 格式。

概览

如果你在 React Native 应用中调用 Claude、GPT 或 Gemini,却没有办法在设备上查看实际情况,就会遇到麻烦。服务器端的可观测性工具(Langfuse、Helicone、LangSmith、Stripe 的 token‑meter)在 Node 后端表现出色,但它们假设运行在服务器环境,依赖仅在 Node 中可用的 API,并且没有提供 AsyncStorage 适配器——在 Hermes 环境下,流式传输甚至会直接崩溃。

这时就需要 react-native-llm-meter
该库直接在 Expo 应用上跟踪 LLM 使用情况,提供与供应商无关的指标、预算控制以及开发者覆盖层。

安装

npm install react-native-llm-meter @react-native-async-storage/async-storage

基本用法

import { Meter, MeterProvider } from "react-native-llm-meter";
import Anthropic from "@anthropic-ai/sdk";

const anthropic = new Anthropic({
  apiKey: process.env.EXPO_PUBLIC_ANTHROPIC_API_KEY,
});
const meter = new Meter();
const client = meter.wrap(anthropic);

export default function App() {
  return (
    // Your app UI goes here
  );
}

通过包装后的客户端发出的每一次调用都会记录以下信息:

  • 提供者和模型
  • 输入/输出 token 计数
  • 延迟
  • 流式的首 token 时间(TTFT)
  • 计算的费用(美元)

包装器保持原始 SDK 的接口不变;您只需更改客户端的构造方式。

获取摘要

meter.summary();
// {
//   count: 47,
//   totalCostUsd: 0.0894,
//   inputTokens: 24103,
//   outputTokens: 7379,
//   latencyP50: 612,
//   latencyP95: 1840,
//   ttftP50: 287,
//   ttftP95: 612,
//   byModel: { … }
// }

您还可以使用 useMetrics()(React Hook)获取实时指标,或通过 meter.getEvents({ from, to }) 获取原始事件。

流式 TTFT

TTFT(time‑to‑first‑token)与总延迟分开捕获,因为每个提供商的流式方式不同。它反映了感知的响应速度——用户在出现 任何 输出之前等待了多长时间。

检测规则

ProviderFirst‑token signal
AnthropicFirst content_block_delta chunk
OpenAIFirst chunk where choices[0].delta.content is non‑empty
GoogleFirst chunk where candidates[0].content.parts[0].text is non‑empty

对于 OpenAI 流式,你必须包含 stream_options: { include_usage: true } 以接收使用数据。如果缺少使用数据,库会发出警告。

Storage Adapters

  • AsyncStorageAdapter – 在所有环境下工作,以按天分块的方式保留数据。
  • SqliteAdapter – 适用于更高容量的使用场景,基于 expo-sqlite 构建。

迁移助手可让您在适配器之间切换。如果两者都不使用,事件仅保存在内存中。

预算

meter.setBudget({
  daily: 5,
  weekly: 25,
  onCross: ({ period, threshold, spend }) => {
    Alert.alert(`${period} limit hit`, `$${spend.toFixed(2)} / $${threshold}`);
  },
});

软警报 在不阻塞请求的情况下调用回调函数。硬断路器(会中止调用)正在路线图上。

Developer Overlay

import { MeterOverlay } from "react-native-llm-meter/overlay";

一个浮动、可拖动的覆盖层仅在 __DEV__ 构建中出现,因此永远不会随生产环境发布。通过从 overlay 子路径导入,可使 react-native 不被包含在非 RN 包中。

它有意不做的事情

功能原因
Prompt content从不记录原始提示;仅记录 token 计数、延迟、模型名称、成本以及可选的元数据。
Server‑side observability对于基于 Node 的调用使用 Langfuse、Helicone 等。
Web support核心是平台无关的,但构建尚未准备好用于浏览器。
Hosted dashboard它是一个库;您可以通过可选的远程接收器将事件 POST 到任何端点(Sentry、Datadog 等)。

模型令牌费用

Pricing tables are hard‑coded in src/pricing/table.ts and reflect published rates. A PR template makes updates quick (≈2 minutes). Unknown models emit a one‑time warning per provider/model pair during development.

尝试一下

npm install react-native-llm-meter @react-native-async-storage/async-storage

仓库:

欢迎提交 bug、PR 和定价更新。如果你在 Expo 应用中集成了 Claude 或 GPT 并遇到边缘情况,请告知维护者。

Ankit Virdi 构建。

0 浏览
Back to Blog

相关文章

阅读更多 »

模型越智能,节省越多。

神话:更智能的模型会让插件变得多余。自从 WOZCODE 推出以来,许多 Claude Code 高级用户低声说插件的优势将会消失。