pygpt-net 2.4.44__py3-none-any.whl → 2.4.45__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.
CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 2.4.45 (2024-12-16)
4
+
5
+ - Enhanced web data loaders UI.
6
+
3
7
  ## 2.4.44 (2024-12-16)
4
8
 
5
9
  - Enhanced web data loaders.
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.44** | build: **2024.12.16** | Python: **>=3.10, <3.12**
5
+ Release: **2.4.45** | build: **2024.12.16** | Python: **>=3.10, <3.12**
6
6
 
7
7
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
8
8
  >
@@ -3938,6 +3938,10 @@ may consume additional tokens that are not displayed in the main window.
3938
3938
 
3939
3939
  ## Recent changes:
3940
3940
 
3941
+ **2.4.45 (2024-12-16)**
3942
+
3943
+ - Enhanced web data loaders UI.
3944
+
3941
3945
  **2.4.44 (2024-12-16)**
3942
3946
 
3943
3947
  - Enhanced web data loaders.
pygpt_net/CHANGELOG.txt CHANGED
@@ -1,3 +1,7 @@
1
+ 2.4.45 (2024-12-16)
2
+
3
+ - Enhanced web data loaders UI.
4
+
1
5
  2.4.44 (2024-12-16)
2
6
 
3
7
  - Enhanced web data loaders.
pygpt_net/__init__.py CHANGED
@@ -13,7 +13,7 @@ __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.44"
16
+ __version__ = "2.4.45"
17
17
  __build__ = "2024.12.16"
18
18
  __maintainer__ = "Marcin Szczygliński"
19
19
  __github__ = "https://github.com/szczyglis-dev/py-gpt"
@@ -34,42 +34,66 @@ class Mapping:
34
34
  # nodes labels
35
35
  for k in self.mapping['nodes']:
36
36
  if k in self.window.ui.nodes:
37
- self.window.ui.nodes[k].setText(trans(self.mapping['nodes'][k]))
37
+ try:
38
+ self.window.ui.nodes[k].setText(trans(self.mapping['nodes'][k]))
39
+ except:
40
+ pass
38
41
 
39
42
  # menu title
40
43
  for k in self.mapping['menu.title']:
41
44
  if k in self.window.ui.menu:
42
- self.window.ui.menu[k].setTitle(trans(self.mapping['menu.title'][k]))
45
+ try:
46
+ self.window.ui.menu[k].setTitle(trans(self.mapping['menu.title'][k]))
47
+ except:
48
+ pass
43
49
 
44
50
  # menu text
45
51
  for k in self.mapping['menu.text']:
46
52
  if k in self.window.ui.menu:
47
- self.window.ui.menu[k].setText(trans(self.mapping['menu.text'][k]))
53
+ try:
54
+ self.window.ui.menu[k].setText(trans(self.mapping['menu.text'][k]))
55
+ except:
56
+ pass
48
57
 
49
58
  # menu tooltip
50
59
  for k in self.mapping['menu.tooltip']:
51
60
  if k in self.window.ui.menu:
52
- self.window.ui.menu[k].setToolTip(trans(self.mapping['menu.tooltip'][k]))
61
+ try:
62
+ self.window.ui.menu[k].setToolTip(trans(self.mapping['menu.tooltip'][k]))
63
+ except:
64
+ pass
53
65
 
54
66
  # dialog title
55
67
  for k in self.mapping['dialog.title']:
56
68
  if k in self.window.ui.dialog:
57
- self.window.ui.dialog[k].setWindowTitle(trans(self.mapping['dialog.title'][k]))
69
+ try:
70
+ self.window.ui.dialog[k].setWindowTitle(trans(self.mapping['dialog.title'][k]))
71
+ except:
72
+ pass
58
73
 
59
74
  # tooltip
60
75
  for k in self.mapping['tooltip']:
61
76
  if k in self.window.ui.nodes:
62
- self.window.ui.nodes[k].setToolTip(trans(self.mapping['tooltip'][k]))
77
+ try:
78
+ self.window.ui.nodes[k].setToolTip(trans(self.mapping['tooltip'][k]))
79
+ except:
80
+ pass
63
81
 
64
82
  # placeholder
65
83
  for k in self.mapping['placeholder']:
66
84
  if k in self.window.ui.nodes:
67
- self.window.ui.nodes[k].setPlaceholderText(trans(self.mapping['placeholder'][k]))
85
+ try:
86
+ self.window.ui.nodes[k].setPlaceholderText(trans(self.mapping['placeholder'][k]))
87
+ except:
88
+ pass
68
89
 
69
90
  # menu tab tools
70
91
  for k in self.window.controller.tools.get_tab_tools():
71
92
  if k in self.window.ui.menu:
72
- self.window.ui.menu[k].setText(trans("output.tab." + self.window.controller.tools.get_tab_tools()[k][0]))
93
+ try:
94
+ self.window.ui.menu[k].setText(trans("output.tab." + self.window.controller.tools.get_tab_tools()[k][0]))
95
+ except:
96
+ pass
73
97
 
74
98
  def get_mapping(self) -> Dict[str, Dict[str, str]]:
