Merge branch 'zustand/io/migration' of github.com:logspace-ai/langflow into zustand/io/migration

This commit is contained in:
igorrCarvalho 2024-03-05 18:25:58 -03:00
commit 7c8c52dbc3
3 changed files with 38 additions and 11 deletions

View file

@ -7,7 +7,8 @@ import ReactPlayer from "react-player";
## Compose
Creating flows with Langflow is easy. Drag sidebar components onto the canvas and connect them together to create your pipeline. Langflow provides a range of [LangChain components](https://python.langchain.com/docs/modules/) to choose from, including LLMs, prompt serializers, agents, and chains.
Creating flows with Langflow is easy. Drag sidebar components onto the canvas and connect them together to create your pipeline.
Langflow provides a range of Components to choose from, including **Chat Input**, **Chat Output**, **API Request** and **Prompt**.
<ZoomableImage
alt="Docusaurus themed image"
@ -17,9 +18,9 @@ Creating flows with Langflow is easy. Drag sidebar components onto the canvas an
}}
/>
## Fork
## Starter Flows
The easiest way to start with Langflow is by forking a **community example**. Forking an example stores a copy in your project collection, allowing you to edit and save the modified version as a new flow.
Langflow provides a range of starter flows to help you get started. These flows are pre-built and can be used as a starting point for your own flows.
<div
style={{ marginBottom: "20px", display: "flex", justifyContent: "center" }}
@ -27,9 +28,21 @@ The easiest way to start with Langflow is by forking a **community example**. Fo
<ReactPlayer playing controls url="/videos/langflow_fork.mp4" />
</div>
## Build
## Defining Inputs and Outputs
Each flow can have multiple inputs and outputs. These can be defined by placing **Inputs** and **Outputs** components on the canvas.
The **Inputs** components define the inputs to the flow.
Whenever you place an Input component on the canvas, it will allow you to interactively define change its value
from the Interactive Panel.
The **Text Input** component allows you to define a text input, and the **Chat Input** component allows you to use the chat input from the Interactive Panel.
The **Outputs** components define the outputs of the flow and work similarly to the Inputs components.
Both Inputs and Outputs components can be connected to other components on the canvas and are used to define how the API works too.
Building a flow means validating if the components have prerequisites fulfilled and are properly instantiated. When a chat message is sent, the flow will run for the first time, executing the pipeline.
<div
style={{ marginBottom: "20px", display: "flex", justifyContent: "center" }}

View file

@ -5,12 +5,18 @@ from uuid import UUID
import orjson
from fastapi import APIRouter, Depends, File, HTTPException, UploadFile
from fastapi.encoders import jsonable_encoder
from loguru import logger
from sqlmodel import Session, select
from langflow.api.utils import remove_api_keys, validate_is_component
from langflow.api.v1.schemas import FlowListCreate, FlowListRead
from langflow.services.auth.utils import get_current_active_user
from langflow.services.database.models.flow import Flow, FlowCreate, FlowRead, FlowUpdate
from langflow.services.database.models.flow import (
Flow,
FlowCreate,
FlowRead,
FlowUpdate,
)
from langflow.services.database.models.user.model import User
from langflow.services.deps import get_session, get_settings_service
@ -42,11 +48,18 @@ def create_flow(
def read_flows(
*,
current_user: User = Depends(get_current_active_user),
session: Session = Depends(get_session),
):
"""Read all flows."""
try:
flows = current_user.flows
flows = validate_is_component(flows)
# with the session get the flows that DO NOT have a user_id
try:
example_flows = session.exec(select(Flow).where(Flow.user_id == None)).all()
flows.extend(example_flows)
except Exception as e:
logger.error(e)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e)) from e
return [jsonable_encoder(flow) for flow in flows]
@ -60,7 +73,11 @@ def read_flow(
current_user: User = Depends(get_current_active_user),
):
"""Read a flow."""
if user_flow := (session.exec(select(Flow).where(Flow.id == flow_id, Flow.user_id == current_user.id)).first()):
if user_flow := (
session.exec(
select(Flow).where(Flow.id == flow_id, Flow.user_id == current_user.id)
).first()
):
return user_flow
else:
raise HTTPException(status_code=404, detail="Flow not found")
@ -109,9 +126,6 @@ def delete_flow(
return {"message": "Flow deleted successfully"}
# Define a new model to handle multiple flows
@router.post("/batch/", response_model=List[FlowRead], status_code=201)
def create_flows(
*,

View file

@ -80,7 +80,7 @@ class FlowCreate(FlowBase):
class FlowRead(FlowBase):
id: UUID
user_id: UUID = Field()
user_id: Optional[UUID] = Field()
class FlowUpdate(SQLModel):