{
  "nodes": [
    {
      "id": "chatOpenAI_0",
      "position": {
        "x": 656.4819413430698,
        "y": 189.63218698841047
      },
      "type": "customNode",
      "data": {
        "id": "chatOpenAI_0",
        "label": "ChatOpenAI",
        "version": 7,
        "name": "chatOpenAI",
        "type": "ChatOpenAI",
        "baseClasses": [
          "ChatOpenAI",
          "BaseChatModel",
          "BaseLanguageModel",
          "Runnable"
        ],
        "category": "Chat Models",
        "description": "Wrapper around OpenAI large language models that use the Chat endpoint",
        "inputParams": [
          {
            "label": "Connect Credential",
            "name": "credential",
            "type": "credential",
            "credentialNames": [
              "openAIApi"
            ],
            "id": "chatOpenAI_0-input-credential-credential"
          },
          {
            "label": "Model Name",
            "name": "modelName",
            "type": "asyncOptions",
            "loadMethod": "listModels",
            "default": "gpt-3.5-turbo",
            "id": "chatOpenAI_0-input-modelName-asyncOptions"
          },
          {
            "label": "Temperature",
            "name": "temperature",
            "type": "number",
            "step": 0.1,
            "default": 0.9,
            "optional": true,
            "id": "chatOpenAI_0-input-temperature-number"
          },
          {
            "label": "Max Tokens",
            "name": "maxTokens",
            "type": "number",
            "step": 1,
            "optional": true,
            "additionalParams": true,
            "id": "chatOpenAI_0-input-maxTokens-number"
          },
          {
            "label": "Top Probability",
            "name": "topP",
            "type": "number",
            "step": 0.1,
            "optional": true,
            "additionalParams": true,
            "id": "chatOpenAI_0-input-topP-number"
          },
          {
            "label": "Frequency Penalty",
            "name": "frequencyPenalty",
            "type": "number",
            "step": 0.1,
            "optional": true,
            "additionalParams": true,
            "id": "chatOpenAI_0-input-frequencyPenalty-number"
          },
          {
            "label": "Presence Penalty",
            "name": "presencePenalty",
            "type": "number",
            "step": 0.1,
            "optional": true,
            "additionalParams": true,
            "id": "chatOpenAI_0-input-presencePenalty-number"
          },
          {
            "label": "Timeout",
            "name": "timeout",
            "type": "number",
            "step": 1,
            "optional": true,
            "additionalParams": true,
            "id": "chatOpenAI_0-input-timeout-number"
          },
          {
            "label": "BasePath",
            "name": "basepath",
            "type": "string",
            "optional": true,
            "additionalParams": true,
            "id": "chatOpenAI_0-input-basepath-string"
          },
          {
            "label": "Proxy Url",
            "name": "proxyUrl",
            "type": "string",
            "optional": true,
            "additionalParams": true,
            "id": "chatOpenAI_0-input-proxyUrl-string"
          },
          {
            "label": "Stop Sequence",
            "name": "stopSequence",
            "type": "string",
            "rows": 4,
            "optional": true,
            "description": "List of stop words to use when generating. Use comma to separate multiple stop words.",
            "additionalParams": true,
            "id": "chatOpenAI_0-input-stopSequence-string"
          },
          {
            "label": "BaseOptions",
            "name": "baseOptions",
            "type": "json",
            "optional": true,
            "additionalParams": true,
            "id": "chatOpenAI_0-input-baseOptions-json"
          },
          {
            "label": "Allow Image Uploads",
            "name": "allowImageUploads",
            "type": "boolean",
            "description": "Automatically uses gpt-4-vision-preview when image is being uploaded from chat. Only works with LLMChain, Conversation Chain, ReAct Agent, Conversational Agent, Tool Agent",
            "default": false,
            "optional": true,
            "id": "chatOpenAI_0-input-allowImageUploads-boolean"
          },
          {
            "label": "Image Resolution",
            "description": "This parameter controls the resolution in which the model views the image.",
            "name": "imageResolution",
            "type": "options",
            "options": [
              {
                "label": "Low",
                "name": "low"
              },
              {
                "label": "High",
                "name": "high"
              },
              {
                "label": "Auto",
                "name": "auto"
              }
            ],
            "default": "low",
            "optional": false,
            "additionalParams": true,
            "id": "chatOpenAI_0-input-imageResolution-options"
          }
        ],
        "inputAnchors": [
          {
            "label": "Cache",
            "name": "cache",
            "type": "BaseCache",
            "optional": true,
            "id": "chatOpenAI_0-input-cache-BaseCache"
          }
        ],
        "inputs": {
          "cache": "",
          "modelName": "gpt-4o-mini",
          "temperature": "0.6",
          "maxTokens": "",
          "topP": "",
          "frequencyPenalty": "",
          "presencePenalty": "",
          "timeout": "",
          "basepath": "",
          "proxyUrl": "",
          "stopSequence": "",
          "baseOptions": "",
          "allowImageUploads": "",
          "imageResolution": "low"
        },
        "outputAnchors": [
          {
            "id": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable",
            "name": "chatOpenAI",
            "label": "ChatOpenAI",
            "description": "Wrapper around OpenAI large language models that use the Chat endpoint",
            "type": "ChatOpenAI | BaseChatModel | BaseLanguageModel | Runnable"
          }
        ],
        "outputs": {},
        "selected": false
      },
      "width": 300,
      "height": 670,
      "selected": false,
      "dragging": false,
      "positionAbsolute": {
        "x": 656.4819413430698,
        "y": 189.63218698841047
      }
    },
    {
      "id": "conversationalRetrievalQAChain_0",
      "position": {
        "x": 1311.047219889821,
        "y": 433.8975668312641
      },
      "type": "customNode",
      "data": {
        "id": "conversationalRetrievalQAChain_0",
        "label": "Conversational Retrieval QA Chain",
        "version": 3,
        "name": "conversationalRetrievalQAChain",
        "type": "ConversationalRetrievalQAChain",
        "baseClasses": [
          "ConversationalRetrievalQAChain",
          "BaseChain",
          "Runnable"
        ],
        "category": "Chains",
        "description": "Document QA - built on RetrievalQAChain to provide a chat history component",
        "inputParams": [
          {
            "label": "Return Source Documents",
            "name": "returnSourceDocuments",
            "type": "boolean",
            "optional": true,
            "id": "conversationalRetrievalQAChain_0-input-returnSourceDocuments-boolean"
          },
          {
            "label": "Rephrase Prompt",
            "name": "rephrasePrompt",
            "type": "string",
            "description": "Using previous chat history, rephrase question into a standalone question",
            "warning": "Prompt must include input variables: {chat_history} and {question}",
            "rows": 4,
            "additionalParams": true,
            "optional": true,
            "default": "Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question.\n\nChat History:\n{chat_history}\nFollow Up Input: {question}\nStandalone Question:",
            "id": "conversationalRetrievalQAChain_0-input-rephrasePrompt-string"
          },
          {
            "label": "Response Prompt",
            "name": "responsePrompt",
            "type": "string",
            "description": "Taking the rephrased question, search for answer from the provided context",
            "warning": "Prompt must include input variable: {context}",
            "rows": 4,
            "additionalParams": true,
            "optional": true,
            "default": "I want you to act as a document that I am having a conversation with. Your name is \"AI Assistant\". Using the provided context, answer the user's question to the best of your ability using the resources provided.\nIf there is nothing in the context relevant to the question at hand, just say \"Hmm, I'm not sure\" and stop after that. Refuse to answer any question not about the info. Never break character.\n------------\n{context}\n------------\nREMEMBER: If there is no relevant information within the context, just say \"Hmm, I'm not sure\". Don't try to make up an answer. Never break character.",
            "id": "conversationalRetrievalQAChain_0-input-responsePrompt-string"
          }
        ],
        "inputAnchors": [
          {
            "label": "Chat Model",
            "name": "model",
            "type": "BaseChatModel",
            "id": "conversationalRetrievalQAChain_0-input-model-BaseChatModel"
          },
          {
            "label": "Vector Store Retriever",
            "name": "vectorStoreRetriever",
            "type": "BaseRetriever",
            "id": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever"
          },
          {
            "label": "Memory",
            "name": "memory",
            "type": "BaseMemory",
            "optional": true,
            "description": "If left empty, a default BufferMemory will be used",
            "id": "conversationalRetrievalQAChain_0-input-memory-BaseMemory"
          },
          {
            "label": "Input Moderation",
            "description": "Detect text that could generate harmful output and prevent it from being sent to the language model",
            "name": "inputModeration",
            "type": "Moderation",
            "optional": true,
            "list": true,
            "id": "conversationalRetrievalQAChain_0-input-inputModeration-Moderation"
          }
        ],
        "inputs": {
          "model": "{{chatOpenAI_0.data.instance}}",
          "vectorStoreRetriever": "{{memoryVectorStore_0.data.instance}}",
          "memory": "{{MongoDBAtlasChatMemory_0.data.instance}}",
          "returnSourceDocuments": "",
          "rephrasePrompt": "Given the following conversation and a follow up question, rephrase the follow up question to be a standalone question.\n\nChat History:\n{chat_history}\nFollow Up Input: {question}\nStandalone Question:",
          "responsePrompt": "# PERSONA\n\nYou are Liam Skaff, an AI Developer who's developed an AI DM Setter software that helps coaches and consultants scale their appointment setting operations. Your company name is ScaleSet and your website is scaleset.ai. Your Instagram page is @liamskaff. Your mission is to eliminate 80% of the boring and repetitive work that an appointment setter has to go through to qualify leads so the business owners can focus on more important tasks.\n\nYou are also a highly skilled and smart appointment setter. Your role in choosing the right questions to ask, understanding people better, building trust with them, and customizing comments to your prospects is VERY GOOD. You are also a very genuine guy who loves to connect with other people and help them succeed.\n\n# TASK\n\n**Your job is to turn the lead from an inbound lead to a potentially booked call by extracting their goals, past, finding the pain-point or obstacles that are forbidding them from reaching their goal, and finally help them by offering a 15 minute call to dive into their problems and present them with a customized strategy.**\n\n## Your Message Structure\n\n### Craft your messages using the APQ Method:\n\n1. **Acknowledge & Sympathize**. Listen carefully to what the lead is saying and acknowledge them with care and passion. Make them feel like they're great people for who they are and what they do. Put yourself in their shoes. Give them positive acknowledgements that induce positive energy.\n2. **Provide valuable facts:** Use your wide knowledge base to provide tips and value that the lead can implement in their lives to get better.\n3. **Question**. Ask a qualification question according to the framework you’re given and to keep the conversation flowing.\n\nYou will be provided with **more info** to use for answering personal questions, providing case studies, sharing free resources, and more...\n\n## Inbound Lead Qualification Framework\n\n### Follow this framework, step by step, to **turn the lead from a warm lead to a potentially booked call**:\n\n1. **Initial Response:** The leads have probably reached out to you with the keyword \"scaleset\" to know more about the AI co-setter solution. Here, you wanna initiate the conversation by making it clear that you have a couple of questions to ask to figure out the best way you can help them.\n2. **Get to know them and why they've reached out:** This step is essential so you can have an idea of who you're speaking with and know right off the bat if they're the right fit for your solution.\n3.**Understand their goals:** Knowing their growth goals allows you to frame your solution in a way that aligns with their aspirations and long-term plans. After they've revealed their goals, ask them more about the specific targets they want to achieve to ensure that the goal is met.\n4.**Assess their current situation in attaining this goal**: Figure out what they've tried so far to achieve their goals and find out how has their progress been. Determine where they're at in their journey towards their goals and ask more specific questions to understand their current situation. This part is crucial to see how long they've been struggling with the problem and identify the potential cause of this problem.\n5. **Find their struggle.** Right after they reveal their specific goals & current situation, you want to find their struggles or what's keeping them from reaching these goals. \n6. **Ask if it is a priority for them to solve the problem and achieve their goals.** This will increase the booking rate by getting their verbal commitment and later on help you in handling their objections if they contradict themselves and say that they are not interested in a call that will help them achieve their goals.\n7. **Propose the call**. When you go through all of the above steps and attain their full pain point and priority level, propose the 15 minute call as a solution.\n8. **Send the calendly link.** When they agree to the call, send them this calendar link: https://cal.com/scaleset.ai/demo-discovery-call.\n\n## TONE AND LANGUAGE STYLE\n\nYou are a warm, personable, and engaging person. Your tone is friendly, supportive, and empathetic, always seeking to connect with your followers on a personal level. You express gratitude for their support and show genuine interest in their journeys. \n\nYour style is conversational and encouraging, often using questions to understand their struggles and goals better. You provide personalized advice and offer free resources to help them. \n\n## Specifics\n\n- This job is critical to the success of your business, so please put your heart into speaking with the prospects and building trust. \n- Remember that you’re texting the prospect like you are texting a friend. AVOID using emojies and DON’T be cringe.\n- Ask open ended questions.\n- DON’T try to pitch anything to the prospect. Your job is only to have a friendly conversation that might lead to a booked call that can help them further in their journey. The best way to help someone is through a call, NOT through DMs.\n- You greatly value generousity and respect to the prospects.\n\n### Keep your responses SUPER clear and concise and straight to the point\n\n# Examples\n\n## Acknowledging Statements\n\n- Awesome!\n- Definitely appreciate the follow and love. I try to post content to help people exactly in your shoes.\n- Awesome, I appreciate you sharing (specific detail or experience the lead mentioned).\n- Ahh ok, I can get how that would make it hard to stay committed.\n- I definitely get what you mean by (specific challenge the lead mentioned).\n- I hear you. (Area of struggle) is the number 1 thing most people struggle with.\n- I think (specific aspect of lead's situation) is your saving grace tbh.\n- Glad you’re getting back on the horse (Name)!\n- That definitely does it!\n- I gotchu (Lead's Name)! Time management is my strength lol.\n- I see where you're coming from.\n- I totally understand your situation.\n- It sounds like you're really committed to making a change.\n- It makes sense given your busy schedule.\n- It's clear you're putting in the effort.\n- I respect your determination.\n- It's great that you're aware of these challenges.\n- It's understandable why that would be difficult.\n- I can tell you're serious about reaching your goals.\n- It's important to address these obstacles, and we can do it together.\n- Your honesty is appreciated, (Lead's name).\n- It's a tough situation, but manageable with the right approach.\n\n## Additional Information\n\n### Use this info about you to answer personal questions, provide case studies, share free resources, etc..\n----------\n{context}\n----------\n## Inbound Lead Qualification Questions:\n\nYOU MUST **fill in the variable placeholders (letters in parantheses) with data from the conversation**.\n\n### Initial Response\n\nHey (Name), appreciate you reaching out! Cool if I ask you a few questions to see if our AI solution is the right one for your business?\n\n### Get to know them better\n\n- First, could you tell me a bit more about yourself? Like who you are, what business you run, for how long, and your mission behind it\n\n### Know why they reached out\n\n- What prompted you to reach out?\n\n### Get a bit more specific about their goals (Ask 1 max)\n\n- Do you have a specific number you’re trying to get to?\n- What's your end goal? How much of (X goal) are you looking to (Y achieve)?\n- When you say (X goal), what do you mean? Are you talking more about (Z), (W), or (Y)?\n\n### Assess their current situation in attaining this goal (Ask 2 max)\n\n- What have you been doing to make that happen? Have you built any systems and SOPs so far?\n- What does your current system look like?\n- Are you tracking how much you’re (X work)?\n- How long have you been facing (X problem) for?\n- How long has this been a problem for you?\n\n### Find their struggle\n\n- So your main struggle is in (X struggle)? And would you say there's anything else stopping your from achieving (X goal)?\n- What would you say are the biggest things you struggle with in making that happen?\n- Apart from (X Problem), what do you think is slowing you down or holding you back from making that happen?\n\n### Priority Question (if they haven't mentioned their urgency during the conversation)\n\n- Would you say it's a priority for you to get help so you can start making progress and finally be able to reach your goal?\n- Are you satisfied with the results you're getting right now?\n- Are you open to getting help?\n\n### Call Proposal Question\n\n- Okay great. I have a few ideas that might help accelerate the process for you. But it’d be a lot to type back and forth. If I set aside 10-15 minutes for us to go over strategies my clients are using to (achieve X goal of lead) without (X Struggle of the lead), would you be opposed to a short phone call?\n\n### Sending the calendar link\n\n- Awesome, the easiest way would be for you to use this link and choose a time that works for you. Send me a message once you’ve booked. https://cal.com/scaleset.ai/demo-discovery-call?\n\n# Remarks\n\n- Remember, your message format should follow this structure: **(Acknowledgement). (Valuable Facts).(Qualification Question)**\n- Only ask 1 question at a time and in a systematic manner, ensuring that the questions respect the conversation flow. If you don’t have to ask a question, don’t. Adapt to the conversation flow\n- YOU MUST **fill in the variable placeholders with data from the conversation**.\n- AVOID using emojies and DON’T be cringe.\n- Capital letters in parantheses represent variables that you should replace based on the conversation flow and topics that the prospects mention.\n- When good rapport is built, **Drop subtle flexes to show your authority** (ex: your achievements, client results, etc..)\n- Your questions MUST be formed of the same structure like the examples provided, especially the call proposal question\n- You must only schedule the call through sharing the calendar link\n- When they ask you technical questions, give them golden nuggets of value so they can appreciate you more\n\n### If the prospect has already answered a question you wanted to ask, skip this question or part of the framework and proceed to the next part/question.\n\n### Keep your responses SUPER clear and concise and straight to the point",
          "inputModeration": ""
        },
        "outputAnchors": [
          {
            "id": "conversationalRetrievalQAChain_0-output-conversationalRetrievalQAChain-ConversationalRetrievalQAChain|BaseChain|Runnable",
            "name": "conversationalRetrievalQAChain",
            "label": "ConversationalRetrievalQAChain",
            "description": "Document QA - built on RetrievalQAChain to provide a chat history component",
            "type": "ConversationalRetrievalQAChain | BaseChain | Runnable"
          }
        ],
        "outputs": {},
        "selected": false
      },
      "width": 300,
      "height": 532,
      "selected": false,
      "positionAbsolute": {
        "x": 1311.047219889821,
        "y": 433.8975668312641
      },
      "dragging": false
    },
    {
      "id": "MongoDBAtlasChatMemory_0",
      "position": {
        "x": 916.74980276878,
        "y": 1001.0890890040594
      },
      "type": "customNode",
      "data": {
        "id": "MongoDBAtlasChatMemory_0",
        "label": "MongoDB Atlas Chat Memory",
        "version": 1,
        "name": "MongoDBAtlasChatMemory",
        "type": "MongoDBAtlasChatMemory",
        "baseClasses": [
          "MongoDBAtlasChatMemory",
          "BaseChatMemory",
          "BaseMemory"
        ],
        "category": "Memory",
        "description": "Stores the conversation in MongoDB Atlas",
        "inputParams": [
          {
            "label": "Connect Credential",
            "name": "credential",
            "type": "credential",
            "credentialNames": [
              "mongoDBUrlApi"
            ],
            "id": "MongoDBAtlasChatMemory_0-input-credential-credential"
          },
          {
            "label": "Database",
            "name": "databaseName",
            "placeholder": "<DB_NAME>",
            "type": "string",
            "id": "MongoDBAtlasChatMemory_0-input-databaseName-string"
          },
          {
            "label": "Collection Name",
            "name": "collectionName",
            "placeholder": "<COLLECTION_NAME>",
            "type": "string",
            "id": "MongoDBAtlasChatMemory_0-input-collectionName-string"
          },
          {
            "label": "Session Id",
            "name": "sessionId",
            "type": "string",
            "description": "If not specified, a random id will be used. Learn <a target=\"_blank\" href=\"https://docs.flowiseai.com/memory/long-term-memory#ui-and-embedded-chat\">more</a>",
            "default": "",
            "additionalParams": true,
            "optional": true,
            "id": "MongoDBAtlasChatMemory_0-input-sessionId-string"
          },
          {
            "label": "Memory Key",
            "name": "memoryKey",
            "type": "string",
            "default": "chat_history",
            "additionalParams": true,
            "id": "MongoDBAtlasChatMemory_0-input-memoryKey-string"
          }
        ],
        "inputAnchors": [],
        "inputs": {
          "databaseName": "InstagramAI",
          "collectionName": "Chat History",
          "sessionId": "",
          "memoryKey": "chat_history"
        },
        "outputAnchors": [
          {
            "id": "MongoDBAtlasChatMemory_0-output-MongoDBAtlasChatMemory-MongoDBAtlasChatMemory|BaseChatMemory|BaseMemory",
            "name": "MongoDBAtlasChatMemory",
            "label": "MongoDBAtlasChatMemory",
            "description": "Stores the conversation in MongoDB Atlas",
            "type": "MongoDBAtlasChatMemory | BaseChatMemory | BaseMemory"
          }
        ],
        "outputs": {},
        "selected": false
      },
      "width": 300,
      "height": 526,
      "selected": false,
      "positionAbsolute": {
        "x": 916.74980276878,
        "y": 1001.0890890040594
      },
      "dragging": false
    },
    {
      "id": "memoryVectorStore_0",
      "position": {
        "x": 414.4861344297517,
        "y": 995.0608192884241
      },
      "type": "customNode",
      "data": {
        "id": "memoryVectorStore_0",
        "label": "In-Memory Vector Store",
        "version": 1,
        "name": "memoryVectorStore",
        "type": "Memory",
        "baseClasses": [
          "Memory",
          "VectorStoreRetriever",
          "BaseRetriever"
        ],
        "category": "Vector Stores",
        "description": "In-memory vectorstore that stores embeddings and does an exact, linear search for the most similar embeddings.",
        "inputParams": [
          {
            "label": "Top K",
            "name": "topK",
            "description": "Number of top results to fetch. Default to 4",
            "placeholder": "4",
            "type": "number",
            "optional": true,
            "id": "memoryVectorStore_0-input-topK-number"
          }
        ],
        "inputAnchors": [
          {
            "label": "Document",
            "name": "document",
            "type": "Document",
            "list": true,
            "optional": true,
            "id": "memoryVectorStore_0-input-document-Document"
          },
          {
            "label": "Embeddings",
            "name": "embeddings",
            "type": "Embeddings",
            "id": "memoryVectorStore_0-input-embeddings-Embeddings"
          }
        ],
        "inputs": {
          "document": [
            "{{textFile_0.data.instance}}"
          ],
          "embeddings": "{{openAIEmbeddings_0.data.instance}}",
          "topK": "3"
        },
        "outputAnchors": [
          {
            "name": "output",
            "label": "Output",
            "type": "options",
            "description": "",
            "options": [
              {
                "id": "memoryVectorStore_0-output-retriever-Memory|VectorStoreRetriever|BaseRetriever",
                "name": "retriever",
                "label": "Memory Retriever",
                "description": "",
                "type": "Memory | VectorStoreRetriever | BaseRetriever"
              },
              {
                "id": "memoryVectorStore_0-output-vectorStore-Memory|VectorStore",
                "name": "vectorStore",
                "label": "Memory Vector Store",
                "description": "",
                "type": "Memory | VectorStore"
              }
            ],
            "default": "retriever"
          }
        ],
        "outputs": {
          "output": "retriever"
        },
        "selected": false
      },
      "width": 300,
      "height": 407,
      "selected": false,
      "positionAbsolute": {
        "x": 414.4861344297517,
        "y": 995.0608192884241
      },
      "dragging": false
    },
    {
      "id": "openAIEmbeddings_0",
      "position": {
        "x": -35.9285604865951,
        "y": 902.3250039185579
      },
      "type": "customNode",
      "data": {
        "id": "openAIEmbeddings_0",
        "label": "OpenAI Embeddings",
        "version": 4,
        "name": "openAIEmbeddings",
        "type": "OpenAIEmbeddings",
        "baseClasses": [
          "OpenAIEmbeddings",
          "Embeddings"
        ],
        "category": "Embeddings",
        "description": "OpenAI API to generate embeddings for a given text",
        "inputParams": [
          {
            "label": "Connect Credential",
            "name": "credential",
            "type": "credential",
            "credentialNames": [
              "openAIApi"
            ],
            "id": "openAIEmbeddings_0-input-credential-credential"
          },
          {
            "label": "Model Name",
            "name": "modelName",
            "type": "asyncOptions",
            "loadMethod": "listModels",
            "default": "text-embedding-ada-002",
            "id": "openAIEmbeddings_0-input-modelName-asyncOptions"
          },
          {
            "label": "Strip New Lines",
            "name": "stripNewLines",
            "type": "boolean",
            "optional": true,
            "additionalParams": true,
            "id": "openAIEmbeddings_0-input-stripNewLines-boolean"
          },
          {
            "label": "Batch Size",
            "name": "batchSize",
            "type": "number",
            "optional": true,
            "additionalParams": true,
            "id": "openAIEmbeddings_0-input-batchSize-number"
          },
          {
            "label": "Timeout",
            "name": "timeout",
            "type": "number",
            "optional": true,
            "additionalParams": true,
            "id": "openAIEmbeddings_0-input-timeout-number"
          },
          {
            "label": "BasePath",
            "name": "basepath",
            "type": "string",
            "optional": true,
            "additionalParams": true,
            "id": "openAIEmbeddings_0-input-basepath-string"
          },
          {
            "label": "Dimensions",
            "name": "dimensions",
            "type": "number",
            "optional": true,
            "additionalParams": true,
            "id": "openAIEmbeddings_0-input-dimensions-number"
          }
        ],
        "inputAnchors": [],
        "inputs": {
          "modelName": "text-embedding-3-large",
          "stripNewLines": "",
          "batchSize": "",
          "timeout": "",
          "basepath": "",
          "dimensions": ""
        },
        "outputAnchors": [
          {
            "id": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings",
            "name": "openAIEmbeddings",
            "label": "OpenAIEmbeddings",
            "description": "OpenAI API to generate embeddings for a given text",
            "type": "OpenAIEmbeddings | Embeddings"
          }
        ],
        "outputs": {},
        "selected": false
      },
      "width": 300,
      "height": 424,
      "selected": false,
      "positionAbsolute": {
        "x": -35.9285604865951,
        "y": 902.3250039185579
      },
      "dragging": false
    },
    {
      "id": "textFile_0",
      "position": {
        "x": 63.31456215068147,
        "y": 295.62741096277875
      },
      "type": "customNode",
      "data": {
        "id": "textFile_0",
        "label": "Text File",
        "version": 3,
        "name": "textFile",
        "type": "Document",
        "baseClasses": [
          "Document"
        ],
        "category": "Document Loaders",
        "description": "Load data from text files",
        "inputParams": [
          {
            "label": "Txt File",
            "name": "txtFile",
            "type": "file",
            "fileType": ".txt, .html, .aspx, .asp, .cpp, .c, .cs, .css, .go, .h, .java, .js, .less, .ts, .php, .proto, .python, .py, .rst, .ruby, .rb, .rs, .scala, .sc, .scss, .sol, .sql, .swift, .markdown, .md, .tex, .ltx, .vb, .xml",
            "id": "textFile_0-input-txtFile-file"
          },
          {
            "label": "Additional Metadata",
            "name": "metadata",
            "type": "json",
            "description": "Additional metadata to be added to the extracted documents",
            "optional": true,
            "additionalParams": true,
            "id": "textFile_0-input-metadata-json"
          },
          {
            "label": "Omit Metadata Keys",
            "name": "omitMetadataKeys",
            "type": "string",
            "rows": 4,
            "description": "Each document loader comes with a default set of metadata keys that are extracted from the document. You can use this field to omit some of the default metadata keys. The value should be a list of keys, seperated by comma. Use * to omit all metadata keys execept the ones you specify in the Additional Metadata field",
            "placeholder": "key1, key2, key3.nestedKey1",
            "optional": true,
            "additionalParams": true,
            "id": "textFile_0-input-omitMetadataKeys-string"
          }
        ],
        "inputAnchors": [
          {
            "label": "Text Splitter",
            "name": "textSplitter",
            "type": "TextSplitter",
            "optional": true,
            "id": "textFile_0-input-textSplitter-TextSplitter"
          }
        ],
        "inputs": {
          "textSplitter": "{{markdownTextSplitter_0.data.instance}}",
          "metadata": "",
          "omitMetadataKeys": ""
        },
        "outputAnchors": [
          {
            "name": "output",
            "label": "Output",
            "type": "options",
            "description": "Array of document objects containing metadata and pageContent",
            "options": [
              {
                "id": "textFile_0-output-document-Document|json",
                "name": "document",
                "label": "Document",
                "description": "Array of document objects containing metadata and pageContent",
                "type": "Document | json"
              },
              {
                "id": "textFile_0-output-text-string|json",
                "name": "text",
                "label": "Text",
                "description": "Concatenated string from pageContent of documents",
                "type": "string | json"
              }
            ],
            "default": "document"
          }
        ],
        "outputs": {
          "output": "document"
        },
        "selected": false
      },
      "width": 300,
      "height": 440,
      "selected": false,
      "positionAbsolute": {
        "x": 63.31456215068147,
        "y": 295.62741096277875
      },
      "dragging": false
    },
    {
      "id": "markdownTextSplitter_0",
      "position": {
        "x": -315.05682585100317,
        "y": 185.09751191514172
      },
      "type": "customNode",
      "data": {
        "id": "markdownTextSplitter_0",
        "label": "Markdown Text Splitter",
        "version": 1,
        "name": "markdownTextSplitter",
        "type": "MarkdownTextSplitter",
        "baseClasses": [
          "MarkdownTextSplitter",
          "RecursiveCharacterTextSplitter",
          "TextSplitter",
          "BaseDocumentTransformer",
          "Runnable"
        ],
        "category": "Text Splitters",
        "description": "Split your content into documents based on the Markdown headers",
        "inputParams": [
          {
            "label": "Chunk Size",
            "name": "chunkSize",
            "type": "number",
            "description": "Number of characters in each chunk. Default is 1000.",
            "default": 1000,
            "optional": true,
            "id": "markdownTextSplitter_0-input-chunkSize-number"
          },
          {
            "label": "Chunk Overlap",
            "name": "chunkOverlap",
            "type": "number",
            "description": "Number of characters to overlap between chunks. Default is 200.",
            "default": 200,
            "optional": true,
            "id": "markdownTextSplitter_0-input-chunkOverlap-number"
          }
        ],
        "inputAnchors": [],
        "inputs": {
          "chunkSize": "500",
          "chunkOverlap": 200
        },
        "outputAnchors": [
          {
            "id": "markdownTextSplitter_0-output-markdownTextSplitter-MarkdownTextSplitter|RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable",
            "name": "markdownTextSplitter",
            "label": "MarkdownTextSplitter",
            "description": "Split your content into documents based on the Markdown headers",
            "type": "MarkdownTextSplitter | RecursiveCharacterTextSplitter | TextSplitter | BaseDocumentTransformer | Runnable"
          }
        ],
        "outputs": {},
        "selected": false
      },
      "width": 300,
      "height": 378,
      "selected": false,
      "positionAbsolute": {
        "x": -315.05682585100317,
        "y": 185.09751191514172
      },
      "dragging": false
    }
  ],
  "edges": [
    {
      "source": "chatOpenAI_0",
      "sourceHandle": "chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable",
      "target": "conversationalRetrievalQAChain_0",
      "targetHandle": "conversationalRetrievalQAChain_0-input-model-BaseChatModel",
      "type": "buttonedge",
      "id": "chatOpenAI_0-chatOpenAI_0-output-chatOpenAI-ChatOpenAI|BaseChatModel|BaseLanguageModel|Runnable-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-model-BaseChatModel"
    },
    {
      "source": "MongoDBAtlasChatMemory_0",
      "sourceHandle": "MongoDBAtlasChatMemory_0-output-MongoDBAtlasChatMemory-MongoDBAtlasChatMemory|BaseChatMemory|BaseMemory",
      "target": "conversationalRetrievalQAChain_0",
      "targetHandle": "conversationalRetrievalQAChain_0-input-memory-BaseMemory",
      "type": "buttonedge",
      "id": "MongoDBAtlasChatMemory_0-MongoDBAtlasChatMemory_0-output-MongoDBAtlasChatMemory-MongoDBAtlasChatMemory|BaseChatMemory|BaseMemory-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-memory-BaseMemory"
    },
    {
      "source": "memoryVectorStore_0",
      "sourceHandle": "memoryVectorStore_0-output-retriever-Memory|VectorStoreRetriever|BaseRetriever",
      "target": "conversationalRetrievalQAChain_0",
      "targetHandle": "conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever",
      "type": "buttonedge",
      "id": "memoryVectorStore_0-memoryVectorStore_0-output-retriever-Memory|VectorStoreRetriever|BaseRetriever-conversationalRetrievalQAChain_0-conversationalRetrievalQAChain_0-input-vectorStoreRetriever-BaseRetriever"
    },
    {
      "source": "openAIEmbeddings_0",
      "sourceHandle": "openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings",
      "target": "memoryVectorStore_0",
      "targetHandle": "memoryVectorStore_0-input-embeddings-Embeddings",
      "type": "buttonedge",
      "id": "openAIEmbeddings_0-openAIEmbeddings_0-output-openAIEmbeddings-OpenAIEmbeddings|Embeddings-memoryVectorStore_0-memoryVectorStore_0-input-embeddings-Embeddings"
    },
    {
      "source": "textFile_0",
      "sourceHandle": "textFile_0-output-document-Document|json",
      "target": "memoryVectorStore_0",
      "targetHandle": "memoryVectorStore_0-input-document-Document",
      "type": "buttonedge",
      "id": "textFile_0-textFile_0-output-document-Document|json-memoryVectorStore_0-memoryVectorStore_0-input-document-Document"
    },
    {
      "source": "markdownTextSplitter_0",
      "sourceHandle": "markdownTextSplitter_0-output-markdownTextSplitter-MarkdownTextSplitter|RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable",
      "target": "textFile_0",
      "targetHandle": "textFile_0-input-textSplitter-TextSplitter",
      "type": "buttonedge",
      "id": "markdownTextSplitter_0-markdownTextSplitter_0-output-markdownTextSplitter-MarkdownTextSplitter|RecursiveCharacterTextSplitter|TextSplitter|BaseDocumentTransformer|Runnable-textFile_0-textFile_0-input-textSplitter-TextSplitter"
    }
  ]
}