@langchain/classic 1.0.45 → 1.0.47-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/_virtual/_rolldown/runtime.cjs +1 -1
  3. package/dist/agents/agent.cjs.map +1 -1
  4. package/dist/agents/chat/index.cjs +2 -1
  5. package/dist/agents/chat/index.cjs.map +1 -1
  6. package/dist/agents/chat/index.js +2 -1
  7. package/dist/agents/chat/index.js.map +1 -1
  8. package/dist/agents/chat_convo/index.cjs +7 -5
  9. package/dist/agents/chat_convo/index.cjs.map +1 -1
  10. package/dist/agents/chat_convo/index.js +7 -5
  11. package/dist/agents/chat_convo/index.js.map +1 -1
  12. package/dist/agents/chat_convo/outputParser.cjs.map +1 -1
  13. package/dist/agents/executor.cjs +22 -19
  14. package/dist/agents/executor.cjs.map +1 -1
  15. package/dist/agents/executor.js +22 -19
  16. package/dist/agents/executor.js.map +1 -1
  17. package/dist/agents/format_scratchpad/log_to_message.cjs.map +1 -1
  18. package/dist/agents/format_scratchpad/openai_functions.cjs.map +1 -1
  19. package/dist/agents/mrkl/index.cjs +9 -6
  20. package/dist/agents/mrkl/index.cjs.map +1 -1
  21. package/dist/agents/mrkl/index.js +9 -6
  22. package/dist/agents/mrkl/index.js.map +1 -1
  23. package/dist/agents/mrkl/outputParser.d.ts +1 -1
  24. package/dist/agents/openai_functions/index.cjs +2 -1
  25. package/dist/agents/openai_functions/index.cjs.map +1 -1
  26. package/dist/agents/openai_functions/index.js +2 -1
  27. package/dist/agents/openai_functions/index.js.map +1 -1
  28. package/dist/agents/openai_functions/output_parser.cjs.map +1 -1
  29. package/dist/agents/openai_tools/index.cjs.map +1 -1
  30. package/dist/agents/openai_tools/output_parser.cjs.map +1 -1
  31. package/dist/agents/react/output_parser.cjs.map +1 -1
  32. package/dist/agents/structured_chat/index.cjs +6 -5
  33. package/dist/agents/structured_chat/index.cjs.map +1 -1
  34. package/dist/agents/structured_chat/index.js +6 -5
  35. package/dist/agents/structured_chat/index.js.map +1 -1
  36. package/dist/agents/structured_chat/outputParser.cjs.map +1 -1
  37. package/dist/agents/tool_calling/output_parser.cjs.map +1 -1
  38. package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.cjs.map +1 -1
  39. package/dist/agents/toolkits/conversational_retrieval/tool.cjs +2 -1
  40. package/dist/agents/toolkits/conversational_retrieval/tool.cjs.map +1 -1
  41. package/dist/agents/toolkits/conversational_retrieval/tool.js +2 -1
  42. package/dist/agents/toolkits/conversational_retrieval/tool.js.map +1 -1
  43. package/dist/agents/toolkits/json/json.cjs +10 -8
  44. package/dist/agents/toolkits/json/json.cjs.map +1 -1
  45. package/dist/agents/toolkits/json/json.js +10 -8
  46. package/dist/agents/toolkits/json/json.js.map +1 -1
  47. package/dist/agents/toolkits/openapi/openapi.cjs +12 -9
  48. package/dist/agents/toolkits/openapi/openapi.cjs.map +1 -1
  49. package/dist/agents/toolkits/openapi/openapi.js +12 -9
  50. package/dist/agents/toolkits/openapi/openapi.js.map +1 -1
  51. package/dist/agents/toolkits/sql/sql.cjs +10 -8
  52. package/dist/agents/toolkits/sql/sql.cjs.map +1 -1
  53. package/dist/agents/toolkits/sql/sql.js +10 -8
  54. package/dist/agents/toolkits/sql/sql.js.map +1 -1
  55. package/dist/agents/toolkits/vectorstore/vectorstore.cjs +20 -16
  56. package/dist/agents/toolkits/vectorstore/vectorstore.cjs.map +1 -1
  57. package/dist/agents/toolkits/vectorstore/vectorstore.js +20 -16
  58. package/dist/agents/toolkits/vectorstore/vectorstore.js.map +1 -1
  59. package/dist/agents/xml/index.cjs +2 -1
  60. package/dist/agents/xml/index.cjs.map +1 -1
  61. package/dist/agents/xml/index.js +2 -1
  62. package/dist/agents/xml/index.js.map +1 -1
  63. package/dist/chains/base.cjs.map +1 -1
  64. package/dist/chains/chat_vector_db_chain.cjs +2 -1
  65. package/dist/chains/chat_vector_db_chain.cjs.map +1 -1
  66. package/dist/chains/chat_vector_db_chain.js +2 -1
  67. package/dist/chains/chat_vector_db_chain.js.map +1 -1
  68. package/dist/chains/conversational_retrieval_chain.cjs +2 -1
  69. package/dist/chains/conversational_retrieval_chain.cjs.map +1 -1
  70. package/dist/chains/conversational_retrieval_chain.js +2 -1
  71. package/dist/chains/conversational_retrieval_chain.js.map +1 -1
  72. package/dist/chains/openai_functions/base.cjs.map +1 -1
  73. package/dist/chains/openai_functions/extraction.cjs.map +1 -1
  74. package/dist/chains/openai_functions/openapi.cjs +9 -8
  75. package/dist/chains/openai_functions/openapi.cjs.map +1 -1
  76. package/dist/chains/openai_functions/openapi.js +9 -8
  77. package/dist/chains/openai_functions/openapi.js.map +1 -1
  78. package/dist/chains/openai_functions/tagging.cjs.map +1 -1
  79. package/dist/chains/openai_moderation.cjs.map +1 -1
  80. package/dist/chains/query_constructor/index.cjs +15 -9
  81. package/dist/chains/query_constructor/index.cjs.map +1 -1
  82. package/dist/chains/query_constructor/index.js +15 -9
  83. package/dist/chains/query_constructor/index.js.map +1 -1
  84. package/dist/chains/query_constructor/parser.cjs +12 -6
  85. package/dist/chains/query_constructor/parser.cjs.map +1 -1
  86. package/dist/chains/query_constructor/parser.js +12 -6
  87. package/dist/chains/query_constructor/parser.js.map +1 -1
  88. package/dist/chains/question_answering/load.cjs +35 -29
  89. package/dist/chains/question_answering/load.cjs.map +1 -1
  90. package/dist/chains/question_answering/load.js +35 -29
  91. package/dist/chains/question_answering/load.js.map +1 -1
  92. package/dist/chains/router/multi_prompt.cjs +5 -3
  93. package/dist/chains/router/multi_prompt.cjs.map +1 -1
  94. package/dist/chains/router/multi_prompt.js +5 -3
  95. package/dist/chains/router/multi_prompt.js.map +1 -1
  96. package/dist/chains/router/multi_retrieval_qa.cjs +18 -11
  97. package/dist/chains/router/multi_retrieval_qa.cjs.map +1 -1
  98. package/dist/chains/router/multi_retrieval_qa.js +18 -11
  99. package/dist/chains/router/multi_retrieval_qa.js.map +1 -1
  100. package/dist/chains/sequential_chain.cjs +6 -5
  101. package/dist/chains/sequential_chain.cjs.map +1 -1
  102. package/dist/chains/sequential_chain.js +6 -5
  103. package/dist/chains/sequential_chain.js.map +1 -1
  104. package/dist/chains/sql_db/sql_db_chain.cjs +2 -1
  105. package/dist/chains/sql_db/sql_db_chain.cjs.map +1 -1
  106. package/dist/chains/sql_db/sql_db_chain.js +2 -1
  107. package/dist/chains/sql_db/sql_db_chain.js.map +1 -1
  108. package/dist/chains/summarization/load.cjs +35 -29
  109. package/dist/chains/summarization/load.cjs.map +1 -1
  110. package/dist/chains/summarization/load.js +35 -29
  111. package/dist/chains/summarization/load.js.map +1 -1
  112. package/dist/chat_models/universal.cjs +12 -10
  113. package/dist/chat_models/universal.cjs.map +1 -1
  114. package/dist/chat_models/universal.js +12 -10
  115. package/dist/chat_models/universal.js.map +1 -1
  116. package/dist/document_loaders/fs/buffer.cjs.map +1 -1
  117. package/dist/document_loaders/fs/directory.cjs.map +1 -1
  118. package/dist/document_loaders/fs/multi_file.cjs.map +1 -1
  119. package/dist/document_loaders/fs/text.cjs.map +1 -1
  120. package/dist/document_transformers/openai_functions.cjs.map +1 -1
  121. package/dist/embeddings/cache_backed.cjs.map +1 -1
  122. package/dist/evaluation/comparison/pairwise.cjs +4 -2
  123. package/dist/evaluation/comparison/pairwise.cjs.map +1 -1
  124. package/dist/evaluation/comparison/pairwise.js +4 -2
  125. package/dist/evaluation/comparison/pairwise.js.map +1 -1
  126. package/dist/evaluation/criteria/criteria.cjs +4 -2
  127. package/dist/evaluation/criteria/criteria.cjs.map +1 -1
  128. package/dist/evaluation/criteria/criteria.js +4 -2
  129. package/dist/evaluation/criteria/criteria.js.map +1 -1
  130. package/dist/experimental/autogpt/agent.cjs +8 -7
  131. package/dist/experimental/autogpt/agent.cjs.map +1 -1
  132. package/dist/experimental/autogpt/agent.js +8 -7
  133. package/dist/experimental/autogpt/agent.js.map +1 -1
  134. package/dist/experimental/autogpt/prompt.cjs +2 -1
  135. package/dist/experimental/autogpt/prompt.cjs.map +1 -1
  136. package/dist/experimental/autogpt/prompt.js +2 -1
  137. package/dist/experimental/autogpt/prompt.js.map +1 -1
  138. package/dist/experimental/autogpt/prompt_generator.cjs.map +1 -1
  139. package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.cjs.map +1 -1
  140. package/dist/experimental/openai_assistant/index.cjs.map +1 -1
  141. package/dist/experimental/plan_and_execute/agent_executor.cjs +3 -2
  142. package/dist/experimental/plan_and_execute/agent_executor.cjs.map +1 -1
  143. package/dist/experimental/plan_and_execute/agent_executor.js +3 -2
  144. package/dist/experimental/plan_and_execute/agent_executor.js.map +1 -1
  145. package/dist/hub/base.cjs.map +1 -1
  146. package/dist/hub/base.js.map +1 -1
  147. package/dist/hub/index.cjs +2 -1
  148. package/dist/hub/index.cjs.map +1 -1
  149. package/dist/hub/index.js +2 -1
  150. package/dist/hub/index.js.map +1 -1
  151. package/dist/hub/node.cjs +4 -2
  152. package/dist/hub/node.cjs.map +1 -1
  153. package/dist/hub/node.js +4 -2
  154. package/dist/hub/node.js.map +1 -1
  155. package/dist/load/index.cjs.map +1 -1
  156. package/dist/memory/buffer_memory.cjs.map +1 -1
  157. package/dist/memory/buffer_token_memory.cjs.map +1 -1
  158. package/dist/memory/buffer_window_memory.cjs.map +1 -1
  159. package/dist/memory/chat_memory.cjs.map +1 -1
  160. package/dist/memory/entity_memory.cjs +2 -1
  161. package/dist/memory/entity_memory.cjs.map +1 -1
  162. package/dist/memory/entity_memory.js +2 -1
  163. package/dist/memory/entity_memory.js.map +1 -1
  164. package/dist/memory/summary.cjs.map +1 -1
  165. package/dist/memory/summary_buffer.cjs.map +1 -1
  166. package/dist/memory/vector_store.cjs.map +1 -1
  167. package/dist/output_parsers/fix.cjs +2 -1
  168. package/dist/output_parsers/fix.cjs.map +1 -1
  169. package/dist/output_parsers/fix.js +2 -1
  170. package/dist/output_parsers/fix.js.map +1 -1
  171. package/dist/output_parsers/openai_functions.cjs.map +1 -1
  172. package/dist/output_parsers/structured.cjs.map +1 -1
  173. package/dist/retrievers/document_compressors/chain_extract.cjs +2 -1
  174. package/dist/retrievers/document_compressors/chain_extract.cjs.map +1 -1
  175. package/dist/retrievers/document_compressors/chain_extract.js +2 -1
  176. package/dist/retrievers/document_compressors/chain_extract.js.map +1 -1
  177. package/dist/retrievers/matryoshka_retriever.cjs.map +1 -1
  178. package/dist/retrievers/multi_query.cjs +2 -1
  179. package/dist/retrievers/multi_query.cjs.map +1 -1
  180. package/dist/retrievers/multi_query.js +2 -1
  181. package/dist/retrievers/multi_query.js.map +1 -1
  182. package/dist/smith/runner_utils.cjs.map +1 -1
  183. package/dist/stores/file/node.cjs.map +1 -1
  184. package/dist/tools/render.cjs.map +1 -1
  185. package/dist/tools/retriever.cjs +2 -1
  186. package/dist/tools/retriever.cjs.map +1 -1
  187. package/dist/tools/retriever.js +2 -1
  188. package/dist/tools/retriever.js.map +1 -1
  189. package/dist/tools/webbrowser.cjs +2 -1
  190. package/dist/tools/webbrowser.cjs.map +1 -1
  191. package/dist/tools/webbrowser.js +2 -1
  192. package/dist/tools/webbrowser.js.map +1 -1
  193. package/dist/util/hub.cjs.map +1 -1
  194. package/dist/vectorstores/memory.cjs +2 -1
  195. package/dist/vectorstores/memory.cjs.map +1 -1
  196. package/dist/vectorstores/memory.js +2 -1
  197. package/dist/vectorstores/memory.js.map +1 -1
  198. package/package.json +45 -45
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.cjs","names":["OpenAPISpec","BaseChain","ChatPromptTemplate","HumanMessagePromptTemplate","LLMChain","JsonOutputFunctionsParser","SequentialChain"],"sources":["../../../src/chains/openai_functions/openapi.ts"],"sourcesContent":["import type { OpenAIClient } from \"@langchain/openai\";\nimport {\n type JsonSchema7ObjectType,\n type JsonSchema7ArrayType,\n type JsonSchema7Type,\n} from \"@langchain/core/utils/json_schema\";\nimport type { OpenAPIV3_1 } from \"openapi-types\";\n\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { BaseFunctionCallOptions } from \"@langchain/core/language_models/base\";\nimport {\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n BasePromptTemplate,\n} from \"@langchain/core/prompts\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { OpenAPISpec } from \"../../util/openapi.js\";\nimport { BaseChain } from \"../base.js\";\nimport { LLMChain, LLMChainInput } from \"../llm_chain.js\";\nimport { SequentialChain } from \"../sequential_chain.js\";\nimport { JsonOutputFunctionsParser } from \"../../output_parsers/openai_functions.js\";\n\n/**\n * Type representing a function for executing OpenAPI requests.\n */\ntype OpenAPIExecutionMethod = (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>,\n options?: {\n headers?: Record<string, string>;\n params?: Record<string, string>;\n }\n) => Promise<string>;\n\n/**\n * Type representing the composition types of a schema.\n */\ntype CompositionType = \"anyOf\" | \"allOf\" | \"oneOf\";\n\n/**\n * Gets the composition type of a schema if it exists.\n * @param schema\n * @returns The composition type of the schema if it exists.\n */\nfunction getCompositionType(\n schema: OpenAPIV3_1.SchemaObject\n): CompositionType | undefined {\n if (schema.anyOf !== undefined) {\n return \"anyOf\";\n }\n if (schema.allOf !== undefined) {\n return \"allOf\";\n }\n if (schema.oneOf !== undefined) {\n return \"oneOf\";\n }\n return undefined;\n}\n\n/**\n * Formats a URL by replacing path parameters with their corresponding\n * values.\n * @param url The URL to format.\n * @param pathParams The path parameters to replace in the URL.\n * @returns The formatted URL.\n */\nfunction formatURL(url: string, pathParams: Record<string, string>): string {\n const expectedPathParamNames = [...url.matchAll(/{(.*?)}/g)].map(\n (match) => match[1]\n );\n const newParams: Record<string, string> = {};\n for (const paramName of expectedPathParamNames) {\n const cleanParamName = paramName.replace(/^\\.;/, \"\").replace(/\\*$/, \"\");\n const value = pathParams[cleanParamName];\n let formattedValue;\n if (Array.isArray(value)) {\n if (paramName.startsWith(\".\")) {\n const separator = paramName.endsWith(\"*\") ? \".\" : \",\";\n formattedValue = `.${value.join(separator)}`;\n } else if (paramName.startsWith(\",\")) {\n const separator = paramName.endsWith(\"*\") ? `${cleanParamName}=` : \",\";\n formattedValue = `${cleanParamName}=${value.join(separator)}`;\n } else {\n formattedValue = value.join(\",\");\n }\n } else if (typeof value === \"object\") {\n const kvSeparator = paramName.endsWith(\"*\") ? \"=\" : \",\";\n const kvStrings = Object.entries(value).map(\n ([k, v]) => k + kvSeparator + v\n );\n let entrySeparator;\n if (paramName.startsWith(\".\")) {\n entrySeparator = \".\";\n formattedValue = \".\";\n } else if (paramName.startsWith(\";\")) {\n entrySeparator = \";\";\n formattedValue = \";\";\n } else {\n entrySeparator = \",\";\n formattedValue = \"\";\n }\n formattedValue += kvStrings.join(entrySeparator);\n } else {\n if (paramName.startsWith(\".\")) {\n formattedValue = `.${value}`;\n } else if (paramName.startsWith(\";\")) {\n formattedValue = `;${cleanParamName}=${value}`;\n } else {\n formattedValue = value;\n }\n }\n newParams[paramName] = formattedValue;\n }\n let formattedUrl = url;\n for (const [key, newValue] of Object.entries(newParams)) {\n formattedUrl = formattedUrl.replace(`{${key}}`, newValue);\n }\n return formattedUrl;\n}\n\n/**\n * Converts OpenAPI parameters to JSON schema format.\n * @param params The OpenAPI parameters to convert.\n * @param spec The OpenAPI specification that contains the parameters.\n * @returns The JSON schema representation of the OpenAPI parameters.\n */\nfunction convertOpenAPIParamsToJSONSchema(\n params: OpenAPIV3_1.ParameterObject[],\n spec: OpenAPISpec\n) {\n return params.reduce(\n (jsonSchema: JsonSchema7ObjectType, param) => {\n let schema;\n if (param.schema) {\n schema = spec.getSchema(param.schema);\n jsonSchema.properties[param.name] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n );\n } else if (param.content) {\n const mediaTypeSchema = Object.values(param.content)[0].schema;\n if (mediaTypeSchema) {\n schema = spec.getSchema(mediaTypeSchema);\n }\n if (!schema) {\n return jsonSchema;\n }\n if (schema.description === undefined) {\n schema.description = param.description ?? \"\";\n }\n jsonSchema.properties[param.name] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n );\n } else {\n return jsonSchema;\n }\n if (param.required && Array.isArray(jsonSchema.required)) {\n jsonSchema.required.push(param.name);\n }\n return jsonSchema;\n },\n {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: {},\n }\n );\n}\n\n// OpenAI throws errors on extraneous schema properties, e.g. if \"required\" is set on individual ones\n/**\n * Converts OpenAPI schemas to JSON schema format.\n * @param schema The OpenAPI schema to convert.\n * @param spec The OpenAPI specification that contains the schema.\n * @returns The JSON schema representation of the OpenAPI schema.\n */\nexport function convertOpenAPISchemaToJSONSchema(\n schema: OpenAPIV3_1.SchemaObject,\n spec: OpenAPISpec\n): JsonSchema7Type {\n const compositionType = getCompositionType(schema);\n if (compositionType !== undefined && schema[compositionType] !== undefined) {\n return {\n [compositionType]: schema[compositionType].map((s) =>\n convertOpenAPISchemaToJSONSchema(spec.getSchema(s), spec)\n ),\n } as JsonSchema7Type;\n }\n\n if (schema.type === \"object\") {\n return Object.keys(schema.properties ?? {}).reduce(\n (jsonSchema: JsonSchema7ObjectType, propertyName) => {\n if (!schema.properties) {\n return jsonSchema;\n }\n const openAPIProperty = spec.getSchema(schema.properties[propertyName]);\n if (openAPIProperty.type === undefined) {\n return jsonSchema;\n }\n jsonSchema.properties[propertyName] = convertOpenAPISchemaToJSONSchema(\n openAPIProperty,\n spec\n );\n if (\n schema.required?.includes(propertyName) &&\n jsonSchema.required !== undefined\n ) {\n jsonSchema.required.push(propertyName);\n }\n return jsonSchema;\n },\n {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: {},\n }\n );\n }\n\n if (schema.type === \"array\") {\n const openAPIItems = spec.getSchema(schema.items ?? {});\n return {\n type: \"array\",\n items: convertOpenAPISchemaToJSONSchema(openAPIItems, spec),\n minItems: schema.minItems,\n maxItems: schema.maxItems,\n } as JsonSchema7ArrayType;\n }\n return {\n type: schema.type ?? \"string\",\n } as JsonSchema7Type;\n}\n\n/**\n * Converts an OpenAPI specification to OpenAI functions.\n * @param spec The OpenAPI specification to convert.\n * @returns An object containing the OpenAI functions derived from the OpenAPI specification and a default execution method.\n */\nexport function convertOpenAPISpecToOpenAIFunctions(spec: OpenAPISpec): {\n openAIFunctions: OpenAIClient.Chat.ChatCompletionCreateParams.Function[];\n defaultExecutionMethod?: OpenAPIExecutionMethod;\n} {\n if (!spec.document.paths) {\n return { openAIFunctions: [] };\n }\n const openAIFunctions = [];\n const nameToCallMap: Record<string, { method: string; url: string }> = {};\n for (const path of Object.keys(spec.document.paths)) {\n const pathParameters = spec.getParametersForPath(path);\n for (const method of spec.getMethodsForPath(path)) {\n const operation = spec.getOperation(path, method);\n if (!operation) {\n return { openAIFunctions: [] };\n }\n const operationParametersByLocation = pathParameters\n .concat(spec.getParametersForOperation(operation))\n .reduce(\n (\n operationParams: Record<string, OpenAPIV3_1.ParameterObject[]>,\n param\n ) => {\n if (!operationParams[param.in]) {\n operationParams[param.in] = [];\n }\n operationParams[param.in].push(param);\n return operationParams;\n },\n {}\n );\n const paramLocationToRequestArgNameMap: Record<string, string> = {\n query: \"params\",\n header: \"headers\",\n cookie: \"cookies\",\n path: \"path_params\",\n };\n const requestArgsSchema: Record<string, JsonSchema7ObjectType> & {\n data?:\n | JsonSchema7ObjectType\n | {\n anyOf?: JsonSchema7ObjectType[];\n };\n } = {};\n for (const paramLocation of Object.keys(\n paramLocationToRequestArgNameMap\n )) {\n if (operationParametersByLocation[paramLocation]) {\n requestArgsSchema[paramLocationToRequestArgNameMap[paramLocation]] =\n convertOpenAPIParamsToJSONSchema(\n operationParametersByLocation[paramLocation],\n spec\n );\n }\n }\n const requestBody = spec.getRequestBodyForOperation(operation);\n if (requestBody?.content !== undefined) {\n const requestBodySchemas: Record<string, JsonSchema7ObjectType> = {};\n for (const [mediaType, mediaTypeObject] of Object.entries(\n requestBody.content\n )) {\n if (mediaTypeObject.schema !== undefined) {\n const schema = spec.getSchema(mediaTypeObject.schema);\n requestBodySchemas[mediaType] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n ) as JsonSchema7ObjectType;\n }\n }\n const mediaTypes = Object.keys(requestBodySchemas);\n if (mediaTypes.length === 1) {\n requestArgsSchema.data = requestBodySchemas[mediaTypes[0]];\n } else if (mediaTypes.length > 1) {\n requestArgsSchema.data = {\n anyOf: Object.values(requestBodySchemas),\n };\n }\n }\n const openAIFunction: OpenAIClient.Chat.ChatCompletionCreateParams.Function =\n {\n name: OpenAPISpec.getCleanedOperationId(operation, path, method),\n description: operation.description ?? operation.summary ?? \"\",\n parameters: {\n type: \"object\",\n properties: requestArgsSchema,\n // All remaining top-level parameters are required\n required: Object.keys(requestArgsSchema),\n },\n };\n\n openAIFunctions.push(openAIFunction);\n const baseUrl = (spec.baseUrl ?? \"\").endsWith(\"/\")\n ? (spec.baseUrl ?? \"\").slice(0, -1)\n : (spec.baseUrl ?? \"\");\n nameToCallMap[openAIFunction.name] = {\n method,\n url: baseUrl + path,\n };\n }\n }\n return {\n openAIFunctions,\n defaultExecutionMethod: async (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>,\n options?: {\n headers?: Record<string, string>;\n params?: Record<string, string>;\n }\n ) => {\n const {\n headers: customHeaders,\n params: customParams,\n ...rest\n } = options ?? {};\n const { method, url } = nameToCallMap[name];\n const requestParams = requestArgs.params ?? {};\n const nonEmptyParams = Object.keys(requestParams).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (filteredArgs: Record<string, any>, argName) => {\n if (\n requestParams[argName] !== \"\" &&\n requestParams[argName] !== null &&\n requestParams[argName] !== undefined\n ) {\n filteredArgs[argName] = requestParams[argName];\n }\n return filteredArgs;\n },\n {}\n );\n const queryString = new URLSearchParams({\n ...nonEmptyParams,\n ...customParams,\n }).toString();\n const pathParams = requestArgs.path_params;\n const formattedUrl =\n formatURL(url, pathParams) +\n (queryString.length ? `?${queryString}` : \"\");\n const headers: Record<string, string> = {};\n let body;\n if (requestArgs.data !== undefined) {\n let contentType = \"text/plain\";\n if (typeof requestArgs.data !== \"string\") {\n if (typeof requestArgs.data === \"object\") {\n contentType = \"application/json\";\n }\n body = JSON.stringify(requestArgs.data);\n } else {\n body = requestArgs.data;\n }\n headers[\"content-type\"] = contentType;\n }\n const response = await fetch(formattedUrl, {\n ...requestArgs,\n method,\n headers: {\n ...headers,\n ...requestArgs.headers,\n ...customHeaders,\n },\n body,\n ...rest,\n });\n let output;\n if (response.status < 200 || response.status > 299) {\n output = `${response.status}: ${\n response.statusText\n } for ${name} called with ${JSON.stringify(queryString)}`;\n } else {\n output = await response.text();\n }\n return output;\n },\n };\n}\n\n/**\n * Type representing a function for executing simple requests.\n */\ntype SimpleRequestChainExecutionMethod = (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>\n) => Promise<string>;\n\n/**\n * A chain for making simple API requests.\n */\nclass SimpleRequestChain extends BaseChain {\n static lc_name() {\n return \"SimpleRequestChain\";\n }\n\n private requestMethod: SimpleRequestChainExecutionMethod;\n\n inputKey = \"function\";\n\n outputKey = \"response\";\n\n constructor(config: { requestMethod: SimpleRequestChainExecutionMethod }) {\n super();\n this.requestMethod = config.requestMethod;\n }\n\n get inputKeys() {\n return [this.inputKey];\n }\n\n get outputKeys() {\n return [this.outputKey];\n }\n\n _chainType() {\n return \"simple_request_chain\" as const;\n }\n\n /** @ignore */\n async _call(\n values: ChainValues,\n _runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const inputKeyValue = values[this.inputKey];\n const methodName = inputKeyValue.name;\n const args = inputKeyValue.arguments;\n const response = await this.requestMethod(methodName, args);\n return { [this.outputKey]: response };\n }\n}\n\n/**\n * Type representing the options for creating an OpenAPI chain.\n */\nexport type OpenAPIChainOptions = {\n llm?: BaseChatModel<BaseFunctionCallOptions>;\n prompt?: BasePromptTemplate;\n requestChain?: BaseChain;\n llmChainInputs?: LLMChainInput;\n headers?: Record<string, string>;\n params?: Record<string, string>;\n verbose?: boolean;\n};\n\n/**\n * Create a chain for querying an API from a OpenAPI spec.\n * @param spec OpenAPISpec or url/file/text string corresponding to one.\n * @param options Custom options passed into the chain\n * @returns OpenAPIChain\n */\nexport async function createOpenAPIChain(\n spec: OpenAPIV3_1.Document | string,\n options: OpenAPIChainOptions = {}\n) {\n let convertedSpec;\n if (typeof spec === \"string\") {\n try {\n convertedSpec = await OpenAPISpec.fromURL(spec);\n } catch {\n try {\n convertedSpec = OpenAPISpec.fromString(spec);\n } catch {\n throw new Error(`Unable to parse spec from source ${spec}.`);\n }\n }\n } else {\n convertedSpec = OpenAPISpec.fromObject(spec);\n }\n const { openAIFunctions, defaultExecutionMethod } =\n convertOpenAPISpecToOpenAIFunctions(convertedSpec);\n if (defaultExecutionMethod === undefined) {\n throw new Error(\n `Could not parse any valid operations from the provided spec.`\n );\n }\n\n if (!options.llm) {\n throw new Error(\"`llm` option is required\");\n }\n\n const {\n llm = options.llm,\n prompt = ChatPromptTemplate.fromMessages([\n HumanMessagePromptTemplate.fromTemplate(\n \"Use the provided API's to respond to this user query:\\n\\n{query}\"\n ),\n ]),\n requestChain = new SimpleRequestChain({\n requestMethod: async (name, args) =>\n defaultExecutionMethod(name, args, {\n headers: options.headers,\n params: options.params,\n }),\n }),\n llmChainInputs = {},\n verbose,\n ...rest\n } = options;\n const formatChain = new LLMChain({\n llm,\n prompt,\n outputParser: new JsonOutputFunctionsParser({ argsOnly: false }),\n outputKey: \"function\",\n llmKwargs: { functions: openAIFunctions },\n ...llmChainInputs,\n });\n return new SequentialChain({\n chains: [formatChain, requestChain],\n outputVariables: [\"response\"],\n inputVariables: formatChain.inputKeys,\n verbose,\n ...rest,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"openapi.cjs","names":["OpenAPISpec","BaseChain","ChatPromptTemplate","HumanMessagePromptTemplate","LLMChain","JsonOutputFunctionsParser","SequentialChain"],"sources":["../../../src/chains/openai_functions/openapi.ts"],"sourcesContent":["import type { OpenAIClient } from \"@langchain/openai\";\nimport {\n type JsonSchema7ObjectType,\n type JsonSchema7ArrayType,\n type JsonSchema7Type,\n} from \"@langchain/core/utils/json_schema\";\nimport type { OpenAPIV3_1 } from \"openapi-types\";\n\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { BaseFunctionCallOptions } from \"@langchain/core/language_models/base\";\nimport {\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n BasePromptTemplate,\n} from \"@langchain/core/prompts\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { OpenAPISpec } from \"../../util/openapi.js\";\nimport { BaseChain } from \"../base.js\";\nimport { LLMChain, LLMChainInput } from \"../llm_chain.js\";\nimport { SequentialChain } from \"../sequential_chain.js\";\nimport { JsonOutputFunctionsParser } from \"../../output_parsers/openai_functions.js\";\n\n/**\n * Type representing a function for executing OpenAPI requests.\n */\ntype OpenAPIExecutionMethod = (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>,\n options?: {\n headers?: Record<string, string>;\n params?: Record<string, string>;\n }\n) => Promise<string>;\n\n/**\n * Type representing the composition types of a schema.\n */\ntype CompositionType = \"anyOf\" | \"allOf\" | \"oneOf\";\n\n/**\n * Gets the composition type of a schema if it exists.\n * @param schema\n * @returns The composition type of the schema if it exists.\n */\nfunction getCompositionType(\n schema: OpenAPIV3_1.SchemaObject\n): CompositionType | undefined {\n if (schema.anyOf !== undefined) {\n return \"anyOf\";\n }\n if (schema.allOf !== undefined) {\n return \"allOf\";\n }\n if (schema.oneOf !== undefined) {\n return \"oneOf\";\n }\n return undefined;\n}\n\n/**\n * Formats a URL by replacing path parameters with their corresponding\n * values.\n * @param url The URL to format.\n * @param pathParams The path parameters to replace in the URL.\n * @returns The formatted URL.\n */\nfunction formatURL(url: string, pathParams: Record<string, string>): string {\n const expectedPathParamNames = [...url.matchAll(/{(.*?)}/g)].map(\n (match) => match[1]\n );\n const newParams: Record<string, string> = {};\n for (const paramName of expectedPathParamNames) {\n const cleanParamName = paramName.replace(/^\\.;/, \"\").replace(/\\*$/, \"\");\n const value = pathParams[cleanParamName];\n let formattedValue;\n if (Array.isArray(value)) {\n if (paramName.startsWith(\".\")) {\n const separator = paramName.endsWith(\"*\") ? \".\" : \",\";\n formattedValue = `.${value.join(separator)}`;\n } else if (paramName.startsWith(\",\")) {\n const separator = paramName.endsWith(\"*\") ? `${cleanParamName}=` : \",\";\n formattedValue = `${cleanParamName}=${value.join(separator)}`;\n } else {\n formattedValue = value.join(\",\");\n }\n } else if (typeof value === \"object\") {\n const kvSeparator = paramName.endsWith(\"*\") ? \"=\" : \",\";\n const kvStrings = Object.entries(value).map(\n ([k, v]) => k + kvSeparator + v\n );\n let entrySeparator;\n if (paramName.startsWith(\".\")) {\n entrySeparator = \".\";\n formattedValue = \".\";\n } else if (paramName.startsWith(\";\")) {\n entrySeparator = \";\";\n formattedValue = \";\";\n } else {\n entrySeparator = \",\";\n formattedValue = \"\";\n }\n formattedValue += kvStrings.join(entrySeparator);\n } else {\n if (paramName.startsWith(\".\")) {\n formattedValue = `.${value}`;\n } else if (paramName.startsWith(\";\")) {\n formattedValue = `;${cleanParamName}=${value}`;\n } else {\n formattedValue = value;\n }\n }\n newParams[paramName] = formattedValue;\n }\n let formattedUrl = url;\n for (const [key, newValue] of Object.entries(newParams)) {\n formattedUrl = formattedUrl.replace(`{${key}}`, newValue);\n }\n return formattedUrl;\n}\n\n/**\n * Converts OpenAPI parameters to JSON schema format.\n * @param params The OpenAPI parameters to convert.\n * @param spec The OpenAPI specification that contains the parameters.\n * @returns The JSON schema representation of the OpenAPI parameters.\n */\nfunction convertOpenAPIParamsToJSONSchema(\n params: OpenAPIV3_1.ParameterObject[],\n spec: OpenAPISpec\n) {\n return params.reduce(\n (jsonSchema: JsonSchema7ObjectType, param) => {\n let schema;\n if (param.schema) {\n schema = spec.getSchema(param.schema);\n jsonSchema.properties[param.name] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n );\n } else if (param.content) {\n const mediaTypeSchema = Object.values(param.content)[0].schema;\n if (mediaTypeSchema) {\n schema = spec.getSchema(mediaTypeSchema);\n }\n if (!schema) {\n return jsonSchema;\n }\n if (schema.description === undefined) {\n schema.description = param.description ?? \"\";\n }\n jsonSchema.properties[param.name] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n );\n } else {\n return jsonSchema;\n }\n if (param.required && Array.isArray(jsonSchema.required)) {\n jsonSchema.required.push(param.name);\n }\n return jsonSchema;\n },\n {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: {},\n }\n );\n}\n\n// OpenAI throws errors on extraneous schema properties, e.g. if \"required\" is set on individual ones\n/**\n * Converts OpenAPI schemas to JSON schema format.\n * @param schema The OpenAPI schema to convert.\n * @param spec The OpenAPI specification that contains the schema.\n * @returns The JSON schema representation of the OpenAPI schema.\n */\nexport function convertOpenAPISchemaToJSONSchema(\n schema: OpenAPIV3_1.SchemaObject,\n spec: OpenAPISpec\n): JsonSchema7Type {\n const compositionType = getCompositionType(schema);\n if (compositionType !== undefined && schema[compositionType] !== undefined) {\n return {\n [compositionType]: schema[compositionType].map((s) =>\n convertOpenAPISchemaToJSONSchema(spec.getSchema(s), spec)\n ),\n } as JsonSchema7Type;\n }\n\n if (schema.type === \"object\") {\n return Object.keys(schema.properties ?? {}).reduce(\n (jsonSchema: JsonSchema7ObjectType, propertyName) => {\n if (!schema.properties) {\n return jsonSchema;\n }\n const openAPIProperty = spec.getSchema(schema.properties[propertyName]);\n if (openAPIProperty.type === undefined) {\n return jsonSchema;\n }\n jsonSchema.properties[propertyName] = convertOpenAPISchemaToJSONSchema(\n openAPIProperty,\n spec\n );\n if (\n schema.required?.includes(propertyName) &&\n jsonSchema.required !== undefined\n ) {\n jsonSchema.required.push(propertyName);\n }\n return jsonSchema;\n },\n {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: {},\n }\n );\n }\n\n if (schema.type === \"array\") {\n const openAPIItems = spec.getSchema(schema.items ?? {});\n return {\n type: \"array\",\n items: convertOpenAPISchemaToJSONSchema(openAPIItems, spec),\n minItems: schema.minItems,\n maxItems: schema.maxItems,\n } as JsonSchema7ArrayType;\n }\n return {\n type: schema.type ?? \"string\",\n } as JsonSchema7Type;\n}\n\n/**\n * Converts an OpenAPI specification to OpenAI functions.\n * @param spec The OpenAPI specification to convert.\n * @returns An object containing the OpenAI functions derived from the OpenAPI specification and a default execution method.\n */\nexport function convertOpenAPISpecToOpenAIFunctions(spec: OpenAPISpec): {\n openAIFunctions: OpenAIClient.Chat.ChatCompletionCreateParams.Function[];\n defaultExecutionMethod?: OpenAPIExecutionMethod;\n} {\n if (!spec.document.paths) {\n return { openAIFunctions: [] };\n }\n const openAIFunctions = [];\n const nameToCallMap: Record<string, { method: string; url: string }> = {};\n for (const path of Object.keys(spec.document.paths)) {\n const pathParameters = spec.getParametersForPath(path);\n for (const method of spec.getMethodsForPath(path)) {\n const operation = spec.getOperation(path, method);\n if (!operation) {\n return { openAIFunctions: [] };\n }\n const operationParametersByLocation = pathParameters\n .concat(spec.getParametersForOperation(operation))\n .reduce(\n (\n operationParams: Record<string, OpenAPIV3_1.ParameterObject[]>,\n param\n ) => {\n if (!operationParams[param.in]) {\n operationParams[param.in] = [];\n }\n operationParams[param.in].push(param);\n return operationParams;\n },\n {}\n );\n const paramLocationToRequestArgNameMap: Record<string, string> = {\n query: \"params\",\n header: \"headers\",\n cookie: \"cookies\",\n path: \"path_params\",\n };\n const requestArgsSchema: Record<string, JsonSchema7ObjectType> & {\n data?:\n | JsonSchema7ObjectType\n | {\n anyOf?: JsonSchema7ObjectType[];\n };\n } = {};\n for (const paramLocation of Object.keys(\n paramLocationToRequestArgNameMap\n )) {\n if (operationParametersByLocation[paramLocation]) {\n requestArgsSchema[paramLocationToRequestArgNameMap[paramLocation]] =\n convertOpenAPIParamsToJSONSchema(\n operationParametersByLocation[paramLocation],\n spec\n );\n }\n }\n const requestBody = spec.getRequestBodyForOperation(operation);\n if (requestBody?.content !== undefined) {\n const requestBodySchemas: Record<string, JsonSchema7ObjectType> = {};\n for (const [mediaType, mediaTypeObject] of Object.entries(\n requestBody.content\n )) {\n if (mediaTypeObject.schema !== undefined) {\n const schema = spec.getSchema(mediaTypeObject.schema);\n requestBodySchemas[mediaType] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n ) as JsonSchema7ObjectType;\n }\n }\n const mediaTypes = Object.keys(requestBodySchemas);\n if (mediaTypes.length === 1) {\n requestArgsSchema.data = requestBodySchemas[mediaTypes[0]];\n } else if (mediaTypes.length > 1) {\n requestArgsSchema.data = {\n anyOf: Object.values(requestBodySchemas),\n };\n }\n }\n const openAIFunction: OpenAIClient.Chat.ChatCompletionCreateParams.Function =\n {\n name: OpenAPISpec.getCleanedOperationId(operation, path, method),\n description: operation.description ?? operation.summary ?? \"\",\n parameters: {\n type: \"object\",\n properties: requestArgsSchema,\n // All remaining top-level parameters are required\n required: Object.keys(requestArgsSchema),\n },\n };\n\n openAIFunctions.push(openAIFunction);\n const baseUrl = (spec.baseUrl ?? \"\").endsWith(\"/\")\n ? (spec.baseUrl ?? \"\").slice(0, -1)\n : (spec.baseUrl ?? \"\");\n nameToCallMap[openAIFunction.name] = {\n method,\n url: baseUrl + path,\n };\n }\n }\n return {\n openAIFunctions,\n defaultExecutionMethod: async (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>,\n options?: {\n headers?: Record<string, string>;\n params?: Record<string, string>;\n }\n ) => {\n const {\n headers: customHeaders,\n params: customParams,\n ...rest\n } = options ?? {};\n const { method, url } = nameToCallMap[name];\n const requestParams = requestArgs.params ?? {};\n const nonEmptyParams = Object.keys(requestParams).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (filteredArgs: Record<string, any>, argName) => {\n if (\n requestParams[argName] !== \"\" &&\n requestParams[argName] !== null &&\n requestParams[argName] !== undefined\n ) {\n filteredArgs[argName] = requestParams[argName];\n }\n return filteredArgs;\n },\n {}\n );\n const queryString = new URLSearchParams({\n ...nonEmptyParams,\n ...customParams,\n }).toString();\n const pathParams = requestArgs.path_params;\n const formattedUrl =\n formatURL(url, pathParams) +\n (queryString.length ? `?${queryString}` : \"\");\n const headers: Record<string, string> = {};\n let body;\n if (requestArgs.data !== undefined) {\n let contentType = \"text/plain\";\n if (typeof requestArgs.data !== \"string\") {\n if (typeof requestArgs.data === \"object\") {\n contentType = \"application/json\";\n }\n body = JSON.stringify(requestArgs.data);\n } else {\n body = requestArgs.data;\n }\n headers[\"content-type\"] = contentType;\n }\n const response = await fetch(formattedUrl, {\n ...requestArgs,\n method,\n headers: {\n ...headers,\n ...requestArgs.headers,\n ...customHeaders,\n },\n body,\n ...rest,\n });\n let output;\n if (response.status < 200 || response.status > 299) {\n output = `${response.status}: ${\n response.statusText\n } for ${name} called with ${JSON.stringify(queryString)}`;\n } else {\n output = await response.text();\n }\n return output;\n },\n };\n}\n\n/**\n * Type representing a function for executing simple requests.\n */\ntype SimpleRequestChainExecutionMethod = (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>\n) => Promise<string>;\n\n/**\n * A chain for making simple API requests.\n */\nclass SimpleRequestChain extends BaseChain {\n static lc_name() {\n return \"SimpleRequestChain\";\n }\n\n private requestMethod: SimpleRequestChainExecutionMethod;\n\n inputKey = \"function\";\n\n outputKey = \"response\";\n\n constructor(config: { requestMethod: SimpleRequestChainExecutionMethod }) {\n super();\n this.requestMethod = config.requestMethod;\n }\n\n get inputKeys() {\n return [this.inputKey];\n }\n\n get outputKeys() {\n return [this.outputKey];\n }\n\n _chainType() {\n return \"simple_request_chain\" as const;\n }\n\n /** @ignore */\n async _call(\n values: ChainValues,\n _runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const inputKeyValue = values[this.inputKey];\n const methodName = inputKeyValue.name;\n const args = inputKeyValue.arguments;\n const response = await this.requestMethod(methodName, args);\n return { [this.outputKey]: response };\n }\n}\n\n/**\n * Type representing the options for creating an OpenAPI chain.\n */\nexport type OpenAPIChainOptions = {\n llm?: BaseChatModel<BaseFunctionCallOptions>;\n prompt?: BasePromptTemplate;\n requestChain?: BaseChain;\n llmChainInputs?: LLMChainInput;\n headers?: Record<string, string>;\n params?: Record<string, string>;\n verbose?: boolean;\n};\n\n/**\n * Create a chain for querying an API from a OpenAPI spec.\n * @param spec OpenAPISpec or url/file/text string corresponding to one.\n * @param options Custom options passed into the chain\n * @returns OpenAPIChain\n */\nexport async function createOpenAPIChain(\n spec: OpenAPIV3_1.Document | string,\n options: OpenAPIChainOptions = {}\n) {\n let convertedSpec;\n if (typeof spec === \"string\") {\n try {\n convertedSpec = await OpenAPISpec.fromURL(spec);\n } catch {\n try {\n convertedSpec = OpenAPISpec.fromString(spec);\n } catch {\n throw new Error(`Unable to parse spec from source ${spec}.`);\n }\n }\n } else {\n convertedSpec = OpenAPISpec.fromObject(spec);\n }\n const { openAIFunctions, defaultExecutionMethod } =\n convertOpenAPISpecToOpenAIFunctions(convertedSpec);\n if (defaultExecutionMethod === undefined) {\n throw new Error(\n `Could not parse any valid operations from the provided spec.`\n );\n }\n\n if (!options.llm) {\n throw new Error(\"`llm` option is required\");\n }\n\n const {\n llm = options.llm,\n prompt = ChatPromptTemplate.fromMessages([\n HumanMessagePromptTemplate.fromTemplate(\n \"Use the provided API's to respond to this user query:\\n\\n{query}\"\n ),\n ]),\n requestChain = new SimpleRequestChain({\n requestMethod: async (name, args) =>\n defaultExecutionMethod(name, args, {\n headers: options.headers,\n params: options.params,\n }),\n }),\n llmChainInputs = {},\n verbose,\n ...rest\n } = options;\n const formatChain = new LLMChain({\n llm,\n prompt,\n outputParser: new JsonOutputFunctionsParser({ argsOnly: false }),\n outputKey: \"function\",\n llmKwargs: { functions: openAIFunctions },\n ...llmChainInputs,\n });\n return new SequentialChain({\n chains: [formatChain, requestChain],\n outputVariables: [\"response\"],\n inputVariables: formatChain.inputKeys,\n verbose,\n ...rest,\n });\n}\n"],"mappings":"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"}
@@ -29,14 +29,15 @@ function formatURL(url, pathParams) {
29
29
  const cleanParamName = paramName.replace(/^\.;/, "").replace(/\*$/, "");
30
30
  const value = pathParams[cleanParamName];
31
31
  let formattedValue;
32
- if (Array.isArray(value)) if (paramName.startsWith(".")) {
33
- const separator = paramName.endsWith("*") ? "." : ",";
34
- formattedValue = `.${value.join(separator)}`;
35
- } else if (paramName.startsWith(",")) {
36
- const separator = paramName.endsWith("*") ? `${cleanParamName}=` : ",";
37
- formattedValue = `${cleanParamName}=${value.join(separator)}`;
38
- } else formattedValue = value.join(",");
39
- else if (typeof value === "object") {
32
+ if (Array.isArray(value)) {
33
+ if (paramName.startsWith(".")) {
34
+ const separator = paramName.endsWith("*") ? "." : ",";
35
+ formattedValue = `.${value.join(separator)}`;
36
+ } else if (paramName.startsWith(",")) {
37
+ const separator = paramName.endsWith("*") ? `${cleanParamName}=` : ",";
38
+ formattedValue = `${cleanParamName}=${value.join(separator)}`;
39
+ } else formattedValue = value.join(",");
40
+ } else if (typeof value === "object") {
40
41
  const kvSeparator = paramName.endsWith("*") ? "=" : ",";
41
42
  const kvStrings = Object.entries(value).map(([k, v]) => k + kvSeparator + v);
42
43
  let entrySeparator;
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.js","names":[],"sources":["../../../src/chains/openai_functions/openapi.ts"],"sourcesContent":["import type { OpenAIClient } from \"@langchain/openai\";\nimport {\n type JsonSchema7ObjectType,\n type JsonSchema7ArrayType,\n type JsonSchema7Type,\n} from \"@langchain/core/utils/json_schema\";\nimport type { OpenAPIV3_1 } from \"openapi-types\";\n\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { BaseFunctionCallOptions } from \"@langchain/core/language_models/base\";\nimport {\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n BasePromptTemplate,\n} from \"@langchain/core/prompts\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { OpenAPISpec } from \"../../util/openapi.js\";\nimport { BaseChain } from \"../base.js\";\nimport { LLMChain, LLMChainInput } from \"../llm_chain.js\";\nimport { SequentialChain } from \"../sequential_chain.js\";\nimport { JsonOutputFunctionsParser } from \"../../output_parsers/openai_functions.js\";\n\n/**\n * Type representing a function for executing OpenAPI requests.\n */\ntype OpenAPIExecutionMethod = (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>,\n options?: {\n headers?: Record<string, string>;\n params?: Record<string, string>;\n }\n) => Promise<string>;\n\n/**\n * Type representing the composition types of a schema.\n */\ntype CompositionType = \"anyOf\" | \"allOf\" | \"oneOf\";\n\n/**\n * Gets the composition type of a schema if it exists.\n * @param schema\n * @returns The composition type of the schema if it exists.\n */\nfunction getCompositionType(\n schema: OpenAPIV3_1.SchemaObject\n): CompositionType | undefined {\n if (schema.anyOf !== undefined) {\n return \"anyOf\";\n }\n if (schema.allOf !== undefined) {\n return \"allOf\";\n }\n if (schema.oneOf !== undefined) {\n return \"oneOf\";\n }\n return undefined;\n}\n\n/**\n * Formats a URL by replacing path parameters with their corresponding\n * values.\n * @param url The URL to format.\n * @param pathParams The path parameters to replace in the URL.\n * @returns The formatted URL.\n */\nfunction formatURL(url: string, pathParams: Record<string, string>): string {\n const expectedPathParamNames = [...url.matchAll(/{(.*?)}/g)].map(\n (match) => match[1]\n );\n const newParams: Record<string, string> = {};\n for (const paramName of expectedPathParamNames) {\n const cleanParamName = paramName.replace(/^\\.;/, \"\").replace(/\\*$/, \"\");\n const value = pathParams[cleanParamName];\n let formattedValue;\n if (Array.isArray(value)) {\n if (paramName.startsWith(\".\")) {\n const separator = paramName.endsWith(\"*\") ? \".\" : \",\";\n formattedValue = `.${value.join(separator)}`;\n } else if (paramName.startsWith(\",\")) {\n const separator = paramName.endsWith(\"*\") ? `${cleanParamName}=` : \",\";\n formattedValue = `${cleanParamName}=${value.join(separator)}`;\n } else {\n formattedValue = value.join(\",\");\n }\n } else if (typeof value === \"object\") {\n const kvSeparator = paramName.endsWith(\"*\") ? \"=\" : \",\";\n const kvStrings = Object.entries(value).map(\n ([k, v]) => k + kvSeparator + v\n );\n let entrySeparator;\n if (paramName.startsWith(\".\")) {\n entrySeparator = \".\";\n formattedValue = \".\";\n } else if (paramName.startsWith(\";\")) {\n entrySeparator = \";\";\n formattedValue = \";\";\n } else {\n entrySeparator = \",\";\n formattedValue = \"\";\n }\n formattedValue += kvStrings.join(entrySeparator);\n } else {\n if (paramName.startsWith(\".\")) {\n formattedValue = `.${value}`;\n } else if (paramName.startsWith(\";\")) {\n formattedValue = `;${cleanParamName}=${value}`;\n } else {\n formattedValue = value;\n }\n }\n newParams[paramName] = formattedValue;\n }\n let formattedUrl = url;\n for (const [key, newValue] of Object.entries(newParams)) {\n formattedUrl = formattedUrl.replace(`{${key}}`, newValue);\n }\n return formattedUrl;\n}\n\n/**\n * Converts OpenAPI parameters to JSON schema format.\n * @param params The OpenAPI parameters to convert.\n * @param spec The OpenAPI specification that contains the parameters.\n * @returns The JSON schema representation of the OpenAPI parameters.\n */\nfunction convertOpenAPIParamsToJSONSchema(\n params: OpenAPIV3_1.ParameterObject[],\n spec: OpenAPISpec\n) {\n return params.reduce(\n (jsonSchema: JsonSchema7ObjectType, param) => {\n let schema;\n if (param.schema) {\n schema = spec.getSchema(param.schema);\n jsonSchema.properties[param.name] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n );\n } else if (param.content) {\n const mediaTypeSchema = Object.values(param.content)[0].schema;\n if (mediaTypeSchema) {\n schema = spec.getSchema(mediaTypeSchema);\n }\n if (!schema) {\n return jsonSchema;\n }\n if (schema.description === undefined) {\n schema.description = param.description ?? \"\";\n }\n jsonSchema.properties[param.name] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n );\n } else {\n return jsonSchema;\n }\n if (param.required && Array.isArray(jsonSchema.required)) {\n jsonSchema.required.push(param.name);\n }\n return jsonSchema;\n },\n {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: {},\n }\n );\n}\n\n// OpenAI throws errors on extraneous schema properties, e.g. if \"required\" is set on individual ones\n/**\n * Converts OpenAPI schemas to JSON schema format.\n * @param schema The OpenAPI schema to convert.\n * @param spec The OpenAPI specification that contains the schema.\n * @returns The JSON schema representation of the OpenAPI schema.\n */\nexport function convertOpenAPISchemaToJSONSchema(\n schema: OpenAPIV3_1.SchemaObject,\n spec: OpenAPISpec\n): JsonSchema7Type {\n const compositionType = getCompositionType(schema);\n if (compositionType !== undefined && schema[compositionType] !== undefined) {\n return {\n [compositionType]: schema[compositionType].map((s) =>\n convertOpenAPISchemaToJSONSchema(spec.getSchema(s), spec)\n ),\n } as JsonSchema7Type;\n }\n\n if (schema.type === \"object\") {\n return Object.keys(schema.properties ?? {}).reduce(\n (jsonSchema: JsonSchema7ObjectType, propertyName) => {\n if (!schema.properties) {\n return jsonSchema;\n }\n const openAPIProperty = spec.getSchema(schema.properties[propertyName]);\n if (openAPIProperty.type === undefined) {\n return jsonSchema;\n }\n jsonSchema.properties[propertyName] = convertOpenAPISchemaToJSONSchema(\n openAPIProperty,\n spec\n );\n if (\n schema.required?.includes(propertyName) &&\n jsonSchema.required !== undefined\n ) {\n jsonSchema.required.push(propertyName);\n }\n return jsonSchema;\n },\n {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: {},\n }\n );\n }\n\n if (schema.type === \"array\") {\n const openAPIItems = spec.getSchema(schema.items ?? {});\n return {\n type: \"array\",\n items: convertOpenAPISchemaToJSONSchema(openAPIItems, spec),\n minItems: schema.minItems,\n maxItems: schema.maxItems,\n } as JsonSchema7ArrayType;\n }\n return {\n type: schema.type ?? \"string\",\n } as JsonSchema7Type;\n}\n\n/**\n * Converts an OpenAPI specification to OpenAI functions.\n * @param spec The OpenAPI specification to convert.\n * @returns An object containing the OpenAI functions derived from the OpenAPI specification and a default execution method.\n */\nexport function convertOpenAPISpecToOpenAIFunctions(spec: OpenAPISpec): {\n openAIFunctions: OpenAIClient.Chat.ChatCompletionCreateParams.Function[];\n defaultExecutionMethod?: OpenAPIExecutionMethod;\n} {\n if (!spec.document.paths) {\n return { openAIFunctions: [] };\n }\n const openAIFunctions = [];\n const nameToCallMap: Record<string, { method: string; url: string }> = {};\n for (const path of Object.keys(spec.document.paths)) {\n const pathParameters = spec.getParametersForPath(path);\n for (const method of spec.getMethodsForPath(path)) {\n const operation = spec.getOperation(path, method);\n if (!operation) {\n return { openAIFunctions: [] };\n }\n const operationParametersByLocation = pathParameters\n .concat(spec.getParametersForOperation(operation))\n .reduce(\n (\n operationParams: Record<string, OpenAPIV3_1.ParameterObject[]>,\n param\n ) => {\n if (!operationParams[param.in]) {\n operationParams[param.in] = [];\n }\n operationParams[param.in].push(param);\n return operationParams;\n },\n {}\n );\n const paramLocationToRequestArgNameMap: Record<string, string> = {\n query: \"params\",\n header: \"headers\",\n cookie: \"cookies\",\n path: \"path_params\",\n };\n const requestArgsSchema: Record<string, JsonSchema7ObjectType> & {\n data?:\n | JsonSchema7ObjectType\n | {\n anyOf?: JsonSchema7ObjectType[];\n };\n } = {};\n for (const paramLocation of Object.keys(\n paramLocationToRequestArgNameMap\n )) {\n if (operationParametersByLocation[paramLocation]) {\n requestArgsSchema[paramLocationToRequestArgNameMap[paramLocation]] =\n convertOpenAPIParamsToJSONSchema(\n operationParametersByLocation[paramLocation],\n spec\n );\n }\n }\n const requestBody = spec.getRequestBodyForOperation(operation);\n if (requestBody?.content !== undefined) {\n const requestBodySchemas: Record<string, JsonSchema7ObjectType> = {};\n for (const [mediaType, mediaTypeObject] of Object.entries(\n requestBody.content\n )) {\n if (mediaTypeObject.schema !== undefined) {\n const schema = spec.getSchema(mediaTypeObject.schema);\n requestBodySchemas[mediaType] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n ) as JsonSchema7ObjectType;\n }\n }\n const mediaTypes = Object.keys(requestBodySchemas);\n if (mediaTypes.length === 1) {\n requestArgsSchema.data = requestBodySchemas[mediaTypes[0]];\n } else if (mediaTypes.length > 1) {\n requestArgsSchema.data = {\n anyOf: Object.values(requestBodySchemas),\n };\n }\n }\n const openAIFunction: OpenAIClient.Chat.ChatCompletionCreateParams.Function =\n {\n name: OpenAPISpec.getCleanedOperationId(operation, path, method),\n description: operation.description ?? operation.summary ?? \"\",\n parameters: {\n type: \"object\",\n properties: requestArgsSchema,\n // All remaining top-level parameters are required\n required: Object.keys(requestArgsSchema),\n },\n };\n\n openAIFunctions.push(openAIFunction);\n const baseUrl = (spec.baseUrl ?? \"\").endsWith(\"/\")\n ? (spec.baseUrl ?? \"\").slice(0, -1)\n : (spec.baseUrl ?? \"\");\n nameToCallMap[openAIFunction.name] = {\n method,\n url: baseUrl + path,\n };\n }\n }\n return {\n openAIFunctions,\n defaultExecutionMethod: async (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>,\n options?: {\n headers?: Record<string, string>;\n params?: Record<string, string>;\n }\n ) => {\n const {\n headers: customHeaders,\n params: customParams,\n ...rest\n } = options ?? {};\n const { method, url } = nameToCallMap[name];\n const requestParams = requestArgs.params ?? {};\n const nonEmptyParams = Object.keys(requestParams).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (filteredArgs: Record<string, any>, argName) => {\n if (\n requestParams[argName] !== \"\" &&\n requestParams[argName] !== null &&\n requestParams[argName] !== undefined\n ) {\n filteredArgs[argName] = requestParams[argName];\n }\n return filteredArgs;\n },\n {}\n );\n const queryString = new URLSearchParams({\n ...nonEmptyParams,\n ...customParams,\n }).toString();\n const pathParams = requestArgs.path_params;\n const formattedUrl =\n formatURL(url, pathParams) +\n (queryString.length ? `?${queryString}` : \"\");\n const headers: Record<string, string> = {};\n let body;\n if (requestArgs.data !== undefined) {\n let contentType = \"text/plain\";\n if (typeof requestArgs.data !== \"string\") {\n if (typeof requestArgs.data === \"object\") {\n contentType = \"application/json\";\n }\n body = JSON.stringify(requestArgs.data);\n } else {\n body = requestArgs.data;\n }\n headers[\"content-type\"] = contentType;\n }\n const response = await fetch(formattedUrl, {\n ...requestArgs,\n method,\n headers: {\n ...headers,\n ...requestArgs.headers,\n ...customHeaders,\n },\n body,\n ...rest,\n });\n let output;\n if (response.status < 200 || response.status > 299) {\n output = `${response.status}: ${\n response.statusText\n } for ${name} called with ${JSON.stringify(queryString)}`;\n } else {\n output = await response.text();\n }\n return output;\n },\n };\n}\n\n/**\n * Type representing a function for executing simple requests.\n */\ntype SimpleRequestChainExecutionMethod = (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>\n) => Promise<string>;\n\n/**\n * A chain for making simple API requests.\n */\nclass SimpleRequestChain extends BaseChain {\n static lc_name() {\n return \"SimpleRequestChain\";\n }\n\n private requestMethod: SimpleRequestChainExecutionMethod;\n\n inputKey = \"function\";\n\n outputKey = \"response\";\n\n constructor(config: { requestMethod: SimpleRequestChainExecutionMethod }) {\n super();\n this.requestMethod = config.requestMethod;\n }\n\n get inputKeys() {\n return [this.inputKey];\n }\n\n get outputKeys() {\n return [this.outputKey];\n }\n\n _chainType() {\n return \"simple_request_chain\" as const;\n }\n\n /** @ignore */\n async _call(\n values: ChainValues,\n _runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const inputKeyValue = values[this.inputKey];\n const methodName = inputKeyValue.name;\n const args = inputKeyValue.arguments;\n const response = await this.requestMethod(methodName, args);\n return { [this.outputKey]: response };\n }\n}\n\n/**\n * Type representing the options for creating an OpenAPI chain.\n */\nexport type OpenAPIChainOptions = {\n llm?: BaseChatModel<BaseFunctionCallOptions>;\n prompt?: BasePromptTemplate;\n requestChain?: BaseChain;\n llmChainInputs?: LLMChainInput;\n headers?: Record<string, string>;\n params?: Record<string, string>;\n verbose?: boolean;\n};\n\n/**\n * Create a chain for querying an API from a OpenAPI spec.\n * @param spec OpenAPISpec or url/file/text string corresponding to one.\n * @param options Custom options passed into the chain\n * @returns OpenAPIChain\n */\nexport async function createOpenAPIChain(\n spec: OpenAPIV3_1.Document | string,\n options: OpenAPIChainOptions = {}\n) {\n let convertedSpec;\n if (typeof spec === \"string\") {\n try {\n convertedSpec = await OpenAPISpec.fromURL(spec);\n } catch {\n try {\n convertedSpec = OpenAPISpec.fromString(spec);\n } catch {\n throw new Error(`Unable to parse spec from source ${spec}.`);\n }\n }\n } else {\n convertedSpec = OpenAPISpec.fromObject(spec);\n }\n const { openAIFunctions, defaultExecutionMethod } =\n convertOpenAPISpecToOpenAIFunctions(convertedSpec);\n if (defaultExecutionMethod === undefined) {\n throw new Error(\n `Could not parse any valid operations from the provided spec.`\n );\n }\n\n if (!options.llm) {\n throw new Error(\"`llm` option is required\");\n }\n\n const {\n llm = options.llm,\n prompt = ChatPromptTemplate.fromMessages([\n HumanMessagePromptTemplate.fromTemplate(\n \"Use the provided API's to respond to this user query:\\n\\n{query}\"\n ),\n ]),\n requestChain = new SimpleRequestChain({\n requestMethod: async (name, args) =>\n defaultExecutionMethod(name, args, {\n headers: options.headers,\n params: options.params,\n }),\n }),\n llmChainInputs = {},\n verbose,\n ...rest\n } = options;\n const formatChain = new LLMChain({\n llm,\n prompt,\n outputParser: new JsonOutputFunctionsParser({ argsOnly: false }),\n outputKey: \"function\",\n llmKwargs: { functions: openAIFunctions },\n ...llmChainInputs,\n });\n return new SequentialChain({\n chains: [formatChain, requestChain],\n outputVariables: [\"response\"],\n inputVariables: formatChain.inputKeys,\n verbose,\n ...rest,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"openapi.js","names":[],"sources":["../../../src/chains/openai_functions/openapi.ts"],"sourcesContent":["import type { OpenAIClient } from \"@langchain/openai\";\nimport {\n type JsonSchema7ObjectType,\n type JsonSchema7ArrayType,\n type JsonSchema7Type,\n} from \"@langchain/core/utils/json_schema\";\nimport type { OpenAPIV3_1 } from \"openapi-types\";\n\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { BaseFunctionCallOptions } from \"@langchain/core/language_models/base\";\nimport {\n ChatPromptTemplate,\n HumanMessagePromptTemplate,\n BasePromptTemplate,\n} from \"@langchain/core/prompts\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { OpenAPISpec } from \"../../util/openapi.js\";\nimport { BaseChain } from \"../base.js\";\nimport { LLMChain, LLMChainInput } from \"../llm_chain.js\";\nimport { SequentialChain } from \"../sequential_chain.js\";\nimport { JsonOutputFunctionsParser } from \"../../output_parsers/openai_functions.js\";\n\n/**\n * Type representing a function for executing OpenAPI requests.\n */\ntype OpenAPIExecutionMethod = (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>,\n options?: {\n headers?: Record<string, string>;\n params?: Record<string, string>;\n }\n) => Promise<string>;\n\n/**\n * Type representing the composition types of a schema.\n */\ntype CompositionType = \"anyOf\" | \"allOf\" | \"oneOf\";\n\n/**\n * Gets the composition type of a schema if it exists.\n * @param schema\n * @returns The composition type of the schema if it exists.\n */\nfunction getCompositionType(\n schema: OpenAPIV3_1.SchemaObject\n): CompositionType | undefined {\n if (schema.anyOf !== undefined) {\n return \"anyOf\";\n }\n if (schema.allOf !== undefined) {\n return \"allOf\";\n }\n if (schema.oneOf !== undefined) {\n return \"oneOf\";\n }\n return undefined;\n}\n\n/**\n * Formats a URL by replacing path parameters with their corresponding\n * values.\n * @param url The URL to format.\n * @param pathParams The path parameters to replace in the URL.\n * @returns The formatted URL.\n */\nfunction formatURL(url: string, pathParams: Record<string, string>): string {\n const expectedPathParamNames = [...url.matchAll(/{(.*?)}/g)].map(\n (match) => match[1]\n );\n const newParams: Record<string, string> = {};\n for (const paramName of expectedPathParamNames) {\n const cleanParamName = paramName.replace(/^\\.;/, \"\").replace(/\\*$/, \"\");\n const value = pathParams[cleanParamName];\n let formattedValue;\n if (Array.isArray(value)) {\n if (paramName.startsWith(\".\")) {\n const separator = paramName.endsWith(\"*\") ? \".\" : \",\";\n formattedValue = `.${value.join(separator)}`;\n } else if (paramName.startsWith(\",\")) {\n const separator = paramName.endsWith(\"*\") ? `${cleanParamName}=` : \",\";\n formattedValue = `${cleanParamName}=${value.join(separator)}`;\n } else {\n formattedValue = value.join(\",\");\n }\n } else if (typeof value === \"object\") {\n const kvSeparator = paramName.endsWith(\"*\") ? \"=\" : \",\";\n const kvStrings = Object.entries(value).map(\n ([k, v]) => k + kvSeparator + v\n );\n let entrySeparator;\n if (paramName.startsWith(\".\")) {\n entrySeparator = \".\";\n formattedValue = \".\";\n } else if (paramName.startsWith(\";\")) {\n entrySeparator = \";\";\n formattedValue = \";\";\n } else {\n entrySeparator = \",\";\n formattedValue = \"\";\n }\n formattedValue += kvStrings.join(entrySeparator);\n } else {\n if (paramName.startsWith(\".\")) {\n formattedValue = `.${value}`;\n } else if (paramName.startsWith(\";\")) {\n formattedValue = `;${cleanParamName}=${value}`;\n } else {\n formattedValue = value;\n }\n }\n newParams[paramName] = formattedValue;\n }\n let formattedUrl = url;\n for (const [key, newValue] of Object.entries(newParams)) {\n formattedUrl = formattedUrl.replace(`{${key}}`, newValue);\n }\n return formattedUrl;\n}\n\n/**\n * Converts OpenAPI parameters to JSON schema format.\n * @param params The OpenAPI parameters to convert.\n * @param spec The OpenAPI specification that contains the parameters.\n * @returns The JSON schema representation of the OpenAPI parameters.\n */\nfunction convertOpenAPIParamsToJSONSchema(\n params: OpenAPIV3_1.ParameterObject[],\n spec: OpenAPISpec\n) {\n return params.reduce(\n (jsonSchema: JsonSchema7ObjectType, param) => {\n let schema;\n if (param.schema) {\n schema = spec.getSchema(param.schema);\n jsonSchema.properties[param.name] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n );\n } else if (param.content) {\n const mediaTypeSchema = Object.values(param.content)[0].schema;\n if (mediaTypeSchema) {\n schema = spec.getSchema(mediaTypeSchema);\n }\n if (!schema) {\n return jsonSchema;\n }\n if (schema.description === undefined) {\n schema.description = param.description ?? \"\";\n }\n jsonSchema.properties[param.name] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n );\n } else {\n return jsonSchema;\n }\n if (param.required && Array.isArray(jsonSchema.required)) {\n jsonSchema.required.push(param.name);\n }\n return jsonSchema;\n },\n {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: {},\n }\n );\n}\n\n// OpenAI throws errors on extraneous schema properties, e.g. if \"required\" is set on individual ones\n/**\n * Converts OpenAPI schemas to JSON schema format.\n * @param schema The OpenAPI schema to convert.\n * @param spec The OpenAPI specification that contains the schema.\n * @returns The JSON schema representation of the OpenAPI schema.\n */\nexport function convertOpenAPISchemaToJSONSchema(\n schema: OpenAPIV3_1.SchemaObject,\n spec: OpenAPISpec\n): JsonSchema7Type {\n const compositionType = getCompositionType(schema);\n if (compositionType !== undefined && schema[compositionType] !== undefined) {\n return {\n [compositionType]: schema[compositionType].map((s) =>\n convertOpenAPISchemaToJSONSchema(spec.getSchema(s), spec)\n ),\n } as JsonSchema7Type;\n }\n\n if (schema.type === \"object\") {\n return Object.keys(schema.properties ?? {}).reduce(\n (jsonSchema: JsonSchema7ObjectType, propertyName) => {\n if (!schema.properties) {\n return jsonSchema;\n }\n const openAPIProperty = spec.getSchema(schema.properties[propertyName]);\n if (openAPIProperty.type === undefined) {\n return jsonSchema;\n }\n jsonSchema.properties[propertyName] = convertOpenAPISchemaToJSONSchema(\n openAPIProperty,\n spec\n );\n if (\n schema.required?.includes(propertyName) &&\n jsonSchema.required !== undefined\n ) {\n jsonSchema.required.push(propertyName);\n }\n return jsonSchema;\n },\n {\n type: \"object\",\n properties: {},\n required: [],\n additionalProperties: {},\n }\n );\n }\n\n if (schema.type === \"array\") {\n const openAPIItems = spec.getSchema(schema.items ?? {});\n return {\n type: \"array\",\n items: convertOpenAPISchemaToJSONSchema(openAPIItems, spec),\n minItems: schema.minItems,\n maxItems: schema.maxItems,\n } as JsonSchema7ArrayType;\n }\n return {\n type: schema.type ?? \"string\",\n } as JsonSchema7Type;\n}\n\n/**\n * Converts an OpenAPI specification to OpenAI functions.\n * @param spec The OpenAPI specification to convert.\n * @returns An object containing the OpenAI functions derived from the OpenAPI specification and a default execution method.\n */\nexport function convertOpenAPISpecToOpenAIFunctions(spec: OpenAPISpec): {\n openAIFunctions: OpenAIClient.Chat.ChatCompletionCreateParams.Function[];\n defaultExecutionMethod?: OpenAPIExecutionMethod;\n} {\n if (!spec.document.paths) {\n return { openAIFunctions: [] };\n }\n const openAIFunctions = [];\n const nameToCallMap: Record<string, { method: string; url: string }> = {};\n for (const path of Object.keys(spec.document.paths)) {\n const pathParameters = spec.getParametersForPath(path);\n for (const method of spec.getMethodsForPath(path)) {\n const operation = spec.getOperation(path, method);\n if (!operation) {\n return { openAIFunctions: [] };\n }\n const operationParametersByLocation = pathParameters\n .concat(spec.getParametersForOperation(operation))\n .reduce(\n (\n operationParams: Record<string, OpenAPIV3_1.ParameterObject[]>,\n param\n ) => {\n if (!operationParams[param.in]) {\n operationParams[param.in] = [];\n }\n operationParams[param.in].push(param);\n return operationParams;\n },\n {}\n );\n const paramLocationToRequestArgNameMap: Record<string, string> = {\n query: \"params\",\n header: \"headers\",\n cookie: \"cookies\",\n path: \"path_params\",\n };\n const requestArgsSchema: Record<string, JsonSchema7ObjectType> & {\n data?:\n | JsonSchema7ObjectType\n | {\n anyOf?: JsonSchema7ObjectType[];\n };\n } = {};\n for (const paramLocation of Object.keys(\n paramLocationToRequestArgNameMap\n )) {\n if (operationParametersByLocation[paramLocation]) {\n requestArgsSchema[paramLocationToRequestArgNameMap[paramLocation]] =\n convertOpenAPIParamsToJSONSchema(\n operationParametersByLocation[paramLocation],\n spec\n );\n }\n }\n const requestBody = spec.getRequestBodyForOperation(operation);\n if (requestBody?.content !== undefined) {\n const requestBodySchemas: Record<string, JsonSchema7ObjectType> = {};\n for (const [mediaType, mediaTypeObject] of Object.entries(\n requestBody.content\n )) {\n if (mediaTypeObject.schema !== undefined) {\n const schema = spec.getSchema(mediaTypeObject.schema);\n requestBodySchemas[mediaType] = convertOpenAPISchemaToJSONSchema(\n schema,\n spec\n ) as JsonSchema7ObjectType;\n }\n }\n const mediaTypes = Object.keys(requestBodySchemas);\n if (mediaTypes.length === 1) {\n requestArgsSchema.data = requestBodySchemas[mediaTypes[0]];\n } else if (mediaTypes.length > 1) {\n requestArgsSchema.data = {\n anyOf: Object.values(requestBodySchemas),\n };\n }\n }\n const openAIFunction: OpenAIClient.Chat.ChatCompletionCreateParams.Function =\n {\n name: OpenAPISpec.getCleanedOperationId(operation, path, method),\n description: operation.description ?? operation.summary ?? \"\",\n parameters: {\n type: \"object\",\n properties: requestArgsSchema,\n // All remaining top-level parameters are required\n required: Object.keys(requestArgsSchema),\n },\n };\n\n openAIFunctions.push(openAIFunction);\n const baseUrl = (spec.baseUrl ?? \"\").endsWith(\"/\")\n ? (spec.baseUrl ?? \"\").slice(0, -1)\n : (spec.baseUrl ?? \"\");\n nameToCallMap[openAIFunction.name] = {\n method,\n url: baseUrl + path,\n };\n }\n }\n return {\n openAIFunctions,\n defaultExecutionMethod: async (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>,\n options?: {\n headers?: Record<string, string>;\n params?: Record<string, string>;\n }\n ) => {\n const {\n headers: customHeaders,\n params: customParams,\n ...rest\n } = options ?? {};\n const { method, url } = nameToCallMap[name];\n const requestParams = requestArgs.params ?? {};\n const nonEmptyParams = Object.keys(requestParams).reduce(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (filteredArgs: Record<string, any>, argName) => {\n if (\n requestParams[argName] !== \"\" &&\n requestParams[argName] !== null &&\n requestParams[argName] !== undefined\n ) {\n filteredArgs[argName] = requestParams[argName];\n }\n return filteredArgs;\n },\n {}\n );\n const queryString = new URLSearchParams({\n ...nonEmptyParams,\n ...customParams,\n }).toString();\n const pathParams = requestArgs.path_params;\n const formattedUrl =\n formatURL(url, pathParams) +\n (queryString.length ? `?${queryString}` : \"\");\n const headers: Record<string, string> = {};\n let body;\n if (requestArgs.data !== undefined) {\n let contentType = \"text/plain\";\n if (typeof requestArgs.data !== \"string\") {\n if (typeof requestArgs.data === \"object\") {\n contentType = \"application/json\";\n }\n body = JSON.stringify(requestArgs.data);\n } else {\n body = requestArgs.data;\n }\n headers[\"content-type\"] = contentType;\n }\n const response = await fetch(formattedUrl, {\n ...requestArgs,\n method,\n headers: {\n ...headers,\n ...requestArgs.headers,\n ...customHeaders,\n },\n body,\n ...rest,\n });\n let output;\n if (response.status < 200 || response.status > 299) {\n output = `${response.status}: ${\n response.statusText\n } for ${name} called with ${JSON.stringify(queryString)}`;\n } else {\n output = await response.text();\n }\n return output;\n },\n };\n}\n\n/**\n * Type representing a function for executing simple requests.\n */\ntype SimpleRequestChainExecutionMethod = (\n name: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n requestArgs: Record<string, any>\n) => Promise<string>;\n\n/**\n * A chain for making simple API requests.\n */\nclass SimpleRequestChain extends BaseChain {\n static lc_name() {\n return \"SimpleRequestChain\";\n }\n\n private requestMethod: SimpleRequestChainExecutionMethod;\n\n inputKey = \"function\";\n\n outputKey = \"response\";\n\n constructor(config: { requestMethod: SimpleRequestChainExecutionMethod }) {\n super();\n this.requestMethod = config.requestMethod;\n }\n\n get inputKeys() {\n return [this.inputKey];\n }\n\n get outputKeys() {\n return [this.outputKey];\n }\n\n _chainType() {\n return \"simple_request_chain\" as const;\n }\n\n /** @ignore */\n async _call(\n values: ChainValues,\n _runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const inputKeyValue = values[this.inputKey];\n const methodName = inputKeyValue.name;\n const args = inputKeyValue.arguments;\n const response = await this.requestMethod(methodName, args);\n return { [this.outputKey]: response };\n }\n}\n\n/**\n * Type representing the options for creating an OpenAPI chain.\n */\nexport type OpenAPIChainOptions = {\n llm?: BaseChatModel<BaseFunctionCallOptions>;\n prompt?: BasePromptTemplate;\n requestChain?: BaseChain;\n llmChainInputs?: LLMChainInput;\n headers?: Record<string, string>;\n params?: Record<string, string>;\n verbose?: boolean;\n};\n\n/**\n * Create a chain for querying an API from a OpenAPI spec.\n * @param spec OpenAPISpec or url/file/text string corresponding to one.\n * @param options Custom options passed into the chain\n * @returns OpenAPIChain\n */\nexport async function createOpenAPIChain(\n spec: OpenAPIV3_1.Document | string,\n options: OpenAPIChainOptions = {}\n) {\n let convertedSpec;\n if (typeof spec === \"string\") {\n try {\n convertedSpec = await OpenAPISpec.fromURL(spec);\n } catch {\n try {\n convertedSpec = OpenAPISpec.fromString(spec);\n } catch {\n throw new Error(`Unable to parse spec from source ${spec}.`);\n }\n }\n } else {\n convertedSpec = OpenAPISpec.fromObject(spec);\n }\n const { openAIFunctions, defaultExecutionMethod } =\n convertOpenAPISpecToOpenAIFunctions(convertedSpec);\n if (defaultExecutionMethod === undefined) {\n throw new Error(\n `Could not parse any valid operations from the provided spec.`\n );\n }\n\n if (!options.llm) {\n throw new Error(\"`llm` option is required\");\n }\n\n const {\n llm = options.llm,\n prompt = ChatPromptTemplate.fromMessages([\n HumanMessagePromptTemplate.fromTemplate(\n \"Use the provided API's to respond to this user query:\\n\\n{query}\"\n ),\n ]),\n requestChain = new SimpleRequestChain({\n requestMethod: async (name, args) =>\n defaultExecutionMethod(name, args, {\n headers: options.headers,\n params: options.params,\n }),\n }),\n llmChainInputs = {},\n verbose,\n ...rest\n } = options;\n const formatChain = new LLMChain({\n llm,\n prompt,\n outputParser: new JsonOutputFunctionsParser({ argsOnly: false }),\n outputKey: \"function\",\n llmKwargs: { functions: openAIFunctions },\n ...llmChainInputs,\n });\n return new SequentialChain({\n chains: [formatChain, requestChain],\n outputVariables: [\"response\"],\n inputVariables: formatChain.inputKeys,\n verbose,\n ...rest,\n });\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tagging.cjs","names":["PromptTemplate","JsonOutputFunctionsParser","LLMChain"],"sources":["../../../src/chains/openai_functions/tagging.ts"],"sourcesContent":["import { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { BaseFunctionCallOptions } from \"@langchain/core/language_models/base\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport { PromptTemplate } from \"@langchain/core/prompts\";\nimport { InteropZodObject } from \"@langchain/core/utils/types\";\nimport {\n type JsonSchema7ObjectType,\n toJsonSchema,\n} from \"@langchain/core/utils/json_schema\";\nimport {\n FunctionParameters,\n JsonOutputFunctionsParser,\n} from \"../../output_parsers/openai_functions.js\";\nimport { LLMChain, LLMChainInput } from \"../llm_chain.js\";\n\n/**\n * Type representing the options for creating a tagging chain.\n */\nexport type TaggingChainOptions = {\n prompt?: PromptTemplate;\n} & Omit<LLMChainInput<object>, \"prompt\" | \"llm\">;\n\n/**\n * Function that returns an array of tagging functions. These functions\n * are used to extract relevant information from a passage.\n * @param schema The schema defining the structure of function parameters.\n * @returns An array of tagging functions.\n */\nfunction getTaggingFunctions(schema: FunctionParameters) {\n return [\n {\n name: \"information_extraction\",\n description: \"Extracts the relevant information from the passage.\",\n parameters: schema,\n },\n ];\n}\n\nconst TAGGING_TEMPLATE = `Extract the desired information from the following passage.\n\nPassage:\n{input}\n`;\n\n/**\n * Function that creates a tagging chain using the provided schema,\n * LLM, and options. It constructs the LLM with the necessary\n * functions, prompt, output parser, and tags.\n * @param schema The schema defining the structure of function parameters.\n * @param llm LLM to use in the chain. Must support function calling.\n * @param options Options for creating the tagging chain.\n * @returns A new instance of LLMChain configured for tagging.\n *\n * @deprecated\n * Switch to expression language: https://js.langchain.com/docs/expression_language/\n * Will be removed in 0.2.0\n */\nexport function createTaggingChain(\n schema: FunctionParameters,\n llm: BaseChatModel<BaseFunctionCallOptions>,\n options: TaggingChainOptions = {}\n): LLMChain<object, BaseChatModel<BaseFunctionCallOptions, AIMessageChunk>> {\n const { prompt = PromptTemplate.fromTemplate(TAGGING_TEMPLATE), ...rest } =\n options;\n const functions = getTaggingFunctions(schema);\n const outputParser = new JsonOutputFunctionsParser();\n return new LLMChain({\n llm,\n prompt,\n llmKwargs: { functions },\n outputParser,\n tags: [\"openai_functions\", \"tagging\"],\n ...rest,\n });\n}\n\n/**\n * Function that creates a tagging chain from a Zod schema. It converts\n * the Zod schema to a JSON schema using the zodToJsonSchema function and\n * then calls createTaggingChain with the converted schema.\n * @param schema The Zod schema which extracted data should match.\n * @param llm LLM to use in the chain. Must support function calling.\n * @param options Options for creating the tagging chain.\n * @returns A new instance of LLMChain configured for tagging.\n *\n * @deprecated\n * Switch to expression language: https://js.langchain.com/docs/expression_language/\n * Will be removed in 0.2.0\n */\nexport function createTaggingChainFromZod(\n schema: InteropZodObject,\n llm: BaseChatModel<BaseFunctionCallOptions>,\n options?: TaggingChainOptions\n): LLMChain<object, BaseChatModel<BaseFunctionCallOptions, AIMessageChunk>> {\n return createTaggingChain(\n toJsonSchema(schema) as JsonSchema7ObjectType,\n llm,\n options\n );\n}\n"],"mappings":";;;;;;;;;;;AA4BA,SAAS,oBAAoB,QAA4B;CACvD,OAAO,CACL;EACE,MAAM;EACN,aAAa;EACb,YAAY;CACd,CACF;AACF;AAEA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;AAmBzB,SAAgB,mBACd,QACA,KACA,UAA+B,CAAC,GAC0C;CAC1E,MAAM,EAAE,SAASA,wBAAAA,eAAe,aAAa,gBAAgB,GAAG,GAAG,SACjE;CACF,MAAM,YAAY,oBAAoB,MAAM;CAC5C,MAAM,eAAe,IAAIC,yBAAAA,0BAA0B;CACnD,OAAO,IAAIC,kBAAAA,SAAS;EAClB;EACA;EACA,WAAW,EAAE,UAAU;EACvB;EACA,MAAM,CAAC,oBAAoB,SAAS;EACpC,GAAG;CACL,CAAC;AACH;;;;;;;;;;;;;;AAeA,SAAgB,0BACd,QACA,KACA,SAC0E;CAC1E,OAAO,oBAAA,GAAA,kCAAA,aAAA,CACQ,MAAM,GACnB,KACA,OACF;AACF"}
1
+ {"version":3,"file":"tagging.cjs","names":["PromptTemplate","JsonOutputFunctionsParser","LLMChain","toJsonSchema"],"sources":["../../../src/chains/openai_functions/tagging.ts"],"sourcesContent":["import { BaseChatModel } from \"@langchain/core/language_models/chat_models\";\nimport { BaseFunctionCallOptions } from \"@langchain/core/language_models/base\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport { PromptTemplate } from \"@langchain/core/prompts\";\nimport { InteropZodObject } from \"@langchain/core/utils/types\";\nimport {\n type JsonSchema7ObjectType,\n toJsonSchema,\n} from \"@langchain/core/utils/json_schema\";\nimport {\n FunctionParameters,\n JsonOutputFunctionsParser,\n} from \"../../output_parsers/openai_functions.js\";\nimport { LLMChain, LLMChainInput } from \"../llm_chain.js\";\n\n/**\n * Type representing the options for creating a tagging chain.\n */\nexport type TaggingChainOptions = {\n prompt?: PromptTemplate;\n} & Omit<LLMChainInput<object>, \"prompt\" | \"llm\">;\n\n/**\n * Function that returns an array of tagging functions. These functions\n * are used to extract relevant information from a passage.\n * @param schema The schema defining the structure of function parameters.\n * @returns An array of tagging functions.\n */\nfunction getTaggingFunctions(schema: FunctionParameters) {\n return [\n {\n name: \"information_extraction\",\n description: \"Extracts the relevant information from the passage.\",\n parameters: schema,\n },\n ];\n}\n\nconst TAGGING_TEMPLATE = `Extract the desired information from the following passage.\n\nPassage:\n{input}\n`;\n\n/**\n * Function that creates a tagging chain using the provided schema,\n * LLM, and options. It constructs the LLM with the necessary\n * functions, prompt, output parser, and tags.\n * @param schema The schema defining the structure of function parameters.\n * @param llm LLM to use in the chain. Must support function calling.\n * @param options Options for creating the tagging chain.\n * @returns A new instance of LLMChain configured for tagging.\n *\n * @deprecated\n * Switch to expression language: https://js.langchain.com/docs/expression_language/\n * Will be removed in 0.2.0\n */\nexport function createTaggingChain(\n schema: FunctionParameters,\n llm: BaseChatModel<BaseFunctionCallOptions>,\n options: TaggingChainOptions = {}\n): LLMChain<object, BaseChatModel<BaseFunctionCallOptions, AIMessageChunk>> {\n const { prompt = PromptTemplate.fromTemplate(TAGGING_TEMPLATE), ...rest } =\n options;\n const functions = getTaggingFunctions(schema);\n const outputParser = new JsonOutputFunctionsParser();\n return new LLMChain({\n llm,\n prompt,\n llmKwargs: { functions },\n outputParser,\n tags: [\"openai_functions\", \"tagging\"],\n ...rest,\n });\n}\n\n/**\n * Function that creates a tagging chain from a Zod schema. It converts\n * the Zod schema to a JSON schema using the zodToJsonSchema function and\n * then calls createTaggingChain with the converted schema.\n * @param schema The Zod schema which extracted data should match.\n * @param llm LLM to use in the chain. Must support function calling.\n * @param options Options for creating the tagging chain.\n * @returns A new instance of LLMChain configured for tagging.\n *\n * @deprecated\n * Switch to expression language: https://js.langchain.com/docs/expression_language/\n * Will be removed in 0.2.0\n */\nexport function createTaggingChainFromZod(\n schema: InteropZodObject,\n llm: BaseChatModel<BaseFunctionCallOptions>,\n options?: TaggingChainOptions\n): LLMChain<object, BaseChatModel<BaseFunctionCallOptions, AIMessageChunk>> {\n return createTaggingChain(\n toJsonSchema(schema) as JsonSchema7ObjectType,\n llm,\n options\n );\n}\n"],"mappings":";;;;;;;;;;;AA4BA,SAAS,oBAAoB,QAA4B;CACvD,OAAO,CACL;EACE,MAAM;EACN,aAAa;EACb,YAAY;CACd,CACF;AACF;AAEA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;AAmBzB,SAAgB,mBACd,QACA,KACA,UAA+B,CAAC,GAC0C;CAC1E,MAAM,EAAE,SAASA,wBAAAA,eAAe,aAAa,gBAAgB,GAAG,GAAG,SACjE;CACF,MAAM,YAAY,oBAAoB,MAAM;CAC5C,MAAM,eAAe,IAAIC,yBAAAA,0BAA0B;CACnD,OAAO,IAAIC,kBAAAA,SAAS;EAClB;EACA;EACA,WAAW,EAAE,UAAU;EACvB;EACA,MAAM,CAAC,oBAAoB,SAAS;EACpC,GAAG;CACL,CAAC;AACH;;;;;;;;;;;;;;AAeA,SAAgB,0BACd,QACA,KACA,SAC0E;CAC1E,OAAO,oBAAA,GACLC,kCAAAA,aAAAA,CAAa,MAAM,GACnB,KACA,OACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"openai_moderation.cjs","names":["BaseChain","OpenAIClient","AsyncCaller"],"sources":["../../src/chains/openai_moderation.ts"],"sourcesContent":["import { type ClientOptions, OpenAIClient } from \"@langchain/openai\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport {\n AsyncCaller,\n AsyncCallerParams,\n} from \"@langchain/core/utils/async_caller\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { BaseChain, ChainInputs } from \"./base.js\";\n\n/**\n * Interface for the input parameters of the OpenAIModerationChain class.\n */\nexport interface OpenAIModerationChainInput\n extends ChainInputs, AsyncCallerParams {\n apiKey?: string;\n /** @deprecated Use \"apiKey\" instead. */\n openAIApiKey?: string;\n openAIOrganization?: string;\n throwError?: boolean;\n configuration?: ClientOptions;\n}\n\n/**\n * Class representing a chain for moderating text using the OpenAI\n * Moderation API. It extends the BaseChain class and implements the\n * OpenAIModerationChainInput interface.\n * @example\n * ```typescript\n * const moderation = new OpenAIModerationChain({ throwError: true });\n *\n * const badString = \"Bad naughty words from user\";\n *\n * try {\n * const { output: moderatedContent, results } = await moderation.call({\n * input: badString,\n * });\n *\n * if (results[0].category_scores[\"harassment/threatening\"] > 0.01) {\n * throw new Error(\"Harassment detected!\");\n * }\n *\n * const model = new OpenAI({ temperature: 0 });\n * const promptTemplate = \"Hello, how are you today {person}?\";\n * const prompt = new PromptTemplate({\n * template: promptTemplate,\n * inputVariables: [\"person\"],\n * });\n * const chain = new LLMChain({ llm: model, prompt });\n * const response = await chain.call({ person: moderatedContent });\n * console.log({ response });\n * } catch (error) {\n * console.error(\"Naughty words detected!\");\n * }\n * ```\n */\nexport class OpenAIModerationChain\n extends BaseChain\n implements OpenAIModerationChainInput\n{\n static lc_name() {\n return \"OpenAIModerationChain\";\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n };\n }\n\n inputKey = \"input\";\n\n outputKey = \"output\";\n\n openAIApiKey?: string;\n\n openAIOrganization?: string;\n\n clientConfig: ClientOptions;\n\n client: OpenAIClient;\n\n throwError: boolean;\n\n caller: AsyncCaller;\n\n constructor(fields?: OpenAIModerationChainInput) {\n super(fields);\n this.throwError = fields?.throwError ?? false;\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n\n if (!this.openAIApiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n this.openAIOrganization = fields?.openAIOrganization;\n\n this.clientConfig = {\n ...fields?.configuration,\n apiKey: this.openAIApiKey,\n organization: this.openAIOrganization,\n };\n\n this.client = new OpenAIClient(this.clientConfig);\n\n this.caller = new AsyncCaller(fields ?? {});\n }\n\n _moderate(text: string, results: OpenAIClient.Moderation): string {\n if (results.flagged) {\n const errorStr = \"Text was found that violates OpenAI's content policy.\";\n if (this.throwError) {\n throw new Error(errorStr);\n } else {\n return errorStr;\n }\n }\n return text;\n }\n\n async _call(values: ChainValues): Promise<ChainValues> {\n const text = values[this.inputKey];\n const moderationRequest: OpenAIClient.ModerationCreateParams = {\n input: text,\n };\n let mod;\n try {\n mod = await this.caller.call(() =>\n this.client.moderations.create(moderationRequest)\n );\n } catch (error) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n throw error;\n } else {\n throw new Error(error as string);\n }\n }\n const output = this._moderate(text, mod.results[0]);\n return {\n [this.outputKey]: output,\n results: mod.results,\n };\n }\n\n _chainType() {\n return \"moderation_chain\";\n }\n\n get inputKeys(): string[] {\n return [this.inputKey];\n }\n\n get outputKeys(): string[] {\n return [this.outputKey];\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,IAAa,wBAAb,cACUA,aAAAA,UAEV;CACE,OAAO,UAAU;EACf,OAAO;CACT;CAEA,IAAI,aAAoD;EACtD,OAAO,EACL,cAAc,iBAChB;CACF;CAEA,WAAW;CAEX,YAAY;CAEZ;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,YAAY,QAAqC;EAC/C,MAAM,MAAM;EACZ,KAAK,aAAa,QAAQ,cAAc;EACxC,KAAK,eACH,QAAQ,UACR,QAAQ,iBAAA,GAAA,0BAAA,uBAAA,CACe,gBAAgB;EAEzC,IAAI,CAAC,KAAK,cACR,MAAM,IAAI,MAAM,0BAA0B;EAG5C,KAAK,qBAAqB,QAAQ;EAElC,KAAK,eAAe;GAClB,GAAG,QAAQ;GACX,QAAQ,KAAK;GACb,cAAc,KAAK;EACrB;EAEA,KAAK,SAAS,IAAIC,kBAAAA,aAAa,KAAK,YAAY;EAEhD,KAAK,SAAS,IAAIC,mCAAAA,YAAY,UAAU,CAAC,CAAC;CAC5C;CAEA,UAAU,MAAc,SAA0C;EAChE,IAAI,QAAQ,SAAS;GACnB,MAAM,WAAW;GACjB,IAAI,KAAK,YACP,MAAM,IAAI,MAAM,QAAQ;QAExB,OAAO;EAEX;EACA,OAAO;CACT;CAEA,MAAM,MAAM,QAA2C;EACrD,MAAM,OAAO,OAAO,KAAK;EACzB,MAAM,oBAAyD,EAC7D,OAAO,KACT;EACA,IAAI;EACJ,IAAI;GACF,MAAM,MAAM,KAAK,OAAO,WACtB,KAAK,OAAO,YAAY,OAAO,iBAAiB,CAClD;EACF,SAAS,OAAO;GAEd,IAAI,iBAAiB,OACnB,MAAM;QAEN,MAAM,IAAI,MAAM,KAAe;EAEnC;EACA,MAAM,SAAS,KAAK,UAAU,MAAM,IAAI,QAAQ,EAAE;EAClD,OAAO;IACJ,KAAK,YAAY;GAClB,SAAS,IAAI;EACf;CACF;CAEA,aAAa;EACX,OAAO;CACT;CAEA,IAAI,YAAsB;EACxB,OAAO,CAAC,KAAK,QAAQ;CACvB;CAEA,IAAI,aAAuB;EACzB,OAAO,CAAC,KAAK,SAAS;CACxB;AACF"}
1
+ {"version":3,"file":"openai_moderation.cjs","names":["BaseChain","getEnvironmentVariable","OpenAIClient","AsyncCaller"],"sources":["../../src/chains/openai_moderation.ts"],"sourcesContent":["import { type ClientOptions, OpenAIClient } from \"@langchain/openai\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport {\n AsyncCaller,\n AsyncCallerParams,\n} from \"@langchain/core/utils/async_caller\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { BaseChain, ChainInputs } from \"./base.js\";\n\n/**\n * Interface for the input parameters of the OpenAIModerationChain class.\n */\nexport interface OpenAIModerationChainInput\n extends ChainInputs, AsyncCallerParams {\n apiKey?: string;\n /** @deprecated Use \"apiKey\" instead. */\n openAIApiKey?: string;\n openAIOrganization?: string;\n throwError?: boolean;\n configuration?: ClientOptions;\n}\n\n/**\n * Class representing a chain for moderating text using the OpenAI\n * Moderation API. It extends the BaseChain class and implements the\n * OpenAIModerationChainInput interface.\n * @example\n * ```typescript\n * const moderation = new OpenAIModerationChain({ throwError: true });\n *\n * const badString = \"Bad naughty words from user\";\n *\n * try {\n * const { output: moderatedContent, results } = await moderation.call({\n * input: badString,\n * });\n *\n * if (results[0].category_scores[\"harassment/threatening\"] > 0.01) {\n * throw new Error(\"Harassment detected!\");\n * }\n *\n * const model = new OpenAI({ temperature: 0 });\n * const promptTemplate = \"Hello, how are you today {person}?\";\n * const prompt = new PromptTemplate({\n * template: promptTemplate,\n * inputVariables: [\"person\"],\n * });\n * const chain = new LLMChain({ llm: model, prompt });\n * const response = await chain.call({ person: moderatedContent });\n * console.log({ response });\n * } catch (error) {\n * console.error(\"Naughty words detected!\");\n * }\n * ```\n */\nexport class OpenAIModerationChain\n extends BaseChain\n implements OpenAIModerationChainInput\n{\n static lc_name() {\n return \"OpenAIModerationChain\";\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n openAIApiKey: \"OPENAI_API_KEY\",\n };\n }\n\n inputKey = \"input\";\n\n outputKey = \"output\";\n\n openAIApiKey?: string;\n\n openAIOrganization?: string;\n\n clientConfig: ClientOptions;\n\n client: OpenAIClient;\n\n throwError: boolean;\n\n caller: AsyncCaller;\n\n constructor(fields?: OpenAIModerationChainInput) {\n super(fields);\n this.throwError = fields?.throwError ?? false;\n this.openAIApiKey =\n fields?.apiKey ??\n fields?.openAIApiKey ??\n getEnvironmentVariable(\"OPENAI_API_KEY\");\n\n if (!this.openAIApiKey) {\n throw new Error(\"OpenAI API key not found\");\n }\n\n this.openAIOrganization = fields?.openAIOrganization;\n\n this.clientConfig = {\n ...fields?.configuration,\n apiKey: this.openAIApiKey,\n organization: this.openAIOrganization,\n };\n\n this.client = new OpenAIClient(this.clientConfig);\n\n this.caller = new AsyncCaller(fields ?? {});\n }\n\n _moderate(text: string, results: OpenAIClient.Moderation): string {\n if (results.flagged) {\n const errorStr = \"Text was found that violates OpenAI's content policy.\";\n if (this.throwError) {\n throw new Error(errorStr);\n } else {\n return errorStr;\n }\n }\n return text;\n }\n\n async _call(values: ChainValues): Promise<ChainValues> {\n const text = values[this.inputKey];\n const moderationRequest: OpenAIClient.ModerationCreateParams = {\n input: text,\n };\n let mod;\n try {\n mod = await this.caller.call(() =>\n this.client.moderations.create(moderationRequest)\n );\n } catch (error) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n if (error instanceof Error) {\n throw error;\n } else {\n throw new Error(error as string);\n }\n }\n const output = this._moderate(text, mod.results[0]);\n return {\n [this.outputKey]: output,\n results: mod.results,\n };\n }\n\n _chainType() {\n return \"moderation_chain\";\n }\n\n get inputKeys(): string[] {\n return [this.inputKey];\n }\n\n get outputKeys(): string[] {\n return [this.outputKey];\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,IAAa,wBAAb,cACUA,aAAAA,UAEV;CACE,OAAO,UAAU;EACf,OAAO;CACT;CAEA,IAAI,aAAoD;EACtD,OAAO,EACL,cAAc,iBAChB;CACF;CAEA,WAAW;CAEX,YAAY;CAEZ;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,YAAY,QAAqC;EAC/C,MAAM,MAAM;EACZ,KAAK,aAAa,QAAQ,cAAc;EACxC,KAAK,eACH,QAAQ,UACR,QAAQ,iBAAA,GACRC,0BAAAA,uBAAAA,CAAuB,gBAAgB;EAEzC,IAAI,CAAC,KAAK,cACR,MAAM,IAAI,MAAM,0BAA0B;EAG5C,KAAK,qBAAqB,QAAQ;EAElC,KAAK,eAAe;GAClB,GAAG,QAAQ;GACX,QAAQ,KAAK;GACb,cAAc,KAAK;EACrB;EAEA,KAAK,SAAS,IAAIC,kBAAAA,aAAa,KAAK,YAAY;EAEhD,KAAK,SAAS,IAAIC,mCAAAA,YAAY,UAAU,CAAC,CAAC;CAC5C;CAEA,UAAU,MAAc,SAA0C;EAChE,IAAI,QAAQ,SAAS;GACnB,MAAM,WAAW;GACjB,IAAI,KAAK,YACP,MAAM,IAAI,MAAM,QAAQ;QAExB,OAAO;EAEX;EACA,OAAO;CACT;CAEA,MAAM,MAAM,QAA2C;EACrD,MAAM,OAAO,OAAO,KAAK;EACzB,MAAM,oBAAyD,EAC7D,OAAO,KACT;EACA,IAAI;EACJ,IAAI;GACF,MAAM,MAAM,KAAK,OAAO,WACtB,KAAK,OAAO,YAAY,OAAO,iBAAiB,CAClD;EACF,SAAS,OAAO;GAEd,IAAI,iBAAiB,OACnB,MAAM;QAEN,MAAM,IAAI,MAAM,KAAe;EAEnC;EACA,MAAM,SAAS,KAAK,UAAU,MAAM,IAAI,QAAQ,EAAE;EAClD,OAAO;IACJ,KAAK,YAAY;GAClB,SAAS,IAAI;EACf;CACF;CAEA,aAAa;EACX,OAAO;CACT;CAEA,IAAI,YAAsB;EACxB,OAAO,CAAC,KAAK,QAAQ;CACvB;CAEA,IAAI,aAAuB;EACzB,OAAO,CAAC,KAAK,SAAS;CACxB;AACF"}
@@ -67,7 +67,10 @@ var StructuredQueryOutputParser = class StructuredQueryOutputParser extends requ
67
67
  let myQuery = query;
68
68
  if (myQuery.length === 0) myQuery = " ";
69
69
  if (filter === "NO_FILTER" || filter === void 0) return new _langchain_core_structured_query.StructuredQuery(query);
70
- else return new _langchain_core_structured_query.StructuredQuery(query, await this.queryTransformer.parse(filter));
70
+ else {
71
+ const parsedFilter = await this.queryTransformer.parse(filter);
72
+ return new _langchain_core_structured_query.StructuredQuery(query, parsedFilter);
73
+ }
71
74
  }
72
75
  /**
73
76
  * Creates a new StructuredQueryOutputParser instance from the provided
@@ -98,21 +101,24 @@ function _getPrompt(documentContents, attributeInfo, allowedComparators, allowed
98
101
  const myAllowedComparators = allowedComparators ?? Object.values(_langchain_core_structured_query.Comparators);
99
102
  const myAllowedOperators = allowedOperators ?? Object.values(_langchain_core_structured_query.Operators);
100
103
  const attributeJSON = formatAttributeInfo(attributeInfo);
101
- const prefix = (0, _langchain_core_prompts.interpolateFString)(require_prompt.DEFAULT_PREFIX, { schema: (0, _langchain_core_prompts.interpolateFString)(require_prompt.DEFAULT_SCHEMA, {
104
+ const schema = (0, _langchain_core_prompts.interpolateFString)(require_prompt.DEFAULT_SCHEMA, {
102
105
  allowed_comparators: myAllowedComparators.join(" | "),
103
106
  allowed_operators: myAllowedOperators.join(" | ")
104
- }) });
107
+ });
108
+ const prefix = (0, _langchain_core_prompts.interpolateFString)(require_prompt.DEFAULT_PREFIX, { schema });
109
+ const suffix = (0, _langchain_core_prompts.interpolateFString)(require_prompt.DEFAULT_SUFFIX, {
110
+ i: examples.length + 1,
111
+ content: documentContents,
112
+ attributes: attributeJSON
113
+ });
114
+ const outputParser = StructuredQueryOutputParser.fromComponents(allowedComparators, allowedOperators);
105
115
  return new _langchain_core_prompts.FewShotPromptTemplate({
106
116
  examples,
107
117
  examplePrompt: require_prompt.EXAMPLE_PROMPT,
108
118
  inputVariables: ["query"],
109
- suffix: (0, _langchain_core_prompts.interpolateFString)(require_prompt.DEFAULT_SUFFIX, {
110
- i: examples.length + 1,
111
- content: documentContents,
112
- attributes: attributeJSON
113
- }),
119
+ suffix,
114
120
  prefix,
115
- outputParser: StructuredQueryOutputParser.fromComponents(allowedComparators, allowedOperators)
121
+ outputParser
116
122
  });
117
123
  }
118
124
  function loadQueryConstructorRunnable(opts) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["AsymmetricStructuredOutputParser","QueryTransformer","StructuredQuery","DEFAULT_EXAMPLES","Comparators","Operators","DEFAULT_PREFIX","DEFAULT_SCHEMA","FewShotPromptTemplate","EXAMPLE_PROMPT","DEFAULT_SUFFIX"],"sources":["../../../src/chains/query_constructor/index.ts"],"sourcesContent":["import { z } from \"zod/v3\";\nimport type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport {\n Example,\n interpolateFString,\n FewShotPromptTemplate,\n} from \"@langchain/core/prompts\";\nimport {\n InferInteropZodOutput,\n InputValues,\n} from \"@langchain/core/utils/types\";\nimport {\n Comparator,\n Comparators,\n Operator,\n Operators,\n StructuredQuery,\n} from \"@langchain/core/structured_query\";\nimport { Runnable, RunnableConfig } from \"@langchain/core/runnables\";\nimport { QueryTransformer, TraverseType } from \"./parser.js\";\nimport {\n DEFAULT_EXAMPLES,\n DEFAULT_PREFIX,\n DEFAULT_SCHEMA,\n DEFAULT_SUFFIX,\n EXAMPLE_PROMPT,\n} from \"./prompt.js\";\nimport { AsymmetricStructuredOutputParser } from \"../../output_parsers/structured.js\";\n\n/**\n * A simple data structure that holds information about an attribute. It\n * is typically used to provide metadata about attributes in other classes\n * or data structures within the LangChain framework.\n */\nexport class AttributeInfo {\n constructor(\n public name: string,\n public type: string,\n public description: string\n ) {}\n}\n\nexport { QueryTransformer, type TraverseType };\nexport {\n DEFAULT_EXAMPLES,\n DEFAULT_PREFIX,\n DEFAULT_SCHEMA,\n DEFAULT_SUFFIX,\n EXAMPLE_PROMPT,\n};\n\nconst queryInputSchema = /* #__PURE__ */ z.object({\n query: /* #__PURE__ */ z\n .string()\n .describe(\"text string to compare to document contents\"),\n filter: /* #__PURE__ */ z\n .string()\n .optional()\n .describe(\"logical condition statement for filtering documents\"),\n});\n\n/**\n * A class that extends AsymmetricStructuredOutputParser to parse\n * structured query output.\n */\nexport class StructuredQueryOutputParser extends AsymmetricStructuredOutputParser<\n typeof queryInputSchema,\n StructuredQuery\n> {\n lc_namespace = [\"langchain\", \"chains\", \"query_constructor\"];\n\n queryTransformer: QueryTransformer;\n\n constructor(fields: {\n allowedComparators: Comparator[];\n allowedOperators: Operator[];\n }) {\n super({ ...fields, inputSchema: queryInputSchema });\n\n const { allowedComparators, allowedOperators } = fields;\n this.queryTransformer = new QueryTransformer(\n allowedComparators,\n allowedOperators\n );\n }\n\n /**\n * Processes the output of a structured query.\n * @param query The query string.\n * @param filter The filter condition.\n * @returns A Promise that resolves to a StructuredQuery instance.\n */\n async outputProcessor({\n query,\n filter,\n }: InferInteropZodOutput<typeof queryInputSchema>): Promise<StructuredQuery> {\n let myQuery = query;\n if (myQuery.length === 0) {\n myQuery = \" \";\n }\n if (filter === \"NO_FILTER\" || filter === undefined) {\n return new StructuredQuery(query);\n } else {\n const parsedFilter = await this.queryTransformer.parse(filter);\n return new StructuredQuery(query, parsedFilter);\n }\n }\n\n /**\n * Creates a new StructuredQueryOutputParser instance from the provided\n * components.\n * @param allowedComparators An array of allowed Comparator instances.\n * @param allowedOperators An array of allowed Operator instances.\n * @returns A new StructuredQueryOutputParser instance.\n */\n static fromComponents(\n allowedComparators: Comparator[] = [],\n allowedOperators: Operator[] = []\n ) {\n return new StructuredQueryOutputParser({\n allowedComparators,\n allowedOperators,\n });\n }\n}\n\nexport function formatAttributeInfo(info: AttributeInfo[]) {\n const infoObj = info.reduce(\n (acc, attr) => {\n acc[attr.name] = {\n type: attr.type,\n description: attr.description,\n };\n return acc;\n },\n {} as { [name: string]: { type: string; description: string } }\n );\n\n return JSON.stringify(infoObj, null, 2)\n .replaceAll(\"{\", \"{{\")\n .replaceAll(\"}\", \"}}\");\n}\n\nconst defaultExample = DEFAULT_EXAMPLES.map((EXAMPLE) => EXAMPLE as Example);\n\nfunction _getPrompt(\n documentContents: string,\n attributeInfo: AttributeInfo[],\n allowedComparators?: Comparator[],\n allowedOperators?: Operator[],\n examples: InputValues[] = defaultExample\n) {\n const myAllowedComparators: Comparator[] =\n allowedComparators ?? Object.values(Comparators);\n const myAllowedOperators: Operator[] =\n allowedOperators ?? Object.values(Operators);\n const attributeJSON = formatAttributeInfo(attributeInfo);\n const schema = interpolateFString(DEFAULT_SCHEMA, {\n allowed_comparators: myAllowedComparators.join(\" | \"),\n allowed_operators: myAllowedOperators.join(\" | \"),\n });\n const prefix = interpolateFString(DEFAULT_PREFIX, {\n schema,\n });\n const suffix = interpolateFString(DEFAULT_SUFFIX, {\n i: examples.length + 1,\n content: documentContents,\n attributes: attributeJSON,\n });\n\n const outputParser = StructuredQueryOutputParser.fromComponents(\n allowedComparators,\n allowedOperators\n );\n\n return new FewShotPromptTemplate({\n examples,\n examplePrompt: EXAMPLE_PROMPT,\n inputVariables: [\"query\"],\n suffix,\n prefix,\n outputParser,\n });\n}\n\n/**\n * A type that represents options for the query constructor chain.\n */\nexport type QueryConstructorRunnableOptions = {\n llm: BaseLanguageModelInterface;\n documentContents: string;\n attributeInfo: AttributeInfo[];\n examples?: InputValues[];\n allowedComparators?: Comparator[];\n allowedOperators?: Operator[];\n};\n\n/** @deprecated */\nexport type QueryConstructorChainOptions = QueryConstructorRunnableOptions;\n\nexport function loadQueryConstructorRunnable(\n opts: QueryConstructorRunnableOptions\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n): Runnable<any, StructuredQuery, RunnableConfig<Record<string, any>>> {\n const prompt = _getPrompt(\n opts.documentContents,\n opts.attributeInfo,\n opts.allowedComparators,\n opts.allowedOperators,\n opts.examples\n );\n const outputParser = StructuredQueryOutputParser.fromComponents(\n opts.allowedComparators,\n opts.allowedOperators\n );\n return prompt.pipe(opts.llm).pipe(outputParser);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,gBAAb,MAA2B;CAEhB;CACA;CACA;CAHT,YACE,MACA,MACA,aACA;EAHO,KAAA,OAAA;EACA,KAAA,OAAA;EACA,KAAA,cAAA;CACN;AACL;AAWA,MAAM,mBAAmC,uBAAA,EAAE,OAAO;CAChD,OAAuB,uBAAA,EACpB,OAAO,CAAC,CACR,SAAS,6CAA6C;CACzD,QAAwB,uBAAA,EACrB,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,qDAAqD;AACnE,CAAC;;;;;AAMD,IAAa,8BAAb,MAAa,oCAAoCA,mBAAAA,iCAG/C;CACA,eAAe;EAAC;EAAa;EAAU;CAAmB;CAE1D;CAEA,YAAY,QAGT;EACD,MAAM;GAAE,GAAG;GAAQ,aAAa;EAAiB,CAAC;EAElD,MAAM,EAAE,oBAAoB,qBAAqB;EACjD,KAAK,mBAAmB,IAAIC,eAAAA,iBAC1B,oBACA,gBACF;CACF;;;;;;;CAQA,MAAM,gBAAgB,EACpB,OACA,UAC2E;EAC3E,IAAI,UAAU;EACd,IAAI,QAAQ,WAAW,GACrB,UAAU;EAEZ,IAAI,WAAW,eAAe,WAAW,KAAA,GACvC,OAAO,IAAIC,iCAAAA,gBAAgB,KAAK;OAGhC,OAAO,IAAIA,iCAAAA,gBAAgB,OAAO,MADP,KAAK,iBAAiB,MAAM,MAAM,CACf;CAElD;;;;;;;;CASA,OAAO,eACL,qBAAmC,CAAC,GACpC,mBAA+B,CAAC,GAChC;EACA,OAAO,IAAI,4BAA4B;GACrC;GACA;EACF,CAAC;CACH;AACF;AAEA,SAAgB,oBAAoB,MAAuB;CACzD,MAAM,UAAU,KAAK,QAClB,KAAK,SAAS;EACb,IAAI,KAAK,QAAQ;GACf,MAAM,KAAK;GACX,aAAa,KAAK;EACpB;EACA,OAAO;CACT,GACA,CAAC,CACH;CAEA,OAAO,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC,CACpC,WAAW,KAAK,IAAI,CAAC,CACrB,WAAW,KAAK,IAAI;AACzB;AAEA,MAAM,iBAAiBC,eAAAA,iBAAiB,KAAK,YAAY,OAAkB;AAE3E,SAAS,WACP,kBACA,eACA,oBACA,kBACA,WAA0B,gBAC1B;CACA,MAAM,uBACJ,sBAAsB,OAAO,OAAOC,iCAAAA,WAAW;CACjD,MAAM,qBACJ,oBAAoB,OAAO,OAAOC,iCAAAA,SAAS;CAC7C,MAAM,gBAAgB,oBAAoB,aAAa;CAKvD,MAAM,UAAA,GAAA,wBAAA,mBAAA,CAA4BC,eAAAA,gBAAgB,EAChD,SAAA,GAAA,wBAAA,mBAAA,CALgCC,eAAAA,gBAAgB;EAChD,qBAAqB,qBAAqB,KAAK,KAAK;EACpD,mBAAmB,mBAAmB,KAAK,KAAK;CAClD,CAEO,EACP,CAAC;CAYD,OAAO,IAAIC,wBAAAA,sBAAsB;EAC/B;EACA,eAAeC,eAAAA;EACf,gBAAgB,CAAC,OAAO;EACxB,SAAA,GAAA,wBAAA,mBAAA,CAfgCC,eAAAA,gBAAgB;GAChD,GAAG,SAAS,SAAS;GACrB,SAAS;GACT,YAAY;EACd,CAWO;EACL;EACA,cAXmB,4BAA4B,eAC/C,oBACA,gBASW;CACb,CAAC;AACH;AAiBA,SAAgB,6BACd,MAEqE;CACrE,MAAM,SAAS,WACb,KAAK,kBACL,KAAK,eACL,KAAK,oBACL,KAAK,kBACL,KAAK,QACP;CACA,MAAM,eAAe,4BAA4B,eAC/C,KAAK,oBACL,KAAK,gBACP;CACA,OAAO,OAAO,KAAK,KAAK,GAAG,CAAC,CAAC,KAAK,YAAY;AAChD"}
1
+ {"version":3,"file":"index.cjs","names":["AsymmetricStructuredOutputParser","QueryTransformer","StructuredQuery","DEFAULT_EXAMPLES","Comparators","Operators","interpolateFString","DEFAULT_SCHEMA","DEFAULT_PREFIX","DEFAULT_SUFFIX","FewShotPromptTemplate","EXAMPLE_PROMPT"],"sources":["../../../src/chains/query_constructor/index.ts"],"sourcesContent":["import { z } from \"zod/v3\";\nimport type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport {\n Example,\n interpolateFString,\n FewShotPromptTemplate,\n} from \"@langchain/core/prompts\";\nimport {\n InferInteropZodOutput,\n InputValues,\n} from \"@langchain/core/utils/types\";\nimport {\n Comparator,\n Comparators,\n Operator,\n Operators,\n StructuredQuery,\n} from \"@langchain/core/structured_query\";\nimport { Runnable, RunnableConfig } from \"@langchain/core/runnables\";\nimport { QueryTransformer, TraverseType } from \"./parser.js\";\nimport {\n DEFAULT_EXAMPLES,\n DEFAULT_PREFIX,\n DEFAULT_SCHEMA,\n DEFAULT_SUFFIX,\n EXAMPLE_PROMPT,\n} from \"./prompt.js\";\nimport { AsymmetricStructuredOutputParser } from \"../../output_parsers/structured.js\";\n\n/**\n * A simple data structure that holds information about an attribute. It\n * is typically used to provide metadata about attributes in other classes\n * or data structures within the LangChain framework.\n */\nexport class AttributeInfo {\n constructor(\n public name: string,\n public type: string,\n public description: string\n ) {}\n}\n\nexport { QueryTransformer, type TraverseType };\nexport {\n DEFAULT_EXAMPLES,\n DEFAULT_PREFIX,\n DEFAULT_SCHEMA,\n DEFAULT_SUFFIX,\n EXAMPLE_PROMPT,\n};\n\nconst queryInputSchema = /* #__PURE__ */ z.object({\n query: /* #__PURE__ */ z\n .string()\n .describe(\"text string to compare to document contents\"),\n filter: /* #__PURE__ */ z\n .string()\n .optional()\n .describe(\"logical condition statement for filtering documents\"),\n});\n\n/**\n * A class that extends AsymmetricStructuredOutputParser to parse\n * structured query output.\n */\nexport class StructuredQueryOutputParser extends AsymmetricStructuredOutputParser<\n typeof queryInputSchema,\n StructuredQuery\n> {\n lc_namespace = [\"langchain\", \"chains\", \"query_constructor\"];\n\n queryTransformer: QueryTransformer;\n\n constructor(fields: {\n allowedComparators: Comparator[];\n allowedOperators: Operator[];\n }) {\n super({ ...fields, inputSchema: queryInputSchema });\n\n const { allowedComparators, allowedOperators } = fields;\n this.queryTransformer = new QueryTransformer(\n allowedComparators,\n allowedOperators\n );\n }\n\n /**\n * Processes the output of a structured query.\n * @param query The query string.\n * @param filter The filter condition.\n * @returns A Promise that resolves to a StructuredQuery instance.\n */\n async outputProcessor({\n query,\n filter,\n }: InferInteropZodOutput<typeof queryInputSchema>): Promise<StructuredQuery> {\n let myQuery = query;\n if (myQuery.length === 0) {\n myQuery = \" \";\n }\n if (filter === \"NO_FILTER\" || filter === undefined) {\n return new StructuredQuery(query);\n } else {\n const parsedFilter = await this.queryTransformer.parse(filter);\n return new StructuredQuery(query, parsedFilter);\n }\n }\n\n /**\n * Creates a new StructuredQueryOutputParser instance from the provided\n * components.\n * @param allowedComparators An array of allowed Comparator instances.\n * @param allowedOperators An array of allowed Operator instances.\n * @returns A new StructuredQueryOutputParser instance.\n */\n static fromComponents(\n allowedComparators: Comparator[] = [],\n allowedOperators: Operator[] = []\n ) {\n return new StructuredQueryOutputParser({\n allowedComparators,\n allowedOperators,\n });\n }\n}\n\nexport function formatAttributeInfo(info: AttributeInfo[]) {\n const infoObj = info.reduce(\n (acc, attr) => {\n acc[attr.name] = {\n type: attr.type,\n description: attr.description,\n };\n return acc;\n },\n {} as { [name: string]: { type: string; description: string } }\n );\n\n return JSON.stringify(infoObj, null, 2)\n .replaceAll(\"{\", \"{{\")\n .replaceAll(\"}\", \"}}\");\n}\n\nconst defaultExample = DEFAULT_EXAMPLES.map((EXAMPLE) => EXAMPLE as Example);\n\nfunction _getPrompt(\n documentContents: string,\n attributeInfo: AttributeInfo[],\n allowedComparators?: Comparator[],\n allowedOperators?: Operator[],\n examples: InputValues[] = defaultExample\n) {\n const myAllowedComparators: Comparator[] =\n allowedComparators ?? Object.values(Comparators);\n const myAllowedOperators: Operator[] =\n allowedOperators ?? Object.values(Operators);\n const attributeJSON = formatAttributeInfo(attributeInfo);\n const schema = interpolateFString(DEFAULT_SCHEMA, {\n allowed_comparators: myAllowedComparators.join(\" | \"),\n allowed_operators: myAllowedOperators.join(\" | \"),\n });\n const prefix = interpolateFString(DEFAULT_PREFIX, {\n schema,\n });\n const suffix = interpolateFString(DEFAULT_SUFFIX, {\n i: examples.length + 1,\n content: documentContents,\n attributes: attributeJSON,\n });\n\n const outputParser = StructuredQueryOutputParser.fromComponents(\n allowedComparators,\n allowedOperators\n );\n\n return new FewShotPromptTemplate({\n examples,\n examplePrompt: EXAMPLE_PROMPT,\n inputVariables: [\"query\"],\n suffix,\n prefix,\n outputParser,\n });\n}\n\n/**\n * A type that represents options for the query constructor chain.\n */\nexport type QueryConstructorRunnableOptions = {\n llm: BaseLanguageModelInterface;\n documentContents: string;\n attributeInfo: AttributeInfo[];\n examples?: InputValues[];\n allowedComparators?: Comparator[];\n allowedOperators?: Operator[];\n};\n\n/** @deprecated */\nexport type QueryConstructorChainOptions = QueryConstructorRunnableOptions;\n\nexport function loadQueryConstructorRunnable(\n opts: QueryConstructorRunnableOptions\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n): Runnable<any, StructuredQuery, RunnableConfig<Record<string, any>>> {\n const prompt = _getPrompt(\n opts.documentContents,\n opts.attributeInfo,\n opts.allowedComparators,\n opts.allowedOperators,\n opts.examples\n );\n const outputParser = StructuredQueryOutputParser.fromComponents(\n opts.allowedComparators,\n opts.allowedOperators\n );\n return prompt.pipe(opts.llm).pipe(outputParser);\n}\n"],"mappings":"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"}
@@ -66,7 +66,10 @@ var StructuredQueryOutputParser = class StructuredQueryOutputParser extends Asym
66
66
  let myQuery = query;
67
67
  if (myQuery.length === 0) myQuery = " ";
68
68
  if (filter === "NO_FILTER" || filter === void 0) return new StructuredQuery(query);
69
- else return new StructuredQuery(query, await this.queryTransformer.parse(filter));
69
+ else {
70
+ const parsedFilter = await this.queryTransformer.parse(filter);
71
+ return new StructuredQuery(query, parsedFilter);
72
+ }
70
73
  }
71
74
  /**
72
75
  * Creates a new StructuredQueryOutputParser instance from the provided
@@ -97,21 +100,24 @@ function _getPrompt(documentContents, attributeInfo, allowedComparators, allowed
97
100
  const myAllowedComparators = allowedComparators ?? Object.values(Comparators);
98
101
  const myAllowedOperators = allowedOperators ?? Object.values(Operators);
99
102
  const attributeJSON = formatAttributeInfo(attributeInfo);
100
- const prefix = interpolateFString(DEFAULT_PREFIX, { schema: interpolateFString(DEFAULT_SCHEMA, {
103
+ const schema = interpolateFString(DEFAULT_SCHEMA, {
101
104
  allowed_comparators: myAllowedComparators.join(" | "),
102
105
  allowed_operators: myAllowedOperators.join(" | ")
103
- }) });
106
+ });
107
+ const prefix = interpolateFString(DEFAULT_PREFIX, { schema });
108
+ const suffix = interpolateFString(DEFAULT_SUFFIX, {
109
+ i: examples.length + 1,
110
+ content: documentContents,
111
+ attributes: attributeJSON
112
+ });
113
+ const outputParser = StructuredQueryOutputParser.fromComponents(allowedComparators, allowedOperators);
104
114
  return new FewShotPromptTemplate({
105
115
  examples,
106
116
  examplePrompt: EXAMPLE_PROMPT,
107
117
  inputVariables: ["query"],
108
- suffix: interpolateFString(DEFAULT_SUFFIX, {
109
- i: examples.length + 1,
110
- content: documentContents,
111
- attributes: attributeJSON
112
- }),
118
+ suffix,
113
119
  prefix,
114
- outputParser: StructuredQueryOutputParser.fromComponents(allowedComparators, allowedOperators)
120
+ outputParser
115
121
  });
116
122
  }
117
123
  function loadQueryConstructorRunnable(opts) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/chains/query_constructor/index.ts"],"sourcesContent":["import { z } from \"zod/v3\";\nimport type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport {\n Example,\n interpolateFString,\n FewShotPromptTemplate,\n} from \"@langchain/core/prompts\";\nimport {\n InferInteropZodOutput,\n InputValues,\n} from \"@langchain/core/utils/types\";\nimport {\n Comparator,\n Comparators,\n Operator,\n Operators,\n StructuredQuery,\n} from \"@langchain/core/structured_query\";\nimport { Runnable, RunnableConfig } from \"@langchain/core/runnables\";\nimport { QueryTransformer, TraverseType } from \"./parser.js\";\nimport {\n DEFAULT_EXAMPLES,\n DEFAULT_PREFIX,\n DEFAULT_SCHEMA,\n DEFAULT_SUFFIX,\n EXAMPLE_PROMPT,\n} from \"./prompt.js\";\nimport { AsymmetricStructuredOutputParser } from \"../../output_parsers/structured.js\";\n\n/**\n * A simple data structure that holds information about an attribute. It\n * is typically used to provide metadata about attributes in other classes\n * or data structures within the LangChain framework.\n */\nexport class AttributeInfo {\n constructor(\n public name: string,\n public type: string,\n public description: string\n ) {}\n}\n\nexport { QueryTransformer, type TraverseType };\nexport {\n DEFAULT_EXAMPLES,\n DEFAULT_PREFIX,\n DEFAULT_SCHEMA,\n DEFAULT_SUFFIX,\n EXAMPLE_PROMPT,\n};\n\nconst queryInputSchema = /* #__PURE__ */ z.object({\n query: /* #__PURE__ */ z\n .string()\n .describe(\"text string to compare to document contents\"),\n filter: /* #__PURE__ */ z\n .string()\n .optional()\n .describe(\"logical condition statement for filtering documents\"),\n});\n\n/**\n * A class that extends AsymmetricStructuredOutputParser to parse\n * structured query output.\n */\nexport class StructuredQueryOutputParser extends AsymmetricStructuredOutputParser<\n typeof queryInputSchema,\n StructuredQuery\n> {\n lc_namespace = [\"langchain\", \"chains\", \"query_constructor\"];\n\n queryTransformer: QueryTransformer;\n\n constructor(fields: {\n allowedComparators: Comparator[];\n allowedOperators: Operator[];\n }) {\n super({ ...fields, inputSchema: queryInputSchema });\n\n const { allowedComparators, allowedOperators } = fields;\n this.queryTransformer = new QueryTransformer(\n allowedComparators,\n allowedOperators\n );\n }\n\n /**\n * Processes the output of a structured query.\n * @param query The query string.\n * @param filter The filter condition.\n * @returns A Promise that resolves to a StructuredQuery instance.\n */\n async outputProcessor({\n query,\n filter,\n }: InferInteropZodOutput<typeof queryInputSchema>): Promise<StructuredQuery> {\n let myQuery = query;\n if (myQuery.length === 0) {\n myQuery = \" \";\n }\n if (filter === \"NO_FILTER\" || filter === undefined) {\n return new StructuredQuery(query);\n } else {\n const parsedFilter = await this.queryTransformer.parse(filter);\n return new StructuredQuery(query, parsedFilter);\n }\n }\n\n /**\n * Creates a new StructuredQueryOutputParser instance from the provided\n * components.\n * @param allowedComparators An array of allowed Comparator instances.\n * @param allowedOperators An array of allowed Operator instances.\n * @returns A new StructuredQueryOutputParser instance.\n */\n static fromComponents(\n allowedComparators: Comparator[] = [],\n allowedOperators: Operator[] = []\n ) {\n return new StructuredQueryOutputParser({\n allowedComparators,\n allowedOperators,\n });\n }\n}\n\nexport function formatAttributeInfo(info: AttributeInfo[]) {\n const infoObj = info.reduce(\n (acc, attr) => {\n acc[attr.name] = {\n type: attr.type,\n description: attr.description,\n };\n return acc;\n },\n {} as { [name: string]: { type: string; description: string } }\n );\n\n return JSON.stringify(infoObj, null, 2)\n .replaceAll(\"{\", \"{{\")\n .replaceAll(\"}\", \"}}\");\n}\n\nconst defaultExample = DEFAULT_EXAMPLES.map((EXAMPLE) => EXAMPLE as Example);\n\nfunction _getPrompt(\n documentContents: string,\n attributeInfo: AttributeInfo[],\n allowedComparators?: Comparator[],\n allowedOperators?: Operator[],\n examples: InputValues[] = defaultExample\n) {\n const myAllowedComparators: Comparator[] =\n allowedComparators ?? Object.values(Comparators);\n const myAllowedOperators: Operator[] =\n allowedOperators ?? Object.values(Operators);\n const attributeJSON = formatAttributeInfo(attributeInfo);\n const schema = interpolateFString(DEFAULT_SCHEMA, {\n allowed_comparators: myAllowedComparators.join(\" | \"),\n allowed_operators: myAllowedOperators.join(\" | \"),\n });\n const prefix = interpolateFString(DEFAULT_PREFIX, {\n schema,\n });\n const suffix = interpolateFString(DEFAULT_SUFFIX, {\n i: examples.length + 1,\n content: documentContents,\n attributes: attributeJSON,\n });\n\n const outputParser = StructuredQueryOutputParser.fromComponents(\n allowedComparators,\n allowedOperators\n );\n\n return new FewShotPromptTemplate({\n examples,\n examplePrompt: EXAMPLE_PROMPT,\n inputVariables: [\"query\"],\n suffix,\n prefix,\n outputParser,\n });\n}\n\n/**\n * A type that represents options for the query constructor chain.\n */\nexport type QueryConstructorRunnableOptions = {\n llm: BaseLanguageModelInterface;\n documentContents: string;\n attributeInfo: AttributeInfo[];\n examples?: InputValues[];\n allowedComparators?: Comparator[];\n allowedOperators?: Operator[];\n};\n\n/** @deprecated */\nexport type QueryConstructorChainOptions = QueryConstructorRunnableOptions;\n\nexport function loadQueryConstructorRunnable(\n opts: QueryConstructorRunnableOptions\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n): Runnable<any, StructuredQuery, RunnableConfig<Record<string, any>>> {\n const prompt = _getPrompt(\n opts.documentContents,\n opts.attributeInfo,\n opts.allowedComparators,\n opts.allowedOperators,\n opts.examples\n );\n const outputParser = StructuredQueryOutputParser.fromComponents(\n opts.allowedComparators,\n opts.allowedOperators\n );\n return prompt.pipe(opts.llm).pipe(outputParser);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,gBAAb,MAA2B;CAEhB;CACA;CACA;CAHT,YACE,MACA,MACA,aACA;EAHO,KAAA,OAAA;EACA,KAAA,OAAA;EACA,KAAA,cAAA;CACN;AACL;AAWA,MAAM,mBAAmC,kBAAE,OAAO;CAChD,OAAuB,kBACpB,OAAO,CAAC,CACR,SAAS,6CAA6C;CACzD,QAAwB,kBACrB,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,qDAAqD;AACnE,CAAC;;;;;AAMD,IAAa,8BAAb,MAAa,oCAAoC,iCAG/C;CACA,eAAe;EAAC;EAAa;EAAU;CAAmB;CAE1D;CAEA,YAAY,QAGT;EACD,MAAM;GAAE,GAAG;GAAQ,aAAa;EAAiB,CAAC;EAElD,MAAM,EAAE,oBAAoB,qBAAqB;EACjD,KAAK,mBAAmB,IAAI,iBAC1B,oBACA,gBACF;CACF;;;;;;;CAQA,MAAM,gBAAgB,EACpB,OACA,UAC2E;EAC3E,IAAI,UAAU;EACd,IAAI,QAAQ,WAAW,GACrB,UAAU;EAEZ,IAAI,WAAW,eAAe,WAAW,KAAA,GACvC,OAAO,IAAI,gBAAgB,KAAK;OAGhC,OAAO,IAAI,gBAAgB,OAAO,MADP,KAAK,iBAAiB,MAAM,MAAM,CACf;CAElD;;;;;;;;CASA,OAAO,eACL,qBAAmC,CAAC,GACpC,mBAA+B,CAAC,GAChC;EACA,OAAO,IAAI,4BAA4B;GACrC;GACA;EACF,CAAC;CACH;AACF;AAEA,SAAgB,oBAAoB,MAAuB;CACzD,MAAM,UAAU,KAAK,QAClB,KAAK,SAAS;EACb,IAAI,KAAK,QAAQ;GACf,MAAM,KAAK;GACX,aAAa,KAAK;EACpB;EACA,OAAO;CACT,GACA,CAAC,CACH;CAEA,OAAO,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC,CACpC,WAAW,KAAK,IAAI,CAAC,CACrB,WAAW,KAAK,IAAI;AACzB;AAEA,MAAM,iBAAiB,iBAAiB,KAAK,YAAY,OAAkB;AAE3E,SAAS,WACP,kBACA,eACA,oBACA,kBACA,WAA0B,gBAC1B;CACA,MAAM,uBACJ,sBAAsB,OAAO,OAAO,WAAW;CACjD,MAAM,qBACJ,oBAAoB,OAAO,OAAO,SAAS;CAC7C,MAAM,gBAAgB,oBAAoB,aAAa;CAKvD,MAAM,SAAS,mBAAmB,gBAAgB,EAChD,QALa,mBAAmB,gBAAgB;EAChD,qBAAqB,qBAAqB,KAAK,KAAK;EACpD,mBAAmB,mBAAmB,KAAK,KAAK;CAClD,CAEO,EACP,CAAC;CAYD,OAAO,IAAI,sBAAsB;EAC/B;EACA,eAAe;EACf,gBAAgB,CAAC,OAAO;EACxB,QAfa,mBAAmB,gBAAgB;GAChD,GAAG,SAAS,SAAS;GACrB,SAAS;GACT,YAAY;EACd,CAWO;EACL;EACA,cAXmB,4BAA4B,eAC/C,oBACA,gBASW;CACb,CAAC;AACH;AAiBA,SAAgB,6BACd,MAEqE;CACrE,MAAM,SAAS,WACb,KAAK,kBACL,KAAK,eACL,KAAK,oBACL,KAAK,kBACL,KAAK,QACP;CACA,MAAM,eAAe,4BAA4B,eAC/C,KAAK,oBACL,KAAK,gBACP;CACA,OAAO,OAAO,KAAK,KAAK,GAAG,CAAC,CAAC,KAAK,YAAY;AAChD"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/chains/query_constructor/index.ts"],"sourcesContent":["import { z } from \"zod/v3\";\nimport type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport {\n Example,\n interpolateFString,\n FewShotPromptTemplate,\n} from \"@langchain/core/prompts\";\nimport {\n InferInteropZodOutput,\n InputValues,\n} from \"@langchain/core/utils/types\";\nimport {\n Comparator,\n Comparators,\n Operator,\n Operators,\n StructuredQuery,\n} from \"@langchain/core/structured_query\";\nimport { Runnable, RunnableConfig } from \"@langchain/core/runnables\";\nimport { QueryTransformer, TraverseType } from \"./parser.js\";\nimport {\n DEFAULT_EXAMPLES,\n DEFAULT_PREFIX,\n DEFAULT_SCHEMA,\n DEFAULT_SUFFIX,\n EXAMPLE_PROMPT,\n} from \"./prompt.js\";\nimport { AsymmetricStructuredOutputParser } from \"../../output_parsers/structured.js\";\n\n/**\n * A simple data structure that holds information about an attribute. It\n * is typically used to provide metadata about attributes in other classes\n * or data structures within the LangChain framework.\n */\nexport class AttributeInfo {\n constructor(\n public name: string,\n public type: string,\n public description: string\n ) {}\n}\n\nexport { QueryTransformer, type TraverseType };\nexport {\n DEFAULT_EXAMPLES,\n DEFAULT_PREFIX,\n DEFAULT_SCHEMA,\n DEFAULT_SUFFIX,\n EXAMPLE_PROMPT,\n};\n\nconst queryInputSchema = /* #__PURE__ */ z.object({\n query: /* #__PURE__ */ z\n .string()\n .describe(\"text string to compare to document contents\"),\n filter: /* #__PURE__ */ z\n .string()\n .optional()\n .describe(\"logical condition statement for filtering documents\"),\n});\n\n/**\n * A class that extends AsymmetricStructuredOutputParser to parse\n * structured query output.\n */\nexport class StructuredQueryOutputParser extends AsymmetricStructuredOutputParser<\n typeof queryInputSchema,\n StructuredQuery\n> {\n lc_namespace = [\"langchain\", \"chains\", \"query_constructor\"];\n\n queryTransformer: QueryTransformer;\n\n constructor(fields: {\n allowedComparators: Comparator[];\n allowedOperators: Operator[];\n }) {\n super({ ...fields, inputSchema: queryInputSchema });\n\n const { allowedComparators, allowedOperators } = fields;\n this.queryTransformer = new QueryTransformer(\n allowedComparators,\n allowedOperators\n );\n }\n\n /**\n * Processes the output of a structured query.\n * @param query The query string.\n * @param filter The filter condition.\n * @returns A Promise that resolves to a StructuredQuery instance.\n */\n async outputProcessor({\n query,\n filter,\n }: InferInteropZodOutput<typeof queryInputSchema>): Promise<StructuredQuery> {\n let myQuery = query;\n if (myQuery.length === 0) {\n myQuery = \" \";\n }\n if (filter === \"NO_FILTER\" || filter === undefined) {\n return new StructuredQuery(query);\n } else {\n const parsedFilter = await this.queryTransformer.parse(filter);\n return new StructuredQuery(query, parsedFilter);\n }\n }\n\n /**\n * Creates a new StructuredQueryOutputParser instance from the provided\n * components.\n * @param allowedComparators An array of allowed Comparator instances.\n * @param allowedOperators An array of allowed Operator instances.\n * @returns A new StructuredQueryOutputParser instance.\n */\n static fromComponents(\n allowedComparators: Comparator[] = [],\n allowedOperators: Operator[] = []\n ) {\n return new StructuredQueryOutputParser({\n allowedComparators,\n allowedOperators,\n });\n }\n}\n\nexport function formatAttributeInfo(info: AttributeInfo[]) {\n const infoObj = info.reduce(\n (acc, attr) => {\n acc[attr.name] = {\n type: attr.type,\n description: attr.description,\n };\n return acc;\n },\n {} as { [name: string]: { type: string; description: string } }\n );\n\n return JSON.stringify(infoObj, null, 2)\n .replaceAll(\"{\", \"{{\")\n .replaceAll(\"}\", \"}}\");\n}\n\nconst defaultExample = DEFAULT_EXAMPLES.map((EXAMPLE) => EXAMPLE as Example);\n\nfunction _getPrompt(\n documentContents: string,\n attributeInfo: AttributeInfo[],\n allowedComparators?: Comparator[],\n allowedOperators?: Operator[],\n examples: InputValues[] = defaultExample\n) {\n const myAllowedComparators: Comparator[] =\n allowedComparators ?? Object.values(Comparators);\n const myAllowedOperators: Operator[] =\n allowedOperators ?? Object.values(Operators);\n const attributeJSON = formatAttributeInfo(attributeInfo);\n const schema = interpolateFString(DEFAULT_SCHEMA, {\n allowed_comparators: myAllowedComparators.join(\" | \"),\n allowed_operators: myAllowedOperators.join(\" | \"),\n });\n const prefix = interpolateFString(DEFAULT_PREFIX, {\n schema,\n });\n const suffix = interpolateFString(DEFAULT_SUFFIX, {\n i: examples.length + 1,\n content: documentContents,\n attributes: attributeJSON,\n });\n\n const outputParser = StructuredQueryOutputParser.fromComponents(\n allowedComparators,\n allowedOperators\n );\n\n return new FewShotPromptTemplate({\n examples,\n examplePrompt: EXAMPLE_PROMPT,\n inputVariables: [\"query\"],\n suffix,\n prefix,\n outputParser,\n });\n}\n\n/**\n * A type that represents options for the query constructor chain.\n */\nexport type QueryConstructorRunnableOptions = {\n llm: BaseLanguageModelInterface;\n documentContents: string;\n attributeInfo: AttributeInfo[];\n examples?: InputValues[];\n allowedComparators?: Comparator[];\n allowedOperators?: Operator[];\n};\n\n/** @deprecated */\nexport type QueryConstructorChainOptions = QueryConstructorRunnableOptions;\n\nexport function loadQueryConstructorRunnable(\n opts: QueryConstructorRunnableOptions\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n): Runnable<any, StructuredQuery, RunnableConfig<Record<string, any>>> {\n const prompt = _getPrompt(\n opts.documentContents,\n opts.attributeInfo,\n opts.allowedComparators,\n opts.allowedOperators,\n opts.examples\n );\n const outputParser = StructuredQueryOutputParser.fromComponents(\n opts.allowedComparators,\n opts.allowedOperators\n );\n return prompt.pipe(opts.llm).pipe(outputParser);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,gBAAb,MAA2B;CAEhB;CACA;CACA;CAHT,YACE,MACA,MACA,aACA;EAHO,KAAA,OAAA;EACA,KAAA,OAAA;EACA,KAAA,cAAA;CACN;AACL;AAWA,MAAM,mBAAmC,kBAAE,OAAO;CAChD,OAAuB,kBACpB,OAAO,CAAC,CACR,SAAS,6CAA6C;CACzD,QAAwB,kBACrB,OAAO,CAAC,CACR,SAAS,CAAC,CACV,SAAS,qDAAqD;AACnE,CAAC;;;;;AAMD,IAAa,8BAAb,MAAa,oCAAoC,iCAG/C;CACA,eAAe;EAAC;EAAa;EAAU;CAAmB;CAE1D;CAEA,YAAY,QAGT;EACD,MAAM;GAAE,GAAG;GAAQ,aAAa;EAAiB,CAAC;EAElD,MAAM,EAAE,oBAAoB,qBAAqB;EACjD,KAAK,mBAAmB,IAAI,iBAC1B,oBACA,gBACF;CACF;;;;;;;CAQA,MAAM,gBAAgB,EACpB,OACA,UAC2E;EAC3E,IAAI,UAAU;EACd,IAAI,QAAQ,WAAW,GACrB,UAAU;EAEZ,IAAI,WAAW,eAAe,WAAW,KAAA,GACvC,OAAO,IAAI,gBAAgB,KAAK;OAC3B;GACL,MAAM,eAAe,MAAM,KAAK,iBAAiB,MAAM,MAAM;GAC7D,OAAO,IAAI,gBAAgB,OAAO,YAAY;EAChD;CACF;;;;;;;;CASA,OAAO,eACL,qBAAmC,CAAC,GACpC,mBAA+B,CAAC,GAChC;EACA,OAAO,IAAI,4BAA4B;GACrC;GACA;EACF,CAAC;CACH;AACF;AAEA,SAAgB,oBAAoB,MAAuB;CACzD,MAAM,UAAU,KAAK,QAClB,KAAK,SAAS;EACb,IAAI,KAAK,QAAQ;GACf,MAAM,KAAK;GACX,aAAa,KAAK;EACpB;EACA,OAAO;CACT,GACA,CAAC,CACH;CAEA,OAAO,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC,CACpC,WAAW,KAAK,IAAI,CAAC,CACrB,WAAW,KAAK,IAAI;AACzB;AAEA,MAAM,iBAAiB,iBAAiB,KAAK,YAAY,OAAkB;AAE3E,SAAS,WACP,kBACA,eACA,oBACA,kBACA,WAA0B,gBAC1B;CACA,MAAM,uBACJ,sBAAsB,OAAO,OAAO,WAAW;CACjD,MAAM,qBACJ,oBAAoB,OAAO,OAAO,SAAS;CAC7C,MAAM,gBAAgB,oBAAoB,aAAa;CACvD,MAAM,SAAS,mBAAmB,gBAAgB;EAChD,qBAAqB,qBAAqB,KAAK,KAAK;EACpD,mBAAmB,mBAAmB,KAAK,KAAK;CAClD,CAAC;CACD,MAAM,SAAS,mBAAmB,gBAAgB,EAChD,OACF,CAAC;CACD,MAAM,SAAS,mBAAmB,gBAAgB;EAChD,GAAG,SAAS,SAAS;EACrB,SAAS;EACT,YAAY;CACd,CAAC;CAED,MAAM,eAAe,4BAA4B,eAC/C,oBACA,gBACF;CAEA,OAAO,IAAI,sBAAsB;EAC/B;EACA,eAAe;EACf,gBAAgB,CAAC,OAAO;EACxB;EACA;EACA;CACF,CAAC;AACH;AAiBA,SAAgB,6BACd,MAEqE;CACrE,MAAM,SAAS,WACb,KAAK,kBACL,KAAK,eACL,KAAK,oBACL,KAAK,kBACL,KAAK,QACP;CACA,MAAM,eAAe,4BAA4B,eAC/C,KAAK,oBACL,KAAK,gBACP;CACA,OAAO,OAAO,KAAK,KAAK,GAAG,CAAC,CAAC,KAAK,YAAY;AAChD"}
@@ -18,12 +18,18 @@ var QueryTransformer = class {
18
18
  * @returns The matched function name.
19
19
  */
20
20
  matchFunctionName(funcName) {
21
- if (funcName in _langchain_core_structured_query.Comparators) if (this.allowedComparators.length > 0) if (this.allowedComparators.includes(funcName)) return funcName;
22
- else throw new Error("Received comparator not allowed");
23
- else return funcName;
24
- if (funcName in _langchain_core_structured_query.Operators) if (this.allowedOperators.length > 0) if (this.allowedOperators.includes(funcName)) return funcName;
25
- else throw new Error("Received operator not allowed");
26
- else return funcName;
21
+ if (funcName in _langchain_core_structured_query.Comparators) {
22
+ if (this.allowedComparators.length > 0) {
23
+ if (this.allowedComparators.includes(funcName)) return funcName;
24
+ else throw new Error("Received comparator not allowed");
25
+ } else return funcName;
26
+ }
27
+ if (funcName in _langchain_core_structured_query.Operators) {
28
+ if (this.allowedOperators.length > 0) {
29
+ if (this.allowedOperators.includes(funcName)) return funcName;
30
+ else throw new Error("Received operator not allowed");
31
+ } else return funcName;
32
+ }
27
33
  throw new Error("Unknown function name");
28
34
  }
29
35
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"parser.cjs","names":["Comparators","Operators","Operation","Comparison","ExpressionParser"],"sources":["../../../src/chains/query_constructor/parser.ts"],"sourcesContent":["import {\n Comparator,\n Comparators,\n Comparison,\n FilterDirective,\n Operation,\n Operator,\n Operators,\n} from \"@langchain/core/structured_query\";\nimport {\n CallExpressionType,\n ExpressionParser,\n ParsedType,\n} from \"../../output_parsers/expression.js\";\n\n/**\n * A type representing the possible types that can be traversed in an\n * expression.\n */\nexport type TraverseType =\n | boolean\n | Operation\n | Comparison\n | string\n | number\n | { [key: string]: TraverseType }\n | TraverseType[];\n\n/**\n * A class for transforming and parsing query expressions.\n */\nexport class QueryTransformer {\n constructor(\n public allowedComparators: Comparator[] = [],\n public allowedOperators: Operator[] = []\n ) {}\n\n /**\n * Matches a function name to a comparator or operator. Throws an error if\n * the function name is unknown or not allowed.\n * @param funcName The function name to match.\n * @returns The matched function name.\n */\n private matchFunctionName(funcName: string) {\n if (funcName in Comparators) {\n if (this.allowedComparators.length > 0) {\n if (this.allowedComparators.includes(funcName as Comparator)) {\n return funcName;\n } else {\n throw new Error(\"Received comparator not allowed\");\n }\n } else {\n return funcName;\n }\n }\n if (funcName in Operators) {\n if (this.allowedOperators.length > 0) {\n if (this.allowedOperators.includes(funcName as Operator)) {\n return funcName;\n } else {\n throw new Error(\"Received operator not allowed\");\n }\n } else {\n return funcName;\n }\n }\n throw new Error(\"Unknown function name\");\n }\n\n /**\n * Transforms a parsed expression into an operation or comparison. Throws\n * an error if the parsed expression is not supported.\n * @param parsed The parsed expression to transform.\n * @returns The transformed operation or comparison.\n */\n private transform(parsed: CallExpressionType): Operation | Comparison {\n const traverse = (node: ParsedType): TraverseType => {\n switch (node.type) {\n case \"call_expression\": {\n if (typeof node.funcCall !== \"string\") {\n throw new Error(\n \"Property access expression and element access expression not supported\"\n );\n }\n const funcName = this.matchFunctionName(node.funcCall);\n if (funcName in Operators) {\n return new Operation(\n funcName as Operator,\n node.args?.map((arg) => traverse(arg)) as FilterDirective[]\n );\n }\n if (funcName in Comparators) {\n if (node.args && node.args.length === 2) {\n const [attribute, value] = node.args;\n return new Comparison(\n funcName as Comparator,\n traverse(attribute) as string,\n traverse(value) as string | number\n );\n }\n throw new Error(\"Comparator must have exactly 2 arguments\");\n }\n throw new Error(\"Function name neither operator nor comparator\");\n }\n case \"string_literal\": {\n return node.value;\n }\n case \"numeric_literal\": {\n return node.value;\n }\n case \"array_literal\": {\n return node.values.map((value) => traverse(value));\n }\n case \"object_literal\": {\n return node.values.reduce(\n (acc, value) => {\n acc[value.identifier] = traverse(value.value);\n return acc;\n },\n {} as { [key: string]: TraverseType }\n );\n }\n case \"boolean_literal\": {\n return node.value;\n }\n default: {\n throw new Error(\"Unknown node type\");\n }\n }\n };\n return traverse(parsed) as Operation | Comparison;\n }\n\n /**\n * Parses an expression and returns the transformed operation or\n * comparison. Throws an error if the expression cannot be parsed.\n * @param expression The expression to parse.\n * @returns A Promise that resolves to the transformed operation or comparison.\n */\n async parse(expression: string): Promise<Operation | Comparison> {\n const expressionParser = new ExpressionParser();\n const parsed = (await expressionParser.parse(\n expression\n )) as CallExpressionType;\n if (!parsed) {\n throw new Error(\"Could not parse expression\");\n }\n return this.transform(parsed);\n }\n}\n"],"mappings":";;;;;;AA+BA,IAAa,mBAAb,MAA8B;CAEnB;CACA;CAFT,YACE,qBAA0C,CAAC,GAC3C,mBAAsC,CAAC,GACvC;EAFO,KAAA,qBAAA;EACA,KAAA,mBAAA;CACN;;;;;;;CAQH,kBAA0B,UAAkB;EAC1C,IAAI,YAAYA,iCAAAA,aACd,IAAI,KAAK,mBAAmB,SAAS,GACnC,IAAI,KAAK,mBAAmB,SAAS,QAAsB,GACzD,OAAO;OAEP,MAAM,IAAI,MAAM,iCAAiC;OAGnD,OAAO;EAGX,IAAI,YAAYC,iCAAAA,WACd,IAAI,KAAK,iBAAiB,SAAS,GACjC,IAAI,KAAK,iBAAiB,SAAS,QAAoB,GACrD,OAAO;OAEP,MAAM,IAAI,MAAM,+BAA+B;OAGjD,OAAO;EAGX,MAAM,IAAI,MAAM,uBAAuB;CACzC;;;;;;;CAQA,UAAkB,QAAoD;EACpE,MAAM,YAAY,SAAmC;GACnD,QAAQ,KAAK,MAAb;IACE,KAAK,mBAAmB;KACtB,IAAI,OAAO,KAAK,aAAa,UAC3B,MAAM,IAAI,MACR,wEACF;KAEF,MAAM,WAAW,KAAK,kBAAkB,KAAK,QAAQ;KACrD,IAAI,YAAYA,iCAAAA,WACd,OAAO,IAAIC,iCAAAA,UACT,UACA,KAAK,MAAM,KAAK,QAAQ,SAAS,GAAG,CAAC,CACvC;KAEF,IAAI,YAAYF,iCAAAA,aAAa;MAC3B,IAAI,KAAK,QAAQ,KAAK,KAAK,WAAW,GAAG;OACvC,MAAM,CAAC,WAAW,SAAS,KAAK;OAChC,OAAO,IAAIG,iCAAAA,WACT,UACA,SAAS,SAAS,GAClB,SAAS,KAAK,CAChB;MACF;MACA,MAAM,IAAI,MAAM,0CAA0C;KAC5D;KACA,MAAM,IAAI,MAAM,+CAA+C;IACjE;IACA,KAAK,kBACH,OAAO,KAAK;IAEd,KAAK,mBACH,OAAO,KAAK;IAEd,KAAK,iBACH,OAAO,KAAK,OAAO,KAAK,UAAU,SAAS,KAAK,CAAC;IAEnD,KAAK,kBACH,OAAO,KAAK,OAAO,QAChB,KAAK,UAAU;KACd,IAAI,MAAM,cAAc,SAAS,MAAM,KAAK;KAC5C,OAAO;IACT,GACA,CAAC,CACH;IAEF,KAAK,mBACH,OAAO,KAAK;IAEd,SACE,MAAM,IAAI,MAAM,mBAAmB;GAEvC;EACF;EACA,OAAO,SAAS,MAAM;CACxB;;;;;;;CAQA,MAAM,MAAM,YAAqD;EAE/D,MAAM,SAAU,MAAM,IADOC,kCAAAA,iBACQ,CAAC,CAAC,MACrC,UACF;EACA,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,4BAA4B;EAE9C,OAAO,KAAK,UAAU,MAAM;CAC9B;AACF"}
1
+ {"version":3,"file":"parser.cjs","names":["Comparators","Operators","Operation","Comparison","ExpressionParser"],"sources":["../../../src/chains/query_constructor/parser.ts"],"sourcesContent":["import {\n Comparator,\n Comparators,\n Comparison,\n FilterDirective,\n Operation,\n Operator,\n Operators,\n} from \"@langchain/core/structured_query\";\nimport {\n CallExpressionType,\n ExpressionParser,\n ParsedType,\n} from \"../../output_parsers/expression.js\";\n\n/**\n * A type representing the possible types that can be traversed in an\n * expression.\n */\nexport type TraverseType =\n | boolean\n | Operation\n | Comparison\n | string\n | number\n | { [key: string]: TraverseType }\n | TraverseType[];\n\n/**\n * A class for transforming and parsing query expressions.\n */\nexport class QueryTransformer {\n constructor(\n public allowedComparators: Comparator[] = [],\n public allowedOperators: Operator[] = []\n ) {}\n\n /**\n * Matches a function name to a comparator or operator. Throws an error if\n * the function name is unknown or not allowed.\n * @param funcName The function name to match.\n * @returns The matched function name.\n */\n private matchFunctionName(funcName: string) {\n if (funcName in Comparators) {\n if (this.allowedComparators.length > 0) {\n if (this.allowedComparators.includes(funcName as Comparator)) {\n return funcName;\n } else {\n throw new Error(\"Received comparator not allowed\");\n }\n } else {\n return funcName;\n }\n }\n if (funcName in Operators) {\n if (this.allowedOperators.length > 0) {\n if (this.allowedOperators.includes(funcName as Operator)) {\n return funcName;\n } else {\n throw new Error(\"Received operator not allowed\");\n }\n } else {\n return funcName;\n }\n }\n throw new Error(\"Unknown function name\");\n }\n\n /**\n * Transforms a parsed expression into an operation or comparison. Throws\n * an error if the parsed expression is not supported.\n * @param parsed The parsed expression to transform.\n * @returns The transformed operation or comparison.\n */\n private transform(parsed: CallExpressionType): Operation | Comparison {\n const traverse = (node: ParsedType): TraverseType => {\n switch (node.type) {\n case \"call_expression\": {\n if (typeof node.funcCall !== \"string\") {\n throw new Error(\n \"Property access expression and element access expression not supported\"\n );\n }\n const funcName = this.matchFunctionName(node.funcCall);\n if (funcName in Operators) {\n return new Operation(\n funcName as Operator,\n node.args?.map((arg) => traverse(arg)) as FilterDirective[]\n );\n }\n if (funcName in Comparators) {\n if (node.args && node.args.length === 2) {\n const [attribute, value] = node.args;\n return new Comparison(\n funcName as Comparator,\n traverse(attribute) as string,\n traverse(value) as string | number\n );\n }\n throw new Error(\"Comparator must have exactly 2 arguments\");\n }\n throw new Error(\"Function name neither operator nor comparator\");\n }\n case \"string_literal\": {\n return node.value;\n }\n case \"numeric_literal\": {\n return node.value;\n }\n case \"array_literal\": {\n return node.values.map((value) => traverse(value));\n }\n case \"object_literal\": {\n return node.values.reduce(\n (acc, value) => {\n acc[value.identifier] = traverse(value.value);\n return acc;\n },\n {} as { [key: string]: TraverseType }\n );\n }\n case \"boolean_literal\": {\n return node.value;\n }\n default: {\n throw new Error(\"Unknown node type\");\n }\n }\n };\n return traverse(parsed) as Operation | Comparison;\n }\n\n /**\n * Parses an expression and returns the transformed operation or\n * comparison. Throws an error if the expression cannot be parsed.\n * @param expression The expression to parse.\n * @returns A Promise that resolves to the transformed operation or comparison.\n */\n async parse(expression: string): Promise<Operation | Comparison> {\n const expressionParser = new ExpressionParser();\n const parsed = (await expressionParser.parse(\n expression\n )) as CallExpressionType;\n if (!parsed) {\n throw new Error(\"Could not parse expression\");\n }\n return this.transform(parsed);\n }\n}\n"],"mappings":";;;;;;AA+BA,IAAa,mBAAb,MAA8B;CAEnB;CACA;CAFT,YACE,qBAA0C,CAAC,GAC3C,mBAAsC,CAAC,GACvC;EAFO,KAAA,qBAAA;EACA,KAAA,mBAAA;CACN;;;;;;;CAQH,kBAA0B,UAAkB;EAC1C,IAAI,YAAYA,iCAAAA,aAAa;GAC3B,IAAI,KAAK,mBAAmB,SAAS,GAAG;IACtC,IAAI,KAAK,mBAAmB,SAAS,QAAsB,GACzD,OAAO;SAEP,MAAM,IAAI,MAAM,iCAAiC;GAErD,OACE,OAAO;EAEX;EACA,IAAI,YAAYC,iCAAAA,WAAW;GACzB,IAAI,KAAK,iBAAiB,SAAS,GAAG;IACpC,IAAI,KAAK,iBAAiB,SAAS,QAAoB,GACrD,OAAO;SAEP,MAAM,IAAI,MAAM,+BAA+B;GAEnD,OACE,OAAO;EAEX;EACA,MAAM,IAAI,MAAM,uBAAuB;CACzC;;;;;;;CAQA,UAAkB,QAAoD;EACpE,MAAM,YAAY,SAAmC;GACnD,QAAQ,KAAK,MAAb;IACE,KAAK,mBAAmB;KACtB,IAAI,OAAO,KAAK,aAAa,UAC3B,MAAM,IAAI,MACR,wEACF;KAEF,MAAM,WAAW,KAAK,kBAAkB,KAAK,QAAQ;KACrD,IAAI,YAAYA,iCAAAA,WACd,OAAO,IAAIC,iCAAAA,UACT,UACA,KAAK,MAAM,KAAK,QAAQ,SAAS,GAAG,CAAC,CACvC;KAEF,IAAI,YAAYF,iCAAAA,aAAa;MAC3B,IAAI,KAAK,QAAQ,KAAK,KAAK,WAAW,GAAG;OACvC,MAAM,CAAC,WAAW,SAAS,KAAK;OAChC,OAAO,IAAIG,iCAAAA,WACT,UACA,SAAS,SAAS,GAClB,SAAS,KAAK,CAChB;MACF;MACA,MAAM,IAAI,MAAM,0CAA0C;KAC5D;KACA,MAAM,IAAI,MAAM,+CAA+C;IACjE;IACA,KAAK,kBACH,OAAO,KAAK;IAEd,KAAK,mBACH,OAAO,KAAK;IAEd,KAAK,iBACH,OAAO,KAAK,OAAO,KAAK,UAAU,SAAS,KAAK,CAAC;IAEnD,KAAK,kBACH,OAAO,KAAK,OAAO,QAChB,KAAK,UAAU;KACd,IAAI,MAAM,cAAc,SAAS,MAAM,KAAK;KAC5C,OAAO;IACT,GACA,CAAC,CACH;IAEF,KAAK,mBACH,OAAO,KAAK;IAEd,SACE,MAAM,IAAI,MAAM,mBAAmB;GAEvC;EACF;EACA,OAAO,SAAS,MAAM;CACxB;;;;;;;CAQA,MAAM,MAAM,YAAqD;EAE/D,MAAM,SAAU,MAAM,IADOC,kCAAAA,iBACQ,CAAC,CAAC,MACrC,UACF;EACA,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,4BAA4B;EAE9C,OAAO,KAAK,UAAU,MAAM;CAC9B;AACF"}
@@ -18,12 +18,18 @@ var QueryTransformer = class {
18
18
  * @returns The matched function name.
19
19
  */
20
20
  matchFunctionName(funcName) {
21
- if (funcName in Comparators) if (this.allowedComparators.length > 0) if (this.allowedComparators.includes(funcName)) return funcName;
22
- else throw new Error("Received comparator not allowed");
23
- else return funcName;
24
- if (funcName in Operators) if (this.allowedOperators.length > 0) if (this.allowedOperators.includes(funcName)) return funcName;
25
- else throw new Error("Received operator not allowed");
26
- else return funcName;
21
+ if (funcName in Comparators) {
22
+ if (this.allowedComparators.length > 0) {
23
+ if (this.allowedComparators.includes(funcName)) return funcName;
24
+ else throw new Error("Received comparator not allowed");
25
+ } else return funcName;
26
+ }
27
+ if (funcName in Operators) {
28
+ if (this.allowedOperators.length > 0) {
29
+ if (this.allowedOperators.includes(funcName)) return funcName;
30
+ else throw new Error("Received operator not allowed");
31
+ } else return funcName;
32
+ }
27
33
  throw new Error("Unknown function name");
28
34
  }
29
35
  /**