agsamantha/node_modules/langchain/dist/chains/openai_functions/structured_output.cjs
2024-10-02 15:15:21 -05:00

149 lines
6.3 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createStructuredOutputChainFromZod = exports.createStructuredOutputChain = exports.FunctionCallStructuredOutputParser = void 0;
const zod_to_json_schema_1 = require("zod-to-json-schema");
const json_schema_1 = require("@langchain/core/utils/json_schema");
const openai_1 = require("@langchain/openai");
const output_parsers_1 = require("@langchain/core/output_parsers");
const llm_chain_js_1 = require("../llm_chain.cjs");
const openai_functions_js_1 = require("../../output_parsers/openai_functions.cjs");
function isJsonSchema7Type(x) {
return (x.jsonSchema === undefined &&
x.zodSchema === undefined);
}
/**
* Class that extends the BaseLLMOutputParser class. It provides
* functionality for parsing the structured output based on a JSON schema.
*/
class FunctionCallStructuredOutputParser extends output_parsers_1.BaseLLMOutputParser {
constructor(fieldsOrSchema) {
let fields;
if (isJsonSchema7Type(fieldsOrSchema)) {
fields = { jsonSchema: fieldsOrSchema };
}
else {
fields = fieldsOrSchema;
}
if (fields.jsonSchema === undefined && fields.zodSchema === undefined) {
throw new Error(`Must provide at least one of "jsonSchema" or "zodSchema".`);
}
super(fields);
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain", "chains", "openai_functions"]
});
Object.defineProperty(this, "functionOutputParser", {
enumerable: true,
configurable: true,
writable: true,
value: new openai_functions_js_1.OutputFunctionsParser()
});
Object.defineProperty(this, "jsonSchemaValidator", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "zodSchema", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
if (fields.jsonSchema !== undefined) {
this.jsonSchemaValidator = new json_schema_1.Validator(fields.jsonSchema, "7");
}
if (fields.zodSchema !== undefined) {
this.zodSchema = fields.zodSchema;
}
}
/**
* Method to parse the result of chat generations. It first parses the
* result using the functionOutputParser, then parses the result against a
* zod schema if the zod schema is available which allows the result to undergo
* Zod preprocessing, then it parses that result against the JSON schema.
* If the result is valid, it returns the parsed result. Otherwise, it throws
* an OutputParserException.
* @param generations Array of ChatGeneration instances to be parsed.
* @returns The parsed result if it is valid according to the JSON schema.
*/
async parseResult(generations) {
const initialResult = await this.functionOutputParser.parseResult(generations);
const parsedResult = JSON.parse(initialResult, (_, value) => {
if (value === null) {
return undefined;
}
return value;
});
if (this.zodSchema) {
const zodParsedResult = this.zodSchema.safeParse(parsedResult);
if (zodParsedResult.success) {
return zodParsedResult.data;
}
else {
throw new output_parsers_1.OutputParserException(`Failed to parse. Text: "${initialResult}". Error: ${JSON.stringify(zodParsedResult.error.errors)}`, initialResult);
}
}
else if (this.jsonSchemaValidator !== undefined) {
const result = this.jsonSchemaValidator.validate(parsedResult);
if (result.valid) {
return parsedResult;
}
else {
throw new output_parsers_1.OutputParserException(`Failed to parse. Text: "${initialResult}". Error: ${JSON.stringify(result.errors)}`, initialResult);
}
}
else {
throw new Error("This parser requires an input JSON Schema or an input Zod schema.");
}
}
}
exports.FunctionCallStructuredOutputParser = FunctionCallStructuredOutputParser;
/**
* @deprecated Use {@link https://api.js.langchain.com/functions/langchain.chains_openai_functions.createStructuredOutputRunnable.html | createStructuredOutputRunnable} instead
* Create a chain that returns output matching a JSON Schema.
* @param input Object that includes all LLMChainInput fields except "outputParser"
* as well as an additional required "outputSchema" JSON Schema object.
* @returns OpenAPIChain
*/
function createStructuredOutputChain(input) {
const { outputSchema, llm = new openai_1.ChatOpenAI({ modelName: "gpt-3.5-turbo-0613", temperature: 0 }), outputKey = "output", llmKwargs = {}, zodSchema, ...rest } = input;
if (outputSchema === undefined && zodSchema === undefined) {
throw new Error(`Must provide one of "outputSchema" or "zodSchema".`);
}
const functionName = "output_formatter";
return new llm_chain_js_1.LLMChain({
llm,
llmKwargs: {
...llmKwargs,
functions: [
{
name: functionName,
description: `Output formatter. Should always be used to format your response to the user.`,
parameters: outputSchema,
},
],
function_call: {
name: functionName,
},
},
outputKey,
outputParser: new FunctionCallStructuredOutputParser({
jsonSchema: outputSchema,
zodSchema,
}),
...rest,
});
}
exports.createStructuredOutputChain = createStructuredOutputChain;
/** @deprecated Use {@link https://api.js.langchain.com/functions/langchain.chains_openai_functions.createStructuredOutputRunnable.html | createStructuredOutputRunnable} instead */
function createStructuredOutputChainFromZod(zodSchema, input) {
return createStructuredOutputChain({
...input,
outputSchema: (0, zod_to_json_schema_1.zodToJsonSchema)(zodSchema),
zodSchema,
});
}
exports.createStructuredOutputChainFromZod = createStructuredOutputChainFromZod;