|
| 1 | +import { rec, str, num, parseProviderMetadata, extractTelemetryMetadata } from "./aiHelpers"; |
1 | 2 | import type { AISpanData, DisplayItem, ToolDefinition, ToolUse } from "./types"; |
2 | 3 |
|
3 | 4 | /** |
@@ -97,22 +98,6 @@ export function extractAISpanData( |
97 | 98 | }; |
98 | 99 | } |
99 | 100 |
|
100 | | -// --------------------------------------------------------------------------- |
101 | | -// Primitive helpers |
102 | | -// --------------------------------------------------------------------------- |
103 | | - |
104 | | -function rec(v: unknown): Record<string, unknown> { |
105 | | - return v && typeof v === "object" ? (v as Record<string, unknown>) : {}; |
106 | | -} |
107 | | - |
108 | | -function str(v: unknown): string | undefined { |
109 | | - return typeof v === "string" ? v : undefined; |
110 | | -} |
111 | | - |
112 | | -function num(v: unknown): number | undefined { |
113 | | - return typeof v === "number" ? v : undefined; |
114 | | -} |
115 | | - |
116 | 101 | // --------------------------------------------------------------------------- |
117 | 102 | // Message → DisplayItem transformation |
118 | 103 | // --------------------------------------------------------------------------- |
@@ -431,49 +416,6 @@ function parseToolDefinitions(raw: unknown): ToolDefinition[] | undefined { |
431 | 416 | } |
432 | 417 | } |
433 | 418 |
|
434 | | -// --------------------------------------------------------------------------- |
435 | | -// Provider metadata (service tier, inference geo, etc.) |
436 | | -// --------------------------------------------------------------------------- |
437 | | - |
438 | | -function parseProviderMetadata( |
439 | | - raw: unknown |
440 | | -): { serviceTier?: string; resolvedProvider?: string; gatewayCost?: string } | undefined { |
441 | | - if (typeof raw !== "string") return undefined; |
442 | | - try { |
443 | | - const parsed = JSON.parse(raw) as Record<string, unknown>; |
444 | | - if (!parsed || typeof parsed !== "object") return undefined; |
445 | | - |
446 | | - let serviceTier: string | undefined; |
447 | | - let resolvedProvider: string | undefined; |
448 | | - let gatewayCost: string | undefined; |
449 | | - |
450 | | - // Anthropic: { anthropic: { usage: { service_tier: "standard" } } } |
451 | | - const anthropic = rec(parsed.anthropic); |
452 | | - serviceTier = str(rec(anthropic.usage).service_tier); |
453 | | - |
454 | | - // Azure/OpenAI: { azure: { serviceTier: "default" } } or { openai: { serviceTier: "..." } } |
455 | | - if (!serviceTier) { |
456 | | - serviceTier = str(rec(parsed.azure).serviceTier) ?? str(rec(parsed.openai).serviceTier); |
457 | | - } |
458 | | - |
459 | | - // Gateway: { gateway: { routing: { finalProvider, resolvedProvider }, cost } } |
460 | | - const gateway = rec(parsed.gateway); |
461 | | - const routing = rec(gateway.routing); |
462 | | - resolvedProvider = str(routing.finalProvider) ?? str(routing.resolvedProvider); |
463 | | - gatewayCost = str(gateway.cost); |
464 | | - |
465 | | - // OpenRouter: { openrouter: { provider: "xAI" } } |
466 | | - if (!resolvedProvider) { |
467 | | - resolvedProvider = str(rec(parsed.openrouter).provider); |
468 | | - } |
469 | | - |
470 | | - if (!serviceTier && !resolvedProvider && !gatewayCost) return undefined; |
471 | | - return { serviceTier, resolvedProvider, gatewayCost }; |
472 | | - } catch { |
473 | | - return undefined; |
474 | | - } |
475 | | -} |
476 | | - |
477 | 419 | // --------------------------------------------------------------------------- |
478 | 420 | // Tool choice parsing |
479 | 421 | // --------------------------------------------------------------------------- |
@@ -508,19 +450,3 @@ function countMessages(raw: unknown): number | undefined { |
508 | 450 | } |
509 | 451 | } |
510 | 452 |
|
511 | | -// --------------------------------------------------------------------------- |
512 | | -// Telemetry metadata |
513 | | -// --------------------------------------------------------------------------- |
514 | | - |
515 | | -function extractTelemetryMetadata(raw: unknown): Record<string, string> | undefined { |
516 | | - if (!raw || typeof raw !== "object") return undefined; |
517 | | - |
518 | | - const result: Record<string, string> = {}; |
519 | | - for (const [key, value] of Object.entries(raw as Record<string, unknown>)) { |
520 | | - if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { |
521 | | - result[key] = String(value); |
522 | | - } |
523 | | - } |
524 | | - |
525 | | - return Object.keys(result).length > 0 ? result : undefined; |
526 | | -} |
0 commit comments