Update variable names and properties related to pinning to use "frozen" instead.

This commit is contained in:
Gabriel Luiz Freitas Almeida 2024-03-04 18:21:17 -03:00
commit 3d70849341
13 changed files with 51 additions and 35 deletions

View file

@ -114,7 +114,7 @@ async def build_vertex(
vertex = graph.get_vertex(vertex_id) vertex = graph.get_vertex(vertex_id)
try: try:
if not vertex.pinned or not vertex._built: if not vertex.frozen or not vertex._built:
inputs_dict = inputs.model_dump() if inputs else {} inputs_dict = inputs.model_dump() if inputs else {}
await vertex.build(user_id=current_user.id, inputs=inputs_dict) await vertex.build(user_id=current_user.id, inputs=inputs_dict)
@ -233,7 +233,7 @@ async def build_vertex_stream(
) )
yield str(stream_data) yield str(stream_data)
elif not vertex.pinned or not vertex._built: elif not vertex.frozen or not vertex._built:
logger.debug(f"Streaming vertex {vertex_id}") logger.debug(f"Streaming vertex {vertex_id}")
stream_data = StreamData( stream_data = StreamData(
event="message", event="message",

View file

@ -337,9 +337,9 @@ class Graph:
vertex.params = {} vertex.params = {}
vertex._build_params() vertex._build_params()
vertex.graph = self vertex.graph = self
# If the vertex is pinned, we don't want # If the vertex is frozen, we don't want
# to reset the results nor the _built attribute # to reset the results nor the _built attribute
if not vertex.pinned: if not vertex.frozen:
vertex._built = False vertex._built = False
vertex.result = None vertex.result = None
vertex.artifacts = {} vertex.artifacts = {}
@ -352,7 +352,7 @@ class Graph:
for vid in [edge.source_id, edge.target_id]: for vid in [edge.source_id, edge.target_id]:
if vid in self.vertex_map: if vid in self.vertex_map:
_vertex = self.vertex_map[vid] _vertex = self.vertex_map[vid]
if not _vertex.pinned: if not _vertex.frozen:
_vertex._build_params() _vertex._build_params()
def _add_vertex(self, vertex: Vertex) -> None: def _add_vertex(self, vertex: Vertex) -> None:

View file

@ -193,7 +193,7 @@ class Vertex:
self.base_type = state["base_type"] self.base_type = state["base_type"]
self.is_task = state["is_task"] self.is_task = state["is_task"]
self.id = state["id"] self.id = state["id"]
self.pinned = state.get("pinned", False) self.frozen = state.get("frozen", False)
self._parse_data() self._parse_data()
if "_built_object" in state: if "_built_object" in state:
self._built_object = state["_built_object"] self._built_object = state["_built_object"]
@ -219,7 +219,7 @@ class Vertex:
self.data = self._data["data"] self.data = self._data["data"]
self.output = self.data["node"]["base_classes"] self.output = self.data["node"]["base_classes"]
self.display_name = self.data["node"].get("display_name", self.id.split("-")[0]) self.display_name = self.data["node"].get("display_name", self.id.split("-")[0])
self.pinned = self.data["node"].get("pinned", False) self.frozen = self.data["node"].get("frozen", False)
self.selected_output_type = self.data["node"].get("selected_output_type") self.selected_output_type = self.data["node"].get("selected_output_type")
self.is_input = self.data["node"].get("is_input") or self.is_input self.is_input = self.data["node"].get("is_input") or self.is_input
self.is_output = self.data["node"].get("is_output") or self.is_output self.is_output = self.data["node"].get("is_output") or self.is_output
@ -670,7 +670,7 @@ class Vertex:
self.build_inactive() self.build_inactive()
return return
if self.pinned and self._built: if self.frozen and self._built:
return self.get_requester_result(requester) return self.get_requester_result(requester)
self._reset() self._reset()

View file

@ -1,7 +1,6 @@
import ast import ast
import json import json
from typing import (AsyncIterator, Callable, Dict, Iterator, List, Optional, from typing import AsyncIterator, Callable, Dict, Iterator, List, Optional, Union
Union)
import yaml import yaml
from langchain_core.messages import AIMessage from langchain_core.messages import AIMessage
@ -224,7 +223,7 @@ class ChainVertex(StatelessVertex):
if isinstance(value, PromptVertex): if isinstance(value, PromptVertex):
# Build the PromptVertex, passing the tools if available # Build the PromptVertex, passing the tools if available
tools = kwargs.get("tools", None) tools = kwargs.get("tools", None)
self.params[key] = value.build(tools=tools, pinned=force) self.params[key] = value.build(tools=tools, frozen=force)
await self._build(user_id=user_id) await self._build(user_id=user_id)

View file

@ -37,7 +37,7 @@ ATTR_FUNC_MAPPING: dict[str, Callable] = {
"beta": getattr_return_bool, "beta": getattr_return_bool,
"documentation": getattr_return_str, "documentation": getattr_return_str,
"icon": validate_icon, "icon": validate_icon,
"pinned": getattr_return_bool, "frozen": getattr_return_bool,
"is_input": getattr_return_bool, "is_input": getattr_return_bool,
"is_output": getattr_return_bool, "is_output": getattr_return_bool,
} }

View file

@ -59,8 +59,8 @@ class CustomComponent(Component):
"""The field configuration of the component. Defaults to an empty dictionary.""" """The field configuration of the component. Defaults to an empty dictionary."""
field_order: Optional[List[str]] = None field_order: Optional[List[str]] = None
"""The field order of the component. Defaults to an empty list.""" """The field order of the component. Defaults to an empty list."""
pinned: Optional[bool] = False frozen: Optional[bool] = False
"""The default pinned state of the component. Defaults to False.""" """The default frozen state of the component. Defaults to False."""
build_parameters: Optional[dict] = None build_parameters: Optional[dict] = None
"""The build parameters of the component. Defaults to None.""" """The build parameters of the component. Defaults to None."""
selected_output_type: Optional[str] = None selected_output_type: Optional[str] = None

View file

@ -71,8 +71,8 @@ class FrontendNode(BaseModel):
"""Full path of the frontend node.""" """Full path of the frontend node."""
field_formatters: FieldFormatters = Field(default_factory=FieldFormatters) field_formatters: FieldFormatters = Field(default_factory=FieldFormatters)
"""Field formatters for the frontend node.""" """Field formatters for the frontend node."""
pinned: bool = False frozen: bool = False
"""Whether the frontend node is pinned.""" """Whether the frontend node is frozen."""
beta: bool = False beta: bool = False
error: Optional[str] = None error: Optional[str] = None
@ -171,7 +171,9 @@ class FrontendNode(BaseModel):
return _type return _type
@staticmethod @staticmethod
def handle_special_field(field, key: str, _type: str, SPECIAL_FIELD_HANDLERS) -> str: def handle_special_field(
field, key: str, _type: str, SPECIAL_FIELD_HANDLERS
) -> str:
"""Handles special field by using the respective handler if present.""" """Handles special field by using the respective handler if present."""
handler = SPECIAL_FIELD_HANDLERS.get(key) handler = SPECIAL_FIELD_HANDLERS.get(key)
return handler(field) if handler else _type return handler(field) if handler else _type
@ -182,7 +184,11 @@ class FrontendNode(BaseModel):
if "dict" in _type.lower() and field.name == "dict_": if "dict" in _type.lower() and field.name == "dict_":
field.field_type = "file" field.field_type = "file"
field.file_types = [".json", ".yaml", ".yml"] field.file_types = [".json", ".yaml", ".yml"]
elif _type.startswith("Dict") or _type.startswith("Mapping") or _type.startswith("dict"): elif (
_type.startswith("Dict")
or _type.startswith("Mapping")
or _type.startswith("dict")
):
field.field_type = "dict" field.field_type = "dict"
return _type return _type
@ -193,7 +199,9 @@ class FrontendNode(BaseModel):
field.value = value["default"] field.value = value["default"]
@staticmethod @staticmethod
def handle_specific_field_values(field: TemplateField, key: str, name: Optional[str] = None) -> None: def handle_specific_field_values(
field: TemplateField, key: str, name: Optional[str] = None
) -> None:
"""Handles specific field values for certain fields.""" """Handles specific field values for certain fields."""
if key == "headers": if key == "headers":
field.value = """{"Authorization": "Bearer <token>"}""" field.value = """{"Authorization": "Bearer <token>"}"""
@ -201,7 +209,9 @@ class FrontendNode(BaseModel):
FrontendNode._handle_api_key_specific_field_values(field, key, name) FrontendNode._handle_api_key_specific_field_values(field, key, name)
@staticmethod @staticmethod
def _handle_model_specific_field_values(field: TemplateField, key: str, name: Optional[str] = None) -> None: def _handle_model_specific_field_values(
field: TemplateField, key: str, name: Optional[str] = None
) -> None:
"""Handles specific field values related to models.""" """Handles specific field values related to models."""
model_dict = { model_dict = {
"OpenAI": constants.OPENAI_MODELS, "OpenAI": constants.OPENAI_MODELS,
@ -214,7 +224,9 @@ class FrontendNode(BaseModel):
field.is_list = True field.is_list = True
@staticmethod @staticmethod
def _handle_api_key_specific_field_values(field: TemplateField, key: str, name: Optional[str] = None) -> None: def _handle_api_key_specific_field_values(
field: TemplateField, key: str, name: Optional[str] = None
) -> None:
"""Handles specific field values related to API keys.""" """Handles specific field values related to API keys."""
if "api_key" in key and "OpenAI" in str(name): if "api_key" in key and "OpenAI" in str(name):
field.display_name = "OpenAI API Key" field.display_name = "OpenAI API Key"
@ -254,7 +266,10 @@ class FrontendNode(BaseModel):
@staticmethod @staticmethod
def should_be_password(key: str, show: bool) -> bool: def should_be_password(key: str, show: bool) -> bool:
"""Determines whether the field should be a password field.""" """Determines whether the field should be a password field."""
return any(text in key.lower() for text in {"password", "token", "api", "key"}) and show return (
any(text in key.lower() for text in {"password", "token", "api", "key"})
and show
)
@staticmethod @staticmethod
def should_be_multiline(key: str) -> bool: def should_be_multiline(key: str) -> bool:

View file

@ -15,7 +15,7 @@ from langflow.template.template.base import Template
class MemoryFrontendNode(FrontendNode): class MemoryFrontendNode(FrontendNode):
pinned: bool = True frozen: bool = True
def add_extra_fields(self) -> None: def add_extra_fields(self) -> None:
# chat history should have another way to add common field? # chat history should have another way to add common field?
@ -80,7 +80,9 @@ class MemoryFrontendNode(FrontendNode):
field.show = True field.show = True
field.advanced = False field.advanced = False
field.value = "" field.value = ""
field.info = INPUT_KEY_INFO if field.name == "input_key" else OUTPUT_KEY_INFO field.info = (
INPUT_KEY_INFO if field.name == "input_key" else OUTPUT_KEY_INFO
)
if field.name == "memory_key": if field.name == "memory_key":
field.value = "chat_history" field.value = "chat_history"

View file

@ -359,19 +359,19 @@ export default function ParameterComponent({
(info !== "" ? " flex items-center" : "") (info !== "" ? " flex items-center" : "")
} }
> >
{!left && data.node?.pinned && ( {!left && data.node?.frozen && (
<div> <div>
<IconComponent className="h-5 w-5 text-ice" name={"Snowflake"} /> <IconComponent className="h-5 w-5 text-ice" name={"Snowflake"} />
</div> </div>
)} )}
{proxy ? ( {proxy ? (
<ShadTooltip content={<span>{proxy.id}</span>}> <ShadTooltip content={<span>{proxy.id}</span>}>
<span className={!left && data.node?.pinned ? " text-ice" : ""}> <span className={!left && data.node?.frozen ? " text-ice" : ""}>
{title} {title}
</span> </span>
</ShadTooltip> </ShadTooltip>
) : ( ) : (
<span className={!left && data.node?.pinned ? " text-ice" : ""}> <span className={!left && data.node?.frozen ? " text-ice" : ""}>
{title} {title}
</span> </span>
)} )}

View file

@ -109,7 +109,7 @@ export default function Page({
...old.data, ...old.data,
node: { node: {
...old.data.node, ...old.data.node,
pinned: old.data?.node?.pinned ? false : true, frozen: old.data?.node?.frozen ? false : true,
}, },
}, },
})); }));
@ -491,4 +491,4 @@ export default function Page({
</main> </main>
</div> </div>
); );
} }

