@langchain/openai 0.3.5 → 0.3.6-rc.0

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.
@@ -10,5 +10,7 @@ export declare class AzureOpenAIEmbeddings extends OpenAIEmbeddings {
10
10
  deploymentName?: string;
11
11
  openAIApiVersion?: string;
12
12
  }, configuration?: ClientOptions & LegacyOpenAIInput);
13
- protected embeddingWithRetry(request: OpenAIClient.EmbeddingCreateParams): Promise<OpenAIClient.Embeddings.CreateEmbeddingResponse>;
13
+ protected embeddingWithRetry(request: OpenAIClient.EmbeddingCreateParams): Promise<OpenAIClient.Embeddings.CreateEmbeddingResponse & {
14
+ _request_id?: string | null | undefined;
15
+ }>;
14
16
  }
@@ -1157,6 +1157,22 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
1157
1157
  await runManager?.handleLLMNewToken(generationChunk.text ?? "", newTokenIndices, undefined, undefined, undefined, { chunk: generationChunk });
1158
1158
  }
1159
1159
  if (usage) {
1160
+ const inputTokenDetails = {
1161
+ ...(usage.prompt_tokens_details?.audio_tokens !== null && {
1162
+ audio: usage.prompt_tokens_details?.audio_tokens,
1163
+ }),
1164
+ ...(usage.prompt_tokens_details?.cached_tokens !== null && {
1165
+ cache_read: usage.prompt_tokens_details?.cached_tokens,
1166
+ }),
1167
+ };
1168
+ const outputTokenDetails = {
1169
+ ...(usage.completion_tokens_details?.audio_tokens !== null && {
1170
+ audio: usage.completion_tokens_details?.audio_tokens,
1171
+ }),
1172
+ ...(usage.completion_tokens_details?.reasoning_tokens !== null && {
1173
+ reasoning: usage.completion_tokens_details?.reasoning_tokens,
1174
+ }),
1175
+ };
1160
1176
  const generationChunk = new outputs_1.ChatGenerationChunk({
1161
1177
  message: new messages_1.AIMessageChunk({
1162
1178
  content: "",
@@ -1167,6 +1183,12 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
1167
1183
  input_tokens: usage.prompt_tokens,
1168
1184
  output_tokens: usage.completion_tokens,
1169
1185
  total_tokens: usage.total_tokens,
1186
+ ...(Object.keys(inputTokenDetails).length > 0 && {
1187
+ input_token_details: inputTokenDetails,
1188
+ }),
1189
+ ...(Object.keys(outputTokenDetails).length > 0 && {
1190
+ output_token_details: outputTokenDetails,
1191
+ }),
1170
1192
  },
1171
1193
  }),
1172
1194
  text: "",
@@ -1186,7 +1208,7 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
1186
1208
  }
1187
1209
  /** @ignore */
1188
1210
  async _generate(messages, options, runManager) {
1189
- const tokenUsage = {};
1211
+ const usageMetadata = {};
1190
1212
  const params = this.invocationParams(options);
1191
1213
  const messagesMapped = _convertMessagesToOpenAIParams(messages);
1192
1214
  if (params.stream) {
@@ -1213,10 +1235,19 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
1213
1235
  // fallback to estimation.
1214
1236
  const promptTokenUsage = await this.getEstimatedTokenCountFromPrompt(messages, functions, function_call);
1215
1237
  const completionTokenUsage = await this.getNumTokensFromGenerations(generations);
1216
- tokenUsage.promptTokens = promptTokenUsage;
1217
- tokenUsage.completionTokens = completionTokenUsage;
1218
- tokenUsage.totalTokens = promptTokenUsage + completionTokenUsage;
1219
- return { generations, llmOutput: { estimatedTokenUsage: tokenUsage } };
1238
+ usageMetadata.input_tokens = promptTokenUsage;
1239
+ usageMetadata.output_tokens = completionTokenUsage;
1240
+ usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;
1241
+ return {
1242
+ generations,
1243
+ llmOutput: {
1244
+ estimatedTokenUsage: {
1245
+ promptTokens: usageMetadata.input_tokens,
1246
+ completionTokens: usageMetadata.output_tokens,
1247
+ totalTokens: usageMetadata.total_tokens,
1248
+ },
1249
+ },
1250
+ };
1220
1251
  }
1221
1252
  else {
1222
1253
  let data;
@@ -1241,16 +1272,40 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
1241
1272
  ...options?.options,
1242
1273
  });
1243
1274
  }
