pygpt-net 2.7.4__py3-none-any.whl → 2.7.6__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 (159) hide show
  1. pygpt_net/CHANGELOG.txt +15 -0
  2. pygpt_net/__init__.py +4 -4
  3. pygpt_net/app_core.py +4 -2
  4. pygpt_net/controller/__init__.py +5 -1
  5. pygpt_net/controller/assistant/assistant.py +1 -4
  6. pygpt_net/controller/assistant/batch.py +5 -504
  7. pygpt_net/controller/assistant/editor.py +5 -5
  8. pygpt_net/controller/assistant/files.py +16 -16
  9. pygpt_net/controller/chat/handler/google_stream.py +307 -1
  10. pygpt_net/controller/chat/handler/worker.py +10 -25
  11. pygpt_net/controller/chat/handler/xai_stream.py +621 -52
  12. pygpt_net/controller/chat/image.py +2 -2
  13. pygpt_net/controller/debug/fixtures.py +3 -2
  14. pygpt_net/controller/dialogs/confirm.py +73 -101
  15. pygpt_net/controller/files/files.py +65 -4
  16. pygpt_net/controller/lang/mapping.py +9 -9
  17. pygpt_net/controller/painter/capture.py +50 -1
  18. pygpt_net/controller/presets/presets.py +2 -1
  19. pygpt_net/controller/remote_store/__init__.py +12 -0
  20. pygpt_net/{provider/core/assistant_file/db_sqlite → controller/remote_store/google}/__init__.py +2 -2
  21. pygpt_net/controller/remote_store/google/batch.py +402 -0
  22. pygpt_net/controller/remote_store/google/store.py +615 -0
  23. pygpt_net/controller/remote_store/openai/__init__.py +12 -0
  24. pygpt_net/controller/remote_store/openai/batch.py +524 -0
  25. pygpt_net/controller/{assistant → remote_store/openai}/store.py +63 -60
  26. pygpt_net/controller/remote_store/remote_store.py +35 -0
  27. pygpt_net/controller/ui/ui.py +20 -1
  28. pygpt_net/core/assistants/assistants.py +3 -15
  29. pygpt_net/core/db/database.py +5 -3
  30. pygpt_net/core/filesystem/url.py +4 -1
  31. pygpt_net/core/locale/placeholder.py +35 -0
  32. pygpt_net/core/remote_store/__init__.py +12 -0
  33. pygpt_net/core/remote_store/google/__init__.py +11 -0
  34. pygpt_net/core/remote_store/google/files.py +224 -0
  35. pygpt_net/core/remote_store/google/store.py +248 -0
  36. pygpt_net/core/remote_store/openai/__init__.py +11 -0
  37. pygpt_net/core/{assistants → remote_store/openai}/files.py +26 -19
  38. pygpt_net/core/{assistants → remote_store/openai}/store.py +32 -15
  39. pygpt_net/core/remote_store/remote_store.py +24 -0
  40. pygpt_net/core/render/web/body.py +3 -2
  41. pygpt_net/core/types/chunk.py +27 -0
  42. pygpt_net/data/config/config.json +8 -4
  43. pygpt_net/data/config/models.json +77 -3
  44. pygpt_net/data/config/settings.json +45 -0
  45. pygpt_net/data/js/app/template.js +1 -1
  46. pygpt_net/data/js/app.min.js +2 -2
  47. pygpt_net/data/locale/locale.de.ini +44 -41
  48. pygpt_net/data/locale/locale.en.ini +56 -43
  49. pygpt_net/data/locale/locale.es.ini +44 -41
  50. pygpt_net/data/locale/locale.fr.ini +44 -41
  51. pygpt_net/data/locale/locale.it.ini +44 -41
  52. pygpt_net/data/locale/locale.pl.ini +45 -42
  53. pygpt_net/data/locale/locale.uk.ini +44 -41
  54. pygpt_net/data/locale/locale.zh.ini +44 -41
  55. pygpt_net/data/locale/plugin.cmd_history.de.ini +1 -1
  56. pygpt_net/data/locale/plugin.cmd_history.en.ini +1 -1
  57. pygpt_net/data/locale/plugin.cmd_history.es.ini +1 -1
  58. pygpt_net/data/locale/plugin.cmd_history.fr.ini +1 -1
  59. pygpt_net/data/locale/plugin.cmd_history.it.ini +1 -1
  60. pygpt_net/data/locale/plugin.cmd_history.pl.ini +1 -1
  61. pygpt_net/data/locale/plugin.cmd_history.uk.ini +1 -1
  62. pygpt_net/data/locale/plugin.cmd_history.zh.ini +1 -1
  63. pygpt_net/data/locale/plugin.cmd_mouse_control.en.ini +14 -0
  64. pygpt_net/data/locale/plugin.cmd_web.de.ini +1 -1
  65. pygpt_net/data/locale/plugin.cmd_web.en.ini +1 -1
  66. pygpt_net/data/locale/plugin.cmd_web.es.ini +1 -1
  67. pygpt_net/data/locale/plugin.cmd_web.fr.ini +1 -1
  68. pygpt_net/data/locale/plugin.cmd_web.it.ini +1 -1
  69. pygpt_net/data/locale/plugin.cmd_web.pl.ini +1 -1
  70. pygpt_net/data/locale/plugin.cmd_web.uk.ini +1 -1
  71. pygpt_net/data/locale/plugin.cmd_web.zh.ini +1 -1
  72. pygpt_net/data/locale/plugin.idx_llama_index.de.ini +2 -2
  73. pygpt_net/data/locale/plugin.idx_llama_index.en.ini +2 -2
  74. pygpt_net/data/locale/plugin.idx_llama_index.es.ini +2 -2
  75. pygpt_net/data/locale/plugin.idx_llama_index.fr.ini +2 -2
  76. pygpt_net/data/locale/plugin.idx_llama_index.it.ini +2 -2
  77. pygpt_net/data/locale/plugin.idx_llama_index.pl.ini +2 -2
  78. pygpt_net/data/locale/plugin.idx_llama_index.uk.ini +2 -2
  79. pygpt_net/data/locale/plugin.idx_llama_index.zh.ini +2 -2
  80. pygpt_net/item/assistant.py +1 -211
  81. pygpt_net/item/ctx.py +3 -3
  82. pygpt_net/item/store.py +238 -0
  83. pygpt_net/js_rc.py +2449 -2447
  84. pygpt_net/migrations/Version20260102190000.py +35 -0
  85. pygpt_net/migrations/__init__.py +3 -1
  86. pygpt_net/plugin/cmd_mouse_control/config.py +471 -1
  87. pygpt_net/plugin/cmd_mouse_control/plugin.py +487 -22
  88. pygpt_net/plugin/cmd_mouse_control/worker.py +464 -87
  89. pygpt_net/plugin/cmd_mouse_control/worker_sandbox.py +729 -0
  90. pygpt_net/plugin/idx_llama_index/config.py +2 -2
  91. pygpt_net/provider/api/anthropic/__init__.py +10 -8
  92. pygpt_net/provider/api/google/__init__.py +21 -58
  93. pygpt_net/provider/api/google/chat.py +545 -129
  94. pygpt_net/provider/api/google/computer.py +190 -0
  95. pygpt_net/provider/api/google/realtime/realtime.py +2 -2
  96. pygpt_net/provider/api/google/remote_tools.py +93 -0
  97. pygpt_net/provider/api/google/store.py +546 -0
  98. pygpt_net/provider/api/google/worker/__init__.py +0 -0
  99. pygpt_net/provider/api/google/worker/importer.py +392 -0
  100. pygpt_net/provider/api/openai/__init__.py +7 -3
  101. pygpt_net/provider/api/openai/computer.py +10 -1
  102. pygpt_net/provider/api/openai/responses.py +0 -0
  103. pygpt_net/provider/api/openai/store.py +6 -6
  104. pygpt_net/provider/api/openai/worker/importer.py +24 -24
  105. pygpt_net/provider/api/x_ai/__init__.py +10 -9
  106. pygpt_net/provider/api/x_ai/chat.py +272 -102
  107. pygpt_net/provider/core/config/patch.py +16 -1
  108. pygpt_net/provider/core/config/patches/patch_before_2_6_42.py +3 -3
  109. pygpt_net/provider/core/model/patch.py +17 -3
  110. pygpt_net/provider/core/preset/json_file.py +13 -7
  111. pygpt_net/provider/core/{assistant_file → remote_file}/__init__.py +1 -1
  112. pygpt_net/provider/core/{assistant_file → remote_file}/base.py +9 -9
  113. pygpt_net/provider/core/remote_file/db_sqlite/__init__.py +12 -0
  114. pygpt_net/provider/core/{assistant_file → remote_file}/db_sqlite/patch.py +1 -1
  115. pygpt_net/provider/core/{assistant_file → remote_file}/db_sqlite/provider.py +23 -20
  116. pygpt_net/provider/core/{assistant_file → remote_file}/db_sqlite/storage.py +35 -27
  117. pygpt_net/provider/core/{assistant_file → remote_file}/db_sqlite/utils.py +5 -4
  118. pygpt_net/provider/core/{assistant_store → remote_store}/__init__.py +1 -1
  119. pygpt_net/provider/core/{assistant_store → remote_store}/base.py +10 -10
  120. pygpt_net/provider/core/{assistant_store → remote_store}/db_sqlite/__init__.py +1 -1
  121. pygpt_net/provider/core/{assistant_store → remote_store}/db_sqlite/patch.py +1 -1
  122. pygpt_net/provider/core/{assistant_store → remote_store}/db_sqlite/provider.py +16 -15
  123. pygpt_net/provider/core/{assistant_store → remote_store}/db_sqlite/storage.py +30 -23
  124. pygpt_net/provider/core/{assistant_store → remote_store}/db_sqlite/utils.py +5 -4
  125. pygpt_net/provider/core/{assistant_store → remote_store}/json_file.py +9 -9
  126. pygpt_net/provider/llms/google.py +2 -2
  127. pygpt_net/tools/image_viewer/ui/dialogs.py +298 -12
  128. pygpt_net/tools/text_editor/ui/widgets.py +5 -1
  129. pygpt_net/ui/base/config_dialog.py +3 -2
  130. pygpt_net/ui/base/context_menu.py +44 -1
  131. pygpt_net/ui/dialog/assistant.py +3 -3
  132. pygpt_net/ui/dialog/plugins.py +3 -1
  133. pygpt_net/ui/dialog/remote_store_google.py +539 -0
  134. pygpt_net/ui/dialog/{assistant_store.py → remote_store_openai.py} +95 -95
  135. pygpt_net/ui/dialogs.py +5 -3
  136. pygpt_net/ui/layout/chat/attachments_uploaded.py +3 -3
  137. pygpt_net/ui/layout/toolbox/computer_env.py +26 -8
  138. pygpt_net/ui/layout/toolbox/indexes.py +22 -19
  139. pygpt_net/ui/layout/toolbox/model.py +28 -5
  140. pygpt_net/ui/menu/tools.py +13 -5
  141. pygpt_net/ui/widget/dialog/remote_store_google.py +56 -0
  142. pygpt_net/ui/widget/dialog/{assistant_store.py → remote_store_openai.py} +9 -9
  143. pygpt_net/ui/widget/element/button.py +4 -4
  144. pygpt_net/ui/widget/image/display.py +25 -8
  145. pygpt_net/ui/widget/lists/remote_store_google.py +248 -0
  146. pygpt_net/ui/widget/lists/{assistant_store.py → remote_store_openai.py} +21 -21
  147. pygpt_net/ui/widget/option/checkbox_list.py +47 -9
  148. pygpt_net/ui/widget/option/combo.py +39 -3
  149. pygpt_net/ui/widget/tabs/output.py +9 -1
  150. pygpt_net/ui/widget/textarea/editor.py +14 -1
  151. pygpt_net/ui/widget/textarea/input.py +20 -7
  152. pygpt_net/ui/widget/textarea/notepad.py +24 -1
  153. pygpt_net/ui/widget/textarea/output.py +23 -1
  154. pygpt_net/ui/widget/textarea/web.py +16 -1
  155. {pygpt_net-2.7.4.dist-info → pygpt_net-2.7.6.dist-info}/METADATA +41 -2
  156. {pygpt_net-2.7.4.dist-info → pygpt_net-2.7.6.dist-info}/RECORD +158 -132
  157. {pygpt_net-2.7.4.dist-info → pygpt_net-2.7.6.dist-info}/LICENSE +0 -0
  158. {pygpt_net-2.7.4.dist-info → pygpt_net-2.7.6.dist-info}/WHEEL +0 -0
  159. {pygpt_net-2.7.4.dist-info → pygpt_net-2.7.6.dist-info}/entry_points.txt +0 -0
