pygpt-net 2.4.32__py3-none-any.whl → 2.4.33__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. CHANGELOG.md +5 -0
  2. README.md +9 -4
  3. pygpt_net/CHANGELOG.txt +5 -0
  4. pygpt_net/__init__.py +2 -2
  5. pygpt_net/controller/chat/attachment.py +10 -1
  6. pygpt_net/core/attachments/context.py +47 -2
  7. pygpt_net/core/debug/context.py +5 -1
  8. pygpt_net/core/idx/indexing.py +12 -15
  9. pygpt_net/core/render/markdown/pid.py +2 -1
  10. pygpt_net/core/render/plain/pid.py +2 -1
  11. pygpt_net/core/render/web/body.py +34 -12
  12. pygpt_net/core/render/web/pid.py +2 -1
  13. pygpt_net/core/render/web/renderer.py +8 -3
  14. pygpt_net/data/config/config.json +2 -2
  15. pygpt_net/data/config/models.json +2 -2
  16. pygpt_net/data/config/modes.json +2 -2
  17. pygpt_net/data/css/web.css +70 -0
  18. pygpt_net/data/css/web.dark.css +4 -1
  19. pygpt_net/data/css/web.light.css +1 -1
  20. pygpt_net/data/locale/locale.de.ini +1 -1
  21. pygpt_net/data/locale/locale.en.ini +1 -1
  22. pygpt_net/data/locale/locale.es.ini +1 -1
  23. pygpt_net/data/locale/locale.fr.ini +1 -1
  24. pygpt_net/data/locale/locale.it.ini +1 -1
  25. pygpt_net/data/locale/locale.pl.ini +1 -1
  26. pygpt_net/data/locale/locale.uk.ini +1 -1
  27. pygpt_net/data/locale/locale.zh.ini +1 -1
  28. pygpt_net/plugin/cmd_code_interpreter/runner.py +2 -2
  29. pygpt_net/plugin/cmd_mouse_control/__init__.py +4 -2
  30. pygpt_net/provider/loaders/base.py +10 -1
  31. pygpt_net/provider/loaders/web_yt.py +19 -1
  32. {pygpt_net-2.4.32.dist-info → pygpt_net-2.4.33.dist-info}/METADATA +10 -5
  33. {pygpt_net-2.4.32.dist-info → pygpt_net-2.4.33.dist-info}/RECORD +36 -36
  34. {pygpt_net-2.4.32.dist-info → pygpt_net-2.4.33.dist-info}/LICENSE +0 -0
  35. {pygpt_net-2.4.32.dist-info → pygpt_net-2.4.33.dist-info}/WHEEL +0 -0
  36. {pygpt_net-2.4.32.dist-info → pygpt_net-2.4.33.dist-info}/entry_points.txt +0 -0
CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 2.4.33 (2024-11-26)
4
+
5
+ - Improved CSS and rendering of file and image lists.
6
+ - Added displaying of used attachments in the chat window.
7
+
3
8
  ## 2.4.32 (2024-11-26)
4
9
 
5
10
  - The "Add URL" option added to the "Attachments" tab allows users to include content from a given website as additional context. Currently, it only supports standard web pages and video transcription for YouTube links. More "web" options will be added in the future.
README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
4
4
 
5
- Release: **2.4.32** | build: **2024.11.26** | Python: **>=3.10, <3.12**
5
+ Release: **2.4.33** | build: **2024.11.26** | Python: **>=3.10, <3.12**
6
6
 
7
7
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
8
8
  >
@@ -155,11 +155,11 @@ pip install pygpt-net
155
155
  pygpt
156
156
  ```
157
157
 
158
- ## Source Code
158
+ ## Running from GitHub source code
159
159
 
160
160
  An alternative method is to download the source code from `GitHub` and execute the application using the Python interpreter (>=3.10, <3.12).
161
161
 
162
- ### Running from GitHub source code
162
+ ### Install with pip
163
163
 
164
164
  1. Clone git repository or download .zip file:
165
165
 
@@ -187,7 +187,7 @@ pip install -r requirements.txt
187
187
  python3 run.py
188
188
  ```
189
189
 
190
- **Install with Poetry**
190
+ ### Install with Poetry
191
191
 
192
192
  1. Clone git repository or download .zip file:
193
193
 
@@ -3656,6 +3656,11 @@ may consume additional tokens that are not displayed in the main window.
3656
3656
 
3657
3657
  ## Recent changes:
3658
3658
 
3659
+ **2.4.33 (2024-11-26)**
3660
+
3661
+ - Improved CSS and rendering of file and image lists.
3662
+ - Added displaying of used attachments in the chat window.
3663
+
3659
3664
  **2.4.32 (2024-11-26)**
3660
3665
 
3661
3666
  - The "Add URL" option added to the "Attachments" tab allows users to include content from a given website as additional context. Currently, it only supports standard web pages and video transcription for YouTube links. More "web" options will be added in the future.
pygpt_net/CHANGELOG.txt CHANGED
@@ -1,3 +1,8 @@
1
+ 2.4.33 (2024-11-26)
2
+
3
+ - Improved CSS and rendering of file and image lists.
4
+ - Added displaying of used attachments in the chat window.
5
+
1
6
  2.4.32 (2024-11-26)
2
7
 
3
8
  - The "Add URL" option added to the "Attachments" tab allows users to include content from a given website as additional context. Currently, it only supports standard web pages and video transcription for YouTube links. More "web" options will be added in the future.
pygpt_net/__init__.py CHANGED
@@ -6,14 +6,14 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.11.26 01:00:00 #
9
+ # Updated Date: 2024.11.26 05:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  __author__ = "Marcin Szczygliński"
13
13
  __copyright__ = "Copyright 2024, Marcin Szczygliński"
14
14
  __credits__ = ["Marcin Szczygliński"]
15
15
  __license__ = "MIT"
16
- __version__ = "2.4.32"
16
+ __version__ = "2.4.33"
17
17
  __build__ = "2024.11.26"
18
18
  __maintainer__ = "Marcin Szczygliński"
19
19
  __github__ = "https://github.com/szczyglis-dev/py-gpt"
@@ -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: 2024.11.26 02:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -274,6 +274,7 @@ class Attachment(QObject):
274
274
  if self.is_verbose():
275
275
  print("\nPreparing additional context...\nContext Mode: {}".format(self.mode))
276
276
 
277
+ self.window.core.attachments.context.reset()
277
278
  if self.mode == self.MODE_FULL_CONTEXT:
278
279
  content = self.get_full_context(ctx)
279
280
  elif self.mode == self.MODE_QUERY_CONTEXT:
@@ -281,6 +282,14 @@ class Attachment(QObject):
281
282
  elif self.mode == self.MODE_QUERY_CONTEXT_SUMMARY:
282
283
  content = self.get_context_summary(ctx)
283
284
 
285
+ # append used files and urls to context
286
+ files = self.window.core.attachments.context.get_used_files()
287
+ urls = self.window.core.attachments.context.get_used_urls()
288
+ if files:
289
+ ctx.files = files
290
+ if urls:
291
+ ctx.urls = urls
292
+
284
293
  if content:
285
294
  if self.is_verbose():
286
295
  print("\n--- Using additional context ---\n\n{}".format(content))
@@ -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: 2024.11.26 02:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import copy
@@ -31,6 +31,11 @@ class Context:
31
31
  """
32
32
  self.window = window
33
33
  self.dir_index = "index"
34
+ self.last_used_item = None
35
+ self.last_used_content = None
36
+ self.last_used_context = None
37
+ self.last_files = []
38
+ self.last_urls = []
34
39
  self.summary_prompt = """
35
40
  Summarize the text below by extracting the most important information,
36
41
  especially those that may help answer the question:
@@ -93,17 +98,32 @@ class Context:
93
98
  file_id = file["uuid"]
