vectorvein 0.2.68__tar.gz → 0.2.71__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 (67) hide show
  1. {vectorvein-0.2.68 → vectorvein-0.2.71}/PKG-INFO +1 -1
  2. {vectorvein-0.2.68 → vectorvein-0.2.71}/pyproject.toml +1 -1
  3. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/anthropic_client.py +2 -2
  4. vectorvein-0.2.71/src/vectorvein/workflow/utils/analyse.py +115 -0
  5. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/utils/json_to_code.py +8 -2
  6. {vectorvein-0.2.68 → vectorvein-0.2.71}/README.md +0 -0
  7. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/__init__.py +0 -0
  8. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/api/__init__.py +0 -0
  9. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/api/client.py +0 -0
  10. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/api/exceptions.py +0 -0
  11. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/api/models.py +0 -0
  12. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/__init__.py +0 -0
  13. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/baichuan_client.py +0 -0
  14. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/base_client.py +0 -0
  15. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/deepseek_client.py +0 -0
  16. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/ernie_client.py +0 -0
  17. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/gemini_client.py +0 -0
  18. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/groq_client.py +0 -0
  19. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/local_client.py +0 -0
  20. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/minimax_client.py +0 -0
  21. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/mistral_client.py +0 -0
  22. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/moonshot_client.py +0 -0
  23. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/openai_client.py +0 -0
  24. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/openai_compatible_client.py +0 -0
  25. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/py.typed +0 -0
  26. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/qwen_client.py +0 -0
  27. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/stepfun_client.py +0 -0
  28. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/utils.py +0 -0
  29. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/xai_client.py +0 -0
  30. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/yi_client.py +0 -0
  31. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/chat_clients/zhipuai_client.py +0 -0
  32. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/py.typed +0 -0
  33. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/server/token_server.py +0 -0
  34. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/settings/__init__.py +0 -0
  35. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/settings/py.typed +0 -0
  36. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/types/__init__.py +0 -0
  37. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/types/defaults.py +0 -0
  38. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/types/enums.py +0 -0
  39. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/types/exception.py +0 -0
  40. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/types/llm_parameters.py +0 -0
  41. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/types/py.typed +0 -0
  42. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/types/settings.py +0 -0
  43. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/utilities/media_processing.py +0 -0
  44. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/utilities/rate_limiter.py +0 -0
  45. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/utilities/retry.py +0 -0
  46. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/graph/edge.py +0 -0
  47. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/graph/node.py +0 -0
  48. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/graph/port.py +0 -0
  49. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/graph/workflow.py +0 -0
  50. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/__init__.py +0 -0
  51. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/audio_generation.py +0 -0
  52. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/control_flows.py +0 -0
  53. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/file_processing.py +0 -0
  54. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/image_generation.py +0 -0
  55. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/llms.py +0 -0
  56. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/media_editing.py +0 -0
  57. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/media_processing.py +0 -0
  58. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/output.py +0 -0
  59. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/relational_db.py +0 -0
  60. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/text_processing.py +0 -0
  61. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/tools.py +0 -0
  62. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/triggers.py +0 -0
  63. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/vector_db.py +0 -0
  64. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/video_generation.py +0 -0
  65. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/nodes/web_crawlers.py +0 -0
  66. {vectorvein-0.2.68 → vectorvein-0.2.71}/src/vectorvein/workflow/utils/check.py +0 -0
  67. {vectorvein-0.2.68 → vectorvein-0.2.71}/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.68
3
+ Version: 0.2.71
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.68"
20
+ version = "0.2.71"
21
21
 
22
22
  [project.license]
23
23
  text = "MIT"
