pygpt-net 2.4.50__py3-none-any.whl → 2.4.51__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,10 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 2.4.51 (2025-01-17)
4
+
5
+ - Added a "Continuous recording" mode under Audio Input in the Notepad tab, allowing for recording long voice notes and real-time auto-transcription. (beta)
6
+ - A new option has been added in Settings -> Audio -> Continuous recording auto-transcribe interval.
7
+
3
8
  ## 2.4.50 (2025-01-16)
4
9
 
5
10
  - Refactored audio input core.
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.50** | build: **2025.01.16** | Python: **>=3.10, <3.13**
5
+ Release: **2.4.51** | build: **2025.01.17** | Python: **>=3.10, <3.13**
6
6
 
7
7
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
8
8
  >
@@ -3953,6 +3953,11 @@ may consume additional tokens that are not displayed in the main window.
3953
3953
 
3954
3954
  ## Recent changes:
3955
3955
 
3956
+ **2.4.51 (2025-01-17)**
3957
+
3958
+ - Added a "Continuous recording" mode under Audio Input in the Notepad tab, allowing for recording long voice notes and real-time auto-transcription. (beta)
3959
+ - A new option has been added in Settings -> Audio -> Continuous recording auto-transcribe interval.
3960
+
3956
3961
  **2.4.50 (2025-01-16)**
3957
3962
 
3958
3963
  - Refactored audio input core.
@@ -3983,67 +3988,6 @@ may consume additional tokens that are not displayed in the main window.
3983
3988
  - Introduced a new mode in "Chat with Files": "Retrieve Only", which allows for retrieving raw documents from the index.
3984
3989
  - Fixed a bug related to tool calls in the Gemini provider when using Chat with Files mode.
3985
3990
 
3986
- **2.4.45 (2024-12-16)**
3987
-
3988
- - Enhanced web data loaders UI.
3989
-
3990
- **2.4.44 (2024-12-16)**
3991
-
3992
- - Enhanced web data loaders.
3993
- - Web loaders have been added to attachments, allowing external web content to be attached to context via the "+Web" button in the Attachments tab.
3994
- - Improved handling of attachments in groups and added an attachment icon when a group contains attachments.
3995
-
3996
- **2.4.43 (2024-12-15)**
3997
-
3998
- - Fix: Bug on attachment upload.
3999
- - Added: Attachments uploaded in groups are now available for all contexts in the group (beta).
4000
-
4001
- **2.4.42 (2024-12-15)**
4002
-
4003
- - Added Mailer plugin, which allows sending and retrieving emails from the server, and reading them. It currently supports only SMTP.
4004
- - Added 'web_request' command to the Web Search plugin, enabling GET/POST/PUT and other connections to any address and API endpoint. It also supports sending POST data, files, headers, cookies, and more.
4005
- - Improved audio output.
4006
- - Enhanced visibility of the Video menu.
4007
- - Other fixes.
4008
-
4009
- **2.4.41 (2024-12-14)**
4010
-
4011
- - Improved switching between columns on a split screen.
4012
- - Added visual identification of the active column.
4013
-
4014
- **2.4.40 (2024-12-13)**
4015
-
4016
- - Enhanced Split Screen mode, now promoted from beta to stable.
4017
- - Python Code Interpreter tool added to the Tabs.
4018
- - HTML/JS Canvas tool added to the Tabs.
4019
- - Added attachment icon to the context list if context has attachments.
4020
- - Improved audio playback.
4021
- - Improved web search.
4022
- - Added a thumbnail image to web search results.
4023
- - Added a new commands to web search: "extract_images" and "extract_links".
4024
- - Added the option "Use raw content (without summarization)" to the web search plugin, which provides a more detailed result to the main model.
4025
- - Extended the default maximum result characters to 50,000 in the web search plugin.
4026
-
4027
- **2.4.39 (2024-12-09)**
4028
-
4029
- - Added "Split Screen" mode (accessible via the switch in the bottom-right corner of the screen), which allows you to work in two windows simultaneously. It is currently experimental (beta). Future updates will include Code Interpreter and Canvas running in tabs.
4030
-
4031
- - Fixed: Language switch.
4032
-
4033
- **2.4.38 (2024-12-08)**
4034
-
4035
- - Added the ability to select a style for chat display between: Blocks, ChatGPT-like, and ChatGPT-like Wide. New option in the menu: Config -> Theme -> Style...
4036
- - Added configuration options for audio input in Settings -> Audio -> Audio Input Device, Channels, and Sampling rate.
4037
-
4038
- **2.4.37 (2024-11-30)**
4039
-
4040
- - The `Query only` mode in `Uploaded` tab has been renamed to `RAG`.
4041
- - New options have been added under `Settings -> Files and Attachments`:
4042
- - `Use history in RAG query`: When enabled, the content of the entire conversation will be used when preparing a query if the mode is set to RAG or Summary.
4043
- - `RAG limit`: This option is applicable only if 'Use history in RAG query' is enabled. It specifies the limit on how many recent entries in the conversation will be used when generating a query for RAG. A value of 0 indicates no limit.
4044
- - Cache: dynamic parts of the system prompt (from plugins) have been moved to the very end of the prompt stack to enable the use of prompt cache mechanisms in OpenAI.
4045
-
4046
-
4047
3991
  # Credits and links
4048
3992
 
4049
3993
  **Official website:** <https://pygpt.net>
pygpt_net/CHANGELOG.txt CHANGED
@@ -1,3 +1,8 @@
1
+ 2.4.51 (2025-01-17)
2
+
3
+ - Added a "Continuous recording" mode under Audio Input in the Notepad tab, allowing for recording long voice notes and real-time auto-transcription. (beta)
4
+ - A new option has been added in Settings -> Audio -> Continuous recording auto-transcribe interval.
5
+
1
6
  2.4.50 (2025-01-16)
2
7
 
3
8
  - Refactored audio input core.
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.01.16 17:00:00 #
9
+ # Updated Date: 2025.01.17 03: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.4.50"
17
- __build__ = "2025.01.16"
16
+ __version__ = "2.4.51"
17
+ __build__ = "2025.01.17"
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"
@@ -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.12.14 18:00:00 #
9
+ # Updated Date: 2025.01.17 02:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -29,6 +29,8 @@ class Audio:
29
29
  def setup(self):
30
30
  """Setup controller"""
31
31
  self.update()
32
+ if self.window.core.config.get("audio.input.continuous", False):
33
+ self.window.ui.plugin_addon['audio.input.btn'].continuous.setChecked(True)
32
34
 
