pygpt-net 2.6.32__py3-none-any.whl → 2.6.34__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 (44) hide show
  1. pygpt_net/CHANGELOG.txt +12 -0
  2. pygpt_net/__init__.py +3 -3
  3. pygpt_net/controller/assistant/batch.py +14 -4
  4. pygpt_net/controller/assistant/files.py +1 -0
  5. pygpt_net/controller/assistant/store.py +195 -1
  6. pygpt_net/controller/camera/camera.py +1 -1
  7. pygpt_net/controller/chat/attachment.py +2 -0
  8. pygpt_net/controller/chat/common.py +50 -46
  9. pygpt_net/controller/config/placeholder.py +95 -75
  10. pygpt_net/controller/dialogs/confirm.py +3 -1
  11. pygpt_net/controller/media/media.py +11 -3
  12. pygpt_net/controller/painter/common.py +227 -10
  13. pygpt_net/controller/painter/painter.py +4 -12
  14. pygpt_net/core/assistants/files.py +18 -0
  15. pygpt_net/core/camera/camera.py +38 -93
  16. pygpt_net/core/camera/worker.py +430 -0
  17. pygpt_net/core/filesystem/url.py +3 -0
  18. pygpt_net/core/render/web/body.py +65 -9
  19. pygpt_net/core/text/utils.py +3 -0
  20. pygpt_net/data/config/config.json +234 -221
  21. pygpt_net/data/config/models.json +179 -180
  22. pygpt_net/data/config/settings.json +10 -5
  23. pygpt_net/data/locale/locale.de.ini +8 -6
  24. pygpt_net/data/locale/locale.en.ini +9 -5
  25. pygpt_net/data/locale/locale.es.ini +8 -6
  26. pygpt_net/data/locale/locale.fr.ini +8 -6
  27. pygpt_net/data/locale/locale.it.ini +8 -6
  28. pygpt_net/data/locale/locale.pl.ini +8 -6
  29. pygpt_net/data/locale/locale.uk.ini +8 -6
  30. pygpt_net/data/locale/locale.zh.ini +8 -6
  31. pygpt_net/item/assistant.py +13 -1
  32. pygpt_net/provider/api/google/__init__.py +32 -23
  33. pygpt_net/provider/api/openai/store.py +45 -1
  34. pygpt_net/provider/llms/google.py +4 -0
  35. pygpt_net/ui/dialog/assistant_store.py +213 -203
  36. pygpt_net/ui/layout/chat/input.py +3 -3
  37. pygpt_net/ui/widget/draw/painter.py +458 -75
  38. pygpt_net/ui/widget/option/combo.py +5 -1
  39. pygpt_net/ui/widget/textarea/input.py +273 -3
  40. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/METADATA +14 -2
  41. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/RECORD +44 -43
  42. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/LICENSE +0 -0
  43. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/WHEEL +0 -0
  44. {pygpt_net-2.6.32.dist-info → pygpt_net-2.6.34.dist-info}/entry_points.txt +0 -0
@@ -1520,7 +1520,8 @@
1520
1520
  },
1521
1521
  "vision.capture.idx": {
1522
1522
  "section": "vision",
1523
- "type": "int",
1523
+ "type": "combo",
1524
+ "use": "camera_devices",
1524
1525
  "slider": true,
1525
1526
  "label": "settings.vision.capture.idx",
1526
1527
  "description": "settings.vision.capture.idx.desc",
@@ -1529,7 +1530,8 @@
1529
1530
  "max": 3,
1530
1531
  "multiplier": 1,
1531
1532
  "step": 1,
1532
- "advanced": false
1533
+ "advanced": false,
1534
+ "tab": "camera"
1533
1535
  },
1534
1536
  "vision.capture.width": {
1535
1537
  "section": "vision",
@@ -1541,7 +1543,8 @@
1541
1543
  "max": 4096,
1542
1544
  "multiplier": 1,
1543
1545
  "step": 1,
1544
- "advanced": false
1546
+ "advanced": false,
1547
+ "tab": "camera"
1545
1548
  },
