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.
@@ -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.15 01:00:00 #
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:
@@ -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.05 18:00:00 #
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.05 18:00:00 #
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
 
@@ -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 02:00:00 #
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 remove_widget(self, widget: QWidget) -> None:
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 remove_all_widgets(self) -> None:
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
- layout.removeWidget(widget)
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.50
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
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
120
121
 
121
- Release: **2.6.50** | build: **2025-09-16** | Python: **>=3.10, <3.14**
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=vjurig7COWO6t5pdRFXRH64G4u0bEZwLoqlDLN_975Y,106581
1
+ pygpt_net/CHANGELOG.txt,sha256=YPOGP3OKkHn4fNlJkQmG6eWpKj7tugHtd3ZSFloZKy8,107012
2
2
  pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
3
- pygpt_net/__init__.py,sha256=NpnSCUS2ZzD1SqrgRbj-4RcEcgVtBmCPA6t-DObN4GU,1373
4
- pygpt_net/app.py,sha256=prS80WfKSu8U_Ox9oUdxgzgHgRB1nvQQAMFTNltiECY,21954
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=_j2LRj4lYVXeP_JteINlOJwuBbxbOj3WP3v5bw1nDqE,6060
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=s55RkCFQPFzdDoQ2zp3kohlNdpiWxdSxQtsaROeiigw,4424
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=bjz0qCFRAoFpAR3EglV-Lo3yX-sRIo9I85i1sgzfaCs,46250
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=Pih53K5G6hD3dWeCF_EWaG5VIF6-x1z1Vs1enmpA6q0,29190
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=ao9kQk6Xjse95m1TbL1Mlbo1k1Q8D9eGc10L-71G9TY,7227
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=ecb7tgU7C9Ip5ww16M-HejScN1Btp9IlPgzQyadOCls,8829
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=baP3vaZHk21k_M6aIiMIaj7p-Bi3CtgmkR3L7EQ_MOE,68859
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=oUQEBWLmVEAp8ck7ur6BI9Ax98csQEHgKiAf1BnWjQk,6138
363
- pygpt_net/core/tabs/tabs.py,sha256=Bh_h4R_mWMYZKMmpfJsBmhOYZwUaP8c_iQvuPMUZsHo,32407
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=BV6QRkggBjajdVqBNCW8t5_J4NsvMZj3uwlIEmyaao8,30845
399
- pygpt_net/data/config/models.json,sha256=C-SaLGLEaItyuP9IAEn9J1wdajE50DoYmVtY7-Xvl7A,118192
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=_GxmvAJgBc_YnbKFBcSSr533EOyRh24TXfQ2rnu7Hsw,2441
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=OLobSe5baE7abffQYiw94zAlgWNJlCQjMX0OlGFW-JE,4224
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=gi7tWH0Il3akehiOO3EcwoUt55vq7ANCwrd3YDSnHCw,20419
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=RpZa11w457iBw_lDCh0MLRKxiCNoUUD-4FSnC6CxblA,6631
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=dNHfsQ1c6qVylg44I3PvDN21zyJKOkUz2KdH93St5l8,4373
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.50.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2574
- pygpt_net-2.6.50.dist-info/METADATA,sha256=Bf0w6pC4SYUcOJ7nrOxR9313ohrfvU7sMz_964SW56c,163547
2575
- pygpt_net-2.6.50.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2576
- pygpt_net-2.6.50.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2577
- pygpt_net-2.6.50.dist-info/RECORD,,
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,,