Toggle Menu
Prev Up Next

# Source code for langchain.chains.conversation.base

    """Chain that carries on a conversation and calls an LLM."""
    from typing import Dict, List

    from langchain_core.memory import BaseMemory
    from langchain_core.prompts import BasePromptTemplate
    from langchain_core.pydantic_v1 import Extra, Field, root_validator

    from langchain.chains.conversation.prompt import PROMPT
    from langchain.chains.llm import LLMChain
    from langchain.memory.buffer import ConversationBufferMemory

    class ConversationChain(LLMChain):
        """Chain to have a conversation and load context from memory.

        Example:
            .. code-block:: python

                from langchain.chains import ConversationChain
                from langchain_community.llms import OpenAI

                conversation = ConversationChain(llm=OpenAI())
        """

        memory: BaseMemory = Field(default_factory=ConversationBufferMemory)
        """Default memory store."""
        prompt: BasePromptTemplate = PROMPT
        """Default conversation prompt to use."""

        input_key: str = "input"  #: :meta private:
        output_key: str = "response"  #: :meta private:

        class Config:
            """Configuration for this pydantic object."""

            extra = Extra.forbid
            arbitrary_types_allowed = True

        @classmethod
        def is_lc_serializable(cls) -> bool:
            return False

        @property
        def input_keys(self) -> List[str]:
            """Use this since so some prompt vars come from history."""
            return [self.input_key]

        @root_validator()
        def validate_prompt_input_variables(cls, values: Dict) -> Dict:
            """Validate that prompt input variables are consistent."""
            memory_keys = values["memory"].memory_variables
            input_key = values["input_key"]
            if input_key in memory_keys:
                raise ValueError(
                    f"The input key {input_key} was also found in the memory keys "
                    f"({memory_keys}) - please provide keys that don't overlap."
                )
            prompt_variables = values["prompt"].input_variables
            expected_keys = memory_keys + [input_key]
            if set(expected_keys) != set(prompt_variables):
                raise ValueError(
                    "Got unexpected prompt input variables. The prompt expects "
                    f"{prompt_variables}, but got {memory_keys} as inputs from "
                    f"memory, and {input_key} as the normal input key."
                )
            return values