iobroker.javascript 9.1.1 → 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.
- package/README.md +32 -16
- package/admin/assets/AiChatPanel-Cc1KscBJ.js +315 -0
- package/admin/assets/AiDatapointProvider-B0i3I5Fm.js +2 -0
- package/admin/assets/AiDiffView-RPozjjHf.js +1 -0
- package/admin/assets/AiInlineProvider-DkgjVSFQ.js +7 -0
- package/admin/assets/{Save-Cld9qv9i.js → Save-CkuNSiWL.js} +1 -1
- package/admin/assets/ScriptEditor-6qrtvwPL.js +2 -0
- package/admin/assets/ScriptEditorVanillaMonaco-bJua4sm1.js +3 -0
- package/admin/assets/applyCodeEdit-BdRnbz2g.js +1 -0
- package/admin/assets/{createSvgIcon-DPvF8xqu.js → createSvgIcon-DYs_tNrE.js} +1 -1
- package/admin/assets/docs-compact-CKNGiYh2.js +336 -0
- package/admin/assets/{index-BVPl8hv0.js → index-BZxCaQhO.js} +5 -5
- package/admin/assets/index-CYbVtccs.js +1267 -0
- package/admin/assets/index-CexrwGGC.js +986 -0
- package/admin/assets/{index-DFZipply.js → index-DsW7vBcg.js} +1 -1
- package/admin/assets/index-SHs7_wDh.js +1 -0
- package/admin/assets/{index-DlDUIfpA.js → index-dN73sbyQ.js} +1 -1
- package/admin/assets/index-wHNMOf-c.js +5 -0
- package/admin/assets/inheritsLoose-CIXm_zPk.js +29 -0
- package/admin/assets/inlineChatWidget-Cu6rb4Ar.js +2 -0
- package/admin/assets/inlineDiffController-DBLpPOe2.js +16 -0
- package/admin/assets/{iobroker_javascript__loadShare___mf_0_mui_mf_1_material__loadShare__.mjs-QWG5Arqe.js → iobroker_javascript__loadShare___mf_0_mui_mf_1_material__loadShare__.mjs-CV1_X-Lf.js} +1 -1
- package/admin/assets/{localSharedImportMap-xmSu9Qkg.js → localSharedImportMap-BCwqnmn4.js} +1 -1
- package/admin/assets/stateHoverProvider-CGChzV5W.js +3 -0
- package/admin/assets/useTheme-DuTJsNQ-.js +1 -0
- package/admin/assets/{virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-D-eF6r8M.js → virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-DNrEsMrg.js} +2 -2
- package/admin/custom/assets/{Components-B8x6wOMD.js → Components-B9ZyjeRI.js} +1 -1
- package/admin/custom/assets/{index-N2n19KrF.js → index-DNKzDki_.js} +152 -152
- package/admin/custom/assets/{index-DbXK0odl.js → index-NItS-TWp.js} +1 -1
- package/admin/custom/assets/index-sozs10Ij.js +960 -0
- package/admin/custom/assets/{localSharedImportMap-2Enh8EZe.js → localSharedImportMap-BxT0VwTO.js} +1 -1
- package/admin/custom/assets/{virtualExposes-CqrW7o8v.js → virtualExposes-jSvr-kK3.js} +1 -1
- package/admin/custom/assets/{virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-BZZsMeVW.js → virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-Br3IlnqO.js} +2 -2
- package/admin/custom/customComponents.js +1 -1
- package/admin/google-blockly/own/blocks_words.js +7 -0
- package/admin/google-blockly/own/field_oid.js +311 -37
- package/admin/i18n/de.json +8 -0
- package/admin/i18n/en.json +8 -0
- package/admin/i18n/es.json +8 -0
- package/admin/i18n/flat.txt +427 -0
- package/admin/i18n/fr.json +8 -0
- package/admin/i18n/it.json +8 -0
- package/admin/i18n/nl.json +8 -0
- package/admin/i18n/pl.json +8 -0
- package/admin/i18n/pt.json +8 -0
- package/admin/i18n/ru.json +8 -0
- package/admin/i18n/uk.json +8 -0
- package/admin/i18n/zh-cn.json +8 -0
- package/admin/img/anthropic.svg +1 -0
- package/admin/img/custom.svg +1 -0
- package/admin/img/deepseek.svg +1 -0
- package/admin/img/gemini.svg +1 -0
- package/admin/img/openai.svg +1 -0
- package/admin/jsonConfig.json +80 -18
- package/admin/mf-manifest.json +1 -1
- package/admin/remoteEntry.js +1 -1
- package/admin/tab.html +6 -6
- package/build/lib/aiProviderResolver.js +80 -0
- package/build/lib/aiProviderResolver.js.map +1 -0
- package/build/lib/anthropicAdapter.js +175 -0
- package/build/lib/anthropicAdapter.js.map +1 -0
- package/build/lib/debugger.js +2 -2
- package/build/lib/debugger.js.map +1 -1
- package/build/lib/inspect.js.map +1 -1
- package/build/lib/nodeModulesManagement.js +2 -2
- package/build/lib/nodeModulesManagement.js.map +1 -1
- package/build/lib/protectFs.js +5 -0
- package/build/lib/protectFs.js.map +1 -1
- package/build/lib/sandbox.js +9 -4
- package/build/lib/sandbox.js.map +1 -1
- package/build/main.js +190 -101
- package/build/main.js.map +1 -1
- package/build/types.d.ts +3 -0
- package/docs/de/README.md +81 -10
- package/docs/de/blockly.md +34 -0
- package/docs/en/README.md +81 -10
- package/docs/en/blockly.md +34 -0
- package/install/installTypings.js +1 -1
- package/io-package.json +82 -54
- package/package.json +7 -6
- package/admin/assets/OpenAiDialog-rhLuRLIM.js +0 -13
- package/admin/assets/ScriptEditor-C-fO5h68.js +0 -2
- package/admin/assets/ScriptEditorVanillaMonaco-DSYvOslZ.js +0 -1
- package/admin/assets/docs-BrInh2Pn.js +0 -2036
- package/admin/assets/index-C49cpVll.js +0 -5
- package/admin/assets/index-XSrHkgLE.js +0 -1230
- package/admin/assets/index-gIA8x-8f.js +0 -1
- package/admin/assets/index-q6iFaoFb.js +0 -986
- package/admin/assets/inheritsLoose-B0Ba5G9z.js +0 -29
- package/admin/assets/useTheme-hy6f3gra.js +0 -1
- package/admin/custom/assets/index-CYc31Gwg.js +0 -960
package/build/types.d.ts
CHANGED
|
@@ -32,8 +32,10 @@ export interface JavaScriptAdapterConfig {
|
|
|
32
32
|
createAstroStates: boolean;
|
|
33
33
|
maxSetStatePerMinute: number;
|
|
34
34
|
maxTriggersPerScript: number;
|
|
35
|
+
sortGlobalScriptsAlphabetically: boolean;
|
|
35
36
|
gptKey: string;
|
|
36
37
|
gptBaseUrl: string;
|
|
38
|
+
gptBaseUrlKey: string;
|
|
37
39
|
claudeKey: string;
|
|
38
40
|
geminiKey: string;
|
|
39
41
|
deepseekKey: string;
|
|
@@ -61,6 +63,7 @@ export type JavascriptTimer = {
|
|
|
61
63
|
delay: number;
|
|
62
64
|
val: ioBroker.StateValue;
|
|
63
65
|
ack?: boolean;
|
|
66
|
+
scriptName: string;
|
|
64
67
|
};
|
|
65
68
|
|
|
66
69
|
export type ScriptType = 'TypeScript/ts' | 'Blockly' | 'Rules' | 'Javascript/js';
|
package/docs/de/README.md
CHANGED
|
@@ -45,32 +45,103 @@ DeepSeek bietet hervorragende Code-Generierung zu sehr niedrigen Kosten (~0,001
|
|
|
45
45
|
|
|
46
46
|
#### Lokale Modelle (Ollama / LM Studio)
|
|
47
47
|
|
|
48
|
-
Lokale Modelle laufen auf eigener Hardware ohne Internet.
|
|
48
|
+
Lokale Modelle laufen auf eigener Hardware ohne Internet.
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
**Mindestanforderung: 14B-Parameter-Modelle** (z.B. `qwen2.5-coder:14b`). Kleinere Modelle (7B/9B) erzeugen unzuverlässigen Code mit falschen API-Aufrufen. Eine GPU mit mindestens 12GB VRAM (z.B. RTX 3060) wird für 14B-Modelle empfohlen.
|
|
51
|
+
|
|
52
|
+
Getestete und empfohlene Modelle:
|
|
53
|
+
- `qwen2.5-coder:14b` - Gute Codequalität, läuft auf 12GB VRAM
|
|
54
|
+
- `qwen2.5-coder:32b` - Bessere Qualität, erfordert 24GB+ VRAM
|
|
55
|
+
|
|
56
|
+
Einrichtung:
|
|
57
|
+
- **Ollama**: **Base-URL** auf `http://localhost:11434/v1` setzen, API-Key leer lassen
|
|
58
|
+
- **LM Studio**: **Base-URL** auf `http://localhost:1234/v1` setzen, API-Key leer lassen
|
|
52
59
|
|
|
53
60
|
**Hinweis:** Die kostenlose Version der OpenAI-API (ChatGPT) bietet keinen API-Zugang mehr für Code-Generierung. Google Gemini (kostenlos) oder DeepSeek (sehr günstig) sind empfohlene Alternativen.
|
|
54
61
|
|
|
55
62
|
### Konfiguration
|
|
56
63
|
|
|
57
|
-
In den Adapter-Einstellungen unter "
|
|
64
|
+
In den Adapter-Einstellungen unter "KI-Einstellungen" befinden sich API-Key-Felder für jeden Anbieter:
|
|
58
65
|
|
|
59
66
|
| Einstellung | Beschreibung |
|
|
60
67
|
|-------------|-------------|
|
|
61
|
-
| **ChatGPT API-Schlüssel** |
|
|
62
|
-
| **
|
|
68
|
+
| **ChatGPT API-Schlüssel** | API-Key für OpenAI (platform.openai.com) |
|
|
69
|
+
| **Anthropic API-Schlüssel** | API-Key für Claude (console.anthropic.com) |
|
|
70
|
+
| **Gemini API-Schlüssel** | API-Key für Google Gemini (aistudio.google.com) |
|
|
71
|
+
| **DeepSeek API-Schlüssel** | API-Key für DeepSeek (platform.deepseek.com) |
|
|
72
|
+
| **Eigene API Base-URL** | Base-URL für eigene Anbieter (z.B. `http://localhost:11434/v1` für Ollama) |
|
|
73
|
+
| **Eigener API-Schlüssel** | Optionaler API-Key für eigene Anbieter (Ollama benötigt keinen) |
|
|
74
|
+
|
|
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.
|
|
63
105
|
|
|
64
106
|
### API-Verbindung testen
|
|
65
107
|
|
|
66
|
-
|
|
67
|
-
|
|
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:
|
|
114
|
+
- Verbindet sich mit dem API-Endpunkt des Anbieters
|
|
68
115
|
- Validiert den API-Schlüssel
|
|
69
|
-
- 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).
|
|
70
119
|
|
|
71
120
|
### Dynamisches Laden der Modelle
|
|
72
121
|
|
|
73
|
-
Beim Öffnen des KI-Codegenerator-Dialogs im Skript-Editor werden die verfügbaren Modelle automatisch
|
|
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.
|
|
74
145
|
|
|
75
146
|
### Fehlerbehandlung
|
|
76
147
|
|
package/docs/de/blockly.md
CHANGED
|
@@ -2346,3 +2346,37 @@ Inside these blocks variable "value" yet exist, but anyway to read their values
|
|
|
2346
2346
|
### Create custom function with return value
|
|
2347
2347
|
|
|
2348
2348
|
### Call function
|
|
2349
|
+
|
|
2350
|
+
## AI Chat für Blockly
|
|
2351
|
+
|
|
2352
|
+
Das AI-Chat-Panel ist jetzt auch für Blockly-Scripts verfügbar. Klicke auf den AI-Button (Zauberstab-Symbol) in der Toolbar, um das Chat-Panel neben dem Blockly-Editor zu öffnen.
|
|
2353
|
+
|
|
2354
|
+
### Funktionen
|
|
2355
|
+
|
|
2356
|
+
- **Chat-Modus**: Stelle Fragen zu deinem Blockly-Script. Die KI sieht den generierten JavaScript-Code als Kontext.
|
|
2357
|
+
- **Code-Modus**: Beschreibe eine Automatisierungsaufgabe und die KI generiert Blockly-XML-Blöcke in einem Zwei-Schritt-Prozess (Plan, dann Blöcke).
|
|
2358
|
+
- **Visuelle Vorschau**: KI-generierte Blöcke werden als grafische Blockly-Vorschau direkt im Chat dargestellt statt als rohes XML.
|
|
2359
|
+
- **Blöcke einfügen**: Klicke auf "Blöcke einfügen", um die KI-generierten Blöcke in deinen Blockly-Workspace einzufügen.
|
|
2360
|
+
- **Diff-Ansicht**: Klicke auf "Als Diff anzeigen" für einen Side-by-Side-Vergleich deiner aktuellen Blöcke mit den KI-vorgeschlagenen Blöcken, mit Akzeptieren/Ablehnen-Buttons.
|
|
2361
|
+
|
|
2362
|
+
### Unterstützte Block-Typen
|
|
2363
|
+
|
|
2364
|
+
Die KI kann folgende ioBroker-Blockly-Blocktypen generieren:
|
|
2365
|
+
|
|
2366
|
+
- **on_ext** – Trigger (auf Zustandsänderungen reagieren)
|
|
2367
|
+
- **schedule** – Cron-basierte Zeitpläne
|
|
2368
|
+
- **control** – Zustand setzen (setState)
|
|
2369
|
+
- **get_value** – Zustandswert lesen (getState)
|
|
2370
|
+
- **debug** – Log-Ausgabe
|
|
2371
|
+
- **sendto_custom** – Nachrichten senden (z.B. Telegram)
|
|
2372
|
+
- **timeouts_settimeout** – Verzögerte Aktionen
|
|
2373
|
+
- **controls_if** – Wenn/Dann-Bedingungen
|
|
2374
|
+
- **logic_compare** – Vergleiche (EQ, NEQ, LT, GT, etc.)
|
|
2375
|
+
- **math_number**, **text**, **logic_boolean** – Wert-Blöcke
|
|
2376
|
+
|
|
2377
|
+
### Tipps
|
|
2378
|
+
|
|
2379
|
+
- Verwende den **Code-Modus** zum Generieren neuer Blöcke aus einer Aufgabenbeschreibung.
|
|
2380
|
+
- Verwende den **Chat-Modus** (oder Agent-Modus) für Fragen zu bestehenden Blöcken.
|
|
2381
|
+
- Die KI funktioniert am besten, wenn du deine Automatisierung in einfacher Sprache beschreibst, z.B. "Schalte das Wohnzimmerlicht ein, wenn der Bewegungssensor auslöst".
|
|
2382
|
+
- Du kannst `@geräte` verwenden, um deine Smart-Home-Geräte in den Kontext einzubeziehen.
|
package/docs/en/README.md
CHANGED
|
@@ -46,32 +46,103 @@ DeepSeek offers excellent code generation at very low cost (~$0.001 per request)
|
|
|
46
46
|
|
|
47
47
|
#### Local models (Ollama / LM Studio)
|
|
48
48
|
|
|
49
|
-
Local models run on your own hardware without internet.
|
|
49
|
+
Local models run on your own hardware without internet.
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
**Minimum requirement: 14B parameter models** (e.g. `qwen2.5-coder:14b`). Smaller models (7B/9B) produce unreliable code with incorrect API calls. A GPU with at least 12GB VRAM (e.g. RTX 3060) is recommended for 14B models.
|
|
52
|
+
|
|
53
|
+
Tested and recommended models:
|
|
54
|
+
- `qwen2.5-coder:14b` - Good code quality, runs on 12GB VRAM
|
|
55
|
+
- `qwen2.5-coder:32b` - Better quality, requires 24GB+ VRAM
|
|
56
|
+
|
|
57
|
+
Setup:
|
|
58
|
+
- **Ollama**: Set **Base URL** to `http://localhost:11434/v1`, leave API key empty
|
|
59
|
+
- **LM Studio**: Set **Base URL** to `http://localhost:1234/v1`, leave API key empty
|
|
53
60
|
|
|
54
61
|
**Note:** The free tier of the OpenAI API (ChatGPT) no longer provides API access for code generation. Consider using Google Gemini (free) or DeepSeek (very affordable) as alternatives.
|
|
55
62
|
|
|
56
63
|
### Configuration
|
|
57
64
|
|
|
58
|
-
In the adapter settings under "
|
|
65
|
+
In the adapter settings under "AI settings", you will find API key fields for each provider:
|
|
59
66
|
|
|
60
67
|
| Setting | Description |
|
|
61
68
|
|---------|-------------|
|
|
62
|
-
| **ChatGPT API key** |
|
|
63
|
-
| **
|
|
69
|
+
| **ChatGPT API key** | API key for OpenAI (platform.openai.com) |
|
|
70
|
+
| **Anthropic API key** | API key for Claude (console.anthropic.com) |
|
|
71
|
+
| **Gemini API key** | API key for Google Gemini (aistudio.google.com) |
|
|
72
|
+
| **DeepSeek API key** | API key for DeepSeek (platform.deepseek.com) |
|
|
73
|
+
| **Custom API Base URL** | Base URL for custom providers (e.g. `http://localhost:11434/v1` for Ollama) |
|
|
74
|
+
| **Custom API key** | Optional API key for custom providers (Ollama doesn't need one) |
|
|
75
|
+
|
|
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.
|
|
64
106
|
|
|
65
107
|
### Test API Connection
|
|
66
108
|
|
|
67
|
-
|
|
68
|
-
|
|
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:
|
|
115
|
+
- Connect to the provider's API endpoint
|
|
69
116
|
- Validate the API key
|
|
70
|
-
- 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).
|
|
71
120
|
|
|
72
121
|
### Dynamic Model Loading
|
|
73
122
|
|
|
74
|
-
When opening the AI code generator dialog in the script editor, the available models are automatically fetched from
|
|
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`).
|
|
75
146
|
|
|
76
147
|
### Error Handling
|
|
77
148
|
|
package/docs/en/blockly.md
CHANGED
|
@@ -2752,3 +2752,37 @@ For every created function in the menu appears additional block with the name of
|
|
|
2752
2752
|
|
|
2753
2753
|
You can use it like normal blocks in you scripts.
|
|
2754
2754
|
|
|
2755
|
+
## AI Chat for Blockly
|
|
2756
|
+
|
|
2757
|
+
The AI Chat panel is now available for Blockly scripts. Click the AI button (magic wand icon) in the toolbar to open the chat panel alongside the Blockly editor.
|
|
2758
|
+
|
|
2759
|
+
### Features
|
|
2760
|
+
|
|
2761
|
+
- **Chat mode**: Ask questions about your Blockly script. The AI sees the generated JavaScript code as context.
|
|
2762
|
+
- **Code mode**: Describe an automation task and the AI generates Blockly XML blocks in a two-step process (plan, then blocks).
|
|
2763
|
+
- **Visual preview**: AI-generated blocks are rendered as a visual Blockly preview directly in the chat instead of showing raw XML.
|
|
2764
|
+
- **Insert blocks**: Click "Insert blocks" to append the AI-generated blocks into your Blockly workspace.
|
|
2765
|
+
- **Diff view**: Click "Show as diff" to see a side-by-side comparison of your current blocks vs. the AI-suggested blocks, with Accept/Reject buttons.
|
|
2766
|
+
|
|
2767
|
+
### Supported Block Types
|
|
2768
|
+
|
|
2769
|
+
The AI can generate the following ioBroker Blockly block types:
|
|
2770
|
+
|
|
2771
|
+
- **on_ext** – Trigger (react to state changes)
|
|
2772
|
+
- **schedule** – Cron-based schedules
|
|
2773
|
+
- **control** – Set state (setState)
|
|
2774
|
+
- **get_value** – Get state value (getState)
|
|
2775
|
+
- **debug** – Log output
|
|
2776
|
+
- **sendto_custom** – Send messages (e.g. Telegram)
|
|
2777
|
+
- **timeouts_settimeout** – Delayed actions
|
|
2778
|
+
- **controls_if** – If/else conditions
|
|
2779
|
+
- **logic_compare** – Comparisons (EQ, NEQ, LT, GT, etc.)
|
|
2780
|
+
- **math_number**, **text**, **logic_boolean** – Value blocks
|
|
2781
|
+
|
|
2782
|
+
### Tips
|
|
2783
|
+
|
|
2784
|
+
- Use **Code mode** for generating new blocks from a task description.
|
|
2785
|
+
- Use **Chat mode** (or Agent mode) for asking questions about existing blocks.
|
|
2786
|
+
- The AI works best when you describe your automation in plain language, e.g. "Turn on the living room light when the motion sensor triggers".
|
|
2787
|
+
- You can use `@devices` to include your smart home devices in the context.
|
|
2788
|
+
|
|
@@ -53,7 +53,7 @@ function npmCommand(command, npmArgs, options) {
|
|
|
53
53
|
if (npmArgs == null) npmArgs = [];
|
|
54
54
|
|
|
55
55
|
const npmBinary = /^win/.test(process.platform) ? 'npm.cmd' : 'npm';
|
|
56
|
-
/** @type {import("child_process").SpawnOptions} */
|
|
56
|
+
/** @type {import("node:child_process").SpawnOptions} */
|
|
57
57
|
const spawnOptions = {
|
|
58
58
|
stdio: [options.stdin || process.stdin, options.stdout || process.stdout, options.stderr || process.stderr],
|
|
59
59
|
// @ts-ignore This option exists starting with NodeJS 8
|
package/io-package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "javascript",
|
|
4
|
-
"version": "9.
|
|
4
|
+
"version": "9.2.1",
|
|
5
5
|
"blockedVersions": [
|
|
6
6
|
"8.0.0",
|
|
7
7
|
"8.0.1"
|
|
@@ -40,6 +40,32 @@
|
|
|
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
|
+
},
|
|
56
|
+
"9.2.0": {
|
|
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",
|
|
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",
|
|
59
|
+
"ru": "Панель AI Chat с поддержкой нескольких провайдеров, вызовом инструментов, встроенными завершениями и интеллектуальным приложением\nИсправление: предотвращение дублирования журнала «Stopping script», когда сценарий не работает\nИсправление: перезагружайте сценарии только на том экземпляре, которым они принадлежат\nДобавлено переключение режима отображения OID для редактора Blockly: 4 режима отображения (имя, путь имени, идентификатор состояния, полный идентификатор) с выпадением панели инструментов, контекстным меню, дополнительными значками объектов и переводами на 11 языков\nСовместимость Node 25: замена устаревшего rmdirSync на rmSync в задачах сборки\nДобавлена поддержка простого импорта/экспорта\nИсправление ошибок в конфигурации\nзапретить запись в папку node modules по скриптам\nКорректировка начала сценария более одного раза при запуске перезапуска\nВсе задержки в написании остановлены остановкой сценария\nДобавлена проверка, был ли скрипт изменен другим пользователем/окном\nСделайте число экземпляров более заметным",
|
|
60
|
+
"pt": "Painel de bate-papo IA com suporte multifornecedor, chamada de ferramentas, completações em linha e aplicação inteligente\nCorrigir: evitar o registo duplicado do 'Script de paragem' quando o programa não estiver em execução\nCorrigir: apenas reiniciar scripts na instância que os possui\nAdicionado modo de exibição OID para o editor Blockly: 4 modos de exibição (nome, localização do nome, ID de estado, ID completo) com dropdown da barra de ferramentas, menu de contexto, ícones de objetos opcionais e traduções em 11 idiomas\nCompatibilidade node 25: substituiu rmdirSync desactualizado com rmSync em tarefas de compilação\nAdicionado apoio à importação/exportação simples\nCorrigindo erro na configuração\nnão permitir a escrita na pasta nó módulo por scripts\nCorrigindo o início do script mais de uma vez se o reinício for acionado\nTodos os escritos atrasados são parados pelo script stop\nAdicionado verificar se um script foi modificado por outro usuário/janela\nTornar o número da instância mais proeminente",
|
|
61
|
+
"nl": "AI Chat paneel met multi-provider ondersteuning, tool calling, inline voltooiingen, en slimme toepassing\nFix: voorkomt dupliceren 'Stopping script' log wanneer script niet draait\nFix: herstart alleen scripts op de instantie die ze bezit\nOID-displaymodus toegevoegd aan de Blockly-editor: 4 weergavemodi (Naam, Naam pad, Staat ID, Volledige ID) met werkbalk dropdown, contextmenu, optionele objectpictogrammen, en vertalingen in 11 talen\nNode 25 compatibiliteit: vervangen van verouderde rmdirSync met rmSync in bouwtaken\nToegevoegde steun voor gewone import/export\nFout in configuratie corrigeren\nschrijven in node modules map door scripts niet toestaan\nCorrigeren van de start van het script meer dan één keer als herstart wordt gestart\nAlle vertraagde geschriften worden gestopt door het script stop\nToegevoegd controleren of een script is gewijzigd door een andere gebruiker/venster\nMaak het instantienummer prominenter",
|
|
62
|
+
"fr": "Panneau de discussion AI avec support multi-fournisseurs, appels d'outils, finitions en ligne, et application intelligente\nCorrection: empêcher le log 'Stopping script' lorsque le script ne fonctionne pas\nCorrection : redémarrer uniquement les scripts sur l'instance qui les possède\nAjout du mode d'affichage OID pour l'éditeur Blockly : 4 modes d'affichage (nom, chemin de nom, identifiant d'État, identifiant complet) avec la barre d'outils déroulante, le menu contextuel, les icônes d'objets optionnels et les traductions en 11 langues\nCompatibilité Node 25: remplacé rmdirSync déprécié par rmSync dans les tâches de construction\nAjout d'un soutien pour les importations/exportations simples\nCorrection d'une erreur de configuration\ninterdire l'écriture dans le dossier node modules par scripts\nCorrection du début du script plus d'une fois si le redémarrage est déclenché\nToutes les écritures retardées sont arrêtées par le script stop\nVérifiez si un script a été modifié par un autre utilisateur/fenêtre\nRendre le numéro d'instance plus visible",
|
|
63
|
+
"it": "Pannello di chat AI con supporto multiprovider, chiamata degli strumenti, completamento in linea e applicazione intelligente\nFix: impedire il registro duplicato 'Stopping script' quando lo script non è in esecuzione\nFix: riavviare solo gli script sull'istanza che li possiede\nAggiunta la modalità di visualizzazione OID per l'editor Blockly: 4 modalità di visualizzazione (nome, percorso del nome, ID di stato, ID completo) con menu della barra degli strumenti, menu di contesto, icone degli oggetti opzionali e traduzioni in 11 lingue\nCompatibilità nodo 25: sostituito rmdirSync deprecato con rmSync in attività di costruzione\nAggiunto supporto per l'importazione/esportazione normale\nCorreggere l'errore nella configurazione\ndisallow la scrittura nella cartella node modules da script\nCorreggere l'inizio dello script più di una volta se il riavvio viene attivato\nTutti gli scritti ritardati sono fermati dalla fermata dello script\nAggiunto verificare se uno script è stato modificato da un altro utente/finestra\nRendere il numero di istanza più prominente",
|
|
64
|
+
"es": "Panel de chat AI con soporte multiprovidente, llamada de herramientas, finalizaciones en línea y aplicación inteligente\nFijación: previene el registro duplicado de 'Stopping script' cuando el script no se ejecuta\nFijar: sólo reiniciar scripts en el caso que los posee\nModo de visualización OID añadido para editor Bloquely: 4 modos de visualización (Nombre, Camino de Nombre, ID de Estado, ID completo) con barra de herramientas desplegable, menú contextual, iconos de objetos opcionales, y traducciones en 11 idiomas\nNodo 25 compatibilidad: reemplazado rmdirSync deprecated con rmSync en tareas de construcción\nApoyo añadido a la importación/exportación simples\nError de corrección en la configuración\nnode modules carpeta por scripts\nComienzo correcto del script más de una vez si se activa el reinicio\nTodos los escritos retrasados se detienen por la parada del script\nVerificación agregada si un script ha sido modificado por otro usuario/ventana\nHacer el número de instancia más prominente",
|
|
65
|
+
"pl": "Panel AI Chat z obsługą wielu dostawców, wywołaniem narzędzi, zakończeniami inline i smart- aplikacji\nFix: zapobiec duplikatowi 'Stopling script' log, gdy skrypt nie jest uruchomiony\nFix: restart skryptów tylko na instancji, która jest ich właścicielem\nDodano tryb wyświetlania OID dla edytora Blockly: 4 tryby wyświetlania (nazwa, ścieżka nazw, identyfikator państwa, pełny ID) z rozwijanym paskiem narzędzi, menu kontekstowe, opcjonalne ikony obiektów i tłumaczenia w 11 językach\nKompatybilność węzła 25: zastąpiono przestarzały rmdirSync rmSync w zadaniach budowlanych\nDodano wsparcie dla zwykłego importu / eksportu\nKorekta błędu w konfiguracji\nwyłączenie zapisu do folderu node _ modules przez skrypty\nKorekta początku skryptu więcej niż jeden raz, jeśli zostanie uruchomiony restart\nWszystkie opóźnione pisma są zatrzymane przez skrypt stop\nDodano sprawdzenie, czy skrypt został zmodyfikowany przez innego użytkownika / okno\nUwydatnić numer instancji",
|
|
66
|
+
"uk": "AI чат панелі з багатопрофільною підтримкою, викликом інструментів, вбудованими завершеннями та смарт-додатком\nВиправлення: запобігання дублікатів журналу \"Стопування\", коли скрипт не працює\nВиправлення: тільки перезавантажити скрипти на екземплярі, які володіють ними\nДодано OID відображення режиму для Blockly Editor: 4 режими відображення (Ім'я, шлях імен, державний ідентифікатор, повний ідентифікатор) з випаданням панелі інструментів, контекстне меню, додаткові іконки об'єкта та переклади на 11 мовах\nNode 25 сумісність: заміщена депресована rmdirSync з rmSync в задачах збирання\nДодано підтримку простого імпорту/експорту\nВиправлення помилки в конфігурації\ndisallow написання в папку node modules за скриптами\nВиправлення запуску скрипта більше одного разу, якщо запускається перезапуск\nВсі затримані письмові записи зупиняються на скрипті зупинки\nДодано перевірку, якщо скрипт був модифікований іншим користувачем/window\nЗробіть номер екземпляра більш видатним",
|
|
67
|
+
"zh-cn": "AI Chat 面板,包含多提供者支持,工具调用,内置完成,以及智能应用\n修正: 当脚本未运行时, 防止复制“ 停止脚本” 日志\n修补: 只重新启动拥有脚本的实例\n为 Blockly 编辑器添加了 OID 显示模式切换: 4 个显示模式( Name, Name, Name path, State ID, Full ID) 工具栏下拉, 上下文菜单, 可选对象图标, 以及 11 种语言的翻译\n节点 25 兼容性: 在构建任务中用 rmSync 替换已贬值的 rmdirSync\n添加对纯导入/导出的支持\n正在更正配置错误\n不允许按脚本写入节点模块文件夹\n如果重新启动, 更正脚本的起始时间不止一次\n脚本停止了所有延迟的写作\n添加检查一个脚本是否已被另一个用户/窗口修改\n让实例数字更加突出"
|
|
68
|
+
},
|
|
43
69
|
"9.1.1": {
|
|
44
70
|
"en": "Small GUI optimizations\nAdded support for custom OpenAI-compatible API endpoints (e.g. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nAdded configurable base URL in adapter settings\nModels are now fetched dynamically from the configured API endpoint\nAdded the \"Test API connection\" button in adapter settings\nAdded error handling with user-friendly messages for unreachable providers\nAdded retry functionality for failed model loading\nAll API calls (models + chat) are proxied server-side to avoid CORS issues with local providers\nStrip LLM thinking artifacts from responses (for local models like Ollama)",
|
|
45
71
|
"de": "Kleine GUI Optimierungen\nUnterstützung für benutzerdefinierte OpenAI-kompatible API-Endpunkte (z.B. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nKonfigurierbare Basis-URL in Adaptereinstellungen hinzugefügt\nModelle werden nun dynamisch vom konfigurierten API-Endpunkt abgeholt\nHinzufügen der Schaltfläche \"Test API-Verbindung\" in Adaptereinstellungen\nHinzugefügt Fehlerbehandlung mit benutzerfreundlichen Nachrichten für unerreichbare Anbieter\nZusätzliche Retry-Funktionalität für gescheiterte Modellbeladung\nAlle API-Anrufe (Modelle + Chat) sind serverseitig proxied, um CORS Probleme mit lokalen Anbietern zu vermeiden\nStrip LLM denkende Artefakte aus Antworten (für lokale Modelle wie Ollama)",
|
|
@@ -53,19 +79,6 @@
|
|
|
53
79
|
"uk": "Малі оптимізації інтерфейсу\nДодано підтримку користувацького OpenAI-сумісного API endpoints (наприклад, Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nДодано налаштування URL-адреси бази в налаштуваннях адаптера\nМоделі тепер динамічно від налаштованої точки API\nДодано кнопку \"Test API підключення\" в налаштуваннях адаптера\nДодана обробка помилок з зручними повідомленнями для ненадійних постачальників\nДодано функцію трейдингу для завантаження моделі\nУсі виклики API (модельи + чат) проксіовані сервери, щоб уникнути проблем з локальними постачальниками\nСмуга LLM мислення артефакти відповідей (для місцевих моделей, таких як Ollama)",
|
|
54
80
|
"zh-cn": "小图形界面优化\n添加自定义的 OpenAI 兼容 API 端点支持( 如 Ollama, LM Studio, Google 双子座, DeepSeek, OpenRouter)\n在适配器设置中添加可配置的基础 URL\n现在从配置的 API 端点动态获取模型\n在适配器设置中添加“ 测试 API 连接” 按钮\n为无法访问的提供者处理方便用户的信件时添加错误处理\n为失败的模型加载添加了重试功能\n所有 API 呼叫( 模式 + 聊天) 均为代理服务器侧面, 以避免 CORS 与本地供应商发生问题\n从回应中脱去LLM思考文物(为奥拉马等本地模型)"
|
|
55
81
|
},
|
|
56
|
-
"9.1.0": {
|
|
57
|
-
"en": "Added support for custom OpenAI-compatible API endpoints (e.g. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nAdded configurable base URL in adapter settings\nModels are now fetched dynamically from the configured API endpoint\nAdded the \"Test API connection\" button in adapter settings\nAdded error handling with user-friendly messages for unreachable providers\nAdded retry functionality for failed model loading\nAll API calls (models + chat) are proxied server-side to avoid CORS issues with local providers\nStrip LLM thinking artifacts from responses (for local models like Ollama)",
|
|
58
|
-
"de": "Unterstützung für benutzerdefinierte OpenAI-kompatible API-Endpunkte (z.B. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nKonfigurierbare Basis-URL in Adaptereinstellungen hinzugefügt\nModelle werden nun dynamisch vom konfigurierten API-Endpunkt abgeholt\nHinzufügen der Schaltfläche \"Test API-Verbindung\" in Adaptereinstellungen\nHinzugefügt Fehlerbehandlung mit benutzerfreundlichen Nachrichten für unerreichbare Anbieter\nZusätzliche Retry-Funktionalität für gescheiterte Modellbeladung\nAlle API-Anrufe (Modelle + Chat) sind serverseitig proxied, um CORS Probleme mit lokalen Anbietern zu vermeiden\nStrip LLM denkende Artefakte aus Antworten (für lokale Modelle wie Ollama)",
|
|
59
|
-
"ru": "Добавлена поддержка пользовательских OpenAI-совместимых конечных точек API (например, Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nДобавлен настраиваемый базовый URL в настройках адаптера\nМодели теперь динамически извлекаются из конфигурированной конечной точки API\nДобавлена кнопка «Test API connection» в настройках адаптера\nДобавлена обработка ошибок с помощью удобных сообщений для недостижимых поставщиков\nДобавлена функция retry для неудавшейся загрузки модели\nВсе вызовы API (модели + чат) проходят на стороне сервера, чтобы избежать проблем с CORS с местными провайдерами\nСтриптиз LLM мыслящие артефакты из ответов (для местных моделей, таких как Ollama)",
|
|
60
|
-
"pt": "Adicionado suporte para endpoints personalizados compatíveis com OpenAI API (por exemplo, Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nAdicionado URL base configurável nas configurações do adaptador\nOs modelos agora são obtidos dinamicamente do endpoint da API configurado\nAdicionado o botão \"Teste conexão API\" nas configurações do adaptador\nTratamento de erros adicionado com mensagens amigáveis para provedores inalcançáveis\nAdicionada funcionalidade de repetição para carregamento do modelo falhou\nTodas as chamadas de API (modelos + chat) são proxied servidor-lado para evitar problemas CORS com fornecedores locais\nRetire artefatos de pensamento LLM de respostas (para modelos locais como Ollama)",
|
|
61
|
-
"nl": "Extra ondersteuning voor aangepaste OpenAI-compatibele API-eindpunten (bijv. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nConfigureerbare basis-URL in adapterinstellingen toegevoegd\nModellen worden nu dynamisch opgehaald uit het geconfigureerde API-eindpunt\nToegevoegd de \"Test API connection\" knop in adapter instellingen\nToegevoegd foutafhandeling met gebruiksvriendelijke berichten voor onbereikbare providers\nName\nAlle API-gesprekken (modellen + chat) zijn aangeprezen server-kant om CORS problemen met lokale aanbieders te voorkomen\nStrip LLM denken artefacten uit reacties (voor lokale modellen zoals Ollama)",
|
|
62
|
-
"fr": "Ajout de la prise en charge des paramètres d'API compatibles OpenAI personnalisés (par exemple Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nAjout de l'URL de base configurable dans les paramètres de l'adaptateur\nLes modèles sont maintenant récupérés dynamiquement à partir du paramètre API configuré\nAjout du bouton \"Tester la connexion API\" dans les paramètres de l'adaptateur\nAjout du traitement des erreurs avec des messages conviviaux pour les fournisseurs inaccessibles\nAjout de la fonctionnalité de réessayer pour le chargement du modèle échoué\nTous les appels API (modèles + chat) sont proxiés côté serveur pour éviter les problèmes CORS avec les fournisseurs locaux\nStrip LLM artefacts de réflexion des réponses (pour les modèles locaux comme Ollama)",
|
|
63
|
-
"it": "Aggiunto il supporto per i endpoint API personalizzati compatibili con OpenAI (ad esempio Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nAggiunto URL di base configurabile nelle impostazioni dell'adattatore\nI modelli sono ora recuperati dinamicamente dal endpoint API configurato\nAggiunto il pulsante \"Test API Connection\" nelle impostazioni dell'adattatore\nGestione degli errori aggiunti con messaggi intuitivi per fornitori irraggiungibili\nAggiunta funzionalità retry per il caricamento del modello fallito\nTutte le chiamate API (modelli + chat) sono proxied server-side per evitare problemi CORS con i fornitori locali\nStrip LLM pensa artefatti da risposte (per modelli locali come Ollama)",
|
|
64
|
-
"es": "Añadido soporte para terminales API compatibles con OpenAI (por ejemplo Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nURL de base configurable en la configuración del adaptador\nLos modelos ahora se recogen dinámicamente desde el punto final de API configurado\nSe agregó el botón \"Test API connection\" en la configuración del adaptador\nManejo de error añadido con mensajes fáciles de usar para proveedores no accesibles\nFunción de retry adicional para la carga del modelo fallido\nTodas las llamadas de API (models + chat) son proxied servidor-side para evitar problemas de CORS con proveedores locales\nStrip LLM piensa artefactos de respuestas (para modelos locales como Ollama)",
|
|
65
|
-
"pl": "Dodano obsługę własnych punktów końcowych kompatybilnych z OpenAI (np. Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nDodano konfigurowalny podstawowy adres URL w ustawieniach adaptera\nModele są teraz odbierane dynamicznie z skonfigurowanego punktu końcowego API\nDodano przycisk \"Test API connection\" w ustawieniach adaptera\nDodano obsługę błędów z komunikatami przyjaznymi dla użytkownika dla nieosiągalnych dostawców\nDodano funkcję ponownego testowania dla nieudanego obciążenia modelu\nWszystkie połączenia API (modele + czat) są proxied server- side, aby uniknąć problemów CORS z lokalnymi dostawcami\nStrip LLM myśli artefakty z odpowiedzi (dla lokalnych modeli takich jak Ollama)",
|
|
66
|
-
"uk": "Додано підтримку користувацького OpenAI-сумісного API endpoints (наприклад, Ollama, LM Studio, Google Gemini, DeepSeek, OpenRouter)\nДодано налаштування URL-адреси бази в налаштуваннях адаптера\nМоделі тепер динамічно від налаштованої точки API\nДодано кнопку \"Test API підключення\" в налаштуваннях адаптера\nДодана обробка помилок з зручними повідомленнями для ненадійних постачальників\nДодано функцію трейдингу для завантаження моделі\nУсі виклики API (модельи + чат) проксіовані сервери, щоб уникнути проблем з локальними постачальниками\nСмуга LLM мислення артефакти відповідей (для місцевих моделей, таких як Ollama)",
|
|
67
|
-
"zh-cn": "添加自定义的 OpenAI 兼容 API 端点支持( 如 Ollama, LM Studio, Google 双子座, DeepSeek, OpenRouter)\n在适配器设置中添加可配置的基础 URL\n现在从配置的 API 端点动态获取模型\n在适配器设置中添加“ 测试 API 连接” 按钮\n为无法访问的提供者处理方便用户的信件时添加错误处理\n为失败的模型加载添加了重试功能\n所有 API 呼叫( 模式 + 聊天) 均为代理服务器侧面, 以避免 CORS 与本地供应商发生问题\n从回应中脱去LLM思考文物(为奥拉马等本地模型)"
|
|
68
|
-
},
|
|
69
82
|
"9.0.18": {
|
|
70
83
|
"en": "Corrected error message with `lastSync`\nCorrected JavaScript filter",
|
|
71
84
|
"de": "Korrigierte Fehlermeldung mit `last Synthetisch `\nJavaScript-Filter korrigiert",
|
|
@@ -91,45 +104,6 @@
|
|
|
91
104
|
"pl": "Dodano możliwość szyfrowania skryptów hasłem (tylko dla sprzedawców)",
|
|
92
105
|
"uk": "Додана можливість шифрування сценаріїв з паролем (тільки для постачальників)",
|
|
93
106
|
"zh-cn": "添加使用密码加密脚本的可能性( 只针对供应商)"
|
|
94
|
-
},
|
|
95
|
-
"9.0.16": {
|
|
96
|
-
"en": "Added possibility to encrypt scripts with password (only for vendors)",
|
|
97
|
-
"de": "Zusätzliche Möglichkeit, Skripte mit Passwort zu verschlüsseln (nur für Hersteller)",
|
|
98
|
-
"ru": "Добавлена возможность шифрования скриптов с помощью пароля (только для продавцов)",
|
|
99
|
-
"pt": "Adicionada possibilidade de criptografar scripts com senha (somente para fornecedores)",
|
|
100
|
-
"nl": "Toegevoegd mogelijkheid om scripts te versleutelen met wachtwoord (alleen voor leveranciers)",
|
|
101
|
-
"fr": "Ajout de la possibilité de chiffrer les scripts avec le mot de passe (seulement pour les fournisseurs)",
|
|
102
|
-
"it": "Aggiunta possibilità di crittografare gli script con password (solo per i fornitori)",
|
|
103
|
-
"es": "Añadido posibilidad de cifrar scripts con contraseña (sólo para proveedores)",
|
|
104
|
-
"pl": "Dodano możliwość szyfrowania skryptów hasłem (tylko dla sprzedawców)",
|
|
105
|
-
"uk": "Додана можливість шифрування сценаріїв з паролем (тільки для постачальників)",
|
|
106
|
-
"zh-cn": "添加使用密码加密脚本的可能性( 只针对供应商)"
|
|
107
|
-
},
|
|
108
|
-
"9.0.15": {
|
|
109
|
-
"en": "Added possibility to encrypt scripts with password (only for vendors)",
|
|
110
|
-
"de": "Zusätzliche Möglichkeit, Skripte mit Passwort zu verschlüsseln (nur für Hersteller)",
|
|
111
|
-
"ru": "Добавлена возможность шифрования скриптов с помощью пароля (только для продавцов)",
|
|
112
|
-
"pt": "Adicionada possibilidade de criptografar scripts com senha (somente para fornecedores)",
|
|
113
|
-
"nl": "Toegevoegd mogelijkheid om scripts te versleutelen met wachtwoord (alleen voor leveranciers)",
|
|
114
|
-
"fr": "Ajout de la possibilité de chiffrer les scripts avec le mot de passe (seulement pour les fournisseurs)",
|
|
115
|
-
"it": "Aggiunta possibilità di crittografare gli script con password (solo per i fornitori)",
|
|
116
|
-
"es": "Añadido posibilidad de cifrar scripts con contraseña (sólo para proveedores)",
|
|
117
|
-
"pl": "Dodano możliwość szyfrowania skryptów hasłem (tylko dla sprzedawców)",
|
|
118
|
-
"uk": "Додана можливість шифрування сценаріїв з паролем (тільки для постачальників)",
|
|
119
|
-
"zh-cn": "添加使用密码加密脚本的可能性( 只针对供应商)"
|
|
120
|
-
},
|
|
121
|
-
"9.0.14": {
|
|
122
|
-
"en": "Added possibility to encrypt scripts with password (only for vendors)",
|
|
123
|
-
"de": "Zusätzliche Möglichkeit, Skripte mit Passwort zu verschlüsseln (nur für Hersteller)",
|
|
124
|
-
"ru": "Добавлена возможность шифрования скриптов с помощью пароля (только для продавцов)",
|
|
125
|
-
"pt": "Adicionada possibilidade de criptografar scripts com senha (somente para fornecedores)",
|
|
126
|
-
"nl": "Toegevoegd mogelijkheid om scripts te versleutelen met wachtwoord (alleen voor leveranciers)",
|
|
127
|
-
"fr": "Ajout de la possibilité de chiffrer les scripts avec le mot de passe (seulement pour les fournisseurs)",
|
|
128
|
-
"it": "Aggiunta possibilità di crittografare gli script con password (solo per i fornitori)",
|
|
129
|
-
"es": "Añadido posibilidad de cifrar scripts con contraseña (sólo para proveedores)",
|
|
130
|
-
"pl": "Dodano możliwość szyfrowania skryptów hasłem (tylko dla sprzedawców)",
|
|
131
|
-
"uk": "Додана можливість шифрування сценаріїв з паролем (тільки для постачальників)",
|
|
132
|
-
"zh-cn": "添加使用密码加密脚本的可能性( 只针对供应商)"
|
|
133
107
|
}
|
|
134
108
|
},
|
|
135
109
|
"platform": "Javascript/Node.js",
|
|
@@ -186,7 +160,7 @@
|
|
|
186
160
|
},
|
|
187
161
|
"dependencies": [
|
|
188
162
|
{
|
|
189
|
-
"js-controller": ">=
|
|
163
|
+
"js-controller": ">=6.0.11"
|
|
190
164
|
}
|
|
191
165
|
],
|
|
192
166
|
"globalDependencies": [
|
|
@@ -380,6 +354,45 @@
|
|
|
380
354
|
"agree",
|
|
381
355
|
"cancel"
|
|
382
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
|
+
]
|
|
383
396
|
}
|
|
384
397
|
]
|
|
385
398
|
},
|
|
@@ -506,10 +519,25 @@
|
|
|
506
519
|
"maxTriggersPerScript": 100,
|
|
507
520
|
"gptKey": "",
|
|
508
521
|
"gptBaseUrl": "",
|
|
522
|
+
"gptBaseUrlKey": "",
|
|
509
523
|
"claudeKey": "",
|
|
510
524
|
"geminiKey": "",
|
|
511
525
|
"deepseekKey": ""
|
|
512
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
|
+
],
|
|
513
541
|
"objects": [
|
|
514
542
|
{
|
|
515
543
|
"_id": "_design/script",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.javascript",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.2.1",
|
|
4
4
|
"description": "Rules Engine for ioBroker",
|
|
5
5
|
"author": "bluefox <dogafox@gmail.com>",
|
|
6
6
|
"contributors": [
|
|
@@ -42,18 +42,19 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@iobroker/adapter-core": "^3.3.2",
|
|
45
|
-
"@iobroker/types": "^7.1.
|
|
46
|
-
"@types/node": "^25.
|
|
47
|
-
"axios": "^1.
|
|
45
|
+
"@iobroker/types": "^7.1.1",
|
|
46
|
+
"@types/node": "^25.6.0",
|
|
47
|
+
"axios": "^1.15.0",
|
|
48
48
|
"jsonata": "^2.1.0",
|
|
49
49
|
"jszip": "^3.10.1",
|
|
50
50
|
"node-inspect": "^2.0.0",
|
|
51
51
|
"node-schedule": "2.1.1",
|
|
52
|
-
"
|
|
52
|
+
"nodemailer": "^8.0.5",
|
|
53
|
+
"prettier": "^3.8.2",
|
|
53
54
|
"promisify-child-process": "^5.0.1",
|
|
54
55
|
"semver": "^7.7.4",
|
|
55
56
|
"suncalc2": "^1.8.1",
|
|
56
|
-
"typescript": "
|
|
57
|
+
"typescript": "5.9.3",
|
|
57
58
|
"virtual-tsc": "^0.6.2",
|
|
58
59
|
"wake_on_lan": "^1.0.0"
|
|
59
60
|
},
|