Merge branch 'dev' into ic/fixTweaksTab

This commit is contained in:
anovazzi1 2024-06-28 17:08:24 -03:00 • committed by GitHub
commit 324ad666d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 146 additions and 64 deletions

View file

@ -80,7 +80,8 @@ async def delete_messages(
current_user: User = Depends(get_current_active_user), current_user: User = Depends(get_current_active_user),
): ):
try: try:
session.exec(select(MessageTable).where(MessageTable.id.in_(message_ids))) # type: ignore session.exec(delete(MessageTable).where(MessageTable.id.in_(message_ids))) # type: ignore
session.commit()
except Exception as e: except Exception as e:
raise HTTPException(status_code=500, detail=str(e)) raise HTTPException(status_code=500, detail=str(e))

View file

@ -0,0 +1,28 @@
from langflow.custom import Component
from langflow.inputs import StrInput
from langflow.schema import Data
from langflow.template import Output
class CreateListComponent(Component):
display_name = "Create List"
description = "Creates a list of texts."
icon = "list"
inputs = [
StrInput(
name="texts",
display_name="Texts",
info="Enter one or more texts.",
is_list=True,
),
]
outputs = [
Output(display_name="Data List", name="list", method="create_list"),
]
def create_list(self) -> list[Data]:
data = [Data(text=text) for text in self.texts]
self.status = data
return data

View file

@ -5,7 +5,7 @@ from langflow.custom import CustomComponent
from langflow.schema.dotdict import dotdict from langflow.schema.dotdict import dotdict
class UUIDGeneratorComponent(CustomComponent): class IDGeneratorComponent(CustomComponent):
display_name = "ID Generator" display_name = "ID Generator"
description = "Generates a unique ID." description = "Generates a unique ID."

View file

@ -1,22 +1,47 @@
from langflow.custom import CustomComponent from langflow.custom import Component
from langflow.memory import get_messages, store_message from langflow.inputs import MessageInput, StrInput
from langflow.schema.message import Message from langflow.schema.message import Message
from langflow.template import Output
from langflow.memory import get_messages, store_message
class StoreMessageComponent(CustomComponent): class StoreMessageComponent(Component):
display_name = "Store Message" display_name = "Store Message"
description = "Stores a chat message." description = "Stores a chat message or text."
icon = "save"
def build_config(self): inputs = [
return { MessageInput(name="message", display_name="Message", info="The chat message to be stored.", required=True),
"message": {"display_name": "Message"}, StrInput(
} name="sender",
display_name="Sender",
info="The sender of the message.",
value="AI",
advanced=True,
),
StrInput(
name="sender_name", display_name="Sender Name", info="The name of the sender.", value="AI", advanced=True
),
StrInput(
name="session_id",
display_name="Session ID",
info="The session ID of the chat.",
value="",
),
]
outputs = [
Output(display_name="Stored Messages", name="stored_messages", method="store_message"),
]
def store_message(self) -> Message:
message = self.message
message.session_id = self.session_id or message.session_id
message.sender = self.sender or message.sender
message.sender_name = self.sender_name or message.sender_name
def build(
self,
message: Message,
) -> Message:
store_message(message, flow_id=self.graph.flow_id) store_message(message, flow_id=self.graph.flow_id)
self.status = get_messages() stored = get_messages(session_id=message.session_id, sender_name=message.sender_name, sender=message.sender)
self.status = stored
return message return stored

View file

@ -1,22 +1,25 @@
from .CombineText import CombineTextComponent from .CombineText import CombineTextComponent
from .CustomComponent import CustomComponent from .CustomComponent import CustomComponent
from .FilterData import FilterDataComponent from .FilterData import FilterDataComponent
from .IDGenerator import UUIDGeneratorComponent from .IDGenerator import IDGeneratorComponent
from .Memory import MemoryComponent from .Memory import MemoryComponent
from .MergeData import MergeDataComponent from .MergeData import MergeDataComponent
from .ParseData import ParseDataComponent from .ParseData import ParseDataComponent
from .SplitText import SplitTextComponent from .SplitText import SplitTextComponent
from .StoreMessage import StoreMessageComponent from .StoreMessage import StoreMessageComponent
from .CreateList import CreateListComponent
__all__ = [ __all__ = [
"CreateListComponent",
"CombineTextComponent", "CombineTextComponent",
"CustomComponent", "CustomComponent",
"FilterDataComponent", "FilterDataComponent",
"UUIDGeneratorComponent", "IDGeneratorComponent",
"MemoryComponent", "MemoryComponent",
"MergeDataComponent", "MergeDataComponent",
"ParseDataComponent", "ParseDataComponent",
"SplitTextComponent", "SplitTextComponent",
"StoreMessageComponent", "StoreMessageComponent",
"ListComponent",
] ]

View file

@ -66,21 +66,17 @@ class ConditionalRouterComponent(Component):
def true_response(self) -> Message: def true_response(self) -> Message:
result = self.evaluate_condition(self.input_text, self.match_text, self.operator, self.case_sensitive) result = self.evaluate_condition(self.input_text, self.match_text, self.operator, self.case_sensitive)
if result: if result:
self.stop("false_result") self.status = self.message
response = self.message if self.message else self.input_text return self.message
self.status = response
return response
else: else:
self.stop("true_result") self.stop("true_result")
return Message() return None
def false_response(self) -> Message: def false_response(self) -> Message:
result = self.evaluate_condition(self.input_text, self.match_text, self.operator, self.case_sensitive) result = self.evaluate_condition(self.input_text, self.match_text, self.operator, self.case_sensitive)
if not result: if not result:
self.stop("true_result") self.status = self.message
response = self.message if self.message else self.input_text return self.message
self.status = response
return response
else: else:
self.stop("false_result") self.stop("false_result")
return Message() return None

View file

@ -1,31 +1,32 @@
from typing import Union from langflow.custom import Component
from langflow.io import MessageInput
from langflow.custom import CustomComponent from langflow.schema.message import Message
from langflow.field_typing import Text from langflow.template import Output
from langflow.schema import Data
class PassComponent(CustomComponent): class PassMessageComponent(Component):
display_name = "Pass" display_name = "Pass"
description = "A pass-through component that forwards the second input while ignoring the first, used for controlling workflow direction." description = "Forwards the input message, unchanged."
field_order = ["ignored_input", "forwarded_input"] icon = "arrow-right"
beta = True
def build_config(self) -> dict: inputs = [
return { MessageInput(
"ignored_input": { name="input_message",
"display_name": "Ignored Input", display_name="Input Message",
"info": "This input is ignored. It's used to control the flow in the graph.", info="The message to be passed forward.",
"input_types": ["Text", "Data"], ),
}, MessageInput(
"forwarded_input": { name="ignored_message",
"display_name": "Input", display_name="Ignored Message",
"info": "This input is forwarded by the component.", info="A second message to be ignored. Used as a workaround for continuity.",
"input_types": ["Text", "Data"], advanced=True,
}, ),
} ]
def build(self, ignored_input: Text, forwarded_input: Text) -> Union[Text, Data]: outputs = [
# The ignored_input is not used in the logic, it's just there for graph flow control Output(display_name="Output Message", name="output_message", method="pass_message"),
self.status = forwarded_input ]
return forwarded_input
def pass_message(self) -> Message:
self.status = self.input_message
return self.input_message

View file

