@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.
Files changed (47) hide show
  1. package/README.md +30 -1
  2. package/dist/esm/index.d.ts +2 -0
  3. package/dist/esm/index.d.ts.map +1 -0
  4. package/dist/esm/index.js +2 -0
  5. package/dist/esm/index.js.map +1 -0
  6. package/dist/esm/instrumentation.d.ts +15 -0
  7. package/dist/esm/instrumentation.d.ts.map +1 -0
  8. package/dist/esm/instrumentation.js +164 -0
  9. package/dist/esm/instrumentation.js.map +1 -0
  10. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  11. package/dist/esm/version.d.ts +2 -0
  12. package/dist/esm/version.d.ts.map +1 -0
  13. package/dist/esm/version.js +3 -0
  14. package/dist/esm/version.js.map +1 -0
  15. package/dist/esnext/index.d.ts +2 -0
  16. package/dist/esnext/index.d.ts.map +1 -0
  17. package/dist/esnext/index.js +2 -0
  18. package/dist/esnext/index.js.map +1 -0
  19. package/dist/esnext/instrumentation.d.ts +15 -0
  20. package/dist/esnext/instrumentation.d.ts.map +1 -0
  21. package/dist/esnext/instrumentation.js +127 -0
  22. package/dist/esnext/instrumentation.js.map +1 -0
  23. package/dist/esnext/tsconfig.esnext.tsbuildinfo +1 -1
  24. package/dist/esnext/version.d.ts +2 -0
  25. package/dist/esnext/version.d.ts.map +1 -0
  26. package/dist/esnext/version.js +3 -0
  27. package/dist/esnext/version.js.map +1 -0
  28. package/dist/src/index.d.ts +2 -0
  29. package/dist/src/index.d.ts.map +1 -0
  30. package/dist/src/index.js +18 -0
  31. package/dist/src/index.js.map +1 -0
  32. package/dist/src/instrumentation.d.ts +15 -0
  33. package/dist/src/instrumentation.d.ts.map +1 -0
  34. package/dist/src/instrumentation.js +131 -0
  35. package/dist/src/instrumentation.js.map +1 -0
  36. package/dist/src/version.d.ts +2 -0
  37. package/dist/src/version.d.ts.map +1 -0
  38. package/dist/src/version.js +6 -0
  39. package/dist/src/version.js.map +1 -0
  40. package/dist/test/openai.test.d.ts +2 -0
  41. package/dist/test/openai.test.d.ts.map +1 -0
  42. package/dist/test/openai.test.js +130 -0
  43. package/dist/test/openai.test.js.map +1 -0
  44. package/dist/tsconfig.tsbuildinfo +1 -1
  45. package/package.json +2 -2
  46. package/src/instrumentation.ts +92 -8
  47. package/src/version.ts +1 -1
