openlit 1.9.1 → 1.10.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 (77) hide show
  1. package/README.md +17 -1
  2. package/dist/constant.d.ts +1 -2
  3. package/dist/constant.js +6 -3
  4. package/dist/constant.js.map +1 -1
  5. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.d.ts +18 -0
  6. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js +209 -0
  7. package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js.map +1 -0
  8. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.d.ts +7 -0
  9. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js +237 -0
  10. package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js.map +1 -0
  11. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.d.ts +17 -0
  12. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js +206 -0
  13. package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js.map +1 -0
  14. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.d.ts +17 -0
  15. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js +182 -0
  16. package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js.map +1 -0
  17. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.d.ts +7 -0
  18. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js +158 -0
  19. package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js.map +1 -0
  20. package/dist/instrumentation/__tests__/trace-comparison-utils.d.ts +1 -0
  21. package/dist/instrumentation/__tests__/trace-comparison-utils.js +34 -27
  22. package/dist/instrumentation/__tests__/trace-comparison-utils.js.map +1 -1
  23. package/dist/instrumentation/anthropic/wrapper.js +1 -0
  24. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  25. package/dist/instrumentation/base-wrapper.js +3 -5
  26. package/dist/instrumentation/base-wrapper.js.map +1 -1
  27. package/dist/instrumentation/bedrock/wrapper.js +6 -2
  28. package/dist/instrumentation/bedrock/wrapper.js.map +1 -1
  29. package/dist/instrumentation/chroma/index.d.ts +11 -0
  30. package/dist/instrumentation/chroma/index.js +70 -0
  31. package/dist/instrumentation/chroma/index.js.map +1 -0
  32. package/dist/instrumentation/chroma/wrapper.d.ts +10 -0
  33. package/dist/instrumentation/chroma/wrapper.js +127 -0
  34. package/dist/instrumentation/chroma/wrapper.js.map +1 -0
  35. package/dist/instrumentation/cohere/wrapper.js +0 -4
  36. package/dist/instrumentation/cohere/wrapper.js.map +1 -1
  37. package/dist/instrumentation/groq/wrapper.js +3 -1
  38. package/dist/instrumentation/groq/wrapper.js.map +1 -1
  39. package/dist/instrumentation/huggingface/index.d.ts +13 -0
  40. package/dist/instrumentation/huggingface/index.js +110 -0
  41. package/dist/instrumentation/huggingface/index.js.map +1 -0
  42. package/dist/instrumentation/huggingface/wrapper.d.ts +41 -0
  43. package/dist/instrumentation/huggingface/wrapper.js +246 -0
  44. package/dist/instrumentation/huggingface/wrapper.js.map +1 -0
  45. package/dist/instrumentation/index.js +10 -0
  46. package/dist/instrumentation/index.js.map +1 -1
  47. package/dist/instrumentation/langchain/wrapper.js +2 -0
  48. package/dist/instrumentation/langchain/wrapper.js.map +1 -1
  49. package/dist/instrumentation/milvus/index.d.ts +11 -0
  50. package/dist/instrumentation/milvus/index.js +67 -0
  51. package/dist/instrumentation/milvus/index.js.map +1 -0
  52. package/dist/instrumentation/milvus/wrapper.d.ts +15 -0
  53. package/dist/instrumentation/milvus/wrapper.js +219 -0
  54. package/dist/instrumentation/milvus/wrapper.js.map +1 -0
  55. package/dist/instrumentation/mistral/wrapper.js +4 -2
  56. package/dist/instrumentation/mistral/wrapper.js.map +1 -1
  57. package/dist/instrumentation/openai/wrapper.js +7 -3
  58. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  59. package/dist/instrumentation/qdrant/index.d.ts +11 -0
  60. package/dist/instrumentation/qdrant/index.js +67 -0
  61. package/dist/instrumentation/qdrant/index.js.map +1 -0
  62. package/dist/instrumentation/qdrant/wrapper.d.ts +14 -0
  63. package/dist/instrumentation/qdrant/wrapper.js +213 -0
  64. package/dist/instrumentation/qdrant/wrapper.js.map +1 -0
  65. package/dist/instrumentation/replicate/index.d.ts +11 -0
  66. package/dist/instrumentation/replicate/index.js +57 -0
  67. package/dist/instrumentation/replicate/index.js.map +1 -0
  68. package/dist/instrumentation/replicate/wrapper.d.ts +15 -0
  69. package/dist/instrumentation/replicate/wrapper.js +99 -0
  70. package/dist/instrumentation/replicate/wrapper.js.map +1 -0
  71. package/dist/instrumentation/together/wrapper.js +3 -1
  72. package/dist/instrumentation/together/wrapper.js.map +1 -1
  73. package/dist/semantic-convention.d.ts +101 -30
  74. package/dist/semantic-convention.js +114 -39
  75. package/dist/semantic-convention.js.map +1 -1
  76. package/dist/types.d.ts +1 -1
  77. package/package.json +1 -1
