merge fix

This commit is contained in:
cristhianzl 2024-02-20 19:55:16 -03:00
commit 103ab84bc3
9 changed files with 48 additions and 38 deletions

View file

@ -3,7 +3,6 @@ from typing import Optional
from fastapi import ( from fastapi import (
APIRouter, APIRouter,
Body,
Depends, Depends,
HTTPException, HTTPException,
WebSocket, WebSocket,
@ -26,7 +25,6 @@ from langflow.api.v1.schemas import (
VerticesOrderResponse, VerticesOrderResponse,
) )
from langflow.graph.graph.base import Graph from langflow.graph.graph.base import Graph
from langflow.processing.process import process_tweaks_on_graph
from langflow.services.auth.utils import ( from langflow.services.auth.utils import (
get_current_active_user, get_current_active_user,
get_current_user_for_websocket, get_current_user_for_websocket,
@ -318,12 +316,11 @@ async def build_vertex(
vertex_id: str, vertex_id: str,
chat_service: "ChatService" = Depends(get_chat_service), chat_service: "ChatService" = Depends(get_chat_service),
current_user=Depends(get_current_active_user), current_user=Depends(get_current_active_user),
tweaks: dict = Body(None),
inputs: dict = Body(None),
): ):
"""Build a vertex instead of the entire graph.""" """Build a vertex instead of the entire graph."""
start_time = time.perf_counter() start_time = time.perf_counter()
try: try:
start_time = time.perf_counter()
cache = chat_service.get_cache(flow_id) cache = chat_service.get_cache(flow_id)
if not cache: if not cache:
# If there's no cache # If there's no cache
@ -337,10 +334,8 @@ async def build_vertex(
graph = cache.get("result") graph = cache.get("result")
result_dict = {} result_dict = {}
duration = "" duration = ""
if tweaks:
graph = process_tweaks_on_graph(graph, tweaks) vertex = graph.get_vertex(vertex_id)
if not (vertex := graph.get_vertex(vertex_id)):
raise ValueError(f"Invalid vertex {vertex_id}")
try: try:
if not vertex.pinned or not vertex._built: if not vertex.pinned or not vertex._built:
await vertex.build(user_id=current_user.id) await vertex.build(user_id=current_user.id)
@ -364,7 +359,7 @@ async def build_vertex(
raise ValueError(f"No result found for vertex {vertex_id}") raise ValueError(f"No result found for vertex {vertex_id}")
chat_service.set_cache(flow_id, graph) chat_service.set_cache(flow_id, graph)
except Exception as exc: except Exception as exc:
params = str(exc) params = repr(exc)
valid = False valid = False
result_dict = ResultData(results={}) result_dict = ResultData(results={})
artifacts = {} artifacts = {}

View file

@ -7,12 +7,8 @@ from langflow.graph.graph.constants import lazy_load_vertex_dict
from langflow.graph.graph.utils import process_flow from langflow.graph.graph.utils import process_flow
from langflow.graph.schema import InterfaceComponentTypes from langflow.graph.schema import InterfaceComponentTypes
from langflow.graph.vertex.base import Vertex from langflow.graph.vertex.base import Vertex
from langflow.graph.vertex.types import ( from langflow.graph.vertex.types import (ChatVertex, FileToolVertex, LLMVertex,
ChatVertex, ToolkitVertex)
FileToolVertex,
LLMVertex,
ToolkitVertex,
)
from langflow.interface.tools.constants import FILE_TOOLS from langflow.interface.tools.constants import FILE_TOOLS
from langflow.utils import payload from langflow.utils import payload
from loguru import logger from loguru import logger
@ -216,7 +212,10 @@ class Graph:
def get_vertex(self, vertex_id: str) -> Union[None, Vertex]: def get_vertex(self, vertex_id: str) -> Union[None, Vertex]:
"""Returns a vertex by id.""" """Returns a vertex by id."""
return self.vertex_map.get(vertex_id) try:
return self.vertex_map.get(vertex_id)
except KeyError:
raise ValueError(f"Vertex {vertex_id} not found")
def get_vertex_edges(self, vertex_id: str) -> List[ContractEdge]: def get_vertex_edges(self, vertex_id: str) -> List[ContractEdge]:
"""Returns a list of edges for a given vertex.""" """Returns a list of edges for a given vertex."""

View file

@ -2,6 +2,7 @@ import ast
import json import json
from typing import Callable, Dict, List, Optional, Union from typing import Callable, Dict, List, Optional, Union
import yaml
from langchain_core.messages import AIMessage from langchain_core.messages import AIMessage
from langflow.graph.utils import UnbuiltObject, flatten_list from langflow.graph.utils import UnbuiltObject, flatten_list
from langflow.graph.vertex.base import StatefulVertex, StatelessVertex from langflow.graph.vertex.base import StatefulVertex, StatelessVertex
@ -343,8 +344,11 @@ class ChatVertex(StatelessVertex):
return str(task.info) return str(task.info)
else: else:
return f"Task {self.task_id} is not running" return f"Task {self.task_id} is not running"
if self.artifacts and "repr" in self.artifacts: if self.artifacts:
return self.artifacts["repr"] or super()._built_object_repr() # dump as a yaml string
yaml_str = yaml.dump(self.artifacts, default_flow_style=False)
return yaml_str
return super()._built_object_repr()
async def _run(self, *args, **kwargs): async def _run(self, *args, **kwargs):
if self.is_interface_component: if self.is_interface_component:

View file

@ -13,6 +13,8 @@ import FlowSettingsModal from "../../../../modals/flowSettingsModal";
import useAlertStore from "../../../../stores/alertStore"; import useAlertStore from "../../../../stores/alertStore";
import useFlowStore from "../../../../stores/flowStore"; import useFlowStore from "../../../../stores/flowStore";
import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; import useFlowsManagerStore from "../../../../stores/flowsManagerStore";
import { cn } from "../../../../utils/utils";
import Tooltip from "../../../TooltipComponent";
import IconComponent from "../../../genericIconComponent"; import IconComponent from "../../../genericIconComponent";
import { Button } from "../../../ui/button"; import { Button } from "../../../ui/button";
@ -26,6 +28,7 @@ export const MenuBar = ({
const setErrorData = useAlertStore((state) => state.setErrorData); const setErrorData = useAlertStore((state) => state.setErrorData);
const undo = useFlowsManagerStore((state) => state.undo); const undo = useFlowsManagerStore((state) => state.undo);
const redo = useFlowsManagerStore((state) => state.redo); const redo = useFlowsManagerStore((state) => state.redo);
const saveLoading = useFlowsManagerStore((state) => state.saveLoading);
const [openSettings, setOpenSettings] = useState(false); const [openSettings, setOpenSettings] = useState(false);
const n = useFlowStore((state) => state.nodes); const n = useFlowStore((state) => state.nodes);
@ -112,6 +115,27 @@ export const MenuBar = ({
setOpen={setOpenSettings} setOpen={setOpenSettings}
></FlowSettingsModal> ></FlowSettingsModal>
</div> </div>
<Tooltip
title={
"Last saved at " +
new Date(currentFlow.updated_at ?? "").toLocaleString("en-US", {
hour: "numeric",
minute: "numeric",
second: "numeric",
})
}
>
<div className="flex items-center gap-1.5 text-sm text-muted-foreground">
<IconComponent
name={saveLoading ? "Loader2" : "CheckCircle2"}
className={cn(
"h-4 w-4",
saveLoading ? "animate-spin" : "animate-wiggle"
)}
/>
{saveLoading ? "Saving..." : "Saved"}
</div>
</Tooltip>
</div> </div>
) : ( ) : (
<></> <></>

View file

@ -681,4 +681,4 @@ export const LANGFLOW_SUPPORTED_TYPES = new Set([
export const priorityFields = new Set(["code", "template"]); export const priorityFields = new Set(["code", "template"]);
export const INPUT_TYPES = new Set(["ChatInput", "TextInput"]); export const INPUT_TYPES = new Set(["ChatInput", "TextInput"]);
export const OUTPUT_TYPES = new Set(["ChatOutput"]); export const OUTPUT_TYPES = new Set(["ChatOutput",]);

View file

@ -52,6 +52,7 @@ const useFlowsManagerStore = create<FlowsManagerStoreType>((set, get) => ({
}); });
}, },
currentFlow: undefined, currentFlow: undefined,
saveLoading: false,
isLoading: true, isLoading: true,
setIsLoading: (isLoading: boolean) => set({ isLoading }), setIsLoading: (isLoading: boolean) => set({ isLoading }),
refreshFlows: () => { refreshFlows: () => {
@ -82,7 +83,7 @@ const useFlowsManagerStore = create<FlowsManagerStoreType>((set, get) => ({
if (saveTimeoutId) { if (saveTimeoutId) {
clearTimeout(saveTimeoutId); clearTimeout(saveTimeoutId);
} }
set({ saveLoading: true });
// Set up a new timeout. // Set up a new timeout.
saveTimeoutId = setTimeout(() => { saveTimeoutId = setTimeout(() => {
if (get().currentFlow) { if (get().currentFlow) {
@ -94,6 +95,7 @@ const useFlowsManagerStore = create<FlowsManagerStoreType>((set, get) => ({
}, 300); // Delay of 300ms. }, 300); // Delay of 300ms.
}, },
saveFlow: (flow: FlowType, silent?: boolean) => { saveFlow: (flow: FlowType, silent?: boolean) => {
set({ saveLoading: true })
return new Promise<void>((resolve, reject) => { return new Promise<void>((resolve, reject) => {
updateFlowInDatabase(flow) updateFlowInDatabase(flow)
.then((updatedFlow) => { .then((updatedFlow) => {
@ -115,6 +117,7 @@ const useFlowsManagerStore = create<FlowsManagerStoreType>((set, get) => ({
//update tabs state //update tabs state
resolve(); resolve();
set({ saveLoading: false })
} }
}) })
.catch((err) => { .catch((err) => {

View file

@ -17,21 +17,3 @@ export const useStoreStore = create<StoreStoreType>((set) => ({
checkHasStore().then((res) => { checkHasStore().then((res) => {
useStoreStore.setState({ hasStore: res?.enabled ?? false }); useStoreStore.setState({ hasStore: res?.enabled ?? false });
}); });
const fetchApiData = async () => {
useStoreStore.setState({ loadingApiKey: true });
try {
const res = await checkHasApiKey();
useStoreStore.setState({
loadingApiKey: false,
validApiKey: res?.is_valid ?? false,
hasApiKey: res?.has_api_key ?? false,
});
} catch (e) {
useStoreStore.setState({ loadingApiKey: false });
console.log(e);
}
};
fetchApiData();

View file

@ -10,6 +10,8 @@ export type FlowType = {
style?: FlowStyleType; style?: FlowStyleType;
is_component?: boolean; is_component?: boolean;
last_tested_version?: string; last_tested_version?: string;
updated_at?: string;
date_created?: string;
parent?: string; parent?: string;
}; };

View file

@ -7,6 +7,7 @@ export type FlowsManagerStoreType = {
currentFlow: FlowType | undefined; currentFlow: FlowType | undefined;
currentFlowId: string; currentFlowId: string;
setCurrentFlowId: (currentFlowId: string) => void; setCurrentFlowId: (currentFlowId: string) => void;
saveLoading: boolean;
isLoading: boolean; isLoading: boolean;
setIsLoading: (isLoading: boolean) => void; setIsLoading: (isLoading: boolean) => void;
refreshFlows: () => Promise<void>; refreshFlows: () => Promise<void>;