@@ -6,7 +6,7 @@
6
6
  # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
7
  # MIT License #
8
8
  # Created By : Marcin Szczygliński #
9
- # Updated Date: 2024.12.14 08:00:00 #
9
+ # Updated Date: 2026.01.02 20:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import datetime
@@ -14,24 +14,31 @@ from typing import Optional, List, Dict, Any
14
14
 
15
15
  from packaging.version import Version
16
16
 
17
- from pygpt_net.item.assistant import AssistantStoreItem, AssistantItem
18
- from pygpt_net.provider.core.assistant_store.db_sqlite import DbSqliteProvider
17
+ from pygpt_net.item.store import RemoteStoreItem
18
+ from pygpt_net.provider.core.remote_store.db_sqlite import DbSqliteProvider
19
+
20
+ from .files import Files
19
21
 
20
22
 
21
23
  class Store:
24
+
25
+ PROVIDER_NAME = "openai"
26
+
22
27
  def __init__(self, window=None):
23
28
  """
24
- Assistant vector store core
29
+ OpenAI vector store core
25
30
 
26
31
  :param window: Window instance
27
32
  """
28
33
  self.window = window
29
34
  self.provider = DbSqliteProvider(window)
35
+ self.files = Files(window)
30
36
  self.items = {}
31
37
 
