Added updatable components and avatar (#2115)

## Features:

- Avatar Selection within certain images
- Update more obvious and appearing only when component is not edited by
user
This commit is contained in:
Lucas Oliveira 2024-06-08 01:08:36 +02:00 • committed by GitHub
commit 8fba139bfa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
116 changed files with 868 additions and 1511 deletions

View file

@ -4,7 +4,7 @@ You can run Langflow in `--backend-only` mode to expose your Langflow app as an
Start langflow in backend-only mode with `python3 -m langflow run --backend-only`. Start langflow in backend-only mode with `python3 -m langflow run --backend-only`.
The terminal prints ` Welcome to ⛓ Langflow `, and a blank window opens at `http://127.0.0.1:7864/all`. The terminal prints `Welcome to ⛓ Langflow`, and a blank window opens at `http://127.0.0.1:7864/all`.
Langflow will now serve requests to its API without the frontend running. Langflow will now serve requests to its API without the frontend running.
## Prerequisites ## Prerequisites
@ -42,7 +42,7 @@ Note the flow ID of `ef7e0554-69e5-4e3e-ab29-ee83bcd8d9ef`. You can find this ID
1. Stop Langflow with Ctrl+C. 1. Stop Langflow with Ctrl+C.
2. Start langflow in backend-only mode with `python3 -m langflow run --backend-only`. 2. Start langflow in backend-only mode with `python3 -m langflow run --backend-only`.
The terminal prints ` Welcome to ⛓ Langflow `, and a blank window opens at `http://127.0.0.1:7864/all`. The terminal prints `Welcome to ⛓ Langflow`, and a blank window opens at `http://127.0.0.1:7864/all`.
Langflow will now serve requests to its API. Langflow will now serve requests to its API.
3. Run the curl code you copied from the UI. 3. Run the curl code you copied from the UI.
You should get a result like this: You should get a result like this:

View file

@ -86,6 +86,10 @@ def update_frontend_node_with_template_values(frontend_node, raw_frontend_node):
update_template_values(frontend_node["template"], raw_frontend_node["template"]) update_template_values(frontend_node["template"], raw_frontend_node["template"])
old_code = raw_frontend_node["template"]["code"]["value"]
new_code = frontend_node["template"]["code"]["value"]
frontend_node["edited"] = old_code != new_code
return frontend_node return frontend_node

View file

@ -2,6 +2,7 @@ import hashlib
from http import HTTPStatus from http import HTTPStatus
from io import BytesIO from io import BytesIO
from uuid import UUID from uuid import UUID
from pathlib import Path
from fastapi import APIRouter, Depends, HTTPException, UploadFile from fastapi import APIRouter, Depends, HTTPException, UploadFile
from fastapi.responses import StreamingResponse from fastapi.responses import StreamingResponse
@ -99,6 +100,47 @@ async def download_image(file_name: str, flow_id: UUID, storage_service: Storage
raise HTTPException(status_code=500, detail=str(e)) raise HTTPException(status_code=500, detail=str(e))
@router.get("/profile_pictures/{folder_name}/{file_name}")
async def download_profile_picture(
folder_name: str,
file_name: str,
storage_service: StorageService = Depends(get_storage_service),
):
try:
extension = file_name.split(".")[-1]
config_dir = get_storage_service().settings_service.settings.config_dir
config_path = Path(config_dir)
folder_path = config_path / 'profile_pictures' / folder_name
content_type = build_content_type_from_extension(extension)
file_content = await storage_service.get_file(flow_id=folder_path, file_name=file_name)
return StreamingResponse(BytesIO(file_content), media_type=content_type)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/profile_pictures/list")
async def list_profile_pictures(storage_service: StorageService = Depends(get_storage_service)):
try:
config_dir = get_storage_service().settings_service.settings.config_dir
config_path = Path(config_dir)
people_path = config_path / "profile_pictures/People"
space_path = config_path / "profile_pictures/Space"
people = await storage_service.list_files(flow_id=people_path)
space = await storage_service.list_files(flow_id=space_path)
files = [Path("People") / i for i in people]
files += [Path("Space") / i for i in space]
return {"files": files}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/list/{flow_id}") @router.get("/list/{flow_id}")
async def list_files( async def list_files(
flow_id: UUID = Depends(get_flow_id), storage_service: StorageService = Depends(get_storage_service) flow_id: UUID = Depends(get_flow_id), storage_service: StorageService = Depends(get_storage_service)

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View file

@ -1,5 +1,6 @@
import logging import logging
import os import os
import shutil
from collections import defaultdict from collections import defaultdict
from copy import deepcopy from copy import deepcopy
from datetime import datetime, timezone from datetime import datetime, timezone
@ -20,7 +21,7 @@ from langflow.services.database.models.user.crud import get_user_by_username
from langflow.services.deps import get_settings_service, session_scope from langflow.services.deps import get_settings_service, session_scope
from langflow.services.database.models.folder.utils import create_default_folder_if_it_doesnt_exist from langflow.services.database.models.folder.utils import create_default_folder_if_it_doesnt_exist
from langflow.services.deps import get_variable_service from langflow.services.deps import get_variable_service, get_storage_service
STARTER_FOLDER_NAME = "Starter Projects" STARTER_FOLDER_NAME = "Starter Projects"
@ -103,6 +104,26 @@ def load_starter_projects() -> list[tuple[Path, dict]]:
logger.info(f"Loaded starter project {file}") logger.info(f"Loaded starter project {file}")
return starter_projects return starter_projects
def copy_profile_pictures():
config_dir = get_storage_service().settings_service.settings.config_dir
origin = Path(__file__).parent / "profile_pictures"
target = Path(config_dir) / "profile_pictures"
import pdb; pdb.set_trace
if not os.path.exists(origin):
raise ValueError(f"The source folder '{origin}' does not exist.")
if not os.path.exists(target):
os.makedirs(target)
try:
shutil.copytree(origin, target, dirs_exist_ok=True)
logger.debug(f"Folder copied from '{origin}' to '{target}'")
except Exception as e:
logger.error(f"Error copying the folder: {e}")
def get_project_data(project): def get_project_data(project):
project_name = project.get("name") project_name = project.get("name")
@ -286,6 +307,7 @@ def create_or_update_starter_projects():
new_folder = create_starter_folder(session) new_folder = create_starter_folder(session)
starter_projects = load_starter_projects() starter_projects = load_starter_projects()
delete_start_projects(session, new_folder.id) delete_start_projects(session, new_folder.id)
copy_profile_pictures()
for project_path, project in starter_projects: for project_path, project in starter_projects:
( (
project_name, project_name,

View file

@ -45,9 +45,7 @@
"name": "template", "name": "template",
"display_name": "Template", "display_name": "Template",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -86,22 +84,14 @@
"is_input": null, "is_input": null,
"is_output": null, "is_output": null,
"is_composition": null, "is_composition": null,
"base_classes": [ "base_classes": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"name": "", "name": "",
"display_name": "Prompt", "display_name": "Prompt",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"template": [ "template": ["user_input"]
"user_input"
]
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"full_path": null, "full_path": null,
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
@ -150,10 +140,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text", "Record"]
"Text",
"Record"
]
}, },
"code": { "code": {
"type": "code", "type": "code",
@ -236,9 +223,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_base": { "openai_api_base": {
"type": "str", "type": "str",
@ -257,9 +242,7 @@
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_key": { "openai_api_key": {
"type": "str", "type": "str",
@ -278,9 +261,7 @@
"info": "The OpenAI API Key to use for the OpenAI model.", "info": "The OpenAI API Key to use for the OpenAI model.",
"load_from_db": true, "load_from_db": true,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"value": "OPENAI_API_KEY" "value": "OPENAI_API_KEY"
}, },
"stream": { "stream": {
@ -319,9 +300,7 @@
"info": "System message to pass to the model.", "info": "System message to pass to the model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"temperature": { "temperature": {
"type": "float", "type": "float",
@ -352,11 +331,7 @@
}, },
"description": "Generates text using OpenAI LLMs.", "description": "Generates text using OpenAI LLMs.",
"icon": "OpenAI", "icon": "OpenAI",
"base_classes": [ "base_classes": ["object", "Text", "str"],
"object",
"Text",
"str"
],
"display_name": "OpenAI", "display_name": "OpenAI",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -370,9 +345,7 @@
"stream": null, "stream": null,
"system_message": null "system_message": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [ "field_order": [
@ -443,9 +416,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Message", "display_name": "Message",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -469,9 +440,7 @@
"info": "In case of Message being a Record, this template will be used to convert it to text.", "info": "In case of Message being a Record, this template will be used to convert it to text.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"return_record": { "return_record": {
"type": "bool", "type": "bool",
@ -503,10 +472,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User"],
"Machine",
"User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": true, "advanced": true,
@ -514,9 +480,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -536,9 +500,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -557,20 +519,13 @@
"info": "If provided, the message will be stored in the memory.", "info": "If provided, the message will be stored in the memory.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Display a chat message in the Playground.", "description": "Display a chat message in the Playground.",
"icon": "ChatOutput", "icon": "ChatOutput",
"base_classes": [ "base_classes": ["Record", "Text", "str", "object"],
"Record",
"Text",
"str",
"object"
],
"display_name": "Chat Output", "display_name": "Chat Output",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -581,10 +536,7 @@
"return_record": null, "return_record": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text", "Record"],
"Text",
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -680,10 +632,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User"],
"Machine",
"User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": true, "advanced": true,
@ -691,9 +640,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -713,9 +660,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -734,20 +679,13 @@
"info": "If provided, the message will be stored in the memory.", "info": "If provided, the message will be stored in the memory.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Get chat inputs from the Playground.", "description": "Get chat inputs from the Playground.",
"icon": "ChatInput", "icon": "ChatInput",
"base_classes": [ "base_classes": ["object", "Record", "str", "Text"],
"object",
"Record",
"str",
"Text"
],
"display_name": "Chat Input", "display_name": "Chat Input",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -757,10 +695,7 @@
"session_id": null, "session_id": null,
"return_record": null "return_record": null
}, },
"output_types": [ "output_types": ["Text", "Record"],
"Text",
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -788,17 +723,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "ChatOutput-njtka", "id": "ChatOutput-njtka",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "Text", "str"],
"object",
"Text",
"str"
],
"dataType": "OpenAIModel", "dataType": "OpenAIModel",
"id": "OpenAIModel-k39HS" "id": "OpenAIModel-k39HS"
} }
@ -818,17 +747,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "OpenAIModel-k39HS", "id": "OpenAIModel-k39HS",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"dataType": "Prompt", "dataType": "Prompt",
"id": "Prompt-uxBqP" "id": "Prompt-uxBqP"
} }
@ -848,21 +771,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "user_input", "fieldName": "user_input",
"id": "Prompt-uxBqP", "id": "Prompt-uxBqP",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "Record", "str", "Text"],
"object",
"Record",
"str",
"Text"
],
"dataType": "ChatInput", "dataType": "ChatInput",
"id": "ChatInput-P3fgL" "id": "ChatInput-P3fgL"
} }

