@arizeai/openinference-instrumentation-openai 0.0.1-rc9 → 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.
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.0.1-rc9";
1
+ export declare const VERSION = "0.0.2";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,cAAc,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -1,3 +1,3 @@
1
1
  // this is an auto-generated file. see js/scripts/version-update.js
2
- export var VERSION = "0.0.1-rc9";
2
+ export var VERSION = "0.0.2";
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,CAAC,IAAM,OAAO,GAAG,WAAW,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,CAAC,IAAM,OAAO,GAAG,OAAO,CAAC"}
@@ -3,7 +3,13 @@ import { InstrumentationBase, InstrumentationConfig, InstrumentationModuleDefini
3
3
  export declare class OpenAIInstrumentation extends InstrumentationBase<typeof openai> {
4
4
  constructor(config?: InstrumentationConfig);
5
5
  protected init(): InstrumentationModuleDefinition<typeof openai>;
6
+ /**
7
+ * Patches the OpenAI module
8
+ */
6
9
  private patch;
10
+ /**
11
+ * Un-patches the OpenAI module's chat completions API
12
+ */
7
13
  private unpatch;
8
14
  }
9
15
  //# sourceMappingURL=instrumentation.d.ts.map
@@ -1 +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;AAmBxC,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,OAAO,CAAC,KAAK;IA2Db,OAAO,CAAC,OAAO;CAGlB"}
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"}
@@ -1,7 +1,18 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
1
12
  import { InstrumentationBase, InstrumentationNodeModuleDefinition, safeExecuteInTheMiddle, } from "@opentelemetry/instrumentation";
2
- import { diag, context, trace, SpanKind, } from "@opentelemetry/api";
13
+ import { diag, context, trace, SpanKind, SpanStatusCode, } from "@opentelemetry/api";
3
14
  import { VERSION } from "./version";
4
- import { SemanticConventions, OpenInferenceSpanKind, } from "@arizeai/openinference-semantic-conventions";
15
+ import { SemanticConventions, OpenInferenceSpanKind, MimeType, } from "@arizeai/openinference-semantic-conventions";
5
16
  const MODULE_NAME = "openai";
6
17
  export class OpenAIInstrumentation extends InstrumentationBase {
7
18
  constructor(config) {
@@ -11,19 +22,23 @@ export class OpenAIInstrumentation extends InstrumentationBase {
11
22
  const module = new InstrumentationNodeModuleDefinition("openai", ["^4.0.0"], this.patch.bind(this), this.unpatch.bind(this));
12
23
  return module;
13
24
  }
25
+ /**
26
+ * Patches the OpenAI module
27
+ */
14
28
  patch(module, moduleVersion) {
15
- console.log(`Applying patch for ${MODULE_NAME}@${moduleVersion}`);
16
- const plugin = this;
29
+ diag.debug(`Applying patch for ${MODULE_NAME}@${moduleVersion}`);
17
30
  if (module === null || module === void 0 ? void 0 : module.openInferencePatched) {
18
31
  return module;
19
32
  }
20
33
  const instrumentation = this;
34
+ // Patch create chat completions
21
35
  this._wrap(module.OpenAI.Chat.Completions.prototype, "create", (original) => {
22
36
  return function patchedCreate(...args) {
23
37
  const body = args[0];
38
+ const { messages } = body, invocationParameters = __rest(body, ["messages"]);
24
39
  const span = instrumentation.tracer.startSpan(`OpenAI Chat Completions`, {
25
40
  kind: SpanKind.CLIENT,
26
- attributes: Object.assign({ [SemanticConventions.OPENINFERENCE_SPAN_KIND]: OpenInferenceSpanKind.LLM }, getLLMInputMessagesAttributes(body)),
41
+ attributes: Object.assign({ [SemanticConventions.OPENINFERENCE_SPAN_KIND]: OpenInferenceSpanKind.LLM, [SemanticConventions.LLM_MODEL_NAME]: body.model, [SemanticConventions.INPUT_VALUE]: JSON.stringify(body), [SemanticConventions.INPUT_MIME_TYPE]: MimeType.JSON, [SemanticConventions.LLM_INVOCATION_PARAMETERS]: JSON.stringify(invocationParameters) }, getLLMInputMessagesAttributes(body)),
27
42
  });
28
43
  const execContext = trace.setSpan(context.active(), span);
29
44
  const execPromise = safeExecuteInTheMiddle(() => {
@@ -31,10 +46,17 @@ export class OpenAIInstrumentation extends InstrumentationBase {
31
46
  return original.apply(this, args);
32
47
  });
33
48
  }, (error) => {
34
- // TODO handler the error
49
+ // Push the error to the span
50
+ if (error) {
51
+ span.recordException(error);
52
+ }
35
53
  });
36
54
  const wrappedPromise = execPromise.then((result) => {
37
- // TODO set span attributes
55
+ if (result) {
56
+ // Record the results
57
+ span.setAttributes(Object.assign(Object.assign({ [SemanticConventions.OUTPUT_VALUE]: JSON.stringify(result), [SemanticConventions.OUTPUT_MIME_TYPE]: MimeType.JSON }, getLLMOutputMessagesAttributes(result)), getUsageAttributes(result)));
58
+ }
59
+ span.setStatus({ code: SpanStatusCode.OK });
38
60
  span.end();
39
61
  return result;
40
62
  });
@@ -44,12 +66,16 @@ export class OpenAIInstrumentation extends InstrumentationBase {
44
66
  module.openInferencePatched = true;
45
67
  return module;
46
68
  }
69
+ /**
70
+ * Un-patches the OpenAI module's chat completions API
71
+ */
47
72
  unpatch(moduleExports, moduleVersion) {
48
73
  diag.debug(`Removing patch for ${MODULE_NAME}@${moduleVersion}`);
74
+ this._unwrap(moduleExports.OpenAI.Chat.Completions.prototype, "create");
49
75
  }
50
76
  }
51
77
  /**
52
- * Converts the body input
78
+ * Converts the body of the request to LLM input messages
53
79
  */
54
80
  function getLLMInputMessagesAttributes(body) {
55
81
  return body.messages.reduce((acc, message, index) => {
@@ -59,4 +85,43 @@ function getLLMInputMessagesAttributes(body) {
59
85
  return acc;
60
86
  }, {});
61
87
  }
88
+ /**
89
+ * Get Usage attributes
90
+ */
91
+ function getUsageAttributes(response) {
92
+ if (response.hasOwnProperty("usage")) {
93
+ const completion = response;
94
+ if (completion.usage) {
95
+ return {
96
+ [SemanticConventions.LLM_TOKEN_COUNT_COMPLETION]: completion.usage.completion_tokens,
97
+ [SemanticConventions.LLM_TOKEN_COUNT_PROMPT]: completion.usage.prompt_tokens,
98
+ [SemanticConventions.LLM_TOKEN_COUNT_TOTAL]: completion.usage.total_tokens,
99
+ };
100
+ }
101
+ }
102
+ return {};
103
+ }
104
+ /**
105
+ * Converts the result to LLM output attributes
106
+ */
107
+ function getLLMOutputMessagesAttributes(response) {
108
+ // Handle chat completion
109
+ if (response.hasOwnProperty("choices")) {
110
+ const completion = response;
111
+ // Right now support just the first choice
112
+ const choice = completion.choices[0];
113
+ if (!choice) {
114
+ return {};
115
+ }
116
+ return [choice.message].reduce((acc, message, index) => {
117
+ const index_prefix = `${SemanticConventions.LLM_OUTPUT_MESSAGES}.${index}`;
118
+ acc[`${index_prefix}.${SemanticConventions.MESSAGE_CONTENT}`] =
119
+ String(message.content);
120
+ acc[`${index_prefix}.${SemanticConventions.MESSAGE_ROLE}`] =
121
+ message.role;
122
+ return acc;
123
+ }, {});
124
+ }
125
+ return {};
126
+ }
62
127
  //# sourceMappingURL=instrumentation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../src/instrumentation.ts"],"names":[],"mappings":"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"}