* Helper method to end an OpenTelemetry span with output, token usage, and model name attributes. * Used by arize, phoenix, and opik providers.
(
providerName: string,
returnIds: ICommonObject,
outputText: string,
usageMetadata?: { input_tokens?: number; output_tokens?: number; total_tokens?: number },
modelName?: string
)
| 742 | * Used by arize, phoenix, and opik providers. |
| 743 | */ |
| 744 | private _endOtelSpan( |
| 745 | providerName: string, |
| 746 | returnIds: ICommonObject, |
| 747 | outputText: string, |
| 748 | usageMetadata?: { input_tokens?: number; output_tokens?: number; total_tokens?: number }, |
| 749 | modelName?: string |
| 750 | ): void { |
| 751 | const llmSpan: Span | undefined = this.handlers[providerName]?.llmSpan?.[returnIds[providerName]?.llmSpan] |
| 752 | if (llmSpan) { |
| 753 | llmSpan.setAttribute('output.value', JSON.stringify(outputText)) |
| 754 | llmSpan.setAttribute('output.mime_type', 'application/json') |
| 755 | if (usageMetadata) { |
| 756 | if (usageMetadata.input_tokens !== undefined) { |
| 757 | llmSpan.setAttribute('llm.token_count.prompt', usageMetadata.input_tokens) |
| 758 | } |
| 759 | if (usageMetadata.output_tokens !== undefined) { |
| 760 | llmSpan.setAttribute('llm.token_count.completion', usageMetadata.output_tokens) |
| 761 | } |
| 762 | if (usageMetadata.total_tokens !== undefined) { |
| 763 | llmSpan.setAttribute('llm.token_count.total', usageMetadata.total_tokens) |
| 764 | } |
| 765 | } |
| 766 | if (modelName) { |
| 767 | llmSpan.setAttribute('llm.model_name', modelName) |
| 768 | } |
| 769 | llmSpan.setStatus({ code: SpanStatusCode.OK }) |
| 770 | llmSpan.end() |
| 771 | } |
| 772 | } |
| 773 | |
| 774 | async init() { |
| 775 | if (this.initialized) return |