@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
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
|
@@ -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 @@
|
|
|
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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"}
|