1546
1549
  "vision.capture.height": {
1547
1550
  "section": "vision",
@@ -1553,7 +1556,8 @@
1553
1556
  "max": 4096,
1554
1557
  "multiplier": 1,
1555
1558
  "step": 1,
1556
- "advanced": false
1559
+ "advanced": false,
1560
+ "tab": "camera"
1557
1561
  },
1558
1562
  "vision.capture.quality": {
1559
1563
  "section": "vision",
@@ -1565,7 +1569,8 @@
1565
1569
  "max": 100,
1566
1570
  "multiplier": 1,
1567
1571
  "step": 1,
1568
- "advanced": false
1572
+ "advanced": false,
1573
+ "tab": "camera"
1569
1574
  },
1570
1575
  "audio.input.backend": {
1571
1576
  "section": "audio",
@@ -960,6 +960,7 @@ output.tips.prefix = Tipp
960
960
  painter.btn.camera.capture = Von der Kamera
961
961
  painter.btn.capture = Bild erfassen
962
962
  painter.btn.clear = Löschen
963
+ painter.btn.crop = Zuschneiden
963
964
  painter.capture.manual.captured.success = Bild erfasst:
964
965
  painter.capture.name.prefix = Zeichnung von
965
966
  painter.mode.erase = Radieren
@@ -1363,7 +1364,8 @@ settings.section.remote_tools = Fernwerkzeuge
1363
1364
  settings.section.remote_tools.openai = OpenAI
1364
1365
  settings.section.tab.general = Allgemein
1365
1366
  settings.section.updates = Aktualisierungen
1366
- settings.section.vision = Vision
1367
+ settings.section.vision = Vision und Kamera
1368
+ settings.section.vision.camera = Kamera
1367
1369
  settings.store_history = Verlauf speichern
1368
1370
  settings.store_history_time = Uhrzeit im Verlauf speichern
1369
1371
  settings.temperature = Temperatur
@@ -1393,11 +1395,11 @@ settings.video.seed = Startwert
1393
1395
  settings.video.seed.desc = Optionaler Zufallsstartwert für reproduzierbare Ergebnisse; leer lassen für zufällig
1394
1396
  settings.vision.capture.auto = Automatisches Erfassen
1395
1397
  settings.vision.capture.enabled = Kamera
1396
- settings.vision.capture.height = Kamerabildhöhe (px)
1397
- settings.vision.capture.idx = Kameraindex (Nummer)
1398
- settings.vision.capture.idx.desc = Kamera-Index zur Videoaufzeichnung (Index der Kamera, Standard: 0)
1399
- settings.vision.capture.quality = Bildqualität beim Erfassen (%)
1400
- settings.vision.capture.width = Kamerabildbreite (px)
1398
+ settings.vision.capture.height = Aufnahmehöhe (in Pixeln)
1399
+ settings.vision.capture.idx = Kameragerät
1400
+ settings.vision.capture.idx.desc = Wählen Sie ein Kameragerät für die Echtzeit-Videoaufnahme
1401
+ settings.vision.capture.quality = Aufnahmequalität (%)
1402
+ settings.vision.capture.width = Aufnahmewidth (in Pixeln)
1401
1403
  settings.zoom = Zoomen des Chat-Ausgabefensters
1402
1404
  speech.enable = Sprachausgabe aktivieren
1403
1405
  speech.listening = Sprechen Sie jetzt...
@@ -253,6 +253,7 @@ confirm.assistant.store.clear = Clear vector stores (local only)?
253
253
  confirm.assistant.store.import = Import all vector stores from API?
254
254
  confirm.assistant.store.refresh = Refresh all stores?
255
255
  confirm.assistant.store.truncate = Delete all vector stores in API?
256
+ confirm.assistant.store.file.delete = Delete selected file in API?
256
257
  confirm.ctx.delete = Delete group?
257
258
  confirm.ctx.delete.all = Delete group and all items?
258
259
  confirm.img.delete = Delete file from disk?
@@ -961,6 +962,7 @@ output.tips.prefix = Tip
961
962
  painter.btn.camera.capture = From camera
962
963
  painter.btn.capture = Use image
963
964
  painter.btn.clear = Clear
965
+ painter.btn.crop = Crop
964
966
  painter.capture.manual.captured.success = Image captured:
965
967
  painter.capture.name.prefix = Drawing from
966
968
  painter.mode.erase = Erase
@@ -1405,7 +1407,8 @@ settings.section.remote_tools.google = Google
1405
1407
  settings.section.remote_tools.openai = OpenAI
1406
1408
  settings.section.tab.general = General
1407
1409
  settings.section.updates = Updates
1408
- settings.section.vision = Vision
1410
+ settings.section.vision = Vision and camera
1411
+ settings.section.vision.camera = Camera
1409
1412
  settings.store_history = Store history
1410
1413
  settings.store_history_time = Store time in history
1411
1414
  settings.temperature = Temperature
@@ -1435,11 +1438,11 @@ settings.video.seed = Seed
1435
1438
  settings.video.seed.desc = Optional random seed for reproducible results; leave empty for random
1436
1439
  settings.vision.capture.auto = Auto capture
1437
1440
  settings.vision.capture.enabled = Camera
1438
- settings.vision.capture.height = Camera height (px)
1439
- settings.vision.capture.idx = Camera Input Device
1440
- settings.vision.capture.idx.desc = Video capture camera index (index of the camera, default: 0)
1441
+ settings.vision.capture.height = Capture height (in pixels)
1442
+ settings.vision.capture.idx = Camera Device
1443
+ settings.vision.capture.idx.desc = Select a camera device for real-time video capture
1441
1444
  settings.vision.capture.quality = Capture quality (%)
1442
- settings.vision.capture.width = Camera width (px)
1445
+ settings.vision.capture.width = Capture width (in pixels)
1443
1446
  settings.zoom = Chat output window zoom
1444
1447
  speech.enable = Speak
1445
1448
  speech.listening = Speak now...
@@ -1611,3 +1614,4 @@ vision.capture.manual.captured.success = Image captured from the camera:
1611
1614
  vision.capture.name.prefix = Camera capture:
1612
1615
  vision.capture.options.title = Video capture
1613
1616
  vision.checkbox.tooltip = If checked, the vision model is active. It will be automatically activated upon image upload. You can deactivate it in real-time.
1617
+ assistant.store.menu.file.delete = Delete file
@@ -961,6 +961,7 @@ output.tips.prefix = Consejo
961
961
  painter.btn.camera.capture = De la cámara
962
962
  painter.btn.capture = Capturar imagen
963
963
  painter.btn.clear = Limpiar
964
+ painter.btn.crop = Recortar
964
965
  painter.capture.manual.captured.success = Imagen capturada:
965
966
  painter.capture.name.prefix = Dibujo de
966
967
  painter.mode.erase = Borrar
@@ -1364,7 +1365,8 @@ settings.section.remote_tools = Herramientas remotas
1364
1365
  settings.section.remote_tools.openai = OpenAI
1365
1366
  settings.section.tab.general = General
1366
1367
  settings.section.updates = Actualizaciones
1367
- settings.section.vision = Visión
1368
+ settings.section.vision = Visión y cámara
1369
+ settings.section.vision.camera = Cámara
1368
1370
  settings.store_history = Almacenar historial
1369
1371
  settings.store_history_time = Almacenar hora en el historial
1370
1372
  settings.temperature = Temperatura
@@ -1394,11 +1396,11 @@ settings.video.seed = Semilla
1394
1396
  settings.video.seed.desc = Semilla aleatoria opcional para resultados reproducibles; déjelo vacío para aleatorio
1395
1397
  settings.vision.capture.auto = Captura automática
1396
1398
  settings.vision.capture.enabled = Cámara
1397
- settings.vision.capture.height = Altura de captura de cámara (px)
1398
- settings.vision.capture.idx = IDX de cámara (número)
1399
- settings.vision.capture.idx.desc = Índice de cámara para captura de video (índice de la cámara, predeterminado: 0)
1400
- settings.vision.capture.quality = Calidad de captura de imagen (%)
1401
- settings.vision.capture.width = Ancho de captura de cámara (px)
1399
+ settings.vision.capture.height = Altura de captura (en píxeles)
1400
+ settings.vision.capture.idx = Dispositivo de Cámara
1401
+ settings.vision.capture.idx.desc = Seleccione un dispositivo de cámara para la captura de video en tiempo real
1402
+ settings.vision.capture.quality = Calidad de captura (%)
1403
+ settings.vision.capture.width = Ancho de captura (en píxeles)
1402
1404
  settings.zoom = Zoom de ventana de salida del chat
1403
1405
  speech.enable = Hablar
1404
1406
  speech.listening = Hable ahora...
@@ -960,6 +960,7 @@ output.tips.prefix = Astuce
960
960
  painter.btn.camera.capture = De la caméra
961
961
  painter.btn.capture = Capturer l'image
962
962
  painter.btn.clear = Effacer
963
+ painter.btn.crop = Rogner
963
964
  painter.capture.manual.captured.success = Image capturée:
964
965
  painter.capture.name.prefix = Dessin de
965
966
  painter.mode.erase = Effacer
@@ -1363,7 +1364,8 @@ settings.section.remote_tools = Outils distants
1363
1364
  settings.section.remote_tools.openai = OpenAI
1364
1365
  settings.section.tab.general = Général
1365
1366
  settings.section.updates = Mises à jour
1366
- settings.section.vision = Vision
1367
+ settings.section.vision = Vision et caméra
1368
+ settings.section.vision.camera = Caméra
1367
1369
  settings.store_history = Stocker l'historique
1368
1370
  settings.store_history_time = Stocker l'heure dans l'historique
1369
1371
  settings.temperature = Température
@@ -1393,11 +1395,11 @@ settings.video.seed = Graine
1393
1395
  settings.video.seed.desc = Graine aléatoire facultative pour des résultats reproductibles; laisser vide pour aléatoire
1394
1396
  settings.vision.capture.auto = Capture automatique
1395
1397
  settings.vision.capture.enabled = Caméra
1396
- settings.vision.capture.height = Hauteur de capture par caméra (px)
1397
- settings.vision.capture.idx = IDX de la caméra (numéro)
1398
- settings.vision.capture.idx.desc = Indice de la caméra de capture vidéo (indice de la caméra, par défaut : 0)
1399
- settings.vision.capture.quality = Qualité de capture d'image (%)
1400
- settings.vision.capture.width = Largeur de capture par caméra (px)
1398
+ settings.vision.capture.height = Hauteur de capture (en pixels)
1399
+ settings.vision.capture.idx = Appareil Photo
1400
+ settings.vision.capture.idx.desc = Sélectionnez un appareil photo pour la capture vidéo en temps réel
1401
+ settings.vision.capture.quality = Qualité de capture (%)
1402
+ settings.vision.capture.width = Largeur de capture (en pixels)
1401
1403
  settings.zoom = Zoom de la fenêtre de sortie du chat
1402
1404
  speech.enable = Parler
1403
1405
  speech.listening = Parler maintenant...
@@ -960,6 +960,7 @@ output.tips.prefix = Suggerimento
960
960
  painter.btn.camera.capture = Dalla fotocamera
961
961
  painter.btn.capture = Cattura immagine
962
962
  painter.btn.clear = Pulire
963
+ painter.btn.crop = Ritaglia
963
964
  painter.capture.manual.captured.success = Immagine catturata:
964
965
  painter.capture.name.prefix = Disegno da
965
966
  painter.mode.erase = Cancellare
@@ -1363,7 +1364,8 @@ settings.section.remote_tools = Strumenti remoti
1363
1364
  settings.section.remote_tools.openai = OpenAI
1364
1365
  settings.section.tab.general = Generale
1365
1366
  settings.section.updates = Aggiornamenti
1366
- settings.section.vision = Visione
1367
+ settings.section.vision = Visione e fotocamera
1368
+ settings.section.vision.camera = Fotocamera
1367
1369
  settings.store_history = Conserva la cronologia
1368
1370
  settings.store_history_time = Conserva l'orario nella cronologia
1369
1371
  settings.temperature = Temperatura
@@ -1393,11 +1395,11 @@ settings.video.seed = Seme
1393
1395
  settings.video.seed.desc = Seme casuale opzionale per risultati riproducibili; lascia vuoto per casuale
1394
1396
  settings.vision.capture.auto = Cattura automatica
1395
1397
  settings.vision.capture.enabled = Fotocamera
1396
- settings.vision.capture.height = Altezza cattura fotocamera (px)
1397
- settings.vision.capture.idx = IDX fotocamera (numero)
1398
- settings.vision.capture.idx.desc = Indice videocamera per la cattura video (indice della videocamera, predefinito: 0)
1399
- settings.vision.capture.quality = Qualità cattura immagine (%)
1400
- settings.vision.capture.width = Larghezza cattura fotocamera (px)
1398
+ settings.vision.capture.height = Altezza della cattura (in pixel)
1399
+ settings.vision.capture.idx = Dispositivo Fotocamera
1400
+ settings.vision.capture.idx.desc = Seleziona un dispositivo fotocamera per la cattura video in tempo reale
1401
+ settings.vision.capture.quality = Qualità della cattura (%)
1402
+ settings.vision.capture.width = Larghezza della cattura (in pixel)
1401
1403
  settings.zoom = Zoom finestra output chat
1402
1404
  speech.enable = Parla
1403
1405
  speech.listening = Parla ora...
@@ -964,6 +964,7 @@ output.tips.prefix = Tip
964
964
  painter.btn.camera.capture = Z kamery
965
965
  painter.btn.capture = Użyj obrazu
966
966
  painter.btn.clear = Wyczyść
967
+ painter.btn.crop = Przytnij
967
968
  painter.capture.manual.captured.success = Image captured:
968
969
  painter.capture.name.prefix = Drawing from
969
970
  painter.mode.erase = Gumka
@@ -1367,7 +1368,8 @@ settings.section.remote_tools = Zdalne narzędzia
1367
1368
  settings.section.remote_tools.openai = OpenAI
1368
1369
  settings.section.tab.general = Ogólne
1369
1370
  settings.section.updates = Aktualizacje
1370
- settings.section.vision = Wizja
1371
+ settings.section.vision = Wizja i kamera
1372
+ settings.section.vision.camera = Kamera
1371
1373
  settings.store_history = Zapisuj historię
1372
1374
  settings.store_history_time = Zapisuj czas w historii
1373
1375
  settings.temperature = Temperatura
@@ -1397,11 +1399,11 @@ settings.video.seed = Seed
1397
1399
  settings.video.seed.desc = Optional random seed for reproducible results; leave empty for random
1398
1400
  settings.vision.capture.auto = Auto przechwyt.
1399
1401
  settings.vision.capture.enabled = Kamera
1400
- settings.vision.capture.height = Kamera - obraz szerokość (px)
1401
- settings.vision.capture.idx = Nr. kamery (index)
1402
- settings.vision.capture.idx.desc = Indeks kamery do przechwytywania wideo (indeks kamery, domyślnie: 0)
1403
- settings.vision.capture.quality = Jakość przechwyt. obrazu (%)
1404
- settings.vision.capture.width = Kamera - obraz wysokość (px)
1402
+ settings.vision.capture.height = Wysokość przechwytywania (w pikselach)
1403
+ settings.vision.capture.idx = Urządzenie Kamery
1404
+ settings.vision.capture.idx.desc = Wybierz urządzenie kamery do przechwytywania wideo w czasie rzeczywistym
1405
+ settings.vision.capture.quality = Jakość przechwytywania (%)
1406
+ settings.vision.capture.width = Szerokość przechwytywania (w pikselach)
1405
1407
  settings.zoom = Powiększenie okna outputu czatu
1406
1408
  speech.enable = Mowa
1407
1409
  speech.listening = Mów teraz...
@@ -960,6 +960,7 @@ output.tips.prefix = Порада
960
960
  painter.btn.camera.capture = З камери
961
961
  painter.btn.capture = Захопити зображення
962
962
  painter.btn.clear = Очистити
963
+ painter.btn.crop = Обрізати
963
964
  painter.capture.manual.captured.success = Зображення захоплено:
964
965
  painter.capture.name.prefix = Малюнок з
965
966
  painter.mode.erase = Стерти
@@ -1363,7 +1364,8 @@ settings.section.remote_tools = Віддалені інструменти
1363
1364
  settings.section.remote_tools.openai = OpenAI
1364
1365
  settings.section.tab.general = Загальні
1365
1366
  settings.section.updates = Оновлення
1366
- settings.section.vision = Візія
1367
+ settings.section.vision = Зір і камера
1368
+ settings.section.vision.camera = Камера
1367
1369
  settings.store_history = Зберігати історію
1368
1370
  settings.store_history_time = Зберігати час в історії
1369
1371
  settings.temperature = Температура
@@ -1393,11 +1395,11 @@ settings.video.seed = Seed
1393
1395
  settings.video.seed.desc = Опціональний випадковий seed для відтворюваних результатів; залиште порожнім для випадкового
1394
1396
  settings.vision.capture.auto = Автоматичне захоплення
1395
1397
  settings.vision.capture.enabled = Камера
1396
- settings.vision.capture.height = Висота захоплення з камери (пікселі)
1397
- settings.vision.capture.idx = IDX камери (число)
1398
- settings.vision.capture.idx.desc = Індекс камери для захоплення відео (індекс камери, за замовчуванням: 0)
1399
- settings.vision.capture.quality = Якість захоплення зображення (%)
1400
- settings.vision.capture.width = Ширина захоплення з камери (пікселі)
1398
+ settings.vision.capture.height = Висота зйомки пікселях)
1399
+ settings.vision.capture.idx = Пристрій Камери
1400
+ settings.vision.capture.idx.desc = Виберіть пристрій камери для відеозйомки в реальному часі
1401
+ settings.vision.capture.quality = Якість зйомки (%)
1402
+ settings.vision.capture.width = Ширина зйомки пікселях)
1401
1403
  settings.zoom = Збільшення вікна виводу чату