32
38
  def install(self):
33
39
  """Install provider data"""
34
40
  self.provider.install()
41
+ self.files.install()
35
42
 
36
43
  def patch(self, app_version: Version) -> bool:
37
44
  """
@@ -40,9 +47,11 @@ class Store:
40
47
  :param app_version: app version
41
48
  :return: True if data was patched
42
49
  """
43
- return self.provider.patch(app_version)
50
+ res1 = self.files.patch(app_version)
51
+ res2 = self.provider.patch(app_version)
52
+ return res1 or res2
44
53
 
45
- def get(self, id: str) -> AssistantStoreItem:
54
+ def get(self, id: str) -> RemoteStoreItem:
46
55
  """
47
56
  Get store item by store_id
48
57
 
@@ -61,7 +70,7 @@ class Store:
61
70
  return list(self.items.keys())
62
71
 
63
72
 
64
- def get_all(self) -> Dict[str, AssistantStoreItem]:
73
+ def get_all(self) -> Dict[str, RemoteStoreItem]:
65
74
  """
66
75
  Return all stores
67
76
 
@@ -99,7 +108,7 @@ class Store:
99
108
  """
100
109
  return id in self.items
101
110
 
102
- def create(self) -> Optional[AssistantStoreItem]:
111
+ def create(self) -> Optional[RemoteStoreItem]:
103
112
  """
104
113
  Create new store
105
114
 
@@ -109,15 +118,16 @@ class Store:
109
118
  vector_store = self.window.core.api.openai.store.create_store(name, 0)
110
119
  if vector_store is None:
111
120
  return None
112
- store = AssistantStoreItem()
121
+ store = RemoteStoreItem()
113
122
  store.id = vector_store.id
114
123
  store.name = name
124
+ store.provider = self.PROVIDER_NAME
115
125
  store.is_thread = False
116
126
  store.record_id = self.provider.create(store)
117
127
  self.items[store.id] = store
118
128
  return store
119
129
 
120
- def update(self, store: AssistantStoreItem) -> Optional[AssistantStoreItem]:
130
+ def update(self, store: RemoteStoreItem) -> Optional[RemoteStoreItem]:
121
131
  """
122
132
  Update store
123
133
 
@@ -184,12 +194,13 @@ class Store:
184
194
  if tmp_name is None:
185
195
  tmp_name = ""
186
196
  store.name = tmp_name
197
+ store.provider = self.PROVIDER_NAME
187
198
  self.append_status(store, status) # append to store
188
199
  self.update(store) # save to db
189
200
 
190
201
  def append_status(
191
202
  self,
192
- store: AssistantStoreItem,
203
+ store: RemoteStoreItem,
193
204
  status: Dict[str, Any]
194
205
  ):
195
206
  """
@@ -241,7 +252,7 @@ class Store:
241
252
  return True
242
253
  return False
243
254
 
244
- def import_items(self, items: Dict[str, AssistantStoreItem]):
255
+ def import_items(self, items: Dict[str, RemoteStoreItem]):
245
256
  """
246
257
  Insert items
247
258
 
@@ -249,6 +260,7 @@ class Store:
249
260
  """
250
261
  self.items = items
251
262
  for item in items.values():
263
+ item.provider = self.PROVIDER_NAME
252
264
  item.record_id = self.provider.create(item)
253
265
 
254
266
  def clear(self):
@@ -263,7 +275,7 @@ class Store:
263
275
  :return: True if store is hidden
264
276
  """
265
277
  if id in self.items:
266
- if (self.window.core.config.get("assistant.store.hide_threads")
278
+ if (self.window.core.config.get("remote_store.openai.hide_threads")
267
279
  and (self.items[id].name is None or self.items[id].name == "")):
268
280
  return True
269
281
  return False
@@ -274,15 +286,20 @@ class Store:
274
286
 
275
287
  :return: True if truncated
276
288
  """
277
- self.provider.truncate()
289
+ self.provider.truncate(self.PROVIDER_NAME)
278
290
  self.items = {}
279
291
  return True
280
292
 
281
293
  def load(self):
282
294
  """Load store"""
283
- self.items = self.provider.load_all()
295
+ self.items = self.provider.load_all(self.PROVIDER_NAME)
284
296
  self.sort_items()