View file

@ -45,9 +45,7 @@
"name": "template", "name": "template",
"display_name": "Template", "display_name": "Template",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -138,24 +136,14 @@
"is_input": null, "is_input": null,
"is_output": null, "is_output": null,
"is_composition": null, "is_composition": null,
"base_classes": [ "base_classes": ["object", "Text", "str"],
"object",
"Text",
"str"
],
"name": "", "name": "",
"display_name": "Prompt", "display_name": "Prompt",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"template": [ "template": ["reference_1", "reference_2", "instructions"]
"reference_1",
"reference_2",
"instructions"
]
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"full_path": null, "full_path": null,
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
@ -222,9 +210,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"value": [ "value": [
"https://www.promptingguide.ai/techniques/prompt_chaining" "https://www.promptingguide.ai/techniques/prompt_chaining"
] ]
@ -233,17 +219,13 @@
}, },
"description": "Fetch content from one or more URLs.", "description": "Fetch content from one or more URLs.",
"icon": "layout-template", "icon": "layout-template",
"base_classes": [ "base_classes": ["Record"],
"Record"
],
"display_name": "URL", "display_name": "URL",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"urls": null "urls": null
}, },
"output_types": [ "output_types": ["Record"],
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -302,9 +284,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Message", "display_name": "Message",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -328,9 +308,7 @@
"info": "In case of Message being a Record, this template will be used to convert it to text.", "info": "In case of Message being a Record, this template will be used to convert it to text.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"return_record": { "return_record": {
"type": "bool", "type": "bool",
@ -362,10 +340,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User"],
"Machine",
"User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": true, "advanced": true,
@ -373,9 +348,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -395,9 +368,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -416,20 +387,13 @@
"info": "If provided, the message will be stored in the memory.", "info": "If provided, the message will be stored in the memory.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Display a chat message in the Playground.", "description": "Display a chat message in the Playground.",
"icon": "ChatOutput", "icon": "ChatOutput",
"base_classes": [ "base_classes": ["Text", "Record", "object", "str"],
"Text",
"Record",
"object",
"str"
],
"display_name": "Chat Output", "display_name": "Chat Output",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -440,10 +404,7 @@
"return_record": null, "return_record": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text", "Record"],
"Text",
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -483,10 +444,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text", "Record"]
"Text",
"Record"
]
}, },
"code": { "code": {
"type": "code", "type": "code",
@ -569,9 +527,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_base": { "openai_api_base": {
"type": "str", "type": "str",
@ -590,9 +546,7 @@
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_key": { "openai_api_key": {
"type": "str", "type": "str",
@ -611,9 +565,7 @@
"info": "The OpenAI API Key to use for the OpenAI model.", "info": "The OpenAI API Key to use for the OpenAI model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"value": "OPENAI_API_KEY" "value": "OPENAI_API_KEY"
}, },
"stream": { "stream": {
@ -652,9 +604,7 @@
"info": "System message to pass to the model.", "info": "System message to pass to the model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"temperature": { "temperature": {
"type": "float", "type": "float",
@ -685,11 +635,7 @@
}, },
"description": "Generates text using OpenAI LLMs.", "description": "Generates text using OpenAI LLMs.",
"icon": "OpenAI", "icon": "OpenAI",
"base_classes": [ "base_classes": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"display_name": "OpenAI", "display_name": "OpenAI",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -703,9 +649,7 @@
"stream": null, "stream": null,
"system_message": null "system_message": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [ "field_order": [
@ -778,28 +722,20 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text" "value": ["https://www.promptingguide.ai/introduction/basics"]
],
"value": [
"https://www.promptingguide.ai/introduction/basics"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Fetch content from one or more URLs.", "description": "Fetch content from one or more URLs.",
"icon": "layout-template", "icon": "layout-template",
"base_classes": [ "base_classes": ["Record"],
"Record"
],
"display_name": "URL", "display_name": "URL",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"urls": null "urls": null
}, },
"output_types": [ "output_types": ["Record"],
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -859,10 +795,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Value", "display_name": "Value",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Record", "Text"],
"Record",
"Text"
],
"dynamic": false, "dynamic": false,
"info": "Text or Record to be passed as input.", "info": "Text or Record to be passed as input.",
"load_from_db": false, "load_from_db": false,
@ -886,28 +819,20 @@
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Get text inputs from the Playground.", "description": "Get text inputs from the Playground.",
"icon": "type", "icon": "type",
"base_classes": [ "base_classes": ["object", "Text", "str"],
"object",
"Text",
"str"
],
"display_name": "Instructions", "display_name": "Instructions",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"input_value": null, "input_value": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -936,18 +861,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "reference_2", "fieldName": "reference_2",
"id": "Prompt-Rse03", "id": "Prompt-Rse03",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["Record"],
"Record"
],
"dataType": "URL", "dataType": "URL",
"id": "URL-HYPkR" "id": "URL-HYPkR"
} }
@ -967,17 +885,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "ChatOutput-JPlxl", "id": "ChatOutput-JPlxl",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"dataType": "OpenAIModel", "dataType": "OpenAIModel",
"id": "OpenAIModel-gi29P" "id": "OpenAIModel-gi29P"
} }
@ -997,18 +909,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "reference_1", "fieldName": "reference_1",
"id": "Prompt-Rse03", "id": "Prompt-Rse03",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["Record"],
"Record"
],
"dataType": "URL", "dataType": "URL",
"id": "URL-2cX90" "id": "URL-2cX90"
} }
@ -1028,20 +933,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "instructions", "fieldName": "instructions",
"id": "Prompt-Rse03", "id": "Prompt-Rse03",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "Text", "str"],
"object",
"Text",
"str"
],
"dataType": "TextInput", "dataType": "TextInput",
"id": "TextInput-og8Or" "id": "TextInput-og8Or"
} }
@ -1061,17 +957,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "OpenAIModel-gi29P", "id": "OpenAIModel-gi29P",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "Text", "str"],
"object",
"Text",
"str"
],
"dataType": "Prompt", "dataType": "Prompt",
"id": "Prompt-Rse03" "id": "Prompt-Rse03"
} }