1244
- const { completion_tokens: completionTokens, prompt_tokens: promptTokens, total_tokens: totalTokens, } = data?.usage ?? {};
1275
+ const { completion_tokens: completionTokens, prompt_tokens: promptTokens, total_tokens: totalTokens, prompt_tokens_details: promptTokensDetails, completion_tokens_details: completionTokensDetails, } = data?.usage ?? {};
1245
1276
  if (completionTokens) {
1246
- tokenUsage.completionTokens =
1247
- (tokenUsage.completionTokens ?? 0) + completionTokens;
1277
+ usageMetadata.output_tokens =
1278
+ (usageMetadata.output_tokens ?? 0) + completionTokens;
1248
1279
  }
1249
1280
  if (promptTokens) {
1250
- tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;
1281
+ usageMetadata.input_tokens =
1282
+ (usageMetadata.input_tokens ?? 0) + promptTokens;
1251
1283
  }
1252
1284
  if (totalTokens) {
1253
- tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;
1285
+ usageMetadata.total_tokens =
1286
+ (usageMetadata.total_tokens ?? 0) + totalTokens;
1287
+ }
1288
+ if (promptTokensDetails?.audio_tokens !== null ||
1289
+ promptTokensDetails?.cached_tokens !== null) {
1290
+ usageMetadata.input_token_details = {
1291
+ ...(promptTokensDetails?.audio_tokens !== null && {
1292
+ audio: promptTokensDetails?.audio_tokens,
1293
+ }),
1294
+ ...(promptTokensDetails?.cached_tokens !== null && {
1295
+ cache_read: promptTokensDetails?.cached_tokens,
1296
+ }),
1297
+ };
1298
+ }
1299
+ if (completionTokensDetails?.audio_tokens !== null ||
1300
+ completionTokensDetails?.reasoning_tokens !== null) {
1301
+ usageMetadata.output_token_details = {
1302
+ ...(completionTokensDetails?.audio_tokens !== null && {
1303
+ audio: completionTokensDetails?.audio_tokens,
1304
+ }),
1305
+ ...(completionTokensDetails?.reasoning_tokens !== null && {
1306
+ reasoning: completionTokensDetails?.reasoning_tokens,
1307
+ }),
1308
+ };
1254
1309
  }
1255
1310
  const generations = [];
1256
1311
  for (const part of data?.choices ?? []) {
@@ -1264,17 +1319,19 @@ class ChatOpenAI extends chat_models_1.BaseChatModel {
1264
1319
  ...(part.logprobs ? { logprobs: part.logprobs } : {}),
1265
1320
  };
1266
1321
  if ((0, messages_1.isAIMessage)(generation.message)) {
1267
- generation.message.usage_metadata = {
1268
- input_tokens: tokenUsage.promptTokens ?? 0,
1269
- output_tokens: tokenUsage.completionTokens ?? 0,
1270
- total_tokens: tokenUsage.totalTokens ?? 0,
1271
- };
1322
+ generation.message.usage_metadata = usageMetadata;
1272
1323
  }
1273
1324
  generations.push(generation);
1274
1325
  }
1275
1326
  return {
1276
1327
  generations,
1277
- llmOutput: { tokenUsage },
1328
+ llmOutput: {
1329
+ tokenUsage: {
1330
+ promptTokens: usageMetadata.input_tokens,
1331
+ completionTokens: usageMetadata.output_tokens,
1332
+ totalTokens: usageMetadata.total_tokens,
1333
+ },
1334
+ },
1278
1335
  };
1279
1336
  }
1280
1337
  }
@@ -1152,6 +1152,22 @@ export class ChatOpenAI extends BaseChatModel {
1152
1152
  await runManager?.handleLLMNewToken(generationChunk.text ?? "", newTokenIndices, undefined, undefined, undefined, { chunk: generationChunk });
1153
1153
  }
