UNPKG

@langchain/core

Version:
1 lines 6.17 kB
{"version":3,"file":"structured_output.cjs","names":["isInteropZodSchema","StructuredOutputParser","isSerializableSchema","StandardSchemaOutputParser","JsonOutputParser","JsonOutputKeyToolsParser","RunnablePassthrough","RunnableSequence"],"sources":["../../src/language_models/structured_output.ts"],"sourcesContent":["import { BaseMessage } from \"../messages/index.js\";\nimport {\n BaseLLMOutputParser,\n BaseOutputParser,\n JsonOutputParser,\n StructuredOutputParser,\n} from \"../output_parsers/index.js\";\nimport { JsonOutputKeyToolsParser } from \"../output_parsers/openai_tools/json_output_tools_parsers.js\";\nimport { StandardSchemaOutputParser } from \"../output_parsers/standard_schema.js\";\nimport {\n Runnable,\n RunnablePassthrough,\n RunnableSequence,\n} from \"../runnables/index.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"../utils/standard_schema.js\";\nimport { InteropZodType, isInteropZodSchema } from \"../utils/types/index.js\";\nimport { BaseLanguageModelInput } from \"./base.js\";\n\n/**\n * Creates the appropriate content-based output parser for a schema. Use this for\n * jsonMode/jsonSchema methods where the LLM returns JSON text.\n *\n * - Zod schema -> StructuredOutputParser (Zod validation)\n * - Standard schema -> StandardSchemaOutputParser (standard schema validation)\n * - Plain JSON schema -> JsonOutputParser (no validation)\n */\nexport function createContentParser<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n>(\n schema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>\n): BaseOutputParser<RunOutput> {\n if (isInteropZodSchema(schema)) {\n return StructuredOutputParser.fromZodSchema(schema);\n }\n if (isSerializableSchema(schema)) {\n return StandardSchemaOutputParser.fromSerializableSchema(schema);\n }\n return new JsonOutputParser<RunOutput>();\n}\n\ntype FunctionCallingParserConstructor<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n T extends Record<string, any> = Record<string, any>,\n> = new (params: {\n keyName: string;\n returnSingle?: boolean;\n zodSchema?: InteropZodType<T>;\n serializableSchema?: SerializableSchema<T>;\n}) => BaseLLMOutputParser<T>;\n\n/**\n * Creates the appropriate tool-calling output parser for a schema. Use this for\n * function calling / tool use methods where the LLM returns structured tool calls.\n *\n * - Zod schema -> parser with Zod validation\n * - Standard schema -> parser with standard schema validation\n * - Plain JSON schema -> parser with no validation\n */\nexport function createFunctionCallingParser<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n>(\n schema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n keyName: string,\n ParserClass?: FunctionCallingParserConstructor<RunOutput>\n): BaseLLMOutputParser<RunOutput> {\n const Ctor = ParserClass ?? JsonOutputKeyToolsParser;\n if (isInteropZodSchema(schema)) {\n return new Ctor({ returnSingle: true, keyName, zodSchema: schema });\n }\n if (isSerializableSchema(schema)) {\n return new Ctor({\n returnSingle: true,\n keyName,\n serializableSchema: schema,\n });\n }\n return new Ctor({ returnSingle: true, keyName });\n}\n\n/**\n * Pipes an LLM through an output parser, optionally wrapping the result\n * to include the raw LLM response alongside the parsed output.\n *\n * When `includeRaw` is true, returns `{ raw: BaseMessage, parsed: RunOutput }`.\n * If parsing fails, `parsed` falls back to null.\n */\nexport function assembleStructuredOutputPipeline<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n>(\n llm: Runnable<BaseLanguageModelInput>,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n outputParser: Runnable<any, RunOutput>,\n includeRaw?: boolean,\n runName?: string\n):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }> {\n if (!includeRaw) {\n const result = llm.pipe(outputParser);\n return runName ? result.withConfig({ runName }) : result;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n const result = RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([{ raw: llm }, parsedWithFallback]);\n return runName ? result.withConfig({ runName }) : result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,oBAId,QAK6B;CAC7B,IAAIA,YAAAA,mBAAmB,MAAM,GAC3B,OAAOC,mBAAAA,uBAAuB,cAAc,MAAM;CAEpD,IAAIC,8BAAAA,qBAAqB,MAAM,GAC7B,OAAOC,wBAAAA,2BAA2B,uBAAuB,MAAM;CAEjE,OAAO,IAAIC,aAAAA,iBAA4B;AACzC;;;;;;;;;AAoBA,SAAgB,4BAId,QAKA,SACA,aACgC;CAChC,MAAM,OAAO,eAAeC,kCAAAA;CAC5B,IAAIL,YAAAA,mBAAmB,MAAM,GAC3B,OAAO,IAAI,KAAK;EAAE,cAAc;EAAM;EAAS,WAAW;CAAO,CAAC;CAEpE,IAAIE,8BAAAA,qBAAqB,MAAM,GAC7B,OAAO,IAAI,KAAK;EACd,cAAc;EACd;EACA,oBAAoB;CACtB,CAAC;CAEH,OAAO,IAAI,KAAK;EAAE,cAAc;EAAM;CAAQ,CAAC;AACjD;;;;;;;;AASA,SAAgB,iCAId,KAEA,cACA,YACA,SAG4E;CAC5E,IAAI,CAAC,YAAY;EACf,MAAM,SAAS,IAAI,KAAK,YAAY;EACpC,OAAO,UAAU,OAAO,WAAW,EAAE,QAAQ,CAAC,IAAI;CACpD;CAEA,MAAM,eAAeI,oBAAAA,oBAAoB,OAAO,EAE9C,SAAS,OAAY,WAAW,aAAa,OAAO,MAAM,KAAK,MAAM,EACvE,CAAC;CACD,MAAM,aAAaA,oBAAAA,oBAAoB,OAAO,EAC5C,cAAc,KAChB,CAAC;CACD,MAAM,qBAAqB,aAAa,cAAc,EACpD,WAAW,CAAC,UAAU,EACxB,CAAC;CACD,MAAM,SAASC,aAAAA,iBAAiB,KAG9B,CAAC,EAAE,KAAK,IAAI,GAAG,kBAAkB,CAAC;CACpC,OAAO,UAAU,OAAO,WAAW,EAAE,QAAQ,CAAC,IAAI;AACpD"}