Fix code formatting and apply tweaks
This commit is contained in:
parent
02526a4906
commit
5ffb60e90f
14 changed files with 55 additions and 35 deletions
|
|
@ -1,9 +1,17 @@
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from fastapi import APIRouter, Depends, HTTPException, Query, WebSocket, WebSocketException, status,Body
|
from fastapi import APIRouter, Depends, HTTPException, Query, WebSocket, WebSocketException, status, Body
|
||||||
from fastapi.responses import StreamingResponse
|
from fastapi.responses import StreamingResponse
|
||||||
from langflow.api.utils import build_input_keys_response, format_elapsed_time
|
from langflow.api.utils import build_input_keys_response, format_elapsed_time
|
||||||
from langflow.api.v1.schemas import BuildStatus, BuiltResponse, InitResponse, ResultDict, StreamData, VertexBuildResponse, VerticesOrderResponse
|
from langflow.api.v1.schemas import (
|
||||||
|
BuildStatus,
|
||||||
|
BuiltResponse,
|
||||||
|
InitResponse,
|
||||||
|
ResultDict,
|
||||||
|
StreamData,
|
||||||
|
VertexBuildResponse,
|
||||||
|
VerticesOrderResponse,
|
||||||
|
)
|
||||||
from langflow.graph.vertex.base import StatelessVertex
|
from langflow.graph.vertex.base import StatelessVertex
|
||||||
from langflow.processing.process import process_tweaks_on_graph
|
from langflow.processing.process import process_tweaks_on_graph
|
||||||
from langflow.services.database.models.flow.flow import Flow
|
from langflow.services.database.models.flow.flow import Flow
|
||||||
|
|
@ -237,6 +245,7 @@ async def try_running_celery_task(vertex, user_id):
|
||||||
await vertex.build(user_id=user_id)
|
await vertex.build(user_id=user_id)
|
||||||
return vertex
|
return vertex
|
||||||
|
|
||||||
|
|
||||||
@router.get("/build/{flow_id}/vertices", response_model=VerticesOrderResponse)
|
@router.get("/build/{flow_id}/vertices", response_model=VerticesOrderResponse)
|
||||||
async def get_vertices(
|
async def get_vertices(
|
||||||
flow_id: str,
|
flow_id: str,
|
||||||
|
|
@ -260,6 +269,7 @@ async def get_vertices(
|
||||||
logger.error(f"Error checking build status: {exc}")
|
logger.error(f"Error checking build status: {exc}")
|
||||||
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
||||||
|
|
||||||
|
|
||||||
@router.post("/build/{flow_id}/vertices/{vertex_id}")
|
@router.post("/build/{flow_id}/vertices/{vertex_id}")
|
||||||
async def build_vertex(
|
async def build_vertex(
|
||||||
flow_id: str,
|
flow_id: str,
|
||||||
|
|
|
||||||
|
|
@ -214,6 +214,7 @@ class Token(BaseModel):
|
||||||
class ApiKeyCreateRequest(BaseModel):
|
class ApiKeyCreateRequest(BaseModel):
|
||||||
api_key: str
|
api_key: str
|
||||||
|
|
||||||
|
|
||||||
class VerticesOrderResponse(BaseModel):
|
class VerticesOrderResponse(BaseModel):
|
||||||
ids: List[List[str]]
|
ids: List[List[str]]
|
||||||
|
|
||||||
|
|
@ -223,6 +224,7 @@ class ResultDict(BaseModel):
|
||||||
artifacts: Optional[Any] = Field(default_factory=dict)
|
artifacts: Optional[Any] = Field(default_factory=dict)
|
||||||
"""Outputs of the vertex build process."""
|
"""Outputs of the vertex build process."""
|
||||||
|
|
||||||
|
|
||||||
class VertexBuildResponse(BaseModel):
|
class VertexBuildResponse(BaseModel):
|
||||||
id: str
|
id: str
|
||||||
valid: bool
|
valid: bool
|
||||||
|
|
@ -235,4 +237,4 @@ class VertexBuildResponse(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class VerticesBuiltResponse(BaseModel):
|
class VerticesBuiltResponse(BaseModel):
|
||||||
vertices: List[VertexBuildResponse]
|
vertices: List[VertexBuildResponse]
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ class AzureChatOpenAIComponent(CustomComponent):
|
||||||
"2023-07-01-preview",
|
"2023-07-01-preview",
|
||||||
"2023-08-01-preview",
|
"2023-08-01-preview",
|
||||||
"2023-09-01-preview",
|
"2023-09-01-preview",
|
||||||
"2023-12-01-preview"
|
"2023-12-01-preview",
|
||||||
]
|
]
|
||||||
|
|
||||||
def build_config(self):
|
def build_config(self):
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,7 @@ class Edge:
|
||||||
def __eq__(self, __value: object) -> bool:
|
def __eq__(self, __value: object) -> bool:
|
||||||
return self.__repr__() == __value.__repr__() if isinstance(__value, Edge) else False
|
return self.__repr__() == __value.__repr__() if isinstance(__value, Edge) else False
|
||||||
|
|
||||||
|
|
||||||
class ContractEdge(Edge):
|
class ContractEdge(Edge):
|
||||||
def __init__(self, source: "Vertex", target: "Vertex", raw_edge: dict):
|
def __init__(self, source: "Vertex", target: "Vertex", raw_edge: dict):
|
||||||
super().__init__(source, target, raw_edge)
|
super().__init__(source, target, raw_edge)
|
||||||
|
|
@ -132,9 +133,7 @@ class ContractEdge(Edge):
|
||||||
"""
|
"""
|
||||||
# Removes all keys that the values aren't python types like str, int, bool, etc.
|
# Removes all keys that the values aren't python types like str, int, bool, etc.
|
||||||
params = {
|
params = {
|
||||||
key: value
|
key: value for key, value in target.params.items() if isinstance(value, (str, int, bool, float, list, dict))
|
||||||
for key, value in target.params.items()
|
|
||||||
if isinstance(value, (str, int, bool, float, list, dict))
|
|
||||||
}
|
}
|
||||||
# if it is a list we need to check if the contents are python types
|
# if it is a list we need to check if the contents are python types
|
||||||
for key, value in params.items():
|
for key, value in params.items():
|
||||||
|
|
@ -195,7 +194,7 @@ async def log_message(
|
||||||
from langflow.graph.vertex.base import Vertex
|
from langflow.graph.vertex.base import Vertex
|
||||||
|
|
||||||
if isinstance(session_id, Vertex):
|
if isinstance(session_id, Vertex):
|
||||||
session_id = await session_id.build() # type: ignore
|
session_id = await session_id.build() # type: ignore
|
||||||
|
|
||||||
monitor_service = get_monitor_service()
|
monitor_service = get_monitor_service()
|
||||||
row = {
|
row = {
|
||||||
|
|
|
||||||
|
|
@ -254,7 +254,7 @@ class Graph:
|
||||||
vertex_ids = [vertex.id for vertex in self.vertices]
|
vertex_ids = [vertex.id for vertex in self.vertices]
|
||||||
edges_repr = "\n".join([f"{edge.source_id} --> {edge.target_id}" for edge in self.edges])
|
edges_repr = "\n".join([f"{edge.source_id} --> {edge.target_id}" for edge in self.edges])
|
||||||
return f"Graph:\nNodes: {vertex_ids}\nConnections:\n{edges_repr}"
|
return f"Graph:\nNodes: {vertex_ids}\nConnections:\n{edges_repr}"
|
||||||
|
|
||||||
def layered_topological_sort(self):
|
def layered_topological_sort(self):
|
||||||
in_degree = {vertex: 0 for vertex in self.vertices} # Initialize in-degrees
|
in_degree = {vertex: 0 for vertex in self.vertices} # Initialize in-degrees
|
||||||
graph = defaultdict(list) # Adjacency list representation
|
graph = defaultdict(list) # Adjacency list representation
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ from langflow.interface.utils import extract_input_variables_from_prompt
|
||||||
class UnbuiltObject:
|
class UnbuiltObject:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class UnbuiltResult:
|
class UnbuiltResult:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,7 @@ import ast
|
||||||
import inspect
|
import inspect
|
||||||
import types
|
import types
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import (TYPE_CHECKING, Any, Callable, Coroutine, Dict, List,
|
from typing import TYPE_CHECKING, Any, Callable, Coroutine, Dict, List, Optional
|
||||||
Optional)
|
|
||||||
|
|
||||||
from langflow.graph.utils import UnbuiltObject, UnbuiltResult
|
from langflow.graph.utils import UnbuiltObject, UnbuiltResult
|
||||||
from langflow.interface.initialize import loading
|
from langflow.interface.initialize import loading
|
||||||
|
|
@ -64,7 +63,13 @@ class Vertex:
|
||||||
edge_results = {}
|
edge_results = {}
|
||||||
for edge in self.edges:
|
for edge in self.edges:
|
||||||
target = self.graph.get_vertex(edge.target_id)
|
target = self.graph.get_vertex(edge.target_id)
|
||||||
if edge.is_fulfilled and isinstance(await edge.get_result(source=self, target=target, ), str):
|
if edge.is_fulfilled and isinstance(
|
||||||
|
await edge.get_result(
|
||||||
|
source=self,
|
||||||
|
target=target,
|
||||||
|
),
|
||||||
|
str,
|
||||||
|
):
|
||||||
if edge.target_id not in edge_results:
|
if edge.target_id not in edge_results:
|
||||||
edge_results[edge.target_id] = {}
|
edge_results[edge.target_id] = {}
|
||||||
edge_results[edge.target_id][edge.target_param] = await edge.get_result(source=self, target=target)
|
edge_results[edge.target_id][edge.target_param] = await edge.get_result(source=self, target=target)
|
||||||
|
|
@ -321,7 +326,7 @@ class Vertex:
|
||||||
# Check if the Vertex was built already
|
# Check if the Vertex was built already
|
||||||
if self._built:
|
if self._built:
|
||||||
return self._built_object
|
return self._built_object
|
||||||
|
|
||||||
if self.is_task and self.task_id is not None:
|
if self.is_task and self.task_id is not None:
|
||||||
task = self.get_task()
|
task = self.get_task()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,9 @@ Human: {input}
|
||||||
class MidJourneyPromptChain(BaseCustomConversationChain):
|
class MidJourneyPromptChain(BaseCustomConversationChain):
|
||||||
"""MidJourneyPromptChain is a chain you can use to generate new MidJourney prompts."""
|
"""MidJourneyPromptChain is a chain you can use to generate new MidJourney prompts."""
|
||||||
|
|
||||||
template: Optional[str] = """I want you to act as a prompt generator for Midjourney's artificial intelligence program.
|
template: Optional[
|
||||||
|
str
|
||||||
|
] = """I want you to act as a prompt generator for Midjourney's artificial intelligence program.
|
||||||
Your job is to provide detailed and creative descriptions that will inspire unique and interesting images from the AI.
|
Your job is to provide detailed and creative descriptions that will inspire unique and interesting images from the AI.
|
||||||
Keep in mind that the AI is capable of understanding a wide range of language and can interpret abstract concepts, so feel free to be as imaginative and descriptive as possible.
|
Keep in mind that the AI is capable of understanding a wide range of language and can interpret abstract concepts, so feel free to be as imaginative and descriptive as possible.
|
||||||
For example, you could describe a scene from a futuristic city, or a surreal landscape filled with strange creatures.
|
For example, you could describe a scene from a futuristic city, or a surreal landscape filled with strange creatures.
|
||||||
|
|
@ -81,7 +83,9 @@ class MidJourneyPromptChain(BaseCustomConversationChain):
|
||||||
|
|
||||||
|
|
||||||
class TimeTravelGuideChain(BaseCustomConversationChain):
|
class TimeTravelGuideChain(BaseCustomConversationChain):
|
||||||
template: Optional[str] = """I want you to act as my time travel guide. You are helpful and creative. I will provide you with the historical period or future time I want to visit and you will suggest the best events, sights, or people to experience. Provide the suggestions and any necessary information.
|
template: Optional[
|
||||||
|
str
|
||||||
|
] = """I want you to act as my time travel guide. You are helpful and creative. I will provide you with the historical period or future time I want to visit and you will suggest the best events, sights, or people to experience. Provide the suggestions and any necessary information.
|
||||||
Current conversation:
|
Current conversation:
|
||||||
{history}
|
{history}
|
||||||
Human: {input}
|
Human: {input}
|
||||||
|
|
|
||||||
|
|
@ -273,13 +273,13 @@ def apply_tweaks(node: Dict[str, Any], node_tweaks: Dict[str, Any]) -> None:
|
||||||
key = tweak_name if tweak_name == "file_path" else "value"
|
key = tweak_name if tweak_name == "file_path" else "value"
|
||||||
template_data[tweak_name][key] = tweak_value
|
template_data[tweak_name][key] = tweak_value
|
||||||
|
|
||||||
|
|
||||||
def apply_tweaks_on_vertex(vertex: Vertex, node_tweaks: Dict[str, Any]) -> None:
|
def apply_tweaks_on_vertex(vertex: Vertex, node_tweaks: Dict[str, Any]) -> None:
|
||||||
for tweak_name, tweak_value in node_tweaks.items():
|
for tweak_name, tweak_value in node_tweaks.items():
|
||||||
if tweak_name and tweak_value and tweak_name in vertex.params:
|
if tweak_name and tweak_value and tweak_name in vertex.params:
|
||||||
vertex.params[tweak_name] = tweak_value
|
vertex.params[tweak_name] = tweak_value
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def process_tweaks(graph_data: Dict[str, Any], tweaks: Dict[str, Dict[str, Any]]) -> Dict[str, Any]:
|
def process_tweaks(graph_data: Dict[str, Any], tweaks: Dict[str, Dict[str, Any]]) -> Dict[str, Any]:
|
||||||
"""
|
"""
|
||||||
This function is used to tweak the graph data using the node id and the tweaks dict.
|
This function is used to tweak the graph data using the node id and the tweaks dict.
|
||||||
|
|
@ -305,6 +305,7 @@ def process_tweaks(graph_data: Dict[str, Any], tweaks: Dict[str, Dict[str, Any]]
|
||||||
|
|
||||||
return graph_data
|
return graph_data
|
||||||
|
|
||||||
|
|
||||||
def process_tweaks_on_graph(graph: Graph, tweaks: Dict[str, Dict[str, Any]]):
|
def process_tweaks_on_graph(graph: Graph, tweaks: Dict[str, Dict[str, Any]]):
|
||||||
for vertex in graph.vertices:
|
for vertex in graph.vertices:
|
||||||
if isinstance(vertex, Vertex) and isinstance(vertex.id, str):
|
if isinstance(vertex, Vertex) and isinstance(vertex.id, str):
|
||||||
|
|
@ -314,4 +315,4 @@ def process_tweaks_on_graph(graph: Graph, tweaks: Dict[str, Dict[str, Any]]):
|
||||||
else:
|
else:
|
||||||
logger.warning("Each node should be a Vertex with an 'id' attribute of type str")
|
logger.warning("Each node should be a Vertex with an 'id' attribute of type str")
|
||||||
|
|
||||||
return graph
|
return graph
|
||||||
|
|
|
||||||
|
|
@ -235,7 +235,7 @@ class ChatService(Service):
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error(f"Error closing connection: {exc}")
|
logger.error(f"Error closing connection: {exc}")
|
||||||
self.disconnect(client_id)
|
self.disconnect(client_id)
|
||||||
|
|
||||||
def get_cache(self, client_id: str) -> Any:
|
def get_cache(self, client_id: str) -> Any:
|
||||||
"""
|
"""
|
||||||
Get the cache for a client.
|
Get the cache for a client.
|
||||||
|
|
@ -263,4 +263,4 @@ def list_of_dicts_to_markdown_table(dict_list):
|
||||||
row = [str(row_dict.get(header, "")) for header in headers]
|
row = [str(row_dict.get(header, "")) for header in headers]
|
||||||
markdown_table += "| " + " | ".join(row) + " |\n"
|
markdown_table += "| " + " | ".join(row) + " |\n"
|
||||||
|
|
||||||
return markdown_table
|
return markdown_table
|
||||||
|
|
|
||||||
|
|
@ -51,4 +51,4 @@ class FlowRead(FlowBase):
|
||||||
class FlowUpdate(SQLModelSerializable):
|
class FlowUpdate(SQLModelSerializable):
|
||||||
name: Optional[str] = None
|
name: Optional[str] = None
|
||||||
description: Optional[str] = None
|
description: Optional[str] = None
|
||||||
data: Optional[Dict] = None
|
data: Optional[Dict] = None
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,7 @@ from typing import TYPE_CHECKING
|
||||||
import duckdb
|
import duckdb
|
||||||
from langflow.services.base import Service
|
from langflow.services.base import Service
|
||||||
from langflow.services.monitor.schema import MessageModel, TransactionModel
|
from langflow.services.monitor.schema import MessageModel, TransactionModel
|
||||||
from langflow.services.monitor.utils import (
|
from langflow.services.monitor.utils import add_row_to_table, drop_and_create_table_if_schema_mismatch
|
||||||
add_row_to_table, drop_and_create_table_if_schema_mismatch)
|
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
from platformdirs import user_cache_dir
|
from platformdirs import user_cache_dir
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,9 +30,7 @@ class SettingsService(Service):
|
||||||
for key in settings_dict:
|
for key in settings_dict:
|
||||||
if key not in Settings.__fields__.keys():
|
if key not in Settings.__fields__.keys():
|
||||||
raise KeyError(f"Key {key} not found in settings")
|
raise KeyError(f"Key {key} not found in settings")
|
||||||
logger.debug(
|
logger.debug(f"Loading {len(settings_dict[key])} {key} from {file_path}")
|
||||||
f"Loading {len(settings_dict[key])} {key} from {file_path}"
|
|
||||||
)
|
|
||||||
|
|
||||||
settings = Settings(**settings_dict)
|
settings = Settings(**settings_dict)
|
||||||
if not settings.CONFIG_DIR:
|
if not settings.CONFIG_DIR:
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ export async function buildVertices({
|
||||||
let orderResponse = await getVerticesOrder(flow.id);
|
let orderResponse = await getVerticesOrder(flow.id);
|
||||||
console.log(orderResponse);
|
console.log(orderResponse);
|
||||||
let verticesOrder: Array<Array<string>> = orderResponse.data.ids;
|
let verticesOrder: Array<Array<string>> = orderResponse.data.ids;
|
||||||
console.log('order', verticesOrder);
|
console.log("order", verticesOrder);
|
||||||
|
|
||||||
// Determine the range of vertices to build
|
// Determine the range of vertices to build
|
||||||
let vertexIndex: number | null = null;
|
let vertexIndex: number | null = null;
|
||||||
|
|
@ -33,7 +33,9 @@ export async function buildVertices({
|
||||||
vertexIndex = verticesOrder.findIndex((ids) => ids.includes(nodeId));
|
vertexIndex = verticesOrder.findIndex((ids) => ids.includes(nodeId));
|
||||||
}
|
}
|
||||||
let buildRange =
|
let buildRange =
|
||||||
vertexIndex !== null ? verticesOrder.slice(0, vertexIndex + 1) : verticesOrder;
|
vertexIndex !== null
|
||||||
|
? verticesOrder.slice(0, vertexIndex + 1)
|
||||||
|
: verticesOrder;
|
||||||
console.log(buildRange);
|
console.log(buildRange);
|
||||||
|
|
||||||
const buildResults: boolean[] = [];
|
const buildResults: boolean[] = [];
|
||||||
|
|
@ -67,10 +69,10 @@ export async function buildVertices({
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (onBuildError) {
|
if (onBuildError) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
onBuildError(
|
onBuildError("Error Building Component", [
|
||||||
"Error Building Component",
|
(error as AxiosError<any>).response?.data?.detail ??
|
||||||
[(error as AxiosError<any>).response?.data?.detail ?? "Unknown Error"]
|
"Unknown Error",
|
||||||
);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -85,10 +87,9 @@ export async function buildVertices({
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Callback for handling errors
|
// Callback for handling errors
|
||||||
if (onBuildError) {
|
if (onBuildError) {
|
||||||
onBuildError(
|
onBuildError("Error Building Component", [
|
||||||
"Error Building Component",
|
(error as AxiosError<any>).response?.data?.detail ?? "Unknown Error",
|
||||||
[(error as AxiosError<any>).response?.data?.detail ?? "Unknown Error"]
|
]);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue