pygpt-net 2.6.58__py3-none-any.whl → 2.6.60__py3-none-any.whl

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 (72) hide show
  1. pygpt_net/CHANGELOG.txt +10 -0
  2. pygpt_net/__init__.py +3 -3
  3. pygpt_net/app.py +9 -5
  4. pygpt_net/controller/__init__.py +1 -0
  5. pygpt_net/controller/presets/editor.py +442 -39
  6. pygpt_net/core/agents/custom/__init__.py +275 -0
  7. pygpt_net/core/agents/custom/debug.py +64 -0
  8. pygpt_net/core/agents/custom/factory.py +109 -0
  9. pygpt_net/core/agents/custom/graph.py +71 -0
  10. pygpt_net/core/agents/custom/llama_index/__init__.py +10 -0
  11. pygpt_net/core/agents/custom/llama_index/factory.py +89 -0
  12. pygpt_net/core/agents/custom/llama_index/router_streamer.py +106 -0
  13. pygpt_net/core/agents/custom/llama_index/runner.py +529 -0
  14. pygpt_net/core/agents/custom/llama_index/stream.py +56 -0
  15. pygpt_net/core/agents/custom/llama_index/utils.py +242 -0
  16. pygpt_net/core/agents/custom/logging.py +50 -0
  17. pygpt_net/core/agents/custom/memory.py +51 -0
  18. pygpt_net/core/agents/custom/router.py +116 -0
  19. pygpt_net/core/agents/custom/router_streamer.py +187 -0
  20. pygpt_net/core/agents/custom/runner.py +454 -0
  21. pygpt_net/core/agents/custom/schema.py +125 -0
  22. pygpt_net/core/agents/custom/utils.py +181 -0
  23. pygpt_net/core/agents/provider.py +72 -7
  24. pygpt_net/core/agents/runner.py +7 -4
  25. pygpt_net/core/agents/runners/helpers.py +1 -1
  26. pygpt_net/core/agents/runners/llama_workflow.py +3 -0
  27. pygpt_net/core/agents/runners/openai_workflow.py +8 -1
  28. pygpt_net/core/filesystem/parser.py +37 -24
  29. pygpt_net/{ui/widget/builder → core/node_editor}/__init__.py +2 -2
  30. pygpt_net/core/{builder → node_editor}/graph.py +11 -218
  31. pygpt_net/core/node_editor/models.py +111 -0
  32. pygpt_net/core/node_editor/types.py +76 -0
  33. pygpt_net/core/node_editor/utils.py +17 -0
  34. pygpt_net/core/render/web/renderer.py +10 -8
  35. pygpt_net/data/config/config.json +3 -3
  36. pygpt_net/data/config/models.json +3 -3
  37. pygpt_net/data/locale/locale.en.ini +4 -4
  38. pygpt_net/data/locale/plugin.cmd_system.en.ini +68 -0
  39. pygpt_net/item/agent.py +5 -1
  40. pygpt_net/item/preset.py +19 -1
  41. pygpt_net/plugin/cmd_system/config.py +377 -1
  42. pygpt_net/plugin/cmd_system/plugin.py +52 -8
  43. pygpt_net/plugin/cmd_system/runner.py +508 -32
  44. pygpt_net/plugin/cmd_system/winapi.py +481 -0
  45. pygpt_net/plugin/cmd_system/worker.py +88 -15
  46. pygpt_net/provider/agents/base.py +33 -2
  47. pygpt_net/provider/agents/llama_index/flow_from_schema.py +92 -0
  48. pygpt_net/provider/agents/llama_index/workflow/supervisor.py +0 -0
  49. pygpt_net/provider/agents/openai/flow_from_schema.py +96 -0
  50. pygpt_net/provider/core/agent/json_file.py +11 -5
  51. pygpt_net/provider/llms/openai.py +6 -4
  52. pygpt_net/tools/agent_builder/tool.py +217 -52
  53. pygpt_net/tools/agent_builder/ui/dialogs.py +119 -24
  54. pygpt_net/tools/agent_builder/ui/list.py +37 -10
  55. pygpt_net/tools/code_interpreter/ui/html.py +2 -1
  56. pygpt_net/ui/dialog/preset.py +16 -1
  57. pygpt_net/ui/main.py +1 -1
  58. pygpt_net/{core/builder → ui/widget/node_editor}/__init__.py +2 -2
  59. pygpt_net/ui/widget/node_editor/command.py +373 -0
  60. pygpt_net/ui/widget/node_editor/editor.py +2038 -0
  61. pygpt_net/ui/widget/node_editor/item.py +492 -0
  62. pygpt_net/ui/widget/node_editor/node.py +1205 -0
  63. pygpt_net/ui/widget/node_editor/utils.py +17 -0
  64. pygpt_net/ui/widget/node_editor/view.py +247 -0
  65. pygpt_net/ui/widget/textarea/web.py +1 -1
  66. {pygpt_net-2.6.58.dist-info → pygpt_net-2.6.60.dist-info}/METADATA +135 -61
  67. {pygpt_net-2.6.58.dist-info → pygpt_net-2.6.60.dist-info}/RECORD +69 -42
  68. pygpt_net/core/agents/custom.py +0 -150
  69. pygpt_net/ui/widget/builder/editor.py +0 -2001
  70. {pygpt_net-2.6.58.dist-info → pygpt_net-2.6.60.dist-info}/LICENSE +0 -0
  71. {pygpt_net-2.6.58.dist-info → pygpt_net-2.6.60.dist-info}/WHEEL +0 -0
  72. {pygpt_net-2.6.58.dist-info → pygpt_net-2.6.60.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2025.09.24 00:00:00 #
10
+ # ================================================== #
11
+
12
+ # Safety: check C++ pointer validity to avoid calling methods on deleted Qt objects
13
+ try:
14
+ from shiboken6 import isValid as _qt_is_valid
15
+ except Exception:
16
+ def _qt_is_valid(obj) -> bool:
17
+ return obj is not None
@@ -0,0 +1,247 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2025.09.24 00:00:00 #
10
+ # ================================================== #
11
+
12
+ from __future__ import annotations
13
+ from typing import Optional, Tuple
14
+
15
+ from PySide6.QtCore import Qt, QPointF, QRectF, QObject, Signal
16
+ from PySide6.QtGui import QColor, QPainter, QPen, QTransform
17
+ from PySide6.QtWidgets import QWidget, QGraphicsView, QGraphicsScene
18
+
19
+
20
+ # ------------------------ Graphics View / Scene ------------------------
21
+
22
+ class NodeGraphicsView(QGraphicsView):
23
+ """Zoomable, pannable view with a grid background.
24
+
25
+ The view renders a lightweight grid and supports:
26
+ - Ctrl + Mouse Wheel zooming
27
+ - Middle Mouse Button panning
28
+ - Rubber band selection
29
+
30
+ Notes:
31
+ - Space-panning is intentionally disabled to not conflict with typing in editors.
32
+ - All keyboard shortcuts (e.g., Delete) are handled at the NodeEditor level.
33
+
34
+ Args:
35
+ scene: Shared QGraphicsScene instance for the editor.
36
+ parent: Optional parent widget.
37
+ """
38
+ def __init__(self, scene: QGraphicsScene, parent: Optional[QWidget] = None):
39
+ super().__init__(scene, parent)
40
+ self.setRenderHints(self.renderHints() |
41
+ QPainter.Antialiasing | QPainter.TextAntialiasing | QPainter.SmoothPixmapTransform)
42
+ self.setViewportUpdateMode(QGraphicsView.FullViewportUpdate)
43
+ self.setDragMode(QGraphicsView.RubberBandDrag)
44
+ self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
45
+ a = QGraphicsView.AnchorViewCenter
46
+ self.setResizeAnchor(a)
47
+ self.setFocusPolicy(Qt.StrongFocus)
48
+
49
+ self._zoom = 1.0
50
+ self._zoom_step = 1.15
51
+ self._min_zoom = 0.2
52
+ self._max_zoom = 3.0
53
+
54
+ self._panning = False
55
+ self._last_pan_pos = None
56
+
57
+ def drawBackground(self, painter: QPainter, rect: QRectF):
58
+ """Draw the checker grid in the background.
59
+
60
+ The grid spacing is fixed (20 px). Colors are read from the owning NodeEditor
61
+ instance if available, which allows dynamic theming.
62
+
63
+ Args:
64
+ painter: Active QPainter provided by Qt.
65
+ rect: The exposed background rect to be filled.
66
+ """
67
+ parent_editor = self.parent() # NodeEditor
68
+ color_back = getattr(parent_editor, "_grid_back_color", QColor(35, 35, 38))
69
+ color_pen = getattr(parent_editor, "_grid_pen_color", QColor(55, 55, 60))
70
+ painter.fillRect(rect, color_back)
71
+ pen = QPen(color_pen)
72
+ pen.setWidthF(1.0)
73
+ painter.setPen(pen)
74
+ grid = 20
75
+ left = int(rect.left()) - (int(rect.left()) % grid)
76
+ top = int(rect.top()) - (int(rect.top()) % grid)
77
+ x = left
78
+ while x < rect.right():
79
+ painter.drawLine(x, rect.top(), x, rect.bottom())
80
+ x += grid
81
+ y = top
82
+ while y < rect.bottom():
83
+ painter.drawLine(rect.left(), y, rect.right(), y)
84
+ y += grid
85
+
86
+ def keyPressEvent(self, e):
87
+ """Pass-through: the view does not handle special keys.
88
+
89
+ ESC and other keys are intentionally left for the host application/editor.
90
+ """
91
+ super().keyPressEvent(e)
92
+
93
+ def keyReleaseEvent(self, e):
94
+ """Pass-through for key release."""
95
+ super().keyReleaseEvent(e)
96
+
97
+ def wheelEvent(self, e):
98
+ """Handle Ctrl + Wheel zoom. Otherwise, default wheel behavior (scroll)."""
99
+ if e.modifiers() & Qt.ControlModifier:
100
+ self._apply_zoom(self._zoom_step if e.angleDelta().y() > 0 else 1.0 / self._zoom_step)
101
+ e.accept()
102
+ return
103
+ super().wheelEvent(e)
104
+
105
+ def mousePressEvent(self, e):
106
+ """Start panning with Middle Mouse Button; otherwise defer to base implementation."""
107
+ if e.button() == Qt.MiddleButton:
108
+ self._panning = True
109
+ self._last_pan_pos = e.position()
110
+ self.setCursor(Qt.ClosedHandCursor)
111
+ e.accept()
112
+ return
113
+ super().mousePressEvent(e)
114
+
115
+ def mouseMoveEvent(self, e):
116
+ """While panning, translate scrollbars. Otherwise defer."""
117
+ if self._panning and self._last_pan_pos is not None:
118
+ delta = e.position() - self._last_pan_pos
119
+ self._last_pan_pos = e.position()
120
+ self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - int(delta.x()))
121
+ self.verticalScrollBar().setValue(self.verticalScrollBar().value() - int(delta.y()))
122
+ e.accept()
123
+ return
124
+ super().mouseMoveEvent(e)
125
+
126
+ def mouseReleaseEvent(self, e):
127
+ """Stop panning on Middle Mouse Button release; otherwise defer."""
128
+ if self._panning and e.button() == Qt.MiddleButton:
129
+ self._panning = False
130
+ self.setCursor(Qt.ArrowCursor)
131
+ e.accept()
132
+ return
133
+ super().mouseReleaseEvent(e)
134
+
135
+ def zoom_in(self):
136
+ """Programmatically zoom in by a predefined step."""
137
+ self._apply_zoom(self._zoom_step)
138
+
139
+ def zoom_out(self):
140
+ """Programmatically zoom out by a predefined step."""
141
+ self._apply_zoom(1.0 / self._zoom_step)
142
+
143
+ def _apply_zoom(self, factor: float):
144
+ """Apply zoom scaling factor within configured bounds.
145
+
146
+ Args:
147
+ factor: Multiplicative factor to apply to the current zoom.
148
+
149
+ Notes:
150
+ The method clamps the result to [_min_zoom, _max_zoom] to prevent
151
+ excessive zooming.
152
+ """
153
+ new_zoom = self._zoom * factor
154
+ if not (self._min_zoom <= new_zoom <= self._max_zoom):
155
+ return
156
+ self._zoom = new_zoom
157
+ self.scale(factor, factor)
158
+
159
+ def zoom_value(self) -> float:
160
+ """Return the current zoom factor."""
161
+ return float(self._zoom)
162
+
163
+ def set_zoom_value(self, zoom: float, keep_center: bool = False):
164
+ """Set an absolute zoom factor and optionally keep the current viewport center."""
165
+ if zoom is None:
166
+ return
167
+ z = max(self._min_zoom, min(self._max_zoom, float(zoom)))
168
+ center_scene = None
169
+ if keep_center and self.viewport() is not None and self.viewport().rect().isValid():
170
+ center_scene = self.mapToScene(self.viewport().rect().center())
171
+
172
+ # Reset and apply new transform to avoid cumulative floating errors
173
+ self.resetTransform()
174
+ self._zoom = 1.0
175
+ if abs(z - 1.0) > 1e-9:
176
+ self.scale(z, z)
177
+ self._zoom = z
178
+
179
+ if keep_center and center_scene is not None:
180
+ self.centerOn(center_scene)
181
+
182
+ def get_scroll_values(self) -> Tuple[int, int]:
183
+ """Return (horizontal, vertical) scrollbar values."""
184
+ h = self.horizontalScrollBar().value() if self.horizontalScrollBar() else 0
185
+ v = self.verticalScrollBar().value() if self.verticalScrollBar() else 0
186
+ return int(h), int(v)
187
+
188
+ def set_scroll_values(self, h: int, v: int):
189
+ """Set horizontal and vertical scrollbar values."""
190
+ if self.horizontalScrollBar():
191
+ self.horizontalScrollBar().setValue(int(h))
192
+ if self.verticalScrollBar():
193
+ self.verticalScrollBar().setValue(int(v))
194
+
195
+ def view_state(self) -> dict:
196
+ """Return a serializable view state: zoom and scrollbars."""
197
+ h, v = self.get_scroll_values()
198
+ return {"zoom": float(self._zoom), "h": h, "v": v}
199
+
200
+ def set_view_state(self, state: dict):
201
+ """Apply a view state previously produced by view_state()."""
202
+ if not isinstance(state, dict):
203
+ return
204
+ z = state.get("zoom") or state.get("scale")
205
+ if z is not None:
206
+ try:
207
+ self.set_zoom_value(float(z), keep_center=False)
208
+ except Exception:
209
+ pass
210
+ h = state.get("h") or state.get("hScroll") or state.get("x")
211
+ v = state.get("v") or state.get("vScroll") or state.get("y")
212
+ try:
213
+ if h is not None:
214
+ self.set_scroll_values(int(h), int(v if v is not None else 0))
215
+ elif v is not None:
216
+ # set vertical if only v present
217
+ self.set_scroll_values(self.get_scroll_values()[0], int(v))
218
+ except Exception:
219
+ pass
220
+
221
+
222
+ class NodeGraphicsScene(QGraphicsScene):
223
+ """Graphics scene extended with custom context menu emission."""
224
+ sceneContextRequested = Signal(QPointF)
225
+
226
+ def __init__(self, parent: Optional[QObject] = None):
227
+ """Initialize the scene and set a very large scene rect.
228
+
229
+ Using a large default rect avoids sudden scene rect changes while panning/zooming.
230
+ """
231
+ super().__init__(parent)
232
+ self.setSceneRect(-5000, -5000, 10000, 10000)
233
+
234
+ def contextMenuEvent(self, event):
235
+ """Emit a scene-level context menu request when clicking empty space.
236
+
237
+ If the click is not on any item, the signal sceneContextRequested is emitted with
238
+ the scene position. Otherwise, default handling is used (propagating to items).
239
+ """
240
+ transform = self.views()[0].transform() if self.views() else QTransform()
241
+ item = self.itemAt(event.scenePos(), transform)
242
+ if item is None:
243
+ self.sceneContextRequested.emit(event.scenePos())
244
+ event.accept()
245
+ return
246
+ super().contextMenuEvent(event)
247
+
@@ -531,7 +531,7 @@ class CustomWebEnginePage(QWebEnginePage):
531
531
  return super().acceptNavigationRequest(url, _type, isMainFrame)
