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 +5 -0
- README.md +6 -62
- pygpt_net/CHANGELOG.txt +5 -0
- pygpt_net/__init__.py +3 -3
- pygpt_net/controller/audio/__init__.py +15 -1
- pygpt_net/controller/lang/custom.py +2 -1
- pygpt_net/controller/ui/tabs.py +7 -1
- pygpt_net/core/audio/capture.py +19 -1
- pygpt_net/data/config/config.json +5 -3
- pygpt_net/data/config/models.json +3 -3
- pygpt_net/data/config/modes.json +3 -3
- pygpt_net/data/config/settings.json +13 -0
- pygpt_net/data/locale/locale.de.ini +3 -0
- pygpt_net/data/locale/locale.en.ini +3 -0
- pygpt_net/data/locale/locale.es.ini +3 -0
- pygpt_net/data/locale/locale.fr.ini +3 -0
- pygpt_net/data/locale/locale.it.ini +3 -0
- pygpt_net/data/locale/locale.pl.ini +3 -0
- pygpt_net/data/locale/locale.uk.ini +3 -0
- pygpt_net/data/locale/locale.zh.ini +3 -0
- pygpt_net/plugin/audio_input/simple.py +31 -8
- pygpt_net/provider/core/config/patch.py +9 -1
- pygpt_net/ui/layout/chat/input.py +0 -12
- pygpt_net/ui/menu/__init__.py +4 -3
- pygpt_net/ui/widget/audio/input_button.py +31 -23
- {pygpt_net-2.4.50.dist-info → pygpt_net-2.4.51.dist-info}/METADATA +7 -63
- {pygpt_net-2.4.50.dist-info → pygpt_net-2.4.51.dist-info}/RECORD +30 -30
- {pygpt_net-2.4.50.dist-info → pygpt_net-2.4.51.dist-info}/LICENSE +0 -0
- {pygpt_net-2.4.50.dist-info → pygpt_net-2.4.51.dist-info}/WHEEL +0 -0
- {pygpt_net-2.4.50.dist-info → pygpt_net-2.4.51.dist-info}/entry_points.txt +0 -0
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
|
[](https://snapcraft.io/pygpt)
|
4
4
|
|
5
|
-
Release: **2.4.
|
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.
|
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.
|
17
|
-
__build__ = "2025.01.
|
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:
|
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:
|
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')
|
pygpt_net/controller/ui/tabs.py
CHANGED
@@ -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:
|
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
|
|
pygpt_net/core/audio/capture.py
CHANGED
@@ -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.
|
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.
|
4
|
-
"app.version": "2.4.
|
5
|
-
"updated_at": "2025-01-
|
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,
|
pygpt_net/data/config/modes.json
CHANGED
@@ -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.
|
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
|
-
"""
|
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
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
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:
|
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
|
pygpt_net/ui/menu/__init__.py
CHANGED
@@ -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.
|
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.
|
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.
|
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
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
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.
|
99
|
-
self.
|
100
|
-
|
101
|
-
|
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
|
-
|
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.
|
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
|
[](https://snapcraft.io/pygpt)
|
95
95
|
|
96
|
-
Release: **2.4.
|
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=
|
2
|
-
README.md,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
251
|
-
pygpt_net/data/config/models.json,sha256=
|
252
|
-
pygpt_net/data/config/modes.json,sha256=
|
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=
|
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=
|
1489
|
-
pygpt_net/data/locale/locale.en.ini,sha256=
|
1490
|
-
pygpt_net/data/locale/locale.es.ini,sha256=
|
1491
|
-
pygpt_net/data/locale/locale.fr.ini,sha256=
|
1492
|
-
pygpt_net/data/locale/locale.it.ini,sha256=
|
1493
|
-
pygpt_net/data/locale/locale.pl.ini,sha256
|
1494
|
-
pygpt_net/data/locale/locale.uk.ini,sha256=
|
1495
|
-
pygpt_net/data/locale/locale.zh.ini,sha256=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
2179
|
-
pygpt_net-2.4.
|
2180
|
-
pygpt_net-2.4.
|
2181
|
-
pygpt_net-2.4.
|
2182
|
-
pygpt_net-2.4.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|