openlit 1.9.1 → 1.11.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/README.md +51 -1
- package/dist/constant.d.ts +1 -2
- package/dist/constant.js +6 -3
- package/dist/constant.js.map +1 -1
- package/dist/features/__tests__/rule-engine.test.d.ts +1 -0
- package/dist/features/__tests__/rule-engine.test.js +146 -0
- package/dist/features/__tests__/rule-engine.test.js.map +1 -0
- package/dist/features/base.d.ts +2 -0
- package/dist/features/base.js +2 -0
- package/dist/features/base.js.map +1 -1
- package/dist/features/rule-engine.d.ts +6 -0
- package/dist/features/rule-engine.js +60 -0
- package/dist/features/rule-engine.js.map +1 -0
- package/dist/instrumentation/__tests__/chroma-trace-comparison.test.d.ts +18 -0
- package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js +209 -0
- package/dist/instrumentation/__tests__/chroma-trace-comparison.test.js.map +1 -0
- package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.d.ts +7 -0
- package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js +237 -0
- package/dist/instrumentation/__tests__/huggingface-trace-comparison.test.js.map +1 -0
- package/dist/instrumentation/__tests__/milvus-trace-comparison.test.d.ts +17 -0
- package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js +206 -0
- package/dist/instrumentation/__tests__/milvus-trace-comparison.test.js.map +1 -0
- package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.d.ts +17 -0
- package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js +182 -0
- package/dist/instrumentation/__tests__/qdrant-trace-comparison.test.js.map +1 -0
- package/dist/instrumentation/__tests__/replicate-trace-comparison.test.d.ts +7 -0
- package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js +158 -0
- package/dist/instrumentation/__tests__/replicate-trace-comparison.test.js.map +1 -0
- package/dist/instrumentation/__tests__/trace-comparison-utils.d.ts +1 -0
- package/dist/instrumentation/__tests__/trace-comparison-utils.js +34 -27
- package/dist/instrumentation/__tests__/trace-comparison-utils.js.map +1 -1
- package/dist/instrumentation/anthropic/wrapper.js +1 -0
- package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
- package/dist/instrumentation/base-wrapper.js +3 -5
- package/dist/instrumentation/base-wrapper.js.map +1 -1
- package/dist/instrumentation/bedrock/wrapper.js +6 -2
- package/dist/instrumentation/bedrock/wrapper.js.map +1 -1
- package/dist/instrumentation/chroma/index.d.ts +11 -0
- package/dist/instrumentation/chroma/index.js +70 -0
- package/dist/instrumentation/chroma/index.js.map +1 -0
- package/dist/instrumentation/chroma/wrapper.d.ts +10 -0
- package/dist/instrumentation/chroma/wrapper.js +127 -0
- package/dist/instrumentation/chroma/wrapper.js.map +1 -0
- package/dist/instrumentation/cohere/wrapper.js +0 -4
- package/dist/instrumentation/cohere/wrapper.js.map +1 -1
- package/dist/instrumentation/groq/wrapper.js +3 -1
- package/dist/instrumentation/groq/wrapper.js.map +1 -1
- package/dist/instrumentation/huggingface/index.d.ts +13 -0
- package/dist/instrumentation/huggingface/index.js +110 -0
- package/dist/instrumentation/huggingface/index.js.map +1 -0
- package/dist/instrumentation/huggingface/wrapper.d.ts +41 -0
- package/dist/instrumentation/huggingface/wrapper.js +246 -0
- package/dist/instrumentation/huggingface/wrapper.js.map +1 -0
- package/dist/instrumentation/index.js +10 -0
- package/dist/instrumentation/index.js.map +1 -1
- package/dist/instrumentation/langchain/wrapper.js +2 -0
- package/dist/instrumentation/langchain/wrapper.js.map +1 -1
- package/dist/instrumentation/milvus/index.d.ts +11 -0
- package/dist/instrumentation/milvus/index.js +67 -0
- package/dist/instrumentation/milvus/index.js.map +1 -0
- package/dist/instrumentation/milvus/wrapper.d.ts +15 -0
- package/dist/instrumentation/milvus/wrapper.js +219 -0
- package/dist/instrumentation/milvus/wrapper.js.map +1 -0
- package/dist/instrumentation/mistral/wrapper.js +4 -2
- package/dist/instrumentation/mistral/wrapper.js.map +1 -1
- package/dist/instrumentation/openai/wrapper.js +7 -3
- package/dist/instrumentation/openai/wrapper.js.map +1 -1
- package/dist/instrumentation/qdrant/index.d.ts +11 -0
- package/dist/instrumentation/qdrant/index.js +67 -0
- package/dist/instrumentation/qdrant/index.js.map +1 -0
- package/dist/instrumentation/qdrant/wrapper.d.ts +14 -0
- package/dist/instrumentation/qdrant/wrapper.js +213 -0
- package/dist/instrumentation/qdrant/wrapper.js.map +1 -0
- package/dist/instrumentation/replicate/index.d.ts +11 -0
- package/dist/instrumentation/replicate/index.js +57 -0
- package/dist/instrumentation/replicate/index.js.map +1 -0
- package/dist/instrumentation/replicate/wrapper.d.ts +15 -0
- package/dist/instrumentation/replicate/wrapper.js +99 -0
- package/dist/instrumentation/replicate/wrapper.js.map +1 -0
- package/dist/instrumentation/together/wrapper.js +3 -1
- package/dist/instrumentation/together/wrapper.js.map +1 -1
- package/dist/semantic-convention.d.ts +101 -30
- package/dist/semantic-convention.js +114 -39
- package/dist/semantic-convention.js.map +1 -1
- package/dist/types.d.ts +17 -1
- 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
|
|
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)
|
|
@@ -218,6 +234,40 @@ Below are the parameters for use with the SDK for OpenLIT Vault for secret manag
|
|
|
218
234
|
|
|
219
235
|
|
|
220
236
|
|
|
237
|
+
### OpenLIT Rule Engine - `Openlit.evaluateRule()`
|
|
238
|
+
|
|
239
|
+
Evaluate trace attributes against the OpenLIT Rule Engine to retrieve matching rules and associated entities (contexts, prompts, evaluation configurations).
|
|
240
|
+
|
|
241
|
+
| Parameter | Description |
|
|
242
|
+
|--------------------|------------------------------------------------------------------------------------------------------------------------------------|
|
|
243
|
+
| `url` | Sets the OpenLIT URL. Defaults to the `OPENLIT_URL` environment variable or `http://127.0.0.1:3000`. |
|
|
244
|
+
| `apiKey` | Sets the OpenLIT API Key. Can also be provided via the `OPENLIT_API_KEY` environment variable. |
|
|
245
|
+
| `entityType` | Type of entity to match: `"context"`, `"prompt"`, or `"evaluation"`. |
|
|
246
|
+
| `fields` | Object of trace attributes to evaluate against rules. e.g. `{ "gen_ai.system": "openai" }` |
|
|
247
|
+
| `includeEntityData`| If `true`, include full entity data in the response. Default: `false`. Optional |
|
|
248
|
+
| `entityInputs` | Optional object of inputs for entity resolution (e.g. prompt variables). |
|
|
249
|
+
|
|
250
|
+
#### Example
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
import Openlit from 'openlit';
|
|
254
|
+
|
|
255
|
+
const result = await Openlit.evaluateRule({
|
|
256
|
+
entityType: 'context',
|
|
257
|
+
fields: {
|
|
258
|
+
'gen_ai.system': 'openai',
|
|
259
|
+
'gen_ai.request.model': 'gpt-4',
|
|
260
|
+
'service.name': 'my-app',
|
|
261
|
+
},
|
|
262
|
+
includeEntityData: true,
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
if (!('err' in result)) {
|
|
266
|
+
console.log('Matching rules:', result.matchingRuleIds);
|
|
267
|
+
console.log('Entities:', result.entities);
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
221
271
|
## 🌱 Contributing
|
|
222
272
|
|
|
223
273
|
Whether it's big or small, we love contributions 💚. Check out our [Contribution guide](../../CONTRIBUTING.md) to get started
|
package/dist/constant.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export declare const SDK_NAME = "openlit";
|
|
2
|
-
export declare const SDK_VERSION
|
|
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.
|
|
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 =
|
|
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
|
package/dist/constant.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant.js","sourceRoot":"","sources":["../src/constant.ts"],"names":[],"mappings":"
|
|
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 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const rule_engine_1 = __importDefault(require("../rule-engine"));
|
|
7
|
+
// Mock OpenlitConfig
|
|
8
|
+
jest.mock('../../config', () => ({
|
|
9
|
+
__esModule: true,
|
|
10
|
+
default: {
|
|
11
|
+
applicationName: 'test-app',
|
|
12
|
+
environment: 'test',
|
|
13
|
+
},
|
|
14
|
+
}));
|
|
15
|
+
// Mock constant
|
|
16
|
+
jest.mock('../../constant', () => ({
|
|
17
|
+
OPENLIT_URL: 'http://127.0.0.1:3000',
|
|
18
|
+
}));
|
|
19
|
+
// Save original env
|
|
20
|
+
const originalEnv = process.env;
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
jest.restoreAllMocks();
|
|
23
|
+
process.env = { ...originalEnv };
|
|
24
|
+
delete process.env.OPENLIT_URL;
|
|
25
|
+
delete process.env.OPENLIT_API_KEY;
|
|
26
|
+
});
|
|
27
|
+
afterAll(() => {
|
|
28
|
+
process.env = originalEnv;
|
|
29
|
+
});
|
|
30
|
+
describe('RuleEngine.evaluateRule', () => {
|
|
31
|
+
it('sends correct request to rule-engine evaluate endpoint', async () => {
|
|
32
|
+
const mockResponse = {
|
|
33
|
+
matchingRuleIds: ['rule-1'],
|
|
34
|
+
entities: [{ rule_id: 'rule-1', entity_type: 'context', entity_id: 'ctx-1' }],
|
|
35
|
+
};
|
|
36
|
+
global.fetch = jest.fn().mockResolvedValue({
|
|
37
|
+
ok: true,
|
|
38
|
+
json: () => Promise.resolve(mockResponse),
|
|
39
|
+
});
|
|
40
|
+
const result = await rule_engine_1.default.evaluateRule({
|
|
41
|
+
url: 'http://localhost:3000',
|
|
42
|
+
apiKey: 'test-key',
|
|
43
|
+
entityType: 'context',
|
|
44
|
+
fields: { 'gen_ai.system': 'openai' },
|
|
45
|
+
});
|
|
46
|
+
expect(global.fetch).toHaveBeenCalledTimes(1);
|
|
47
|
+
const [url, options] = global.fetch.mock.calls[0];
|
|
48
|
+
expect(url).toBe('http://localhost:3000/api/rule-engine/evaluate');
|
|
49
|
+
expect(options.method).toBe('POST');
|
|
50
|
+
expect(options.headers.Authorization).toBe('Bearer test-key');
|
|
51
|
+
const body = JSON.parse(options.body);
|
|
52
|
+
expect(body.entity_type).toBe('context');
|
|
53
|
+
expect(body.fields).toEqual({ 'gen_ai.system': 'openai' });
|
|
54
|
+
expect(body.source).toBe('ts-sdk');
|
|
55
|
+
expect(result).toEqual(mockResponse);
|
|
56
|
+
});
|
|
57
|
+
it('returns error object on HTTP error', async () => {
|
|
58
|
+
global.fetch = jest.fn().mockResolvedValue({
|
|
59
|
+
ok: false,
|
|
60
|
+
status: 401,
|
|
61
|
+
});
|
|
62
|
+
const result = await rule_engine_1.default.evaluateRule({
|
|
63
|
+
url: 'http://localhost:3000',
|
|
64
|
+
apiKey: 'bad-key',
|
|
65
|
+
entityType: 'context',
|
|
66
|
+
fields: {},
|
|
67
|
+
});
|
|
68
|
+
expect(result).toHaveProperty('err');
|
|
69
|
+
expect(result.err).toContain('401');
|
|
70
|
+
});
|
|
71
|
+
it('returns error object on network failure', async () => {
|
|
72
|
+
global.fetch = jest.fn().mockRejectedValue(new Error('Network error'));
|
|
73
|
+
const result = await rule_engine_1.default.evaluateRule({
|
|
74
|
+
url: 'http://localhost:3000',
|
|
75
|
+
apiKey: 'test-key',
|
|
76
|
+
entityType: 'context',
|
|
77
|
+
fields: {},
|
|
78
|
+
});
|
|
79
|
+
expect(result).toHaveProperty('err');
|
|
80
|
+
expect(result.err).toContain('Network error');
|
|
81
|
+
});
|
|
82
|
+
it('uses OPENLIT_URL env var as fallback', async () => {
|
|
83
|
+
process.env.OPENLIT_URL = 'http://env-host:4000';
|
|
84
|
+
global.fetch = jest.fn().mockResolvedValue({
|
|
85
|
+
ok: true,
|
|
86
|
+
json: () => Promise.resolve({ matchingRuleIds: [] }),
|
|
87
|
+
});
|
|
88
|
+
await rule_engine_1.default.evaluateRule({
|
|
89
|
+
apiKey: 'key',
|
|
90
|
+
entityType: 'context',
|
|
91
|
+
fields: {},
|
|
92
|
+
});
|
|
93
|
+
const [url] = global.fetch.mock.calls[0];
|
|
94
|
+
expect(url).toBe('http://env-host:4000/api/rule-engine/evaluate');
|
|
95
|
+
});
|
|
96
|
+
it('uses OPENLIT_API_KEY env var as fallback', async () => {
|
|
97
|
+
process.env.OPENLIT_API_KEY = 'env-api-key';
|
|
98
|
+
global.fetch = jest.fn().mockResolvedValue({
|
|
99
|
+
ok: true,
|
|
100
|
+
json: () => Promise.resolve({ matchingRuleIds: [] }),
|
|
101
|
+
});
|
|
102
|
+
await rule_engine_1.default.evaluateRule({
|
|
103
|
+
url: 'http://localhost:3000',
|
|
104
|
+
entityType: 'context',
|
|
105
|
+
fields: {},
|
|
106
|
+
});
|
|
107
|
+
const [, options] = global.fetch.mock.calls[0];
|
|
108
|
+
expect(options.headers.Authorization).toBe('Bearer env-api-key');
|
|
109
|
+
});
|
|
110
|
+
it('passes includeEntityData and entityInputs', async () => {
|
|
111
|
+
global.fetch = jest.fn().mockResolvedValue({
|
|
112
|
+
ok: true,
|
|
113
|
+
json: () => Promise.resolve({ matchingRuleIds: [], entity_data: {} }),
|
|
114
|
+
});
|
|
115
|
+
await rule_engine_1.default.evaluateRule({
|
|
116
|
+
url: 'http://localhost:3000',
|
|
117
|
+
apiKey: 'key',
|
|
118
|
+
entityType: 'prompt',
|
|
119
|
+
fields: { key: 'val' },
|
|
120
|
+
includeEntityData: true,
|
|
121
|
+
entityInputs: { variables: { name: 'test' } },
|
|
122
|
+
});
|
|
123
|
+
const body = JSON.parse(global.fetch.mock.calls[0][1].body);
|
|
124
|
+
expect(body.include_entity_data).toBe(true);
|
|
125
|
+
expect(body.entity_inputs).toEqual({ variables: { name: 'test' } });
|
|
126
|
+
expect(body.entity_type).toBe('prompt');
|
|
127
|
+
});
|
|
128
|
+
it('includes metaProperties from OpenlitConfig', async () => {
|
|
129
|
+
global.fetch = jest.fn().mockResolvedValue({
|
|
130
|
+
ok: true,
|
|
131
|
+
json: () => Promise.resolve({ matchingRuleIds: [] }),
|
|
132
|
+
});
|
|
133
|
+
await rule_engine_1.default.evaluateRule({
|
|
134
|
+
url: 'http://localhost:3000',
|
|
135
|
+
apiKey: 'key',
|
|
136
|
+
entityType: 'context',
|
|
137
|
+
fields: {},
|
|
138
|
+
});
|
|
139
|
+
const body = JSON.parse(global.fetch.mock.calls[0][1].body);
|
|
140
|
+
expect(body.metaProperties).toEqual({
|
|
141
|
+
applicationName: 'test-app',
|
|
142
|
+
environment: 'test',
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=rule-engine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-engine.test.js","sourceRoot":"","sources":["../../../src/features/__tests__/rule-engine.test.ts"],"names":[],"mappings":"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"}
|
package/dist/features/base.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import PromptHub from './prompt-hub';
|
|
2
|
+
import RuleEngine from './rule-engine';
|
|
2
3
|
import Vault from './vault';
|
|
3
4
|
export default class BaseOpenlit {
|
|
4
5
|
static getPrompts: typeof PromptHub.getPrompts;
|
|
5
6
|
static getSecrets: typeof Vault.getSecrets;
|
|
7
|
+
static evaluateRule: typeof RuleEngine.evaluateRule;
|
|
6
8
|
}
|
package/dist/features/base.js
CHANGED
|
@@ -4,10 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const prompt_hub_1 = __importDefault(require("./prompt-hub"));
|
|
7
|
+
const rule_engine_1 = __importDefault(require("./rule-engine"));
|
|
7
8
|
const vault_1 = __importDefault(require("./vault"));
|
|
8
9
|
class BaseOpenlit {
|
|
9
10
|
}
|
|
10
11
|
BaseOpenlit.getPrompts = prompt_hub_1.default.getPrompts;
|
|
11
12
|
BaseOpenlit.getSecrets = vault_1.default.getSecrets;
|
|
13
|
+
BaseOpenlit.evaluateRule = rule_engine_1.default.evaluateRule;
|
|
12
14
|
exports.default = BaseOpenlit;
|
|
13
15
|
//# sourceMappingURL=base.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/features/base.ts"],"names":[],"mappings":";;;;;AAAA,8DAAqC;AACrC,oDAA4B;AAE5B,MAAqB,WAAW;;AACvB,sBAAU,GAAG,oBAAS,CAAC,UAAU,CAAC;AAClC,sBAAU,GAAG,eAAK,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/features/base.ts"],"names":[],"mappings":";;;;;AAAA,8DAAqC;AACrC,gEAAuC;AACvC,oDAA4B;AAE5B,MAAqB,WAAW;;AACvB,sBAAU,GAAG,oBAAS,CAAC,UAAU,CAAC;AAClC,sBAAU,GAAG,eAAK,CAAC,UAAU,CAAC;AAC9B,wBAAY,GAAG,qBAAU,CAAC,YAAY,CAAC;kBAH3B,WAAW"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const config_1 = __importDefault(require("../config"));
|
|
7
|
+
const constant_1 = require("../constant");
|
|
8
|
+
class RuleEngine {
|
|
9
|
+
static async evaluateRule(options) {
|
|
10
|
+
const url = process.env.OPENLIT_URL || options.url || constant_1.OPENLIT_URL;
|
|
11
|
+
const apiKey = process.env.OPENLIT_API_KEY || options.apiKey || '';
|
|
12
|
+
const metaProperties = {
|
|
13
|
+
applicationName: config_1.default.applicationName,
|
|
14
|
+
environment: config_1.default.environment,
|
|
15
|
+
};
|
|
16
|
+
try {
|
|
17
|
+
const response = await fetch(`${url}/api/rule-engine/evaluate`, {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
body: JSON.stringify({
|
|
20
|
+
entity_type: options.entityType,
|
|
21
|
+
fields: options.fields,
|
|
22
|
+
include_entity_data: options.includeEntityData || false,
|
|
23
|
+
entity_inputs: options.entityInputs,
|
|
24
|
+
metaProperties,
|
|
25
|
+
source: 'ts-sdk',
|
|
26
|
+
}),
|
|
27
|
+
headers: {
|
|
28
|
+
Authorization: `Bearer ${apiKey}`,
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
.then(async (response) => {
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
return {
|
|
35
|
+
err: `Openlit Error : HTTP error! Status: ${response.status}`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return response.json();
|
|
39
|
+
})
|
|
40
|
+
.then((resp) => {
|
|
41
|
+
return resp;
|
|
42
|
+
});
|
|
43
|
+
return response;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
console.log(e);
|
|
47
|
+
if (e && typeof e.toString === 'function') {
|
|
48
|
+
return {
|
|
49
|
+
err: `Openlit Error : ${e.toString()}`,
|
|
50
|
+
data: null,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
err: `Openlit Error : ${e}`,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.default = RuleEngine;
|
|
60
|
+
//# sourceMappingURL=rule-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-engine.js","sourceRoot":"","sources":["../../src/features/rule-engine.ts"],"names":[],"mappings":";;;;;AAAA,uDAAsC;AACtC,0CAA0C;AAG1C,MAAqB,UAAU;IAC7B,MAAM,CAAC,KAAK,CAAC,YAAY,CACvB,OAA0B;QAE1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,IAAI,sBAAW,CAAC;QAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QAEnE,MAAM,cAAc,GAAG;YACrB,eAAe,EAAE,gBAAa,CAAC,eAAe;YAC9C,WAAW,EAAE,gBAAa,CAAC,WAAW;SACvC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,GAAG,2BAA2B,EAAE;gBAC9D,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,WAAW,EAAE,OAAO,CAAC,UAAU;oBAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,mBAAmB,EAAE,OAAO,CAAC,iBAAiB,IAAI,KAAK;oBACvD,aAAa,EAAE,OAAO,CAAC,YAAY;oBACnC,cAAc;oBACd,MAAM,EAAE,QAAQ;iBACjB,CAAC;gBACF,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,MAAM,EAAE;oBACjC,cAAc,EAAE,kBAAkB;iBACnC;aACF,CAAC;iBACC,IAAI,CAAC,KAAK,EAAE,QAAa,EAAE,EAAE;gBAC5B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,OAAO;wBACL,GAAG,EAAE,uCAAuC,QAAQ,CAAC,MAAM,EAAE;qBAC9D,CAAC;gBACJ,CAAC;gBACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,IAAS,EAAE,EAAE;gBAClB,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YAEL,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACf,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC1C,OAAO;oBACL,GAAG,EAAE,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACtC,IAAI,EAAE,IAAI;iBACJ,CAAC;YACX,CAAC;YAED,OAAO;gBACL,GAAG,EAAE,mBAAmB,CAAC,EAAE;aAC5B,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAvDD,6BAuDC"}
|
|
@@ -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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"}
|