iobroker.javascript 9.2.0 → 9.2.1

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 (43) hide show
  1. package/README.md +18 -9
  2. package/admin/assets/AiChatPanel-Cc1KscBJ.js +315 -0
  3. package/admin/assets/AiInlineProvider-DkgjVSFQ.js +7 -0
  4. package/admin/assets/ScriptEditor-6qrtvwPL.js +2 -0
  5. package/admin/assets/ScriptEditorVanillaMonaco-bJua4sm1.js +3 -0
  6. package/admin/assets/applyCodeEdit-BdRnbz2g.js +1 -0
  7. package/admin/assets/{index-DAkyON1r.js → index-BZxCaQhO.js} +1 -1
  8. package/admin/assets/{index-DW5CwIma.js → index-CYbVtccs.js} +132 -121
  9. package/admin/assets/index-CexrwGGC.js +986 -0
  10. package/admin/assets/{index-BI3JsAz_.js → index-DsW7vBcg.js} +1 -1
  11. package/admin/assets/inlineChatWidget-Cu6rb4Ar.js +2 -0
  12. package/admin/assets/inlineDiffController-DBLpPOe2.js +16 -0
  13. package/admin/assets/{localSharedImportMap-CqvxvyGG.js → localSharedImportMap-BCwqnmn4.js} +1 -1
  14. package/admin/assets/stateHoverProvider-CGChzV5W.js +3 -0
  15. package/admin/assets/{virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-BJ03G6Pu.js → virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-DNrEsMrg.js} +2 -2
  16. package/admin/custom/assets/{index-BVwMgafs.js → index-DNKzDki_.js} +152 -152
  17. package/admin/custom/assets/{index-DsIn9jH_.js → index-NItS-TWp.js} +1 -1
  18. package/admin/{assets/index-hwplVCgv.js → custom/assets/index-sozs10Ij.js} +45 -71
  19. package/admin/custom/assets/{localSharedImportMap-C4qXtGUd.js → localSharedImportMap-BxT0VwTO.js} +1 -1
  20. package/admin/custom/assets/{virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-DFSXB0v2.js → virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-Br3IlnqO.js} +2 -2
  21. package/admin/custom/customComponents.js +1 -1
  22. package/admin/jsonConfig.json +9 -9
  23. package/admin/mf-manifest.json +1 -1
  24. package/admin/remoteEntry.js +1 -1
  25. package/admin/tab.html +2 -2
  26. package/build/lib/aiProviderResolver.js +80 -0
  27. package/build/lib/aiProviderResolver.js.map +1 -0
  28. package/build/lib/anthropicAdapter.js +175 -0
  29. package/build/lib/anthropicAdapter.js.map +1 -0
  30. package/build/lib/sandbox.js +7 -2
  31. package/build/lib/sandbox.js.map +1 -1
  32. package/build/main.js +141 -107
  33. package/build/main.js.map +1 -1
  34. package/build/types.d.ts +1 -0
  35. package/docs/de/README.md +62 -4
  36. package/docs/en/README.md +62 -4
  37. package/io-package.json +68 -1
  38. package/package.json +1 -1
  39. package/admin/assets/AiChatPanel-sgt697A2.js +0 -296
  40. package/admin/assets/AiInlineProvider-Dd7eKxk4.js +0 -7
  41. package/admin/assets/ScriptEditor-CH4qJzqq.js +0 -2
  42. package/admin/assets/ScriptEditorVanillaMonaco-cB_90T0P.js +0 -1
  43. package/admin/custom/assets/index-CVIpIckw.js +0 -960
package/build/types.d.ts CHANGED
@@ -35,6 +35,7 @@ export interface JavaScriptAdapterConfig {
35
35
  sortGlobalScriptsAlphabetically: boolean;
36
36
  gptKey: string;
37
37
  gptBaseUrl: string;
38
+ gptBaseUrlKey: string;
38
39
  claudeKey: string;
39
40
  geminiKey: string;
40
41
  deepseekKey: string;
package/docs/de/README.md CHANGED
@@ -72,18 +72,76 @@ In den Adapter-Einstellungen unter "KI-Einstellungen" befinden sich API-Key-Feld
72
72
  | **Eigene API Base-URL** | Base-URL für eigene Anbieter (z.B. `http://localhost:11434/v1` für Ollama) |
73
73
  | **Eigener API-Schlüssel** | Optionaler API-Key für eigene Anbieter (Ollama benötigt keinen) |
74
74
 
75
- Es müssen nur die Keys der gewünschten Anbieter eingetragen werden. Jeder Anbieter hat einen eigenen **Test**-Button.
75
+ Alle API-Key-Felder werden als Passwortfelder dargestellt (maskiert). Es müssen nur die Keys der gewünschten Anbieter eingetragen werden. Jeder Anbieter hat einen eigenen **Test**-Button.
76
+
77
+ ### Sicherheit der API-Schlüssel
78
+
79
+ Die API-Keys werden durch zwei von der ioBroker-Plattform bereitgestellte Schutzebenen abgesichert:
80
+
81
+ 1. **`encryptedNative`** — Die Keys werden vor dem Schreiben in die Object-Datenbank automatisch mit dem System-Secret verschlüsselt. Datenbank-Dumps oder Object-Backups enthalten die Keys nicht mehr im Klartext.
82
+ 2. **`protectedNative`** — Die Keys werden niemals an Admin-Oberflächen oder fremde Adapter übertragen. Nur die `javascript`-Instanz selbst kann sie über `this.config` lesen (die ioBroker-Runtime liefert sie dort transparent entschlüsselt).
83
+
84
+ Daraus folgt: Das KI-Chat-Panel, die Inline-Completion und alle anderen Frontend-Komponenten **greifen nicht mehr direkt auf die Keys zu**. Stattdessen wird jede KI-Anfrage per `sendTo` an den Adapter geschickt, und das Backend setzt den passenden Key ein:
85
+
86
+ ```
87
+ Frontend Backend (this.config, entschlüsselt)
88
+ ──────── ─────────────────────────────────────
89
+ sendTo('chatCompletion', { → wählt Provider → nimmt gptKey/claudeKey/…
90
+ provider: 'openai', → schickt HTTP-Request an Anbieter
91
+ model: 'gpt-4o', → liefert Antwort zurück
92
+ messages: [...]
93
+ })
94
+ ```
95
+
96
+ Für die Anzeige steht ein eigener `sendTo`-Befehl zur Verfügung:
97
+
98
+ | Befehl | Payload | Antwort |
99
+ |--------|---------|---------|
100
+ | `getAvailableAiProviders` | `{}` | `{ providers: [{ provider: 'openai' }, { provider: 'custom', baseUrl: '…' }, …] }` |
101
+
102
+ Die Antwort teilt dem Frontend nur mit, **welche** Provider konfiguriert sind — der eigentliche Schlüssel ist darin nie enthalten. So lassen sich im Editor die richtigen Provider-Icons anzeigen und das Modell-Dropdown korrekt befüllen, ohne Secrets in den Browser zu laden.
103
+
104
+ **Hinweis zum Upgrade:** Nach dem Upgrade von einer älteren Version bleiben vorhandene (unverschlüsselte) Keys so lange gültig, bis die Adapter-Einstellungen das erste Mal gespeichert werden. Beim Speichern verschlüsselt die Runtime die Werte. Sollte ein Schlüssel nach dem Upgrade leer erscheinen, genügt es, ihn einmal neu einzutragen und zu speichern.
76
105
 
77
106
  ### API-Verbindung testen
78
107
 
79
- Jeder Anbieter hat einen eigenen **Test**-Button neben seinem API-Key-Feld. Der Test:
108
+ Jeder Anbieter hat einen eigenen **Test**-Button neben seinem API-Key-Feld. Es werden zwei Fälle unterschieden:
109
+
110
+ 1. **Test mit Formular-Wert** — Unmittelbar nach dem Eintragen oder Ändern eines Keys im Einstellungsdialog nutzt der `Test`-Button den aktuellen Formularwert (der liegt vor dem Speichern noch lokal im Browser). So kann ein neuer Key vor dem Persistieren geprüft werden.
111
+ 2. **Test mit gespeichertem Schlüssel** — Wird der Test aus Kontexten ohne Formular-Wert aufgerufen (z.B. beim Modell-Abruf im Skript-Editor), löst das Backend den Key über `this.config` anhand des gewählten Providers auf.
112
+
113
+ Der Test:
80
114
  - Verbindet sich mit dem API-Endpunkt des Anbieters
81
115
  - Validiert den API-Schlüssel
82
- - Gibt die Anzahl der verfügbaren Modelle zurück
116
+ - Gibt die Anzahl der verfügbaren Chat-Modelle zurück
117
+
118
+ Die Icons der Test-Buttons sind als Inline-SVG-Data-URIs mit `fill="currentColor"` eingebettet. Dadurch folgt ihre Farbe automatisch dem aktiven Theme (Light/Dark-Mode).
83
119
 
84
120
  ### Dynamisches Laden der Modelle
85
121
 
86
- Beim Öffnen des KI-Codegenerator-Dialogs im Skript-Editor werden die verfügbaren Modelle automatisch vom konfigurierten API-Endpunkt abgerufen. Das Modell-Dropdown wird dynamisch befüllt — es gibt keine fest hinterlegte Modellliste.
122
+ Beim Öffnen des KI-Codegenerator-Dialogs im Skript-Editor werden die verfügbaren Modelle automatisch von jedem konfigurierten Provider abgerufen. Das Modell-Dropdown wird dynamisch befüllt — es gibt keine fest hinterlegte Modellliste.
123
+
124
+ #### Filter für nicht-Chat-Modelle
125
+
126
+ Die Modelllisten, die OpenAI, Anthropic, Gemini, DeepSeek und Custom-Endpunkte (Ollama/LM Studio/OpenRouter) zurückliefern, enthalten viele Modelle, die nicht für Chat-Completion geeignet sind. Der Adapter filtert diese automatisch heraus, sodass im Dropdown nur Modelle erscheinen, die für die ioBroker-Skript-Generierung taugen.
127
+
128
+ Folgende Kategorien werden ausgeschlossen:
129
+
130
+ | Kategorie | Beispiel-Schlüsselwörter |
131
+ |-----------|--------------------------|
132
+ | Embeddings | `embedding`, `text-embedding`, `embeddinggemma`, `bge-`, `nomic-embed`, `mxbai-embed`, `arctic-embed`, `all-minilm`, `voyage-`, `gecko`, `paraphrase-multilingual` |
133
+ | Bild-Generierung / -Bearbeitung | `dall-e`, `gpt-image`, `image-edit`, `-image-preview`, `-image-latest`, `flash-image`, `nano-banana`, `stable-diffusion`, `sdxl`, `midjourney`, `flux-`, `imagen` |
134
+ | Video-Generierung | `sora`, `veo-`, `cogvideo`, `runway-`, `lumiere` |
135
+ | Musik-Generierung | `lyria` |
136
+ | Audio / Sprache / Transkription / Realtime | `whisper`, `tts-`, `-tts`, `speech-`, `audio-preview`, `-transcribe`, `native-audio`, `flash-live`, `gpt-audio`, `realtime`, `bark-`, `xtts`, `voicebox` |
137
+ | Moderation / Safety-Klassifikatoren | `moderation`, `omni-moderation`, `llama-guard`, `shieldgemma`, `prompt-guard`, `-guardian`, `safeguard` |
138
+ | Reranker | `rerank`, `reranker` |
139
+ | Legacy-Completion (OpenAI GPT-3-Ära) | `babbage-`, `davinci-`, `curie-`, `text-davinci`, `instructgpt`, `code-davinci`, `code-cushman`, `-turbo-instruct` |
140
+ | Web-Suche / Browsing-Endpoints | `-search-preview`, `-search-api` |
141
+ | Legacy-Suche / Similarity | `code-search`, `text-search`, `similarity-` |
142
+ | Spezial / Single-Task | `computer-use-preview`, `deep-research`, `robotics`, `aqa`, `reader-lm` (HTML→Markdown), `-nsql` (Text-zu-SQL), `minicheck` (Fact-Check), `claude-1`, `claude-instant` |
143
+
144
+ Der Filter verwendet eine Substring-Prüfung ohne Beachtung der Groß-/Kleinschreibung. Wenn ein Provider künftig eine weitere Nicht-Chat-Familie einführt, lässt sich die Liste in `src-editor/src/AiChat/AiChatService.ts` (`NON_CHAT_KEYWORDS`) erweitern.
87
145
 
88
146
  ### Fehlerbehandlung
89
147
 
package/docs/en/README.md CHANGED
@@ -73,18 +73,76 @@ In the adapter settings under "AI settings", you will find API key fields for ea
73
73
  | **Custom API Base URL** | Base URL for custom providers (e.g. `http://localhost:11434/v1` for Ollama) |
74
74
  | **Custom API key** | Optional API key for custom providers (Ollama doesn't need one) |
75
75
 
76
- Only enter the keys for providers you want to use. Each provider has its own **Test** button.
76
+ All API key fields are rendered as password inputs (masked), and only the keys of providers you actually want to use need to be entered. Each provider has its own **Test** button.
77
+
78
+ ### API Key Security
79
+
80
+ API keys are handled with two layers of protection provided by the ioBroker platform:
81
+
82
+ 1. **`encryptedNative`** — Keys are automatically encrypted using the system secret before being written to the object database. Database dumps or object backups no longer expose the raw keys.
83
+ 2. **`protectedNative`** — Keys are never transmitted to admin web UIs or foreign adapters. Only the `javascript` adapter instance itself can read them via `this.config` (where the ioBroker runtime delivers them transparently decrypted).
84
+
85
+ Because of this, the AI Chat Panel, the inline completion provider, and any other frontend component **no longer access the keys directly**. Instead, they request AI services via a `sendTo` call and let the backend resolve the correct key:
86
+
87
+ ```
88
+ Frontend Backend (this.config, decrypted)
89
+ ──────── ───────────────────────────────
90
+ sendTo('chatCompletion', { → looks up provider → picks gptKey/claudeKey/…
91
+ provider: 'openai', → performs HTTP request to provider
92
+ model: 'gpt-4o', → streams response back
93
+ messages: [...]
94
+ })
95
+ ```
96
+
97
+ A dedicated `sendTo` command is available for discovery:
98
+
99
+ | Command | Payload | Response |
100
+ |---------|---------|----------|
101
+ | `getAvailableAiProviders` | `{}` | `{ providers: [{ provider: 'openai' }, { provider: 'custom', baseUrl: '…' }, …] }` |
102
+
103
+ The response lists only which providers have credentials configured — it never includes the keys themselves. This allows the UI to show the correct provider icons and populate the model dropdown without pulling secrets into the browser.
104
+
105
+ **Upgrade note:** After upgrading from an earlier version, the existing (unencrypted) keys will remain working until the first time you save the adapter settings. When you save, the runtime re-encrypts them. If a key appears blank after the upgrade, re-enter it once in the settings dialog and save.
77
106
 
78
107
  ### Test API Connection
79
108
 
80
- Each provider has a dedicated **Test** button next to its API key field. The test will:
109
+ Each provider has a dedicated **Test** button next to its API key field. Two cases are handled:
110
+
111
+ 1. **Form-value test** — Immediately after entering or editing a key in the settings dialog, the `Test` button uses the current form value (which is still in the browser before saving). This lets you verify a new key before persisting it.
112
+ 2. **Stored-key test** — When the button is invoked from contexts where no form value is available (e.g. the script editor during model discovery), the backend resolves the key from `this.config` based on the selected provider.
113
+
114
+ The test will:
81
115
  - Connect to the provider's API endpoint
82
116
  - Validate the API key
83
- - Return the number of available models
117
+ - Return the number of available chat models
118
+
119
+ The test-button icons are embedded as inline SVG data URIs with `fill="currentColor"`, so their color automatically follows the active theme (light/dark mode).
84
120
 
85
121
  ### Dynamic Model Loading
86
122
 
87
- When opening the AI code generator dialog in the script editor, the available models are automatically fetched from the configured API endpoint. The model dropdown is populated dynamically — no hardcoded model list is used.
123
+ When opening the AI code generator dialog in the script editor, the available models are automatically fetched from each configured provider. The model dropdown is populated dynamically — no hardcoded model list is used.
124
+
125
+ #### Non-chat model filter
126
+
127
+ The provider model lists returned by OpenAI, Anthropic, Gemini, DeepSeek, and custom (Ollama/LM Studio/OpenRouter) endpoints contain many models that cannot be used for chat completion. The adapter filters these automatically so that the dropdown only shows models suitable for ioBroker script generation.
128
+
129
+ The following categories are excluded:
130
+
131
+ | Category | Keyword examples |
132
+ |----------|------------------|
133
+ | Embeddings | `embedding`, `text-embedding`, `embeddinggemma`, `bge-`, `nomic-embed`, `mxbai-embed`, `arctic-embed`, `all-minilm`, `voyage-`, `gecko`, `paraphrase-multilingual` |
134
+ | Image generation / editing | `dall-e`, `gpt-image`, `image-edit`, `-image-preview`, `-image-latest`, `flash-image`, `nano-banana`, `stable-diffusion`, `sdxl`, `midjourney`, `flux-`, `imagen` |
135
+ | Video generation | `sora`, `veo-`, `cogvideo`, `runway-`, `lumiere` |
136
+ | Music generation | `lyria` |
137
+ | Audio / speech / transcribe / realtime | `whisper`, `tts-`, `-tts`, `speech-`, `audio-preview`, `-transcribe`, `native-audio`, `flash-live`, `gpt-audio`, `realtime`, `bark-`, `xtts`, `voicebox` |
138
+ | Moderation / safety | `moderation`, `omni-moderation`, `llama-guard`, `shieldgemma`, `prompt-guard`, `-guardian`, `safeguard` |
139
+ | Rerankers | `rerank`, `reranker` |
140
+ | Legacy completion (OpenAI GPT-3 era) | `babbage-`, `davinci-`, `curie-`, `text-davinci`, `instructgpt`, `code-davinci`, `code-cushman`, `-turbo-instruct` |
141
+ | Web search / browsing endpoints | `-search-preview`, `-search-api` |
142
+ | Legacy search / similarity | `code-search`, `text-search`, `similarity-` |
143
+ | Specialty / single-task | `computer-use-preview`, `deep-research`, `robotics`, `aqa`, `reader-lm` (HTML→Markdown), `-nsql` (text-to-SQL), `minicheck` (fact-check), `claude-1`, `claude-instant` |
144
+
145
+ The filter uses case-insensitive substring matching. If a provider adds a new non-chat model family in the future, the list can be extended in `src-editor/src/AiChat/AiChatService.ts` (see `NON_CHAT_KEYWORDS`).
88
146
 
89
147
  ### Error Handling
90
148
 
package/io-package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "javascript",
4
- "version": "9.2.0",
4
+ "version": "9.2.1",
5
5
  "blockedVersions": [
6
6
  "8.0.0",
7
7
  "8.0.1"
@@ -40,6 +40,19 @@
40
40
  "Matthias Kleine <info@haus-automatisierung.com>"
41
41
  ],
42
42
  "news": {
43
+ "9.2.1": {
44
+ "en": "See previous changelog entries",
45
+ "de": "Siehe frühere Changelog-Einträge",
46
+ "ru": "См. предыдущие Changelog",
47
+ "pt": "Ver entradas anteriores do changelog",
48
+ "nl": "Zie vorige wijzigingenlog items",
49
+ "fr": "Voir les entrées précédentes du journal des modifications",
50
+ "it": "Vedere le precedenti voci di changelog",
51
+ "es": "Ver entradas de cambio anteriores",
52
+ "pl": "Zob. poprzednie wpisy dotyczące zmiennych",
53
+ "uk": "Переглянути попередні записи змін",
54
+ "zh-cn": "参见上一个更改日志条目"
55
+ },
43
56
  "9.2.0": {
44
57
  "en": "AI Chat panel with multi-provider support, tool calling, inline completions, and smart-apply\nFix: prevent duplicate 'Stopping script' log when script is not running\nFix: only restart scripts on the instance that owns them\nAdded OID display mode toggle for Blockly editor: 4 display modes (Name, Name path, State ID, Full ID) with toolbar dropdown, context menu, optional object icons, and translations in 11 languages\nNode 25 compatibility: replaced deprecated rmdirSync with rmSync in build tasks\nAdded support for plain import/export\nCorrecting error in configuration\ndisallow writing into node_modules folder by scripts\nCorrecting start of the script more than one time if restart is triggered\nAll delayed writings are stopped by the script stop\nAdded check if a script has been modified by another user/window\nMake the instance number more prominent",
45
58
  "de": "AI Chat-Panel mit Multi-Provider-Unterstützung, Werkzeuganruf, Inline-Vervollständigungen und intelligent-apply\nFix: verhindern Sie doppeltes 'Stopping script'-Log, wenn Skript nicht läuft\nFix: nur Skripte auf der Instanz neu starten, die sie besitzt\nOID-Anzeigemodus für Blockly Editor hinzugefügt: 4 Anzeigemodi (Name, Name Pfad, State ID, Full ID) mit Symbolleiste Dropdown, Kontextmenü, optionale Objektsymbole und Übersetzungen in 11 Sprachen\nNode 25 Kompatibilität: ersetzt deprecated rmdirSync mit rmSync in Build Aufgaben\nUnterstützung für den einfachen Import/Export\nFehler in der Konfiguration korrigieren\ndeaktivieren sie das schreiben in node modules ordner durch skripte\nKorrektur des Starts des Skripts mehr als ein Mal, wenn der Neustart ausgelöst wird\nAlle verzögerten Schriften werden durch den Skriptstop gestoppt\nCheck hinzugefügt, wenn ein Skript von einem anderen Benutzer/Fenster geändert wurde\nMachen Sie die Instanz Nummer prominenter",
@@ -341,6 +354,45 @@
341
354
  "agree",
342
355
  "cancel"
343
356
  ]
357
+ },
358
+ {
359
+ "condition": {
360
+ "operand": "and",
361
+ "rules": [
362
+ "oldVersion<=9.2.0",
363
+ "newVersion>9.2.0"
364
+ ]
365
+ },
366
+ "title": {
367
+ "en": "AI API keys must be re-entered",
368
+ "de": "AI-API-Schlüssel müssen erneut eingegeben werden",
369
+ "ru": "Ключи AI API необходимо ввести заново",
370
+ "pt": "As chaves da API de IA devem ser reinseridas",
371
+ "nl": "AI API-sleutels moeten opnieuw worden ingevoerd",
372
+ "fr": "Les clés API IA doivent être saisies à nouveau",
373
+ "it": "Le chiavi API AI devono essere reinserite",
374
+ "es": "Las claves de API de IA deben volver a introducirse",
375
+ "pl": "Klucze API AI muszą zostać ponownie wprowadzone",
376
+ "uk": "Ключі AI API необхідно ввести повторно",
377
+ "zh-cn": "AI API 密钥必须重新输入"
378
+ },
379
+ "text": {
380
+ "en": "The AI API keys (OpenAI, Anthropic, Gemini, DeepSeek) are now stored encrypted. If you had previously configured any AI API keys, you must re-enter them in the adapter settings under the \"AI settings\" tab.",
381
+ "de": "Die AI-API-Schlüssel (OpenAI, Anthropic, Gemini, DeepSeek) werden jetzt verschlüsselt gespeichert. Wenn Sie zuvor AI-API-Schlüssel konfiguriert haben, müssen Sie diese in den Adaptereinstellungen unter dem Tab \"AI-Einstellungen\" erneut eingeben.",
382
+ "ru": "Ключи AI API (OpenAI, Anthropic, Gemini, DeepSeek) теперь хранятся в зашифрованном виде. Если вы ранее настроили ключи AI API, вам необходимо повторно ввести их в настройках адаптера на вкладке \"Настройки AI\".",
383
+ "pt": "As chaves da API de IA (OpenAI, Anthropic, Gemini, DeepSeek) agora são armazenadas criptografadas. Se você configurou anteriormente chaves de API de IA, deve reinseri-las nas configurações do adaptador na aba \"Configurações de IA\".",
384
+ "nl": "De AI API-sleutels (OpenAI, Anthropic, Gemini, DeepSeek) worden nu versleuteld opgeslagen. Als u eerder AI API-sleutels heeft geconfigureerd, moet u deze opnieuw invoeren in de adapterinstellingen onder het tabblad \"AI-instellingen\".",
385
+ "fr": "Les clés API IA (OpenAI, Anthropic, Gemini, DeepSeek) sont désormais stockées de manière chiffrée. Si vous aviez précédemment configuré des clés API IA, vous devez les saisir à nouveau dans les paramètres de l'adaptateur sous l'onglet \"Paramètres IA\".",
386
+ "it": "Le chiavi API AI (OpenAI, Anthropic, Gemini, DeepSeek) sono ora memorizzate in modo crittografato. Se in precedenza erano state configurate chiavi API AI, è necessario reinserirle nelle impostazioni dell'adattatore nella scheda \"Impostazioni AI\".",
387
+ "es": "Las claves de API de IA (OpenAI, Anthropic, Gemini, DeepSeek) ahora se almacenan cifradas. Si previamente había configurado claves de API de IA, debe volver a introducirlas en la configuración del adaptador en la pestaña \"Configuración de IA\".",
388
+ "pl": "Klucze API AI (OpenAI, Anthropic, Gemini, DeepSeek) są teraz przechowywane w formie zaszyfrowanej. Jeśli wcześniej skonfigurowano klucze API AI, należy je ponownie wprowadzić w ustawieniach adaptera w zakładce \"Ustawienia AI\".",
389
+ "uk": "Ключі AI API (OpenAI, Anthropic, Gemini, DeepSeek) тепер зберігаються у зашифрованому вигляді. Якщо ви раніше налаштували ключі AI API, вам необхідно повторно ввести їх у налаштуваннях адаптера на вкладці \"Налаштування AI\".",
390
+ "zh-cn": "AI API 密钥(OpenAI、Anthropic、Gemini、DeepSeek)现在以加密方式存储。如果您之前配置了 AI API 密钥,则必须在适配器设置的\"AI 设置\"选项卡中重新输入。"
391
+ },
392
+ "level": "warn",
393
+ "buttons": [
394
+ "ok"
395
+ ]
344
396
  }
345
397
  ]
346
398
  },
@@ -467,10 +519,25 @@
467
519
  "maxTriggersPerScript": 100,
468
520
  "gptKey": "",
469
521
  "gptBaseUrl": "",
522
+ "gptBaseUrlKey": "",
470
523
  "claudeKey": "",
471
524
  "geminiKey": "",
472
525
  "deepseekKey": ""
473
526
  },
527
+ "encryptedNative": [
528
+ "gptKey",
529
+ "claudeKey",
530
+ "geminiKey",
531
+ "deepseekKey",
532
+ "gptBaseUrlKey"
533
+ ],
534
+ "protectedNative": [
535
+ "gptKey",
536
+ "claudeKey",
537
+ "geminiKey",
538
+ "deepseekKey",
539
+ "gptBaseUrlKey"
540
+ ],
474
541
  "objects": [
475
542
  {
476
543
  "_id": "_design/script",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.javascript",
3
- "version": "9.2.0",
3
+ "version": "9.2.1",
4
4
  "description": "Rules Engine for ioBroker",
5
5
  "author": "bluefox <dogafox@gmail.com>",
6
6
  "contributors": [