View file

@ -45,9 +45,7 @@
"name": "template", "name": "template",
"display_name": "Template", "display_name": "Template",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -112,23 +110,14 @@
"is_input": null, "is_input": null,
"is_output": null, "is_output": null,
"is_composition": null, "is_composition": null,
"base_classes": [ "base_classes": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"name": "", "name": "",
"display_name": "Prompt", "display_name": "Prompt",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"template": [ "template": ["Document", "Question"]
"Document",
"Question"
]
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"full_path": null, "full_path": null,
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
@ -231,18 +220,14 @@
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "A generic file loader.", "description": "A generic file loader.",
"base_classes": [ "base_classes": ["Record"],
"Record"
],
"display_name": "Files", "display_name": "Files",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"path": null, "path": null,
"silent_errors": null "silent_errors": null
}, },
"output_types": [ "output_types": ["Record"],
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -338,10 +323,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User"],
"Machine",
"User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": true, "advanced": true,
@ -349,9 +331,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -371,9 +351,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -392,20 +370,13 @@
"info": "If provided, the message will be stored in the memory.", "info": "If provided, the message will be stored in the memory.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Get chat inputs from the Playground.", "description": "Get chat inputs from the Playground.",
"icon": "ChatInput", "icon": "ChatInput",
"base_classes": [ "base_classes": ["str", "Record", "Text", "object"],
"str",
"Record",
"Text",
"object"
],
"display_name": "Chat Input", "display_name": "Chat Input",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -415,10 +386,7 @@
"session_id": null, "session_id": null,
"return_record": null "return_record": null
}, },
"output_types": [ "output_types": ["Text", "Record"],
"Text",
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -477,9 +445,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Message", "display_name": "Message",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -515,10 +481,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User"],
"Machine",
"User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": true, "advanced": true,
@ -526,9 +489,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -548,9 +509,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -569,20 +528,13 @@
"info": "If provided, the message will be stored in the memory.", "info": "If provided, the message will be stored in the memory.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Display a chat message in the Playground.", "description": "Display a chat message in the Playground.",
"icon": "ChatOutput", "icon": "ChatOutput",
"base_classes": [ "base_classes": ["str", "Record", "Text", "object"],
"str",
"Record",
"Text",
"object"
],
"display_name": "Chat Output", "display_name": "Chat Output",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -592,10 +544,7 @@
"session_id": null, "session_id": null,
"return_record": null "return_record": null
}, },
"output_types": [ "output_types": ["Text", "Record"],
"Text",
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -640,10 +589,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text", "Record"]
"Text",
"Record"
]
}, },
"code": { "code": {
"type": "code", "type": "code",
@ -726,9 +672,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_base": { "openai_api_base": {
"type": "str", "type": "str",
@ -747,9 +691,7 @@
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_key": { "openai_api_key": {
"type": "str", "type": "str",
@ -768,9 +710,7 @@
"info": "The OpenAI API Key to use for the OpenAI model.", "info": "The OpenAI API Key to use for the OpenAI model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"value": "OPENAI_API_KEY" "value": "OPENAI_API_KEY"
}, },
"stream": { "stream": {
@ -809,9 +749,7 @@
"info": "System message to pass to the model.", "info": "System message to pass to the model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"temperature": { "temperature": {
"type": "float", "type": "float",
@ -842,11 +780,7 @@
}, },
"description": "Generates text using OpenAI LLMs.", "description": "Generates text using OpenAI LLMs.",
"icon": "OpenAI", "icon": "OpenAI",
"base_classes": [ "base_classes": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"display_name": "OpenAI", "display_name": "OpenAI",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -860,9 +794,7 @@
"stream": null, "stream": null,
"system_message": null "system_message": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [ "field_order": [
@ -900,21 +832,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "Question", "fieldName": "Question",
"id": "Prompt-tHwPf", "id": "Prompt-tHwPf",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["str", "Record", "Text", "object"],
"str",
"Record",
"Text",
"object"
],
"dataType": "ChatInput", "dataType": "ChatInput",
"id": "ChatInput-MsSJ9" "id": "ChatInput-MsSJ9"
} }
@ -934,18 +856,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "Document", "fieldName": "Document",
"id": "Prompt-tHwPf", "id": "Prompt-tHwPf",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["Record"],
"Record"
],
"dataType": "File", "dataType": "File",
"id": "File-6TEsD" "id": "File-6TEsD"
} }
@ -965,17 +880,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "OpenAIModel-Bt067", "id": "OpenAIModel-Bt067",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"dataType": "Prompt", "dataType": "Prompt",
"id": "Prompt-tHwPf" "id": "Prompt-tHwPf"
} }
@ -995,17 +904,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "ChatOutput-F5Awj", "id": "ChatOutput-F5Awj",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"dataType": "OpenAIModel", "dataType": "OpenAIModel",
"id": "OpenAIModel-Bt067" "id": "OpenAIModel-Bt067"
} }

View file