33
35
  def toggle_input(
34
36
  self,
@@ -54,6 +56,18 @@ class Audio:
54
56
  else:
55
57
  self.enable_output()
56
58
 
59
+ def toggle_continuous(self, state: bool):
60
+ """
61
+ Toggle continuous audio input
62
+
63
+ :param state: True to enable, False to disable
64
+ """
65
+ if state:
66
+ self.window.core.config.set("audio.input.continuous", True)
67
+ else:
68
+ self.window.core.config.set("audio.input.continuous", False)
69
+ self.window.core.config.save()
70
+
57
71
  def enable_output(self):
58
72
  """Enable audio output"""
59
73
  self.toggle_output_icon(True)
@@ -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.12.09 00:00:00 #
9
+ # Updated Date: 2025.01.17 02:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Qt
@@ -46,6 +46,7 @@ class Custom:
46
46
 
47
47
  # checkboxes
48
48
  self.window.ui.plugin_addon['audio.input'].btn_toggle.setText(trans('audio.speak.btn'))
49
+ self.window.ui.plugin_addon['audio.input.btn'].continuous.setText(trans('audio.speak.btn.continuous'))
49
50
  self.window.ui.config['assistant']['tool.file_search'].box.setText(trans('assistant.tool.file_search'))
50
51
  self.window.ui.config['assistant']['tool.code_interpreter'].box.setText(
51
52
  trans('assistant.tool.code_interpreter')
@@ -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.12.14 07:00:00 #
9
+ # Updated Date: 2025.01.17 02:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from typing import Any, Optional
@@ -182,6 +182,12 @@ class Tabs:
182
182
  if prev_tab != idx or prev_column != column_idx:
183
183
  self.window.dispatch(AppEvent(AppEvent.TAB_SELECTED)) # app event
184
184
 
185
+ # show/hide audio record footer
186
+ if tab.type == Tab.TAB_NOTEPAD:
187
+ self.window.ui.plugin_addon['audio.input.btn'].notepad_footer.setVisible(True)
188
+ else:
189
+ self.window.ui.plugin_addon['audio.input.btn'].notepad_footer.setVisible(False)
190
+
185
191
  self.window.controller.ui.update()
186
192
  self.update_current()
187
193
 
@@ -6,13 +6,16 @@
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.01.16 17:00:00 #
9
+ # Updated Date: 2025.01.17 02:00:00 #
10
10
  # ================================================== #
11
11
 
12
+ import time
13
+
12
14
  import numpy as np
13
15
  import wave
14
16
 
15
17
  from PySide6.QtMultimedia import QAudioFormat, QMediaDevices, QAudioSource
18
+ from PySide6.QtCore import QTimer
16
19
 
17
20
  class Capture:
18
21
  def __init__(self, window=None):
@@ -28,6 +31,9 @@ class Capture:
28
31
  self.actual_audio_format = None
29
32
  self.path = None
30
33
  self.disconnected = False
34
+ self.loop = False
35
+ self.stop_callback = None
36
+ self.start_time = 0
31
37
  self.devices = []
32
38
  self.selected_device = None
33
39
  self.bar = None
@@ -100,6 +106,7 @@ class Capture:
100
106
 
101
107
  # Set up audio input and start recording
102
108
  self.setup_audio_input()
109
+ self.start_time = time.time()
103
110
  return True
104
111
 
105
112
  def stop(self):
@@ -199,6 +206,7 @@ class Capture:
199
206
 
200
207
  def process_audio_input(self):
201
208
  """Process incoming audio data"""
209
+ # add seconds to stop timer
202
210
  data = self.audio_io_device.readAll()
203
211
  if data.isEmpty():
204
212
  return
@@ -239,6 +247,16 @@ class Capture:
239
247
  # Update the level bar widget
240
248
  self.update_audio_level(level_percent)
241
249
 
250
+ # Handle loop recording
251
+ if self.loop and self.stop_callback is not None:
252
+ stop_interval = int(self.window.core.config.get('audio.input.stop_interval', 10))
253
+ current_time = time.time()
254
+ time_elapsed = current_time - self.start_time
255
+ if time_elapsed >= stop_interval:
256
+ # stop recording here, save audio chunk to WAV file, run transcription, and start recording again
257
+ self.start_time = current_time
258
+ QTimer.singleShot(0, self.stop_callback) # required QTimer to prevent crash!!!
259
+
242
260
  def update_audio_level(self, level: int):
243
261
  """
244
262
  Update the audio level bar
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.50",
4
- "app.version": "2.4.50",
5
- "updated_at": "2025-01-16T00:00:00"
3
+ "version": "2.4.51",
4
+ "app.version": "2.4.51",
5
+ "updated_at": "2025-01-17T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
8
8
  "access.audio.event.speech.disabled": [],
@@ -74,8 +74,10 @@
74
74
  "attachments_send_clear": true,
75
75
  "attachments_capture_clear": true,
76
76
  "audio.input.channels": 1,
77
+ "audio.input.continuous": false,
77
78
  "audio.input.device": "0",
78
79
  "audio.input.rate": 44100,
80
+ "audio.input.stop_interval": 10,
79
81
  "audio.transcribe.convert_video": true,
80
82
  "context_threshold": 200,
81
83
  "cmd": false,
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.50",
4
- "app.version": "2.4.50",
5
- "updated_at": "2025-01-16T00:00:00"
3
+ "version": "2.4.51",
4
+ "app.version": "2.4.51",
5
+ "updated_at": "2025-01-17T00:00:00"
6
6
  },
7
7
  "items": {
8
8
  "claude-3-5-sonnet-20240620": {
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.4.50",
4
- "app.version": "2.4.50",
5
- "updated_at": "2025-01-16T00:00:00"
3
+ "version": "2.4.51",
4
+ "app.version": "2.4.51",
5
+ "updated_at": "2025-01-17T00:00:00"
6
6
  },
7
7
  "items": {
8
8
  "chat": {
@@ -1123,6 +1123,19 @@
1123
1123
  "step": 1,
1124
1124
  "advanced": false
1125
1125
  },
1126
+ "audio.input.stop_interval": {
1127
+ "section": "audio",
1128
+ "type": "int",
1129
+ "slider": true,
1130
+ "label": "settings.audio.input.stop_interval",
1131
+ "description": "settings.audio.input.stop_interval.desc",
1132
+ "value": 10,
1133
+ "min": 5,
1134
+ "max": 120,
1135
+ "multiplier": 1,
1136
+ "step": 1,
1137
+ "advanced": false
1138
+ },
1126
1139
  "llama.idx.list": {
1127
1140
  "section": "llama-index",
1128
1141
  "type": "dict",
@@ -135,6 +135,7 @@ audio.magic_word.detected = Zauberwort erkannt!
135
135
  audio.magic_word.invalid = Kein Zauberwort :(
136
136
  audio.magic_word.please = Bitte das Zauberwort...
137
137
  audio.speak.btn = Mikrofon
138
+ audio.speak.btn.continuous = Kontinuierliche Aufzeichnung
138
139
  audio.speak.btn.stop = Stopp
139
140
  audio.speak.btn.stop.tooltip = Klicken, um das Mikrofonhören zu beenden
140
141
  audio.speak.btn.tooltip = Klicken, um das Mikrofonhören zu starten
@@ -774,6 +775,8 @@ settings.audio.input.device = Audioeingabegerät
774
775
  settings.audio.input.device.desc = Wählen Sie das Audiogerät für die Mikrofoneingabe.
775
776
  settings.audio.input.rate = Abtastrate
776
777
  settings.audio.input.rate.desc = Abtastrate, Standard: 44100
778
+ settings.audio.input.stop_interval = Intervall für kontinuierliche automatische Transkription
779
+ settings.audio.input.stop_interval.desc = Intervall in Sekunden für automatisches Transkribieren eines Audioabschnitts, Standard: 10
777
780
  settings.check_updates = Beim Start nach Updates suchen
778
781
  settings.check_updates.bg = Im Hintergrund nach Updates suchen
779
782
  settings.cmd.field.desc = Aktivieren Sie das `{cmd}`-Werkzeug.
@@ -147,6 +147,7 @@ audio.magic_word.detected = Magic word detected!
147
147
  audio.magic_word.invalid = Not a magic word :(
148
148
  audio.magic_word.please = Magic word please...
149
149
  audio.speak.btn = Microphone
150
+ audio.speak.btn.continuous = Continuous recording
150
151
  audio.speak.btn.stop = Stop
151
152
  audio.speak.btn.stop.tooltip = Click to stop microphone listening
152
153
  audio.speak.btn.tooltip = Click to start microphone listening
@@ -945,6 +946,8 @@ settings.audio.input.device = Audio Input Device
945
946
  settings.audio.input.device.desc = Select the audio device for Microphone input.
946
947
  settings.audio.input.rate = Sampling Rate
947
948
  settings.audio.input.rate.desc = Sampling rate, default: 44100
949
+ settings.audio.input.stop_interval = Continuous recording auto-transcribe interval
950
+ settings.audio.input.stop_interval.desc = Interval in seconds for auto-transcribe audio chunk, default: 10
948
951
  settings.check_updates = Check for Updates on start
949
952
  settings.check_updates.bg = Check for Updates in the background
950
953
  settings.cmd.config.collapse = JSON params
@@ -135,6 +135,7 @@ audio.magic_word.detected = ¡Palabra mágica detectada!
135
135
  audio.magic_word.invalid = No es una palabra mágica :(
136
136
  audio.magic_word.please = Por favor, una palabra mágica...
137
137
  audio.speak.btn = Micrófono
138
+ audio.speak.btn.continuous = Grabación continua
138
139
  audio.speak.btn.stop = Detener
139
140
  audio.speak.btn.stop.tooltip = Haz clic para dejar de escuchar a través del micrófono
140
141
  audio.speak.btn.tooltip = Haz clic para empezar a escuchar a través del micrófono
@@ -773,6 +774,8 @@ settings.audio.input.device = Dispositivo de Entrada de Audio
773
774
  settings.audio.input.device.desc = Selecciona el dispositivo de audio para la entrada del micrófono.
774
775
  settings.audio.input.rate = Taux d'échantillonnage
775
776
  settings.audio.input.rate.desc = Taux d'échantillonnage, par défaut : 44100
777
+ settings.audio.input.stop_interval = Intervalo de transcripción automática continua
778
+ settings.audio.input.stop_interval.desc = Intervalo en segundos para transcribir automáticamente el fragmento de audio, predeterminado: 10
776
779
  settings.check_updates = Buscar actualizaciones al iniciar
777
780
  settings.check_updates.bg = Buscar actualizaciones en segundo plano
778
781
  settings.cmd.field.desc = Habilitar la herramienta `{cmd}`.
@@ -135,6 +135,7 @@ audio.magic_word.detected = Mot magique détecté !
135
135
  audio.magic_word.invalid = Pas un mot magique :(
136
136
  audio.magic_word.please = S'il vous plaît, le mot magique...
137
137
  audio.speak.btn = Microphone
138
+ audio.speak.btn.continuous = Enregistrement continu
138
139
  audio.speak.btn.stop = Arrêt
139
140
  audio.speak.btn.stop.tooltip = Cliquez pour arrêter l'écoute par le microphone
140
141
  audio.speak.btn.tooltip = Cliquez pour commencer l'écoute par le microphone
@@ -773,6 +774,8 @@ settings.audio.input.device = Périphérique d'Entrée Audio
773
774
  settings.audio.input.device.desc = Sélectionnez le périphérique audio pour l'entrée du microphone.
774
775
  settings.audio.input.rate = Taux d'échantillonnage
775
776
  settings.audio.input.rate.desc = Taux d'échantillonnage, par défaut : 44100
777
+ settings.audio.input.stop_interval = Intervalle d'auto-transcription enregistrement continu
778
+ settings.audio.input.stop_interval.desc = Intervalle en secondes pour la transcription automatique d'un morceau audio, par défaut : 10
776
779
  settings.check_updates = Vérifier les mises à jour au démarrage
777
780
  settings.check_updates.bg = Vérifier les mises à jour en arrière-plan
778
781
  settings.cmd.field.desc = Activer l'outil `{cmd}`.
@@ -135,6 +135,7 @@ audio.magic_word.detected = Parola magica rilevata!
135
135
  audio.magic_word.invalid = Non è una parola magica :(
136
136
  audio.magic_word.please = Per favore, parola magica...
137
137
  audio.speak.btn = Microfono
138
+ audio.speak.btn.continuous = Registrazione continua
138
139
  audio.speak.btn.stop = Stop
139
140
  audio.speak.btn.stop.tooltip = Clicca per terminare l'ascolto tramite microfono
140
141
  audio.speak.btn.tooltip = Clicca per iniziare l'ascolto tramite microfono
@@ -774,6 +775,8 @@ settings.audio.input.device = Dispositivo di Ingresso Audio
774
775
  settings.audio.input.device.desc = Seleziona il dispositivo audio per l'ingresso del microfono.
775
776
  settings.audio.input.rate = Frequenza di campionamento
776
777
  settings.audio.input.rate.desc = Frequenza di campionamento, predefinito: 44100
778
+ settings.audio.input.stop_interval = Intervallo di trascrizione automatica continua
779
+ settings.audio.input.stop_interval.desc = Intervallo in secondi per la trascrizione automatica del segmento audio, predefinito: 10
777
780
  settings.check_updates = Controlla aggiornamenti all'avvio
778
781
  settings.check_updates.bg = Controlla gli aggiornamenti in background
779
782
  settings.cmd.field.desc = Abilita lo strumento `{cmd}`.
@@ -135,6 +135,7 @@ audio.magic_word.detected = Wykryto magiczne słowo!
135
135
  audio.magic_word.invalid = To nie magiczne słowo :(
136
136
  audio.magic_word.please = Podaj magiczne słowo...
137
137
  audio.speak.btn = Mikrofon
138
+ audio.speak.btn.continuous = Ciągłe nagrywanie
138
139
  audio.speak.btn.stop = Stop
139
140
  audio.speak.btn.stop.tooltip = Kliknij, aby zakończyć nasłuchiwanie przez mikrofon
140
141
  audio.speak.btn.tooltip = Kliknij, aby rozpocząć nasłuchiwanie przez mikrofon
@@ -774,6 +775,8 @@ settings.audio.input.device = Urządzenie Wejściowe Audio
774
775
  settings.audio.input.device.desc = Wybierz urządzenie audio dla wejścia mikrofonu.
775
776
  settings.audio.input.rate = Częstotliwość próbkowania
776
777
  settings.audio.input.rate.desc = Częstotliwość próbkowania, domyślnie: 44100
778
+ settings.audio.input.stop_interval = Interwał automatycznego transkrybowania nagrania ciągłego
779
+ settings.audio.input.stop_interval.desc = Interwał w sekundach dla automatycznego transkrybowania fragmentu audio, domyślnie: 10
777
780
  settings.check_updates = Sprawdź aktualizacje przy starcie
778
781
  settings.check_updates.bg = Sprawdź aktualizacje w tle
779
782
  settings.cmd.field.desc = Włącz narzędzie `{cmd}`.
@@ -135,6 +135,7 @@ audio.magic_word.detected = Магічне слово виявлено!
135
135
  audio.magic_word.invalid = Не магічне слово :(
136
136
  audio.magic_word.please = Магічне слово, будь ласка...
137
137
  audio.speak.btn = Мікрофон
138
+ audio.speak.btn.continuous = Безперервний запис
138
139
  audio.speak.btn.stop = Стоп
139
140
  audio.speak.btn.stop.tooltip = Натисніть, щоб закінчити слухання через мікрофон
140
141
  audio.speak.btn.tooltip = Натисніть, щоб почати слухання через мікрофон
@@ -773,6 +774,8 @@ settings.audio.input.device = Аудіо Вхідний Пристрій
773
774
  settings.audio.input.device.desc = Виберіть аудіо пристрій для введення мікрофона.
774
775
  settings.audio.input.rate = Частота дискретизації
775
776
  settings.audio.input.rate.desc = Частота дискретизації, за замовчуванням: 44100
777
+ settings.audio.input.stop_interval = Інтервал автоматичного транскрибування безперервного запису
778
+ settings.audio.input.stop_interval.desc = Інтервал у секундах для автоматичного транскрибування фрагмента аудіо, за замовчуванням: 10
776
779
  settings.check_updates = Перевіряти оновлення при запуску
777
780
  settings.check_updates.bg = Перевіряти оновлення у фоновому режимі
778
781
  settings.cmd.field.desc = Увімкнути інструмент `{cmd}`.
@@ -136,6 +136,7 @@ audio.control.btn = 语音控制
136
136
  audio.magic_word.detected = 檢測到魔法詞!
137
137
  audio.magic_word.invalid= 不是魔法詞 :(
138
138
  audio.magic_word.please= 請說出魔法詞...
139
+ audio.speak.btn.continuous = 连续录音
139
140
  audio.speak.btn.stop = 停止
140
141
  audio.speak.btn.stop.tooltip = 點擊停止麥克風聆聽
141
142
  audio.speak.btn.tooltip = 點擊開始麥克風聆聽
@@ -875,6 +876,8 @@ settings.audio.input.device = 音频输入设备
875
876
  settings.audio.input.device.desc = 选择用于麦克风输入的音频设备。
876
877
  settings.audio.input.rate = 采样率
877
878
  settings.audio.input.rate.desc = 采样率,默认: 44100
879
+ settings.audio.input.stop_interval = 连续录音自动转录间隔
880
+ settings.audio.input.stop_interval.desc = 自动转录音频片段的间隔(以秒为单位),默认:10
878
881
  settings.check_updates = 啟動時檢查更新
879
882
  settings.check_updates.bg = 在後台檢查更新
880
883
  settings.cmd.field.desc = 启用 `{cmd}` 工具。
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.01.16 17:00:00 #
9
+ # Updated Date: 2025.01.17 02:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -14,6 +14,7 @@ import os
14
14
  from PySide6.QtCore import QTimer
15
15
 
16
16
  from pygpt_net.core.events import AppEvent
17
+ from pygpt_net.core.tabs.tab import Tab
17
18
  from pygpt_net.utils import trans
18
19
 
19
20
 
@@ -54,8 +55,20 @@ class Simple:
54
55
  """Stop timeout"""
55
56
  self.stop_recording(timeout=True)
56
57
 
57
- def start_recording(self):
58
- """Start recording"""
58
+ def start_recording(self, force: bool = False):
59
+ """
60
+ Start recording
61
+
62
+ :param force: True to force recording
63
+ """
64
+ # enable continuous mode if notepad tab is active
65
+ self.plugin.window.core.audio.capture.stop_callback = self.on_stop
66
+ continuous_enabled = self.plugin.window.core.config.get('audio.input.continuous', False)
67
+ if continuous_enabled and self.plugin.window.controller.ui.tabs.get_current_type() == Tab.TAB_NOTEPAD:
68
+ self.plugin.window.core.audio.capture.loop = True # set loop
69
+ else:
70
+ self.plugin.window.core.audio.capture.loop = False
71
+
59
72
  try:
60
73
  # stop audio output if playing
61
74
  if self.plugin.window.controller.audio.is_playing():
@@ -72,11 +85,12 @@ class Simple:
72
85
  self.timer.timeout.connect(self.stop_timeout)
73
86
  self.timer.start(self.TIMEOUT_SECONDS * 1000)
74
87
 
75
- if not self.plugin.window.core.audio.capture.check_audio_input():
76
- raise Exception("Audio input not working.")
77
- # IMPORTANT!!!!
78
- # Stop here if audio input not working!
79
- # This prevents the app from freezing when audio input is not working!
88
+ if not force:
89
+ if not self.plugin.window.core.audio.capture.check_audio_input():
90
+ raise Exception("Audio input not working.")
91
+ # IMPORTANT!!!!
92
+ # Stop here if audio input not working!
93
+ # This prevents the app from freezing when audio input is not working!
80
94
 
81
95
  self.is_recording = True
82
96
  self.switch_btn_stop()
@@ -128,3 +142,12 @@ class Simple:
128
142
  self.plugin.handle_thread(True) # handle transcription in simple mode
129
143
  else:
130
144
  self.plugin.window.update_status("")
145
+
146
+
147
+ def on_stop(self):
148
+ """Handle auto-transcribe"""
149
+ path = os.path.join(self.plugin.window.core.config.path, self.plugin.input_file)
150
+ self.plugin.window.core.audio.capture.set_path(path)
151
+ self.plugin.window.core.audio.capture.stop()
152
+ self.plugin.window.core.audio.capture.start()
153
+ self.plugin.handle_thread(True)
@@ -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.12.16 20:00:00 #
9
+ # Updated Date: 2025.01.17 02:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import copy
@@ -1803,6 +1803,14 @@ class Patch:
1803
1803
  data["api_key_hugging_face"] = ""
1804
1804
  updated = True
1805
1805
 
1806
+ # < 2.4.51
1807
+ if old < parse_version("2.4.51"):
1808
+ print("Migrating config from < 2.4.51...")
1809
+ if 'audio.input.stop_interval' not in data:
1810
+ data["audio.input.stop_interval"] = 10
1811
+ if 'audio.input.continuous' not in data:
1812
+ data["audio.input.continuous"] = False
1813
+
1806
1814
  # update file
1807
1815
  migrated = False
1808
1816
  if updated:
@@ -160,24 +160,12 @@ class Input:
160
160
 
161
161
  grid = QGridLayout()
162
162
 
163
- #left_layout = QHBoxLayout()
164
- #left_layout.addWidget(self.window.ui.nodes['input.label'])
165
- #left_layout.addWidget(self.window.ui.nodes['inline.vision'])
166
- #left_layout.addStretch(1)
167
-
168
163
  center_layout = QHBoxLayout()
169
164
  center_layout.addStretch()
170
165
  center_layout.addWidget(self.window.ui.plugin_addon['audio.input'])
171
166
  center_layout.addWidget(self.window.ui.plugin_addon['audio.input.btn'])
172
167
  center_layout.addStretch()
173
-
174
- #right_layout = QHBoxLayout()
175
- #right_layout.addStretch(1)
176
- #right_layout.addWidget(self.window.ui.nodes['input.counter'])
177
-
178
- #grid.addLayout(left_layout, 0, 0)
179
168
  grid.addLayout(center_layout, 0, 1, alignment=Qt.AlignCenter)
180
- #grid.addLayout(right_layout, 0, 2, alignment=Qt.AlignRight)
181
169
 
182
170
  grid.setContentsMargins(0, 0, 0, 0)
183
171
  return grid
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2025.01.16 01:00:00 #
9
+ # Updated Date: 2025.01.17 02:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from .about import About
@@ -50,15 +50,16 @@ class Menu:
50
50
  self.audio.setup()
51
51
  self.video.setup()
52
52
  self.config.setup()
53
- self.about.setup()
54
53
 
55
54
  def post_setup(self):
56
55
  """Post setup menus"""
57
56
  # tools menu
58
57
  self.tools.setup()
59
- self.donate.setup()
58
+ self.about.setup()
60
59
 
61
60
  # debug menu
62
61
  show = self.window.core.config.get('debug')
63
62
  self.debug.setup()
64
63
  self.window.ui.menu['menu.debug'].menuAction().setVisible(show)
64
+
65
+ self.donate.setup()
@@ -6,15 +6,17 @@
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.01.16 17:00:00 #
9
+ # Updated Date: 2025.01.17 02:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from PySide6.QtCore import Qt
13
- from PySide6.QtGui import QPainter
13
+ from PySide6.QtGui import QPainter, QIcon
14
14
  from PySide6.QtWidgets import QLabel, QHBoxLayout, QWidget, QPushButton, QVBoxLayout
15
15
 
16
16
  from pygpt_net.core.events import Event, AppEvent
17
+ from pygpt_net.ui.widget.option.toggle_label import ToggleLabel
17
18
  from pygpt_net.utils import trans
19
+ import pygpt_net.icons_rc
18
20
 
19
21
  class VoiceControlButton(QWidget):
20
22
  def __init__(self, window=None):
@@ -26,7 +28,7 @@ class VoiceControlButton(QWidget):
26
28
  super(VoiceControlButton, self).__init__(window)
27
29
  self.window = window
28
30
 
29
- self.btn_toggle = QPushButton(trans('audio.control.btn'))
31
+ self.btn_toggle = QPushButton(QIcon(":/icons/mic.svg"), trans('audio.control.btn'))
30
32
  self.btn_toggle.clicked.connect(self.toggle_recording)
31
33
  self.btn_toggle.setToolTip(trans('audio.speak.btn.tooltip'))
32
34
  self.btn_toggle.setCursor(Qt.PointingHandCursor)
@@ -81,7 +83,7 @@ class AudioInputButton(QWidget):
81
83
  super(AudioInputButton, self).__init__(window)
82
84
  self.window = window
83
85
 
84
- self.btn_toggle = QPushButton(trans('audio.speak.btn'))
86
+ self.btn_toggle = QPushButton(QIcon(":/icons/mic.svg"), trans('audio.speak.btn'))
85
87
  self.btn_toggle.clicked.connect(self.toggle_recording)
86
88
  self.btn_toggle.setToolTip(trans('audio.speak.btn.tooltip'))
87
89
  self.btn_toggle.setCursor(Qt.PointingHandCursor)
@@ -90,20 +92,34 @@ class AudioInputButton(QWidget):
90
92
  self.bar = LevelBar(self)
91
93
  self.bar.setLevel(0)
92
94
 
93
- # status
94
- #self.status = QLabel("xxx")
95
- #self.status.setStyleSheet("color: #999; font-size: 10px; font-weight: 400; margin: 0; padding: 0; border: 0;")
96
- #self.status.setMaximumHeight(15)
95
+ btn_layout = QVBoxLayout()
96
+ btn_layout.addWidget(self.btn_toggle)
97
+ btn_layout.addWidget(self.bar)
98
+ btn_layout.setContentsMargins(0, 0, 0, 0)
99
+ btn_widget = QWidget()
100
+ btn_widget.setLayout(btn_layout)
97
101
 
98
- self.layout = QVBoxLayout(self)
99
- self.layout.addWidget(self.btn_toggle)
100
- #self.layout.addWidget(self.status)
101
- self.layout.addWidget(self.bar)
102
+ self.continuous = ToggleLabel(trans('audio.speak.btn.continuous'), label_position="right")
103
+ self.continuous.box.stateChanged.connect(
104
+ lambda: self.window.controller.audio.toggle_continuous(
105
+ self.continuous.box.isChecked())
106
+ )
107
+
108
+ self.notepad_layout = QHBoxLayout()
109
+ self.notepad_layout.addWidget(self.continuous)
110
+ self.notepad_layout.setContentsMargins(0, 0, 0, 0)
111
+
112
+ self.notepad_footer = QWidget()
113
+ self.notepad_footer.setLayout(self.notepad_layout)
114
+
115
+ self.layout = QHBoxLayout()
116
+ self.layout.addWidget(btn_widget)
117
+ self.layout.addWidget(self.notepad_footer)
118
+ self.layout.setContentsMargins(0, 0, 0, 0)
102
119
 
103
- # self.layout.addWidget(self.stop)
104
- self.layout.setAlignment(Qt.AlignCenter)
105
120
  self.setLayout(self.layout)
106
- self.setMaximumHeight(80)
121
+ btn_widget.setMaximumHeight(80)
122
+ self.setMaximumHeight(120)
107
123
 
108
124
  def add_widget(self, widget):
109
125
  """
@@ -113,14 +129,6 @@ class AudioInputButton(QWidget):
113
129
  """
114
130
  self.layout.addWidget(widget)
115
131
 
116
- def set_status(self, text):
117
- """
118
- Set status text
119
-
120
- :param text: text
121
- """
122
- self.status.setText(text)
123
-
124
132
  def toggle_recording(self):
125
133
  """Toggle recording"""
126
134
  event = Event(Event.AUDIO_INPUT_RECORD_TOGGLE)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pygpt-net
3
- Version: 2.4.50
3
+ Version: 2.4.51
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
@@ -93,7 +93,7 @@ Description-Content-Type: text/markdown
93
93
 
94
94
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
95
95
 
96
- Release: **2.4.50** | build: **2025.01.16** | Python: **>=3.10, <3.13**
96
+ Release: **2.4.51** | build: **2025.01.17** | Python: **>=3.10, <3.13**
97
97
 
98
98
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
99
99
  >
@@ -4044,6 +4044,11 @@ may consume additional tokens that are not displayed in the main window.
4044
4044
 
4045
4045
  ## Recent changes:
4046
4046
 
4047
+ **2.4.51 (2025-01-17)**
4048
+
4049
+ - Added a "Continuous recording" mode under Audio Input in the Notepad tab, allowing for recording long voice notes and real-time auto-transcription. (beta)
4050
+ - A new option has been added in Settings -> Audio -> Continuous recording auto-transcribe interval.
4051
+
4047
4052
  **2.4.50 (2025-01-16)**
4048
4053
 
4049
4054
  - Refactored audio input core.
@@ -4074,67 +4079,6 @@ may consume additional tokens that are not displayed in the main window.
4074
4079
  - Introduced a new mode in "Chat with Files": "Retrieve Only", which allows for retrieving raw documents from the index.
4075
4080
  - Fixed a bug related to tool calls in the Gemini provider when using Chat with Files mode.
4076
4081
 
4077
- **2.4.45 (2024-12-16)**
4078
-
4079
- - Enhanced web data loaders UI.
4080
-
4081
- **2.4.44 (2024-12-16)**
4082
-
4083
- - Enhanced web data loaders.
4084
- - Web loaders have been added to attachments, allowing external web content to be attached to context via the "+Web" button in the Attachments tab.
4085
- - Improved handling of attachments in groups and added an attachment icon when a group contains attachments.
4086
-
4087
- **2.4.43 (2024-12-15)**
4088
-
4089
- - Fix: Bug on attachment upload.
4090
- - Added: Attachments uploaded in groups are now available for all contexts in the group (beta).
4091
-
4092
- **2.4.42 (2024-12-15)**
4093
-
4094
- - Added Mailer plugin, which allows sending and retrieving emails from the server, and reading them. It currently supports only SMTP.
4095
- - Added 'web_request' command to the Web Search plugin, enabling GET/POST/PUT and other connections to any address and API endpoint. It also supports sending POST data, files, headers, cookies, and more.
4096
- - Improved audio output.
4097
- - Enhanced visibility of the Video menu.
4098
- - Other fixes.
4099
-
4100
- **2.4.41 (2024-12-14)**
4101
-
4102
- - Improved switching between columns on a split screen.
4103
- - Added visual identification of the active column.
4104
-
4105
- **2.4.40 (2024-12-13)**
4106
-
4107
- - Enhanced Split Screen mode, now promoted from beta to stable.
4108
- - Python Code Interpreter tool added to the Tabs.
4109
- - HTML/JS Canvas tool added to the Tabs.
4110
- - Added attachment icon to the context list if context has attachments.
4111
- - Improved audio playback.
4112
- - Improved web search.
4113
- - Added a thumbnail image to web search results.
4114
- - Added a new commands to web search: "extract_images" and "extract_links".
4115
- - Added the option "Use raw content (without summarization)" to the web search plugin, which provides a more detailed result to the main model.
4116
- - Extended the default maximum result characters to 50,000 in the web search plugin.
4117
-
4118
- **2.4.39 (2024-12-09)**
4119
-
4120
- - Added "Split Screen" mode (accessible via the switch in the bottom-right corner of the screen), which allows you to work in two windows simultaneously. It is currently experimental (beta). Future updates will include Code Interpreter and Canvas running in tabs.
4121
-
4122
- - Fixed: Language switch.
4123
-
4124
- **2.4.38 (2024-12-08)**
4125
-
4126
- - Added the ability to select a style for chat display between: Blocks, ChatGPT-like, and ChatGPT-like Wide. New option in the menu: Config -> Theme -> Style...
4127
- - Added configuration options for audio input in Settings -> Audio -> Audio Input Device, Channels, and Sampling rate.
4128
-
4129
- **2.4.37 (2024-11-30)**
4130
-
4131
- - The `Query only` mode in `Uploaded` tab has been renamed to `RAG`.
4132
- - New options have been added under `Settings -> Files and Attachments`:
4133
- - `Use history in RAG query`: When enabled, the content of the entire conversation will be used when preparing a query if the mode is set to RAG or Summary.
4134
- - `RAG limit`: This option is applicable only if 'Use history in RAG query' is enabled. It specifies the limit on how many recent entries in the conversation will be used when generating a query for RAG. A value of 0 indicates no limit.
4135
- - Cache: dynamic parts of the system prompt (from plugins) have been moved to the very end of the prompt stack to enable the use of prompt cache mechanisms in OpenAI.
4136
-
4137
-
4138
4082
  # Credits and links
4139
4083
 
4140
4084
  **Official website:** <https://pygpt.net>
@@ -1,9 +1,9 @@
1
- CHANGELOG.md,sha256=adPwRkkYgkZHuwQn1IB8ImnyuwtpSXTJoKvdA3zwEzI,81036
2
- README.md,sha256=WheYr0os5j1AVG5X4ifEyjK5swLluh01k7PCv8-wj5k,164973
1
+ CHANGELOG.md,sha256=4oLoH3Rxw--zdbuyLwoQN8yrI-0mjd-f2xqJfAHU7gU,81319
2
+ README.md,sha256=d0H5m0nxaqSnpqEM2179IJM0rWgjpX4PixvGuu8cPaE,162138
3
3
  icon.png,sha256=CzcINJaU23a9hNjsDlDNbyuiEvKZ4Wg6DQVYF6SpuRg,13970
4
- pygpt_net/CHANGELOG.txt,sha256=B1Gu0sgfveaUUwyPeqflV-uSmsdJbE39JSrukL92QM0,79550
4
+ pygpt_net/CHANGELOG.txt,sha256=Fv2tiBgbirays-pRud2sRfvg4s_kwXfwQGcJ_HePcsg,79830
5
5
  pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
6
- pygpt_net/__init__.py,sha256=u1pfEPJl3_fBwyjhEFbmNcNZv1jJ250_17nt8EK9XjY,1307
6
+ pygpt_net/__init__.py,sha256=dB8ngXOeOLIyQL0RbhAyn3X-aWPlR7QwjKOqXj9O8iQ,1307
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
@@ -23,7 +23,7 @@ pygpt_net/controller/assistant/files.py,sha256=0TmDcDyXpmDc7BsCFZaF6Oj-H4Yr4CxOg
23
23
  pygpt_net/controller/assistant/store.py,sha256=t0h5EeJ9d-Cc_KzV6gQ3kZneoIeECp4iVHxvpJhjP-Q,15771
24
24
  pygpt_net/controller/assistant/threads.py,sha256=IUAGvm1qYNXiu6AUOix6T6c3QJsdqHVgCZPHTvtcuJ0,21058
25
25
  pygpt_net/controller/attachment.py,sha256=to7QK1PwvvkW6gBUxXFIm0R_wh9HrgW8raZf9dJgVmo,20397
26
- pygpt_net/controller/audio/__init__.py,sha256=ubQL5uBucuXCEqf2wKHI9uelB-wvrD5kK8cK2wvlLik,10382
26
+ pygpt_net/controller/audio/__init__.py,sha256=FKqbmikOdUTW7oUa9rz46otoA9SOOf2TsDg-M4tUqq8,10923
27
27
  pygpt_net/controller/calendar/__init__.py,sha256=s55RkCFQPFzdDoQ2zp3kohlNdpiWxdSxQtsaROeiigw,4424
28
28
  pygpt_net/controller/calendar/note.py,sha256=y8Gkg35-aM1MfQ9P2NsRnmfSJw4Ps__9g6I1RhonR6s,11428
29
29
  pygpt_net/controller/camera.py,sha256=chf19kngEXzMJt54Gnj1bJGHVsYaCX0QimJnJa9uigE,16207
@@ -71,7 +71,7 @@ pygpt_net/controller/kernel/__init__.py,sha256=5Ks4FDuwxy76BxVF-QOcenCCpCX4byzYb
71
71
  pygpt_net/controller/kernel/reply.py,sha256=-5z1QHsXh2PvtZSC18gXc-fdyVVK5WACiEK_yhNg-a0,5914
72
72
  pygpt_net/controller/kernel/stack.py,sha256=aPLetBoQDKYawQJg8pkAO3tHfJgKwO_NvDOR8F2wJkM,3767
73
73
  pygpt_net/controller/lang/__init__.py,sha256=pTSX0il3xLNGHoh4XAOdIUlbC2f9kIBCzthRDDOjyNY,3287
74
- pygpt_net/controller/lang/custom.py,sha256=sA8fC9CqNNbaJ3cywa4xlZXBTJP9QUWJLa1YliKHPRw,5802
74
+ pygpt_net/controller/lang/custom.py,sha256=o_JpcFmDCkuqzNzA_esX7Ajg61O14tOr17ZKcl393AQ,5913
75
75
  pygpt_net/controller/lang/mapping.py,sha256=nLdY8PzFt-iPcPBmVnth6vtjOQR5qFH9E5oqd4b-znI,23553
76
76
  pygpt_net/controller/lang/plugins.py,sha256=JEiOajXB7BfxPPfBkYl82K1_gKpRVcMEPNPwsNAJ6WU,3879
77
77
  pygpt_net/controller/lang/settings.py,sha256=awPEshWbHlOt11Zyg_uQKlbYjvABXrQ7QMHdpu2L9ZI,2634
@@ -102,7 +102,7 @@ pygpt_net/controller/theme/nodes.py,sha256=6SCKMGQ5SZdKgy4t69raiikTLQDPPkjoYTPwl
102
102
  pygpt_net/controller/tools/__init__.py,sha256=b_yt413iRUI9fWHzZGdtM4333UjzrJb-zmq_exYTgy4,2723
103
103
  pygpt_net/controller/ui/__init__.py,sha256=WsH7OzMS_ixCwuHeSajv2E3irPo9B4H3dQe7Svd_71k,5903
104
104
  pygpt_net/controller/ui/mode.py,sha256=8mw_tmRo7sArvgv-k1yfwx5SCfVOkwdc96U8ZiW83Q0,10231
105
- pygpt_net/controller/ui/tabs.py,sha256=Z3IoZfD_DCYh3-o1ueBiYyu0BNAVjPeYSst4icSrNfk,19789
105
+ pygpt_net/controller/ui/tabs.py,sha256=ExwaheAkekD6tcU7BgriF2h8mO8dWiEQgSA1Xgw60AQ,20067
106
106
  pygpt_net/controller/ui/vision.py,sha256=KrP8wFuuz-gsO9iwbLDnzvC5iqWVlWjFarQ27HkHdEg,2303
107
107
  pygpt_net/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
108
  pygpt_net/core/access/__init__.py,sha256=rFKp9xMsuJHS_wxiMEMMHVRd5lXdkPj7LuObAIdQFBY,942
@@ -125,7 +125,7 @@ pygpt_net/core/attachments/__init__.py,sha256=bUqvfPqlpdXiGf3GvS1kTE45A0Q1Eo3kpU
125
125
  pygpt_net/core/attachments/context.py,sha256=tQM3z_gLI99Ox47XZtVcUnOdfaPYKQwXhm1EJaNikvE,25057
126
126
  pygpt_net/core/attachments/worker.py,sha256=_aUCyi5-Mbz0IGfgY6QKBZ6MFz8aKRDfKasbBVXg7kU,1341
127
127
  pygpt_net/core/audio/__init__.py,sha256=uszH6pqMToDzL0WpPeUvVlyJ8RN4gFmQbsL4GFYMIdc,4521
128
- pygpt_net/core/audio/capture.py,sha256=BBxXM7KxxCxcvN7cW0b5dsSi8BphiLzEfkIt8PfN77Y,10408
128
+ pygpt_net/core/audio/capture.py,sha256=p4ge43IhQ8Um96QFv0tcd4G3h5Cku0P47Mut09YBFaA,11201
129
129
  pygpt_net/core/audio/context.py,sha256=2XpXWhDC09iUvc0FRMq9BF2_rnQ60ZG4Js6LbO5MohY,1115
130
130
  pygpt_net/core/audio/whisper.py,sha256=WZ_fNQ06s1NBxyoYB-lTFqDO6ARcnq9MZFekRaTNxTo,993
131
131
  pygpt_net/core/bridge/__init__.py,sha256=ezS02_2wUrnV6eTF33wfob8rVWM5snfY92-PF_i15uQ,9568
@@ -247,9 +247,9 @@ pygpt_net/css_rc.py,sha256=i13kX7irhbYCWZ5yJbcMmnkFp_UfS4PYnvRFSPF7XXo,11349
247
247
  pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
248
248
  pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
249
249
  pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
250
- pygpt_net/data/config/config.json,sha256=ezfhWuQCpy1HWm69Pc_7eVdtese2vwheLC3tb62h6Mo,19735
251
- pygpt_net/data/config/models.json,sha256=lhdi2Y9w3GxpRmpp07embuE4TVixvml9wbcoylMQA_8,61940
252
- pygpt_net/data/config/modes.json,sha256=KILDDam2UjJ-dCj8_PF9AnTlj4Xq4Ms9HYxOq2Krx-M,1923
250
+ pygpt_net/data/config/config.json,sha256=r7aECJ0qUjFSkla3PvvqnHZFRAsZ0So8g0kdbPQjB5U,19805
251
+ pygpt_net/data/config/models.json,sha256=2SlfLD92btvwylPNro31J1uT4C_fC-7ERd9UrxnY8zE,61940
252
+ pygpt_net/data/config/modes.json,sha256=hp_UAh4RCbeIe6iaYWtNLHm2DwBP7dz5h1LNlrFjd64,1923
253
253
  pygpt_net/data/config/presets/agent_openai.json,sha256=vMTR-soRBiEZrpJJHuFLWyx8a3Ez_BqtqjyXgxCAM_Q,733
254
254
  pygpt_net/data/config/presets/agent_openai_assistant.json,sha256=awJw9lNTGpKML6SJUShVn7lv8AXh0oic7wBeyoN7AYs,798
255
255
  pygpt_net/data/config/presets/agent_planner.json,sha256=a6Rv58Bnm2STNWB0Rw_dGhnsz6Lb3J8_GwsUVZaTIXc,742
@@ -269,7 +269,7 @@ pygpt_net/data/config/presets/current.vision.json,sha256=x1ll5B3ROSKYQA6l27PRGXU
269
269
  pygpt_net/data/config/presets/dalle_white_cat.json,sha256=esqUb43cqY8dAo7B5u99tRC0MBV5lmlrVLnJhTSkL8w,552
270
270
  pygpt_net/data/config/presets/joke_agent.json,sha256=R6n9P7KRb0s-vZWZE7kHdlOfXAx1yYrPmUw8uLyw8OE,474
271
271
  pygpt_net/data/config/presets/joke_expert.json,sha256=aFBFCY97Uba71rRq0MSeakXaOj8yuaUqekQ842YHv64,683
272
- pygpt_net/data/config/settings.json,sha256=VXSG79pbpj_WDanxg_oLio1dwLQXeOU4TZP1uQ9n2F0,48806
272
+ pygpt_net/data/config/settings.json,sha256=F-c8vI9nI_RZs8tD9CnuLphwEw0BezmB75aNRPq2b5I,49173
273
273
  pygpt_net/data/config/settings_section.json,sha256=M22jrZvly6KliNr_fhkS6rk_bdzlFK4OyoWZ6TiyRnY,1004
274
274
  pygpt_net/data/css/fix_windows.css,sha256=Mks14Vg25ncbMqZJfAMStrhvZmgHF6kU75ohTWRZeI8,664
275
275
  pygpt_net/data/css/markdown.css,sha256=yaoJPogZZ_ghbqP8vTXTycwVyD61Ik5_033NpzuUzC0,1122
@@ -1485,14 +1485,14 @@ pygpt_net/data/js/katex/fonts/KaTeX_Typewriter-Regular.woff,sha256=4U_tArGrp86fW
1485
1485
  pygpt_net/data/js/katex/fonts/KaTeX_Typewriter-Regular.woff2,sha256=cdUX1ngneHz6vfGGkUzDNY7aU543kxlB8rL9SiH2jAs,13568
1486
1486
  pygpt_net/data/js/katex/katex.min.css,sha256=lVaKnUaQNG4pI71WHffQZVALLQF4LMZEk4nOia8U9ow,23532
1487
1487
  pygpt_net/data/js/katex/katex.min.js,sha256=KLASOtKS2x8pUxWVzCDmlWJ4jhuLb0vtrgakbD6gDDo,276757
1488
- pygpt_net/data/locale/locale.de.ini,sha256=pQoz_qzInY4RA0Bt1FB7yPlhaoNLaGN1cIIPTr7TnvA,63588
1489
- pygpt_net/data/locale/locale.en.ini,sha256=v967jvOT3s4RpcLlIMjdDOmgCuCn1DzCPyQyguo7mZU,76144
1490
- pygpt_net/data/locale/locale.es.ini,sha256=zTeCXB2F13FtZI07RnElmfeJJwd35JVGJG9C5WSE7WI,63821
1491
- pygpt_net/data/locale/locale.fr.ini,sha256=aYYT3xBiJbUKX4OPcZVvNBG_W3_pHeIUaVbLMk9RPqs,65853
1492
- pygpt_net/data/locale/locale.it.ini,sha256=QB-mPBNHK3iDYKOutst6p3MzpTiSE-7FDWO4RVhU3Z8,62604
1493
- pygpt_net/data/locale/locale.pl.ini,sha256=-en8RBnnn_ZU0x8Qxy-mKskjyPnZpQNiDeBtH5eW1D8,62688
1494
- pygpt_net/data/locale/locale.uk.ini,sha256=1P4vdZbK4bB1dL2xOj-lCp0vmHWeP9pFNCFCYZKERVk,87233
1495
- pygpt_net/data/locale/locale.zh.ini,sha256=IaBf41RuD0iV2q3G97V4NL_v5_BbARpLxHER-H1X86c,64417
1488
+ pygpt_net/data/locale/locale.de.ini,sha256=IIoIo0EPtLhCejFaNErntQRFXaOx-rpSK6Ya3LqgOD4,63875
1489
+ pygpt_net/data/locale/locale.en.ini,sha256=wR8v7K_P9RgU5uNdifLrdJJDWxBP2EKzFbBwfgv8cJ0,76384
1490
+ pygpt_net/data/locale/locale.es.ini,sha256=Y7g7DEmsGPrroEokbznznIEP80T87ryESfn0Wo00fyY,64096
1491
+ pygpt_net/data/locale/locale.fr.ini,sha256=brcjmhUzvzJlgUqfk6lpPowIR8MAakhZ0mQDwz72aFw,66133
1492
+ pygpt_net/data/locale/locale.it.ini,sha256=Zhfx3IMtflcaemL-qJgn5bILkMmcirStKVJyQ4xb5mM,62871
1493
+ pygpt_net/data/locale/locale.pl.ini,sha256=ojZqlcDl92btG_GNIZsD9qs8XtxQd19Xpg9uauVWPoM,62968
1494
+ pygpt_net/data/locale/locale.uk.ini,sha256=mV1EpN3RUxI-kO7zTY3W05EbqHpVzpIGlOwvFm-ZD-Y,87661
1495
+ pygpt_net/data/locale/locale.zh.ini,sha256=GVWy62XX4HLqJyY8tnGgdlMTqJm8h3E5I52e36ZmRII,64638
1496
1496
  pygpt_net/data/locale/plugin.agent.de.ini,sha256=BY28KpfFvgfVYJzcw2o5ScWnR4uuErIYGyc3NVHlmTw,1714
1497
1497
  pygpt_net/data/locale/plugin.agent.en.ini,sha256=88LkZUpilbV9l4QDbMyIdq_K9sbWt-CQPpavEttPjJU,1489
1498
1498
  pygpt_net/data/locale/plugin.agent.es.ini,sha256=bqaJQne8HPKFVtZ8Ukzo1TSqVW41yhYbGUqW3j2x1p8,1680
@@ -1701,7 +1701,7 @@ pygpt_net/plugin/agent/__init__.py,sha256=GPbnpS9djcfzuPRxM2mu0hpUPRa51KtUR27Al6
1701
1701
  pygpt_net/plugin/agent/config.py,sha256=V4M0boutzxFVWTQxM8UA7HgKUR4v_Y-5dX_XfeLzzL8,9792
1702
1702
  pygpt_net/plugin/audio_input/__init__.py,sha256=vGwDtsPkwCEwiz2ePnzW48Tuhr0VHEc7kQua11VE7tI,15714
1703
1703
  pygpt_net/plugin/audio_input/config.py,sha256=x57IVxBapJp9rwos327T6U0jTFSPeRJ6BorqfYxJ4u0,9197
1704
- pygpt_net/plugin/audio_input/simple.py,sha256=N5jL_hYp4ZvUBXqoiyx3Tt3b4bWKc9SbKOTtD00TNTE,5195
1704
+ pygpt_net/plugin/audio_input/simple.py,sha256=5RK7R8teQjpLYBZov1cqIevfASBQsBgsMtp_7KXST2E,6219
1705
1705
  pygpt_net/plugin/audio_input/worker.py,sha256=kG7r08ot1h0Jyw_UQ_sFN1rOKOkOC-ByLbCp-oZZBr4,11828
1706
1706
  pygpt_net/plugin/audio_output/__init__.py,sha256=wR_gBQgJ_arxHPSvjtT7naNwkNrCJc6KFR7ZUAqYcvc,7896
1707
1707
  pygpt_net/plugin/audio_output/config.py,sha256=IA2K-9fQMZSwYGyi30Uh5qAlYwuqwaHo3dtDJ13vQdo,1208
@@ -1820,7 +1820,7 @@ pygpt_net/provider/core/calendar/db_sqlite/storage.py,sha256=QDclQCQdr4QyRIqjgGX
1820
1820
  pygpt_net/provider/core/config/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
1821
1821
  pygpt_net/provider/core/config/base.py,sha256=cbvzbMNqL2XgC-36gGubnU37t94AX7LEw0lecb2Nm80,1365
1822
1822
  pygpt_net/provider/core/config/json_file.py,sha256=P78SRQpNr_nF7TYftYLnHl_DVo7GLPNs4_lvw97sqq8,5122
1823
- pygpt_net/provider/core/config/patch.py,sha256=pUQWkvGZAh60cR3x295Itk5YN0Ss3BpJNFRuHrf273Y,94958
1823
+ pygpt_net/provider/core/config/patch.py,sha256=oJqkipPuEKRNhyCcnzkF66x3N3zU2WF839xl3Rn2Bcc,95322
1824
1824
  pygpt_net/provider/core/ctx/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
1825
1825
  pygpt_net/provider/core/ctx/base.py,sha256=Tfb4MDNe9BXXPU3lbzpdYwJF9S1oa2-mzgu5XT4It9g,3003
1826
1826
  pygpt_net/provider/core/ctx/db_sqlite/__init__.py,sha256=G2pB7kZfREJRLJZmfv3DKTslXC-K7EhNN2sn56q6BFA,11753
@@ -2034,7 +2034,7 @@ pygpt_net/ui/layout/chat/attachments_ctx.py,sha256=qyidK2bbTufWX-crtEhat2i3-Juqq
2034
2034
  pygpt_net/ui/layout/chat/attachments_uploaded.py,sha256=8xKa9xwU56ESSfBN5ybwT_BUZEwgij-tjHbhhzNuV2U,5462
2035
2035
  pygpt_net/ui/layout/chat/calendar.py,sha256=Vc6ztv4S_gO2ceqO-SekXyqI4V7cbf-JN_sZ5dwbl34,5812
2036
2036
  pygpt_net/ui/layout/chat/explorer.py,sha256=VGWS6JhXSJV2ry1pIY1Ijme6DvYHfsnKwfrieVXHc3U,1280
2037
- pygpt_net/ui/layout/chat/input.py,sha256=6mvoyAmJvZa2cegyQXz5Wld_oqiuCOq0rabsITax-LE,11144
2037
+ pygpt_net/ui/layout/chat/input.py,sha256=BUtfT_77fJW7xk5ciTMMIHFijU1vSmcvW9QC7NEHQtA,10674
2038
2038
  pygpt_net/ui/layout/chat/markdown.py,sha256=hjYY8Da1z0IZZD086_csMcDY1wwagpuQTDZ-XfgeNgs,18656
2039
2039
  pygpt_net/ui/layout/chat/output.py,sha256=4a_BCzk2MKt5z-KYKD8iaapiS4Kj1R7Gj-8v-5R4BLs,9887
2040
2040
  pygpt_net/ui/layout/chat/painter.py,sha256=2yGU9GET5PpcGteGyWcHTtodKqAL7rxrqxhQ10vhodM,5471
@@ -2056,7 +2056,7 @@ pygpt_net/ui/layout/toolbox/presets.py,sha256=Afb_hLddPQlTcCUcWSCPhfp7ApKdbypkDJ
2056
2056
  pygpt_net/ui/layout/toolbox/prompt.py,sha256=QC5CZx5TvO0-CZVXea4eIuAHFjoYcGxYrLBtny15ATI,3937
2057
2057
  pygpt_net/ui/layout/toolbox/vision.py,sha256=GZY-N2z8re1LN1ntsy-3Ius8OY4DujmJpyJ1qP2ZRxs,2447
2058
2058
  pygpt_net/ui/main.py,sha256=mkGgB7lhrx2WDUBf9N_kbQU9lDPuJ7UdeqnHZtEPRAs,10335
2059
- pygpt_net/ui/menu/__init__.py,sha256=50JVEmOoNnpyjMGgrgIJ2u-M-WudcOw6paMDWHaQEaE,1876
2059
+ pygpt_net/ui/menu/__init__.py,sha256=hGxe2_tp3-hDGm2EjjMwBc69zmK3cr664LoV3cm2vGk,1877
2060
2060
  pygpt_net/ui/menu/about.py,sha256=bzoUcE_Z2rfb6iGmw4II2m1S8f3XPZ-jA0cmvBwGtLI,5480
2061
2061
  pygpt_net/ui/menu/audio.py,sha256=Sb8NTAyMnPj4johTvBKwocHzq67XypIdw7K7hjf2760,3494
2062
2062
  pygpt_net/ui/menu/config.py,sha256=uQjHZtZok4dasIngzNZkV42pC54zesJ8nJhLLptPtPg,8159
@@ -2074,7 +2074,7 @@ pygpt_net/ui/widget/anims/loader.py,sha256=PzxHraeABUyMIZlg4Rk_tbJnUPmiwxlhdcHaC
2074
2074
  pygpt_net/ui/widget/anims/toggles.py,sha256=_L2533IYyDkbnPCok9XBriIaKM5E9sHSznrwVWpKOOs,5755
2075
2075
  pygpt_net/ui/widget/audio/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2076
2076
  pygpt_net/ui/widget/audio/input.py,sha256=t9VAhP15HkSOvNV2crI3Kg6AgrQDj-wSQiiYTMlvK60,1721
2077
- pygpt_net/ui/widget/audio/input_button.py,sha256=ykhBIRZ0g2w2f5YxOMkxtOndLDbdW4G8x3UbP1rVKyk,5185
2077
+ pygpt_net/ui/widget/audio/input_button.py,sha256=WrsUzsMdqflTKU7pi5xfIvnKcbmgcjWGGHAprPTzaKA,5712
2078
2078
  pygpt_net/ui/widget/audio/output.py,sha256=UxkiCnVT9DNFeByDGTFW_CK0LW8xSvhEK1zygtHvx4k,1586
2079
2079
  pygpt_net/ui/widget/calendar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2080
2080
  pygpt_net/ui/widget/calendar/select.py,sha256=vSEaQZmyeDhmyOfptWv6me_6IaYpQb5Jgc_mGDIe_4U,9051
@@ -2175,8 +2175,8 @@ pygpt_net/ui/widget/textarea/web.py,sha256=9FoL02QY6mOxtc4t4fe8X7fVDIdPn9Sb_fwsv
2175
2175
  pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2176
2176
  pygpt_net/ui/widget/vision/camera.py,sha256=T8b5cmK6uhf_WSSxzPt_Qod8JgMnst6q8sQqRvgQiSA,2584
2177
2177
  pygpt_net/utils.py,sha256=Gsh_mITVke3bb8o-Ke57l__xA5a9Wv4t7tlsnSQULj8,6655
2178
- pygpt_net-2.4.50.dist-info/LICENSE,sha256=GLKQTnJOPK4dDIWfkAIM4GwOxKJXi5zcMGt7FjLR1xk,1126
2179
- pygpt_net-2.4.50.dist-info/METADATA,sha256=kttDYqtQSS0wi5lXkI3Y7APenTEcXuIVcRiuspWa_7Q,169852
2180
- pygpt_net-2.4.50.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
2181
- pygpt_net-2.4.50.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2182
- pygpt_net-2.4.50.dist-info/RECORD,,
2178
+ pygpt_net-2.4.51.dist-info/LICENSE,sha256=GLKQTnJOPK4dDIWfkAIM4GwOxKJXi5zcMGt7FjLR1xk,1126
2179
+ pygpt_net-2.4.51.dist-info/METADATA,sha256=17IoHPi5cIRQnVucqPIKWoiFBigUJAVfnSXFOS5ZGJA,167017
2180
+ pygpt_net-2.4.51.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
2181
+ pygpt_net-2.4.51.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2182
+ pygpt_net-2.4.51.dist-info/RECORD,,