pygpt-net 2.6.13__py3-none-any.whl → 2.6.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pygpt_net/CHANGELOG.txt CHANGED
@@ -1,3 +1,14 @@
1
+ 2.6.15 (2025-08-20)
2
+
3
+ - Added: do not change the context menu font size in text editing.
4
+ - Added: do not reload context items on tab change if already loaded.
5
+ - Fixed: appending of names and avatars in the stream chunk.
6
+
7
+ 2.6.14 (2025-08-19)
8
+
9
+ - Fixed: Agent evaluation tool runs even if tools are disabled.
10
+ - Extended agent response evaluation by providing the full context of the output.
11
+
1
12
  2.6.13 (2025-08-19)
2
13
 
3
14
  - Fix: Do not load the index in experts if it is not provided.
pygpt_net/__init__.py CHANGED
@@ -6,15 +6,15 @@
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.08.19 00:00:00 #
9
+ # Updated Date: 2025.08.20 00:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  __author__ = "Marcin Szczygliński"
13
13
  __copyright__ = "Copyright 2025, Marcin Szczygliński"
14
14
  __credits__ = ["Marcin Szczygliński"]
15
15
  __license__ = "MIT"
16
- __version__ = "2.6.13"
17
- __build__ = "2025-08-19"
16
+ __version__ = "2.6.15"
17
+ __build__ = "2025-08-20"
18
18
  __maintainer__ = "Marcin Szczygliński"
19
19
  __github__ = "https://github.com/szczyglis-dev/py-gpt"
20
20
  __report__ = "https://github.com/szczyglis-dev/py-gpt/issues"
@@ -654,4 +654,13 @@ class Render:
654
654
 
655
655
  :param text: Text to read # TODO: move to another class
656
656
  """
657
- self.window.controller.audio.read_text(text)
657
+ self.window.controller.audio.read_text(text)
658
+
659
+ def get_pid_data(self, pid: int) -> Optional[CtxItem]:
660
+ """
661
+ Get PID data
662
+
663
+ :param pid: PID
664
+ :return: CtxItem or None
665
+ """
666
+ return self.instance().get_pid_data(pid)
@@ -11,7 +11,9 @@
11
11
 
12
12
  from typing import Any
13
13
 
14
- from pygpt_net.core.events import Event
14
+ from PySide6.QtWidgets import QApplication
15
+
16
+ from pygpt_net.core.events import Event, KernelEvent
15
17
  from pygpt_net.utils import trans
16
18
 
17
19
 
@@ -46,6 +48,10 @@ class Settings:
46
48
  def open(self):
47
49
  """Open plugin settings dialog"""
48
50
  if not self.config_initialized:
51
+ self.window.dispatch(KernelEvent(KernelEvent.STATUS, {
52
+ 'status': trans("status.loading")
53
+ }))
54
+ QApplication.processEvents()
49
55
  self.setup()
50
56
  self.config_initialized = True
51
57
  if self.config_dialog:
@@ -56,6 +62,9 @@ class Settings:
56
62
  width=self.width,
57
63
  height=self.height
58
64
  )
65
+ self.window.dispatch(KernelEvent(KernelEvent.STATUS, {
66
+ 'status': ""
67
+ }))
59
68
  self.config_dialog = True
60
69
 
61
70
  def open_plugin(self, id: str):
@@ -110,9 +110,9 @@ class Common:
110
110
  """
111
111
  # get font size
112
112
  if element == "font.chat.output":
113
- return 'font-size: {}px;'.format(self.window.core.config.get('font_size'))
113
+ return 'QTextEdit {{ font-size: {}px; }}'.format(self.window.core.config.get('font_size'))
114
114
  elif element == "font.chat.input":
115
- return 'font-size: {}px;'.format(self.window.core.config.get('font_size.input'))
115
+ return 'QTextEdit {{ font-size: {}px; }}'.format(self.window.core.config.get('font_size.input'))
116
116
  elif element == "font.ctx.list":
117
117
  return 'font-size: {}px;'.format(self.window.core.config.get('font_size.ctx'))
118
118
  elif element == "font.toolbox":
@@ -204,7 +204,11 @@ class Tabs:
204
204
  meta_id = core.ctx.output.prepare_meta(tab)
205
205
  meta = core.ctx.get_meta_by_id(meta_id)
206
206
  if meta is not None:
207
- w.controller.ctx.load(meta.id)
207
+ pid_data = w.controller.chat.render.get_pid_data(tab.pid)
208
+ if not pid_data or not pid_data.loaded:
209
+ w.controller.ctx.load(meta.id)
210
+ else:
211
+ w.controller.ctx.select_on_list_only(meta.id)
208
212
  elif tab.type == Tab.TAB_TOOL_PAINTER:
209
213
  if core.config.get('vision.capture.enabled'):
210
214
  w.controller.camera.enable_capture()
@@ -132,17 +132,37 @@ class Evaluation:
132
132
  :param force_prev: force to use previous input
133
133
  :return: last user input
134
134
  """
135
- input = ""
135
+ last_input = ""
136
136
  use_prev = self.window.core.config.get("agent.llama.append_eval", False)
137
137
  if force_prev:
138
138
  use_prev = True
139
139
  for ctx in history:
140
- if ctx.extra is not None and "agent_input" in ctx.extra:
140
+ if self.is_input(ctx): # ensure ctx is input
141
141
  if not use_prev and "agent_evaluate" in ctx.extra: # exclude evaluation inputs
142
142
  continue
143
143
  if ctx.input:
144
- input = ctx.input
145
- return input
144
+ last_input = ctx.input
145
+ return last_input
146
+
147
+ def is_input(self, ctx: CtxItem) -> bool:
148
+ """
149
+ Check if the context item is an input
150
+
151
+ :param ctx: context item
152
+ :return: True if input, False otherwise
153
+ """
154
+ return ctx.extra is not None and "agent_input" in ctx.extra
155
+
156
+ def is_output(self, ctx: CtxItem) -> bool:
157
+ """
158
+ Check if the context item is an output
159
+
160
+ :param ctx: context item
161
+ :return: True if output, False otherwise
162
+ """
163
+ return (ctx.extra is not None
164
+ and ("agent_output" in ctx.extra or "agent_finish" in ctx.extra)
165
+ and "agent_finish_evaluate" not in ctx.extra)
146
166
 
147
167
  def get_main_task(self, history: List[CtxItem]) -> str:
148
168
  """
