Skip to content
This repository was archived by the owner on Mar 22, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions components/ClearPoint General/data_conditional_router_component.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
from langflow.custom import Component
from langflow.io import DropdownInput, IntInput, Output, DataInput, StrInput
from langflow.schema.message import Data
from evalidate import Expr


class DataConditionalRouterComponent(Component):
display_name = "Data If-Else"
description = "Routes an Data to a corresponding output based on a boolean expression."
icon = "split"
name = "DataConditionalRouter"

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.__iteration_updated = False

inputs = [
DataInput(
name="input_data",
display_name="Input",
info="The primary text input for the operation.",
required=True,
),
StrInput(
name="eval_expression",
display_name="Eval Expression",
info="The boolean expression to eval the input data against.",
required=True,
),
IntInput(
name="max_iterations",
display_name="Max Iterations",
info="The maximum number of iterations for the conditional router.",
value=10,
advanced=True,
),
DropdownInput(
name="default_route",
display_name="Default Route",
options=["true_result", "false_result"],
info="The default route to take when max iterations are reached.",
value="false_result",
advanced=True,
),
]

outputs = [
Output(display_name="True", name="true_result", method="true_response"),
Output(display_name="False", name="false_result", method="false_response"),
]

def _pre_run_setup(self):
self.__iteration_updated = False

def iterate_and_stop_once(self, route_to_stop: str):
if not self.__iteration_updated:
self.update_ctx({f"{self._id}_iteration": self.ctx.get(f"{self._id}_iteration", 0) + 1})
self.__iteration_updated = True
if self.ctx.get(f"{self._id}_iteration", 0) >= self.max_iterations and route_to_stop == self.default_route:
route_to_stop = "true_result" if route_to_stop == "false_result" else "false_result"
self.stop(route_to_stop)

def true_response(self) -> Data:
# TODO: Proper error handling. Should check for bool result and handle EvalException
result = Expr(self.eval_expression).eval(self.input_data.data)

if result:
self.status = self.input_data
self.iterate_and_stop_once("false_result")
return self.input_data
self.iterate_and_stop_once("true_result")
return Data(text="Eval is not true,.")

def false_response(self) -> Data:
# TODO: Proper error handling. Should check for bool result and handle EvalException
result = Expr(self.eval_expression).eval(self.input_data.data)

if not result:
self.status = self.input_data
self.iterate_and_stop_once("true_result")
return self.input_data
self.iterate_and_stop_once("false_result")
return Data(text="Eval is not false.")


27 changes: 27 additions & 0 deletions components/ClearPoint General/first_row_component.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from langflow.custom import Component
from langflow.io import DataFrameInput, Output
from langflow.schema import Data


class FirstRowComponent(Component):
display_name = "First row"
description = "Takes the first row of a Dataframe and converts it to a Data object"
icon = "list-start"
name = "FirstRowComponent"

inputs = [
DataFrameInput(
name="input_dataframe",
display_name="Dataframe",
info="This is the input DataFrame"
),
]

outputs = [
Output(display_name="Data", name="output_data", method="build_output"),
]

def build_output(self) -> Data:
data = self.input_dataframe.to_data_list()[0] # TODO empty list checking and handling
self.status = data
return data
24 changes: 24 additions & 0 deletions components/ClearPoint General/json_to_data_component.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from langflow.custom import Component
from langflow.io import Output, MultilineInput
from langflow.schema import Data
import json


class JsonStringToDataComponent(Component):
display_name = "JSON to Data"
description = "This component converts a JSON string to a Data object."
icon = "file-json"
name = "JsonStringToData"

inputs = [
MultilineInput(name="json_string", display_name="JSON string"),
]

outputs = [
Output(name="json_as_data", display_name="JSON as Data", method="convert_json_to_data")
]

def convert_json_to_data(self) -> Data:
data = Data(data=json.loads(self.json_string))
self.status = data
return data
56 changes: 56 additions & 0 deletions components/ClearPoint General/logger_component.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from langflow.custom import Component
from langflow.io import HandleInput, Output, StrInput
from langflow.schema import Data, DataFrame, Message


class LoggerComponent(Component):
display_name = "Logger"
description = "Logs the passed in object and then passes it on unchanged."
icon = "bug"
name = "LoggerComponent"

inputs = [
StrInput(
name="log_message",
display_name="Log Message",
info="The message to log before the object.",
required=True,
),
HandleInput(
name="input_object",
display_name="Input",
input_types=["DataFrame", "Data", "Message"],
info="Accepts either a DataFrame, a Data object or a Message.",
required=True,
),
]