@ -26,7 +26,7 @@ import useFlowStore from "../../stores/flowStore";
import useFlowsManagerStore from "../../stores/flowsManagerStore"; import useFlowsManagerStore from "../../stores/flowsManagerStore";
import { useShortcutsStore } from "../../stores/shortcuts"; import { useShortcutsStore } from "../../stores/shortcuts";
import { useTypesStore } from "../../stores/typesStore"; import { useTypesStore } from "../../stores/typesStore";
import { VertexBuildTypeAPI } from "../../types/api"; import { OutputFieldType, VertexBuildTypeAPI } from "../../types/api";
import { NodeDataType } from "../../types/flow"; import { NodeDataType } from "../../types/flow";
import { handleKeyDown, scapedJSONStringfy } from "../../utils/reactflowUtils"; import { handleKeyDown, scapedJSONStringfy } from "../../utils/reactflowUtils";
import { nodeColors, nodeIconsLucide } from "../../utils/styleUtils"; import { nodeColors, nodeIconsLucide } from "../../utils/styleUtils";
@ -279,7 +279,7 @@ export default function GenericNode({
const shortcuts = useShortcutsStore((state) => state.shortcuts); const shortcuts = useShortcutsStore((state) => state.shortcuts);
const renderOutputParameter = (output, idx) => { const renderOutputParameter = (output: OutputFieldType, idx: number) => {
return ( return (
<ParameterComponent <ParameterComponent
index={idx} index={idx}

View file

@ -1,6 +1,10 @@
import { nodeColors } from "../../utils/styleUtils"; import { nodeColors } from "../../utils/styleUtils";
export function getNodeInputColors(input_types, type, types) { export function getNodeInputColors(
input_types: string[] | undefined,
type: string | undefined,
types: { [char: string]: string },
) {
// Helper function to get the color based on type // Helper function to get the color based on type
const getColorByType = (type) => nodeColors[type] ?? nodeColors.unknown; const getColorByType = (type) => nodeColors[type] ?? nodeColors.unknown;

View file

@ -1,6 +1,12 @@
import { OutputFieldType } from "../../types/api";
import { NodeDataType } from "../../types/flow";
import { nodeColors } from "../../utils/styleUtils"; import { nodeColors } from "../../utils/styleUtils";
export function getNodeOutputColors(output, data, types): string[] { export function getNodeOutputColors(
output: OutputFieldType,
data: NodeDataType,
types: { [char: string]: string },
): string[] {
// Helper function to get the color based on type // Helper function to get the color based on type
const getColorByType = (type) => nodeColors[type] ?? nodeColors.unknown; const getColorByType = (type) => nodeColors[type] ?? nodeColors.unknown;

View file

@ -9,7 +9,10 @@ const useIconStatus = (
buildStatus: BuildStatus | undefined, buildStatus: BuildStatus | undefined,
validationStatus: VertexBuildTypeAPI | null, validationStatus: VertexBuildTypeAPI | null,
) => { ) => {
const conditionSuccess = validationStatus && validationStatus.valid; const conditionSuccess =
!(!buildStatus || buildStatus === BuildStatus.TO_BUILD) &&
validationStatus &&
validationStatus.valid;
const conditionError = buildStatus === BuildStatus.ERROR; const conditionError = buildStatus === BuildStatus.ERROR;
const conditionInactive = buildStatus === BuildStatus.INACTIVE; const conditionInactive = buildStatus === BuildStatus.INACTIVE;

View file

@ -6,7 +6,7 @@ import useAlertStore from "../../stores/alertStore";
import ForwardedIconComponent from "../genericIconComponent"; import ForwardedIconComponent from "../genericIconComponent";
import { Separator } from "../ui/separator"; import { Separator } from "../ui/separator";
export default function ImageViewer({ image }) { export default function ImageViewer({ image }: { image: string }) {
const viewerRef = useRef(null); const viewerRef = useRef(null);
const [errorDownloading, setErrordownloading] = useState(false); const [errorDownloading, setErrordownloading] = useState(false);
const setErrorList = useAlertStore((state) => state.setErrorData); const setErrorList = useAlertStore((state) => state.setErrorData);

View file

@ -3,6 +3,9 @@ import { useEffect, useRef, useState } from "react";
export default function HorizontalScrollFadeComponent({ export default function HorizontalScrollFadeComponent({
children, children,
isFolder = true, isFolder = true,
}: {
children: JSX.Element | JSX.Element[];
isFolder?: boolean;
}) { }) {
const scrollContainerRef = useRef<HTMLDivElement>(null); const scrollContainerRef = useRef<HTMLDivElement>(null);
const fadeContainerRef = useRef<HTMLDivElement>(null); const fadeContainerRef = useRef<HTMLDivElement>(null);

View file

@ -1,8 +1,12 @@
import { FolderType } from "../../../pages/MainPage/entities";
import { addFolder, updateFolder } from "../../../pages/MainPage/services"; import { addFolder, updateFolder } from "../../../pages/MainPage/services";
import useAlertStore from "../../../stores/alertStore"; import useAlertStore from "../../../stores/alertStore";
import { useFolderStore } from "../../../stores/foldersStore"; import { useFolderStore } from "../../../stores/foldersStore";
const useFolderSubmit = (setOpen, folderToEdit) => { const useFolderSubmit = (
setOpen: (a: boolean) => void,
folderToEdit: FolderType | null,
) => {
const setSuccessData = useAlertStore((state) => state.setSuccessData); const setSuccessData = useAlertStore((state) => state.setSuccessData);
const setErrorData = useAlertStore((state) => state.setErrorData); const setErrorData = useAlertStore((state) => state.setErrorData);
const getFoldersApi = useFolderStore((state) => state.getFoldersApi); const getFoldersApi = useFolderStore((state) => state.getFoldersApi);

View file

@ -1,9 +1,13 @@
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { FolderType } from "../../../pages/MainPage/entities";
import { addFolder, updateFolder } from "../../../pages/MainPage/services"; import { addFolder, updateFolder } from "../../../pages/MainPage/services";
import useAlertStore from "../../../stores/alertStore"; import useAlertStore from "../../../stores/alertStore";
import { useFolderStore } from "../../../stores/foldersStore"; import { useFolderStore } from "../../../stores/foldersStore";
const useFolderSubmit = (setOpen, folderToEdit) => { const useFolderSubmit = (
setOpen: (a: boolean) => void,
folderToEdit: FolderType | null,
) => {
const setSuccessData = useAlertStore((state) => state.setSuccessData); const setSuccessData = useAlertStore((state) => state.setSuccessData);
const setErrorData = useAlertStore((state) => state.setErrorData); const setErrorData = useAlertStore((state) => state.setErrorData);
const getFoldersApi = useFolderStore((state) => state.getFoldersApi); const getFoldersApi = useFolderStore((state) => state.getFoldersApi);

View file

@ -99,6 +99,10 @@ export async function updateVerticesOrder(
const runId = orderResponse.data.run_id; const runId = orderResponse.data.run_id;
const verticesToRun = orderResponse.data.vertices_to_run; const verticesToRun = orderResponse.data.vertices_to_run;
useFlowStore
.getState()
.updateBuildStatus(verticesToRun, BuildStatus.TO_BUILD);
const verticesIds = orderResponse.data.ids; const verticesIds = orderResponse.data.ids;
useFlowStore.getState().updateVerticesBuild({ useFlowStore.getState().updateVerticesBuild({
verticesLayers, verticesLayers,

View file

@ -31,7 +31,7 @@ from langflow.schema import Data
def test_uuid_generator_component(): def test_uuid_generator_component():
# Arrange # Arrange
uuid_generator_component = helpers.UUIDGeneratorComponent() uuid_generator_component = helpers.IDGeneratorComponent()
uuid_generator_component.code = open(helpers.IDGenerator.__file__, "r").read() uuid_generator_component.code = open(helpers.IDGenerator.__file__, "r").read()
frontend_node, _ = build_custom_component_template(uuid_generator_component) frontend_node, _ = build_custom_component_template(uuid_generator_component)