@langchain/core
Version:
Core LangChain.js abstractions and schemas
1 lines • 6.15 kB
Source Map (JSON)
{"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;AAC7B,KAAIA,YAAAA,mBAAmB,OAAO,CAC5B,QAAOC,mBAAAA,uBAAuB,cAAc,OAAO;AAErD,KAAIC,8BAAAA,qBAAqB,OAAO,CAC9B,QAAOC,wBAAAA,2BAA2B,uBAAuB,OAAO;AAElE,QAAO,IAAIC,aAAAA,kBAA6B;;;;;;;;;;AAqB1C,SAAgB,4BAId,QAKA,SACA,aACgC;CAChC,MAAM,OAAO,eAAeC,kCAAAA;AAC5B,KAAIL,YAAAA,mBAAmB,OAAO,CAC5B,QAAO,IAAI,KAAK;EAAE,cAAc;EAAM;EAAS,WAAW;EAAQ,CAAC;AAErE,KAAIE,8BAAAA,qBAAqB,OAAO,CAC9B,QAAO,IAAI,KAAK;EACd,cAAc;EACd;EACA,oBAAoB;EACrB,CAAC;AAEJ,QAAO,IAAI,KAAK;EAAE,cAAc;EAAM;EAAS,CAAC;;;;;;;;;AAUlD,SAAgB,iCAId,KAEA,cACA,YACA,SAG4E;AAC5E,KAAI,CAAC,YAAY;EACf,MAAM,SAAS,IAAI,KAAK,aAAa;AACrC,SAAO,UAAU,OAAO,WAAW,EAAE,SAAS,CAAC,GAAG;;CAGpD,MAAM,eAAeI,oBAAAA,oBAAoB,OAAO,EAE9C,SAAS,OAAY,WAAW,aAAa,OAAO,MAAM,KAAK,OAAO,EACvE,CAAC;CACF,MAAM,aAAaA,oBAAAA,oBAAoB,OAAO,EAC5C,cAAc,MACf,CAAC;CACF,MAAM,qBAAqB,aAAa,cAAc,EACpD,WAAW,CAAC,WAAW,EACxB,CAAC;CACF,MAAM,SAASC,aAAAA,iBAAiB,KAG9B,CAAC,EAAE,KAAK,KAAK,EAAE,mBAAmB,CAAC;AACrC,QAAO,UAAU,OAAO,WAAW,EAAE,SAAS,CAAC,GAAG"}