@ -83,10 +83,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User"],
"Machine",
"User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": true, "advanced": true,
@ -94,9 +91,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -116,9 +111,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -137,21 +130,14 @@
"info": "If provided, the message will be stored in the memory.", "info": "If provided, the message will be stored in the memory.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"value": "MySessionID" "value": "MySessionID"
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Get chat inputs from the Playground.", "description": "Get chat inputs from the Playground.",
"icon": "ChatInput", "icon": "ChatInput",
"base_classes": [ "base_classes": ["Text", "object", "Record", "str"],
"Text",
"object",
"Record",
"str"
],
"display_name": "Chat Input", "display_name": "Chat Input",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -161,10 +147,7 @@
"session_id": null, "session_id": null,
"return_record": null "return_record": null
}, },
"output_types": [ "output_types": ["Text", "Record"],
"Text",
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -223,9 +206,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Message", "display_name": "Message",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -261,10 +242,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User"],
"Machine",
"User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": true, "advanced": true,
@ -272,9 +250,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -294,9 +270,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -315,21 +289,14 @@
"info": "If provided, the message will be stored in the memory.", "info": "If provided, the message will be stored in the memory.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"value": "MySessionID" "value": "MySessionID"
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Display a chat message in the Playground.", "description": "Display a chat message in the Playground.",
"icon": "ChatOutput", "icon": "ChatOutput",
"base_classes": [ "base_classes": ["Text", "object", "Record", "str"],
"Text",
"object",
"Record",
"str"
],
"display_name": "Chat Output", "display_name": "Chat Output",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -339,10 +306,7 @@
"session_id": null, "session_id": null,
"return_record": null "return_record": null
}, },
"output_types": [ "output_types": ["Text", "Record"],
"Text",
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -418,10 +382,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Ascending", "Descending"],
"Ascending",
"Descending"
],
"name": "order", "name": "order",
"display_name": "Order", "display_name": "Order",
"advanced": true, "advanced": true,
@ -429,9 +390,7 @@
"info": "Order of the messages.", "info": "Order of the messages.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"record_template": { "record_template": {
"type": "str", "type": "str",
@ -451,9 +410,7 @@
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender": { "sender": {
"type": "str", "type": "str",
@ -466,11 +423,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User", "Machine and User"],
"Machine",
"User",
"Machine and User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": false, "advanced": false,
@ -478,9 +431,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -499,9 +450,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -516,9 +465,7 @@
"name": "session_id", "name": "session_id",
"display_name": "Session ID", "display_name": "Session ID",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "Session ID of the chat history.", "info": "Session ID of the chat history.",
"load_from_db": false, "load_from_db": false,
@ -529,11 +476,7 @@
}, },
"description": "Retrieves stored chat messages given a specific Session ID.", "description": "Retrieves stored chat messages given a specific Session ID.",
"icon": "history", "icon": "history",
"base_classes": [ "base_classes": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"display_name": "Chat Memory", "display_name": "Chat Memory",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -544,9 +487,7 @@
"order": null, "order": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -608,9 +549,7 @@
"name": "template", "name": "template",
"display_name": "Template", "display_name": "Template",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -675,23 +614,14 @@
"is_input": null, "is_input": null,
"is_output": null, "is_output": null,
"is_composition": null, "is_composition": null,
"base_classes": [ "base_classes": ["Text", "str", "object"],
"Text",
"str",
"object"
],
"name": "", "name": "",
"display_name": "Prompt", "display_name": "Prompt",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"template": [ "template": ["context", "user_message"]
"context",
"user_message"
]
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"full_path": null, "full_path": null,
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
@ -740,10 +670,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text", "Record"]
"Text",
"Record"
]
}, },
"code": { "code": {
"type": "code", "type": "code",
@ -826,9 +753,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_base": { "openai_api_base": {
"type": "str", "type": "str",
@ -847,9 +772,7 @@
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_key": { "openai_api_key": {
"type": "str", "type": "str",
@ -868,9 +791,7 @@
"info": "The OpenAI API Key to use for the OpenAI model.", "info": "The OpenAI API Key to use for the OpenAI model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"value": "OPENAI_API_KEY" "value": "OPENAI_API_KEY"
}, },
"stream": { "stream": {
@ -909,9 +830,7 @@
"info": "System message to pass to the model.", "info": "System message to pass to the model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"temperature": { "temperature": {
"type": "float", "type": "float",
@ -942,11 +861,7 @@
}, },
"description": "Generates text using OpenAI LLMs.", "description": "Generates text using OpenAI LLMs.",
"icon": "OpenAI", "icon": "OpenAI",
"base_classes": [ "base_classes": ["str", "object", "Text"],
"str",
"object",
"Text"
],
"display_name": "OpenAI", "display_name": "OpenAI",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -960,9 +875,7 @@
"stream": null, "stream": null,
"system_message": null "system_message": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [ "field_order": [
@ -1014,10 +927,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Value", "display_name": "Value",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Record", "Text"],
"Record",
"Text"
],
"dynamic": false, "dynamic": false,
"info": "Text or Record to be passed as output.", "info": "Text or Record to be passed as output.",
"load_from_db": false, "load_from_db": false,
@ -1059,28 +969,20 @@
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Display a text output in the Playground.", "description": "Display a text output in the Playground.",
"icon": "type", "icon": "type",
"base_classes": [ "base_classes": ["str", "object", "Text"],
"str",
"object",
"Text"
],
"display_name": "Inspect Memory", "display_name": "Inspect Memory",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"input_value": null, "input_value": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -1109,19 +1011,10 @@
"fieldName": "context", "fieldName": "context",
"type": "str", "type": "str",
"id": "Prompt-ODkUx", "id": "Prompt-ODkUx",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"]
"Document",
"BaseOutputParser",
"Record",
"Text"
]
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"dataType": "MemoryComponent", "dataType": "MemoryComponent",
"id": "MemoryComponent-cdA1J" "id": "MemoryComponent-cdA1J"
} }
@ -1143,20 +1036,10 @@
"fieldName": "user_message", "fieldName": "user_message",
"type": "str", "type": "str",
"id": "Prompt-ODkUx", "id": "Prompt-ODkUx",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"]
"Document",
"BaseOutputParser",
"Record",
"Text"
]
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["Text", "object", "Record", "str"],
"Text",
"object",
"Record",
"str"
],
"dataType": "ChatInput", "dataType": "ChatInput",
"id": "ChatInput-t7F8v" "id": "ChatInput-t7F8v"
} }
@ -1177,17 +1060,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "OpenAIModel-9RykF", "id": "OpenAIModel-9RykF",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["Text", "str", "object"],
"Text",
"str",
"object"
],
"dataType": "Prompt", "dataType": "Prompt",
"id": "Prompt-ODkUx" "id": "Prompt-ODkUx"
} }
@ -1207,17 +1084,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "ChatOutput-P1jEe", "id": "ChatOutput-P1jEe",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["str", "object", "Text"],
"str",
"object",
"Text"
],
"dataType": "OpenAIModel", "dataType": "OpenAIModel",
"id": "OpenAIModel-9RykF" "id": "OpenAIModel-9RykF"
} }
@ -1237,18 +1108,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "TextOutput-vrs6T", "id": "TextOutput-vrs6T",
"inputTypes": [ "inputTypes": ["Record", "Text"],
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"dataType": "MemoryComponent", "dataType": "MemoryComponent",
"id": "MemoryComponent-cdA1J" "id": "MemoryComponent-cdA1J"
} }

View file