package/README.md CHANGED
@@ -24,7 +24,7 @@ This project proudly follows and maintains the [Semantic Conventions](https://gi
24
24
 
25
25
  ## ⚡ Features
26
26
 
27
- - 🔎 **Auto Instrumentation**: Works with 8 LLM providers with just one line of code.
27
+ - 🔎 **Auto Instrumentation**: Works with 12+ LLM providers, vector databases, and AI frameworks with just one line of code.
28
28
  - 🔭 **OpenTelemetry-Native Observability SDKs**: Vendor-neutral SDKs that can send traces and metrics to your existing observability tool like Prometheus and Jaeger.
29
29
  - 💲 **Cost Tracking for Custom and Fine-Tuned Models**: Pass custom pricing files for accurate budgeting of custom and fine-tuned models.
30
30
  - 🚀 **Support for OpenLIT Features**: Includes support for prompt management and secrets management features available in OpenLIT.
@@ -42,8 +42,24 @@ This project proudly follows and maintains the [Semantic Conventions](https://gi
42
42
  | [✅ Google AI Studio](https://docs.openlit.io/latest/integrations/google-ai-studio) |
43
43
  | [✅ Together AI](https://docs.openlit.io/latest/integrations/together) |
44
44
  | [✅ Ollama](https://docs.openlit.io/latest/integrations/ollama) |
45
+ | [✅ AWS Bedrock](https://docs.openlit.io/latest/integrations/bedrock) |
46
+ | [✅ Hugging Face](https://docs.openlit.io/latest/integrations/huggingface) |
47
+ | [✅ Replicate](https://docs.openlit.io/latest/integrations/replicate) |
45
48
  | [✅ Azure OpenAI](https://docs.openlit.io/latest/integrations/azure-openai) *(via OpenAI SDK)* |
46
49
 
50
+ | Vector Databases |
51
+ | ------------------------------------------------------------------------------------------- |
52
+ | [✅ Chroma](https://docs.openlit.io/latest/integrations/chromadb) |
53
+ | [✅ Pinecone](https://docs.openlit.io/latest/integrations/pinecone) |
54
+ | [✅ Qdrant](https://docs.openlit.io/latest/integrations/qdrant) |
55
+ | [✅ Milvus](https://docs.openlit.io/latest/integrations/milvus) |
56
+
57
+ | Frameworks |
58
+ | ------------------------------------------------------------------------------------------- |
59
+ | [✅ LangChain](https://docs.openlit.io/latest/integrations/langchain) |
60
+ | [✅ LlamaIndex](https://docs.openlit.io/latest/integrations/llama-index) |
61
+ | [✅ Vercel AI SDK](https://docs.openlit.io/latest/integrations/vercel-ai) |
62
+
47
63
  ## Supported Destinations
48
64
 
49
65
  - [✅ OpenTelemetry Collector](https://docs.openlit.io/latest/connections/otelcol)
@@ -1,7 +1,6 @@
1
1
  export declare const SDK_NAME = "openlit";
2
- export declare const SDK_VERSION = "1.9.1";
2
+ export declare const SDK_VERSION: string;
3
3
  export declare const DEFAULT_ENVIRONMENT = "default";
4
4
  export declare const DEFAULT_APPLICATION_NAME = "default";
5
5
  export declare const INSTRUMENTATION_PREFIX = "@openlit";
6
- export declare const TELEMETRY_SDK_NAME = "opentelemetry";
7
6
  export declare const OPENLIT_URL = "http://127.0.0.1:3000";
package/dist/constant.js CHANGED
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OPENLIT_URL = exports.TELEMETRY_SDK_NAME = exports.INSTRUMENTATION_PREFIX = exports.DEFAULT_APPLICATION_NAME = exports.DEFAULT_ENVIRONMENT = exports.SDK_VERSION = exports.SDK_NAME = void 0;
6
+ exports.OPENLIT_URL = exports.INSTRUMENTATION_PREFIX = exports.DEFAULT_APPLICATION_NAME = exports.DEFAULT_ENVIRONMENT = exports.SDK_VERSION = exports.SDK_NAME = void 0;
7
+ const package_json_1 = __importDefault(require("../package.json"));
4
8
  exports.SDK_NAME = 'openlit';
5
- exports.SDK_VERSION = '1.9.1';
9
+ exports.SDK_VERSION = package_json_1.default.version;
6
10
  exports.DEFAULT_ENVIRONMENT = 'default';
7
11
  exports.DEFAULT_APPLICATION_NAME = 'default';
8
12
  exports.INSTRUMENTATION_PREFIX = '@openlit';
9
- exports.TELEMETRY_SDK_NAME = 'opentelemetry';
10
13
  exports.OPENLIT_URL = 'http://127.0.0.1:3000';
11
14
  //# sourceMappingURL=constant.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constant.js","sourceRoot":"","sources":["../src/constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG,SAAS,CAAC;AACrB,QAAA,WAAW,GAAG,OAAO,CAAC;AACtB,QAAA,mBAAmB,GAAG,SAAS,CAAC;AAChC,QAAA,wBAAwB,GAAG,SAAS,CAAC;AACrC,QAAA,sBAAsB,GAAG,UAAU,CAAC;AACpC,QAAA,kBAAkB,GAAG,eAAe,CAAC;AACrC,QAAA,WAAW,GAAG,uBAAuB,CAAC"}
1
+ {"version":3,"file":"constant.js","sourceRoot":"","sources":["../src/constant.ts"],"names":[],"mappings":";;;;;;AAAA,mEAAkC;AAErB,QAAA,QAAQ,GAAG,SAAS,CAAC;AACrB,QAAA,WAAW,GAAG,sBAAG,CAAC,OAAO,CAAC;AAC1B,QAAA,mBAAmB,GAAG,SAAS,CAAC;AAChC,QAAA,wBAAwB,GAAG,SAAS,CAAC;AACrC,QAAA,sBAAsB,GAAG,UAAU,CAAC;AACpC,QAAA,WAAW,GAAG,uBAAuB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Cross-Language Trace Comparison Tests for ChromaDB Integration
3
+ *
4
+ * Verifies that TypeScript SDK generates traces consistent with the Python SDK
5
+ * for ChromaDB Collection operations.
6
+ *
7
+ * Python SDK reference: sdk/python/src/openlit/instrumentation/chroma/utils.py
8
+ *
9
+ * Key alignment:
10
+ * - db.system.name = 'chroma'
11
+ * - db.operation.name: INSERT (add), QUERY (query), GET (get), DELETE, PEEK, UPDATE, UPSERT
12
+ * - db.collection.name
13
+ * - server.address, server.port (default localhost:8000)
14
+ * - db.vector.query.top_k for query
15
+ * - db.filter for where-clause filtering
16
+ * - db.query.summary
17
+ */
18
+ export {};
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-Language Trace Comparison Tests for ChromaDB Integration
4
+ *
5
+ * Verifies that TypeScript SDK generates traces consistent with the Python SDK
6
+ * for ChromaDB Collection operations.
7
+ *
8
+ * Python SDK reference: sdk/python/src/openlit/instrumentation/chroma/utils.py
9
+ *
10
+ * Key alignment:
11
+ * - db.system.name = 'chroma'
12
+ * - db.operation.name: INSERT (add), QUERY (query), GET (get), DELETE, PEEK, UPDATE, UPSERT
13
+ * - db.collection.name
14
+ * - server.address, server.port (default localhost:8000)
15
+ * - db.vector.query.top_k for query
16
+ * - db.filter for where-clause filtering
17
+ * - db.query.summary
18
+ */
19
+ var __importDefault = (this && this.__importDefault) || function (mod) {
20
+ return (mod && mod.__esModule) ? mod : { "default": mod };
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ const wrapper_1 = __importDefault(require("../chroma/wrapper"));
24
+ const config_1 = __importDefault(require("../../config"));
25
+ const helpers_1 = __importDefault(require("../../helpers"));
26
+ const semantic_convention_1 = __importDefault(require("../../semantic-convention"));
27
+ jest.mock('../../config');
28
+ jest.mock('../../helpers');
29
+ describe('ChromaDB Cross-Language Trace Comparison', () => {
30
+ let mockSpan;
31
+ let mockTracer;
32
+ beforeEach(() => {
33
+ mockSpan = {
34
+ setAttribute: jest.fn(),
35
+ addEvent: jest.fn(),
36
+ end: jest.fn(),
37
+ setStatus: jest.fn(),
38
+ };
39
+ mockTracer = {
40
+ startSpan: jest.fn().mockReturnValue(mockSpan),
41
+ };
42
+ config_1.default.environment = 'openlit-testing';
43
+ config_1.default.applicationName = 'openlit-test';
44
+ config_1.default.traceContent = true;
45
+ helpers_1.default.handleException = jest.fn();
46
+ });
47
+ afterEach(() => {
48
+ jest.clearAllMocks();
49
+ });
50
+ // ── Helper: invoke wrapper ────────────────────────────────────────────────
51
+ async function invokeWrapped(method, dbOperation, collectionName, params, returnValue = {}) {
52
+ const patchFn = wrapper_1.default._patchCollectionMethod(mockTracer, dbOperation);
53
+ const originalMethod = jest.fn().mockResolvedValue(returnValue);
54
+ const fakeCollectionInstance = { name: collectionName };
55
+ const wrapped = patchFn(originalMethod);
56
+ await wrapped.call(fakeCollectionInstance, params);
57
+ }
58
+ // ── Common DB attributes ──────────────────────────────────────────────────
59
+ it('should set db.system.name = "chroma" matching Python DB_SYSTEM_CHROMA', async () => {
60
+ await invokeWrapped('add', semantic_convention_1.default.DB_OPERATION_INSERT, 'test_col', {
61
+ ids: ['id1'],
62
+ embeddings: [[0.1, 0.2]],
63
+ });
64
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_SYSTEM_NAME, 'chroma');
65
+ });
66
+ it('should set server.address = localhost and server.port = 8000 (Python defaults)', async () => {
67
+ await invokeWrapped('add', semantic_convention_1.default.DB_OPERATION_INSERT, 'test_col', {
68
+ ids: ['id1'],
69
+ });
70
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_ADDRESS, 'localhost');
71
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_PORT, 8000);
72
+ });
73
+ it('should set db.collection.name from collection instance', async () => {
74
+ await invokeWrapped('add', semantic_convention_1.default.DB_OPERATION_INSERT, 'my_collection', {
75
+ ids: ['id1'],
76
+ });
77
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_COLLECTION_NAME, 'my_collection');
78
+ });
79
+ // ── add → INSERT ──────────────────────────────────────────────────────────
80
+ describe('add() → INSERT (matches Python DB_OPERATION_INSERT)', () => {
81
+ it('should set db.operation.name = "INSERT"', async () => {
82
+ await invokeWrapped('add', semantic_convention_1.default.DB_OPERATION_INSERT, 'col', {
83
+ ids: ['id1', 'id2'],
84
+ embeddings: [[0.1], [0.2]],
85
+ documents: ['doc1', 'doc2'],
86
+ });
87
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'INSERT');
88
+ });
89
+ it('should set db.vector.count = number of ids', async () => {
90
+ await invokeWrapped('add', semantic_convention_1.default.DB_OPERATION_INSERT, 'col', {
91
+ ids: ['id1', 'id2', 'id3'],
92
+ });
93
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_VECTOR_COUNT, 3);
94
+ });
95
+ it('should set db.documents_count when documents provided', async () => {
96
+ await invokeWrapped('add', semantic_convention_1.default.DB_OPERATION_INSERT, 'col', {
97
+ ids: ['id1'],
98
+ documents: ['doc1'],
99
+ });
100
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_DOCUMENTS_COUNT, 1);
101
+ });
102
+ });
103
+ // ── query → QUERY ─────────────────────────────────────────────────────────
104
+ describe('query() → QUERY (vector similarity search)', () => {
105
+ it('should set db.operation.name = "QUERY"', async () => {
106
+ await invokeWrapped('query', semantic_convention_1.default.DB_OPERATION_QUERY, 'col', {
107
+ queryEmbeddings: [[0.1, 0.2]],
108
+ nResults: 5,
109
+ }, { ids: [['id1', 'id2']] });
110
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'QUERY');
111
+ });
112
+ it('should set db.vector.query.top_k from nResults', async () => {
113
+ await invokeWrapped('query', semantic_convention_1.default.DB_OPERATION_QUERY, 'col', {
114
+ queryEmbeddings: [[0.1]],
115
+ nResults: 10,
116
+ }, { ids: [['id1']] });
117
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_VECTOR_QUERY_TOP_K, 10);
118
+ });
119
+ it('should set db.filter when where clause provided (matching Python DB_FILTER)', async () => {
120
+ const where = { source: 'test' };
121
+ await invokeWrapped('query', semantic_convention_1.default.DB_OPERATION_QUERY, 'col', {
122
+ queryEmbeddings: [[0.1]],
123
+ nResults: 5,
124
+ where,
125
+ });
126
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_FILTER, JSON.stringify(where));
127
+ });
128
+ it('should set db.n_results to number of matched results', async () => {
129
+ await invokeWrapped('query', semantic_convention_1.default.DB_OPERATION_QUERY, 'col', {
130
+ queryEmbeddings: [[0.1]],
131
+ nResults: 5,
132
+ }, { ids: [['r1', 'r2', 'r3']] });
133
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_N_RESULTS, 3);
134
+ });
135
+ });
136
+ // ── get → GET ────────────────────────────────────────────────────────────
137
+ describe('get() → GET (retrieve by IDs)', () => {
138
+ it('should set db.operation.name = "GET"', async () => {
139
+ await invokeWrapped('get', semantic_convention_1.default.DB_OPERATION_GET, 'col', {
140
+ ids: ['id1', 'id2'],
141
+ }, { ids: ['id1', 'id2'] });
142
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'GET');
143
+ });
144
+ it('should set db.ids_count from ids array length', async () => {
145
+ await invokeWrapped('get', semantic_convention_1.default.DB_OPERATION_GET, 'col', {
146
+ ids: ['id1', 'id2'],
147
+ });
148
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_ID_COUNT, 2);
149
+ });
150
+ });
151
+ // ── delete → DELETE ───────────────────────────────────────────────────────
152
+ describe('delete() → DELETE', () => {
153
+ it('should set db.operation.name = "DELETE"', async () => {
154
+ await invokeWrapped('delete', semantic_convention_1.default.DB_OPERATION_DELETE, 'col', {
155
+ ids: ['id1'],
156
+ });
157
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'DELETE');
158
+ });
159
+ it('should set db.filter when where clause provided', async () => {
160
+ const where = { category: 'old' };
161
+ await invokeWrapped('delete', semantic_convention_1.default.DB_OPERATION_DELETE, 'col', {
162
+ where,
163
+ });
164
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_FILTER, JSON.stringify(where));
165
+ });
166
+ });
167
+ // ── peek → PEEK ───────────────────────────────────────────────────────────
168
+ describe('peek() → PEEK', () => {
169
+ it('should set db.operation.name = "PEEK"', async () => {
170
+ await invokeWrapped('peek', semantic_convention_1.default.DB_OPERATION_PEEK, 'col', 5, {
171
+ ids: ['id1', 'id2', 'id3', 'id4', 'id5'],
172
+ });
173
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'PEEK');
174
+ });
175
+ });
176
+ // ── upsert → UPSERT ───────────────────────────────────────────────────────
177
+ describe('upsert() → UPSERT', () => {
178
+ it('should set db.operation.name = "UPSERT" and db.vector.count', async () => {
179
+ await invokeWrapped('upsert', semantic_convention_1.default.DB_OPERATION_UPSERT, 'col', {
180
+ ids: ['id1', 'id2'],
181
+ embeddings: [[0.1], [0.2]],
182
+ });
183
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'UPSERT');
184
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_VECTOR_COUNT, 2);
185
+ });
186
+ });
187
+ // ── update → UPDATE ───────────────────────────────────────────────────────
188
+ describe('update() → UPDATE', () => {
189
+ it('should set db.operation.name = "UPDATE"', async () => {
190
+ await invokeWrapped('update', semantic_convention_1.default.DB_OPERATION_UPDATE, 'col', {
191
+ ids: ['id1'],
192
+ documents: ['new content'],
193
+ });
194
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.DB_OPERATION_NAME, 'UPDATE');
195
+ });
196
+ });
197
+ // ── Error handling ────────────────────────────────────────────────────────
198
+ it('should call handleException on error', async () => {
199
+ const patchFn = wrapper_1.default._patchCollectionMethod(mockTracer, semantic_convention_1.default.DB_OPERATION_QUERY);
200
+ const error = new Error('Collection not found');
201
+ const originalMethod = jest.fn().mockRejectedValue(error);
202
+ const fakeInstance = { name: 'missing_col' };
203
+ const wrapped = patchFn(originalMethod);
204
+ await expect(wrapped.call(fakeInstance, {})).rejects.toThrow('Collection not found');
205
+ expect(helpers_1.default.handleException).toHaveBeenCalledWith(mockSpan, error);
206
+ expect(mockSpan.end).toHaveBeenCalled();
207
+ });
208
+ });
209
+ //# sourceMappingURL=chroma-trace-comparison.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chroma-trace-comparison.test.js","sourceRoot":"","sources":["../../../src/instrumentation/__tests__/chroma-trace-comparison.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Cross-Language Trace Comparison Tests for HuggingFace Inference Integration
3
+ *
4
+ * Verifies that the TypeScript SDK generates traces consistent with the Python SDK
5
+ * for HuggingFace Inference API chatCompletion and textGeneration.
6
+ */
7
+ export {};
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-Language Trace Comparison Tests for HuggingFace Inference Integration
4
+ *
5
+ * Verifies that the TypeScript SDK generates traces consistent with the Python SDK
6
+ * for HuggingFace Inference API chatCompletion and textGeneration.
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const wrapper_1 = __importDefault(require("../huggingface/wrapper"));
13
+ const config_1 = __importDefault(require("../../config"));
14
+ const helpers_1 = __importDefault(require("../../helpers"));
15
+ const base_wrapper_1 = __importDefault(require("../base-wrapper"));
16
+ const semantic_convention_1 = __importDefault(require("../../semantic-convention"));
17
+ jest.mock('../../config');
18
+ jest.mock('../../helpers');
19
+ jest.mock('../base-wrapper');
20
+ describe('HuggingFace Cross-Language Trace Comparison', () => {
21
+ let mockSpan;
22
+ let mockTracer;
23
+ beforeEach(() => {
24
+ mockSpan = {
25
+ setAttribute: jest.fn(),
26
+ addEvent: jest.fn(),
27
+ end: jest.fn(),
28
+ setStatus: jest.fn(),
29
+ };
30
+ mockTracer = {
31
+ startSpan: jest.fn().mockReturnValue(mockSpan),
32
+ };
33
+ config_1.default.environment = 'openlit-testing';
34
+ config_1.default.applicationName = 'openlit-test';
35
+ config_1.default.traceContent = true;
36
+ config_1.default.pricing_json = {};
37
+ config_1.default.updatePricingJson = jest.fn().mockResolvedValue({});
38
+ helpers_1.default.getChatModelCost = jest.fn().mockReturnValue(0.0005);
39
+ helpers_1.default.generalTokens = jest.fn().mockReturnValue(8);
40
+ helpers_1.default.buildInputMessages = jest.fn().mockReturnValue('[]');
41
+ helpers_1.default.buildOutputMessages = jest.fn().mockReturnValue('[]');
42
+ helpers_1.default.handleException = jest.fn();
43
+ helpers_1.default.createStreamProxy = jest.fn().mockImplementation((stream, _gen) => stream);
44
+ base_wrapper_1.default.recordMetrics = jest.fn();
45
+ base_wrapper_1.default.setBaseSpanAttributes = jest.fn().mockImplementation((span, attrs) => {
46
+ span.setAttribute(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, attrs.aiSystem);
47
+ span.setAttribute(semantic_convention_1.default.GEN_AI_ENDPOINT, attrs.genAIEndpoint);
48
+ span.setAttribute(semantic_convention_1.default.GEN_AI_REQUEST_MODEL, attrs.model);
49
+ if (attrs.cost !== undefined)
50
+ span.setAttribute(semantic_convention_1.default.GEN_AI_USAGE_COST, attrs.cost);
51
+ if (attrs.serverAddress)
52
+ span.setAttribute(semantic_convention_1.default.SERVER_ADDRESS, attrs.serverAddress);
53
+ if (attrs.serverPort !== undefined)
54
+ span.setAttribute(semantic_convention_1.default.SERVER_PORT, attrs.serverPort);
55
+ span.setAttribute(semantic_convention_1.default.GEN_AI_SDK_VERSION, '1.9.0');
56
+ });
57
+ });
58
+ afterEach(() => {
59
+ jest.clearAllMocks();
60
+ });
61
+ // ── Chat Completion ───────────────────────────────────────────────────────
62
+ describe('Chat Completion', () => {
63
+ const mockArgs = [
64
+ {
65
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
66
+ messages: [{ role: 'user', content: 'What is LLM Observability?' }],
67
+ max_tokens: 100,
68
+ temperature: 0.7,
69
+ stream: false,
70
+ },
71
+ ];
72
+ const mockResponse = {
73
+ id: 'hf-chat-123',
74
+ created: Date.now(),
75
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
76
+ choices: [
77
+ {
78
+ index: 0,
79
+ finish_reason: 'stop',
80
+ message: { role: 'assistant', content: 'LLM Observability is...' },
81
+ },
82
+ ],
83
+ usage: { prompt_tokens: 12, completion_tokens: 25, total_tokens: 37 },
84
+ };
85
+ it('should set gen_ai.system = "huggingface" matching Python GEN_AI_SYSTEM_HUGGING_FACE', async () => {
86
+ await wrapper_1.default._chatCompletion({
87
+ args: mockArgs,
88
+ genAIEndpoint: 'huggingface.chat.completions',
89
+ response: mockResponse,
90
+ span: mockSpan,
91
+ });
92
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'huggingface');
93
+ });
94
+ it('should set gen_ai.operation.name = "chat" matching Python', async () => {
95
+ await wrapper_1.default._chatCompletion({
96
+ args: mockArgs,
97
+ genAIEndpoint: 'huggingface.chat.completions',
98
+ response: mockResponse,
99
+ span: mockSpan,
100
+ });
101
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OPERATION, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_CHAT);
102
+ });
103
+ it('should set token usage attributes matching Python SDK', async () => {
104
+ await wrapper_1.default._chatCompletion({
105
+ args: mockArgs,
106
+ genAIEndpoint: 'huggingface.chat.completions',
107
+ response: mockResponse,
108
+ span: mockSpan,
109
+ });
110
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_INPUT_TOKENS, 12);
111
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_OUTPUT_TOKENS, 25);
112
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_USAGE_TOTAL_TOKENS, 37);
113
+ });
114
+ it('should set server.address and server.port matching Python', async () => {
115
+ await wrapper_1.default._chatCompletion({
116
+ args: mockArgs,
117
+ genAIEndpoint: 'huggingface.chat.completions',
118
+ response: mockResponse,
119
+ span: mockSpan,
120
+ });
121
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_ADDRESS, 'api-inference.huggingface.co');
122
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.SERVER_PORT, 443);
123
+ });
124
+ it('should set request params: temperature, max_tokens, is_stream', async () => {
125
+ await wrapper_1.default._chatCompletion({
126
+ args: mockArgs,
127
+ genAIEndpoint: 'huggingface.chat.completions',
128
+ response: mockResponse,
129
+ span: mockSpan,
130
+ });
131
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_TEMPERATURE, 0.7);
132
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_MAX_TOKENS, 100);
133
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_IS_STREAM, false);
134
+ });
135
+ it('should set finish_reason and output_type', async () => {
136
+ await wrapper_1.default._chatCompletion({
137
+ args: mockArgs,
138
+ genAIEndpoint: 'huggingface.chat.completions',
139
+ response: mockResponse,
140
+ span: mockSpan,
141
+ });
142
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_RESPONSE_FINISH_REASON, ['stop']);
143
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OUTPUT_TYPE, semantic_convention_1.default.GEN_AI_OUTPUT_TYPE_TEXT);
144
+ });
145
+ it('should call recordMetrics after span ends', async () => {
146
+ await wrapper_1.default._chatCompletion({
147
+ args: mockArgs,
148
+ genAIEndpoint: 'huggingface.chat.completions',
149
+ response: mockResponse,
150
+ span: mockSpan,
151
+ });
152
+ expect(mockSpan.end).toHaveBeenCalled();
153
+ expect(base_wrapper_1.default.recordMetrics).toHaveBeenCalled();
154
+ });
155
+ });
156
+ // ── Streaming ─────────────────────────────────────────────────────────────
157
+ describe('Streaming Chat Completion', () => {
158
+ it('should set is_stream=true and accumulate content across chunks', async () => {
159
+ const mockArgs = [
160
+ {
161
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
162
+ messages: [{ role: 'user', content: 'Hello' }],
163
+ stream: true,
164
+ },
165
+ ];
166
+ async function* mockStream() {
167
+ yield {
168
+ id: 'hf-stream-1',
169
+ created: Date.now(),
170
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
171
+ choices: [{ delta: { content: 'Hello' } }],
172
+ };
173
+ yield {
174
+ id: 'hf-stream-1',
175
+ created: Date.now(),
176
+ model: 'meta-llama/Meta-Llama-3-8B-Instruct',
177
+ choices: [{ delta: { content: ' world' }, finish_reason: 'stop' }],
178
+ };
179
+ }
180
+ const generator = wrapper_1.default._chatCompletionGenerator({
181
+ args: mockArgs,
182
+ genAIEndpoint: 'huggingface.chat.completions',
183
+ response: mockStream(),
184
+ span: mockSpan,
185
+ });
186
+ for await (const _ of generator) { /* consume */ }
187
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_IS_STREAM, true);
188
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'huggingface');
189
+ expect(mockSpan.end).toHaveBeenCalled();
190
+ });
191
+ });
192
+ // ── Text Generation ───────────────────────────────────────────────────────
193
+ describe('Text Generation', () => {
194
+ it('should set text_completion operation and correct attributes', async () => {
195
+ const mockArgs = [
196
+ {
197
+ model: 'gpt2',
198
+ inputs: 'The meaning of life is',
199
+ parameters: { max_new_tokens: 50, temperature: 0.9 },
200
+ },
201
+ ];
202
+ const mockResponse = { generated_text: 'The meaning of life is 42.' };
203
+ await wrapper_1.default._textGeneration({
204
+ args: mockArgs,
205
+ genAIEndpoint: 'huggingface.text.generation',
206
+ response: mockResponse,
207
+ span: mockSpan,
208
+ });
209
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OPERATION, semantic_convention_1.default.GEN_AI_OPERATION_TYPE_TEXT_COMPLETION);
210
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_PROVIDER_NAME, 'huggingface');
211
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_MAX_TOKENS, 50);
212
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_TEMPERATURE, 0.9);
213
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_REQUEST_IS_STREAM, false);
214
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_OUTPUT_TYPE, semantic_convention_1.default.GEN_AI_OUTPUT_TYPE_TEXT);
215
+ expect(mockSpan.end).toHaveBeenCalled();
216
+ });
217
+ it('should capture prompt and completion content when traceContent=true', async () => {
218
+ const mockArgs = [
219
+ {
220
+ model: 'gpt2',
221
+ inputs: 'The meaning of life is',
222
+ parameters: {},
223
+ },
224
+ ];
225
+ const mockResponse = { generated_text: '42.' };
226
+ await wrapper_1.default._textGeneration({
227
+ args: mockArgs,
228
+ genAIEndpoint: 'huggingface.text.generation',
229
+ response: mockResponse,
230
+ span: mockSpan,
231
+ });
232
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_CONTENT_PROMPT_EVENT, 'The meaning of life is');
233
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(semantic_convention_1.default.GEN_AI_CONTENT_COMPLETION_EVENT, '42.');
234
+ });
235
+ });
236
+ });
237
+ //# sourceMappingURL=huggingface-trace-comparison.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingface-trace-comparison.test.js","sourceRoot":"","sources":["../../../src/instrumentation/__tests__/huggingface-trace-comparison.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Cross-Language Trace Comparison Tests for Milvus Integration
3
+ *
4
+ * Verifies TypeScript SDK trace attributes match Python SDK.
5
+ *
6
+ * Python SDK reference: sdk/python/src/openlit/instrumentation/milvus/milvus.py
7
+ *
8
+ * Key alignment:
9
+ * - db.system.name = 'milvus'
10
+ * - db.operation.name: SEARCH, INSERT, UPSERT, DELETE, QUERY
11
+ * - server.address, server.port (default localhost:19530)
12
+ * - db.vector.query.top_k for search
13
+ * - db.filter for expr/filter params
14
+ * - db.vector.count for insert/upsert
15
+ * - db.query.summary
16
+ */
17
+ export {};