pygpt-net 2.7.8__py3-none-any.whl → 2.7.9__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.
@@ -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: 2026.01.06 20:00:00 #
9
+ # Updated Date: 2026.01.07 23:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import json
@@ -27,7 +27,7 @@ class Realtime:
27
27
 
28
28
  def __init__(self, window=None):
29
29
  """
30
- OpenAI API realtime controller
30
+ xAI API realtime controller
31
31
 
32
32
  :param window: Window instance
33
33
  """
@@ -68,15 +68,11 @@ class Realtime:
68
68
  self.handler.set_debug(is_debug)
69
69
 
70
70
  # tools
71
- tools = []
72
- '''
73
- tools = self.window.core.api.xai.tools.prepare(model, context.external_functions)
74
- '''
71
+ tools = self.window.core.api.xai.tools.prepare_realtime(context.external_functions)
75
72
 
76
73
  # remote tools
77
74
  remote_tools = []
78
- '''
79
- remote_tools = self.window.core.api.openai.remote_tools.append_to_tools(
75
+ remote_tools = self.window.core.api.xai.remote.append_to_tools(
80
76
  mode=context.mode,
81
77
  model=model,
82
78
  stream=context.stream,
@@ -84,7 +80,6 @@ class Realtime:
84
80
  tools=remote_tools,
85
81
  preset=context.preset,
86
82
  )
87
- '''
88
83
 
89
84
  # handle sub-reply (tool results from tool calls)
90
85
  if context.ctx.internal:
@@ -107,6 +102,31 @@ class Realtime:
107
102
  self.handler.update_ctx(context.ctx)
108
103
  return True # do not start new session, just send tool results
109
104
 
105
+ # Resolve last session ID from history only (no fallback)
106
+ last_session_id = extract_last_session_id(context.history) if context.history else None
107
+ if is_debug:
108
+ print("[realtime session] Last ID", last_session_id)
109
+
110
+ # Enforce clean state rules prior to any live updates:
111
+ # - If there is no history: always reset live session to start fresh.
112
+ # - If history exists but has no resumable handle: close any active session to avoid continuation.
113
+ try:
114
+ history_len = len(context.history) if context.history else 0
115
+ except Exception:
116
+ history_len = 0
117
+
118
+ if history_len == 0:
119
+ if self.handler.is_session_active():
120
+ self.handler.close_session_sync()
121
+ try:
122
+ if context.ctx and isinstance(context.ctx.extra, dict):
123
+ context.ctx.extra.pop("rt_session_id", None)
124
+ except Exception:
125
+ pass
126
+ last_session_id = None # force new session
127
+ elif not last_session_id and self.handler.is_session_active():
128
+ self.handler.close_session_sync()
129
+
110
130
  # update auto-turn in active session
