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.
Files changed (60) hide show
  1. pygpt_net/CHANGELOG.txt +7 -0
  2. pygpt_net/__init__.py +3 -3
  3. pygpt_net/controller/chat/common.py +115 -6
  4. pygpt_net/controller/chat/input.py +4 -1
  5. pygpt_net/controller/presets/presets.py +121 -6
  6. pygpt_net/controller/settings/editor.py +0 -15
  7. pygpt_net/controller/theme/markdown.py +2 -5
  8. pygpt_net/controller/ui/ui.py +4 -7
  9. pygpt_net/core/agents/custom/__init__.py +7 -1
  10. pygpt_net/core/agents/custom/llama_index/factory.py +17 -6
  11. pygpt_net/core/agents/custom/llama_index/runner.py +35 -2
  12. pygpt_net/core/agents/custom/llama_index/utils.py +12 -1
  13. pygpt_net/core/agents/custom/router.py +45 -6
  14. pygpt_net/core/agents/custom/runner.py +2 -1
  15. pygpt_net/core/agents/custom/schema.py +3 -1
  16. pygpt_net/core/agents/custom/utils.py +13 -1
  17. pygpt_net/core/db/viewer.py +11 -5
  18. pygpt_net/core/node_editor/graph.py +18 -9
  19. pygpt_net/core/node_editor/models.py +9 -2
  20. pygpt_net/core/node_editor/types.py +3 -1
  21. pygpt_net/core/presets/presets.py +216 -29
  22. pygpt_net/core/render/markdown/parser.py +0 -2
  23. pygpt_net/data/config/config.json +5 -6
  24. pygpt_net/data/config/models.json +3 -3
  25. pygpt_net/data/config/settings.json +2 -38
  26. pygpt_net/data/locale/locale.de.ini +64 -1
  27. pygpt_net/data/locale/locale.en.ini +62 -3
  28. pygpt_net/data/locale/locale.es.ini +64 -1
  29. pygpt_net/data/locale/locale.fr.ini +64 -1
  30. pygpt_net/data/locale/locale.it.ini +64 -1
  31. pygpt_net/data/locale/locale.pl.ini +65 -2
  32. pygpt_net/data/locale/locale.uk.ini +64 -1
  33. pygpt_net/data/locale/locale.zh.ini +64 -1
  34. pygpt_net/data/locale/plugin.cmd_system.en.ini +62 -66
  35. pygpt_net/provider/agents/llama_index/flow_from_schema.py +2 -2
  36. pygpt_net/provider/core/config/patch.py +10 -1
  37. pygpt_net/provider/core/config/patches/patch_before_2_6_42.py +0 -6
  38. pygpt_net/tools/agent_builder/tool.py +42 -26
  39. pygpt_net/tools/agent_builder/ui/dialogs.py +60 -11
  40. pygpt_net/ui/__init__.py +2 -4
  41. pygpt_net/ui/dialog/about.py +58 -38
  42. pygpt_net/ui/dialog/db.py +142 -3
  43. pygpt_net/ui/dialog/preset.py +47 -8
  44. pygpt_net/ui/layout/toolbox/presets.py +52 -16
  45. pygpt_net/ui/widget/dialog/db.py +0 -0
  46. pygpt_net/ui/widget/lists/preset.py +644 -60
  47. pygpt_net/ui/widget/node_editor/command.py +10 -10
  48. pygpt_net/ui/widget/node_editor/config.py +157 -0
  49. pygpt_net/ui/widget/node_editor/editor.py +183 -151
  50. pygpt_net/ui/widget/node_editor/item.py +12 -11
  51. pygpt_net/ui/widget/node_editor/node.py +267 -12
  52. pygpt_net/ui/widget/node_editor/view.py +180 -63
  53. pygpt_net/ui/widget/tabs/output.py +1 -1
  54. pygpt_net/ui/widget/textarea/input.py +2 -2
  55. pygpt_net/utils.py +114 -2
  56. {pygpt_net-2.6.60.dist-info → pygpt_net-2.6.61.dist-info}/METADATA +11 -94
  57. {pygpt_net-2.6.60.dist-info → pygpt_net-2.6.61.dist-info}/RECORD +59 -58
  58. {pygpt_net-2.6.60.dist-info → pygpt_net-2.6.61.dist-info}/LICENSE +0 -0
  59. {pygpt_net-2.6.60.dist-info → pygpt_net-2.6.61.dist-info}/WHEEL +0 -0
  60. {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.08.28 09:00:00 #
9
+ # Updated Date: 2025.09.26 03:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import copy
13
13
  import uuid
14
- from typing import Optional, Tuple, Dict
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
- i = 0
218
- for key, item in self.items.items():
219
- if getattr(item, attr, False):
220
- if i == idx:
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
- return {id: item for id, item in self.items.items() if getattr(item, attr, False)}
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
- attr = self._MODE_TO_ATTR.get(mode)
279
- if not attr:
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
- attr = self._MODE_TO_ATTR.get(mode)
297
- if not attr:
298
- return None
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.60",
4
- "app.version": "2.6.60",
5
- "updated_at": "2025-09-25T00:00:00"
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.60",
4
- "app.version": "2.6.60",
5
- "updated_at": "2025-09-25T00:00:00"
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 = Neuen Chat hinzufügen
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...