pygpt-net 2.6.50__py3-none-any.whl → 2.6.52__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 +3 -1
- pygpt_net/controller/__init__.py +4 -2
- pygpt_net/controller/calendar/calendar.py +2 -4
- pygpt_net/controller/calendar/note.py +0 -0
- pygpt_net/controller/ctx/ctx.py +8 -3
- pygpt_net/controller/ui/tabs.py +31 -7
- pygpt_net/core/calendar/calendar.py +2 -2
- pygpt_net/core/ctx/output.py +4 -2
- pygpt_net/core/render/web/renderer.py +3 -4
- pygpt_net/core/tabs/tab.py +42 -9
- pygpt_net/core/tabs/tabs.py +7 -9
- pygpt_net/data/config/config.json +5 -5
- pygpt_net/data/config/models.json +3 -3
- pygpt_net/data/css/style.dark.css +5 -0
- pygpt_net/data/locale/plugin.mcp.en.ini +12 -0
- pygpt_net/plugin/mcp/__init__.py +12 -0
- pygpt_net/plugin/mcp/config.py +103 -0
- pygpt_net/plugin/mcp/plugin.py +513 -0
- pygpt_net/plugin/mcp/worker.py +263 -0
- pygpt_net/provider/core/config/patch.py +8 -1
- pygpt_net/ui/dialog/plugins.py +1 -3
- pygpt_net/ui/widget/element/labels.py +1 -2
- pygpt_net/ui/widget/tabs/body.py +24 -5
- {pygpt_net-2.6.50.dist-info → pygpt_net-2.6.52.dist-info}/METADATA +24 -4
- {pygpt_net-2.6.50.dist-info → pygpt_net-2.6.52.dist-info}/RECORD +29 -24
- {pygpt_net-2.6.50.dist-info → pygpt_net-2.6.52.dist-info}/LICENSE +0 -0
- {pygpt_net-2.6.50.dist-info → pygpt_net-2.6.52.dist-info}/WHEEL +0 -0
- {pygpt_net-2.6.50.dist-info → pygpt_net-2.6.52.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,263 @@
|
|
|
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.16 22:00:00 #
|
|
10
|
+
# ================================================== #
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
import json
|
|
14
|
+
import shlex
|
|
15
|
+
from contextlib import asynccontextmanager
|
|
16
|
+
from typing import Dict, Any, List, Tuple, Optional
|
|
17
|
+
from urllib.parse import urlparse
|
|
18
|
+
|
|
19
|
+
from PySide6.QtCore import Slot
|
|
20
|
+
|
|
21
|
+
from pygpt_net.plugin.base.worker import BaseWorker, BaseSignals
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class WorkerSignals(BaseSignals):
|
|
25
|
+
pass # add custom signals here
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class Worker(BaseWorker):
|
|
29
|
+
def __init__(self, *args, **kwargs):
|
|
30
|
+
super(Worker, self).__init__()
|
|
31
|
+
self.signals = BaseSignals()
|
|
32
|
+
self.args = args
|
|
33
|
+
self.kwargs = kwargs
|
|
34
|
+
self.plugin = None
|
|
35
|
+
self.cmds: Optional[List[dict]] = None
|
|
36
|
+
self.ctx = None
|
|
37
|
+
self.tools_index: Dict[str, Dict[str, Any]] = {}
|
|
38
|
+
|
|
39
|
+
@Slot()
|
|
40
|
+
def run(self):
|
|
41
|
+
"""
|
|
42
|
+
Worker entry point executed in a background thread.
|
|
43
|
+
Starts an asyncio loop to talk to MCP servers.
|
|
44
|
+
"""
|
|
45
|
+
try:
|
|
46
|
+
responses = asyncio.run(self._run_async())
|
|
47
|
+
if responses:
|
|
48
|
+
self.reply_more(responses)
|
|
49
|
+
except Exception as e:
|
|
50
|
+
self.error(e)
|
|
51
|
+
finally:
|
|
52
|
+
self.cleanup()
|
|
53
|
+
|
|
54
|
+
async def _run_async(self) -> List[dict]:
|
|
55
|
+
"""
|
|
56
|
+
Group commands per server, open a session per server, then call tools.
|
|
57
|
+
"""
|
|
58
|
+
responses: List[dict] = []
|
|
59
|
+
|
|
60
|
+
try:
|
|
61
|
+
from mcp import ClientSession, types # type: ignore
|
|
62
|
+
from mcp.client.stdio import stdio_client # type: ignore
|
|
63
|
+
from mcp.client.streamable_http import streamablehttp_client # type: ignore
|
|
64
|
+
from mcp.client.sse import sse_client # type: ignore
|
|
65
|
+
from mcp import StdioServerParameters # type: ignore
|
|
66
|
+
except Exception as e:
|
|
67
|
+
self.status('MCP SDK not installed. Install with: pip install "mcp[cli]"')
|
|
68
|
+
self.log(f"MCP import error in worker: {e}")
|
|
69
|
+
for item in (self.cmds or []):
|
|
70
|
+
responses.append(self.make_response(item, f"MCP SDK not installed: {e}"))
|
|
71
|
+
return responses
|
|
72
|
+
|
|
73
|
+
# Group by server
|
|
74
|
+
grouped: Dict[str, List[dict]] = {}
|
|
75
|
+
for item in self.cmds or []:
|
|
76
|
+
meta = self.tools_index.get(item["cmd"])
|
|
77
|
+
if not meta:
|
|
78
|
+
continue
|
|
79
|
+
server_key = self._server_key(meta["server"])
|
|
80
|
+
grouped.setdefault(server_key, []).append(item)
|
|
81
|
+
|
|
82
|
+
# Execute per server
|
|
83
|
+
for server_key, items in grouped.items():
|
|
84
|
+
meta0 = self.tools_index.get(items[0]["cmd"])
|
|
85
|
+
if not meta0:
|
|
86
|
+
continue
|
|
87
|
+
server_cfg = meta0["server"]
|
|
88
|
+
address = (server_cfg.get("server_address") or "").strip()
|
|
89
|
+
transport = meta0["transport"]
|
|
90
|
+
headers = self._build_headers(server_cfg)
|
|
91
|
+
|
|
92
|
+
try:
|
|
93
|
+
async with self._open_session(address, transport, headers=headers) as session:
|
|
94
|
+
for item in items:
|
|
95
|
+
if self.is_stopped():
|
|
96
|
+
break
|
|
97
|
+
|
|
98
|
+
meta = self.tools_index.get(item["cmd"])
|
|
99
|
+
if not meta:
|
|
100
|
+
continue
|
|
101
|
+
|
|
102
|
+
tool_name = meta["tool_name"]
|
|
103
|
+
schema = meta.get("schema")
|
|
104
|
+
arguments = self._coerce_arguments(item.get("params", {}), schema)
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
result = await session.call_tool(tool_name, arguments=arguments)
|
|
108
|
+
text = self._extract_text_result(result)
|
|
109
|
+
responses.append(self.make_response(item, text))
|
|
110
|
+
except Exception as e:
|
|
111
|
+
responses.append(self.make_response(item, self.throw_error(e)))
|
|
112
|
+
|
|
113
|
+
except Exception as e:
|
|
114
|
+
msg = f"MCP server error ({address}): {e}"
|
|
115
|
+
self.log(msg)
|
|
116
|
+
self.status(msg)
|
|
117
|
+
for item in items:
|
|
118
|
+
responses.append(self.make_response(item, self.throw_error(e)))
|
|
119
|
+
|
|
120
|
+
return responses
|
|
121
|
+
|
|
122
|
+
# ---------------------------
|
|
123
|
+
# Session / transport helpers
|
|
124
|
+
# ---------------------------
|
|
125
|
+
|
|
126
|
+
@asynccontextmanager
|
|
127
|
+
async def _open_session(self, address: str, transport: str, headers: Optional[dict] = None):
|
|
128
|
+
"""
|
|
129
|
+
Open and initialize MCP session for given server address and transport.
|
|
130
|
+
Yields a ready-to-use ClientSession.
|
|
131
|
+
"""
|
|
132
|
+
from mcp import ClientSession # type: ignore
|
|
133
|
+
|
|
134
|
+
if transport == "stdio":
|
|
135
|
+
from mcp.client.stdio import stdio_client # type: ignore
|
|
136
|
+
from mcp import StdioServerParameters # type: ignore
|
|
137
|
+
cmd, args = self._parse_stdio_command(address)
|
|
138
|
+
params = StdioServerParameters(command=cmd, args=args)
|
|
139
|
+
async with stdio_client(params) as (read, write):
|
|
140
|
+
async with ClientSession(read, write) as session:
|
|
141
|
+
await session.initialize()
|
|
142
|
+
yield session
|
|
143
|
+
|
|
144
|
+
elif transport == "http":
|
|
145
|
+
from mcp.client.streamable_http import streamablehttp_client # type: ignore
|
|
146
|
+
async with streamablehttp_client(address, headers=headers or None) as (read, write, _):
|
|
147
|
+
async with ClientSession(read, write) as session:
|
|
148
|
+
await session.initialize()
|
|
149
|
+
yield session
|
|
150
|
+
|
|
151
|
+
elif transport == "sse":
|
|
152
|
+
from mcp.client.sse import sse_client # type: ignore
|
|
153
|
+
async with sse_client(address, headers=headers or None) as (read, write):
|
|
154
|
+
async with ClientSession(read, write) as session:
|
|
155
|
+
await session.initialize()
|
|
156
|
+
yield session
|
|
157
|
+
|
|
158
|
+
else:
|
|
159
|
+
raise RuntimeError(f"Unsupported transport: {transport}")
|
|
160
|
+
|
|
161
|
+
def _parse_stdio_command(self, address: str) -> Tuple[str, List[str]]:
|
|
162
|
+
"""Parse 'stdio: <command line>' into (command, args)."""
|
|
163
|
+
cmdline = address[len("stdio:"):].strip()
|
|
164
|
+
tokens = shlex.split(cmdline)
|
|
165
|
+
if not tokens:
|
|
166
|
+
raise ValueError("Invalid stdio address: empty command")
|
|
167
|
+
return tokens[0], tokens[1:]
|
|
168
|
+
|
|
169
|
+
# ---------------------------
|
|
170
|
+
# Result & argument handling
|
|
171
|
+
# ---------------------------
|
|
172
|
+
|
|
173
|
+
def _coerce_arguments(self, params: Dict[str, Any], schema: Optional[dict]) -> Dict[str, Any]:
|
|
174
|
+
"""Coerce incoming params into types expected by the tool schema."""
|
|
175
|
+
if not schema or not isinstance(schema, dict):
|
|
176
|
+
return params or {}
|
|
177
|
+
|
|
178
|
+
props = schema.get("properties", {}) or {}
|
|
179
|
+
coerced: Dict[str, Any] = {}
|
|
180
|
+
|
|
181
|
+
for name, value in (params or {}).items():
|
|
182
|
+
target = props.get(name, {})
|
|
183
|
+
jtype = target.get("type", "string")
|
|
184
|
+
|
|
185
|
+
try:
|
|
186
|
+
if jtype == "integer":
|
|
187
|
+
coerced[name] = int(value)
|
|
188
|
+
elif jtype == "number":
|
|
189
|
+
coerced[name] = float(value)
|
|
190
|
+
elif jtype == "boolean":
|
|
191
|
+
if isinstance(value, bool):
|
|
192
|
+
coerced[name] = value
|
|
193
|
+
elif isinstance(value, str):
|
|
194
|
+
coerced[name] = value.strip().lower() in ("1", "true", "yes", "y", "on")
|
|
195
|
+
else:
|
|
196
|
+
coerced[name] = bool(value)
|
|
197
|
+
elif jtype in ("array", "object"):
|
|
198
|
+
if isinstance(value, (dict, list)):
|
|
199
|
+
coerced[name] = value
|
|
200
|
+
elif isinstance(value, str):
|
|
201
|
+
try:
|
|
202
|
+
coerced[name] = json.loads(value)
|
|
203
|
+
except Exception:
|
|
204
|
+
coerced[name] = value
|
|
205
|
+
else:
|
|
206
|
+
coerced[name] = value
|
|
207
|
+
else:
|
|
208
|
+
coerced[name] = value
|
|
209
|
+
except Exception:
|
|
210
|
+
coerced[name] = value
|
|
211
|
+
|
|
212
|
+
return coerced
|
|
213
|
+
|
|
214
|
+
def _extract_text_result(self, result: Any) -> str:
|
|
215
|
+
"""
|
|
216
|
+
Convert MCP tool result into a readable string.
|
|
217
|
+
Prefer structuredContent; fallback to text content blocks.
|
|
218
|
+
"""
|
|
219
|
+
try:
|
|
220
|
+
if getattr(result, "structuredContent", None) is not None:
|
|
221
|
+
return json.dumps(result.structuredContent, ensure_ascii=False, indent=2)
|
|
222
|
+
|
|
223
|
+
content_list = getattr(result, "content", None)
|
|
224
|
+
if not content_list:
|
|
225
|
+
return "No result (empty content)"
|
|
226
|
+
from mcp import types # type: ignore
|
|
227
|
+
texts: List[str] = []
|
|
228
|
+
for block in content_list:
|
|
229
|
+
if isinstance(block, types.TextContent):
|
|
230
|
+
texts.append(block.text)
|
|
231
|
+
else:
|
|
232
|
+
btype = getattr(block, "type", "content")
|
|
233
|
+
texts.append(f"[{btype}]")
|
|
234
|
+
return "\n".join(texts) if texts else "No result (no text content)"
|
|
235
|
+
except Exception as e:
|
|
236
|
+
return f"Failed to parse MCP result: {e}"
|
|
237
|
+
|
|
238
|
+
# ---------------------------
|
|
239
|
+
# Misc helpers
|
|
240
|
+
# ---------------------------
|
|
241
|
+
|
|
242
|
+
def _server_key(self, server: dict) -> str:
|
|
243
|
+
"""Create a deterministic key for a server config entry."""
|
|
244
|
+
addr = (server.get("server_address") or "").strip()
|
|
245
|
+
if addr.lower().startswith("http"):
|
|
246
|
+
try:
|
|
247
|
+
parsed = urlparse(addr)
|
|
248
|
+
return f"http::{parsed.netloc}{parsed.path}"
|
|
249
|
+
except Exception:
|
|
250
|
+
return f"http::{addr}"
|
|
251
|
+
if addr.lower().startswith(("sse://", "sse+http://", "sse+https://")):
|
|
252
|
+
return f"sse::{addr}"
|
|
253
|
+
if addr.startswith("stdio:"):
|
|
254
|
+
return f"stdio::{addr[len('stdio:'):].strip()}"
|
|
255
|
+
return addr
|
|
256
|
+
|
|
257
|
+
def _build_headers(self, server: dict) -> Optional[dict]:
|
|
258
|
+
"""Build optional headers for HTTP/SSE transports (Authorization only)."""
|
|
259
|
+
auth = (server.get("authorization") or "").strip()
|
|
260
|
+
headers = {}
|
|
261
|
+
if auth:
|
|
262
|
+
headers["Authorization"] = auth
|
|
263
|
+
return headers or None
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
|
7
7
|
# MIT License #
|
|
8
8
|
# Created By : Marcin Szczygliński #
|
|
9
|
-
# Updated Date: 2025.09.
|
|
9
|
+
# Updated Date: 2025.09.16 11:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
import copy
|
|
@@ -97,6 +97,13 @@ class Patch:
|
|
|
97
97
|
patch_css('web-blocks.css', True)
|
|
98
98
|
updated = True
|
|
99
99
|
|
|
100
|
+
# < 2.6.51
|
|
101
|
+
if old < parse_version("2.6.51"):
|
|
102
|
+
print("Migrating config from < 2.6.51...")
|
|
103
|
+
# calendar css
|
|
104
|
+
patch_css('style.dark.css', True)
|
|
105
|
+
updated = True
|
|
106
|
+
|
|
100
107
|
# update file
|
|
101
108
|
migrated = False
|
|
102
109
|
if updated:
|
pygpt_net/ui/dialog/plugins.py
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
|
7
7
|
# MIT License #
|
|
8
8
|
# Created By : Marcin Szczygliński #
|
|
9
|
-
# Updated Date: 2025.09.
|
|
9
|
+
# Updated Date: 2025.09.16 22:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
from PySide6.QtCore import Qt
|
|
@@ -454,7 +454,6 @@ class Plugins:
|
|
|
454
454
|
# cols_widget.setMaximumHeight(90)
|
|
455
455
|
|
|
456
456
|
self.window.ui.nodes[desc_key] = DescLabel(txt_desc)
|
|
457
|
-
self.window.ui.nodes[desc_key].setMaximumHeight(40)
|
|
458
457
|
# self.window.ui.nodes[desc_key].setToolTip(txt_tooltip)
|
|
459
458
|
|
|
460
459
|
layout = QVBoxLayout()
|
|
@@ -473,7 +472,6 @@ class Plugins:
|
|
|
473
472
|
|
|
474
473
|
if option['type'] not in no_desc_types:
|
|
475
474
|
self.window.ui.nodes[desc_key] = DescLabel(txt_desc)
|
|
476
|
-
self.window.ui.nodes[desc_key].setMaximumHeight(40)
|
|
477
475
|
# self.window.ui.nodes[desc_key].setToolTip(txt_tooltip)
|
|
478
476
|
layout.addWidget(self.window.ui.nodes[desc_key])
|
|
479
477
|
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
|
7
7
|
# MIT License #
|
|
8
8
|
# Created By : Marcin Szczygliński #
|
|
9
|
-
# Updated Date: 2025.09.
|
|
9
|
+
# Updated Date: 2025.09.16 22:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
from PySide6.QtCore import Qt, QTimer, QRect, Signal, QUrl, QEvent
|
|
@@ -34,7 +34,6 @@ class DescLabel(BaseLabel):
|
|
|
34
34
|
def __init__(self, text, window=None):
|
|
35
35
|
super().__init__(text, window)
|
|
36
36
|
self.window = window
|
|
37
|
-
self.setMaximumHeight(80)
|
|
38
37
|
self.setProperty('class', 'label-desc')
|
|
39
38
|
|
|
40
39
|
|
pygpt_net/ui/widget/tabs/body.py
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
|
7
7
|
# MIT License #
|
|
8
8
|
# Created By : Marcin Szczygliński #
|
|
9
|
-
# Updated Date: 2025.09.16
|
|
9
|
+
# Updated Date: 2025.09.16 22:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
from typing import Any
|
|
@@ -35,7 +35,7 @@ class TabBody(QTabWidget):
|
|
|
35
35
|
self.on_delete(self)
|
|
36
36
|
self.delete_refs()
|
|
37
37
|
|
|
38
|
-
def
|
|
38
|
+
def unwrap(self, widget: QWidget) -> None:
|
|
39
39
|
"""
|
|
40
40
|
Remove widget from tab body
|
|
41
41
|
|
|
@@ -46,7 +46,7 @@ class TabBody(QTabWidget):
|
|
|
46
46
|
layout.removeWidget(widget)
|
|
47
47
|
self.delete_ref(widget)
|
|
48
48
|
|
|
49
|
-
def
|
|
49
|
+
def unwrap_all(self) -> None:
|
|
50
50
|
"""
|
|
51
51
|
Remove all widgets from tab body
|
|
52
52
|
"""
|
|
@@ -55,7 +55,14 @@ class TabBody(QTabWidget):
|
|
|
55
55
|
while layout.count():
|
|
56
56
|
item = layout.takeAt(0)
|
|
57
57
|
widget = item.widget()
|
|
58
|
-
|
|
58
|
+
try:
|
|
59
|
+
layout.removeWidget(widget)
|
|
60
|
+
except Exception:
|
|
61
|
+
pass
|
|
62
|
+
try:
|
|
63
|
+
self.delete_ref(widget)
|
|
64
|
+
except Exception:
|
|
65
|
+
pass
|
|
59
66
|
|
|
60
67
|
def add_ref(self, ref: Any) -> None:
|
|
61
68
|
"""
|
|
@@ -157,4 +164,16 @@ class TabBody(QTabWidget):
|
|
|
157
164
|
if self.owner is not None:
|
|
158
165
|
col_idx = self.owner.column_idx
|
|
159
166
|
self.window.controller.ui.tabs.on_column_focus(col_idx)
|
|
160
|
-
return super().eventFilter(source, event)
|
|
167
|
+
return super().eventFilter(source, event)
|
|
168
|
+
|
|
169
|
+
def to_dict(self) -> dict:
|
|
170
|
+
"""
|
|
171
|
+
Convert to dict
|
|
172
|
+
|
|
173
|
+
:return: dict
|
|
174
|
+
"""
|
|
175
|
+
return {
|
|
176
|
+
"refs": [str(ref) for ref in self.refs], # references to widgets
|
|
177
|
+
"body": [str(b) for b in self.body], # body widgets
|
|
178
|
+
"len(layout)": self.layout().count() if self.layout() else 0,
|
|
179
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: pygpt-net
|
|
3
|
-
Version: 2.6.
|
|
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, internet access, file handling, command execution and more.
|
|
3
|
+
Version: 2.6.52
|
|
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
|
|
7
7
|
Author: Marcin Szczyglinski
|
|
@@ -78,6 +78,7 @@ Requires-Dist: llama-index-vector-stores-chroma (>=0.4.2,<0.5.0)
|
|
|
78
78
|
Requires-Dist: llama-index-vector-stores-elasticsearch (==0.4.0)
|
|
79
79
|
Requires-Dist: llama-index-vector-stores-pinecone (>=0.6.0,<0.7.0)
|
|
80
80
|
Requires-Dist: llama-index-vector-stores-redis (>=0.4.0,<0.5.0)
|
|
81
|
+
Requires-Dist: mcp (>=1.13.1,<2.0.0)
|
|
81
82
|
Requires-Dist: mss (>=9.0.2,<10.0.0)
|
|
82
83
|
Requires-Dist: nbconvert (>=7.16.6,<8.0.0)
|
|
83
84
|
Requires-Dist: numpy (>=1.26.4,<2.0.0)
|
|
@@ -118,7 +119,7 @@ Description-Content-Type: text/markdown
|
|
|
118
119
|
|
|
119
120
|
[](https://snapcraft.io/pygpt)
|
|
120
121
|
|
|
121
|
-
Release: **2.6.
|
|
122
|
+
Release: **2.6.52** | build: **2025-09-17** | Python: **>=3.10, <3.14**
|
|
122
123
|
|
|
123
124
|
> Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
|
|
124
125
|
>
|
|
@@ -167,6 +168,7 @@ You can download compiled 64-bit versions for Windows and Linux here: https://py
|
|
|
167
168
|
- Internet access via `DuckDuckGo`, `Google` and `Microsoft Bing`.
|
|
168
169
|
- Speech synthesis via `Microsoft Azure`, `Google`, `Eleven Labs` and `OpenAI` Text-To-Speech services.
|
|
169
170
|
- Speech recognition via `OpenAI Whisper`, `Google` and `Microsoft Speech Recognition`.
|
|
171
|
+
- MCP support.
|
|
170
172
|
- Real-time video camera capture in Vision mode.
|
|
171
173
|
- Image analysis via `GPT-5` and `GPT-4o`.
|
|
172
174
|
- Integrated calendar, day notes and search in contexts by selected date.
|
|
@@ -186,7 +188,7 @@ You can download compiled 64-bit versions for Windows and Linux here: https://py
|
|
|
186
188
|
- Fully configurable.
|
|
187
189
|
- Themes support.
|
|
188
190
|
- Real-time code syntax highlighting.
|
|
189
|
-
- Plugins support with built-in plugins like `Files I/O`, `Code Interpreter`, `Web Search`, `Google`, `Facebook`, `X/Twitter`, `Slack`, `Telegram`, `GitHub`, and many more.
|
|
191
|
+
- Plugins support with built-in plugins like `Files I/O`, `Code Interpreter`, `Web Search`, `Google`, `Facebook`, `X/Twitter`, `Slack`, `Telegram`, `GitHub`, `MCP`, and many more.
|
|
190
192
|
- Built-in token usage calculation.
|
|
191
193
|
- Possesses the potential to support future OpenAI models.
|
|
192
194
|
- **Open source**; source code is available on `GitHub`.
|
|
@@ -1444,6 +1446,8 @@ The following plugins are currently available, and model can use them instantly:
|
|
|
1444
1446
|
|
|
1445
1447
|
- `Mailer` - Provides the ability to send, receive and read emails.
|
|
1446
1448
|
|
|
1449
|
+
- `MCP` - Provides access to remote tools via the Model Context Protocol (MCP), including stdio, SSE, and Streamable HTTP transports, with per-server allow/deny filtering, Authorization header support, and a tools cache.
|
|
1450
|
+
|
|
1447
1451
|
- `Mouse and Keyboard` - provides the ability to control the mouse and keyboard by the model.
|
|
1448
1452
|
|
|
1449
1453
|
- `Real Time` - automatically appends the current date and time to the system prompt, informing the model about current time.
|
|
@@ -1766,6 +1770,12 @@ Enables the sending, receiving, and reading of emails from the inbox. Currently,
|
|
|
1766
1770
|
|
|
1767
1771
|
Documentation: https://pygpt.readthedocs.io/en/latest/plugins.html#mailer
|
|
1768
1772
|
|
|
1773
|
+
## MCP (Model Context Protocol)
|
|
1774
|
+
|
|
1775
|
+
With the `MCP` plugin, you can connect **PyGPT** to remote tools exposed by `Model Context Protocol` servers (stdio, Streamable HTTP, or SSE). The plugin discovers available tools on your configured servers and publishes them to the model as callable commands with proper parameter schemas. You can whitelist/blacklist tools per server and optionally cache discovery results for speed.
|
|
1776
|
+
|
|
1777
|
+
Documentation: https://pygpt.readthedocs.io/en/latest/plugins.html#mcp
|
|
1778
|
+
|
|
1769
1779
|
## Mouse And Keyboard
|
|
1770
1780
|
|
|
1771
1781
|
Introduced in version: `2.4.4` (2024-11-09)
|
|
@@ -3612,6 +3622,16 @@ may consume additional tokens that are not displayed in the main window.
|
|
|
3612
3622
|
|
|
3613
3623
|
## Recent changes:
|
|
3614
3624
|
|
|
3625
|
+
**2.6.52 (2025-09-17)**
|
|
3626
|
+
|
|
3627
|
+
- Added MCP plugin: Provides access to remote tools via the Model Context Protocol (MCP), including stdio, SSE, and Streamable HTTP transports, with per-server allow/deny filtering, Authorization header support, and a tools cache.
|
|
3628
|
+
- Fixed: tab tooltips reload on profile switch.
|
|
3629
|
+
|
|
3630
|
+
**2.6.51 (2025-09-16)**
|
|
3631
|
+
|
|
3632
|
+
- Fix: Automatically reloading calendar notes.
|
|
3633
|
+
- Fix: Context menu CSS background color for calendar items.
|
|
3634
|
+
|
|
3615
3635
|
**2.6.50 (2025-09-16)**
|
|
3616
3636
|
|
|
3617
3637
|
- Optimized: Improved memory cleanup when switching profiles and unloading tabs.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
pygpt_net/CHANGELOG.txt,sha256=
|
|
1
|
+
pygpt_net/CHANGELOG.txt,sha256=YPOGP3OKkHn4fNlJkQmG6eWpKj7tugHtd3ZSFloZKy8,107012
|
|
2
2
|
pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
|
|
3
|
-
pygpt_net/__init__.py,sha256=
|
|
4
|
-
pygpt_net/app.py,sha256=
|
|
3
|
+
pygpt_net/__init__.py,sha256=jA-W-HLpCZaJqwaz-GPLNhXrY3ZgXqomhUMx6Wa-LHg,1373
|
|
4
|
+
pygpt_net/app.py,sha256=PYS3NOz0LkV3mZi0tKoT07579rCWBvx97_140La5150,22044
|
|
5
5
|
pygpt_net/app_core.py,sha256=PwBOV9wZLtr-O6SxBiazABhYXMHH8kZ6OgbvSv2OiZA,3827
|
|
6
6
|
pygpt_net/config.py,sha256=SCps_FfwdrynVAgpn37Ci1qTN8BFC05IGl9sYIi9e0w,16720
|
|
7
|
-
pygpt_net/controller/__init__.py,sha256=
|
|
7
|
+
pygpt_net/controller/__init__.py,sha256=k6_danw2VOQ4YNT-tH0mnfgK4SCL5B2Hyhug6TI1LgY,6100
|
|
8
8
|
pygpt_net/controller/access/__init__.py,sha256=_XZxGy5U93JGU49GbIB9E_I26_uRV_Zbz18lcp7u23A,510
|
|
9
9
|
pygpt_net/controller/access/access.py,sha256=nPttwQf6RZHJAlXZ-3fnlcplwXxcJWp8ciq3FMsSssI,3974
|
|
10
10
|
pygpt_net/controller/access/control.py,sha256=MhtgCBB2eIpr358qB5uzBkGX8EkT48u84dhZqyuXDss,17182
|
|
@@ -28,7 +28,7 @@ pygpt_net/controller/audio/__init__.py,sha256=Ci5ClV3DKuMCLtFqQEOr5qun--tlIzKkQl
|
|
|
28
28
|
pygpt_net/controller/audio/audio.py,sha256=6_om9kTec-Hs7oSHD7qgy40fv6xRyME4d3VQ09aoQbM,15030
|
|
29
29
|
pygpt_net/controller/audio/ui.py,sha256=Cp6TOLG4ObdvzjEwJGJ7ovnZHhb66Rupe_agHTH4lJI,7790
|
|
30
30
|
pygpt_net/controller/calendar/__init__.py,sha256=AyzoNqYgxV35CMEzoi_SCSsQh4ehg_Wu_2nsK3xsbyg,512
|
|
31
|
-
pygpt_net/controller/calendar/calendar.py,sha256=
|
|
31
|
+
pygpt_net/controller/calendar/calendar.py,sha256=vM7AuoZw_jkKh5vWwCb0qo0b5jqqFF1OZhWIOT0jHV4,4388
|
|
32
32
|
pygpt_net/controller/calendar/note.py,sha256=AkOQ0FslaDkQbNwXBg95XhtPi3KzhKiFd374L8kTKBA,10169
|
|
33
33
|
pygpt_net/controller/camera/__init__.py,sha256=dwmea8rz2QwdwKT160NYaaOoWucCWeyuecWkEXIcvio,510
|
|
34
34
|
pygpt_net/controller/camera/camera.py,sha256=R9iQdt4k-V7sK4kuLSVoD-QtrSWZbECmXsBpHsILnwo,16526
|
|
@@ -72,7 +72,7 @@ pygpt_net/controller/config/field/textarea.py,sha256=Ln545IHzXBeFIjnfMIpmlUr-V3w
|
|
|
72
72
|
pygpt_net/controller/config/placeholder.py,sha256=-PWPNILPVkxMsY64aYnKTWvgUIvx7KA2Nwfd2LW_K30,16711
|
|
73
73
|
pygpt_net/controller/ctx/__init__.py,sha256=0wH7ziC75WscBW8cxpeGBwEz5tolo_kCxGPoz2udI_E,507
|
|
74
74
|
pygpt_net/controller/ctx/common.py,sha256=1oR7cUgVzO_asqiRln4L4vZaxXsssAPtGyAp-B0FUE4,6409
|
|
75
|
-
pygpt_net/controller/ctx/ctx.py,sha256=
|
|
75
|
+
pygpt_net/controller/ctx/ctx.py,sha256=ntRXdiot678SGHlc9NPG43UTq8xohEXssxcCuRjKZnQ,46418
|
|
76
76
|
pygpt_net/controller/ctx/extra.py,sha256=0r-G6Tlm9WPDkLRmgPDlgyRr_XLfCJntnUGlYPJiXVw,8598
|
|
77
77
|
pygpt_net/controller/ctx/summarizer.py,sha256=UNsq-JTARblGNT97uSMpZEVzdUuDJ8YA2j2dw9R2X3o,3079
|
|
78
78
|
pygpt_net/controller/debug/__init__.py,sha256=dOJGTICjvTtrPIEDOsxCzcOHsfu8AFPLpSKbdN0q0KI,509
|
|
@@ -146,7 +146,7 @@ pygpt_net/controller/tools/__init__.py,sha256=ds63rOuwLEIe-SlY_sQkhWSdXS0lfVwseU
|
|
|
146
146
|
pygpt_net/controller/tools/tools.py,sha256=bWxdwL3J2-WHBS3MBiKsS3kTW_rQI_nS9z8-8iKifKg,2920
|
|
147
147
|
pygpt_net/controller/ui/__init__.py,sha256=cxfh2SYeEDATGAZpcYDqCxYfp4KReQ1CYehevSf89EU,507
|
|
148
148
|
pygpt_net/controller/ui/mode.py,sha256=35J5TRCg33D-RP9epFsWD-ZO-jQ2O0Q41iuqrePC1zM,9107
|
|
149
|
-
pygpt_net/controller/ui/tabs.py,sha256=
|
|
149
|
+
pygpt_net/controller/ui/tabs.py,sha256=8xAvuKyMjVaihg5vKH-s3kx-zo4BH8pZtz4flX8Spzg,29937
|
|
150
150
|
pygpt_net/controller/ui/ui.py,sha256=w6rxJ0bNk_43Hd0vZB0roxZo7h-AmISEhr8ZiqcBTgA,8496
|
|
151
151
|
pygpt_net/controller/ui/vision.py,sha256=tnzllFV2-sYDHfrP12ATY6ZKi6FcGtQofrsoKF6UcCU,2407
|
|
152
152
|
pygpt_net/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -210,7 +210,7 @@ pygpt_net/core/bridge/bridge.py,sha256=1pTbVza_CZMdrnXiRxq9sDROeJtMNofBMMkFzA1VQ
|
|
|
210
210
|
pygpt_net/core/bridge/context.py,sha256=YBqeR5PgV0x5KK5otN-DYQNSqQtVaNddtRLDwSSLC2Y,7154
|
|
211
211
|
pygpt_net/core/bridge/worker.py,sha256=RukudDq6IAxcg2w-wfQmu7Ia-YTT3NPgAybr1OMpxF4,8498
|
|
212
212
|
pygpt_net/core/calendar/__init__.py,sha256=AyzoNqYgxV35CMEzoi_SCSsQh4ehg_Wu_2nsK3xsbyg,512
|
|
213
|
-
pygpt_net/core/calendar/calendar.py,sha256=
|
|
213
|
+
pygpt_net/core/calendar/calendar.py,sha256=mHWU8jPTYWqxd-35tIHM6GuKaFWzmB6Up7lq8ewV2_U,7224
|
|
214
214
|
pygpt_net/core/camera/__init__.py,sha256=cny2EajFmwkFdo_pUkErJY4BhpyHp1kJVDcTCOOvkjY,510
|
|
215
215
|
pygpt_net/core/camera/camera.py,sha256=8-PZN3UEnhMQfT2whI4QvN_Qd8AYnkMWk4oo6cKtDEc,2263
|
|
216
216
|
pygpt_net/core/camera/worker.py,sha256=z2qXyslWh4-0gixJZI6qcmIFutZcLD55P2dTzAYbNaU,14063
|
|
@@ -225,7 +225,7 @@ pygpt_net/core/ctx/bag.py,sha256=j_10HBqkswdz5vW140SuGvJRf7E7J7hQyz6DCVe5D44,157
|
|
|
225
225
|
pygpt_net/core/ctx/container.py,sha256=5nlgM_8laH0igUASILD5zIiK3YhB-BA9pTKI0jVqHeQ,4938
|
|
226
226
|
pygpt_net/core/ctx/ctx.py,sha256=nl-xYi8u6bmqRCX51wwd6bXcd2FaOH1pdaSVJcgH9kM,43530
|
|
227
227
|
pygpt_net/core/ctx/idx.py,sha256=3Zi-48OWlU80si-Z7mVjnsc7TYATXK9g1dM0M5sXsV4,8167
|
|
228
|
-
pygpt_net/core/ctx/output.py,sha256=
|
|
228
|
+
pygpt_net/core/ctx/output.py,sha256=6llpijYvZPPyn12ibhw0QpNpWaZijDMCB7rAahE2iD4,8928
|
|
229
229
|
pygpt_net/core/ctx/reply.py,sha256=nm-TzBoIDE9GrYyNjtIT7DvJVf8duAS2fVMeInHNEH4,2324
|
|
230
230
|
pygpt_net/core/db/__init__.py,sha256=6VXnRrxVi5p1Ou9UA_rd_x09upFYQSZrtoKnKbrALqY,512
|
|
231
231
|
pygpt_net/core/db/database.py,sha256=H9tCfmnFH-h6cU13bqT8bpeU5SHR6UAu9np50__pdMY,16431
|
|
@@ -354,13 +354,13 @@ pygpt_net/core/render/web/debug.py,sha256=784RYXF6inn_bkRtYD1_FllQSyk67JmxKGWPiA
|
|
|
354
354
|
pygpt_net/core/render/web/helpers.py,sha256=8-JkbEOOLoCEAkylJWr8yk3aIliQBMyqcatsyW99VWY,7340
|
|
355
355
|
pygpt_net/core/render/web/parser.py,sha256=pDFc9Tf8P-jvrDilXyT1fukcQHbixHRJ9Dn9hF10Gko,12892
|
|
356
356
|
pygpt_net/core/render/web/pid.py,sha256=F33x_OtrHL9BDMXx_JUbfo8-DOiN4vo1Tv4rrRVADTo,4343
|
|
357
|
-
pygpt_net/core/render/web/renderer.py,sha256=
|
|
357
|
+
pygpt_net/core/render/web/renderer.py,sha256=q5DMzdIYQwDB6lrnvWaPbM1eaJwpm3Enqfvvv6bY-uM,68846
|
|
358
358
|
pygpt_net/core/render/web/syntax_highlight.py,sha256=QSLGF5cJL_Xeqej7_TYwY_5C2w9enXV_cMEuaJ3C43U,2005
|
|
359
359
|
pygpt_net/core/settings/__init__.py,sha256=GQ6_gJ2jf_Chm7ZuZLvkcvEh_sfMDVMBieeoJi2iPI4,512
|
|
360
360
|
pygpt_net/core/settings/settings.py,sha256=Ix06y-gJ3q7NJDf55XAWBBYulBLpinBqzYqsytH_9mo,8686
|
|
361
361
|
pygpt_net/core/tabs/__init__.py,sha256=reDufOWWDQsZwfvtnXrFQROEdl9nqoKI7S3bFA3D9As,508
|
|
362
|
-
pygpt_net/core/tabs/tab.py,sha256=
|
|
363
|
-
pygpt_net/core/tabs/tabs.py,sha256
|
|
362
|
+
pygpt_net/core/tabs/tab.py,sha256=haI5ZehmzVIHGbENCwp-py0LqjJVp0m0xTWquskyLQs,6958
|
|
363
|
+
pygpt_net/core/tabs/tabs.py,sha256=-rleIheTJ0bU6j7KQTa1uK289jsvHOGWJVlQo8gnrmI,32469
|
|
364
364
|
pygpt_net/core/text/__init__.py,sha256=6aEjrckL5kWVfyxpi5mVpSPB6XWV83e_30g_V5meL1M,19
|
|
365
365
|
pygpt_net/core/text/finder.py,sha256=NBzYUE_Av3oZH8RlCrSe6EeLcHpfz79WJV_vSK0P1jI,6656
|
|
366
366
|
pygpt_net/core/text/text.py,sha256=WyQdXx4TpBGgr3XU6AhPILvhaipB57S2XtIs8FYif84,3217
|
|
@@ -395,8 +395,8 @@ pygpt_net/css_rc.py,sha256=PX6g9z5BsD-DXISuR2oq3jHcjiKfcJ4HsgcHez6wGMc,27762
|
|
|
395
395
|
pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
|
|
396
396
|
pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
|
|
397
397
|
pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
|
|
398
|
-
pygpt_net/data/config/config.json,sha256=
|
|
399
|
-
pygpt_net/data/config/models.json,sha256=
|
|
398
|
+
pygpt_net/data/config/config.json,sha256=xr03TuDTHKEzy9XmVSxyBe5VvN1tjUfnGZh1f5-JnaM,30845
|
|
399
|
+
pygpt_net/data/config/models.json,sha256=zGatnC6Z_4qeFxoxy03wktgt8epFc7thT0SMvZvuCjE,118192
|
|
400
400
|
pygpt_net/data/config/modes.json,sha256=IpjLOm428_vs6Ma9U-YQTNKJNtZw-qyM1lwhh73xl1w,2111
|
|
401
401
|
pygpt_net/data/config/presets/agent_code_act.json,sha256=GYHqhxtKFLUCvRI3IJAJ7Qe1k8yD9wGGNwManldWzlI,754
|
|
402
402
|
pygpt_net/data/config/presets/agent_openai.json,sha256=bpDJgLRey_effQkzFRoOEGd4aHUrmzeODSDdNzrf62I,730
|
|
@@ -440,7 +440,7 @@ pygpt_net/data/css/markdown.css,sha256=yaoJPogZZ_ghbqP8vTXTycwVyD61Ik5_033NpzuUz
|
|
|
440
440
|
pygpt_net/data/css/markdown.dark.css,sha256=ixAwuT69QLesZttKhO4RAy-QukplZwwfXCZsWLN9TP4,730
|
|
441
441
|
pygpt_net/data/css/markdown.light.css,sha256=UZdv0jtuFgJ_4bYWsDaDQ4X4AP9tVNLUHBAckC_oD8k,833
|
|
442
442
|
pygpt_net/data/css/style.css,sha256=dgVlVqEL38zF-4Ok-y1rwfALC8zETJAIuIbkwat_hTk,337
|
|
443
|
-
pygpt_net/data/css/style.dark.css,sha256=
|
|
443
|
+
pygpt_net/data/css/style.dark.css,sha256=PJ04XfRN1-3HyE9AO8xy1vhsaMNGrLl0tO4hH8VmCvM,2554
|
|
444
444
|
pygpt_net/data/css/style.light.css,sha256=qJumh5HSwzGiDPoYKcKz_-8cOvV8D9QM74PtxnHBOqE,4914
|
|
445
445
|
pygpt_net/data/css/web-blocks.css,sha256=naAJKmdLqFYaVey_urdbZ1rNCwUdVgbBMypUHxuQA5M,7420
|
|
446
446
|
pygpt_net/data/css/web-blocks.dark.css,sha256=J4koULn9xZynOPsCM8zI0HwG0ChwwROaac00oOduqvA,1579
|
|
@@ -1813,6 +1813,7 @@ pygpt_net/data/locale/plugin.idx_llama_index.pl.ini,sha256=cV8NY621r-GUdA0wcsp3W
|
|
|
1813
1813
|
pygpt_net/data/locale/plugin.idx_llama_index.uk.ini,sha256=P74E9ZnGUMP7QOIj9ZQscVrHtpEqJIjhsEBks6kPBek,3287
|
|
1814
1814
|
pygpt_net/data/locale/plugin.idx_llama_index.zh.ini,sha256=x0A2Yy6wAbEgJUU8-u9pTUsSzQKzS4aKBVnVA7N9IHc,1830
|
|
1815
1815
|
pygpt_net/data/locale/plugin.mailer.en.ini,sha256=ZK7LCHAiQGw38PzZy_LyES9b7vQ47QA6XjSiq2NlsSs,962
|
|
1816
|
+
pygpt_net/data/locale/plugin.mcp.en.ini,sha256=hoYvdnuLFUAE3_fUricvCPk_wNrjz5MMNeq4Fa3Vlss,1351
|
|
1816
1817
|
pygpt_net/data/locale/plugin.openai_dalle.de.ini,sha256=XKQ6q2DbS5PrIXzB3mrHmQJmZKbq3YtSY4eglT1V-Ls,442
|
|
1817
1818
|
pygpt_net/data/locale/plugin.openai_dalle.en.ini,sha256=yJ9Ie9waoM10yrsNpduCY3Rq1NqKK8NF9ygbTBFpOyI,488
|
|
1818
1819
|
pygpt_net/data/locale/plugin.openai_dalle.es.ini,sha256=YUGL_CIzjRCEeXEYHCUYepOlEHSGFU0E1MpPcwZYH2k,449
|
|
@@ -1999,6 +2000,10 @@ pygpt_net/plugin/mailer/config.py,sha256=Sc5ezdsOevx50v3XHRZdf_dgw1x4wUhRY0z2vcf
|
|
|
1999
2000
|
pygpt_net/plugin/mailer/plugin.py,sha256=JiOnJnt-IYvP7CNAkb0u-c48EAYrUeEPOgOSnqrD-_s,3387
|
|
2000
2001
|
pygpt_net/plugin/mailer/runner.py,sha256=xM-a6XWvJ8JwOzS2JRugBfxPj0CHVL7A8ZAmzC-keQM,9775
|
|
2001
2002
|
pygpt_net/plugin/mailer/worker.py,sha256=dl9_3i8comtHWr1zYukaXoIPVl3kJEvaCrdWR5TAu2g,3900
|
|
2003
|
+
pygpt_net/plugin/mcp/__init__.py,sha256=eVXP7GWluNGBPqmkZSj-83iMdKHuE0qDmD6ZY54ceqY,510
|
|
2004
|
+
pygpt_net/plugin/mcp/config.py,sha256=Xcd0VlvjVi-wAa0N6Wi7bHMN5o8BsLbsqoeEV6VrpAg,3823
|
|
2005
|
+
pygpt_net/plugin/mcp/plugin.py,sha256=BP51yvQJ3Q5MSUloCNYt5xXc6k-Vp0tio9k0PfMab6s,19609
|
|
2006
|
+
pygpt_net/plugin/mcp/worker.py,sha256=5yMgIrevY08Ee15k8pzyvFpfrhN6C8B-0pZgzfBAzKA,10424
|
|
2002
2007
|
pygpt_net/plugin/openai_dalle/__init__.py,sha256=tvF6upS93L61NRbkQmscSJXM7ZzPlmVj16mVHUM-NHU,510
|
|
2003
2008
|
pygpt_net/plugin/openai_dalle/config.py,sha256=XUYCRaT77BDlg2GnauyRwzbxZZWpTgfs6W_oMSKNWUw,4965
|
|
2004
2009
|
pygpt_net/plugin/openai_dalle/plugin.py,sha256=i7jJFcRbBdqRdTYfUTLo5ni3FRqpp9vJ-NInzetmYXs,5391
|
|
@@ -2171,7 +2176,7 @@ pygpt_net/provider/core/calendar/db_sqlite/storage.py,sha256=QDclQCQdr4QyRIqjgGX
|
|
|
2171
2176
|
pygpt_net/provider/core/config/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
|
|
2172
2177
|
pygpt_net/provider/core/config/base.py,sha256=cbvzbMNqL2XgC-36gGubnU37t94AX7LEw0lecb2Nm80,1365
|
|
2173
2178
|
pygpt_net/provider/core/config/json_file.py,sha256=GCcpCRQnBiSLWwlGbG9T3ZgiHkTfp5Jsg2KYkZcakBw,6789
|
|
2174
|
-
pygpt_net/provider/core/config/patch.py,sha256=
|
|
2179
|
+
pygpt_net/provider/core/config/patch.py,sha256=2y7tbKO3sdsZKcjWB74AIqmgx2bTy2NhCl-uHhlm300,4465
|
|
2175
2180
|
pygpt_net/provider/core/config/patches/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2176
2181
|
pygpt_net/provider/core/config/patches/patch_before_2_6_42.py,sha256=LRjSyLwpLObmN4JWnzQpjLIdf4PHvq-l-5q6ZdNV_WY,127092
|
|
2177
2182
|
pygpt_net/provider/core/ctx/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
|
|
@@ -2397,7 +2402,7 @@ pygpt_net/ui/dialog/license.py,sha256=15Qrk_vnybnI3CAtvOHYJy8cSAkIG7fPG-HYqmSdct
|
|
|
2397
2402
|
pygpt_net/ui/dialog/logger.py,sha256=OGFKlAyeMgNQI4a-VW9bDXSrcsPtEC6rLhtdu11lsJc,2296
|
|
2398
2403
|
pygpt_net/ui/dialog/models.py,sha256=WnVvv1pFwTTXmK3uM9bNX59GMccDGxvKhAYxJXW88fs,19717
|
|
2399
2404
|
pygpt_net/ui/dialog/models_importer.py,sha256=14kxf7KkOdTP-tcgTN5OphNZajlivDPTDKBosebuyog,4505
|
|
2400
|
-
pygpt_net/ui/dialog/plugins.py,sha256=
|
|
2405
|
+
pygpt_net/ui/dialog/plugins.py,sha256=88TsvYWHdmR5hepld6ouSEa4BDhewAQ-JFE7RWGSdy8,20287
|
|
2401
2406
|
pygpt_net/ui/dialog/preset.py,sha256=G-nGxu0OUCrFUFLpT8XCJL9rWBCG6eEKNciQbLBB39s,17196
|
|
2402
2407
|
pygpt_net/ui/dialog/preset_plugins.py,sha256=ynqc0aWjU7MTL4jxcVKaRH_tC9uzeWJCUzUjI74ADb0,3796
|
|
2403
2408
|
pygpt_net/ui/dialog/profile.py,sha256=Xk9NNQmr1A5pRUxdedu7ePEBq5OYhLT8UInuRWYBktU,4105
|
|
@@ -2503,7 +2508,7 @@ pygpt_net/ui/widget/element/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5
|
|
|
2503
2508
|
pygpt_net/ui/widget/element/button.py,sha256=rhy8_RVHRV8xl0pegul31z9fNBjjIAi5Nd0hHGF6cF8,4393
|
|
2504
2509
|
pygpt_net/ui/widget/element/checkbox.py,sha256=qyX6T31c3a8Wb8B4JZwhuejD9SUAFSesdIjZdj4tv8I,2948
|
|
2505
2510
|
pygpt_net/ui/widget/element/group.py,sha256=9wedtjRTls4FdyHSwUblzdtPOaQ0-8djnjTN9CZI1KI,3702
|
|
2506
|
-
pygpt_net/ui/widget/element/labels.py,sha256=
|
|
2511
|
+
pygpt_net/ui/widget/element/labels.py,sha256=PGR3RtRjcp6yJ8u55aDIxHSriLwZ-HwDmZx_HTlsA_c,6597
|
|
2507
2512
|
pygpt_net/ui/widget/filesystem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2508
2513
|
pygpt_net/ui/widget/filesystem/explorer.py,sha256=YTQSv-ZyicJlVAKkVGkunCrKC27r2Ljnaat7FzYEJ5A,23732
|
|
2509
2514
|
pygpt_net/ui/widget/image/__init__.py,sha256=X9-pucLqQF9_ocDV-qNY6EQAJ_4dubGb-7TcWIzCXBo,488
|
|
@@ -2549,7 +2554,7 @@ pygpt_net/ui/widget/option/toggle.py,sha256=ainYgH-1UKeHf_BP0yZ48luD0k4zAvZ5jMLd
|
|
|
2549
2554
|
pygpt_net/ui/widget/option/toggle_label.py,sha256=JZwI_mpqLX6Ml9ovijXMWBHTT0t_nf3aYTqRqTYFtpY,2271
|
|
2550
2555
|
pygpt_net/ui/widget/tabs/Input.py,sha256=ELHpaWjhHJdKRhtTjDIByaMF_BqaHCyKwEWDofm0Gls,1875
|
|
2551
2556
|
pygpt_net/ui/widget/tabs/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
|
|
2552
|
-
pygpt_net/ui/widget/tabs/body.py,sha256=
|
|
2557
|
+
pygpt_net/ui/widget/tabs/body.py,sha256=rJRsa5b3Wc0CQP54LOwggXvrh9zraK3LoSd4cWXtpLI,4913
|
|
2553
2558
|
pygpt_net/ui/widget/tabs/layout.py,sha256=6b6bN04IFS0I0cYvq-nUxN2eWwHVUBiNwPXoNgLokM4,6628
|
|
2554
2559
|
pygpt_net/ui/widget/tabs/output.py,sha256=OwlRYcAwb12kMp5RT-DjsEOkXHG9FNQfJuVQBL7XnKA,25082
|
|
2555
2560
|
pygpt_net/ui/widget/textarea/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
|
|
@@ -2570,8 +2575,8 @@ pygpt_net/ui/widget/textarea/web.py,sha256=FGS0NGSpzKgtP8AzMwnC-LHDXEOY7baHImmnx
|
|
|
2570
2575
|
pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
|
|
2571
2576
|
pygpt_net/ui/widget/vision/camera.py,sha256=v1qEncaZr5pXocO5Cpk_lsgfCMvfFigdJmzsYfzvCl0,1877
|
|
2572
2577
|
pygpt_net/utils.py,sha256=7lZj_YSzx7ZfvqFtjYThEvRJNSBZzrJyK7ZxDAtYPAQ,9708
|
|
2573
|
-
pygpt_net-2.6.
|
|
2574
|
-
pygpt_net-2.6.
|
|
2575
|
-
pygpt_net-2.6.
|
|
2576
|
-
pygpt_net-2.6.
|
|
2577
|
-
pygpt_net-2.6.
|
|
2578
|
+
pygpt_net-2.6.52.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
|
|
2579
|
+
pygpt_net-2.6.52.dist-info/METADATA,sha256=VszUFGpRDVlaZJ9ZhdjccTfm8PokMMQfQBa8LTniEKM,164764
|
|
2580
|
+
pygpt_net-2.6.52.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
2581
|
+
pygpt_net-2.6.52.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
|
|
2582
|
+
pygpt_net-2.6.52.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|