openlit 1.10.0 → 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 CHANGED
@@ -234,6 +234,40 @@ Below are the parameters for use with the SDK for OpenLIT Vault for secret manag
234
234
 
235
235
 
236
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
+
237
271
  ## 🌱 Contributing
238
272
 
239
273
  Whether it's big or small, we love contributions 💚. Check out our [Contribution guide](../../CONTRIBUTING.md) to get started
@@ -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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"}
@@ -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
  }
@@ -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;kBAFlB,WAAW"}
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,6 @@
1
+ import { RuleEngineOptions, RuleEngineResult } from '../types';
2
+ export default class RuleEngine {
3
+ static evaluateRule(options: RuleEngineOptions): Promise<RuleEngineResult | {
4
+ err: string;
5
+ }>;
6
+ }
@@ -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"}
package/dist/types.d.ts CHANGED
@@ -63,3 +63,19 @@ export interface VaultOptions extends BaseOpenlitOptions {
63
63
  tags?: string[];
64
64
  shouldSetEnv?: boolean;
65
65
  }
66
+ export type RuleEntityType = 'context' | 'prompt' | 'evaluation';
67
+ export interface RuleEngineOptions extends BaseOpenlitOptions {
68
+ entityType: RuleEntityType;
69
+ fields: Record<string, string | number | boolean>;
70
+ includeEntityData?: boolean;
71
+ entityInputs?: Record<string, any>;
72
+ }
73
+ export interface RuleEngineResult {
74
+ matchingRuleIds: string[];
75
+ entities: Array<{
76
+ rule_id: string;
77
+ entity_type: string;
78
+ entity_id: string;
79
+ }>;
80
+ entity_data?: Record<string, any>;
81
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openlit",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "homepage": "https://github.com/openlit/openlit#readme",
5
5
  "bugs": {
6
6
  "url": "https://github.com/openlit/openlit/issues",