!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())

[Skip to main content](#__docusaurus_skipToContent_fallback)

LangChain v0.2 is coming soon! Preview the new docs [here](/v0.2/docs/introduction/).

[

![🦜️🔗 Langchain](/v0.1/img/brand/wordmark.png)![🦜️🔗 Langchain](/v0.1/img/brand/wordmark-dark.png)

](/v0.1/)[Docs](/v0.1/docs/get_started/introduction/)[Use cases](/v0.1/docs/use_cases/)[Integrations](/v0.1/docs/integrations/platforms/)[API Reference](https://api.js.langchain.com)

[More](#)

*   [People](/v0.1/docs/people/)
*   [Community](/v0.1/docs/community/)
*   [Tutorials](/v0.1/docs/additional_resources/tutorials/)
*   [Contributing](/v0.1/docs/contributing/)

[v0.1](#)

*   [v0.2](https://js.langchain.com/v0.2/docs/introduction)
*   [v0.1](/v0.1/docs/get_started/introduction/)

[🦜🔗](#)

*   [LangSmith](https://smith.langchain.com)
*   [LangSmith Docs](https://docs.smith.langchain.com)
*   [LangChain Hub](https://smith.langchain.com/hub)
*   [LangServe](https://github.com/langchain-ai/langserve)
*   [Python Docs](https://python.langchain.com/)

[Chat](https://chatjs.langchain.com)[](https://github.com/langchain-ai/langchainjs)

Search

*   [Get started](/v0.1/docs/get_started/)
    
    *   [Introduction](/v0.1/docs/get_started/introduction/)
    *   [Installation](/v0.1/docs/get_started/installation/)
    *   [Quickstart](/v0.1/docs/get_started/quickstart/)
*   [LangChain Expression Language](/v0.1/docs/expression_language/)
    
    *   [Get started](/v0.1/docs/expression_language/get_started/)
    *   [Why use LCEL?](/v0.1/docs/expression_language/why/)
    *   [Interface](/v0.1/docs/expression_language/interface/)
    *   [Streaming](/v0.1/docs/expression_language/streaming/)
    *   [How to](/v0.1/docs/expression_language/how_to/routing/)
        
    *   [Cookbook](/v0.1/docs/expression_language/cookbook/)
        
        *   [Prompt + LLM](/v0.1/docs/expression_language/cookbook/prompt_llm_parser/)
        *   [Multiple chains](/v0.1/docs/expression_language/cookbook/multiple_chains/)
        *   [Retrieval augmented generation (RAG)](/v0.1/docs/expression_language/cookbook/retrieval/)
        *   [Querying a SQL DB](/v0.1/docs/expression_language/cookbook/sql_db/)
        *   [Adding memory](/v0.1/docs/expression_language/cookbook/adding_memory/)
        *   [Using tools](/v0.1/docs/expression_language/cookbook/tools/)
        *   [Agents](/v0.1/docs/expression_language/cookbook/agents/)
    *   [LangChain Expression Language (LCEL)](/v0.1/docs/expression_language/)
*   [Modules](/v0.1/docs/modules/)
    
    *   [Model I/O](/v0.1/docs/modules/model_io/)
        
    *   [Retrieval](/v0.1/docs/modules/data_connection/)
        
    *   [Chains](/v0.1/docs/modules/chains/)
    *   [Agents](/v0.1/docs/modules/agents/)
        
    *   [More](/v0.1/docs/modules/memory/)
        
*   [Security](/v0.1/docs/security/)
*   [Guides](/v0.1/docs/guides/)
    
*   [Ecosystem](/v0.1/docs/ecosystem/)
    
*   [LangGraph](/v0.1/docs/langgraph/)
*   * * *
    

*   [](/v0.1/)
*   [LangChain Expression Language](/v0.1/docs/expression_language/)
*   [Cookbook](/v0.1/docs/expression_language/cookbook/)
*   Multiple chains

Multiple chains
===============

Runnables can be used to combine multiple Chains together:

Interactive tutorial

The screencast below interactively walks through an example. You can update and run the code as it's being written in the video!

tip

See [this section for general instructions on installing integration packages](/v0.1/docs/get_started/installation/#installing-integration-packages).

*   npm
*   Yarn
*   pnpm

    npm install @langchain/anthropic

    yarn add @langchain/anthropic

    pnpm add @langchain/anthropic

    import { PromptTemplate } from "@langchain/core/prompts";import { RunnableSequence } from "@langchain/core/runnables";import { StringOutputParser } from "@langchain/core/output_parsers";import { ChatAnthropic } from "@langchain/anthropic";const prompt1 = PromptTemplate.fromTemplate(  `What is the city {person} is from? Only respond with the name of the city.`);const prompt2 = PromptTemplate.fromTemplate(  `What country is the city {city} in? Respond in {language}.`);const model = new ChatAnthropic({});const chain = prompt1.pipe(model).pipe(new StringOutputParser());const combinedChain = RunnableSequence.from([  {    city: chain,    language: (input) => input.language,  },  prompt2,  model,  new StringOutputParser(),]);const result = await combinedChain.invoke({  person: "Obama",  language: "German",});console.log(result);/*  Chicago befindet sich in den Vereinigten Staaten.*/

#### API Reference:

*   [PromptTemplate](https://api.js.langchain.com/classes/langchain_core_prompts.PromptTemplate.html) from `@langchain/core/prompts`
*   [RunnableSequence](https://api.js.langchain.com/classes/langchain_core_runnables.RunnableSequence.html) from `@langchain/core/runnables`
*   [StringOutputParser](https://api.js.langchain.com/classes/langchain_core_output_parsers.StringOutputParser.html) from `@langchain/core/output_parsers`
*   [ChatAnthropic](https://api.js.langchain.com/classes/langchain_anthropic.ChatAnthropic.html) from `@langchain/anthropic`

The `RunnableSequence` above coerces the object into a `RunnableMap`. Each property in the map receives the same parameters. The runnable or function set as the value of that property is invoked with those parameters, and the return value populates an object which is then passed onto the next runnable in the sequence.

Passthroughs[​](#passthroughs "Direct link to Passthroughs")
------------------------------------------------------------

In the example above, we use a passthrough in a runnable map to pass along original input variables to future steps in the chain.

In general, how exactly you do this depends on what exactly the input is:

*   If the original input was a string, then you likely just want to pass along the string. This can be done with `RunnablePassthrough`. For an example of this, see the retrieval chain in the [RAG section](/v0.1/docs/expression_language/cookbook/retrieval/) of this cookbook.
*   If the original input was an object, then you likely want to pass along specific keys. For this, you can use an arrow function that takes the object as input and extracts the desired key, as shown above.

* * *

#### Help us out by providing feedback on this documentation page:

[

Previous

Prompt + LLM

](/v0.1/docs/expression_language/cookbook/prompt_llm_parser/)[

Next

Retrieval augmented generation (RAG)

](/v0.1/docs/expression_language/cookbook/retrieval/)

Community

*   [Discord](https://discord.gg/cU2adEyC7w)
*   [Twitter](https://twitter.com/LangChainAI)

GitHub

*   [Python](https://github.com/langchain-ai/langchain)
*   [JS/TS](https://github.com/langchain-ai/langchainjs)

More

*   [Homepage](https://langchain.com)
*   [Blog](https://blog.langchain.dev)

Copyright © 2024 LangChain, Inc.