@arizeai/openinference-instrumentation-openai 0.0.1-rc8 → 0.0.2
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 +30 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/instrumentation.d.ts +15 -0
- package/dist/esm/instrumentation.d.ts.map +1 -0
- package/dist/esm/instrumentation.js +164 -0
- package/dist/esm/instrumentation.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/version.d.ts +2 -0
- package/dist/esm/version.d.ts.map +1 -0
- package/dist/esm/version.js +3 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/esnext/index.d.ts +2 -0
- package/dist/esnext/index.d.ts.map +1 -0
- package/dist/esnext/index.js +2 -0
- package/dist/esnext/index.js.map +1 -0
- package/dist/esnext/instrumentation.d.ts +15 -0
- package/dist/esnext/instrumentation.d.ts.map +1 -0
- package/dist/esnext/instrumentation.js +127 -0
- package/dist/esnext/instrumentation.js.map +1 -0
- package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -1
- package/dist/esnext/version.d.ts +2 -0
- package/dist/esnext/version.d.ts.map +1 -0
- package/dist/esnext/version.js +3 -0
- package/dist/esnext/version.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +18 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/instrumentation.d.ts +15 -0
- package/dist/src/instrumentation.d.ts.map +1 -0
- package/dist/src/instrumentation.js +131 -0
- package/dist/src/instrumentation.js.map +1 -0
- package/dist/src/version.d.ts +2 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/src/version.js +6 -0
- package/dist/src/version.js.map +1 -0
- package/dist/test/openai.test.d.ts +2 -0
- package/dist/test/openai.test.d.ts.map +1 -0
- package/dist/test/openai.test.js +130 -0
- package/dist/test/openai.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/instrumentation.ts +92 -8
- package/src/version.ts +1 -1
package/README.md
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
1
|
# OpenInference Instrumentation for OpenAI Node.js SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://badge.fury.io/js/@arizeai%2Fopeninference-instrumentation-openai)
|
|
4
|
+
|
|
5
|
+
This module provides automatic instrumentation for the [OpenAI Node.js SDK](https://github.com/openai/openai-node). which may be used in conjunction with [@opentelemetry/sdk-trace-node](https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-sdk-trace-node).
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```shell
|
|
10
|
+
npm install --save @arizeai/openinference-instrumentation-openai
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
To load the OpenAI instrumentation, specify it in the registerInstrumentations call along with any additional instrumentation you wish to enable.
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
|
|
19
|
+
const {
|
|
20
|
+
OpenAIInstrumentation,
|
|
21
|
+
} = require("@arizeai/openinference-instrumentation-openai");
|
|
22
|
+
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
|
|
23
|
+
|
|
24
|
+
const provider = new NodeTracerProvider();
|
|
25
|
+
provider.register();
|
|
26
|
+
|
|
27
|
+
registerInstrumentations({
|
|
28
|
+
instrumentations: [new OpenAIInstrumentation()],
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
For more information on OpenTelemetry Node.js SDK, see the [OpenTelemetry Node.js SDK documentation](https://opentelemetry.io/docs/instrumentation/js/getting-started/nodejs/).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as openai from "openai";
|
|
2
|
+
import { InstrumentationBase, InstrumentationConfig, InstrumentationModuleDefinition } from "@opentelemetry/instrumentation";
|
|
3
|
+
export declare class OpenAIInstrumentation extends InstrumentationBase<typeof openai> {
|
|
4
|
+
constructor(config?: InstrumentationConfig);
|
|
5
|
+
protected init(): InstrumentationModuleDefinition<typeof openai>;
|
|
6
|
+
/**
|
|
7
|
+
* Patches the OpenAI module
|
|
8
|
+
*/
|
|
9
|
+
private patch;
|
|
10
|
+
/**
|
|
11
|
+
* Un-patches the OpenAI module's chat completions API
|
|
12
|
+
*/
|
|
13
|
+
private unpatch;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=instrumentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EACH,mBAAmB,EACnB,qBAAqB,EACrB,+BAA+B,EAGlC,MAAM,gCAAgC,CAAC;AAwBxC,qBAAa,qBAAsB,SAAQ,mBAAmB,CAAC,OAAO,MAAM,CAAC;gBAC7D,MAAM,CAAC,EAAE,qBAAqB;IAQ1C,SAAS,CAAC,IAAI,IAAI,+BAA+B,CAAC,OAAO,MAAM,CAAC;IAShE;;OAEG;IACH,OAAO,CAAC,KAAK;IAmFb;;OAEG;IACH,OAAO,CAAC,OAAO;CAIlB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
var __extends = (this && this.__extends) || (function () {
|
|
2
|
+
var extendStatics = function (d, b) {
|
|
3
|
+
extendStatics = Object.setPrototypeOf ||
|
|
4
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
+
return extendStatics(d, b);
|
|
7
|
+
};
|
|
8
|
+
return function (d, b) {
|
|
9
|
+
if (typeof b !== "function" && b !== null)
|
|
10
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
+
extendStatics(d, b);
|
|
12
|
+
function __() { this.constructor = d; }
|
|
13
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
+
};
|
|
15
|
+
})();
|
|
16
|
+
var __assign = (this && this.__assign) || function () {
|
|
17
|
+
__assign = Object.assign || function(t) {
|
|
18
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
19
|
+
s = arguments[i];
|
|
20
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
21
|
+
t[p] = s[p];
|
|
22
|
+
}
|
|
23
|
+
return t;
|
|
24
|
+
};
|
|
25
|
+
return __assign.apply(this, arguments);
|
|
26
|
+
};
|
|
27
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
28
|
+
var t = {};
|
|
29
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
30
|
+
t[p] = s[p];
|
|
31
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
32
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
33
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
34
|
+
t[p[i]] = s[p[i]];
|
|
35
|
+
}
|
|
36
|
+
return t;
|
|
37
|
+
};
|
|
38
|
+
import { InstrumentationBase, InstrumentationNodeModuleDefinition, safeExecuteInTheMiddle, } from "@opentelemetry/instrumentation";
|
|
39
|
+
import { diag, context, trace, SpanKind, SpanStatusCode, } from "@opentelemetry/api";
|
|
40
|
+
import { VERSION } from "./version";
|
|
41
|
+
import { SemanticConventions, OpenInferenceSpanKind, MimeType, } from "@arizeai/openinference-semantic-conventions";
|
|
42
|
+
var MODULE_NAME = "openai";
|
|
43
|
+
var OpenAIInstrumentation = /** @class */ (function (_super) {
|
|
44
|
+
__extends(OpenAIInstrumentation, _super);
|
|
45
|
+
function OpenAIInstrumentation(config) {
|
|
46
|
+
return _super.call(this, "@arizeai/openinference-instrumentation-openai", VERSION, Object.assign({}, config)) || this;
|
|
47
|
+
}
|
|
48
|
+
OpenAIInstrumentation.prototype.init = function () {
|
|
49
|
+
var module = new InstrumentationNodeModuleDefinition("openai", ["^4.0.0"], this.patch.bind(this), this.unpatch.bind(this));
|
|
50
|
+
return module;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Patches the OpenAI module
|
|
54
|
+
*/
|
|
55
|
+
OpenAIInstrumentation.prototype.patch = function (module, moduleVersion) {
|
|
56
|
+
diag.debug("Applying patch for ".concat(MODULE_NAME, "@").concat(moduleVersion));
|
|
57
|
+
if (module === null || module === void 0 ? void 0 : module.openInferencePatched) {
|
|
58
|
+
return module;
|
|
59
|
+
}
|
|
60
|
+
var instrumentation = this;
|
|
61
|
+
// Patch create chat completions
|
|
62
|
+
this._wrap(module.OpenAI.Chat.Completions.prototype, "create", function (original) {
|
|
63
|
+
return function patchedCreate() {
|
|
64
|
+
var _a;
|
|
65
|
+
var _this = this;
|
|
66
|
+
var args = [];
|
|
67
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
68
|
+
args[_i] = arguments[_i];
|
|
69
|
+
}
|
|
70
|
+
var body = args[0];
|
|
71
|
+
var messages = body.messages, invocationParameters = __rest(body, ["messages"]);
|
|
72
|
+
var span = instrumentation.tracer.startSpan("OpenAI Chat Completions", {
|
|
73
|
+
kind: SpanKind.CLIENT,
|
|
74
|
+
attributes: __assign((_a = {}, _a[SemanticConventions.OPENINFERENCE_SPAN_KIND] = OpenInferenceSpanKind.LLM, _a[SemanticConventions.LLM_MODEL_NAME] = body.model, _a[SemanticConventions.INPUT_VALUE] = JSON.stringify(body), _a[SemanticConventions.INPUT_MIME_TYPE] = MimeType.JSON, _a[SemanticConventions.LLM_INVOCATION_PARAMETERS] = JSON.stringify(invocationParameters), _a), getLLMInputMessagesAttributes(body)),
|
|
75
|
+
});
|
|
76
|
+
var execContext = trace.setSpan(context.active(), span);
|
|
77
|
+
var execPromise = safeExecuteInTheMiddle(function () {
|
|
78
|
+
return context.with(execContext, function () {
|
|
79
|
+
return original.apply(_this, args);
|
|
80
|
+
});
|
|
81
|
+
}, function (error) {
|
|
82
|
+
// Push the error to the span
|
|
83
|
+
if (error) {
|
|
84
|
+
span.recordException(error);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
var wrappedPromise = execPromise.then(function (result) {
|
|
88
|
+
var _a;
|
|
89
|
+
if (result) {
|
|
90
|
+
// Record the results
|
|
91
|
+
span.setAttributes(__assign(__assign((_a = {}, _a[SemanticConventions.OUTPUT_VALUE] = JSON.stringify(result), _a[SemanticConventions.OUTPUT_MIME_TYPE] = MimeType.JSON, _a), getLLMOutputMessagesAttributes(result)), getUsageAttributes(result)));
|
|
92
|
+
}
|
|
93
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
94
|
+
span.end();
|
|
95
|
+
return result;
|
|
96
|
+
});
|
|
97
|
+
return context.bind(execContext, wrappedPromise);
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
module.openInferencePatched = true;
|
|
101
|
+
return module;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Un-patches the OpenAI module's chat completions API
|
|
105
|
+
*/
|
|
106
|
+
OpenAIInstrumentation.prototype.unpatch = function (moduleExports, moduleVersion) {
|
|
107
|
+
diag.debug("Removing patch for ".concat(MODULE_NAME, "@").concat(moduleVersion));
|
|
108
|
+
this._unwrap(moduleExports.OpenAI.Chat.Completions.prototype, "create");
|
|
109
|
+
};
|
|
110
|
+
return OpenAIInstrumentation;
|
|
111
|
+
}(InstrumentationBase));
|
|
112
|
+
export { OpenAIInstrumentation };
|
|
113
|
+
/**
|
|
114
|
+
* Converts the body of the request to LLM input messages
|
|
115
|
+
*/
|
|
116
|
+
function getLLMInputMessagesAttributes(body) {
|
|
117
|
+
return body.messages.reduce(function (acc, message, index) {
|
|
118
|
+
var index_prefix = "".concat(SemanticConventions.LLM_INPUT_MESSAGES, ".").concat(index);
|
|
119
|
+
acc["".concat(index_prefix, ".").concat(SemanticConventions.MESSAGE_CONTENT)] = String(message.content);
|
|
120
|
+
acc["".concat(index_prefix, ".").concat(SemanticConventions.MESSAGE_ROLE)] = String(message.role);
|
|
121
|
+
return acc;
|
|
122
|
+
}, {});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get Usage attributes
|
|
126
|
+
*/
|
|
127
|
+
function getUsageAttributes(response) {
|
|
128
|
+
var _a;
|
|
129
|
+
if (response.hasOwnProperty("usage")) {
|
|
130
|
+
var completion = response;
|
|
131
|
+
if (completion.usage) {
|
|
132
|
+
return _a = {},
|
|
133
|
+
_a[SemanticConventions.LLM_TOKEN_COUNT_COMPLETION] = completion.usage.completion_tokens,
|
|
134
|
+
_a[SemanticConventions.LLM_TOKEN_COUNT_PROMPT] = completion.usage.prompt_tokens,
|
|
135
|
+
_a[SemanticConventions.LLM_TOKEN_COUNT_TOTAL] = completion.usage.total_tokens,
|
|
136
|
+
_a;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return {};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Converts the result to LLM output attributes
|
|
143
|
+
*/
|
|
144
|
+
function getLLMOutputMessagesAttributes(response) {
|
|
145
|
+
// Handle chat completion
|
|
146
|
+
if (response.hasOwnProperty("choices")) {
|
|
147
|
+
var completion = response;
|
|
148
|
+
// Right now support just the first choice
|
|
149
|
+
var choice = completion.choices[0];
|
|
150
|
+
if (!choice) {
|
|
151
|
+
return {};
|
|
152
|
+
}
|
|
153
|
+
return [choice.message].reduce(function (acc, message, index) {
|
|
154
|
+
var index_prefix = "".concat(SemanticConventions.LLM_OUTPUT_MESSAGES, ".").concat(index);
|
|
155
|
+
acc["".concat(index_prefix, ".").concat(SemanticConventions.MESSAGE_CONTENT)] =
|
|
156
|
+
String(message.content);
|
|
157
|
+
acc["".concat(index_prefix, ".").concat(SemanticConventions.MESSAGE_ROLE)] =
|
|
158
|
+
message.role;
|
|
159
|
+
return acc;
|
|
160
|
+
}, {});
|
|
161
|
+
}
|
|
162
|
+
return {};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=instrumentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"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"}
|