1402
1404
  speech.enable = Говоріть
1403
1405
  speech.listening = Говоріть зараз...
@@ -960,6 +960,7 @@ output.tips.prefix = 提示
960
960
  painter.btn.camera.capture = 从相机
961
961
  painter.btn.capture = 使用图像
962
962
  painter.btn.clear = 清除
963
+ painter.btn.crop = 裁剪
963
964
  painter.capture.manual.captured.success = 图像已捕获:
964
965
  painter.capture.name.prefix = 绘制自
965
966
  painter.mode.erase = 擦除
@@ -1363,7 +1364,8 @@ settings.section.remote_tools = 远程工具
1363
1364
  settings.section.remote_tools.openai = OpenAI
1364
1365
  settings.section.tab.general = 一般設置
1365
1366
  settings.section.updates = 更新
1366
- settings.section.vision = 視覺
1367
+ settings.section.vision = 视觉和摄像头
1368
+ settings.section.vision.camera = 摄像头
1367
1369
  settings.store_history = 存儲歷史記錄
1368
1370
  settings.store_history_time = 在歷史記錄中存儲時間
1369
1371
  settings.temperature = 溫度
@@ -1393,11 +1395,11 @@ settings.video.seed = 随机种子
1393
1395
  settings.video.seed.desc = 可选的随机种子以获得可重复的结果;留空为随机
