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.
Files changed (103) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +135 -0
  3. package/dist/bin/ragscope.d.ts +3 -0
  4. package/dist/bin/ragscope.d.ts.map +1 -0
  5. package/dist/bin/ragscope.js +135 -0
  6. package/dist/bin/ragscope.js.map +1 -0
  7. package/dist/src/app.d.ts +5 -0
  8. package/dist/src/app.d.ts.map +1 -0
  9. package/dist/src/app.js +88 -0
  10. package/dist/src/app.js.map +1 -0
  11. package/dist/src/app.test.d.ts +2 -0
  12. package/dist/src/app.test.d.ts.map +1 -0
  13. package/dist/src/app.test.js +59 -0
  14. package/dist/src/app.test.js.map +1 -0
  15. package/dist/src/audit/scorer.d.ts +17 -0
  16. package/dist/src/audit/scorer.d.ts.map +1 -0
  17. package/dist/src/audit/scorer.js +85 -0
  18. package/dist/src/audit/scorer.js.map +1 -0
  19. package/dist/src/audit/scorer.test.d.ts +2 -0
  20. package/dist/src/audit/scorer.test.d.ts.map +1 -0
  21. package/dist/src/audit/scorer.test.js +101 -0
  22. package/dist/src/audit/scorer.test.js.map +1 -0
  23. package/dist/src/db/index.d.ts +731 -0
  24. package/dist/src/db/index.d.ts.map +1 -0
  25. package/dist/src/db/index.js +59 -0
  26. package/dist/src/db/index.js.map +1 -0
  27. package/dist/src/db/queries.d.ts +12 -0
  28. package/dist/src/db/queries.d.ts.map +1 -0
  29. package/dist/src/db/queries.js +35 -0
  30. package/dist/src/db/queries.js.map +1 -0
  31. package/dist/src/db/queries.test.d.ts +2 -0
  32. package/dist/src/db/queries.test.d.ts.map +1 -0
  33. package/dist/src/db/queries.test.js +101 -0
  34. package/dist/src/db/queries.test.js.map +1 -0
  35. package/dist/src/db/schema.d.ts +725 -0
  36. package/dist/src/db/schema.d.ts.map +1 -0
  37. package/dist/src/db/schema.js +47 -0
  38. package/dist/src/db/schema.js.map +1 -0
  39. package/dist/src/enrichment/boundaries.d.ts +4 -0
  40. package/dist/src/enrichment/boundaries.d.ts.map +1 -0
  41. package/dist/src/enrichment/boundaries.js +19 -0
  42. package/dist/src/enrichment/boundaries.js.map +1 -0
  43. package/dist/src/enrichment/boundaries.test.d.ts +2 -0
  44. package/dist/src/enrichment/boundaries.test.d.ts.map +1 -0
  45. package/dist/src/enrichment/boundaries.test.js +69 -0
  46. package/dist/src/enrichment/boundaries.test.js.map +1 -0
  47. package/dist/src/enrichment/embeddings.d.ts +3 -0
  48. package/dist/src/enrichment/embeddings.d.ts.map +1 -0
  49. package/dist/src/enrichment/embeddings.js +37 -0
  50. package/dist/src/enrichment/embeddings.js.map +1 -0
  51. package/dist/src/enrichment/normalizer.d.ts +10 -0
  52. package/dist/src/enrichment/normalizer.d.ts.map +1 -0
  53. package/dist/src/enrichment/normalizer.js +42 -0
  54. package/dist/src/enrichment/normalizer.js.map +1 -0
  55. package/dist/src/enrichment/normalizer.test.d.ts +2 -0
  56. package/dist/src/enrichment/normalizer.test.d.ts.map +1 -0
  57. package/dist/src/enrichment/normalizer.test.js +47 -0
  58. package/dist/src/enrichment/normalizer.test.js.map +1 -0
  59. package/dist/src/enrichment/pipeline.d.ts +4 -0
  60. package/dist/src/enrichment/pipeline.d.ts.map +1 -0
  61. package/dist/src/enrichment/pipeline.js +93 -0
  62. package/dist/src/enrichment/pipeline.js.map +1 -0
  63. package/dist/src/enrichment/pipeline.test.d.ts +2 -0
  64. package/dist/src/enrichment/pipeline.test.d.ts.map +1 -0
  65. package/dist/src/enrichment/pipeline.test.js +133 -0
  66. package/dist/src/enrichment/pipeline.test.js.map +1 -0
  67. package/dist/src/enrichment/reranker.d.ts +20 -0
  68. package/dist/src/enrichment/reranker.d.ts.map +1 -0
  69. package/dist/src/enrichment/reranker.js +45 -0
  70. package/dist/src/enrichment/reranker.js.map +1 -0
  71. package/dist/src/enrichment/reranker.test.d.ts +2 -0
  72. package/dist/src/enrichment/reranker.test.d.ts.map +1 -0
  73. package/dist/src/enrichment/reranker.test.js +82 -0
  74. package/dist/src/enrichment/reranker.test.js.map +1 -0
  75. package/dist/src/enrichment/tokenizer.d.ts +2 -0
  76. package/dist/src/enrichment/tokenizer.d.ts.map +1 -0
  77. package/dist/src/enrichment/tokenizer.js +40 -0
  78. package/dist/src/enrichment/tokenizer.js.map +1 -0
  79. package/dist/src/enrichment/tokenizer.test.d.ts +2 -0
  80. package/dist/src/enrichment/tokenizer.test.d.ts.map +1 -0
  81. package/dist/src/enrichment/tokenizer.test.js +36 -0
  82. package/dist/src/enrichment/tokenizer.test.js.map +1 -0
  83. package/dist/src/index.d.ts +3 -0
  84. package/dist/src/index.d.ts.map +1 -0
  85. package/dist/src/index.js +3 -0
  86. package/dist/src/index.js.map +1 -0
  87. package/dist/src/ingestion/langfuse.d.ts +17 -0
  88. package/dist/src/ingestion/langfuse.d.ts.map +1 -0
  89. package/dist/src/ingestion/langfuse.js +102 -0
  90. package/dist/src/ingestion/langfuse.js.map +1 -0
  91. package/dist/src/ingestion/otlp-parser.d.ts +3 -0
  92. package/dist/src/ingestion/otlp-parser.d.ts.map +1 -0
  93. package/dist/src/ingestion/otlp-parser.js +122 -0
  94. package/dist/src/ingestion/otlp-parser.js.map +1 -0
  95. package/dist/src/ingestion/otlp-parser.test.d.ts +2 -0
  96. package/dist/src/ingestion/otlp-parser.test.d.ts.map +1 -0
  97. package/dist/src/ingestion/otlp-parser.test.js +194 -0
  98. package/dist/src/ingestion/otlp-parser.test.js.map +1 -0
  99. package/dist/src/types.d.ts +114 -0
  100. package/dist/src/types.d.ts.map +1 -0
  101. package/dist/src/types.js +3 -0
  102. package/dist/src/types.js.map +1 -0
  103. package/package.json +78 -0
