ragscope 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +183 -0
- package/README.md +135 -0
- package/dist/bin/ragscope.d.ts +3 -0
- package/dist/bin/ragscope.d.ts.map +1 -0
- package/dist/bin/ragscope.js +135 -0
- package/dist/bin/ragscope.js.map +1 -0
- package/dist/src/app.d.ts +5 -0
- package/dist/src/app.d.ts.map +1 -0
- package/dist/src/app.js +88 -0
- package/dist/src/app.js.map +1 -0
- package/dist/src/app.test.d.ts +2 -0
- package/dist/src/app.test.d.ts.map +1 -0
- package/dist/src/app.test.js +59 -0
- package/dist/src/app.test.js.map +1 -0
- package/dist/src/audit/scorer.d.ts +17 -0
- package/dist/src/audit/scorer.d.ts.map +1 -0
- package/dist/src/audit/scorer.js +85 -0
- package/dist/src/audit/scorer.js.map +1 -0
- package/dist/src/audit/scorer.test.d.ts +2 -0
- package/dist/src/audit/scorer.test.d.ts.map +1 -0
- package/dist/src/audit/scorer.test.js +101 -0
- package/dist/src/audit/scorer.test.js.map +1 -0
- package/dist/src/db/index.d.ts +731 -0
- package/dist/src/db/index.d.ts.map +1 -0
- package/dist/src/db/index.js +59 -0
- package/dist/src/db/index.js.map +1 -0
- package/dist/src/db/queries.d.ts +12 -0
- package/dist/src/db/queries.d.ts.map +1 -0
- package/dist/src/db/queries.js +35 -0
- package/dist/src/db/queries.js.map +1 -0
- package/dist/src/db/queries.test.d.ts +2 -0
- package/dist/src/db/queries.test.d.ts.map +1 -0
- package/dist/src/db/queries.test.js +101 -0
- package/dist/src/db/queries.test.js.map +1 -0
- package/dist/src/db/schema.d.ts +725 -0
- package/dist/src/db/schema.d.ts.map +1 -0
- package/dist/src/db/schema.js +47 -0
- package/dist/src/db/schema.js.map +1 -0
- package/dist/src/enrichment/boundaries.d.ts +4 -0
- package/dist/src/enrichment/boundaries.d.ts.map +1 -0
- package/dist/src/enrichment/boundaries.js +19 -0
- package/dist/src/enrichment/boundaries.js.map +1 -0
- package/dist/src/enrichment/boundaries.test.d.ts +2 -0
- package/dist/src/enrichment/boundaries.test.d.ts.map +1 -0
- package/dist/src/enrichment/boundaries.test.js +69 -0
- package/dist/src/enrichment/boundaries.test.js.map +1 -0
- package/dist/src/enrichment/embeddings.d.ts +3 -0
- package/dist/src/enrichment/embeddings.d.ts.map +1 -0
- package/dist/src/enrichment/embeddings.js +37 -0
- package/dist/src/enrichment/embeddings.js.map +1 -0
- package/dist/src/enrichment/normalizer.d.ts +10 -0
- package/dist/src/enrichment/normalizer.d.ts.map +1 -0
- package/dist/src/enrichment/normalizer.js +42 -0
- package/dist/src/enrichment/normalizer.js.map +1 -0
- package/dist/src/enrichment/normalizer.test.d.ts +2 -0
- package/dist/src/enrichment/normalizer.test.d.ts.map +1 -0
- package/dist/src/enrichment/normalizer.test.js +47 -0
- package/dist/src/enrichment/normalizer.test.js.map +1 -0
- package/dist/src/enrichment/pipeline.d.ts +4 -0
- package/dist/src/enrichment/pipeline.d.ts.map +1 -0
- package/dist/src/enrichment/pipeline.js +93 -0
- package/dist/src/enrichment/pipeline.js.map +1 -0
- package/dist/src/enrichment/pipeline.test.d.ts +2 -0
- package/dist/src/enrichment/pipeline.test.d.ts.map +1 -0
- package/dist/src/enrichment/pipeline.test.js +133 -0
- package/dist/src/enrichment/pipeline.test.js.map +1 -0
- package/dist/src/enrichment/reranker.d.ts +20 -0
- package/dist/src/enrichment/reranker.d.ts.map +1 -0
- package/dist/src/enrichment/reranker.js +45 -0
- package/dist/src/enrichment/reranker.js.map +1 -0
- package/dist/src/enrichment/reranker.test.d.ts +2 -0
- package/dist/src/enrichment/reranker.test.d.ts.map +1 -0
- package/dist/src/enrichment/reranker.test.js +82 -0
- package/dist/src/enrichment/reranker.test.js.map +1 -0
- package/dist/src/enrichment/tokenizer.d.ts +2 -0
- package/dist/src/enrichment/tokenizer.d.ts.map +1 -0
- package/dist/src/enrichment/tokenizer.js +40 -0
- package/dist/src/enrichment/tokenizer.js.map +1 -0
- package/dist/src/enrichment/tokenizer.test.d.ts +2 -0
- package/dist/src/enrichment/tokenizer.test.d.ts.map +1 -0
- package/dist/src/enrichment/tokenizer.test.js +36 -0
- package/dist/src/enrichment/tokenizer.test.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/ingestion/langfuse.d.ts +17 -0
- package/dist/src/ingestion/langfuse.d.ts.map +1 -0
- package/dist/src/ingestion/langfuse.js +102 -0
- package/dist/src/ingestion/langfuse.js.map +1 -0
- package/dist/src/ingestion/otlp-parser.d.ts +3 -0
- package/dist/src/ingestion/otlp-parser.d.ts.map +1 -0
- package/dist/src/ingestion/otlp-parser.js +122 -0
- package/dist/src/ingestion/otlp-parser.js.map +1 -0
- package/dist/src/ingestion/otlp-parser.test.d.ts +2 -0
- package/dist/src/ingestion/otlp-parser.test.d.ts.map +1 -0
- package/dist/src/ingestion/otlp-parser.test.js +194 -0
- package/dist/src/ingestion/otlp-parser.test.js.map +1 -0
- package/dist/src/types.d.ts +114 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ParsedSpan, RagChunk } from '../types.js';
|
|
2
|
+
export interface RerankerDiff {
|
|
3
|
+
chunkId: string;
|
|
4
|
+
rankRetrieval: number;
|
|
5
|
+
rankReranked: number;
|
|
6
|
+
rankDelta: number;
|
|
7
|
+
scoreRaw: number | null;
|
|
8
|
+
scoreReranked: number | null;
|
|
9
|
+
scoreDelta: number | null;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Matches RETRIEVER chunks against RERANKER span output documents.
|
|
13
|
+
* Sets rankReranked on each chunk that appears in the reranker output.
|
|
14
|
+
* Returns the set of diff records for the response.
|
|
15
|
+
*/
|
|
16
|
+
export declare function applyRerankerResults(chunks: RagChunk[], rerankerSpans: ParsedSpan[]): {
|
|
17
|
+
chunks: RagChunk[];
|
|
18
|
+
diffs: RerankerDiff[];
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=reranker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../../../src/enrichment/reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEvD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAAE,EAClB,aAAa,EAAE,UAAU,EAAE,GAC1B;IAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,CAwC/C"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matches RETRIEVER chunks against RERANKER span output documents.
|
|
3
|
+
* Sets rankReranked on each chunk that appears in the reranker output.
|
|
4
|
+
* Returns the set of diff records for the response.
|
|
5
|
+
*/
|
|
6
|
+
export function applyRerankerResults(chunks, rerankerSpans) {
|
|
7
|
+
if (rerankerSpans.length === 0)
|
|
8
|
+
return { chunks, diffs: [] };
|
|
9
|
+
// Use the first RERANKER span — pipelines rarely have more than one
|
|
10
|
+
const span = rerankerSpans[0];
|
|
11
|
+
if (!span.documents || span.documents.length === 0)
|
|
12
|
+
return { chunks, diffs: [] };
|
|
13
|
+
// Build a map: chunkId → reranked position (1-based)
|
|
14
|
+
const rerankedRank = new Map();
|
|
15
|
+
const rerankedScore = new Map();
|
|
16
|
+
span.documents.forEach((doc, i) => {
|
|
17
|
+
rerankedRank.set(doc.id, i + 1);
|
|
18
|
+
rerankedScore.set(doc.id, doc.score);
|
|
19
|
+
});
|
|
20
|
+
const updatedChunks = chunks.map(chunk => {
|
|
21
|
+
const newRank = rerankedRank.get(chunk.chunkId);
|
|
22
|
+
if (newRank == null)
|
|
23
|
+
return chunk;
|
|
24
|
+
const newScore = rerankedScore.get(chunk.chunkId) ?? null;
|
|
25
|
+
return { ...chunk, rankReranked: newRank, scoreReranked: newScore };
|
|
26
|
+
});
|
|
27
|
+
const diffs = chunks
|
|
28
|
+
.filter(c => rerankedRank.has(c.chunkId) && c.rankRetrieval != null)
|
|
29
|
+
.map(c => {
|
|
30
|
+
const rr = rerankedRank.get(c.chunkId);
|
|
31
|
+
const sr = rerankedScore.get(c.chunkId) ?? null;
|
|
32
|
+
return {
|
|
33
|
+
chunkId: c.chunkId,
|
|
34
|
+
rankRetrieval: c.rankRetrieval,
|
|
35
|
+
rankReranked: rr,
|
|
36
|
+
rankDelta: c.rankRetrieval - rr, // positive = moved up in ranking
|
|
37
|
+
scoreRaw: c.scoreRaw,
|
|
38
|
+
scoreReranked: sr,
|
|
39
|
+
scoreDelta: sr != null && c.scoreRaw != null ? sr - c.scoreRaw : null,
|
|
40
|
+
};
|
|
41
|
+
})
|
|
42
|
+
.sort((a, b) => a.rankReranked - b.rankReranked);
|
|
43
|
+
return { chunks: updatedChunks, diffs };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=reranker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../../src/enrichment/reranker.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAkB,EAClB,aAA2B;IAE3B,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAE5D,oEAAoE;IACpE,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;IAC7B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAEhF,qDAAqD;IACrD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC9C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC/C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAChC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;QAC/B,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC/C,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,KAAK,CAAA;QACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;QACzD,OAAO,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,MAAM,KAAK,GAAmB,MAAM;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC;SACnE,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAE,CAAA;QACvC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAA;QAC/C,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,aAAa,EAAE,CAAC,CAAC,aAAc;YAC/B,YAAY,EAAE,EAAE;YAChB,SAAS,EAAE,CAAC,CAAC,aAAc,GAAG,EAAE,EAAI,iCAAiC;YACrE,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,aAAa,EAAE,EAAE;YACjB,UAAU,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;SACtE,CAAA;IACH,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAA;IAElD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reranker.test.d.ts","sourceRoot":"","sources":["../../../src/enrichment/reranker.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { applyRerankerResults } from './reranker.js';
|
|
3
|
+
function makeChunk(chunkId, rank, score = 0.9) {
|
|
4
|
+
return {
|
|
5
|
+
id: `id-${chunkId}`, spanId: 's1', traceId: 't1', chunkId,
|
|
6
|
+
content: `content of ${chunkId}`, scoreRaw: score, scoreNormalized: score,
|
|
7
|
+
rankRetrieval: rank, rankReranked: null, scoreReranked: null, tokenCount: 5,
|
|
8
|
+
vectorStore: null, inContext: false, contextPosition: null,
|
|
9
|
+
overlapWithNext: 0, scoreMissing: false,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function makeRerankerSpan(docs) {
|
|
13
|
+
return {
|
|
14
|
+
traceId: 't1', spanId: 'reranker-span', name: 'cohere.rerank',
|
|
15
|
+
kind: 'RERANKER', startTimeMs: 200, endTimeMs: 350, latencyMs: 150,
|
|
16
|
+
rawAttributes: '[]', documents: docs,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
describe('applyRerankerResults', () => {
|
|
20
|
+
const chunks = [
|
|
21
|
+
makeChunk('doc-a', 1, 0.80),
|
|
22
|
+
makeChunk('doc-b', 2, 0.75),
|
|
23
|
+
makeChunk('doc-c', 3, 0.60),
|
|
24
|
+
];
|
|
25
|
+
it('returns unchanged chunks when no reranker spans', () => {
|
|
26
|
+
const { chunks: out, diffs } = applyRerankerResults(chunks, []);
|
|
27
|
+
expect(out).toEqual(chunks);
|
|
28
|
+
expect(diffs).toHaveLength(0);
|
|
29
|
+
});
|
|
30
|
+
it('sets rankReranked on matching chunks', () => {
|
|
31
|
+
const span = makeRerankerSpan([
|
|
32
|
+
{ id: 'doc-c', score: 0.95 },
|
|
33
|
+
{ id: 'doc-a', score: 0.88 },
|
|
34
|
+
{ id: 'doc-b', score: 0.72 },
|
|
35
|
+
]);
|
|
36
|
+
const { chunks: out } = applyRerankerResults(chunks, [span]);
|
|
37
|
+
expect(out.find(c => c.chunkId === 'doc-c').rankReranked).toBe(1);
|
|
38
|
+
expect(out.find(c => c.chunkId === 'doc-a').rankReranked).toBe(2);
|
|
39
|
+
expect(out.find(c => c.chunkId === 'doc-b').rankReranked).toBe(3);
|
|
40
|
+
});
|
|
41
|
+
it('computes positive rankDelta for chunks that moved up', () => {
|
|
42
|
+
const span = makeRerankerSpan([
|
|
43
|
+
{ id: 'doc-c', score: 0.95 }, // was rank 3, now rank 1 → delta = +2
|
|
44
|
+
{ id: 'doc-a', score: 0.88 },
|
|
45
|
+
{ id: 'doc-b', score: 0.72 },
|
|
46
|
+
]);
|
|
47
|
+
const { diffs } = applyRerankerResults(chunks, [span]);
|
|
48
|
+
const diffC = diffs.find(d => d.chunkId === 'doc-c');
|
|
49
|
+
expect(diffC.rankDelta).toBe(2); // moved up 2 positions
|
|
50
|
+
});
|
|
51
|
+
it('computes negative rankDelta for chunks that moved down', () => {
|
|
52
|
+
const span = makeRerankerSpan([
|
|
53
|
+
{ id: 'doc-c', score: 0.95 },
|
|
54
|
+
{ id: 'doc-a', score: 0.88 },
|
|
55
|
+
{ id: 'doc-b', score: 0.72 },
|
|
56
|
+
]);
|
|
57
|
+
const { diffs } = applyRerankerResults(chunks, [span]);
|
|
58
|
+
const diffA = diffs.find(d => d.chunkId === 'doc-a');
|
|
59
|
+
expect(diffA.rankDelta).toBe(-1); // was rank 1, now rank 2
|
|
60
|
+
});
|
|
61
|
+
it('includes scoreDelta in diffs', () => {
|
|
62
|
+
const span = makeRerankerSpan([{ id: 'doc-a', score: 0.95 }]);
|
|
63
|
+
const { diffs } = applyRerankerResults(chunks, [span]);
|
|
64
|
+
const diff = diffs.find(d => d.chunkId === 'doc-a');
|
|
65
|
+
expect(diff.scoreDelta).toBeCloseTo(0.95 - 0.80);
|
|
66
|
+
});
|
|
67
|
+
it('leaves rankReranked null for chunks not in reranker output', () => {
|
|
68
|
+
const span = makeRerankerSpan([{ id: 'doc-a', score: 0.9 }]);
|
|
69
|
+
const { chunks: out } = applyRerankerResults(chunks, [span]);
|
|
70
|
+
expect(out.find(c => c.chunkId === 'doc-b').rankReranked).toBeNull();
|
|
71
|
+
});
|
|
72
|
+
it('returns diffs sorted by rankReranked', () => {
|
|
73
|
+
const span = makeRerankerSpan([
|
|
74
|
+
{ id: 'doc-c', score: 0.95 },
|
|
75
|
+
{ id: 'doc-b', score: 0.88 },
|
|
76
|
+
{ id: 'doc-a', score: 0.72 },
|
|
77
|
+
]);
|
|
78
|
+
const { diffs } = applyRerankerResults(chunks, [span]);
|
|
79
|
+
expect(diffs.map(d => d.rankReranked)).toEqual([1, 2, 3]);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=reranker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reranker.test.js","sourceRoot":"","sources":["../../../src/enrichment/reranker.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../../src/enrichment/tokenizer.ts"],"names":[],"mappings":"AAuCA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAIhE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { models, Tokenizer } from 'ai-tokenizer';
|
|
2
|
+
// @ts-ignore — CJS default export from encoding subpath
|
|
3
|
+
import * as encodings from 'ai-tokenizer/encoding';
|
|
4
|
+
// Cache tokenizer instances by encoding name
|
|
5
|
+
const tokenizerCache = new Map();
|
|
6
|
+
function getTokenizer(encodingName) {
|
|
7
|
+
if (!tokenizerCache.has(encodingName)) {
|
|
8
|
+
const enc = encodings[encodingName];
|
|
9
|
+
if (!enc)
|
|
10
|
+
throw new Error(`Unknown encoding: ${encodingName}`);
|
|
11
|
+
tokenizerCache.set(encodingName, new Tokenizer(enc));
|
|
12
|
+
}
|
|
13
|
+
return tokenizerCache.get(encodingName);
|
|
14
|
+
}
|
|
15
|
+
function resolveEncoding(model) {
|
|
16
|
+
if (!model)
|
|
17
|
+
return 'cl100k_base';
|
|
18
|
+
// Try exact match
|
|
19
|
+
if (model in models) {
|
|
20
|
+
return models[model].encoding;
|
|
21
|
+
}
|
|
22
|
+
// Try prefix match (e.g. "gpt-4o" → "openai/gpt-4o")
|
|
23
|
+
for (const [key, val] of Object.entries(models)) {
|
|
24
|
+
if (key.endsWith(`/${model}`) || key === model) {
|
|
25
|
+
return val.encoding;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Heuristics
|
|
29
|
+
if (model.startsWith('claude'))
|
|
30
|
+
return 'claude';
|
|
31
|
+
if (model.includes('gpt-4o') || model.includes('o1') || model.includes('o3'))
|
|
32
|
+
return 'o200k_base';
|
|
33
|
+
return 'cl100k_base';
|
|
34
|
+
}
|
|
35
|
+
export function countTokens(text, model) {
|
|
36
|
+
const encodingName = resolveEncoding(model);
|
|
37
|
+
const tokenizer = getTokenizer(encodingName);
|
|
38
|
+
return tokenizer.encode(text).length;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=tokenizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../src/enrichment/tokenizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAChD,wDAAwD;AACxD,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAA;AAIlD,6CAA6C;AAC7C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAqB,CAAA;AAEnD,SAAS,YAAY,CAAC,YAAoB;IACxC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAI,SAAqC,CAAC,YAAY,CAAC,CAAA;QAChE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAA;QAC9D,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,SAAS,CAAC,GAAiD,CAAC,CAAC,CAAA;IACpG,CAAC;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,YAAY,CAAE,CAAA;AAC1C,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,aAAa,CAAA;IAEhC,kBAAkB;IAClB,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,OAAQ,MAA+C,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAA;IACzE,CAAC;IAED,qDAAqD;IACrD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAC/C,OAAQ,GAA4B,CAAC,QAAQ,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC/C,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAA;IACjG,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAc;IACtD,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,SAAS,GAAG,YAAY,CAAC,YAAY,CAAC,CAAA;IAC5C,OAAO,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.test.d.ts","sourceRoot":"","sources":["../../../src/enrichment/tokenizer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { countTokens } from './tokenizer.js';
|
|
3
|
+
describe('countTokens', () => {
|
|
4
|
+
it('counts tokens for a simple string with default encoding', () => {
|
|
5
|
+
const count = countTokens('Hello world');
|
|
6
|
+
expect(count).toBeGreaterThan(0);
|
|
7
|
+
expect(count).toBeLessThan(10);
|
|
8
|
+
});
|
|
9
|
+
it('returns more tokens for longer text', () => {
|
|
10
|
+
const short = countTokens('Hi');
|
|
11
|
+
const long = countTokens('This is a much longer sentence with many words that should tokenize to more tokens');
|
|
12
|
+
expect(long).toBeGreaterThan(short);
|
|
13
|
+
});
|
|
14
|
+
it('counts tokens with a GPT-4o model hint', () => {
|
|
15
|
+
const count = countTokens('The capital of France is Paris.', 'openai/gpt-4o');
|
|
16
|
+
expect(count).toBeGreaterThan(0);
|
|
17
|
+
expect(count).toBeLessThanOrEqual(15);
|
|
18
|
+
});
|
|
19
|
+
it('counts tokens with a Claude model hint', () => {
|
|
20
|
+
const count = countTokens('The capital of France is Paris.', 'anthropic/claude-3.5-sonnet');
|
|
21
|
+
expect(count).toBeGreaterThan(0);
|
|
22
|
+
expect(count).toBeLessThanOrEqual(15);
|
|
23
|
+
});
|
|
24
|
+
it('handles empty string', () => {
|
|
25
|
+
expect(countTokens('')).toBe(0);
|
|
26
|
+
});
|
|
27
|
+
it('falls back gracefully for unknown model', () => {
|
|
28
|
+
const count = countTokens('Hello world', 'some-unknown-model-v99');
|
|
29
|
+
expect(count).toBeGreaterThan(0);
|
|
30
|
+
});
|
|
31
|
+
it('uses claude encoding for claude- prefix models', () => {
|
|
32
|
+
const count = countTokens('Hello world', 'claude-3-haiku');
|
|
33
|
+
expect(count).toBeGreaterThan(0);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=tokenizer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.test.js","sourceRoot":"","sources":["../../../src/enrichment/tokenizer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,CAAC,CAAA;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,oFAAoF,CAAC,CAAA;QAC9G,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,WAAW,CAAC,iCAAiC,EAAE,eAAe,CAAC,CAAA;QAC7E,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,WAAW,CAAC,iCAAiC,EAAE,6BAA6B,CAAC,CAAA;QAC3F,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAAA;QAClE,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Db } from '../db/index.js';
|
|
2
|
+
interface LangfuseConfig {
|
|
3
|
+
publicKey: string;
|
|
4
|
+
secretKey: string;
|
|
5
|
+
baseUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class LangfusePoller {
|
|
8
|
+
private readonly config;
|
|
9
|
+
private lastPolledAt;
|
|
10
|
+
private timer;
|
|
11
|
+
constructor(config: LangfuseConfig);
|
|
12
|
+
start(db: Db, onTrace?: (traceId: string) => void): void;
|
|
13
|
+
stop(): void;
|
|
14
|
+
private poll;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=langfuse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langfuse.d.ts","sourceRoot":"","sources":["../../../src/ingestion/langfuse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAA;AAGxC,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAsFD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,KAAK,CAA8C;gBAE/C,MAAM,EAAE,cAAc;IAKlC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAKxD,IAAI,IAAI,IAAI;YAIE,IAAI;CAqCnB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { ingestTrace } from '../enrichment/pipeline.js';
|
|
2
|
+
function inferKindFromObservation(obs) {
|
|
3
|
+
const name = (obs.name ?? '').toLowerCase();
|
|
4
|
+
if (obs.type === 'GENERATION')
|
|
5
|
+
return 'LLM';
|
|
6
|
+
if (name.includes('rerank'))
|
|
7
|
+
return 'RERANKER';
|
|
8
|
+
if (name.includes('embed'))
|
|
9
|
+
return 'EMBEDDING';
|
|
10
|
+
if (name.includes('retriev') || name.includes('search') || name.includes('query'))
|
|
11
|
+
return 'RETRIEVER';
|
|
12
|
+
if (name.includes('chain') || name.includes('pipeline'))
|
|
13
|
+
return 'CHAIN';
|
|
14
|
+
return 'SPAN';
|
|
15
|
+
}
|
|
16
|
+
function extractDocuments(obs) {
|
|
17
|
+
const output = obs.output;
|
|
18
|
+
if (!Array.isArray(output))
|
|
19
|
+
return undefined;
|
|
20
|
+
return output
|
|
21
|
+
.filter((d) => typeof d === 'object' && d !== null)
|
|
22
|
+
.map((d, i) => ({
|
|
23
|
+
id: String(d['id'] ?? d['document_id'] ?? i),
|
|
24
|
+
score: typeof d['score'] === 'number' ? d['score'] : 0,
|
|
25
|
+
content: typeof d['content'] === 'string' ? d['content'] : undefined,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
function parseIsoToMs(iso) {
|
|
29
|
+
return new Date(iso).getTime();
|
|
30
|
+
}
|
|
31
|
+
function observationToSpan(obs, traceId) {
|
|
32
|
+
const startMs = parseIsoToMs(obs.startTime);
|
|
33
|
+
const endMs = obs.endTime ? parseIsoToMs(obs.endTime) : startMs;
|
|
34
|
+
const docs = extractDocuments(obs);
|
|
35
|
+
const inputText = typeof obs.input === 'string' ? obs.input
|
|
36
|
+
: obs.input ? JSON.stringify(obs.input) : undefined;
|
|
37
|
+
return {
|
|
38
|
+
traceId,
|
|
39
|
+
spanId: obs.id,
|
|
40
|
+
parentSpanId: obs.parentObservationId ?? undefined,
|
|
41
|
+
name: obs.name ?? obs.type,
|
|
42
|
+
kind: inferKindFromObservation(obs),
|
|
43
|
+
startTimeMs: startMs,
|
|
44
|
+
endTimeMs: endMs,
|
|
45
|
+
latencyMs: endMs - startMs,
|
|
46
|
+
model: obs.model ?? undefined,
|
|
47
|
+
inputTokens: obs.usage?.input ?? undefined,
|
|
48
|
+
outputTokens: obs.usage?.output ?? undefined,
|
|
49
|
+
rawAttributes: '[]',
|
|
50
|
+
documents: docs,
|
|
51
|
+
prompt: inputText,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export class LangfusePoller {
|
|
55
|
+
config;
|
|
56
|
+
lastPolledAt;
|
|
57
|
+
timer = null;
|
|
58
|
+
constructor(config) {
|
|
59
|
+
this.config = config;
|
|
60
|
+
this.lastPolledAt = Date.now() - 5 * 60 * 1000; // look back 5 min on first poll
|
|
61
|
+
}
|
|
62
|
+
start(db, onTrace) {
|
|
63
|
+
this.poll(db, onTrace).catch(console.error);
|
|
64
|
+
this.timer = setInterval(() => this.poll(db, onTrace).catch(console.error), 30_000);
|
|
65
|
+
}
|
|
66
|
+
stop() {
|
|
67
|
+
if (this.timer)
|
|
68
|
+
clearInterval(this.timer);
|
|
69
|
+
}
|
|
70
|
+
async poll(db, onTrace) {
|
|
71
|
+
const since = new Date(this.lastPolledAt).toISOString();
|
|
72
|
+
const pollStart = Date.now();
|
|
73
|
+
const baseUrl = this.config.baseUrl ?? 'https://cloud.langfuse.com';
|
|
74
|
+
const auth = Buffer.from(`${this.config.publicKey}:${this.config.secretKey}`).toString('base64');
|
|
75
|
+
const url = `${baseUrl}/api/public/traces?fromTimestamp=${encodeURIComponent(since)}&limit=50&page=1`;
|
|
76
|
+
const res = await fetch(url, {
|
|
77
|
+
headers: { Authorization: `Basic ${auth}`, 'Content-Type': 'application/json' },
|
|
78
|
+
});
|
|
79
|
+
if (!res.ok) {
|
|
80
|
+
console.error(`[LangfusePoller] fetch failed: ${res.status} ${res.statusText}`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const page = await res.json();
|
|
84
|
+
this.lastPolledAt = pollStart;
|
|
85
|
+
for (const trace of page.data) {
|
|
86
|
+
if (!trace.observations?.length)
|
|
87
|
+
continue;
|
|
88
|
+
const spans = trace.observations.map(obs => observationToSpan(obs, trace.id));
|
|
89
|
+
const parsed = {
|
|
90
|
+
traceId: trace.id,
|
|
91
|
+
serviceName: trace.metadata?.['service.name'] ?? 'langfuse',
|
|
92
|
+
spans,
|
|
93
|
+
};
|
|
94
|
+
await ingestTrace(db, parsed, 'langfuse');
|
|
95
|
+
onTrace?.(parsed.traceId);
|
|
96
|
+
}
|
|
97
|
+
if (page.data.length > 0) {
|
|
98
|
+
console.log(`[LangfusePoller] ingested ${page.data.length} traces`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=langfuse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langfuse.js","sourceRoot":"","sources":["../../../src/ingestion/langfuse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-parser.d.ts","sourceRoot":"","sources":["../../../src/ingestion/otlp-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EAIX,WAAW,EAGZ,MAAM,aAAa,CAAA;AA0EpB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,EAAE,CA+CpE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
function attrValue(v) {
|
|
2
|
+
if (v.stringValue !== undefined)
|
|
3
|
+
return v.stringValue;
|
|
4
|
+
if (v.intValue !== undefined)
|
|
5
|
+
return parseInt(v.intValue, 10);
|
|
6
|
+
if (v.doubleValue !== undefined)
|
|
7
|
+
return v.doubleValue;
|
|
8
|
+
if (v.boolValue !== undefined)
|
|
9
|
+
return v.boolValue;
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
function attrsToMap(attrs = []) {
|
|
13
|
+
const map = {};
|
|
14
|
+
for (const a of attrs)
|
|
15
|
+
map[a.key] = attrValue(a.value);
|
|
16
|
+
return map;
|
|
17
|
+
}
|
|
18
|
+
function nanoToMs(nano) {
|
|
19
|
+
return Number(BigInt(nano) / 1000000n);
|
|
20
|
+
}
|
|
21
|
+
function inferKind(spanName, attrs) {
|
|
22
|
+
const op = attrs['gen_ai.operation.name']?.toLowerCase() ?? '';
|
|
23
|
+
const name = spanName.toLowerCase();
|
|
24
|
+
if (op === 'rerank' || name.includes('rerank'))
|
|
25
|
+
return 'RERANKER';
|
|
26
|
+
if (op === 'embeddings' || op === 'embed' || name.includes('embed'))
|
|
27
|
+
return 'EMBEDDING';
|
|
28
|
+
if (op === 'retrieve' || op === 'retrieval' || name.includes('retriev'))
|
|
29
|
+
return 'RETRIEVER';
|
|
30
|
+
if (op === 'chat' || op === 'completion' || op === 'text_generation' || name.includes('llm') || name.includes('chat'))
|
|
31
|
+
return 'LLM';
|
|
32
|
+
if (name.includes('chain') || name.includes('pipeline') || name.includes('graph'))
|
|
33
|
+
return 'CHAIN';
|
|
34
|
+
return 'SPAN';
|
|
35
|
+
}
|
|
36
|
+
function parseDocuments(attrs, rawAttrs) {
|
|
37
|
+
// gen_ai.retrieval.documents is encoded as a JSON string in a string attribute
|
|
38
|
+
const raw = attrs['gen_ai.retrieval.documents'];
|
|
39
|
+
if (raw) {
|
|
40
|
+
try {
|
|
41
|
+
const parsed = JSON.parse(raw);
|
|
42
|
+
if (Array.isArray(parsed)) {
|
|
43
|
+
return parsed.map((d, i) => ({
|
|
44
|
+
id: d.id ?? String(i),
|
|
45
|
+
score: d.score ?? 0,
|
|
46
|
+
content: d.content,
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// fall through to array-based parsing
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Also look for indexed attributes like gen_ai.retrieval.documents.0.id
|
|
55
|
+
const docs = new Map();
|
|
56
|
+
for (const attr of rawAttrs) {
|
|
57
|
+
const m = attr.key.match(/^gen_ai\.retrieval\.documents\.(\d+)\.(id|score|content)$/);
|
|
58
|
+
if (!m)
|
|
59
|
+
continue;
|
|
60
|
+
const idx = parseInt(m[1], 10);
|
|
61
|
+
const field = m[2];
|
|
62
|
+
if (!docs.has(idx))
|
|
63
|
+
docs.set(idx, {});
|
|
64
|
+
const doc = docs.get(idx);
|
|
65
|
+
const val = attrValue(attr.value);
|
|
66
|
+
if (field === 'id')
|
|
67
|
+
doc.id = String(val ?? idx);
|
|
68
|
+
if (field === 'score')
|
|
69
|
+
doc.score = typeof val === 'number' ? val : 0;
|
|
70
|
+
if (field === 'content')
|
|
71
|
+
doc.content = String(val ?? '');
|
|
72
|
+
}
|
|
73
|
+
if (docs.size > 0) {
|
|
74
|
+
return Array.from(docs.entries())
|
|
75
|
+
.sort(([a], [b]) => a - b)
|
|
76
|
+
.map(([i, d]) => ({ id: d.id ?? String(i), score: d.score ?? 0, content: d.content }));
|
|
77
|
+
}
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
export function parseOtlpPayload(payload) {
|
|
81
|
+
const traces = [];
|
|
82
|
+
for (const rs of payload.resourceSpans ?? []) {
|
|
83
|
+
const resourceAttrs = attrsToMap(rs.resource?.attributes ?? []);
|
|
84
|
+
const serviceName = resourceAttrs['service.name'] ?? 'unknown';
|
|
85
|
+
const traceSpans = new Map();
|
|
86
|
+
for (const ss of rs.scopeSpans ?? []) {
|
|
87
|
+
for (const span of ss.spans ?? []) {
|
|
88
|
+
const attrs = attrsToMap(span.attributes ?? []);
|
|
89
|
+
const startTimeMs = nanoToMs(span.startTimeUnixNano);
|
|
90
|
+
const endTimeMs = nanoToMs(span.endTimeUnixNano);
|
|
91
|
+
const documents = parseDocuments(attrs, span.attributes ?? []);
|
|
92
|
+
const prompt = (attrs['ai.prompt'] ?? attrs['gen_ai.prompt']);
|
|
93
|
+
const parsed = {
|
|
94
|
+
traceId: span.traceId,
|
|
95
|
+
spanId: span.spanId,
|
|
96
|
+
parentSpanId: span.parentSpanId,
|
|
97
|
+
name: span.name,
|
|
98
|
+
kind: inferKind(span.name, attrs),
|
|
99
|
+
startTimeMs,
|
|
100
|
+
endTimeMs,
|
|
101
|
+
latencyMs: endTimeMs - startTimeMs,
|
|
102
|
+
operationName: attrs['gen_ai.operation.name'],
|
|
103
|
+
model: attrs['gen_ai.request.model'] ?? attrs['gen_ai.response.model'],
|
|
104
|
+
system: attrs['gen_ai.system'],
|
|
105
|
+
inputTokens: attrs['gen_ai.usage.input_tokens'],
|
|
106
|
+
outputTokens: attrs['gen_ai.usage.output_tokens'],
|
|
107
|
+
rawAttributes: JSON.stringify(span.attributes ?? []),
|
|
108
|
+
documents: documents.length > 0 ? documents : undefined,
|
|
109
|
+
prompt: typeof prompt === 'string' ? prompt : undefined,
|
|
110
|
+
};
|
|
111
|
+
if (!traceSpans.has(span.traceId))
|
|
112
|
+
traceSpans.set(span.traceId, []);
|
|
113
|
+
traceSpans.get(span.traceId).push(parsed);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const [traceId, spanList] of traceSpans) {
|
|
117
|
+
traces.push({ traceId, serviceName, spans: spanList });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return traces;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=otlp-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-parser.js","sourceRoot":"","sources":["../../../src/ingestion/otlp-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp-parser.test.d.ts","sourceRoot":"","sources":["../../../src/ingestion/otlp-parser.test.ts"],"names":[],"mappings":""}
|