dd-trace
Version:
Datadog APM tracing client for JavaScript
67 lines (53 loc) • 1.66 kB
JavaScript
const LangChainHandler = require('./default')
class LangChainEmbeddingHandler extends LangChainHandler {
getSpanStartTags (ctx) {
const tags = {}
const inputTexts = ctx.args?.[0]
const sampled = this.isPromptCompletionSampled()
if (typeof inputTexts === 'string') {
// embed query
if (sampled) {
tags['langchain.request.inputs.0.text'] = this.normalize(inputTexts)
}
tags['langchain.request.input_counts'] = 1
} else {
// embed documents
if (sampled) {
for (const idx in inputTexts) {
const inputText = inputTexts[idx]
tags[`langchain.request.inputs.${idx}.text`] = this.normalize(inputText)
}
}
tags['langchain.request.input_counts'] = inputTexts.length
}
return tags
}
getSpanEndTags (ctx) {
const tags = {}
const { result } = ctx
if (!Array.isArray(result)) return
tags['langchain.response.outputs.embedding_length'] = (
Array.isArray(result[0]) ? result[0] : result
).length
return tags
}
extractApiKey (instance) {
const apiKey =
instance.clientConfig?.apiKey ||
instance.apiKey ||
instance.client?.apiKey
if (!apiKey || apiKey.length < 4) return ''
return `...${apiKey.slice(-4)}`
}
extractProvider (instance) {
return instance.constructor.name.split('Embeddings')[0].toLowerCase()
}
extractModel (instance) {
for (const attr of ['model', 'modelName', 'modelId', 'modelKey', 'repoId']) {
const modelName = instance[attr]
if (modelName) return modelName
}
}
}
module.exports = LangChainEmbeddingHandler