@@ -0,0 +1,2 @@
1
+ export declare const VERSION = "0.0.2";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ // this is an auto-generated file. see js/scripts/version-update.js
2
+ export const VERSION = "0.0.2";
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./instrumentation";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./instrumentation"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC"}
@@ -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,131 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.OpenAIInstrumentation = void 0;
15
+ const instrumentation_1 = require("@opentelemetry/instrumentation");
16
+ const api_1 = require("@opentelemetry/api");
17
+ const version_1 = require("./version");
18
+ const openinference_semantic_conventions_1 = require("@arizeai/openinference-semantic-conventions");
19
+ const MODULE_NAME = "openai";
20
+ class OpenAIInstrumentation extends instrumentation_1.InstrumentationBase {
21
+ constructor(config) {
22
+ super("@arizeai/openinference-instrumentation-openai", version_1.VERSION, Object.assign({}, config));
23
+ }
24
+ init() {
25
+ const module = new instrumentation_1.InstrumentationNodeModuleDefinition("openai", ["^4.0.0"], this.patch.bind(this), this.unpatch.bind(this));
26
+ return module;
27
+ }
28
+ /**
29
+ * Patches the OpenAI module
30
+ */
31
+ patch(module, moduleVersion) {
32
+ api_1.diag.debug(`Applying patch for ${MODULE_NAME}@${moduleVersion}`);
33
+ if (module === null || module === void 0 ? void 0 : module.openInferencePatched) {
34
+ return module;
35
+ }
36
+ const instrumentation = this;
37
+ // Patch create chat completions
38
+ this._wrap(module.OpenAI.Chat.Completions.prototype, "create", (original) => {
39
+ return function patchedCreate(...args) {
40
+ const body = args[0];
41
+ const { messages } = body, invocationParameters = __rest(body, ["messages"]);
42
+ const span = instrumentation.tracer.startSpan(`OpenAI Chat Completions`, {
43
+ kind: api_1.SpanKind.CLIENT,
44
+ attributes: Object.assign({ [openinference_semantic_conventions_1.SemanticConventions.OPENINFERENCE_SPAN_KIND]: openinference_semantic_conventions_1.OpenInferenceSpanKind.LLM, [openinference_semantic_conventions_1.SemanticConventions.LLM_MODEL_NAME]: body.model, [openinference_semantic_conventions_1.SemanticConventions.INPUT_VALUE]: JSON.stringify(body), [openinference_semantic_conventions_1.SemanticConventions.INPUT_MIME_TYPE]: openinference_semantic_conventions_1.MimeType.JSON, [openinference_semantic_conventions_1.SemanticConventions.LLM_INVOCATION_PARAMETERS]: JSON.stringify(invocationParameters) }, getLLMInputMessagesAttributes(body)),
45
+ });
46
+ const execContext = api_1.trace.setSpan(api_1.context.active(), span);
47
+ const execPromise = (0, instrumentation_1.safeExecuteInTheMiddle)(() => {
48
+ return api_1.context.with(execContext, () => {
49
+ return original.apply(this, args);
50
+ });
51
+ }, (error) => {
52
+ // Push the error to the span
53
+ if (error) {
54
+ span.recordException(error);
55
+ }
56
+ });
57
+ const wrappedPromise = execPromise.then((result) => {
58
+ if (result) {
59
+ // Record the results
60
+ span.setAttributes(Object.assign(Object.assign({ [openinference_semantic_conventions_1.SemanticConventions.OUTPUT_VALUE]: JSON.stringify(result), [openinference_semantic_conventions_1.SemanticConventions.OUTPUT_MIME_TYPE]: openinference_semantic_conventions_1.MimeType.JSON }, getLLMOutputMessagesAttributes(result)), getUsageAttributes(result)));
61
+ }
62
+ span.setStatus({ code: api_1.SpanStatusCode.OK });
63
+ span.end();
64
+ return result;
65
+ });
66
+ return api_1.context.bind(execContext, wrappedPromise);
67
+ };
68
+ });
69
+ module.openInferencePatched = true;
70
+ return module;
71
+ }
72
+ /**
73
+ * Un-patches the OpenAI module's chat completions API
74
+ */
75
+ unpatch(moduleExports, moduleVersion) {
76
+ api_1.diag.debug(`Removing patch for ${MODULE_NAME}@${moduleVersion}`);
77
+ this._unwrap(moduleExports.OpenAI.Chat.Completions.prototype, "create");
78
+ }
79
+ }
80
+ exports.OpenAIInstrumentation = OpenAIInstrumentation;
81
+ /**
82
+ * Converts the body of the request to LLM input messages
83
+ */
84
+ function getLLMInputMessagesAttributes(body) {
85
+ return body.messages.reduce((acc, message, index) => {
86
+ const index_prefix = `${openinference_semantic_conventions_1.SemanticConventions.LLM_INPUT_MESSAGES}.${index}`;
87
+ acc[`${index_prefix}.${openinference_semantic_conventions_1.SemanticConventions.MESSAGE_CONTENT}`] = String(message.content);
88
+ acc[`${index_prefix}.${openinference_semantic_conventions_1.SemanticConventions.MESSAGE_ROLE}`] = String(message.role);
89
+ return acc;
90
+ }, {});
91
+ }
92
+ /**
93
+ * Get Usage attributes
94
+ */
95
+ function getUsageAttributes(response) {
96
+ if (response.hasOwnProperty("usage")) {
97
+ const completion = response;
98
+ if (completion.usage) {
99
+ return {
100
+ [openinference_semantic_conventions_1.SemanticConventions.LLM_TOKEN_COUNT_COMPLETION]: completion.usage.completion_tokens,
101
+ [openinference_semantic_conventions_1.SemanticConventions.LLM_TOKEN_COUNT_PROMPT]: completion.usage.prompt_tokens,
102
+ [openinference_semantic_conventions_1.SemanticConventions.LLM_TOKEN_COUNT_TOTAL]: completion.usage.total_tokens,
103
+ };
104
+ }
105
+ }
106
+ return {};
107
+ }
108
+ /**
109
+ * Converts the result to LLM output attributes
110
+ */
111
+ function getLLMOutputMessagesAttributes(response) {
112
+ // Handle chat completion
113
+ if (response.hasOwnProperty("choices")) {
114
+ const completion = response;
115
+ // Right now support just the first choice
116
+ const choice = completion.choices[0];
117
+ if (!choice) {
118
+ return {};
119
+ }
120
+ return [choice.message].reduce((acc, message, index) => {
121
+ const index_prefix = `${openinference_semantic_conventions_1.SemanticConventions.LLM_OUTPUT_MESSAGES}.${index}`;
122
+ acc[`${index_prefix}.${openinference_semantic_conventions_1.SemanticConventions.MESSAGE_CONTENT}`] =
123
+ String(message.content);
124
+ acc[`${index_prefix}.${openinference_semantic_conventions_1.SemanticConventions.MESSAGE_ROLE}`] =
125
+ message.role;
126
+ return acc;
127
+ }, {});
128
+ }
129
+ return {};
130
+ }
131
+ //# sourceMappingURL=instrumentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION = "0.0.2";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERSION = void 0;
4
+ // this is an auto-generated file. see js/scripts/version-update.js
5
+ exports.VERSION = "0.0.2";
6
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAA,mEAAmE;AACtD,QAAA,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=openai.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.test.d.ts","sourceRoot":"","sources":["../../test/openai.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ const src_1 = require("../src");
36
+ const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
37
+ const sdk_trace_node_1 = require("@opentelemetry/sdk-trace-node");
38
+ const resources_1 = require("@opentelemetry/resources");
39
+ const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
40
+ const tracerProvider = new sdk_trace_node_1.NodeTracerProvider();
41
+ tracerProvider.register();
42
+ const memoryExporter = new sdk_trace_base_1.InMemorySpanExporter();
43
+ const tracer = tracerProvider.getTracer("default");
44
+ const resource = new resources_1.Resource({
45
+ [semantic_conventions_1.SemanticResourceAttributes.SERVICE_NAME]: "test-instrumentation-openai",
46
+ });
47
+ const instrumentation = new src_1.OpenAIInstrumentation();
48
+ instrumentation.disable();
49
+ const OpenAI = __importStar(require("openai"));
50
+ describe("OpenAIInstrumentation", () => {
51
+ let openai;
52
+ const memoryExporter = new sdk_trace_base_1.InMemorySpanExporter();
53
+ const provider = new sdk_trace_node_1.NodeTracerProvider();
54
+ const tracer = provider.getTracer("default");
55
+ instrumentation.setTracerProvider(tracerProvider);
56
+ tracerProvider.addSpanProcessor(new sdk_trace_base_1.SimpleSpanProcessor(memoryExporter));
57
+ beforeEach(() => {
58
+ // @ts-expect-error the moduleExports property is private. This is needed to make the test work with auto-mocking
59
+ instrumentation._modules[0].moduleExports = OpenAI;
60
+ instrumentation.enable();
61
+ openai = new OpenAI.OpenAI({
62
+ apiKey: `fake-api-key`,
63
+ });
64
+ memoryExporter.reset();
65
+ });
66
+ afterEach(() => {
67
+ instrumentation.disable();
68
+ jest.clearAllMocks();
69
+ });
70
+ it("is patched", () => {
71
+ expect(OpenAI.openInferencePatched).toBe(true);
72
+ });
73
+ it("creates a span for chat completions", () => __awaiter(void 0, void 0, void 0, function* () {
74
+ const response = {
75
+ id: "chatcmpl-8adq9JloOzNZ9TyuzrKyLpGXexh6p",
76
+ object: "chat.completion",
77
+ created: 1703743645,
78
+ model: "gpt-3.5-turbo-0613",
79
+ choices: [
80
+ {
81
+ index: 0,
82
+ message: {
83
+ role: "assistant",
84
+ content: "This is a test.",
85
+ },
86
+ logprobs: null,
87
+ finish_reason: "stop",
88
+ },
89
+ ],
90
+ usage: {
91
+ prompt_tokens: 12,
92
+ completion_tokens: 5,
93
+ total_tokens: 17,
94
+ },
95
+ };
96
+ // Mock out the chat completions endpoint
97
+ jest.spyOn(openai, "post").mockImplementation(
98
+ // @ts-expect-error
99
+ () => __awaiter(void 0, void 0, void 0, function* () {
100
+ return response;
101
+ }));
102
+ const chatCompletion = yield openai.chat.completions.create({
103
+ messages: [{ role: "user", content: "Say this is a test" }],
104
+ model: "gpt-3.5-turbo",
105
+ });
106
+ const spans = memoryExporter.getFinishedSpans();
107
+ expect(spans.length).toBe(1);
108
+ const span = spans[0];
109
+ expect(span.name).toBe("OpenAI Chat Completions");
110
+ expect(span.attributes).toMatchInlineSnapshot(`
111
+ {
112
+ "input.mime_type": "application/json",
113
+ "input.value": "{"messages":[{"role":"user","content":"Say this is a test"}],"model":"gpt-3.5-turbo"}",
114
+ "llm.input_messages.0.message.content": "Say this is a test",
115
+ "llm.input_messages.0.message.role": "user",
116
+ "llm.invocation_parameters": "{"model":"gpt-3.5-turbo"}",
117
+ "llm.model_name": "gpt-3.5-turbo",
118
+ "llm.output_messages.0.message.content": "This is a test.",
119
+ "llm.output_messages.0.message.role": "assistant",
120
+ "llm.token_count.completion": 5,
121
+ "llm.token_count.prompt": 12,
122
+ "llm.token_count.total": 17,
123
+ "openinference.span.kind": "llm",
124
+ "output.mime_type": "application/json",
125
+ "output.value": "{"id":"chatcmpl-8adq9JloOzNZ9TyuzrKyLpGXexh6p","object":"chat.completion","created":1703743645,"model":"gpt-3.5-turbo-0613","choices":[{"index":0,"message":{"role":"assistant","content":"This is a test."},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":12,"completion_tokens":5,"total_tokens":17}}",
126
+ }
127
+ `);
128
+ }));
129
+ });
130
+ //# sourceMappingURL=openai.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.test.js","sourceRoot":"","sources":["../../test/openai.test.ts"],"names":[],"mappings":"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"}