vectorvein 0.2.34__tar.gz → 0.2.36__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 (64) hide show
  1. {vectorvein-0.2.34 → vectorvein-0.2.36}/PKG-INFO +1 -1
  2. {vectorvein-0.2.34 → vectorvein-0.2.36}/pyproject.toml +1 -1
  3. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/graph/node.py +42 -3
  4. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/graph/workflow.py +5 -5
  5. {vectorvein-0.2.34 → vectorvein-0.2.36}/README.md +0 -0
  6. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/__init__.py +0 -0
  7. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/api/__init__.py +0 -0
  8. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/api/client.py +0 -0
  9. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/api/exceptions.py +0 -0
  10. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/api/models.py +0 -0
  11. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/__init__.py +0 -0
  12. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/anthropic_client.py +0 -0
  13. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/baichuan_client.py +0 -0
  14. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/base_client.py +0 -0
  15. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/deepseek_client.py +0 -0
  16. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/ernie_client.py +0 -0
  17. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/gemini_client.py +0 -0
  18. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/groq_client.py +0 -0
  19. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/local_client.py +0 -0
  20. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/minimax_client.py +0 -0
  21. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/mistral_client.py +0 -0
  22. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/moonshot_client.py +0 -0
  23. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/openai_client.py +0 -0
  24. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/openai_compatible_client.py +0 -0
  25. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/py.typed +0 -0
  26. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/qwen_client.py +0 -0
  27. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/stepfun_client.py +0 -0
  28. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/utils.py +0 -0
  29. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/xai_client.py +0 -0
  30. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/yi_client.py +0 -0
  31. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/chat_clients/zhipuai_client.py +0 -0
  32. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/py.typed +0 -0
  33. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/server/token_server.py +0 -0
  34. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/settings/__init__.py +0 -0
  35. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/settings/py.typed +0 -0
  36. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/types/__init__.py +0 -0
  37. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/types/defaults.py +0 -0
  38. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/types/enums.py +0 -0
  39. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/types/exception.py +0 -0
  40. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/types/llm_parameters.py +0 -0
  41. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/types/py.typed +0 -0
  42. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/types/settings.py +0 -0
  43. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/utilities/media_processing.py +0 -0
  44. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/utilities/rate_limiter.py +0 -0
  45. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/utilities/retry.py +0 -0
  46. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/graph/edge.py +0 -0
  47. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/graph/port.py +0 -0
  48. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/__init__.py +0 -0
  49. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/audio_generation.py +0 -0
  50. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/control_flows.py +0 -0
  51. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/file_processing.py +0 -0
  52. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/image_generation.py +0 -0
  53. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/llms.py +0 -0
  54. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/media_editing.py +0 -0
  55. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/media_processing.py +0 -0
  56. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/output.py +0 -0
  57. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/relational_db.py +0 -0
  58. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/text_processing.py +0 -0
  59. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/tools.py +0 -0
  60. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/triggers.py +0 -0
  61. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/vector_db.py +0 -0
  62. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/video_generation.py +0 -0
  63. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/nodes/web_crawlers.py +0 -0
  64. {vectorvein-0.2.34 → vectorvein-0.2.36}/src/vectorvein/workflow/utils/json_to_code.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: vectorvein
3
- Version: 0.2.34
3
+ Version: 0.2.36
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.34"
20
+ version = "0.2.36"
21
21
 
22
22
  [project.license]
23
23
  text = "MIT"
@@ -4,6 +4,37 @@ from typing import Dict, Any, Optional, List, Union
4
4
  from .port import PortType, Port, InputPort, OutputPort
5
5
 
6
6
 