outputs = [
Output(display_name="Data", name="output_data", method="build_data_output"),
Output(display_name="DataFrame", name="output_dataframe", method="build_dataframe_output"),
Output(display_name="Message", name="output_message", method="build_message_output"),
]

def _log_object(self):
log_msg = f"{self.log_message} {self.input_object}"
self.log(log_msg,"LoggerComponent")
print(log_msg)
self.status = self.log_message

def build_data_output(self) -> Data:
if not isinstance(self.input_object,Data):
raise Exception("Input was not a Data object!")
self._log_object()
return self.input_object

def build_dataframe_output(self) -> DataFrame:
if not isinstance(self.input_object,DataFrame):
raise Exception("Input was not a DataFrame object!")
self._log_object()
return self.input_object

def build_message_output(self) -> Message:
if not isinstance(self.input_object,Message):
raise Exception("Input was not a Message object!")
self._log_object()
return self.input_object
62 changes: 62 additions & 0 deletions components/ClearPoint Jira/jira_add_comment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
from langflow.custom import Component
from langflow.io import Output, SecretStrInput, MessageTextInput,StrInput,BoolInput,MultilineInput
from jira import JIRA
from typing import List
from langflow.schema import Data, DataFrame


class JiraAddCommentComponent(Component):
display_name = "Jira Add comment"
description = (
"Adds a comment to a Jira issue."
)
icon = "jira"
name = "JiraAddCommentComponent"

inputs = [
StrInput(
name="JIRA_SERVER_URL",
display_name="Jira Server URL",
required=True,
),
StrInput(
name="JIRA_USERNAME",
display_name="Jira Username",
required=True,
),
SecretStrInput(
name="JIRA_API_KEY",
display_name="Jira API Key",
required=True,
),
MessageTextInput(
name="issue_key",
display_name="Issue Key",
info="The key of the issue to update.",
required=True,
tool_mode=True,
),
MultilineInput(name="comment_text",
display_name="Comment Text",
info="Text of the comment to add to the issue.",
required=True,
tool_mode=True),
]

outputs = [
Output(
name="results",
display_name="Results",
method="add_issue",
info="The results of the Jira comment add operation."
)
]

def add_issue(self) -> Data:
jira = JIRA(server=self.JIRA_SERVER_URL, basic_auth=(self.JIRA_USERNAME, self.JIRA_API_KEY))

results = jira.add_comment(self.issue_key,self.comment_text)

self.status = results.raw
return Data(data=results.raw)

72 changes: 72 additions & 0 deletions components/ClearPoint Jira/jira_add_label.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
from langflow.custom import Component
from langflow.io import Output, SecretStrInput, MessageTextInput,StrInput,BoolInput,MultilineInput
from jira import JIRA
from typing import List
from langflow.schema import Data, DataFrame


class JiraAddLabelToIssueComponent(Component):
display_name = "Jira Add label to issue"
description = (
"Adds a label to a Jira issue."
)
icon = "jira"
name = "JiraAddLabelToIssueComponent"

inputs = [
StrInput(
name="JIRA_SERVER_URL",
display_name="Jira Server URL",
required=True,
),
StrInput(
name="JIRA_USERNAME",
display_name="Jira Username",
required=True,
),
SecretStrInput(
name="JIRA_API_KEY",
display_name="Jira API Key",
required=True,
),
MessageTextInput(
name="issue_key",
display_name="Issue Key",
info="The key of the issue to add the label to.",
required=True,
tool_mode=True,
),
MessageTextInput(
name="label",
display_name="Label",
info="The label to add to the issue.",
required=True,
tool_mode=True,
),
]

outputs = [
Output(
name="results",
display_name="Results",
method="add_label",
info="The results of the Jira label add operation."
)
]

def add_label(self) -> Data:
jira = JIRA(server=self.JIRA_SERVER_URL, basic_auth=(self.JIRA_USERNAME, self.JIRA_API_KEY))

# grab the issue
issue = jira.issue(self.issue_key)

# add the label to the issue
issue.fields.labels.append(self.label)
# update issue with the new label
issue.update(fields={"labels": issue.fields.labels})

issue = jira.issue(self.issue_key) # load the updated issue so we can get raw data TODO: add logic to avoid this second call

self.status = issue.raw
return Data(data=issue.raw)

Loading