@@ -0,0 +1,194 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseOtlpPayload } from './otlp-parser.js';
3
+ const minimalPayload = {
4
+ resourceSpans: [
5
+ {
6
+ resource: { attributes: [{ key: 'service.name', value: { stringValue: 'my-rag-app' } }] },
7
+ scopeSpans: [
8
+ {
9
+ spans: [
10
+ {
11
+ traceId: 'trace-abc',
12
+ spanId: 'span-001',
13
+ name: 'qdrant.query',
14
+ kind: 3,
15
+ startTimeUnixNano: '1700000000000000000',
16
+ endTimeUnixNano: '1700000000050000000',
17
+ attributes: [
18
+ { key: 'gen_ai.operation.name', value: { stringValue: 'retrieve' } },
19
+ { key: 'gen_ai.system', value: { stringValue: 'qdrant' } },
20
+ {
21
+ key: 'gen_ai.retrieval.documents',
22
+ value: {
23
+ stringValue: JSON.stringify([
24
+ { id: 'doc-1', score: 0.92, content: 'Paris is the capital' },
25
+ { id: 'doc-2', score: 0.75 },
26
+ ]),
27
+ },
28
+ },
29
+ ],
30
+ },
31
+ ],
32
+ },
33
+ ],
34
+ },
35
+ ],
36
+ };
37
+ describe('parseOtlpPayload', () => {
38
+ it('extracts service name from resource attributes', () => {
39
+ const traces = parseOtlpPayload(minimalPayload);
40
+ expect(traces[0].serviceName).toBe('my-rag-app');
41
+ });
42
+ it('groups spans by traceId', () => {
43
+ const traces = parseOtlpPayload(minimalPayload);
44
+ expect(traces).toHaveLength(1);
45
+ expect(traces[0].traceId).toBe('trace-abc');
46
+ expect(traces[0].spans).toHaveLength(1);
47
+ });
48
+ it('converts nanosecond timestamps to milliseconds', () => {
49
+ const traces = parseOtlpPayload(minimalPayload);
50
+ const span = traces[0].spans[0];
51
+ expect(span.startTimeMs).toBe(1700000000000);
52
+ expect(span.latencyMs).toBe(50);
53
+ });
54
+ it('infers RETRIEVER kind from gen_ai.operation.name', () => {
55
+ const traces = parseOtlpPayload(minimalPayload);
56
+ expect(traces[0].spans[0].kind).toBe('RETRIEVER');
57
+ });
58
+ it('parses gen_ai.retrieval.documents JSON string', () => {
59
+ const traces = parseOtlpPayload(minimalPayload);
60
+ const docs = traces[0].spans[0].documents;
61
+ expect(docs).toHaveLength(2);
62
+ expect(docs[0]).toEqual({ id: 'doc-1', score: 0.92, content: 'Paris is the capital' });
63
+ expect(docs[1].id).toBe('doc-2');
64
+ });
65
+ it('infers LLM kind from operation name', () => {
66
+ const payload = {
67
+ resourceSpans: [{
68
+ scopeSpans: [{
69
+ spans: [{
70
+ traceId: 't1', spanId: 's1', name: 'openai.chat', kind: 3,
71
+ startTimeUnixNano: '1000000000000', endTimeUnixNano: '2000000000000',
72
+ attributes: [
73
+ { key: 'gen_ai.operation.name', value: { stringValue: 'chat' } },
74
+ { key: 'gen_ai.usage.input_tokens', value: { intValue: '100' } },
75
+ { key: 'gen_ai.usage.output_tokens', value: { intValue: '50' } },
76
+ ],
77
+ }],
78
+ }],
79
+ }],
80
+ };
81
+ const traces = parseOtlpPayload(payload);
82
+ const span = traces[0].spans[0];
83
+ expect(span.kind).toBe('LLM');
84
+ expect(span.inputTokens).toBe(100);
85
+ expect(span.outputTokens).toBe(50);
86
+ });
87
+ it('falls back to SPAN kind for unknown spans', () => {
88
+ const payload = {
89
+ resourceSpans: [{
90
+ scopeSpans: [{
91
+ spans: [{
92
+ traceId: 't1', spanId: 's1', name: 'some.unknown.operation', kind: 1,
93
+ startTimeUnixNano: '1000000000000', endTimeUnixNano: '1000000001000',
94
+ }],
95
+ }],
96
+ }],
97
+ };
98
+ const traces = parseOtlpPayload(payload);
99
+ expect(traces[0].spans[0].kind).toBe('SPAN');
100
+ });
101
+ it('handles empty payload gracefully', () => {
102
+ const traces = parseOtlpPayload({});
103
+ expect(traces).toHaveLength(0);
104
+ });
105
+ it('parses indexed gen_ai.retrieval.documents.N.field attributes', () => {
106
+ const payload = {
107
+ resourceSpans: [{
108
+ scopeSpans: [{
109
+ spans: [{
110
+ traceId: 't1', spanId: 's1', name: 'qdrant.query', kind: 3,
111
+ startTimeUnixNano: '1000000000000', endTimeUnixNano: '1001000000000',
112
+ attributes: [
113
+ { key: 'gen_ai.retrieval.documents.0.id', value: { stringValue: 'chunk-a' } },
114
+ { key: 'gen_ai.retrieval.documents.0.score', value: { doubleValue: 0.88 } },
115
+ { key: 'gen_ai.retrieval.documents.0.content', value: { stringValue: 'First chunk' } },
116
+ { key: 'gen_ai.retrieval.documents.1.id', value: { stringValue: 'chunk-b' } },
117
+ { key: 'gen_ai.retrieval.documents.1.score', value: { doubleValue: 0.72 } },
118
+ ],
119
+ }],
120
+ }],
121
+ }],
122
+ };
123
+ const traces = parseOtlpPayload(payload);
124
+ const docs = traces[0].spans[0].documents;
125
+ expect(docs).toHaveLength(2);
126
+ expect(docs[0].id).toBe('chunk-a');
127
+ expect(docs[0].score).toBeCloseTo(0.88);
128
+ expect(docs[0].content).toBe('First chunk');
129
+ expect(docs[1].id).toBe('chunk-b');
130
+ });
131
+ it('ignores malformed gen_ai.retrieval.documents JSON and falls back to indexed', () => {
132
+ const payload = {
133
+ resourceSpans: [{
134
+ scopeSpans: [{
135
+ spans: [{
136
+ traceId: 't1', spanId: 's1', name: 'retriever', kind: 3,
137
+ startTimeUnixNano: '1000000000000', endTimeUnixNano: '1001000000000',
138
+ attributes: [
139
+ { key: 'gen_ai.retrieval.documents', value: { stringValue: 'not valid json {{' } },
140
+ { key: 'gen_ai.retrieval.documents.0.id', value: { stringValue: 'fallback-doc' } },
141
+ { key: 'gen_ai.retrieval.documents.0.score', value: { doubleValue: 0.5 } },
142
+ ],
143
+ }],
144
+ }],
145
+ }],
146
+ };
147
+ const traces = parseOtlpPayload(payload);
148
+ const docs = traces[0].spans[0].documents;
149
+ expect(docs).toHaveLength(1);
150
+ expect(docs[0].id).toBe('fallback-doc');
151
+ });
152
+ it('infers EMBEDDING kind', () => {
153
+ const payload = {
154
+ resourceSpans: [{
155
+ scopeSpans: [{
156
+ spans: [{
157
+ traceId: 't1', spanId: 's1', name: 'openai.embed', kind: 3,
158
+ startTimeUnixNano: '1000000000000', endTimeUnixNano: '1001000000000',
159
+ attributes: [{ key: 'gen_ai.operation.name', value: { stringValue: 'embeddings' } }],
160
+ }],
161
+ }],
162
+ }],
163
+ };
164
+ expect(parseOtlpPayload(payload)[0].spans[0].kind).toBe('EMBEDDING');
165
+ });
166
+ it('infers RERANKER kind', () => {
167
+ const payload = {
168
+ resourceSpans: [{
169
+ scopeSpans: [{
170
+ spans: [{
171
+ traceId: 't1', spanId: 's1', name: 'cohere.rerank', kind: 3,
172
+ startTimeUnixNano: '1000000000000', endTimeUnixNano: '1001000000000',
173
+ attributes: [{ key: 'gen_ai.operation.name', value: { stringValue: 'rerank' } }],
174
+ }],
175
+ }],
176
+ }],
177
+ };
178
+ expect(parseOtlpPayload(payload)[0].spans[0].kind).toBe('RERANKER');
179
+ });
180
+ it('defaults serviceName to unknown when resource has no service.name', () => {
181
+ const payload = {
182
+ resourceSpans: [{
183
+ scopeSpans: [{
184
+ spans: [{
185
+ traceId: 't1', spanId: 's1', name: 'op', kind: 1,
186
+ startTimeUnixNano: '1000000000000', endTimeUnixNano: '1001000000000',
187
+ }],
188
+ }],
189
+ }],
190
+ };
191
+ expect(parseOtlpPayload(payload)[0].serviceName).toBe('unknown');
192
+ });
193
+ });
194
+ //# sourceMappingURL=otlp-parser.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-parser.test.js","sourceRoot":"","sources":["../../../src/ingestion/otlp-parser.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ export interface OtlpAttributeValue {
2
+ stringValue?: string;
3
+ intValue?: string;
4
+ doubleValue?: number;
5
+ boolValue?: boolean;
6
+ arrayValue?: {
7
+ values: OtlpAttributeValue[];
8
+ };
9
+ }
10
+ export interface OtlpAttribute {
11
+ key: string;
12
+ value: OtlpAttributeValue;
13
+ }
14
+ export interface OtlpSpan {
15
+ traceId: string;
16
+ spanId: string;
17
+ parentSpanId?: string;
18
+ name: string;
19
+ kind: number;
20
+ startTimeUnixNano: string;
21
+ endTimeUnixNano: string;
22
+ attributes?: OtlpAttribute[];
23
+ status?: {
24
+ code: number;
25
+ message?: string;
26
+ };
27
+ }
28
+ export interface OtlpPayload {
29
+ resourceSpans?: Array<{
30
+ resource?: {
31
+ attributes?: OtlpAttribute[];
32
+ };
33
+ scopeSpans?: Array<{
34
+ scope?: {
35
+ name?: string;
36
+ version?: string;
37
+ };
38
+ spans?: OtlpSpan[];
39
+ }>;
40
+ }>;
41
+ }
42
+ export type SpanKind = 'CHAIN' | 'EMBEDDING' | 'RETRIEVER' | 'RERANKER' | 'LLM' | 'SPAN';
43
+ export interface RetrievalDocument {
44
+ id: string;
45
+ score: number;
46
+ content?: string;
47
+ }
48
+ export interface ParsedSpan {
49
+ traceId: string;
50
+ spanId: string;
51
+ parentSpanId?: string;
52
+ name: string;
53
+ kind: SpanKind;
54
+ startTimeMs: number;
55
+ endTimeMs: number;
56
+ latencyMs: number;
57
+ operationName?: string;
58
+ model?: string;
59
+ system?: string;
60
+ inputTokens?: number;
61
+ outputTokens?: number;
62
+ rawAttributes: string;
63
+ documents?: RetrievalDocument[];
64
+ prompt?: string;
65
+ }
66
+ export interface ParsedTrace {
67
+ traceId: string;
68
+ serviceName: string;
69
+ spans: ParsedSpan[];
70
+ }
71
+ export interface RagTrace {
72
+ id: string;
73
+ serviceName: string;
74
+ query: string | null;
75
+ source: 'traceai' | 'langfuse' | 'vercel' | 'manual';
76
+ totalLatencyMs: number | null;
77
+ spanCount: number;
78
+ chunkCount: number;
79
+ createdAt: number;
80
+ }
81
+ export interface RagSpan {
82
+ id: string;
83
+ traceId: string;
84
+ parentSpanId: string | null;
85
+ name: string;
86
+ kind: SpanKind;
87
+ startTimeMs: number;
88
+ endTimeMs: number;
89
+ latencyMs: number;
90
+ operationName: string | null;
91
+ model: string | null;
92
+ system: string | null;
93
+ inputTokens: number | null;
94
+ outputTokens: number | null;
95
+ }
96
+ export interface RagChunk {
97
+ id: string;
98
+ spanId: string;
99
+ traceId: string;
100
+ chunkId: string;
101
+ content: string | null;
102
+ scoreRaw: number | null;
103
+ scoreNormalized: number | null;
104
+ rankRetrieval: number | null;
105
+ rankReranked: number | null;
106
+ scoreReranked: number | null;
107
+ tokenCount: number | null;
108
+ vectorStore: string | null;
109
+ inContext: boolean;
110
+ contextPosition: number | null;
111
+ overlapWithNext: number | null;
112
+ scoreMissing: boolean;
113
+ }
114
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // ─── OTLP wire format (incoming JSON payload) ────────────────────────────────
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,gFAAgF"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "ragscope",
3
+ "version": "0.1.0",
4
+ "description": "Lighthouse for RAG — PASS/WARN/FAIL scores for your retrieval pipeline, straight in the terminal. Works with LangChain, LlamaIndex, Vercel AI SDK, Langfuse, and any OpenTelemetry source.",
5
+ "keywords": [
6
+ "rag",
7
+ "retrieval-augmented-generation",
8
+ "llm",
9
+ "ai",
10
+ "langchain",
11
+ "llamaindex",
12
+ "openai",
13
+ "vercel-ai-sdk",
14
+ "langfuse",
15
+ "opentelemetry",
16
+ "otlp",
17
+ "vector-search",
18
+ "qdrant",
19
+ "pinecone",
20
+ "chromadb",
21
+ "rag-evaluation",
22
+ "rag-debugging",
23
+ "observability",
24
+ "devtools",
25
+ "cli"
26
+ ],
27
+ "author": "Siddharth Pandey <pandeysiddharth27@gmail.com>",
28
+ "license": "Apache-2.0",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/Sidd27/ragscope.git"
32
+ },
33
+ "homepage": "https://github.com/Sidd27/ragscope#readme",
34
+ "bugs": {
35
+ "url": "https://github.com/Sidd27/ragscope/issues"
36
+ },
37
+ "engines": {
38
+ "node": ">=18.0.0"
39
+ },
40
+ "publishConfig": {
41
+ "access": "public"
42
+ },
43
+ "type": "module",
44
+ "bin": {
45
+ "ragscope": "dist/bin/ragscope.js"
46
+ },
47
+ "files": [
48
+ "dist"
49
+ ],
50
+ "scripts": {
51
+ "build": "tsc && chmod +x dist/bin/ragscope.js",
52
+ "prepublishOnly": "pnpm run build",
53
+ "dev": "tsx watch bin/ragscope.ts",
54
+ "test": "vitest run",
55
+ "typecheck": "tsc --noEmit"
56
+ },
57
+ "dependencies": {
58
+ "@fastify/cors": "^10.0.2",
59
+ "ai-tokenizer": "^1.0.6",
60
+ "better-sqlite3": "^12.10.0",
61
+ "chonkie": "^0.3.0",
62
+ "drizzle-orm": "^0.45.2",
63
+ "fastify": "^5.3.2",
64
+ "langfuse": "^3.37.1",
65
+ "picocolors": "^1.1.1"
66
+ },
67
+ "optionalDependencies": {
68
+ "@huggingface/transformers": "^4.2.0"
69
+ },
70
+ "devDependencies": {
71
+ "@types/better-sqlite3": "^7.6.13",
72
+ "@types/node": "^22.15.21",
73
+ "@vitest/coverage-v8": "^3.2.4",
74
+ "tsx": "^4.19.4",
75
+ "typescript": "^5.8.3",
76
+ "vitest": "^3.2.1"
77
+ }
78
+ }