111
131
  if (self.handler.is_session_active()
112
132
  and (auto_turn != self.prev_auto_turn
@@ -121,13 +141,8 @@ class Realtime:
121
141
  self.window.update_status(trans("speech.listening"))
122
142
  return True # do not send new request if session is active
123
143
 
124
- # Last session ID
125
- last_session_id = extract_last_session_id(context.history)
126
- if is_debug:
127
- print("[realtime session] Last ID", last_session_id)
128
-
129
144
  # Voice
130
- voice = "ara"
145
+ voice = "Ara"
131
146
  try:
132
147
  v = self.window.core.plugins.get_option("audio_output", "xai_tts_voice")
133
148
  if v:
@@ -28,6 +28,7 @@ except Exception:
28
28
  x_x_search = None
29
29
  x_code_execution = None
30
30
  x_mcp = None
31
+ x_collections_search = None
31
32
 
32
33
 
33
34
  class Remote:
@@ -42,6 +43,9 @@ class Remote:
42
43
  - Builds xAI SDK tool objects for web_search, x_search, code_execution, MCP.
43
44
  - Returns include flags, max_turns and use_encrypted_content settings.
44
45
 
46
+ Realtime (WebSocket) tools builder for xAI:
47
+ - Produces Realtime-compatible tool descriptors to be attached to session.update/response.create.
48
+
45
49
  :param window: Window instance
46
50
  """
47
51
  self.window = window
@@ -269,6 +273,85 @@ class Remote:
269
273
  "reason": http_reason,
270
274
  }
271
275
 
276
+ # ---------- Realtime tools (WebSocket) ----------
277
+
278
+ def append_to_tools(
279
+ self,
280
+ mode: str,
281
+ model: ModelItem,
282
+ stream: bool,
283
+ is_expert_call: bool,
284
+ tools: List[dict],
285
+ preset=None
286
+ ) -> List[dict]:
287
+ """
288
+ Prepare remote tools for xAI Realtime sessions.
289
+
290
+ The returned list contains Realtime/WebSocket tool descriptors understood by xAI’s Grok Voice Agent API.
291
+ Server-side tools are executed by xAI; client-side tools are added separately in the caller.
292
+
293
+ :param mode: Agent mode (unused here, kept for signature compatibility)
294
+ :param model: Model item
295
+ :param stream: Streaming flag
296
+ :param is_expert_call: Expert call flag (unused here for xAI)
297
+ :param tools: Current tools list to extend
298
+ :param preset: Preset item (unused here)
299
+ :return: Extended tools list
300
+ """
301
+ cfg = self.window.core.config
302
+ enabled_global = self.window.controller.chat.remote_tools.enabled
303
+
304
+ # Toggles
305
+ is_web_enabled = enabled_global(model, "web_search")
306
+ is_x_enabled = bool(cfg.get("remote_tools.xai.x_search", False))
307
+ is_code_enabled = bool(cfg.get("remote_tools.xai.code_execution", False))
308
+ is_mcp_enabled = bool(cfg.get("remote_tools.xai.mcp", False))
309
+ is_collections_enabled = bool(cfg.get("remote_tools.xai.collections", False))
310
+
311
+ # Web search
312
+ if is_web_enabled:
313
+ tools.append({"type": "web_search"})
314
+
315
+ # X search
316
+ if is_x_enabled:
317
+ tools.append({"type": "x_search"})
318
+
319
+ # Code execution (code interpreter)
320
+ if is_code_enabled:
321
+ # Container is optional here; xAI executes code server-side
322
+ tools.append({"type": "code_interpreter"})
323
+
324
+ # Collections search
325
+ if is_collections_enabled:
326
+ ids = cfg.get("remote_tools.xai.collections.args", "")
327
+ ids_list: List[str] = []
328
+ if ids:
329
+ try:
330
+ ids_list = [s.strip() for s in ids.split(",") if s.strip()]
331
+ except Exception:
332
+ ids_list = []
333
+ if ids_list:
334
+ tools.append({
335
+ "type": "collections_search",
336
+ "collection_ids": ids_list,
337
+ })
338
+
339
+ # MCP
340
+ if is_mcp_enabled:
341
+ mcp_tool = cfg.get("remote_tools.xai.mcp.args", "")
342
+ if mcp_tool:
343
+ try:
344
+ parsed = json.loads(mcp_tool)
345
+ # Accept either full dict or minimal {"type":"mcp"}
346
+ if isinstance(parsed, dict):
347
+ tools.append(parsed)
348
+ except Exception:
349
+ tools.append({"type": "mcp"})
350
+ else:
351
+ tools.append({"type": "mcp"})
352
+
353
+ return tools
354
+
272
355
  # ---------- helpers ----------
273
356
 
274
357
  def _build_http_params(
@@ -26,6 +26,7 @@ class Tools:
26
26
 
27
27
  - prepare(): legacy OpenAI-compatible dicts (kept for compatibility if needed).
28
28
  - prepare_sdk_tools(): xAI SDK client-side tool descriptors for Chat Responses.
29
+ - prepare_realtime(): Realtime/WebSocket-compatible function tools.
29
30
 
30
31
  :param window: Window instance
31
32
  """
@@ -168,4 +169,54 @@ class Tools:
168
169
  ))
169
170
  except Exception:
170
171
  continue
