iobroker.javascript 9.3.1 → 10.0.0
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 +5 -5
- package/admin/assets/AiChatPanel-p0KAg6Cs.js +237 -0
- package/admin/assets/AiDatapointProvider-DzFpUKkT.js +2 -0
- package/admin/assets/AiDiffView-BPTLnNx1.js +1 -0
- package/admin/assets/AiInlineProvider-CaHd2G2Q.js +5 -0
- package/admin/assets/AiScriptAnalyzer--BHML2rN.js +9 -0
- package/admin/assets/BlocklyEditor-CAjVMhYT.js +81 -0
- package/admin/assets/ContextWrapper-BVc8wTK_.css +1 -0
- package/admin/assets/ContextWrapper-D9CrnNKs.js +127 -0
- package/admin/assets/Debugger-SjROokFI.js +15 -0
- package/admin/assets/Error-DDfrxAt2.js +1 -0
- package/admin/assets/Import-DpTg1Jow.js +1 -0
- package/admin/assets/RulesEditor-BSRFWpEm.css +1 -0
- package/admin/assets/RulesEditor-D0hgrcBc.js +1 -0
- package/admin/assets/ScriptEditor-BGIuoNei.js +2 -0
- package/admin/assets/ScriptEditorVanillaMonaco-DyMQtoTQ.js +3 -0
- package/admin/assets/_virtual_mf-localSharedImportMap___mfe_internal__iobroker_javascript__mf_owner__1-DWJotR1B.js +1 -0
- package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-CxICLr5Z.js +1243 -0
- package/admin/assets/_virtual_mf___mfe_internal__iobroker_javascript__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BBAXJaqI.js +9 -0
- package/admin/assets/aiCodeLensProvider-hyAmut0e.js +4 -0
- package/admin/assets/aiPromptBuilder-Bs27qOHT.js +7 -0
- package/admin/assets/applyCodeEdit-D3nb7erO.js +1 -0
- package/admin/assets/blocklyDarkTheme-DEiAX5DT.js +1 -0
- package/admin/assets/cronHoverProvider-pKJkSevo.js +2 -0
- package/admin/assets/dist-uw5orDgd.js +4 -0
- package/admin/assets/{docs-compact-CKNGiYh2.js → docs-compact-D7rpMc7r.js} +2 -2
- package/admin/assets/hostInit-BFg5u9hY.js +1 -0
- package/admin/assets/index-B1gICjdq.js +192 -0
- package/admin/assets/index-BHhhebRG.css +1 -0
- package/admin/assets/inlineChatWidget-ZaisTOLh.js +2 -0
- package/admin/assets/inlineDiffController-hTwHHqcc.js +16 -0
- package/admin/assets/mf-entry-bootstrap-0-d6052b31.js +36 -0
- package/admin/assets/mjs-DWqivHEk.js +90 -0
- package/admin/assets/rolldown-runtime-C0FnF6B9.js +1 -0
- package/admin/assets/stateHoverProvider-C7DawIs-.js +9 -0
- package/admin/assets/virtualExposes-Ed0lGq7k.js +1 -0
- package/admin/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__iobroker_javascript__remoteEntry_js-BYs71IQF.js +1 -0
- package/admin/assets/virtual_mf-exposes___mfe_internal__iobroker_javascript__remoteEntry_js-DnnXQRkG.js +1 -0
- package/admin/assets/vite-preload-helper-B7qeedMF.js +1 -0
- package/admin/custom/assets/Components-BrDyDHXh.js +1 -0
- package/admin/custom/assets/Components-DftM8alF.css +1 -0
- package/admin/custom/assets/_virtual_mf-localSharedImportMap___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1-CyYJM2-v.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_react__loadShare__.js-BdzCssLn.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_emotion_mf_1_styled__loadShare__.js-CGb5Cofy.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-BVCIAgbo.js +1243 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-BkB0anQX.js +1494 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__leaflet__loadShare__.js-h-rCw3iz.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-BotqDuw-.js +9 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__date_mf_2_fns__prebuild__-Cb5TR7FB.js +1 -0
- package/admin/custom/assets/_virtual_mf___mfe_internal__ConfigCustomJavascriptSet__mf_owner__1__prebuild__leaflet__prebuild__-DARUoA03.js +1 -0
- package/admin/custom/assets/hostInit-DJx2uXXy.js +1 -0
- package/admin/custom/assets/index-uEKAoVT7.js +1 -0
- package/admin/custom/assets/lib-Yj8cfN0A.js +3 -0
- package/admin/custom/assets/mf-entry-bootstrap-0-77793feb.js +36 -0
- package/admin/custom/assets/rolldown-runtime-BcKkbAw3.js +1 -0
- package/admin/custom/assets/setYear-DJ9FbdkO.js +1 -0
- package/admin/custom/assets/virtualExposes-CxDjLoYu.js +1 -0
- package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-BU-ugy_7.js +1 -0
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-BEfZbrf7.js +2 -0
- package/admin/custom/assets/virtual_mf-exposes___mfe_internal__ConfigCustomJavascriptSet__customComponents_js-CTeZ0Jpm.js +2 -0
- package/admin/custom/assets/vite-preload-helper-B7qeedMF.js +1 -0
- package/admin/custom/customComponents.js +1 -1
- package/admin/jsonConfig.json +1 -1
- package/admin/mf-manifest.json +1 -1
- package/admin/mf-stats.json +1 -0
- package/admin/remoteEntry.js +1 -1
- package/admin/tab.html +12 -17
- package/build/lib/debugger.js +1 -1
- package/build/lib/debugger.js.map +1 -1
- package/build/lib/eventObj.js.map +1 -1
- package/build/lib/inspect.js.map +1 -1
- package/build/lib/javascript.d.ts +18 -19
- package/build/lib/nodeModulesManagement.js +3 -1
- package/build/lib/nodeModulesManagement.js.map +1 -1
- package/build/lib/protectFs.js.map +1 -1
- package/build/lib/sandbox.js +84 -31
- package/build/lib/sandbox.js.map +1 -1
- package/build/lib/scheduler.js.map +1 -1
- package/build/lib/tools.js +1 -1
- package/build/lib/tools.js.map +1 -1
- package/build/lib/typescriptSettings.js +16 -10
- package/build/lib/typescriptSettings.js.map +1 -1
- package/build/lib/typescriptTools.js +2 -2
- package/build/lib/typescriptTools.js.map +1 -1
- package/build/main.js +7 -4
- package/build/main.js.map +1 -1
- package/build/src/lib/aiProviderResolver.js +107 -0
- package/build/src/lib/aiProviderResolver.js.map +1 -0
- package/build/src/lib/anthropicAdapter.js +175 -0
- package/build/src/lib/anthropicAdapter.js.map +1 -0
- package/build/src/lib/consts.js +346 -0
- package/build/src/lib/consts.js.map +1 -0
- package/build/src/lib/convert.js +121 -0
- package/build/src/lib/convert.js.map +1 -0
- package/build/src/lib/crypto.js +32 -0
- package/build/src/lib/crypto.js.map +1 -0
- package/build/src/lib/debug.js +163 -0
- package/build/src/lib/debug.js.map +1 -0
- package/build/src/lib/debugger.js +1135 -0
- package/build/src/lib/debugger.js.map +1 -0
- package/build/src/lib/eventObj.js +194 -0
- package/build/src/lib/eventObj.js.map +1 -0
- package/build/src/lib/inspect.js +728 -0
- package/build/src/lib/inspect.js.map +1 -0
- package/build/src/lib/mirror.js +634 -0
- package/build/src/lib/mirror.js.map +1 -0
- package/build/src/lib/nodeModulesManagement.js +26 -0
- package/build/src/lib/nodeModulesManagement.js.map +1 -0
- package/build/src/lib/patternCompareFunctions.js +293 -0
- package/build/src/lib/patternCompareFunctions.js.map +1 -0
- package/build/src/lib/protectFs.js +554 -0
- package/build/src/lib/protectFs.js.map +1 -0
- package/build/src/lib/sandbox.js +4897 -0
- package/build/src/lib/sandbox.js.map +1 -0
- package/build/src/lib/scheduler.js +555 -0
- package/build/src/lib/scheduler.js.map +1 -0
- package/build/src/lib/tools.js +188 -0
- package/build/src/lib/tools.js.map +1 -0
- package/build/src/lib/typescriptSettings.js +39 -0
- package/build/src/lib/typescriptSettings.js.map +1 -0
- package/build/src/lib/typescriptTools.js +435 -0
- package/build/src/lib/typescriptTools.js.map +1 -0
- package/build/src/lib/utils.js +66 -0
- package/build/src/lib/utils.js.map +1 -0
- package/build/src/lib/words.js +76 -0
- package/build/src/lib/words.js.map +1 -0
- package/build/src/main.js +3414 -0
- package/build/src/main.js.map +1 -0
- package/build/types.d.ts +2 -10
- package/io-package.json +15 -15
- package/package.json +15 -16
- package/admin/assets/AiChatPanel-C3bIw_D5.js +0 -317
- package/admin/assets/AiDatapointProvider-B0i3I5Fm.js +0 -2
- package/admin/assets/AiDiffView-RPozjjHf.js +0 -1
- package/admin/assets/AiInlineProvider-DkgjVSFQ.js +0 -7
- package/admin/assets/Save-CkuNSiWL.js +0 -1
- package/admin/assets/ScriptEditor-8UU88tT5.js +0 -2
- package/admin/assets/ScriptEditorVanillaMonaco-Bn8xJ3LV.js +0 -3
- package/admin/assets/applyCodeEdit-BdRnbz2g.js +0 -1
- package/admin/assets/createSvgIcon-DYs_tNrE.js +0 -8
- package/admin/assets/cronHoverProvider-Bg0Vz-1E.js +0 -2
- package/admin/assets/hostInit-LzITLWDa.js +0 -1
- package/admin/assets/index-45IwpC7_.js +0 -1
- package/admin/assets/index-BCK6q-N6.css +0 -1
- package/admin/assets/index-BTsjunTt.css +0 -1
- package/admin/assets/index-BkyLyaYT.js +0 -8
- package/admin/assets/index-C0ZnUCQf.js +0 -990
- package/admin/assets/index-CO9RA-Wq.js +0 -1267
- package/admin/assets/index-CRGWWpGb.js +0 -1
- package/admin/assets/index-CVZSzCXy.js +0 -1
- package/admin/assets/index-CsyuIWlD.js +0 -16
- package/admin/assets/index-Dsh1HfIY.js +0 -1
- package/admin/assets/index-dN73sbyQ.js +0 -193
- package/admin/assets/index-wHNMOf-c.js +0 -5
- package/admin/assets/inheritsLoose-CIXm_zPk.js +0 -29
- package/admin/assets/inlineChatWidget-Cu6rb4Ar.js +0 -2
- package/admin/assets/inlineDiffController-DBLpPOe2.js +0 -16
- package/admin/assets/iobroker_javascript__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-DkBjPSMw.js +0 -1
- package/admin/assets/iobroker_javascript__loadShare___mf_0_mui_mf_1_material__loadShare__.mjs-CV1_X-Lf.js +0 -1
- package/admin/assets/iobroker_javascript__loadShare__prop_mf_2_types__loadShare__.mjs-BCtSFofY.js +0 -1
- package/admin/assets/iobroker_javascript__loadShare__react__loadShare__.mjs-CTZOFJS2.js +0 -1
- package/admin/assets/iobroker_javascript__loadShare__react__loadShare__.mjs_commonjs-proxy-CE9lvhW8.js +0 -1
- package/admin/assets/iobroker_javascript__loadShare__react_mf_2_dom__loadShare__.mjs-DeVAS-oa.js +0 -1
- package/admin/assets/iobroker_javascript__loadShare__react_mf_2_dom__loadShare__.mjs_commonjs-proxy-RQRRZMX5.js +0 -1
- package/admin/assets/localSharedImportMap-Db5DxDmY.js +0 -1
- package/admin/assets/preload-helper-BDBacUwf.js +0 -1
- package/admin/assets/stateHoverProvider-C82xsI7Q.js +0 -9
- package/admin/assets/useTheme-DuTJsNQ-.js +0 -1
- package/admin/assets/virtualExposes-BPsCufin.js +0 -1
- package/admin/assets/virtual_mf-REMOTE_ENTRY_ID_iobroker_javascript__remoteEntry_js-Bw22wl4W.js +0 -8
- package/admin/custom/assets/Components-BOms95_F.css +0 -1
- package/admin/custom/assets/Components-CGiJE5Zh.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare___mf_0_emotion_mf_1_react__loadShare__.mjs-sg07E3QA.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare___mf_0_emotion_mf_1_styled__loadShare__.mjs-CwjI4A-J.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare___mf_0_iobroker_mf_1_adapter_mf_2_react_mf_2_v5__loadShare__.mjs-B7D2xOvV.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.mjs-ClsgYnEX.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare___mf_0_mui_mf_1_icons_mf_2_material__loadShare__.mjs-B551AMx-.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare___mf_0_mui_mf_1_material__loadShare__.mjs-KsT5vKjV.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare___mf_0_mui_mf_1_x_mf_2_date_mf_2_pickers__loadShare__.mjs-DgHZUNxn.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare__leaflet__loadShare__.mjs-BYONkEgA.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare__react__loadShare__.mjs-BW9Qbxx5.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare__react__loadShare__.mjs_commonjs-proxy-2W2BYT2K.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare__react_mf_2_dom__loadShare__.mjs-CL--xmjC.js +0 -1
- package/admin/custom/assets/ConfigCustomJavascriptSet__loadShare__react_mf_2_dom__loadShare__.mjs_commonjs-proxy-D8zcZsJo.js +0 -1
- package/admin/custom/assets/DefaultPropsProvider-CfKHPa-G.js +0 -1
- package/admin/custom/assets/TextField-CxPfV5Sr.js +0 -139
- package/admin/custom/assets/ThemeProvider-DSTCckLJ.js +0 -29
- package/admin/custom/assets/blue-CagzI6CQ.js +0 -1
- package/admin/custom/assets/createSvgIcon-b2B2NI3g.js +0 -1
- package/admin/custom/assets/createTheme-MsdB8zt7.js +0 -8
- package/admin/custom/assets/defaultTheme-CmVP-QNF.js +0 -1
- package/admin/custom/assets/emotion-cache.browser.esm-BgJfNZJN.js +0 -1
- package/admin/custom/assets/emotion-react.browser.esm-chZAeh_-.js +0 -1
- package/admin/custom/assets/emotion-serialize.esm-BUa21YfQ.js +0 -1
- package/admin/custom/assets/emotion-styled.browser.esm-Yi13plpH.js +0 -1
- package/admin/custom/assets/emotion-use-insertion-effect-with-fallbacks.browser.esm-CEPeBbh9.js +0 -1
- package/admin/custom/assets/extends-CF3RwP-h.js +0 -1
- package/admin/custom/assets/hostInit-iUL-wyj1.js +0 -1
- package/admin/custom/assets/index-17vbGv00.js +0 -1
- package/admin/custom/assets/index-B5DqCD_a.js +0 -1
- package/admin/custom/assets/index-Bvwv5H7k.js +0 -1
- package/admin/custom/assets/index-CMsuyEZj.js +0 -964
- package/admin/custom/assets/index-CuAhFQ4L.js +0 -1523
- package/admin/custom/assets/index-CzRngQHl.js +0 -31
- package/admin/custom/assets/index-DLNtxshy.js +0 -1
- package/admin/custom/assets/index-DV76KW3-.js +0 -7
- package/admin/custom/assets/index-D_5kZmfw.js +0 -1
- package/admin/custom/assets/index-DlQbqHom.js +0 -8
- package/admin/custom/assets/index-DpJ18x6R.js +0 -1
- package/admin/custom/assets/index-FTmk0JJx.js +0 -55
- package/admin/custom/assets/index-mkhHeJ3Q.js +0 -1
- package/admin/custom/assets/isSameWeek-DDsSIa_t.js +0 -1
- package/admin/custom/assets/jsx-runtime-BplTyRFk.js +0 -1
- package/admin/custom/assets/leaflet-src-B472P7Y1.js +0 -1
- package/admin/custom/assets/localSharedImportMap-BsMINYMr.js +0 -1
- package/admin/custom/assets/preload-helper-BDBacUwf.js +0 -1
- package/admin/custom/assets/useTheme-BV4xOYIL.js +0 -1
- package/admin/custom/assets/useTheme-ldICnlmf.js +0 -1
- package/admin/custom/assets/virtualExposes-D402kVGY.js +0 -2
- package/admin/custom/assets/virtual_mf-REMOTE_ENTRY_ID_ConfigCustomJavascriptSet__customComponents_js-BzLNCazi.js +0 -8
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Helpers for resolving AI provider credentials in sendTo handlers.
|
|
4
|
+
*
|
|
5
|
+
* Keys are stored as `encryptedNative` + `protectedNative` in io-package.json —
|
|
6
|
+
* they are never sent from the frontend. The backend looks them up in `this.config`
|
|
7
|
+
* based on the `provider` name sent along with each `chatCompletion` or
|
|
8
|
+
* `testApiConnection` request.
|
|
9
|
+
*
|
|
10
|
+
* These functions are extracted so they can be unit-tested in isolation.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.PROVIDER_CREDENTIAL_ID_FIELD = exports.PROVIDER_KEY_FIELD = void 0;
|
|
14
|
+
exports.getProviderCredentialId = getProviderCredentialId;
|
|
15
|
+
exports.resolveProviderCredentials = resolveProviderCredentials;
|
|
16
|
+
exports.resolveTestCredentials = resolveTestCredentials;
|
|
17
|
+
exports.listAvailableProviders = listAvailableProviders;
|
|
18
|
+
/** Maps each provider to the adapter-config field holding its API key. */
|
|
19
|
+
exports.PROVIDER_KEY_FIELD = {
|
|
20
|
+
openai: 'gptKey',
|
|
21
|
+
anthropic: 'claudeKey',
|
|
22
|
+
gemini: 'geminiKey',
|
|
23
|
+
deepseek: 'deepseekKey',
|
|
24
|
+
custom: 'gptBaseUrlKey',
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Maps each provider to the adapter-config field holding the ID of its credential
|
|
28
|
+
* in the central credential store (used in `manager` mode).
|
|
29
|
+
*/
|
|
30
|
+
exports.PROVIDER_CREDENTIAL_ID_FIELD = {
|
|
31
|
+
openai: 'credentialIdGptKey',
|
|
32
|
+
anthropic: 'credentialIdClaudeKey',
|
|
33
|
+
gemini: 'credentialIdGeminiKey',
|
|
34
|
+
deepseek: 'credentialIdDeepseekKey',
|
|
35
|
+
custom: 'credentialIdGptBaseUrlKey',
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Returns the configured credential ID (e.g. `system.credentials.anthropic`) for a provider
|
|
39
|
+
* in `manager` mode, or an empty string if none/unknown provider.
|
|
40
|
+
*/
|
|
41
|
+
function getProviderCredentialId(config, provider) {
|
|
42
|
+
const cfg = config || {};
|
|
43
|
+
const field = exports.PROVIDER_CREDENTIAL_ID_FIELD[provider];
|
|
44
|
+
return field ? (cfg[field] || '').toString().trim() : '';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve API key and base URL for a provider from adapter config.
|
|
48
|
+
* Optional `messageBaseUrl` takes precedence over the stored `gptBaseUrl`
|
|
49
|
+
* (used by the settings-dialog Test button where the user's form value
|
|
50
|
+
* should win over the persisted value).
|
|
51
|
+
*/
|
|
52
|
+
function resolveProviderCredentials(config, provider, messageBaseUrl) {
|
|
53
|
+
const cfg = config || {};
|
|
54
|
+
const keyField = exports.PROVIDER_KEY_FIELD[provider];
|
|
55
|
+
const apiKey = keyField ? (cfg[keyField] || '').toString().trim() : '';
|
|
56
|
+
// baseUrl only applies to openai-compatible providers (custom / openai endpoint override).
|
|
57
|
+
// An empty/whitespace messageBaseUrl counts as "not provided" and falls back to the stored value,
|
|
58
|
+
// so the frontend can safely send `baseUrl: ''` without overriding a configured custom URL.
|
|
59
|
+
const baseUrl = provider === 'custom' || provider === 'openai'
|
|
60
|
+
? (messageBaseUrl || cfg.gptBaseUrl || '').toString().trim()
|
|
61
|
+
: '';
|
|
62
|
+
return { apiKey, baseUrl };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* For the testApiConnection sendTo command: if the caller supplied an apiKey
|
|
66
|
+
* (settings-dialog form value), use it; otherwise fall back to the stored key.
|
|
67
|
+
*/
|
|
68
|
+
function resolveTestCredentials(config, provider, messageApiKey, messageBaseUrl) {
|
|
69
|
+
const fallback = resolveProviderCredentials(config, provider, messageBaseUrl);
|
|
70
|
+
const explicitKey = (messageApiKey || '').toString().trim();
|
|
71
|
+
return {
|
|
72
|
+
apiKey: explicitKey || fallback.apiKey,
|
|
73
|
+
baseUrl: fallback.baseUrl,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* List of providers that have credentials configured in this.config.
|
|
78
|
+
* Used by the `getAvailableAiProviders` sendTo command so the frontend
|
|
79
|
+
* knows which provider icons/models to show without ever seeing a key.
|
|
80
|
+
*/
|
|
81
|
+
function listAvailableProviders(config) {
|
|
82
|
+
const cfg = config || {};
|
|
83
|
+
const providers = [];
|
|
84
|
+
const manager = cfg.credentialType === 'manager';
|
|
85
|
+
// A key-based provider is "available" if it has a stored key (manual mode)
|
|
86
|
+
// or a selected credential ID (manager mode).
|
|
87
|
+
const has = (provider, key) => manager ? !!getProviderCredentialId(cfg, provider) : !!(key || '').trim();
|
|
88
|
+
if (has('openai', cfg.gptKey)) {
|
|
89
|
+
providers.push({ provider: 'openai' });
|
|
90
|
+
}
|
|
91
|
+
if (has('anthropic', cfg.claudeKey)) {
|
|
92
|
+
providers.push({ provider: 'anthropic' });
|
|
93
|
+
}
|
|
94
|
+
if (has('gemini', cfg.geminiKey)) {
|
|
95
|
+
providers.push({ provider: 'gemini' });
|
|
96
|
+
}
|
|
97
|
+
if (has('deepseek', cfg.deepseekKey)) {
|
|
98
|
+
providers.push({ provider: 'deepseek' });
|
|
99
|
+
}
|
|
100
|
+
// The custom/OpenAI-compatible endpoint is identified by its base URL (the key is optional,
|
|
101
|
+
// e.g. local Ollama), so its availability does not depend on the credential mode.
|
|
102
|
+
if ((cfg.gptBaseUrl || '').trim()) {
|
|
103
|
+
providers.push({ provider: 'custom', baseUrl: cfg.gptBaseUrl });
|
|
104
|
+
}
|
|
105
|
+
return providers;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=aiProviderResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiProviderResolver.js","sourceRoot":"","sources":["../../../src/lib/aiProviderResolver.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAmDH,0DAIC;AAQD,gEAgBC;AAMD,wDAYC;AAOD,wDA4BC;AA1GD,0EAA0E;AAC7D,QAAA,kBAAkB,GAA4C;IACvE,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE,aAAa;IACvB,MAAM,EAAE,eAAe;CAC1B,CAAC;AAEF;;;GAGG;AACU,QAAA,4BAA4B,GAA4C;IACjF,MAAM,EAAE,oBAAoB;IAC5B,SAAS,EAAE,uBAAuB;IAClC,MAAM,EAAE,uBAAuB;IAC/B,QAAQ,EAAE,yBAAyB;IACnC,MAAM,EAAE,2BAA2B;CACtC,CAAC;AAEF;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,MAAwC,EAAE,QAAgB;IAC9F,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,oCAA4B,CAAC,QAAsB,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,0BAA0B,CACtC,MAAwC,EACxC,QAAgB,EAChB,cAAuB;IAEvB,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,0BAAkB,CAAC,QAAsB,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,2FAA2F;IAC3F,kGAAkG;IAClG,4FAA4F;IAC5F,MAAM,OAAO,GACT,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,QAAQ;QAC1C,CAAC,CAAC,CAAC,cAAc,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;QAC5D,CAAC,CAAC,EAAE,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CAClC,MAAwC,EACxC,QAAgB,EAChB,aAAsB,EACtB,cAAuB;IAEvB,MAAM,QAAQ,GAAG,0BAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;IAC5D,OAAO;QACH,MAAM,EAAE,WAAW,IAAI,QAAQ,CAAC,MAAM;QACtC,OAAO,EAAE,QAAQ,CAAC,OAAO;KAC5B,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAClC,MAAwC;IAExC,MAAM,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC;IACzB,MAAM,SAAS,GAAiD,EAAE,CAAC;IACnE,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC;IACjD,2EAA2E;IAC3E,8CAA8C;IAC9C,MAAM,GAAG,GAAG,CAAC,QAAoB,EAAE,GAA8B,EAAW,EAAE,CAC1E,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,4FAA4F;IAC5F,kFAAkF;IAClF,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC","sourcesContent":["/**\n * Helpers for resolving AI provider credentials in sendTo handlers.\n *\n * Keys are stored as `encryptedNative` + `protectedNative` in io-package.json —\n * they are never sent from the frontend. The backend looks them up in `this.config`\n * based on the `provider` name sent along with each `chatCompletion` or\n * `testApiConnection` request.\n *\n * These functions are extracted so they can be unit-tested in isolation.\n */\n\n/** Configuration subset that carries AI credentials. */\nexport interface AiConfigSlice {\n gptKey?: string;\n gptBaseUrl?: string;\n gptBaseUrlKey?: string;\n claudeKey?: string;\n geminiKey?: string;\n deepseekKey?: string;\n /**\n * Where the API keys come from:\n * - `manual`: keys are stored directly in the adapter config (encryptedNative)\n * - `manager`: the config only stores the ID of a credential in the central\n * ioBroker credential store (`system.credentials.*`), resolved at runtime\n */\n credentialType?: 'manual' | 'manager';\n credentialIdGptKey?: string;\n credentialIdClaudeKey?: string;\n credentialIdGeminiKey?: string;\n credentialIdDeepseekKey?: string;\n credentialIdGptBaseUrlKey?: string;\n}\n\nexport type AiProvider = 'openai' | 'anthropic' | 'gemini' | 'deepseek' | 'custom';\n\n/** Maps each provider to the adapter-config field holding its API key. */\nexport const PROVIDER_KEY_FIELD: Record<AiProvider, keyof AiConfigSlice> = {\n openai: 'gptKey',\n anthropic: 'claudeKey',\n gemini: 'geminiKey',\n deepseek: 'deepseekKey',\n custom: 'gptBaseUrlKey',\n};\n\n/**\n * Maps each provider to the adapter-config field holding the ID of its credential\n * in the central credential store (used in `manager` mode).\n */\nexport const PROVIDER_CREDENTIAL_ID_FIELD: Record<AiProvider, keyof AiConfigSlice> = {\n openai: 'credentialIdGptKey',\n anthropic: 'credentialIdClaudeKey',\n gemini: 'credentialIdGeminiKey',\n deepseek: 'credentialIdDeepseekKey',\n custom: 'credentialIdGptBaseUrlKey',\n};\n\n/**\n * Returns the configured credential ID (e.g. `system.credentials.anthropic`) for a provider\n * in `manager` mode, or an empty string if none/unknown provider.\n */\nexport function getProviderCredentialId(config: AiConfigSlice | undefined | null, provider: string): string {\n const cfg = config || {};\n const field = PROVIDER_CREDENTIAL_ID_FIELD[provider as AiProvider];\n return field ? (cfg[field] || '').toString().trim() : '';\n}\n\n/**\n * Resolve API key and base URL for a provider from adapter config.\n * Optional `messageBaseUrl` takes precedence over the stored `gptBaseUrl`\n * (used by the settings-dialog Test button where the user's form value\n * should win over the persisted value).\n */\nexport function resolveProviderCredentials(\n config: AiConfigSlice | undefined | null,\n provider: string,\n messageBaseUrl?: string,\n): { apiKey: string; baseUrl: string } {\n const cfg = config || {};\n const keyField = PROVIDER_KEY_FIELD[provider as AiProvider];\n const apiKey = keyField ? (cfg[keyField] || '').toString().trim() : '';\n // baseUrl only applies to openai-compatible providers (custom / openai endpoint override).\n // An empty/whitespace messageBaseUrl counts as \"not provided\" and falls back to the stored value,\n // so the frontend can safely send `baseUrl: ''` without overriding a configured custom URL.\n const baseUrl =\n provider === 'custom' || provider === 'openai'\n ? (messageBaseUrl || cfg.gptBaseUrl || '').toString().trim()\n : '';\n return { apiKey, baseUrl };\n}\n\n/**\n * For the testApiConnection sendTo command: if the caller supplied an apiKey\n * (settings-dialog form value), use it; otherwise fall back to the stored key.\n */\nexport function resolveTestCredentials(\n config: AiConfigSlice | undefined | null,\n provider: string,\n messageApiKey?: string,\n messageBaseUrl?: string,\n): { apiKey: string; baseUrl: string } {\n const fallback = resolveProviderCredentials(config, provider, messageBaseUrl);\n const explicitKey = (messageApiKey || '').toString().trim();\n return {\n apiKey: explicitKey || fallback.apiKey,\n baseUrl: fallback.baseUrl,\n };\n}\n\n/**\n * List of providers that have credentials configured in this.config.\n * Used by the `getAvailableAiProviders` sendTo command so the frontend\n * knows which provider icons/models to show without ever seeing a key.\n */\nexport function listAvailableProviders(\n config: AiConfigSlice | undefined | null,\n): { provider: AiProvider; baseUrl?: string }[] {\n const cfg = config || {};\n const providers: { provider: AiProvider; baseUrl?: string }[] = [];\n const manager = cfg.credentialType === 'manager';\n // A key-based provider is \"available\" if it has a stored key (manual mode)\n // or a selected credential ID (manager mode).\n const has = (provider: AiProvider, key: string | undefined | null): boolean =>\n manager ? !!getProviderCredentialId(cfg, provider) : !!(key || '').trim();\n if (has('openai', cfg.gptKey)) {\n providers.push({ provider: 'openai' });\n }\n if (has('anthropic', cfg.claudeKey)) {\n providers.push({ provider: 'anthropic' });\n }\n if (has('gemini', cfg.geminiKey)) {\n providers.push({ provider: 'gemini' });\n }\n if (has('deepseek', cfg.deepseekKey)) {\n providers.push({ provider: 'deepseek' });\n }\n // The custom/OpenAI-compatible endpoint is identified by its base URL (the key is optional,\n // e.g. local Ollama), so its availability does not depend on the credential mode.\n if ((cfg.gptBaseUrl || '').trim()) {\n providers.push({ provider: 'custom', baseUrl: cfg.gptBaseUrl });\n }\n return providers;\n}\n"]}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Translation layer between OpenAI-style chat-completion messages/tools and
|
|
4
|
+
* Anthropic's native Messages API.
|
|
5
|
+
*
|
|
6
|
+
* The frontend (AiChatService / useAiChat) always speaks the OpenAI format:
|
|
7
|
+
* - tools[] = [{ type: 'function', function: { name, description, parameters } }]
|
|
8
|
+
* - assistant message with tool_calls[] = [{ id, type: 'function', function: { name, arguments } }]
|
|
9
|
+
* - tool-result message with { role: 'tool', tool_call_id, content }
|
|
10
|
+
* - response = { content, tool_calls? }
|
|
11
|
+
*
|
|
12
|
+
* Anthropic's API uses a different shape:
|
|
13
|
+
* - tools[] = [{ name, description, input_schema }]
|
|
14
|
+
* - assistant message content = [{ type: 'text', text }, { type: 'tool_use', id, name, input }]
|
|
15
|
+
* - tool-result = user message with content = [{ type: 'tool_result', tool_use_id, content }]
|
|
16
|
+
* - response body = { content: [text/tool_use blocks], stop_reason }
|
|
17
|
+
*
|
|
18
|
+
* These functions are pure so they can be unit-tested in isolation.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.translateToolsToAnthropic = translateToolsToAnthropic;
|
|
22
|
+
exports.translateMessagesToAnthropic = translateMessagesToAnthropic;
|
|
23
|
+
exports.translateAnthropicResponseToOpenAI = translateAnthropicResponseToOpenAI;
|
|
24
|
+
/** Translate OpenAI function-tool definitions to Anthropic tool definitions. */
|
|
25
|
+
function translateToolsToAnthropic(tools) {
|
|
26
|
+
if (!Array.isArray(tools)) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const result = [];
|
|
30
|
+
for (const t of tools) {
|
|
31
|
+
// Only `function`-type tools are supported. Anthropic uses a flat shape.
|
|
32
|
+
const tool = t;
|
|
33
|
+
const fn = tool?.function;
|
|
34
|
+
if (!fn?.name) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
result.push({
|
|
38
|
+
name: fn.name,
|
|
39
|
+
description: fn.description,
|
|
40
|
+
// OpenAI's `parameters` and Anthropic's `input_schema` share the JSON Schema shape.
|
|
41
|
+
// If none is provided, Anthropic still requires an object schema.
|
|
42
|
+
input_schema: fn.parameters || { type: 'object', properties: {} },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/** Safe JSON.parse that returns an object on failure so we never throw mid-translation. */
|
|
48
|
+
function safeParseArgs(args) {
|
|
49
|
+
if (!args) {
|
|
50
|
+
return {};
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const parsed = JSON.parse(args);
|
|
54
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
55
|
+
return parsed;
|
|
56
|
+
}
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return {};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Translate a flat OpenAI-style message array into Anthropic's content-block format.
|
|
65
|
+
* System messages are extracted and returned separately (Anthropic takes `system`
|
|
66
|
+
* as a top-level request field, not an inline message).
|
|
67
|
+
*/
|
|
68
|
+
function translateMessagesToAnthropic(messages) {
|
|
69
|
+
if (!Array.isArray(messages)) {
|
|
70
|
+
return { system: '', messages: [] };
|
|
71
|
+
}
|
|
72
|
+
const systemChunks = [];
|
|
73
|
+
const out = [];
|
|
74
|
+
// Pending tool-results that must be grouped into a single `user` message per Anthropic's rules.
|
|
75
|
+
let pendingToolResults = [];
|
|
76
|
+
const flushToolResults = () => {
|
|
77
|
+
if (pendingToolResults.length) {
|
|
78
|
+
out.push({ role: 'user', content: pendingToolResults });
|
|
79
|
+
pendingToolResults = [];
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
for (const m of messages) {
|
|
83
|
+
if (!m || typeof m !== 'object') {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (m.role === 'system') {
|
|
87
|
+
if (typeof m.content === 'string' && m.content) {
|
|
88
|
+
systemChunks.push(m.content);
|
|
89
|
+
}
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
if (m.role === 'tool') {
|
|
93
|
+
// Tool results accumulate; they're flushed when the next non-tool message appears.
|
|
94
|
+
pendingToolResults.push({
|
|
95
|
+
type: 'tool_result',
|
|
96
|
+
tool_use_id: m.tool_call_id || '',
|
|
97
|
+
content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content ?? ''),
|
|
98
|
+
});
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
flushToolResults();
|
|
102
|
+
if (m.role === 'assistant') {
|
|
103
|
+
const blocks = [];
|
|
104
|
+
if (typeof m.content === 'string' && m.content) {
|
|
105
|
+
blocks.push({ type: 'text', text: m.content });
|
|
106
|
+
}
|
|
107
|
+
if (Array.isArray(m.tool_calls)) {
|
|
108
|
+
for (const tc of m.tool_calls) {
|
|
109
|
+
if (!tc?.id || !tc.function?.name) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
blocks.push({
|
|
113
|
+
type: 'tool_use',
|
|
114
|
+
id: tc.id,
|
|
115
|
+
name: tc.function.name,
|
|
116
|
+
input: safeParseArgs(tc.function.arguments),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Anthropic requires a non-empty content array for assistant messages.
|
|
121
|
+
if (blocks.length) {
|
|
122
|
+
out.push({ role: 'assistant', content: blocks });
|
|
123
|
+
}
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (m.role === 'user') {
|
|
127
|
+
// Plain text user message. Content blocks aren't needed here.
|
|
128
|
+
const text = typeof m.content === 'string' ? m.content : '';
|
|
129
|
+
if (text) {
|
|
130
|
+
out.push({ role: 'user', content: text });
|
|
131
|
+
}
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
flushToolResults();
|
|
136
|
+
return { system: systemChunks.join('\n\n'), messages: out };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Translate an Anthropic Messages API response back into the OpenAI-style
|
|
140
|
+
* `{ content, tool_calls }` shape that our frontend already understands.
|
|
141
|
+
*/
|
|
142
|
+
function translateAnthropicResponseToOpenAI(response) {
|
|
143
|
+
if (!response || !Array.isArray(response.content)) {
|
|
144
|
+
return { content: '' };
|
|
145
|
+
}
|
|
146
|
+
const textParts = [];
|
|
147
|
+
const toolCalls = [];
|
|
148
|
+
for (const block of response.content) {
|
|
149
|
+
if (!block || typeof block !== 'object') {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (block.type === 'text' && typeof block.text === 'string') {
|
|
153
|
+
textParts.push(block.text);
|
|
154
|
+
}
|
|
155
|
+
else if (block.type === 'tool_use') {
|
|
156
|
+
const tu = block;
|
|
157
|
+
toolCalls.push({
|
|
158
|
+
id: tu.id || '',
|
|
159
|
+
type: 'function',
|
|
160
|
+
function: {
|
|
161
|
+
name: tu.name || '',
|
|
162
|
+
arguments: JSON.stringify(tu.input ?? {}),
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
const result = {
|
|
168
|
+
content: textParts.join('\n'),
|
|
169
|
+
};
|
|
170
|
+
if (toolCalls.length) {
|
|
171
|
+
result.tool_calls = toolCalls;
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=anthropicAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropicAdapter.js","sourceRoot":"","sources":["../../../src/lib/anthropicAdapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Translation layer between OpenAI-style chat-completion messages/tools and\n * Anthropic's native Messages API.\n *\n * The frontend (AiChatService / useAiChat) always speaks the OpenAI format:\n * - tools[] = [{ type: 'function', function: { name, description, parameters } }]\n * - assistant message with tool_calls[] = [{ id, type: 'function', function: { name, arguments } }]\n * - tool-result message with { role: 'tool', tool_call_id, content }\n * - response = { content, tool_calls? }\n *\n * Anthropic's API uses a different shape:\n * - tools[] = [{ name, description, input_schema }]\n * - assistant message content = [{ type: 'text', text }, { type: 'tool_use', id, name, input }]\n * - tool-result = user message with content = [{ type: 'tool_result', tool_use_id, content }]\n * - response body = { content: [text/tool_use blocks], stop_reason }\n *\n * These functions are pure so they can be unit-tested in isolation.\n */\n\nexport interface OpenAITool {\n type: 'function';\n function: {\n name: string;\n description?: string;\n parameters?: unknown;\n };\n}\n\nexport interface AnthropicTool {\n name: string;\n description?: string;\n input_schema: unknown;\n}\n\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n}\n\nexport interface OpenAIMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n tool_call_id?: string;\n name?: string;\n}\n\ntype AnthropicContentBlock =\n | { type: 'text'; text: string }\n | { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }\n | { type: 'tool_result'; tool_use_id: string; content: string; is_error?: boolean };\n\nexport interface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string | AnthropicContentBlock[];\n}\n\nexport interface AnthropicResponse {\n content?: AnthropicContentBlock[];\n stop_reason?: string;\n [key: string]: unknown;\n}\n\n/** Translate OpenAI function-tool definitions to Anthropic tool definitions. */\nexport function translateToolsToAnthropic(tools: unknown[] | undefined | null): AnthropicTool[] {\n if (!Array.isArray(tools)) {\n return [];\n }\n const result: AnthropicTool[] = [];\n for (const t of tools) {\n // Only `function`-type tools are supported. Anthropic uses a flat shape.\n const tool = t as OpenAITool;\n const fn = tool?.function;\n if (!fn?.name) {\n continue;\n }\n result.push({\n name: fn.name,\n description: fn.description,\n // OpenAI's `parameters` and Anthropic's `input_schema` share the JSON Schema shape.\n // If none is provided, Anthropic still requires an object schema.\n input_schema: fn.parameters || { type: 'object', properties: {} },\n });\n }\n return result;\n}\n\n/** Safe JSON.parse that returns an object on failure so we never throw mid-translation. */\nfunction safeParseArgs(args: string | undefined): Record<string, unknown> {\n if (!args) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(args);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n return {};\n } catch {\n return {};\n }\n}\n\n/**\n * Translate a flat OpenAI-style message array into Anthropic's content-block format.\n * System messages are extracted and returned separately (Anthropic takes `system`\n * as a top-level request field, not an inline message).\n */\nexport function translateMessagesToAnthropic(messages: OpenAIMessage[] | undefined | null): {\n system: string;\n messages: AnthropicMessage[];\n} {\n if (!Array.isArray(messages)) {\n return { system: '', messages: [] };\n }\n\n const systemChunks: string[] = [];\n const out: AnthropicMessage[] = [];\n // Pending tool-results that must be grouped into a single `user` message per Anthropic's rules.\n let pendingToolResults: AnthropicContentBlock[] = [];\n\n const flushToolResults = (): void => {\n if (pendingToolResults.length) {\n out.push({ role: 'user', content: pendingToolResults });\n pendingToolResults = [];\n }\n };\n\n for (const m of messages) {\n if (!m || typeof m !== 'object') {\n continue;\n }\n\n if (m.role === 'system') {\n if (typeof m.content === 'string' && m.content) {\n systemChunks.push(m.content);\n }\n continue;\n }\n\n if (m.role === 'tool') {\n // Tool results accumulate; they're flushed when the next non-tool message appears.\n pendingToolResults.push({\n type: 'tool_result',\n tool_use_id: m.tool_call_id || '',\n content: typeof m.content === 'string' ? m.content : JSON.stringify(m.content ?? ''),\n });\n continue;\n }\n\n flushToolResults();\n\n if (m.role === 'assistant') {\n const blocks: AnthropicContentBlock[] = [];\n if (typeof m.content === 'string' && m.content) {\n blocks.push({ type: 'text', text: m.content });\n }\n if (Array.isArray(m.tool_calls)) {\n for (const tc of m.tool_calls) {\n if (!tc?.id || !tc.function?.name) {\n continue;\n }\n blocks.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n input: safeParseArgs(tc.function.arguments),\n });\n }\n }\n // Anthropic requires a non-empty content array for assistant messages.\n if (blocks.length) {\n out.push({ role: 'assistant', content: blocks });\n }\n continue;\n }\n\n if (m.role === 'user') {\n // Plain text user message. Content blocks aren't needed here.\n const text = typeof m.content === 'string' ? m.content : '';\n if (text) {\n out.push({ role: 'user', content: text });\n }\n continue;\n }\n }\n\n flushToolResults();\n\n return { system: systemChunks.join('\\n\\n'), messages: out };\n}\n\n/**\n * Translate an Anthropic Messages API response back into the OpenAI-style\n * `{ content, tool_calls }` shape that our frontend already understands.\n */\nexport function translateAnthropicResponseToOpenAI(response: AnthropicResponse | undefined | null): {\n content: string;\n tool_calls?: OpenAIToolCall[];\n} {\n if (!response || !Array.isArray(response.content)) {\n return { content: '' };\n }\n const textParts: string[] = [];\n const toolCalls: OpenAIToolCall[] = [];\n for (const block of response.content) {\n if (!block || typeof block !== 'object') {\n continue;\n }\n if (block.type === 'text' && typeof (block as { text?: unknown }).text === 'string') {\n textParts.push((block as { text: string }).text);\n } else if (block.type === 'tool_use') {\n const tu = block as { id?: string; name?: string; input?: unknown };\n toolCalls.push({\n id: tu.id || '',\n type: 'function',\n function: {\n name: tu.name || '',\n arguments: JSON.stringify(tu.input ?? {}),\n },\n });\n }\n }\n const result: { content: string; tool_calls?: OpenAIToolCall[] } = {\n content: textParts.join('\\n'),\n };\n if (toolCalls.length) {\n result.tool_calls = toolCalls;\n }\n return result;\n}\n"]}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.astroListLow = exports.astroList = exports.monthShort = exports.monthFullGen = exports.monthFull = exports.dayOfWeeksShort = exports.dayOfWeeksFull = void 0;
|
|
4
|
+
exports.dayOfWeeksFull = {
|
|
5
|
+
en: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
|
|
6
|
+
de: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
|
|
7
|
+
ru: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
|
|
8
|
+
pt: ['Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado'],
|
|
9
|
+
nl: ['Zondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrijdag', 'Zaterdag'],
|
|
10
|
+
fr: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
|
|
11
|
+
it: ['Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato'],
|
|
12
|
+
es: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
|
|
13
|
+
pl: ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'],
|
|
14
|
+
uk: ['неділя', 'понеділок', 'вівторок', 'Середа', 'четвер', "П'ятниця", 'Субота'],
|
|
15
|
+
'zh-cn': ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
|
|
16
|
+
};
|
|
17
|
+
exports.dayOfWeeksShort = {
|
|
18
|
+
en: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
|
|
19
|
+
de: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
|
|
20
|
+
ru: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
|
|
21
|
+
pt: ['Do', 'Se', 'Te', 'Qu', 'Qu', 'Se', 'Sá'],
|
|
22
|
+
nl: ['Zo', 'Ma', 'Di', 'Wo', 'Do', 'Vr', 'Za'],
|
|
23
|
+
fr: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'],
|
|
24
|
+
it: ['Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa'],
|
|
25
|
+
es: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'],
|
|
26
|
+
pl: ['Ni', 'Po', 'Wt', 'Śr', 'Cz', 'Pi', 'So'],
|
|
27
|
+
uk: ['Нд', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
|
|
28
|
+
'zh-cn': ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
|
|
29
|
+
};
|
|
30
|
+
exports.monthFull = {
|
|
31
|
+
en: [
|
|
32
|
+
'January',
|
|
33
|
+
'February',
|
|
34
|
+
'March',
|
|
35
|
+
'April',
|
|
36
|
+
'May',
|
|
37
|
+
'June',
|
|
38
|
+
'July',
|
|
39
|
+
'August',
|
|
40
|
+
'September',
|
|
41
|
+
'October',
|
|
42
|
+
'November',
|
|
43
|
+
'December',
|
|
44
|
+
],
|
|
45
|
+
de: [
|
|
46
|
+
'Januar',
|
|
47
|
+
'Februar',
|
|
48
|
+
'März',
|
|
49
|
+
'April',
|
|
50
|
+
'Mai',
|
|
51
|
+
'Juni',
|
|
52
|
+
'Juli',
|
|
53
|
+
'August',
|
|
54
|
+
'September',
|
|
55
|
+
'Oktober',
|
|
56
|
+
'November',
|
|
57
|
+
'Dezember',
|
|
58
|
+
],
|
|
59
|
+
ru: [
|
|
60
|
+
'Январь',
|
|
61
|
+
'Февраль',
|
|
62
|
+
'Март',
|
|
63
|
+
'Апрель',
|
|
64
|
+
'Май',
|
|
65
|
+
'Июнь',
|
|
66
|
+
'Июль',
|
|
67
|
+
'Август',
|
|
68
|
+
'Сентябрь',
|
|
69
|
+
'Октябрь',
|
|
70
|
+
'Ноябрь',
|
|
71
|
+
'Декабрь',
|
|
72
|
+
],
|
|
73
|
+
pt: [
|
|
74
|
+
'Janeiro',
|
|
75
|
+
'Fevereiro',
|
|
76
|
+
'Março',
|
|
77
|
+
'Abril',
|
|
78
|
+
'Maio',
|
|
79
|
+
'Junho',
|
|
80
|
+
'Julho',
|
|
81
|
+
'Agosto',
|
|
82
|
+
'Setembro',
|
|
83
|
+
'Outubro',
|
|
84
|
+
'Novembro',
|
|
85
|
+
'Dezembro',
|
|
86
|
+
],
|
|
87
|
+
nl: [
|
|
88
|
+
'Januari',
|
|
89
|
+
'Februari',
|
|
90
|
+
'Maart',
|
|
91
|
+
'April',
|
|
92
|
+
'Mei',
|
|
93
|
+
'Juni',
|
|
94
|
+
'Juli',
|
|
95
|
+
'Augustus',
|
|
96
|
+
'September',
|
|
97
|
+
'Oktober',
|
|
98
|
+
'November',
|
|
99
|
+
'December',
|
|
100
|
+
],
|
|
101
|
+
fr: [
|
|
102
|
+
'Janvier',
|
|
103
|
+
'Février',
|
|
104
|
+
'Mars',
|
|
105
|
+
'Avril',
|
|
106
|
+
'Mai',
|
|
107
|
+
'Juin',
|
|
108
|
+
'Juillet',
|
|
109
|
+
'Août',
|
|
110
|
+
'Septembre',
|
|
111
|
+
'Octobre',
|
|
112
|
+
'Novembre',
|
|
113
|
+
'Décembre',
|
|
114
|
+
],
|
|
115
|
+
it: [
|
|
116
|
+
'Gennaio',
|
|
117
|
+
'Febbraio',
|
|
118
|
+
'Marzo',
|
|
119
|
+
'Aprile',
|
|
120
|
+
'Maggio',
|
|
121
|
+
'Giugno',
|
|
122
|
+
'Luglio',
|
|
123
|
+
'Agosto',
|
|
124
|
+
'Settembre',
|
|
125
|
+
'Ottobre',
|
|
126
|
+
'Novembre',
|
|
127
|
+
'Dicembre',
|
|
128
|
+
],
|
|
129
|
+
es: [
|
|
130
|
+
'Enero',
|
|
131
|
+
'Febrero',
|
|
132
|
+
'Marzo',
|
|
133
|
+
'Abril',
|
|
134
|
+
'Mayo',
|
|
135
|
+
'Junio',
|
|
136
|
+
'Julio',
|
|
137
|
+
'Agosto',
|
|
138
|
+
'Septiembre',
|
|
139
|
+
'Octubre',
|
|
140
|
+
'Noviembre',
|
|
141
|
+
'Diciembre',
|
|
142
|
+
],
|
|
143
|
+
pl: [
|
|
144
|
+
'Styczeń',
|
|
145
|
+
'Luty',
|
|
146
|
+
'Marzec',
|
|
147
|
+
'Kwiecień',
|
|
148
|
+
'Maj',
|
|
149
|
+
'Czerwiec',
|
|
150
|
+
'Lipiec',
|
|
151
|
+
'Sierpień',
|
|
152
|
+
'Wrzesień',
|
|
153
|
+
'Październik',
|
|
154
|
+
'Listopad',
|
|
155
|
+
'Grudzień',
|
|
156
|
+
],
|
|
157
|
+
uk: [
|
|
158
|
+
'Січень',
|
|
159
|
+
'Лютий',
|
|
160
|
+
'Березень',
|
|
161
|
+
'Квітень',
|
|
162
|
+
'Травень',
|
|
163
|
+
'Червень',
|
|
164
|
+
'Липень',
|
|
165
|
+
'Серпень',
|
|
166
|
+
'Вересень',
|
|
167
|
+
'Жовтень',
|
|
168
|
+
'Листопад',
|
|
169
|
+
'Грудень',
|
|
170
|
+
],
|
|
171
|
+
'zh-cn': ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
|
|
172
|
+
};
|
|
173
|
+
exports.monthFullGen = {
|
|
174
|
+
en: [
|
|
175
|
+
'January',
|
|
176
|
+
'February',
|
|
177
|
+
'March',
|
|
178
|
+
'April',
|
|
179
|
+
'May',
|
|
180
|
+
'June',
|
|
181
|
+
'July',
|
|
182
|
+
'August',
|
|
183
|
+
'September',
|
|
184
|
+
'October',
|
|
185
|
+
'November',
|
|
186
|
+
'December',
|
|
187
|
+
],
|
|
188
|
+
de: [
|
|
189
|
+
'Januar',
|
|
190
|
+
'Februar',
|
|
191
|
+
'März',
|
|
192
|
+
'April',
|
|
193
|
+
'Mai',
|
|
194
|
+
'Juni',
|
|
195
|
+
'Juli',
|
|
196
|
+
'August',
|
|
197
|
+
'September',
|
|
198
|
+
'Oktober',
|
|
199
|
+
'November',
|
|
200
|
+
'Dezember',
|
|
201
|
+
],
|
|
202
|
+
ru: [
|
|
203
|
+
'Января',
|
|
204
|
+
'Февраля',
|
|
205
|
+
'Марта',
|
|
206
|
+
'Апреля',
|
|
207
|
+
'Мая',
|
|
208
|
+
'Июня',
|
|
209
|
+
'Июля',
|
|
210
|
+
'Августа',
|
|
211
|
+
'Сентября',
|
|
212
|
+
'Октября',
|
|
213
|
+
'Ноября',
|
|
214
|
+
'Декабря',
|
|
215
|
+
],
|
|
216
|
+
pt: [
|
|
217
|
+
'Janeiro',
|
|
218
|
+
'Fevereiro',
|
|
219
|
+
'Março',
|
|
220
|
+
'Abril',
|
|
221
|
+
'Maio',
|
|
222
|
+
'Junho',
|
|
223
|
+
'Julho',
|
|
224
|
+
'Agosto',
|
|
225
|
+
'Setembro',
|
|
226
|
+
'Outubro',
|
|
227
|
+
'Novembro',
|
|
228
|
+
'Dezembro',
|
|
229
|
+
],
|
|
230
|
+
nl: [
|
|
231
|
+
'Januari',
|
|
232
|
+
'Februari',
|
|
233
|
+
'Maart',
|
|
234
|
+
'April',
|
|
235
|
+
'Mei',
|
|
236
|
+
'Juni',
|
|
237
|
+
'Juli',
|
|
238
|
+
'Augustus',
|
|
239
|
+
'September',
|
|
240
|
+
'Oktober',
|
|
241
|
+
'November',
|
|
242
|
+
'December',
|
|
243
|
+
],
|
|
244
|
+
fr: [
|
|
245
|
+
'Janvier',
|
|
246
|
+
'Février',
|
|
247
|
+
'Mars',
|
|
248
|
+
'Avril',
|
|
249
|
+
'Mai',
|
|
250
|
+
'Juin',
|
|
251
|
+
'Juillet',
|
|
252
|
+
'Août',
|
|
253
|
+
'Septembre',
|
|
254
|
+
'Octobre',
|
|
255
|
+
'Novembre',
|
|
256
|
+
'Décembre',
|
|
257
|
+
],
|
|
258
|
+
it: [
|
|
259
|
+
'Gennaio',
|
|
260
|
+
'Febbraio',
|
|
261
|
+
'Marzo',
|
|
262
|
+
'Aprile',
|
|
263
|
+
'Maggio',
|
|
264
|
+
'Giugno',
|
|
265
|
+
'Luglio',
|
|
266
|
+
'Agosto',
|
|
267
|
+
'Settembre',
|
|
268
|
+
'Ottobre',
|
|
269
|
+
'Novembre',
|
|
270
|
+
'Dicembre',
|
|
271
|
+
],
|
|
272
|
+
es: [
|
|
273
|
+
'Enero',
|
|
274
|
+
'Febrero',
|
|
275
|
+
'Marzo',
|
|
276
|
+
'Abril',
|
|
277
|
+
'Mayo',
|
|
278
|
+
'Junio',
|
|
279
|
+
'Julio',
|
|
280
|
+
'Agosto',
|
|
281
|
+
'Septiembre',
|
|
282
|
+
'Octubre',
|
|
283
|
+
'Noviembre',
|
|
284
|
+
'Diciembre',
|
|
285
|
+
],
|
|
286
|
+
pl: [
|
|
287
|
+
'Styczeń',
|
|
288
|
+
'Luty',
|
|
289
|
+
'Marzec',
|
|
290
|
+
'Kwiecień',
|
|
291
|
+
'Maj',
|
|
292
|
+
'Czerwiec',
|
|
293
|
+
'Lipiec',
|
|
294
|
+
'Sierpień',
|
|
295
|
+
'Wrzesień',
|
|
296
|
+
'Październik',
|
|
297
|
+
'Listopad',
|
|
298
|
+
'Grudzień',
|
|
299
|
+
],
|
|
300
|
+
uk: [
|
|
301
|
+
'Січень',
|
|
302
|
+
'Лютий',
|
|
303
|
+
'Березень',
|
|
304
|
+
'Квітень',
|
|
305
|
+
'Травень',
|
|
306
|
+
'Червень',
|
|
307
|
+
'Липень',
|
|
308
|
+
'Серпень',
|
|
309
|
+
'Вересень',
|
|
310
|
+
'Жовтень',
|
|
311
|
+
'Листопад',
|
|
312
|
+
'Грудень',
|
|
313
|
+
],
|
|
314
|
+
'zh-cn': ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
|
|
315
|
+
};
|
|
316
|
+
exports.monthShort = {
|
|
317
|
+
en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'],
|
|
318
|
+
de: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
|
|
319
|
+
ru: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июнь', 'Июль', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],
|
|
320
|
+
pt: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
|
|
321
|
+
nl: ['Jan', 'Feb', 'Maa', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec'],
|
|
322
|
+
fr: ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jui', 'Jui', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'],
|
|
323
|
+
it: ['Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu', 'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'],
|
|
324
|
+
es: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
|
|
325
|
+
pl: ['Sty', 'Lut', 'Mar', 'Kwi', 'Maj', 'Cze', 'Lip', 'Sie', 'Wrz', 'Paź', 'Lis', 'Gru'],
|
|
326
|
+
uk: ['Січ', 'Лют', 'Бер', 'Кві', 'Тра', 'Чер', 'Лип', 'Сер', 'Вер', 'Жов', 'Лис', 'Гру'],
|
|
327
|
+
'zh-cn': ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
|
|
328
|
+
};
|
|
329
|
+
exports.astroList = [
|
|
330
|
+
'sunrise',
|
|
331
|
+
'sunset',
|
|
332
|
+
'sunriseEnd',
|
|
333
|
+
'sunsetStart',
|
|
334
|
+
'dawn',
|
|
335
|
+
'dusk',
|
|
336
|
+
'nauticalDawn',
|
|
337
|
+
'nauticalDusk',
|
|
338
|
+
'nadir',
|
|
339
|
+
'nightEnd',
|
|
340
|
+
'night',
|
|
341
|
+
'goldenHourEnd',
|
|
342
|
+
'goldenHour',
|
|
343
|
+
'solarNoon',
|
|
344
|
+
];
|
|
345
|
+
exports.astroListLow = exports.astroList.map(str => str.toLowerCase());
|
|
346
|
+
//# sourceMappingURL=consts.js.map
|