feat: Add ruff rules for error messages (EM) (#3978)
Add ruff rules for error messages (EM)
This commit is contained in:
parent
e63c377283
commit
1668c91433
169 changed files with 1011 additions and 554 deletions
|
|
@ -403,7 +403,8 @@ def superuser(
|
||||||
if result:
|
if result:
|
||||||
typer.echo("Default folder created successfully.")
|
typer.echo("Default folder created successfully.")
|
||||||
else:
|
else:
|
||||||
raise RuntimeError("Could not create default folder.")
|
msg = "Could not create default folder."
|
||||||
|
raise RuntimeError(msg)
|
||||||
typer.echo("Superuser created successfully.")
|
typer.echo("Superuser created successfully.")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,8 @@ async def build_graph_from_data(flow_id: str, payload: dict, **kwargs):
|
||||||
for vertex_id in graph._has_session_id_vertices:
|
for vertex_id in graph._has_session_id_vertices:
|
||||||
vertex = graph.get_vertex(vertex_id)
|
vertex = graph.get_vertex(vertex_id)
|
||||||
if vertex is None:
|
if vertex is None:
|
||||||
raise ValueError(f"Vertex {vertex_id} not found")
|
msg = f"Vertex {vertex_id} not found"
|
||||||
|
raise ValueError(msg)
|
||||||
if not vertex._raw_params.get("session_id"):
|
if not vertex._raw_params.get("session_id"):
|
||||||
vertex.update_raw_params({"session_id": flow_id}, overwrite=True)
|
vertex.update_raw_params({"session_id": flow_id}, overwrite=True)
|
||||||
|
|
||||||
|
|
@ -150,7 +151,8 @@ async def build_graph_from_db_no_cache(flow_id: str, session: Session):
|
||||||
"""Build and cache the graph."""
|
"""Build and cache the graph."""
|
||||||
flow: Flow | None = session.get(Flow, flow_id)
|
flow: Flow | None = session.get(Flow, flow_id)
|
||||||
if not flow or not flow.data:
|
if not flow or not flow.data:
|
||||||
raise ValueError("Invalid flow ID")
|
msg = "Invalid flow ID"
|
||||||
|
raise ValueError(msg)
|
||||||
return await build_graph_from_data(flow_id, flow.data, flow_name=flow.name, user_id=str(flow.user_id))
|
return await build_graph_from_data(flow_id, flow.data, flow_name=flow.name, user_id=str(flow.user_id))
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -260,4 +262,5 @@ async def cascade_delete_flow(session: Session, flow: Flow):
|
||||||
session.exec(delete(VertexBuildTable).where(VertexBuildTable.flow_id == flow.id)) # type: ignore
|
session.exec(delete(VertexBuildTable).where(VertexBuildTable.flow_id == flow.id)) # type: ignore
|
||||||
session.exec(delete(Flow).where(Flow.id == flow.id)) # type: ignore
|
session.exec(delete(Flow).where(Flow.id == flow.id)) # type: ignore
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise RuntimeError(f"Unable to cascade delete flow: ${flow.id}", e)
|
msg = f"Unable to cascade delete flow: ${flow.id}"
|
||||||
|
raise RuntimeError(msg, e)
|
||||||
|
|
|
||||||
|
|
@ -340,7 +340,8 @@ async def build_flow(
|
||||||
vertex_build_response_json = vertex_build_response.model_dump_json()
|
vertex_build_response_json = vertex_build_response.model_dump_json()
|
||||||
build_data = json.loads(vertex_build_response_json)
|
build_data = json.loads(vertex_build_response_json)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise ValueError(f"Error serializing vertex build response: {exc}") from exc
|
msg = f"Error serializing vertex build response: {exc}"
|
||||||
|
raise ValueError(msg) from exc
|
||||||
event_manager.on_end_vertex(data={"build_data": build_data})
|
event_manager.on_end_vertex(data={"build_data": build_data})
|
||||||
await client_consumed_queue.get()
|
await client_consumed_queue.get()
|
||||||
if vertex_build_response.valid:
|
if vertex_build_response.valid:
|
||||||
|
|
@ -652,13 +653,15 @@ async def build_vertex_stream(
|
||||||
cache = await chat_service.get_cache(flow_id_str)
|
cache = await chat_service.get_cache(flow_id_str)
|
||||||
if not cache:
|
if not cache:
|
||||||
# If there's no cache
|
# If there's no cache
|
||||||
raise ValueError(f"No cache found for {flow_id_str}.")
|
msg = f"No cache found for {flow_id_str}."
|
||||||
|
raise ValueError(msg)
|
||||||
else:
|
else:
|
||||||
graph = cache.get("result")
|
graph = cache.get("result")
|
||||||
|
|
||||||
vertex: InterfaceVertex = graph.get_vertex(vertex_id)
|
vertex: InterfaceVertex = graph.get_vertex(vertex_id)
|
||||||
if not hasattr(vertex, "stream"):
|
if not hasattr(vertex, "stream"):
|
||||||
raise ValueError(f"Vertex {vertex_id} does not support streaming")
|
msg = f"Vertex {vertex_id} does not support streaming"
|
||||||
|
raise ValueError(msg)
|
||||||
if isinstance(vertex._built_result, str) and vertex._built_result:
|
if isinstance(vertex._built_result, str) and vertex._built_result:
|
||||||
stream_data = StreamData(
|
stream_data = StreamData(
|
||||||
event="message",
|
event="message",
|
||||||
|
|
@ -691,7 +694,8 @@ async def build_vertex_stream(
|
||||||
)
|
)
|
||||||
yield str(stream_data)
|
yield str(stream_data)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"No result found for vertex {vertex_id}")
|
msg = f"No result found for vertex {vertex_id}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.exception(f"Error building Component: {exc}")
|
logger.exception(f"Error building Component: {exc}")
|
||||||
|
|
|
||||||
|
|
@ -94,17 +94,15 @@ def validate_input_and_tweaks(input_request: SimplifiedAPIRequest):
|
||||||
has_input_value = value.get("input_value") is not None
|
has_input_value = value.get("input_value") is not None
|
||||||
input_value_is_chat = input_request.input_value is not None and input_request.input_type == "chat"
|
input_value_is_chat = input_request.input_value is not None and input_request.input_type == "chat"
|
||||||
if has_input_value and input_value_is_chat:
|
if has_input_value and input_value_is_chat:
|
||||||
raise InvalidChatInputException(
|
msg = "If you pass an input_value to the chat input, you cannot pass a tweak with the same name."
|
||||||
"If you pass an input_value to the chat input, you cannot pass a tweak with the same name."
|
raise InvalidChatInputException(msg)
|
||||||
)
|
|
||||||
elif "Text Input" in key or "TextInput" in key:
|
elif "Text Input" in key or "TextInput" in key:
|
||||||
if isinstance(value, dict):
|
if isinstance(value, dict):
|
||||||
has_input_value = value.get("input_value") is not None
|
has_input_value = value.get("input_value") is not None
|
||||||
input_value_is_text = input_request.input_value is not None and input_request.input_type == "text"
|
input_value_is_text = input_request.input_value is not None and input_request.input_type == "text"
|
||||||
if has_input_value and input_value_is_text:
|
if has_input_value and input_value_is_text:
|
||||||
raise InvalidChatInputException(
|
msg = "If you pass an input_value to the text input, you cannot pass a tweak with the same name."
|
||||||
"If you pass an input_value to the text input, you cannot pass a tweak with the same name."
|
raise InvalidChatInputException(msg)
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def simple_run_flow(
|
async def simple_run_flow(
|
||||||
|
|
@ -120,7 +118,8 @@ async def simple_run_flow(
|
||||||
user_id = api_key_user.id if api_key_user else None
|
user_id = api_key_user.id if api_key_user else None
|
||||||
flow_id_str = str(flow.id)
|
flow_id_str = str(flow.id)
|
||||||
if flow.data is None:
|
if flow.data is None:
|
||||||
raise ValueError(f"Flow {flow_id_str} has no data")
|
msg = f"Flow {flow_id_str} has no data"
|
||||||
|
raise ValueError(msg)
|
||||||
graph_data = flow.data.copy()
|
graph_data = flow.data.copy()
|
||||||
graph_data = process_tweaks(graph_data, input_request.tweaks or {}, stream=stream)
|
graph_data = process_tweaks(graph_data, input_request.tweaks or {}, stream=stream)
|
||||||
graph = Graph.from_payload(graph_data, flow_id=flow_id_str, user_id=str(user_id), flow_name=flow.name)
|
graph = Graph.from_payload(graph_data, flow_id=flow_id_str, user_id=str(user_id), flow_name=flow.name)
|
||||||
|
|
@ -331,8 +330,9 @@ async def webhook_run_flow(
|
||||||
data = await request.body()
|
data = await request.body()
|
||||||
if not data:
|
if not data:
|
||||||
logger.error("Request body is empty")
|
logger.error("Request body is empty")
|
||||||
|
msg = "Request body is empty. You should provide a JSON payload containing the flow ID."
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Request body is empty. You should provide a JSON payload containing the flow ID.",
|
msg,
|
||||||
)
|
)
|
||||||
|
|
||||||
# get all webhook components in the flow
|
# get all webhook components in the flow
|
||||||
|
|
@ -448,7 +448,8 @@ async def experimental_run_flow(
|
||||||
session_data = await session_service.load_session(session_id, flow_id=flow_id_str)
|
session_data = await session_service.load_session(session_id, flow_id=flow_id_str)
|
||||||
graph, artifacts = session_data if session_data else (None, None)
|
graph, artifacts = session_data if session_data else (None, None)
|
||||||
if graph is None:
|
if graph is None:
|
||||||
raise ValueError(f"Session {session_id} not found")
|
msg = f"Session {session_id} not found"
|
||||||
|
raise ValueError(msg)
|
||||||
else:
|
else:
|
||||||
# Get the flow that matches the flow_id and belongs to the user
|
# Get the flow that matches the flow_id and belongs to the user
|
||||||
# flow = session.query(Flow).filter(Flow.id == flow_id).filter(Flow.user_id == api_key_user.id).first()
|
# flow = session.query(Flow).filter(Flow.id == flow_id).filter(Flow.user_id == api_key_user.id).first()
|
||||||
|
|
@ -456,10 +457,12 @@ async def experimental_run_flow(
|
||||||
select(Flow).where(Flow.id == flow_id_str).where(Flow.user_id == api_key_user.id)
|
select(Flow).where(Flow.id == flow_id_str).where(Flow.user_id == api_key_user.id)
|
||||||
).first()
|
).first()
|
||||||
if flow is None:
|
if flow is None:
|
||||||
raise ValueError(f"Flow {flow_id_str} not found")
|
msg = f"Flow {flow_id_str} not found"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if flow.data is None:
|
if flow.data is None:
|
||||||
raise ValueError(f"Flow {flow_id_str} has no data")
|
msg = f"Flow {flow_id_str} has no data"
|
||||||
|
raise ValueError(msg)
|
||||||
graph_data = flow.data
|
graph_data = flow.data
|
||||||
graph_data = process_tweaks(graph_data, tweaks or {})
|
graph_data = process_tweaks(graph_data, tweaks or {})
|
||||||
graph = Graph.from_payload(graph_data, flow_id=flow_id_str)
|
graph = Graph.from_payload(graph_data, flow_id=flow_id_str)
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,8 @@ class ChatResponse(ChatMessage):
|
||||||
@classmethod
|
@classmethod
|
||||||
def validate_message_type(cls, v):
|
def validate_message_type(cls, v):
|
||||||
if v not in ["start", "stream", "end", "error", "info", "file"]:
|
if v not in ["start", "stream", "end", "error", "info", "file"]:
|
||||||
raise ValueError("type must be start, stream, end, error, info, or file")
|
msg = "type must be start, stream, end, error, info, or file"
|
||||||
|
raise ValueError(msg)
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -134,7 +135,8 @@ class FileResponse(ChatMessage):
|
||||||
@classmethod
|
@classmethod
|
||||||
def validate_data_type(cls, v):
|
def validate_data_type(cls, v):
|
||||||
if v not in ["image", "csv"]:
|
if v not in ["image", "csv"]:
|
||||||
raise ValueError("data_type must be image or csv")
|
msg = "data_type must be image or csv"
|
||||||
|
raise ValueError(msg)
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,9 +67,11 @@ class LCAgentComponent(Component):
|
||||||
output_names = [output.name for output in self.outputs]
|
output_names = [output.name for output in self.outputs]
|
||||||
for method_name in required_output_methods:
|
for method_name in required_output_methods:
|
||||||
if method_name not in output_names:
|
if method_name not in output_names:
|
||||||
raise ValueError(f"Output with name '{method_name}' must be defined.")
|
msg = f"Output with name '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
elif not hasattr(self, method_name):
|
elif not hasattr(self, method_name):
|
||||||
raise ValueError(f"Method '{method_name}' must be defined.")
|
msg = f"Method '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def get_agent_kwargs(self, flatten: bool = False) -> dict:
|
def get_agent_kwargs(self, flatten: bool = False) -> dict:
|
||||||
base = {
|
base = {
|
||||||
|
|
@ -102,7 +104,8 @@ class LCAgentComponent(Component):
|
||||||
)
|
)
|
||||||
self.status = result
|
self.status = result
|
||||||
if "output" not in result:
|
if "output" not in result:
|
||||||
raise ValueError("Output key not found in result. Tried 'output'.")
|
msg = "Output key not found in result. Tried 'output'."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
return cast(str, result.get("output"))
|
return cast(str, result.get("output"))
|
||||||
|
|
||||||
|
|
@ -148,7 +151,8 @@ class LCToolsAgentComponent(LCAgentComponent):
|
||||||
)
|
)
|
||||||
self.status = result
|
self.status = result
|
||||||
if "output" not in result:
|
if "output" not in result:
|
||||||
raise ValueError("Output key not found in result. Tried 'output'.")
|
msg = "Output key not found in result. Tried 'output'."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
return cast(str, result.get("output"))
|
return cast(str, result.get("output"))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,8 @@ class BaseCrewComponent(Component):
|
||||||
return self.tasks, self.agents
|
return self.tasks, self.agents
|
||||||
|
|
||||||
def build_crew(self) -> Crew:
|
def build_crew(self) -> Crew:
|
||||||
raise NotImplementedError("build_crew must be implemented in subclasses")
|
msg = "build_crew must be implemented in subclasses"
|
||||||
|
raise NotImplementedError(msg)
|
||||||
|
|
||||||
def get_task_callback(
|
def get_task_callback(
|
||||||
self,
|
self,
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,8 @@ class LCChainComponent(Component):
|
||||||
output_names = [output.name for output in self.outputs]
|
output_names = [output.name for output in self.outputs]
|
||||||
for method_name in required_output_methods:
|
for method_name in required_output_methods:
|
||||||
if method_name not in output_names:
|
if method_name not in output_names:
|
||||||
raise ValueError(f"Output with name '{method_name}' must be defined.")
|
msg = f"Output with name '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
elif not hasattr(self, method_name):
|
elif not hasattr(self, method_name):
|
||||||
raise ValueError(f"Method '{method_name}' must be defined.")
|
msg = f"Method '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,8 @@ def parse_curl_command(curl_command):
|
||||||
tokens = shlex.split(normalize_newlines(curl_command))
|
tokens = shlex.split(normalize_newlines(curl_command))
|
||||||
tokens = [token for token in tokens if token and token != " "]
|
tokens = [token for token in tokens if token and token != " "]
|
||||||
if tokens and "curl" not in tokens[0]:
|
if tokens and "curl" not in tokens[0]:
|
||||||
raise ValueError("Invalid curl command")
|
msg = "Invalid curl command"
|
||||||
|
raise ValueError(msg)
|
||||||
args_template = {
|
args_template = {
|
||||||
"command": None,
|
"command": None,
|
||||||
"url": None,
|
"url": None,
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,8 @@ def retrieve_file_paths(
|
||||||
) -> list[str]:
|
) -> list[str]:
|
||||||
path_obj = Path(path)
|
path_obj = Path(path)
|
||||||
if not path_obj.exists() or not path_obj.is_dir():
|
if not path_obj.exists() or not path_obj.is_dir():
|
||||||
raise ValueError(f"Path {path} must exist and be a directory.")
|
msg = f"Path {path} must exist and be a directory."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def match_types(p: Path) -> bool:
|
def match_types(p: Path) -> bool:
|
||||||
return any(p.suffix == f".{t}" for t in types) if types else True
|
return any(p.suffix == f".{t}" for t in types) if types else True
|
||||||
|
|
@ -83,7 +84,8 @@ def partition_file_to_data(file_path: str, silent_errors: bool) -> Data | None:
|
||||||
elements = partition(file_path)
|
elements = partition(file_path)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if not silent_errors:
|
if not silent_errors:
|
||||||
raise ValueError(f"Error loading file {file_path}: {e}") from e
|
msg = f"Error loading file {file_path}: {e}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Create a Data
|
# Create a Data
|
||||||
|
|
@ -147,7 +149,8 @@ def parse_text_file_to_data(file_path: str, silent_errors: bool) -> Data | None:
|
||||||
text = ET.tostring(xml_element, encoding="unicode")
|
text = ET.tostring(xml_element, encoding="unicode")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if not silent_errors:
|
if not silent_errors:
|
||||||
raise ValueError(f"Error loading file {file_path}: {e}") from e
|
msg = f"Error loading file {file_path}: {e}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
return None
|
return None
|
||||||
|
|
||||||
record = Data(data={"file_path": file_path, "text": text})
|
record = Data(data={"file_path": file_path, "text": text})
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,12 @@ class LCEmbeddingsModel(Component):
|
||||||
output_names = [output.name for output in self.outputs]
|
output_names = [output.name for output in self.outputs]
|
||||||
for method_name in required_output_methods:
|
for method_name in required_output_methods:
|
||||||
if method_name not in output_names:
|
if method_name not in output_names:
|
||||||
raise ValueError(f"Output with name '{method_name}' must be defined.")
|
msg = f"Output with name '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
elif not hasattr(self, method_name):
|
elif not hasattr(self, method_name):
|
||||||
raise ValueError(f"Method '{method_name}' must be defined.")
|
msg = f"Method '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def build_embeddings(self) -> Embeddings:
|
def build_embeddings(self) -> Embeddings:
|
||||||
raise NotImplementedError("You must implement the build_embeddings method in your class.")
|
msg = "You must implement the build_embeddings method in your class."
|
||||||
|
raise NotImplementedError(msg)
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,8 @@ class ChatComponent(Component):
|
||||||
flow_id=self.graph.flow_id,
|
flow_id=self.graph.flow_id,
|
||||||
)
|
)
|
||||||
if len(messages) > 1:
|
if len(messages) > 1:
|
||||||
raise ValueError("Only one message can be stored at a time.")
|
msg = "Only one message can be stored at a time."
|
||||||
|
raise ValueError(msg)
|
||||||
stored_message = messages[0]
|
stored_message = messages[0]
|
||||||
if hasattr(self, "_event_manager") and self._event_manager and stored_message.id:
|
if hasattr(self, "_event_manager") and self._event_manager and stored_message.id:
|
||||||
if not isinstance(message.text, str):
|
if not isinstance(message.text, str):
|
||||||
|
|
@ -55,7 +56,8 @@ class ChatComponent(Component):
|
||||||
def _stream_message(self, message: Message, message_id: str) -> str:
|
def _stream_message(self, message: Message, message_id: str) -> str:
|
||||||
iterator = message.text
|
iterator = message.text
|
||||||
if not isinstance(iterator, AsyncIterator | Iterator):
|
if not isinstance(iterator, AsyncIterator | Iterator):
|
||||||
raise ValueError("The message must be an iterator or an async iterator.")
|
msg = "The message must be an iterator or an async iterator."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if isinstance(iterator, AsyncIterator):
|
if isinstance(iterator, AsyncIterator):
|
||||||
return run_until_complete(self._handle_async_iterator(iterator, message, message_id))
|
return run_until_complete(self._handle_async_iterator(iterator, message, message_id))
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,11 @@ class LCToolComponent(Component):
|
||||||
output_names = [output.name for output in self.outputs]
|
output_names = [output.name for output in self.outputs]
|
||||||
for method_name in required_output_methods:
|
for method_name in required_output_methods:
|
||||||
if method_name not in output_names:
|
if method_name not in output_names:
|
||||||
raise ValueError(f"Output with name '{method_name}' must be defined.")
|
msg = f"Output with name '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
elif not hasattr(self, method_name):
|
elif not hasattr(self, method_name):
|
||||||
raise ValueError(f"Method '{method_name}' must be defined.")
|
msg = f"Method '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def run_model(self) -> Data | list[Data]:
|
def run_model(self) -> Data | list[Data]:
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,11 @@ class LCChatMemoryComponent(Component):
|
||||||
output_names = [output.name for output in self.outputs]
|
output_names = [output.name for output in self.outputs]
|
||||||
for method_name in required_output_methods:
|
for method_name in required_output_methods:
|
||||||
if method_name not in output_names:
|
if method_name not in output_names:
|
||||||
raise ValueError(f"Output with name '{method_name}' must be defined.")
|
msg = f"Output with name '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
elif not hasattr(self, method_name):
|
elif not hasattr(self, method_name):
|
||||||
raise ValueError(f"Method '{method_name}' must be defined.")
|
msg = f"Method '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def build_base_memory(self) -> BaseChatMemory:
|
def build_base_memory(self) -> BaseChatMemory:
|
||||||
return ConversationBufferMemory(chat_memory=self.build_message_history())
|
return ConversationBufferMemory(chat_memory=self.build_message_history())
|
||||||
|
|
|
||||||
|
|
@ -48,9 +48,11 @@ class LCModelComponent(Component):
|
||||||
output_names = [output.name for output in self.outputs]
|
output_names = [output.name for output in self.outputs]
|
||||||
for method_name in required_output_methods:
|
for method_name in required_output_methods:
|
||||||
if method_name not in output_names:
|
if method_name not in output_names:
|
||||||
raise ValueError(f"Output with name '{method_name}' must be defined.")
|
msg = f"Output with name '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
elif not hasattr(self, method_name):
|
elif not hasattr(self, method_name):
|
||||||
raise ValueError(f"Method '{method_name}' must be defined.")
|
msg = f"Method '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def text_response(self) -> Message:
|
def text_response(self) -> Message:
|
||||||
input_value = self.input_value
|
input_value = self.input_value
|
||||||
|
|
@ -145,7 +147,8 @@ class LCModelComponent(Component):
|
||||||
):
|
):
|
||||||
messages: list[BaseMessage] = []
|
messages: list[BaseMessage] = []
|
||||||
if not input_value and not system_message:
|
if not input_value and not system_message:
|
||||||
raise ValueError("The message you want to send to the model is empty.")
|
msg = "The message you want to send to the model is empty."
|
||||||
|
raise ValueError(msg)
|
||||||
system_message_added = False
|
system_message_added = False
|
||||||
if input_value:
|
if input_value:
|
||||||
if isinstance(input_value, Message):
|
if isinstance(input_value, Message):
|
||||||
|
|
|
||||||
|
|
@ -127,14 +127,16 @@ def validate_prompt(prompt_template: str, silent_errors: bool = False) -> list[s
|
||||||
# Check if there are invalid characters in the input_variables
|
# Check if there are invalid characters in the input_variables
|
||||||
input_variables = _check_input_variables(input_variables)
|
input_variables = _check_input_variables(input_variables)
|
||||||
if any(var in _INVALID_NAMES for var in input_variables):
|
if any(var in _INVALID_NAMES for var in input_variables):
|
||||||
raise ValueError(f"Invalid input variables. None of the variables can be named {', '.join(input_variables)}. ")
|
msg = f"Invalid input variables. None of the variables can be named {', '.join(input_variables)}. "
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
PromptTemplate(template=prompt_template, input_variables=input_variables)
|
PromptTemplate(template=prompt_template, input_variables=input_variables)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error(f"Invalid prompt: {exc}")
|
logger.error(f"Invalid prompt: {exc}")
|
||||||
if not silent_errors:
|
if not silent_errors:
|
||||||
raise ValueError(f"Invalid prompt: {exc}") from exc
|
msg = f"Invalid prompt: {exc}"
|
||||||
|
raise ValueError(msg) from exc
|
||||||
|
|
||||||
return input_variables
|
return input_variables
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,11 @@ class LCTextSplitterComponent(LCDocumentTransformerComponent):
|
||||||
output_names = [output.name for output in self.outputs]
|
output_names = [output.name for output in self.outputs]
|
||||||
for method_name in required_output_methods:
|
for method_name in required_output_methods:
|
||||||
if method_name not in output_names:
|
if method_name not in output_names:
|
||||||
raise ValueError(f"Output with name '{method_name}' must be defined.")
|
msg = f"Output with name '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
elif not hasattr(self, method_name):
|
elif not hasattr(self, method_name):
|
||||||
raise ValueError(f"Method '{method_name}' must be defined.")
|
msg = f"Method '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def build_document_transformer(self) -> BaseDocumentTransformer:
|
def build_document_transformer(self) -> BaseDocumentTransformer:
|
||||||
return self.build_text_splitter()
|
return self.build_text_splitter()
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,8 @@ class ComponentTool(BaseTool):
|
||||||
results, _ = self.component(**kwargs)
|
results, _ = self.component(**kwargs)
|
||||||
return results
|
return results
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ToolException(f"Error running {self.name}: {e}")
|
msg = f"Error running {self.name}: {e}"
|
||||||
|
raise ToolException(msg)
|
||||||
|
|
||||||
|
|
||||||
ComponentTool.update_forward_refs()
|
ComponentTool.update_forward_refs()
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,8 @@ class FlowTool(BaseTool):
|
||||||
elif self.graph is not None:
|
elif self.graph is not None:
|
||||||
return build_schema_from_inputs(self.name, get_flow_inputs(self.graph))
|
return build_schema_from_inputs(self.name, get_flow_inputs(self.graph))
|
||||||
else:
|
else:
|
||||||
raise ToolException("No input schema available.")
|
msg = "No input schema available."
|
||||||
|
raise ToolException(msg)
|
||||||
|
|
||||||
def _run(
|
def _run(
|
||||||
self,
|
self,
|
||||||
|
|
@ -45,9 +46,8 @@ class FlowTool(BaseTool):
|
||||||
if len(args_names) == len(args):
|
if len(args_names) == len(args):
|
||||||
kwargs = {arg["arg_name"]: arg_value for arg, arg_value in zip(args_names, args)}
|
kwargs = {arg["arg_name"]: arg_value for arg, arg_value in zip(args_names, args)}
|
||||||
elif len(args_names) != len(args) and len(args) != 0:
|
elif len(args_names) != len(args) and len(args) != 0:
|
||||||
raise ToolException(
|
msg = "Number of arguments does not match the number of inputs. Pass keyword arguments instead."
|
||||||
"Number of arguments does not match the number of inputs. Pass keyword arguments instead."
|
raise ToolException(msg)
|
||||||
)
|
|
||||||
tweaks = {arg["component_name"]: kwargs[arg["arg_name"]] for arg in args_names}
|
tweaks = {arg["component_name"]: kwargs[arg["arg_name"]] for arg in args_names}
|
||||||
|
|
||||||
run_outputs = run_until_complete(
|
run_outputs = run_until_complete(
|
||||||
|
|
@ -72,16 +72,16 @@ class FlowTool(BaseTool):
|
||||||
"""Validate the inputs."""
|
"""Validate the inputs."""
|
||||||
|
|
||||||
if len(args) > 0 and len(args) != len(args_names):
|
if len(args) > 0 and len(args) != len(args_names):
|
||||||
raise ToolException(
|
msg = "Number of positional arguments does not match the number of inputs. Pass keyword arguments instead."
|
||||||
"Number of positional arguments does not match the number of inputs. Pass keyword arguments instead."
|
raise ToolException(msg)
|
||||||
)
|
|
||||||
|
|
||||||
if len(args) == len(args_names):
|
if len(args) == len(args_names):
|
||||||
kwargs = {arg_name["arg_name"]: arg_value for arg_name, arg_value in zip(args_names, args)}
|
kwargs = {arg_name["arg_name"]: arg_value for arg_name, arg_value in zip(args_names, args)}
|
||||||
|
|
||||||
missing_args = [arg["arg_name"] for arg in args_names if arg["arg_name"] not in kwargs]
|
missing_args = [arg["arg_name"] for arg in args_names if arg["arg_name"] not in kwargs]
|
||||||
if missing_args:
|
if missing_args:
|
||||||
raise ToolException(f"Missing required arguments: {', '.join(missing_args)}")
|
msg = f"Missing required arguments: {', '.join(missing_args)}"
|
||||||
|
raise ToolException(msg)
|
||||||
|
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,10 +47,11 @@ class LCVectorStoreComponent(Component):
|
||||||
if hasattr(cls, "build_vector_store"):
|
if hasattr(cls, "build_vector_store"):
|
||||||
method = cls.build_vector_store
|
method = cls.build_vector_store
|
||||||
if not hasattr(method, "_is_cached_vector_store_checked"):
|
if not hasattr(method, "_is_cached_vector_store_checked"):
|
||||||
raise TypeError(
|
msg = (
|
||||||
f"The method 'build_vector_store' in class {cls.__name__} "
|
f"The method 'build_vector_store' in class {cls.__name__} "
|
||||||
"must be decorated with @check_cached_vector_store"
|
"must be decorated with @check_cached_vector_store"
|
||||||
)
|
)
|
||||||
|
raise TypeError(msg)
|
||||||
|
|
||||||
trace_type = "retriever"
|
trace_type = "retriever"
|
||||||
outputs = [
|
outputs = [
|
||||||
|
|
@ -81,9 +82,11 @@ class LCVectorStoreComponent(Component):
|
||||||
output_names = [output.name for output in self.outputs]
|
output_names = [output.name for output in self.outputs]
|
||||||
for method_name in required_output_methods:
|
for method_name in required_output_methods:
|
||||||
if method_name not in output_names:
|
if method_name not in output_names:
|
||||||
raise ValueError(f"Output with name '{method_name}' must be defined.")
|
msg = f"Output with name '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
elif not hasattr(self, method_name):
|
elif not hasattr(self, method_name):
|
||||||
raise ValueError(f"Method '{method_name}' must be defined.")
|
msg = f"Method '{method_name}' must be defined."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def search_with_vector_store(
|
def search_with_vector_store(
|
||||||
self,
|
self,
|
||||||
|
|
@ -112,7 +115,8 @@ class LCVectorStoreComponent(Component):
|
||||||
if input_value and isinstance(input_value, str) and hasattr(vector_store, "search"):
|
if input_value and isinstance(input_value, str) and hasattr(vector_store, "search"):
|
||||||
docs = vector_store.search(query=input_value, search_type=search_type.lower(), k=k, **kwargs)
|
docs = vector_store.search(query=input_value, search_type=search_type.lower(), k=k, **kwargs)
|
||||||
else:
|
else:
|
||||||
raise ValueError("Invalid inputs provided.")
|
msg = "Invalid inputs provided."
|
||||||
|
raise ValueError(msg)
|
||||||
data = docs_to_data(docs)
|
data = docs_to_data(docs)
|
||||||
self.status = data
|
self.status = data
|
||||||
return data
|
return data
|
||||||
|
|
@ -136,7 +140,8 @@ class LCVectorStoreComponent(Component):
|
||||||
self.status = "Retriever built successfully."
|
self.status = "Retriever built successfully."
|
||||||
return retriever
|
return retriever
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Vector Store {vector_store.__class__.__name__} does not have an as_retriever method.")
|
msg = f"Vector Store {vector_store.__class__.__name__} does not have an as_retriever method."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def search_documents(self) -> list[Data]:
|
def search_documents(self) -> list[Data]:
|
||||||
"""
|
"""
|
||||||
|
|
@ -175,4 +180,5 @@ class LCVectorStoreComponent(Component):
|
||||||
"""
|
"""
|
||||||
Builds the Vector Store object.
|
Builds the Vector Store object.
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError("build_vector_store method must be implemented.")
|
msg = "build_vector_store method must be implemented."
|
||||||
|
raise NotImplementedError(msg)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,8 @@ class OpenAIToolsAgentComponent(LCToolsAgentComponent):
|
||||||
|
|
||||||
def create_agent_runnable(self):
|
def create_agent_runnable(self):
|
||||||
if "input" not in self.user_prompt:
|
if "input" not in self.user_prompt:
|
||||||
raise ValueError("Prompt must contain 'input' key.")
|
msg = "Prompt must contain 'input' key."
|
||||||
|
raise ValueError(msg)
|
||||||
messages = [
|
messages = [
|
||||||
("system", self.system_prompt),
|
("system", self.system_prompt),
|
||||||
("placeholder", "{chat_history}"),
|
("placeholder", "{chat_history}"),
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,8 @@ class ToolCallingAgentComponent(LCToolsAgentComponent):
|
||||||
|
|
||||||
def create_agent_runnable(self):
|
def create_agent_runnable(self):
|
||||||
if "input" not in self.user_prompt:
|
if "input" not in self.user_prompt:
|
||||||
raise ValueError("Prompt must contain 'input' key.")
|
msg = "Prompt must contain 'input' key."
|
||||||
|
raise ValueError(msg)
|
||||||
messages = [
|
messages = [
|
||||||
("system", self.system_prompt),
|
("system", self.system_prompt),
|
||||||
("placeholder", "{chat_history}"),
|
("placeholder", "{chat_history}"),
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,8 @@ Question: {input}
|
||||||
|
|
||||||
def create_agent_runnable(self):
|
def create_agent_runnable(self):
|
||||||
if "input" not in self.user_prompt:
|
if "input" not in self.user_prompt:
|
||||||
raise ValueError("Prompt must contain 'input' key.")
|
msg = "Prompt must contain 'input' key."
|
||||||
|
raise ValueError(msg)
|
||||||
messages = [
|
messages = [
|
||||||
("system", self.system_prompt),
|
("system", self.system_prompt),
|
||||||
("placeholder", "{chat_history}"),
|
("placeholder", "{chat_history}"),
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,8 @@ class GetEnvVar(Component):
|
||||||
|
|
||||||
def process_inputs(self) -> Message:
|
def process_inputs(self) -> Message:
|
||||||
if self.env_var_name not in os.environ:
|
if self.env_var_name not in os.environ:
|
||||||
raise Exception(f"Environment variable {self.env_var_name} not set")
|
msg = f"Environment variable {self.env_var_name} not set"
|
||||||
|
raise Exception(msg)
|
||||||
else:
|
else:
|
||||||
message = Message(text=os.environ[self.env_var_name])
|
message = Message(text=os.environ[self.env_var_name])
|
||||||
return message
|
return message
|
||||||
|
|
|
||||||
|
|
@ -92,4 +92,5 @@ class AssistantsRun(Component):
|
||||||
return message
|
return message
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
raise Exception(f"Error running assistant: {e}")
|
msg = f"Error running assistant: {e}"
|
||||||
|
raise Exception(msg)
|
||||||
|
|
|
||||||
|
|
@ -34,14 +34,16 @@ class SQLGeneratorComponent(LCChainComponent):
|
||||||
prompt_template = None
|
prompt_template = None
|
||||||
|
|
||||||
if self.top_k < 1:
|
if self.top_k < 1:
|
||||||
raise ValueError("Top K must be greater than 0.")
|
msg = "Top K must be greater than 0."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if not prompt_template:
|
if not prompt_template:
|
||||||
sql_query_chain = create_sql_query_chain(llm=self.llm, db=self.db, k=self.top_k)
|
sql_query_chain = create_sql_query_chain(llm=self.llm, db=self.db, k=self.top_k)
|
||||||
else:
|
else:
|
||||||
# Check if {question} is in the prompt
|
# Check if {question} is in the prompt
|
||||||
if "{question}" not in prompt_template.template or "question" not in prompt_template.input_variables:
|
if "{question}" not in prompt_template.template or "question" not in prompt_template.input_variables:
|
||||||
raise ValueError("Prompt must contain `{question}` to be used with Natural Language to SQL.")
|
msg = "Prompt must contain `{question}` to be used with Natural Language to SQL."
|
||||||
|
raise ValueError(msg)
|
||||||
sql_query_chain = create_sql_query_chain(llm=self.llm, db=self.db, prompt=prompt_template, k=self.top_k)
|
sql_query_chain = create_sql_query_chain(llm=self.llm, db=self.db, prompt=prompt_template, k=self.top_k)
|
||||||
query_writer: Runnable = sql_query_chain | {"query": lambda x: x.replace("SQLQuery:", "").strip()}
|
query_writer: Runnable = sql_query_chain | {"query": lambda x: x.replace("SQLQuery:", "").strip()}
|
||||||
response = query_writer.invoke(
|
response = query_writer.invoke(
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,8 @@ class APIRequestComponent(Component):
|
||||||
build_config["body"]["value"] = {}
|
build_config["body"]["value"] = {}
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error(f"Error parsing curl: {exc}")
|
logger.error(f"Error parsing curl: {exc}")
|
||||||
raise ValueError(f"Error parsing curl: {exc}")
|
msg = f"Error parsing curl: {exc}"
|
||||||
|
raise ValueError(msg)
|
||||||
return build_config
|
return build_config
|
||||||
|
|
||||||
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
||||||
|
|
@ -112,7 +113,8 @@ class APIRequestComponent(Component):
|
||||||
) -> Data:
|
) -> Data:
|
||||||
method = method.upper()
|
method = method.upper()
|
||||||
if method not in ["GET", "POST", "PATCH", "PUT", "DELETE"]:
|
if method not in ["GET", "POST", "PATCH", "PUT", "DELETE"]:
|
||||||
raise ValueError(f"Unsupported method: {method}")
|
msg = f"Unsupported method: {method}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if isinstance(body, str) and body:
|
if isinstance(body, str) and body:
|
||||||
try:
|
try:
|
||||||
|
|
@ -120,7 +122,8 @@ class APIRequestComponent(Component):
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error decoding JSON data: {e}")
|
logger.error(f"Error decoding JSON data: {e}")
|
||||||
body = None
|
body = None
|
||||||
raise ValueError(f"Error decoding JSON data: {e}")
|
msg = f"Error decoding JSON data: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
data = body if body else None
|
data = body if body else None
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,16 +33,19 @@ class FileComponent(Component):
|
||||||
|
|
||||||
def load_file(self) -> Data:
|
def load_file(self) -> Data:
|
||||||
if not self.path:
|
if not self.path:
|
||||||
raise ValueError("Please, upload a file to use this component.")
|
msg = "Please, upload a file to use this component."
|
||||||
|
raise ValueError(msg)
|
||||||
resolved_path = self.resolve_path(self.path)
|
resolved_path = self.resolve_path(self.path)
|
||||||
silent_errors = self.silent_errors
|
silent_errors = self.silent_errors
|
||||||
|
|
||||||
extension = Path(resolved_path).suffix[1:].lower()
|
extension = Path(resolved_path).suffix[1:].lower()
|
||||||
|
|
||||||
if extension == "doc":
|
if extension == "doc":
|
||||||
raise ValueError("doc files are not supported. Please save as .docx")
|
msg = "doc files are not supported. Please save as .docx"
|
||||||
|
raise ValueError(msg)
|
||||||
if extension not in TEXT_FILE_TYPES:
|
if extension not in TEXT_FILE_TYPES:
|
||||||
raise ValueError(f"Unsupported file type: {extension}")
|
msg = f"Unsupported file type: {extension}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
data = parse_text_file_to_data(resolved_path, silent_errors)
|
data = parse_text_file_to_data(resolved_path, silent_errors)
|
||||||
self.status = data if data else "No data"
|
self.status = data if data else "No data"
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,8 @@ class GmailLoaderComponent(Component):
|
||||||
if name == "From":
|
if name == "From":
|
||||||
from_email = values["value"]
|
from_email = values["value"]
|
||||||
if from_email is None:
|
if from_email is None:
|
||||||
raise ValueError("From email not found.")
|
msg = "From email not found."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if "parts" in msg["payload"]:
|
if "parts" in msg["payload"]:
|
||||||
parts = msg["payload"]["parts"]
|
parts = msg["payload"]["parts"]
|
||||||
|
|
@ -113,7 +114,8 @@ class GmailLoaderComponent(Component):
|
||||||
additional_kwargs={"sender": from_email},
|
additional_kwargs={"sender": from_email},
|
||||||
)
|
)
|
||||||
return message
|
return message
|
||||||
raise ValueError("No plain text part found in the email.")
|
msg = "No plain text part found in the email."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def _get_message_data(self, service: Any, message: Any) -> ChatSession:
|
def _get_message_data(self, service: Any, message: Any) -> ChatSession:
|
||||||
msg = service.users().messages().get(userId="me", id=message["id"]).execute()
|
msg = service.users().messages().get(userId="me", id=message["id"]).execute()
|
||||||
|
|
@ -141,7 +143,8 @@ class GmailLoaderComponent(Component):
|
||||||
if message_id == in_reply_to:
|
if message_id == in_reply_to:
|
||||||
response_email = message
|
response_email = message
|
||||||
if response_email is None:
|
if response_email is None:
|
||||||
raise ValueError("Response email not found in the thread.")
|
msg = "Response email not found in the thread."
|
||||||
|
raise ValueError(msg)
|
||||||
starter_content = self._extract_email_content(response_email)
|
starter_content = self._extract_email_content(response_email)
|
||||||
return ChatSession(messages=[starter_content, message_content])
|
return ChatSession(messages=[starter_content, message_content])
|
||||||
else:
|
else:
|
||||||
|
|
@ -172,7 +175,8 @@ class GmailLoaderComponent(Component):
|
||||||
try:
|
try:
|
||||||
token_info = json.loads(json_string)
|
token_info = json.loads(json_string)
|
||||||
except JSONDecodeError as e:
|
except JSONDecodeError as e:
|
||||||
raise ValueError("Invalid JSON string") from e
|
msg = "Invalid JSON string"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
creds = Credentials.from_authorized_user_info(token_info)
|
creds = Credentials.from_authorized_user_info(token_info)
|
||||||
|
|
||||||
|
|
@ -182,11 +186,11 @@ class GmailLoaderComponent(Component):
|
||||||
try:
|
try:
|
||||||
docs = loader.load()
|
docs = loader.load()
|
||||||
except RefreshError as e:
|
except RefreshError as e:
|
||||||
raise ValueError(
|
msg = "Authentication error: Unable to refresh authentication token. Please try to reauthenticate."
|
||||||
"Authentication error: Unable to refresh authentication token. Please try to reauthenticate."
|
raise ValueError(msg) from e
|
||||||
) from e
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error loading documents: {e}") from e
|
msg = f"Error loading documents: {e}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
# Return the loaded documents
|
# Return the loaded documents
|
||||||
self.status = docs
|
self.status = docs
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,8 @@ class GoogleDriveComponent(Component):
|
||||||
if self.creds:
|
if self.creds:
|
||||||
return self.creds
|
return self.creds
|
||||||
else:
|
else:
|
||||||
raise ValueError("No credentials provided.")
|
msg = "No credentials provided."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
arbitrary_types_allowed = True
|
arbitrary_types_allowed = True
|
||||||
|
|
@ -53,7 +54,8 @@ class GoogleDriveComponent(Component):
|
||||||
|
|
||||||
document_ids = [self.document_id]
|
document_ids = [self.document_id]
|
||||||
if len(document_ids) != 1:
|
if len(document_ids) != 1:
|
||||||
raise ValueError("Expected a single document ID")
|
msg = "Expected a single document ID"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
# TODO: Add validation to check if the document ID is valid
|
# TODO: Add validation to check if the document ID is valid
|
||||||
|
|
||||||
|
|
@ -61,7 +63,8 @@ class GoogleDriveComponent(Component):
|
||||||
try:
|
try:
|
||||||
token_info = json.loads(json_string)
|
token_info = json.loads(json_string)
|
||||||
except JSONDecodeError as e:
|
except JSONDecodeError as e:
|
||||||
raise ValueError("Invalid JSON string") from e
|
msg = "Invalid JSON string"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
# Initialize the custom loader with the provided credentials and document IDs
|
# Initialize the custom loader with the provided credentials and document IDs
|
||||||
loader = CustomGoogleDriveLoader(
|
loader = CustomGoogleDriveLoader(
|
||||||
|
|
@ -73,11 +76,11 @@ class GoogleDriveComponent(Component):
|
||||||
docs = loader.load()
|
docs = loader.load()
|
||||||
# catch google.auth.exceptions.RefreshError
|
# catch google.auth.exceptions.RefreshError
|
||||||
except RefreshError as e:
|
except RefreshError as e:
|
||||||
raise ValueError(
|
msg = "Authentication error: Unable to refresh authentication token. Please try to reauthenticate."
|
||||||
"Authentication error: Unable to refresh authentication token. Please try to reauthenticate."
|
raise ValueError(msg) from e
|
||||||
) from e
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error loading documents: {e}") from e
|
msg = f"Error loading documents: {e}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
assert len(docs) == 1, "Expected a single document to be loaded."
|
assert len(docs) == 1, "Expected a single document to be loaded."
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,8 @@ class URLComponent(Component):
|
||||||
)
|
)
|
||||||
|
|
||||||
if not url_regex.match(string):
|
if not url_regex.match(string):
|
||||||
raise ValueError(f"Invalid URL: {string}")
|
msg = f"Invalid URL: {string}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
return string
|
return string
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -125,9 +125,8 @@ class ChatLiteLLMModelComponent(LCModelComponent):
|
||||||
litellm.drop_params = True
|
litellm.drop_params = True
|
||||||
litellm.set_verbose = self.verbose
|
litellm.set_verbose = self.verbose
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ChatLiteLLMException(
|
msg = "Could not import litellm python package. " "Please install it with `pip install litellm`"
|
||||||
"Could not import litellm python package. " "Please install it with `pip install litellm`"
|
raise ChatLiteLLMException(msg)
|
||||||
)
|
|
||||||
# Remove empty keys
|
# Remove empty keys
|
||||||
if "" in self.kwargs:
|
if "" in self.kwargs:
|
||||||
del self.kwargs[""]
|
del self.kwargs[""]
|
||||||
|
|
@ -136,9 +135,11 @@ class ChatLiteLLMModelComponent(LCModelComponent):
|
||||||
# Report missing fields for Azure provider
|
# Report missing fields for Azure provider
|
||||||
if self.provider == "Azure":
|
if self.provider == "Azure":
|
||||||
if "api_base" not in self.kwargs:
|
if "api_base" not in self.kwargs:
|
||||||
raise Exception("Missing api_base on kwargs")
|
msg = "Missing api_base on kwargs"
|
||||||
|
raise Exception(msg)
|
||||||
if "api_version" not in self.model_kwargs:
|
if "api_version" not in self.model_kwargs:
|
||||||
raise Exception("Missing api_version on model_kwargs")
|
msg = "Missing api_version on model_kwargs"
|
||||||
|
raise Exception(msg)
|
||||||
output = ChatLiteLLM(
|
output = ChatLiteLLM(
|
||||||
model=f"{self.provider.lower()}/{self.model}",
|
model=f"{self.provider.lower()}/{self.model}",
|
||||||
client=None,
|
client=None,
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,8 @@ class ExtractKeyFromDataComponent(CustomComponent):
|
||||||
extracted_keys[key] = getattr(data, key)
|
extracted_keys[key] = getattr(data, key)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
if not silent_error:
|
if not silent_error:
|
||||||
raise KeyError(f"The key '{key}' does not exist in the data.")
|
msg = f"The key '{key}' does not exist in the data."
|
||||||
|
raise KeyError(msg)
|
||||||
return_data = Data(data=extracted_keys)
|
return_data = Data(data=extracted_keys)
|
||||||
self.status = return_data
|
self.status = return_data
|
||||||
return return_data
|
return return_data
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,8 @@ class SubFlowComponent(CustomComponent):
|
||||||
try:
|
try:
|
||||||
flow_data = self.get_flow(field_value)
|
flow_data = self.get_flow(field_value)
|
||||||
if not flow_data:
|
if not flow_data:
|
||||||
raise ValueError(f"Flow {field_value} not found.")
|
msg = f"Flow {field_value} not found."
|
||||||
|
raise ValueError(msg)
|
||||||
graph = Graph.from_payload(flow_data.data["data"])
|
graph = Graph.from_payload(flow_data.data["data"])
|
||||||
# Get all inputs from the graph
|
# Get all inputs from the graph
|
||||||
inputs = get_flow_inputs(graph)
|
inputs = get_flow_inputs(graph)
|
||||||
|
|
|
||||||
|
|
@ -164,7 +164,8 @@ class AssemblyAILeMUR(Component):
|
||||||
max_output_size=self.max_output_size,
|
max_output_size=self.max_output_size,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Endpoint not supported: {endpoint}")
|
msg = f"Endpoint not supported: {endpoint}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
return result.dict()
|
return result.dict()
|
||||||
|
|
||||||
|
|
@ -178,4 +179,5 @@ class AssemblyAILeMUR(Component):
|
||||||
elif model_name == "claude3_sonnet":
|
elif model_name == "claude3_sonnet":
|
||||||
return aai.LemurModel.claude3_sonnet
|
return aai.LemurModel.claude3_sonnet
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Model name not supported: {model_name}")
|
msg = f"Model name not supported: {model_name}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,7 @@ class AzureOpenAIEmbeddingsComponent(LCModelComponent):
|
||||||
dimensions=self.dimensions or None,
|
dimensions=self.dimensions or None,
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Could not connect to AzureOpenAIEmbeddings API: {str(e)}") from e
|
msg = f"Could not connect to AzureOpenAIEmbeddings API: {str(e)}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
return embeddings
|
return embeddings
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,8 @@ class GoogleGenerativeAIEmbeddingsComponent(Component):
|
||||||
|
|
||||||
def build_embeddings(self) -> Embeddings:
|
def build_embeddings(self) -> Embeddings:
|
||||||
if not self.api_key:
|
if not self.api_key:
|
||||||
raise ValueError("API Key is required")
|
msg = "API Key is required"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
class HotaGoogleGenerativeAIEmbeddings(GoogleGenerativeAIEmbeddings):
|
class HotaGoogleGenerativeAIEmbeddings(GoogleGenerativeAIEmbeddings):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
|
@ -85,7 +86,8 @@ class GoogleGenerativeAIEmbeddingsComponent(Component):
|
||||||
BatchEmbedContentsRequest(requests=requests, model=self.model)
|
BatchEmbedContentsRequest(requests=requests, model=self.model)
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise GoogleGenerativeAIError(f"Error embedding content: {e}") from e
|
msg = f"Error embedding content: {e}"
|
||||||
|
raise GoogleGenerativeAIError(msg) from e
|
||||||
embeddings.extend([list(np.pad(e.values, (0, 768), "constant")) for e in result.embeddings])
|
embeddings.extend([list(np.pad(e.values, (0, 768), "constant")) for e in result.embeddings])
|
||||||
return embeddings
|
return embeddings
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -46,22 +46,25 @@ class HuggingFaceInferenceAPIEmbeddingsComponent(LCEmbeddingsModel):
|
||||||
def validate_inference_endpoint(self, inference_endpoint: str) -> bool:
|
def validate_inference_endpoint(self, inference_endpoint: str) -> bool:
|
||||||
parsed_url = urlparse(inference_endpoint)
|
parsed_url = urlparse(inference_endpoint)
|
||||||
if not all([parsed_url.scheme, parsed_url.netloc]):
|
if not all([parsed_url.scheme, parsed_url.netloc]):
|
||||||
raise ValueError(
|
msg = (
|
||||||
f"Invalid inference endpoint format: '{self.inference_endpoint}'. "
|
f"Invalid inference endpoint format: '{self.inference_endpoint}'. "
|
||||||
"Please ensure the URL includes both a scheme (e.g., 'http://' or 'https://') and a domain name. "
|
"Please ensure the URL includes both a scheme (e.g., 'http://' or 'https://') and a domain name. "
|
||||||
"Example: 'http://localhost:8080' or 'https://api.example.com'"
|
"Example: 'http://localhost:8080' or 'https://api.example.com'"
|
||||||
)
|
)
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = requests.get(f"{inference_endpoint}/health", timeout=5)
|
response = requests.get(f"{inference_endpoint}/health", timeout=5)
|
||||||
except requests.RequestException:
|
except requests.RequestException:
|
||||||
raise ValueError(
|
msg = (
|
||||||
f"Inference endpoint '{inference_endpoint}' is not responding. "
|
f"Inference endpoint '{inference_endpoint}' is not responding. "
|
||||||
"Please ensure the URL is correct and the service is running."
|
"Please ensure the URL is correct and the service is running."
|
||||||
)
|
)
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if response.status_code != 200:
|
if response.status_code != 200:
|
||||||
raise ValueError(f"HuggingFace health check failed: {response.status_code}")
|
msg = f"HuggingFace health check failed: {response.status_code}"
|
||||||
|
raise ValueError(msg)
|
||||||
# returning True to solve linting error
|
# returning True to solve linting error
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
@ -86,11 +89,13 @@ class HuggingFaceInferenceAPIEmbeddingsComponent(LCEmbeddingsModel):
|
||||||
self.validate_inference_endpoint(api_url)
|
self.validate_inference_endpoint(api_url)
|
||||||
api_key = SecretStr("DummyAPIKeyForLocalDeployment")
|
api_key = SecretStr("DummyAPIKeyForLocalDeployment")
|
||||||
elif not self.api_key:
|
elif not self.api_key:
|
||||||
raise ValueError("API Key is required for non-local inference endpoints")
|
msg = "API Key is required for non-local inference endpoints"
|
||||||
|
raise ValueError(msg)
|
||||||
else:
|
else:
|
||||||
api_key = SecretStr(self.api_key)
|
api_key = SecretStr(self.api_key)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return self.create_huggingface_embeddings(api_key, api_url, self.model_name)
|
return self.create_huggingface_embeddings(api_key, api_url, self.model_name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not connect to HuggingFace Inference API.") from e
|
msg = "Could not connect to HuggingFace Inference API."
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,8 @@ class MistralAIEmbeddingsComponent(LCModelComponent):
|
||||||
|
|
||||||
def build_embeddings(self) -> Embeddings:
|
def build_embeddings(self) -> Embeddings:
|
||||||
if not self.mistral_api_key:
|
if not self.mistral_api_key:
|
||||||
raise ValueError("Mistral API Key is required")
|
msg = "Mistral API Key is required"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
api_key = SecretStr(self.mistral_api_key)
|
api_key = SecretStr(self.mistral_api_key)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,14 +51,16 @@ class NVIDIAEmbeddingsComponent(LCEmbeddingsModel):
|
||||||
build_config["model"]["options"] = ids
|
build_config["model"]["options"] = ids
|
||||||
build_config["model"]["value"] = ids[0]
|
build_config["model"]["value"] = ids[0]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error getting model names: {e}")
|
msg = f"Error getting model names: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
return build_config
|
return build_config
|
||||||
|
|
||||||
def build_embeddings(self) -> Embeddings:
|
def build_embeddings(self) -> Embeddings:
|
||||||
try:
|
try:
|
||||||
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings
|
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError("Please install langchain-nvidia-ai-endpoints to use the Nvidia model.")
|
msg = "Please install langchain-nvidia-ai-endpoints to use the Nvidia model."
|
||||||
|
raise ImportError(msg)
|
||||||
try:
|
try:
|
||||||
output = NVIDIAEmbeddings(
|
output = NVIDIAEmbeddings(
|
||||||
model=self.model,
|
model=self.model,
|
||||||
|
|
@ -67,5 +69,6 @@ class NVIDIAEmbeddingsComponent(LCEmbeddingsModel):
|
||||||
nvidia_api_key=self.nvidia_api_key,
|
nvidia_api_key=self.nvidia_api_key,
|
||||||
) # type: ignore
|
) # type: ignore
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Could not connect to NVIDIA API. Error: {e}") from e
|
msg = f"Could not connect to NVIDIA API. Error: {e}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
return output
|
return output
|
||||||
|
|
|
||||||
|
|
@ -43,5 +43,6 @@ class OllamaEmbeddingsComponent(LCModelComponent):
|
||||||
temperature=self.temperature,
|
temperature=self.temperature,
|
||||||
) # type: ignore
|
) # type: ignore
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not connect to Ollama API.") from e
|
msg = "Could not connect to Ollama API."
|
||||||
|
raise ValueError(msg) from e
|
||||||
return output
|
return output
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,8 @@ class VertexAIEmbeddingsComponent(LCModelComponent):
|
||||||
try:
|
try:
|
||||||
from langchain_google_vertexai import VertexAIEmbeddings
|
from langchain_google_vertexai import VertexAIEmbeddings
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = "Please install the langchain-google-vertexai package to use the VertexAIEmbeddings component."
|
||||||
"Please install the langchain-google-vertexai package to use the VertexAIEmbeddings component."
|
raise ImportError(msg)
|
||||||
)
|
|
||||||
|
|
||||||
from google.oauth2 import service_account
|
from google.oauth2 import service_account
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,8 @@ class ParseJSONDataComponent(Component):
|
||||||
try:
|
try:
|
||||||
to_filter_as_dict.append(json.loads(repair_json(f)))
|
to_filter_as_dict.append(json.loads(repair_json(f)))
|
||||||
except JSONDecodeError as e:
|
except JSONDecodeError as e:
|
||||||
raise ValueError(f"Invalid JSON: {e}")
|
msg = f"Invalid JSON: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
full_filter_str = json.dumps(to_filter_as_dict)
|
full_filter_str = json.dumps(to_filter_as_dict)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,9 +57,10 @@ class FirecrawlCrawlApi(CustomComponent):
|
||||||
try:
|
try:
|
||||||
from firecrawl.firecrawl import FirecrawlApp # type: ignore
|
from firecrawl.firecrawl import FirecrawlApp # type: ignore
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = (
|
||||||
"Could not import firecrawl integration package. " "Please install it with `pip install firecrawl-py`."
|
"Could not import firecrawl integration package. " "Please install it with `pip install firecrawl-py`."
|
||||||
)
|
)
|
||||||
|
raise ImportError(msg)
|
||||||
if crawlerOptions:
|
if crawlerOptions:
|
||||||
crawler_options_dict = crawlerOptions.__dict__["data"]["text"]
|
crawler_options_dict = crawlerOptions.__dict__["data"]["text"]
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -50,9 +50,10 @@ class FirecrawlScrapeApi(CustomComponent):
|
||||||
try:
|
try:
|
||||||
from firecrawl.firecrawl import FirecrawlApp # type: ignore
|
from firecrawl.firecrawl import FirecrawlApp # type: ignore
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = (
|
||||||
"Could not import firecrawl integration package. " "Please install it with `pip install firecrawl-py`."
|
"Could not import firecrawl integration package. " "Please install it with `pip install firecrawl-py`."
|
||||||
)
|
)
|
||||||
|
raise ImportError(msg)
|
||||||
if extractorOptions:
|
if extractorOptions:
|
||||||
extractor_options_dict = extractorOptions.__dict__["data"]["text"]
|
extractor_options_dict = extractorOptions.__dict__["data"]["text"]
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ class JSONDocumentBuilder(CustomComponent):
|
||||||
elif isinstance(document, Document):
|
elif isinstance(document, Document):
|
||||||
documents = Document(page_content=orjson_dumps({key: document.page_content}, indent_2=False))
|
documents = Document(page_content=orjson_dumps({key: document.page_content}, indent_2=False))
|
||||||
else:
|
else:
|
||||||
raise TypeError(f"Expected Document or list of Documents, got {type(document)}")
|
msg = f"Expected Document or list of Documents, got {type(document)}"
|
||||||
|
raise TypeError(msg)
|
||||||
self.repr_value = documents
|
self.repr_value = documents
|
||||||
return documents
|
return documents
|
||||||
|
|
|
||||||
|
|
@ -110,9 +110,11 @@ class SpiderTool(Component):
|
||||||
elif self.mode == "crawl":
|
elif self.mode == "crawl":
|
||||||
result = app.crawl_url(self.url, parameters)
|
result = app.crawl_url(self.url, parameters)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Invalid mode: {self.mode}. Must be 'scrape' or 'crawl'.")
|
msg = f"Invalid mode: {self.mode}. Must be 'scrape' or 'crawl'."
|
||||||
|
raise ValueError(msg)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise Exception(f"Error: {str(e)}")
|
msg = f"Error: {str(e)}"
|
||||||
|
raise Exception(msg)
|
||||||
|
|
||||||
records = []
|
records = []
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,10 +53,11 @@ class AstraDBChatMemory(LCChatMemoryComponent):
|
||||||
try:
|
try:
|
||||||
from langchain_astradb.chat_message_histories import AstraDBChatMessageHistory
|
from langchain_astradb.chat_message_histories import AstraDBChatMessageHistory
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = (
|
||||||
"Could not import langchain Astra DB integration package. "
|
"Could not import langchain Astra DB integration package. "
|
||||||
"Please install it with `pip install langchain-astradb`."
|
"Please install it with `pip install langchain-astradb`."
|
||||||
)
|
)
|
||||||
|
raise ImportError(msg)
|
||||||
|
|
||||||
memory = AstraDBChatMessageHistory(
|
memory = AstraDBChatMessageHistory(
|
||||||
session_id=self.session_id,
|
session_id=self.session_id,
|
||||||
|
|
|
||||||
|
|
@ -55,9 +55,8 @@ class CassandraChatMemory(LCChatMemoryComponent):
|
||||||
try:
|
try:
|
||||||
import cassio
|
import cassio
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = "Could not import cassio integration package. " "Please install it with `pip install cassio`."
|
||||||
"Could not import cassio integration package. " "Please install it with `pip install cassio`."
|
raise ImportError(msg)
|
||||||
)
|
|
||||||
|
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,9 +35,8 @@ class ZepChatMemory(LCChatMemoryComponent):
|
||||||
|
|
||||||
zep_python.zep_client.API_BASE_PATH = self.api_base_path
|
zep_python.zep_client.API_BASE_PATH = self.api_base_path
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = "Could not import zep-python package. " "Please install it with `pip install zep-python`."
|
||||||
"Could not import zep-python package. " "Please install it with `pip install zep-python`."
|
raise ImportError(msg)
|
||||||
)
|
|
||||||
|
|
||||||
zep_client = ZepClient(api_url=self.url, api_key=self.api_key)
|
zep_client = ZepClient(api_url=self.url, api_key=self.api_key)
|
||||||
return ZepChatMessageHistory(session_id=self.session_id, zep_client=zep_client)
|
return ZepChatMessageHistory(session_id=self.session_id, zep_client=zep_client)
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,8 @@ class AmazonBedrockComponent(LCModelComponent):
|
||||||
try:
|
try:
|
||||||
from langchain_aws import ChatBedrock
|
from langchain_aws import ChatBedrock
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError("langchain_aws is not installed. Please install it with `pip install langchain_aws`.")
|
msg = "langchain_aws is not installed. Please install it with `pip install langchain_aws`."
|
||||||
|
raise ImportError(msg)
|
||||||
if self.aws_access_key:
|
if self.aws_access_key:
|
||||||
import boto3 # type: ignore
|
import boto3 # type: ignore
|
||||||
|
|
||||||
|
|
@ -103,5 +104,6 @@ class AmazonBedrockComponent(LCModelComponent):
|
||||||
streaming=self.stream,
|
streaming=self.stream,
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not connect to AmazonBedrock API.") from e
|
msg = "Could not connect to AmazonBedrock API."
|
||||||
|
raise ValueError(msg) from e
|
||||||
return output # type: ignore
|
return output # type: ignore
|
||||||
|
|
|
||||||
|
|
@ -63,9 +63,8 @@ class AnthropicModelComponent(LCModelComponent):
|
||||||
try:
|
try:
|
||||||
from langchain_anthropic.chat_models import ChatAnthropic
|
from langchain_anthropic.chat_models import ChatAnthropic
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = "langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`."
|
||||||
"langchain_anthropic is not installed. Please install it with `pip install langchain_anthropic`."
|
raise ImportError(msg)
|
||||||
)
|
|
||||||
model = self.model
|
model = self.model
|
||||||
anthropic_api_key = self.anthropic_api_key
|
anthropic_api_key = self.anthropic_api_key
|
||||||
max_tokens = self.max_tokens
|
max_tokens = self.max_tokens
|
||||||
|
|
@ -82,7 +81,8 @@ class AnthropicModelComponent(LCModelComponent):
|
||||||
streaming=self.stream,
|
streaming=self.stream,
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not connect to Anthropic API.") from e
|
msg = "Could not connect to Anthropic API."
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
return output # type: ignore
|
return output # type: ignore
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ class AzureChatOpenAIComponent(LCModelComponent):
|
||||||
streaming=stream,
|
streaming=stream,
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Could not connect to AzureOpenAI API: {str(e)}") from e
|
msg = f"Could not connect to AzureOpenAI API: {str(e)}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
return output # type: ignore
|
return output # type: ignore
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,7 @@ class QianfanChatEndpointComponent(LCModelComponent):
|
||||||
endpoint=endpoint,
|
endpoint=endpoint,
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not connect to Baidu Qianfan API.") from e
|
msg = "Could not connect to Baidu Qianfan API."
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
return output # type: ignore
|
return output # type: ignore
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,8 @@ class GoogleGenerativeAIComponent(LCModelComponent):
|
||||||
try:
|
try:
|
||||||
from langchain_google_genai import ChatGoogleGenerativeAI
|
from langchain_google_genai import ChatGoogleGenerativeAI
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError("The 'langchain_google_genai' package is required to use the Google Generative AI model.")
|
msg = "The 'langchain_google_genai' package is required to use the Google Generative AI model."
|
||||||
|
raise ImportError(msg)
|
||||||
|
|
||||||
google_api_key = self.google_api_key
|
google_api_key = self.google_api_key
|
||||||
model = self.model
|
model = self.model
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,7 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
|
||||||
repetition_penalty=repetition_penalty,
|
repetition_penalty=repetition_penalty,
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not connect to HuggingFace Endpoints API.") from e
|
msg = "Could not connect to HuggingFace Endpoints API."
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
return llm
|
return llm
|
||||||
|
|
|
||||||
|
|
@ -65,14 +65,16 @@ class NVIDIAModelComponent(LCModelComponent):
|
||||||
build_config["model_name"]["options"] = ids
|
build_config["model_name"]["options"] = ids
|
||||||
build_config["model_name"]["value"] = ids[0]
|
build_config["model_name"]["value"] = ids[0]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error getting model names: {e}")
|
msg = f"Error getting model names: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
return build_config
|
return build_config
|
||||||
|
|
||||||
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
||||||
try:
|
try:
|
||||||
from langchain_nvidia_ai_endpoints import ChatNVIDIA
|
from langchain_nvidia_ai_endpoints import ChatNVIDIA
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError("Please install langchain-nvidia-ai-endpoints to use the NVIDIA model.")
|
msg = "Please install langchain-nvidia-ai-endpoints to use the NVIDIA model."
|
||||||
|
raise ImportError(msg)
|
||||||
nvidia_api_key = self.nvidia_api_key
|
nvidia_api_key = self.nvidia_api_key
|
||||||
temperature = self.temperature
|
temperature = self.temperature
|
||||||
model_name: str = self.model_name
|
model_name: str = self.model_name
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,8 @@ class ChatOllamaComponent(LCModelComponent):
|
||||||
model_names = [model["name"] for model in data.get("models", [])]
|
model_names = [model["name"] for model in data.get("models", [])]
|
||||||
return model_names
|
return model_names
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not retrieve models. Please, make sure Ollama is running.") from e
|
msg = "Could not retrieve models. Please, make sure Ollama is running."
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
inputs = LCModelComponent._base_inputs + [
|
inputs = LCModelComponent._base_inputs + [
|
||||||
StrInput(
|
StrInput(
|
||||||
|
|
@ -261,6 +262,7 @@ class ChatOllamaComponent(LCModelComponent):
|
||||||
try:
|
try:
|
||||||
output = ChatOllama(**llm_params) # type: ignore
|
output = ChatOllama(**llm_params) # type: ignore
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not initialize Ollama LLM.") from e
|
msg = "Could not initialize Ollama LLM."
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
return output # type: ignore
|
return output # type: ignore
|
||||||
|
|
|
||||||
|
|
@ -42,9 +42,8 @@ class ChatVertexAIComponent(LCModelComponent):
|
||||||
try:
|
try:
|
||||||
from langchain_google_vertexai import ChatVertexAI
|
from langchain_google_vertexai import ChatVertexAI
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = "Please install the langchain-google-vertexai package to use the VertexAIEmbeddings component."
|
||||||
"Please install the langchain-google-vertexai package to use the VertexAIEmbeddings component."
|
raise ImportError(msg)
|
||||||
)
|
|
||||||
location = self.location or None
|
location = self.location or None
|
||||||
if self.credentials:
|
if self.credentials:
|
||||||
from google.cloud import aiplatform
|
from google.cloud import aiplatform
|
||||||
|
|
|
||||||
|
|
@ -110,7 +110,8 @@ class LangChainHubPromptComponent(Component):
|
||||||
|
|
||||||
# Check if the api key is provided
|
# Check if the api key is provided
|
||||||
if not self.langchain_api_key:
|
if not self.langchain_api_key:
|
||||||
raise ValueError("Please provide a LangChain API Key")
|
msg = "Please provide a LangChain API Key"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
# Pull the prompt from LangChain Hub
|
# Pull the prompt from LangChain Hub
|
||||||
prompt_data = langchain.hub.pull(self.langchain_hub_prompt, api_key=self.langchain_api_key)
|
prompt_data = langchain.hub.pull(self.langchain_hub_prompt, api_key=self.langchain_api_key)
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,8 @@ class CreateDataComponent(Component):
|
||||||
existing_fields = {}
|
existing_fields = {}
|
||||||
if field_value_int > 15:
|
if field_value_int > 15:
|
||||||
build_config["number_of_fields"]["value"] = 15
|
build_config["number_of_fields"]["value"] = 15
|
||||||
raise ValueError("Number of fields cannot exceed 15. Try using a Component to combine two Data.")
|
msg = "Number of fields cannot exceed 15. Try using a Component to combine two Data."
|
||||||
|
raise ValueError(msg)
|
||||||
if len(build_config) > len(default_keys):
|
if len(build_config) > len(default_keys):
|
||||||
# back up the existing template fields
|
# back up the existing template fields
|
||||||
for key in build_config.copy():
|
for key in build_config.copy():
|
||||||
|
|
@ -99,4 +100,5 @@ class CreateDataComponent(Component):
|
||||||
data_keys = self.get_data().keys()
|
data_keys = self.get_data().keys()
|
||||||
if self.text_key not in data_keys and self.text_key != "":
|
if self.text_key not in data_keys and self.text_key != "":
|
||||||
formatted_data_keys = ", ".join(data_keys)
|
formatted_data_keys = ", ".join(data_keys)
|
||||||
raise ValueError(f"Text Key: '{self.text_key}' not found in the Data keys: '{formatted_data_keys}'")
|
msg = f"Text Key: '{self.text_key}' not found in the Data keys: '{formatted_data_keys}'"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
|
||||||
|
|
@ -74,11 +74,13 @@ class FlowToolComponent(LCToolComponent):
|
||||||
def build_tool(self) -> Tool:
|
def build_tool(self) -> Tool:
|
||||||
FlowTool.update_forward_refs()
|
FlowTool.update_forward_refs()
|
||||||
if "flow_name" not in self._attributes or not self._attributes["flow_name"]:
|
if "flow_name" not in self._attributes or not self._attributes["flow_name"]:
|
||||||
raise ValueError("Flow name is required")
|
msg = "Flow name is required"
|
||||||
|
raise ValueError(msg)
|
||||||
flow_name = self._attributes["flow_name"]
|
flow_name = self._attributes["flow_name"]
|
||||||
flow_data = self.get_flow(flow_name)
|
flow_data = self.get_flow(flow_name)
|
||||||
if not flow_data:
|
if not flow_data:
|
||||||
raise ValueError("Flow not found.")
|
msg = "Flow not found."
|
||||||
|
raise ValueError(msg)
|
||||||
graph = Graph.from_payload(flow_data.data["data"])
|
graph = Graph.from_payload(flow_data.data["data"])
|
||||||
try:
|
try:
|
||||||
graph.set_run_id(self.graph.run_id)
|
graph.set_run_id(self.graph.run_id)
|
||||||
|
|
|
||||||
|
|
@ -48,9 +48,8 @@ class JSONCleaner(Component):
|
||||||
try:
|
try:
|
||||||
from json_repair import repair_json # type: ignore
|
from json_repair import repair_json # type: ignore
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = "Could not import the json_repair package." "Please install it with `pip install json_repair`."
|
||||||
"Could not import the json_repair package." "Please install it with `pip install json_repair`."
|
raise ImportError(msg)
|
||||||
)
|
|
||||||
|
|
||||||
"""Clean the input JSON string based on provided options and return the cleaned JSON string."""
|
"""Clean the input JSON string based on provided options and return the cleaned JSON string."""
|
||||||
json_str = self.json_str
|
json_str = self.json_str
|
||||||
|
|
@ -62,7 +61,8 @@ class JSONCleaner(Component):
|
||||||
start = json_str.find("{")
|
start = json_str.find("{")
|
||||||
end = json_str.rfind("}")
|
end = json_str.rfind("}")
|
||||||
if start == -1 or end == -1:
|
if start == -1 or end == -1:
|
||||||
raise ValueError("Invalid JSON string: Missing '{' or '}'")
|
msg = "Invalid JSON string: Missing '{' or '}'"
|
||||||
|
raise ValueError(msg)
|
||||||
json_str = json_str[start : end + 1]
|
json_str = json_str[start : end + 1]
|
||||||
|
|
||||||
if remove_control_chars:
|
if remove_control_chars:
|
||||||
|
|
@ -78,7 +78,8 @@ class JSONCleaner(Component):
|
||||||
self.status = result
|
self.status = result
|
||||||
return Message(text=result)
|
return Message(text=result)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error cleaning JSON string: {str(e)}")
|
msg = f"Error cleaning JSON string: {str(e)}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def _remove_control_characters(self, s: str) -> str:
|
def _remove_control_characters(self, s: str) -> str:
|
||||||
"""Remove control characters from the string."""
|
"""Remove control characters from the string."""
|
||||||
|
|
@ -94,4 +95,5 @@ class JSONCleaner(Component):
|
||||||
json.loads(s)
|
json.loads(s)
|
||||||
return s
|
return s
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
raise ValueError(f"Invalid JSON string: {str(e)}")
|
msg = f"Invalid JSON string: {str(e)}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,8 @@ class RunFlowComponent(Component):
|
||||||
|
|
||||||
async def generate_results(self) -> list[Data]:
|
async def generate_results(self) -> list[Data]:
|
||||||
if "flow_name" not in self._attributes or not self._attributes["flow_name"]:
|
if "flow_name" not in self._attributes or not self._attributes["flow_name"]:
|
||||||
raise ValueError("Flow name is required")
|
msg = "Flow name is required"
|
||||||
|
raise ValueError(msg)
|
||||||
flow_name = self._attributes["flow_name"]
|
flow_name = self._attributes["flow_name"]
|
||||||
|
|
||||||
results: list[RunOutputs | None] = await self.run_flow(
|
results: list[RunOutputs | None] = await self.run_flow(
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,8 @@ class RunnableExecComponent(Component):
|
||||||
async def build_executor(self) -> Message:
|
async def build_executor(self) -> Message:
|
||||||
input_dict, status = self.get_input_dict(self.runnable, self.input_key, self.input_value)
|
input_dict, status = self.get_input_dict(self.runnable, self.input_key, self.input_value)
|
||||||
if not isinstance(self.runnable, AgentExecutor):
|
if not isinstance(self.runnable, AgentExecutor):
|
||||||
raise ValueError("The runnable must be an AgentExecutor")
|
msg = "The runnable must be an AgentExecutor"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if self.use_stream:
|
if self.use_stream:
|
||||||
return self.astream_events(input_dict)
|
return self.astream_events(input_dict)
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,8 @@ class SQLExecutorComponent(CustomComponent):
|
||||||
try:
|
try:
|
||||||
database = SQLDatabase.from_uri(database_url)
|
database = SQLDatabase.from_uri(database_url)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"An error occurred while connecting to the database: {e}")
|
msg = f"An error occurred while connecting to the database: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
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)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,8 @@ class SelectDataComponent(Component):
|
||||||
|
|
||||||
# Validate that the selected index is within bounds
|
# Validate that the selected index is within bounds
|
||||||
if selected_index < 0 or selected_index >= len(self.data_list):
|
if selected_index < 0 or selected_index >= len(self.data_list):
|
||||||
raise ValueError(f"Selected index {selected_index} is out of range.")
|
msg = f"Selected index {selected_index} is out of range."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
# Return the selected Data object
|
# Return the selected Data object
|
||||||
selected_data = self.data_list[selected_index]
|
selected_data = self.data_list[selected_index]
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,8 @@ class SubFlowComponent(Component):
|
||||||
try:
|
try:
|
||||||
flow_data = self.get_flow(field_value)
|
flow_data = self.get_flow(field_value)
|
||||||
if not flow_data:
|
if not flow_data:
|
||||||
raise ValueError(f"Flow {field_value} not found.")
|
msg = f"Flow {field_value} not found."
|
||||||
|
raise ValueError(msg)
|
||||||
graph = Graph.from_payload(flow_data.data["data"])
|
graph = Graph.from_payload(flow_data.data["data"])
|
||||||
# Get all inputs from the graph
|
# Get all inputs from the graph
|
||||||
inputs = get_flow_inputs(graph)
|
inputs = get_flow_inputs(graph)
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,8 @@ class UpdateDataComponent(Component):
|
||||||
existing_fields = {}
|
existing_fields = {}
|
||||||
if field_value_int > 15:
|
if field_value_int > 15:
|
||||||
build_config["number_of_fields"]["value"] = 15
|
build_config["number_of_fields"]["value"] = 15
|
||||||
raise ValueError("Number of fields cannot exceed 15. Try using a Component to combine two Data.")
|
msg = "Number of fields cannot exceed 15. Try using a Component to combine two Data."
|
||||||
|
raise ValueError(msg)
|
||||||
if len(build_config) > len(default_keys):
|
if len(build_config) > len(default_keys):
|
||||||
# back up the existing template fields
|
# back up the existing template fields
|
||||||
for key in build_config.copy():
|
for key in build_config.copy():
|
||||||
|
|
@ -105,4 +106,5 @@ class UpdateDataComponent(Component):
|
||||||
"""This function validates that the Text Key is one of the keys in the Data"""
|
"""This function validates that the Text Key is one of the keys in the Data"""
|
||||||
data_keys = data.data.keys()
|
data_keys = data.data.keys()
|
||||||
if self.text_key not in data_keys and self.text_key != "":
|
if self.text_key not in data_keys and self.text_key != "":
|
||||||
raise ValueError(f"Text Key: {self.text_key} not found in the Data keys: {','.join(data_keys)}")
|
msg = f"Text Key: {self.text_key} not found in the Data keys: {','.join(data_keys)}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
|
||||||
|
|
@ -48,5 +48,6 @@ class AmazonKendraRetrieverComponent(CustomComponent):
|
||||||
user_context=user_context,
|
user_context=user_context,
|
||||||
) # type: ignore
|
) # type: ignore
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not connect to AmazonKendra API.") from e
|
msg = "Could not connect to AmazonKendra API."
|
||||||
|
raise ValueError(msg) from e
|
||||||
return cast(Retriever, output)
|
return cast(Retriever, output)
|
||||||
|
|
|
||||||
|
|
@ -82,4 +82,5 @@ class CohereRerankComponent(LCVectorStoreComponent):
|
||||||
|
|
||||||
@check_cached_vector_store
|
@check_cached_vector_store
|
||||||
def build_vector_store(self) -> VectorStore:
|
def build_vector_store(self) -> VectorStore:
|
||||||
raise NotImplementedError("Cohere Rerank does not support vector stores.")
|
msg = "Cohere Rerank does not support vector stores."
|
||||||
|
raise NotImplementedError(msg)
|
||||||
|
|
|
||||||
|
|
@ -25,5 +25,6 @@ class MetalRetrieverComponent(CustomComponent):
|
||||||
try:
|
try:
|
||||||
metal = Metal(api_key=api_key, client_id=client_id, index_id=index_id)
|
metal = Metal(api_key=api_key, client_id=client_id, index_id=index_id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError("Could not connect to Metal API.") from e
|
msg = "Could not connect to Metal API."
|
||||||
|
raise ValueError(msg) from e
|
||||||
return cast(Retriever, MetalRetriever(client=metal, params=params or {}))
|
return cast(Retriever, MetalRetriever(client=metal, params=params or {}))
|
||||||
|
|
|
||||||
|
|
@ -55,14 +55,16 @@ class NvidiaRerankComponent(LCVectorStoreComponent):
|
||||||
build_config["model"]["options"] = ids
|
build_config["model"]["options"] = ids
|
||||||
build_config["model"]["value"] = ids[0]
|
build_config["model"]["value"] = ids[0]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error getting model names: {e}")
|
msg = f"Error getting model names: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
return build_config
|
return build_config
|
||||||
|
|
||||||
def build_model(self):
|
def build_model(self):
|
||||||
try:
|
try:
|
||||||
from langchain_nvidia_ai_endpoints import NVIDIARerank
|
from langchain_nvidia_ai_endpoints import NVIDIARerank
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError("Please install langchain-nvidia-ai-endpoints to use the NVIDIA model.")
|
msg = "Please install langchain-nvidia-ai-endpoints to use the NVIDIA model."
|
||||||
|
raise ImportError(msg)
|
||||||
return NVIDIARerank(api_key=self.api_key, model=self.model, base_url=self.base_url)
|
return NVIDIARerank(api_key=self.api_key, model=self.model, base_url=self.base_url)
|
||||||
|
|
||||||
def build_base_retriever(self) -> Retriever: # type: ignore[type-var]
|
def build_base_retriever(self) -> Retriever: # type: ignore[type-var]
|
||||||
|
|
@ -79,4 +81,5 @@ class NvidiaRerankComponent(LCVectorStoreComponent):
|
||||||
|
|
||||||
@check_cached_vector_store
|
@check_cached_vector_store
|
||||||
def build_vector_store(self) -> VectorStore:
|
def build_vector_store(self) -> VectorStore:
|
||||||
raise NotImplementedError("NVIDIA Rerank does not support vector stores.")
|
msg = "NVIDIA Rerank does not support vector stores."
|
||||||
|
raise NotImplementedError(msg)
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,8 @@ class SelfQueryRetrieverComponent(Component):
|
||||||
elif isinstance(self.query, str):
|
elif isinstance(self.query, str):
|
||||||
input_text = self.query
|
input_text = self.query
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Query type {type(self.query)} not supported.")
|
msg = f"Query type {type(self.query)} not supported."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
documents = self_query_retriever.invoke(input=input_text, config={"callbacks": self.get_langchain_callbacks()})
|
documents = self_query_retriever.invoke(input=input_text, config={"callbacks": self.get_langchain_callbacks()})
|
||||||
data = [Data.from_document(document) for document in documents]
|
data = [Data.from_document(document) for document in documents]
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,8 @@ class VectaraSelfQueryRetriverComponent(CustomComponent):
|
||||||
for meta in metadata_field_info:
|
for meta in metadata_field_info:
|
||||||
meta_obj = json.loads(meta)
|
meta_obj = json.loads(meta)
|
||||||
if "name" not in meta_obj or "description" not in meta_obj or "type" not in meta_obj:
|
if "name" not in meta_obj or "description" not in meta_obj or "type" not in meta_obj:
|
||||||
raise Exception("Incorrect metadata field info format.")
|
msg = "Incorrect metadata field info format."
|
||||||
|
raise Exception(msg)
|
||||||
attribute_info = AttributeInfo(
|
attribute_info = AttributeInfo(
|
||||||
name=meta_obj["name"],
|
name=meta_obj["name"],
|
||||||
description=meta_obj["description"],
|
description=meta_obj["description"],
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,8 @@ class GleanSearchAPIComponent(LCToolComponent):
|
||||||
results = self._search_api_results(query, **kwargs)
|
results = self._search_api_results(query, **kwargs)
|
||||||
|
|
||||||
if len(results) == 0:
|
if len(results) == 0:
|
||||||
raise AssertionError("No good Glean Search Result was found")
|
msg = "No good Glean Search Result was found"
|
||||||
|
raise AssertionError(msg)
|
||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,5 +39,6 @@ class GoogleSearchAPIComponent(LCToolComponent):
|
||||||
try:
|
try:
|
||||||
from langchain_google_community import GoogleSearchAPIWrapper # type: ignore
|
from langchain_google_community import GoogleSearchAPIWrapper # type: ignore
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError("Please install langchain-google-community to use GoogleSearchAPIWrapper.")
|
msg = "Please install langchain-google-community to use GoogleSearchAPIWrapper."
|
||||||
|
raise ImportError(msg)
|
||||||
return GoogleSearchAPIWrapper(google_api_key=self.google_api_key, google_cse_id=self.google_cse_id, k=self.k)
|
return GoogleSearchAPIWrapper(google_api_key=self.google_api_key, google_cse_id=self.google_cse_id, k=self.k)
|
||||||
|
|
|
||||||
|
|
@ -175,7 +175,8 @@ class PythonCodeStructuredTool(LCToolComponent):
|
||||||
field_name = attr.split("|")[1]
|
field_name = attr.split("|")[1]
|
||||||
func_arg = self._find_arg(named_functions, func_name, field_name)
|
func_arg = self._find_arg(named_functions, func_name, field_name)
|
||||||
if func_arg is None:
|
if func_arg is None:
|
||||||
raise Exception(f"Failed to find arg: {field_name}")
|
msg = f"Failed to find arg: {field_name}"
|
||||||
|
raise Exception(msg)
|
||||||
|
|
||||||
field_annotation = func_arg["annotation"]
|
field_annotation = func_arg["annotation"]
|
||||||
field_description = self._get_value(self._attributes[attr], str)
|
field_description = self._get_value(self._attributes[attr], str)
|
||||||
|
|
@ -250,7 +251,8 @@ class PythonCodeStructuredTool(LCToolComponent):
|
||||||
func = {"name": node.name, "args": []}
|
func = {"name": node.name, "args": []}
|
||||||
for arg in node.args.args:
|
for arg in node.args.args:
|
||||||
if arg.lineno != arg.end_lineno:
|
if arg.lineno != arg.end_lineno:
|
||||||
raise Exception("Multiline arguments are not supported")
|
msg = "Multiline arguments are not supported"
|
||||||
|
raise Exception(msg)
|
||||||
|
|
||||||
func_arg = {
|
func_arg = {
|
||||||
"name": arg.arg,
|
"name": arg.arg,
|
||||||
|
|
|
||||||
|
|
@ -54,14 +54,16 @@ class PythonREPLToolComponent(LCToolComponent):
|
||||||
elif isinstance(global_imports, list):
|
elif isinstance(global_imports, list):
|
||||||
modules = global_imports
|
modules = global_imports
|
||||||
else:
|
else:
|
||||||
raise ValueError("global_imports must be either a string or a list")
|
msg = "global_imports must be either a string or a list"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
for module in modules:
|
for module in modules:
|
||||||
try:
|
try:
|
||||||
imported_module = importlib.import_module(module)
|
imported_module = importlib.import_module(module)
|
||||||
global_dict[imported_module.__name__] = imported_module
|
global_dict[imported_module.__name__] = imported_module
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(f"Could not import module {module}")
|
msg = f"Could not import module {module}"
|
||||||
|
raise ImportError(msg)
|
||||||
return global_dict
|
return global_dict
|
||||||
|
|
||||||
def build_tool(self) -> Tool:
|
def build_tool(self) -> Tool:
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,8 @@ class SearXNGToolComponent(LCToolComponent):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def search(query: str, categories: list[str] = []) -> list:
|
def search(query: str, categories: list[str] = []) -> list:
|
||||||
if not SearxSearch._categories and not categories:
|
if not SearxSearch._categories and not categories:
|
||||||
raise ValueError("No categories provided.")
|
msg = "No categories provided."
|
||||||
|
raise ValueError(msg)
|
||||||
all_categories = SearxSearch._categories + list(set(categories) - set(SearxSearch._categories))
|
all_categories = SearxSearch._categories + list(set(categories) - set(SearxSearch._categories))
|
||||||
try:
|
try:
|
||||||
url = f"{SearxSearch._url}/"
|
url = f"{SearxSearch._url}/"
|
||||||
|
|
|
||||||
|
|
@ -367,10 +367,11 @@ class AstraVectorStoreComponent(LCVectorStoreComponent):
|
||||||
from langchain_astradb import AstraDBVectorStore
|
from langchain_astradb import AstraDBVectorStore
|
||||||
from langchain_astradb.utils.astradb import SetupMode
|
from langchain_astradb.utils.astradb import SetupMode
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = (
|
||||||
"Could not import langchain Astra DB integration package. "
|
"Could not import langchain Astra DB integration package. "
|
||||||
"Please install it with `pip install langchain-astradb`."
|
"Please install it with `pip install langchain-astradb`."
|
||||||
)
|
)
|
||||||
|
raise ImportError(msg)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if not self.setup_mode:
|
if not self.setup_mode:
|
||||||
|
|
@ -378,7 +379,8 @@ class AstraVectorStoreComponent(LCVectorStoreComponent):
|
||||||
|
|
||||||
setup_mode_value = SetupMode[self.setup_mode.upper()]
|
setup_mode_value = SetupMode[self.setup_mode.upper()]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise ValueError(f"Invalid setup mode: {self.setup_mode}")
|
msg = f"Invalid setup mode: {self.setup_mode}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if self.embedding:
|
if self.embedding:
|
||||||
embedding_dict = {"embedding": self.embedding}
|
embedding_dict = {"embedding": self.embedding}
|
||||||
|
|
@ -423,7 +425,8 @@ class AstraVectorStoreComponent(LCVectorStoreComponent):
|
||||||
try:
|
try:
|
||||||
vector_store = AstraDBVectorStore(**vector_store_kwargs)
|
vector_store = AstraDBVectorStore(**vector_store_kwargs)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error initializing AstraDBVectorStore: {str(e)}") from e
|
msg = f"Error initializing AstraDBVectorStore: {str(e)}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
self._add_documents_to_vector_store(vector_store)
|
self._add_documents_to_vector_store(vector_store)
|
||||||
|
|
||||||
|
|
@ -435,14 +438,16 @@ class AstraVectorStoreComponent(LCVectorStoreComponent):
|
||||||
if isinstance(_input, Data):
|
if isinstance(_input, Data):
|
||||||
documents.append(_input.to_lc_document())
|
documents.append(_input.to_lc_document())
|
||||||
else:
|
else:
|
||||||
raise ValueError("Vector Store Inputs must be Data objects.")
|
msg = "Vector Store Inputs must be Data objects."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if documents:
|
if documents:
|
||||||
logger.debug(f"Adding {len(documents)} documents to the Vector Store.")
|
logger.debug(f"Adding {len(documents)} documents to the Vector Store.")
|
||||||
try:
|
try:
|
||||||
vector_store.add_documents(documents)
|
vector_store.add_documents(documents)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error adding documents to AstraDBVectorStore: {str(e)}") from e
|
msg = f"Error adding documents to AstraDBVectorStore: {str(e)}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
else:
|
else:
|
||||||
logger.debug("No documents to add to the Vector Store.")
|
logger.debug("No documents to add to the Vector Store.")
|
||||||
|
|
||||||
|
|
@ -481,7 +486,8 @@ class AstraVectorStoreComponent(LCVectorStoreComponent):
|
||||||
|
|
||||||
docs = vector_store.search(query=self.search_input, search_type=search_type, **search_args)
|
docs = vector_store.search(query=self.search_input, search_type=search_type, **search_args)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error performing search in AstraDBVectorStore: {str(e)}") from e
|
msg = f"Error performing search in AstraDBVectorStore: {str(e)}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
logger.debug(f"Retrieved documents: {len(docs)}")
|
logger.debug(f"Retrieved documents: {len(docs)}")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -137,9 +137,8 @@ class CassandraVectorStoreComponent(LCVectorStoreComponent):
|
||||||
import cassio
|
import cassio
|
||||||
from langchain_community.utilities.cassandra import SetupMode
|
from langchain_community.utilities.cassandra import SetupMode
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = "Could not import cassio integration package. " "Please install it with `pip install cassio`."
|
||||||
"Could not import cassio integration package. " "Please install it with `pip install cassio`."
|
raise ImportError(msg)
|
||||||
)
|
|
||||||
|
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
|
|
@ -235,10 +234,11 @@ class CassandraVectorStoreComponent(LCVectorStoreComponent):
|
||||||
docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
|
docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
|
||||||
except KeyError as e:
|
except KeyError as e:
|
||||||
if "content" in str(e):
|
if "content" in str(e):
|
||||||
raise ValueError(
|
msg = (
|
||||||
"You should ingest data through Langflow (or LangChain) to query it in Langflow. "
|
"You should ingest data through Langflow (or LangChain) to query it in Langflow. "
|
||||||
"Your collection does not contain a field name 'content'."
|
"Your collection does not contain a field name 'content'."
|
||||||
)
|
)
|
||||||
|
raise ValueError(msg)
|
||||||
else:
|
else:
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
|
@ -262,7 +262,8 @@ class CassandraVectorStoreComponent(LCVectorStoreComponent):
|
||||||
args["filter"] = clean_filter
|
args["filter"] = clean_filter
|
||||||
if self.body_search:
|
if self.body_search:
|
||||||
if not self.enable_body_search:
|
if not self.enable_body_search:
|
||||||
raise ValueError("You should enable body search when creating the table to search the body field.")
|
msg = "You should enable body search when creating the table to search the body field."
|
||||||
|
raise ValueError(msg)
|
||||||
args["body_search"] = self.body_search
|
args["body_search"] = self.body_search
|
||||||
return args
|
return args
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -126,9 +126,8 @@ class CassandraGraphVectorStoreComponent(LCVectorStoreComponent):
|
||||||
import cassio
|
import cassio
|
||||||
from langchain_community.utilities.cassandra import SetupMode
|
from langchain_community.utilities.cassandra import SetupMode
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = "Could not import cassio integration package. " "Please install it with `pip install cassio`."
|
||||||
"Could not import cassio integration package. " "Please install it with `pip install cassio`."
|
raise ImportError(msg)
|
||||||
)
|
|
||||||
|
|
||||||
database_ref = self.database_ref
|
database_ref = self.database_ref
|
||||||
|
|
||||||
|
|
@ -214,10 +213,11 @@ class CassandraGraphVectorStoreComponent(LCVectorStoreComponent):
|
||||||
docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
|
docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
|
||||||
except KeyError as e:
|
except KeyError as e:
|
||||||
if "content" in str(e):
|
if "content" in str(e):
|
||||||
raise ValueError(
|
msg = (
|
||||||
"You should ingest data through Langflow (or LangChain) to query it in Langflow. "
|
"You should ingest data through Langflow (or LangChain) to query it in Langflow. "
|
||||||
"Your collection does not contain a field name 'content'."
|
"Your collection does not contain a field name 'content'."
|
||||||
) from e
|
)
|
||||||
|
raise ValueError(msg) from e
|
||||||
else:
|
else:
|
||||||
raise e
|
raise e
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -107,9 +107,10 @@ class ChromaVectorStoreComponent(LCVectorStoreComponent):
|
||||||
from chromadb import Client
|
from chromadb import Client
|
||||||
from langchain_chroma import Chroma
|
from langchain_chroma import Chroma
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = (
|
||||||
"Could not import Chroma integration package. " "Please install it with `pip install langchain-chroma`."
|
"Could not import Chroma integration package. " "Please install it with `pip install langchain-chroma`."
|
||||||
)
|
)
|
||||||
|
raise ImportError(msg)
|
||||||
# Chroma settings
|
# Chroma settings
|
||||||
chroma_settings = None
|
chroma_settings = None
|
||||||
client = None
|
client = None
|
||||||
|
|
@ -163,7 +164,8 @@ class ChromaVectorStoreComponent(LCVectorStoreComponent):
|
||||||
if _input not in _stored_documents_without_id:
|
if _input not in _stored_documents_without_id:
|
||||||
documents.append(_input.to_lc_document())
|
documents.append(_input.to_lc_document())
|
||||||
else:
|
else:
|
||||||
raise ValueError("Vector Store Inputs must be Data objects.")
|
msg = "Vector Store Inputs must be Data objects."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if documents and self.embedding is not None:
|
if documents and self.embedding is not None:
|
||||||
logger.debug(f"Adding {len(documents)} documents to the Vector Store.")
|
logger.debug(f"Adding {len(documents)} documents to the Vector Store.")
|
||||||
|
|
|
||||||
|
|
@ -72,16 +72,18 @@ class ClickhouseVectorStoreComponent(LCVectorStoreComponent):
|
||||||
try:
|
try:
|
||||||
import clickhouse_connect # type: ignore
|
import clickhouse_connect # type: ignore
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(
|
msg = (
|
||||||
"Failed to import Clickhouse dependencies. "
|
"Failed to import Clickhouse dependencies. "
|
||||||
"Install it using `pip install langflow[clickhouse-connect] --pre`"
|
"Install it using `pip install langflow[clickhouse-connect] --pre`"
|
||||||
) from e
|
)
|
||||||
|
raise ImportError(msg) from e
|
||||||
|
|
||||||
try:
|
try:
|
||||||
client = clickhouse_connect.get_client(host=self.host, username=self.username, password=self.password)
|
client = clickhouse_connect.get_client(host=self.host, username=self.username, password=self.password)
|
||||||
client.command("SELECT 1")
|
client.command("SELECT 1")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Failed to connect to Clickhouse: {e}")
|
msg = f"Failed to connect to Clickhouse: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
documents = []
|
documents = []
|
||||||
for _input in self.ingest_data or []:
|
for _input in self.ingest_data or []:
|
||||||
|
|
|
||||||
|
|
@ -48,9 +48,8 @@ class CouchbaseVectorStoreComponent(LCVectorStoreComponent):
|
||||||
from couchbase.cluster import Cluster # type: ignore
|
from couchbase.cluster import Cluster # type: ignore
|
||||||
from couchbase.options import ClusterOptions # type: ignore
|
from couchbase.options import ClusterOptions # type: ignore
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError(
|
msg = "Failed to import Couchbase dependencies. Install it using `pip install langflow[couchbase] --pre`"
|
||||||
"Failed to import Couchbase dependencies. Install it using `pip install langflow[couchbase] --pre`"
|
raise ImportError(msg) from e
|
||||||
) from e
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
auth = PasswordAuthenticator(self.couchbase_username, self.couchbase_password)
|
auth = PasswordAuthenticator(self.couchbase_username, self.couchbase_password)
|
||||||
|
|
@ -59,7 +58,8 @@ class CouchbaseVectorStoreComponent(LCVectorStoreComponent):
|
||||||
|
|
||||||
cluster.wait_until_ready(timedelta(seconds=5))
|
cluster.wait_until_ready(timedelta(seconds=5))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Failed to connect to Couchbase: {e}")
|
msg = f"Failed to connect to Couchbase: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
documents = []
|
documents = []
|
||||||
for _input in self.ingest_data or []:
|
for _input in self.ingest_data or []:
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,8 @@ class FaissVectorStoreComponent(LCVectorStoreComponent):
|
||||||
Builds the FAISS object.
|
Builds the FAISS object.
|
||||||
"""
|
"""
|
||||||
if not self.persist_directory:
|
if not self.persist_directory:
|
||||||
raise ValueError("Folder path is required to save the FAISS index.")
|
msg = "Folder path is required to save the FAISS index."
|
||||||
|
raise ValueError(msg)
|
||||||
path = self.resolve_path(self.persist_directory)
|
path = self.resolve_path(self.persist_directory)
|
||||||
|
|
||||||
documents = []
|
documents = []
|
||||||
|
|
@ -83,7 +84,8 @@ class FaissVectorStoreComponent(LCVectorStoreComponent):
|
||||||
Search for documents in the FAISS vector store.
|
Search for documents in the FAISS vector store.
|
||||||
"""
|
"""
|
||||||
if not self.persist_directory:
|
if not self.persist_directory:
|
||||||
raise ValueError("Folder path is required to load the FAISS index.")
|
msg = "Folder path is required to load the FAISS index."
|
||||||
|
raise ValueError(msg)
|
||||||
path = self.resolve_path(self.persist_directory)
|
path = self.resolve_path(self.persist_directory)
|
||||||
|
|
||||||
vector_store = FAISS.load_local(
|
vector_store = FAISS.load_local(
|
||||||
|
|
@ -94,7 +96,8 @@ class FaissVectorStoreComponent(LCVectorStoreComponent):
|
||||||
)
|
)
|
||||||
|
|
||||||
if not vector_store:
|
if not vector_store:
|
||||||
raise ValueError("Failed to load the FAISS index.")
|
msg = "Failed to load the FAISS index."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
logger.debug(f"Search input: {self.search_query}")
|
logger.debug(f"Search input: {self.search_query}")
|
||||||
logger.debug(f"Number of results: {self.number_of_results}")
|
logger.debug(f"Number of results: {self.number_of_results}")
|
||||||
|
|
|
||||||
|
|
@ -181,18 +181,18 @@ class HCDVectorStoreComponent(LCVectorStoreComponent):
|
||||||
from langchain_astradb import AstraDBVectorStore
|
from langchain_astradb import AstraDBVectorStore
|
||||||
from langchain_astradb.utils.astradb import SetupMode
|
from langchain_astradb.utils.astradb import SetupMode
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = (
|
||||||
"Could not import langchain Astra DB integration package. "
|
"Could not import langchain Astra DB integration package. "
|
||||||
"Please install it with `pip install langchain-astradb`."
|
"Please install it with `pip install langchain-astradb`."
|
||||||
)
|
)
|
||||||
|
raise ImportError(msg)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from astrapy.authentication import UsernamePasswordTokenProvider
|
from astrapy.authentication import UsernamePasswordTokenProvider
|
||||||
from astrapy.constants import Environment
|
from astrapy.constants import Environment
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = "Could not import astrapy integration package. " "Please install it with `pip install astrapy`."
|
||||||
"Could not import astrapy integration package. " "Please install it with `pip install astrapy`."
|
raise ImportError(msg)
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if not self.setup_mode:
|
if not self.setup_mode:
|
||||||
|
|
@ -200,7 +200,8 @@ class HCDVectorStoreComponent(LCVectorStoreComponent):
|
||||||
|
|
||||||
setup_mode_value = SetupMode[self.setup_mode.upper()]
|
setup_mode_value = SetupMode[self.setup_mode.upper()]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise ValueError(f"Invalid setup mode: {self.setup_mode}")
|
msg = f"Invalid setup mode: {self.setup_mode}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if not isinstance(self.embedding, dict):
|
if not isinstance(self.embedding, dict):
|
||||||
embedding_dict = {"embedding": self.embedding}
|
embedding_dict = {"embedding": self.embedding}
|
||||||
|
|
@ -246,7 +247,8 @@ class HCDVectorStoreComponent(LCVectorStoreComponent):
|
||||||
try:
|
try:
|
||||||
vector_store = AstraDBVectorStore(**vector_store_kwargs)
|
vector_store = AstraDBVectorStore(**vector_store_kwargs)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error initializing AstraDBVectorStore: {str(e)}") from e
|
msg = f"Error initializing AstraDBVectorStore: {str(e)}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
self._add_documents_to_vector_store(vector_store)
|
self._add_documents_to_vector_store(vector_store)
|
||||||
return vector_store
|
return vector_store
|
||||||
|
|
@ -257,14 +259,16 @@ class HCDVectorStoreComponent(LCVectorStoreComponent):
|
||||||
if isinstance(_input, Data):
|
if isinstance(_input, Data):
|
||||||
documents.append(_input.to_lc_document())
|
documents.append(_input.to_lc_document())
|
||||||
else:
|
else:
|
||||||
raise ValueError("Vector Store Inputs must be Data objects.")
|
msg = "Vector Store Inputs must be Data objects."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if documents:
|
if documents:
|
||||||
logger.debug(f"Adding {len(documents)} documents to the Vector Store.")
|
logger.debug(f"Adding {len(documents)} documents to the Vector Store.")
|
||||||
try:
|
try:
|
||||||
vector_store.add_documents(documents)
|
vector_store.add_documents(documents)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error adding documents to AstraDBVectorStore: {str(e)}") from e
|
msg = f"Error adding documents to AstraDBVectorStore: {str(e)}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
else:
|
else:
|
||||||
logger.debug("No documents to add to the Vector Store.")
|
logger.debug("No documents to add to the Vector Store.")
|
||||||
|
|
||||||
|
|
@ -302,7 +306,8 @@ class HCDVectorStoreComponent(LCVectorStoreComponent):
|
||||||
|
|
||||||
docs = vector_store.search(query=self.search_input, search_type=search_type, **search_args)
|
docs = vector_store.search(query=self.search_input, search_type=search_type, **search_args)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error performing search in AstraDBVectorStore: {str(e)}") from e
|
msg = f"Error performing search in AstraDBVectorStore: {str(e)}"
|
||||||
|
raise ValueError(msg) from e
|
||||||
|
|
||||||
logger.debug(f"Retrieved documents: {len(docs)}")
|
logger.debug(f"Retrieved documents: {len(docs)}")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -74,9 +74,10 @@ class MilvusVectorStoreComponent(LCVectorStoreComponent):
|
||||||
try:
|
try:
|
||||||
from langchain_milvus.vectorstores import Milvus as LangchainMilvus
|
from langchain_milvus.vectorstores import Milvus as LangchainMilvus
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError(
|
msg = (
|
||||||
"Could not import Milvus integration package. " "Please install it with `pip install langchain-milvus`."
|
"Could not import Milvus integration package. " "Please install it with `pip install langchain-milvus`."
|
||||||
)
|
)
|
||||||
|
raise ImportError(msg)
|
||||||
self.connection_args.update(uri=self.uri, token=self.password)
|
self.connection_args.update(uri=self.uri, token=self.password)
|
||||||
milvus_store = LangchainMilvus(
|
milvus_store = LangchainMilvus(
|
||||||
embedding_function=self.embedding,
|
embedding_function=self.embedding,
|
||||||
|
|
|
||||||
|
|
@ -39,13 +39,15 @@ class MongoVectorStoreComponent(LCVectorStoreComponent):
|
||||||
try:
|
try:
|
||||||
from pymongo import MongoClient
|
from pymongo import MongoClient
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError("Please install pymongo to use MongoDB Atlas Vector Store")
|
msg = "Please install pymongo to use MongoDB Atlas Vector Store"
|
||||||
|
raise ImportError(msg)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
mongo_client: MongoClient = MongoClient(self.mongodb_atlas_cluster_uri)
|
mongo_client: MongoClient = MongoClient(self.mongodb_atlas_cluster_uri)
|
||||||
collection = mongo_client[self.db_name][self.collection_name]
|
collection = mongo_client[self.db_name][self.collection_name]
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Failed to connect to MongoDB Atlas: {e}")
|
msg = f"Failed to connect to MongoDB Atlas: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
documents = []
|
documents = []
|
||||||
for _input in self.ingest_data or []:
|
for _input in self.ingest_data or []:
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,8 @@ class QdrantVectorStoreComponent(LCVectorStoreComponent):
|
||||||
documents.append(_input)
|
documents.append(_input)
|
||||||
|
|
||||||
if not isinstance(self.embedding, Embeddings):
|
if not isinstance(self.embedding, Embeddings):
|
||||||
raise ValueError("Invalid embedding object")
|
msg = "Invalid embedding object"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
if documents:
|
if documents:
|
||||||
qdrant = Qdrant.from_documents(documents, embedding=self.embedding, **qdrant_kwargs)
|
qdrant = Qdrant.from_documents(documents, embedding=self.embedding, **qdrant_kwargs)
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,8 @@ class RedisVectorStoreComponent(LCVectorStoreComponent):
|
||||||
|
|
||||||
if not documents:
|
if not documents:
|
||||||
if self.schema is None:
|
if self.schema is None:
|
||||||
raise ValueError("If no documents are provided, a schema must be provided.")
|
msg = "If no documents are provided, a schema must be provided."
|
||||||
|
raise ValueError(msg)
|
||||||
redis_vs = Redis.from_existing_index(
|
redis_vs = Redis.from_existing_index(
|
||||||
embedding=self.embedding,
|
embedding=self.embedding,
|
||||||
index_name=self.redis_index_name,
|
index_name=self.redis_index_name,
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,8 @@ class VectaraVectorStoreComponent(LCVectorStoreComponent):
|
||||||
try:
|
try:
|
||||||
from langchain_community.vectorstores import Vectara
|
from langchain_community.vectorstores import Vectara
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError("Could not import Vectara. Please install it with `pip install langchain-community`.")
|
msg = "Could not import Vectara. Please install it with `pip install langchain-community`."
|
||||||
|
raise ImportError(msg)
|
||||||
|
|
||||||
vectara = Vectara(
|
vectara = Vectara(
|
||||||
vectara_customer_id=self.vectara_customer_id,
|
vectara_customer_id=self.vectara_customer_id,
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,8 @@ class WeaviateVectorStoreComponent(LCVectorStoreComponent):
|
||||||
client = weaviate.Client(url=self.url)
|
client = weaviate.Client(url=self.url)
|
||||||
|
|
||||||
if self.index_name != self.index_name.capitalize():
|
if self.index_name != self.index_name.capitalize():
|
||||||
raise ValueError(f"Weaviate requires the index name to be capitalized. Use: {self.index_name.capitalize()}")
|
msg = f"Weaviate requires the index name to be capitalized. Use: {self.index_name.capitalize()}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
documents = []
|
documents = []
|
||||||
for _input in self.ingest_data or []:
|
for _input in self.ingest_data or []:
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,8 @@ class VectaraRagComponent(Component):
|
||||||
from langchain_community.vectorstores import Vectara
|
from langchain_community.vectorstores import Vectara
|
||||||
from langchain_community.vectorstores.vectara import RerankConfig, SummaryConfig, VectaraQueryConfig
|
from langchain_community.vectorstores.vectara import RerankConfig, SummaryConfig, VectaraQueryConfig
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise ImportError("Could not import Vectara. Please install it with `pip install langchain-community`.")
|
msg = "Could not import Vectara. Please install it with `pip install langchain-community`."
|
||||||
|
raise ImportError(msg)
|
||||||
|
|
||||||
vectara = Vectara(self.vectara_customer_id, self.vectara_corpus_id, self.vectara_api_key)
|
vectara = Vectara(self.vectara_customer_id, self.vectara_corpus_id, self.vectara_api_key)
|
||||||
rerank_config = RerankConfig(self.reranker, self.reranker_k, self.diversity_bias)
|
rerank_config = RerankConfig(self.reranker, self.reranker_k, self.diversity_bias)
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@ def validate_icon(value: str, *args, **kwargs):
|
||||||
elif not value.startswith(":") or not value.endswith(":"):
|
elif not value.startswith(":") or not value.endswith(":"):
|
||||||
# emoji should have both starting and ending colons
|
# emoji should have both starting and ending colons
|
||||||
# so if one of them is missing, we will raise
|
# so if one of them is missing, we will raise
|
||||||
raise ValueError(f"Invalid emoji. {value} is not a valid emoji.")
|
msg = f"Invalid emoji. {value} is not a valid emoji."
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
emoji_value = emoji.emojize(value, variant="emoji_type")
|
emoji_value = emoji.emojize(value, variant="emoji_type")
|
||||||
if value == emoji_value:
|
if value == emoji_value:
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,8 @@ class CodeParser:
|
||||||
self.cache: TTLCache = TTLCache(maxsize=1024, ttl=60)
|
self.cache: TTLCache = TTLCache(maxsize=1024, ttl=60)
|
||||||
if isinstance(code, type):
|
if isinstance(code, type):
|
||||||
if not inspect.isclass(code):
|
if not inspect.isclass(code):
|
||||||
raise ValueError("The provided code must be a class.")
|
msg = "The provided code must be a class."
|
||||||
|
raise ValueError(msg)
|
||||||
# If the code is a class, get its source code
|
# If the code is a class, get its source code
|
||||||
code = inspect.getsource(code)
|
code = inspect.getsource(code)
|
||||||
self.code = code
|
self.code = code
|
||||||
|
|
|
||||||
|
|
@ -138,11 +138,13 @@ class Component(CustomComponent):
|
||||||
try:
|
try:
|
||||||
module = inspect.getmodule(self.__class__)
|
module = inspect.getmodule(self.__class__)
|
||||||
if module is None:
|
if module is None:
|
||||||
raise ValueError("Could not find module for class")
|
msg = "Could not find module for class"
|
||||||
|
raise ValueError(msg)
|
||||||
class_code = inspect.getsource(module)
|
class_code = inspect.getsource(module)
|
||||||
self._code = class_code
|
self._code = class_code
|
||||||
except OSError:
|
except OSError:
|
||||||
raise ValueError(f"Could not find source code for {self.__class__.__name__}")
|
msg = f"Could not find source code for {self.__class__.__name__}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def set(self, **kwargs):
|
def set(self, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
|
@ -209,7 +211,8 @@ class Component(CustomComponent):
|
||||||
"""
|
"""
|
||||||
if name in self._inputs:
|
if name in self._inputs:
|
||||||
return self._inputs[name]
|
return self._inputs[name]
|
||||||
raise ValueError(f"Input {name} not found in {self.__class__.__name__}")
|
msg = f"Input {name} not found in {self.__class__.__name__}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def get_output(self, name: str) -> Any:
|
def get_output(self, name: str) -> Any:
|
||||||
"""
|
"""
|
||||||
|
|
@ -226,20 +229,23 @@ class Component(CustomComponent):
|
||||||
"""
|
"""
|
||||||
if name in self._outputs_map:
|
if name in self._outputs_map:
|
||||||
return self._outputs_map[name]
|
return self._outputs_map[name]
|
||||||
raise ValueError(f"Output {name} not found in {self.__class__.__name__}")
|
msg = f"Output {name} not found in {self.__class__.__name__}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def set_on_output(self, name: str, **kwargs):
|
def set_on_output(self, name: str, **kwargs):
|
||||||
output = self.get_output(name)
|
output = self.get_output(name)
|
||||||
for key, value in kwargs.items():
|
for key, value in kwargs.items():
|
||||||
if not hasattr(output, key):
|
if not hasattr(output, key):
|
||||||
raise ValueError(f"Output {name} does not have a method {key}")
|
msg = f"Output {name} does not have a method {key}"
|
||||||
|
raise ValueError(msg)
|
||||||
setattr(output, key, value)
|
setattr(output, key, value)
|
||||||
|
|
||||||
def set_output_value(self, name: str, value: Any):
|
def set_output_value(self, name: str, value: Any):
|
||||||
if name in self._outputs_map:
|
if name in self._outputs_map:
|
||||||
self._outputs_map[name].value = value
|
self._outputs_map[name].value = value
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Output {name} not found in {self.__class__.__name__}")
|
msg = f"Output {name} not found in {self.__class__.__name__}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def map_outputs(self, outputs: list[Output]):
|
def map_outputs(self, outputs: list[Output]):
|
||||||
"""
|
"""
|
||||||
|
|
@ -256,7 +262,8 @@ class Component(CustomComponent):
|
||||||
"""
|
"""
|
||||||
for output in outputs:
|
for output in outputs:
|
||||||
if output.name is None:
|
if output.name is None:
|
||||||
raise ValueError("Output name cannot be None.")
|
msg = "Output name cannot be None."
|
||||||
|
raise ValueError(msg)
|
||||||
# Deepcopy is required to avoid modifying the original component;
|
# Deepcopy is required to avoid modifying the original component;
|
||||||
# allows each instance of each component to modify its own output
|
# allows each instance of each component to modify its own output
|
||||||
self._outputs_map[output.name] = deepcopy(output)
|
self._outputs_map[output.name] = deepcopy(output)
|
||||||
|
|
@ -274,7 +281,8 @@ class Component(CustomComponent):
|
||||||
"""
|
"""
|
||||||
for input_ in inputs:
|
for input_ in inputs:
|
||||||
if input_.name is None:
|
if input_.name is None:
|
||||||
raise ValueError("Input name cannot be None.")
|
msg = "Input name cannot be None."
|
||||||
|
raise ValueError(msg)
|
||||||
self._inputs[input_.name] = deepcopy(input_)
|
self._inputs[input_.name] = deepcopy(input_)
|
||||||
|
|
||||||
def validate(self, params: dict):
|
def validate(self, params: dict):
|
||||||
|
|
@ -303,7 +311,8 @@ class Component(CustomComponent):
|
||||||
output = next((output for output in self._outputs_map.values() if output.method == method.__name__), None)
|
output = next((output for output in self._outputs_map.values() if output.method == method.__name__), None)
|
||||||
if output is None:
|
if output is None:
|
||||||
method_name = method.__name__ if hasattr(method, "__name__") else str(method)
|
method_name = method.__name__ if hasattr(method, "__name__") else str(method)
|
||||||
raise ValueError(f"Output with method {method_name} not found")
|
msg = f"Output with method {method_name} not found"
|
||||||
|
raise ValueError(msg)
|
||||||
return output
|
return output
|
||||||
|
|
||||||
def _inherits_from_component(self, method: Callable):
|
def _inherits_from_component(self, method: Callable):
|
||||||
|
|
@ -340,13 +349,15 @@ class Component(CustomComponent):
|
||||||
matching_pairs.append((output, input_))
|
matching_pairs.append((output, input_))
|
||||||
if len(matching_pairs) > 1:
|
if len(matching_pairs) > 1:
|
||||||
matching_pairs_str = self._build_error_string_from_matching_pairs(matching_pairs)
|
matching_pairs_str = self._build_error_string_from_matching_pairs(matching_pairs)
|
||||||
raise ValueError(
|
msg = (
|
||||||
f"There are multiple outputs from {value.__class__.__name__} "
|
f"There are multiple outputs from {value.__class__.__name__} "
|
||||||
f"that can connect to inputs in {self.__class__.__name__}: {matching_pairs_str}"
|
f"that can connect to inputs in {self.__class__.__name__}: {matching_pairs_str}"
|
||||||
)
|
)
|
||||||
|
raise ValueError(msg)
|
||||||
output, input_ = matching_pairs[0]
|
output, input_ = matching_pairs[0]
|
||||||
if not isinstance(output.method, str):
|
if not isinstance(output.method, str):
|
||||||
raise ValueError(f"Method {output.method} is not a valid output of {value.__class__.__name__}")
|
msg = f"Method {output.method} is not a valid output of {value.__class__.__name__}"
|
||||||
|
raise ValueError(msg)
|
||||||
return getattr(value, output.method)
|
return getattr(value, output.method)
|
||||||
|
|
||||||
def _process_connection_or_parameter(self, key, value):
|
def _process_connection_or_parameter(self, key, value):
|
||||||
|
|
@ -361,9 +372,8 @@ class Component(CustomComponent):
|
||||||
try:
|
try:
|
||||||
self._method_is_valid_output(value)
|
self._method_is_valid_output(value)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise ValueError(
|
msg = f"Method {value.__name__} is not a valid output of {value.__self__.__class__.__name__}"
|
||||||
f"Method {value.__name__} is not a valid output of {value.__self__.__class__.__name__}"
|
raise ValueError(msg)
|
||||||
)
|
|
||||||
self._connect_to_component(key, value, _input)
|
self._connect_to_component(key, value, _input)
|
||||||
else:
|
else:
|
||||||
self._set_parameter_or_attribute(key, value)
|
self._set_parameter_or_attribute(key, value)
|
||||||
|
|
@ -416,10 +426,11 @@ class Component(CustomComponent):
|
||||||
def _set_parameter_or_attribute(self, key, value):
|
def _set_parameter_or_attribute(self, key, value):
|
||||||
if isinstance(value, Component):
|
if isinstance(value, Component):
|
||||||
methods = ", ".join([f"'{output.method}'" for output in value.outputs])
|
methods = ", ".join([f"'{output.method}'" for output in value.outputs])
|
||||||
raise ValueError(
|
msg = (
|
||||||
f"You set {value.display_name} as value for `{key}`. "
|
f"You set {value.display_name} as value for `{key}`. "
|
||||||
f"You should pass one of the following: {methods}"
|
f"You should pass one of the following: {methods}"
|
||||||
)
|
)
|
||||||
|
raise ValueError(msg)
|
||||||
self._set_input_value(key, value)
|
self._set_input_value(key, value)
|
||||||
self._parameters[key] = value
|
self._parameters[key] = value
|
||||||
self._attributes[key] = value
|
self._attributes[key] = value
|
||||||
|
|
@ -453,26 +464,28 @@ class Component(CustomComponent):
|
||||||
return self.__dict__[f"_{name}"]
|
return self.__dict__[f"_{name}"]
|
||||||
if name.startswith("_") and name[1:] in BACKWARDS_COMPATIBLE_ATTRIBUTES:
|
if name.startswith("_") and name[1:] in BACKWARDS_COMPATIBLE_ATTRIBUTES:
|
||||||
return self.__dict__[name]
|
return self.__dict__[name]
|
||||||
raise AttributeError(f"{name} not found in {self.__class__.__name__}")
|
msg = f"{name} not found in {self.__class__.__name__}"
|
||||||
|
raise AttributeError(msg)
|
||||||
|
|
||||||
def _set_input_value(self, name: str, value: Any):
|
def _set_input_value(self, name: str, value: Any):
|
||||||
if name in self._inputs:
|
if name in self._inputs:
|
||||||
input_value = self._inputs[name].value
|
input_value = self._inputs[name].value
|
||||||
if isinstance(input_value, Component):
|
if isinstance(input_value, Component):
|
||||||
methods = ", ".join([f"'{output.method}'" for output in input_value.outputs])
|
methods = ", ".join([f"'{output.method}'" for output in input_value.outputs])
|
||||||
raise ValueError(
|
msg = (
|
||||||
f"You set {input_value.display_name} as value for `{name}`. "
|
f"You set {input_value.display_name} as value for `{name}`. "
|
||||||
f"You should pass one of the following: {methods}"
|
f"You should pass one of the following: {methods}"
|
||||||
)
|
)
|
||||||
|
raise ValueError(msg)
|
||||||
if callable(input_value):
|
if callable(input_value):
|
||||||
raise ValueError(
|
msg = f"Input {name} is connected to {input_value.__self__.display_name}.{input_value.__name__}"
|
||||||
f"Input {name} is connected to {input_value.__self__.display_name}.{input_value.__name__}"
|
raise ValueError(msg)
|
||||||
)
|
|
||||||
self._inputs[name].value = value
|
self._inputs[name].value = value
|
||||||
if hasattr(self._inputs[name], "load_from_db"):
|
if hasattr(self._inputs[name], "load_from_db"):
|
||||||
self._inputs[name].load_from_db = False
|
self._inputs[name].load_from_db = False
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Input {name} not found in {self.__class__.__name__}")
|
msg = f"Input {name} not found in {self.__class__.__name__}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def _validate_outputs(self):
|
def _validate_outputs(self):
|
||||||
# Raise Error if some rule isn't met
|
# Raise Error if some rule isn't met
|
||||||
|
|
@ -489,10 +502,12 @@ class Component(CustomComponent):
|
||||||
except KeyError:
|
except KeyError:
|
||||||
close_match = find_closest_match(name, list(template.keys()))
|
close_match = find_closest_match(name, list(template.keys()))
|
||||||
if close_match:
|
if close_match:
|
||||||
raise ValueError(
|
msg = (
|
||||||
f"Parameter '{name}' not found in {self.__class__.__name__}. " f"Did you mean '{close_match}'?"
|
f"Parameter '{name}' not found in {self.__class__.__name__}. " f"Did you mean '{close_match}'?"
|
||||||
)
|
)
|
||||||
raise ValueError(f"Parameter {name} not found in {self.__class__.__name__}. ")
|
raise ValueError(msg)
|
||||||
|
msg = f"Parameter {name} not found in {self.__class__.__name__}. "
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def _get_method_return_type(self, method_name: str) -> list[str]:
|
def _get_method_return_type(self, method_name: str) -> list[str]:
|
||||||
method = getattr(self, method_name)
|
method = getattr(self, method_name)
|
||||||
|
|
@ -569,10 +584,11 @@ class Component(CustomComponent):
|
||||||
_attributes = {}
|
_attributes = {}
|
||||||
for key, value in params.items():
|
for key, value in params.items():
|
||||||
if key in self.__dict__ and value != getattr(self, key):
|
if key in self.__dict__ and value != getattr(self, key):
|
||||||
raise ValueError(
|
msg = (
|
||||||
f"{self.__class__.__name__} defines an input parameter named '{key}' "
|
f"{self.__class__.__name__} defines an input parameter named '{key}' "
|
||||||
f"that is a reserved word and cannot be used."
|
f"that is a reserved word and cannot be used."
|
||||||
)
|
)
|
||||||
|
raise ValueError(msg)
|
||||||
_attributes[key] = value
|
_attributes[key] = value
|
||||||
for key, input_obj in self._inputs.items():
|
for key, input_obj in self._inputs.items():
|
||||||
if key not in _attributes:
|
if key not in _attributes:
|
||||||
|
|
@ -634,7 +650,8 @@ class Component(CustomComponent):
|
||||||
or output.name in self._vertex.edges_source_names
|
or output.name in self._vertex.edges_source_names
|
||||||
):
|
):
|
||||||
if output.method is None:
|
if output.method is None:
|
||||||
raise ValueError(f"Output {output.name} does not have a method defined.")
|
msg = f"Output {output.name} does not have a method defined."
|
||||||
|
raise ValueError(msg)
|
||||||
self._current_output = output.name
|
self._current_output = output.name
|
||||||
method: Callable = getattr(self, output.method)
|
method: Callable = getattr(self, output.method)
|
||||||
if output.cache and output.value != UNDEFINED:
|
if output.cache and output.value != UNDEFINED:
|
||||||
|
|
|
||||||
|
|
@ -112,39 +112,48 @@ class CustomComponent(BaseComponent):
|
||||||
|
|
||||||
def update_state(self, name: str, value: Any):
|
def update_state(self, name: str, value: Any):
|
||||||
if not self._vertex:
|
if not self._vertex:
|
||||||
raise ValueError("Vertex is not set")
|
msg = "Vertex is not set"
|
||||||
|
raise ValueError(msg)
|
||||||
try:
|
try:
|
||||||
self._vertex.graph.update_state(name=name, record=value, caller=self._vertex.id)
|
self._vertex.graph.update_state(name=name, record=value, caller=self._vertex.id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error updating state: {e}")
|
msg = f"Error updating state: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def stop(self, output_name: str | None = None):
|
def stop(self, output_name: str | None = None):
|
||||||
if not output_name and self._vertex and len(self._vertex.outputs) == 1:
|
if not output_name and self._vertex and len(self._vertex.outputs) == 1:
|
||||||
output_name = self._vertex.outputs[0]["name"]
|
output_name = self._vertex.outputs[0]["name"]
|
||||||
elif not output_name:
|
elif not output_name:
|
||||||
raise ValueError("You must specify an output name to call stop")
|
msg = "You must specify an output name to call stop"
|
||||||
|
raise ValueError(msg)
|
||||||
if not self._vertex:
|
if not self._vertex:
|
||||||
raise ValueError("Vertex is not set")
|
msg = "Vertex is not set"
|
||||||
|
raise ValueError(msg)
|
||||||
try:
|
try:
|
||||||
self.graph.mark_branch(vertex_id=self._vertex.id, output_name=output_name, state="INACTIVE")
|
self.graph.mark_branch(vertex_id=self._vertex.id, output_name=output_name, state="INACTIVE")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error stopping {self.display_name}: {e}")
|
msg = f"Error stopping {self.display_name}: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def append_state(self, name: str, value: Any):
|
def append_state(self, name: str, value: Any):
|
||||||
if not self._vertex:
|
if not self._vertex:
|
||||||
raise ValueError("Vertex is not set")
|
msg = "Vertex is not set"
|
||||||
|
raise ValueError(msg)
|
||||||
try:
|
try:
|
||||||
self._vertex.graph.append_state(name=name, record=value, caller=self._vertex.id)
|
self._vertex.graph.append_state(name=name, record=value, caller=self._vertex.id)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error appending state: {e}")
|
msg = f"Error appending state: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def get_state(self, name: str):
|
def get_state(self, name: str):
|
||||||
if not self._vertex:
|
if not self._vertex:
|
||||||
raise ValueError("Vertex is not set")
|
msg = "Vertex is not set"
|
||||||
|
raise ValueError(msg)
|
||||||
try:
|
try:
|
||||||
return self._vertex.graph.get_state(name=name)
|
return self._vertex.graph.get_state(name=name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error getting state: {e}")
|
msg = f"Error getting state: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def resolve_path(path: str) -> str:
|
def resolve_path(path: str) -> str:
|
||||||
|
|
@ -270,14 +279,16 @@ class CustomComponent(BaseComponent):
|
||||||
try:
|
try:
|
||||||
data_dict[key] = model_dump[key]
|
data_dict[key] = model_dump[key]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise ValueError(f"Key {key} not found in {item}")
|
msg = f"Key {key} not found in {item}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
elif isinstance(item, str):
|
elif isinstance(item, str):
|
||||||
data_dict = {"text": item}
|
data_dict = {"text": item}
|
||||||
elif isinstance(item, dict):
|
elif isinstance(item, dict):
|
||||||
data_dict = item.copy()
|
data_dict = item.copy()
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Invalid data type: {type(item)}")
|
msg = f"Invalid data type: {type(item)}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
data_objects.append(Data(data=data_dict))
|
data_objects.append(Data(data=data_dict))
|
||||||
|
|
||||||
|
|
@ -416,7 +427,8 @@ class CustomComponent(BaseComponent):
|
||||||
|
|
||||||
def get_variable(name: str, field: str):
|
def get_variable(name: str, field: str):
|
||||||
if hasattr(self, "_user_id") and not self.user_id:
|
if hasattr(self, "_user_id") and not self.user_id:
|
||||||
raise ValueError(f"User id is not set for {self.__class__.__name__}")
|
msg = f"User id is not set for {self.__class__.__name__}"
|
||||||
|
raise ValueError(msg)
|
||||||
variable_service = get_variable_service() # Get service instance
|
variable_service = get_variable_service() # Get service instance
|
||||||
# Retrieve and decrypt the variable by name for the current user
|
# Retrieve and decrypt the variable by name for the current user
|
||||||
with session_scope() as session:
|
with session_scope() as session:
|
||||||
|
|
@ -436,7 +448,8 @@ class CustomComponent(BaseComponent):
|
||||||
List[str]: The names of the variables for the current user.
|
List[str]: The names of the variables for the current user.
|
||||||
"""
|
"""
|
||||||
if hasattr(self, "_user_id") and not self.user_id:
|
if hasattr(self, "_user_id") and not self.user_id:
|
||||||
raise ValueError(f"User id is not set for {self.__class__.__name__}")
|
msg = f"User id is not set for {self.__class__.__name__}"
|
||||||
|
raise ValueError(msg)
|
||||||
variable_service = get_variable_service()
|
variable_service = get_variable_service()
|
||||||
|
|
||||||
with session_scope() as session:
|
with session_scope() as session:
|
||||||
|
|
@ -469,7 +482,8 @@ class CustomComponent(BaseComponent):
|
||||||
|
|
||||||
async def load_flow(self, flow_id: str, tweaks: dict | None = None) -> Graph:
|
async def load_flow(self, flow_id: str, tweaks: dict | None = None) -> Graph:
|
||||||
if not self.user_id:
|
if not self.user_id:
|
||||||
raise ValueError("Session is invalid")
|
msg = "Session is invalid"
|
||||||
|
raise ValueError(msg)
|
||||||
return await load_flow(user_id=str(self._user_id), flow_id=flow_id, tweaks=tweaks)
|
return await load_flow(user_id=str(self._user_id), flow_id=flow_id, tweaks=tweaks)
|
||||||
|
|
||||||
async def run_flow(
|
async def run_flow(
|
||||||
|
|
@ -492,11 +506,13 @@ class CustomComponent(BaseComponent):
|
||||||
|
|
||||||
def list_flows(self) -> list[Data]:
|
def list_flows(self) -> list[Data]:
|
||||||
if not self.user_id:
|
if not self.user_id:
|
||||||
raise ValueError("Session is invalid")
|
msg = "Session is invalid"
|
||||||
|
raise ValueError(msg)
|
||||||
try:
|
try:
|
||||||
return list_flows(user_id=str(self._user_id))
|
return list_flows(user_id=str(self._user_id))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f"Error listing flows: {e}")
|
msg = f"Error listing flows: {e}"
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
def build(self, *args: Any, **kwargs: Any) -> Any:
|
def build(self, *args: Any, **kwargs: Any) -> Any:
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -124,7 +124,8 @@ class DirectoryReader:
|
||||||
Walk through the directory path and return a list of all .py files.
|
Walk through the directory path and return a list of all .py files.
|
||||||
"""
|
"""
|
||||||
if not (safe_path := self.get_safe_path()):
|
if not (safe_path := self.get_safe_path()):
|
||||||
raise CustomComponentPathValueError(f"The path needs to start with '{self.base_path}'.")
|
msg = f"The path needs to start with '{self.base_path}'."
|
||||||
|
raise CustomComponentPathValueError(msg)
|
||||||
|
|
||||||
file_list = []
|
file_list = []
|
||||||
safe_path_obj = Path(safe_path)
|
safe_path_obj = Path(safe_path)
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue