vectorvein 0.2.54__tar.gz → 0.2.55__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {vectorvein-0.2.54 → vectorvein-0.2.55}/PKG-INFO +1 -1
- {vectorvein-0.2.54 → vectorvein-0.2.55}/pyproject.toml +1 -1
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/graph/node.py +6 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/graph/workflow.py +8 -3
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/utils/check.py +25 -4
- {vectorvein-0.2.54 → vectorvein-0.2.55}/README.md +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/__init__.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/api/__init__.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/api/client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/api/exceptions.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/api/models.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/__init__.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/anthropic_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/baichuan_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/base_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/deepseek_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/ernie_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/gemini_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/groq_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/local_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/minimax_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/mistral_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/moonshot_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/openai_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/openai_compatible_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/py.typed +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/qwen_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/stepfun_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/utils.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/xai_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/yi_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/zhipuai_client.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/py.typed +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/server/token_server.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/settings/__init__.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/settings/py.typed +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/__init__.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/defaults.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/enums.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/exception.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/llm_parameters.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/py.typed +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/settings.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/utilities/media_processing.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/utilities/rate_limiter.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/utilities/retry.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/graph/edge.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/graph/port.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/__init__.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/audio_generation.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/control_flows.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/file_processing.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/image_generation.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/llms.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/media_editing.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/media_processing.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/output.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/relational_db.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/text_processing.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/tools.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/triggers.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/vector_db.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/video_generation.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/web_crawlers.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/utils/json_to_code.py +0 -0
- {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/utils/layout.py +0 -0
@@ -118,6 +118,12 @@ class Node:
|
|
118
118
|
"shadow": self.shadow,
|
119
119
|
}
|
120
120
|
|
121
|
+
def __str__(self) -> str:
|
122
|
+
return f"Node<{self.id}:{self.type}>"
|
123
|
+
|
124
|
+
def __repr__(self) -> str:
|
125
|
+
return self.__str__()
|
126
|
+
|
121
127
|
def has_inputs(self) -> bool:
|
122
128
|
for port in self.ports.values():
|
123
129
|
if isinstance(port, InputPort):
|
@@ -4,7 +4,7 @@ from typing import List, Union, Dict, Any, Optional
|
|
4
4
|
from .node import Node
|
5
5
|
from .edge import Edge
|
6
6
|
from ..utils.layout import layout
|
7
|
-
from ..utils.check import WorkflowCheckResult, check_dag, check_ui
|
7
|
+
from ..utils.check import WorkflowCheckResult, check_dag, check_ui, check_useless_nodes
|
8
8
|
|
9
9
|
|
10
10
|
class Workflow:
|
@@ -127,10 +127,15 @@ class Workflow:
|
|
127
127
|
"""
|
128
128
|
dag_check = check_dag(self) # 检查流程图是否为有向无环图,并检测是否存在孤立节点。
|
129
129
|
ui_check = check_ui(self)
|
130
|
+
useless_nodes = check_useless_nodes(self)
|
130
131
|
|
131
132
|
# 合并结果
|
132
|
-
result =
|
133
|
-
|
133
|
+
result: WorkflowCheckResult = {
|
134
|
+
"no_cycle": dag_check["no_cycle"],
|
135
|
+
"no_isolated_nodes": dag_check["no_isolated_nodes"],
|
136
|
+
"ui_warnings": ui_check,
|
137
|
+
"useless_nodes": useless_nodes,
|
138
|
+
}
|
134
139
|
|
135
140
|
return result
|
136
141
|
|
@@ -4,6 +4,7 @@ from ..graph.port import InputPort
|
|
4
4
|
|
5
5
|
if TYPE_CHECKING:
|
6
6
|
from ..graph.workflow import Workflow
|
7
|
+
from ..graph.node import Node
|
7
8
|
|
8
9
|
|
9
10
|
class UIWarning(TypedDict, total=False):
|
@@ -14,23 +15,24 @@ class UIWarning(TypedDict, total=False):
|
|
14
15
|
has_output_nodes: bool # 是否存在输出节点
|
15
16
|
|
16
17
|
|
17
|
-
class WorkflowCheckResult(TypedDict
|
18
|
+
class WorkflowCheckResult(TypedDict):
|
18
19
|
"""工作流检查结果类型。"""
|
19
20
|
|
20
21
|
no_cycle: bool # 工作流是否不包含环
|
21
22
|
no_isolated_nodes: bool # 工作流是否不包含孤立节点
|
23
|
+
useless_nodes: list["Node"] # 工作流中无用的节点
|
22
24
|
ui_warnings: UIWarning # UI相关警告
|
23
25
|
|
24
26
|
|
25
|
-
def check_dag(workflow: "Workflow")
|
27
|
+
def check_dag(workflow: "Workflow"):
|
26
28
|
"""检查流程图是否为有向无环图,并检测是否存在孤立节点。
|
27
29
|
|
28
30
|
Returns:
|
29
|
-
|
31
|
+
包含检查结果的字典
|
30
32
|
- no_cycle (bool): 如果流程图是有向无环图返回 True,否则返回 False
|
31
33
|
- no_isolated_nodes (bool): 如果不存在孤立节点返回 True,否则返回 False
|
32
34
|
"""
|
33
|
-
result
|
35
|
+
result = {"no_cycle": True, "no_isolated_nodes": True}
|
34
36
|
|
35
37
|
# 过滤掉触发器节点和辅助节点
|
36
38
|
trigger_nodes = [
|
@@ -159,3 +161,22 @@ def check_ui(workflow: "Workflow") -> UIWarning:
|
|
159
161
|
warnings["has_shown_input_ports"] = has_shown_input_ports
|
160
162
|
|
161
163
|
return warnings
|
164
|
+
|
165
|
+
|
166
|
+
def check_useless_nodes(workflow: "Workflow") -> list["Node"]:
|
167
|
+
"""检查工作流中是否存在无用的节点。
|
168
|
+
|
169
|
+
无用的节点定义:
|
170
|
+
1. 节点非 output 类节点,并且节点的输出端口没有任何连线,说明该节点数据不会传给下一个节点或者显示出来。
|
171
|
+
"""
|
172
|
+
useless_nodes = []
|
173
|
+
source_nodes = set(edge.source for edge in workflow.edges)
|
174
|
+
|
175
|
+
for node in workflow.nodes:
|
176
|
+
if hasattr(node, "category") and node.category == "outputs":
|
177
|
+
continue
|
178
|
+
|
179
|
+
if node.id not in source_nodes:
|
180
|
+
useless_nodes.append(node)
|
181
|
+
|
182
|
+
return useless_nodes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/openai_compatible_client.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|