odant-work 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/#system/package-manifest.json +54 -46
  2. package/$server/$folder/handlers/methods/create/$handler/class.js +83 -2
  3. package/$server/$folder/lib/icon/icon.js +14 -0
  4. package/$server/$folder/lib/node/node.js +51 -1
  5. package/$server/$folder/lib/tree/tree.js +5 -1
  6. package/.secretsignore +4 -0
  7. package/MODELS/$ai/$folder/$class/$ai/class.js +57 -2
  8. package/MODELS/$ai/$folder/$class/$provider/class.js +1 -1
  9. package/MODELS/$ai/$folder/$class/$provider/handlers/pages/form/provider/$handler/class.js +13 -0
  10. package/MODELS/$ai/$folder/$class/$provider/handlers/pages/form/provider/$handler/provider.js +479 -0
  11. package/MODELS/$ai/$folder/$class/$provider/handlers/pages/form/trainer/$handler/trainer.js +3 -3
  12. package/MODELS/GigaChat/$provider/$folder/$class/$ai/class.js +10 -20
  13. package/MODELS/GigaChat/$provider/class.js +10 -7
  14. package/MODELS/GigaChat/GigaChat 2 Lite/$ai/class.js +15 -0
  15. package/MODELS/GigaChat/GigaChat 2 Max/$ai/class.js +16 -0
  16. package/MODELS/GigaChat/GigaChat 2 Pro/$ai/class.js +15 -0
  17. package/MODELS/GigaChat/GigaChat Embeddings/$ai/class.js +13 -0
  18. package/MODELS/Local/$provider/$folder/$class/$ai/class.js +3 -3
  19. package/MODELS/Local/$provider/class.js +7 -3
  20. package/MODELS/MTS-AI/$provider/$folder/$class/$ai/class.js +8 -0
  21. package/MODELS/MTS-AI/$provider/class.js +8 -0
  22. package/MODELS/MTS-AI/Cotype Lite/$ai/class.js +15 -0
  23. package/MODELS/MTS-AI/Cotype Pro 2/$ai/class.js +15 -0
  24. package/MODELS/MTS-AI/Cotype Vision/$ai/class.js +14 -0
  25. package/MODELS/T-Bank/$provider/$folder/$class/$ai/class.js +8 -0
  26. package/MODELS/T-Bank/$provider/class.js +8 -0
  27. package/MODELS/T-Bank/T-Lite 2.0/$ai/class.js +15 -0
  28. package/MODELS/T-Bank/T-Pro 2.0/$ai/class.js +16 -0
  29. package/MODELS/T-Bank/T-VoiceKit ASR/$ai/class.js +13 -0
  30. package/MODELS/T-Bank/T-VoiceKit TTS/$ai/class.js +13 -0
  31. package/MODELS/Yandex/$provider/$folder/$class/$ai/class.js +9 -0
  32. package/MODELS/Yandex/$provider/class.js +9 -0
  33. package/MODELS/Yandex/Alice AI (YandexGPT 5 Pro)/$ai/class.js +15 -0
  34. package/MODELS/Yandex/Yandex Embeddings/$ai/class.js +13 -0
  35. package/MODELS/Yandex/Yandex SpeechKit ASR/$ai/class.js +13 -0
  36. package/MODELS/Yandex/Yandex SpeechKit TTS/$ai/class.js +13 -0
  37. package/MODELS/Yandex/YandexART/$ai/class.js +13 -0
  38. package/MODELS/Yandex/YandexGPT 5 Lite/$ai/class.js +15 -0
  39. package/MODELS/Yandex/YandexGPT Reasoning/$ai/class.js +22 -0
  40. package/oda/tools/icons/lib/svg/ai.svg +20 -0
  41. package/package.json +1 -1
  42. package/scripts/check-ignored-code.mjs +3 -0
  43. package/scripts/check-secrets.mjs +1 -1
  44. package/sources/data/progress.md +17 -0
  45. package/sources/host/auth-methods.js +32 -5
  46. package/sources/host/mail.js +93 -14
  47. package/sources/host/watch.js +13 -2
  48. package/sources/modules/agent/index.js +23 -2
  49. package/sources/modules/trainer/halogen.js +128 -29
  50. package/sources/modules/trainer/huggingface.js +11 -5
  51. package/sources/modules/trainer/index.js +135 -2
  52. package/sources/modules/trainer/providers.js +1213 -0
  53. package/sources/modules/user-profile/user-profile.js +7 -1
  54. package/sources/server/class.js +55 -3
  55. package/MODELS/GigaChat/GigaChat Light/$ai/class.js +0 -15
  56. package/MODELS/GigaChat/GigaChat Pro/$ai/class.js +0 -15
  57. package/MODELS/Halogen/$provider/$folder/$class/$ai/class.js +0 -11
  58. package/MODELS/Halogen/$provider/class.js +0 -16
  59. package/MODELS/Halogen/$provider/readme.md +0 -28
  60. package/MODELS/Halogen/Decider-NPU/$ai/class.js +0 -22
  61. package/MODELS/Halogen/Flux2-Klein-NPU/$ai/class.js +0 -21
  62. package/MODELS/Halogen/Qwen3-ASR-NPU/$ai/class.js +0 -21
  63. package/MODELS/Halogen/Qwen3-Embedding-NPU/$ai/class.js +0 -22
  64. package/MODELS/Halogen/Qwen3-Reranker-NPU/$ai/class.js +0 -21
  65. package/MODELS/Halogen/Qwen3-TTS-NPU/$ai/class.js +0 -26
  66. package/MODELS/Halogen/Qwen3.5-2B-NPU/$ai/class.js +0 -23
  67. package/MODELS/Halogen/Qwen3.8-Flash-Next/$ai/class.js +0 -31
  68. package/MODELS/Local/Flux-Image/$ai/class.js +0 -20
  69. package/MODELS/Local/Qwen3-0.6B/$ai/class.js +0 -26
  70. package/MODELS/Local/Qwen3-14B/$ai/class.js +0 -27
  71. package/MODELS/Local/Qwen3-30B-A3B/$ai/class.js +0 -30
  72. package/MODELS/Local/Qwen3-Embedding/$ai/class.js +0 -21
  73. package/MODELS/Local/Qwen3-Voice/$ai/class.js +0 -26
  74. package/MODELS/odant/$provider/$folder/$class/$ai/class.js +0 -11
  75. package/MODELS/odant/$provider/class.js +0 -75
  76. package/MODELS/odant/$provider/readme.md +0 -21
  77. package/MODELS/odant/Qwen3-ASR/$ai/class.js +0 -15
  78. package/MODELS/odant/Qwen3-TTS/$ai/class.js +0 -22
  79. package/MODELS/odant/Qwen3.8 27b/$ai/class.js +0 -11
  80. package/MODELS/odant/Z-Image-Turbo/$ai/class.js +0 -8
  81. package/MODELS/odant/Z-Image-Turbo/$ai/readme.md +0 -24
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "packageName": "odant-work",
3
- "version": "1.0.14",
4
- "createdAt": 1794496121532,
5
- "updatedAt": 1794496121532,
3
+ "version": "1.0.16",
4
+ "createdAt": 1794559540475,
5
+ "updatedAt": 1794559540475,
6
6
  "files": {
7
7
  "run.mjs": "f8918c612e8641e9beee06221be6680aa6fd21f25468451f2ac857fd51772266",
8
- "package.json": "443c5bd07f87efc2b1fbd21feb625a3487c8aaad1f860e48c54ec450ec7b4c78",
9
- "package-lock.json": "60f64bb33b571841eab4d17b256ec8c892a883c0e48cddb185d8839f98aa85f7",
8
+ "package.json": "2b13ee9e455102a8a42afee78a6c9044554d5eb78d27be7d68b71157da4ae8fc",
9
+ "package-lock.json": "e11f53e9ac6a408a737d33c78325c68a26a6c374950628fffaffec5edbfaf3ec",
10
10
  "sources/client/class.js": "c3fb8f143fc83aaa2df1ddeddd412d2d4dfe88656578095babe2df34fb3b3922",
11
11
  "sources/client/field.js": "ffdd50fa8b6ec515cc42da5fca96658ff2b20e274601a1f926e0031372467a19",
12
12
  "sources/client/file.js": "667101d75fa30840370d5be232e518aaac7c1fd52ca05a12da560eef6c0848b0",
@@ -26,7 +26,7 @@
26
26
  "sources/data/objects.js": "23f51d5b00cd766fe27879b874738bc9bd9056bd6e27285fb7a52926c0dbc6a8",
27
27
  "sources/data/posting.js": "6595bb9ec632539ae7629504db327d25a491e61c1cdc598bb43d08ea0d45548d",
28
28
  "sources/data/print.js": "704f0f2fc80c6466a4196e4650d763150cf9b592eab14ea67ece85d51100107c",
29
- "sources/data/progress.md": "ecfef8377c096ea3880f7363ae7a1fbc5333d60021a305a18a7afd51f0fd213b",
29
+ "sources/data/progress.md": "0aefc1754e7131484bab0c3c0870dc830c680f393d1d81820df1fb70b10705b7",
30
30
  "sources/data/readme.md": "593fa2ae07aa91bc26d7542275da6953a9cd419240a9a49e00cb62fb9d5d8e36",
31
31
  "sources/data/reports.js": "0330f404860fe2589a7d46a2f0fe690ca23249bd841a062a26718742d4fd11d6",
32
32
  "sources/data/schema.js": "2a598b33c9352e3b673639dda302caeb13620cf978960cbcaee906f7bb852d50",
@@ -34,14 +34,14 @@
34
34
  "sources/data/sql-inspector.js": "a3866597a5f926ef5a10220a315a4abe8ad3aeb2f39ae61a9c6c970df3fb70fd",
35
35
  "sources/data/time.js": "cb34c1137685e83265938bb007859dfc1fca3548588d1663ee01e1affc87a09a",
36
36
  "sources/data/workspace.js": "afbc007c16a26e86de2753794e0e7387218e97aba378047a5f37ea7961e3e921",
37
- "sources/host/auth-methods.js": "0686ddee70e7d20eae12a308403ca0563cc09df13fd1cc47c38043a6c001ad1b",
37
+ "sources/host/auth-methods.js": "d4cc34ea5b56bb314ea903c065706135e12ff685f69e6234658588c92d2c6509",
38
38
  "sources/host/auto-updater.js": "373f4d3a34029178a66afc0c9810bf5bf5d260235c41d743cbfbe596e6363cc6",
39
39
  "sources/host/babel-merge.js": "11d5b65cae03aeabd09f06f65bee78f6fd0131eab125cc87c0dcaaf2d10e08a5",
40
40
  "sources/host/config.js": "f41058d2ef46afc0ac5e262a0f31064d3288ab3794c4d45c0761498e775f60ae",
41
41
  "sources/host/email-utils.js": "618f474b92c85675aeeb7584c1ef7d73441b9efc1463b9b836e7facb86e5d558",
42
42
  "sources/host/http-server.js": "0d7329faafd8c83e9c327375e70c5b6e0a12fc9e73007895bd5e2ac2a6aa74de",
43
43
  "sources/host/index-db.js": "73ffe2cc8eb4ea81ab0ec9ce46d977336ae26019c100d36f0adc7120498b5d72",
44
- "sources/host/mail.js": "7041e6d1429d2176811facaff03ece33dc36baee79dcd59180724f246c360da2",
44
+ "sources/host/mail.js": "a494edb01f645bb308bfb4da6f43b1c51b388cc57aaa6d05ae12ffa10e143d78",
45
45
  "sources/host/net-guard.js": "87c4412f01c86d16347588578e7e955d6edaadf9b0a3361ba37d4e6f20ddb3f0",
46
46
  "sources/host/package-install.js": "2c3b651c744215bdfc9286f7f7c55b33b898ca8d2243406d3020a455971ef76d",
47
47
  "sources/host/prewarm.js": "14ff16e4858b580fd7b8bd6b2942913c6cf7605681144b998e058424422a2e68",
@@ -53,7 +53,7 @@
53
53
  "sources/host/stun.js": "1d635659569d92f0059ed469e2974d9c8ee79e6c29bafdb6deaa3b7c4de6f57e",
54
54
  "sources/host/tls-ca.js": "df380b1b308447012907cb9a9ebe2cf7442cb8a2c9d8941bae4eaeaead50d349",
55
55
  "sources/host/vapid.js": "e31b865e17d723f9b0f44ca412d77c3c4b972920b661633d4d96875a728de119",
56
- "sources/host/watch.js": "31e1e9cf74ca01bf876fc1a35e99c7ed70687268a400ed97f6306646f3c89b82",
56
+ "sources/host/watch.js": "a2c7c771390da2b0b55105652f5809a5a6a85ac0d140d5c0cd78debfe7fd1695",
57
57
  "sources/host/websocket.js": "ca0a791f319f6bd219a2291b60adf30f98cec282b8711df4ec47b7ddee152d4b",
58
58
  "sources/index.html": "ebe5d6b055671c23a80ba8fad303415f6396559d2dbbfd84266f4914d21095af",
59
59
  "sources/manifest.json": "288e8f4279176927a7c448f8a1f27d1dc40e22e2412f1341d18c16ff83fb181d",
@@ -64,7 +64,7 @@
64
64
  "sources/modules/agent/eval.js": "91f907554630ad53c30d5c1d760bb646bb4dbd10ec854a69453d002368ce25cc",
65
65
  "sources/modules/agent/extensions.js": "a2549960cbfece9698c730506b05e2db9bd5b12434fc29156cb391dc566ec643",
66
66
  "sources/modules/agent/hooks.js": "b74e9d8f4b491b6d16d979891de69941955e50852289f55589c82997405c9048",
67
- "sources/modules/agent/index.js": "e19fe28c69870932eea24676eeb1961f5aae0f15f0c808158cb977cbe6028d4c",
67
+ "sources/modules/agent/index.js": "0fe7348bb4e886d0c7e3aabb03bb5b9650a11058472c83e0ededbf4d77928f7d",
68
68
  "sources/modules/agent/log.js": "03ae1979e2b00459178deda49847c30ed75937fc4f3eea9b778ca6c0f8c4ded0",
69
69
  "sources/modules/agent/loop.js": "32849b7e7048720da8201dd7a85a09bfe4f8cbd82eb30215258632de2505e0fa",
70
70
  "sources/modules/agent/mcp-pool.js": "aa4e75e2fcfe07883f9b721b33cee642fbbe11b8f416f8cd6a81f9c1ab39edde",
@@ -165,14 +165,15 @@
165
165
  "sources/modules/sandbox/stream.js": "bfa74c918642e4fa5af170fdde52d825865f4fd09f771da5305898ac4738d4de",
166
166
  "sources/modules/sandbox/vnc-proxy.js": "1c75c2b24d579f254de1c4727621fbbcc7e8a10360f638f4cf1c4bd91184d103",
167
167
  "sources/modules/trainer/dataset.js": "ca91f11249ccf4fce9c15dc780711fa33059a3e1efbaf0ccdbbd59e529b0108e",
168
- "sources/modules/trainer/halogen.js": "111eed81f4433b745b433c21827b3df0e97df8e6d5fe6c9d05e9f4918882f092",
169
- "sources/modules/trainer/huggingface.js": "5dc9ec37a7ac7215e4df9dff69a3047c2c6ca749f85bb69a80e810b2df65d861",
170
- "sources/modules/trainer/index.js": "69b4ebd7a4f91dc041a53789129abc1f5f52d687989e63a7bb4d2ca1e225facb",
168
+ "sources/modules/trainer/halogen.js": "c3f51d41d86331b83b888e807fb0db973f116fc4e8d7f81f4b1ea7aaa1100129",
169
+ "sources/modules/trainer/huggingface.js": "f6db6b1ea97969360005cdfc9ae485c1dc519af28d175d0df1a486959408bc3a",
170
+ "sources/modules/trainer/index.js": "6400a6e9b2d6330a7746a84a21cad92768ad6963ed7322d2103f85cfc2a9fe4c",
171
171
  "sources/modules/trainer/local-engine.js": "86d65f778451c2de6e820079a3e703b24889ff80f949f14c0926f2e8f2280f20",
172
+ "sources/modules/trainer/providers.js": "18e075140bb14a9dd2ef70412942a03558d415abab9387d1d42c39f8c422b073",
172
173
  "sources/modules/trainer/runner.js": "c0b7c3cacc7cd6d4965f9ad54e928dd3c97a36c3fd2cd06eb60cab67f247553b",
173
174
  "sources/modules/trainer/worker/local_infer_worker.py": "7b001d75c64ac3ae6de650f6d738f22bfc21b6bd0694b57248e5b40966deb443",
174
175
  "sources/modules/trainer/worker/unsloth_train.py": "7774d94ffa6f60eed20c57a8dfdc12621d5d9f74d594c605dff32ff70e321e33",
175
- "sources/modules/user-profile/user-profile.js": "da4576239917461677610f8f0d28745d79735a8fb45aedb0aff377debda6dcb4",
176
+ "sources/modules/user-profile/user-profile.js": "47b71574ec51e6d40e218e996c8397b25f36418f21e69668c75f1df7d64eb914",
176
177
  "sources/odant.png": "b0c0d28bb28125dac7e1305bca10569fb055d856261455d336931bc57a4705c1",
177
178
  "sources/page.html": "18ec691a53f9be9611e7be665e138ca5490fb15e16ce42a1b47f79b8fe2310d3",
178
179
  "sources/reactor.js": "0fe03b19227d511a806ac0d25432c18bdbc9b9d439eaec3c1f7667586238805b",
@@ -192,7 +193,7 @@
192
193
  "sources/server/class/script.js": "146ef61b5a55201c34f80de4bbfcb116922f03348773548c041bdba0e53aba64",
193
194
  "sources/server/class/search.js": "c3d50a82769d65cfabdc0b83c73c289cec212ac5feb685aec4b1489b206546dd",
194
195
  "sources/server/class/security.js": "2c1532c5d549aa23903eecd23ea2ed678430e7198543b6d2d85d675614803a83",
195
- "sources/server/class.js": "1d0d8910de5bae2ab5c3fe5181795ccebd6dca96266536146eaaa969181968cd",
196
+ "sources/server/class.js": "ad3f7679608ac6876b0d9cac427298e6c58c29251c13273cc35a4e8200de74c3",
196
197
  "sources/server/external-source.js": "a576a42d380dc2f4688f5c7b0bcb4ca5e0870c55cd8900b34e9ba4d71eb6eb38",
197
198
  "sources/server/file.js": "4ff9c5ff372824a937d4d6782851b0c8ead0c830eb94176e5802bc90fc4ed4a1",
198
199
  "sources/server/folder.js": "fc2adff051707db4d4531fcc19f03882ef4e8e64d15c47617b70674c1fe90037",
@@ -473,7 +474,7 @@
473
474
  "oda/tools/icons/icons-tree/index.html": "31a0c951ab32300fea3c91bd08ba4cc016736490b56264c12f229c1abc0560c6",
474
475
  "oda/tools/icons/index.html": "c3b326a2e0ba3eb6fac26451d4899fe1812649118121649f1d71425ab0dffd36",
475
476
  "oda/tools/icons/lib/png/favicon.png": "b0c0d28bb28125dac7e1305bca10569fb055d856261455d336931bc57a4705c1",
476
- "oda/tools/icons/lib/svg/ai.svg": "39a310a2fa1ec2b8ae3f63b89dd9ace24d276f379de2beaab2d7cb92a8cbf5b5",
477
+ "oda/tools/icons/lib/svg/ai.svg": "d3f9c65044a4383485120d5d1bd6f6551bfc3933045a5c9965dcf4779ca0c24d",
477
478
  "oda/tools/icons/lib/svg/av.svg": "7772d30171d364095266e622dfd2187d2d151b85ad8fa6a48cda3d336f0df0b7",
478
479
  "oda/tools/icons/lib/svg/aws.svg": "513d56fa9d0b7505b5085f4325c5868e716098520096aa00704dd5f69b86e9ca",
479
480
  "oda/tools/icons/lib/svg/bootstrap.svg": "bd0c9999b629f85d1250ba64519efa5a1bb8b4b7cd9114cec9b28792bc8e2beb",
@@ -742,7 +743,7 @@
742
743
  "$server/$folder/$file/handlers/pages/form/file/$handler/file.js": "9c28973816455b2e9cf5ed2d49ba068ecb30ddfe0a4a64f9a44cc7e2bb191640",
743
744
  "$server/$folder/$file/readme.md": "918e364aff65c38eda063ad5b30cef761cb64bed7fe3a7e4861d05660ecfe209",
744
745
  "$server/$folder/class.js": "db3674dc9551abb5924c63dcac783597dd964d8aa62344d7ce076dabab8c54cb",
745
- "$server/$folder/handlers/methods/create/$handler/class.js": "ad622959c18e13d9bbef8978f4458a4a902fe5a60e21dd271df572cf55635d73",
746
+ "$server/$folder/handlers/methods/create/$handler/class.js": "8bcaf5a66d5f19e449a72ee1ac1dfe286964a1d188688bbda4cd0d29ed12852c",
746
747
  "$server/$folder/handlers/methods/create/progress.md": "d7a61baaf02afda1f0b65883a809ceed4e59fe5ff01b6471806d3f2b08ef27cf",
747
748
  "$server/$folder/handlers/methods/help/$handler/class.js": "ff54bf976cbdc846d7c1b46ff12b111e99a3f4831240a4e420b73c98c0355a5c",
748
749
  "$server/$folder/handlers/methods/info/$handler/class.js": "8752efb28abdcfad4e8ce56cfebcd8bb09ec0735cba7b84156d248bfcb0f9db0",
@@ -764,7 +765,7 @@
764
765
  "$server/$folder/lib/email/settings.js": "25e13ecf12b84e5fd6bcac955b1e0dc47bf09b72a98776e8ce1e1f01617aef9d",
765
766
  "$server/$folder/lib/explorer/explorer.js": "004ccf62ce909a839c169626e0554d3d390d7d4926779c1ae25590aaed009bdb",
766
767
  "$server/$folder/lib/file-viewer/file-viewer.js": "b183fd61b72fcc7baba3e44e16ddf3800553596313711a7bc4dd91f3e1e260ab",
767
- "$server/$folder/lib/icon/icon.js": "c80f61c1b5ae0039b8f7f4e1b39e41f632f67355a8fceee2ad4513d9bdef6409",
768
+ "$server/$folder/lib/icon/icon.js": "fdb15cf37421b60d3362f3c47a2a759a2faafe194547841718ad448df36462d0",
768
769
  "$server/$folder/lib/icon/user/user.js": "481da79de754c244f0151c91d03a503c0452902575e4dc8bc2b3171c0fad3a2e",
769
770
  "$server/$folder/lib/item-data-grid/item-data-grid.js": "c9650e7d09dd8a558e5f288da527d74c65267fa563a7006cf86222dc25198b54",
770
771
  "$server/$folder/lib/item-data-grid/readme.md": "2a9f5703b83945884992120560baf9187aabde045d55026716579212a5930575",
@@ -774,7 +775,7 @@
774
775
  "$server/$folder/lib/menu/progress.md": "f88ee7fde608ec00a9f2459e11b28328c0c6003f1b365b919c3dd9004296c86a",
775
776
  "$server/$folder/lib/menu/readme.md": "2fcd2b1b905ac9cd25264da2cef02d53d181e97b9d02c16772770de82b756eba",
776
777
  "$server/$folder/lib/messenger-settings/messenger-settings.js": "0e6237d9724ae4fd33327f9a521b26e698d7b40074d39402d1f4812ad2fbe085",
777
- "$server/$folder/lib/node/node.js": "fbc9c8a8f9db5888c4b6e88bdcc8100687a50fac3068c274148b94f2d30ba62d",
778
+ "$server/$folder/lib/node/node.js": "fc865f897cf78d72875ee211a17e1d8b5bd1ccad9b76adcf57551f9e1e328657",
778
779
  "$server/$folder/lib/node/progress.md": "eaada60a7d4f72a913369fda6cdad0abb3c8156215eec4d6bd9211f1ccc441ba",
779
780
  "$server/$folder/lib/node/readme.md": "ea9b82dc0db4af289b08d2e41399124310cee089cfab5d2107663ee314a23741",
780
781
  "$server/$folder/lib/node-explorer/node-explorer.js": "7f30a60186e5aa81d93ceabade522656403066320f3fa439f6a490049270269e",
@@ -796,7 +797,7 @@
796
797
  "$server/$folder/lib/tree/link-nodes.js": "e475b4a61d68829d07d5cc57dacfd030c957873429979b40a29a3947805e19af",
797
798
  "$server/$folder/lib/tree/progress.md": "4a9a6aafcb044e3cf2048d46e13be7f9afcb1abc6e5c6b0ff17a82e3491e5c08",
798
799
  "$server/$folder/lib/tree/readme.md": "b5103d0db4232be33f34d2bcc2de7ba93bcd4632982db223abccc8481b328994",
799
- "$server/$folder/lib/tree/tree.js": "e7cd6c136850fd08133e036ac7507b410e39d9ee0f0db26f0999da1d0038e104",
800
+ "$server/$folder/lib/tree/tree.js": "3d0ef6d1fea90e99e398e0d9c68d44c96d7e014cee9d6e6bb6760d115ffe4fc5",
800
801
  "$server/$folder/readme.md": "94c1e2fd7228a028f0d01fe49bc3e8389308fede3f74ccf80c030ad1dbbc5f86",
801
802
  "$server/class.js": "11e5d32e975eea2bee2d023380d1fbe4f789da7904ce1ba15441dda3af3988b8",
802
803
  "$server/readme.md": "4dc70978c6705899a01d0c441e73f6c14ec8f265007cf4c177d1d7c7d412b06a",
@@ -952,40 +953,32 @@
952
953
  "MODULES/Register/STRUCTS/Банковский счёт/$struct/class.js": "166ffafd1c7d1609b174ae7766e77842e6294c6902baabe787225a2eeb026cce",
953
954
  "MODULES/Register/STRUCTS/Единица измерения/$struct/class.js": "dd0982281ed782d23afd80d5985b79aa65c6acbe58dc080f943840ea798000b0",
954
955
  "MODULES/Register/STRUCTS/Паспорт/$struct/class.js": "4a50808e4db7741b0384a775177545d71686a680ccda7ef0ec68bf81f9c988b5",
955
- "MODELS/$ai/$folder/$class/$ai/class.js": "e5641223c2efc1d6790c738d9aae5413a1c6aa664758d65ef617e498f11f6c97",
956
+ "MODELS/$ai/$folder/$class/$ai/class.js": "d62cbc64250264124257d0be0b40a7acdd8944977bb1388cf3a27a47433eea5a",
956
957
  "MODELS/$ai/$folder/$class/$ai/handlers/pages/form/trainer/$handler/class.js": "34f4b901eb66adc5351dadd3682cfeccd535015a3fb24f6172c5bf60f9410bb0",
957
958
  "MODELS/$ai/$folder/$class/$ai/handlers/pages/form/trainer/$handler/trainer.js": "7bfd1e8234dae74d2a7d7bdc6c3dcaa7b22605d88f337a8939d240f49763b9e5",
958
959
  "MODELS/$ai/$folder/$class/$ai/methods/chat/$method/class.js": "a5859e701c8ea25c627247e6e6ae5d32115ba2f027a5fedea62ed1c7df0110ac",
959
- "MODELS/$ai/$folder/$class/$provider/class.js": "d66c1dac890372ff5444bf0960e30a12a96ddf7dfe3eab8b135181b0178d05f9",
960
+ "MODELS/$ai/$folder/$class/$provider/class.js": "069073501b93a95bb9d77e59ce71e53c7a8bcab2564c391b551f68a2453ac486",
961
+ "MODELS/$ai/$folder/$class/$provider/handlers/pages/form/provider/$handler/class.js": "04eec8a4ea16de9cb78c4f23f6d18fa0d3a2fa33904d4615851cefc7c4207799",
962
+ "MODELS/$ai/$folder/$class/$provider/handlers/pages/form/provider/$handler/provider.js": "b9ddf0040a9cd12e0dacd2dd3a61a1f0e62686cc664d02ef446326bc3991f4ce",
960
963
  "MODELS/$ai/$folder/$class/$provider/handlers/pages/form/trainer/$handler/class.js": "d32d305514a817d6688bed8037924231e4a656f685bf0ec0c9be720986908af4",
961
- "MODELS/$ai/$folder/$class/$provider/handlers/pages/form/trainer/$handler/trainer.js": "18f4925357d30a9056198da01220392e6469ca27d0d5378f550c380b37126693",
964
+ "MODELS/$ai/$folder/$class/$provider/handlers/pages/form/trainer/$handler/trainer.js": "e9001ac77032351e69cc30a85c891aed5db96638281563baf7d556a19e46127b",
962
965
  "MODELS/$ai/$folder/$class/$provider/readme.md": "d6ceef2010231ab121510c3d3f35630dd7009a069c7723f6673a0e264799b227",
963
966
  "MODELS/$ai/class.js": "54e1bbbde88f8b1f272ff7f5cad87243407591748a44719b7ec90ae2b4962de7",
964
967
  "MODELS/$ai/readme.md": "90d70305a2c85312282cf67cc468a0f0b417495cb3d5b3d2ca60c6f44b81cb77",
965
- "MODELS/GigaChat/$provider/$folder/$class/$ai/class.js": "460ad9b84dd404932af79e4c56660fab4bf11246e2812d480e9785a2a06f637e",
966
- "MODELS/GigaChat/$provider/class.js": "81b08ade5d7c3aa16808bed33d9b5fffa2f31fb8e808c1fca357147e144bb1a2",
968
+ "MODELS/GigaChat/$provider/$folder/$class/$ai/class.js": "18f26a4811981973cbf5f90584177028c44ce04fe9ecf4b5e546dccdbbd330d8",
969
+ "MODELS/GigaChat/$provider/class.js": "b0307041814ce2435d7fbc6ddea4f03b4640a7633b36d24a5fef6b3ced45190f",
967
970
  "MODELS/GigaChat/$provider/readme.md": "e5e1295a5660e25be639859bc22b1077d3c0567179bdccdfd1e6576edf709232",
968
- "MODELS/GigaChat/GigaChat Light/$ai/class.js": "60383c3db3d9417c32948f647ec31397d8decee3e26a3f07e4eb581ef1136f5f",
969
- "MODELS/GigaChat/GigaChat Pro/$ai/class.js": "b992bfe6fa19f07d6254b50844f16c1fdcc5e0aa6eb0d5fffb6d9af1670e4e66",
970
- "MODELS/Halogen/$provider/$folder/$class/$ai/class.js": "726a4a4c4725c35f35da88ad1397320510d0da7c431a0a80e747008d78bb82bb",
971
- "MODELS/Halogen/$provider/class.js": "f2d4db6c4a598da86c2684542ff3d594b84c9031f6bf79ba834e54deda528f91",
972
- "MODELS/Halogen/$provider/readme.md": "e70505c0f72b8fbb7c56981da6028f301fb028eec59173b57ee81c4c48a93ee2",
973
- "MODELS/Halogen/Decider-NPU/$ai/class.js": "aa52522d8559b2d4afa80e4c7de58742781d312f6ec36fec4a3febc9332e4ad0",
974
- "MODELS/Halogen/Flux2-Klein-NPU/$ai/class.js": "15a6afb68c5b9b6c1322113c4f4fedafe448ed4a82b145c5ec579574e62cab29",
975
- "MODELS/Halogen/Qwen3-ASR-NPU/$ai/class.js": "f49639df19fc3ef3c968d99136998251150f0af93df749929fe8094dd62e712d",
976
- "MODELS/Halogen/Qwen3-Embedding-NPU/$ai/class.js": "321148f253246a06c91d18cc269efb8975e1ebb3dc836f858db386f44466afaf",
977
- "MODELS/Halogen/Qwen3-Reranker-NPU/$ai/class.js": "eefed81229ca723054e96c217b49c4d4ffac5d230bf0707576543032550322f7",
978
- "MODELS/Halogen/Qwen3-TTS-NPU/$ai/class.js": "caca9391a178b5c86bf48a568ca412b05b4a348d38063b3718a5795cf8e8b446",
979
- "MODELS/Halogen/Qwen3.5-2B-NPU/$ai/class.js": "33a8a2766c34f8f09878b3fc48167e0f122a6d34325be890d676a813f1b3bcf4",
980
- "MODELS/Halogen/Qwen3.8-Flash-Next/$ai/class.js": "a835cffa0cadb44bebbd4ce1d415286278a1d8661b46d763190e233bca35b1fc",
981
- "MODELS/Local/$provider/$folder/$class/$ai/class.js": "54e2e78ce96be457785787816a6aa97a8dfa1b806652d7094d24afab69805e41",
982
- "MODELS/Local/$provider/class.js": "fcd222cef6999bb6cc2ab7e332ddafe891f077708baa5f3c765f47fcce78dc82",
983
- "MODELS/Local/Flux-Image/$ai/class.js": "f3982ea389f2cc649104d11f91d8a30bb0df4594f4327478aa90dfea7202e529",
984
- "MODELS/Local/Qwen3-0.6B/$ai/class.js": "69eeaa4989493ecbe914e570ba06cf97d5fc7a8fd6630f6b1b7e4323ce79876e",
985
- "MODELS/Local/Qwen3-14B/$ai/class.js": "55abd8abbdbb4b183c9daf940405ad3e5ed03a13b16dcd45e75adc438468e51e",
986
- "MODELS/Local/Qwen3-30B-A3B/$ai/class.js": "3d079091c0e555cc8d830e43625673d72607441f27a63d329c32145f8b30af3d",
987
- "MODELS/Local/Qwen3-Embedding/$ai/class.js": "cca23ada32a19cecccdcedfddbcffa9bc8124133be3c7e488b5fdd9c5262d991",
988
- "MODELS/Local/Qwen3-Voice/$ai/class.js": "5dd433b1804a493352190d3d1a33dfd290cadbe32e0d1aeba0a8eedfbaf9427b",
971
+ "MODELS/GigaChat/GigaChat 2 Lite/$ai/class.js": "54f380e3d32a517004a56f09fa51ab4019c9f4ba1e44ded69245db326b047bbb",
972
+ "MODELS/GigaChat/GigaChat 2 Max/$ai/class.js": "20d110d2c6a16ba78be667f798220f82802f1bc171c4a56d49bfe78c037843b5",
973
+ "MODELS/GigaChat/GigaChat 2 Pro/$ai/class.js": "c4f4e712ec6053b68cf4a789e6a82d044af7cb4f2bbae6ccc6ef0b1fe388dd56",
974
+ "MODELS/GigaChat/GigaChat Embeddings/$ai/class.js": "f68c9ca4f7aefa287a34ebfd8522866ba3b10ad500ee01727cae8687e9858b64",
975
+ "MODELS/Local/$provider/$folder/$class/$ai/class.js": "15862b03c00e3a0fbde31fdcbe173c3c782dbe28dc9e97d731dc1440da5ba448",
976
+ "MODELS/Local/$provider/class.js": "3b84fc08067fe682b012a091906b008eb88ba4f524423c4fa4cdb1046e6e56f0",
977
+ "MODELS/MTS-AI/$provider/$folder/$class/$ai/class.js": "cbb38faf8f50df3ca48aba16e5b71078e1280aa756dc61a9a510eb14c8269d55",
978
+ "MODELS/MTS-AI/$provider/class.js": "024d943c3c5d45e83a9a2022311033ed2bb3832da25b77e972d6fa7bf2250ff9",
979
+ "MODELS/MTS-AI/Cotype Lite/$ai/class.js": "7f7e7e94a0fc7eea1397fa6f0ed3926997872fff410a7b8051a637fe6d8c9693",
980
+ "MODELS/MTS-AI/Cotype Pro 2/$ai/class.js": "b4af5218c13fd09a6a60696438dda43f09994ea47e92241e44b3061b6336a90a",
981
+ "MODELS/MTS-AI/Cotype Vision/$ai/class.js": "4f514999e9db7cc9d6b49706d52f6736c0477b68e7f44d7f8fce7edb025ff500",
989
982
  "MODELS/odant/$provider/$folder/$class/$ai/class.js": "f12326995202d1129fa300f8b2e902a7504f4612a1bdd2dcfe2931d860dbd46d",
990
983
  "MODELS/odant/$provider/class.js": "277c7f5ad5c9571d7fe745d6903e8d3dcd9ff3793ca7697cce252d47310aff7f",
991
984
  "MODELS/odant/$provider/readme.md": "5e33b6707fc63d244ed94387bd8913c54125a982631d9c98b7a07d22a155ff7d",
@@ -994,6 +987,21 @@
994
987
  "MODELS/odant/Qwen3.8 27b/$ai/class.js": "a631d27b1fd21e6040fe384492f1d4420ed967ef8de7d2647a4036a6e28308b3",
995
988
  "MODELS/odant/Z-Image-Turbo/$ai/class.js": "050a44f8c8ec40d30baa942c975fcce2c14038f2b49e51ac99bb1a7ef4880fe9",
996
989
  "MODELS/odant/Z-Image-Turbo/$ai/readme.md": "6908ccb685c46c87e755a59fad9a5432f291157387ef6ce5ffda3946d992907e",
990
+ "MODELS/T-Bank/$provider/$folder/$class/$ai/class.js": "711884c4ce8fb419e0db41f939fc6666feb5fea0b9ef9056430f7f4f7a65f83f",
991
+ "MODELS/T-Bank/$provider/class.js": "afa9f0b7d9a81694b9109d6551ccf994a22c05b205436514d7f02870950c27f6",
992
+ "MODELS/T-Bank/T-Lite 2.0/$ai/class.js": "0e0f27a7a5118dec51f89fc1ba1a1bf97c05eb58036726e4f2f8925eaea14ee6",
993
+ "MODELS/T-Bank/T-Pro 2.0/$ai/class.js": "6e9ce6e7c36f05a0ef3f743481d4da87ed07d430a3d7b269b94ec7501cf6e5e3",
994
+ "MODELS/T-Bank/T-VoiceKit ASR/$ai/class.js": "e7e698c99ef85942d50f3f011e545f0b374048318a28635144e6164dcca919f5",
995
+ "MODELS/T-Bank/T-VoiceKit TTS/$ai/class.js": "77960623abea5bf933c3f556979a0bc48744055647bd10e028fc0ed68ab2677c",
996
+ "MODELS/Yandex/$provider/$folder/$class/$ai/class.js": "1b4baa0450479b9989cb421b7495a6ab0b20cdd76e956974192d6c729749d3ae",
997
+ "MODELS/Yandex/$provider/class.js": "4e631d75c94d26703abfd91b7abeea940edc70d36b171629393e2bfae5c88803",
998
+ "MODELS/Yandex/Alice AI (YandexGPT 5 Pro)/$ai/class.js": "1c82582931793f817d5bc24bd9bae603fe7f711c65f768600f20e6fa0e658acd",
999
+ "MODELS/Yandex/Yandex Embeddings/$ai/class.js": "9ab00d13b015a8948a83e66ff6499b4a6979218618b46c986f7c43f8b48b07c3",
1000
+ "MODELS/Yandex/Yandex SpeechKit ASR/$ai/class.js": "50a5db359de6e0843258fcdfb452c40e75c0a544e151ed29358a7b6f70a54891",
1001
+ "MODELS/Yandex/Yandex SpeechKit TTS/$ai/class.js": "81394db5d4de46e83e504c5a5b0ed26f5d87c44931f14303850d84fb0e9ef9eb",
1002
+ "MODELS/Yandex/YandexART/$ai/class.js": "46b4c897128192a9fe2b31728780b1171c0e9d4b52c86dff708c03813cf4df8d",
1003
+ "MODELS/Yandex/YandexGPT 5 Lite/$ai/class.js": "d50bd9ecbf4080c7b05a97a93c34cf16f65611278b61e5ba33964c41e93a734f",
1004
+ "MODELS/Yandex/YandexGPT Reasoning/$ai/class.js": "f96ec889c07d9b676d329eeed373a8603002682cfd7d4225896d13a55126e31c",
997
1005
  "SERVICES/$service/$folder/$storage/$service/class.js": "b00df43ea83a31b243fc8c899b8a6d949e47849c48dc03241cb78b9b9fda1f26",
998
1006
  "SERVICES/$service/$folder/$storage/$service/handlers/pages/form/mcp/$handler/class.js": "f59282ed99bd8d1483f9c6162a635f326c4224d7ffec9daa64dc2c22305034a5",
999
1007
  "SERVICES/$service/$folder/$storage/$service/handlers/pages/form/mcp/$handler/mcp.js": "592e046e3e125e703a9c3373be1316dc4fd07a15397c86d04e3f195e8e7e6813",
@@ -14,12 +14,15 @@ export default {
14
14
  async execute(filter) {
15
15
  const $context = await this.$item.$context;
16
16
  const isOrgsRoot = $context?.path === '/ORGANIZATIONS';
17
+ const isModelsRoot = $context?.path === '/MODELS';
17
18
  const props = {
18
19
  $item: $context,
19
- name: isOrgsRoot ? 'Моё предприятие' : 'new',
20
+ name: isOrgsRoot ? 'Моё предприятие' : (isModelsRoot ? 'OpenAI' : 'new'),
20
21
  message: isOrgsRoot
21
22
  ? `Введите название организации и выберите уровень наполнения`
22
- : `Введите имя создаваемого item'а и выберите тип`,
23
+ : isModelsRoot
24
+ ? `Выберите шаблон провайдера ИИ или укажите свой сервер`
25
+ : `Введите имя создаваемого item'а и выберите тип`,
23
26
  filter,
24
27
  'name-changed': (e) => {
25
28
  e.target.parentElement.enable = !e.target.validity
@@ -71,6 +74,21 @@ export default {
71
74
  if (Array.isArray(el.selectedModules))
72
75
  createParams.modules = el.selectedModules.join(',');
73
76
  }
77
+ else if (type === '$provider') {
78
+ if (el.selectedProviderPreset)
79
+ createParams.providerPreset = el.selectedProviderPreset;
80
+ if (el.providerBaseUrl)
81
+ createParams.baseUrl = el.providerBaseUrl;
82
+ if (el.providerProtocol)
83
+ createParams.protocol = el.providerProtocol;
84
+ if (el.providerIcon)
85
+ createParams.icon = el.providerIcon;
86
+ if (el.providerApiKey)
87
+ createParams.apiKey = el.providerApiKey;
88
+ if (el.providerFolderId)
89
+ createParams.folderId = el.providerFolderId;
90
+ createParams.includeDefaultModels = el.providerIncludeModels !== false;
91
+ }
74
92
  return owner.create(createParams);
75
93
  }
76
94
  if (type === '$folder') {
@@ -364,6 +382,31 @@ ODA({is: 'input-name-type', imports: '/oda//icon.js, /oda//tree',
364
382
  </div>
365
383
  </div>
366
384
  </fieldset>
385
+ <fieldset ~if="showProviderPicker" class="modules-box">
386
+ <legend>Шаблоны провайдеров ИИ:</legend>
387
+ <div class="horizontal" style="flex-wrap:wrap;gap:6px;">
388
+ <div ~for="providerPresets" class="mod-chip" :active="selectedProviderPreset === $for.item.id" @tap="_pickProviderPreset($for.item)">
389
+ <oda-icon :icon="$for.item.icon || 'carbon:api'" icon-size="16"></oda-icon>
390
+ <span>{{$for.item.label || $for.item.id}}</span>
391
+ </div>
392
+ </div>
393
+ <fieldset style="margin-top:4px;">
394
+ <legend>API Key / Token (опционально — сохранится в #secret):</legend>
395
+ <input type="password" :value="providerApiKey" placeholder="sk-... (можно ввести сейчас или позже)" @input="providerApiKey = $this.value">
396
+ </fieldset>
397
+ <fieldset ~if="selectedProviderPreset === 'Yandex'" style="margin-top:4px;">
398
+ <legend>Folder ID (каталог Yandex Cloud):</legend>
399
+ <input :value="providerFolderId" placeholder="b1g..." @input="providerFolderId = $this.value">
400
+ </fieldset>
401
+ <fieldset style="margin-top:4px;">
402
+ <legend>Base URL:</legend>
403
+ <input :value="providerBaseUrl" placeholder="https://.../v1/chat/completions" @input="providerBaseUrl = $this.value">
404
+ </fieldset>
405
+ <label class="horizontal" style="align-items:center;gap:6px;cursor:pointer;font-size:small;margin-top:2px;">
406
+ <input type="checkbox" :checked="providerIncludeModels" @change="providerIncludeModels = $event.target.checked" style="flex:0 0 auto;">
407
+ <span>Сразу создать типовой набор моделей этого провайдера</span>
408
+ </label>
409
+ </fieldset>
367
410
  <div ~if="_dirty && validity" ~text="validity" class="validity"></div>
368
411
  `,
369
412
  message: '',
@@ -377,10 +420,22 @@ ODA({is: 'input-name-type', imports: '/oda//icon.js, /oda//tree',
377
420
  { id: 'demo', label: '3. С демоданными', desc: 'Типовая конфигурация + контрагенты, номенклатура, сотрудники и проведённые операции' },
378
421
  ],
379
422
  moduleLabel: '',
423
+ providerPresets: [],
424
+ selectedProviderPreset: 'OpenAI',
425
+ providerApiKey: '',
426
+ providerFolderId: '',
427
+ providerBaseUrl: 'https://api.openai.com/v1/chat/completions',
428
+ providerProtocol: 'openai',
429
+ providerIcon: 'ai:chatgpt',
430
+ providerIncludeModels: true,
380
431
  get isInOrganizations() {
381
432
  const p = String(this.$item?.path || '');
382
433
  return p === '/ORGANIZATIONS' || p.startsWith('/ORGANIZATIONS/');
383
434
  },
435
+ get isInModels() {
436
+ const p = String(this.$item?.path || '');
437
+ return p === '/MODELS' || p.startsWith('/MODELS/');
438
+ },
384
439
  get showBasePreset() {
385
440
  return this.isInOrganizations && this.type === '$base';
386
441
  },
@@ -390,6 +445,20 @@ ODA({is: 'input-name-type', imports: '/oda//icon.js, /oda//tree',
390
445
  get showModulePicker() {
391
446
  return this.isInOrganizations && this.type === '$module' && this.availableModules?.length > 0;
392
447
  },
448
+ get showProviderPicker() {
449
+ return this.isInModels && this.type === '$provider' && this.providerPresets?.length > 0;
450
+ },
451
+ _pickProviderPreset(preset) {
452
+ if (!preset)
453
+ return;
454
+ this._dirty = true;
455
+ this.selectedProviderPreset = preset.id;
456
+ this.name = preset.id;
457
+ this.moduleLabel = preset.label || preset.id;
458
+ this.providerBaseUrl = preset.baseUrl || '';
459
+ this.providerProtocol = preset.protocol || 'openai';
460
+ this.providerIcon = preset.icon || 'carbon:api';
461
+ },
393
462
  _selectPreset(id) {
394
463
  this.basePreset = id;
395
464
  if (id === 'empty')
@@ -611,6 +680,18 @@ ODA({is: 'input-name-type', imports: '/oda//icon.js, /oda//tree',
611
680
  }
612
681
  catch { /* /MODULES недоступен */ }
613
682
  }
683
+ if (this.isInModels) {
684
+ try {
685
+ const res = await this.$item?.fetch?.('provider_presets');
686
+ if (Array.isArray(res?.items) && res.items.length) {
687
+ this.providerPresets = res.items;
688
+ const def = res.items.find(p => p.id === 'OpenAI') || res.items[0];
689
+ if (def && (this.name === 'new' || this.name === 'OpenAI'))
690
+ this._pickProviderPreset(def);
691
+ }
692
+ }
693
+ catch { /* ignore */ }
694
+ }
614
695
  this.async(() => {
615
696
  this.$('#nameInput')?.focus();
616
697
  }, 300)
@@ -9,6 +9,10 @@ export default {
9
9
  :host([is-inherit]), :host([is-inherit]) .icon {
10
10
  opacity: .7;
11
11
  }
12
+ :host([ai-inactive]) .icon {
13
+ opacity: .42;
14
+ filter: grayscale(.65);
15
+ }
12
16
  .icon {
13
17
  cursor: pointer;
14
18
  border-radius: {{isUser ? '50%' : '4px'}};
@@ -104,6 +108,16 @@ export default {
104
108
  }
105
109
 
106
110
  },
111
+ aiInactive: {
112
+ $attr: true,
113
+ $type: Boolean,
114
+ get() {
115
+ const it = this.$item;
116
+ if (!it || it.id === 'MODELS' || (it.type !== '$ai' && it.type !== '$provider'))
117
+ return false;
118
+ return (it.aiActive ?? it.DATA?.aiActive) === false;
119
+ }
120
+ },
107
121
  isUser: {
108
122
  $attr: true,
109
123
  $def: false,
@@ -27,6 +27,25 @@ export default {
27
27
  color: light-dark(#5b21b6, #c4b5fd);
28
28
  font-style: italic;
29
29
  }
30
+ label.ai-inactive{
31
+ opacity: 0.48;
32
+ }
33
+ .ai-dot{
34
+ @apply --no-flex;
35
+ width: 7px;
36
+ height: 7px;
37
+ border-radius: 50%;
38
+ margin: 0 4px 0 2px;
39
+ align-self: center;
40
+ }
41
+ .ai-dot.active{
42
+ background: #22c55e;
43
+ box-shadow: 0 0 4px rgba(34, 197, 94, 0.55);
44
+ }
45
+ .ai-dot.inactive{
46
+ background: light-dark(#94a3b8, #52525b);
47
+ opacity: 0.65;
48
+ }
30
49
  .virt-badge{
31
50
  @apply --no-flex;
32
51
  font-size: 10px;
@@ -87,7 +106,8 @@ export default {
87
106
  <div horizontal flex style="align-items: center; min-width: 0; width: 100%;">
88
107
  <div vertical flex style="min-width: 0;">
89
108
  <div horizontal flex style="min-width: 0;">
90
- <label flex style="min-width: 0;" :bold="$item instanceof CORE.$class && !isLink" ~class="{link: isLink, virtual: isVirtual}" :title="isLink ? $item?.path : label" ~show="!hideLabel">{{label}}</label>
109
+ <label flex style="min-width: 0;" :bold="$item instanceof CORE.$class && !isLink" ~class="{link: isLink, virtual: isVirtual, 'ai-inactive': isAiInactive}" :title="nodeTooltip" ~show="!hideLabel">{{label}}</label>
110
+ <span class="ai-dot" ~if="isAiNode" ~class="isAiActive ? 'active' : 'inactive'" :title="aiStatusReason"></span>
91
111
  <span class="virt-badge" ~if="isVirtual" title="Виртуальный справочник">вирт.</span>
92
112
  <span class="history-time" ~if="historyTime" ~show="!hideLabel">{{historyTime}}</span>
93
113
  </div>
@@ -111,6 +131,36 @@ export default {
111
131
  get isVirtual() {
112
132
  return this.$item?.type === '$virtual';
113
133
  },
134
+ get isAiNode() {
135
+ const it = this.$item;
136
+ if (!it || it.id === 'MODELS')
137
+ return false;
138
+ return it.type === '$ai' || it.type === '$provider';
139
+ },
140
+ get isAiActive() {
141
+ if (!this.isAiNode)
142
+ return false;
143
+ const v = this.$item?.aiActive ?? this.$item?.DATA?.aiActive;
144
+ return v === true;
145
+ },
146
+ get isAiInactive() {
147
+ if (!this.isAiNode)
148
+ return false;
149
+ const v = this.$item?.aiActive ?? this.$item?.DATA?.aiActive;
150
+ return v === false;
151
+ },
152
+ get aiStatusReason() {
153
+ if (!this.isAiNode)
154
+ return '';
155
+ return String(this.$item?.aiStatusReason || this.$item?.DATA?.aiStatusReason || (this.isAiActive ? 'Активна' : 'Неактивна'));
156
+ },
157
+ get nodeTooltip() {
158
+ if (this.isLink)
159
+ return this.$item?.path;
160
+ if (this.isAiNode && this.aiStatusReason)
161
+ return `${this.label} — ${this.aiStatusReason}`;
162
+ return this.label;
163
+ },
114
164
  get isStructureLike() {
115
165
  const it = this.$item;
116
166
  if (!it || this.isLink)
@@ -36,10 +36,14 @@ function nodeStateKey(it) {
36
36
  function isChatModelNode(f) {
37
37
  if (!f)
38
38
  return false;
39
- if (f.type === '$provider' || f.id === 'MODELS')
39
+ if (f.id === 'MODELS')
40
40
  return true;
41
+ if (f.type === '$provider')
42
+ return (f.aiActive ?? f.DATA?.aiActive) !== false;
41
43
  if (f.type && f.type !== '$ai')
42
44
  return true;
45
+ if ((f.aiActive ?? f.DATA?.aiActive) === false)
46
+ return false;
43
47
  const mod = String(f.DATA?.modality || '').toLowerCase();
44
48
  if (['image', 'audio', 'embedding', 'video', 'voice', 'asr', 'tts', 'stt'].includes(mod))
45
49
  return false;
package/.secretsignore CHANGED
@@ -24,6 +24,10 @@ oda/components/**
24
24
  tests/helpers/fake-docker.js
25
25
  tests/ui/task-dock.html
26
26
  tests/check-secrets.test.js
27
+ tests/halogen-provider.test.js
28
+ tests/license-and-deploy.test.js
29
+ tests/notify-channels.test.js
30
+ license-server/src/server.js
27
31
 
28
32
  # Экспортированный дамп сессии OpenCode для переноса между рабочими станциями
29
33
  current_session.json
@@ -175,6 +175,11 @@ export default {
175
175
  temperature: options.temperature ?? 0.7,
176
176
  stream: true,
177
177
  };
178
+ if (ai.protocol === 'yandex' && body.model && !/^(gpt|emb|ds):\/\//i.test(body.model)) {
179
+ const folderId = await resolveFolderId(ai);
180
+ if (folderId)
181
+ body.model = `gpt://${folderId}/${body.model}`;
182
+ }
178
183
  const cap = Number(options.maxOutput);
179
184
  if (Number.isFinite(cap) && cap > 0)
180
185
  body.max_tokens = cap;
@@ -610,8 +615,14 @@ export default {
610
615
  const input = params.input ?? params.text ?? params.post ?? '';
611
616
  const origin = speechOrigin(params, ai, 'embed');
612
617
  const headers = await getAuthHeaders(ai);
618
+ let finalModel = tag;
619
+ if (ai.protocol === 'yandex' && finalModel && !/^(gpt|emb):\/\//i.test(finalModel)) {
620
+ const folderId = await resolveFolderId(ai);
621
+ if (folderId)
622
+ finalModel = `emb://${folderId}/${finalModel}`;
623
+ }
613
624
  const body = {
614
- model: tag,
625
+ model: finalModel,
615
626
  input: Array.isArray(input) ? input : [String(input)],
616
627
  ...(params.dimensions ? { dimensions: Number(params.dimensions) } : {}),
617
628
  ...(params.encoding_format ? { encoding_format: String(params.encoding_format) } : {}),
@@ -695,7 +706,10 @@ export default {
695
706
 
696
707
  function isHalogenModel(ai) {
697
708
  const p = String(ai?.path || ai?.short || '');
698
- return ai?.protocol === 'halogen' || p.startsWith('/MODELS/Halogen/');
709
+ const b = String(ai?.baseUrl || ai?.DATA?.baseUrl || '');
710
+ return ai?.protocol === 'halogen'
711
+ || p.startsWith('/MODELS/Halogen/')
712
+ || (p.startsWith('/MODELS/Local/') && b.includes(':8731'));
699
713
  }
700
714
 
701
715
  function speechOrigin(params, ai, who) {
@@ -1487,6 +1501,25 @@ async function getAuthHeaders(ai) {
1487
1501
  headers['anthropic-beta'] = String(ai.anthropicBeta);
1488
1502
  break;
1489
1503
  }
1504
+ case 'yandex': {
1505
+ let key = '';
1506
+ try {
1507
+ key = await resolveKey(ai, ai.apiKey || 'secret:yandex.json');
1508
+ }
1509
+ catch (e) {
1510
+ if (!process.env.YANDEX_API_KEY)
1511
+ throw e;
1512
+ }
1513
+ if (!key)
1514
+ key = String(process.env.YANDEX_API_KEY || '').trim();
1515
+ if (!key)
1516
+ throw new Error('Yandex AI: не задан API-ключ — откройте /MODELS/Yandex для настройки ключа или задайте YANDEX_API_KEY');
1517
+ headers['Authorization'] = key.startsWith('t1.') ? ('Bearer ' + key) : ('Api-Key ' + key);
1518
+ const folderId = await resolveFolderId(ai);
1519
+ if (folderId)
1520
+ headers['x-folder-id'] = folderId;
1521
+ break;
1522
+ }
1490
1523
  case 'openai':
1491
1524
  default: {
1492
1525
  const key = await resolveKey(ai, ai.apiKey);
@@ -1497,6 +1530,28 @@ async function getAuthHeaders(ai) {
1497
1530
  return headers;
1498
1531
  }
1499
1532
 
1533
+ async function resolveFolderId(ai) {
1534
+ const raw = String(ai?.folderId ?? ai?.DATA?.folderId ?? '').trim();
1535
+ if (raw && !/^secret:/i.test(raw) && !/^env:/i.test(raw))
1536
+ return raw;
1537
+ if (/^env:/i.test(raw))
1538
+ return String(process.env[raw.slice(4).trim()] || '').trim();
1539
+ const filename = /^secret:/i.test(raw) ? raw.slice(7).trim() : 'yandex.json';
1540
+ let cur = ai;
1541
+ for (let i = 0; i < 6 && cur; i++) {
1542
+ if (typeof cur.read_secret === 'function') {
1543
+ try {
1544
+ const data = await cur.read_secret({ filename });
1545
+ if (data?.folderId)
1546
+ return String(data.folderId).trim();
1547
+ }
1548
+ catch { /* выше по дереву */ }
1549
+ }
1550
+ cur = cur.$parent ?? cur.parent;
1551
+ }
1552
+ return String(process.env.YANDEX_FOLDER_ID || '').trim();
1553
+ }
1554
+
1500
1555
  /**
1501
1556
  * Значение ключа: литерал | `env:ИМЯ` (process.env) | `secret:ФАЙЛ` (#secret модели,
1502
1557
  * затем вверх по родителям — провайдер, MODELS). В файле секрета — value|apiKey|token|key.
@@ -7,7 +7,7 @@
7
7
  export default {
8
8
  icon: 'carbon:api',
9
9
  label: 'Провайдер ИИ',
10
- form: 'editor',
10
+ form: 'provider',
11
11
  METADATA: {
12
12
  STATIC: [{
13
13
  id: 'protocol',
@@ -0,0 +1,13 @@
1
+ /** Мета хендлера form/provider (Настройка подключения, API-ключа и моделей провайдера ИИ). */
2
+ export default {
3
+ icon: 'carbon:api',
4
+ label: 'Подключение и модели',
5
+ roles: ['BOSS'],
6
+ order: 1,
7
+ allowUse($context) {
8
+ const p = String($context?.path || $context?.short || '');
9
+ if (p === '/MODELS/Local' || p.startsWith('/MODELS/Local/') || $context?.protocol === 'local' || $context?.protocol === 'halogen')
10
+ return false;
11
+ return true;
12
+ },
13
+ }