94
99
  file_idx_path = os.path.join(meta_path, file_id)
95
100
  text_path = os.path.join(file_idx_path, file_id + ".txt")
101
+ store_path = file["path"]
102
+ if "real_path" in file:
103
+ store_path = file["real_path"]
96
104
  if filename:
97
105
  if file["type"] == "url":
98
106
  context += "URL: {}\n".format(file["path"]) + "\n"
99
107
  else:
100
108
  context += "Filename: {}\n".format(file["name"]) + "\n"
109
+
110
+ # store used files and URLs in ctx
111
+ if file["type"] == "url":
112
+ if store_path not in self.last_urls:
113
+ self.last_urls.append(store_path)
114
+ else:
115
+ if store_path not in self.last_files:
116
+ self.last_files.append(store_path)
117
+
101
118
  if os.path.exists(text_path):
102
119
  try:
103
120
  with open(text_path, "r", encoding="utf-8") as f:
104
121
  context += f.read() + "\n\n"
105
122
  except Exception as e:
106
123
  print("Attachments: read error: {}".format(e))
124
+
125
+ self.last_used_content = context
126
+ self.last_used_context = context
107
127
  return context
108
128
 
109
129
  def query_context(self, meta: CtxMeta, query: str) -> str:
@@ -126,7 +146,6 @@ class Context:
126
146
  file_id = file["uuid"]
127
147
  file_idx_path = os.path.join(meta_path, file_id)
128
148
  file_path = os.path.join(file_idx_path, file["name"])
129
- model = None
130
149
  type = AttachmentItem.TYPE_FILE
131
150
  source = file_path
132
151
  if "type" in file:
@@ -147,6 +166,7 @@ class Context:
147
166
 
148
167
  model = None # no model, retrieval is used
149
168
  result = self.window.core.idx.chat.query_attachment(query, idx_path, model)
169
+ self.last_used_context = result
150
170
 
151
171
  if self.is_verbose():
152
172
  print("Attachments: query result: {}".format(result))
@@ -193,6 +213,7 @@ class Context:
193
213
  })
194
214
  self.window.dispatch(event)
195
215
  response = event.data.get("response")
216
+ self.last_used_context = response
196
217
  if self.is_verbose():
197
218
  print("Attachments: summary received: {}".format(response))
198
219
  return response
@@ -519,6 +540,30 @@ class Context:
519
540
  except Exception as e:
520
541
  self.window.core.debug.error("Attachment.truncate", e)
521
542
 
543
+ def reset(self):
544
+ """Reset context info"""
545
+ self.last_used_item = None
546
+ self.last_used_content = None
547
+ self.last_used_context = None
548
+ self.last_files = []
549
+ self.last_urls = []
550
+
551
+ def get_used_files(self) -> list:
552
+ """
553
+ Get last used files
554
+
555
+ :return: list of files
556
+ """
557
+ return self.last_files
558
+
559
+ def get_used_urls(self) -> list:
560
+ """
561
+ Get last used URLs
562
+
563
+ :return: list of URLs
564
+ """
565
+ return self.last_urls
566
+
522
567
  def is_verbose(self) -> bool:
523
568
  """
524
569
  Check if verbose mode is enabled
@@ -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: 2024.11.20 03:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
  import json
12
12
 
@@ -45,6 +45,10 @@ class ContextDebug:
45
45
  self.window.core.debug.add(self.id, 'CMD (current)', str(self.window.core.ctx.current_cmd))
46
46
  self.window.core.debug.add(self.id, 'CMD schema (current)', str(self.window.core.ctx.current_cmd_schema))
47
47
  self.window.core.debug.add(self.id, 'FUNCTIONS (current)', str(self.get_functions()))
48
+ self.window.core.debug.add(self.id, 'Attachments: last used content',
49
+ str(self.window.core.attachments.context.last_used_content))
50
+ self.window.core.debug.add(self.id, 'Attachments: last used context',
51
+ str(self.window.core.attachments.context.last_used_context))
48
52
 
49
53
  current = None
50
54
  if self.window.core.ctx.get_current() is not 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: 2024.11.26 02:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
@@ -1062,22 +1062,19 @@ class Indexing:
1062
1062
 
1063
1063
  def get_webtype(self, url: str) -> str:
1064
1064
  """
1065
- Get web type by URL
1065
+ Get web loader type by URL
1066
1066
 
1067
1067
  :param url: URL
1068
- :return: web type
1069
- """
1070
- type = "webpage"
1071
- yt_prefix = [
1072
- "https://youtube.com",
1073
- "https://youtu.be",
1074
- "https://www.youtube.com",
1075
- "https://m.youtube.com",
1076
- ]
1077
- for prefix in yt_prefix:
1078
- if url.startswith(prefix):
1079
- type = "youtube"
1080
- break
1068
+ :return: web loader type
1069
+ """
1070
+ type = "webpage" # default
1071
+ for id in self.data_providers:
1072
+ loader = self.data_providers[id]
1073
+ if hasattr(loader, "is_supported_attachment"):
1074
+ if loader.is_supported_attachment(url):
1075
+ type = id
1076
+ break
1077
+ print("Selected web data loader: {}".format(type))
1081
1078
  return type
1082
1079
 
1083
1080
  def remove_attachment(self, index_path: str, doc_id: str) -> bool:
@@ -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: 2024.11.05 23:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  class PidData():
@@ -17,6 +17,7 @@ class PidData():
17
17
  self.meta = meta
18
18
  self.images_appended = []
19
19
  self.urls_appended = []
20
+ self.files_appended = []
20
21
  self.buffer = ""
21
22
  self.prev_position = None # previous cursor position (for chunk append)
22
23
  self.is_cmd = False
@@ -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: 2024.11.05 23:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  class PidData():
@@ -17,5 +17,6 @@ class PidData():
17
17
  self.meta = meta
18
18
  self.images_appended = []
19
19
  self.urls_appended = []
20
+ self.files_appended = []
20
21
  self.buffer = ""
21
22
  self.is_cmd = False
@@ -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: 2024.11.20 21:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -167,10 +167,12 @@ class Body:
167
167
  if num is not None and num_all is not None and num_all > 1:
168
168
  num_str = " [{}]".format(num)
169
169
  url, path = self.window.core.filesystem.extract_local_url(url)
170
- return """<a href="{url}"><img src="{path}" class="image"></a>
171
- <p><b>{prefix}{num}:</b> <a href="{url}">{path}</a></p>""". \
170
+ basename = os.path.basename(path)
171
+ return """<div class="extra-src-img-box" title="{url}"><div class="img-outer"><div class="img-wrapper"><a href="{url}"><img src="{path}" class="image"></a></div>
172
+ <a href="{url}" class="title">{title}</a></div></div>""". \
172
173
  format(prefix=trans('chat.prefix.img'),
173
174
  url=url,
175
+ title=basename,
174
176
  path=path,
175
177
  num=num_str)
176
178
 
@@ -183,13 +185,19 @@ class Body:
183
185
  :param num_all: number of all URLs
184
186
  :return: HTML code
185
187
  """
188
+ icon_path = os.path.join(
189
+ self.window.core.config.get_app_path(),
190
+ "data", "icons", "public_filled.svg"
191
+ )
192
+ icon = '<img src="file://{}" width="25" height="25" valign="middle" class="extra-src-icon">'.format(icon_path)
186
193
  num_str = ""
187
194
  if num is not None and num_all is not None and num_all > 1:
188
195
  num_str = " [{}]".format(num)
189
- return """<b>{prefix}{num}:</b> <a href="{url}" title="{url}">{url}</a>""". \
190
- format(prefix=trans('chat.prefix.url'),
191
- url=url,
192
- num=num_str)
196
+ return """{icon}<b>{num}</b> <a href="{url}" title="{url}">{url}</a>""". \
197
+ format(url=url,
198
+ num=num_str,
199
+ icon=icon,
200
+ )
193
201
 
194
202
  def get_docs_html(self, docs: list) -> str:
195
203
  """
