@langchain/openai 1.2.7 → 1.2.8-dev-1771365493298

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 (219) hide show
  1. package/dist/azure/chat_models/common.cjs +9 -10
  2. package/dist/azure/chat_models/common.cjs.map +1 -1
  3. package/dist/azure/chat_models/common.d.cts +0 -1
  4. package/dist/azure/chat_models/common.d.cts.map +1 -1
  5. package/dist/azure/chat_models/common.d.ts +0 -1
  6. package/dist/azure/chat_models/common.d.ts.map +1 -1
  7. package/dist/azure/chat_models/common.js +1 -1
  8. package/dist/azure/chat_models/common.js.map +1 -1
  9. package/dist/azure/chat_models/completions.cjs.map +1 -1
  10. package/dist/azure/chat_models/completions.d.cts.map +1 -1
  11. package/dist/azure/chat_models/completions.d.ts.map +1 -1
  12. package/dist/azure/chat_models/completions.js.map +1 -1
  13. package/dist/azure/chat_models/index.cjs.map +1 -1
  14. package/dist/azure/chat_models/index.d.cts +0 -1
  15. package/dist/azure/chat_models/index.d.cts.map +1 -1
  16. package/dist/azure/chat_models/index.d.ts +0 -1
  17. package/dist/azure/chat_models/index.d.ts.map +1 -1
  18. package/dist/azure/chat_models/index.js.map +1 -1
  19. package/dist/azure/chat_models/responses.cjs.map +1 -1
  20. package/dist/azure/chat_models/responses.d.cts.map +1 -1
  21. package/dist/azure/chat_models/responses.d.ts.map +1 -1
  22. package/dist/azure/chat_models/responses.js.map +1 -1
  23. package/dist/azure/embeddings.cjs +10 -13
  24. package/dist/azure/embeddings.cjs.map +1 -1
  25. package/dist/azure/embeddings.d.cts +1 -2
  26. package/dist/azure/embeddings.d.cts.map +1 -1
  27. package/dist/azure/embeddings.d.ts +1 -2
  28. package/dist/azure/embeddings.d.ts.map +1 -1
  29. package/dist/azure/embeddings.js +3 -5
  30. package/dist/azure/embeddings.js.map +1 -1
  31. package/dist/azure/llms.cjs +9 -10
  32. package/dist/azure/llms.cjs.map +1 -1
  33. package/dist/azure/llms.d.cts +2 -2
  34. package/dist/azure/llms.d.cts.map +1 -1
  35. package/dist/azure/llms.d.ts +2 -2
  36. package/dist/azure/llms.d.ts.map +1 -1
  37. package/dist/azure/llms.js +3 -3
  38. package/dist/azure/llms.js.map +1 -1
  39. package/dist/chat_models/base.cjs +38 -45
  40. package/dist/chat_models/base.cjs.map +1 -1
  41. package/dist/chat_models/base.d.cts.map +1 -1
  42. package/dist/chat_models/base.d.ts.map +1 -1
  43. package/dist/chat_models/base.js +10 -16
  44. package/dist/chat_models/base.js.map +1 -1
  45. package/dist/chat_models/completions.cjs +9 -13
  46. package/dist/chat_models/completions.cjs.map +1 -1
  47. package/dist/chat_models/completions.d.cts.map +1 -1
  48. package/dist/chat_models/completions.d.ts.map +1 -1
  49. package/dist/chat_models/completions.js +3 -6
  50. package/dist/chat_models/completions.js.map +1 -1
  51. package/dist/chat_models/index.cjs.map +1 -1
  52. package/dist/chat_models/index.d.cts.map +1 -1
  53. package/dist/chat_models/index.d.ts.map +1 -1
  54. package/dist/chat_models/index.js.map +1 -1
  55. package/dist/chat_models/profiles.cjs +1 -2
  56. package/dist/chat_models/profiles.cjs.map +1 -1
  57. package/dist/chat_models/profiles.js +1 -2
  58. package/dist/chat_models/profiles.js.map +1 -1
  59. package/dist/chat_models/responses.cjs +4 -7
  60. package/dist/chat_models/responses.cjs.map +1 -1
  61. package/dist/chat_models/responses.d.cts.map +1 -1
  62. package/dist/chat_models/responses.d.ts.map +1 -1
  63. package/dist/chat_models/responses.js +2 -4
  64. package/dist/chat_models/responses.js.map +1 -1
  65. package/dist/converters/completions.cjs +36 -45
  66. package/dist/converters/completions.cjs.map +1 -1
  67. package/dist/converters/completions.d.cts +0 -1
  68. package/dist/converters/completions.d.cts.map +1 -1
  69. package/dist/converters/completions.d.ts +0 -1
  70. package/dist/converters/completions.d.ts.map +1 -1
  71. package/dist/converters/completions.js +14 -22
  72. package/dist/converters/completions.js.map +1 -1
  73. package/dist/converters/index.js +2 -0
  74. package/dist/converters/responses.cjs +39 -54
  75. package/dist/converters/responses.cjs.map +1 -1
  76. package/dist/converters/responses.d.cts.map +1 -1
  77. package/dist/converters/responses.d.ts.map +1 -1
  78. package/dist/converters/responses.js +31 -45
  79. package/dist/converters/responses.js.map +1 -1
  80. package/dist/embeddings.cjs +11 -15
  81. package/dist/embeddings.cjs.map +1 -1
  82. package/dist/embeddings.d.cts +1 -3
  83. package/dist/embeddings.d.cts.map +1 -1
  84. package/dist/embeddings.d.ts +1 -3
  85. package/dist/embeddings.d.ts.map +1 -1
  86. package/dist/embeddings.js +3 -6
  87. package/dist/embeddings.js.map +1 -1
  88. package/dist/index.cjs +2 -2
  89. package/dist/llms.cjs +27 -33
  90. package/dist/llms.cjs.map +1 -1
  91. package/dist/llms.d.cts +0 -1
  92. package/dist/llms.d.cts.map +1 -1
  93. package/dist/llms.d.ts +0 -1
  94. package/dist/llms.d.ts.map +1 -1
  95. package/dist/llms.js +15 -20
  96. package/dist/llms.js.map +1 -1
  97. package/dist/tools/applyPatch.cjs +3 -4
  98. package/dist/tools/applyPatch.cjs.map +1 -1
  99. package/dist/tools/applyPatch.d.cts +0 -1
  100. package/dist/tools/applyPatch.d.cts.map +1 -1
  101. package/dist/tools/applyPatch.d.ts +0 -1
  102. package/dist/tools/applyPatch.d.ts.map +1 -1
  103. package/dist/tools/applyPatch.js.map +1 -1
  104. package/dist/tools/codeInterpreter.cjs.map +1 -1
  105. package/dist/tools/codeInterpreter.d.cts +0 -1
  106. package/dist/tools/codeInterpreter.d.cts.map +1 -1
  107. package/dist/tools/codeInterpreter.d.ts +0 -1
  108. package/dist/tools/codeInterpreter.d.ts.map +1 -1
  109. package/dist/tools/codeInterpreter.js.map +1 -1
  110. package/dist/tools/computerUse.cjs +7 -13
  111. package/dist/tools/computerUse.cjs.map +1 -1
  112. package/dist/tools/computerUse.d.cts +0 -1
  113. package/dist/tools/computerUse.d.cts.map +1 -1
  114. package/dist/tools/computerUse.d.ts +0 -1
  115. package/dist/tools/computerUse.d.ts.map +1 -1
  116. package/dist/tools/computerUse.js +1 -6
  117. package/dist/tools/computerUse.js.map +1 -1
  118. package/dist/tools/custom.cjs +6 -7
  119. package/dist/tools/custom.cjs.map +1 -1
  120. package/dist/tools/custom.d.cts.map +1 -1
  121. package/dist/tools/custom.d.ts.map +1 -1
  122. package/dist/tools/custom.js.map +1 -1
  123. package/dist/tools/dalle.cjs +10 -16
  124. package/dist/tools/dalle.cjs.map +1 -1
  125. package/dist/tools/dalle.d.cts +0 -1
  126. package/dist/tools/dalle.d.cts.map +1 -1
  127. package/dist/tools/dalle.d.ts +0 -1
  128. package/dist/tools/dalle.d.ts.map +1 -1
  129. package/dist/tools/dalle.js +6 -11
  130. package/dist/tools/dalle.js.map +1 -1
  131. package/dist/tools/fileSearch.cjs.map +1 -1
  132. package/dist/tools/fileSearch.d.cts +0 -1
  133. package/dist/tools/fileSearch.d.cts.map +1 -1
  134. package/dist/tools/fileSearch.d.ts +0 -1
  135. package/dist/tools/fileSearch.d.ts.map +1 -1
  136. package/dist/tools/fileSearch.js.map +1 -1
  137. package/dist/tools/imageGeneration.cjs.map +1 -1
  138. package/dist/tools/imageGeneration.d.cts +0 -1
  139. package/dist/tools/imageGeneration.d.cts.map +1 -1
  140. package/dist/tools/imageGeneration.d.ts +0 -1
  141. package/dist/tools/imageGeneration.d.ts.map +1 -1
  142. package/dist/tools/imageGeneration.js.map +1 -1
  143. package/dist/tools/index.cjs.map +1 -1
  144. package/dist/tools/index.d.cts +0 -1
  145. package/dist/tools/index.d.cts.map +1 -1
  146. package/dist/tools/index.d.ts +0 -1
  147. package/dist/tools/index.d.ts.map +1 -1
  148. package/dist/tools/index.js.map +1 -1
  149. package/dist/tools/localShell.cjs +3 -4
  150. package/dist/tools/localShell.cjs.map +1 -1
  151. package/dist/tools/localShell.d.cts +0 -1
  152. package/dist/tools/localShell.d.cts.map +1 -1
  153. package/dist/tools/localShell.d.ts +0 -1
  154. package/dist/tools/localShell.d.ts.map +1 -1
  155. package/dist/tools/localShell.js.map +1 -1
  156. package/dist/tools/mcp.cjs.map +1 -1
  157. package/dist/tools/mcp.d.cts +0 -1
  158. package/dist/tools/mcp.d.cts.map +1 -1
  159. package/dist/tools/mcp.d.ts +0 -1
  160. package/dist/tools/mcp.d.ts.map +1 -1
  161. package/dist/tools/mcp.js.map +1 -1
  162. package/dist/tools/shell.cjs +3 -4
  163. package/dist/tools/shell.cjs.map +1 -1
  164. package/dist/tools/shell.d.cts +0 -1
  165. package/dist/tools/shell.d.cts.map +1 -1
  166. package/dist/tools/shell.d.ts +0 -1
  167. package/dist/tools/shell.d.ts.map +1 -1
  168. package/dist/tools/shell.js.map +1 -1
  169. package/dist/tools/webSearch.cjs.map +1 -1
  170. package/dist/tools/webSearch.d.cts +0 -1
  171. package/dist/tools/webSearch.d.cts.map +1 -1
  172. package/dist/tools/webSearch.d.ts +0 -1
  173. package/dist/tools/webSearch.d.ts.map +1 -1
  174. package/dist/tools/webSearch.js.map +1 -1
  175. package/dist/types.d.cts +0 -1
  176. package/dist/types.d.cts.map +1 -1
  177. package/dist/types.d.ts +0 -1
  178. package/dist/types.d.ts.map +1 -1
  179. package/dist/utils/azure.cjs +2 -3
  180. package/dist/utils/azure.cjs.map +1 -1
  181. package/dist/utils/azure.d.cts.map +1 -1
  182. package/dist/utils/azure.d.ts.map +1 -1
  183. package/dist/utils/azure.js.map +1 -1
  184. package/dist/utils/client.cjs +9 -3
  185. package/dist/utils/client.cjs.map +1 -1
  186. package/dist/utils/client.d.cts.map +1 -1
  187. package/dist/utils/client.d.ts.map +1 -1
  188. package/dist/utils/client.js +8 -1
  189. package/dist/utils/client.js.map +1 -1
  190. package/dist/utils/errors.cjs.map +1 -1
  191. package/dist/utils/errors.js.map +1 -1
  192. package/dist/utils/misc.cjs +2 -3
  193. package/dist/utils/misc.cjs.map +1 -1
  194. package/dist/utils/misc.d.cts +0 -1
  195. package/dist/utils/misc.d.cts.map +1 -1
  196. package/dist/utils/misc.d.ts +0 -1
  197. package/dist/utils/misc.d.ts.map +1 -1
  198. package/dist/utils/misc.js.map +1 -1
  199. package/dist/utils/output.cjs +7 -8
  200. package/dist/utils/output.cjs.map +1 -1
  201. package/dist/utils/output.js.map +1 -1
  202. package/dist/utils/prompts.cjs +1 -2
  203. package/dist/utils/prompts.cjs.map +1 -1
  204. package/dist/utils/prompts.d.cts +0 -1
  205. package/dist/utils/prompts.d.cts.map +1 -1
  206. package/dist/utils/prompts.d.ts +0 -1
  207. package/dist/utils/prompts.d.ts.map +1 -1
  208. package/dist/utils/prompts.js +1 -2
  209. package/dist/utils/prompts.js.map +1 -1
  210. package/dist/utils/tools.cjs +9 -12
  211. package/dist/utils/tools.cjs.map +1 -1
  212. package/dist/utils/tools.d.cts +0 -1
  213. package/dist/utils/tools.d.cts.map +1 -1
  214. package/dist/utils/tools.d.ts +0 -1
  215. package/dist/utils/tools.d.ts.map +1 -1
  216. package/dist/utils/tools.js +5 -7
  217. package/dist/utils/tools.js.map +1 -1
  218. package/package.json +5 -5
  219. package/dist/_virtual/rolldown_runtime.cjs +0 -25
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","names":["model: string","method: unknown","response_format: ResponseFormatJSONSchema","parser: (content: string) => ParsedT","zodSchema: InteropZodType","name: string","props: Omit<ResponseFormatJSONSchema.JSONSchema, \"schema\" | \"strict\" | \"name\">","parseV4","content: string","messages: unknown"],"sources":["../../src/utils/output.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport {\n InteropZodType,\n isZodSchemaV3,\n isZodSchemaV4,\n} from \"@langchain/core/utils/types\";\nimport { parse as parseV4 } from \"zod/v4/core\";\nimport { ResponseFormatJSONSchema } from \"openai/resources\";\nimport { zodResponseFormat } from \"openai/helpers/zod\";\nimport { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\n\nconst SUPPORTED_METHODS = [\n \"jsonSchema\",\n \"functionCalling\",\n \"jsonMode\",\n] as const;\ntype SupportedMethod = (typeof SUPPORTED_METHODS)[number];\n\n/**\n * Get the structured output method for a given model. By default, it uses\n * `jsonSchema` if the model supports it, otherwise it uses `functionCalling`.\n *\n * @throws if the method is invalid, e.g. is not a string or invalid method is provided.\n * @param model - The model name.\n * @param config - The structured output method options.\n * @returns The structured output method.\n */\nexport function getStructuredOutputMethod(\n model: string,\n method: unknown\n): SupportedMethod {\n /**\n * If a method is provided, validate it.\n */\n if (\n typeof method !== \"undefined\" &&\n !SUPPORTED_METHODS.includes(method as SupportedMethod)\n ) {\n throw new Error(\n `Invalid method: ${method}. Supported methods are: ${SUPPORTED_METHODS.join(\n \", \"\n )}`\n );\n }\n\n const hasSupportForJsonSchema =\n !model.startsWith(\"gpt-3\") &&\n !model.startsWith(\"gpt-4-\") &&\n model !== \"gpt-4\";\n\n /**\n * If the model supports JSON Schema, use it by default.\n */\n if (hasSupportForJsonSchema && !method) {\n return \"jsonSchema\";\n }\n\n if (!hasSupportForJsonSchema && method === \"jsonSchema\") {\n throw new Error(\n `JSON Schema is not supported for model \"${model}\". Please use a different method, e.g. \"functionCalling\" or \"jsonMode\".`\n );\n }\n\n /**\n * If the model does not support JSON Schema, use function calling by default.\n */\n return (method as SupportedMethod) ?? \"functionCalling\";\n}\n\n// inlined from openai/lib/parser.ts\nfunction makeParseableResponseFormat<ParsedT>(\n response_format: ResponseFormatJSONSchema,\n parser: (content: string) => ParsedT\n) {\n const obj = { ...response_format };\n\n Object.defineProperties(obj, {\n $brand: {\n value: \"auto-parseable-response-format\",\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n\n return obj;\n}\n\nexport function interopZodResponseFormat(\n zodSchema: InteropZodType,\n name: string,\n props: Omit<ResponseFormatJSONSchema.JSONSchema, \"schema\" | \"strict\" | \"name\">\n) {\n if (isZodSchemaV3(zodSchema)) {\n return zodResponseFormat(zodSchema, name, props);\n }\n if (isZodSchemaV4(zodSchema)) {\n return makeParseableResponseFormat(\n {\n type: \"json_schema\",\n json_schema: {\n ...props,\n name,\n strict: true,\n schema: toJsonSchema(zodSchema, {\n cycles: \"ref\", // equivalent to nameStrategy: 'duplicate-ref'\n reused: \"ref\", // equivalent to $refStrategy: 'extract-to-root'\n override(ctx) {\n ctx.jsonSchema.title = name; // equivalent to `name` property\n // TODO: implement `nullableStrategy` patch-fix (zod doesn't support openApi3 json schema target)\n // TODO: implement `openaiStrictMode` patch-fix (where optional properties without `nullable` are not supported)\n },\n /// property equivalents from native `zodResponseFormat` fn\n // openaiStrictMode: true,\n // name,\n // nameStrategy: 'duplicate-ref',\n // $refStrategy: 'extract-to-root',\n // nullableStrategy: 'property',\n }),\n },\n },\n (content) => parseV4(zodSchema, JSON.parse(content))\n );\n }\n throw new Error(\"Unsupported schema response format\");\n}\n\n/**\n * Handle multi modal response content.\n *\n * @param content The content of the message.\n * @param messages The messages of the response.\n * @returns The new content of the message.\n */\nexport function handleMultiModalOutput(\n content: string,\n messages: unknown\n): ContentBlock[] | string {\n /**\n * Handle OpenRouter image responses\n * @see https://openrouter.ai/docs/features/multimodal/image-generation#api-usage\n */\n if (\n messages &&\n typeof messages === \"object\" &&\n \"images\" in messages &&\n Array.isArray(messages.images)\n ) {\n const images = messages.images\n .filter((image) => typeof image?.image_url?.url === \"string\")\n .map(\n (image) =>\n ({\n type: \"image\",\n url: image.image_url.url as string,\n }) as const\n );\n return [{ type: \"text\", text: content }, ...images];\n }\n\n return content;\n}\n\n// TODO: make this a converter\nexport function _convertOpenAIResponsesUsageToLangChainUsage(\n usage?: OpenAIClient.Responses.ResponseUsage\n): UsageMetadata {\n const inputTokenDetails = {\n ...(usage?.input_tokens_details?.cached_tokens != null && {\n cache_read: usage?.input_tokens_details?.cached_tokens,\n }),\n };\n const outputTokenDetails = {\n ...(usage?.output_tokens_details?.reasoning_tokens != null && {\n reasoning: usage?.output_tokens_details?.reasoning_tokens,\n }),\n };\n return {\n input_tokens: usage?.input_tokens ?? 0,\n output_tokens: usage?.output_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n input_token_details: inputTokenDetails,\n output_token_details: outputTokenDetails,\n };\n}\n"],"mappings":";;;;;;AAYA,MAAM,oBAAoB;CACxB;CACA;CACA;AACD;;;;;;;;;;AAYD,SAAgB,0BACdA,OACAC,QACiB;;;;AAIjB,KACE,OAAO,WAAW,eAClB,CAAC,kBAAkB,SAAS,OAA0B,CAEtD,OAAM,IAAI,MACR,CAAC,gBAAgB,EAAE,OAAO,yBAAyB,EAAE,kBAAkB,KACrE,KACD,EAAE;CAIP,MAAM,0BACJ,CAAC,MAAM,WAAW,QAAQ,IAC1B,CAAC,MAAM,WAAW,SAAS,IAC3B,UAAU;;;;AAKZ,KAAI,2BAA2B,CAAC,OAC9B,QAAO;AAGT,KAAI,CAAC,2BAA2B,WAAW,aACzC,OAAM,IAAI,MACR,CAAC,wCAAwC,EAAE,MAAM,uEAAuE,CAAC;;;;AAO7H,QAAQ,UAA8B;AACvC;AAGD,SAAS,4BACPC,iBACAC,QACA;CACA,MAAM,MAAM,EAAE,GAAG,gBAAiB;CAElC,OAAO,iBAAiB,KAAK;EAC3B,QAAQ;GACN,OAAO;GACP,YAAY;EACb;EACD,WAAW;GACT,OAAO;GACP,YAAY;EACb;CACF,EAAC;AAEF,QAAO;AACR;AAED,SAAgB,yBACdC,WACAC,MACAC,OACA;AACA,KAAI,cAAc,UAAU,CAC1B,QAAO,kBAAkB,WAAW,MAAM,MAAM;AAElD,KAAI,cAAc,UAAU,CAC1B,QAAO,4BACL;EACE,MAAM;EACN,aAAa;GACX,GAAG;GACH;GACA,QAAQ;GACR,QAAQ,aAAa,WAAW;IAC9B,QAAQ;IACR,QAAQ;IACR,SAAS,KAAK;KACZ,IAAI,WAAW,QAAQ;IAGxB;GAOF,EAAC;EACH;CACF,GACD,CAAC,YAAYC,MAAQ,WAAW,KAAK,MAAM,QAAQ,CAAC,CACrD;AAEH,OAAM,IAAI,MAAM;AACjB;;;;;;;;AASD,SAAgB,uBACdC,SACAC,UACyB;;;;;AAKzB,KACE,YACA,OAAO,aAAa,YACpB,YAAY,YACZ,MAAM,QAAQ,SAAS,OAAO,EAC9B;EACA,MAAM,SAAS,SAAS,OACrB,OAAO,CAAC,UAAU,OAAO,OAAO,WAAW,QAAQ,SAAS,CAC5D,IACC,CAAC,WACE;GACC,MAAM;GACN,KAAK,MAAM,UAAU;EACtB,GACJ;AACH,SAAO,CAAC;GAAE,MAAM;GAAQ,MAAM;EAAS,GAAE,GAAG,MAAO;CACpD;AAED,QAAO;AACR"}
1
+ {"version":3,"file":"output.js","names":["parseV4"],"sources":["../../src/utils/output.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport {\n InteropZodType,\n isZodSchemaV3,\n isZodSchemaV4,\n} from \"@langchain/core/utils/types\";\nimport { parse as parseV4 } from \"zod/v4/core\";\nimport { ResponseFormatJSONSchema } from \"openai/resources\";\nimport { zodResponseFormat } from \"openai/helpers/zod\";\nimport { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\n\nconst SUPPORTED_METHODS = [\n \"jsonSchema\",\n \"functionCalling\",\n \"jsonMode\",\n] as const;\ntype SupportedMethod = (typeof SUPPORTED_METHODS)[number];\n\n/**\n * Get the structured output method for a given model. By default, it uses\n * `jsonSchema` if the model supports it, otherwise it uses `functionCalling`.\n *\n * @throws if the method is invalid, e.g. is not a string or invalid method is provided.\n * @param model - The model name.\n * @param config - The structured output method options.\n * @returns The structured output method.\n */\nexport function getStructuredOutputMethod(\n model: string,\n method: unknown\n): SupportedMethod {\n /**\n * If a method is provided, validate it.\n */\n if (\n typeof method !== \"undefined\" &&\n !SUPPORTED_METHODS.includes(method as SupportedMethod)\n ) {\n throw new Error(\n `Invalid method: ${method}. Supported methods are: ${SUPPORTED_METHODS.join(\n \", \"\n )}`\n );\n }\n\n const hasSupportForJsonSchema =\n !model.startsWith(\"gpt-3\") &&\n !model.startsWith(\"gpt-4-\") &&\n model !== \"gpt-4\";\n\n /**\n * If the model supports JSON Schema, use it by default.\n */\n if (hasSupportForJsonSchema && !method) {\n return \"jsonSchema\";\n }\n\n if (!hasSupportForJsonSchema && method === \"jsonSchema\") {\n throw new Error(\n `JSON Schema is not supported for model \"${model}\". Please use a different method, e.g. \"functionCalling\" or \"jsonMode\".`\n );\n }\n\n /**\n * If the model does not support JSON Schema, use function calling by default.\n */\n return (method as SupportedMethod) ?? \"functionCalling\";\n}\n\n// inlined from openai/lib/parser.ts\nfunction makeParseableResponseFormat<ParsedT>(\n response_format: ResponseFormatJSONSchema,\n parser: (content: string) => ParsedT\n) {\n const obj = { ...response_format };\n\n Object.defineProperties(obj, {\n $brand: {\n value: \"auto-parseable-response-format\",\n enumerable: false,\n },\n $parseRaw: {\n value: parser,\n enumerable: false,\n },\n });\n\n return obj;\n}\n\nexport function interopZodResponseFormat(\n zodSchema: InteropZodType,\n name: string,\n props: Omit<ResponseFormatJSONSchema.JSONSchema, \"schema\" | \"strict\" | \"name\">\n) {\n if (isZodSchemaV3(zodSchema)) {\n return zodResponseFormat(zodSchema, name, props);\n }\n if (isZodSchemaV4(zodSchema)) {\n return makeParseableResponseFormat(\n {\n type: \"json_schema\",\n json_schema: {\n ...props,\n name,\n strict: true,\n schema: toJsonSchema(zodSchema, {\n cycles: \"ref\", // equivalent to nameStrategy: 'duplicate-ref'\n reused: \"ref\", // equivalent to $refStrategy: 'extract-to-root'\n override(ctx) {\n ctx.jsonSchema.title = name; // equivalent to `name` property\n // TODO: implement `nullableStrategy` patch-fix (zod doesn't support openApi3 json schema target)\n // TODO: implement `openaiStrictMode` patch-fix (where optional properties without `nullable` are not supported)\n },\n /// property equivalents from native `zodResponseFormat` fn\n // openaiStrictMode: true,\n // name,\n // nameStrategy: 'duplicate-ref',\n // $refStrategy: 'extract-to-root',\n // nullableStrategy: 'property',\n }),\n },\n },\n (content) => parseV4(zodSchema, JSON.parse(content))\n );\n }\n throw new Error(\"Unsupported schema response format\");\n}\n\n/**\n * Handle multi modal response content.\n *\n * @param content The content of the message.\n * @param messages The messages of the response.\n * @returns The new content of the message.\n */\nexport function handleMultiModalOutput(\n content: string,\n messages: unknown\n): ContentBlock[] | string {\n /**\n * Handle OpenRouter image responses\n * @see https://openrouter.ai/docs/features/multimodal/image-generation#api-usage\n */\n if (\n messages &&\n typeof messages === \"object\" &&\n \"images\" in messages &&\n Array.isArray(messages.images)\n ) {\n const images = messages.images\n .filter((image) => typeof image?.image_url?.url === \"string\")\n .map(\n (image) =>\n ({\n type: \"image\",\n url: image.image_url.url as string,\n }) as const\n );\n return [{ type: \"text\", text: content }, ...images];\n }\n\n return content;\n}\n\n// TODO: make this a converter\nexport function _convertOpenAIResponsesUsageToLangChainUsage(\n usage?: OpenAIClient.Responses.ResponseUsage\n): UsageMetadata {\n const inputTokenDetails = {\n ...(usage?.input_tokens_details?.cached_tokens != null && {\n cache_read: usage?.input_tokens_details?.cached_tokens,\n }),\n };\n const outputTokenDetails = {\n ...(usage?.output_tokens_details?.reasoning_tokens != null && {\n reasoning: usage?.output_tokens_details?.reasoning_tokens,\n }),\n };\n return {\n input_tokens: usage?.input_tokens ?? 0,\n output_tokens: usage?.output_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n input_token_details: inputTokenDetails,\n output_token_details: outputTokenDetails,\n };\n}\n"],"mappings":";;;;;;AAYA,MAAM,oBAAoB;CACxB;CACA;CACA;CACD;;;;;;;;;;AAYD,SAAgB,0BACd,OACA,QACiB;;;;AAIjB,KACE,OAAO,WAAW,eAClB,CAAC,kBAAkB,SAAS,OAA0B,CAEtD,OAAM,IAAI,MACR,mBAAmB,OAAO,2BAA2B,kBAAkB,KACrE,KACD,GACF;CAGH,MAAM,0BACJ,CAAC,MAAM,WAAW,QAAQ,IAC1B,CAAC,MAAM,WAAW,SAAS,IAC3B,UAAU;;;;AAKZ,KAAI,2BAA2B,CAAC,OAC9B,QAAO;AAGT,KAAI,CAAC,2BAA2B,WAAW,aACzC,OAAM,IAAI,MACR,2CAA2C,MAAM,yEAClD;;;;AAMH,QAAQ,UAA8B;;AAIxC,SAAS,4BACP,iBACA,QACA;CACA,MAAM,MAAM,EAAE,GAAG,iBAAiB;AAElC,QAAO,iBAAiB,KAAK;EAC3B,QAAQ;GACN,OAAO;GACP,YAAY;GACb;EACD,WAAW;GACT,OAAO;GACP,YAAY;GACb;EACF,CAAC;AAEF,QAAO;;AAGT,SAAgB,yBACd,WACA,MACA,OACA;AACA,KAAI,cAAc,UAAU,CAC1B,QAAO,kBAAkB,WAAW,MAAM,MAAM;AAElD,KAAI,cAAc,UAAU,CAC1B,QAAO,4BACL;EACE,MAAM;EACN,aAAa;GACX,GAAG;GACH;GACA,QAAQ;GACR,QAAQ,aAAa,WAAW;IAC9B,QAAQ;IACR,QAAQ;IACR,SAAS,KAAK;AACZ,SAAI,WAAW,QAAQ;;IAU1B,CAAC;GACH;EACF,GACA,YAAYA,MAAQ,WAAW,KAAK,MAAM,QAAQ,CAAC,CACrD;AAEH,OAAM,IAAI,MAAM,qCAAqC;;;;;;;;;AAUvD,SAAgB,uBACd,SACA,UACyB;;;;;AAKzB,KACE,YACA,OAAO,aAAa,YACpB,YAAY,YACZ,MAAM,QAAQ,SAAS,OAAO,EAC9B;EACA,MAAM,SAAS,SAAS,OACrB,QAAQ,UAAU,OAAO,OAAO,WAAW,QAAQ,SAAS,CAC5D,KACE,WACE;GACC,MAAM;GACN,KAAK,MAAM,UAAU;GACtB,EACJ;AACH,SAAO,CAAC;GAAE,MAAM;GAAQ,MAAM;GAAS,EAAE,GAAG,OAAO;;AAGrD,QAAO"}
@@ -33,8 +33,7 @@ const require_completions = require('../converters/completions.cjs');
33
33
  * @returns A partial OpenAI payload.