1394
1396
  settings.vision.capture.auto = 自动捕获
1395
1397
  settings.vision.capture.enabled = 相机
1396
- settings.vision.capture.height = 相机高度(px)
1397
- settings.vision.capture.idx = 相机输入设备
1398
- settings.vision.capture.idx.desc = 视频捕获相机索引(相机索引,默认值:0)
1399
- settings.vision.capture.quality = 捕获质量(%)
1400
- settings.vision.capture.width = 相机宽度(px)
1398
+ settings.vision.capture.height = 拍摄高度(像素)
1399
+ settings.vision.capture.idx = 摄像设备
1400
+ settings.vision.capture.idx.desc = 选择实时视频捕捉的摄像设备
1401
+ settings.vision.capture.quality = 拍摄质量(%)
1402
+ settings.vision.capture.width = 拍摄宽度(像素)
1401
1403
  settings.zoom = 聊天输出窗口缩放
1402
1404
  speech.enable = 启用语音
1403
1405
  speech.listening = 现在说话...
@@ -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.08.06 19:00:00 #
9
+ # Updated Date: 2025.09.02 22:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import json
@@ -271,6 +271,18 @@ class AssistantStoreItem:
271
271
  self.expire_days = data.get('expire_days', 0)
272
272
  self.status = data.get('status', {})