@@ -223,8 +231,16 @@ class Body:
223
231
  except Exception as e:
224
232
  pass
225
233
 
234
+ icon_path = os.path.join(
235
+ self.window.core.config.get_app_path(),
236
+ "data", "icons", "db.svg"
237
+ )
238
+ icon = '<img src="file://{}" width="25" height="25" valign="middle" class="extra-src-icon">'.format(icon_path)
226
239
  if html_sources != "":
227
- html += "<p><small><b>{prefix}:</b></small></p>".format(prefix=trans('chat.prefix.doc'))
240
+ html += "<p>{icon}<small><b>{prefix}:</b></small></p>".format(
241
+ prefix=trans('chat.prefix.doc'),
242
+ icon=icon,
243
+ )
228
244
  html += "<div class=\"cmd\">"
229
245
  html += "<p>" + html_sources + "</p>"
230
246
  html += "</div> "
@@ -239,15 +255,21 @@ class Body:
239
255
  :param num_all: number of all files
240
256
  :return: HTML code
241
257
  """
258
+ icon_path = os.path.join(
259
+ self.window.core.config.get_app_path(),
260
+ "data", "icons", "attachments.svg"
261
+ )
262
+ icon = '<img src="file://{}" width="25" height="25" valign="middle" class="extra-src-icon">'.format(icon_path)
242
263
  num_str = ""
243
264
  if num is not None and num_all is not None and num_all > 1:
244
265
  num_str = " [{}]".format(num)
245
266
  url, path = self.window.core.filesystem.extract_local_url(url)
246
- return """<div><b>{prefix}{num}:</b> <a href="{url}">{path}</a></div>""". \
247
- format(prefix=trans('chat.prefix.file'),
248
- url=url,
267
+ return """{icon} <b>{num}</b> <a href="{url}">{path}</a>""". \
268
+ format(url=url,
249
269
  path=path,
250
- num=num_str)
270
+ num=num_str,
271
+ icon=icon,
272
+ )
251
273
 
252
274
  def prepare_tool_extra(self, ctx: CtxItem) -> str:
253
275
  """
@@ -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: 2024.11.05 23:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from pygpt_net.utils import trans
@@ -20,6 +20,7 @@ class PidData():
20
20
  self.meta = meta
21
21
  self.images_appended = []
22
22
  self.urls_appended = []
23
+ self.files_appended = []
23
24
  self.buffer = "" # stream buffer
24
25
  self.is_cmd = False
25
26
  self.html = "" # html buffer
@@ -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: 2024.11.21 20:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import json
@@ -420,16 +420,20 @@ class Renderer(BaseRenderer):
420
420
  # files and attachments, TODO check attachments
421
421
  c = len(ctx.files)
422
422
  if c > 0:
423
+ files_html = []
423
424
  n = 1
424
425
  for file in ctx.files:
425
- if file in appended:
426
+ if file in appended or file in self.pids[pid].files_appended:
426
427
  continue
427
428
  try:
428
429
  appended.append(file)
429
- html += self.body.get_file_html(file, n, c)
430
+ files_html.append(self.body.get_file_html(file, n, c))
431
+ self.pids[pid].files_appended.append(file)
430
432
  n += 1
431
433
  except Exception as e:
432
434
  pass
435
+ if files_html:
436
+ html += "<br/>" + "<br/>".join(files_html)
433
437
 
434
438
  # urls
435
439
  c = len(ctx.urls)
@@ -519,6 +523,7 @@ class Renderer(BaseRenderer):
519
523
  self.clear_chunks(pid)
520
524
  self.pids[pid].images_appended = []
521
525
  self.pids[pid].urls_appended = []
526
+ self.pids[pid].files_appended = []
522
527
  self.get_output_node_by_pid(pid).reset_current_content()
523
528
  self.reset_names_by_pid(pid)
524
529
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.32",
4
- "app.version": "2.4.32",
3
+ "version": "2.4.33",
4
+ "app.version": "2.4.33",
5
5
  "updated_at": "2024-11-26T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.32",
4
- "app.version": "2.4.32",
3
+ "version": "2.4.33",
4
+ "app.version": "2.4.33",
5
5
  "updated_at": "2024-11-26T00:00:00"
6
6
  },
7
7
  "items": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.32",
4
- "app.version": "2.4.32",
3
+ "version": "2.4.33",
4
+ "app.version": "2.4.33",
5
5
  "updated_at": "2024-11-26T00:00:00"
6
6
  },
7
7
  "items": {
@@ -26,10 +26,76 @@ body {{
26
26
  -webkit-border-radius: 1ex;
27
27
  -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.75);
28
28
  }}
29
+ a {{
30
+ text-decoration: none;
31
+ color: #a1b5c4 !important;
32
+ }}
33
+ a:hover {{
34
+ cursor: pointer !important;
35
+ text-decoration: underline;
36
+ }}
29
37
  p {{
30
38
  margin-top: 5px;
31
39
  margin-bottom: 5px;
32
40
  }}
