lib/langchain/chat.ex


# a list of PromptTemplate, constituting the chat dialogue up to that point

defmodule LangChain.Chat do
  @derive Jason.Encoder
  defstruct [template: "", inputVariables: [], partialVariables: %{}, promptMessages: [], llm: %LangChain.LLM{
    provider: :openai,
    temperature: 0.1,
    maxTokens: 200,
    modelName: "gpt-3.5-turbo",  # model must support chat dialogue history

  }]

  # loops over every prompt and formats it with the values supplied

  def format(chat, values) do
    resultMessages = Enum.map(chat.promptMessages, fn promptMessage ->
      { :ok, text } = LangChain.PromptTemplate.format(promptMessage.prompt, values)
      Map.put(promptMessage, :text, text)
    end)
    {:ok, resultMessages}
  end

  def toChatMessages do
  end

  def serialize(chat) do
    case Map.has_key?(chat, :output_parser) do
      true -> {:error, "Chat cannot be serialized if output_parser is set"}
      false -> {:ok, %{
        inputVariables: chat.inputVariables,
        promptMessages: Enum.map(chat.promptMessages, &Jason.encode!/1)
      }}
    end
  end

  def addPromptTemplates(chat_prompt_template, prompt_list) do
    updated_prompt_messages = chat_prompt_template.promptMessages ++ prompt_list
    %{chat_prompt_template | promptMessages: updated_prompt_messages}
  end
end