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.
Files changed (66) hide show
  1. {vectorvein-0.2.54 → vectorvein-0.2.55}/PKG-INFO +1 -1
  2. {vectorvein-0.2.54 → vectorvein-0.2.55}/pyproject.toml +1 -1
  3. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/graph/node.py +6 -0
  4. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/graph/workflow.py +8 -3
  5. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/utils/check.py +25 -4
  6. {vectorvein-0.2.54 → vectorvein-0.2.55}/README.md +0 -0
  7. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/__init__.py +0 -0
  8. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/api/__init__.py +0 -0
  9. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/api/client.py +0 -0
  10. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/api/exceptions.py +0 -0
  11. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/api/models.py +0 -0
  12. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/__init__.py +0 -0
  13. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/anthropic_client.py +0 -0
  14. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/baichuan_client.py +0 -0
  15. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/base_client.py +0 -0
  16. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/deepseek_client.py +0 -0
  17. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/ernie_client.py +0 -0
  18. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/gemini_client.py +0 -0
  19. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/groq_client.py +0 -0
  20. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/local_client.py +0 -0
  21. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/minimax_client.py +0 -0
  22. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/mistral_client.py +0 -0
  23. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/moonshot_client.py +0 -0
  24. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/openai_client.py +0 -0
  25. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/openai_compatible_client.py +0 -0
  26. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/py.typed +0 -0
  27. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/qwen_client.py +0 -0
  28. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/stepfun_client.py +0 -0
  29. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/utils.py +0 -0
  30. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/xai_client.py +0 -0
  31. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/yi_client.py +0 -0
  32. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/chat_clients/zhipuai_client.py +0 -0
  33. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/py.typed +0 -0
  34. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/server/token_server.py +0 -0
  35. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/settings/__init__.py +0 -0
  36. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/settings/py.typed +0 -0
  37. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/__init__.py +0 -0
  38. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/defaults.py +0 -0
  39. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/enums.py +0 -0
  40. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/exception.py +0 -0
  41. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/llm_parameters.py +0 -0
  42. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/py.typed +0 -0
  43. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/types/settings.py +0 -0
  44. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/utilities/media_processing.py +0 -0
  45. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/utilities/rate_limiter.py +0 -0
  46. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/utilities/retry.py +0 -0
  47. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/graph/edge.py +0 -0
  48. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/graph/port.py +0 -0
  49. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/__init__.py +0 -0
  50. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/audio_generation.py +0 -0
  51. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/control_flows.py +0 -0
  52. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/file_processing.py +0 -0
  53. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/image_generation.py +0 -0
  54. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/llms.py +0 -0
  55. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/media_editing.py +0 -0
  56. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/media_processing.py +0 -0
  57. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/output.py +0 -0
  58. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/relational_db.py +0 -0
  59. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/text_processing.py +0 -0
  60. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/tools.py +0 -0
  61. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/triggers.py +0 -0
  62. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/vector_db.py +0 -0
  63. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/video_generation.py +0 -0
  64. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/nodes/web_crawlers.py +0 -0
  65. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/utils/json_to_code.py +0 -0
  66. {vectorvein-0.2.54 → vectorvein-0.2.55}/src/vectorvein/workflow/utils/layout.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vectorvein
3
- Version: 0.2.54
3
+ Version: 0.2.55
4
4
  Summary: VectorVein Python SDK
5
5
  Author-Email: Anderson <andersonby@163.com>
6
6
  License: MIT
@@ -17,7 +17,7 @@ description = "VectorVein Python SDK"
17
17
  name = "vectorvein"
18
18
  readme = "README.md"
19
19
  requires-python = ">=3.10"
20
- version = "0.2.54"
20
+ version = "0.2.55"
21
21
 
22
22
  [project.license]
23
23
  text = "MIT"
@@ -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 = dag_check
133
- result["ui_warnings"] = ui_check
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, total=False):
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") -> WorkflowCheckResult:
27
+ def check_dag(workflow: "Workflow"):
26
28
  """检查流程图是否为有向无环图,并检测是否存在孤立节点。
27
29
 
28
30
  Returns:
29
- WorkflowCheckResult: 包含检查结果的字典
31
+ 包含检查结果的字典
30
32
  - no_cycle (bool): 如果流程图是有向无环图返回 True,否则返回 False
31
33
  - no_isolated_nodes (bool): 如果不存在孤立节点返回 True,否则返回 False
32
34
  """
33
- result: WorkflowCheckResult = {"no_cycle": True, "no_isolated_nodes": True}
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