75
99
  """
@@ -313,7 +337,6 @@ class Mapping:
313
337
  nodes['tool.indexer.file.options.replace'] = 'tool.indexer.option.replace'
314
338
  nodes['tool.indexer.web.loader.label'] = 'tool.indexer.tab.web.loader'
315
339
  nodes['tool.indexer.web.options.label'] = 'tool.indexer.tab.web.source'
316
- nodes['tool.indexer.web.config.label'] = 'tool.indexer.tab.web.cfg'
317
340
  nodes['tool.indexer.web.options.replace'] = 'tool.indexer.option.replace'
318
341
  nodes['tool.indexer.file.header.tip'] = 'tool.indexer.tab.files.tip'
319
342
  nodes['tool.indexer.web.header.tip'] = 'tool.indexer.tab.web.tip'
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.44",
4
- "app.version": "2.4.44",
3
+ "version": "2.4.45",
4
+ "app.version": "2.4.45",
5
5
  "updated_at": "2024-12-16T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.44",
4
- "app.version": "2.4.44",
3
+ "version": "2.4.45",
4
+ "app.version": "2.4.45",
5
5
  "updated_at": "2024-12-16T00:00:00"
6
6
  },
7
7
  "items": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.44",
4
- "app.version": "2.4.44",
3
+ "version": "2.4.45",
4
+ "app.version": "2.4.45",
5
5
  "updated_at": "2024-12-16T00:00:00"
6
6
  },
7
7
  "items": {
@@ -17,6 +17,7 @@ QLineEdit {{
17
17
  QTextEdit {{
18
18
  color: #ffffff;
19
19
  border: 1px solid #5c5c5c;
20
+ padding: 10px !important;
20
21
  }}
21
22
 
22
23
  QTableView::item,
@@ -100,7 +100,7 @@ assistant.tool.retrieval = Werkzeug: Abruf
100
100
  assistant.vector_store = Vektor Speicher
101
101
  attachments.auto_index = Automatische Indizierung beim Hochladen
102
102
  attachments.btn.add = Datei hinzufügen
103
- attachments.btn.add_url = URL
103
+ attachments.btn.add_url = Web
104
104
  attachments.btn.clear = Dateien löschen
105
105
  attachments.capture_clear = Beim Erfassen löschen
106
106
  attachments.clear.confirm = Liste löschen?
@@ -346,7 +346,7 @@ dialog.start.title = API-KEY ist noch nicht konfiguriert
346
346
  dialog.start.title.text = Ihr API-Schlüssel ist noch nicht konfiguriert...\nSie erhalten einen API-Schlüssel, indem Sie ein Konto auf der OpenAI-Website registrieren:
347
347
  dialog.url.dismiss = Abbrechen
348
348
  dialog.url.tip = Geben Sie die URL der Webseite an, die Sie als zusätzlichen Kontext anfügen möchten, z.B. https://de.wikipedia.org/wiki/Elon_Musk, oder ein YouTube-Video zur Transkription, z.B. https://www.youtube.com/watch?v=CRRlbK5w8AE.
349
- dialog.url.title = Web
349
+ dialog.url.title = Fügen Sie Web- oder externe Inhalte als zusätzlichen Kontext hinzu.
350
350
  dialog.url.update = Hinzufügen
351
351
  dialog.workdir.change.confirm = Sind Sie sicher, dass Sie das Arbeitsverzeichnis zu folgendem ändern/verschieben möchten:\n{path}?
352
352
  dialog.workdir.change.empty.alert = Verzeichnis ist nicht leer! Vorgang wird abgebrochen.
@@ -378,7 +378,7 @@ dialog.start.title = Api Key is not configured yet
378
378
  dialog.start.title.text = Your API key is not configured yet...\nYou will obtain an API key by registering an account on the OpenAI website:
379
379
  dialog.url.dismiss = Cancel
380
380
  dialog.url.tip = Provide the URL of the web page you want to attach as additional context, e.g., https://pl.wikipedia.org/wiki/Elon_Musk, or a YouTube video to transcribe, e.g., https://www.youtube.com/watch?v=CRRlbK5w8AE.
381
- dialog.url.title = Web
381
+ dialog.url.title = Add web or external content to provide additional context.
382
382
  dialog.url.update = Add
383
383
  dialog.workdir.change.confirm = Are you sure you want to change/move workdir to:\n{path}?
384
384
  dialog.workdir.change.empty.alert = Directory is not empty! Aborting.
@@ -100,7 +100,7 @@ assistant.tool.retrieval = Herramienta: recuperación
100
100
  assistant.vector_store = Almacén de vectores
101
101
  attachments.auto_index = Indexación automática al subir
102
102
  attachments.btn.add = Añadir archivo
103
- attachments.btn.add_url = URL
103
+ attachments.btn.add_url = Web
104
104
  attachments.btn.clear = Limpiar archivos
105
105
  attachments.capture_clear = Limpiar al capturar
106
106
  attachments.clear.confirm = ¿Limpiar la lista?
@@ -346,7 +346,7 @@ dialog.start.title = La API KEY aún no está configurada
346
346
  dialog.start.title.text = Su clave de API aún no está configurada...\nObtendrá una clave de API registrando una cuenta en el sitio web de OpenAI:
347
347
  dialog.url.dismiss = Cancelar
348
348
  dialog.url.tip = Proporcione la URL de la página web que desea adjuntar como contexto adicional, por ejemplo, https://es.wikipedia.org/wiki/Elon_Musk, o un video de YouTube para transcribir, por ejemplo, https://www.youtube.com/watch?v=CRRlbK5w8AE.
349
- dialog.url.title = Web
349
+ dialog.url.title = Añadir contenido web o externo como contexto adicional.
350
350
  dialog.url.update = Agregar
351
351
  dialog.workdir.change.confirm = ¿Está seguro de querer cambiar/mover el directorio de trabajo a:\n{path}?
352
352
  dialog.workdir.change.empty.alert = ¡El directorio no está vacío! Cancelando la operación.
@@ -100,7 +100,7 @@ assistant.tool.retrieval = Outil : récupération
100
100
  assistant.vector_store = Base vectorielle
101
101
  attachments.auto_index = Indexation automatique lors du téléchargement
102
102
  attachments.btn.add = Ajouter un fichier
103
- attachments.btn.add_url = URL
103
+ attachments.btn.add_url = Web
104
104
  attachments.btn.clear = Effacer les fichiers
105
105
  attachments.capture_clear = Effacer à la capture
106
106
  attachments.clear.confirm = Effacer la liste ?
@@ -346,7 +346,7 @@ dialog.start.title = La CLÉ API n’est pas encore configurée
346
346
  dialog.start.title.text = Votre clé API n'est pas encore configurée...\nVous obtiendrez une clé API en vous inscrivant sur le site web d'OpenAI :
347
347
  dialog.url.dismiss = Annuler
348
348
  dialog.url.tip = Fournissez l'URL de la page Web que vous souhaitez joindre comme contexte supplémentaire, par exemple, https://fr.wikipedia.org/wiki/Elon_Musk, ou une vidéo YouTube à transcrire, par exemple, https://www.youtube.com/watch?v=CRRlbK5w8AE.
349
- dialog.url.title = Web
349
+ dialog.url.title = Ajoutez du contenu web ou externe comme contexte supplémentaire.
350
350
  dialog.url.update = Ajouter
351
351
  dialog.workdir.change.confirm = Êtes-vous sûr de vouloir changer/déplacer le répertoire de travail vers :\n{path}?
352
352
  dialog.workdir.change.empty.alert = Le répertoire n'est pas vide ! Opération annulée.
@@ -100,7 +100,7 @@ assistant.tool.retrieval = Strumento: recupero
100
100
  assistant.vector_store = Archivio vettoriale
101
101
  attachments.auto_index = Indicizzazione automatica al caricamento
102
102
  attachments.btn.add = Aggiungi file
103
- attachments.btn.add_url = URL
103
+ attachments.btn.add_url = Web
104
104
  attachments.btn.clear = Pulisci file
105
105
  attachments.capture_clear = Pulisci alla cattura
106
106
  attachments.clear.confirm = Pulire l'elenco?
@@ -346,7 +346,7 @@ dialog.start.title = API KEY non ancora configurata
346
346
  dialog.start.title.text = La tua API key non è ancora configurata...\nOtterrai una API key registrando un account sul sito web di OpenAI:
347
347
  dialog.url.dismiss = Annulla
348
348
  dialog.url.tip = Fornisci l'URL della pagina web che desideri allegare come contesto aggiuntivo, ad esempio, https://it.wikipedia.org/wiki/Elon_Musk, o un video YouTube da trascrivere, ad esempio, https://www.youtube.com/watch?v=CRRlbK5w8AE.
349
- dialog.url.title = Web
349
+ dialog.url.title = Aggiungi contenuti web o esterni come contesto aggiuntivo.
350
350
  dialog.url.update = Aggiungi
351
351
  dialog.workdir.change.confirm = Sei sicuro di voler cambiare/spostare la workdir a:\n{path}?
352
352
  dialog.workdir.change.empty.alert = La cartella non è vuota! Annullamento dell'operazione.
@@ -100,7 +100,7 @@ assistant.tool.retrieval = Tool: retrieval
100
100
  assistant.vector_store = Baza wektorowa
101
101
  attachments.auto_index = Auto-indeksacja przy przesyłaniu
102
102
  attachments.btn.add = Dodaj plik
103
- attachments.btn.add_url = URL
103
+ attachments.btn.add_url = Sieć
104
104
  attachments.btn.clear = Wyczyść
105
105
  attachments.capture_clear = Wyczyść przy przechwytywaniu
106
106
  attachments.clear.confirm = Wyczyścić listę plików?
@@ -346,7 +346,7 @@ dialog.start.title = Klucz API nie jest zdefiniowany
346
346
  dialog.start.title.text = Nie skonfigurowałeś jeszcze klucza API...\nKlucz API uzyskasz rejestrując konto na stronie internetowej OpenAI:
347
347
  dialog.url.dismiss = Anuluj
348
348
  dialog.url.tip = Podaj URL strony internetowej, którą chcesz dołączyć jako dodatkowy kontekst, np. https://pl.wikipedia.org/wiki/Elon_Musk, lub film na YouTube do transkrypcji, np. https://www.youtube.com/watch?v=CRRlbK5w8AE.
349
- dialog.url.title = Web
349
+ dialog.url.title = Dodaj treść z sieci lub zewnętrzne jako dodatkowy kontekst.
350
350
  dialog.url.update = Dodaj
351
351
  dialog.workdir.change.confirm = Czy jesteś pewny, że chcesz zmienić/przenieść katalog roboczy do:\n{path}?
352
352
  dialog.workdir.change.empty.alert = Katalog nie jest pusty! Anulowanie.
@@ -100,7 +100,7 @@ assistant.tool.retrieval = Інструмент: пошук
100
100
  assistant.vector_store = Векторне сховище
101
101
  attachments.auto_index = Автоматичне індексування при завантаженні
102
102
  attachments.btn.add = Додати файл
103
- attachments.btn.add_url = URL
103
+ attachments.btn.add_url = Веб
104
104
  attachments.btn.clear = Очистити файли
105
105
  attachments.capture_clear = Очистити під час захоплення
106
106
  attachments.clear.confirm = Очистити список?
@@ -346,7 +346,7 @@ dialog.start.title = API КЛЮЧ ще не налаштований
346
346
  dialog.start.title.text = Ваш API ключ ще не налаштований...\nВи отримаєте API ключ, зареєструвавшись на сайті OpenAI:
347
347
  dialog.url.dismiss = Скасувати
348
348
  dialog.url.tip = Вкажіть URL веб-сторінки, яку ви хочете прикріпити як додатковий контекст, наприклад, https://uk.wikipedia.org/wiki/Ілон_Маск, або відео на YouTube для транскрипції, наприклад, https://www.youtube.com/watch?v=CRRlbK5w8AE.
349
- dialog.url.title = Web
349
+ dialog.url.title = Додайте веб-або зовнішній контент як додатковий контекст.
350
350
  dialog.url.update = Додати
351
351
  dialog.workdir.change.confirm = Ви впевнені, що хочете змінити/перемістити робочий каталог до:\n{path}?
352
352
  dialog.workdir.change.empty.alert = Каталог не порожній! Операцію скасовано.
@@ -102,7 +102,7 @@ assistant.tool.retrieval = 工具:檢索
102
102
  assistant.vector_store = 向量存储库
103
103
  attachments.auto_index = 上传时自动索引
104
104
  attachments.btn.add = 添加文件
105
- attachments.btn.add_url = URL
105
+ attachments.btn.add_url = 网络
106
106
  attachments.btn.clear = 清除文件
107
107
  attachments.capture_clear = 捕獲後清除
108
108
  attachments.clear.confirm = 清除列表?
@@ -356,7 +356,7 @@ dialog.start.title = API KEY尚未配置
356
356
  dialog.start.title.text = 您的API密鑰尚未配置...\n您將通過在OpenAI網站上註冊賬戶獲得API密鑰:
357
357
  dialog.url.dismiss = 取消
358
358
  dialog.url.tip = 提供您要附加为附加上下文的网页 URL,例如,https://zh.wikipedia.org/wiki/Elon_Musk,或一个要转录的 YouTube 视频,例如,https://www.youtube.com/watch?v=CRRlbK5w8AE。
359
- dialog.url.title = Web
359
+ dialog.url.title = 添加网络或外部内容作为额外的上下文。
360
360
  dialog.url.update = 添加
361
361
  dialog.workdir.change.confirm = 您确定要更改/移动工作目录到:\n{path}吗?
362
362
  dialog.workdir.change.empty.alert = 目录不为空!操作取消。
@@ -1782,6 +1782,12 @@ class Patch:
1782
1782
  data["ctx.records.folders.top"] = True
1783
1783
  updated = True
1784
1784
 
1785
+ # < 2.4.45
1786
+ if old < parse_version("2.4.45"):
1787
+ print("Migrating config from < 2.4.45...")
1788
+ self.window.core.updater.patch_css('style.css', True) # force update
1789
+ updated = True
1790
+
1785
1791
  # update file
1786
1792
  migrated = False
1787
1793
  if updated:
@@ -21,7 +21,7 @@ class GmailReader(BaseReader, BaseModel):
21
21
  Reads emails
22
22
 
23
23
  Args:
24
- max_results (int): Defaults to 10.
24
+ max_results (int): Defaults to 10.``
25
25
  query (str): Gmail query. Defaults to None.
26
26
  service (Any): Gmail service. Defaults to None.
27
27
  results_per_page (Optional[int]): Max number of results per page. Defaults to 10.
@@ -32,7 +32,7 @@ class GmailReader(BaseReader, BaseModel):
32
32
  token_path: str = "token.json"
33
33
  use_iterative_parser: bool = False
34
34
  max_results: int = 10
35
- service: Any
35
+ service: Any = None
36
36
  results_per_page: Optional[int]
37
37
 
38
38
  def load_data(self, query: str = None) -> List[Document]:
@@ -30,19 +30,27 @@ class Loader(BaseLoader):
30
30
  "args": {
31
31
  "owner": {
32
32
  "type": "str",
33
+ "label": "Owner",
33
34
  },
34
35
  "repository": {
35
36
  "type": "str",
37
+ "label": "Repository",
36
38
  },
37
39
  "state": {
38
40
  "type": "enum",
39
41
  "options": ["open", "closed", "all"],
42
+ "label": "State",
43
+ "description": "Issue state, default: open, available options: open, closed, all",
40
44
  },
41
45
  "label_filters_include": {
42
46
  "type": "list",
47
+ "label": "Label filters include",
48
+ "description": "List of labels to include, separated by comma (,)",
43
49
  },
44
50
  "label_filters_exclude": {
45
51
  "type": "list",
52
+ "label": "Label filters exclude",
53
+ "description": "List of labels to exclude, separated by comma (,)",
46
54
  },
47
55
  },
48
56
  }
@@ -98,6 +106,11 @@ class Loader(BaseLoader):
98
106
  if "repository" in kwargs and kwargs.get("repository"):
99
107
  if isinstance(kwargs.get("repository"), str):
100
108
  args["repository"] = kwargs.get("repository") # repo name
109
+ if "state" in kwargs and kwargs.get("state"):
110
+ if isinstance(kwargs.get("state"), str):
111
+ args["state"] = kwargs.get("state")
112
+ if args["state"] not in ["open", "closed", "all"]:
113
+ args["state"] = "open"
101
114
 
102
115
  # filters
103
116
  if "label_filters_include" in kwargs and kwargs.get("label_filters_include"):
@@ -30,15 +30,19 @@ class Loader(BaseLoader):
30
30
  "args": {
31
31
  "commit_sha": {
32
32
  "type": "str",
33
+ "label": "Commit SHA",
33
34
  },
34
35
  "branch": {
35
36
  "type": "str",
37
+ "label": "Branch",
36
38
  },
37
39
  "owner": {
38
40
  "type": "str",
41
+ "label": "Owner",
39
42
  },
40
43
  "repository": {
41
44
  "type": "str",
45
+ "label": "Repository",
42
46
  }
43
47
  },
44
48
  },
@@ -68,6 +72,12 @@ class Loader(BaseLoader):
68
72
  "filter_file_ext_include": "list",
69
73
  "filter_file_ext_exclude": "list",
70
74
  }
75
+ self.init_args_desc = {
76
+ "filter_dirs_include": "List of directories to include, separated by comma (,)",
77
+ "filter_dirs_exclude": "List of directories to exclude, separated by comma (,)",
78
+ "filter_file_ext_include": "List of file extensions to include, separated by comma (,)",
79
+ "filter_file_ext_exclude": "list of file extensions to exclude, separated by comma (,)",
80
+ }
71
81
 
72
82
  def get(self) -> BaseReader:
73
83
  """