172
+ return tools
173
+
174
+ def prepare_realtime(self, functions: list) -> List[dict]:
175
+ """
176
+ Prepare function tools for Realtime/WebSocket sessions.
177
+
178
+ The returned structure matches the Realtime "tools" schema:
179
+ [
180
+ {
181
+ "type": "function",
182
+ "function": {
183
+ "name": "...",
184
+ "description": "...",
185
+ "parameters": { ... JSON Schema ... }
186
+ }
187
+ }
188
+ ]
189
+
190
+ :param functions: List of functions with keys: name (str), desc (str), params (JSON Schema str)
191
+ :return: List of function tool descriptors
192
+ """
193
+ if not functions or not isinstance(functions, list):
194
+ return []
195
+
196
+ tools: List[dict] = []
197
+ for fn in functions:
198
+ name = str(fn.get("name") or "").strip()
199
+ if not name:
200
+ continue
201
+ desc = fn.get("desc") or ""
202
+ params: Optional[dict] = {}
203
+ if fn.get("params"):
204
+ try:
205
+ params = json.loads(fn["params"])
206
+ except Exception:
207
+ params = {}
208
+ params = self._sanitize_schema(params or {})
209
+ if not params.get("type"):
210
+ params["type"] = "object"
211
+ else:
212
+ params = {"type": "object"}
213
+
214
+ tools.append({
215
+ "type": "function",
216
+ "function": {
217
+ "name": name,
218
+ "description": desc,
219
+ "parameters": params,
220
+ }
221
+ })
171
222
  return tools
@@ -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: 2026.01.06 06:00:00 #
9
+ # Updated Date: 2026.01.07 23:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import copy
@@ -274,6 +274,17 @@ class Patch:
274
274
  data[key] = cfg_get_base(key)
275
275
  updated = True
276
276
 
277
+ # < 2.7.9
278
+ if old < parse_version("2.7.9"):
279
+ print("Migrating config from < 2.7.9...")
280
+ to_add = [
281
+ "api_key_management_xai",
282
+ ]
283
+ for key in to_add:
284
+ if key not in data or data[key] is None or data[key] == "None":
285
+ data[key] = ""
286
+ updated = True
287
+
277
288
  # update file
278
289
  migrated = False
279
290
  if updated:
@@ -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: 2026.01.04 19:00:00 #
9
+ # Updated Date: 2026.01.07 23:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  from packaging.version import parse as parse_version, Version
@@ -154,6 +154,41 @@ class Patch:
154
154
  m.input.append("image")
155
155
  updated = True
156
156
 
157
+ # < 2.7.9 <--- add missing audio input
158
+ if old < parse_version("2.7.9"):
159
+ print("Migrating models from < 2.7.9...")
160
+ models_to_update = [
161
+ "grok-4",
162
+ "grok-4-fast-non-reasoning",
163
+ "grok-4-fast-reasoning",
164
+ "grok-4-1-fast-non-reasoning",
165
+ "grok-4-1-fast-reasoning",
166
+ ]
167
+ for model in models_to_update:
168
+ if model in data:
169
+ m = data[model]
170
+ if not m.is_audio_input():
171
+ m.input.append("audio")
172
+ if not m.is_audio_output():
173
+ m.output.append("audio")
174
+ if not m.has_mode("audio"):
175
+ m.mode.append("audio")
176
+ models_to_remove = [
177
+ "gemini-2.5-flash-preview-native-audio-dialog",
178
+ ]
179
+ for model in models_to_remove:
180
+ if model in data:
181
+ del data[model]
182
+ models_to_add = [
183
+ "gemini-2.5-flash-native-audio-latest",
184
+ ]
185
+ for model in models_to_add:
186
+ if model not in data:
187
+ base_model = from_base(model)
188
+ if base_model:
189
+ data[model] = base_model
190
+ updated = True
191
+
157
192
  # update file
158
193
  if updated:
159
194
  # fix empty/broken data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pygpt-net