1154
1154
  if (usage) {
1155
+ const inputTokenDetails = {
1156
+ ...(usage.prompt_tokens_details?.audio_tokens !== null && {
1157
+ audio: usage.prompt_tokens_details?.audio_tokens,
1158
+ }),
1159
+ ...(usage.prompt_tokens_details?.cached_tokens !== null && {
1160
+ cache_read: usage.prompt_tokens_details?.cached_tokens,
1161
+ }),
1162
+ };
1163
+ const outputTokenDetails = {
1164
+ ...(usage.completion_tokens_details?.audio_tokens !== null && {
1165
+ audio: usage.completion_tokens_details?.audio_tokens,
1166
+ }),
1167
+ ...(usage.completion_tokens_details?.reasoning_tokens !== null && {
1168
+ reasoning: usage.completion_tokens_details?.reasoning_tokens,
1169
+ }),
1170
+ };
1155
1171
  const generationChunk = new ChatGenerationChunk({
1156
1172
  message: new AIMessageChunk({
1157
1173
  content: "",
@@ -1162,6 +1178,12 @@ export class ChatOpenAI extends BaseChatModel {
1162
1178
  input_tokens: usage.prompt_tokens,
1163
1179
  output_tokens: usage.completion_tokens,
1164
1180
  total_tokens: usage.total_tokens,
1181
+ ...(Object.keys(inputTokenDetails).length > 0 && {
1182
+ input_token_details: inputTokenDetails,
1183
+ }),
1184
+ ...(Object.keys(outputTokenDetails).length > 0 && {
1185
+ output_token_details: outputTokenDetails,
1186
+ }),
1165
1187
  },
1166
1188
  }),
1167
1189
  text: "",
@@ -1181,7 +1203,7 @@ export class ChatOpenAI extends BaseChatModel {
1181
1203
  }
1182
1204
  /** @ignore */
1183
1205
  async _generate(messages, options, runManager) {
1184
- const tokenUsage = {};
1206
+ const usageMetadata = {};
1185
1207
  const params = this.invocationParams(options);
1186
1208
  const messagesMapped = _convertMessagesToOpenAIParams(messages);
1187
1209
  if (params.stream) {
@@ -1208,10 +1230,19 @@ export class ChatOpenAI extends BaseChatModel {
1208
1230
  // fallback to estimation.
1209
1231
  const promptTokenUsage = await this.getEstimatedTokenCountFromPrompt(messages, functions, function_call);
1210
1232
  const completionTokenUsage = await this.getNumTokensFromGenerations(generations);
1211
- tokenUsage.promptTokens = promptTokenUsage;
1212
- tokenUsage.completionTokens = completionTokenUsage;
1213
- tokenUsage.totalTokens = promptTokenUsage + completionTokenUsage;
1214
- return { generations, llmOutput: { estimatedTokenUsage: tokenUsage } };
1233
+ usageMetadata.input_tokens = promptTokenUsage;
1234
+ usageMetadata.output_tokens = completionTokenUsage;
1235
+ usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;
1236
+ return {
1237
+ generations,
1238
+ llmOutput: {
1239
+ estimatedTokenUsage: {
1240
+ promptTokens: usageMetadata.input_tokens,
1241
+ completionTokens: usageMetadata.output_tokens,
1242
+ totalTokens: usageMetadata.total_tokens,
1243
+ },
1244
+ },
1245
+ };
1215
1246
  }
1216
1247
  else {
1217
1248
  let data;
@@ -1236,16 +1267,40 @@ export class ChatOpenAI extends BaseChatModel {
1236
1267
  ...options?.options,
1237
1268
  });
1238
1269
  }
1239
- const { completion_tokens: completionTokens, prompt_tokens: promptTokens, total_tokens: totalTokens, } = data?.usage ?? {};
1270
+ const { completion_tokens: completionTokens, prompt_tokens: promptTokens, total_tokens: totalTokens, prompt_tokens_details: promptTokensDetails, completion_tokens_details: completionTokensDetails, } = data?.usage ?? {};
1240
1271
  if (completionTokens) {
1241
- tokenUsage.completionTokens =
1242
- (tokenUsage.completionTokens ?? 0) + completionTokens;
1272
+ usageMetadata.output_tokens =
1273
+ (usageMetadata.output_tokens ?? 0) + completionTokens;
1243
1274
  }
1244
1275
  if (promptTokens) {
1245
- tokenUsage.promptTokens = (tokenUsage.promptTokens ?? 0) + promptTokens;
1276
+ usageMetadata.input_tokens =
1277
+ (usageMetadata.input_tokens ?? 0) + promptTokens;
1246
1278
  }
1247
1279
  if (totalTokens) {
1248
- tokenUsage.totalTokens = (tokenUsage.totalTokens ?? 0) + totalTokens;
1280
+ usageMetadata.total_tokens =
1281
+ (usageMetadata.total_tokens ?? 0) + totalTokens;
1282
+ }
1283
+ if (promptTokensDetails?.audio_tokens !== null ||
1284
+ promptTokensDetails?.cached_tokens !== null) {
1285
+ usageMetadata.input_token_details = {
1286
+ ...(promptTokensDetails?.audio_tokens !== null && {
1287
+ audio: promptTokensDetails?.audio_tokens,
1288
+ }),
1289
+ ...(promptTokensDetails?.cached_tokens !== null && {
1290
+ cache_read: promptTokensDetails?.cached_tokens,
1291
+ }),
1292
+ };
1293
+ }
1294
+ if (completionTokensDetails?.audio_tokens !== null ||
1295
+ completionTokensDetails?.reasoning_tokens !== null) {
1296
+ usageMetadata.output_token_details = {
1297
+ ...(completionTokensDetails?.audio_tokens !== null && {
1298
+ audio: completionTokensDetails?.audio_tokens,
1299
+ }),
1300
+ ...(completionTokensDetails?.reasoning_tokens !== null && {
1301
+ reasoning: completionTokensDetails?.reasoning_tokens,
1302
+ }),
1303
+ };
1249
1304
  }
1250
1305
  const generations = [];
1251
1306
  for (const part of data?.choices ?? []) {
@@ -1259,17 +1314,19 @@ export class ChatOpenAI extends BaseChatModel {
1259
1314
  ...(part.logprobs ? { logprobs: part.logprobs } : {}),
1260
1315
  };
1261
1316
  if (isAIMessage(generation.message)) {
1262
- generation.message.usage_metadata = {
1263
- input_tokens: tokenUsage.promptTokens ?? 0,
1264
- output_tokens: tokenUsage.completionTokens ?? 0,
1265
- total_tokens: tokenUsage.totalTokens ?? 0,
1266
- };
1317
+ generation.message.usage_metadata = usageMetadata;
1267
1318
  }
1268
1319
  generations.push(generation);
1269
1320
  }
1270
1321
  return {
1271
1322
  generations,
1272
- llmOutput: { tokenUsage },
1323
+ llmOutput: {
1324
+ tokenUsage: {
1325
+ promptTokens: usageMetadata.input_tokens,
1326
+ completionTokens: usageMetadata.output_tokens,
1327
+ totalTokens: usageMetadata.total_tokens,
1328
+ },
1329
+ },
1273
1330
  };
1274
1331
  }
1275
1332
  }
@@ -102,5 +102,10 @@ export declare class OpenAIEmbeddings extends Embeddings implements OpenAIEmbedd
102
102
  * @param request Request to send to the OpenAI API.
103
103
  * @returns Promise that resolves to the response from the API.
104
104
  */
105
- protected embeddingWithRetry(request: OpenAIClient.EmbeddingCreateParams): Promise<OpenAIClient.Embeddings.CreateEmbeddingResponse>;
105
+ protected embeddingWithRetry(request: OpenAIClient.EmbeddingCreateParams): Promise<OpenAIClient.Embeddings.CreateEmbeddingResponse & {
106
+ _request_id?: string | null | undefined; /**
107
+ * The number of dimensions the resulting output embeddings should have.
108
+ * Only supported in `text-embedding-3` and later models.
109
+ */
110
+ }>;
106
111
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/openai",
3
- "version": "0.3.5",
3
+ "version": "0.3.6-rc.0",
4
4
  "description": "OpenAI integrations for LangChain.js",
5
5
  "type": "module",
6
6
  "engines": {
@@ -36,7 +36,7 @@
36
36
  "license": "MIT",
37
37
  "dependencies": {
38
38
  "js-tiktoken": "^1.0.12",
39
- "openai": "^4.57.3",
39
+ "openai": "^4.67.2",
40
40
  "zod": "^3.22.4",
41
41
  "zod-to-json-schema": "^3.22.3"
42
42
  },