pygpt-net 2.6.60__py3-none-any.whl → 2.6.61__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pygpt_net/CHANGELOG.txt +7 -0
- pygpt_net/__init__.py +3 -3
- pygpt_net/controller/chat/common.py +115 -6
- pygpt_net/controller/chat/input.py +4 -1
- pygpt_net/controller/presets/presets.py +121 -6
- pygpt_net/controller/settings/editor.py +0 -15
- pygpt_net/controller/theme/markdown.py +2 -5
- pygpt_net/controller/ui/ui.py +4 -7
- pygpt_net/core/agents/custom/__init__.py +7 -1
- pygpt_net/core/agents/custom/llama_index/factory.py +17 -6
- pygpt_net/core/agents/custom/llama_index/runner.py +35 -2
- pygpt_net/core/agents/custom/llama_index/utils.py +12 -1
- pygpt_net/core/agents/custom/router.py +45 -6
- pygpt_net/core/agents/custom/runner.py +2 -1
- pygpt_net/core/agents/custom/schema.py +3 -1
- pygpt_net/core/agents/custom/utils.py +13 -1
- pygpt_net/core/db/viewer.py +11 -5
- pygpt_net/core/node_editor/graph.py +18 -9
- pygpt_net/core/node_editor/models.py +9 -2
- pygpt_net/core/node_editor/types.py +3 -1
- pygpt_net/core/presets/presets.py +216 -29
- pygpt_net/core/render/markdown/parser.py +0 -2
- pygpt_net/data/config/config.json +5 -6
- pygpt_net/data/config/models.json +3 -3
- pygpt_net/data/config/settings.json +2 -38
- pygpt_net/data/locale/locale.de.ini +64 -1
- pygpt_net/data/locale/locale.en.ini +62 -3
- pygpt_net/data/locale/locale.es.ini +64 -1
- pygpt_net/data/locale/locale.fr.ini +64 -1
- pygpt_net/data/locale/locale.it.ini +64 -1
- pygpt_net/data/locale/locale.pl.ini +65 -2
- pygpt_net/data/locale/locale.uk.ini +64 -1
- pygpt_net/data/locale/locale.zh.ini +64 -1
- pygpt_net/data/locale/plugin.cmd_system.en.ini +62 -66
- pygpt_net/provider/agents/llama_index/flow_from_schema.py +2 -2
- pygpt_net/provider/core/config/patch.py +10 -1
- pygpt_net/provider/core/config/patches/patch_before_2_6_42.py +0 -6
- pygpt_net/tools/agent_builder/tool.py +42 -26
- pygpt_net/tools/agent_builder/ui/dialogs.py +60 -11
- pygpt_net/ui/__init__.py +2 -4
- pygpt_net/ui/dialog/about.py +58 -38
- pygpt_net/ui/dialog/db.py +142 -3
- pygpt_net/ui/dialog/preset.py +47 -8
- pygpt_net/ui/layout/toolbox/presets.py +52 -16
- pygpt_net/ui/widget/dialog/db.py +0 -0
- pygpt_net/ui/widget/lists/preset.py +644 -60
- pygpt_net/ui/widget/node_editor/command.py +10 -10
- pygpt_net/ui/widget/node_editor/config.py +157 -0
- pygpt_net/ui/widget/node_editor/editor.py +183 -151
- pygpt_net/ui/widget/node_editor/item.py +12 -11
- pygpt_net/ui/widget/node_editor/node.py +267 -12
- pygpt_net/ui/widget/node_editor/view.py +180 -63
- pygpt_net/ui/widget/tabs/output.py +1 -1
- pygpt_net/ui/widget/textarea/input.py +2 -2
- pygpt_net/utils.py +114 -2
- {pygpt_net-2.6.60.dist-info → pygpt_net-2.6.61.dist-info}/METADATA +11 -94
- {pygpt_net-2.6.60.dist-info → pygpt_net-2.6.61.dist-info}/RECORD +59 -58
- {pygpt_net-2.6.60.dist-info → pygpt_net-2.6.61.dist-info}/LICENSE +0 -0
- {pygpt_net-2.6.60.dist-info → pygpt_net-2.6.61.dist-info}/WHEEL +0 -0
- {pygpt_net-2.6.60.dist-info → pygpt_net-2.6.61.dist-info}/entry_points.txt +0 -0
|
@@ -6,12 +6,13 @@
|
|
|
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.09.26 03:00:00 #
|
|
10
10
|
# ================================================== #
|
|
11
11
|
|
|
12
12
|
import copy
|
|
13
13
|
import uuid
|
|
14
|
-
from
|
|
14
|
+
from collections import OrderedDict
|
|
15
|
+
from typing import Optional, Tuple, Dict, List
|
|
15
16
|
|
|
16
17
|
from packaging.version import Version
|
|
17
18
|
from pygpt_net.core.types import (
|
|
@@ -165,10 +166,6 @@ class Presets:
|
|
|
165
166
|
return MODE_COMPLETION
|
|
166
167
|
if preset.img:
|
|
167
168
|
return MODE_IMAGE
|
|
168
|
-
# if preset.vision:
|
|
169
|
-
# return MODE_VISION
|
|
170
|
-
# if preset.langchain:
|
|
171
|
-
# return MODE_LANGCHAIN
|
|
172
169
|
if preset.assistant:
|
|
173
170
|
return MODE_ASSISTANT
|
|
174
171
|
if preset.llama_index:
|
|
@@ -214,12 +211,10 @@ class Presets:
|
|
|
214
211
|
attr = self._MODE_TO_ATTR.get(mode)
|
|
215
212
|
if not attr:
|
|
216
213
|
return
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
return key
|
|
222
|
-
i += 1
|
|
214
|
+
ids = list(self.get_by_mode(mode).keys())
|
|
215
|
+
if idx < 0 or idx >= len(ids):
|
|
216
|
+
return
|
|
217
|
+
return ids[idx]
|
|
223
218
|
|
|
224
219
|
def get_by_id(self, mode: str, id: str) -> Optional[PresetItem]:
|
|
225
220
|
"""
|
|
@@ -265,7 +260,19 @@ class Presets:
|
|
|
265
260
|
attr = self._MODE_TO_ATTR.get(mode)
|
|
266
261
|
if not attr:
|
|
267
262
|
return {}
|
|
268
|
-
|
|
263
|
+
data = {id: item for id, item in self.items.items() if getattr(item, attr, False)}
|
|
264
|
+
if not self._dnd_enabled():
|
|
265
|
+
return data
|
|
266
|
+
ordered_ids = self._ordered_ids_for_mode(mode)
|
|
267
|
+
out = OrderedDict()
|
|
268
|
+
for pid in ordered_ids:
|
|
269
|
+
itm = data.get(pid)
|
|
270
|
+
if itm is not None:
|
|
271
|
+
out[pid] = itm
|
|
272
|
+
for pid, itm in data.items():
|
|
273
|
+
if pid not in out:
|
|
274
|
+
out[pid] = itm
|
|
275
|
+
return out
|
|
269
276
|
|
|
270
277
|
def get_idx_by_id(self, mode: str, id: str) -> int:
|
|
271
278
|
"""
|
|
@@ -275,16 +282,13 @@ class Presets:
|
|
|
275
282
|
:param id: preset id
|
|
276
283
|
:return: preset idx
|
|
277
284
|
"""
|
|
278
|
-
|
|
279
|
-
|
|
285
|
+
if id is None:
|
|
286
|
+
return 0
|
|
287
|
+
ids = list(self.get_by_mode(mode).keys())
|
|
288
|
+
try:
|
|
289
|
+
return ids.index(id)
|
|
290
|
+
except ValueError:
|
|
280
291
|
return 0
|
|
281
|
-
i = 0
|
|
282
|
-
for key, item in self.items.items():
|
|
283
|
-
if getattr(item, attr, False):
|
|
284
|
-
if key == id:
|
|
285
|
-
return i
|
|
286
|
-
i += 1
|
|
287
|
-
return 0
|
|
288
292
|
|
|
289
293
|
def get_default(self, mode: str) -> Optional[str]:
|
|
290
294
|
"""
|
|
@@ -293,12 +297,9 @@ class Presets:
|
|
|
293
297
|
:param mode: mode name
|
|
294
298
|
:return: default prompt name
|
|
295
299
|
"""
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
return
|
|
299
|
-
for key, item in self.items.items():
|
|
300
|
-
if getattr(item, attr, False):
|
|
301
|
-
return key
|
|
300
|
+
data = self.get_by_mode(mode)
|
|
301
|
+
for key in data.keys():
|
|
302
|
+
return key
|
|
302
303
|
return None
|
|
303
304
|
|
|
304
305
|
def get_duplicate_name(self, id: str) -> Tuple[str, str]:
|
|
@@ -331,6 +332,7 @@ class Presets:
|
|
|
331
332
|
self.items[id].filename = id
|
|
332
333
|
self.items[id].uuid = str(uuid.uuid4())
|
|
333
334
|
self.sort_by_name()
|
|
335
|
+
self._order_append_new_item(id)
|
|
334
336
|
return id
|
|
335
337
|
|
|
336
338
|
def remove(
|
|
@@ -345,7 +347,10 @@ class Presets:
|
|
|
345
347
|
:param remove_file: also remove preset JSON config file
|
|
346
348
|
"""
|
|
347
349
|
if id in self.items:
|
|
350
|
+
item = self.items[id]
|
|
351
|
+
rem_uuid = item.uuid
|
|
348
352
|
self.items.pop(id)
|
|
353
|
+
self._order_remove_uuid(rem_uuid)
|
|
349
354
|
|
|
350
355
|
if remove_file:
|
|
351
356
|
self.provider.remove(id)
|
|
@@ -366,6 +371,7 @@ class Presets:
|
|
|
366
371
|
:param preset: preset item
|
|
367
372
|
"""
|
|
368
373
|
self.items[preset.filename] = preset
|
|
374
|
+
self._order_append_new_item(preset.filename)
|
|
369
375
|
|
|
370
376
|
def update_and_save(self, preset: PresetItem):
|
|
371
377
|
"""
|
|
@@ -375,6 +381,7 @@ class Presets:
|
|
|
375
381
|
"""
|
|
376
382
|
self.items[preset.filename] = preset
|
|
377
383
|
self.save(preset.filename)
|
|
384
|
+
self._order_append_new_item(preset.filename)
|
|
378
385
|
|
|
379
386
|
def get_all(self) -> Dict[str, PresetItem]:
|
|
380
387
|
"""
|
|
@@ -411,6 +418,7 @@ class Presets:
|
|
|
411
418
|
self.patch_duplicated()
|
|
412
419
|
self.sort_by_name()
|
|
413
420
|
self.append_current()
|
|
421
|
+
self._order_sync_all()
|
|
414
422
|
|
|
415
423
|
def save(self, id: str):
|
|
416
424
|
"""
|
|
@@ -484,4 +492,183 @@ class Presets:
|
|
|
484
492
|
patched = True
|
|
485
493
|
uuids.add(item.uuid)
|
|
486
494
|
if patched:
|
|
487
|
-
self.save_all()
|
|
495
|
+
self.save_all()
|
|
496
|
+
|
|
497
|
+
# ----------------------------
|
|
498
|
+
# Ordering (drag & drop) logic
|
|
499
|
+
# ----------------------------
|
|
500
|
+
|
|
501
|
+
def _cfg_get(self, key, default=None):
|
|
502
|
+
try:
|
|
503
|
+
return self.window.core.config.get(key)
|
|
504
|
+
except Exception:
|
|
505
|
+
return default
|
|
506
|
+
|
|
507
|
+
def _cfg_set(self, key, value):
|
|
508
|
+
try:
|
|
509
|
+
self.window.core.config.set(key, value)
|
|
510
|
+
except Exception:
|
|
511
|
+
pass
|
|
512
|
+
|
|
513
|
+
def _dnd_enabled(self) -> bool:
|
|
514
|
+
"""
|
|
515
|
+
Check global switch for DnD ordering.
|
|
516
|
+
"""
|
|
517
|
+
v = self._cfg_get('presets.drag_and_drop.enabled', False)
|
|
518
|
+
return bool(v)
|
|
519
|
+
|
|
520
|
+
@staticmethod
|
|
521
|
+
def _is_special_id(pid: str) -> bool:
|
|
522
|
+
"""
|
|
523
|
+
current.* presets are special and pinned at top; not movable.
|
|
524
|
+
"""
|
|
525
|
+
return pid.startswith("current.")
|
|
526
|
+
|
|
527
|
+
def _uuid_to_id_map(self) -> Dict[str, str]:
|
|
528
|
+
return {item.uuid: pid for pid, item in self.items.items() if item.uuid}
|
|
529
|
+
|
|
530
|
+
def _visible_ids_for_mode(self, mode: str) -> List[str]:
|
|
531
|
+
attr = self._MODE_TO_ATTR.get(mode)
|
|
532
|
+
if not attr:
|
|
533
|
+
return []
|
|
534
|
+
return [pid for pid, it in self.items.items() if getattr(it, attr, False)]
|
|
535
|
+
|
|
536
|
+
def _visible_regular_ids_for_mode(self, mode: str) -> List[str]:
|
|
537
|
+
return [pid for pid in self._visible_ids_for_mode(mode) if not self._is_special_id(pid)]
|
|
538
|
+
|
|
539
|
+
def _visible_regular_uuids_for_mode(self, mode: str) -> List[str]:
|
|
540
|
+
ids = self._visible_regular_ids_for_mode(mode)
|
|
541
|
+
return [self.items[pid].uuid for pid in ids if pid in self.items and self.items[pid].uuid]
|
|
542
|
+
|
|
543
|
+
def _build_global_uuid_order(self) -> List[str]:
|
|
544
|
+
"""
|
|
545
|
+
Rebuild 'global' order each time based on name-sorted presets (excluding current.*).
|
|
546
|
+
"""
|
|
547
|
+
regs = [(pid, it) for pid, it in self.items.items() if not self._is_special_id(pid)]
|
|
548
|
+
regs.sort(key=lambda x: x[1].name)
|
|
549
|
+
return [it.uuid for pid, it in regs if it.uuid]
|
|
550
|
+
|
|
551
|
+
def _order_get_store(self) -> Dict[str, List[str]]:
|
|
552
|
+
store = self._cfg_get('presets_order', {}) or {}
|
|
553
|
+
fixed = {}
|
|
554
|
+
for k, v in store.items():
|
|
555
|
+
if isinstance(v, dict):
|
|
556
|
+
try:
|
|
557
|
+
seq = [v[i] for i in sorted(v.keys(), key=lambda x: int(x))]
|
|
558
|
+
except Exception:
|
|
559
|
+
seq = list(v.values())
|
|
560
|
+
fixed[k] = seq
|
|
561
|
+
elif isinstance(v, list):
|
|
562
|
+
fixed[k] = v
|
|
563
|
+
return fixed
|
|
564
|
+
|
|
565
|
+
def _order_set_store(self, store: Dict[str, List[str]]):
|
|
566
|
+
self._cfg_set('presets_order', store)
|
|
567
|
+
|
|
568
|
+
def _order_sync_mode(self, mode: str, store: Dict[str, List[str]]) -> List[str]:
|
|
569
|
+
"""
|
|
570
|
+
Ensure mode order is valid:
|
|
571
|
+
- Start from mode order or fallback to global
|
|
572
|
+
- Drop unknown UUIDs
|
|
573
|
+
- Append missing visible UUIDs at the end
|
|
574
|
+
"""
|
|
575
|
+
visible = self._visible_regular_uuids_for_mode(mode)
|
|
576
|
+
visible_set = set(visible)
|
|
577
|
+
|
|
578
|
+
base = list(store.get(mode) or [])
|
|
579
|
+
if not base:
|
|
580
|
+
base = [u for u in store.get('global', []) if u in visible_set]
|
|
581
|
+
|
|
582
|
+
base = [u for u in base if u in visible_set]
|
|
583
|
+
|
|
584
|
+
seen = set(base)
|
|
585
|
+
for u in visible:
|
|
586
|
+
if u not in seen:
|
|
587
|
+
base.append(u)
|
|
588
|
+
seen.add(u)
|
|
589
|
+
|
|
590
|
+
dedup = []
|
|
591
|
+
s = set()
|
|
592
|
+
for u in base:
|
|
593
|
+
if u not in s:
|
|
594
|
+
dedup.append(u)
|
|
595
|
+
s.add(u)
|
|
596
|
+
|
|
597
|
+
store[mode] = dedup
|
|
598
|
+
return dedup
|
|
599
|
+
|
|
600
|
+
def _order_sync_all(self):
|
|
601
|
+
"""
|
|
602
|
+
Sync presets_order with current items and rebuild 'global' each time.
|
|
603
|
+
"""
|
|
604
|
+
store = self._order_get_store()
|
|
605
|
+
store['global'] = self._build_global_uuid_order()
|
|
606
|
+
|
|
607
|
+
existing = set([it.uuid for it in self.items.values() if it.uuid])
|
|
608
|
+
for k, lst in list(store.items()):
|
|
609
|
+
if isinstance(lst, list):
|
|
610
|
+
store[k] = [u for u in lst if u in existing]
|
|
611
|
+
|
|
612
|
+
for mode in self._MODE_TO_ATTR.keys():
|
|
613
|
+
self._order_sync_mode(mode, store)
|
|
614
|
+
|
|
615
|
+
self._order_set_store(store)
|
|
616
|
+
|
|
617
|
+
def _ordered_ids_for_mode(self, mode: str) -> List[str]:
|
|
618
|
+
"""
|
|
619
|
+
Produce ordered preset IDs for given mode:
|
|
620
|
+
- current.<mode> first (if exists)
|
|
621
|
+
- then remaining items by order stored as UUIDs
|
|
622
|
+
"""
|
|
623
|
+
attr = self._MODE_TO_ATTR.get(mode)
|
|
624
|
+
if not attr:
|
|
625
|
+
return []
|
|
626
|
+
store = self._order_get_store()
|
|
627
|
+
ordered_uuids = self._order_sync_mode(mode, store)
|
|
628
|
+
self._order_set_store(store)
|
|
629
|
+
|
|
630
|
+
uuid_to_id = self._uuid_to_id_map()
|
|
631
|
+
head_id = f"current.{mode}"
|
|
632
|
+
out: List[str] = []
|
|
633
|
+
if head_id in self.items and getattr(self.items[head_id], attr, False):
|
|
634
|
+
out.append(head_id)
|
|
635
|
+
for u in ordered_uuids:
|
|
636
|
+
pid = uuid_to_id.get(u)
|
|
637
|
+
if pid and getattr(self.items.get(pid, PresetItem()), attr, False):
|
|
638
|
+
out.append(pid)
|
|
639
|
+
return out
|
|
640
|
+
|
|
641
|
+
def _order_append_new_item(self, pid: str):
|
|
642
|
+
"""
|
|
643
|
+
Append new preset (by ID) to the end of all applicable mode orders.
|
|
644
|
+
"""
|
|
645
|
+
if pid not in self.items:
|
|
646
|
+
return
|
|
647
|
+
if self._is_special_id(pid):
|
|
648
|
+
return
|
|
649
|
+
item = self.items[pid]
|
|
650
|
+
if not item.uuid:
|
|
651
|
+
return
|
|
652
|
+
store = self._order_get_store()
|
|
653
|
+
modes = [m for m, attr in self._MODE_TO_ATTR.items() if getattr(item, attr, False)]
|
|
654
|
+
for m in modes:
|
|
655
|
+
seq = list(store.get(m) or [])
|
|
656
|
+
if item.uuid not in seq:
|
|
657
|
+
seq.append(item.uuid)
|
|
658
|
+
store[m] = seq
|
|
659
|
+
self._order_set_store(store)
|
|
660
|
+
|
|
661
|
+
def _order_remove_uuid(self, rem_uuid: Optional[str]):
|
|
662
|
+
"""
|
|
663
|
+
Remove a UUID from all order lists (including global).
|
|
664
|
+
"""
|
|
665
|
+
if not rem_uuid:
|
|
666
|
+
return
|
|
667
|
+
store = self._order_get_store()
|
|
668
|
+
changed = False
|
|
669
|
+
for k, lst in list(store.items()):
|
|
670
|
+
if isinstance(lst, list) and rem_uuid in lst:
|
|
671
|
+
store[k] = [u for u in lst if u != rem_uuid]
|
|
672
|
+
changed = True
|
|
673
|
+
if changed:
|
|
674
|
+
self._order_set_store(store)
|
|
@@ -63,8 +63,6 @@ class Parser:
|
|
|
63
63
|
html = self.md.convert(text.strip())
|
|
64
64
|
soup = BeautifulSoup(html, 'html.parser')
|
|
65
65
|
self.strip_whitespace_lists(soup) # strip whitespace from codeblocks
|
|
66
|
-
if self.window.core.config.get("ctx.convert_lists"):
|
|
67
|
-
self.convert_lists_to_paragraphs(soup) # convert lists to paragraphs
|
|
68
66
|
self.strip_whitespace_codeblocks(soup) # strip whitespace from codeblocks
|
|
69
67
|
self.parse_code_blocks(soup) # parse code blocks
|
|
70
68
|
self.format_images(soup) # add width to img tags
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"__meta__": {
|
|
3
|
-
"version": "2.6.
|
|
4
|
-
"app.version": "2.6.
|
|
5
|
-
"updated_at": "2025-09-
|
|
3
|
+
"version": "2.6.61",
|
|
4
|
+
"app.version": "2.6.61",
|
|
5
|
+
"updated_at": "2025-09-26T00:00:00"
|
|
6
6
|
},
|
|
7
7
|
"access.audio.event.speech": false,
|
|
8
8
|
"access.audio.event.speech.disabled": [],
|
|
@@ -141,7 +141,6 @@
|
|
|
141
141
|
"ctx.auto_summary": true,
|
|
142
142
|
"ctx.auto_summary.model": "gpt-4o-mini",
|
|
143
143
|
"ctx.code_interpreter": true,
|
|
144
|
-
"ctx.convert_lists": false,
|
|
145
144
|
"ctx.counters.all": false,
|
|
146
145
|
"ctx.edit_icons": true,
|
|
147
146
|
"ctx.list.expanded": [],
|
|
@@ -219,7 +218,6 @@
|
|
|
219
218
|
"interpreter.input": "",
|
|
220
219
|
"interpreter.ipython": true,
|
|
221
220
|
"lang": "en",
|
|
222
|
-
"layout.animation.disable": false,
|
|
223
221
|
"layout.density": -1,
|
|
224
222
|
"layout.dialog.geometry.store": true,
|
|
225
223
|
"layout.dialog.geometry": {},
|
|
@@ -398,6 +396,8 @@
|
|
|
398
396
|
"presence_penalty": 0.0,
|
|
399
397
|
"preset": "current.chat",
|
|
400
398
|
"preset.plugins": "",
|
|
399
|
+
"presets.drag_and_drop.enabled": true,
|
|
400
|
+
"presets_order": {},
|
|
401
401
|
"prompt": "",
|
|
402
402
|
"prompt.agent.continue": "Continue, or complete the run if the goal is fully achieved.",
|
|
403
403
|
"prompt.agent.continue.always": "Continue reasoning...",
|
|
@@ -522,7 +522,6 @@
|
|
|
522
522
|
},
|
|
523
523
|
"temperature": 1.0,
|
|
524
524
|
"theme": "dark_darker",
|
|
525
|
-
"theme.markdown": true,
|
|
526
525
|
"theme.style": "chatgpt",
|
|
527
526
|
"top_p": 1.0,
|
|
528
527
|
"upload.data_dir": false,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"__meta__": {
|
|
3
|
-
"version": "2.6.
|
|
4
|
-
"app.version": "2.6.
|
|
5
|
-
"updated_at": "2025-09-
|
|
3
|
+
"version": "2.6.61",
|
|
4
|
+
"app.version": "2.6.61",
|
|
5
|
+
"updated_at": "2025-09-26T00:00:00"
|
|
6
6
|
},
|
|
7
7
|
"items": {
|
|
8
8
|
"SpeakLeash/bielik-11b-v2.3-instruct:Q4_K_M": {
|
|
@@ -838,19 +838,6 @@
|
|
|
838
838
|
"step": 1,
|
|
839
839
|
"advanced": false
|
|
840
840
|
},
|
|
841
|
-
"layout.animation.disable": {
|
|
842
|
-
"section": "layout",
|
|
843
|
-
"type": "bool",
|
|
844
|
-
"slider": false,
|
|
845
|
-
"label": "settings.layout.animation.disable",
|
|
846
|
-
"description": "settings.layout.animation.disable.desc",
|
|
847
|
-
"value": false,
|
|
848
|
-
"min": 0,
|
|
849
|
-
"max": 0,
|
|
850
|
-
"multiplier": 1,
|
|
851
|
-
"step": 1,
|
|
852
|
-
"advanced": false
|
|
853
|
-
},
|
|
854
841
|
"layout.dialog.geometry.store": {
|
|
855
842
|
"section": "layout",
|
|
856
843
|
"type": "bool",
|
|
@@ -863,18 +850,6 @@
|
|
|
863
850
|
"step": 1,
|
|
864
851
|
"advanced": false
|
|
865
852
|
},
|
|
866
|
-
"theme.markdown": {
|
|
867
|
-
"section": "layout",
|
|
868
|
-
"type": "bool",
|
|
869
|
-
"slider": false,
|
|
870
|
-
"label": "settings.theme.markdown",
|
|
871
|
-
"value": true,
|
|
872
|
-
"min": 0,
|
|
873
|
-
"max": 0,
|
|
874
|
-
"multiplier": 1,
|
|
875
|
-
"step": 1,
|
|
876
|
-
"advanced": false
|
|
877
|
-
},
|
|
878
853
|
"upload.store": {
|
|
879
854
|
"section": "files",
|
|
880
855
|
"type": "bool",
|
|
@@ -1179,24 +1154,12 @@
|
|
|
1179
1154
|
"step": null,
|
|
1180
1155
|
"secret": false
|
|
1181
1156
|
},
|
|
1182
|
-
"ctx.convert_lists": {
|
|
1183
|
-
"section": "ctx",
|
|
1184
|
-
"type": "bool",
|
|
1185
|
-
"slider": false,
|
|
1186
|
-
"label": "settings.ctx.convert_lists",
|
|
1187
|
-
"description": "settings.ctx.convert_lists.desc",
|
|
1188
|
-
"value": true,
|
|
1189
|
-
"min": null,
|
|
1190
|
-
"max": null,
|
|
1191
|
-
"multiplier": null,
|
|
1192
|
-
"step": null,
|
|
1193
|
-
"advanced": false
|
|
1194
|
-
},
|
|
1195
1157
|
"max_output_tokens": {
|
|
1196
1158
|
"section": "model",
|
|
1197
1159
|
"type": "int",
|
|
1198
1160
|
"slider": true,
|
|
1199
1161
|
"label": "settings.max_output_tokens",
|
|
1162
|
+
"description": "settings.zero.limit.desc",
|
|
1200
1163
|
"value": 50,
|
|
1201
1164
|
"min": 0,
|
|
1202
1165
|
"max": 32000,
|
|
@@ -1209,6 +1172,7 @@
|
|
|
1209
1172
|
"type": "int",
|
|
1210
1173
|
"slider": true,
|
|
1211
1174
|
"label": "settings.max_total_tokens",
|
|
1175
|
+
"description": "settings.zero.limit.desc",
|
|
1212
1176
|
"value": 400,
|
|
1213
1177
|
"min": 0,
|
|
1214
1178
|
"max": 256000,
|
|
@@ -43,6 +43,7 @@ action.profile.delete = Profil entfernen (nur aus Liste)
|
|
|
43
43
|
action.profile.delete_all = Profil löschen (und alle Benutzerdateien)
|
|
44
44
|
action.redo = Wiederholen
|
|
45
45
|
action.refresh = Aktualisieren
|
|
46
|
+
action.reload: Neuladen
|
|
46
47
|
action.rename = Umbenennen
|
|
47
48
|
action.reset = Zurücksetzen
|
|
48
49
|
action.restore = Wiederherstellen
|
|
@@ -50,7 +51,8 @@ action.save = Speichern
|
|
|
50
51
|
action.save_as = Speichern unter...
|
|
51
52
|
action.save_selection_as = Auswahl speichern unter...
|
|
52
53
|
action.select_all = Alle auswählen
|
|
53
|
-
action.tab.add.chat
|
|
54
|
+
action.tab.add.chat: Neuen Chat hinzufügen
|
|
55
|
+
action.tab.add.chat.tooltip: Neuen Chat hinzufügen (RMT für mehr Optionen...)
|
|
54
56
|
action.tab.add.notepad = Neuen Notizblock hinzufügen
|
|
55
57
|
action.tab.add.tool = Neues Werkzeug hinzufügen
|
|
56
58
|
action.tab.close = Schließen
|
|
@@ -72,6 +74,8 @@ action.use.read_cmd = Bitten, diese Datei zu lesen...
|
|
|
72
74
|
action.video.open = Video oder Audio öffnen...
|
|
73
75
|
action.video.play = Video oder Audio abspielen...
|
|
74
76
|
action.video.transcribe = Ton transkribieren...
|
|
77
|
+
agent.builder.title = Agenten-Editor
|
|
78
|
+
agent.builder.tooltip = Öffne den Agenten-Editor
|
|
75
79
|
agent.coder.additional.label = Zusätzlicher Prompt
|
|
76
80
|
agent.coder.additional.prompt.desc = Zusätzlicher Prompt für Agent (wird zum Basis-Prompt hinzugefügt)
|
|
77
81
|
agent.coder.base.label = Basis-Prompt
|
|
@@ -101,6 +105,7 @@ agent.option.prompt.planner.desc = Prompt für Planer-Agent
|
|
|
101
105
|
agent.option.prompt.search.desc = Prompt für Such-Agent
|
|
102
106
|
agent.option.prompt.supervisor.desc = Prompt für Supervisor
|
|
103
107
|
agent.option.prompt.worker.desc = Prompt für Arbeiter
|
|
108
|
+
agent.option.role = Kurze Beschreibung des Betriebs des Agents zur Anweisung des Modells (optional)
|
|
104
109
|
agent.option.section.base = Basisagent
|
|
105
110
|
agent.option.section.chooser = Wähler
|
|
106
111
|
agent.option.section.feedback = Feedback
|
|
@@ -239,6 +244,8 @@ clipboard.copied_to = In die Zwischenablage kopiert:
|
|
|
239
244
|
cmd.enabled = + Werkzeuge
|
|
240
245
|
cmd.tip = Tipp: Um die Ausführung von Werkzeugen aus Plugins zu ermöglichen, müssen Sie die Option "+ Werkzeuge" aktivieren.
|
|
241
246
|
coming_soon = Demnächst...
|
|
247
|
+
common.down = Nach unten verschieben
|
|
248
|
+
common.up = Nach oben verschieben
|
|
242
249
|
confirm.assistant.delete = Assistent löschen?
|
|
243
250
|
confirm.assistant.files.clear = Dateien löschen (nur lokal)?
|
|
244
251
|
confirm.assistant.files.truncate = Sind Sie sicher, dass Sie alle Dateien von allen Speichern entfernen möchten?
|
|
@@ -678,6 +685,8 @@ html_canvas.clear.confirm = HTML-Canvas-Ausgabe löschen?
|
|
|
678
685
|
icon.audio.input = Audioeingang aktivieren/deaktivieren
|
|
679
686
|
icon.audio.output = Audioausgang aktivieren/deaktivieren
|
|
680
687
|
icon.remote_tool.web = Websuche (ferngesteuertes Werkzeug, kein lokales Werkzeug)
|
|
688
|
+
icon.remote_tool.web.disabled: Websuche (Remote-Tool, kein lokales Tool) - deaktiviert
|
|
689
|
+
icon.remote_tool.web.enabled: Websuche (Remote-Tool, kein lokales Tool) - aktiviert
|
|
681
690
|
icon.video.capture = Videoaufnahme von der Kamera aktivieren/deaktivieren
|
|
682
691
|
idx.btn.clear = Index löschen
|
|
683
692
|
idx.btn.index_all = Alles indizieren
|
|
@@ -773,6 +782,7 @@ menu.config.save = Konfiguration speichern
|
|
|
773
782
|
menu.config.settings = Einstellungen...
|
|
774
783
|
menu.debug = Debug
|
|
775
784
|
menu.debug.agent = Agent...
|
|
785
|
+
menu.debug.agent_builder = Agenten-Editor
|
|
776
786
|
menu.debug.app.log = Logdatei ansehen (app.log)
|
|
777
787
|
menu.debug.assistants = Assistenten...
|
|
778
788
|
menu.debug.attachments = Dateien/Anhänge...
|
|
@@ -826,6 +836,7 @@ menu.theme.style = Stil...
|
|
|
826
836
|
menu.theme.syntax = Syntaxhervorhebung des Codes...
|
|
827
837
|
menu.theme.tooltips = Tooltips anzeigen
|
|
828
838
|
menu.tools = Werkzeuge
|
|
839
|
+
menu.tools.agent.builder = Agenten-Editor
|
|
829
840
|
menu.tools.audio.transcribe = Audio-/Videodateien transkribieren
|
|
830
841
|
menu.tools.html_canvas = HTML/JS-Canvas
|
|
831
842
|
menu.tools.image.viewer = Bildbetrachter
|
|
@@ -933,6 +944,57 @@ multimodal.audio = Audio
|
|
|
933
944
|
multimodal.image = Bild
|
|
934
945
|
multimodal.text = Text
|
|
935
946
|
multimodal.video = Video
|
|
947
|
+
node.editor.bottom.tip: Rechtsklick: Knoten hinzufügen / rückgängig machen / wiederherstellen • Mittelklick: Ansichts verschieben • Strg + Mausrad: zoom; Linksklick auf Port: Verbindung erstellen • Strg + Linksklick auf Port: neu verdrahten/lösen • Rechtsklick oder ENTF auf Knoten/Verbindung: entfernen
|
|
948
|
+
node.editor.cap.na: k.A.
|
|
949
|
+
node.editor.cap.unlimited: unbegrenzt (∞)
|
|
950
|
+
node.editor.cmd.add: Hinzufügen
|
|
951
|
+
node.editor.cmd.clear: Leeren
|
|
952
|
+
node.editor.cmd.connect: Verbinden
|
|
953
|
+
node.editor.cmd.delete_connection: Verbindung löschen
|
|
954
|
+
node.editor.cmd.delete_node: Knoten löschen
|
|
955
|
+
node.editor.cmd.move_node: Knoten verschieben
|
|
956
|
+
node.editor.cmd.resize_node: Knotengröße ändern
|
|
957
|
+
node.editor.cmd.rewire_connection: Verbindung neu verdrahten
|
|
958
|
+
node.editor.edge.delete: Verbindung löschen
|
|
959
|
+
node.editor.hint.click_start: Klicken: eine neue Verbindung starten
|
|
960
|
+
node.editor.hint.ctrl_rewire: Strg+Klicken: bestehende neu verdrahten/lösen
|
|
961
|
+
node.editor.label.id: ID
|
|
962
|
+
node.editor.lbl.allowed: Erlaubte Verbindungen:
|
|
963
|
+
node.editor.lbl.node: Knoten:
|
|
964
|
+
node.editor.lbl.port: Anschluss:
|
|
965
|
+
node.editor.list.tip: Liste der hinzugefügten benutzerdefinierten Agenten-Workflows
|
|
966
|
+
node.editor.macro.delete_selection: Auswahl löschen
|
|
967
|
+
node.editor.menu.add: Hinzufügen
|
|
968
|
+
node.editor.menu.clear: Leeren
|
|
969
|
+
node.editor.menu.redo: Wiederherstellen
|
|
970
|
+
node.editor.menu.undo: Rückgängig
|
|
971
|
+
node.editor.node.delete: Löschen
|
|
972
|
+
node.editor.node.rename: Umbenennen
|
|
973
|
+
node.editor.overlay.grab: Greifen: globales Schwenken mit LMT umschalten
|
|
974
|
+
node.editor.overlay.zoom_in: Vergrößern
|
|
975
|
+
node.editor.overlay.zoom_out: Verkleinern
|
|
976
|
+
node.editor.property.agent.name = Agent
|
|
977
|
+
node.editor.property.input.name = Eingabe
|
|
978
|
+
node.editor.property.instruction.name = Anweisung
|
|
979
|
+
node.editor.property.instruction.placeholder = Systemanweisung für den Agenten
|
|
980
|
+
node.editor.property.local_tools.name = Lokale Werkzeuge
|
|
981
|
+
node.editor.property.memory.name = Speicher
|
|
982
|
+
node.editor.property.name.name = Name
|
|
983
|
+
node.editor.property.name.placeholder = Name des Agenten
|
|
984
|
+
node.editor.property.output.name = Ausgabe
|
|
985
|
+
node.editor.property.remote_tools.name = Remote-Werkzeuge
|
|
986
|
+
node.editor.property.role.name = Rolle
|
|
987
|
+
node.editor.property.role.placeholder = Optionale kurze Beschreibung des Zwecks des Agenten
|
|
988
|
+
node.editor.rename.label: Name:
|
|
989
|
+
node.editor.rename.title: Knoten umbenennen
|
|
990
|
+
node.editor.side.input: Eingang
|
|
991
|
+
node.editor.side.output: Ausgang
|
|
992
|
+
node.editor.spec.agent.title = Agent
|
|
993
|
+
node.editor.spec.end.title = Ende
|
|
994
|
+
node.editor.spec.memory.title = Speicher (Kontext)
|
|
995
|
+
node.editor.spec.start.title = Start
|
|
996
|
+
node.editor.status.no_nodes: Keine Knoten
|
|
997
|
+
node.editor.type.unknown: Unbekannt
|
|
936
998
|
notify.agent.goal.content = Agent: das Ziel wurde erreicht.
|
|
937
999
|
notify.agent.goal.title = Ziel erreicht
|
|
938
1000
|
notify.agent.stop.content = Agent: gestoppt
|
|
@@ -1418,6 +1480,7 @@ settings.vision.capture.idx = Kameragerät
|
|
|
1418
1480
|
settings.vision.capture.idx.desc = Wählen Sie ein Kameragerät für die Echtzeit-Videoaufnahme
|
|
1419
1481
|
settings.vision.capture.quality = Aufnahmequalität (%)
|
|
1420
1482
|
settings.vision.capture.width = Aufnahmewidth (in Pixeln)
|
|
1483
|
+
settings.zero.limit.desc: Stellen Sie 0 ein, um das Limit zu deaktivieren.
|
|
1421
1484
|
settings.zoom = Zoomen des Chat-Ausgabefensters
|
|
1422
1485
|
speech.enable = Sprachausgabe aktivieren
|
|
1423
1486
|
speech.listening = Sprechen Sie jetzt...
|