3
- Version: 2.7.8
3
+ Version: 2.7.9
4
4
  Summary: Desktop AI Assistant powered by: OpenAI GPT-5, GPT-4, o1, o3, Gemini, Claude, Grok, DeepSeek, and other models supported by Llama Index, and Ollama. Chatbot, agents, completion, image generation, vision analysis, speech-to-text, plugins, MCP, internet access, file handling, command execution and more.
5
5
  License: MIT
6
6
  Keywords: ai,api,api key,app,assistant,bielik,chat,chatbot,chatgpt,claude,dall-e,deepseek,desktop,gemini,gpt,gpt-3.5,gpt-4,gpt-4-vision,gpt-4o,gpt-5,gpt-oss,gpt3.5,gpt4,grok,langchain,llama-index,llama3,mistral,o1,o3,ollama,openai,presets,py-gpt,py_gpt,pygpt,pyside,qt,text completion,tts,ui,vision,whisper
@@ -120,7 +120,7 @@ Description-Content-Type: text/markdown
120
120
 
121
121
  [![pygpt](https://snapcraft.io/pygpt/badge.svg)](https://snapcraft.io/pygpt)
122
122
 
123
- Release: **2.7.8** | build: **2026-01-06** | Python: **>=3.10, <3.14**
123
+ Release: **2.7.9** | build: **2026-01-08** | Python: **>=3.10, <3.14**
124
124
 
125
125
  > Official website: https://pygpt.net | Documentation: https://pygpt.readthedocs.io
126
126
  >
@@ -3796,6 +3796,11 @@ may consume additional tokens that are not displayed in the main window.
3796
3796
 
3797
3797
  ## Recent changes:
3798
3798
 
3799
+ **2.7.9 (2026-01-08)**
3800
+
3801
+ - Improved realtime audio mode.
3802
+ - Added xAI provider and Grok support in realtime audio mode.
3803
+
3799
3804
  **2.7.8 (2026-01-06)**
3800
3805
 
3801
3806
  - Added the xAI Collections remote tool and integrated collections management into the Remote Vector Stores tool.
@@ -1,6 +1,6 @@
1
- pygpt_net/CHANGELOG.txt,sha256=YHKggByScfWK-rZDILB44Bpamlkt2L0vyTnov0t89aU,113227
1
+ pygpt_net/CHANGELOG.txt,sha256=hBm2ZJ6EkaBRuxX5IXh_eMN143ar-FtuJpU6d7YiPxo,113342
2
2
  pygpt_net/LICENSE,sha256=dz9sfFgYahvu2NZbx4C1xCsVn9GVer2wXcMkFRBvqzY,1146
3
- pygpt_net/__init__.py,sha256=riBsRdPNw266-dwLWkwrYf7n9naPFTNtp2gNJlKCy00,1372
3
+ pygpt_net/__init__.py,sha256=J8M1OM6KzKL_uJYHulGYX8QKp54g3nova5oRIxHUNBM,1372
4
4
  pygpt_net/app.py,sha256=Q3x2I3IxxjsM1XvlsLn_fdPEbbUZ9TndGGIO7NETJI8,26474
5
5
  pygpt_net/app_core.py,sha256=nFKChQ66naIft6jGXr1HCg7povnhIfa44h_VhsadOpo,3926
6
6
  pygpt_net/config.py,sha256=3CA7xXPKQsdRie1CY8_b5-Kk1taWMciUP9CesXRQNNY,18302
@@ -122,7 +122,7 @@ pygpt_net/controller/presets/experts.py,sha256=yST5XG67sU7PfqS93D5ypzeL1JlQ0nFr-
122
122
  pygpt_net/controller/presets/presets.py,sha256=dQ0CeBbEO5KiLolaytkALmKvtuduAhYxCyuTV6Ea_7U,28279
123
123
  pygpt_net/controller/realtime/__init__.py,sha256=MhvJb5wBqcpX6uylof01qEDRdU3SepTD88sU2lXNtIQ,519
124
124
  pygpt_net/controller/realtime/manager.py,sha256=qtifO3sAtT1ROtRs9N_8t6A8_wgxOxxGl-PfLHzhdxY,1762
125
- pygpt_net/controller/realtime/realtime.py,sha256=Rw3sLhAaafcam5rNMZVRgds-BO40niSAyU2FbfHj4F0,10912
125
+ pygpt_net/controller/realtime/realtime.py,sha256=dT4Tfm3WM2IvLbKZwDqhUR23o_a4vlJLO58YLiZyRLY,11494
126
126
  pygpt_net/controller/remote_store/__init__.py,sha256=4aYypHq5Kwrg6IxYEspFkj-WBBKczbc6Qm0TQajLS3M,516
127
127
  pygpt_net/controller/remote_store/batch.py,sha256=JMKv1q3dEzM9Gv2u5moyLJ4I1AFHCKLZ18LT8yy3nzM,14275
128
128
  pygpt_net/controller/remote_store/remote_store.py,sha256=VAcDTFxDEbnuzRCgeW1QZk_2OfLhfOthrYKn5hH3eUE,37506
@@ -428,8 +428,8 @@ pygpt_net/css_rc.py,sha256=PX6g9z5BsD-DXISuR2oq3jHcjiKfcJ4HsgcHez6wGMc,27762
428
428
  pygpt_net/data/audio/click_off.mp3,sha256=aNiRDP1pt-Jy7ija4YKCNFBwvGWbzU460F4pZWZDS90,65201
429
429
  pygpt_net/data/audio/click_on.mp3,sha256=qfdsSnthAEHVXzeyN4LlC0OvXuyW8p7stb7VXtlvZ1k,65201
430
430
  pygpt_net/data/audio/ok.mp3,sha256=LTiV32pEBkpUGBkKkcOdOFB7Eyt_QoP2Nv6c5AaXftk,32256
431
- pygpt_net/data/config/config.json,sha256=JJHUdyrBSox-IEBIcrKXDZbR6SDvNtsG3tvEZPTo4Ws,31994
432
- pygpt_net/data/config/models.json,sha256=hxfJlMbXn_sxlnx09EVFj8FSLo3dYQ9CB3BMdrGqi8w,143491
431
+ pygpt_net/data/config/config.json,sha256=HJom7EcI0OGL1aM1cRRh57gKge4zAcf_zaVVZc-ZwUg,32026
432
+ pygpt_net/data/config/models.json,sha256=4di9ExQsm0T_G7GVI8Pxhaua8duXG5L5FA4D0Ppib1o,143834
433
433
  pygpt_net/data/config/modes.json,sha256=IpjLOm428_vs6Ma9U-YQTNKJNtZw-qyM1lwhh73xl1w,2111
434
434
  pygpt_net/data/config/presets/agent_code_act.json,sha256=GYHqhxtKFLUCvRI3IJAJ7Qe1k8yD9wGGNwManldWzlI,754
435
435
  pygpt_net/data/config/presets/agent_openai.json,sha256=bpDJgLRey_effQkzFRoOEGd4aHUrmzeODSDdNzrf62I,730
@@ -2184,8 +2184,8 @@ pygpt_net/provider/api/google/computer.py,sha256=4MHyoZQv1E_YsUYnQVILOeXlvroO8FO
2184
2184
  pygpt_net/provider/api/google/image.py,sha256=jyZrRkre33Mcm_tLnq32VLu9ytXzx5Wvsy6mO4hKA3o,36464
2185
2185
  pygpt_net/provider/api/google/music.py,sha256=pxLn-7ATTMvX5loCTX_H6Uq69pcTo4Df8sn69YyzelQ,14394
2186
2186
  pygpt_net/provider/api/google/realtime/__init__.py,sha256=Ism0i9dihgxYuzQHgA6vzmsswZnBOAvVqQp0j5G2JLQ,519
2187
- pygpt_net/provider/api/google/realtime/client.py,sha256=w3aYhj4PSXBX-eIginaofWTRWe2m4NydM9iKOk-6Y58,80131
2188
- pygpt_net/provider/api/google/realtime/realtime.py,sha256=daLxuFVadN7gVtci9JCjS6IDKHf5fumdUKe81RxJzvg,7373
2187
+ pygpt_net/provider/api/google/realtime/client.py,sha256=Syvq6CM90MgNvOLjNZ17AcPTIS_heLsNZZxhmJP75pU,81573
2188
+ pygpt_net/provider/api/google/realtime/realtime.py,sha256=iAIi5qQRCTb2sqxuZzMWxAjUQU3HJDESIYTTQgiKu1o,9084
2189
2189
  pygpt_net/provider/api/google/remote_tools.py,sha256=4_yst06f2axETDKbE0RuGIeXslI39KN4obyjgU2FpNQ,3906
2190
2190
  pygpt_net/provider/api/google/store.py,sha256=aKWhy8ZdwFjZ63ElrQuq19NinJDdJywH_7jLpeu6qQc,22243
2191
2191
  pygpt_net/provider/api/google/stream.py,sha256=PYNi86BZJUqOHBxTOvutZLxR9QnF9jfJwzr-lWb4vZ0,23761
@@ -2216,7 +2216,7 @@ pygpt_net/provider/api/openai/container.py,sha256=jWsFkgofa5SKjztQnJZdfhryX-dYAc
2216
2216
  pygpt_net/provider/api/openai/image.py,sha256=Bqaz9aJiSIsV8ZdJJ4nTjjJSCzPLDMhL9cpK4a7-RhU,16751
2217
2217
  pygpt_net/provider/api/openai/realtime/__init__.py,sha256=Ism0i9dihgxYuzQHgA6vzmsswZnBOAvVqQp0j5G2JLQ,519
2218
2218
  pygpt_net/provider/api/openai/realtime/client.py,sha256=4_Evnlb0vobuNbJwNEej1oL9cAhlnfV02tbons7JQSY,76208
2219
- pygpt_net/provider/api/openai/realtime/realtime.py,sha256=tStZJwBHhzyp3yejLsr58LtNwATqpCgyCtvDM5ZqTSA,7424
2219
+ pygpt_net/provider/api/openai/realtime/realtime.py,sha256=jmy7MC-fXTy-fbZyxySJBge7FuXA24WlGbbpkGi9Z3c,8438
2220
2220
  pygpt_net/provider/api/openai/remote_tools.py,sha256=B_-o_lnljvGUJyu9jqV2k0mQdW-evNrYa4EOGDYzKbA,5935
2221
2221
  pygpt_net/provider/api/openai/responses.py,sha256=omtMvXmpYqqtnwThkXuAv-TtvWK9ycHRx7gthHQJJd8,29801
2222
2222
  pygpt_net/provider/api/openai/store.py,sha256=Za7XwZOkFT_b2CrA-WF01uDOTjXTlP72c8Db3VWbsqo,18777
@@ -2230,18 +2230,18 @@ pygpt_net/provider/api/openai/worker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeu
2230
2230
  pygpt_net/provider/api/openai/worker/assistants.py,sha256=z1fZzl59FYMVXxv48r9JVIzSCFgLzYOeKXhreZcIzO8,21538
2231
2231
  pygpt_net/provider/api/openai/worker/importer.py,sha256=GNsE_SNxg9b3oT8RWloqQeThKg3G8BDHXihQv7z92hw,14544
2232
2232
  pygpt_net/provider/api/openai/worker/importer_assistants.py,sha256=-8-5zRxu0LX8GjA7-HR9thanl_T6aRpDE_dXaTCY1Wg,7330
2233
- pygpt_net/provider/api/x_ai/__init__.py,sha256=QUY9Zs7i62TiM_aypK696xi8RXtPemoX2KrajbyX6EY,12811
2233
+ pygpt_net/provider/api/x_ai/__init__.py,sha256=oaGQbsBYu1_MLOFR_sU5EY_r4qnq2lEfZLX0Dt0K09Q,12673
2234
2234
  pygpt_net/provider/api/x_ai/audio.py,sha256=hy3nsI7aSwgMOEK9zNtuWHR-tBWjqHGGn7eZwR-lfgQ,2032
2235
2235
  pygpt_net/provider/api/x_ai/chat.py,sha256=fs5_GcBmeSFjHOTAM2dYwGCO5j6VGnpre5fko0Stbdk,50406
2236
2236
  pygpt_net/provider/api/x_ai/image.py,sha256=cE6ZH8NCYIIYHp1F8joWdsROSeaqLDxrUfGGQWCUDBk,12797
2237
2237
  pygpt_net/provider/api/x_ai/realtime/__init__.py,sha256=Ism0i9dihgxYuzQHgA6vzmsswZnBOAvVqQp0j5G2JLQ,519
2238
- pygpt_net/provider/api/x_ai/realtime/client.py,sha256=Z0EU6C8CAONRIzXbvzwjlf8fBekPpAU7etMfbny1Ew8,76001
2239
- pygpt_net/provider/api/x_ai/realtime/realtime.py,sha256=BQaWqRfBBbrycgIw9Nr3dJkzdvH_wz805V8FSdKGEyc,7481
2240
- pygpt_net/provider/api/x_ai/remote_tools.py,sha256=ibmKYy-uUXYY46MgiPbCzDRHuJZys0CfQ5f2rGv9mCo,14427
2238
+ pygpt_net/provider/api/x_ai/realtime/client.py,sha256=7zGJ3TwvRLDe0FBzwzUKLorftbGqE2xejvRjoZbZ4ug,76382
2239
+ pygpt_net/provider/api/x_ai/realtime/realtime.py,sha256=1AQKhvrXDcZN3z246VdgyfUBgjegWiS2xa1zpSTk8qc,8369
2240
+ pygpt_net/provider/api/x_ai/remote_tools.py,sha256=y9_3Q167hjsuYfibpRQFJokfbqOCmV_K_3zWAkKaPF0,17525
2241
2241
  pygpt_net/provider/api/x_ai/responses.py,sha256=n_fT_Rgs4q3Ka5jpc17e03DZrfh8r4mRY78A1SYR44o,18986
2242
2242
  pygpt_net/provider/api/x_ai/store.py,sha256=H8tPubU3Rw_0BjD0SRQ313tdKAeS1O4DTqMya1tlUAc,21635
2243
2243
  pygpt_net/provider/api/x_ai/stream.py,sha256=mIH_leW2mf9vubkH7FT9dik5CKIWayfuioCfQZpek14,27621
2244
- pygpt_net/provider/api/x_ai/tools.py,sha256=svTvjdon_j1cKKWpaHHNH9wZbdzXGmmoFj9lgsZymtk,6016
2244
+ pygpt_net/provider/api/x_ai/tools.py,sha256=dJxc2Ssj2oyhGVJVNjwHZKP3Sc3aGxlRmp29AH9HHPM,7680
2245
2245
  pygpt_net/provider/api/x_ai/utils.py,sha256=9qayMXp0SUNiQ1yxKoJ9UY4LLm2JFRxFv2GPCjQ-5JQ,7221
2246
2246
  pygpt_net/provider/api/x_ai/vision.py,sha256=Y7_wkMp9XFev2uQwBX--SqUsw9yqWqf7Ns8Y2pOOhhg,3656
2247
2247
  pygpt_net/provider/api/x_ai/worker/importer.py,sha256=y9geGaGkAfMErvMkHh5PPyZ0xfcfhypzC1sGEJYECvE,12482
@@ -2281,7 +2281,7 @@ pygpt_net/provider/core/calendar/db_sqlite/storage.py,sha256=QDclQCQdr4QyRIqjgGX
2281
2281
  pygpt_net/provider/core/config/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
2282
2282
  pygpt_net/provider/core/config/base.py,sha256=cbvzbMNqL2XgC-36gGubnU37t94AX7LEw0lecb2Nm80,1365
2283
2283
  pygpt_net/provider/core/config/json_file.py,sha256=GCcpCRQnBiSLWwlGbG9T3ZgiHkTfp5Jsg2KYkZcakBw,6789
2284
- pygpt_net/provider/core/config/patch.py,sha256=1cIJrCQr9gvzjdQQ-Ik7LOlTX02iUW25mqdA8PvHsX4,11749
2284
+ pygpt_net/provider/core/config/patch.py,sha256=MSSM_jzdQv2EARVAYDn6q_TA1g6gnKnTUFbZm1jael8,12155
2285
2285
  pygpt_net/provider/core/config/patches/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2286
2286
  pygpt_net/provider/core/config/patches/patch_before_2_6_42.py,sha256=HN2xH_9_uXTGdAS2VHUUP_nkra2dssXS7LOTY0Nu8PE,126802
2287
2287
  pygpt_net/provider/core/ctx/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
@@ -2312,7 +2312,7 @@ pygpt_net/provider/core/mode/patch.py,sha256=VS2KCYW05jxLd-lcStNY1k4fHKUUrVVLTdR
2312
2312
  pygpt_net/provider/core/model/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
2313
2313
  pygpt_net/provider/core/model/base.py,sha256=L1x2rHha8a8hnCUYxZr88utay1EWEx5qBXW_2acpAN0,1319
2314
2314
  pygpt_net/provider/core/model/json_file.py,sha256=l74l_n5PEHNp-FsoHtO9LHflz3RFKwDwKwOKN0stgZw,8418
2315
- pygpt_net/provider/core/model/patch.py,sha256=fu_RZTbiReqKJafkcdHhcf5HHcVZXfjsa00k1ch0MkQ,6432
2315
+ pygpt_net/provider/core/model/patch.py,sha256=VoLFyZB6YFkJEsbuEAeZ1brXiX1X4g3mYoYX_mjha38,7924
2316
2316
  pygpt_net/provider/core/model/patches/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2317
2317
  pygpt_net/provider/core/model/patches/patch_before_2_6_42.py,sha256=4z10uc4NnmCCL9AYWrXfzi1Xet5OZFjc7K-Nf0s4T1s,37729
2318
2318
  pygpt_net/provider/core/notepad/__init__.py,sha256=jQQgG9u_ZLsZWXustoc1uvC-abUvj4RBKPAM30-f2Kc,488
@@ -2715,8 +2715,8 @@ pygpt_net/ui/widget/textarea/web.py,sha256=kt1HvnaoiHL0SMnS3rCEolHoJtADAcw5EhUTI
2715
2715
  pygpt_net/ui/widget/vision/__init__.py,sha256=8HT4tQFqQogEEpGYTv2RplKBthlsFKcl5egnv4lzzEw,488
2716
2716
  pygpt_net/ui/widget/vision/camera.py,sha256=DCx7h1nHruuUkU0Tw8Ay4OUVoNJhkuLsW4hIvGF5Skw,6985
2717
2717
  pygpt_net/utils.py,sha256=r-Dum4brfBaZaHJr-ux86FfdMuMHFwyuUL2bEFirdhc,14649
2718
- pygpt_net-2.7.8.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2719
- pygpt_net-2.7.8.dist-info/METADATA,sha256=vtnbPH2_53bE57smJLMF7j6IoD8Qu55OHPw6CbbDx9c,173870
2720
- pygpt_net-2.7.8.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2721
- pygpt_net-2.7.8.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2722
- pygpt_net-2.7.8.dist-info/RECORD,,
2718
+ pygpt_net-2.7.9.dist-info/LICENSE,sha256=rbPqNB_xxANH8hKayJyIcTwD4bj4Y2G-Mcm85r1OImM,1126
2719
+ pygpt_net-2.7.9.dist-info/METADATA,sha256=JsrtCVatIaZmn-tSpjUSW_bW7N_XNZAv9XoO91WOuIo,173989
2720
+ pygpt_net-2.7.9.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
2721
+ pygpt_net-2.7.9.dist-info/entry_points.txt,sha256=qvpII6UHIt8XfokmQWnCYQrTgty8FeJ9hJvOuUFCN-8,43
2722
+ pygpt_net-2.7.9.dist-info/RECORD,,