( usage: LanguageModelV3Usage | Record<string, unknown> | null | undefined )
| 193 | } |
| 194 | |
| 195 | export function extractUsage( |
| 196 | usage: LanguageModelV3Usage | Record<string, unknown> | null | undefined |
| 197 | ): DevToolsUsage | null { |
| 198 | if (!usage || !isRecord(usage)) { |
| 199 | return null; |
| 200 | } |
| 201 | |
| 202 | const inputTokens = |
| 203 | extractInputTokens(usage.inputTokens) ?? extractOptionalTokenCount(usage, "promptTokens"); |
| 204 | const outputTokens = |
| 205 | extractOutputTokens(usage.outputTokens) ?? extractOptionalTokenCount(usage, "completionTokens"); |
| 206 | const explicitTotalTokens = extractOptionalTokenCount(usage, "totalTokens"); |
| 207 | const inputTokenTotal = extractTokenTotal(inputTokens); |
| 208 | const outputTokenTotal = extractTokenTotal(outputTokens); |
| 209 | |
| 210 | const totalTokens = |
| 211 | typeof explicitTotalTokens === "number" |
| 212 | ? explicitTotalTokens |
| 213 | : inputTokenTotal !== undefined || outputTokenTotal !== undefined |
| 214 | ? (inputTokenTotal ?? 0) + (outputTokenTotal ?? 0) |
| 215 | : undefined; |
| 216 | |
| 217 | const raw = Object.prototype.hasOwnProperty.call(usage, "raw") ? usage.raw : undefined; |
| 218 | |
| 219 | if ( |
| 220 | inputTokens === undefined && |
| 221 | outputTokens === undefined && |
| 222 | typeof totalTokens !== "number" && |
| 223 | raw === undefined |
| 224 | ) { |
| 225 | return null; |
| 226 | } |
| 227 | |
| 228 | const normalizedUsage: DevToolsUsage = { |
| 229 | inputTokens, |
| 230 | outputTokens, |
| 231 | totalTokens, |
| 232 | }; |
| 233 | |
| 234 | if (raw !== undefined) { |
| 235 | normalizedUsage.raw = raw; |
| 236 | } |
| 237 | |
| 238 | return normalizedUsage; |
| 239 | } |
| 240 | |
| 241 | export function createDevToolsMiddleware( |
| 242 | workspaceId: string, |
no test coverage detected