41
+ .extra-src-icon {{
42
+ padding-right: 2px;
43
+ }}
44
+ .extra-src-img-box {{
45
+ display: inline-block;
46
+ text-align: center;
47
+ padding: 5px;
48
+ margin: 5px;
49
+ max-width: 400px;
50
+ height: auto;
51
+ white-space: pre-wrap;
52
+ word-break: break-all !important;
53
+ }}
54
+ .extra-src-img-box:hover {{
55
+ cursor: pointer;
56
+ }}
57
+ .extra-src-img-box .title {{
58
+ width: 400px;
59
+ overflow: hidden;
60
+ white-space: nowrap;
61
+ text-overflow: ellipsis;
62
+ display: block;
63
+ text-align: center;
64
+ padding: 0;
65
+ margin: 0;
66
+ padding-top: 10px;
67
+ display: block;
68
+ font-size: 0.95rem;
69
+ }}
70
+ .extra-src-img-box .img-outer {{
71
+ display: flex;
72
+ flex-direction: column;
73
+ }}
74
+ .extra-src-img-box .img-wrapper {{
75
+ position: relative;
76
+ overflow: hidden;
77
+ border: 1px solid #000;
78
+ background: #000;
79
+ width: 400px;
80
+ height: 280px;
81
+ margin: 0;
82
+ margin-bottom: 0px !important;
83
+ border-radius: 5px;
84
+ -webkit-box-shadow: 8px 8px 22px -16px rgba(0, 0, 0, 1);
85
+ -moz-box-shadow: 8px 8px 22px -16px rgba(0, 0, 0, 1);
86
+ box-shadow: 8px 8px 22px -16px rgba(0, 0, 0, 1);
87
+ }}
88
+ .extra-src-img-box .img-wrapper:hover {{
89
+ border: 1px solid gray;
90
+ }}
91
+ .extra-src-img-box img {{
92
+ margin-bottom: 2px;
93
+ padding-bottom: 0px;
94
+ display: block;
95
+ width: 100%;
96
+ height: 100%;
97
+ object-fit: cover;
98
+ }}
33
99
  .msg-user {{
34
100
  white-space: pre-wrap;
35
101
  width: auto;
@@ -52,6 +118,10 @@ p {{
52
118
  .msg-extra {{
53
119
  margin-top: 10px;
54
120
  margin-bottom: 0px;
121
+ color: gray;
122
+ }}
123
+ .msg-extra a {{
124
+ color: gray;
55
125
  }}
56
126
  .msg-user .msg-extra {{
57
127
  font-weight: bold;
@@ -15,7 +15,10 @@ body {{
15
15
  background: #232629;
16
16
  }}
17
17
  a {{
18
- color: #fff;
18
+ color: #a1b5c4 !important;
19
+ }}
20
+ a:hover {{
21
+ color: #b8cad7 !important;
19
22
  }}
20
23
  .msg-user {{
21
24
  color: #cbcbcb !important;
@@ -18,7 +18,7 @@ p {{
18
18
  color: #000;
19
19
  }}
20
20
  a {{
21
- color: #000;
21
+ color: #3b7097 !important;
22
22
  }}
23
23
  .msg-user {{
24
24
  color: #2c2c2c !important;
@@ -8,7 +8,7 @@ about.thanks.sponsors = Sponsoren
8
8
  about.thanks.supporters = Unterstützer
9
9
  action.add = Hinzufügen
10
10
  action.clear = Löschen
11
- action.cmd.expand = zeigen/verbergen Ausgabe
11
+ action.cmd.expand = JSON-Ausgabe
12
12
  action.copy = Kopieren
13
13
  action.ctx_copy_id = ID kopieren
14
14
  action.ctx.indexed = Zuletzt indiziert am
@@ -9,7 +9,7 @@ about.thanks.supporters = Supporters
9
9
  action.add = Add
10
10
  action.clear = Clear
11
11
  action.close = Close
12
- action.cmd.expand = show/hide raw output
12
+ action.cmd.expand = JSON output
13
13
  action.copy = Copy
14
14
  action.ctx_copy_id = Copy ID
15
15
  action.ctx.indexed = Last indexed at
@@ -8,7 +8,7 @@ about.thanks.sponsors = Patrocinadores
8
8
  about.thanks.supporters = Colaboradores
9
9
  action.add = Añadir
10
10
  action.clear = Limpiar
11
- action.cmd.expand = mostrar/ocultar salida
11
+ action.cmd.expand = salida JSON
12
12
  action.copy = Copiar
13
13
  action.ctx_copy_id = Copiar ID
14
14
  action.ctx.indexed = Última indexación el
@@ -8,7 +8,7 @@ about.thanks.sponsors = Sponsors
8
8
  about.thanks.supporters = Supporteurs
9
9
  action.add = Ajouter
10
10
  action.clear = Effacer
11
- action.cmd.expand = afficher/masquer sortie
11
+ action.cmd.expand = résultat JSON
12
12
  action.copy = Copier
13
13
  action.ctx_copy_id = Copier l'ID
14
14
  action.ctx.indexed = Dernière indexation le
@@ -8,7 +8,7 @@ about.thanks.sponsors = Sponsor
8
8
  about.thanks.supporters = Sostenitori
9
9
  action.add = Aggiungi
10
10
  action.clear = Cancella
11
- action.cmd.expand = mostra/nascondi uscita
11
+ action.cmd.expand = output JSON
12
12
  action.copy = Copia
13
13
  action.ctx_copy_id = Copia ID
14
14
  action.ctx.indexed = Ultima indicizzazione il
@@ -8,7 +8,7 @@ about.thanks.sponsors = Sponsorzy
8
8
  about.thanks.supporters = Wspierający
9
9
  action.add = Dodaj
10
10
  action.clear = Wyczyść
11
- action.cmd.expand = pokaż/ukryj wynik
11
+ action.cmd.expand = wynik JSON
12
12
  action.copy = Kopiuj
13
13
  action.ctx_copy_id = Kopiuj ID
14
14
  action.ctx.indexed = Ostatnio zindeksowane
@@ -8,7 +8,7 @@ about.thanks.sponsors = Спонсори
8
8
  about.thanks.supporters = Підтримувачі
9
9
  action.add = Додати
10
10
  action.clear = Очистити
11
- action.cmd.expand = показати/приховати вихід
11
+ action.cmd.expand = результат JSON
12
12
  action.copy = Копіювати
13
13
  action.ctx_copy_id = Копіювати ID
14
14
  action.ctx.indexed = Останнє індексування в
@@ -8,7 +8,7 @@ about.thanks.sponsors = 贊助商
8
8
  about.thanks.supporters = 支持者
9
9
  action.add = 添加
10
10
  action.clear = 清除
11
- action.cmd.expand = 显示/隐藏输出
11
+ action.cmd.expand = JSON输出
12
12
  action.copy = 复制
13
13
  action.ctx_copy_id = 複製ID
14
14
  action.ctx.indexed = 最後索引於
@@ -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: 2024.11.25 02:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os.path
@@ -140,7 +140,7 @@ class Runner:
140
140
 
141
141
  # append to ctx
142
142
  ctx.files = paths
143
- ctx.images = images_list
143
+ ctx.images = self.plugin.window.core.filesystem.make_local_list(list(images_list))
144
144
  return paths
145
145
 
146
146
  def handle_result_ipython(self, ctx: CtxItem, response) -> str:
@@ -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: 2024.11.24 04:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Slot, QTimer
@@ -141,7 +141,9 @@ class Plugin(BasePlugin):
141
141
  self.window.controller.attachment.clear_silent()
142
142
  path = self.window.controller.painter.capture.screenshot(attach_cursor=True,
143
143
  silent=True) # attach screenshot
144
- ctx.images.append(path)
144
+
145
+ img_path = self.window.core.filesystem.make_local(path)
146
+ ctx.images.append(img_path)
145
147
  #ctx.images_before.append(path)
146
148
 
147
149
  context = BridgeContext()
@@ -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: 2024.04.17 01:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from llama_index.core.readers.base import BaseReader
@@ -75,6 +75,15 @@ class BaseLoader:
75
75
  return args.get("url")
76
76
  return ""
77
77
 
78
+ def is_supported_attachment(self, source: str) -> bool:
79
+ """
80
+ Check if attachment is supported by loader
81
+
82
+ :param source: attachment source
83
+ :return: True if supported
84
+ """
85
+ return False
86
+
78
87
  def get(self) -> BaseReader:
79
88
  """
80
89
  Get reader instance
@@ -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: 2024.03.12 06:00:00 #
9
+ # Updated Date: 2024.11.26 04:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from llama_index.core.readers.base import BaseReader
@@ -52,3 +52,21 @@ class Loader(BaseLoader):
52
52
  args = {}
53
53
  args["ytlinks"] = [kwargs.get("url")] # list of links
54
54
  return args
55
+
56
+ def is_supported_attachment(self, source: str) -> bool:
57
+ """
58
+ Check if attachment is supported by loader
59
+
60
+ :param source: attachment source
61
+ :return: True if supported
62
+ """
63
+ yt_prefix = [
64
+ "https://youtube.com",
65
+ "https://youtu.be",
66
+ "https://www.youtube.com",
67
+ "https://m.youtube.com",
68
+ ]
69
+ for prefix in yt_prefix:
70
+ if source.startswith(prefix):
71
+ return True
72
+ return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pygpt-net
3
- Version: 2.4.32
3
+ Version: 2.4.33
4
4
  Summary: Desktop AI Assistant powered by models: OpenAI o1, GPT-4o, GPT-4, GPT-4 Vision, GPT-3.5, DALL-E 3, Llama 3, Mistral, Gemini, Claude, Bielik, and other models supported by Langchain, Llama Index, and Ollama. Features include chatbot, text completion, image generation, vision analysis, speech-to-text, internet access, file handling, command execution and more.
5
5
  Home-page: https://pygpt.net
6
6
  License: MIT
@@ -92,7 +92,7 @@ Description-Content-Type: text/markdown
92
92
 
93
93
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
94
94
 
95
- Release: **2.4.32** | build: **2024.11.26** | Python: **>=3.10, <3.12**
95
+ Release: **2.4.33** | build: **2024.11.26** | Python: **>=3.10, <3.12**
96
96
 
97
97
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
98
98
  >
@@ -245,11 +245,11 @@ pip install pygpt-net
245
245
  pygpt
246
246
  ```
247
247
 
248
- ## Source Code
248
+ ## Running from GitHub source code
249
249
 
250
250
  An alternative method is to download the source code from `GitHub` and execute the application using the Python interpreter (>=3.10, <3.12).
251
251
 
252
- ### Running from GitHub source code
252
+ ### Install with pip
253
253
 
254
254
  1. Clone git repository or download .zip file:
255
255
 
@@ -277,7 +277,7 @@ pip install -r requirements.txt
277
277
  python3 run.py
278
278
  ```
279
279
 
280
- **Install with Poetry**
280
+ ### Install with Poetry
281
281
 
282
282
  1. Clone git repository or download .zip file:
283
283
 
@@ -3746,6 +3746,11 @@ may consume additional tokens that are not displayed in the main window.
3746
3746
 
3747
3747
  ## Recent changes:
3748
3748
 
3749
+ **2.4.33 (2024-11-26)**
3750
+
3751
+ - Improved CSS and rendering of file and image lists.
3752
+ - Added displaying of used attachments in the chat window.
3753
+
3749
3754
  **2.4.32 (2024-11-26)**
3750
3755
 
3751
3756
  - The "Add URL" option added to the "Attachments" tab allows users to include content from a given website as additional context. Currently, it only supports standard web pages and video transcription for YouTube links. More "web" options will be added in the future.
@@ -1,9 +1,9 @@
1
- CHANGELOG.md,sha256=yPoiJh3FFMC3YRblIMxi4xWf-TWGw9ezVcCZ_-2ZQLE,76070
2
- README.md,sha256=ma4aP_0kj2W2X56wqSLtVawHUxmSd8L83nF3GvgQlx4,156962
1
+ CHANGELOG.md,sha256=XNjJXQqzZoUNJAmAdBzAQ-NDZD90u1rmx1Bkrw_e16c,76208
2
+ README.md,sha256=kz22pXKZmr6pZRUXBbezs4RcNFq7qKmeSVTm-xumcjI,157106
3
3
  icon.png,sha256=CzcINJaU23a9hNjsDlDNbyuiEvKZ4Wg6DQVYF6SpuRg,13970
4
- pygpt_net/CHANGELOG.txt,sha256=I5vrm4MNDwEATw9xt9ShszYnwT7hnIf5Q8y5p1rkCiI,74646
4
+ pygpt_net/CHANGELOG.txt,sha256=WUVPO45ESjOeB59UlS5k88Eqt3iH4cHbtxmf34zYYbs,74781
5
5
  pygpt_net/LICENSE,sha256=6Ku72-zJ8wO5VIR87UoJ5P_coCVjPghaFL9ZF2jLp7E,1146
6
- pygpt_net/__init__.py,sha256=AsA0fpJWIb1skBRMy-iq73wChkhWK5QJZdTgXLsYlFk,1067
6
+ pygpt_net/__init__.py,sha256=Bs977ZbK0kfm1WTigIePMFXwgKNg9IdnYrD0_NPzBjI,1067
7
7
  pygpt_net/app.py,sha256=Q7g-2UlF7FlEOBytbGb_nrjT4zEio2HzfzQd687QuUo,15930
8
8
  pygpt_net/config.py,sha256=hwleTfPpI8SpFwUH5I9VVgCFC-cgeeoHhxlezNdJPBE,15731
9
9
  pygpt_net/container.py,sha256=BemiVZPpPNIzfB-ZvnZeeBPFu-AcX2c30OqYFylEjJc,4023
@@ -28,7 +28,7 @@ pygpt_net/controller/calendar/__init__.py,sha256=aAYEAex5UNoB7LHdNSKssls2Rdc877E
28
28
  pygpt_net/controller/calendar/note.py,sha256=B19cNKyD9UODZo7LdyST0U3I3519jsqVgWJp5UDTgVU,10841
29
29
  pygpt_net/controller/camera.py,sha256=t_ZgevP3zrsBe_A4Yx_WO4PfMMfYbsezd9NdQzkMpOQ,16522
30
30
  pygpt_net/controller/chat/__init__.py,sha256=IJwIVfwmbc5ItSTvkOb7VVVyelEpPPbB-AbXJzfPywI,3002
31
- pygpt_net/controller/chat/attachment.py,sha256=JkTi9rwMzr5fZoFo0wX6O7ZiCUwLXS5H8DSVsUmoHO0,20521
31
+ pygpt_net/controller/chat/attachment.py,sha256=00TU_Wy7O_DopPZi5K_1HuJA0RbSIt6jeahlHnhWFNY,20854
32
32
  pygpt_net/controller/chat/command.py,sha256=_lXHki5pbTi8Pvz_BzP3VxGUM_0Ztr1mE5rsatPmSoE,2833
33
33
  pygpt_net/controller/chat/common.py,sha256=uLRRT1ZNGLJiiyJ42lJ7rjDwhqPEfX1RD-EnoFhBmmU,13875
34
34
  pygpt_net/controller/chat/files.py,sha256=Q53Sr7-uJwI_L1FKa1raApFvZ4AI0Eoj766iY9a6Iik,2705
@@ -121,7 +121,7 @@ pygpt_net/core/assistants/__init__.py,sha256=nnKKqcP5Xtx9daGUHAX8FT2JwG3r5syc6mS
121
121
  pygpt_net/core/assistants/files.py,sha256=cg32PsmdM3rB6eNkKo8CP9aSKNqoml1YKniGl9rXSlM,9796
122
122
  pygpt_net/core/assistants/store.py,sha256=vzMN2dOKIcH7NCGA6UzZkXGal1jAioOzNTpAHzObgOo,7990
123
123
  pygpt_net/core/attachments/__init__.py,sha256=pI3waoQhoSzGCK4brpGvKwve8-dvY26VAXka0NTtkKM,12151
124
- pygpt_net/core/attachments/context.py,sha256=bvcFwtMB9kNkoxDGkKZJNJeMDQtPN__pTZ_Vkqkar9g,18296
124
+ pygpt_net/core/attachments/context.py,sha256=zPZZGrlu1Uo3d6BjBlaIjpDSJvGjMM1p9DBFX2UF-54,19609
125
125
  pygpt_net/core/attachments/worker.py,sha256=_aUCyi5-Mbz0IGfgY6QKBZ6MFz8aKRDfKasbBVXg7kU,1341
126
126
  pygpt_net/core/audio.py,sha256=VMsnEN0ZMg5CaRSbWdkkKE51NG19-vIvnBnMX_Y6dvA,2708
127
127
  pygpt_net/core/bridge/__init__.py,sha256=4XRmueSSshAqstjgDp3jFTSCwSTaWlzaU4d-gBK46x8,9292
@@ -146,7 +146,7 @@ pygpt_net/core/debug/agent.py,sha256=BylgNCl8n8aV2GCK5cQZVwobm1kjH_ETtgEiObilvgQ
146
146
  pygpt_net/core/debug/assistants.py,sha256=fUYVdMsdtfWd3njirvw2lvBv7CgPHdz_9ZSDVr2VsEo,2672
147
147
  pygpt_net/core/debug/attachments.py,sha256=shiRf3AwR4_lAttryNN7akSyu9_0nRuCFxBLLTblDz4,1638
148
148
  pygpt_net/core/debug/config.py,sha256=MSxRLVIWZ0VHrB4p66fyM-nfQLMi2D6enDzJLDQEb40,2305
149
- pygpt_net/core/debug/context.py,sha256=0ohXxQOaAF-M5DlSq4XeASrHkdJNE92gx1fFPMcfzP0,5403
149
+ pygpt_net/core/debug/context.py,sha256=ePQ1UedYr3K9UIESqXOE2PHkSZ2NCB52aB7xgmzfGCY,5750
150
150
  pygpt_net/core/debug/db.py,sha256=TQtNpCjrcFw943nae3OIyq0af_okjr-aTfFKS_QhQQk,776
151
151
  pygpt_net/core/debug/events.py,sha256=VbyyrzLcC0GhvdB8GyCl7YBzQyTKvRK-UPdpgwyh70c,1992
152
152
  pygpt_net/core/debug/indexes.py,sha256=M8Uf6NT1LswyXOdpZ_QzkBbhvv08U1rhMb6PV7OaNtE,5416
@@ -177,7 +177,7 @@ pygpt_net/core/history.py,sha256=LnSyB3nuXZxXeaiNdjg4Q4yWhJM5hA2QN5dy_AY9Pxo,309
177
177
  pygpt_net/core/idx/__init__.py,sha256=7LlN_CmhOJVLuZFp-XihNtoQJXFxlA2ygYAcaIAfU8c,17238
178
178
  pygpt_net/core/idx/chat.py,sha256=rqi0eGHSnoVMNhjWabIHOj9nW3l-VZTDp9j-r-Fre_E,19972
179
179
  pygpt_net/core/idx/context.py,sha256=oC9Do2_YdOZ2yJSh8C1_FbxUdkB6bT20JyhjShDJUkk,3049
180
- pygpt_net/core/idx/indexing.py,sha256=gT5RssxZjREm-7UriTJ2334d-4_1PRnLdFopMXcPy8I,40974
180
+ pygpt_net/core/idx/indexing.py,sha256=korUe-G_cV9Vf2PrMh7LJfHEntHCmcUnw9GQ5TjBhMw,41011
181
181
  pygpt_net/core/idx/llm.py,sha256=gys1i0qRpdbsUfgkTq4bHw0w89Yz2-s5CQueO5vDUCo,5027
182
182
  pygpt_net/core/idx/metadata.py,sha256=tLVbaq6xUPuzqL7CV6OYCQ-_S4uJczMCWzY4iIsD8cI,5304
183
183
  pygpt_net/core/idx/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -206,19 +206,19 @@ pygpt_net/core/render/markdown/__init__.py,sha256=19xPDIYeoDn3Sf1tpcvXtxLaaKkjs0
206
206
  pygpt_net/core/render/markdown/body.py,sha256=CUO246hZHkE9_h8ml_oIKtybgyaYYMwI5Z1L01Z-_1c,6918
207
207
  pygpt_net/core/render/markdown/helpers.py,sha256=a7LSL_jKVfxDU5erqU8tc5shfmhE-afIcb_GUH4Io6Y,2683
208
208
  pygpt_net/core/render/markdown/parser.py,sha256=4lCC_pCWmi-SUli4nnDH-FZEbBi0SnVl0FoL0ZBuNHo,5450
209
- pygpt_net/core/render/markdown/pid.py,sha256=mml1f1p8kq1q45QMTvfxt6xuRW6rTeNgRBRTArohCsg,818
209
+ pygpt_net/core/render/markdown/pid.py,sha256=bRAOdL8bS-LSfOKReWK3nu-BUZ2qfNchrAsrkxRKlHU,851
210
210
  pygpt_net/core/render/markdown/renderer.py,sha256=ybUpnBmEppYHtNw4Qz15gkenKdntVev55NAxEBZ8-j4,18114
211
211
  pygpt_net/core/render/plain/__init__.py,sha256=19xPDIYeoDn3Sf1tpcvXtxLaaKkjs0nDQ7-4GqTfeRk,489
212
212
  pygpt_net/core/render/plain/body.py,sha256=-u0Lo1U2ID6NTFysKe6L8vE7k3jCvIiI78cqSlyPYns,3957
213
213
  pygpt_net/core/render/plain/helpers.py,sha256=qf1w6EXa6cCFcMkipOA8MzxIRFIYNVv3uXZ3MT2XwfI,1628
214
- pygpt_net/core/render/plain/pid.py,sha256=c0XLURsHEFwtXHFY6M8P4wR8CTHFPBuQR4Wn7FfPz7g,737
214
+ pygpt_net/core/render/plain/pid.py,sha256=yngcS0o1lBQ2RlRzWrs5JwqT_ThamvnWftp3cXcyiG8,770
215
215
  pygpt_net/core/render/plain/renderer.py,sha256=W5qZinG-5W_Ady-DNEkYSyTQXXdpfGzvoUYYV-VEM30,14393
216
216
  pygpt_net/core/render/web/__init__.py,sha256=istp5dsn6EkLEP7lOBeDb8RjodUcWZqjcEvTroaTT-w,489
217
- pygpt_net/core/render/web/body.py,sha256=IXZ5Qh5VL2-iNfEaUFe0NJyvZWkaOIThwoTx57VBM1c,27677
217
+ pygpt_net/core/render/web/body.py,sha256=sIJe7MPPvmKpQ9vgJno9wBUp_Qj4O2Oz_7PxE9JGUz8,28661
218
218
  pygpt_net/core/render/web/helpers.py,sha256=CcKB710SiKe3xGAB4jq_1XtLxQdD-XiVIlwqiqX7pdc,3062
219
219
  pygpt_net/core/render/web/parser.py,sha256=upaTzDhKyGUVEU91JfeSt-luKfx9sS1uCddi_NjStt0,9998
220
- pygpt_net/core/render/web/pid.py,sha256=7rP3BgUObY4UfD4Jl4Q9M73lhiWNJ6iQEv0AJxXdEvA,1298
221
- pygpt_net/core/render/web/renderer.py,sha256=Caxto0BWzWa1yIJJB6ESRkDQdaUSrRcuLSkE6yEnIwU,34348
220
+ pygpt_net/core/render/web/pid.py,sha256=ZyYmzB01adMqY9-1Zi0QhGgrzyg-E9xC_VxqjNvTHWk,1331
221
+ pygpt_net/core/render/web/renderer.py,sha256=MJfvCzT1gXn2geaOwH3eLbpQKbywuokatHkiQwHcOpg,34620
222
222
  pygpt_net/core/render/web/syntax_highlight.py,sha256=QSLGF5cJL_Xeqej7_TYwY_5C2w9enXV_cMEuaJ3C43U,2005
223
223
  pygpt_net/core/settings.py,sha256=-dy14W0zUnYikGz-ymJxmzOhtNxkvlyJ7WhOSPdfPdE,7635
224
224
  pygpt_net/core/tabs/__init__.py,sha256=FkAOE28Z4nDi9je5mDu0aMMKJCnnwcJTeEAXe3HhTPg,19298
@@ -240,9 +240,9 @@ pygpt_net/css_rc.py,sha256=i13kX7irhbYCWZ5yJbcMmnkFp_UfS4PYnvRFSPF7XXo,11349
240
240
  pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
241
241
  pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
242
242
  pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
243
- pygpt_net/data/config/config.json,sha256=OpRjI4I2q-r3VwsaEzw0RPKGhstp63SkEHbybvbTHGo,19177
244
- pygpt_net/data/config/models.json,sha256=8PkUzPS_WN_eijEmGoDEX_E_eHy7vaeF87UnkFts8WA,43336
245
- pygpt_net/data/config/modes.json,sha256=esS8i1zEaDPE8reTRA23wpeCKwhVThu4lT4n4fDpHTc,1775
243
+ pygpt_net/data/config/config.json,sha256=VR0hSB1LqLAxT9_lsSVUdF4r396zg3oL-YGqNEwIqnU,19177
244
+ pygpt_net/data/config/models.json,sha256=_TumQP0l3v3Z3J_w_eg2IYN8Ohbc9UBa0KO_UD12gh8,43336
245
+ pygpt_net/data/config/modes.json,sha256=CqdNpGP5TDgFLqmj4usQCoIfECfVYJ-iKRGrlb2Ua14,1775
246
246
  pygpt_net/data/config/presets/agent_openai.json,sha256=vMTR-soRBiEZrpJJHuFLWyx8a3Ez_BqtqjyXgxCAM_Q,733
247
247
  pygpt_net/data/config/presets/agent_openai_assistant.json,sha256=awJw9lNTGpKML6SJUShVn7lv8AXh0oic7wBeyoN7AYs,798
248
248
  pygpt_net/data/config/presets/agent_planner.json,sha256=a6Rv58Bnm2STNWB0Rw_dGhnsz6Lb3J8_GwsUVZaTIXc,742
@@ -270,9 +270,9 @@ pygpt_net/data/css/markdown.light.css,sha256=UZdv0jtuFgJ_4bYWsDaDQ4X4AP9tVNLUHBA
270
270
  pygpt_net/data/css/style.css,sha256=JgE5Y6ULYtNDVF49jhb_PfGPJVxCFj5DNMiobPopX64,400
271
271
  pygpt_net/data/css/style.dark.css,sha256=5GqBiCiTdofU3AfgbuQEezFPE3iSf_mx3dkU4kAtygQ,729
272
272
  pygpt_net/data/css/style.light.css,sha256=U6sZvBBk4Gdnh9KPiGfQmTGsx_BJlzxpFvQXVXHag_Y,1726
273
- pygpt_net/data/css/web.css,sha256=P_QGZBI5nMGXwJc2aRNsbzjtJ2s-3_wAFkUcjOwxmcA,4298
274
- pygpt_net/data/css/web.dark.css,sha256=GxEA7YaxApmeJJdL3PghvjGlWBCrPn0tyxoeCnzEbIg,1260
275
- pygpt_net/data/css/web.light.css,sha256=sH6pgwDoA-co8P52SybcCi_sb-2hjBzSxyB1d0qlmQs,1235
273
+ pygpt_net/data/css/web.css,sha256=vqfmbHGCMetgPbqLsICMgV5lj0f1Sy_qw_IHPXGnsLA,5805
274
+ pygpt_net/data/css/web.dark.css,sha256=x0b3DYWv0-XeUgCSKajIpkAXAEEg-YR7GIg94pwXO7A,1319
275
+ pygpt_net/data/css/web.light.css,sha256=9yN6feInDe8X6rWgJfz61mwvbwyJ_u99nUWz0KurWo4,1249
276
276
  pygpt_net/data/fonts/Lato/Lato-Black.ttf,sha256=iUTaWoYezgAYX6Fz6mUyTn1Hl6qGPG-g8D4GaAWXS2w,69484
277
277
  pygpt_net/data/fonts/Lato/Lato-BlackItalic.ttf,sha256=G7asNGubFS-gk9VAMO_NBz4o5R7AB8-3bCAflv103mc,71948
278
278
  pygpt_net/data/fonts/Lato/Lato-Bold.ttf,sha256=e3IFmfiu07rFuVMf7PZ1DI-n5ZO3J3ObwGkvzA9Vtng,73316
@@ -1470,14 +1470,14 @@ pygpt_net/data/js/katex/fonts/KaTeX_Typewriter-Regular.woff,sha256=4U_tArGrp86fW
1470
1470
  pygpt_net/data/js/katex/fonts/KaTeX_Typewriter-Regular.woff2,sha256=cdUX1ngneHz6vfGGkUzDNY7aU543kxlB8rL9SiH2jAs,13568
1471
1471
  pygpt_net/data/js/katex/katex.min.css,sha256=lVaKnUaQNG4pI71WHffQZVALLQF4LMZEk4nOia8U9ow,23532
1472
1472
  pygpt_net/data/js/katex/katex.min.js,sha256=KLASOtKS2x8pUxWVzCDmlWJ4jhuLb0vtrgakbD6gDDo,276757
1473
- pygpt_net/data/locale/locale.de.ini,sha256=51IwLi4RgfLUNe7H9yYsDaYwYgDgjZqb7dWYmynk4Uc,61336
1474
- pygpt_net/data/locale/locale.en.ini,sha256=VkIOPVQg3nF0RIhV8Is-I--MNdO_nTLuFcF2s1eEtvs,73427
1475
- pygpt_net/data/locale/locale.es.ini,sha256=ysv2Uoj-pW6asQmJeMqLdUJnvfZW8OS2bUL8hjSJsU4,61470
1476
- pygpt_net/data/locale/locale.fr.ini,sha256=yKSny3sFZmKVe1zGU1soxG01N5xGXoJnOmUPNaZ9_4E,63457
1477
- pygpt_net/data/locale/locale.it.ini,sha256=BsmjD2lSCdckFUT8VEZmg921WXirYea4dQZUd2NP4yg,60352
1478
- pygpt_net/data/locale/locale.pl.ini,sha256=_i2qhm6-4u7AHePmPHeo542pkSp-ARGfdN0csoPeidw,60422
1479
- pygpt_net/data/locale/locale.uk.ini,sha256=KXLeidoQJfClJzPQ4tau4q1yv7JYuSPrrQ5jNfXFP40,84311
1480
- pygpt_net/data/locale/locale.zh.ini,sha256=dLZeFoNBNeSDkperYa_f4RdiUF6JWDTXRdwnKW2tb-A,62392
1473
+ pygpt_net/data/locale/locale.de.ini,sha256=dhzEhTFRhzhWD2r181U5Jac4G9w6ZjxPAe825h6Ore8,61324
1474
+ pygpt_net/data/locale/locale.en.ini,sha256=y9zakR_3VkbfSTCcShh-8YcV1QI9QJhDyM3CvLrGynE,73418
1475
+ pygpt_net/data/locale/locale.es.ini,sha256=4r5_Uo9pTSzLwvAAiBxTqpQ-UKSQN390PpieeeUhlpE,61459
1476
+ pygpt_net/data/locale/locale.fr.ini,sha256=CQJrueNJbIS8YL9wWUVPqTs2ymYvki5CcsPt1QA-t1M,63448
1477
+ pygpt_net/data/locale/locale.it.ini,sha256=sSjrjuWebc2n9xH0gOSu34kdw4hnSi4owvG6S-mKBd8,60341
1478
+ pygpt_net/data/locale/locale.pl.ini,sha256=72aY2ets8tZE1z1WiYoc5oOfzMNa2I9LmpJAJZ6rYQ0,60414
1479
+ pygpt_net/data/locale/locale.uk.ini,sha256=9xvPsvywtqASqIwLQ-RguuHY3NqEMpX--h_n8rLDPic,84288
1480
+ pygpt_net/data/locale/locale.zh.ini,sha256=IoFcOyr5DKuhd-JIj_IUzx0p5TZ4XeHwYIHdqYE58Xo,62383
1481
1481
  pygpt_net/data/locale/plugin.agent.de.ini,sha256=BY28KpfFvgfVYJzcw2o5ScWnR4uuErIYGyc3NVHlmTw,1714
1482
1482
  pygpt_net/data/locale/plugin.agent.en.ini,sha256=88LkZUpilbV9l4QDbMyIdq_K9sbWt-CQPpavEttPjJU,1489
1483
1483
  pygpt_net/data/locale/plugin.agent.es.ini,sha256=bqaJQne8HPKFVtZ8Ukzo1TSqVW41yhYbGUqW3j2x1p8,1680
@@ -1702,7 +1702,7 @@ pygpt_net/plugin/cmd_code_interpreter/ipython/__init__.py,sha256=rPQNs2VsRwqR-_w
1702
1702
  pygpt_net/plugin/cmd_code_interpreter/ipython/docker_kernel.py,sha256=HtN4_XiTBi60vy2I9VuFg2-Lxi9bmXmDHRGruOtUJtE,17165
1703
1703
  pygpt_net/plugin/cmd_code_interpreter/ipython/local_kernel.py,sha256=iKDSViKSzEqCQAckQ013nqRgHccNahI6m-dsHp58YW8,6685
1704
1704
  pygpt_net/plugin/cmd_code_interpreter/output.py,sha256=6MEQ_Xkpgn8banI3Pm3vnlMjKeZJmN4btOz_m0U6KOE,1989
1705
- pygpt_net/plugin/cmd_code_interpreter/runner.py,sha256=GmEhzs-5QfUCMeJ439CGhhepitgiYfulPgw2p9N70Kk,19861
1705
+ pygpt_net/plugin/cmd_code_interpreter/runner.py,sha256=COb50Ldo_h5xgzhYAFK_7I30q6-DnFZ2Izhzl4uw8L8,19919
1706
1706
  pygpt_net/plugin/cmd_code_interpreter/worker.py,sha256=U5ahn_LV7xGm_S05AfQlLM_deHEo9smQRzYAjenexvI,11397
1707
1707
  pygpt_net/plugin/cmd_custom/__init__.py,sha256=L8hD1WkbRBdNsbR4iHbgSXHWszF6DxNRbgEIEi2Q_og,3911
1708
1708
  pygpt_net/plugin/cmd_custom/config.py,sha256=PuD18kxtfBr2iag4WYnpqmO29ZMThktVT859KRmBnNA,2026
@@ -1714,7 +1714,7 @@ pygpt_net/plugin/cmd_files/worker.py,sha256=kcbt6EaBHDpcnGdbMQQkmySw9DQKnob3KI0a
1714
1714
  pygpt_net/plugin/cmd_history/__init__.py,sha256=uR7Wyly2StrLaazvkFSiPYxLb5EN4ua5mBlMhQHY4HM,11023
1715
1715
  pygpt_net/plugin/cmd_history/config.py,sha256=thG8H4K_k-piPm7lomUmga2bJT3W8wpdaR0iYbAoTUo,9661
1716
1716
  pygpt_net/plugin/cmd_history/worker.py,sha256=-jGdiR94QHKOMISWIPtNLmCLFDG5UzibItvkbQx9KZo,6119
1717
- pygpt_net/plugin/cmd_mouse_control/__init__.py,sha256=Q8vrPZADVER5PaC4ykfkFW-V4oDHM5FRSuxzyc7v3bs,4965
1717
+ pygpt_net/plugin/cmd_mouse_control/__init__.py,sha256=cuFduYE50y9MmR5c0T3cMcI5yZsiKoQRDZ3KXSPo3VA,5050
1718
1718
  pygpt_net/plugin/cmd_mouse_control/config.py,sha256=rcxyuOLWsLVBuPUtAT-PxcfcWXh6jitGeTY3z3GLLpU,12051
1719
1719
  pygpt_net/plugin/cmd_mouse_control/worker.py,sha256=zfueHWtfYeiIz8zFfv6dqcehIPqzFaTFoNIcCkUH7y8,10986
1720
1720
  pygpt_net/plugin/cmd_serial/__init__.py,sha256=elm0dnP0h9JYjCdhHbHN9Bj_Zoz3MefSgcicikHHSps,2936
@@ -1863,7 +1863,7 @@ pygpt_net/provider/llms/local.py,sha256=72BsTTT-v41s5qnmDKxSPBlgmTbc1MJBu6JGsoFU
1863
1863
  pygpt_net/provider/llms/ollama.py,sha256=Y7C7aCmbPLmCWrBoI4jca-GkIY04JWhYQJrn4hojgEg,3374
1864
1864
  pygpt_net/provider/llms/openai.py,sha256=EIH2ko-YEk02E5kuqBjxYskBCjr2O67YWsKyxh3l3Mk,3415
1865
1865
  pygpt_net/provider/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1866
- pygpt_net/provider/loaders/base.py,sha256=ZzLJgn1mmZiDK7BCwJWZyN2bZUJ9J6ncwGWvbvHls8Y,2515
1866
+ pygpt_net/provider/loaders/base.py,sha256=97qdnZVP6biXEkpzXXOEh67R2RtwkphHQRVMAEafDZs,2749
1867
1867
  pygpt_net/provider/loaders/file_csv.py,sha256=sV2JrQ4EqdWc2-8dMjjBvT8x56ux07eB5jyO61EX3pQ,1258
1868
1868
  pygpt_net/provider/loaders/file_docx.py,sha256=jWdF54bCWjOQgxezLtE2o25LNPIv9OgcnqcLoJDT4RA,1032
1869
1869
  pygpt_net/provider/loaders/file_epub.py,sha256=sIB3ORYNdyFUrQrbiSLKuQ9OE2yuAP0628chvdfK8oA,1022
@@ -1923,7 +1923,7 @@ pygpt_net/provider/loaders/web_page.py,sha256=GVgy0QKS-1QZtX_Mg4ds587xNyaAJYoBsO
1923
1923
  pygpt_net/provider/loaders/web_rss.py,sha256=q7hltE4VfBdVvEJ1-kSW7gbdROMQ1tOUg7l_H1NVi7o,1584
1924
1924
  pygpt_net/provider/loaders/web_sitemap.py,sha256=Oy4Llw08_ZpBl1d9q-wXcSIXdGKFj4D_-KAk3qxF74Y,1853
1925
1925
  pygpt_net/provider/loaders/web_twitter.py,sha256=HYZdIjtHbfhXNdMXJyzh-3hyFyZ6xya9T4O3ALGWDcE,2831
1926
- pygpt_net/provider/loaders/web_yt.py,sha256=HWaSPk4xU4nrh3MjGkIIeWSHzg9ZepM3W8qX56FQwNU,1617
1926
+ pygpt_net/provider/loaders/web_yt.py,sha256=V1OUjWFDov-ITtcqWiFfKaStTIolgkEvnbAxrx_7WQw,2129
1927
1927
  pygpt_net/provider/vector_stores/__init__.py,sha256=5KTWc6GdGFa24zhOTI1uTK1v3fu19HRQs-vK5vxh4cs,7768
1928
1928
  pygpt_net/provider/vector_stores/base.py,sha256=C-XlPmdt0wyXJIyGx978Y92cwkLFeK0xR_F0_buIkFg,3980
1929
1929
  pygpt_net/provider/vector_stores/chroma.py,sha256=4n6RtGSPt2rs2DX6uCa7lTftS7pA4rxdyr-MUjKSsZ8,3053
@@ -2147,8 +2147,8 @@ pygpt_net/ui/widget/textarea/web.py,sha256=KIW8MnwDWjEAMdiLA2v1yZiFbf-PT4KkF55uh
2147
2147
  pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2148
2148
  pygpt_net/ui/widget/vision/camera.py,sha256=T8b5cmK6uhf_WSSxzPt_Qod8JgMnst6q8sQqRvgQiSA,2584
2149
2149
  pygpt_net/utils.py,sha256=YhMvgy0wNt3roHIbbAnS-5SXOxOOIIvRRGd6FPTa6d0,6153
2150
- pygpt_net-2.4.32.dist-info/LICENSE,sha256=GLKQTnJOPK4dDIWfkAIM4GwOxKJXi5zcMGt7FjLR1xk,1126
2151
- pygpt_net-2.4.32.dist-info/METADATA,sha256=M30D9ZdNJkVxuFQGAvhSR-U6Qbp6qSyGDUvF_5CYwaQ,161764
2152
- pygpt_net-2.4.32.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
2153
- pygpt_net-2.4.32.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2154
- pygpt_net-2.4.32.dist-info/RECORD,,
2150
+ pygpt_net-2.4.33.dist-info/LICENSE,sha256=GLKQTnJOPK4dDIWfkAIM4GwOxKJXi5zcMGt7FjLR1xk,1126
2151
+ pygpt_net-2.4.33.dist-info/METADATA,sha256=rmBEIAZJl1UoRxK-cRONimDXN76RzRoCSniyyF_IQQ8,161908
2152
+ pygpt_net-2.4.33.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
2153
+ pygpt_net-2.4.33.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2154
+ pygpt_net-2.4.33.dist-info/RECORD,,