@@ -31,6 +31,7 @@ class Loader(BaseLoader):
31
31
  "query": {
32
32
  "type": "str",
33
33
  "label": "Query",
34
+ "description": "Query to search emails, e.g. from:me after:2023-01-01",
34
35
  },
35
36
  },
36
37
  }
@@ -41,7 +42,7 @@ class Loader(BaseLoader):
41
42
  "token_path": "token.json",
42
43
  "use_iterative_parser": False,
43
44
  "max_results": 10,
44
- "service": None,
45
+ # "service": None,
45
46
  "results_per_page": None,
46
47
  }
47
48
  self.init_args_types = {
@@ -49,7 +50,7 @@ class Loader(BaseLoader):
49
50
  "token_path": "str",
50
51
  "use_iterative_parser": "bool",
51
52
  "max_results": "int",
52
- "service": "str",
53
+ # "service": "str",
53
54
  "results_per_page": "int",
54
55
  }
55
56
 
@@ -29,6 +29,7 @@ class Loader(BaseLoader):
29
29
  "url": {
30
30
  "type": "str",
31
31
  "label": "URL",
32
+ "description": "URL to RSS feed, e.g. https://example.com/feed.xml",
32
33
  },
33
34
  },
34
35
  }
@@ -23,12 +23,13 @@ class Loader(BaseLoader):
23
23
  self.type = ["web"]