@@ -766,7 +766,7 @@ class AnthropicChatClient(BaseChatClient):
766
766
  "usage": {
767
767
  "prompt_tokens": response.usage.input_tokens + response.usage.cache_read_input_tokens
768
768
  if response.usage.cache_read_input_tokens
769
- else 0,
769
+ else response.usage.input_tokens,
770
770
  "completion_tokens": response.usage.output_tokens,
771
771
  "total_tokens": response.usage.input_tokens + response.usage.output_tokens,
772
772
  "prompt_tokens_details": {
@@ -1377,7 +1377,7 @@ class AsyncAnthropicChatClient(BaseAsyncChatClient):
1377
1377
  "usage": {
1378
1378
  "prompt_tokens": response.usage.input_tokens + response.usage.cache_read_input_tokens
1379
1379
  if response.usage.cache_read_input_tokens
1380
- else 0,
1380
+ else response.usage.input_tokens,
1381
1381
  "completion_tokens": response.usage.output_tokens,
1382
1382
  "total_tokens": response.usage.input_tokens + response.usage.output_tokens,
1383
1383
  "prompt_tokens_details": {
@@ -0,0 +1,115 @@
1
+ import json
2
+ from typing import TypedDict, Any
3
+
4
+
5
+ class PortRecord(TypedDict):
6
+ """
7
+ 端口记录
8
+ """
9
+
10
+ name: str
11
+ type: str
12
+ show: bool
13
+ value: Any
14
+ connected: bool
15
+
16
+
17
+ class NodeRecord(TypedDict):
18
+ """
19
+ 节点记录
20
+ """
21
+
22
+ id: str
23
+ name: str
24
+ type: str
25
+ category: str
26
+ ports: list[PortRecord]
27
+
28
+
29
+ class AnalyseResult(TypedDict):
30
+ """
31
+ 分析结果
32
+ """
33
+
34
+ nodes: list[NodeRecord]
35
+
36
+
37
+ def analyse_workflow_record(
38
+ json_str: str, connected_only: bool = False, reserver_programming_function_ports: bool = False
39
+ ) -> AnalyseResult:
40
+ """
41
+ 分析工作流JSON字符串,提取节点和端口信息
42
+
43
+ Args:
44
+ json_str: 工作流JSON字符串
45
+
46
+ Returns:
47
+ 分析结果
48
+ """
49
+ # 解析JSON
50
+ workflow_data = json.loads(json_str)
51
+
52
+ # 收集所有连接的端口
53
+ connected_ports = set()
54
+ for edge in workflow_data["edges"]:
55
+ source_id = edge["source"]
56
+ target_id = edge["target"]
57
+ source_handle = edge["sourceHandle"]
58
+ target_handle = edge["targetHandle"]
59
+ connected_ports.add((source_id, source_handle))
60
+ connected_ports.add((target_id, target_handle))
61
+
62
+ # 分析节点
63
+ nodes_records = []
64
+
65
+ for node in workflow_data["nodes"]:
66
+ node_id = node["id"]
67
+ node_type = node["type"]
68
+ category = node["category"]
69
+
70
+ # 跳过辅助节点
71
+ if category == "assistedNodes":
72
+ continue
73
+
74
+ # 获取任务名称
75
+ task_name = node["data"]["task_name"].split(".")[-1] if "task_name" in node["data"] else ""
76
+
77
+ # 收集端口信息
78
+ ports_records = []
79
+
80
+ if "template" in node["data"]:
81
+ for port_name, port in node["data"]["template"].items():
82
+ if "name" not in port:
83
+ continue
84
+
85
+ port_is_connected = (node_id, port["name"]) in connected_ports
86
+
87
+ if node_type != "ProgrammingFunction" or not reserver_programming_function_ports:
88
+ if connected_only and not port_is_connected:
89
+ continue
90
+
91
+ port_record: PortRecord = {
92
+ "name": port["name"],
93
+ "type": port.get("field_type", port.get("type", "")),
94
+ "show": port.get("show", False),
95
+ "value": port.get("value", None),
96
+ "connected": port_is_connected,
97
+ }
98
+
99
+ ports_records.append(port_record)
100
+
101
+ # 创建节点记录
102
+ node_record: NodeRecord = {
103
+ "id": node_id,
104
+ "name": task_name,
105
+ "type": node_type,
106
+ "category": category,
107
+ "ports": ports_records,
108
+ }
109
+
110
+ nodes_records.append(node_record)
111
+
112
+ # 返回分析结果
113
+ result: AnalyseResult = {"nodes": nodes_records}
114
+
115
+ return result
@@ -135,12 +135,18 @@ def generate_python_code(
135
135
  port_value = port["value"]
136
136
  default_value = node_instance.ports[port_name].value if port_name in node_instance.ports else None
137
137
 
138
- # 判断端口是否有值且值与默认不同,并且端口满足以下条件之一:有连接、是输入端口、在UI上显示
138
+ # 判断端口是否有值且值与默认不同,并且端口满足以下条件之一:
139
+ # 有连接、是输入端口、在UI上显示、是编程节点
139
140
  port_is_connected = (node["id"], port["name"]) in connected_ports
140
141
  if (
141
142
  port_value
142
143
  and port_value != default_value
143
- and (port_is_connected or not port.get("is_output", False) or port.get("show", False))
144
+ and (
145
+ port_is_connected
146
+ or not port.get("is_output", False)
147
+ or port.get("show", False)
148
+ or node_type == "ProgrammingFunction"
149
+ )
144
150
  ):
145
151
  values.append(port)
146
152
 
File without changes