From 5657c13f6e47f9d8d32ca08e1688ce268e167437 Mon Sep 17 00:00:00 2001 From: Mikyo King Date: Fri, 24 Oct 2025 10:27:01 -0600 Subject: [PATCH 1/6] feat(openai): openai 6 support more discriminated unions bail out of type checks move comment down lock --- js/.changeset/clear-lemons-call.md | 5 + .../README.md | 1 + .../package.json | 2 +- .../src/instrumentation.ts | 10 +- .../src/responsesAttributes.ts | 10 +- .../test/openai.responses.test.ts | 2 + .../test/openai.test.ts | 2 + js/pnpm-lock.yaml | 94 ++++++++----------- 8 files changed, 62 insertions(+), 64 deletions(-) create mode 100644 js/.changeset/clear-lemons-call.md diff --git a/js/.changeset/clear-lemons-call.md b/js/.changeset/clear-lemons-call.md new file mode 100644 index 0000000000..9669f3b75b --- /dev/null +++ b/js/.changeset/clear-lemons-call.md @@ -0,0 +1,5 @@ +--- +"@arizeai/openinference-instrumentation-openai": major +--- + +support for openai@6 with discriminated unions for tool types diff --git a/js/packages/openinference-instrumentation-openai/README.md b/js/packages/openinference-instrumentation-openai/README.md index 6b23b848b8..dd49411364 100644 --- a/js/packages/openinference-instrumentation-openai/README.md +++ b/js/packages/openinference-instrumentation-openai/README.md @@ -85,5 +85,6 @@ openaiInstrumentation.setTracerProvider(customTracerProvider); | OpenAI Version | OpenInference Instrumentation Version | | -------------- | ------------------------------------- | +| ^6.0.0 | ^4.0.0 | | ^5.0.0 | ^3.0.0 | | ^4.0.0 | ^2.0.0 | diff --git a/js/packages/openinference-instrumentation-openai/package.json b/js/packages/openinference-instrumentation-openai/package.json index 77d8824b2a..8da90b6fea 100644 --- a/js/packages/openinference-instrumentation-openai/package.json +++ b/js/packages/openinference-instrumentation-openai/package.json @@ -45,8 +45,8 @@ "@opentelemetry/sdk-trace-base": "^1.25.1", "@opentelemetry/sdk-trace-node": "^1.25.1", "@opentelemetry/semantic-conventions": "^1.25.1", + "openai": "^6.7.0", "vitest": "^2.1.8", - "openai": "^5.7.0", "zod": "^3.24.3", "typescript": "^5.5.4" } diff --git a/js/packages/openinference-instrumentation-openai/src/instrumentation.ts b/js/packages/openinference-instrumentation-openai/src/instrumentation.ts index 9e45774c62..e48a5fb0f1 100644 --- a/js/packages/openinference-instrumentation-openai/src/instrumentation.ts +++ b/js/packages/openinference-instrumentation-openai/src/instrumentation.ts @@ -208,7 +208,7 @@ export class OpenAIInstrumentation extends InstrumentationBase { protected init(): InstrumentationModuleDefinition { const module = new InstrumentationNodeModuleDefinition( "openai", - ["^5.0.0"], + ["^6.0.0"], this.patch.bind(this), this.unpatch.bind(this), ); @@ -754,6 +754,9 @@ function getChatCompletionInputMessageAttributes( attributes[ `${toolCallIndexPrefix}${SemanticConventions.TOOL_CALL_FUNCTION_ARGUMENTS_JSON}` ] = toolCall.function.arguments; + } else { + // TODO: add exhaustive checks + diag.warn(`Unsupported tool type: ${toolCall.type}`); } }); } @@ -874,8 +877,6 @@ function getChatCompletionOutputMessageAttributes( `${toolCallIndexPrefix}${SemanticConventions.TOOL_CALL_ID}` ] = toolCall.id; } - // Double check that the tool call has a function - // NB: OpenAI only supports tool calls with functions right now but this may change if (toolCall.type === "function") { attributes[ toolCallIndexPrefix + SemanticConventions.TOOL_CALL_FUNCTION_NAME @@ -884,6 +885,9 @@ function getChatCompletionOutputMessageAttributes( toolCallIndexPrefix + SemanticConventions.TOOL_CALL_FUNCTION_ARGUMENTS_JSON ] = toolCall.function.arguments; + } else { + // TODO: switch to exhaustive checks + diag.warn(`Unsupported tool type: ${toolCall.type}`); } }); } diff --git a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts index 889a7412ed..c2a454e2dd 100644 --- a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts +++ b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts @@ -1,6 +1,6 @@ import { SemanticConventions } from "@arizeai/openinference-semantic-conventions"; -import { Attributes } from "@opentelemetry/api"; +import { Attributes, diag } from "@opentelemetry/api"; import { Response as ResponseType, @@ -44,8 +44,12 @@ function getResponseItemAttributes( attributes[`${prefix}${SemanticConventions.MESSAGE_ROLE}`] = "tool"; attributes[`${prefix}${SemanticConventions.MESSAGE_TOOL_CALL_ID}`] = item.call_id; - attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = - item.output; + if (typeof item.output === "string") { + attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = + item.output; + } else { + diag.warn("Failed to serialize non-string typed tool output"); + } break; } case "reasoning": { diff --git a/js/packages/openinference-instrumentation-openai/test/openai.responses.test.ts b/js/packages/openinference-instrumentation-openai/test/openai.responses.test.ts index 241edd3ed7..ced2e58dbc 100644 --- a/js/packages/openinference-instrumentation-openai/test/openai.responses.test.ts +++ b/js/packages/openinference-instrumentation-openai/test/openai.responses.test.ts @@ -665,6 +665,8 @@ describe("OpenAIInstrumentation - Responses", () => { ], model: "gpt-4.1", text: { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - Type instantiation is excessively deep with zod helper format: zodTextFormat(CalendarEvent, "event"), }, }); diff --git a/js/packages/openinference-instrumentation-openai/test/openai.test.ts b/js/packages/openinference-instrumentation-openai/test/openai.test.ts index 83372fdfbd..9865acd546 100644 --- a/js/packages/openinference-instrumentation-openai/test/openai.test.ts +++ b/js/packages/openinference-instrumentation-openai/test/openai.test.ts @@ -1075,6 +1075,8 @@ describe("OpenAIInstrumentation", () => { content: "Alice and Bob are going to a science fair on Friday.", }, ], + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - Type instantiation is excessively deep with zod helper response_format: zodResponseFormat(CalendarEvent, "event"), }); diff --git a/js/pnpm-lock.yaml b/js/pnpm-lock.yaml index 9eea92839f..cdbe260108 100644 --- a/js/pnpm-lock.yaml +++ b/js/pnpm-lock.yaml @@ -335,7 +335,7 @@ importers: version: 7.7.0 beeai-framework: specifier: ^0.1.13 - version: 0.1.19(10842fb8f50b39d31c7f6d103414c3b2) + version: 0.1.18(e5c8a6c42883d94da29ec76d26875379) import-in-the-middle: specifier: ^1.13.0 version: 1.15.0 @@ -509,11 +509,8 @@ importers: specifier: ^1.25.1 version: 1.37.0 openai: - specifier: ^5.7.0 - version: 5.23.2(ws@8.18.3)(zod@3.25.76) - typescript: - specifier: ^5.5.4 - version: 5.9.3 + specifier: ^6.7.0 + version: 6.7.0(ws@8.18.3)(zod@3.25.76) vitest: specifier: ^2.1.8 version: 2.1.9(@types/node@24.9.1) @@ -4918,20 +4915,8 @@ packages: zod: optional: true - openai@5.23.2: - resolution: {integrity: sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - - openai@6.6.0: - resolution: {integrity: sha512-1yWk4cBsHF5Bq9TreHYOHY7pbqdlT74COnm8vPx7WKn36StS+Hyk8DdAitnLaw67a5Cudkz5EmlFQjSrNnrA2w==} + openai@6.7.0: + resolution: {integrity: sha512-mgSQXa3O/UXTbA8qFzoa7aydbXBJR5dbLQXCRapAOtoNT+v69sLdKMZzgiakpqhclRnhPggPAXoniVGn2kMY2A==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -7015,14 +7000,14 @@ snapshots: - encoding - utf-8-validate - '@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.6.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76)': + '@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76)': dependencies: '@anthropic-ai/sdk': 0.27.3 '@browserbasehq/sdk': 2.6.0 '@playwright/test': 1.56.1 deepmerge: 4.3.1 dotenv: 16.6.1 - openai: 6.6.0(ws@8.18.3)(zod@3.25.76) + openai: 6.7.0(ws@8.18.3)(zod@3.25.76) ws: 8.18.3 zod: 3.25.76 zod-to-json-schema: 3.24.6(zod@3.25.76) @@ -7414,11 +7399,11 @@ snapshots: - openai - ws - '@langchain/classic@1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3)': + '@langchain/classic@1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)) - '@langchain/openai': 1.0.0-alpha.3(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) - '@langchain/textsplitters': 1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76))) + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/openai': 1.0.0-alpha.3(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + '@langchain/textsplitters': 1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))) handlebars: 4.7.8 js-yaml: 4.1.0 jsonpointer: 5.0.1 @@ -7428,7 +7413,7 @@ snapshots: yaml: 2.8.1 zod: 3.25.76 optionalDependencies: - langsmith: 0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)) + langsmith: 0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' @@ -7470,19 +7455,19 @@ snapshots: - '@opentelemetry/sdk-trace-base' - peggy - '@langchain/community@1.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-provider-node@3.918.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.6.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@smithy/util-utf8@2.3.0)(duck-duck-scrape@2.2.7)(fast-xml-parser@5.3.0)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.6.0(ws@8.18.3)(zod@3.25.76))(playwright@1.56.1)(ws@8.18.3)': + '@langchain/community@1.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-provider-node@3.916.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@smithy/util-utf8@2.3.0)(duck-duck-scrape@2.2.7)(fast-xml-parser@5.3.0)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(playwright@1.56.1)(ws@8.18.3)': dependencies: - '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.6.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76) + '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76) '@ibm-cloud/watsonx-ai': 1.7.0 - '@langchain/classic': 1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3) - '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)) - '@langchain/openai': 1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + '@langchain/classic': 1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3) + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/openai': 1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) binary-extensions: 2.3.0 expr-eval: 2.0.2 flat: 5.0.2 ibm-cloud-sdk-core: 5.4.3 js-yaml: 4.1.0 - openai: 6.6.0(ws@8.18.3)(zod@3.25.76) + openai: 6.7.0(ws@8.18.3)(zod@3.25.76) uuid: 10.0.0 zod: 3.25.76 optionalDependencies: @@ -7558,14 +7543,14 @@ snapshots: - '@opentelemetry/sdk-trace-base' - openai - '@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76))': + '@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 camelcase: 6.3.0 decamelize: 1.2.0 js-tiktoken: 1.0.14 - langsmith: 0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)) + langsmith: 0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) mustache: 4.2.0 p-queue: 6.6.2 p-retry: 4.6.2 @@ -7627,16 +7612,16 @@ snapshots: dependencies: '@langchain/core': 0.1.63(langchain@0.3.36(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.24.3)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(axios@1.13.0)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.24.3))(ws@8.18.3))(openai@4.104.0(ws@8.18.3)(zod@3.24.3)) js-tiktoken: 1.0.14 - openai: 6.6.0(ws@8.18.3)(zod@3.25.76) + openai: 6.7.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - ws - '@langchain/openai@1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + '@langchain/openai@1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.14 - openai: 6.6.0(ws@8.18.3)(zod@3.25.76) + openai: 6.7.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - ws @@ -7646,16 +7631,16 @@ snapshots: dependencies: '@langchain/core': 0.1.63(langchain@0.3.36(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.24.3)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(axios@1.13.0)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.24.3))(ws@8.18.3))(openai@4.104.0(ws@8.18.3)(zod@3.24.3)) js-tiktoken: 1.0.14 - openai: 6.6.0(ws@8.18.3)(zod@3.25.76) + openai: 6.7.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - ws - '@langchain/openai@1.0.0-alpha.3(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + '@langchain/openai@1.0.0-alpha.3(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.14 - openai: 6.6.0(ws@8.18.3)(zod@3.25.76) + openai: 6.7.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - ws @@ -7673,9 +7658,9 @@ snapshots: '@langchain/core': 0.1.63(langchain@0.3.36(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.24.3)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(axios@1.13.0)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.24.3))(ws@8.18.3))(openai@4.104.0(ws@8.18.3)(zod@3.24.3)) js-tiktoken: 1.0.14 - '@langchain/textsplitters@1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)))': + '@langchain/textsplitters@1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))': dependencies: - '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.14 optional: true @@ -9604,7 +9589,7 @@ snapshots: dependencies: safe-buffer: 5.1.2 - beeai-framework@0.1.19(10842fb8f50b39d31c7f6d103414c3b2): + beeai-framework@0.1.18(e5c8a6c42883d94da29ec76d26875379): dependencies: '@ai-sdk/xai': 1.2.18(zod@3.25.76) '@ai-zen/node-fetch-event-source': 2.1.4 @@ -9636,9 +9621,9 @@ snapshots: zod-to-json-schema: 3.24.6(zod@3.25.76) optionalDependencies: '@ibm-cloud/watsonx-ai': 1.7.0 - '@langchain/community': 1.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-provider-node@3.918.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.6.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@smithy/util-utf8@2.3.0)(duck-duck-scrape@2.2.7)(fast-xml-parser@5.3.0)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.6.0(ws@8.18.3)(zod@3.25.76))(playwright@1.56.1)(ws@8.18.3) - '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)) - '@modelcontextprotocol/sdk': 1.20.2 + '@langchain/community': 1.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-provider-node@3.916.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@smithy/util-utf8@2.3.0)(duck-duck-scrape@2.2.7)(fast-xml-parser@5.3.0)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(playwright@1.56.1)(ws@8.18.3) + '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) + '@modelcontextprotocol/sdk': 1.20.1 express: 5.1.0 ibm-cloud-sdk-core: 5.4.3 yaml: 2.8.1 @@ -10871,7 +10856,7 @@ snapshots: '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) openai: 4.104.0(ws@8.18.3)(zod@3.24.3) - langsmith@0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.6.0(ws@8.18.3)(zod@3.25.76)): + langsmith@0.3.74(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)): dependencies: '@types/uuid': 10.0.0 chalk: 4.1.2 @@ -10884,7 +10869,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/exporter-trace-otlp-proto': 0.50.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) - openai: 6.6.0(ws@8.18.3)(zod@3.25.76) + openai: 6.7.0(ws@8.18.3)(zod@3.25.76) optional: true levn@0.4.1: @@ -11184,12 +11169,7 @@ snapshots: transitivePeerDependencies: - encoding - openai@5.23.2(ws@8.18.3)(zod@3.25.76): - optionalDependencies: - ws: 8.18.3 - zod: 3.25.76 - - openai@6.6.0(ws@8.18.3)(zod@3.25.76): + openai@6.7.0(ws@8.18.3)(zod@3.25.76): optionalDependencies: ws: 8.18.3 zod: 3.25.76 From dacc9b73a4c41c64e3e81c908482bebd89ac1d60 Mon Sep 17 00:00:00 2001 From: Mikyo King Date: Wed, 5 Nov 2025 10:50:27 -0700 Subject: [PATCH 2/6] serialize tool output --- .../src/instrumentation.ts | 3 ++- .../src/responsesAttributes.ts | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/js/packages/openinference-instrumentation-openai/src/instrumentation.ts b/js/packages/openinference-instrumentation-openai/src/instrumentation.ts index e48a5fb0f1..a64a24a938 100644 --- a/js/packages/openinference-instrumentation-openai/src/instrumentation.ts +++ b/js/packages/openinference-instrumentation-openai/src/instrumentation.ts @@ -208,7 +208,8 @@ export class OpenAIInstrumentation extends InstrumentationBase { protected init(): InstrumentationModuleDefinition { const module = new InstrumentationNodeModuleDefinition( "openai", - ["^6.0.0"], + // 5.x is best effort + ["^6.0.0", "^5.0.0"], this.patch.bind(this), this.unpatch.bind(this), ); diff --git a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts index c2a454e2dd..ddc3eb615b 100644 --- a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts +++ b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts @@ -1,7 +1,12 @@ +import { safelyJSONStringify } from "@arizeai/openinference-core"; import { SemanticConventions } from "@arizeai/openinference-semantic-conventions"; +<<<<<<< HEAD import { Attributes, diag } from "@opentelemetry/api"; +======= +import { Attributes } from "@opentelemetry/api"; +>>>>>>> c0d133c2 (serialize tool output) import { Response as ResponseType, ResponseCreateParamsBase, @@ -48,7 +53,10 @@ function getResponseItemAttributes( attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = item.output; } else { - diag.warn("Failed to serialize non-string typed tool output"); + // Best effort to serialize the output + // TODO(mikeldking): Consider figuring out the MIME type of the content + attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = + safelyJSONStringify(item.output) ?? undefined; } break; } From 4a0ccd79e132c0cd2836d7a8ccb645fcc93bb3a6 Mon Sep 17 00:00:00 2001 From: Mikyo King Date: Wed, 5 Nov 2025 10:52:41 -0700 Subject: [PATCH 3/6] remove if statement --- .../src/responsesAttributes.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts index ddc3eb615b..aced8fe91a 100644 --- a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts +++ b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts @@ -49,15 +49,8 @@ function getResponseItemAttributes( attributes[`${prefix}${SemanticConventions.MESSAGE_ROLE}`] = "tool"; attributes[`${prefix}${SemanticConventions.MESSAGE_TOOL_CALL_ID}`] = item.call_id; - if (typeof item.output === "string") { - attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = - item.output; - } else { - // Best effort to serialize the output - // TODO(mikeldking): Consider figuring out the MIME type of the content - attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = - safelyJSONStringify(item.output) ?? undefined; - } + attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = + item.output; break; } case "reasoning": { From e418f89ca0d6cbf7cddc5d3503dafd7d72f51f75 Mon Sep 17 00:00:00 2001 From: Mikyo King Date: Wed, 5 Nov 2025 11:09:57 -0700 Subject: [PATCH 4/6] lock file --- js/pnpm-lock.yaml | 49 +++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/js/pnpm-lock.yaml b/js/pnpm-lock.yaml index cdbe260108..20dd2d1721 100644 --- a/js/pnpm-lock.yaml +++ b/js/pnpm-lock.yaml @@ -335,7 +335,7 @@ importers: version: 7.7.0 beeai-framework: specifier: ^0.1.13 - version: 0.1.18(e5c8a6c42883d94da29ec76d26875379) + version: 0.1.18(40b982e8d9f48ecbce7df775119cd76d) import-in-the-middle: specifier: ^1.13.0 version: 1.15.0 @@ -511,6 +511,9 @@ importers: openai: specifier: ^6.7.0 version: 6.7.0(ws@8.18.3)(zod@3.25.76) + typescript: + specifier: ^5.5.4 + version: 5.9.3 vitest: specifier: ^2.1.8 version: 2.1.9(@types/node@24.9.1) @@ -3133,8 +3136,8 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - beeai-framework@0.1.19: - resolution: {integrity: sha512-+qex7P9dUKR2H6d+wbFToGJSgJ/g/Fe7So2GJs23jubXxa+jPgffvM/Jflivw8Grwm/1cALgJN+L19dQzUR6gw==} + beeai-framework@0.1.18: + resolution: {integrity: sha512-KiwT+ryODbfTtYCQSntqsT9Ixflm/261tVkgYQe3mzo7Ue0l/YX6JmWIaHGaNx5wznp28XYNAsTh098pXyFfSQ==} peerDependencies: '@a2a-js/sdk': ^0.3.4 '@ai-sdk/amazon-bedrock': ^2.2.12 @@ -3149,7 +3152,7 @@ packages: '@ibm-cloud/watsonx-ai': '*' '@langchain/community': '>=0.3.3' '@langchain/core': '>=0.2.27' - '@modelcontextprotocol/sdk': ^1.18.2 + '@modelcontextprotocol/sdk': ^1.17.0 '@qdrant/js-client-rest': ^1.15.0 '@zilliz/milvus2-sdk-node': ^2.6.0 express: ^5.0.0 @@ -7399,11 +7402,11 @@ snapshots: - openai - ws - '@langchain/classic@1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3)': + '@langchain/classic@1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) - '@langchain/openai': 1.0.0-alpha.3(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) - '@langchain/textsplitters': 1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))) + '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/openai': 1.0.0-alpha.3(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + '@langchain/textsplitters': 1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))) handlebars: 4.7.8 js-yaml: 4.1.0 jsonpointer: 5.0.1 @@ -7455,13 +7458,13 @@ snapshots: - '@opentelemetry/sdk-trace-base' - peggy - '@langchain/community@1.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-provider-node@3.916.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@smithy/util-utf8@2.3.0)(duck-duck-scrape@2.2.7)(fast-xml-parser@5.3.0)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(playwright@1.56.1)(ws@8.18.3)': + '@langchain/community@1.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-provider-node@3.918.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@smithy/util-utf8@2.3.0)(duck-duck-scrape@2.2.7)(fast-xml-parser@5.3.0)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(playwright@1.56.1)(ws@8.18.3)': dependencies: '@browserbasehq/stagehand': 1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76) '@ibm-cloud/watsonx-ai': 1.7.0 - '@langchain/classic': 1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3) - '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) - '@langchain/openai': 1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) + '@langchain/classic': 1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(ws@8.18.3) + '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/openai': 1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3) binary-extensions: 2.3.0 expr-eval: 2.0.2 flat: 5.0.2 @@ -7543,7 +7546,7 @@ snapshots: - '@opentelemetry/sdk-trace-base' - openai - '@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))': + '@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76))': dependencies: '@cfworker/json-schema': 4.1.1 ansi-styles: 5.2.0 @@ -7617,9 +7620,9 @@ snapshots: transitivePeerDependencies: - ws - '@langchain/openai@1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + '@langchain/openai@1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.14 openai: 6.7.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 @@ -7636,9 +7639,9 @@ snapshots: transitivePeerDependencies: - ws - '@langchain/openai@1.0.0-alpha.3(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': + '@langchain/openai@1.0.0-alpha.3(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(ws@8.18.3)': dependencies: - '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.14 openai: 6.7.0(ws@8.18.3)(zod@3.25.76) zod: 3.25.76 @@ -7658,9 +7661,9 @@ snapshots: '@langchain/core': 0.1.63(langchain@0.3.36(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(openai@4.104.0(ws@8.18.3)(zod@3.24.3)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(axios@1.13.0)(handlebars@4.7.8)(openai@4.104.0(ws@8.18.3)(zod@3.24.3))(ws@8.18.3))(openai@4.104.0(ws@8.18.3)(zod@3.24.3)) js-tiktoken: 1.0.14 - '@langchain/textsplitters@1.0.0(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))': + '@langchain/textsplitters@1.0.0(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))': dependencies: - '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) + '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) js-tiktoken: 1.0.14 optional: true @@ -9589,7 +9592,7 @@ snapshots: dependencies: safe-buffer: 5.1.2 - beeai-framework@0.1.18(e5c8a6c42883d94da29ec76d26875379): + beeai-framework@0.1.18(40b982e8d9f48ecbce7df775119cd76d): dependencies: '@ai-sdk/xai': 1.2.18(zod@3.25.76) '@ai-zen/node-fetch-event-source': 2.1.4 @@ -9621,9 +9624,9 @@ snapshots: zod-to-json-schema: 3.24.6(zod@3.25.76) optionalDependencies: '@ibm-cloud/watsonx-ai': 1.7.0 - '@langchain/community': 1.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-provider-node@3.916.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@smithy/util-utf8@2.3.0)(duck-duck-scrape@2.2.7)(fast-xml-parser@5.3.0)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(playwright@1.56.1)(ws@8.18.3) - '@langchain/core': 0.3.78(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) - '@modelcontextprotocol/sdk': 1.20.1 + '@langchain/community': 1.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-provider-node@3.918.0)(@browserbasehq/sdk@2.6.0)(@browserbasehq/stagehand@1.14.0(@playwright/test@1.56.1)(deepmerge@4.3.1)(dotenv@16.6.1)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(zod@3.25.76))(@ibm-cloud/watsonx-ai@1.7.0)(@langchain/core@0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)))(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@smithy/util-utf8@2.3.0)(duck-duck-scrape@2.2.7)(fast-xml-parser@5.3.0)(ibm-cloud-sdk-core@5.4.3)(ignore@5.3.1)(jsonwebtoken@9.0.2)(lodash@4.17.21)(openai@6.7.0(ws@8.18.3)(zod@3.25.76))(playwright@1.56.1)(ws@8.18.3) + '@langchain/core': 0.3.79(@opentelemetry/api@1.9.0)(@opentelemetry/exporter-trace-otlp-proto@0.50.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(openai@6.7.0(ws@8.18.3)(zod@3.25.76)) + '@modelcontextprotocol/sdk': 1.20.2 express: 5.1.0 ibm-cloud-sdk-core: 5.4.3 yaml: 2.8.1 From 531211f345beaed1f3764266d5b58f79cdf6209f Mon Sep 17 00:00:00 2001 From: Mikyo King Date: Wed, 5 Nov 2025 11:28:38 -0700 Subject: [PATCH 5/6] serialize the list of tools --- .../src/responsesAttributes.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts index aced8fe91a..8d06de5b8b 100644 --- a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts +++ b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts @@ -1,12 +1,8 @@ import { safelyJSONStringify } from "@arizeai/openinference-core"; import { SemanticConventions } from "@arizeai/openinference-semantic-conventions"; -<<<<<<< HEAD -import { Attributes, diag } from "@opentelemetry/api"; - -======= import { Attributes } from "@opentelemetry/api"; ->>>>>>> c0d133c2 (serialize tool output) + import { Response as ResponseType, ResponseCreateParamsBase, @@ -49,8 +45,15 @@ function getResponseItemAttributes( attributes[`${prefix}${SemanticConventions.MESSAGE_ROLE}`] = "tool"; attributes[`${prefix}${SemanticConventions.MESSAGE_TOOL_CALL_ID}`] = item.call_id; - attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = - item.output; + if (typeof item.output === "string") { + attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = + item.output; + } else { + // TODO: figure out how to serialize the list of tools + attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = + safelyJSONStringify(item.output) || undefined; + } + break; } case "reasoning": { From 2385adfc4f271aef939a428628c29f114f0eb918 Mon Sep 17 00:00:00 2001 From: Mikyo King Date: Wed, 5 Nov 2025 11:31:58 -0700 Subject: [PATCH 6/6] cleanup --- .../src/responsesAttributes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts index 8d06de5b8b..1d0c99dc62 100644 --- a/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts +++ b/js/packages/openinference-instrumentation-openai/src/responsesAttributes.ts @@ -49,7 +49,7 @@ function getResponseItemAttributes( attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = item.output; } else { - // TODO: figure out how to serialize the list of tools + // TODO(2410): figure out how to serialize the list of tools attributes[`${prefix}${SemanticConventions.MESSAGE_CONTENT}`] = safelyJSONStringify(item.output) || undefined; }