7
+ class PortsDict(Dict[str, Port]):
8
+ """自定义字典类,用于管理节点的端口,并强制执行端口添加权限。"""
9
+
10
+ def __init__(self, owner_node: "Node", *args, **kwargs):
11
+ super().__init__(*args, **kwargs)
12
+ self._owner_node = owner_node
13
+ self._initializing = True # 初始化标志
14
+
15
+ def __setitem__(self, key: str, value: Port) -> None:
16
+ # 初始化阶段或端口已存在时,允许直接添加/更新
17
+ if self._initializing or key in self:
18
+ super().__setitem__(key, value)
19
+ return
20
+
21
+ # 对于新端口,检查添加权限
22
+ if isinstance(value, OutputPort) and not self._owner_node.can_add_output_ports:
23
+ raise ValueError(
24
+ f"Node<{self._owner_node.id}> '{self._owner_node.type}' does not allow adding output ports"
25
+ )
26
+ elif isinstance(value, InputPort) and not self._owner_node.can_add_input_ports:
27
+ raise ValueError(
28
+ f"Node<{self._owner_node.id}> '{self._owner_node.type}' does not allow adding input ports"
29
+ )
30
+
31
+ super().__setitem__(key, value)
32
+
33
+ def finish_initialization(self):
34
+ """结束初始化阶段"""
35
+ self._initializing = False
36
+
37
+
7
38
  class Node:
8
39
  def __init__(
9
40
  self,
@@ -25,7 +56,17 @@ class Node:
25
56
  self.category: str = category
26
57
  self.task_name: str = task_name
27
58
  self.description: str = description
28
- self.ports: Dict[str, Port] = ports or {}
59
+ self.can_add_input_ports: bool = can_add_input_ports
60
+ self.can_add_output_ports: bool = can_add_output_ports
61
+ # 初始化自定义PortsDict
62
+ self.ports = PortsDict(self)
63
+ # 如果提供了初始端口,将它们添加到字典中
64
+ if ports:
65
+ for name, port in ports.items():
66
+ self.ports[name] = port
67
+ # 结束初始化阶段
68
+ self.ports.finish_initialization()
69
+
29
70
  self.position: Dict[str, float] = position or {"x": 0, "y": 0}
30
71
  self.seleted_workflow_title: str = seleted_workflow_title
31
72
  self.is_template: bool = is_template
@@ -33,8 +74,6 @@ class Node:
33
74
  self.ignored: bool = False
34
75
  self.lock: bool = False
35
76
  self.shadow: bool = False
36
- self.can_add_input_ports: bool = can_add_input_ports
37
- self.can_add_output_ports: bool = can_add_output_ports
38
77
 
39
78
  def add_port(
40
79
  self,
@@ -48,28 +48,28 @@ class Workflow:
48
48
  # 检查源节点是否存在
49
49
  source_node_exists = any(node.id == source_node_id for node in self.nodes)
50
50
  if not source_node_exists:
51
- raise ValueError(f"源节点不存在: {source_node_id}")
51
+ raise ValueError(f"Source node not found: {source_node_id}")
52
52
 
53
53
  # 检查目标节点是否存在
54
54
  target_node_exists = any(node.id == target_node_id for node in self.nodes)
55
55
  if not target_node_exists:
56
- raise ValueError(f"目标节点不存在: {target_node_id}")
56
+ raise ValueError(f"Target node not found: {target_node_id}")
57
57
 
58
58
  # 检查源节点的端口是否存在
59
59
  source_node_obj = next(node for node in self.nodes if node.id == source_node_id)
60
60
  if not source_node_obj.has_output_port(source_port):
61
- raise ValueError(f"源节点 {source_node_id} 不存在输出端口: {source_port}")
61
+ raise ValueError(f"Source node {source_node_id} has no output port: {source_port}")
62
62
 
63
63
  # 检查目标节点的端口是否存在
64
64
  target_node_obj = next(node for node in self.nodes if node.id == target_node_id)
65
65
  if not target_node_obj.has_input_port(target_port):
66
- raise ValueError(f"目标节点 {target_node_id} 不存在输入端口: {target_port}")
66
+ raise ValueError(f"Target node {target_node_id} has no input port: {target_port}")
67
67
 
68
68
  # 检查目标端口是否已有被连接的线
69
69
  for edge in self.edges:
70
70
  if edge.target == target_node_id and edge.target_handle == target_port:
71
71
  raise ValueError(
72
- f"目标节点 {target_node_id} 的输入端口 {target_port} 已经被连接: {edge.source}({edge.source_handle}) → {edge.target}({edge.target_handle})"
72
+ f"The input port {target_port} of the target node {target_node_id} is already connected: {edge.source}({edge.source_handle}) → {edge.target}({edge.target_handle})"
73
73
  )
74
74
 
75
75
  # 创建并添加边
File without changes