34
34
  */
35
35
  function convertPromptToOpenAI(formattedPrompt) {
36
- const messages = formattedPrompt.toChatMessages();
37
- return { messages: require_completions.convertMessagesToCompletionsMessageParams({ messages }) };
36
+ return { messages: require_completions.convertMessagesToCompletionsMessageParams({ messages: formattedPrompt.toChatMessages() }) };
38
37
  }
39
38
 
40
39
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.cjs","names":["formattedPrompt: BasePromptValue","convertMessagesToCompletionsMessageParams"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\nimport { convertMessagesToCompletionsMessageParams } from \"../converters/completions.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\n// TODO: make this a converter\nexport function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n} {\n const messages = formattedPrompt.toChatMessages();\n return {\n messages: convertMessagesToCompletionsMessageParams({\n messages,\n }) as OpenAI.Chat.ChatCompletionMessageParam[],\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,sBAAsBA,iBAEpC;CACA,MAAM,WAAW,gBAAgB,gBAAgB;AACjD,QAAO,EACL,UAAUC,8DAA0C,EAClD,SACD,EAAC,CACH;AACF"}
1
+ {"version":3,"file":"prompts.cjs","names":["convertMessagesToCompletionsMessageParams"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\nimport { convertMessagesToCompletionsMessageParams } from \"../converters/completions.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\n// TODO: make this a converter\nexport function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n} {\n const messages = formattedPrompt.toChatMessages();\n return {\n messages: convertMessagesToCompletionsMessageParams({\n messages,\n }) as OpenAI.Chat.ChatCompletionMessageParam[],\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,sBAAsB,iBAEpC;AAEA,QAAO,EACL,UAAUA,8DAA0C,EAClD,UAHa,gBAAgB,gBAAgB,EAI9C,CAAC,EACH"}
@@ -2,7 +2,6 @@ import { OpenAI as OpenAI$1 } from "openai";
2
2
  import { BasePromptValue } from "@langchain/core/prompt_values";
3
3
 
4
4
  //#region src/utils/prompts.d.ts
5
-
6
5
  /**
7
6
  * Convert a formatted LangChain prompt (e.g. pulled from the hub) into
8
7
  * a format expected by OpenAI's JS SDK.
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.cts","names":["BasePromptValue","OpenAI","convertPromptToOpenAI","Chat","ChatCompletionMessageParam"],"sources":["../../src/utils/prompts.d.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\nexport declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n};\n//# sourceMappingURL=prompts.d.ts.map"],"mappings":";;;;;;;AAiCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAwBE,qBAAAA,kBAAuCF;YACjDC,QAAAA,CAAOE,IAAAA,CAAKC"}
1
+ {"version":3,"file":"prompts.d.cts","names":[],"sources":["../../src/utils/prompts.ts"],"mappings":";;;;;;AAoCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,qBAAA,CAAsB,eAAA,EAAiB,eAAA;EACrD,QAAA,EAAU,QAAA,CAAO,IAAA,CAAK,0BAAA;AAAA"}
@@ -2,7 +2,6 @@ import { OpenAI as OpenAI$1 } from "openai";
2
2
  import { BasePromptValue } from "@langchain/core/prompt_values";
3
3
 
4
4
  //#region src/utils/prompts.d.ts
5
-
6
5
  /**
7
6
  * Convert a formatted LangChain prompt (e.g. pulled from the hub) into
8
7
  * a format expected by OpenAI's JS SDK.
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","names":["BasePromptValue","OpenAI","convertPromptToOpenAI","Chat","ChatCompletionMessageParam"],"sources":["../../src/utils/prompts.d.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\nexport declare function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n};\n//# sourceMappingURL=prompts.d.ts.map"],"mappings":";;;;;;;AAiCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAwBE,qBAAAA,kBAAuCF;YACjDC,QAAAA,CAAOE,IAAAA,CAAKC"}
1
+ {"version":3,"file":"prompts.d.ts","names":[],"sources":["../../src/utils/prompts.ts"],"mappings":";;;;;;AAoCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,qBAAA,CAAsB,eAAA,EAAiB,eAAA;EACrD,QAAA,EAAU,QAAA,CAAO,IAAA,CAAK,0BAAA;AAAA"}
@@ -33,8 +33,7 @@ import { convertMessagesToCompletionsMessageParams } from "../converters/complet
33
33
  * @returns A partial OpenAI payload.
34
34
  */
35
35
  function convertPromptToOpenAI(formattedPrompt) {
36
- const messages = formattedPrompt.toChatMessages();
37
- return { messages: convertMessagesToCompletionsMessageParams({ messages }) };
36
+ return { messages: convertMessagesToCompletionsMessageParams({ messages: formattedPrompt.toChatMessages() }) };
38
37
  }
39
38
 
40
39
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","names":["formattedPrompt: BasePromptValue"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\nimport { convertMessagesToCompletionsMessageParams } from \"../converters/completions.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\n// TODO: make this a converter\nexport function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n} {\n const messages = formattedPrompt.toChatMessages();\n return {\n messages: convertMessagesToCompletionsMessageParams({\n messages,\n }) as OpenAI.Chat.ChatCompletionMessageParam[],\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,sBAAsBA,iBAEpC;CACA,MAAM,WAAW,gBAAgB,gBAAgB;AACjD,QAAO,EACL,UAAU,0CAA0C,EAClD,SACD,EAAC,CACH;AACF"}
1
+ {"version":3,"file":"prompts.js","names":[],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport type { OpenAI } from \"openai\";\nimport { convertMessagesToCompletionsMessageParams } from \"../converters/completions.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by OpenAI's JS SDK.\n *\n * Requires the \"@langchain/openai\" package to be installed in addition\n * to the OpenAI SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToOpenAI } from \"langsmith/utils/hub/openai\";\n * import { pull } from \"langchain/hub\";\n *\n * import OpenAI from 'openai';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { messages } = convertPromptToOpenAI(formattedPrompt);\n *\n * const openAIClient = new OpenAI();\n *\n * const openaiResponse = await openAIClient.chat.completions.create({\n * model: \"gpt-4o-mini\",\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial OpenAI payload.\n */\n// TODO: make this a converter\nexport function convertPromptToOpenAI(formattedPrompt: BasePromptValue): {\n messages: OpenAI.Chat.ChatCompletionMessageParam[];\n} {\n const messages = formattedPrompt.toChatMessages();\n return {\n messages: convertMessagesToCompletionsMessageParams({\n messages,\n }) as OpenAI.Chat.ChatCompletionMessageParam[],\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,sBAAsB,iBAEpC;AAEA,QAAO,EACL,UAAU,0CAA0C,EAClD,UAHa,gBAAgB,gBAAgB,EAI9C,CAAC,EACH"}
@@ -1,7 +1,6 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
- const __langchain_core_utils_function_calling = require_rolldown_runtime.__toESM(require("@langchain/core/utils/function_calling"));
3
- const __langchain_core_utils_types = require_rolldown_runtime.__toESM(require("@langchain/core/utils/types"));
4
- const __langchain_core_utils_json_schema = require_rolldown_runtime.__toESM(require("@langchain/core/utils/json_schema"));
1
+ let _langchain_core_utils_function_calling = require("@langchain/core/utils/function_calling");
2
+ let _langchain_core_utils_types = require("@langchain/core/utils/types");
3
+ let _langchain_core_utils_json_schema = require("@langchain/core/utils/json_schema");
5
4
 