24
24
  self.instructions = [
25
25
  {
26
- "rss": {
27
- "description": "read sitemap XML from URL",
26
+ "sitemap": {
27
+ "description": "read all web pages from sitemap.xml",
28
28
  "args": {
29
29
  "url": {
30
30
  "type": "str",
31
31
  "label": "URL",
32
+ "description": "URL to sitemap XML, e.g. https://example.com/sitemap.xml, all pages will be read",
32
33
  },
33
34
  },
34
35
  }
@@ -42,6 +43,10 @@ class Loader(BaseLoader):
42
43
  "html_to_text": "bool",
43
44
  "limit": "int",
44
45
  }
46
+ self.init_args_desc = {
47
+ "html_to_text": "Whether to convert HTML to text",
48
+ "limit": "Maximum number of concurrent requests",
49
+ }
45
50
 
46
51
  def get(self) -> BaseReader:
47
52
  """
@@ -12,11 +12,12 @@
12
12
  import json
13
13
 
14
14
  from PySide6.QtCore import Qt
15
+ from PySide6.QtGui import QIcon
15
16
  from PySide6.QtWidgets import QLabel, QVBoxLayout, QWidget, QCheckBox, QHBoxLayout, QScrollArea, \
16
17
  QSizePolicy
17
18
 
18
19
  from pygpt_net.ui.widget.element.group import QVLine, QHLine
19
- from pygpt_net.ui.widget.element.labels import HelpLabel, UrlLabel
20
+ from pygpt_net.ui.widget.element.labels import HelpLabel, UrlLabel, IconLabel
20
21
  from pygpt_net.ui.widget.option.combo import OptionCombo
21
22
  from pygpt_net.ui.widget.option.input import OptionInput
22
23
  from pygpt_net.utils import trans
@@ -62,7 +63,18 @@ class WebTab:
62
63
  self.window.ui.add_hook("update.tool.indexer.web.loader", self.hook_loader_change)
63
64
 
64
65
  self.window.ui.nodes["tool.indexer.web.options.label"] = HelpLabel(trans("tool.indexer.tab.web.source"))
65
- self.window.ui.nodes["tool.indexer.web.config.label"] = HelpLabel(trans("tool.indexer.tab.web.cfg"))
66
+
67
+ config_label = HelpLabel(trans("tool.indexer.tab.web.cfg"))
68
+ config_label.setWordWrap(False)
69
+
70
+ config_label_layout = QHBoxLayout()
71
+ config_label_layout.addWidget(IconLabel(QIcon(":/icons/settings_filled.svg")))
72
+ config_label_layout.addWidget(config_label)
73
+ config_label_layout.setAlignment(Qt.AlignLeft)
74
+
75
+ self.window.ui.nodes["tool.indexer.web.config.label"] = QWidget()
76
+ self.window.ui.nodes["tool.indexer.web.config.label"].setLayout(config_label_layout)
77
+
66
78
  self.window.ui.nodes["tool.indexer.web.config.help"] = UrlLabel(
67
79
  trans("tool.indexer.tab.web.help"),
68
80
  "https://pygpt.readthedocs.io/en/latest/configuration.html#data-loaders")
@@ -95,7 +107,6 @@ class WebTab:
95
107
 
96
108
  # config
97
109
  params_layout.addWidget(self.window.ui.nodes["tool.indexer.web.config.label"])
98
- self.window.ui.nodes["tool.indexer.web.config.label"].setAlignment(Qt.AlignCenter)
99
110
  inputs, groups = self.window.core.idx.ui.loaders.setup_loader_config()
100
111
  for loader in inputs:
101
112
  for k in inputs[loader]:
@@ -10,10 +10,11 @@
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Qt
13
+ from PySide6.QtGui import QIcon
13
14
  from PySide6.QtWidgets import QDialog, QLabel, QHBoxLayout, QVBoxLayout, QPushButton, QScrollArea, QWidget, QSizePolicy
14
15
 
15
16
  from pygpt_net.ui.widget.element.group import QHLine
16
- from pygpt_net.ui.widget.element.labels import HelpLabel, UrlLabel
17
+ from pygpt_net.ui.widget.element.labels import HelpLabel, UrlLabel, IconLabel
17
18
  from pygpt_net.ui.widget.option.combo import OptionCombo
18
19
  from pygpt_net.utils import trans
19
20
  from pygpt_net.ui.widget.textarea.url import UrlInput
@@ -85,7 +86,18 @@ class UrlDialog(QDialog):
85
86
  self.window.ui.add_hook("update.dialog.url.web.loader", self.hook_loader_change)
86
87
 
87
88
  self.window.ui.nodes["dialog.url.options.label"] = HelpLabel(trans("tool.indexer.tab.web.source"))
88
- self.window.ui.nodes["dialog.url.config.label"] = HelpLabel(trans("tool.indexer.tab.web.cfg"))
89
+
90
+ config_label = HelpLabel(trans("tool.indexer.tab.web.cfg"))
91
+ config_label.setWordWrap(False)
92
+
93
+ config_label_layout = QHBoxLayout()
94
+ config_label_layout.addWidget(IconLabel(QIcon(":/icons/settings_filled.svg")))
95
+ config_label_layout.addWidget(config_label)
96
+ config_label_layout.setAlignment(Qt.AlignLeft)
97
+
98
+ self.window.ui.nodes["dialog.url.config.label"] = QWidget()
99
+ self.window.ui.nodes["dialog.url.config.label"].setLayout(config_label_layout)
100
+
89
101
  self.window.ui.nodes["dialog.url.config.help"] = UrlLabel(
90
102
  trans("tool.indexer.tab.web.help"),
91
103
  "https://pygpt.readthedocs.io/en/latest/configuration.html#data-loaders")
@@ -117,7 +129,6 @@ class UrlDialog(QDialog):
117
129
 
118
130
  # config
119
131
  params_layout.addWidget(self.window.ui.nodes["dialog.url.config.label"])
120
- self.window.ui.nodes["dialog.url.config.label"].setAlignment(Qt.AlignCenter)
121
132
  inputs, groups = self.window.core.idx.ui.loaders.setup_loader_config()
122
133
 
123
134
  for loader in inputs:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pygpt-net
3
- Version: 2.4.44
3
+ Version: 2.4.45
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.44** | build: **2024.12.16** | Python: **>=3.10, <3.12**
95
+ Release: **2.4.45** | build: **2024.12.16** | Python: **>=3.10, <3.12**
96
96
 
97
97
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
98
98
  >
@@ -4028,6 +4028,10 @@ may consume additional tokens that are not displayed in the main window.
4028
4028
 
4029
4029
  ## Recent changes:
4030
4030
 
4031
+ **2.4.45 (2024-12-16)**
4032
+
4033
+ - Enhanced web data loaders UI.
4034
+
4031
4035
  **2.4.44 (2024-12-16)**
4032
4036
 
4033
4037
  - Enhanced web data loaders.
@@ -1,9 +1,9 @@
1
- CHANGELOG.md,sha256=m4N1EEll7KAfycdMcf5Tg3nVcpU9xg4F_WmWOHF47HM,80034
2
- README.md,sha256=xakQJN7Wm7rPQTM5EI8z9PHEyclUqW8ZmFWLHqZYj_4,163298
1
+ CHANGELOG.md,sha256=i4WebjD604rHjXAZW919DqCF4E_dlM50lA8V4eWrtHQ,80091
2
+ README.md,sha256=FyxcDQXhoQ2OWe0TXe01HniGKNO5rLTnO3qwPpHSfds,163356
3
3
  icon.png,sha256=CzcINJaU23a9hNjsDlDNbyuiEvKZ4Wg6DQVYF6SpuRg,13970
4
- pygpt_net/CHANGELOG.txt,sha256=GN7mILQmcF8BykzMYvTQSrlZmsR8OMoNkXO19CurY4c,78566
4
+ pygpt_net/CHANGELOG.txt,sha256=Y89GFqRzvP_drqfT3xChx-IPaZai2rTBW8dWmJzgiIg,78620
5
5
  pygpt_net/LICENSE,sha256=6Ku72-zJ8wO5VIR87UoJ5P_coCVjPghaFL9ZF2jLp7E,1146
6
- pygpt_net/__init__.py,sha256=2eak42Z_YBkDVO_vdiUlpjRLVho0lc3-SeqWrGcV7BQ,1067
6
+ pygpt_net/__init__.py,sha256=WrF45IKMdaraGha65Zgj_JOg7yGyvsrhGK3EGDNN8Bs,1067
7
7
  pygpt_net/app.py,sha256=i02M96uLngAs_XZCS1Mi84vb3Okx8ZZewbTdhCqFolM,16029
8
8
  pygpt_net/config.py,sha256=Qc1FOBtTf3O6A6-6KoqUGtoJ0u8hXQeowvCVbZFwtik,16405
9
9
  pygpt_net/container.py,sha256=BemiVZPpPNIzfB-ZvnZeeBPFu-AcX2c30OqYFylEjJc,4023
@@ -72,7 +72,7 @@ pygpt_net/controller/kernel/reply.py,sha256=-5z1QHsXh2PvtZSC18gXc-fdyVVK5WACiEK_
72
72
  pygpt_net/controller/kernel/stack.py,sha256=aPLetBoQDKYawQJg8pkAO3tHfJgKwO_NvDOR8F2wJkM,3767
73
73
  pygpt_net/controller/lang/__init__.py,sha256=pTSX0il3xLNGHoh4XAOdIUlbC2f9kIBCzthRDDOjyNY,3287
74
74
  pygpt_net/controller/lang/custom.py,sha256=sA8fC9CqNNbaJ3cywa4xlZXBTJP9QUWJLa1YliKHPRw,5802
75
- pygpt_net/controller/lang/mapping.py,sha256=YcURiyirrVCd5PIfbhY3NYxg9_i5GJchhJ8JYzb-NPM,23044
75
+ pygpt_net/controller/lang/mapping.py,sha256=1q9tbuTM7j4VOqdxQA_CwqoiLCK3LWtRfQbjRjUe6pc,23560
76
76
  pygpt_net/controller/lang/plugins.py,sha256=JEiOajXB7BfxPPfBkYl82K1_gKpRVcMEPNPwsNAJ6WU,3879
77
77
  pygpt_net/controller/lang/settings.py,sha256=awPEshWbHlOt11Zyg_uQKlbYjvABXrQ7QMHdpu2L9ZI,2634
78
78
  pygpt_net/controller/launcher.py,sha256=om6aEZx31cSiCuShnDHp5Fs-Lj6Rb_pmbOO5fBweEWU,1899
@@ -246,9 +246,9 @@ pygpt_net/css_rc.py,sha256=i13kX7irhbYCWZ5yJbcMmnkFp_UfS4PYnvRFSPF7XXo,11349
246
246
  pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
247
247
  pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
248
248
  pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
249
- pygpt_net/data/config/config.json,sha256=nyfGaUrFyYTGnjMUxCfsyecCEFLz-10GhXlFcHN7TO0,19535
250
- pygpt_net/data/config/models.json,sha256=1mq-iJ-9wtYiY8iEfg08sK85ZiZkQPvF-9YH8_nLo1k,48872
251
- pygpt_net/data/config/modes.json,sha256=78G810ct4mkFv3c-vDlehDYAAADwjYESdE0_Xb8M7t4,1923
249
+ pygpt_net/data/config/config.json,sha256=IikODdsLIhUO_3CngNX7ru7cUMtEfYLz5PqHwcA746w,19535
250
+ pygpt_net/data/config/models.json,sha256=waqDijgxxiOTMksaSmsbq5oHRZk7AXyUcgcQuax_aqc,48872
251
+ pygpt_net/data/config/modes.json,sha256=FdUSFJVScMxp8_-Rwu5d3glGM80Rq3FRXBt9AAHGjFc,1923
252
252
  pygpt_net/data/config/presets/agent_openai.json,sha256=vMTR-soRBiEZrpJJHuFLWyx8a3Ez_BqtqjyXgxCAM_Q,733
253
253
  pygpt_net/data/config/presets/agent_openai_assistant.json,sha256=awJw9lNTGpKML6SJUShVn7lv8AXh0oic7wBeyoN7AYs,798
254
254
  pygpt_net/data/config/presets/agent_planner.json,sha256=a6Rv58Bnm2STNWB0Rw_dGhnsz6Lb3J8_GwsUVZaTIXc,742
@@ -274,7 +274,7 @@ pygpt_net/data/css/fix_windows.css,sha256=Mks14Vg25ncbMqZJfAMStrhvZmgHF6kU75ohTW
274
274
  pygpt_net/data/css/markdown.css,sha256=yaoJPogZZ_ghbqP8vTXTycwVyD61Ik5_033NpzuUzC0,1122
275
275
  pygpt_net/data/css/markdown.dark.css,sha256=ixAwuT69QLesZttKhO4RAy-QukplZwwfXCZsWLN9TP4,730
276
276
  pygpt_net/data/css/markdown.light.css,sha256=UZdv0jtuFgJ_4bYWsDaDQ4X4AP9tVNLUHBAckC_oD8k,833
277
- pygpt_net/data/css/style.css,sha256=JgE5Y6ULYtNDVF49jhb_PfGPJVxCFj5DNMiobPopX64,400
277
+ pygpt_net/data/css/style.css,sha256=-yFk2bpE6fegZs6Fpj_1WB9xrubqxsXK-U8zyaLv7-0,428
278
278
  pygpt_net/data/css/style.dark.css,sha256=5GqBiCiTdofU3AfgbuQEezFPE3iSf_mx3dkU4kAtygQ,729
279
279
  pygpt_net/data/css/style.light.css,sha256=szc-rgR_UoLOTegJerDoL2Rx_l-E6BOYSe956snPE3k,1741
280
280
  pygpt_net/data/css/web-blocks.css,sha256=AhgdeXhdj1rk8jYT9a7I5ftAImNHknOqJCnkzUn8dtI,6175
@@ -1484,14 +1484,14 @@ pygpt_net/data/js/katex/fonts/KaTeX_Typewriter-Regular.woff,sha256=4U_tArGrp86fW
1484
1484
  pygpt_net/data/js/katex/fonts/KaTeX_Typewriter-Regular.woff2,sha256=cdUX1ngneHz6vfGGkUzDNY7aU543kxlB8rL9SiH2jAs,13568
1485
1485
  pygpt_net/data/js/katex/katex.min.css,sha256=lVaKnUaQNG4pI71WHffQZVALLQF4LMZEk4nOia8U9ow,23532
1486
1486
  pygpt_net/data/js/katex/katex.min.js,sha256=KLASOtKS2x8pUxWVzCDmlWJ4jhuLb0vtrgakbD6gDDo,276757
1487
- pygpt_net/data/locale/locale.de.ini,sha256=ykqUVe293YgrRk77J_S56y2fw4-6dlztNlc49QMLl_A,62524
1488
- pygpt_net/data/locale/locale.en.ini,sha256=xFzTrYqSRK2Fu37Y1gioekVmEj1FdFRQMycuXH6Zs1s,75107
1489
- pygpt_net/data/locale/locale.es.ini,sha256=o9XR8oUw6QhLZIf0nRFGwIRXZG_yYAQEI6didNBnnHM,62756
1490
- pygpt_net/data/locale/locale.fr.ini,sha256=pFw45FEE7nPYfinQLdqsnz0VmNhUxIGzewPkvEEGsW0,64792
1491
- pygpt_net/data/locale/locale.it.ini,sha256=JLBmTEpka0Xs5P-GBmCVQW6GBbvV6rAaW7zO0HAI_Rc,61616
1492
- pygpt_net/data/locale/locale.pl.ini,sha256=yKoi9aJtsByvKCWmu9NVuUhMvearGisqk46q0vzdxxw,61683
1493
- pygpt_net/data/locale/locale.uk.ini,sha256=eEQJDwMaK5KV7a3JpgIGnPkzVdPajCc-QnPI7pSILQ0,86080
1494
- pygpt_net/data/locale/locale.zh.ini,sha256=XqqWOSG5H7WRtpAHYRQm35R3mrUr9b1t2BdWK0qUxFc,63426
1487
+ pygpt_net/data/locale/locale.de.ini,sha256=H_ez3-Yuw6fd2PHeMH8shNcpQHgznhDl2jlJuFHWtRs,62590
1488
+ pygpt_net/data/locale/locale.en.ini,sha256=vIXVwa4elbaCv9uvjXRNuKDEEgxazNnZE0SXkCDGQsE,75162
1489
+ pygpt_net/data/locale/locale.es.ini,sha256=rh6A7R5BZyO399Qz0BHUsv7N0U-44yvlBG2X1xcZhFQ,62809
1490
+ pygpt_net/data/locale/locale.fr.ini,sha256=hTGh4_en056SAVzAicOx-1MhNuwh-KKypZLpgHNDrQA,64854
1491
+ pygpt_net/data/locale/locale.it.ini,sha256=XafZlQrASzOCmfM1JS7AxxUorkATmi6DPzQQQuw6gm8,61671
1492
+ pygpt_net/data/locale/locale.pl.ini,sha256=73CIq7xhibjqv5wVVahHlvZCmk2SH1N73VWEdj7BF2s,61744
1493
+ pygpt_net/data/locale/locale.uk.ini,sha256=xGlJsW2-vwPjvSRmiT0vupC461VI-xV1qrRLOZTArJk,86186
1494
+ pygpt_net/data/locale/locale.zh.ini,sha256=66xR0yhEcUK-PPj0Sfg1oI5Ze7RKG5_N92axWZKCZzA,63480
1495
1495
  pygpt_net/data/locale/plugin.agent.de.ini,sha256=BY28KpfFvgfVYJzcw2o5ScWnR4uuErIYGyc3NVHlmTw,1714
1496
1496
  pygpt_net/data/locale/plugin.agent.en.ini,sha256=88LkZUpilbV9l4QDbMyIdq_K9sbWt-CQPpavEttPjJU,1489
1497
1497
  pygpt_net/data/locale/plugin.agent.es.ini,sha256=bqaJQne8HPKFVtZ8Ukzo1TSqVW41yhYbGUqW3j2x1p8,1680
@@ -1819,7 +1819,7 @@ pygpt_net/provider/core/calendar/db_sqlite/storage.py,sha256=QDclQCQdr4QyRIqjgGX
1819
1819
  pygpt_net/provider/core/config/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
1820
1820
  pygpt_net/provider/core/config/base.py,sha256=cbvzbMNqL2XgC-36gGubnU37t94AX7LEw0lecb2Nm80,1365
1821
1821
  pygpt_net/provider/core/config/json_file.py,sha256=P78SRQpNr_nF7TYftYLnHl_DVo7GLPNs4_lvw97sqq8,5122
1822
- pygpt_net/provider/core/config/patch.py,sha256=mutVLJ_SYNrUIXwzYSY9YrHhPfpcY-cDyUofKXawbVY,93971
1822
+ pygpt_net/provider/core/config/patch.py,sha256=xUa8t3ePfVAui2RsuzjJplUD1yBelBSDHrqJ7LOPIOY,94217
1823
1823
  pygpt_net/provider/core/ctx/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
1824
1824
  pygpt_net/provider/core/ctx/base.py,sha256=Tfb4MDNe9BXXPU3lbzpdYwJF9S1oa2-mzgu5XT4It9g,3003
1825
1825
  pygpt_net/provider/core/ctx/db_sqlite/__init__.py,sha256=G2pB7kZfREJRLJZmfv3DKTslXC-K7EhNN2sn56q6BFA,11753
@@ -1914,7 +1914,7 @@ pygpt_net/provider/loaders/hub/github/repo.py,sha256=y00tCQ473i9nE1yedVXtGxwsBp1
1914
1914
  pygpt_net/provider/loaders/hub/google/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1915
1915
  pygpt_net/provider/loaders/hub/google/calendar.py,sha256=G2Xvbch9Ik9Ntx54iFqrCd5rJoTg9hYw9kG0s08qyJI,2658
1916
1916
  pygpt_net/provider/loaders/hub/google/docs.py,sha256=CFAcv95qmVB6WxW_F0oRLuRQUvXfb3CEZeuhQQMyDDM,5370
1917
- pygpt_net/provider/loaders/hub/google/gmail.py,sha256=hL314Pl4Beyq3lVU1DpX8oFZOMzUzhp64IeWp2SW24U,6772
1917
+ pygpt_net/provider/loaders/hub/google/gmail.py,sha256=Vudf9Lgq2SOkcNiJSRI42BqmTDN6k8Tk0_1g6Eh2CEo,6781
1918
1918
  pygpt_net/provider/loaders/hub/google/keep.py,sha256=il_MW5IG-Em2EljS5eICoTIIKHE1HsvP1MCCX7DiaPI,1633
1919
1919
  pygpt_net/provider/loaders/hub/google/sheets.py,sha256=gGKqwnZgbfp-sTHQQDNiZWIa6Z68h3w61fRmdcaJJ_s,5282
1920
1920
  pygpt_net/provider/loaders/hub/image_vision/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1935,18 +1935,18 @@ pygpt_net/provider/loaders/hub/yt/utils.py,sha256=uDEaDQJGrcyMBeNeazJmXVVDIJOyPw
1935
1935
  pygpt_net/provider/loaders/web_bitbucket.py,sha256=FwzBTfP0pJQD8pn0FurpOOwqMS-d-mEUQKt2gxC6pWc,3626
1936
1936
  pygpt_net/provider/loaders/web_chatgpt_retrieval.py,sha256=Lh0cWcbx5XFMiLHIpB1qrKvnzYIWSaR59w0_m-2ZpYQ,2580
1937
1937
  pygpt_net/provider/loaders/web_database.py,sha256=zuQLI__a5CO7f-5fwSWZ1ca7bTZWd6D1AyMhG7aOg2A,3293
1938
- pygpt_net/provider/loaders/web_github_issues.py,sha256=EByqcD7yY-owRRuTW0sN81iX43wpiClWi4I-byVUVrc,4170
1939
- pygpt_net/provider/loaders/web_github_repo.py,sha256=1w2vNHwa8ecIbAq9Lp8KygDvOkUQCX8hl_Vohwf3Pv8,4377
1938
+ pygpt_net/provider/loaders/web_github_issues.py,sha256=l4DAz0PMw0uAgiI6F7NL-YMqDSetqgVjRrEBx9zjWEw,5009
1939
+ pygpt_net/provider/loaders/web_github_repo.py,sha256=M67-8ZgVcaJlE5_CNkslnT7vUxwewuSyODkIDOxzZzc,5002
1940
1940
  pygpt_net/provider/loaders/web_google_calendar.py,sha256=mHVQ3F9VC2y8brjyh_BLk9_7Mth3RVy2iYWeFzwm0JE,3366
1941
1941
  pygpt_net/provider/loaders/web_google_docs.py,sha256=HS0g2ibhY-6jWldh7hxl7ymxYCfsE4uY_KLN3sAJyiM,2821
1942
1942
  pygpt_net/provider/loaders/web_google_drive.py,sha256=UPM2jG2Cp6K9oj2J7df-1CEsbRxfqx1yTT63DjDqtN4,4244
1943
- pygpt_net/provider/loaders/web_google_gmail.py,sha256=3CCoYOQXU04rAJGhLYl7hpXtOPp1dB40TqGMPFJF1ME,2756
1943
+ pygpt_net/provider/loaders/web_google_gmail.py,sha256=80O-UHbPJaLAlIrj6UVKe7bnIdCMU0gCKXHD5MNjkEE,2860
1944
1944
  pygpt_net/provider/loaders/web_google_keep.py,sha256=kcD5tQa66lCxOoYRR0mwPqhCwBMZ3JtEgKV8l1mCwUQ,2698
1945
1945
  pygpt_net/provider/loaders/web_google_sheets.py,sha256=iZcVFi6xlmJ8axj-FKUYQu5voS9PyB8x3jyh6h-hgL8,2891
1946
1946
  pygpt_net/provider/loaders/web_microsoft_onedrive.py,sha256=HGD2jRMPlqcC-cGJil3kgPE_Ivz3MJFgvuX7yHKhIXE,4924
1947
1947
  pygpt_net/provider/loaders/web_page.py,sha256=PfUF6WaOZO-YhHSCW0wtc96hNyIkq81Ma8JQUEqxqxA,1719
1948
- pygpt_net/provider/loaders/web_rss.py,sha256=Q7V8AniH7z93kXKNrg1pBy8OuvyWidZgScI6O3kgR40,1628
1949
- pygpt_net/provider/loaders/web_sitemap.py,sha256=V9XiQMHpjWPWieANhrpqmRVO9AMJ7j1U__0CsCWS0Y0,1897
1948
+ pygpt_net/provider/loaders/web_rss.py,sha256=yV7c_AB5fXwCyauvsMj7pGQP0gPx-HikblSLSyH75GE,1725
1949
+ pygpt_net/provider/loaders/web_sitemap.py,sha256=zFIW3abS93ZzsyVasq24MHAiy2ZtrOro-xFl3oaCfyQ,2205
1950
1950
  pygpt_net/provider/loaders/web_twitter.py,sha256=geW_fHMfl-Uh9TmoE3NAk8Ifk0h1VBxMreP7EgKbxhA,2954
1951
1951
  pygpt_net/provider/loaders/web_yt.py,sha256=1j68SbIS6h7Da3pcSPvDnBw5K_jjX3huT39WLQSmArY,2739
1952
1952
  pygpt_net/provider/vector_stores/__init__.py,sha256=ep6B8xlMHcvQTq48Z_4Tr2csO4xEJ4Lqr0Pu--_eTHk,8338
@@ -1984,7 +1984,7 @@ pygpt_net/tools/indexer/ui/browse.py,sha256=N27NI28VejG52UfZr0FJi0lsjYkmRh9-JpOo
1984
1984
  pygpt_net/tools/indexer/ui/ctx.py,sha256=HkJpBOL0MoY30dZXpsx6Em_hVo8TETxd5gyXxOtbL7U,4355
1985
1985
  pygpt_net/tools/indexer/ui/dialogs.py,sha256=u59bNO9lwBHSu3-jVK2RUPHYNRd99Wo3VgKcLm4cszA,7985
1986
1986
  pygpt_net/tools/indexer/ui/files.py,sha256=Y9xV6DO3k5F1nGfO-IGHN3jY6QrihUyUgj53ino04aQ,4034
1987
- pygpt_net/tools/indexer/ui/web.py,sha256=_u1xTYYc9MXNdXJcU0PlfEOGCNAJ1f5NSHVZdSzADqQ,8308
1987
+ pygpt_net/tools/indexer/ui/web.py,sha256=dVCtcgPyv6-lEnyLKOAW5zw7IJeSNHwnNskVpMGa-go,8668
1988
1988
  pygpt_net/tools/indexer/ui/widgets.py,sha256=wEFh9UyzFvsmYeJZtz6yDMk27THeDCT9Fq9DajFpnm4,3562
1989
1989
  pygpt_net/tools/media_player/__init__.py,sha256=S84y_Yig4Rgn-xZzgWqZ61MRfsdefDgzqwrxfLfRS9w,6104
1990
1990
  pygpt_net/tools/media_player/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -2101,7 +2101,7 @@ pygpt_net/ui/widget/dialog/settings.py,sha256=fKzbme2tdxzTSiQMNnCEgyD3lwCzFjLi85
2101
2101
  pygpt_net/ui/widget/dialog/settings_plugin.py,sha256=Kf1ZK_RY9CAnfeuzPoQ4wgsFb2yQl7X-VKzsYETA55o,1696
2102
2102
  pygpt_net/ui/widget/dialog/snap.py,sha256=ESGmSSpExvf6WJ_EwiHJ9QK-t0NccfWeym5SSJNfi8I,2724
2103
2103
  pygpt_net/ui/widget/dialog/update.py,sha256=0z4motDKCchD8whFHGZJui9omM_dmpviqi3g5yjy6p0,6789
2104
- pygpt_net/ui/widget/dialog/url.py,sha256=AiBSvlC1cLeekApesLXW-ilCJzXpo0EHQNXS440e-jQ,8405
2104
+ pygpt_net/ui/widget/dialog/url.py,sha256=7I17Pp9P2c3G1pODEY5dum_AF0nFnu2BMfbWTgEES-M,8765
2105
2105
  pygpt_net/ui/widget/dialog/workdir.py,sha256=D-C3YIt-wCoI-Eh7z--Z4R6P1UvtpkxeiaVcI-ycFck,1523
2106
2106
  pygpt_net/ui/widget/draw/__init__.py,sha256=oSYKtNEGNL0vDjn3wCgdnBAbxUqNGIEIf-75I2DIn7Q,488
2107
2107
  pygpt_net/ui/widget/draw/painter.py,sha256=gxtnW--roiXYwcERVromle2zfdtf0vHdBWS5zZVuWhY,10903
@@ -2173,8 +2173,8 @@ pygpt_net/ui/widget/textarea/web.py,sha256=9FoL02QY6mOxtc4t4fe8X7fVDIdPn9Sb_fwsv
2173
2173
  pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2174
2174
  pygpt_net/ui/widget/vision/camera.py,sha256=T8b5cmK6uhf_WSSxzPt_Qod8JgMnst6q8sQqRvgQiSA,2584
2175
2175
  pygpt_net/utils.py,sha256=ES35jv1OV2etVIQcArpI-FSdfH2SMI86Gdu-V-MDbRQ,6132
2176
- pygpt_net-2.4.44.dist-info/LICENSE,sha256=GLKQTnJOPK4dDIWfkAIM4GwOxKJXi5zcMGt7FjLR1xk,1126
2177
- pygpt_net-2.4.44.dist-info/METADATA,sha256=3Juz-7SnnMR-u1S9l6GrkLDAxGYNLfxNMph0uyng5C8,168100
2178
- pygpt_net-2.4.44.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
2179
- pygpt_net-2.4.44.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2180
- pygpt_net-2.4.44.dist-info/RECORD,,
2176
+ pygpt_net-2.4.45.dist-info/LICENSE,sha256=GLKQTnJOPK4dDIWfkAIM4GwOxKJXi5zcMGt7FjLR1xk,1126
2177
+ pygpt_net-2.4.45.dist-info/METADATA,sha256=ZtzXke6aXvivfa-4yQTHRIjWmHWSGBOTlmxRKGCpZhc,168158
2178
+ pygpt_net-2.4.45.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
2179
+ pygpt_net-2.4.45.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2180
+ pygpt_net-2.4.45.dist-info/RECORD,,