@@ -151,10 +171,12 @@ class Evaluation:
151
171
  :param history: ctx items
152
172
  :return: main task
153
173
  """
154
- first = history[0]
155
174
  task = ""
156
- if first.extra is not None and "agent_input" in first.extra:
157
- task = first.input
175
+ for ctx in history:
176
+ if self.is_input(ctx):
177
+ if ctx.input:
178
+ task = ctx.input
179
+ break
158
180
  return task
159
181
 
160
182
  def get_final_response(self, history: List[CtxItem]) -> str:
@@ -164,19 +186,28 @@ class Evaluation:
164
186
  :param history: ctx items
165
187
  :return: final response from agent
166
188
  """
167
- output = ""
189
+ outputs = []
168
190
  for ctx in history:
169
- if ctx.extra is not None and "agent_finish" in ctx.extra and "agent_finish_evaluate" not in ctx.extra:
191
+ if self.is_output(ctx):
170
192
  if ctx.output:
171
- output = ctx.output
193
+ outputs.append(ctx.output)
194
+
195
+ # if next input then clear outputs - use only output after last user input
196
+ if self.is_input(ctx):
197
+ outputs.clear()
172
198
 
173
199
  # feedback for OpenAI agents
174
- if not output:
200
+ if len(outputs) == 0:
175
201
  for ctx in history:
176
- if ctx.extra is not None and "agent_output" in ctx.extra and "agent_finish_evaluate" not in ctx.extra:
202
+ if self.is_output(ctx):
177
203
  if ctx.output:
178
- output = ctx.output
179
- return output
204
+ outputs.append(ctx.output)
205
+
206
+ # if next input then clear outputs - use only output after last user input
207
+ if self.is_input(ctx):
208
+ outputs.clear()
209
+
210
+ return "\n\n".join(outputs) if outputs else ""
180
211
 
181
212
  def get_prompt_score(self, history: List[CtxItem]) -> str:
182
213
  """
@@ -224,9 +255,7 @@ class Evaluation:
224
255
  return "OK. Feedback has been sent."
225
256
 
226
257
  tool = FunctionTool.from_defaults(fn=send_feedback)
227
- tools = []
228
- tools.append(tool)
229
- return tools
258
+ return [tool]
230
259
 
231
260
  def handle_evaluation(
232
261
  self,
@@ -251,16 +251,14 @@ class Runner:
251
251
  tools = extra["agent_tools"] # use tools from extra if provided
252
252
  else:
253
253
  tools = self.window.core.agents.tools.prepare(context, extra, force=True)
254
+ if not is_cmd:
255
+ tools = [] # disable tools if cmd is not enabled, force agent tools
254
256
 
255
257
  if "agent_history" in extra:
256
258
  history = extra["agent_history"]
257
259
  else:
258
260
  history = self.window.core.agents.memory.prepare(context)
259
261
 
260
- # disable tools if cmd is not enabled
261
- if not is_cmd:
262
- tools = []
263
-
264
262
  # append system prompt
265
263
  if agent_id in self.APPEND_SYSTEM_PROMPT_TO_MSG:
266
264
  if system_prompt:
@@ -694,10 +694,6 @@ class ExpertWorker(QRunnable):
694
694
  tools = self.window.core.agents.tools.prepare(
695
695
  bridge_context, extra, verbose=False, force=True)
696
696
 
697
- # disable tools if cmd is not enabled
698
- if not self.window.core.command.is_cmd(inline=False):
699
- tools = []
700
-
701
697
  # remove expert_call tool from tools
702
698
  for tool in list(tools):
703
699
  if tool.metadata.name == "expert_call":
@@ -55,6 +55,14 @@ class BaseRenderer:
55
55
  """
56
56
  pass
57
57
 
58
+ def get_pid_data(self, pid: int):
59
+ """
60
+ Get PID data for given PID
61
+
62
+ :param pid: PID
63
+ """
64
+ pass
65
+
58
66
  def is_stream(self) -> bool:
59
67
  """
60
68
  Check if it is a stream
@@ -78,6 +78,15 @@ class Renderer(BaseRenderer):
78
78
  if pid is not None:
79
79
  self.pids[pid] = PidData(pid, meta)
80
80
 
81
+ def get_pid_data(self, pid: int):
82
+ """
83
+ Get PID data for given PID
84
+
85
+ :param pid: PID
86
+ """
87
+ if pid in self.pids:
88
+ return self.pids[pid]
89
+
81
90
  def begin(
82
91
  self,
83
92
  meta: CtxMeta,
@@ -81,6 +81,15 @@ class Renderer(BaseRenderer):
81
81
  if pid is not None:
82
82
  self.pids[pid] = PidData(pid, meta)
83
83
 
84
+ def get_pid_data(self, pid: int):
85
+ """
86
+ Get PID data for given PID
87
+
88
+ :param pid: PID
89
+ """
90
+ if pid in self.pids:
91
+ return self.pids[pid]
92
+
84
93
  def begin(
85
94
  self,
86
95
  meta: CtxMeta,
@@ -151,6 +151,15 @@ class Renderer(BaseRenderer):
151
151
  if pid is not None:
152
152
  self.pids[pid] = PidData(pid, meta)
153
153
 
154
+ def get_pid_data(self, pid: int):
155
+ """
156
+ Get PID data for given PID
157
+
158
+ :param pid: PID
159
+ """
160
+ if pid in self.pids:
161
+ return self.pids[pid]
162
+
154
163
  def init(self, pid: Optional[int]):
155
164
  """