@ -45,9 +45,7 @@
"name": "template", "name": "template",
"display_name": "Template", "display_name": "Template",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -86,22 +84,14 @@
"is_input": null, "is_input": null,
"is_output": null, "is_output": null,
"is_composition": null, "is_composition": null,
"base_classes": [ "base_classes": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"name": "", "name": "",
"display_name": "Prompt", "display_name": "Prompt",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"template": [ "template": ["document"]
"document"
]
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"full_path": null, "full_path": null,
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
@ -165,9 +155,7 @@
"name": "template", "name": "template",
"display_name": "Template", "display_name": "Template",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -206,22 +194,14 @@
"is_input": null, "is_input": null,
"is_output": null, "is_output": null,
"is_composition": null, "is_composition": null,
"base_classes": [ "base_classes": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"name": "", "name": "",
"display_name": "Prompt", "display_name": "Prompt",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"template": [ "template": ["summary"]
"summary"
]
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"full_path": null, "full_path": null,
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
@ -280,9 +260,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Message", "display_name": "Message",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -306,9 +284,7 @@
"info": "In case of Message being a Record, this template will be used to convert it to text.", "info": "In case of Message being a Record, this template will be used to convert it to text.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"return_record": { "return_record": {
"type": "bool", "type": "bool",
@ -340,10 +316,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User"],
"Machine",
"User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": true, "advanced": true,
@ -351,9 +324,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -373,9 +344,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -394,20 +363,13 @@
"info": "If provided, the message will be stored in the memory.", "info": "If provided, the message will be stored in the memory.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Display a chat message in the Playground.", "description": "Display a chat message in the Playground.",
"icon": "ChatOutput", "icon": "ChatOutput",
"base_classes": [ "base_classes": ["object", "Record", "Text", "str"],
"object",
"Record",
"Text",
"str"
],
"display_name": "Chat Output", "display_name": "Chat Output",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -418,10 +380,7 @@
"return_record": null, "return_record": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text", "Record"],
"Text",
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -476,9 +435,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Message", "display_name": "Message",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"dynamic": false, "dynamic": false,
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
@ -502,9 +459,7 @@
"info": "In case of Message being a Record, this template will be used to convert it to text.", "info": "In case of Message being a Record, this template will be used to convert it to text.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"return_record": { "return_record": {
"type": "bool", "type": "bool",
@ -536,10 +491,7 @@
"fileTypes": [], "fileTypes": [],
"file_path": "", "file_path": "",
"password": false, "password": false,
"options": [ "options": ["Machine", "User"],
"Machine",
"User"
],
"name": "sender", "name": "sender",
"display_name": "Sender Type", "display_name": "Sender Type",
"advanced": true, "advanced": true,
@ -547,9 +499,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"sender_name": { "sender_name": {
"type": "str", "type": "str",
@ -569,9 +519,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"session_id": { "session_id": {
"type": "str", "type": "str",
@ -590,20 +538,13 @@
"info": "If provided, the message will be stored in the memory.", "info": "If provided, the message will be stored in the memory.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Display a chat message in the Playground.", "description": "Display a chat message in the Playground.",
"icon": "ChatOutput", "icon": "ChatOutput",
"base_classes": [ "base_classes": ["object", "Record", "Text", "str"],
"object",
"Record",
"Text",
"str"
],
"display_name": "Chat Output", "display_name": "Chat Output",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -614,10 +555,7 @@
"return_record": null, "return_record": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text", "Record"],
"Text",
"Record"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -672,10 +610,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Value", "display_name": "Value",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Record", "Text"],
"Record",
"Text"
],
"dynamic": false, "dynamic": false,
"info": "Text or Record to be passed as input.", "info": "Text or Record to be passed as input.",
"load_from_db": false, "load_from_db": false,
@ -699,28 +634,20 @@
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Get text inputs from the Playground.", "description": "Get text inputs from the Playground.",
"icon": "type", "icon": "type",
"base_classes": [ "base_classes": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"display_name": "Text Input", "display_name": "Text Input",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"input_value": null, "input_value": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -762,10 +689,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Value", "display_name": "Value",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Record", "Text"],
"Record",
"Text"
],
"dynamic": false, "dynamic": false,
"info": "Text or Record to be passed as output.", "info": "Text or Record to be passed as output.",
"load_from_db": false, "load_from_db": false,
@ -807,28 +731,20 @@
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Display a text output in the Playground.", "description": "Display a text output in the Playground.",
"icon": "type", "icon": "type",
"base_classes": [ "base_classes": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"display_name": "First Prompt", "display_name": "First Prompt",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"input_value": null, "input_value": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -873,10 +789,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text", "Record"]
"Text",
"Record"
]
}, },
"code": { "code": {
"type": "code", "type": "code",
@ -959,9 +872,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_base": { "openai_api_base": {
"type": "str", "type": "str",
@ -980,9 +891,7 @@
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_key": { "openai_api_key": {
"type": "str", "type": "str",
@ -1001,9 +910,7 @@
"info": "The OpenAI API Key to use for the OpenAI model.", "info": "The OpenAI API Key to use for the OpenAI model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"value": "OPENAI_API_KEY" "value": "OPENAI_API_KEY"
}, },
"stream": { "stream": {
@ -1042,9 +949,7 @@
"info": "System message to pass to the model.", "info": "System message to pass to the model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"temperature": { "temperature": {
"type": "float", "type": "float",
@ -1075,11 +980,7 @@
}, },
"description": "Generates text using OpenAI LLMs.", "description": "Generates text using OpenAI LLMs.",
"icon": "OpenAI", "icon": "OpenAI",
"base_classes": [ "base_classes": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"display_name": "OpenAI", "display_name": "OpenAI",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -1093,9 +994,7 @@
"stream": null, "stream": null,
"system_message": null "system_message": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [ "field_order": [
@ -1147,10 +1046,7 @@
"name": "input_value", "name": "input_value",
"display_name": "Value", "display_name": "Value",
"advanced": false, "advanced": false,
"input_types": [ "input_types": ["Record", "Text"],
"Record",
"Text"
],
"dynamic": false, "dynamic": false,
"info": "Text or Record to be passed as output.", "info": "Text or Record to be passed as output.",
"load_from_db": false, "load_from_db": false,
@ -1192,28 +1088,20 @@
"info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.", "info": "Template to convert Record to Text. If left empty, it will be dynamically set to the Record's text key.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"_type": "CustomComponent" "_type": "CustomComponent"
}, },
"description": "Display a text output in the Playground.", "description": "Display a text output in the Playground.",
"icon": "type", "icon": "type",
"base_classes": [ "base_classes": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"display_name": "Second Prompt", "display_name": "Second Prompt",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
"input_value": null, "input_value": null,
"record_template": null "record_template": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [], "field_order": [],
@ -1258,10 +1146,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text", "Record"]
"Text",
"Record"
]
}, },
"code": { "code": {
"type": "code", "type": "code",
@ -1344,9 +1229,7 @@
"info": "", "info": "",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_base": { "openai_api_base": {
"type": "str", "type": "str",
@ -1365,9 +1248,7 @@
"info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.", "info": "The base URL of the OpenAI API. Defaults to https://api.openai.com/v1.\n\nYou can change this to use other APIs like JinaChat, LocalAI and Prem.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"openai_api_key": { "openai_api_key": {
"type": "str", "type": "str",
@ -1386,9 +1267,7 @@
"info": "The OpenAI API Key to use for the OpenAI model.", "info": "The OpenAI API Key to use for the OpenAI model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"],
"Text"
],
"value": "" "value": ""
}, },
"stream": { "stream": {
@ -1427,9 +1306,7 @@
"info": "System message to pass to the model.", "info": "System message to pass to the model.",
"load_from_db": false, "load_from_db": false,
"title_case": false, "title_case": false,
"input_types": [ "input_types": ["Text"]
"Text"
]
}, },
"temperature": { "temperature": {
"type": "float", "type": "float",
@ -1460,11 +1337,7 @@
}, },
"description": "Generates text using OpenAI LLMs.", "description": "Generates text using OpenAI LLMs.",
"icon": "OpenAI", "icon": "OpenAI",
"base_classes": [ "base_classes": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"display_name": "OpenAI", "display_name": "OpenAI",
"documentation": "", "documentation": "",
"custom_fields": { "custom_fields": {
@ -1478,9 +1351,7 @@
"stream": null, "stream": null,
"system_message": null "system_message": null
}, },
"output_types": [ "output_types": ["Text"],
"Text"
],
"field_formatters": {}, "field_formatters": {},
"frozen": false, "frozen": false,
"field_order": [ "field_order": [
@ -1518,20 +1389,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "document", "fieldName": "document",
"id": "Prompt-amqBu", "id": "Prompt-amqBu",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"dataType": "TextInput", "dataType": "TextInput",
"id": "TextInput-sptaH" "id": "TextInput-sptaH"
} }
@ -1551,18 +1413,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "TextOutput-2MS4a", "id": "TextOutput-2MS4a",
"inputTypes": [ "inputTypes": ["Record", "Text"],
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"dataType": "Prompt", "dataType": "Prompt",
"id": "Prompt-amqBu" "id": "Prompt-amqBu"
} }
@ -1582,17 +1437,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "OpenAIModel-uYXZJ", "id": "OpenAIModel-uYXZJ",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"dataType": "Prompt", "dataType": "Prompt",
"id": "Prompt-amqBu" "id": "Prompt-amqBu"
} }
@ -1612,20 +1461,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "summary", "fieldName": "summary",
"id": "Prompt-gTNiz", "id": "Prompt-gTNiz",
"inputTypes": [ "inputTypes": ["Document", "BaseOutputParser", "Record", "Text"],
"Document",
"BaseOutputParser",
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"dataType": "OpenAIModel", "dataType": "OpenAIModel",
"id": "OpenAIModel-uYXZJ" "id": "OpenAIModel-uYXZJ"
} }
@ -1645,17 +1485,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "ChatOutput-EJkG3", "id": "ChatOutput-EJkG3",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"dataType": "OpenAIModel", "dataType": "OpenAIModel",
"id": "OpenAIModel-uYXZJ" "id": "OpenAIModel-uYXZJ"
} }
@ -1675,18 +1509,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "TextOutput-MUDOR", "id": "TextOutput-MUDOR",
"inputTypes": [ "inputTypes": ["Record", "Text"],
"Record",
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"dataType": "Prompt", "dataType": "Prompt",
"id": "Prompt-gTNiz" "id": "Prompt-gTNiz"
} }
@ -1706,17 +1533,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "OpenAIModel-XawYB", "id": "OpenAIModel-XawYB",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["object", "str", "Text"],
"object",
"str",
"Text"
],
"dataType": "Prompt", "dataType": "Prompt",
"id": "Prompt-gTNiz" "id": "Prompt-gTNiz"
} }
@ -1736,17 +1557,11 @@
"targetHandle": { "targetHandle": {
"fieldName": "input_value", "fieldName": "input_value",
"id": "ChatOutput-DNmvg", "id": "ChatOutput-DNmvg",
"inputTypes": [ "inputTypes": ["Text"],
"Text"
],
"type": "str" "type": "str"
}, },
"sourceHandle": { "sourceHandle": {
"baseClasses": [ "baseClasses": ["str", "Text", "object"],
"str",
"Text",
"object"
],
"dataType": "OpenAIModel", "dataType": "OpenAIModel",
"id": "OpenAIModel-XawYB" "id": "OpenAIModel-XawYB"
} }