532
532
 
533
533
  def javaScriptConsoleMessage(self, level, message, line_number, source_id):
534
- print("[JS CONSOLE] Line", line_number, ":", message)
534
+ # print("[JS CONSOLE] Line", line_number, ":", message)
535
535
  self.signals.js_message.emit(line_number, message, source_id) # handled in debug controller
536
536
 
537
537
  def cleanup(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pygpt-net
3
- Version: 2.6.58
3
+ Version: 2.6.60
4
4
  Summary: Desktop AI Assistant powered by: OpenAI GPT-5, GPT-4, o1, o3, Gemini, Claude, Grok, DeepSeek, and other models supported by Llama Index, and Ollama. Chatbot, agents, completion, image generation, vision analysis, speech-to-text, plugins, MCP, internet access, file handling, command execution and more.
5
5
  License: MIT
6
6
  Keywords: ai,api,api key,app,assistant,bielik,chat,chatbot,chatgpt,claude,dall-e,deepseek,desktop,gemini,gpt,gpt-3.5,gpt-4,gpt-4-vision,gpt-4o,gpt-5,gpt-oss,gpt3.5,gpt4,grok,langchain,llama-index,llama3,mistral,o1,o3,ollama,openai,presets,py-gpt,py_gpt,pygpt,pyside,qt,text completion,tts,ui,vision,whisper
@@ -20,91 +20,89 @@ Requires-Dist: Markdown (>=3.8.2,<4.0.0)
20
20
  Requires-Dist: PyAudio (>=0.2.14,<0.3.0)
21
21
  Requires-Dist: PyAutoGUI (>=0.9.54,<0.10.0)
22
22
  Requires-Dist: PySide6 (==6.9.1)
23
- Requires-Dist: Pygments (>=2.19.2,<3.0.0)
24
- Requires-Dist: SQLAlchemy (>=2.0.43,<3.0.0)
23
+ Requires-Dist: Pygments (==2.19.2)
24
+ Requires-Dist: SQLAlchemy (==2.0.43)
25
25
  Requires-Dist: SpeechRecognition (>=3.14.3,<4.0.0)
26
26
  Requires-Dist: Telethon (>=1.40.0,<2.0.0)
27
- Requires-Dist: anthropic (>=0.54.0,<0.55.0)
28
- Requires-Dist: azure-core (>=1.35.0,<2.0.0)
29
- Requires-Dist: beautifulsoup4 (>=4.13.5,<5.0.0)
30
- Requires-Dist: boto3 (>=1.40.17,<2.0.0)
31
- Requires-Dist: chromadb (>=0.5.20,<0.6.0)
27
+ Requires-Dist: anthropic (>=0.68.0,<0.69.0)
28
+ Requires-Dist: azure-core (==1.35.1)
29
+ Requires-Dist: beautifulsoup4 (==4.13.5)
30
+ Requires-Dist: chromadb (==1.1.0)
32
31
  Requires-Dist: croniter (>=2.0.7,<3.0.0)
33
32
  Requires-Dist: ddgs (>=9.5.5,<10.0.0)
34
33
  Requires-Dist: docker (>=7.1.0,<8.0.0)
35
34
  Requires-Dist: docx2txt (>=0.8,<0.9)
36
- Requires-Dist: gkeepapi (>=0.15.1,<0.16.0)
37
- Requires-Dist: google-api-python-client (>=2.179.0,<3.0.0)
38
- Requires-Dist: google-generativeai (>=0.8.5,<0.9.0)
39
- Requires-Dist: grpcio (>=1.74.0,<2.0.0)
40
- Requires-Dist: httpx (>=0.28.1,<0.29.0)
35
+ Requires-Dist: gkeepapi (==0.15.1)
36
+ Requires-Dist: google-api-python-client (==2.182.0)
37
+ Requires-Dist: google-generativeai (==0.8.5)
38
+ Requires-Dist: grpcio (==1.75.0)
39
+ Requires-Dist: httpx (==0.28.1)
41
40
  Requires-Dist: httpx-socks (>=0.10.1,<0.11.0)
42
- Requires-Dist: huggingface-hub (>=0.33.5,<0.34.0)
41
+ Requires-Dist: huggingface-hub (==0.35.0)
43
42
  Requires-Dist: ipykernel (>=6.30.1,<7.0.0)
44
43
  Requires-Dist: jupyter_client (>=8.6.3,<9.0.0)
45
- Requires-Dist: llama-index (>=0.12.44,<0.13.0)
46
- Requires-Dist: llama-index-agent-openai (>=0.4.12,<0.5.0)
47
- Requires-Dist: llama-index-core (==0.12.44)
48
- Requires-Dist: llama-index-embeddings-azure-openai (>=0.3.9,<0.4.0)
49
- Requires-Dist: llama-index-embeddings-gemini (>=0.3.2,<0.4.0)
50
- Requires-Dist: llama-index-embeddings-google-genai (>=0.2.1,<0.3.0)
51
- Requires-Dist: llama-index-embeddings-huggingface-api (>=0.3.1,<0.4.0)
52
- Requires-Dist: llama-index-embeddings-mistralai (>=0.3.0,<0.4.0)
53
- Requires-Dist: llama-index-embeddings-ollama (>=0.5.0,<0.6.0)
54
- Requires-Dist: llama-index-embeddings-openai (>=0.3.1,<0.4.0)
55
- Requires-Dist: llama-index-embeddings-openai-like (>=0.1.1,<0.2.0)
56
- Requires-Dist: llama-index-embeddings-voyageai (>=0.3.6,<0.4.0)
57
- Requires-Dist: llama-index-llms-anthropic (>=0.6.19,<0.7.0)
58
- Requires-Dist: llama-index-llms-azure-openai (>=0.3.4,<0.4.0)
59
- Requires-Dist: llama-index-llms-deepseek (>=0.1.2,<0.2.0)
60
- Requires-Dist: llama-index-llms-gemini (>=0.5.0,<0.6.0)
61
- Requires-Dist: llama-index-llms-google-genai (>=0.2.6,<0.3.0)
62
- Requires-Dist: llama-index-llms-huggingface-api (>=0.3.1,<0.4.0)
63
- Requires-Dist: llama-index-llms-mistralai (>=0.6.1,<0.7.0)
64
- Requires-Dist: llama-index-llms-ollama (>=0.6.2,<0.7.0)
65
- Requires-Dist: llama-index-llms-openai (>=0.4.7,<0.5.0)
66
- Requires-Dist: llama-index-llms-openai-like (>=0.4.0,<0.5.0)
67
- Requires-Dist: llama-index-llms-perplexity (>=0.3.7,<0.4.0)
68
- Requires-Dist: llama-index-multi-modal-llms-openai (>=0.5.1,<0.6.0)
69
- Requires-Dist: llama-index-readers-chatgpt-plugin (>=0.3.0,<0.4.0)
70
- Requires-Dist: llama-index-readers-database (>=0.3.0,<0.4.0)
71
- Requires-Dist: llama-index-readers-file (>=0.4.11,<0.5.0)
72
- Requires-Dist: llama-index-readers-github (>=0.5.0,<0.6.0)
73
- Requires-Dist: llama-index-readers-google (>=0.5.0,<0.6.0)
74
- Requires-Dist: llama-index-readers-microsoft-onedrive (>=0.3.0,<0.4.0)
75
- Requires-Dist: llama-index-readers-twitter (>=0.3.0,<0.4.0)
76
- Requires-Dist: llama-index-readers-web (>=0.3.9,<0.4.0)
77
- Requires-Dist: llama-index-vector-stores-chroma (>=0.4.2,<0.5.0)
78
- Requires-Dist: llama-index-vector-stores-elasticsearch (==0.4.0)
79
- Requires-Dist: llama-index-vector-stores-pinecone (>=0.6.0,<0.7.0)
80
- Requires-Dist: llama-index-vector-stores-redis (>=0.4.0,<0.5.0)
44
+ Requires-Dist: llama-index (==0.13.6)
45
+ Requires-Dist: llama-index-core (==0.13.6)
46
+ Requires-Dist: llama-index-embeddings-azure-openai (>=0.4.1,<0.5.0)
47
+ Requires-Dist: llama-index-embeddings-gemini (>=0.4.1,<0.5.0)
48
+ Requires-Dist: llama-index-embeddings-google-genai (>=0.3.1,<0.4.0)
49
+ Requires-Dist: llama-index-embeddings-huggingface-api (>=0.4.1,<0.5.0)
50
+ Requires-Dist: llama-index-embeddings-mistralai (>=0.4.1,<0.5.0)
51
+ Requires-Dist: llama-index-embeddings-ollama (>=0.8.3,<0.9.0)
52
+ Requires-Dist: llama-index-embeddings-openai (>=0.5.1,<0.6.0)
53
+ Requires-Dist: llama-index-embeddings-openai-like (>=0.2.2,<0.3.0)
54
+ Requires-Dist: llama-index-embeddings-voyageai (>=0.4.2,<0.5.0)
55
+ Requires-Dist: llama-index-llms-anthropic (>=0.8.6,<0.9.0)
56
+ Requires-Dist: llama-index-llms-azure-openai (>=0.4.1,<0.5.0)
57
+ Requires-Dist: llama-index-llms-deepseek (>=0.2.2,<0.3.0)
58
+ Requires-Dist: llama-index-llms-gemini (>=0.6.1,<0.7.0)
59
+ Requires-Dist: llama-index-llms-google-genai (>=0.3.1,<0.4.0)
60
+ Requires-Dist: llama-index-llms-huggingface-api (>=0.6.1,<0.7.0)
61
+ Requires-Dist: llama-index-llms-mistralai (>=0.7.1,<0.8.0)
62
+ Requires-Dist: llama-index-llms-ollama (>=0.7.3,<0.8.0)
63
+ Requires-Dist: llama-index-llms-openai (>=0.5.6,<0.6.0)
64
+ Requires-Dist: llama-index-llms-openai-like (>=0.5.1,<0.6.0)
65
+ Requires-Dist: llama-index-llms-perplexity (>=0.4.1,<0.5.0)
66
+ Requires-Dist: llama-index-multi-modal-llms-openai (>=0.6.1,<0.7.0)
67
+ Requires-Dist: llama-index-readers-chatgpt-plugin (>=0.4.1,<0.5.0)
68
+ Requires-Dist: llama-index-readers-database (>=0.5.1,<0.6.0)
69
+ Requires-Dist: llama-index-readers-file (>=0.5.4,<0.6.0)
70
+ Requires-Dist: llama-index-readers-github (>=0.8.2,<0.9.0)
71
+ Requires-Dist: llama-index-readers-google (>=0.7.2,<0.8.0)
72
+ Requires-Dist: llama-index-readers-microsoft-onedrive (>=0.4.1,<0.5.0)
73
+ Requires-Dist: llama-index-readers-twitter (>=0.4.1,<0.5.0)
74
+ Requires-Dist: llama-index-readers-web (>=0.5.3,<0.6.0)
75
+ Requires-Dist: llama-index-vector-stores-chroma (>=0.5.3,<0.6.0)
76
+ Requires-Dist: llama-index-vector-stores-elasticsearch (==0.5.1)
77
+ Requires-Dist: llama-index-vector-stores-pinecone (>=0.7.1,<0.8.0)
78
+ Requires-Dist: llama-index-vector-stores-redis (>=0.6.1,<0.7.0)
81
79
  Requires-Dist: mcp (>=1.13.1,<2.0.0)
82
80
  Requires-Dist: mss (>=9.0.2,<10.0.0)
83
81
  Requires-Dist: nbconvert (>=7.16.6,<8.0.0)
84
- Requires-Dist: numpy (>=1.26.4,<2.0.0)
85
- Requires-Dist: onnxruntime (==1.20.1)
86
- Requires-Dist: openai (==1.96.1)
82
+ Requires-Dist: numpy (==1.26.4)
83
+ Requires-Dist: onnxruntime (==1.22.1)
84
+ Requires-Dist: openai (==1.108.2)
87
85
  Requires-Dist: openai-agents (>=0.2.3,<0.3.0)
88
86
  Requires-Dist: opencv-python (>=4.11.0.86,<5.0.0.0)
89
87
  Requires-Dist: packaging (>=25.0,<26.0)
90
- Requires-Dist: pandas (>=2.2.3,<3.0.0)
88
+ Requires-Dist: pandas (==2.2.3)
91
89
  Requires-Dist: paramiko (>=4.0.0,<5.0.0)
92
- Requires-Dist: pillow (>=10.4.0,<11.0.0)
90
+ Requires-Dist: pillow (==10.4.0)
93
91
  Requires-Dist: pinecone (>=7.0.1,<8.0.0)
94
92
  Requires-Dist: psutil (>=7.0.0,<8.0.0)
95
93
  Requires-Dist: pydub (>=0.25.1,<0.26.0)
96
94
  Requires-Dist: pygame (>=2.6.1,<3.0.0)
97
95
  Requires-Dist: pynput (>=1.8.1,<2.0.0)
98
- Requires-Dist: pypdf (>=5.9.0,<6.0.0)
96
+ Requires-Dist: pypdf (==6.1.0)
99
97
  Requires-Dist: pyserial (>=3.5,<4.0)
100
98
  Requires-Dist: python-markdown-math (>=0.8,<0.9)
101
99
  Requires-Dist: qasync (>=0.27.1,<0.28.0)
102
100
  Requires-Dist: qt-material (>=2.17,<3.0)
103
- Requires-Dist: redis (>=5.3.1,<6.0.0)
101
+ Requires-Dist: redis (==5.3.1)
104
102
  Requires-Dist: show-in-file-manager (>=1.1.5,<2.0.0)
105
- Requires-Dist: tiktoken (>=0.9.0,<0.10.0)
106
- Requires-Dist: transformers (==4.48.3)
107
- Requires-Dist: urllib3 (>=1.26.20,<2.0.0)
103
+ Requires-Dist: tiktoken (==0.11.0)
104
+ Requires-Dist: transformers (==4.56.2)
105
+ Requires-Dist: urllib3 (==2.5.0)
108
106
  Requires-Dist: wikipedia (>=1.4.0,<2.0.0)
109
107
  Requires-Dist: xai-sdk (>=1.1.0,<2.0.0)
110
108
  Requires-Dist: youtube-transcript-api (>=0.6.3,<0.7.0)
@@ -119,7 +117,7 @@ Description-Content-Type: text/markdown
119
117
 
120
118
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
121
119
 
122
- Release: **2.6.58** | build: **2025-09-22** | Python: **>=3.10, <3.14**
120
+ Release: **2.6.60** | build: **2025-09-25** | Python: **>=3.10, <3.14**
123
121
 
124
122
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
125
123
  >
@@ -182,6 +180,7 @@ You can download compiled 64-bit versions for Windows and Linux here: https://py
182
180
  - Provides an intuitive operation and interface.
183
181
  - Includes a notepad.
184
182
  - Includes simple painter / drawing tool.
183
+ - Includes an node-based Agents Builder.
185
184
  - Supports multiple languages.
186
185
  - Requires no previous knowledge of using AI models.
187
186
  - Simplifies image generation using image models like `DALL-E` and `Imagen`.
@@ -2090,6 +2089,7 @@ PyGPT features several useful tools, including:
2090
2089
  - HTML/JS Canvas (built-in HTML renderer)
2091
2090
  - Translator
2092
2091
  - Web Browser (Chromium)
2092
+ - Agents Builder (beta)
2093
2093
 
2094
2094
  ![v2_tool_menu](https://github.com/szczyglis-dev/py-gpt/raw/master/docs/source/images/v2_tool_menu.png)
2095
2095
 
@@ -2167,6 +2167,70 @@ Enables translation between multiple languages using an AI model.
2167
2167
 
2168
2168
  A built-in web browser based on Chromium, allowing you to open webpages directly within the app. **SECURITY NOTICE:** For your protection, avoid using the built-in browser for sensitive or critical tasks. It is intended for basic use only.
2169
2169
 
2170
+ # Agents Builder (beta)
2171
+
2172
+ To launch the Agent Editor, navigate to:
2173
+
2174
+ `Tools -> Agents Builder`
2175
+
2176
+ ![nodes](https://github.com/szczyglis-dev/py-gpt/raw/master/docs/source/images/nodes.png)
2177
+
2178
+ This tool allows you to create workflows for agents using a node editor, without writing any code. You can add a new agent type, and it will appear in the list of presets.
2179
+
2180
+ To add a new element, right-click on the editor grid and select `Add` to insert a new node.
2181
+
2182
+ **Types of Nodes:**
2183
+
2184
+ - **Flow/Start**: The starting point for agents (user input).
2185
+ - **Flow/Agent**: A single agent with customizable default parameters, such as system instructions and tool usage. These settings can be overridden in the preset.
2186
+ - **Flow/Memory**: Shared memory between agents (shared Context).
2187
+ - **Flow/End**: The endpoint, returning control to the user.
2188
+
2189
+ Agents with connected shared memory share it among themselves. Agents without shared memory only receive the latest output from the previous agent.
2190
+
2191
+ The first agent in the sequence always receives the full context passed by the user.
2192
+
2193
+ Connecting agents and memory is done using node connections via slots. To connect slots, simply drag from the input port to the output port (Ctrl + mouse button removes a connection).
2194
+
2195
+ **Node Editor Navigation:**
2196
+
2197
+ - **Right-click**: Add node, undo, redo, clear
2198
+ - **Middle-click + drag**: Pan view
2199
+ - **Ctrl + Mouse wheel**: Zoom
2200
+ - **Left-click a port**: Create connection
2201
+ - **Ctrl + Left-click a port**: Rewire or detach connection
2202
+ - **Right-click or DELETE a node/connection**: Remove node/connection
2203
+
2204
+ **Tip:** Enable agent debugging in `Settings -> Debug -> Log Agents usage to console` to log the full workflow to the console.
2205
+
2206
+ Agents built using this tool are compatible with both OpenAI Agents and LlamaIndex.
2207
+
2208
+ **Notes:**
2209
+
2210
+ Routing and system instruction: for every agent that has more than one connection leading to the next agent, a routing instruction is automatically injected just before your system prompt:
2211
+
2212
+ ```
2213
+ You are a routing-capable agent in a multi-agent flow.
2214
+ Your id is: <current_id>, name: <agent_name>.
2215
+ You MUST respond ONLY with a single JSON object and nothing else.
2216
+ Schema:
2217
+ {
2218
+ "route": "<ID of the next agent from allowed_routes OR the string 'end'>",
2219
+ "content": "<final response text for the user (or tool result)>"
2220
+ }
2221
+ Rules:
2222
+ - allowed_routes: [<allowed>]
2223
+ - If you want to finish the flow, set route to "end".
2224
+ - content must contain the user-facing answer (you may include structured data as JSON or Markdown inside content).
2225
+ - Do NOT add any commentary outside of the JSON. No leading or trailing text.
2226
+ - If using tools, still return the final JSON with tool results summarized in content.
2227
+ - Human-friendly route names: <friendly>
2228
+
2229
+ <here begins your system instruction>
2230
+ ```
2231
+
2232
+ **INFO:** Agents Builder is in beta.
2233
+
2170
2234
 
2171
2235
  # Token usage calculation
2172
2236
 
@@ -3660,6 +3724,16 @@ may consume additional tokens that are not displayed in the main window.
3660
3724
 
3661
3725
  ## Recent changes:
3662
3726
 
3727
+ **2.6.60 (2025-09-25)**
3728
+
3729
+ - Added a new tool: Agents Builder - allowing visual design of agent workflows using nodes - available in Tools -> Agents Builder (beta).
3730
+
3731
+ **2.6.59 (2025-09-23)**
3732
+
3733
+ - LlamaIndex has been upgraded to v0.13.6.
3734
+ - The Responses API is disabled by default in Agents (LlamaIndex) for compatibility.
3735
+ - Added WinAPI support to the System (OS) plugin.
3736
+
3663
3737
  **2.6.58 (2025-09-22)**
3664
3738
 
3665
3739
  - Added: internal Web Browser tool.