156
165
  Initialize renderer
@@ -653,7 +662,7 @@ class Renderer(BaseRenderer):
653
662
  return
654
663
 
655
664
  if begin: # prepare name and avatar header only at the beginning to avoid unnecessary checks
656
- pctx.header = self.get_name_header(ctx)
665
+ pctx.header = self.get_name_header(ctx, stream=True)
657
666
  self.update_names(meta, ctx)
658
667
 
659
668
  name_header_str = pctx.header
@@ -1317,8 +1326,10 @@ class Renderer(BaseRenderer):
1317
1326
  or out.startswith(('<tool>{"cmd"', '&lt;tool&gt;{"cmd"'))
1318
1327
  or out.rstrip().endswith(('}</tool>', '}&lt;/tool&gt;'))
1319
1328
  ):
1320
- spinner_class = "" if ctx.live else "display:none"
1321
- spinner = f"<span class=\"spinner\" style=\"{spinner_class}\"><img src=\"{self._file_prefix}{self._icon_sync}\" width=\"30\" height=\"30\" class=\"loading\"></span>"
1329
+ spinner_class = ""
1330
+ spinner = ""
1331
+ # spinner_class = "" if ctx.live else "display:none"
1332
+ # spinner = f"<span class=\"spinner\" style=\"{spinner_class}\"><img src=\"{self._file_prefix}{self._icon_sync}\" width=\"30\" height=\"30\" class=\"loading\"></span>"
1322
1333
 
1323
1334
  tool_extra = self.body.prepare_tool_extra(ctx)
1324
1335
  debug = self.append_debug(ctx, pid, "output") if self.is_debug() else ""
@@ -1326,11 +1337,12 @@ class Renderer(BaseRenderer):
1326
1337
 
1327
1338
  return f"<div class='msg-box msg-bot' id='{msg_id}'>{name_header}<div class='msg'>{html}{spinner}<div class='msg-tool-extra'>{tool_extra}</div><div class='tool-output' style='{output_class}'><span class='toggle-cmd-output' onclick='toggleToolOutput({ctx.id});' title='{trans('action.cmd.expand')}' role='button'><img src='{self._file_prefix}{self._icon_expand}' width='25' height='25' valign='middle'></span><div class='content' style='display:none'>{tool_output}</div></div><div class='msg-extra'>{extra}</div>{footer}{debug}</div></div>"
1328
1339
 
1329
- def get_name_header(self, ctx: CtxItem) -> str:
1340
+ def get_name_header(self, ctx: CtxItem, stream: bool = False) -> str:
1330
1341
  """
1331
1342
  Get name header for the bot
1332
1343
 
1333
1344
  :param ctx: CtxItem instance
1345
+ :param stream: True if it is a stream
1334
1346
  :return: HTML name header
1335
1347
  """
1336
1348
  meta = ctx.meta
@@ -1358,7 +1370,11 @@ class Renderer(BaseRenderer):
1358
1370
 
1359
1371
  if not output_name and not avatar_html:
1360
1372
  return ""
1361
- return f"<div class=\"name-header name-bot\">{avatar_html}{output_name}</div>"
1373
+
1374
+ if stream:
1375
+ return f"{avatar_html}{output_name}"
1376
+ else:
1377
+ return f"<div class=\"name-header name-bot\">{avatar_html}{output_name}</div>"
1362
1378
 
1363
1379
  def flush_output(
1364
1380
  self,
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.13",
4
- "app.version": "2.6.13",
5
- "updated_at": "2025-08-19T00:00:00"
3
+ "version": "2.6.15",
4
+ "app.version": "2.6.15",
5
+ "updated_at": "2025-08-20T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
8
8
  "access.audio.event.speech.disabled": [],
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.6.13",
4
- "app.version": "2.6.13",
5
- "updated_at": "2025-08-19T23:07:35"
3
+ "version": "2.6.15",
4
+ "app.version": "2.6.15",
5
+ "updated_at": "2025-08-20T23:07:35"
6
6
  },