View file

@ -62,7 +62,7 @@ export default function NodeToolbarComponent({
const isMinimal = numberOfHandles <= 1; const isMinimal = numberOfHandles <= 1;
const isGroup = data.node?.flow ? true : false; const isGroup = data.node?.flow ? true : false;
const pinned = data.node?.pinned ?? false; const frozen = data.node?.frozen ?? false;
const paste = useFlowStore((state) => state.paste); const paste = useFlowStore((state) => state.paste);
const nodes = useFlowStore((state) => state.nodes); const nodes = useFlowStore((state) => state.nodes);
const edges = useFlowStore((state) => state.edges); const edges = useFlowStore((state) => state.edges);
@ -280,7 +280,7 @@ export default function NodeToolbarComponent({
...old.data, ...old.data,
node: { node: {
...old.data.node, ...old.data.node,
pinned: old.data?.node?.pinned ? false : true, frozen: old.data?.node?.frozen ? false : true,
}, },
}, },
})); }));
@ -291,7 +291,7 @@ export default function NodeToolbarComponent({
className={cn( className={cn(
"h-4 w-4 transition-all", "h-4 w-4 transition-all",
// TODO UPDATE THIS COLOR TO BE A VARIABLE // TODO UPDATE THIS COLOR TO BE A VARIABLE
pinned ? "animate-wiggle text-ice" : "" frozen ? "animate-wiggle text-ice" : ""
)} )}
/> />
</button> </button>

View file

@ -190,8 +190,8 @@ const useFlowStore = create<FlowStoreType>((set, get) => ({
get().setNodes((oldNodes) => get().setNodes((oldNodes) =>
oldNodes.map((node) => { oldNodes.map((node) => {
if (node.id === id) { if (node.id === id) {
if((node.data as NodeDataType).node?.pinned){ if ((node.data as NodeDataType).node?.frozen) {
(newChange.data as NodeDataType).node!.pinned = false; (newChange.data as NodeDataType).node!.frozen = false;
} }
return newChange; return newChange;
} }

View file

@ -27,7 +27,7 @@ export type APIClassType = {
documentation: string; documentation: string;
error?: string; error?: string;
official?: boolean; official?: boolean;
pinned?: boolean; frozen?: boolean;
flow?: FlowType; flow?: FlowType;
[key: string]: [key: string]:
| Array<string> | Array<string>