pygpt-net 2.5.6__py3-none-any.whl → 2.5.7__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 +8 -0
- README.md +9 -1
- pygpt_net/CHANGELOG.txt +8 -0
- pygpt_net/__init__.py +3 -3
- pygpt_net/controller/chat/text.py +2 -2
- pygpt_net/controller/config/placeholder.py +3 -2
- pygpt_net/controller/notepad/__init__.py +2 -2
- pygpt_net/controller/theme/menu.py +5 -1
- pygpt_net/controller/ui/__init__.py +17 -7
- pygpt_net/core/render/web/helpers.py +8 -1
- pygpt_net/core/tokens/__init__.py +2 -2
- pygpt_net/data/config/config.json +4 -4
- pygpt_net/data/config/models.json +3 -3
- pygpt_net/data/config/modes.json +3 -3
- pygpt_net/data/css/web-blocks.css +8 -0
- pygpt_net/data/css/web-chatgpt.css +8 -0
- pygpt_net/data/css/web-chatgpt_wide.css +8 -0
- pygpt_net/provider/core/config/patch.py +9 -1
- pygpt_net/provider/gpt/chat.py +3 -3
- pygpt_net/ui/layout/ctx/__init__.py +1 -5
- pygpt_net/ui/layout/ctx/ctx_list.py +6 -1
- {pygpt_net-2.5.6.dist-info → pygpt_net-2.5.7.dist-info}/METADATA +10 -2
- {pygpt_net-2.5.6.dist-info → pygpt_net-2.5.7.dist-info}/RECORD +26 -26
- {pygpt_net-2.5.6.dist-info → pygpt_net-2.5.7.dist-info}/LICENSE +0 -0
- {pygpt_net-2.5.6.dist-info → pygpt_net-2.5.7.dist-info}/WHEEL +0 -0
- {pygpt_net-2.5.6.dist-info → pygpt_net-2.5.7.dist-info}/entry_points.txt +0 -0
CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 2.5.7 (2025-02-26)
|
4
|
+
|
5
|
+
- Steam mode has been enabled in o1 models.
|
6
|
+
- CSS styling for <think> tags (reasoning models) has been added.
|
7
|
+
- The search input has been moved to the top.
|
8
|
+
- The ChatGPT-based style is now set as default.
|
9
|
+
- Fix: Display of max tokens in models with a context window greater than 128k.
|
10
|
+
|
3
11
|
## 2.5.6 (2025-02-03)
|
4
12
|
|
5
13
|
- Fix: disabled index initialization if embedding provider is OpenAI and no API KEY is provided.
|
README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://snapcraft.io/pygpt)
|
4
4
|
|
5
|
-
Release: **2.5.
|
5
|
+
Release: **2.5.7** | build: **2025.02.26** | Python: **>=3.10, <3.13**
|
6
6
|
|
7
7
|
> Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
|
8
8
|
>
|
@@ -3964,6 +3964,14 @@ may consume additional tokens that are not displayed in the main window.
|
|
3964
3964
|
|
3965
3965
|
## Recent changes:
|
3966
3966
|
|
3967
|
+
**2.5.7 (2025-02-26)**
|
3968
|
+
|
3969
|
+
- Steam mode has been enabled in o1 models.
|
3970
|
+
- CSS styling for <think> tags (reasoning models) has been added.
|
3971
|
+
- The search input has been moved to the top.
|
3972
|
+
- The ChatGPT-based style is now set as default.
|
3973
|
+
- Fix: Display of max tokens in models with a context window greater than 128k.
|
3974
|
+
|
3967
3975
|
**2.5.6 (2025-02-03)**
|
3968
3976
|
|
3969
3977
|
- Fix: disabled index initialization if embedding provider is OpenAI and no API KEY is provided.
|
pygpt_net/CHANGELOG.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
2.5.7 (2025-02-26)
|
2
|
+
|
3
|
+
- Steam mode has been enabled in o1 models.
|
4
|
+
- CSS styling for <think> tags (reasoning models) has been added.
|
5
|
+
- The search input has been moved to the top.
|
6
|
+
- The ChatGPT-based style is now set as default.
|
7
|
+
- Fix: Display of max tokens in models with a context window greater than 128k.
|
8
|
+
|
1
9
|
2.5.6 (2025-02-03)
|
2
10
|
|
3
11
|
- Fix: disabled index initialization if embedding provider is OpenAI and no API KEY is provided.
|
pygpt_net/__init__.py
CHANGED
@@ -6,15 +6,15 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2025.02.
|
9
|
+
# Updated Date: 2025.02.26 23: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.5.
|
17
|
-
__build__ = "2025.02.
|
16
|
+
__version__ = "2.5.7"
|
17
|
+
__build__ = "2025.02.26"
|
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.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
from typing import Optional
|
@@ -86,7 +86,7 @@ class Text:
|
|
86
86
|
idx_mode = self.window.core.config.get('llama.idx.mode')
|
87
87
|
|
88
88
|
# o1 models: disable stream mode
|
89
|
-
if
|
89
|
+
if mode in [MODE_AGENT_LLAMA, MODE_AUDIO]:
|
90
90
|
stream_mode = False
|
91
91
|
if mode in [MODE_LLAMA_INDEX] and idx_mode == "retrieval":
|
92
92
|
stream_mode = False
|
@@ -6,7 +6,7 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date: 2025.02.
|
9
|
+
# Updated Date: 2025.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
from typing import Dict, Any, List
|
@@ -325,7 +325,8 @@ class Placeholder:
|
|
325
325
|
styles.sort()
|
326
326
|
data = []
|
327
327
|
for id in styles:
|
328
|
-
|
328
|
+
name = id
|
329
|
+
data.append({id: name})
|
329
330
|
return data
|
330
331
|
|
331
332
|
def get_keys(self) -> List[Dict[str, str]]:
|
@@ -6,7 +6,7 @@
|
|
6
6
|
# GitHub: https://github.com/szczyglis-dev/py-gpt #
|
7
7
|
# MIT License #
|
8
8
|
# Created By : Marcin Szczygliński #
|
9
|
-
# Updated Date:
|
9
|
+
# Updated Date: 2025.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
from typing import Optional, Tuple
|
@@ -283,6 +283,6 @@ class Notepad:
|
|
283
283
|
if tab.type == Tab.TAB_NOTEPAD:
|
284
284
|
idx = tab.data_id
|
285
285
|
if idx in self.window.ui.notepad:
|
286
|
+
self.window.ui.notepad[idx].scroll_to_bottom()
|
286
287
|
if not self.window.ui.notepad[idx].opened:
|
287
|
-
self.window.ui.notepad[idx].scroll_to_bottom()
|
288
288
|
self.window.ui.notepad[idx].opened = 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.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
from PySide6.QtGui import QAction
|
@@ -36,6 +36,10 @@ class Menu:
|
|
36
36
|
for style in styles:
|
37
37
|
style_id = style.lower()
|
38
38
|
title = style.replace('_', ' ').title()
|
39
|
+
if title == "Chatgpt":
|
40
|
+
title = "ChatGPT"
|
41
|
+
elif title == "Chatgpt Wide":
|
42
|
+
title = "ChatGPT (wide)"
|
39
43
|
self.window.ui.menu['theme_style'][style_id] = QAction(title, self.window, checkable=True)
|
40
44
|
self.window.ui.menu['theme_style'][style_id].triggered.connect(
|
41
45
|
lambda checked=None, style=style_id: self.window.controller.theme.toggle_style(style))
|
@@ -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.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
from typing import Optional
|
@@ -95,6 +95,20 @@ class UI:
|
|
95
95
|
self.window.controller.assistant.refresh()
|
96
96
|
self.window.controller.idx.refresh()
|
97
97
|
|
98
|
+
def format_tokens(self, num: int) -> str:
|
99
|
+
"""
|
100
|
+
Format tokens
|
101
|
+
:param num: number of tokens
|
102
|
+
:return: formatted string
|
103
|
+
"""
|
104
|
+
num = int(num)
|
105
|
+
if num >= 1_000_000:
|
106
|
+
return f"{num // 1_000_000}M"
|
107
|
+
elif num >= 1_000:
|
108
|
+
return f"{num // 1_000}k"
|
109
|
+
else:
|
110
|
+
return str(num)
|
111
|
+
|
98
112
|
def update_tokens(self):
|
99
113
|
"""Update tokens counter in real-time"""
|
100
114
|
prompt = str(self.window.ui.nodes['input'].toPlainText().strip())
|
@@ -112,12 +126,8 @@ class UI:
|
|
112
126
|
)
|
113
127
|
self.window.ui.nodes['prompt.context'].setText(ctx_string)
|
114
128
|
|
115
|
-
|
116
|
-
|
117
|
-
parsed_sum = parsed_sum.replace("000000", "M").replace("000", "k")
|
118
|
-
|
119
|
-
parsed_max_current = str(int(max_current))
|
120
|
-
parsed_max_current = parsed_max_current.replace("000000", "M").replace("000", "k")
|
129
|
+
parsed_sum = self.format_tokens(sum_tokens)
|
130
|
+
parsed_max_current = self.format_tokens(max_current)
|
121
131
|
|
122
132
|
input_string = "{} + {} + {} + {} + {} = {} / {}".format(
|
123
133
|
input_tokens,
|
@@ -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.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import re
|
@@ -48,6 +48,13 @@ class Helpers:
|
|
48
48
|
text = text.replace("#~###~", "~###~") # fix for #~###~ in text (previous versions)
|
49
49
|
text = text.replace("# ~###~", "~###~") # fix for # ~###~ in text (previous versions)
|
50
50
|
|
51
|
+
#text = text.replace("<think>", "{{{{think}}}}")
|
52
|
+
#text = text.replace("</think>", "{{{{/think}}}}")
|
53
|
+
#text = text.replace("<", "<")
|
54
|
+
#text = text.replace(">", ">")
|
55
|
+
#text = text.replace("{{{{think}}}}", "<think>")
|
56
|
+
#text = text.replace("{{{{/think}}}}", "</think>")
|
57
|
+
|
51
58
|
# replace cmd tags
|
52
59
|
text = self.replace_code_tags(text)
|
53
60
|
|
@@ -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.
|
9
|
+
# Updated Date: 2025.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
from typing import Tuple, List
|
@@ -375,7 +375,7 @@ class Tokens:
|
|
375
375
|
|
376
376
|
# check model max allowed ctx tokens
|
377
377
|
max_current = max_total_tokens
|
378
|
-
model_ctx = self.window.core.models.get_num_ctx(
|
378
|
+
model_ctx = self.window.core.models.get_num_ctx(model)
|
379
379
|
if max_current > model_ctx:
|
380
380
|
max_current = model_ctx
|
381
381
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
{
|
2
2
|
"__meta__": {
|
3
|
-
"version": "2.5.
|
4
|
-
"app.version": "2.5.
|
5
|
-
"updated_at": "2025-02-
|
3
|
+
"version": "2.5.7",
|
4
|
+
"app.version": "2.5.7",
|
5
|
+
"updated_at": "2025-02-26T00:00:00"
|
6
6
|
},
|
7
7
|
"access.audio.event.speech": false,
|
8
8
|
"access.audio.event.speech.disabled": [],
|
@@ -355,7 +355,7 @@
|
|
355
355
|
"temperature": 1.0,
|
356
356
|
"theme": "dark_cyan",
|
357
357
|
"theme.markdown": true,
|
358
|
-
"theme.style": "
|
358
|
+
"theme.style": "chatgpt",
|
359
359
|
"top_p": 1.0,
|
360
360
|
"upload.store": true,
|
361
361
|
"upload.data_dir": false,
|
pygpt_net/data/config/modes.json
CHANGED
@@ -319,6 +319,14 @@ code {{
|
|
319
319
|
width: 100% !important;
|
320
320
|
height: 100% !important;
|
321
321
|
}}
|
322
|
+
think {{
|
323
|
+
border-left: 4px solid silver;
|
324
|
+
display: block;
|
325
|
+
padding-left: 1rem;
|
326
|
+
margin-top: 0;
|
327
|
+
padding-top: 0;
|
328
|
+
font-size: 0.8rem;
|
329
|
+
}}
|
322
330
|
|
323
331
|
/* anims */
|
324
332
|
@keyframes spin {{
|
@@ -330,6 +330,14 @@ code {{
|
|
330
330
|
width: 100% !important;
|
331
331
|
height: 100% !important;
|
332
332
|
}}
|
333
|
+
think {{
|
334
|
+
border-left: 4px solid silver;
|
335
|
+
display: block;
|
336
|
+
padding-left: 1rem;
|
337
|
+
margin-top: 0;
|
338
|
+
padding-top: 0;
|
339
|
+
font-size: 0.8rem;
|
340
|
+
}}
|
333
341
|
|
334
342
|
/* anims */
|
335
343
|
@keyframes spin {{
|
@@ -330,6 +330,14 @@ code {{
|
|
330
330
|
width: 100% !important;
|
331
331
|
height: 100% !important;
|
332
332
|
}}
|
333
|
+
think {{
|
334
|
+
border-left: 4px solid silver;
|
335
|
+
display: block;
|
336
|
+
padding-left: 1rem;
|
337
|
+
margin-top: 0;
|
338
|
+
padding-top: 0;
|
339
|
+
font-size: 0.8rem;
|
340
|
+
}}
|
333
341
|
|
334
342
|
/* anims */
|
335
343
|
@keyframes spin {{
|
@@ -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.
|
9
|
+
# Updated Date: 2025.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import copy
|
@@ -1838,6 +1838,14 @@ class Patch:
|
|
1838
1838
|
data["api_key_deepseek"] = ""
|
1839
1839
|
updated = True
|
1840
1840
|
|
1841
|
+
# < 2.5.7
|
1842
|
+
if old < parse_version("2.5.7"):
|
1843
|
+
print("Migrating config from < 2.5.7...")
|
1844
|
+
self.window.core.updater.patch_css('web-blocks.css', True) # force update
|
1845
|
+
self.window.core.updater.patch_css('web-chatgpt.css', True) # force update
|
1846
|
+
self.window.core.updater.patch_css('web-chatgpt_wide.css', True) # force update
|
1847
|
+
updated = True
|
1848
|
+
|
1841
1849
|
# update file
|
1842
1850
|
migrated = False
|
1843
1851
|
if updated:
|
pygpt_net/provider/gpt/chat.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.02.
|
9
|
+
# Updated Date: 2025.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
import json
|
@@ -135,8 +135,8 @@ class Chat:
|
|
135
135
|
response_kwargs['max_completion_tokens'] = max_tokens
|
136
136
|
|
137
137
|
# o1 models do not support streaming
|
138
|
-
if model.id is not None and model.id.startswith("o1"):
|
139
|
-
|
138
|
+
if model.id is not None and model.id.startswith("o1-preview"):
|
139
|
+
streams = False
|
140
140
|
|
141
141
|
# audio mode
|
142
142
|
if mode in [MODE_AUDIO]:
|
@@ -6,13 +6,12 @@
|
|
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.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
from PySide6.QtCore import Qt
|
13
13
|
from PySide6.QtWidgets import QVBoxLayout, QWidget
|
14
14
|
|
15
|
-
from pygpt_net.ui.layout.ctx.search_input import SearchInput
|
16
15
|
from pygpt_net.ui.layout.ctx.ctx_list import CtxList
|
17
16
|
from pygpt_net.ui.layout.ctx.video import Video
|
18
17
|
from pygpt_net.ui.widget.element.labels import HelpLabel
|
@@ -27,7 +26,6 @@ class CtxMain:
|
|
27
26
|
:param window: Window instance
|
28
27
|
"""
|
29
28
|
self.window = window
|
30
|
-
self.search_input = SearchInput(window)
|
31
29
|
self.ctx_list = CtxList(window)
|
32
30
|
self.video = Video(window)
|
33
31
|
|
@@ -39,7 +37,6 @@ class CtxMain:
|
|
39
37
|
"""
|
40
38
|
ctx = self.ctx_list.setup()
|
41
39
|
video = self.video.setup()
|
42
|
-
search_input = self.search_input.setup()
|
43
40
|
|
44
41
|
self.window.ui.nodes['tip.toolbox.ctx'] = HelpLabel(trans('tip.toolbox.ctx'), self.window)
|
45
42
|
self.window.ui.nodes['tip.toolbox.ctx'].setAlignment(Qt.AlignCenter)
|
@@ -48,7 +45,6 @@ class CtxMain:
|
|
48
45
|
layout.addWidget(ctx)
|
49
46
|
|
50
47
|
layout.addWidget(self.window.ui.nodes['tip.toolbox.ctx'])
|
51
|
-
layout.addWidget(search_input)
|
52
48
|
layout.addWidget(video)
|
53
49
|
layout.setContentsMargins(5, 5, 2, 5)
|
54
50
|
|
@@ -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.02.26 23:00:00 #
|
10
10
|
# ================================================== #
|
11
11
|
|
12
12
|
from PySide6 import QtCore
|
@@ -15,6 +15,7 @@ from PySide6.QtWidgets import QVBoxLayout, QWidget
|
|
15
15
|
from datetime import datetime, timedelta
|
16
16
|
|
17
17
|
from pygpt_net.item.ctx import CtxMeta
|
18
|
+
from pygpt_net.ui.layout.ctx.search_input import SearchInput
|
18
19
|
from pygpt_net.ui.widget.element.button import NewCtxButton
|
19
20
|
from pygpt_net.ui.widget.element.labels import TitleLabel
|
20
21
|
from pygpt_net.ui.widget.lists.context import ContextList, Item, GroupItem, SectionItem
|
@@ -30,6 +31,7 @@ class CtxList:
|
|
30
31
|
:param window: Window instance
|
31
32
|
"""
|
32
33
|
self.window = window
|
34
|
+
self.search_input = SearchInput(window)
|
33
35
|
|
34
36
|
def setup(self) -> QWidget:
|
35
37
|
"""
|
@@ -42,9 +44,12 @@ class CtxList:
|
|
42
44
|
self.window.ui.nodes[id] = ContextList(self.window, id)
|
43
45
|
self.window.ui.nodes[id].selection_locked = self.window.controller.ctx.context_change_locked
|
44
46
|
self.window.ui.nodes['ctx.label'] = TitleLabel(trans("ctx.list.label"))
|
47
|
+
self.window.ui.nodes['ctx.new'].setContentsMargins(0,0,0,0)
|
48
|
+
search_input = self.search_input.setup()
|
45
49
|
|
46
50
|
layout = QVBoxLayout()
|
47
51
|
layout.addWidget(self.window.ui.nodes['ctx.new'])
|
52
|
+
layout.addWidget(search_input)
|
48
53
|
layout.addWidget(self.window.ui.nodes[id])
|
49
54
|
layout.setContentsMargins(0, 0, 0, 0)
|
50
55
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: pygpt-net
|
3
|
-
Version: 2.5.
|
3
|
+
Version: 2.5.7
|
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, DeepSeek, 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
|
@@ -94,7 +94,7 @@ Description-Content-Type: text/markdown
|
|
94
94
|
|
95
95
|
[](https://snapcraft.io/pygpt)
|
96
96
|
|
97
|
-
Release: **2.5.
|
97
|
+
Release: **2.5.7** | build: **2025.02.26** | Python: **>=3.10, <3.13**
|
98
98
|
|
99
99
|
> Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
|
100
100
|
>
|
@@ -4056,6 +4056,14 @@ may consume additional tokens that are not displayed in the main window.
|
|
4056
4056
|
|
4057
4057
|
## Recent changes:
|
4058
4058
|
|
4059
|
+
**2.5.7 (2025-02-26)**
|
4060
|
+
|
4061
|
+
- Steam mode has been enabled in o1 models.
|
4062
|
+
- CSS styling for <think> tags (reasoning models) has been added.
|
4063
|
+
- The search input has been moved to the top.
|
4064
|
+
- The ChatGPT-based style is now set as default.
|
4065
|
+
- Fix: Display of max tokens in models with a context window greater than 128k.
|
4066
|
+
|
4059
4067
|
**2.5.6 (2025-02-03)**
|
4060
4068
|
|
4061
4069
|
- Fix: disabled index initialization if embedding provider is OpenAI and no API KEY is provided.
|
@@ -1,9 +1,9 @@
|
|
1
|
-
CHANGELOG.md,sha256=
|
2
|
-
README.md,sha256=
|
1
|
+
CHANGELOG.md,sha256=0eURTURTW-MG_HzBx-xGN89YU4B6jEyq635u2BatsCE,83635
|
2
|
+
README.md,sha256=QZs2zqUG8nQds2-Ff-A6fzmO8ERplOlJBO3O7dq9cQI,165058
|
3
3
|
icon.png,sha256=CzcINJaU23a9hNjsDlDNbyuiEvKZ4Wg6DQVYF6SpuRg,13970
|
4
|
-
pygpt_net/CHANGELOG.txt,sha256=
|
4
|
+
pygpt_net/CHANGELOG.txt,sha256=EDIFtScLyhNS0By7cX_ixnriaCWsALoFt8UUSxB6HUE,82100
|
5
5
|
pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
|
6
|
-
pygpt_net/__init__.py,sha256=
|
6
|
+
pygpt_net/__init__.py,sha256=H5NEkVN0EGXm5ACB1xZUKC92weGEY4JaQSIP1NAGa2I,1372
|
7
7
|
pygpt_net/app.py,sha256=XXjn9XaKHGRcsHN8mMuqbRHAg8_Da0GLmACUU9ddjBc,16217
|
8
8
|
pygpt_net/config.py,sha256=Qc1FOBtTf3O6A6-6KoqUGtoJ0u8hXQeowvCVbZFwtik,16405
|
9
9
|
pygpt_net/container.py,sha256=BemiVZPpPNIzfB-ZvnZeeBPFu-AcX2c30OqYFylEjJc,4023
|
@@ -39,7 +39,7 @@ pygpt_net/controller/chat/output.py,sha256=VuziVuI9Lj_4kZmTWvXg8t2tq4w9uD7J1g2Mq
|
|
39
39
|
pygpt_net/controller/chat/render.py,sha256=h23QCvMDIAaCpInqwwADa4G43sSpSn-CE5celnk1LSc,17206
|
40
40
|
pygpt_net/controller/chat/response.py,sha256=UnTnnn2on-Qg2_T_QcQcklTCcuq6XhyLLxs1fn-D9Tg,9450
|
41
41
|
pygpt_net/controller/chat/stream.py,sha256=uBYDHQh4vzySHqjNtmMKO81d3f2QYDH2yQnaOwW-ZWc,7715
|
42
|
-
pygpt_net/controller/chat/text.py,sha256=
|
42
|
+
pygpt_net/controller/chat/text.py,sha256=nDiHuKyuRmnDWK0YCsdMhd2k_5zvSSrNWNc9y6FWi2g,10316
|
43
43
|
pygpt_net/controller/chat/vision.py,sha256=bTQ6TFEh9NsPSDSLpExS7KvxQMtqm2sDPm5A0skyOGo,2838
|
44
44
|
pygpt_net/controller/command/__init__.py,sha256=sUvnvsKISkHTrbv7woQQ8r4SAGDR8Gy85H42q8eAg78,5671
|
45
45
|
pygpt_net/controller/config/__init__.py,sha256=cpVI1-_DkrnDkl5K4rGjOhYD-TzXKUoQx99pKzwXjKg,4863
|
@@ -51,7 +51,7 @@ pygpt_net/controller/config/field/dictionary.py,sha256=E8b3Quid_kdQQ54fuZJ4GdcPo
|
|
51
51
|
pygpt_net/controller/config/field/input.py,sha256=081bzm0-MSN6UYIsyDS4gAEhgojWswCNjGqTyyg4Ric,3663
|
52
52
|
pygpt_net/controller/config/field/slider.py,sha256=2XToxPkIvfRPcANa-um6HDQ8rLqpDGynDN05ocKdE1w,4692
|
53
53
|
pygpt_net/controller/config/field/textarea.py,sha256=CySGd21ljR3v3DX9V2WwSvmKVEihD547rnHiRngWuuc,2398
|
54
|
-
pygpt_net/controller/config/placeholder.py,sha256=
|
54
|
+
pygpt_net/controller/config/placeholder.py,sha256=Ejwe71awaPjjISvLoq2gRfKRQWcUlULWAe5Glx-Rszo,12556
|
55
55
|
pygpt_net/controller/ctx/__init__.py,sha256=K1LslZqoIPtTphLDcrTxiqqJ6Fx1EZkJkbPEUCRws9Y,33913
|
56
56
|
pygpt_net/controller/ctx/common.py,sha256=yz1s4kVfxlRpd0XW_sygbmer66LqLxQA1e6O8Pz7FL4,6380
|
57
57
|
pygpt_net/controller/ctx/extra.py,sha256=eDl0_iu80pRtyMX5ub52mjvOo_xo-vb1kZmTt0Idyoo,8219
|
@@ -80,7 +80,7 @@ pygpt_net/controller/layout/__init__.py,sha256=9R30zrZtvedAf1OxQLzxDWt8o2XirUq0b
|
|
80
80
|
pygpt_net/controller/mode/__init__.py,sha256=TY3y5fD8kpqLCmDyyCoEL_1OTSOXLnHVdIvH2lGUTew,7303
|
81
81
|
pygpt_net/controller/model/__init__.py,sha256=qRXFmBje0zu_obAku3qTkhnr01z5D5yDN4gbX347NMA,5931
|
82
82
|
pygpt_net/controller/model/editor.py,sha256=8UaNi_Ui5ooPdio9_mw4ECihTxE7Iq5n5hDl41D3hu0,12675
|
83
|
-
pygpt_net/controller/notepad/__init__.py,sha256=
|
83
|
+
pygpt_net/controller/notepad/__init__.py,sha256=LYZIPg5oO38xILv-a51ZhXbuefKsgPCCP-r01ozrQe8,9263
|
84
84
|
pygpt_net/controller/painter/__init__.py,sha256=1Ekmr2a3irDkSb2wowiPXhW59rfdZOW1tdbxeubph-k,2747
|
85
85
|
pygpt_net/controller/painter/capture.py,sha256=oLBh5emwjJUTddjT6hWErv2FFjSakC_9WSruxPhkJO8,6664
|
86
86
|
pygpt_net/controller/painter/common.py,sha256=gTRCIcmAsgYhueUWNfEIwIJo-40YBVhoNSksOY1Oj34,6395
|
@@ -97,10 +97,10 @@ pygpt_net/controller/settings/workdir.py,sha256=khvMDJrQoLMVh2rnTyk9cKilBUig5PKd
|
|
97
97
|
pygpt_net/controller/theme/__init__.py,sha256=iT12qfxMLBW8PBQ0-KmVnRcRfKC4ZH-M_1TBggtF4go,7255
|
98
98
|
pygpt_net/controller/theme/common.py,sha256=drAO3vrvQXY0pckF5niHdqpsuHDuB2IOpqlGK58z-tI,6294
|
99
99
|
pygpt_net/controller/theme/markdown.py,sha256=Q1lOdp8hiKR50N5pdEyF4jk5I9A9RtYr3egzkkhJEcc,5975
|
100
|
-
pygpt_net/controller/theme/menu.py,sha256=
|
100
|
+
pygpt_net/controller/theme/menu.py,sha256=Ll8x90yQuzN71fN6bmn8E3VsFDtnJ0-A4Xo0-OEak2U,5823
|
101
101
|
pygpt_net/controller/theme/nodes.py,sha256=6SCKMGQ5SZdKgy4t69raiikTLQDPPkjoYTPwlWligv8,5200
|
102
102
|
pygpt_net/controller/tools/__init__.py,sha256=b_yt413iRUI9fWHzZGdtM4333UjzrJb-zmq_exYTgy4,2723
|
103
|
-
pygpt_net/controller/ui/__init__.py,sha256=
|
103
|
+
pygpt_net/controller/ui/__init__.py,sha256=LDAvURc007zxboXlgnAI5VPFCT5WSZljD2W3ApKD4zM,6098
|
104
104
|
pygpt_net/controller/ui/mode.py,sha256=8mw_tmRo7sArvgv-k1yfwx5SCfVOkwdc96U8ZiW83Q0,10231
|
105
105
|
pygpt_net/controller/ui/tabs.py,sha256=7DxDCkkx0mPJ8VbVp-mRt8cb2Mgjbv7Jv3OOVkJp91k,20321
|
106
106
|
pygpt_net/controller/ui/vision.py,sha256=KrP8wFuuz-gsO9iwbLDnzvC5iqWVlWjFarQ27HkHdEg,2303
|
@@ -224,7 +224,7 @@ pygpt_net/core/render/plain/pid.py,sha256=yngcS0o1lBQ2RlRzWrs5JwqT_ThamvnWftp3cX
|
|
224
224
|
pygpt_net/core/render/plain/renderer.py,sha256=VDJiNrGi35IHLGo_yX9JQ37tz-5w2qm6Z-MhFs_3MyA,15267
|
225
225
|
pygpt_net/core/render/web/__init__.py,sha256=istp5dsn6EkLEP7lOBeDb8RjodUcWZqjcEvTroaTT-w,489
|
226
226
|
pygpt_net/core/render/web/body.py,sha256=dDLQJa1SrPm7n1n_GRpf9Rvuyt1UsfMjzDev4qR3424,29520
|
227
|
-
pygpt_net/core/render/web/helpers.py,sha256=
|
227
|
+
pygpt_net/core/render/web/helpers.py,sha256=2suAMzdCkPq1EEjWS5QjkP_WGmNfsIQZJF70E8E2PXU,3379
|
228
228
|
pygpt_net/core/render/web/parser.py,sha256=2LLj8__-CTO6bGOl7c58IfIpKSR4X7phxcY450j_K98,10039
|
229
229
|
pygpt_net/core/render/web/pid.py,sha256=ZyYmzB01adMqY9-1Zi0QhGgrzyg-E9xC_VxqjNvTHWk,1331
|
230
230
|
pygpt_net/core/render/web/renderer.py,sha256=vVMiFxffct1iCOtMhkF28N5AOM54g80haAszmoiuDD8,39227
|
@@ -236,7 +236,7 @@ pygpt_net/core/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
236
236
|
pygpt_net/core/text/finder.py,sha256=2p8lwNgJ28skGbIKAErP7cDOdhPbemrJzqikmfgVBcc,6566
|
237
237
|
pygpt_net/core/text/utils.py,sha256=Jq38mu0-yenI8iZwYaV2I6P9BYWZiK5kifphah4k4Vk,2292
|
238
238
|
pygpt_net/core/text/web_finder.py,sha256=fLqlyQJ90d9jrfKN9A_Be_nRVsWONvOVBm_HO9tv-Gg,6487
|
239
|
-
pygpt_net/core/tokens/__init__.py,sha256=
|
239
|
+
pygpt_net/core/tokens/__init__.py,sha256=MkP-4841gGXRbCrHLhqEtigBm5S8HPbjVLP5qnTuuX8,15593
|
240
240
|
pygpt_net/core/types/__init__.py,sha256=oj7Ax1ODy5YwDCb920WaRbVcdxMeLn8KQMucJGXTBe4,508
|
241
241
|
pygpt_net/core/types/mode.py,sha256=fDUJB1jqENVWw10FO9pFONT1xc13syamKNHu9UXwhNA,769
|
242
242
|
pygpt_net/core/updater/__init__.py,sha256=rrtWjclP1x0JtBx9ww0qLqd_PdLTdVdYIg6ASmxhau4,16042
|
@@ -250,9 +250,9 @@ pygpt_net/css_rc.py,sha256=i13kX7irhbYCWZ5yJbcMmnkFp_UfS4PYnvRFSPF7XXo,11349
|
|
250
250
|
pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
|
251
251
|
pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
|
252
252
|
pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
|
253
|
-
pygpt_net/data/config/config.json,sha256=
|
254
|
-
pygpt_net/data/config/models.json,sha256=
|
255
|
-
pygpt_net/data/config/modes.json,sha256=
|
253
|
+
pygpt_net/data/config/config.json,sha256=_bdOwKC75dZ5f2E6UlnQ2bZoXWrRgYtEW5cq-SYK_hY,19885
|
254
|
+
pygpt_net/data/config/models.json,sha256=9cOZV5KSGWDEyFMXGWW0y1bVgKl6F0MFGNk76XUvbEI,88881
|
255
|
+
pygpt_net/data/config/modes.json,sha256=EARzNiX7yTxAQEY7D2uXB4eHcvOv3eNc_Htc0woBU2k,1921
|
256
256
|
pygpt_net/data/config/presets/agent_openai.json,sha256=vMTR-soRBiEZrpJJHuFLWyx8a3Ez_BqtqjyXgxCAM_Q,733
|
257
257
|
pygpt_net/data/config/presets/agent_openai_assistant.json,sha256=awJw9lNTGpKML6SJUShVn7lv8AXh0oic7wBeyoN7AYs,798
|
258
258
|
pygpt_net/data/config/presets/agent_planner.json,sha256=a6Rv58Bnm2STNWB0Rw_dGhnsz6Lb3J8_GwsUVZaTIXc,742
|
@@ -281,13 +281,13 @@ pygpt_net/data/css/markdown.light.css,sha256=UZdv0jtuFgJ_4bYWsDaDQ4X4AP9tVNLUHBA
|
|
281
281
|
pygpt_net/data/css/style.css,sha256=-yFk2bpE6fegZs6Fpj_1WB9xrubqxsXK-U8zyaLv7-0,428
|
282
282
|
pygpt_net/data/css/style.dark.css,sha256=5GqBiCiTdofU3AfgbuQEezFPE3iSf_mx3dkU4kAtygQ,729
|
283
283
|
pygpt_net/data/css/style.light.css,sha256=szc-rgR_UoLOTegJerDoL2Rx_l-E6BOYSe956snPE3k,1741
|
284
|
-
pygpt_net/data/css/web-blocks.css,sha256=
|
284
|
+
pygpt_net/data/css/web-blocks.css,sha256=H_crm4OL_qsdSe8Ln8Lzcwu4NOe0myhmiBbmOKPPIGE,6316
|
285
285
|
pygpt_net/data/css/web-blocks.dark.css,sha256=x0b3DYWv0-XeUgCSKajIpkAXAEEg-YR7GIg94pwXO7A,1319
|
286
286
|
pygpt_net/data/css/web-blocks.light.css,sha256=TEzRZsdjY3xLkMQNzQemxORzsKvHkW_c53mYFNAGnNc,1379
|
287
|
-
pygpt_net/data/css/web-chatgpt.css,sha256=
|
287
|
+
pygpt_net/data/css/web-chatgpt.css,sha256=uZUOIiSBcGRG2Brf7GejsgQjotcvPyR6gRsPc8g08XM,6621
|
288
288
|
pygpt_net/data/css/web-chatgpt.dark.css,sha256=fFYWpV4IraSto-GyaNe8sDjmtwEoWOiQYBLmQ5G5TOM,1106
|
289
289
|
pygpt_net/data/css/web-chatgpt.light.css,sha256=XoOyh-VP1gIpCqeBpSOi6jB6zG_7BMfvwo0-t67XmP8,1196
|
290
|
-
pygpt_net/data/css/web-chatgpt_wide.css,sha256=
|
290
|
+
pygpt_net/data/css/web-chatgpt_wide.css,sha256=QMs7L1Tcoc5zCA9YjUZRC01rF12JdF67Dk-zSVhJo8o,6620
|
291
291
|
pygpt_net/data/css/web-chatgpt_wide.dark.css,sha256=fFYWpV4IraSto-GyaNe8sDjmtwEoWOiQYBLmQ5G5TOM,1106
|
292
292
|
pygpt_net/data/css/web-chatgpt_wide.light.css,sha256=XoOyh-VP1gIpCqeBpSOi6jB6zG_7BMfvwo0-t67XmP8,1196
|
293
293
|
pygpt_net/data/fonts/Lato/Lato-Black.ttf,sha256=iUTaWoYezgAYX6Fz6mUyTn1Hl6qGPG-g8D4GaAWXS2w,69484
|
@@ -1823,7 +1823,7 @@ pygpt_net/provider/core/calendar/db_sqlite/storage.py,sha256=QDclQCQdr4QyRIqjgGX
|
|
1823
1823
|
pygpt_net/provider/core/config/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
|
1824
1824
|
pygpt_net/provider/core/config/base.py,sha256=cbvzbMNqL2XgC-36gGubnU37t94AX7LEw0lecb2Nm80,1365
|
1825
1825
|
pygpt_net/provider/core/config/json_file.py,sha256=P78SRQpNr_nF7TYftYLnHl_DVo7GLPNs4_lvw97sqq8,5122
|
1826
|
-
pygpt_net/provider/core/config/patch.py,sha256=
|
1826
|
+
pygpt_net/provider/core/config/patch.py,sha256=RPz0c2HrDocxx2d4PT7TGrOVILI9aCm1qS8jht9cMp4,97019
|
1827
1827
|
pygpt_net/provider/core/ctx/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
|
1828
1828
|
pygpt_net/provider/core/ctx/base.py,sha256=Tfb4MDNe9BXXPU3lbzpdYwJF9S1oa2-mzgu5XT4It9g,3003
|
1829
1829
|
pygpt_net/provider/core/ctx/db_sqlite/__init__.py,sha256=G2pB7kZfREJRLJZmfv3DKTslXC-K7EhNN2sn56q6BFA,11753
|
@@ -1871,7 +1871,7 @@ pygpt_net/provider/core/prompt/json_file.py,sha256=5yfW1RgEa36tX4-ntze4PavWLry0Y
|
|
1871
1871
|
pygpt_net/provider/gpt/__init__.py,sha256=QZgTYRhe9rV2m4e60VTtUxgkYZFEwTX0H4aILSGdV0A,9265
|
1872
1872
|
pygpt_net/provider/gpt/assistants.py,sha256=DSw1YB_J9n2rFD5CPDWZy59I38VSG6uLpYydGLTUPMQ,14083
|
1873
1873
|
pygpt_net/provider/gpt/audio.py,sha256=frHElxYVaHYkNDCMJ9tQMoGqxSaZ-s5oPlAEHUAckkc,2032
|
1874
|
-
pygpt_net/provider/gpt/chat.py,sha256=
|
1874
|
+
pygpt_net/provider/gpt/chat.py,sha256=UQacOqZV2Qezxq3INmE3UwsyD4pPAqZWV_0sKR6xU9U,10521
|
1875
1875
|
pygpt_net/provider/gpt/completion.py,sha256=OusKOb4G11aYRJUjRWcMsf80cRQQvee9DzRe99ubLmc,6164
|
1876
1876
|
pygpt_net/provider/gpt/image.py,sha256=ZqYrtVTcfPa8Kf08pWLKy1Zhvi6pu61GBlslRBauoK0,8967
|
1877
1877
|
pygpt_net/provider/gpt/store.py,sha256=FaVd7SBC_QQ0W26_odJwcrLH54CSq0UZXZnuwIhRm54,17315
|
@@ -2042,8 +2042,8 @@ pygpt_net/ui/layout/chat/input.py,sha256=54Kd3KJNgN41vyydSsRtr9554BS_IDkymPQGiYE
|
|
2042
2042
|
pygpt_net/ui/layout/chat/markdown.py,sha256=hjYY8Da1z0IZZD086_csMcDY1wwagpuQTDZ-XfgeNgs,18656
|
2043
2043
|
pygpt_net/ui/layout/chat/output.py,sha256=4a_BCzk2MKt5z-KYKD8iaapiS4Kj1R7Gj-8v-5R4BLs,9887
|
2044
2044
|
pygpt_net/ui/layout/chat/painter.py,sha256=tveiIs1mNk71c03ZX-K4so4daO3-ED8ZgRNcUrrQtcw,5535
|
2045
|
-
pygpt_net/ui/layout/ctx/__init__.py,sha256=
|
2046
|
-
pygpt_net/ui/layout/ctx/ctx_list.py,sha256=
|
2045
|
+
pygpt_net/ui/layout/ctx/__init__.py,sha256=GDJyolAnFlAd49bbu9-LGsCxOUTAImSH5In4i8YHFOo,1653
|
2046
|
+
pygpt_net/ui/layout/ctx/ctx_list.py,sha256=xSy4PUYsn99lT3bTow0OCKzMl_P52nVIkdZPIc2e8KA,12223
|
2047
2047
|
pygpt_net/ui/layout/ctx/search_input.py,sha256=yM_X2sxeR09JRqmkd2R4z82GRo3I1k4rOb75PgIFydE,1441
|
2048
2048
|
pygpt_net/ui/layout/ctx/video.py,sha256=RzzyGObhlXamXIJHRqA9D2o6eVVulF4kNPVf3BkURGI,1068
|
2049
2049
|
pygpt_net/ui/layout/status.py,sha256=_XqhRz0yrCWNjes-2XCAo55wPZst-F8gm6TtyBHpaSA,1954
|
@@ -2180,8 +2180,8 @@ pygpt_net/ui/widget/textarea/web.py,sha256=2LebPHa_e5lvBqnIVzjwsLcFMoc11BonXgAUs
|
|
2180
2180
|
pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
|
2181
2181
|
pygpt_net/ui/widget/vision/camera.py,sha256=T8b5cmK6uhf_WSSxzPt_Qod8JgMnst6q8sQqRvgQiSA,2584
|
2182
2182
|
pygpt_net/utils.py,sha256=WtrdagJ-BlCjxGEEVq2rhsyAZMcU6JqltCXzOs823po,6707
|
2183
|
-
pygpt_net-2.5.
|
2184
|
-
pygpt_net-2.5.
|
2185
|
-
pygpt_net-2.5.
|
2186
|
-
pygpt_net-2.5.
|
2187
|
-
pygpt_net-2.5.
|
2183
|
+
pygpt_net-2.5.7.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
|
2184
|
+
pygpt_net-2.5.7.dist-info/METADATA,sha256=3UiiY1C-EJ5UYlq6UVEiIh1wqo6sjnBbVimoUaI8h7g,170013
|
2185
|
+
pygpt_net-2.5.7.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
2186
|
+
pygpt_net-2.5.7.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
|
2187
|
+
pygpt_net-2.5.7.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|