View file

@ -10,6 +10,7 @@ import {
RUN_TIMESTAMP_PREFIX, RUN_TIMESTAMP_PREFIX,
STATUS_BUILD, STATUS_BUILD,
STATUS_BUILDING, STATUS_BUILDING,
TOOLTIP_OUTDATED_NODE,
} from "../../constants/constants"; } from "../../constants/constants";
import { BuildStatus } from "../../constants/enums"; import { BuildStatus } from "../../constants/enums";
import { countHandlesFn } from "../helpers/count-handles"; import { countHandlesFn } from "../helpers/count-handles";
@ -34,6 +35,8 @@ import useValidationStatusString from "../hooks/use-validation-status-string";
import getFieldTitle from "../utils/get-field-title"; import getFieldTitle from "../utils/get-field-title";
import sortFields from "../utils/sort-fields"; import sortFields from "../utils/sort-fields";
import ParameterComponent from "./components/parameterComponent"; import ParameterComponent from "./components/parameterComponent";
import { postCustomComponent } from "../../controllers/API";
import { cloneDeep } from "lodash";
export default function GenericNode({ export default function GenericNode({
data, data,
@ -55,10 +58,10 @@ export default function GenericNode({
const setErrorData = useAlertStore((state) => state.setErrorData); const setErrorData = useAlertStore((state) => state.setErrorData);
const isDark = useDarkStore((state) => state.dark); const isDark = useDarkStore((state) => state.dark);
const buildStatus = useFlowStore( const buildStatus = useFlowStore(
(state) => state.flowBuildStatus[data.id]?.status (state) => state.flowBuildStatus[data.id]?.status,
); );
const lastRunTime = useFlowStore( const lastRunTime = useFlowStore(
(state) => state.flowBuildStatus[data.id]?.timestamp (state) => state.flowBuildStatus[data.id]?.timestamp,
); );
const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot); const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot);
@ -66,7 +69,7 @@ export default function GenericNode({
const [nodeName, setNodeName] = useState(data.node!.display_name); const [nodeName, setNodeName] = useState(data.node!.display_name);
const [inputDescription, setInputDescription] = useState(false); const [inputDescription, setInputDescription] = useState(false);
const [nodeDescription, setNodeDescription] = useState( const [nodeDescription, setNodeDescription] = useState(
data.node?.description! data.node?.description!,
); );
const [isOutdated, setIsOutdated] = useState(false); const [isOutdated, setIsOutdated] = useState(false);
const [validationStatus, setValidationStatus] = const [validationStatus, setValidationStatus] =
@ -84,7 +87,7 @@ export default function GenericNode({
data.node!, data.node!,
setNode, setNode,
setIsOutdated, setIsOutdated,
updateNodeInternals updateNodeInternals,
); );
const name = nodeIconsLucide[data.type] ? data.type : types[data.type]; const name = nodeIconsLucide[data.type] ? data.type : types[data.type];
@ -115,12 +118,12 @@ export default function GenericNode({
selected: boolean, selected: boolean,
showNode: boolean, showNode: boolean,
buildStatus: BuildStatus | undefined, buildStatus: BuildStatus | undefined,
validationStatus: VertexBuildTypeAPI | null validationStatus: VertexBuildTypeAPI | null,
) => { ) => {
const specificClassFromBuildStatus = getSpecificClassFromBuildStatus( const specificClassFromBuildStatus = getSpecificClassFromBuildStatus(
buildStatus, buildStatus,
validationStatus, validationStatus,
isDark isDark,
); );
const baseBorderClass = getBaseBorderClass(selected); const baseBorderClass = getBaseBorderClass(selected);
@ -129,7 +132,7 @@ export default function GenericNode({
baseBorderClass, baseBorderClass,
nodeSizeClass, nodeSizeClass,
"generic-node-div group/node", "generic-node-div group/node",
specificClassFromBuildStatus specificClassFromBuildStatus,
); );
return names; return names;
}; };
@ -170,7 +173,7 @@ export default function GenericNode({
showNode, showNode,
isEmoji, isEmoji,
nodeIconFragment, nodeIconFragment,
checkNodeIconFragment checkNodeIconFragment,
); );
function countHandles(): void { function countHandles(): void {
@ -201,6 +204,33 @@ export default function GenericNode({
setShowNode(data.showNode ?? true); setShowNode(data.showNode ?? true);
}, [data.showNode]); }, [data.showNode]);
const [loadingUpdate, setLoadingUpdate] = useState(false);
const handleUpdateCode = () => {
setLoadingUpdate(true);
takeSnapshot();
// to update we must get the code from the templates in useTypesStore
const thisNodeTemplate = templates[data.type]?.template;
// if the template does not have a code key
// return
if (!thisNodeTemplate?.code) return;
const currentCode = thisNodeTemplate.code.value;
if (data.node) {
postCustomComponent(currentCode, data.node)
.then((apiReturn) => {
const { data } = apiReturn;
if (data && updateNodeCode) {
updateNodeCode(data, currentCode, "code");
setLoadingUpdate(false);
}
})
.catch((err) => {
console.log(err);
});
}
};
const memoizedNodeToolbarComponent = useMemo(() => { const memoizedNodeToolbarComponent = useMemo(() => {
return ( return (
<NodeToolbar> <NodeToolbar>
@ -221,8 +251,6 @@ export default function GenericNode({
showNode={showNode} showNode={showNode}
openAdvancedModal={false} openAdvancedModal={false}
onCloseAdvancedModal={() => {}} onCloseAdvancedModal={() => {}}
updateNodeCode={updateNodeCode}
isOutdated={isOutdated}
selected={selected} selected={selected}
/> />
</NodeToolbar> </NodeToolbar>
@ -247,7 +275,7 @@ export default function GenericNode({
selected, selected,
showNode, showNode,
buildStatus, buildStatus,
validationStatus validationStatus,
)} )}
> >
{data.node?.beta && showNode && ( {data.node?.beta && showNode && (
@ -378,7 +406,7 @@ export default function GenericNode({
} }
title={getFieldTitle( title={getFieldTitle(
data.node?.template!, data.node?.template!,
templateField templateField,
)} )}
info={data.node?.template[templateField].info} info={data.node?.template[templateField].info}
name={templateField} name={templateField}
@ -406,7 +434,7 @@ export default function GenericNode({
proxy={data.node?.template[templateField].proxy} proxy={data.node?.template[templateField].proxy}
showNode={showNode} showNode={showNode}
/> />
) ),
)} )}
<ParameterComponent <ParameterComponent
key={scapedJSONStringfy({ key={scapedJSONStringfy({
@ -437,54 +465,71 @@ export default function GenericNode({
</div> </div>
{showNode && ( {showNode && (
<> <>
<ShadTooltip <div className="flex flex-shrink-0 items-center gap-1">
content={ {isOutdated && (
buildStatus === BuildStatus.BUILDING ? ( <ShadTooltip content={TOOLTIP_OUTDATED_NODE}>
<span> {STATUS_BUILDING} </span> <Button
) : !validationStatus ? ( onClick={handleUpdateCode}
<span className="flex">{STATUS_BUILD}</span> variant="secondary"
) : ( className={"h-9 px-1.5"}
<div className="max-h-100 p-2"> loading={loadingUpdate}
<div> >
{lastRunTime && ( <IconComponent
<div className="justify-left flex font-normal text-muted-foreground"> name="AlertTriangle"
<div>{RUN_TIMESTAMP_PREFIX}</div> className="h-5 w-5 text-status-yellow"
<div className="ml-1 text-status-blue"> />
{lastRunTime} </Button>
</ShadTooltip>
)}
<ShadTooltip
content={
buildStatus === BuildStatus.BUILDING ? (
<span> {STATUS_BUILDING} </span>
) : !validationStatus ? (
<span className="flex">{STATUS_BUILD}</span>
) : (
<div className="max-h-100 p-2">
<div>
{lastRunTime && (
<div className="justify-left flex font-normal text-muted-foreground">
<div>{RUN_TIMESTAMP_PREFIX}</div>
<div className="ml-1 text-status-blue">
{lastRunTime}
</div>
</div> </div>
)}
</div>
<div className="justify-left flex font-normal text-muted-foreground">
<div>Duration:</div>
<div className="ml-1 text-status-blue">
{validationStatus?.data.duration}
</div> </div>
)}
</div>
<div className="justify-left flex font-normal text-muted-foreground">
<div>Duration:</div>
<div className="ml-1 text-status-blue">
{validationStatus?.data.duration}
</div> </div>
</div> </div>
</div> )
) }
} side="bottom"
side="bottom"
>
<Button
onClick={() => {
if (buildStatus === BuildStatus.BUILDING || isBuilding)
return;
setValidationStatus(null);
buildFlow({ stopNodeId: data.id });
}}
variant="secondary"
className={"group h-9 px-1.5"}
> >
<div <Button
data-testid={ onClick={() => {
`button_run_` + data?.node?.display_name.toLowerCase() if (buildStatus === BuildStatus.BUILDING || isBuilding)
} return;
setValidationStatus(null);
buildFlow({ stopNodeId: data.id });
}}
variant="secondary"
className={"group h-9 px-1.5"}
> >
{renderIconStatus()} <div
</div> data-testid={
</Button> `button_run_` + data?.node?.display_name.toLowerCase()
</ShadTooltip> }
>
{renderIconStatus()}
</div>
</Button>
</ShadTooltip>
</div>
</> </>
)} )}
</div> </div>
@ -552,7 +597,7 @@ export default function GenericNode({
!data.node?.description) && !data.node?.description) &&
nameEditable nameEditable
? "font-light italic" ? "font-light italic"
: "" : "",
)} )}
onClick={(e) => { onClick={(e) => {
setInputDescription(true); setInputDescription(true);
@ -614,13 +659,13 @@ export default function GenericNode({
} }
title={getFieldTitle( title={getFieldTitle(
data.node?.template!, data.node?.template!,
templateField templateField,
)} )}
info={data.node?.template[templateField].info} info={data.node?.template[templateField].info}
name={templateField} name={templateField}
tooltipTitle={ tooltipTitle={
data.node?.template[templateField].input_types?.join( data.node?.template[templateField].input_types?.join(
"\n" "\n",
) ?? data.node?.template[templateField].type ) ?? data.node?.template[templateField].type
} }
required={data.node!.template[templateField].required} required={data.node!.template[templateField].required}
@ -647,7 +692,7 @@ export default function GenericNode({
<div <div
className={classNames( className={classNames(
Object.keys(data.node!.template).length < 1 ? "hidden" : "", Object.keys(data.node!.template).length < 1 ? "hidden" : "",
"flex-max-width justify-center" "flex-max-width justify-center",
)} )}
> >
{" "} {" "}

View file

@ -26,7 +26,8 @@ const useCheckCodeValidity = (
const componentsToIgnore = ["Custom Component", "Prompt"]; const componentsToIgnore = ["Custom Component", "Prompt"];
if ( if (
currentCode !== thisNodesCode && currentCode !== thisNodesCode &&
!componentsToIgnore.includes(data.node!.display_name) !componentsToIgnore.includes(data.node!.display_name) &&
!(data.node?.edited ?? false)
) { ) {
setIsOutdated(true); setIsOutdated(true);
} else { } else {

View file

@ -19,6 +19,7 @@ const useUpdateNodeCode = (
node: newNodeClass, node: newNodeClass,
description: newNodeClass.description ?? dataNode.description, description: newNodeClass.description ?? dataNode.description,
display_name: newNodeClass.display_name ?? dataNode.display_name, display_name: newNodeClass.display_name ?? dataNode.display_name,
edited: false,
}; };
newNode.data.node.template[name].value = code; newNode.data.node.template[name].value = code;

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -1,21 +0,0 @@
import { gradients } from "../../utils/styleUtils";
export default function GradientChooserComponent({ value, onChange }) {
return (
<div className="flex flex-wrap items-center justify-start gap-2">
{gradients.map((gradient, idx) => (
<div
onClick={() => {
onChange(gradient);
}}
className={
"duration-400 h-12 w-12 cursor-pointer rounded-full transition-all " +
gradient +
(value === gradient ? " shadow-lg ring-2 ring-primary" : "")
}
key={idx}
></div>
))}
</div>
);
}

View file

@ -1,9 +1,12 @@
import { useContext } from "react"; import { useContext } from "react";
import profileCircle from "../../assets/profile-circle.png";
import { FaDiscord, FaGithub } from "react-icons/fa"; import { FaDiscord, FaGithub } from "react-icons/fa";
import { RiTwitterXFill } from "react-icons/ri"; import { RiTwitterXFill } from "react-icons/ri";
import { Link, useLocation, useNavigate, useParams } from "react-router-dom"; import { Link, useLocation, useNavigate, useParams } from "react-router-dom";
import AlertDropdown from "../../alerts/alertDropDown"; import AlertDropdown from "../../alerts/alertDropDown";
import { import {
BACKEND_URL,
BASE_URL_API,
LOCATIONS_TO_RETURN, LOCATIONS_TO_RETURN,
USER_PROJECTS_HEADER, USER_PROJECTS_HEADER,
} from "../../constants/constants"; } from "../../constants/constants";
@ -192,34 +195,35 @@ export default function Header(): JSX.Element {
variant="none" variant="none"
size="none" size="none"
data-testid="user-profile-settings" data-testid="user-profile-settings"
className={ >
"h-7 w-7 rounded-full focus-visible:outline-0 " + <img
(userData?.profile_image ?? src={
(userData?.id `${BACKEND_URL.slice(
? gradients[ 0,
parseInt(userData?.id ?? "", 30) % gradients.length BACKEND_URL.length - 1,
] )}${BASE_URL_API}files/profile_pictures/${userData?.profile_image}` ??
: "bg-gray-500")) profileCircle
} }
/> className="h-7 w-7 focus-visible:outline-0 "
/>
</Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent> <DropdownMenuContent>
{!autoLogin && ( {!autoLogin && (
<> <>
<DropdownMenuLabel> <DropdownMenuLabel>
<div className="flex items-center gap-3"> <div className="flex items-center gap-3">
<div <img
className={ src={
"h-5 w-5 rounded-full focus-visible:outline-0 " + `${BACKEND_URL.slice(
(userData?.profile_image ?? 0,
(userData?.id BACKEND_URL.length - 1,
? gradients[ )}${BASE_URL_API}files/profile_pictures/${userData?.profile_image}` ??
parseInt(userData?.id ?? "", 30) % profileCircle
gradients.length
]
: "bg-gray-500"))
} }
className="h-5 w-5 focus-visible:outline-0 "
/> />
{userData?.username ?? "User"} {userData?.username ?? "User"}
</div> </div>
</DropdownMenuLabel> </DropdownMenuLabel>

View file

@ -31,7 +31,7 @@ const SideBarFoldersButtonsComponent = ({
const [foldersNames, setFoldersNames] = useState({}); const [foldersNames, setFoldersNames] = useState({});
const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot); const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot);
const [editFolders, setEditFolderName] = useState( const [editFolders, setEditFolderName] = useState(
folders.map((obj) => ({ name: obj.name, edit: false })) folders.map((obj) => ({ name: obj.name, edit: false })),
); );
const uploadFolder = useFolderStore((state) => state.uploadFolder); const uploadFolder = useFolderStore((state) => state.uploadFolder);
const currentFolder = pathname.split("/"); const currentFolder = pathname.split("/");
@ -58,7 +58,7 @@ const SideBarFoldersButtonsComponent = ({
const { dragOver, dragEnter, dragLeave, onDrop } = useFileDrop( const { dragOver, dragEnter, dragLeave, onDrop } = useFileDrop(
folderId, folderId,
handleFolderChange handleFolderChange,
); );
const handleUploadFlowsToFolder = () => { const handleUploadFlowsToFolder = () => {
@ -86,7 +86,7 @@ const SideBarFoldersButtonsComponent = ({
addFolder({ name: "New Folder", parent_id: null, description: "" }).then( addFolder({ name: "New Folder", parent_id: null, description: "" }).then(
(res) => { (res) => {
getFoldersApi(true); getFoldersApi(true);
} },
); );
} }
@ -132,7 +132,7 @@ const SideBarFoldersButtonsComponent = ({
<> <>
{folders.map((item, index) => { {folders.map((item, index) => {
const editFolderName = editFolders?.filter( const editFolderName = editFolders?.filter(
(folder) => folder.name === item.name (folder) => folder.name === item.name,
)[0]; )[0];
return ( return (
<div <div
@ -148,7 +148,7 @@ const SideBarFoldersButtonsComponent = ({
? "border border-border bg-muted hover:bg-muted" ? "border border-border bg-muted hover:bg-muted"
: "border hover:bg-transparent lg:border-transparent lg:hover:border-border", : "border hover:bg-transparent lg:border-transparent lg:hover:border-border",
"group flex w-full shrink-0 cursor-pointer gap-2 opacity-100 lg:min-w-full", "group flex w-full shrink-0 cursor-pointer gap-2 opacity-100 lg:min-w-full",
folderIdDragging === item.id! ? "bg-border" : "" folderIdDragging === item.id! ? "bg-border" : "",
)} )}
onClick={() => handleChangeFolder!(item.id!)} onClick={() => handleChangeFolder!(item.id!)}
> >
@ -218,7 +218,7 @@ const SideBarFoldersButtonsComponent = ({
folders.map((obj) => ({ folders.map((obj) => ({
name: obj.name, name: obj.name,
edit: false, edit: false,
})) })),
); );
} }
if (e.key === "Enter") { if (e.key === "Enter") {
@ -251,10 +251,10 @@ const SideBarFoldersButtonsComponent = ({
}; };
const updatedFolder = await updateFolder( const updatedFolder = await updateFolder(
body, body,
item.id! item.id!,
); );
const updateFolders = folders.filter( const updateFolders = folders.filter(
(f) => f.name !== item.name (f) => f.name !== item.name,
); );
setFolders([...updateFolders, updatedFolder]); setFolders([...updateFolders, updatedFolder]);
setFoldersNames({}); setFoldersNames({});
@ -262,7 +262,7 @@ const SideBarFoldersButtonsComponent = ({
folders.map((obj) => ({ folders.map((obj) => ({
name: obj.name, name: obj.name,
edit: false, edit: false,
})) })),
); );
} else { } else {
setFoldersNames((old) => ({ setFoldersNames((old) => ({

View file

@ -63,8 +63,8 @@ export default function TableNodeCellRender({
...id, ...id,
proxy: templateData.proxy, proxy: templateData.proxy,
} }
: id : id,
) ),
) ?? false; ) ?? false;
function getCellType() { function getCellType() {
switch (templateData.type) { switch (templateData.type) {
@ -135,7 +135,7 @@ export default function TableNodeCellRender({
<div <div
className={classNames( className={classNames(
"max-h-48 w-full overflow-auto custom-scroll", "max-h-48 w-full overflow-auto custom-scroll",
templateValue?.length > 1 ? "my-3" : "" templateValue?.length > 1 ? "my-3" : "",
)} )}
> >
<KeypairListComponent <KeypairListComponent

View file

@ -31,6 +31,8 @@ export const INVALID_SELECTION_ERROR_ALERT = "Invalid selection";
export const EDIT_PASSWORD_ERROR_ALERT = "Error changing password"; export const EDIT_PASSWORD_ERROR_ALERT = "Error changing password";
export const EDIT_PASSWORD_ALERT_LIST = "Passwords do not match"; export const EDIT_PASSWORD_ALERT_LIST = "Passwords do not match";
export const SAVE_ERROR_ALERT = "Error saving changes"; export const SAVE_ERROR_ALERT = "Error saving changes";
export const PROFILE_PICTURES_GET_ERROR_ALERT =
"Error retrieving profile pictures";
export const SIGNUP_ERROR_ALERT = "Error signing up"; export const SIGNUP_ERROR_ALERT = "Error signing up";
export const APIKEY_ERROR_ALERT = "API Key Error"; export const APIKEY_ERROR_ALERT = "API Key Error";
export const NOAPI_ERROR_ALERT = export const NOAPI_ERROR_ALERT =

View file

@ -589,7 +589,7 @@ export const CONTROL_INPUT_STATE = {
export const CONTROL_PATCH_USER_STATE = { export const CONTROL_PATCH_USER_STATE = {
password: "", password: "",
cnfPassword: "", cnfPassword: "",
gradient: "", profilePicture: "",
apikey: "", apikey: "",
}; };
@ -661,6 +661,9 @@ export const OUTPUT_TYPES = new Set([
export const CHAT_FIRST_INITIAL_TEXT = export const CHAT_FIRST_INITIAL_TEXT =
"Start a conversation and click the agent's thoughts"; "Start a conversation and click the agent's thoughts";
export const TOOLTIP_OUTDATED_NODE =
"Your component is outdated. Click to update (data may be lost)";
export const CHAT_SECOND_INITIAL_TEXT = "to inspect the chaining process."; export const CHAT_SECOND_INITIAL_TEXT = "to inspect the chaining process.";
export const ZERO_NOTIFICATIONS = "No new notifications"; export const ZERO_NOTIFICATIONS = "No new notifications";

View file

@ -1,4 +1,4 @@
import axios, { AxiosError, AxiosInstance } from "axios"; import axios, { Axios, AxiosError, AxiosInstance } from "axios";
import { useContext, useEffect } from "react"; import { useContext, useEffect } from "react";
import { Cookies } from "react-cookie"; import { Cookies } from "react-cookie";
import { renewAccessToken } from "."; import { renewAccessToken } from ".";
@ -83,8 +83,10 @@ function ApiInterceptor() {
(config) => { (config) => {
const checkRequest = checkDuplicateRequestAndStoreRequest(config); const checkRequest = checkDuplicateRequestAndStoreRequest(config);
const controller = new AbortController();
if (!checkRequest) { if (!checkRequest) {
return Promise.reject("Duplicate request."); controller.abort("Duplicate Request");
} }
const accessToken = cookies.get("access_token_lf"); const accessToken = cookies.get("access_token_lf");
@ -92,7 +94,10 @@ function ApiInterceptor() {
config.headers["Authorization"] = `Bearer ${accessToken}`; config.headers["Authorization"] = `Bearer ${accessToken}`;
} }
return config; return {
...config,
signal: controller.signal,
};
}, },
(error) => { (error) => {
return Promise.reject(error); return Promise.reject(error);

Some files were not shown because too many files have changed in this diff Show more