273
273
 
274
+ def get_file_count(self):
275
+ """
276
+ Return number of files in store
277
+
278
+ :return: number of files
279
+ """
280
+ num = self.num_files
281
+ if self.status and isinstance(self.status, dict) and 'file_counts' in self.status:
282
+ if 'completed' in self.status['file_counts']:
283
+ num = int(self.status['file_counts']['completed'] or 0)
284
+ return num
285
+
274
286
  def dump(self) -> str:
275
287
  """
276
288
  Dump item to string
@@ -69,32 +69,12 @@ class ApiGoogle:
69
69
  model = ModelItem()
70
70
  model.provider = "google"
71
71
  args = self.window.core.models.prepare_client_args(mode, model)
72
- config = self.window.core.config
73
-
74
72
  filtered = {}
75
73
  if args.get("api_key"):
76
74
  filtered["api_key"] = args["api_key"]
77
75
 
78
- # setup VertexAI
79
- use_vertex = False
80
- if config.get("api_native_google.use_vertex", False):
81
- use_vertex = True
82
- os.environ["GOOGLE_GENAI_USE_VERTEXAI"] = "1"
83
- os.environ["GOOGLE_CLOUD_PROJECT"] = config.get("api_native_google.cloud_project", "")
84
- os.environ["GOOGLE_CLOUD_LOCATION"] = config.get("api_native_google.cloud_location", "us-central1")
85
- if config.get("api_native_google.app_credentials", ""):
86
- os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = config.get("api_native_google.app_credentials", "")
87
- else:
88
- if os.environ.get("GOOGLE_GENAI_USE_VERTEXAI"):
89
- del os.environ["GOOGLE_GENAI_USE_VERTEXAI"]
90
- if os.environ.get("GOOGLE_CLOUD_PROJECT"):
91
- del os.environ["GOOGLE_CLOUD_PROJECT"]
92
- if os.environ.get("GOOGLE_CLOUD_LOCATION"):
93
- del os.environ["GOOGLE_CLOUD_LOCATION"]
94
- if os.environ.get("GOOGLE_APPLICATION_CREDENTIALS"):
95
- del os.environ["GOOGLE_APPLICATION_CREDENTIALS"]
96
-
97
- # append VertexAI params to client args
76
+ # setup VertexAI if enabled
77
+ use_vertex = self.setup_env()
98
78
  if use_vertex:
99
79
  filtered["vertexai"] = True
100
80
  filtered["project"] = os.environ.get("GOOGLE_CLOUD_PROJECT")
@@ -104,7 +84,6 @@ class ApiGoogle:
104
84
  if self.client is None or self.last_client_args != filtered:
105
85
  self.client = genai.Client(**filtered)
106
86
  self.last_client_args = filtered
107
-
108
87
  return self.client
109
88
 
110
89
  def call(
@@ -313,6 +292,36 @@ class ApiGoogle:
313
292
 
314
293
  return tools
315
294
 
295
+ def setup_env(self) -> bool:
296
+ """
297
+ Setup environment variables for VertexAI via Google GenAI API
298
+
299
+ - GOOGLE_GENAI_USE_VERTEXAI
300
+ - GOOGLE_CLOUD_PROJECT
301
+ - GOOGLE_CLOUD_LOCATION
302
+ - GOOGLE_APPLICATION_CREDENTIALS
303
+
304
+ :return: bool: True if VertexAI is used, False otherwise
305
+ """
306
+ config = self.window.core.config
307
+ use_vertex = False
308
+ if config.get("api_native_google.use_vertex", False):
309
+ use_vertex = True
310
+ os.environ["GOOGLE_GENAI_USE_VERTEXAI"] = "1"
311
+ os.environ["GOOGLE_CLOUD_PROJECT"] = config.get("api_native_google.cloud_project", "")
312
+ os.environ["GOOGLE_CLOUD_LOCATION"] = config.get("api_native_google.cloud_location", "us-central1")
313
+ if config.get("api_native_google.app_credentials", ""):
314
+ os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = config.get("api_native_google.app_credentials", "")
315
+ else:
316
+ if os.environ.get("GOOGLE_GENAI_USE_VERTEXAI"):
317
+ del os.environ["GOOGLE_GENAI_USE_VERTEXAI"]
318
+ if os.environ.get("GOOGLE_CLOUD_PROJECT"):
319
+ del os.environ["GOOGLE_CLOUD_PROJECT"]
320
+ if os.environ.get("GOOGLE_CLOUD_LOCATION"):
321
+ del os.environ["GOOGLE_CLOUD_LOCATION"]
322
+ if os.environ.get("GOOGLE_APPLICATION_CREDENTIALS"):
323
+ del os.environ["GOOGLE_APPLICATION_CREDENTIALS"]
324
+ return use_vertex
316
325
 
317
326
  def stop(self):
318
327
  """On global event stop"""
@@ -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.07.14 18:00:00 #
9
+ # Updated Date: 2025.09.02 22:00:00 #
10
10
  # ================================================== #
11
11
 
12
12
  import os
@@ -175,6 +175,50 @@ class Store:
175
175
  self.log(msg, callback)
176
176
  return num
177
177
 
178
+ def remove_file(
179
+ self,
180
+ file_id: str,
181
+ callback: Optional[callable] = None
182
+ ) -> bool:
183
+ """
184
+ Remove a single file using the Files API.
185
+
186
+ :param file_id: file ID
187
+ :param callback: callback function for logging
188
+ :return: True if removed
189
+ """
190
+ self.log("Removing file: " + file_id, callback)
191
+ try:
192
+ res = self.delete_file(file_id)
193
+ return res is not None
194
+ except Exception as e:
195
+ msg = "Error removing file {}: {}".format(file_id, str(e))
196
+ self.log(msg, callback)
197
+ raise
198
+
199
+ def remove_store_file(
200
+ self,
201
+ store_id: str,
202
+ file_id: str,
203
+ callback: Optional[callable] = None
204
+ ) -> bool:
205
+ """
206
+ Remove a single file from a specific vector store.
207
+
208
+ :param store_id: store ID
209
+ :param file_id: file ID
210
+ :param callback: callback function for logging
211
+ :return: True if removed
212
+ """
213
+ self.log("Removing file from vector store [{}]: {}".format(store_id, file_id), callback)
214
+ try:
215
+ res = self.delete_store_file(store_id, file_id)
216
+ return res is not None
217
+ except Exception as e:
218
+ msg = "Error removing file {} from store {}: {}".format(file_id, store_id, str(e))
219
+ self.log(msg, callback)
220
+ raise
221
+
178
222
  def remove_store_files(
179
223
  self,
180
224
  store_id: str,
@@ -55,6 +55,8 @@ class GoogleLLM(BaseLLM):
55
55
  args["model"] = model.id
56
56
  if "api_key" not in args or args["api_key"] == "":
57
57
  args["api_key"] = window.core.config.get("api_key_google", "")
58
+
59
+ window.core.api.google.setup_env() # setup VertexAI if configured
58
60
  return GoogleGenAI(**args)
59
61
 
60
62
  def get_embeddings_model(
@@ -79,6 +81,8 @@ class GoogleLLM(BaseLLM):
79
81
  args["api_key"] = window.core.config.get("api_key_google", "")
80
82
  if "model" in args and "model_name" not in args:
81
83
  args["model_name"] = args.pop("model")
84
+
85
+ window.core.api.google.setup_env() # setup VertexAI if configured
82
86
  return GoogleGenAIEmbedding(**args)
83
87
 
84
88
  def get_models(