Add experimental components for listing flows, getting notified, and executing runnables
This commit is contained in:
parent
aa85b572c3
commit
c5671f132f
9 changed files with 14 additions and 92 deletions
|
|
@ -11,7 +11,10 @@ class SQLExecutorComponent(CustomComponent):
|
||||||
|
|
||||||
def build_config(self):
|
def build_config(self):
|
||||||
return {
|
return {
|
||||||
"database": {"display_name": "Database"},
|
"database_url": {
|
||||||
|
"display_name": "Database URL",
|
||||||
|
"info": "The URL of the database.",
|
||||||
|
},
|
||||||
"include_columns": {
|
"include_columns": {
|
||||||
"display_name": "Include Columns",
|
"display_name": "Include Columns",
|
||||||
"info": "Include columns in the result.",
|
"info": "Include columns in the result.",
|
||||||
|
|
@ -26,15 +29,24 @@ class SQLExecutorComponent(CustomComponent):
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def clean_up_uri(self, uri: str) -> str:
|
||||||
|
if uri.startswith("postgresql://"):
|
||||||
|
uri = uri.replace("postgresql://", "postgres://")
|
||||||
|
return uri.strip()
|
||||||
|
|
||||||
def build(
|
def build(
|
||||||
self,
|
self,
|
||||||
query: str,
|
query: str,
|
||||||
database: SQLDatabase,
|
database_url: str,
|
||||||
include_columns: bool = False,
|
include_columns: bool = False,
|
||||||
passthrough: bool = False,
|
passthrough: bool = False,
|
||||||
add_error: bool = False,
|
add_error: bool = False,
|
||||||
) -> Text:
|
) -> Text:
|
||||||
error = None
|
error = None
|
||||||
|
try:
|
||||||
|
database = SQLDatabase.from_uri(database_url)
|
||||||
|
except Exception as e:
|
||||||
|
raise ValueError(f"An error occurred while connecting to the database: {e}")
|
||||||
try:
|
try:
|
||||||
tool = QuerySQLDataBaseTool(db=database)
|
tool = QuerySQLDataBaseTool(db=database)
|
||||||
result = tool.run(query, include_columns=include_columns)
|
result = tool.run(query, include_columns=include_columns)
|
||||||
0
src/backend/langflow/components/experimental/__init__.py
Normal file
0
src/backend/langflow/components/experimental/__init__.py
Normal file
|
|
@ -1,41 +0,0 @@
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
from langflow import CustomComponent
|
|
||||||
from langflow.schema import Record
|
|
||||||
|
|
||||||
|
|
||||||
class SharedState(CustomComponent):
|
|
||||||
display_name = "Shared State"
|
|
||||||
description = "A component to share state between components."
|
|
||||||
|
|
||||||
def build_config(self):
|
|
||||||
return {
|
|
||||||
"name": {"display_name": "Name", "info": "The name of the state."},
|
|
||||||
"record": {"display_name": "Record", "info": "The record to store."},
|
|
||||||
"append": {
|
|
||||||
"display_name": "Append",
|
|
||||||
"info": "If True, the record will be appended to the state.",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
def build(
|
|
||||||
self, name: str, record: Optional[Record] = None, append: bool = False
|
|
||||||
) -> Record:
|
|
||||||
if record:
|
|
||||||
if append:
|
|
||||||
self.append_state(name, record)
|
|
||||||
else:
|
|
||||||
self.update_state(name, record)
|
|
||||||
|
|
||||||
state = self.get_state(name)
|
|
||||||
if state and not isinstance(state, Record):
|
|
||||||
if isinstance(state, str):
|
|
||||||
state = Record(text=state)
|
|
||||||
elif isinstance(state, dict):
|
|
||||||
state = Record(data=state)
|
|
||||||
else:
|
|
||||||
state = Record(text=str(state))
|
|
||||||
elif not state:
|
|
||||||
state = Record(text="")
|
|
||||||
self.status = state
|
|
||||||
return state
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
# Implement ShouldRunNext component
|
|
||||||
from typing import Text
|
|
||||||
from langchain_core.prompts import PromptTemplate
|
|
||||||
|
|
||||||
from langflow import CustomComponent
|
|
||||||
from langflow.field_typing import BaseLanguageModel, Prompt
|
|
||||||
|
|
||||||
|
|
||||||
class ShouldRunNext(CustomComponent):
|
|
||||||
display_name = "Should Run Next"
|
|
||||||
description = "Decides whether to run the next component."
|
|
||||||
|
|
||||||
def build_config(self):
|
|
||||||
return {
|
|
||||||
"prompt": {
|
|
||||||
"display_name": "Prompt",
|
|
||||||
"info": "The prompt to use for the decision. It should generate a boolean response (True or False).",
|
|
||||||
},
|
|
||||||
"llm": {
|
|
||||||
"display_name": "LLM",
|
|
||||||
"info": "The language model to use for the decision.",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
def build(self, template: Prompt, llm: BaseLanguageModel, **kwargs) -> dict:
|
|
||||||
# This is a simple component that always returns True
|
|
||||||
prompt_template = PromptTemplate.from_template(Text(template))
|
|
||||||
|
|
||||||
attributes_to_check = ["text", "page_content"]
|
|
||||||
for key, value in kwargs.items():
|
|
||||||
for attribute in attributes_to_check:
|
|
||||||
if hasattr(value, attribute):
|
|
||||||
kwargs[key] = getattr(value, attribute)
|
|
||||||
|
|
||||||
chain = prompt_template | llm
|
|
||||||
result = chain.invoke(kwargs)
|
|
||||||
if hasattr(result, "content") and isinstance(result.content, str):
|
|
||||||
result = result.content
|
|
||||||
elif isinstance(result, str):
|
|
||||||
result = result
|
|
||||||
else:
|
|
||||||
result = result.get("response")
|
|
||||||
|
|
||||||
if result.lower() not in ["true", "false"]:
|
|
||||||
raise ValueError("The prompt should generate a boolean response (True or False).")
|
|
||||||
# The string should be the words true or false
|
|
||||||
# if not raise an error
|
|
||||||
bool_result = result.lower() == "true"
|
|
||||||
return {"condition": bool_result, "result": kwargs}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue