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.
- pygpt_net/CHANGELOG.txt +10 -0
- pygpt_net/__init__.py +3 -3
- pygpt_net/app.py +9 -5
- pygpt_net/controller/__init__.py +1 -0
- pygpt_net/controller/presets/editor.py +442 -39
- pygpt_net/core/agents/custom/__init__.py +275 -0
- pygpt_net/core/agents/custom/debug.py +64 -0
- pygpt_net/core/agents/custom/factory.py +109 -0
- pygpt_net/core/agents/custom/graph.py +71 -0
- pygpt_net/core/agents/custom/llama_index/__init__.py +10 -0
- pygpt_net/core/agents/custom/llama_index/factory.py +89 -0
- pygpt_net/core/agents/custom/llama_index/router_streamer.py +106 -0
- pygpt_net/core/agents/custom/llama_index/runner.py +529 -0
- pygpt_net/core/agents/custom/llama_index/stream.py +56 -0
- pygpt_net/core/agents/custom/llama_index/utils.py +242 -0
- pygpt_net/core/agents/custom/logging.py +50 -0
- pygpt_net/core/agents/custom/memory.py +51 -0
- pygpt_net/core/agents/custom/router.py +116 -0
- pygpt_net/core/agents/custom/router_streamer.py +187 -0
- pygpt_net/core/agents/custom/runner.py +454 -0
- pygpt_net/core/agents/custom/schema.py +125 -0
- pygpt_net/core/agents/custom/utils.py +181 -0
- pygpt_net/core/agents/provider.py +72 -7
- pygpt_net/core/agents/runner.py +7 -4
- pygpt_net/core/agents/runners/helpers.py +1 -1
- pygpt_net/core/agents/runners/llama_workflow.py +3 -0
- pygpt_net/core/agents/runners/openai_workflow.py +8 -1
- pygpt_net/core/filesystem/parser.py +37 -24
- pygpt_net/{ui/widget/builder → core/node_editor}/__init__.py +2 -2
- pygpt_net/core/{builder → node_editor}/graph.py +11 -218
- pygpt_net/core/node_editor/models.py +111 -0
- pygpt_net/core/node_editor/types.py +76 -0
- pygpt_net/core/node_editor/utils.py +17 -0
- pygpt_net/core/render/web/renderer.py +10 -8
- pygpt_net/data/config/config.json +3 -3
- pygpt_net/data/config/models.json +3 -3
- pygpt_net/data/locale/locale.en.ini +4 -4
- pygpt_net/data/locale/plugin.cmd_system.en.ini +68 -0
- pygpt_net/item/agent.py +5 -1
- pygpt_net/item/preset.py +19 -1
- pygpt_net/plugin/cmd_system/config.py +377 -1
- pygpt_net/plugin/cmd_system/plugin.py +52 -8
- pygpt_net/plugin/cmd_system/runner.py +508 -32
- pygpt_net/plugin/cmd_system/winapi.py +481 -0
- pygpt_net/plugin/cmd_system/worker.py +88 -15
- pygpt_net/provider/agents/base.py +33 -2
- pygpt_net/provider/agents/llama_index/flow_from_schema.py +92 -0
- pygpt_net/provider/agents/llama_index/workflow/supervisor.py +0 -0
- pygpt_net/provider/agents/openai/flow_from_schema.py +96 -0
- pygpt_net/provider/core/agent/json_file.py +11 -5
- pygpt_net/provider/llms/openai.py +6 -4
- pygpt_net/tools/agent_builder/tool.py +217 -52
- pygpt_net/tools/agent_builder/ui/dialogs.py +119 -24
- pygpt_net/tools/agent_builder/ui/list.py +37 -10
- pygpt_net/tools/code_interpreter/ui/html.py +2 -1
- pygpt_net/ui/dialog/preset.py +16 -1
- pygpt_net/ui/main.py +1 -1
- pygpt_net/{core/builder → ui/widget/node_editor}/__init__.py +2 -2
- pygpt_net/ui/widget/node_editor/command.py +373 -0
- pygpt_net/ui/widget/node_editor/editor.py +2038 -0
- pygpt_net/ui/widget/node_editor/item.py +492 -0
- pygpt_net/ui/widget/node_editor/node.py +1205 -0
- pygpt_net/ui/widget/node_editor/utils.py +17 -0
- pygpt_net/ui/widget/node_editor/view.py +247 -0
- pygpt_net/ui/widget/textarea/web.py +1 -1
- {pygpt_net-2.6.58.dist-info → pygpt_net-2.6.60.dist-info}/METADATA +135 -61
- {pygpt_net-2.6.58.dist-info → pygpt_net-2.6.60.dist-info}/RECORD +69 -42
- pygpt_net/core/agents/custom.py +0 -150
- pygpt_net/ui/widget/builder/editor.py +0 -2001
- {pygpt_net-2.6.58.dist-info → pygpt_net-2.6.60.dist-info}/LICENSE +0 -0
- {pygpt_net-2.6.58.dist-info → pygpt_net-2.6.60.dist-info}/WHEEL +0 -0
- {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.
|
|
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 (
|
|
24
|
-
Requires-Dist: SQLAlchemy (
|
|
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.
|
|
28
|
-
Requires-Dist: azure-core (
|
|
29
|
-
Requires-Dist: beautifulsoup4 (
|
|
30
|
-
Requires-Dist:
|
|
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 (
|
|
37
|
-
Requires-Dist: google-api-python-client (
|
|
38
|
-
Requires-Dist: google-generativeai (
|
|
39
|
-
Requires-Dist: grpcio (
|
|
40
|
-
Requires-Dist: httpx (
|
|
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 (
|
|
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 (
|
|
46
|
-
Requires-Dist: llama-index-
|
|
47
|
-
Requires-Dist: llama-index-
|
|
48
|
-
Requires-Dist: llama-index-embeddings-
|
|
49
|
-
Requires-Dist: llama-index-embeddings-
|
|
50
|
-
Requires-Dist: llama-index-embeddings-
|
|
51
|
-
Requires-Dist: llama-index-embeddings-
|
|
52
|
-
Requires-Dist: llama-index-embeddings-
|
|
53
|
-
Requires-Dist: llama-index-embeddings-
|
|
54
|
-
Requires-Dist: llama-index-embeddings-openai (>=0.
|
|
55
|
-
Requires-Dist: llama-index-embeddings-
|
|
56
|
-
Requires-Dist: llama-index-
|
|
57
|
-
Requires-Dist: llama-index-llms-
|
|
58
|
-
Requires-Dist: llama-index-llms-
|
|
59
|
-
Requires-Dist: llama-index-llms-
|
|
60
|
-
Requires-Dist: llama-index-llms-
|
|
61
|
-
Requires-Dist: llama-index-llms-
|
|
62
|
-
Requires-Dist: llama-index-llms-
|
|
63
|
-
Requires-Dist: llama-index-llms-
|
|
64
|
-
Requires-Dist: llama-index-llms-
|
|
65
|
-
Requires-Dist: llama-index-llms-openai (>=0.
|
|
66
|
-
Requires-Dist: llama-index-llms-
|
|
67
|
-
Requires-Dist: llama-index-llms-
|
|
68
|
-
Requires-Dist: llama-index-
|
|
69
|
-
Requires-Dist: llama-index-readers-
|
|
70
|
-
Requires-Dist: llama-index-readers-
|
|
71
|
-
Requires-Dist: llama-index-readers-
|
|
72
|
-
Requires-Dist: llama-index-readers-
|
|
73
|
-
Requires-Dist: llama-index-readers-
|
|
74
|
-
Requires-Dist: llama-index-readers-
|
|
75
|
-
Requires-Dist: llama-index-readers-
|
|
76
|
-
Requires-Dist: llama-index-
|
|
77
|
-
Requires-Dist: llama-index-vector-stores-
|
|
78
|
-
Requires-Dist: llama-index-vector-stores-
|
|
79
|
-
Requires-Dist: llama-index-vector-stores-
|
|
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 (
|
|
85
|
-
Requires-Dist: onnxruntime (==1.
|
|
86
|
-
Requires-Dist: openai (==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 (
|
|
88
|
+
Requires-Dist: pandas (==2.2.3)
|
|
91
89
|
Requires-Dist: paramiko (>=4.0.0,<5.0.0)
|
|
92
|
-
Requires-Dist: pillow (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
106
|
-
Requires-Dist: transformers (==4.
|
|
107
|
-
Requires-Dist: urllib3 (
|
|
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
|
[](https://snapcraft.io/pygpt)
|
|
121
119
|
|
|
122
|
-
Release: **2.6.
|
|
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
|

|
|
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
|
+

|
|
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.
|