285
297
 
298
+ def load_all(self):
299
+ """Load store"""
300
+ self.load()
301
+ self.files.load()
302
+
286
303
  def sort_items(self):
287
304
  """Sort items"""
288
305
  pass
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2026.01.02 20:00:00 #
10
+ # ================================================== #
11
+
12
+ from .openai import Store as OpenAIStore
13
+ from .google import Store as GoogleStore
14
+
15
+ class RemoteStore:
16
+ def __init__(self, window=None):
17
+ """
18
+ Remote vector stores core
19
+
20
+ :param window: Window instance
21
+ """
22
+ self.window = window
23
+ self.openai = OpenAIStore(self.window)
24
+ self.google = GoogleStore(self.window)
@@ -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.09.13 06:05:00 #
9
+ # Updated Date: 2026.01.03 17:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -410,7 +410,8 @@ class Body:
410
410
  <p><a href="bridge://play_video/{url}" class="title">{elide_filename(basename)}</a></p>
411
411
  </div>
412
412
  '''
413
- return f'<div class="extra-src-img-box" title="{url}"><div class="img-outer"><div class="img-wrapper"><a href="{url}"><img src="{path}" class="image"></a></div><a href="{url}" class="title">{elide_filename(basename)}</a></div></div><br/>'
413
+ url_preview = f"bridge://open_image/{url}"
414
+ return f'<div class="extra-src-img-box" title="{url}"><div class="img-outer"><div class="img-wrapper"><a href="{url_preview}"><img src="{path}" class="image"></a></div><a href="{url}" class="title">{elide_filename(basename)}</a></div></div><br/>'
414
415
 
415
416
  def get_url_html(
416
417
  self,
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # ================================================== #
4
+ # This file is a part of PYGPT package #
5
+ # Website: https://pygpt.net #
6
+ # GitHub: https://github.com/szczyglis-dev/py-gpt #
7
+ # MIT License #
8
+ # Created By : Marcin Szczygliński #
9
+ # Updated Date: 2026.01.03 17:00:00 #
10
+ # ================================================== #
11
+
12
+ from enum import Enum
13
+
14
+ class ChunkType(str, Enum):
15
+ """
16
+ Enum for chunk type classification.
17
+ """
18
+ API_CHAT = "api_chat" # OpenAI Chat Completions / or compatible
19
+ API_CHAT_RESPONSES = "api_chat_responses" # OpenAI Responses
20
+ API_COMPLETION = "api_completion" # OpenAI Completions
21
+ LANGCHAIN_CHAT = "langchain_chat" # LangChain chat (deprecated)
22
+ LLAMA_CHAT = "llama_chat" # LlamaIndex chat
23
+ GOOGLE = "google" # Google SDK
24
+ GOOGLE_INTERACTIONS_API = "api_google_interactions" # Google SDK, deep research - interactions API
25
+ ANTHROPIC = "anthropic" # Anthropic SDK
26
+ XAI_SDK = "xai_sdk" # xAI SDK
27
+ RAW = "raw" # Raw string fallback
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.7.4",
4
- "app.version": "2.7.4",
5
- "updated_at": "2025-12-31T00:00:00"
3
+ "version": "2.7.6",
4
+ "app.version": "2.7.6",
5
+ "updated_at": "2026-01-03T00:00:00"
6
6
  },
7
7
  "access.audio.event.speech": false,
8
8
  "access.audio.event.speech.disabled": [],
@@ -106,7 +106,7 @@
106
106
  }
107
107
  ],
108
108
  "assistant": "",
109
- "assistant.store.hide_threads": true,
109
+ "remote_store.openai.hide_threads": true,
110
110
  "assistant_thread": "",
111
111
  "attachments_auto_index": true,
112
112
  "attachments_capture_clear": true,
@@ -419,10 +419,14 @@
419
419
  "remote_tools.anthropic.web_search": true,
420
420
  "remote_tools.code_interpreter": false,
421
421
  "remote_tools.computer_use.env": "",
422
+ "remote_tools.computer_use.sandbox": false,
422
423
  "remote_tools.file_search": false,
423
424
  "remote_tools.file_search.args": "",
424
425
  "remote_tools.global.web_search": true,
425
426
  "remote_tools.google.code_interpreter": false,
427
+ "remote_tools.google.file_search": false,
428
+ "remote_tools.google.file_search.args": "",
429
+ "remote_tools.google.maps": false,
426
430
  "remote_tools.google.url_ctx": false,
427
431
  "remote_tools.google.web_search": true,
428
432
  "remote_tools.image": false,
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "__meta__": {
3
- "version": "2.7.4",
4
- "app.version": "2.7.4",
5
- "updated_at": "2025-12-31T00:00:00"
3
+ "version": "2.7.6",
4
+ "app.version": "2.7.6",
5
+ "updated_at": "2026-01-03T00:00:00"
6
6
  },
7
7
  "items": {
8
8
  "SpeakLeash/bielik-11b-v2.3-instruct:Q4_K_M": {
@@ -570,6 +570,44 @@
570
570
  "provider": "openai",
571
571
  "tool_calls": false
572
572
  },
573
+ "deep-research-pro-preview-12-2025": {
574
+ "id": "deep-research-pro-preview-12-2025",
575
+ "name": "deep-research-pro-preview-12-2025",
576
+ "mode": [
577
+ "research"
578
+ ],
579
+ "llama_index": {
580
+ "args": [
581
+ {
582
+ "name": "model",
583
+ "value": "models/deep-research-pro-preview-12-2025",
584
+ "type": "str"
585
+ }
586
+ ],
587
+ "env": [
588
+ {
589
+ "name": "GOOGLE_API_KEY",
590
+ "value": "{api_key_google}",
591
+ "type": "str"
592
+ }
593
+ ]
594
+ },
595
+ "ctx": 1000000,
596
+ "tokens": 0,
597
+ "default": false,
598
+ "input": [
599
+ "text",
600
+ "image"
601
+ ],
602
+ "output": [
603
+ "text",
604
+ "image"
605
+ ],
606
+ "extra": {},
607
+ "imported": false,
608
+ "provider": "google",
609
+ "tool_calls": true
610
+ },
573
611
  "deepseek_api_reasoner": {
574
612
  "id": "deepseek-reasoner",
575
613
  "name": "DeepSeek API (R1, reasoner)",
@@ -912,6 +950,42 @@
912
950
  "provider": "google",
913
951
  "tool_calls": true
914
952
  },
953
+ "gemini-2.5-computer-use-preview-10-2025": {
954
+ "id": "gemini-2.5-computer-use-preview-10-2025",
955
+ "name": "gemini-2.5-computer-use-preview-10-2025",
956
+ "mode": [
957
+ "computer"
958
+ ],
959
+ "llama_index": {
960
+ "args": [
961
+ {
962
+ "name": "model",
963
+ "value": "models/gemini-2.5-computer-use-preview-10-2025",
964
+ "type": "str"
965
+ }
966
+ ],
967
+ "env": [
968
+ {
969
+ "name": "GOOGLE_API_KEY",
970
+ "value": "{api_key_google}",
971
+ "type": "str"
972
+ }
973
+ ]
974
+ },
975
+ "ctx": 128000,
976
+ "tokens": 0,
977
+ "default": false,
978
+ "input": [
979
+ "text"
980
+ ],
981
+ "output": [
982
+ "text"
983
+ ],
984
+ "extra": {},
985
+ "imported": false,
986
+ "provider": "google",
987
+ "tool_calls": true
988
+ },
915
989
  "gemini-2.5-flash": {
916
990
  "id": "gemini-2.5-flash",
917
991
  "name": "gemini-2.5-flash",
@@ -1962,6 +1962,20 @@
1962
1962
  "advanced": false,
1963
1963
  "tab": "Google"
1964
1964
  },
1965
+ "remote_tools.google.maps": {
1966
+ "section": "remote_tools",
1967
+ "type": "bool",
1968
+ "slider": false,
1969
+ "label": "settings.remote_tools.google.maps",
1970
+ "description": "settings.remote_tools.google.maps.desc",
1971
+ "value": true,
1972
+ "min": null,
1973
+ "max": null,
1974
+ "multiplier": null,
1975
+ "step": null,
1976
+ "advanced": false,
1977
+ "tab": "Google"
1978
+ },
1965
1979
  "remote_tools.google.code_interpreter": {
1966
1980
  "section": "remote_tools",
1967
1981
  "type": "bool",
@@ -1990,6 +2004,37 @@
1990
2004
  "advanced": false,
1991
2005
  "tab": "Google"
1992
2006
  },
2007
+ "remote_tools.google.file_search": {
2008
+ "section": "remote_tools",
2009
+ "type": "bool",
2010
+ "slider": false,
2011
+ "label": "settings.remote_tools.google.file_search",
2012
+ "description": "settings.remote_tools.google.file_search.desc",
2013
+ "value": true,
2014
+ "min": null,
2015
+ "max": null,
2016
+ "multiplier": null,
2017
+ "step": null,
2018
+ "advanced": false,
2019
+ "tab": "Google"
2020
+ },
2021
+ "remote_tools.google.file_search.args": {
2022
+ "section": "remote_tools",
2023
+ "type": "text",
2024
+ "slider": false,
2025
+ "label": "settings.remote_tools.google.file_search.args",
2026
+ "description": "settings.remote_tools.google.file_search.args.desc",
2027
+ "value": "",
2028
+ "min": null,
2029
+ "max": null,
2030
+ "multiplier": null,
2031
+ "step": null,
2032
+ "advanced": false,
2033
+ "tab": "Google",
2034
+ "urls": {
2035
+ "Google Docs": "https://ai.google.dev/gemini-api/docs/file-search#metadata"
2036
+ }
2037
+ },
1993
2038
  "remote_tools.anthropic.web_search": {
1994
2039
  "section": "remote_tools",
1995
2040
  "type": "bool",
@@ -91,7 +91,7 @@ class NodeTemplateEngine {
91
91
  } else {
92
92
  parts.push(
93
93
  `<div class="extra-src-img-box" title="${url}">` +
94
- `<div class="img-outer"><div class="img-wrapper"><a href="${url}"><img src="${path}" class="image"></a></div>` +
94
+ `<div class="img-outer"><div class="img-wrapper"><a href="bridge://open_image/${path}"><img src="${path}" class="image"></a></div>` +
95
95
  `<a href="${url}" class="title">${this._escapeHtml(bn)}</a></div>` +
96
96
  `</div><br/>`
97
97
  );
@@ -1,4 +1,4 @@
1
- /* app.min.js — generated on 2025-09-28 09:12:33 by bin/minify_js.py using rjsmin */
1
+ /* app.min.js — generated on 2026-01-03 18:07:50 by bin/minify_js.py using rjsmin */
2
2
 
3
3
  /* data/js/app/async.js */
4
4
  class AsyncRunner{constructor(cfg,raf){this.cfg=cfg||{};this.raf=raf||null;const A=this.cfg.ASYNC||{};this.SLICE_MS=Utils.g('ASYNC_SLICE_MS',A.SLICE_MS??12);this.SLICE_HIDDEN_MS=Utils.g('ASYNC_SLICE_HIDDEN_MS',A.SLICE_HIDDEN_MS??Math.min(this.SLICE_MS,6));this.MIN_YIELD_MS=Utils.g('ASYNC_MIN_YIELD_MS',A.MIN_YIELD_MS??0);this._opGen=new Map();}
@@ -776,7 +776,7 @@ _esc(s){return(s==null)?'':String(s);}
776
776
  _escapeHtml(s){return(typeof Utils!=='undefined')?Utils.escapeHtml(s):String(s).replace(/[&<>"']/g,m=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#039;'}[m]));}
777
777
  _nameHeader(role,name,avatarUrl){if(!name&&!avatarUrl)return'';const cls=(role==='user')?'name-user':'name-bot';const img=avatarUrl?`<img src="${this._esc(avatarUrl)}" class="avatar"> `:'';return`<div class="name-header ${cls}">${img}${this._esc(name || '')}</div>`;}
778
778
  _renderUser(block){const id=block.id;const inp=block.input||{};const msgId=`msg-user-${id}`;const personalize=!!(block&&block.extra&&block.extra.personalize===true);const nameHeader=personalize?this._nameHeader('user',inp.name||'',inp.avatar_img||null):'';const content=this._escapeHtml(inp.text||'').replace(/\r?\n/g,'<br>');const I=(this.cfg&&this.cfg.ICONS)||{};const L=(this.cfg&&this.cfg.LOCALE)||{};const copyIcon=I.CODE_COPY||'';const copyTitle=L.COPY||'Copy';const copyBtn=`<a href="empty:${this._esc(id)}" class="msg-copy-btn" data-id="${this._esc(id)}" data-tip="${this._escapeHtml(copyTitle)}" title="${this._escapeHtml(copyTitle)}" aria-label="${this._escapeHtml(copyTitle)}" role="button"><img src="${this._esc(copyIcon)}" class="copy-img" alt="${this._escapeHtml(copyTitle)}" data-id="${this._esc(id)}"></a>`;return`<div class="msg-box msg-user" id="${msgId}">${nameHeader}<div class="msg">${copyBtn}<p style="margin:0">${content}</p></div></div>`;}
779
- _renderExtras(block){const parts=[];const images=block.images||{};const keysI=Object.keys(images);if(keysI.length){keysI.forEach((k)=>{const it=images[k];if(!it)return;const url=this._esc(it.url);const path=this._esc(it.path);const bn=this._esc(it.basename||'');if(it.is_video){const src=(it.ext==='.webm'||!it.webm_path)?path:this._esc(it.webm_path);const ext=(src.endsWith('.webm')?'webm':(path.split('.').pop()||'mp4'));parts.push(`<div class="extra-src-video-box" title="${url}">`+`<video class="video-player" controls>`+`<source src="${src}" type="video/${ext}">`+`</video>`+`<p><a href="bridge://play_video/${url}" class="title">${this._escapeHtml(bn)}</a></p>`+`</div>`);}else{parts.push(`<div class="extra-src-img-box" title="${url}">`+`<div class="img-outer"><div class="img-wrapper"><a href="${url}"><img src="${path}" class="image"></a></div>`+`<a href="${url}" class="title">${this._escapeHtml(bn)}</a></div>`+`</div><br/>`);}});}
779
+ _renderExtras(block){const parts=[];const images=block.images||{};const keysI=Object.keys(images);if(keysI.length){keysI.forEach((k)=>{const it=images[k];if(!it)return;const url=this._esc(it.url);const path=this._esc(it.path);const bn=this._esc(it.basename||'');if(it.is_video){const src=(it.ext==='.webm'||!it.webm_path)?path:this._esc(it.webm_path);const ext=(src.endsWith('.webm')?'webm':(path.split('.').pop()||'mp4'));parts.push(`<div class="extra-src-video-box" title="${url}">`+`<video class="video-player" controls>`+`<source src="${src}" type="video/${ext}">`+`</video>`+`<p><a href="bridge://play_video/${url}" class="title">${this._escapeHtml(bn)}</a></p>`+`</div>`);}else{parts.push(`<div class="extra-src-img-box" title="${url}">`+`<div class="img-outer"><div class="img-wrapper"><a href="bridge://open_image/${path}"><img src="${path}" class="image"></a></div>`+`<a href="${url}" class="title">${this._escapeHtml(bn)}</a></div>`+`</div><br/>`);}});}
780
780
  const files=block.files||{};const kF=Object.keys(files);if(kF.length){const rows=[];kF.forEach((k)=>{const it=files[k];if(!it)return;const url=this._esc(it.url);const path=this._esc(it.path);const icon=(typeof window!=='undefined'&&window.ICON_ATTACHMENTS)?`<img src="${window.ICON_ATTACHMENTS}" class="extra-src-icon">`:'';rows.push(`${icon} <b> [${k}] </b> <a href="${url}">${path}</a>`);});if(rows.length)parts.push(`<div>${rows.join("<br/><br/>")}</div>`);}
781
781
  const urls=block.urls||{};const kU=Object.keys(urls);if(kU.length){const rows=[];kU.forEach((k)=>{const it=urls[k];if(!it)return;const url=this._esc(it.url);const icon=(typeof window!=='undefined'&&window.ICON_URL)?`<img src="${window.ICON_URL}" class="extra-src-icon">`:'';rows.push(`${icon}<a href="${url}" title="${url}">${url}</a> <small> [${k}] </small>`);});if(rows.length)parts.push(`<div>${rows.join("<br/><br/>")}</div>`);}
782
782
  const extra=block.extra||{};const docsRaw=Array.isArray(extra.docs)?extra.docs:null;if(docsRaw&&docsRaw.length){const icon=(typeof window!=='undefined'&&window.ICON_DB)?`<img src="${window.ICON_DB}" class="extra-src-icon">`:'';const prefix=(typeof window!=='undefined'&&window.LOCALE_DOC_PREFIX)?String(window.LOCALE_DOC_PREFIX):'Doc:';const limit=3;const normalized=[];docsRaw.forEach((it)=>{if(!it||typeof it!=='object')return;if('uuid'in it&&'meta'in it&&typeof it.meta==='object'){normalized.push({uuid:String(it.uuid),meta:it.meta||{}});}else{const keys=Object.keys(it);if(keys.length===1){const uuid=keys[0];const meta=it[uuid];if(meta&&typeof meta==='object'){normalized.push({uuid:String(uuid),meta});}}}});const rows=[];for(let i=0;i<Math.min(limit,normalized.length);i++){const d=normalized[i];const meta=d.meta||{};const entries=Object.keys(meta).map(k=>`<b>${this._escapeHtml(k)}:</b> ${this._escapeHtml(String(meta[k]))}`).join(', ');rows.push(`<p><small>[${i + 1}] ${this._escapeHtml(d.uuid)}: ${entries}</small></p>`);}
@@ -180,14 +180,6 @@ assistant.run.completed = Ausführung: Abgeschlossen
180
180
  assistant.run.failed = Ausführung: Fehlgeschlagen
181
181
  assistant.run.func.call = Ausführen: Funktionsaufruf...
182
182
  assistant.run.listening = Ausführung: in Bearbeitung...
183
- assistant.store.expire_days = Ablauftage
184
- assistant.store.expire_days.desc = 0 = Niemals
185
- assistant.store.files.suffix = Dateien
186
- assistant.store.hide_threads = Thread-Vektor-Speicher verbergen
187
- assistant.store.id = ID
188
- assistant.store.name = Name
189
- assistant.store.status = Status
190
- assistant.store.thread_only = (nur aktueller Thread)
191
183
  assistant.tool.code_interpreter = Code-Interpreter
192
184
  assistant.tool.file_search = Chat mit Dateien
193
185
  assistant.tool.function = Werkzeug: Funktion
@@ -284,17 +276,9 @@ common.down = Nach unten verschieben
284
276
  common.up = Nach oben verschieben
285
277
  confirm.assistant.delete = Assistent löschen?
286
278
  confirm.assistant.files.clear = Dateien löschen (nur lokal)?
287
- confirm.assistant.files.truncate = Sind Sie sicher, dass Sie alle Dateien von allen Speichern entfernen möchten?
288
- confirm.assistant.files.truncate.store = Sind Sie sicher, dass Sie alle Dateien aus dem ausgewählten Speicher entfernen möchten?
289
279
  confirm.assistant.functions.clear = Möchten Sie die Funktionsliste wirklich löschen?
290
280
  confirm.assistant.functions.import = Funktionen von AKTIVEN Plugins importieren?\nINFO: Alle Funktionen in der Liste mit denselben Namen werden ersetzt!
291
281
  confirm.assistant.import = Alle Assistenten von API importieren?
292
- confirm.assistant.import_files = Alle Dateien von API importieren?
293
- confirm.assistant.import_files.store = Aktuelle Speicherdateien von API importieren?
294
- confirm.assistant.store.clear = Vektor-Speicher leeren (nur lokal)?
295
- confirm.assistant.store.import = Alle Vektor-Speicher von API importieren?
296
- confirm.assistant.store.refresh = Alle Speicher aktualisieren?
297
- confirm.assistant.store.truncate = Alle Vektor-Speicher in der API löschen?
298
282
  confirm.ctx.delete = Gruppe löschen?
299
283
  confirm.ctx.delete.all = Gruppe und alle Elemente löschen?
300
284
  confirm.img.delete = Datei von der Festplatte löschen?
@@ -306,9 +290,20 @@ confirm.preset.restore = Standard-Preset für diesen Modus wiederherstellen?
306
290
  confirm.profile.delete = Sind Sie sicher, dass Sie das Profil löschen möchten? Es wird nur aus der Liste entfernt.
307
291
  confirm.profile.delete_all = Sind Sie sicher, dass Sie das Profil samt aller Konfigurationsdateien und Benutzerdateien im Profil-Arbeitsverzeichnis löschen möchten?
308
292
  confirm.profile.reset = Sind Sie sicher, dass Sie das Profil auf die Standardeinstellungen zurücksetzen möchten? WARNUNG: Alle Konfigurationsdateien und die Kontext-Datenbank werden entfernt! Das Datenverzeichnis wird beibehalten - um es zu entfernen, müssen Sie es manuell löschen oder die Lösch-Option verwenden.
293
+ confirm.remote_store.clear = Vektor-Speicher leeren (nur lokal)?
294
+ confirm.remote_store.import = Alle Vektor-Speicher von API importieren?
295
+ confirm.remote_store.import_files = Alle Dateien von API importieren?
296
+ confirm.remote_store.import_files.store = Aktuelle Speicherdateien von API importieren?
297
+ confirm.remote_store.openai.files.truncate = Sind Sie sicher, dass Sie alle Dateien von allen Speichern entfernen möchten?
298
+ confirm.remote_store.openai.files.truncate.store = Sind Sie sicher, dass Sie alle Dateien aus dem ausgewählten Speicher entfernen möchten?
299
+ confirm.remote_store.refresh = Alle Speicher aktualisieren?
300
+ confirm.remote_store.truncate = Alle Vektor-Speicher in der API löschen?
309
301
  context.btn.clear = Erinnerung löschen
310
302
  context.items = Elemente
311
303
  context.label = Kontext
304
+ context_menu.zoom = Zoom
305
+ context_menu.zoom.in = Vergrößern
306
+ context_menu.zoom.out = Verkleinern
312
307
  context.tokens = Tokens
313
308
  ctx.delete.all.confirm = Sind Sie sicher, dass Sie ALLE Verlaufskontexte löschen möchten?
314
309
  ctx.delete.confirm = Sind Sie sicher, dass Sie löschen möchten?
@@ -364,30 +359,6 @@ dialog.assistant.btn.current = Aktuelle verwenden
364
359
  dialog.assistant.btn.import_func = Funktionen importieren
365
360
  dialog.assistant.btn.save = Speichern
366
361
  dialog.assistant.btn.store = Vektor Speicher
367
- dialog.assistant.store = OpenAI Vektordatenbanken
368
- dialog.assistant.store.alert.assign = Bitte zuerst einen Vektor-Speicher dem Assistenten zuweisen.
369
- dialog.assistant.store.alert.select = Bitte zuerst Vektor-Speicher auswählen.
370
- dialog.assistant.store.btn.close = Abbrechen
371
- dialog.assistant.store.btn.new = Erstellen
372
- dialog.assistant.store.btn.refresh_status = Status aktualisieren
373
- dialog.assistant.store.btn.save = Speichern
374
- dialog.assistant.store.btn.upload.dir = + Verzeichnis
375
- dialog.assistant.store.btn.upload.files = + Dateien
376
- dialog.assistant.store.delete.confirm = Sind Sie sicher, dass Sie die OpenAI-Vektordatenbank löschen wollen?
377
- dialog.assistant.store.menu.all = Alle Speicher...
378
- dialog.assistant.store.menu.all.clear_files = Dateien löschen (alle, nur lokal)
379
- dialog.assistant.store.menu.all.clear_store = Vektor-Speicher leeren (alle, nur lokal)
380
- dialog.assistant.store.menu.all.import_all = Alles importieren (alle, Speicher + Dateien)
381
- dialog.assistant.store.menu.all.import_files = Nur Dateien importieren (alle)
382
- dialog.assistant.store.menu.all.refresh_store = Alle Status aktualisieren
383
- dialog.assistant.store.menu.all.truncate_files = Dateien kürzen (alle, lokal + fern)
384
- dialog.assistant.store.menu.all.truncate_store = Vektor-Speicher kürzen (alle, lokal + fern)
385
- dialog.assistant.store.menu.current = Aktueller Speicher...
386
- dialog.assistant.store.menu.current.clear_files = Dateien löschen (nur lokal)
387
- dialog.assistant.store.menu.current.delete = Speicher löschen (+ Dateien, lokal + fern)
388
- dialog.assistant.store.menu.current.import_files = Dateien importieren
389
- dialog.assistant.store.menu.current.refresh_store = Status aktualisieren
390
- dialog.assistant.store.menu.current.truncate_files = Dateien kürzen (lokal + fern)
391
362
  dialog.changelog.title = Änderungsprotokoll
392
363
  dialog.confirm.no = Nein
393
364
  dialog.confirm.title = Bestätigung
@@ -468,6 +439,30 @@ dialog.profile.status.removed = Profil von der Liste entfernt
468
439
  dialog.profile.status.updated = Profil aktualisiert.
469
440
  dialog.profile.tip = Durch das Erstellen neuer Profile können Sie separate Einstellungen, unterschiedliche Kontexthistorien und Benutzerdaten verwenden und schnell zwischen ihnen wechseln.
470
441
  dialog.profile.workdir.label = Arbeitsverzeichnis (Verzeichnis für Konfigurationsdateien und Benutzerdaten)
442
+ dialog.remote_store.alert.assign = Bitte zuerst einen Vektor-Speicher dem Assistenten zuweisen.
443
+ dialog.remote_store.alert.select = Bitte zuerst Vektor-Speicher auswählen.
444
+ dialog.remote_store.btn.close = Abbrechen
445
+ dialog.remote_store.btn.new = Erstellen
446
+ dialog.remote_store.btn.refresh_status = Status aktualisieren
447
+ dialog.remote_store.btn.save = Speichern
448
+ dialog.remote_store.btn.upload.dir = + Verzeichnis
449
+ dialog.remote_store.btn.upload.files = + Dateien
450
+ dialog.remote_store.delete.confirm = Sind Sie sicher, dass Sie die OpenAI-Vektordatenbank löschen wollen?
451
+ dialog.remote_store.menu.all = Alle Speicher...
452
+ dialog.remote_store.menu.all.clear_files = Dateien löschen (alle, nur lokal)
453
+ dialog.remote_store.menu.all.clear_store = Vektor-Speicher leeren (alle, nur lokal)
454
+ dialog.remote_store.menu.all.import_all = Alles importieren (alle, Speicher + Dateien)
455
+ dialog.remote_store.menu.all.import_files = Nur Dateien importieren (alle)
456
+ dialog.remote_store.menu.all.refresh_store = Alle Status aktualisieren
457
+ dialog.remote_store.menu.all.truncate_files = Dateien kürzen (alle, lokal + fern)
458
+ dialog.remote_store.menu.all.truncate_store = Vektor-Speicher kürzen (alle, lokal + fern)
459
+ dialog.remote_store.menu.current = Aktueller Speicher...
460
+ dialog.remote_store.menu.current.clear_files = Dateien löschen (nur lokal)
461
+ dialog.remote_store.menu.current.delete = Speicher löschen (+ Dateien, lokal + fern)
462
+ dialog.remote_store.menu.current.import_files = Dateien importieren
463
+ dialog.remote_store.menu.current.refresh_store = Status aktualisieren
464
+ dialog.remote_store.menu.current.truncate_files = Dateien kürzen (lokal + fern)
465
+ dialog.remote_store.openai = OpenAI Vektordatenbanken
471
466
  dialog.rename.dismiss = Abbrechen
472
467
  dialog.rename.title = Name ändern
473
468
  dialog.rename.update = Namen aktualisieren
@@ -529,7 +524,7 @@ dictionary.config.llama.idx.embeddings.args.value = Wert des Schlüsselwort-Argu
529
524
  dictionary.config.llama.idx.embeddings.env.name = ENV-Name (mit os.environ festlegen)
530
525
  dictionary.config.llama.idx.embeddings.env.value = ENV-Wert, verwende {config_key} als Platzhalter, um den Wert aus der Anwendungs-Konfiguration zu verwenden.
531
526
  dictionary.config.llama.idx.list.id = ID (Verzeichnisname für Index)
532
- dictionary.config.llama.idx.list.model_embed = Modell für Einbettung (Indexierung), Standard: gpt-3.5-turbo
527
+ dictionary.config.llama.idx.list.model_embed = Modell für Einbettung (Indexierung), Standard: %MODEL_DEFAULT_MINI%
533
528
  dictionary.config.llama.idx.list.model_query = Modell für Abfragen
534
529
  dictionary.config.llama.idx.list.name = Name
535
530
  dictionary.config.llama.idx.storage.args.name = Name des Schlüsselwort-Arguments
@@ -1142,6 +1137,14 @@ preset.use = Verwenden
1142
1137
  preset.user_name = Benutzername
1143
1138
  preset.vision = Vision
1144
1139
  profile.current.suffix = (aktuell)
1140
+ remote_store.expire_days = Ablauftage
1141
+ remote_store.expire_days.desc = 0 = Niemals
1142
+ remote_store.files.suffix = Dateien
1143
+ remote_store.id = ID
1144
+ remote_store.name = Name
1145
+ remote_store.openai.hide_threads = Thread-Vektor-Speicher verbergen
1146
+ remote_store.status = Status
1147
+ remote_store.thread_only = (nur aktueller Thread)
1145
1148
  reset.description = Beschreibung
1146
1149
  screenshot.capture.name.prefix = Screenshot von
1147
1150
  settings.access.audio.event.speech = Sprachsynthese zur Beschreibung von Ereignissen auf dem Bildschirm verwenden.