6
5
  //#region src/utils/tools.ts
7
6
  /**
@@ -17,7 +16,7 @@ const __langchain_core_utils_json_schema = require_rolldown_runtime.__toESM(requ
17
16
  */
18
17
  function _convertToOpenAITool(tool, fields) {
19
18
  let toolDef;
20
- if ((0, __langchain_core_utils_function_calling.isLangChainTool)(tool)) toolDef = (0, __langchain_core_utils_function_calling.convertToOpenAITool)(tool);
19
+ if ((0, _langchain_core_utils_function_calling.isLangChainTool)(tool)) toolDef = (0, _langchain_core_utils_function_calling.convertToOpenAITool)(tool);
21
20
  else toolDef = tool;
22
21
  if (fields?.strict !== void 0) toolDef.function.strict = fields.strict;
23
22
  return toolDef;
@@ -74,7 +73,7 @@ function formatType(param, indent) {
74
73
  }
75
74
  }
76
75
  function formatToOpenAIToolChoice(toolChoice) {
77
- if (!toolChoice) return void 0;
76
+ if (!toolChoice) return;
78
77
  else if (toolChoice === "any" || toolChoice === "required") return "required";
79
78
  else if (toolChoice === "auto") return "auto";
80
79
  else if (toolChoice === "none") return "none";
@@ -105,7 +104,7 @@ function isOpenAICustomTool(tool) {
105
104
  return "type" in tool && tool.type === "custom" && "custom" in tool && typeof tool.custom === "object" && tool.custom !== null;
106
105
  }
107
106
  function parseCustomToolCall(rawToolCall) {
108
- if (rawToolCall.type !== "custom_tool_call") return void 0;
107
+ if (rawToolCall.type !== "custom_tool_call") return;
109
108
  return {
110
109
  ...rawToolCall,
111
110
  type: "tool_call",
@@ -124,7 +123,7 @@ function parseCustomToolCall(rawToolCall) {
124
123
  * @returns A ComputerToolCall object if valid, undefined otherwise
125
124
  */
126
125
  function parseComputerCall(rawToolCall) {
127
- if (rawToolCall.type !== "computer_call") return void 0;
126
+ if (rawToolCall.type !== "computer_call") return;
128
127
  return {
129
128
  ...rawToolCall,
130
129
  type: "tool_call",
@@ -148,14 +147,13 @@ function isCustomToolCall(toolCall) {
148
147
  }
149
148
  function convertCompletionsCustomTool(tool) {
150
149
  const getFormat = () => {
151
- if (!tool.custom.format) return void 0;
150
+ if (!tool.custom.format) return;
152
151
  if (tool.custom.format.type === "grammar") return {
153
152
  type: "grammar",
154
153
  definition: tool.custom.format.grammar.definition,
155
154
  syntax: tool.custom.format.grammar.syntax
156
155
  };
157
156
  if (tool.custom.format.type === "text") return { type: "text" };
158
- return void 0;
159
157
  };
160
158
  return {
161
159
  type: "custom",
@@ -166,7 +164,7 @@ function convertCompletionsCustomTool(tool) {
166
164
  }
167
165
  function convertResponsesCustomTool(tool) {
168
166
  const getFormat = () => {
169
- if (!tool.format) return void 0;
167
+ if (!tool.format) return;
170
168
  if (tool.format.type === "grammar") return {
171
169
  type: "grammar",
172
170
  grammar: {
@@ -175,7 +173,6 @@ function convertResponsesCustomTool(tool) {
175
173
  }
176
174
  };
177
175
  if (tool.format.type === "text") return { type: "text" };
178
- return void 0;
179
176
  };
180
177
  return {
181
178
  type: "custom",
@@ -1 +1 @@
1
- {"version":3,"file":"tools.cjs","names":["tool: BindToolsInput","fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }","toolDef: OpenAIClient.ChatCompletionTool | undefined","prop: Prop","functions: FunctionDef[]","obj: ObjectProp","indent: number","lines: string[]","param: Prop","toolChoice?: OpenAIToolChoice","tool: ChatOpenAIToolType","tool: unknown","tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined","rawToolCall: Record<string, any>","toolCall: unknown","tool: OpenAIClient.Chat.ChatCompletionCustomTool","tool: OpenAIClient.Responses.CustomTool"],"sources":["../../src/utils/tools.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\n\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport {\n convertToOpenAITool as formatToOpenAITool,\n isLangChainTool,\n} from \"@langchain/core/utils/function_calling\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.ChatCompletionTool {\n let toolDef: OpenAIClient.ChatCompletionTool | undefined;\n\n if (isLangChainTool(tool)) {\n toolDef = formatToOpenAITool(tool);\n } else {\n toolDef = tool as ToolDefinition;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\n\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\n\n// Types representing the OpenAI function definitions. While the OpenAI client library\n// does have types for function definitions, the properties are just Record<string, unknown>,\n// which isn't very useful for type checking this formatting code.\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\n\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\n\ninterface AnyOfProp {\n anyOf: Prop[];\n}\n\ntype Prop = {\n description?: string;\n} & (\n | AnyOfProp\n | ObjectProp\n | {\n type: \"string\";\n enum?: string[];\n }\n | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n }\n | { type: \"boolean\" }\n | { type: \"null\" }\n | {\n type: \"array\";\n items?: Prop;\n }\n);\n\nfunction isAnyOfProp(prop: Prop): prop is AnyOfProp {\n return (\n (prop as AnyOfProp).anyOf !== undefined &&\n Array.isArray((prop as AnyOfProp).anyOf)\n );\n}\n\n// When OpenAI use functions in the prompt, they format them as TypeScript definitions rather than OpenAPI JSON schemas.\n// This function converts the JSON schemas into TypeScript definitions.\nexport function formatFunctionDefinitions(functions: FunctionDef[]) {\n const lines = [\"namespace functions {\", \"\"];\n for (const f of functions) {\n if (f.description) {\n lines.push(`// ${f.description}`);\n }\n if (Object.keys(f.parameters.properties ?? {}).length > 0) {\n lines.push(`type ${f.name} = (_: {`);\n lines.push(formatObjectProperties(f.parameters, 0));\n lines.push(\"}) => any;\");\n } else {\n lines.push(`type ${f.name} = () => any;`);\n }\n lines.push(\"\");\n }\n lines.push(\"} // namespace functions\");\n return lines.join(\"\\n\");\n}\n\n// Format just the properties of an object (not including the surrounding braces)\nfunction formatObjectProperties(obj: ObjectProp, indent: number): string {\n const lines: string[] = [];\n for (const [name, param] of Object.entries(obj.properties ?? {})) {\n if (param.description && indent < 2) {\n lines.push(`// ${param.description}`);\n }\n if (obj.required?.includes(name)) {\n lines.push(`${name}: ${formatType(param, indent)},`);\n } else {\n lines.push(`${name}?: ${formatType(param, indent)},`);\n }\n }\n return lines.map((line) => \" \".repeat(indent) + line).join(\"\\n\");\n}\n\n// Format a single property type\nfunction formatType(param: Prop, indent: number): string {\n if (isAnyOfProp(param)) {\n return param.anyOf.map((v) => formatType(v, indent)).join(\" | \");\n }\n switch (param.type) {\n case \"string\":\n if (param.enum) {\n return param.enum.map((v) => `\"${v}\"`).join(\" | \");\n }\n return \"string\";\n case \"number\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"integer\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return [\"{\", formatObjectProperties(param, indent + 2), \"}\"].join(\"\\n\");\n case \"array\":\n if (param.items) {\n return `${formatType(param.items, indent)}[]`;\n }\n return \"any[]\";\n default:\n return \"\";\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n\nexport type OpenAIToolChoice =\n | OpenAIClient.ChatCompletionToolChoiceOption\n | \"any\"\n | string;\n\nexport type ResponsesToolChoice = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]\n>;\n\nexport type ChatOpenAIToolType =\n | BindToolsInput\n | OpenAIClient.Chat.ChatCompletionTool\n | ResponsesTool;\n\nexport type ResponsesTool = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tools\"]\n>[number];\n\nexport function formatToOpenAIToolChoice(\n toolChoice?: OpenAIToolChoice\n): OpenAIClient.ChatCompletionToolChoiceOption | undefined {\n if (!toolChoice) {\n return undefined;\n } else if (toolChoice === \"any\" || toolChoice === \"required\") {\n return \"required\";\n } else if (toolChoice === \"auto\") {\n return \"auto\";\n } else if (toolChoice === \"none\") {\n return \"none\";\n } else if (typeof toolChoice === \"string\") {\n return {\n type: \"function\",\n function: {\n name: toolChoice,\n },\n };\n } else {\n return toolChoice;\n }\n}\n\nexport function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool {\n return \"type\" in tool && tool.type !== \"function\";\n}\n\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport function hasProviderToolDefinition(\n tool: unknown\n): tool is LangchainToolWithProviderDefinition {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"extras\" in tool &&\n typeof (tool as LangchainToolWithProviderDefinition).extras === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras !== null &&\n \"providerToolDefinition\" in\n (tool as LangchainToolWithProviderDefinition).extras &&\n typeof (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition !== null\n );\n}\n\nexport function isBuiltInToolChoice(\n tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined\n): tool_choice is ResponsesToolChoice {\n return (\n tool_choice != null &&\n typeof tool_choice === \"object\" &&\n \"type\" in tool_choice &&\n tool_choice.type !== \"function\"\n );\n}\n\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\n\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\n\nexport function isCustomTool(tool: unknown): tool is LangchainCustomTool {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"metadata\" in tool &&\n typeof tool.metadata === \"object\" &&\n tool.metadata !== null &&\n \"customTool\" in tool.metadata &&\n typeof tool.metadata.customTool === \"object\" &&\n tool.metadata.customTool !== null\n );\n}\n\nexport function isOpenAICustomTool(\n tool: ChatOpenAIToolType\n): tool is OpenAIClient.Chat.ChatCompletionCustomTool {\n return (\n \"type\" in tool &&\n tool.type === \"custom\" &&\n \"custom\" in tool &&\n typeof tool.custom === \"object\" &&\n tool.custom !== null\n );\n}\n\nexport function parseCustomToolCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): CustomToolCall | undefined {\n if (rawToolCall.type !== \"custom_tool_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: rawToolCall.name,\n isCustomTool: true,\n args: {\n input: rawToolCall.input,\n },\n };\n}\n\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport function parseComputerCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): ComputerToolCall | undefined {\n if (rawToolCall.type !== \"computer_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: \"computer_use\",\n isComputerTool: true,\n args: {\n action: rawToolCall.action,\n },\n };\n}\n\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport function isComputerToolCall(\n toolCall: unknown\n): toolCall is ComputerToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isComputerTool\" in toolCall &&\n toolCall.isComputerTool === true\n );\n}\n\nexport function isCustomToolCall(\n toolCall: unknown\n): toolCall is CustomToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isCustomTool\" in toolCall &&\n toolCall.isCustomTool === true\n );\n}\n\nexport function convertCompletionsCustomTool(\n tool: OpenAIClient.Chat.ChatCompletionCustomTool\n): OpenAIClient.Responses.CustomTool {\n const getFormat = () => {\n if (!tool.custom.format) {\n return undefined;\n }\n if (tool.custom.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n definition: tool.custom.format.grammar.definition,\n syntax: tool.custom.format.grammar.syntax,\n };\n }\n if (tool.custom.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n name: tool.custom.name,\n description: tool.custom.description,\n format: getFormat(),\n };\n}\n\nexport function convertResponsesCustomTool(\n tool: OpenAIClient.Responses.CustomTool\n): OpenAIClient.Chat.ChatCompletionCustomTool {\n const getFormat = () => {\n if (!tool.format) {\n return undefined;\n }\n if (tool.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n grammar: {\n definition: tool.format.definition,\n syntax: tool.format.syntax,\n },\n };\n }\n if (tool.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n custom: {\n name: tool.name,\n description: tool.description,\n format: getFormat(),\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tools.cjs","names":[],"sources":["../../src/utils/tools.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\n\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport {\n convertToOpenAITool as formatToOpenAITool,\n isLangChainTool,\n} from \"@langchain/core/utils/function_calling\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.ChatCompletionTool {\n let toolDef: OpenAIClient.ChatCompletionTool | undefined;\n\n if (isLangChainTool(tool)) {\n toolDef = formatToOpenAITool(tool);\n } else {\n toolDef = tool as ToolDefinition;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\n\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\n\n// Types representing the OpenAI function definitions. While the OpenAI client library\n// does have types for function definitions, the properties are just Record<string, unknown>,\n// which isn't very useful for type checking this formatting code.\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\n\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\n\ninterface AnyOfProp {\n anyOf: Prop[];\n}\n\ntype Prop = {\n description?: string;\n} & (\n | AnyOfProp\n | ObjectProp\n | {\n type: \"string\";\n enum?: string[];\n }\n | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n }\n | { type: \"boolean\" }\n | { type: \"null\" }\n | {\n type: \"array\";\n items?: Prop;\n }\n);\n\nfunction isAnyOfProp(prop: Prop): prop is AnyOfProp {\n return (\n (prop as AnyOfProp).anyOf !== undefined &&\n Array.isArray((prop as AnyOfProp).anyOf)\n );\n}\n\n// When OpenAI use functions in the prompt, they format them as TypeScript definitions rather than OpenAPI JSON schemas.\n// This function converts the JSON schemas into TypeScript definitions.\nexport function formatFunctionDefinitions(functions: FunctionDef[]) {\n const lines = [\"namespace functions {\", \"\"];\n for (const f of functions) {\n if (f.description) {\n lines.push(`// ${f.description}`);\n }\n if (Object.keys(f.parameters.properties ?? {}).length > 0) {\n lines.push(`type ${f.name} = (_: {`);\n lines.push(formatObjectProperties(f.parameters, 0));\n lines.push(\"}) => any;\");\n } else {\n lines.push(`type ${f.name} = () => any;`);\n }\n lines.push(\"\");\n }\n lines.push(\"} // namespace functions\");\n return lines.join(\"\\n\");\n}\n\n// Format just the properties of an object (not including the surrounding braces)\nfunction formatObjectProperties(obj: ObjectProp, indent: number): string {\n const lines: string[] = [];\n for (const [name, param] of Object.entries(obj.properties ?? {})) {\n if (param.description && indent < 2) {\n lines.push(`// ${param.description}`);\n }\n if (obj.required?.includes(name)) {\n lines.push(`${name}: ${formatType(param, indent)},`);\n } else {\n lines.push(`${name}?: ${formatType(param, indent)},`);\n }\n }\n return lines.map((line) => \" \".repeat(indent) + line).join(\"\\n\");\n}\n\n// Format a single property type\nfunction formatType(param: Prop, indent: number): string {\n if (isAnyOfProp(param)) {\n return param.anyOf.map((v) => formatType(v, indent)).join(\" | \");\n }\n switch (param.type) {\n case \"string\":\n if (param.enum) {\n return param.enum.map((v) => `\"${v}\"`).join(\" | \");\n }\n return \"string\";\n case \"number\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"integer\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return [\"{\", formatObjectProperties(param, indent + 2), \"}\"].join(\"\\n\");\n case \"array\":\n if (param.items) {\n return `${formatType(param.items, indent)}[]`;\n }\n return \"any[]\";\n default:\n return \"\";\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n\nexport type OpenAIToolChoice =\n | OpenAIClient.ChatCompletionToolChoiceOption\n | \"any\"\n | string;\n\nexport type ResponsesToolChoice = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]\n>;\n\nexport type ChatOpenAIToolType =\n | BindToolsInput\n | OpenAIClient.Chat.ChatCompletionTool\n | ResponsesTool;\n\nexport type ResponsesTool = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tools\"]\n>[number];\n\nexport function formatToOpenAIToolChoice(\n toolChoice?: OpenAIToolChoice\n): OpenAIClient.ChatCompletionToolChoiceOption | undefined {\n if (!toolChoice) {\n return undefined;\n } else if (toolChoice === \"any\" || toolChoice === \"required\") {\n return \"required\";\n } else if (toolChoice === \"auto\") {\n return \"auto\";\n } else if (toolChoice === \"none\") {\n return \"none\";\n } else if (typeof toolChoice === \"string\") {\n return {\n type: \"function\",\n function: {\n name: toolChoice,\n },\n };\n } else {\n return toolChoice;\n }\n}\n\nexport function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool {\n return \"type\" in tool && tool.type !== \"function\";\n}\n\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport function hasProviderToolDefinition(\n tool: unknown\n): tool is LangchainToolWithProviderDefinition {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"extras\" in tool &&\n typeof (tool as LangchainToolWithProviderDefinition).extras === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras !== null &&\n \"providerToolDefinition\" in\n (tool as LangchainToolWithProviderDefinition).extras &&\n typeof (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition !== null\n );\n}\n\nexport function isBuiltInToolChoice(\n tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined\n): tool_choice is ResponsesToolChoice {\n return (\n tool_choice != null &&\n typeof tool_choice === \"object\" &&\n \"type\" in tool_choice &&\n tool_choice.type !== \"function\"\n );\n}\n\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\n\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\n\nexport function isCustomTool(tool: unknown): tool is LangchainCustomTool {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"metadata\" in tool &&\n typeof tool.metadata === \"object\" &&\n tool.metadata !== null &&\n \"customTool\" in tool.metadata &&\n typeof tool.metadata.customTool === \"object\" &&\n tool.metadata.customTool !== null\n );\n}\n\nexport function isOpenAICustomTool(\n tool: ChatOpenAIToolType\n): tool is OpenAIClient.Chat.ChatCompletionCustomTool {\n return (\n \"type\" in tool &&\n tool.type === \"custom\" &&\n \"custom\" in tool &&\n typeof tool.custom === \"object\" &&\n tool.custom !== null\n );\n}\n\nexport function parseCustomToolCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): CustomToolCall | undefined {\n if (rawToolCall.type !== \"custom_tool_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: rawToolCall.name,\n isCustomTool: true,\n args: {\n input: rawToolCall.input,\n },\n };\n}\n\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport function parseComputerCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): ComputerToolCall | undefined {\n if (rawToolCall.type !== \"computer_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: \"computer_use\",\n isComputerTool: true,\n args: {\n action: rawToolCall.action,\n },\n };\n}\n\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport function isComputerToolCall(\n toolCall: unknown\n): toolCall is ComputerToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isComputerTool\" in toolCall &&\n toolCall.isComputerTool === true\n );\n}\n\nexport function isCustomToolCall(\n toolCall: unknown\n): toolCall is CustomToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isCustomTool\" in toolCall &&\n toolCall.isCustomTool === true\n );\n}\n\nexport function convertCompletionsCustomTool(\n tool: OpenAIClient.Chat.ChatCompletionCustomTool\n): OpenAIClient.Responses.CustomTool {\n const getFormat = () => {\n if (!tool.custom.format) {\n return undefined;\n }\n if (tool.custom.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n definition: tool.custom.format.grammar.definition,\n syntax: tool.custom.format.grammar.syntax,\n };\n }\n if (tool.custom.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n name: tool.custom.name,\n description: tool.custom.description,\n format: getFormat(),\n };\n}\n\nexport function convertResponsesCustomTool(\n tool: OpenAIClient.Responses.CustomTool\n): OpenAIClient.Chat.ChatCompletionCustomTool {\n const getFormat = () => {\n if (!tool.format) {\n return undefined;\n }\n if (tool.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n grammar: {\n definition: tool.format.definition,\n syntax: tool.format.syntax,\n },\n };\n }\n if (tool.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n custom: {\n name: tool.name,\n description: tool.description,\n format: getFormat(),\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAwBA,SAAgB,qBACd,MACA,QAOiC;CACjC,IAAI;AAEJ,iEAAoB,KAAK,CACvB,2EAA6B,KAAK;KAElC,WAAU;AAGZ,KAAI,QAAQ,WAAW,OACrB,SAAQ,SAAS,SAAS,OAAO;AAGnC,QAAO;;AAiDT,SAAS,YAAY,MAA+B;AAClD,QACG,KAAmB,UAAU,UAC9B,MAAM,QAAS,KAAmB,MAAM;;AAM5C,SAAgB,0BAA0B,WAA0B;CAClE,MAAM,QAAQ,CAAC,yBAAyB,GAAG;AAC3C,MAAK,MAAM,KAAK,WAAW;AACzB,MAAI,EAAE,YACJ,OAAM,KAAK,MAAM,EAAE,cAAc;AAEnC,MAAI,OAAO,KAAK,EAAE,WAAW,cAAc,EAAE,CAAC,CAAC,SAAS,GAAG;AACzD,SAAM,KAAK,QAAQ,EAAE,KAAK,UAAU;AACpC,SAAM,KAAK,uBAAuB,EAAE,YAAY,EAAE,CAAC;AACnD,SAAM,KAAK,aAAa;QAExB,OAAM,KAAK,QAAQ,EAAE,KAAK,eAAe;AAE3C,QAAM,KAAK,GAAG;;AAEhB,OAAM,KAAK,2BAA2B;AACtC,QAAO,MAAM,KAAK,KAAK;;AAIzB,SAAS,uBAAuB,KAAiB,QAAwB;CACvE,MAAM,QAAkB,EAAE;AAC1B,MAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,IAAI,cAAc,EAAE,CAAC,EAAE;AAChE,MAAI,MAAM,eAAe,SAAS,EAChC,OAAM,KAAK,MAAM,MAAM,cAAc;AAEvC,MAAI,IAAI,UAAU,SAAS,KAAK,CAC9B,OAAM,KAAK,GAAG,KAAK,IAAI,WAAW,OAAO,OAAO,CAAC,GAAG;MAEpD,OAAM,KAAK,GAAG,KAAK,KAAK,WAAW,OAAO,OAAO,CAAC,GAAG;;AAGzD,QAAO,MAAM,KAAK,SAAS,IAAI,OAAO,OAAO,GAAG,KAAK,CAAC,KAAK,KAAK;;AAIlE,SAAS,WAAW,OAAa,QAAwB;AACvD,KAAI,YAAY,MAAM,CACpB,QAAO,MAAM,MAAM,KAAK,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,KAAK,MAAM;AAElE,SAAQ,MAAM,MAAd;EACE,KAAK;AACH,OAAI,MAAM,KACR,QAAO,MAAM,KAAK,KAAK,MAAM,IAAI,EAAE,GAAG,CAAC,KAAK,MAAM;AAEpD,UAAO;EACT,KAAK;AACH,OAAI,MAAM,KACR,QAAO,MAAM,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,MAAM;AAElD,UAAO;EACT,KAAK;AACH,OAAI,MAAM,KACR,QAAO,MAAM,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,MAAM;AAElD,UAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,SACH,QAAO;GAAC;GAAK,uBAAuB,OAAO,SAAS,EAAE;GAAE;GAAI,CAAC,KAAK,KAAK;EACzE,KAAK;AACH,OAAI,MAAM,MACR,QAAO,GAAG,WAAW,MAAM,OAAO,OAAO,CAAC;AAE5C,UAAO;EACT,QACE,QAAO;;;AAqCb,SAAgB,yBACd,YACyD;AACzD,KAAI,CAAC,WACH;UACS,eAAe,SAAS,eAAe,WAChD,QAAO;UACE,eAAe,OACxB,QAAO;UACE,eAAe,OACxB,QAAO;UACE,OAAO,eAAe,SAC/B,QAAO;EACL,MAAM;EACN,UAAU,EACR,MAAM,YACP;EACF;KAED,QAAO;;AAIX,SAAgB,cAAc,MAAiD;AAC7E,QAAO,UAAU,QAAQ,KAAK,SAAS;;;;;;;AAkBzC,SAAgB,0BACd,MAC6C;AAC7C,QACE,OAAO,SAAS,YAChB,SAAS,QACT,YAAY,QACZ,OAAQ,KAA6C,WAAW,YAC/D,KAA6C,WAAW,QACzD,4BACG,KAA6C,UAChD,OAAQ,KAA6C,OAClD,2BAA2B,YAC7B,KAA6C,OAC3C,2BAA2B;;AAIlC,SAAgB,oBACd,aACoC;AACpC,QACE,eAAe,QACf,OAAO,gBAAgB,YACvB,UAAU,eACV,YAAY,SAAS;;AAezB,SAAgB,aAAa,MAA4C;AACvE,QACE,OAAO,SAAS,YAChB,SAAS,QACT,cAAc,QACd,OAAO,KAAK,aAAa,YACzB,KAAK,aAAa,QAClB,gBAAgB,KAAK,YACrB,OAAO,KAAK,SAAS,eAAe,YACpC,KAAK,SAAS,eAAe;;AAIjC,SAAgB,mBACd,MACoD;AACpD,QACE,UAAU,QACV,KAAK,SAAS,YACd,YAAY,QACZ,OAAO,KAAK,WAAW,YACvB,KAAK,WAAW;;AAIpB,SAAgB,oBAEd,aAC4B;AAC5B,KAAI,YAAY,SAAS,mBACvB;AAEF,QAAO;EACL,GAAG;EACH,MAAM;EACN,SAAS,YAAY;EACrB,IAAI,YAAY;EAChB,MAAM,YAAY;EAClB,cAAc;EACd,MAAM,EACJ,OAAO,YAAY,OACpB;EACF;;;;;;;;;AAkBH,SAAgB,kBAEd,aAC8B;AAC9B,KAAI,YAAY,SAAS,gBACvB;AAEF,QAAO;EACL,GAAG;EACH,MAAM;EACN,SAAS,YAAY;EACrB,IAAI,YAAY;EAChB,MAAM;EACN,gBAAgB;EAChB,MAAM,EACJ,QAAQ,YAAY,QACrB;EACF;;;;;;;AAQH,SAAgB,mBACd,UAC8B;AAC9B,QACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,SAAS,SAAS,eAClB,oBAAoB,YACpB,SAAS,mBAAmB;;AAIhC,SAAgB,iBACd,UAC4B;AAC5B,QACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,SAAS,SAAS,eAClB,kBAAkB,YAClB,SAAS,iBAAiB;;AAI9B,SAAgB,6BACd,MACmC;CACnC,MAAM,kBAAkB;AACtB,MAAI,CAAC,KAAK,OAAO,OACf;AAEF,MAAI,KAAK,OAAO,OAAO,SAAS,UAC9B,QAAO;GACL,MAAM;GACN,YAAY,KAAK,OAAO,OAAO,QAAQ;GACvC,QAAQ,KAAK,OAAO,OAAO,QAAQ;GACpC;AAEH,MAAI,KAAK,OAAO,OAAO,SAAS,OAC9B,QAAO,EACL,MAAM,QACP;;AAIL,QAAO;EACL,MAAM;EACN,MAAM,KAAK,OAAO;EAClB,aAAa,KAAK,OAAO;EACzB,QAAQ,WAAW;EACpB;;AAGH,SAAgB,2BACd,MAC4C;CAC5C,MAAM,kBAAkB;AACtB,MAAI,CAAC,KAAK,OACR;AAEF,MAAI,KAAK,OAAO,SAAS,UACvB,QAAO;GACL,MAAM;GACN,SAAS;IACP,YAAY,KAAK,OAAO;IACxB,QAAQ,KAAK,OAAO;IACrB;GACF;AAEH,MAAI,KAAK,OAAO,SAAS,OACvB,QAAO,EACL,MAAM,QACP;;AAIL,QAAO;EACL,MAAM;EACN,QAAQ;GACN,MAAM,KAAK;GACX,aAAa,KAAK;GAClB,QAAQ,WAAW;GACpB;EACF"}
@@ -3,7 +3,6 @@ import { BindToolsInput } from "@langchain/core/language_models/chat_models";
3
3
  import { DynamicTool } from "@langchain/core/tools";
4
4
 
5
5
  //#region src/utils/tools.d.ts
6
-
7
6
  type OpenAIToolChoice = OpenAI$1.ChatCompletionToolChoiceOption | "any" | string;
8
7
  type ResponsesToolChoice = NonNullable<OpenAI$1.Responses.ResponseCreateParams["tool_choice"]>;
9
8
  type ChatOpenAIToolType = BindToolsInput | OpenAI$1.Chat.ChatCompletionTool | ResponsesTool;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.cts","names":["OpenAI","OpenAIClient","ToolDefinition","BindToolsInput","DynamicTool","StructuredToolInterface","ToolCall","_convertToOpenAITool","ChatCompletionTool","OpenAIFunction","Chat","ChatCompletionCreateParams","Function","FunctionDef","ObjectProp","Omit","Prop","AnyOfProp","formatFunctionDefinitions","formatToOpenAIAssistantTool","OpenAIToolChoice","ChatCompletionToolChoiceOption","ResponsesToolChoice","Responses","ResponseCreateParams","NonNullable","ChatOpenAIToolType","ResponsesTool","formatToOpenAIToolChoice","isBuiltInTool","LangchainToolWithProviderDefinition","hasProviderToolDefinition","isBuiltInToolChoice","CustomToolCall","LangchainCustomTool","CustomTool","isCustomTool","isOpenAICustomTool","ChatCompletionCustomTool","parseCustomToolCall","Record","ComputerToolCall","parseComputerCall","isComputerToolCall","isCustomToolCall","convertCompletionsCustomTool","convertResponsesCustomTool"],"sources":["../../src/utils/tools.d.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport declare function _convertToOpenAITool(tool: BindToolsInput, fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n}): OpenAIClient.ChatCompletionTool;\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\ninterface AnyOfProp {\n anyOf: Prop[];\n}\ntype Prop = {\n description?: string;\n} & (AnyOfProp | ObjectProp | {\n type: \"string\";\n enum?: string[];\n} | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n} | {\n type: \"boolean\";\n} | {\n type: \"null\";\n} | {\n type: \"array\";\n items?: Prop;\n});\nexport declare function formatFunctionDefinitions(functions: FunctionDef[]): string;\nexport declare function formatToOpenAIAssistantTool(tool: StructuredToolInterface): ToolDefinition;\nexport type OpenAIToolChoice = OpenAIClient.ChatCompletionToolChoiceOption | \"any\" | string;\nexport type ResponsesToolChoice = NonNullable<OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]>;\nexport type ChatOpenAIToolType = BindToolsInput | OpenAIClient.Chat.ChatCompletionTool | ResponsesTool;\nexport type ResponsesTool = NonNullable<OpenAIClient.Responses.ResponseCreateParams[\"tools\"]>[number];\nexport declare function formatToOpenAIToolChoice(toolChoice?: OpenAIToolChoice): OpenAIClient.ChatCompletionToolChoiceOption | undefined;\nexport declare function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool;\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport declare function hasProviderToolDefinition(tool: unknown): tool is LangchainToolWithProviderDefinition;\nexport declare function isBuiltInToolChoice(tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined): tool_choice is ResponsesToolChoice;\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\nexport declare function isCustomTool(tool: unknown): tool is LangchainCustomTool;\nexport declare function isOpenAICustomTool(tool: ChatOpenAIToolType): tool is OpenAIClient.Chat.ChatCompletionCustomTool;\nexport declare function parseCustomToolCall(rawToolCall: Record<string, any>): CustomToolCall | undefined;\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport declare function parseComputerCall(rawToolCall: Record<string, any>): ComputerToolCall | undefined;\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport declare function isComputerToolCall(toolCall: unknown): toolCall is ComputerToolCall;\nexport declare function isCustomToolCall(toolCall: unknown): toolCall is CustomToolCall;\nexport declare function convertCompletionsCustomTool(tool: OpenAIClient.Chat.ChatCompletionCustomTool): OpenAIClient.Responses.CustomTool;\nexport declare function convertResponsesCustomTool(tool: OpenAIClient.Responses.CustomTool): OpenAIClient.Chat.ChatCompletionCustomTool;\nexport {};\n//# sourceMappingURL=tools.d.ts.map"],"mappings":";;;;;;KA2DYoB,gBAAAA,GAAmBnB,QAAAA,CAAaoB;KAChCC,mBAAAA,GAAsBG,YAAYxB,QAAAA,CAAasB,SAAAA,CAAUC;KACzDE,kBAAAA,GAAqBvB,iBAAiBF,QAAAA,CAAaS,IAAAA,CAAKF,qBAAqBmB;KAC7EA,aAAAA,GAAgBF,YAAYxB,QAAAA,CAAasB,SAAAA,CAAUC"}
1
+ {"version":3,"file":"tools.d.cts","names":[],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;KA+LY,gBAAA,GACR,QAAA,CAAa,8BAAA;AAAA,KAIL,mBAAA,GAAsB,WAAA,CAChC,QAAA,CAAa,SAAA,CAAU,oBAAA;AAAA,KAGb,kBAAA,GACR,cAAA,GACA,QAAA,CAAa,IAAA,CAAK,kBAAA,GAClB,aAAA;AAAA,KAEQ,aAAA,GAAgB,WAAA,CAC1B,QAAA,CAAa,SAAA,CAAU,oBAAA"}
@@ -4,7 +4,6 @@ import "@langchain/core/language_models/base";
4
4
  import { DynamicTool } from "@langchain/core/tools";
5
5
 
6
6
  //#region src/utils/tools.d.ts
7
-
8
7
  type OpenAIToolChoice = OpenAI$1.ChatCompletionToolChoiceOption | "any" | string;
9
8
  type ResponsesToolChoice = NonNullable<OpenAI$1.Responses.ResponseCreateParams["tool_choice"]>;
10
9
  type ChatOpenAIToolType = BindToolsInput | OpenAI$1.Chat.ChatCompletionTool | ResponsesTool;
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","names":["OpenAI","OpenAIClient","ToolDefinition","BindToolsInput","DynamicTool","StructuredToolInterface","ToolCall","_convertToOpenAITool","ChatCompletionTool","OpenAIFunction","Chat","ChatCompletionCreateParams","Function","FunctionDef","ObjectProp","Omit","Prop","AnyOfProp","formatFunctionDefinitions","formatToOpenAIAssistantTool","OpenAIToolChoice","ChatCompletionToolChoiceOption","ResponsesToolChoice","Responses","ResponseCreateParams","NonNullable","ChatOpenAIToolType","ResponsesTool","formatToOpenAIToolChoice","isBuiltInTool","LangchainToolWithProviderDefinition","hasProviderToolDefinition","isBuiltInToolChoice","CustomToolCall","LangchainCustomTool","CustomTool","isCustomTool","isOpenAICustomTool","ChatCompletionCustomTool","parseCustomToolCall","Record","ComputerToolCall","parseComputerCall","isComputerToolCall","isCustomToolCall","convertCompletionsCustomTool","convertResponsesCustomTool"],"sources":["../../src/utils/tools.d.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport declare function _convertToOpenAITool(tool: BindToolsInput, fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n}): OpenAIClient.ChatCompletionTool;\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\ninterface AnyOfProp {\n anyOf: Prop[];\n}\ntype Prop = {\n description?: string;\n} & (AnyOfProp | ObjectProp | {\n type: \"string\";\n enum?: string[];\n} | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n} | {\n type: \"boolean\";\n} | {\n type: \"null\";\n} | {\n type: \"array\";\n items?: Prop;\n});\nexport declare function formatFunctionDefinitions(functions: FunctionDef[]): string;\nexport declare function formatToOpenAIAssistantTool(tool: StructuredToolInterface): ToolDefinition;\nexport type OpenAIToolChoice = OpenAIClient.ChatCompletionToolChoiceOption | \"any\" | string;\nexport type ResponsesToolChoice = NonNullable<OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]>;\nexport type ChatOpenAIToolType = BindToolsInput | OpenAIClient.Chat.ChatCompletionTool | ResponsesTool;\nexport type ResponsesTool = NonNullable<OpenAIClient.Responses.ResponseCreateParams[\"tools\"]>[number];\nexport declare function formatToOpenAIToolChoice(toolChoice?: OpenAIToolChoice): OpenAIClient.ChatCompletionToolChoiceOption | undefined;\nexport declare function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool;\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport declare function hasProviderToolDefinition(tool: unknown): tool is LangchainToolWithProviderDefinition;\nexport declare function isBuiltInToolChoice(tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined): tool_choice is ResponsesToolChoice;\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\nexport declare function isCustomTool(tool: unknown): tool is LangchainCustomTool;\nexport declare function isOpenAICustomTool(tool: ChatOpenAIToolType): tool is OpenAIClient.Chat.ChatCompletionCustomTool;\nexport declare function parseCustomToolCall(rawToolCall: Record<string, any>): CustomToolCall | undefined;\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport declare function parseComputerCall(rawToolCall: Record<string, any>): ComputerToolCall | undefined;\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport declare function isComputerToolCall(toolCall: unknown): toolCall is ComputerToolCall;\nexport declare function isCustomToolCall(toolCall: unknown): toolCall is CustomToolCall;\nexport declare function convertCompletionsCustomTool(tool: OpenAIClient.Chat.ChatCompletionCustomTool): OpenAIClient.Responses.CustomTool;\nexport declare function convertResponsesCustomTool(tool: OpenAIClient.Responses.CustomTool): OpenAIClient.Chat.ChatCompletionCustomTool;\nexport {};\n//# sourceMappingURL=tools.d.ts.map"],"mappings":";;;;;;;KA2DYoB,gBAAAA,GAAmBnB,QAAAA,CAAaoB;KAChCC,mBAAAA,GAAsBG,YAAYxB,QAAAA,CAAasB,SAAAA,CAAUC;KACzDE,kBAAAA,GAAqBvB,iBAAiBF,QAAAA,CAAaS,IAAAA,CAAKF,qBAAqBmB;KAC7EA,aAAAA,GAAgBF,YAAYxB,QAAAA,CAAasB,SAAAA,CAAUC"}
1
+ {"version":3,"file":"tools.d.ts","names":[],"sources":["../../src/utils/tools.ts"],"mappings":";;;;;;KA+LY,gBAAA,GACR,QAAA,CAAa,8BAAA;AAAA,KAIL,mBAAA,GAAsB,WAAA,CAChC,QAAA,CAAa,SAAA,CAAU,oBAAA;AAAA,KAGb,kBAAA,GACR,cAAA,GACA,QAAA,CAAa,IAAA,CAAK,kBAAA,GAClB,aAAA;AAAA,KAEQ,aAAA,GAAgB,WAAA,CAC1B,QAAA,CAAa,SAAA,CAAU,oBAAA"}
@@ -73,7 +73,7 @@ function formatType(param, indent) {
73
73
  }
74
74
  }
75
75
  function formatToOpenAIToolChoice(toolChoice) {
76
- if (!toolChoice) return void 0;
76
+ if (!toolChoice) return;
77
77
  else if (toolChoice === "any" || toolChoice === "required") return "required";
78
78
  else if (toolChoice === "auto") return "auto";
79
79
  else if (toolChoice === "none") return "none";
@@ -104,7 +104,7 @@ function isOpenAICustomTool(tool) {
104
104
  return "type" in tool && tool.type === "custom" && "custom" in tool && typeof tool.custom === "object" && tool.custom !== null;
105
105
  }
106
106
  function parseCustomToolCall(rawToolCall) {
107
- if (rawToolCall.type !== "custom_tool_call") return void 0;
107
+ if (rawToolCall.type !== "custom_tool_call") return;
108
108
  return {
109
109
  ...rawToolCall,
110
110
  type: "tool_call",
@@ -123,7 +123,7 @@ function parseCustomToolCall(rawToolCall) {
123
123
  * @returns A ComputerToolCall object if valid, undefined otherwise
124
124
  */
125
125
  function parseComputerCall(rawToolCall) {
126
- if (rawToolCall.type !== "computer_call") return void 0;
126
+ if (rawToolCall.type !== "computer_call") return;
127
127
  return {
128
128
  ...rawToolCall,
129
129
  type: "tool_call",
@@ -147,14 +147,13 @@ function isCustomToolCall(toolCall) {
147
147
  }
148
148
  function convertCompletionsCustomTool(tool) {
149
149
  const getFormat = () => {
150
- if (!tool.custom.format) return void 0;
150
+ if (!tool.custom.format) return;
151
151
  if (tool.custom.format.type === "grammar") return {
152
152
  type: "grammar",
153
153
  definition: tool.custom.format.grammar.definition,
154
154
  syntax: tool.custom.format.grammar.syntax
155
155
  };
156
156
  if (tool.custom.format.type === "text") return { type: "text" };
157
- return void 0;
158
157
  };
159
158
  return {
160
159
  type: "custom",
@@ -165,7 +164,7 @@ function convertCompletionsCustomTool(tool) {
165
164
  }
166
165
  function convertResponsesCustomTool(tool) {
167
166
  const getFormat = () => {
168
- if (!tool.format) return void 0;
167
+ if (!tool.format) return;
169
168
  if (tool.format.type === "grammar") return {
170
169
  type: "grammar",
171
170
  grammar: {
@@ -174,7 +173,6 @@ function convertResponsesCustomTool(tool) {
174
173
  }
175
174
  };
176
175
  if (tool.format.type === "text") return { type: "text" };
177
- return void 0;
178
176
  };
179
177
  return {
180
178
  type: "custom",
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","names":["tool: BindToolsInput","fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }","toolDef: OpenAIClient.ChatCompletionTool | undefined","formatToOpenAITool","prop: Prop","functions: FunctionDef[]","obj: ObjectProp","indent: number","lines: string[]","param: Prop","toolChoice?: OpenAIToolChoice","tool: ChatOpenAIToolType","tool: unknown","tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined","rawToolCall: Record<string, any>","toolCall: unknown","tool: OpenAIClient.Chat.ChatCompletionCustomTool","tool: OpenAIClient.Responses.CustomTool"],"sources":["../../src/utils/tools.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\n\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport {\n convertToOpenAITool as formatToOpenAITool,\n isLangChainTool,\n} from \"@langchain/core/utils/function_calling\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.ChatCompletionTool {\n let toolDef: OpenAIClient.ChatCompletionTool | undefined;\n\n if (isLangChainTool(tool)) {\n toolDef = formatToOpenAITool(tool);\n } else {\n toolDef = tool as ToolDefinition;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\n\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\n\n// Types representing the OpenAI function definitions. While the OpenAI client library\n// does have types for function definitions, the properties are just Record<string, unknown>,\n// which isn't very useful for type checking this formatting code.\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\n\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\n\ninterface AnyOfProp {\n anyOf: Prop[];\n}\n\ntype Prop = {\n description?: string;\n} & (\n | AnyOfProp\n | ObjectProp\n | {\n type: \"string\";\n enum?: string[];\n }\n | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n }\n | { type: \"boolean\" }\n | { type: \"null\" }\n | {\n type: \"array\";\n items?: Prop;\n }\n);\n\nfunction isAnyOfProp(prop: Prop): prop is AnyOfProp {\n return (\n (prop as AnyOfProp).anyOf !== undefined &&\n Array.isArray((prop as AnyOfProp).anyOf)\n );\n}\n\n// When OpenAI use functions in the prompt, they format them as TypeScript definitions rather than OpenAPI JSON schemas.\n// This function converts the JSON schemas into TypeScript definitions.\nexport function formatFunctionDefinitions(functions: FunctionDef[]) {\n const lines = [\"namespace functions {\", \"\"];\n for (const f of functions) {\n if (f.description) {\n lines.push(`// ${f.description}`);\n }\n if (Object.keys(f.parameters.properties ?? {}).length > 0) {\n lines.push(`type ${f.name} = (_: {`);\n lines.push(formatObjectProperties(f.parameters, 0));\n lines.push(\"}) => any;\");\n } else {\n lines.push(`type ${f.name} = () => any;`);\n }\n lines.push(\"\");\n }\n lines.push(\"} // namespace functions\");\n return lines.join(\"\\n\");\n}\n\n// Format just the properties of an object (not including the surrounding braces)\nfunction formatObjectProperties(obj: ObjectProp, indent: number): string {\n const lines: string[] = [];\n for (const [name, param] of Object.entries(obj.properties ?? {})) {\n if (param.description && indent < 2) {\n lines.push(`// ${param.description}`);\n }\n if (obj.required?.includes(name)) {\n lines.push(`${name}: ${formatType(param, indent)},`);\n } else {\n lines.push(`${name}?: ${formatType(param, indent)},`);\n }\n }\n return lines.map((line) => \" \".repeat(indent) + line).join(\"\\n\");\n}\n\n// Format a single property type\nfunction formatType(param: Prop, indent: number): string {\n if (isAnyOfProp(param)) {\n return param.anyOf.map((v) => formatType(v, indent)).join(\" | \");\n }\n switch (param.type) {\n case \"string\":\n if (param.enum) {\n return param.enum.map((v) => `\"${v}\"`).join(\" | \");\n }\n return \"string\";\n case \"number\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"integer\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return [\"{\", formatObjectProperties(param, indent + 2), \"}\"].join(\"\\n\");\n case \"array\":\n if (param.items) {\n return `${formatType(param.items, indent)}[]`;\n }\n return \"any[]\";\n default:\n return \"\";\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n\nexport type OpenAIToolChoice =\n | OpenAIClient.ChatCompletionToolChoiceOption\n | \"any\"\n | string;\n\nexport type ResponsesToolChoice = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]\n>;\n\nexport type ChatOpenAIToolType =\n | BindToolsInput\n | OpenAIClient.Chat.ChatCompletionTool\n | ResponsesTool;\n\nexport type ResponsesTool = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tools\"]\n>[number];\n\nexport function formatToOpenAIToolChoice(\n toolChoice?: OpenAIToolChoice\n): OpenAIClient.ChatCompletionToolChoiceOption | undefined {\n if (!toolChoice) {\n return undefined;\n } else if (toolChoice === \"any\" || toolChoice === \"required\") {\n return \"required\";\n } else if (toolChoice === \"auto\") {\n return \"auto\";\n } else if (toolChoice === \"none\") {\n return \"none\";\n } else if (typeof toolChoice === \"string\") {\n return {\n type: \"function\",\n function: {\n name: toolChoice,\n },\n };\n } else {\n return toolChoice;\n }\n}\n\nexport function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool {\n return \"type\" in tool && tool.type !== \"function\";\n}\n\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport function hasProviderToolDefinition(\n tool: unknown\n): tool is LangchainToolWithProviderDefinition {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"extras\" in tool &&\n typeof (tool as LangchainToolWithProviderDefinition).extras === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras !== null &&\n \"providerToolDefinition\" in\n (tool as LangchainToolWithProviderDefinition).extras &&\n typeof (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition !== null\n );\n}\n\nexport function isBuiltInToolChoice(\n tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined\n): tool_choice is ResponsesToolChoice {\n return (\n tool_choice != null &&\n typeof tool_choice === \"object\" &&\n \"type\" in tool_choice &&\n tool_choice.type !== \"function\"\n );\n}\n\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\n\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\n\nexport function isCustomTool(tool: unknown): tool is LangchainCustomTool {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"metadata\" in tool &&\n typeof tool.metadata === \"object\" &&\n tool.metadata !== null &&\n \"customTool\" in tool.metadata &&\n typeof tool.metadata.customTool === \"object\" &&\n tool.metadata.customTool !== null\n );\n}\n\nexport function isOpenAICustomTool(\n tool: ChatOpenAIToolType\n): tool is OpenAIClient.Chat.ChatCompletionCustomTool {\n return (\n \"type\" in tool &&\n tool.type === \"custom\" &&\n \"custom\" in tool &&\n typeof tool.custom === \"object\" &&\n tool.custom !== null\n );\n}\n\nexport function parseCustomToolCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): CustomToolCall | undefined {\n if (rawToolCall.type !== \"custom_tool_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: rawToolCall.name,\n isCustomTool: true,\n args: {\n input: rawToolCall.input,\n },\n };\n}\n\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport function parseComputerCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): ComputerToolCall | undefined {\n if (rawToolCall.type !== \"computer_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: \"computer_use\",\n isComputerTool: true,\n args: {\n action: rawToolCall.action,\n },\n };\n}\n\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport function isComputerToolCall(\n toolCall: unknown\n): toolCall is ComputerToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isComputerTool\" in toolCall &&\n toolCall.isComputerTool === true\n );\n}\n\nexport function isCustomToolCall(\n toolCall: unknown\n): toolCall is CustomToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isCustomTool\" in toolCall &&\n toolCall.isCustomTool === true\n );\n}\n\nexport function convertCompletionsCustomTool(\n tool: OpenAIClient.Chat.ChatCompletionCustomTool\n): OpenAIClient.Responses.CustomTool {\n const getFormat = () => {\n if (!tool.custom.format) {\n return undefined;\n }\n if (tool.custom.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n definition: tool.custom.format.grammar.definition,\n syntax: tool.custom.format.grammar.syntax,\n };\n }\n if (tool.custom.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n name: tool.custom.name,\n description: tool.custom.description,\n format: getFormat(),\n };\n}\n\nexport function convertResponsesCustomTool(\n tool: OpenAIClient.Responses.CustomTool\n): OpenAIClient.Chat.ChatCompletionCustomTool {\n const getFormat = () => {\n if (!tool.format) {\n return undefined;\n }\n if (tool.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n grammar: {\n definition: tool.format.definition,\n syntax: tool.format.syntax,\n },\n };\n }\n if (tool.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n custom: {\n name: tool.name,\n description: tool.description,\n format: getFormat(),\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","names":["formatToOpenAITool"],"sources":["../../src/utils/tools.ts"],"sourcesContent":["import { OpenAI as OpenAIClient } from \"openai\";\n\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { BindToolsInput } from \"@langchain/core/language_models/chat_models\";\nimport {\n convertToOpenAITool as formatToOpenAITool,\n isLangChainTool,\n} from \"@langchain/core/utils/function_calling\";\nimport { DynamicTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\n\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.ChatCompletionTool {\n let toolDef: OpenAIClient.ChatCompletionTool | undefined;\n\n if (isLangChainTool(tool)) {\n toolDef = formatToOpenAITool(tool);\n } else {\n toolDef = tool as ToolDefinition;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\n\ntype OpenAIFunction = OpenAIClient.Chat.ChatCompletionCreateParams.Function;\n\n// Types representing the OpenAI function definitions. While the OpenAI client library\n// does have types for function definitions, the properties are just Record<string, unknown>,\n// which isn't very useful for type checking this formatting code.\nexport interface FunctionDef extends Omit<OpenAIFunction, \"parameters\"> {\n name: string;\n description?: string;\n parameters: ObjectProp;\n}\n\ninterface ObjectProp {\n type: \"object\";\n properties?: {\n [key: string]: Prop;\n };\n required?: string[];\n}\n\ninterface AnyOfProp {\n anyOf: Prop[];\n}\n\ntype Prop = {\n description?: string;\n} & (\n | AnyOfProp\n | ObjectProp\n | {\n type: \"string\";\n enum?: string[];\n }\n | {\n type: \"number\" | \"integer\";\n minimum?: number;\n maximum?: number;\n enum?: number[];\n }\n | { type: \"boolean\" }\n | { type: \"null\" }\n | {\n type: \"array\";\n items?: Prop;\n }\n);\n\nfunction isAnyOfProp(prop: Prop): prop is AnyOfProp {\n return (\n (prop as AnyOfProp).anyOf !== undefined &&\n Array.isArray((prop as AnyOfProp).anyOf)\n );\n}\n\n// When OpenAI use functions in the prompt, they format them as TypeScript definitions rather than OpenAPI JSON schemas.\n// This function converts the JSON schemas into TypeScript definitions.\nexport function formatFunctionDefinitions(functions: FunctionDef[]) {\n const lines = [\"namespace functions {\", \"\"];\n for (const f of functions) {\n if (f.description) {\n lines.push(`// ${f.description}`);\n }\n if (Object.keys(f.parameters.properties ?? {}).length > 0) {\n lines.push(`type ${f.name} = (_: {`);\n lines.push(formatObjectProperties(f.parameters, 0));\n lines.push(\"}) => any;\");\n } else {\n lines.push(`type ${f.name} = () => any;`);\n }\n lines.push(\"\");\n }\n lines.push(\"} // namespace functions\");\n return lines.join(\"\\n\");\n}\n\n// Format just the properties of an object (not including the surrounding braces)\nfunction formatObjectProperties(obj: ObjectProp, indent: number): string {\n const lines: string[] = [];\n for (const [name, param] of Object.entries(obj.properties ?? {})) {\n if (param.description && indent < 2) {\n lines.push(`// ${param.description}`);\n }\n if (obj.required?.includes(name)) {\n lines.push(`${name}: ${formatType(param, indent)},`);\n } else {\n lines.push(`${name}?: ${formatType(param, indent)},`);\n }\n }\n return lines.map((line) => \" \".repeat(indent) + line).join(\"\\n\");\n}\n\n// Format a single property type\nfunction formatType(param: Prop, indent: number): string {\n if (isAnyOfProp(param)) {\n return param.anyOf.map((v) => formatType(v, indent)).join(\" | \");\n }\n switch (param.type) {\n case \"string\":\n if (param.enum) {\n return param.enum.map((v) => `\"${v}\"`).join(\" | \");\n }\n return \"string\";\n case \"number\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"integer\":\n if (param.enum) {\n return param.enum.map((v) => `${v}`).join(\" | \");\n }\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\":\n return [\"{\", formatObjectProperties(param, indent + 2), \"}\"].join(\"\\n\");\n case \"array\":\n if (param.items) {\n return `${formatType(param.items, indent)}[]`;\n }\n return \"any[]\";\n default:\n return \"\";\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n\nexport type OpenAIToolChoice =\n | OpenAIClient.ChatCompletionToolChoiceOption\n | \"any\"\n | string;\n\nexport type ResponsesToolChoice = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tool_choice\"]\n>;\n\nexport type ChatOpenAIToolType =\n | BindToolsInput\n | OpenAIClient.Chat.ChatCompletionTool\n | ResponsesTool;\n\nexport type ResponsesTool = NonNullable<\n OpenAIClient.Responses.ResponseCreateParams[\"tools\"]\n>[number];\n\nexport function formatToOpenAIToolChoice(\n toolChoice?: OpenAIToolChoice\n): OpenAIClient.ChatCompletionToolChoiceOption | undefined {\n if (!toolChoice) {\n return undefined;\n } else if (toolChoice === \"any\" || toolChoice === \"required\") {\n return \"required\";\n } else if (toolChoice === \"auto\") {\n return \"auto\";\n } else if (toolChoice === \"none\") {\n return \"none\";\n } else if (typeof toolChoice === \"string\") {\n return {\n type: \"function\",\n function: {\n name: toolChoice,\n },\n };\n } else {\n return toolChoice;\n }\n}\n\nexport function isBuiltInTool(tool: ChatOpenAIToolType): tool is ResponsesTool {\n return \"type\" in tool && tool.type !== \"function\";\n}\n\n/**\n * Type for LangChain tools that have a provider-specific tool definition\n * stored in extras.providerToolDefinition.\n */\ntype LangchainToolWithProviderDefinition = StructuredToolInterface & {\n extras: {\n providerToolDefinition: ResponsesTool;\n };\n};\n\n/**\n * Checks if a tool has a provider-specific tool definition in extras.providerToolDefinition.\n * This is used for tools like localShell, shell, computerUse, and applyPatch\n * that need to be sent as built-in tool types to the OpenAI API.\n */\nexport function hasProviderToolDefinition(\n tool: unknown\n): tool is LangchainToolWithProviderDefinition {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"extras\" in tool &&\n typeof (tool as LangchainToolWithProviderDefinition).extras === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras !== null &&\n \"providerToolDefinition\" in\n (tool as LangchainToolWithProviderDefinition).extras &&\n typeof (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition === \"object\" &&\n (tool as LangchainToolWithProviderDefinition).extras\n .providerToolDefinition !== null\n );\n}\n\nexport function isBuiltInToolChoice(\n tool_choice: OpenAIToolChoice | ResponsesToolChoice | undefined\n): tool_choice is ResponsesToolChoice {\n return (\n tool_choice != null &&\n typeof tool_choice === \"object\" &&\n \"type\" in tool_choice &&\n tool_choice.type !== \"function\"\n );\n}\n\nexport type CustomToolCall = ToolCall & {\n call_id: string;\n isCustomTool: true;\n};\n\ntype LangchainCustomTool = DynamicTool<string> & {\n metadata: {\n customTool: OpenAIClient.Responses.CustomTool;\n };\n};\n\nexport function isCustomTool(tool: unknown): tool is LangchainCustomTool {\n return (\n typeof tool === \"object\" &&\n tool !== null &&\n \"metadata\" in tool &&\n typeof tool.metadata === \"object\" &&\n tool.metadata !== null &&\n \"customTool\" in tool.metadata &&\n typeof tool.metadata.customTool === \"object\" &&\n tool.metadata.customTool !== null\n );\n}\n\nexport function isOpenAICustomTool(\n tool: ChatOpenAIToolType\n): tool is OpenAIClient.Chat.ChatCompletionCustomTool {\n return (\n \"type\" in tool &&\n tool.type === \"custom\" &&\n \"custom\" in tool &&\n typeof tool.custom === \"object\" &&\n tool.custom !== null\n );\n}\n\nexport function parseCustomToolCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): CustomToolCall | undefined {\n if (rawToolCall.type !== \"custom_tool_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: rawToolCall.name,\n isCustomTool: true,\n args: {\n input: rawToolCall.input,\n },\n };\n}\n\nexport type ComputerToolCall = ToolCall & {\n call_id: string;\n /**\n * marker to indicate that the tool call is a computer tool call\n */\n isComputerTool: true;\n};\n\n/**\n * Parses a computer_call output item from the OpenAI Responses API\n * into a ToolCall format that can be processed by the ToolNode.\n *\n * @param rawToolCall - The raw computer_call output item from the API\n * @returns A ComputerToolCall object if valid, undefined otherwise\n */\nexport function parseComputerCall(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawToolCall: Record<string, any>\n): ComputerToolCall | undefined {\n if (rawToolCall.type !== \"computer_call\") {\n return undefined;\n }\n return {\n ...rawToolCall,\n type: \"tool_call\",\n call_id: rawToolCall.id,\n id: rawToolCall.call_id,\n name: \"computer_use\",\n isComputerTool: true,\n args: {\n action: rawToolCall.action,\n },\n };\n}\n\n/**\n * Checks if a tool call is a computer tool call.\n * @param toolCall - The tool call to check.\n * @returns True if the tool call is a computer tool call, false otherwise.\n */\nexport function isComputerToolCall(\n toolCall: unknown\n): toolCall is ComputerToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isComputerTool\" in toolCall &&\n toolCall.isComputerTool === true\n );\n}\n\nexport function isCustomToolCall(\n toolCall: unknown\n): toolCall is CustomToolCall {\n return (\n typeof toolCall === \"object\" &&\n toolCall !== null &&\n \"type\" in toolCall &&\n toolCall.type === \"tool_call\" &&\n \"isCustomTool\" in toolCall &&\n toolCall.isCustomTool === true\n );\n}\n\nexport function convertCompletionsCustomTool(\n tool: OpenAIClient.Chat.ChatCompletionCustomTool\n): OpenAIClient.Responses.CustomTool {\n const getFormat = () => {\n if (!tool.custom.format) {\n return undefined;\n }\n if (tool.custom.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n definition: tool.custom.format.grammar.definition,\n syntax: tool.custom.format.grammar.syntax,\n };\n }\n if (tool.custom.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n name: tool.custom.name,\n description: tool.custom.description,\n format: getFormat(),\n };\n}\n\nexport function convertResponsesCustomTool(\n tool: OpenAIClient.Responses.CustomTool\n): OpenAIClient.Chat.ChatCompletionCustomTool {\n const getFormat = () => {\n if (!tool.format) {\n return undefined;\n }\n if (tool.format.type === \"grammar\") {\n return {\n type: \"grammar\" as const,\n grammar: {\n definition: tool.format.definition,\n syntax: tool.format.syntax,\n },\n };\n }\n if (tool.format.type === \"text\") {\n return {\n type: \"text\" as const,\n };\n }\n return undefined;\n };\n return {\n type: \"custom\",\n custom: {\n name: tool.name,\n description: tool.description,\n format: getFormat(),\n },\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/openai",
3
- "version": "1.2.7",
3
+ "version": "1.2.8-dev-1771365493298",
4
4
  "description": "OpenAI integrations for LangChain.js",
5
5
  "author": "LangChain",
6
6
  "license": "MIT",
@@ -19,13 +19,13 @@
19
19
  "zod": "^3.25.76 || ^4"
20
20
  },
21
21
  "peerDependencies": {
22
- "@langchain/core": "^1.0.0"
22
+ "@langchain/core": "1.1.25-dev-1771365493298"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@azure/identity": "^4.2.1",
26
26
  "@cfworker/json-schema": "^4.1.1",
27
27
  "@tsconfig/recommended": "^1.0.10",
28
- "@types/node": "^24.10.1",
28
+ "@types/node": "^25.2.3",
29
29
  "@vitest/coverage-v8": "^3.2.4",
30
30
  "dotenv": "^17.2.1",
31
31
  "dpdm": "^3.14.0",
@@ -36,10 +36,10 @@
36
36
  "uuid": "^11.1.0",
37
37
  "vitest": "^3.2.4",
38
38
  "zod-to-json-schema": "^3.24.6",
39
- "@langchain/core": "^1.1.21",
40
39
  "@langchain/eslint": "0.1.1",
41
40
  "@langchain/standard-tests": "0.0.23",
42
- "@langchain/tsconfig": "0.0.1"
41
+ "@langchain/tsconfig": "0.0.1",
42
+ "@langchain/core": "^1.1.25-dev-1771365493298"
43
43
  },
44
44
  "publishConfig": {
45
45
  "access": "public"
@@ -1,25 +0,0 @@
1
- //#region rolldown:runtime
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
- key = keys[i];
11
- if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
- get: ((k) => from[k]).bind(null, key),
13
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
- });
15
- }
16
- return to;
17
- };
18
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
19
- value: mod,
20
- enumerable: true
21
- }) : target, mod));
22
-
23
- //#endregion
24
-
25
- exports.__toESM = __toESM;