7
7
  "items": {
8
8
  "SpeakLeash/bielik-11b-v2.3-instruct:Q4_K_M": {
@@ -1341,6 +1341,7 @@ status.evaluating = Bitte warten... bewerten...
1341
1341
  status.finished = Abgeschlossen.
1342
1342
  status.img.generated = Bild wurde generiert
1343
1343
  status.img.saved = Bild gespeichert
1344
+ status.loading = Laden... Bitte warten
1344
1345
  status.preset.cleared = Voreinstellung gelöscht
1345
1346
  status.preset.deleted = Voreinstellung gelöscht
1346
1347
  status.preset.duplicated = Voreinstellung dupliziert
@@ -1353,6 +1353,7 @@ status.evaluating = Please wait... evaluating...
1353
1353
  status.finished = Finished.
1354
1354
  status.img.generated = Image has been generated.
1355
1355
  status.img.saved = Image has been saved.
1356
+ status.loading = Loading... Please wait
1356
1357
  status.preset.cleared = Preset has been cleared.
1357
1358
  status.preset.deleted = Preset has been deleted.
1358
1359
  status.preset.duplicated = Preset has been duplicated.
@@ -1342,6 +1342,7 @@ status.evaluating = Por favor espera... evaluando...
1342
1342
  status.finished = Terminado.
1343
1343
  status.img.generated = La imagen ha sido generada
1344
1344
  status.img.saved = Imagen guardada
1345
+ status.loading = Cargando... Por favor, espera
1345
1346
  status.preset.cleared = Ajuste preestablecido limpiado
1346
1347
  status.preset.deleted = Ajuste preestablecido eliminado
1347
1348
  status.preset.duplicated = Ajuste preestablecido duplicado
@@ -1341,6 +1341,7 @@ status.evaluating = Veuillez patienter... évaluation en cours...
1341
1341
  status.finished = Terminé.
1342
1342
  status.img.generated = L'image a été générée.
1343
1343
  status.img.saved = Image sauvegardée
1344
+ status.loading = Chargement... Veuillez patienter
1344
1345
  status.preset.cleared = Préréglage effacé
1345
1346
  status.preset.deleted = Préréglage supprimé
1346
1347
  status.preset.duplicated = Préréglage dupliqué
@@ -1341,6 +1341,7 @@ status.evaluating = Attendere prego... valutazione in corso...
1341
1341
  status.finished = Finito.
1342
1342
  status.img.generated = L'immagine è stata generata.
1343
1343
  status.img.saved = Immagine salvata.
1344
+ status.loading = Caricamento... Attendere prego
1344
1345
  status.preset.cleared = Preset cancellato.
1345
1346
  status.preset.deleted = Preset cancellato.
1346
1347
  status.preset.duplicated = Preset duplicato.
@@ -1007,7 +1007,7 @@ settings.agent.func_call.native.desc = Jeśli włączone, aplikacja będzie uży
1007
1007
  settings.agent.goal.notify = Wyświetl powiadomienie w zasobniku systemowym, gdy cel zostanie osiągnięty.
1008
1008
  settings.agent.idx = Indeks
1009
1009
  settings.agent.idx.auto_retrieve = Automatyczne pobieranie dodatkowego kontekstu z RAG
1010
- settings.agent.idx.auto_retrieve.desc = Automatyczne pobieranie dodatkowego kontekstu z RAG na początku, jeśli został podany indeks.
1010
+ settings.agent.idx.auto_retrieve.desc = Automatyczne pobieranie dodatkowego kontekstu z RAG na początku, jeśli został podany indeks.
1011
1011
  settings.agent.idx.desc = Tylko jeśli tryb wewnętrzny to llama_index (Czat z plikami), wybierz indeks do użycia w trybach Agenta i Experta
1012
1012
  settings.agent.llama.append_eval = Dodaj i porównaj poprzedni prompt oceny w następnej ocenie
1013
1013
  settings.agent.llama.append_eval.desc = Jeśli włączone, poprzedni prompt ulepszenia będzie sprawdzany w kolejnej ewaluacji w pętli
@@ -1344,6 +1344,7 @@ status.evaluating = Proszę czekać... ocena w toku...
1344
1344
  status.finished = Zakończono.
1345
1345
  status.img.generated = Obraz został wygenerowany.
1346
1346
  status.img.saved = Obraz został zapisany
1347
+ status.loading = Ładowanie... Proszę czekać
1347
1348
  status.preset.cleared = Preset wyczyszczony
1348
1349
  status.preset.deleted = Preset usunięty
1349
1350
  status.preset.duplicated = Preset skopiowany
@@ -1341,6 +1341,7 @@ status.evaluating = Будь ласка, зачекайте... оцінюван
1341
1341
  status.finished = Завершено.
1342
1342
  status.img.generated = Зображення було згенеровано.
1343
1343
  status.img.saved = Зображення збережено
1344
+ status.loading = Завантаження... Будь ласка, зачекайте
1344
1345
  status.preset.cleared = Пресет очищено
1345
1346
  status.preset.deleted = Пресет видалено
1346
1347
  status.preset.duplicated = Пресет дубльовано
@@ -1341,6 +1341,7 @@ status.evaluating = 请稍候... 评估中...
1341
1341
  status.finished = 完成。
1342
1342
  status.img.generated = 图像已生成。
1343
1343
  status.img.saved = 图像已保存。
1344
+ status.loading = 加载中... 请稍候
1344
1345
  status.preset.cleared = 预设已清除。
1345
1346
  status.preset.deleted = 预设已删除。
1346
1347
  status.preset.duplicated = 预设已复制。
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pygpt-net
3
- Version: 2.6.13
3
+ Version: 2.6.15
4
4
  Summary: Desktop AI Assistant powered by: OpenAI GPT-5, o1, o3, GPT-4, 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.
5
5
  License: MIT
6
6
  Keywords: py_gpt,py-gpt,pygpt,desktop,app,o1,o3,gpt-5,gpt,gpt4,gpt-4o,gpt-4v,gpt3.5,gpt-4,gpt-4-vision,gpt-3.5,llama3,mistral,gemini,grok,deepseek,bielik,claude,tts,whisper,vision,chatgpt,dall-e,chat,chatbot,assistant,text completion,image generation,ai,api,openai,api key,langchain,llama-index,ollama,presets,ui,qt,pyside
@@ -108,7 +108,7 @@ Description-Content-Type: text/markdown
108
108
 
109
109
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
110
110
 
111
- Release: **2.6.13** | build: **2025-08-19** | Python: **>=3.10, <3.14**
111
+ Release: **2.6.15** | build: **2025-08-20** | Python: **>=3.10, <3.14**
112
112
 
113
113
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
114
114
  >
@@ -4566,6 +4566,17 @@ may consume additional tokens that are not displayed in the main window.
4566
4566
 
4567
4567
  ## Recent changes:
4568
4568
 
4569
+ **2.6.15 (2025-08-20)**
4570
+
4571
+ - Added: do not change the context menu font size in text editing.
4572
+ - Added: do not reload context items on tab change if already loaded.
4573
+ - Fixed: appending of names and avatars in the stream chunk.
4574
+
4575
+ **2.6.14 (2025-08-19)**
4576
+
4577
+ - Fixed: Agent evaluation tool runs even if tools are disabled.
4578
+ - Extended agent response evaluation by providing the full context of the output.
4579
+
4569
4580
  **2.6.13 (2025-08-19)**
4570
4581
 
4571
4582
  - Fix: Do not load the index in experts if it is not provided.
@@ -1,6 +1,6 @@
1
- pygpt_net/CHANGELOG.txt,sha256=mIS7CX8lAdbx3zb74FeNykLgd2mU9MzXG7oLcd5kq7E,99799
1
+ pygpt_net/CHANGELOG.txt,sha256=nvzM6_l4V4_ZuaKv2A97l_kUPc9aNBsCYCfdj2EVR0M,100187
2
2
  pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
3
- pygpt_net/__init__.py,sha256=9Fm5b7tTbBNs7FhSh5IYr4XuxdOrvxl4AnYemzPgh84,1373
3
+ pygpt_net/__init__.py,sha256=E2MbiOYX3tjLmymqV1LBe1LhQyq2ONNVsxC5a3ZszOk,1373
4
4
  pygpt_net/app.py,sha256=2IXjjYJ0tm-iFn3pHu3-JGoFAnN9YvmXGHPmeOhpU3Y,20999
5
5
  pygpt_net/config.py,sha256=LCKrqQfePVNrAvH3EY_1oZx1Go754sDoyUneJ0iGWFI,16660
6
6
  pygpt_net/container.py,sha256=NsMSHURaEC_eW8vrCNdztwqkxB7jui3yVlzUOMYvCHg,4124
@@ -41,7 +41,7 @@ pygpt_net/controller/chat/files.py,sha256=QZAi1Io57EU7htKt9M5I9OoGAFX51OH2V5-NsJ
41
41
  pygpt_net/controller/chat/image.py,sha256=yPX26gsz0fLnyXR88lpVyvvHnKA-yZwfXJ4paUDYkeM,8579
42
42
  pygpt_net/controller/chat/input.py,sha256=EPA90r6GqHIlu4JJbr0cuvKIEYSs6LVkimxrWHAyyX0,12390
43
43
  pygpt_net/controller/chat/output.py,sha256=aSgZ8E8IaP4Jjd0ab6eXhebM_YIRPW7pRJUesYCgDQg,10864
44
- pygpt_net/controller/chat/render.py,sha256=YIKWMZIUXD3f_11p9mXjgg-TtudZTjJ26iHXTn553Qc,20401
44
+ pygpt_net/controller/chat/render.py,sha256=-Z-beOsEvw_tS4I8kBT5Z0n9KhDlgrEQH4x1PLDvxhE,20613
45
45
  pygpt_net/controller/chat/response.py,sha256=tacJOG_iG7IjEFiZ4iDggEVVS9mbL0e92JBC--7bnCY,12543
46
46
  pygpt_net/controller/chat/stream.py,sha256=zmDGI_Z9Rn8IYv6vEIVBMTOGjjY0zlfmM3qJMddRGRI,21994
47
47
  pygpt_net/controller/chat/text.py,sha256=ktluNw9ItG4g9p3OpOSmgALhFf1Gnonhl3J9kLzdTqU,10743
@@ -110,7 +110,7 @@ pygpt_net/controller/painter/painter.py,sha256=1Ekmr2a3irDkSb2wowiPXhW59rfdZOW1t
110
110
  pygpt_net/controller/plugins/__init__.py,sha256=iocY37De1H2Nh7HkC7ZYvUus2xzcckslgr5a4PwtQII,511
111
111
  pygpt_net/controller/plugins/plugins.py,sha256=jO5KcC0jsIcwF2U6eSZqicGKUr2MzC0F7zLMDiqwtE8,13849
112
112
  pygpt_net/controller/plugins/presets.py,sha256=8EsEwpU2MjWMQu1kcY4JTcyqqN8pjBrcxA2uW2tFU_A,11674
113
- pygpt_net/controller/plugins/settings.py,sha256=pa0iJvpb1SXWD8hqYoC_BuSogx2-5u6nwcFF3TH5sWw,5732
113
+ pygpt_net/controller/plugins/settings.py,sha256=OT1MNRUKx_9E3COJKVBnNIf3ZybkI2fORgQUbRE-z4U,6063
114
114
  pygpt_net/controller/presets/__init__.py,sha256=Bb9_aAvGxQcKCW2fvG5CAJ6ZUwNYN3GaCf3BXB9eGfI,511
115
115
  pygpt_net/controller/presets/editor.py,sha256=-fFDkIqDwhYwAaSRuK6IayjX8RriqFoc0_LKblSOi-Q,39449
116
116
  pygpt_net/controller/presets/experts.py,sha256=dfPKmAPO-7gaUD2ILs3lR005ir32G5vV-Sa5TGEHwOU,5820
@@ -121,7 +121,7 @@ pygpt_net/controller/settings/profile.py,sha256=Zom4qT2j71lZadB2nbJvn5Ewoek8jdf5
121
121
  pygpt_net/controller/settings/settings.py,sha256=cFA4ZKjcsu8uoapWMTllUUB9DvJXVBzbxLT6InRS4zU,7768
122
122
  pygpt_net/controller/settings/workdir.py,sha256=YEMCMR_IFIPKU4SRvMQ6JZCUQfnPGMWzVjNAARHlpCg,20031
123
123
  pygpt_net/controller/theme/__init__.py,sha256=-HMDkTGRa7Q6_AGomkZPVyasIOgNCqeez0Ocw_z9gMc,509
124
- pygpt_net/controller/theme/common.py,sha256=8YUQ3HZBiH33GoBd49vAnHWtpCGFEnU7JDvxkk3edF0,7082
124
+ pygpt_net/controller/theme/common.py,sha256=z5mzpMnfkTeFstKm_uodDboAa3xj5vTpMKGCZzvkX9A,7114
125
125
  pygpt_net/controller/theme/markdown.py,sha256=iH34dsZWyXCtIZuuRBHiAV__W0P4bY-7OuzEwehizr0,6064
126
126
  pygpt_net/controller/theme/menu.py,sha256=3EjDVatt4lYNePHwHaEr0tZGbO2MljqY5uzkYVvtH5E,5962
127
127
  pygpt_net/controller/theme/nodes.py,sha256=cnoZKp8gRczmWgsAC5liLB53YgsArAPvOWRLmyeAn1o,5463
@@ -130,7 +130,7 @@ pygpt_net/controller/tools/__init__.py,sha256=ds63rOuwLEIe-SlY_sQkhWSdXS0lfVwseU
130
130
  pygpt_net/controller/tools/tools.py,sha256=GfDcAVyAiF1CcZ8ATnSJgfCwXYOaGQ1xoxXztVvU3qc,2905
131
131
  pygpt_net/controller/ui/__init__.py,sha256=cxfh2SYeEDATGAZpcYDqCxYfp4KReQ1CYehevSf89EU,507
132
132
  pygpt_net/controller/ui/mode.py,sha256=RX2omKQ65efycMPiH2BwMXIz30Ud5pA8MOe7WrX592s,8119
133
- pygpt_net/controller/ui/tabs.py,sha256=872TS_1t612gipzEdw8DPgC-iI-JrUY14FHsNZixmV4,28582
133
+ pygpt_net/controller/ui/tabs.py,sha256=6i-g9VcigFKIyXK8aYwZvv9PRcl5n5zkz_IYAZ-1BuI,28804
134
134
  pygpt_net/controller/ui/ui.py,sha256=FxRwPIb_PjyqIK14cSC4KpQRjdhK6nI6Zi9v0cCp19U,7254
135
135
  pygpt_net/controller/ui/vision.py,sha256=X4AxUXbPdoWgxNUUbWTeoQuyJa_AJ3sehSSNF0mQRaM,2415
136
136
  pygpt_net/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -146,9 +146,9 @@ pygpt_net/core/agents/bridge.py,sha256=KhCbMTZNigNlgOhXEMN1kqWGNUhkEdjFdiHBBVTAr
146
146
  pygpt_net/core/agents/legacy.py,sha256=DdlyIpFjmeAC4XUGtq3F5_1BLGZLPOej0RZ6x9ycFjM,1731
147
147
  pygpt_net/core/agents/memory.py,sha256=9Jz9kT-xT8QPpGeXEpWopJUGBLLHu6Ys_-fRrg6BWDg,5210
148
148
  pygpt_net/core/agents/observer/__init__.py,sha256=qVIBJKpGbc0k7PTESAwAR7SbN-pbkBMJUTzeliCAaJU,651
149
- pygpt_net/core/agents/observer/evaluation.py,sha256=VngvBMXzgJaAvWV10oo1HDJ_Nzce55A59DsDGDKLlVo,7633
149
+ pygpt_net/core/agents/observer/evaluation.py,sha256=r-zIRXZpOgo8TJ0qbNPL2Qm_9zmPac9AEWwIbnIW4T8,8491
150
150
  pygpt_net/core/agents/provider.py,sha256=rjxnuqzRxv2Z1d9i_wKpREwJBTeTgtyBDYtyHuwcSPA,2440
151
- pygpt_net/core/agents/runner.py,sha256=lenDhjTp1AXCnwd__7Audror6mAuZutDhqzxhe1CD3w,12171
151
+ pygpt_net/core/agents/runner.py,sha256=C3BQkpHLrd92EuM55mR4PnCJMVvZ4nV0kDhed4xfl9o,12186
152
152
  pygpt_net/core/agents/runners/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
153
  pygpt_net/core/agents/runners/base.py,sha256=XjheBYhBZan51r3vkUh5uf00sYiRj8btZUeUP1jpqlA,5687
154
154
  pygpt_net/core/agents/runners/helpers.py,sha256=0iQQlSg_pJfxY_gQEWImnyAVkTUQYYSW67Z9DS7oUYw,8305
@@ -232,7 +232,7 @@ pygpt_net/core/events/event.py,sha256=uxNdPGaV5KDBaosPM6uxio7dPig091wAoz-OdOPCmx
232
232
  pygpt_net/core/events/kernel.py,sha256=Y5zQ-YCex04OQNMRMC7Q8g55A-imyj9XQ0Jkuyk2eCU,2074
233
233
  pygpt_net/core/events/render.py,sha256=Xfncp6ESvjPyBLtFq6KiNxckAFDN0DsUOJ_mrowjfnM,2525
234
234
  pygpt_net/core/experts/__init__.py,sha256=oscAmAEsCZclyHU7k3z5JzYqilwIO7J90e6oTa29tZ0,511
235
- pygpt_net/core/experts/experts.py,sha256=lbniH2e_wQV0ovwDHryJhj4aKATsOgog0XCWiFmPP3k,30443
235
+ pygpt_net/core/experts/experts.py,sha256=Bq7-xsXK-UBs7ZbjC6kPDULOIwndDcAJSHlV1vXIMug,30287
236
236
  pygpt_net/core/filesystem/__init__.py,sha256=KZLS3s_otd3Md9eDA6FN-b4CtOCWl_fplUlM9V6hTy8,514
237
237
  pygpt_net/core/filesystem/actions.py,sha256=2lRVF_MpIxCwbH8DkugP0K6pY6FymLeH6LKVR2rtQGQ,4152
238
238
  pygpt_net/core/filesystem/editor.py,sha256=or7cT2xhZfDwjX47reyXQCt-_1c4h_xPJDddYi1auNw,4284
@@ -290,24 +290,24 @@ pygpt_net/core/prompt/custom.py,sha256=kexQrazSm_pCmHclTkVT2YId3aNiF53kg6UCSCFZ-
290
290
  pygpt_net/core/prompt/prompt.py,sha256=cEovsa_FUZfiOjC74AWDaXc1RzYdaxXXw3w9xKtVPss,7484
291
291
  pygpt_net/core/prompt/template.py,sha256=Uygs2W-Bw53SX6gZXjYKuHlPtbFGZf41VzR8244dfc0,3329
292
292
  pygpt_net/core/render/__init__.py,sha256=19xPDIYeoDn3Sf1tpcvXtxLaaKkjs0nDQ7-4GqTfeRk,489
293
- pygpt_net/core/render/base.py,sha256=oT0f3rTvvB8SQ1XtcmuDMbX6OWlPfmyfAGSQarl00NA,10061
293
+ pygpt_net/core/render/base.py,sha256=Lkj6_E4hnx7WT8sDOecJQcm41tg1jZ9q3VQSxtWHE5w,10197
294
294
  pygpt_net/core/render/markdown/__init__.py,sha256=19xPDIYeoDn3Sf1tpcvXtxLaaKkjs0nDQ7-4GqTfeRk,489
295
295
  pygpt_net/core/render/markdown/body.py,sha256=OgIshkfCqMnZ-0acCHE6A9ue6irT0cR6laE-v24TS48,7238
296
296
  pygpt_net/core/render/markdown/helpers.py,sha256=qH0roW-XBa7fN6JYOqJrbcyXc_9ztIeQph0siVL0Jpo,2688
297
297
  pygpt_net/core/render/markdown/parser.py,sha256=4lCC_pCWmi-SUli4nnDH-FZEbBi0SnVl0FoL0ZBuNHo,5450
298
298
  pygpt_net/core/render/markdown/pid.py,sha256=bRAOdL8bS-LSfOKReWK3nu-BUZ2qfNchrAsrkxRKlHU,851
299
- pygpt_net/core/render/markdown/renderer.py,sha256=4IqgEfO_4lqy261I3xhqRAs5pVmyH75fNriZZ4GLp1Y,19302
299
+ pygpt_net/core/render/markdown/renderer.py,sha256=PER4BxQUU2zjyMq-flM83_cNcjFyJrRHx2VNa7FN5-I,19488
300
300
  pygpt_net/core/render/plain/__init__.py,sha256=19xPDIYeoDn3Sf1tpcvXtxLaaKkjs0nDQ7-4GqTfeRk,489
301
301
  pygpt_net/core/render/plain/body.py,sha256=i2iQ8VGzh2E3r32XHPTArAQA1Lu-Xlr1tAjJyUwBZd8,4226
302
302
  pygpt_net/core/render/plain/helpers.py,sha256=CMF84kSeuQnkgZVHmN_9YWaL5BC958tDE9ZWfZWhAzg,1630
303
303
  pygpt_net/core/render/plain/pid.py,sha256=Pz3v1tnLj-XI_9vcaVkCf9SZ2EgVs4LYV4qzelBMoOg,1119
304
- pygpt_net/core/render/plain/renderer.py,sha256=Cm-HXHd5Mc6LAiDW5qNXOyZoLKlUo16I_cU-B2cGnYM,15595
304
+ pygpt_net/core/render/plain/renderer.py,sha256=Zzo4O-jo59outV3WuUUd6DNkpq0rkZPbvS-Y3HW7qWo,15781
305
305
  pygpt_net/core/render/web/__init__.py,sha256=istp5dsn6EkLEP7lOBeDb8RjodUcWZqjcEvTroaTT-w,489
306
306
  pygpt_net/core/render/web/body.py,sha256=rybg76GiLWowR-qEvM0Y64woSsO4KSBnww4f8BU7GgI,54872
307
307
  pygpt_net/core/render/web/helpers.py,sha256=ivrXrCqRIUWHDmu3INu-i6XUlB2W9IOO8iYyqpbnSRU,5438
308
308
  pygpt_net/core/render/web/parser.py,sha256=pDFc9Tf8P-jvrDilXyT1fukcQHbixHRJ9Dn9hF10Gko,12892
309
309
  pygpt_net/core/render/web/pid.py,sha256=pXBdPb8hw_aZS2Rtz3pLBpuybpXrzoqwYAFWBal9bLE,3685
310
- pygpt_net/core/render/web/renderer.py,sha256=fli0pggAI1s2nKLkSb4EmrxWzrKgpp7WeZ1g9Kd31mE,56060
310
+ pygpt_net/core/render/web/renderer.py,sha256=slIQ4J-XcLoeCSd_EYBbXgxhzERHgwnH0U37SKpQZes,56482
311
311
  pygpt_net/core/render/web/syntax_highlight.py,sha256=QSLGF5cJL_Xeqej7_TYwY_5C2w9enXV_cMEuaJ3C43U,2005
312
312
  pygpt_net/core/settings/__init__.py,sha256=GQ6_gJ2jf_Chm7ZuZLvkcvEh_sfMDVMBieeoJi2iPI4,512
313
313
  pygpt_net/core/settings/settings.py,sha256=onqwNiICm2VhHfmXLvp1MiEJ14m2jzeeI2pjUiaUwtY,7787
@@ -343,8 +343,8 @@ pygpt_net/css_rc.py,sha256=i13kX7irhbYCWZ5yJbcMmnkFp_UfS4PYnvRFSPF7XXo,11349
343
343
  pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
344
344
  pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
345
345
  pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
346
- pygpt_net/data/config/config.json,sha256=DUf0m1LtMcAg4lRCztxceDZ81yTIFmxakacp2-8TduE,24924
347
- pygpt_net/data/config/models.json,sha256=OKm6IhIcxgPghfc3h-UQWI72igH2BqXMo3H9C2vgq20,109650
346
+ pygpt_net/data/config/config.json,sha256=4tWRTdqanNaSCrFx7ezZPnb-GEm5_78UqYuqguUwqPE,24924
347
+ pygpt_net/data/config/models.json,sha256=frsKP2IHdlXEdkNOV0X-DLMz3lykgFedlmCyG2agEfg,109650
348
348
  pygpt_net/data/config/modes.json,sha256=M882iiqX_R2sNQl9cqZ3k-uneEvO9wpARtHRMLx_LHw,2265
349
349
  pygpt_net/data/config/presets/agent_code_act.json,sha256=GYHqhxtKFLUCvRI3IJAJ7Qe1k8yD9wGGNwManldWzlI,754
350
350
  pygpt_net/data/config/presets/agent_openai.json,sha256=bpDJgLRey_effQkzFRoOEGd4aHUrmzeODSDdNzrf62I,730
@@ -1603,14 +1603,14 @@ pygpt_net/data/js/katex/fonts/KaTeX_Typewriter-Regular.woff2,sha256=cdUX1ngneHz6
1603
1603
  pygpt_net/data/js/katex/katex.min.css,sha256=lVaKnUaQNG4pI71WHffQZVALLQF4LMZEk4nOia8U9ow,23532
1604
1604
  pygpt_net/data/js/katex/katex.min.js,sha256=KLASOtKS2x8pUxWVzCDmlWJ4jhuLb0vtrgakbD6gDDo,276757
1605
1605
  pygpt_net/data/languages.csv,sha256=fvtER6vnTXFHQslCh-e0xCfZDQ-ijgW4GYpOJG4U7LY,8289
1606
- pygpt_net/data/locale/locale.de.ini,sha256=OAIMkRf3jn3dL0nmgAGy-_x396cEo2Pq1ueA8rHKOBg,100053
1607
- pygpt_net/data/locale/locale.en.ini,sha256=WZbA60fvPYfkFslcUc_MpXxQdgOS76c39nVzQpQpq10,90669
1608
- pygpt_net/data/locale/locale.es.ini,sha256=dxTi0doVys5nc50_hiPM1nq5qT_PEdCQ-I5mz_jzErA,100611
1609
- pygpt_net/data/locale/locale.fr.ini,sha256=9jhKAt89WgH_jabmWe56_22SIprAqtygcJQD1Xn6x14,103350
1610
- pygpt_net/data/locale/locale.it.ini,sha256=GDgWt7Hr66LSeGJOwtXBqEe8RMXQzunN7mrRSw9X3GA,98423
1611
- pygpt_net/data/locale/locale.pl.ini,sha256=L8woS3AAtQY60QK3XTXE0yB0cfPtJHgYLxuhvVd-zm8,98104
1612
- pygpt_net/data/locale/locale.uk.ini,sha256=b2ozaT6zFkt3I-E_bsOXQqzmQ_S-Y7hvquTYi_apIVw,136863
1613
- pygpt_net/data/locale/locale.zh.ini,sha256=_MsyjgcUBrAzxaQbbbuY_lLdDetjFGhnZUrfMSX0zcY,87622
1606
+ pygpt_net/data/locale/locale.de.ini,sha256=ERoIXnA8Atyzm5EOh6By1psT62ZqSYjkjVPHDasRPR8,100092
1607
+ pygpt_net/data/locale/locale.en.ini,sha256=0UUdtIC5S4zK9F2FfjX6AasDJ-LmBiHA4DtyBcZBn7Q,90709
1608
+ pygpt_net/data/locale/locale.es.ini,sha256=bImZrxHRY4yTuAlVznzQCn8mK4zB88p0Y0UUNzVOI4Y,100658
1609
+ pygpt_net/data/locale/locale.fr.ini,sha256=Z-1LvfecWp4ZMZf-9HqFddcoBbVxUWMKzSID86wASzk,103400
1610
+ pygpt_net/data/locale/locale.it.ini,sha256=-K3NkIURZ5gK1JPwjk_7GwCCH6TUqI9aUZDKoq8jL1o,98471
1611
+ pygpt_net/data/locale/locale.pl.ini,sha256=ZEoJJZqo0eptaoJI5tDPRq14leoYdO9LdKMDnMSqJ_Y,98152
1612
+ pygpt_net/data/locale/locale.uk.ini,sha256=NqaflpbTBUfOwUUPmI1_TxgTfCh6h9k3UHI4zupMPaI,136948
1613
+ pygpt_net/data/locale/locale.zh.ini,sha256=VuAe2oKEuHYWo0NyO8YCz11OKXunHjVUm6YaVclL3JE,87662
1614
1614
  pygpt_net/data/locale/plugin.agent.de.ini,sha256=BY28KpfFvgfVYJzcw2o5ScWnR4uuErIYGyc3NVHlmTw,1714
1615
1615
  pygpt_net/data/locale/plugin.agent.en.ini,sha256=HwOWCI7e8uzlIgyRWRVyr1x6Xzs8Xjv5pfEc7jfLOo4,1728
1616
1616
  pygpt_net/data/locale/plugin.agent.es.ini,sha256=bqaJQne8HPKFVtZ8Ukzo1TSqVW41yhYbGUqW3j2x1p8,1680
@@ -2437,8 +2437,8 @@ pygpt_net/ui/widget/textarea/web.py,sha256=3XA7Ue8PtxYkVbZRaOPIGjpC5Iko37RlxfO35
2437
2437
  pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2438
2438
  pygpt_net/ui/widget/vision/camera.py,sha256=T8b5cmK6uhf_WSSxzPt_Qod8JgMnst6q8sQqRvgQiSA,2584
2439
2439
  pygpt_net/utils.py,sha256=gGbw-lBTodGg_uBx6zKEwa58GaVNZN1I9zY_ZDyJ9xg,8872
2440
- pygpt_net-2.6.13.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2441
- pygpt_net-2.6.13.dist-info/METADATA,sha256=R_jmkQKpFEVHUQXvknuy-Rqcp0IC5u9bWDBl9Q0sSwQ,189510
2442
- pygpt_net-2.6.13.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2443
- pygpt_net-2.6.13.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2444
- pygpt_net-2.6.13.dist-info/RECORD,,
2440
+ pygpt_net-2.6.15.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2441
+ pygpt_net-2.6.15.dist-info/METADATA,sha256=AuKInUFuLHkfobwJiW8hZPv_0N85UWvWFhH9iMI9Lhw,189906
2442
+ pygpt_net-2.6.15.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2443
+ pygpt_net-2.6.15.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2444
+ pygpt_net-2.6.15.dist-info/RECORD,,