Upload folder using huggingface_hub
Browse files- static/css/ragquery.min.css +1 -1
- static/javascript/app.js +1 -1
- static/javascript/client_llm.js +7 -6
- static/javascript/rag_mgr.js +11 -13
- static/javascript/rag_payload.js +110 -19
- static/javascript/ualog3.js +1 -1
- static/js/ragquery.min.js +9 -8
- static/less/ragquery.less +3 -3
- static/ragrqs.html +2 -4
static/css/ragquery.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
#ualog_{box-sizing:border-box;width:auto;height:auto;text-align:center;padding:2px;margin:2px 0 0;background:#333;color:#fff;font-size:16px;font-weight:400;border-radius:9px;border:1px solid #999}#ualog_ button{padding:5px;margin:0 5px;font-size:18px;font-weight:700;border:2px solid #888;border-radius:10px;color:#000}#ualog_ button:hover{cursor:pointer;text-decoration:underline}#ualog_ button.close{background:#cc3700}#ualog_ button.close:hover{background:#ff8f66;border-color:#992900}#ualog_ button.clear{background:#b3a80b}#ualog_ button.clear:hover{background:#f5ec62;border-color:#837b08}#ualog_ pre{box-sizing:border-box;width:auto;min-width:400px;max-width:400px;max-height:500px;text-align:left;font-size:16px;font-family:monospace;padding:2px;margin:2px;color:#fff;background:#111;overflow:auto;scrollbar-color:#23eb04 #454444;scrollbar-width:auto;word-wrap:break-word}a,body,button,div,html,input,label,li,p,span,table,td,ul{padding:0;margin:0;font-family:arial,verdana,Helvetica,sans-serif}.bb0{background:#daee59!important}.bb1{background:#5487fc!important}html{background:#1a1a1a}body{background:#1a1a1a;box-sizing:border-box;min-height:100vh;height:100vh;position:relative;padding:0;margin:0;overflow:hidden;font-family:arial,verdana,Helvetica,sans-serif;font-weight:400}.spinner{z-index:1000;position:absolute;top:70vh;left:50vw;transform:translate(-50%,-50%);cursor:pointer;display:none;align-items:center}.spinner .pulse-icon{width:20px;height:20px;background-color:#ff8c00;border-radius:50%;animation:1.5s ease-in-out infinite pulse}.spinner .stop-message{margin-left:15px;background-color:inherit;color:#8f8a8a;padding:8px 15px;border-radius:10px;font-size:22px;font-weight:700;opacity:1;transition:opacity .3s}.spinner:hover .stop-message{color:#fff;background:#595959;opacity:1}@keyframes pulse{0%{transform:scale(.6);box-shadow:0 0 0 0 rgba(255,140,0,.7)}70%{transform:scale(1.4);box-shadow:0 0 0 20px rgba(255,140,0,0)}100%{transform:scale(.6);box-shadow:0 0 0 0 rgba(255,140,0,0)}}.show-spinner{display:flex}.theme-dark .btn-light,.theme-light .btn-dark{display:inline-block!important}.inver svg,.invert,.invert .inv,.invert .tt-bottom::before,.invert .tt-left::before,.invert .tt-right::before,.invert .tt-top::before,.invert iframe,.invert img,.invert video{filter:invert(100%) hue-rotate(180deg)}.btn-theme{position:fixed;top:0;right:10vw;height:4vh;background:inherit;font-weight:700;margin-left:5vw;margin-top:.5vh;z-index:2000}.btn-theme button{color:#fff;border:none;background:0 0;cursor:pointer;padding:5px;display:none}.btn-theme button svg{width:24px;height:24px;stroke:currentColor}.upload{background-color:#1e1e1e;padding:0 2em 2em;margin:0;border-radius:4px;box-shadow:0 2px 4px rgba(0,0,0,.5);text-align:center}.upload h4{color:#fff;margin-bottom:1em}.upload form{display:flex;flex-direction:column;align-items:center}.upload form .file{background-color:#121212;border:1px solid #515151;color:#fff;padding:.5em;margin-bottom:1em;border-radius:4px;width:100%;box-sizing:border-box}.upload form .file::file-selector-button{background-color:#003e31;color:#fff;border:none;padding:.5em 1em;border-radius:4px;cursor:pointer}.upload form .file::file-selector-button:hover{background-color:#000b08}.upload form button{background-color:#003e31;color:#fff;border:none;padding:.5em 1em;border-radius:4px;cursor:pointer;width:100%;box-sizing:border-box}.upload form button:hover{background-color:#000b08}.upload .result{width:100%;background:#000;color:#fff;font-size:15px;font-weight:400;text-align:left}.copied{background-color:#0d0d0d!important;color:#24ffd3!important}div.container{background:#1a1a1a;box-sizing:border-box;position:relative;top:5vh;left:0;height:95vh;margin:0;padding:0;transition:margin-left .5s;display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;overflow-y:auto;overflow-x:auto}div.container div.item{box-sizing:border-box;min-height:50px;margin:0;padding:0}div.container div.item1{flex:5;padding:.5vh .5vw 10vh}div.container div.item1 .output-wrapper{background-color:#1a1a1a;border-radius:20px;position:relative;bottom:0;right:0;left:0;width:100%;height:100%;display:flex;flex-direction:row;align-items:flex-start}div.container div.item1 .output-wrapper .text-out{flex:1;box-sizing:border-box;background:#000;color:#fff;border:none;padding:2px;margin:0;min-width:50vw;height:100%;border-radius:10px;overflow-y:auto;outline:0;box-shadow:0 0 0 2px #4d4d4d}div.container div.item1 .output-wrapper .text-out:hover{box-shadow:0 0 0 2px #00bd97}div.container div.item1 .output-wrapper .text-out .pre-text{white-space:pre-wrap;word-wrap:break-word;font-family:arial,verdana,Helvetica,sans-serif;font-size:20px;line-height:1.5;padding:2px;margin:0;height:100%;box-sizing:border-box;overflow-y:auto;scroll-behavior:smooth}div.container div.item1 .output-wrapper .text-out .pre-text.copied{background-color:#0d0d0d;color:#24ffd3}div.container div.item1 .output-wrapper .text-out .div-text{white-space:pre-wrap;word-wrap:break-word;font-family:arial,verdana,Helvetica,sans-serif;font-size:20px;line-height:1.5;padding:2px;margin:0;height:100%;box-sizing:border-box;overflow-y:scroll}div.container div.item1 .output-wrapper .text-out .user{border:2px solid #00bd97!important;border-radius:10px;padding:2px 2px 3px 10px;margin:2px 5px 5px 150px}div.container div.item1 .output-wrapper .text-out .user b{font-weight:700;text-decoration:underline;color:#ff4500;padding-bottom:5px}div.container div.item1 .output-wrapper .text-out .assistant{border:2px solid #ff4500!important;border-radius:10px;padding:2px 2px 3px 10px;margin:2px 90px 5px 6px}div.container div.item1 .output-wrapper .text-out .assistant b{font-weight:700;text-decoration:underline;color:#00bd97;padding-bottom:5px}div.container div.item1 .output-actions{display:flex;flex-direction:column;align-items:flex-end;margin-left:.5vw;margin-right:.5vw}div.container div.item1 .output-actions .clear-output,div.container div.item1 .output-actions .copy-output,div.container div.item1 .output-actions .wnd-output{box-sizing:border-box;background-color:#333;color:#fff;border:none;padding:10px;cursor:pointer;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;margin-bottom:5px}div.container div.item1 .output-actions .clear-output:hover,div.container div.item1 .output-actions .copy-output:hover,div.container div.item1 .output-actions .wnd-output:hover{background-color:#595959}div.container div.item1 .output-actions .copy-output{transition:background-color .3s,transform .3s}div.container div.item1 .output-actions .copy-output.copied{background:#00f0c0;transform:scale(1.2)}div.container div.item1 .output-actions .copy-output .copy-icon{fill:#fff;width:24px;height:24px}div.container div.item1 .output-actions .copy-output .copy-icon:hover{fill:#00f0c0}div.container div.item1 .output-actions .clear-output,div.container div.item1 .output-actions .wnd-output{transition:background-color .3s,transform .3s}div.container div.item1 .output-actions .clear-output .icon,div.container div.item1 .output-actions .wnd-output .icon{fill:#fff;width:24px;height:24px}div.container div.item1 .output-actions .clear-output .icon:hover,div.container div.item1 .output-actions .wnd-output .icon:hover{fill:#00f0c0}:hover{outline:0;caret-color:transparent}textarea:focus{caret-color:auto}div.item2{flex:2;padding:0 .5vw}div.item2 .input-wrapper{background-color:#1a1a1a;border-radius:20px;position:relative;bottom:2vh;right:0;left:0;width:100%;height:100%;display:flex;flex-direction:row;align-items:flex-start}div.item2 .input-wrapper:focus-within .clear-button{display:block}div.item2 .input-wrapper .text-input{flex:1;font-size:20px;font-family:arial,verdana,Helvetica,sans-serif;resize:none;box-sizing:border-box;background:#000;color:#fff;border:none;padding:2px 40px 2px 2px;height:100%;margin-left:5px;border-radius:10px;overflow-y:auto;outline:0;box-shadow:0 0 0 2px #4d4d4d}div.item2 .input-wrapper .text-input:hover{box-shadow:0 0 0 2px #00bd97}div.item2 .input-wrapper .text-input:focus{box-shadow:0 0 0 2px #ff4500}div.item2 .input-wrapper .clear-button{position:absolute;right:60px;top:19vh;padding:5px;border-radius:50%;background:#333;border:none;font-size:20px;cursor:pointer;color:#ccc;display:none}div.item2 .input-wrapper .clear-button:hover{font-weight:700;background:#595959;color:#fff}div.item2 .input-wrapper .input-actions{display:flex;flex-direction:column;margin-left:.5vw;margin-right:.5vw}div.item2 .input-wrapper .input-actions .clear-input,div.item2 .input-wrapper .input-actions .send-input,div.item2 .input-wrapper .input-actions .send2-input{box-sizing:border-box;background-color:#333;color:#fff;border:none;padding:10px;cursor:pointer;border-radius:50%;width:40px;height:40px;margin-bottom:5px;transition:background-color .3s}div.item2 .input-wrapper .input-actions .send-input{background:#992900}div.item2 .input-wrapper .input-actions .send-input:hover{background:#ff4500}div.item2 .input-wrapper .input-actions .send2-input{background:#005746}div.item2 .input-wrapper .input-actions .send2-input:hover{background:#00a383}div.item2 .input-wrapper .input-actions .clear-input{background:#333;color:#e6e6e6}div.item2 .input-wrapper .input-actions .clear-input:hover{background:#595959;color:#00f0c0}.menu-open .container{margin-left:16vw}.menu-open .menu-box{left:0!important}div.menu-h{background-color:#1a1a1a;position:fixed;top:0;left:0;width:100vw;height:4.5vh;padding:0;margin:0;outline:0;box-shadow:0 0 0 2px #4d4d4d;z-index:100}div.menu-h .release{background:inherit;color:#fff;font-size:15px;font-weight:400;margin-left:.6vw;margin-top:.8vh;position:fixed;top:.2vh;right:.4vw;height:4vh}div.menu-h .menu-btn{appearance:none}div.menu-h .menu-btn:checked+.menu-icon .nav-icon::before{content:"X"}div.menu-h .menu-icon{box-sizing:border-box;background-color:inherit;display:block;position:absolute;margin-left:2vw;top:0;left:0;width:25px;height:100%;cursor:pointer;padding:2px;z-index:1}div.menu-h .menu-icon:hover .nav-icon::before{color:#ff4500}div.menu-h .nav-icon::before{content:"☰";position:absolute;left:0;color:#aea7a7;font-size:25px;transition-duration:.25s}div.menu-h .head-wrapper{position:absolute;top:0;left:5vw;height:4vh;padding:0;margin:0;display:inline-flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:flex-start}div.menu-h .head-wrapper .help,div.menu-h .head-wrapper .log,div.menu-h .head-wrapper .upload,div.menu-h .head-wrapper .upload-dir{margin-top:2px;margin-left:30px;margin-right:0;padding:5px 5px 0;border:none;cursor:pointer;border-radius:20%;font-size:20px;color:#fff;background:#333;max-height:4vh}div.menu-h .head-wrapper .help:hover,div.menu-h .head-wrapper .log:hover,div.menu-h .head-wrapper .upload-dir:hover,div.menu-h .head-wrapper .upload:hover{background:#595959}div.menu-h .upload,div.menu-h .upload-dir{transition:background-color .3s,transform .3s}div.menu-h .upload .icon,div.menu-h .upload-dir .icon{fill:#fff;width:24px;height:24px}div.menu-h .upload .icon:hover,div.menu-h .upload-dir .icon:hover{fill:#00f0c0}div.menu-h .log{font-size:14px!important;font-weight:400!important;background:#992900!important}div.menu-h .log:hover{background:#cc3700!important}div.menu-h .log.active{background:#005746!important}div.menu-h .log.active:hover{background:#008a6e!important}div.menu-h div.menu-box{position:fixed;top:5vh;left:-2000px;height:95vh;width:16vw;transition:left .3s ease-out;padding:1vh 0 0 .5vw;z-index:101;background:#0d0d0d;box-sizing:border-box;outline:0;box-shadow:0 0 0 2px #4d4d4d;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:stretch;overflow-y:auto;overflow-x:auto}div.menu-h div.menu-box ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;border-top:1px solid #333}div.menu-h div.menu-box ul li{border-left:1px solid #333;border-right:1px solid #333;border-bottom:1px solid #333}div.menu-h div.menu-box ul li a{color:#fff;font-size:14px;font-family:arial,verdana,Helvetica,sans-serif;font-weight:400;display:block;margin:0;padding:2px 2px 2px 0;text-align:left;text-decoration:none}div.menu-h div.menu-box ul li:hover{text-decoration:underline;background-color:#333;color:#ff4500}div.menu-h div.menu-box ul a.delete,div.menu-h div.menu-box ul a.help{text-align:center;font-weight:700;font-style:italic;color:#fff;background:#cc3700}div.menu-h div.menu-box ul li.show{background:#000;color:#fff;width:100%;text-align:center;box-sizing:border-box}div.menu-h div.menu-box ul li.show:hover{text-decoration:none}.window-text{position:relative;top:0;left:0;background:#1a1a1a;color:#fff;border:none;padding:0 2px 2px;width:78vw;height:80vh;border-radius:10px;box-sizing:border-box;outline:0;box-shadow:0 0 0 2px #b3a80b;overflow-y:auto;overflow-x:auto}.window-text pre.pre-text{color:#f8f292;white-space:pre-wrap;word-wrap:break-word;font-family:Georigia,"Ties New Roman",serif;font-size:18px;line-height:1.6;padding:2px;margin:0;text-align:left}.window-text div.div-text{color:#f8f292;word-wrap:break-word;font-family:Georigia,"Ties New Roman",serif;font-size:18px;padding:0 2px;margin:0}.window-text div.div-text ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;border-top:1px solid #333}.window-text div.div-text ul li{border-left:1px solid #333;border-right:1px solid #333;border-bottom:1px solid #333}.window-text div.div-text ul li a{color:#fff;font-size:14px;font-family:arial,verdana,Helvetica,sans-serif;font-weight:400;display:block;margin:0;padding:5px 2px 2px 0;text-align:left;text-decoration:none}.window-text div.div-text ul li:hover{text-decoration:underline;background-color:#333;color:#ff4500}.window-text div.text{font-size:18px;font-weight:400;padding-left:10px;padding-right:10px;margin:0}.window-text div.text pre{white-space:pre-wrap;word-wrap:break-word;font-family:arial,verdana,Helvetica,sans-serif;font-size:18px;line-height:1.3;padding:0 5px;margin:0;text-align:left}.window-text div.text .center{text-align:center;font-size:18px;font-weight:700;text-decoration:underline;font-style:italic;color:#e3d50e}.window-text div.text .label{margin:5px 0 5px 10px;font-size:18px;font-weight:700;font-style:italic;color:#e3d50e}.window-text div.text div{font-family:arial,verdana,Helvetica,sans-serif;font-size:18px;font-weight:700;padding-top:0;padding-bottom:0}.window-text div.text div a{background:#000;color:#fff;font-weight:400}.window-text div.text div a:hover{background:#333;color:#fff}.window-text div.text p{font-size:18px;font-weight:400;font-family:arial,verdana,Helvetica,sans-serif;text-align:justify;padding-bottom:9px;padding-right:0;padding-left:10px}.btn-wrapper{width:100%;height:2vw;position:sticky;top:0;padding:0;background:#262626}.btn-wrapper .btn-copy{position:absolute;top:1px;right:5vw;box-sizing:border-box;background:inherit;color:#fff;border:none;cursor:pointer;width:30px;margin:0;padding:0;transition:background-color .3s}.btn-wrapper .btn-copy:hover{background-color:#595959}.btn-wrapper .btn-copy .copy-icon{fill:#e6e6e6;width:20px;height:20px}.btn-wrapper .btn-copy .copy-icon:hover{fill:#00f0c0;background:#404040}.btn-wrapper .btn-close{position:absolute;top:0;right:2vw;margin:0;background-color:transparent;border:none;color:#e6e6e6;font-size:22px;font-weight:700;cursor:pointer;outline:0}.btn-wrapper .btn-close:hover{color:#00f0c0;background:#404040}.tt-bottom,.tt-left,.tt-leftx,.tt-right,.tt-top{position:relative;transition:transform .2s}.tt-bottom::after,.tt-bottom::before,.tt-left::after,.tt-left::before,.tt-leftx::after,.tt-leftx::before,.tt-right::after,.tt-right::before,.tt-top::after,.tt-top::before{position:absolute;opacity:0;pointer-events:none;z-index:9999;transition:opacity .3s}.tt-bottom::before,.tt-left::before,.tt-leftx::before,.tt-right::before,.tt-top::before{content:attr(data-tt);background:#cc3a05;color:#fff;font:400 20px Arial,sans-serif;padding:4px 10px;border-radius:4px;box-shadow:0 3px 6px #e2ca0e29;white-space:nowrap}.tt-bottom:hover::after,.tt-bottom:hover::before,.tt-left:hover::after,.tt-left:hover::before,.tt-leftx:hover::after,.tt-leftx:hover::before,.tt-right:hover::after,.tt-right:hover::before,.tt-top:hover::after,.tt-top:hover::before{opacity:1}.tt-top::before{bottom:calc(100% + 12px);left:50%;transform:translateX(-50%)}.tt-bottom::before{top:calc(100% + 12px);left:50%;transform:translateX(-50%)}.tt-left::before{right:calc(50% + 0px);top:calc(100% + 22px);transform:translateY(-50%)}.tt-leftx::before{right:calc(50% + 20px);top:calc(100% + 22px);transform:translateY(-80%)}.tt-right::before{left:calc(100% + 12px);top:50%;transform:translateY(50%)}.alert-dialog,.confirm-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%) scale(.9);opacity:0;visibility:hidden;background:#2d2d2d;padding:2rem;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,.3);z-index:10001;min-width:320px;max-width:90%;transition:.3s cubic-bezier(.4, 0, .2, 1)}.alert-dialog.show,.confirm-dialog.show{opacity:1;visibility:visible;transform:translate(-50%,-50%) scale(1)}.alert-dialog h4,.confirm-dialog h4{margin:0 0 2rem;color:#f5f5f5;font-size:1.25rem;font-weight:500;line-height:1.4;text-align:center}.alert-dialog .buttons,.confirm-dialog .buttons{display:flex;gap:1rem;justify-content:center}.alert-dialog button,.confirm-dialog button{border:none;padding:.75rem 1.5rem;border-radius:6px;font-weight:500;text-transform:uppercase;letter-spacing:.05em;cursor:pointer;transition:.2s}.alert-dialog button:focus,.confirm-dialog button:focus{outline:rgba(255,255,255,.5) solid 2px;outline-offset:2px}.alert-dialog button.ok,.confirm-dialog button.ok{background:#4caf50;color:#fff}.alert-dialog button.ok:hover,.confirm-dialog button.ok:hover{background:#409343}.alert-dialog button.cancel,.confirm-dialog button.cancel{background:#f44336;color:#fff}.alert-dialog button.cancel:hover,.confirm-dialog button.cancel:hover{background:#f21f0f}.confirm-dialog{border:2px solid #4caf50}.alert-dialog{border:2px solid #2196f3}.alert-dialog .ok{background:#2196f3}.alert-dialog .ok:hover{background:#0c82df}.overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.7);opacity:0;visibility:hidden;z-index:10000;transition:opacity .3s}.overlay.show{opacity:1;visibility:visible}#ualog_id{box-sizing:border-box;width:auto;height:auto;text-align:center;padding:2px;margin:2px 0 0;background:#333;color:#fff;font-size:16px;font-weight:400;border-radius:9px;border:1px solid #999}#ualog_id button{padding:5px;margin:0 5px;font-size:18px;font-weight:700;border:2px solid #888;border-radius:10px;color:#000}#ualog_id button:hover{cursor:pointer;text-decoration:underline}#ualog_id button.close{background:#cc3700}#ualog_id button.close:hover{background:#ff8f66;border-color:#992900}#ualog_id button.clear{background:#b3a80b}#ualog_id button.clear:hover{background:#f5ec62;border-color:#837b08}#ualog_id pre{box-sizing:border-box;width:auto;min-width:400px;max-width:400px;max-height:500px;text-align:left;font-size:16px;font-family:monospace;padding:2px;margin:2px;color:#fff;background:#111;overflow:auto;scrollbar-color:#23eb04 #454444;scrollbar-width:auto;word-wrap:break-word}
|
|
|
1 |
+
#ualog_{box-sizing:border-box;width:auto;height:auto;text-align:center;padding:2px;margin:2px 0 0;background:#333;color:#fff;font-size:16px;font-weight:400;border-radius:9px;border:1px solid #999}#ualog_ button{padding:5px;margin:0 5px;font-size:18px;font-weight:700;border:2px solid #888;border-radius:10px;color:#000}#ualog_ button:hover{cursor:pointer;text-decoration:underline}#ualog_ button.close{background:#cc3700}#ualog_ button.close:hover{background:#ff8f66;border-color:#992900}#ualog_ button.clear{background:#b3a80b}#ualog_ button.clear:hover{background:#f5ec62;border-color:#837b08}#ualog_ pre{box-sizing:border-box;width:auto;min-width:400px;max-width:400px;max-height:500px;text-align:left;font-size:16px;font-family:monospace;padding:2px;margin:2px;color:#fff;background:#111;overflow:auto;scrollbar-color:#23eb04 #454444;scrollbar-width:auto;word-wrap:break-word}a,body,button,div,html,input,label,li,p,span,table,td,ul{padding:0;margin:0;font-family:arial,verdana,Helvetica,sans-serif}.bb0{background:#daee59!important}.bb1{background:#5487fc!important}html{background:#1a1a1a}body{background:#1a1a1a;box-sizing:border-box;min-height:100vh;height:100vh;position:relative;padding:0;margin:0;overflow:hidden;font-family:arial,verdana,Helvetica,sans-serif;font-weight:400}.spinner{z-index:1000;position:absolute;top:70vh;left:50vw;transform:translate(-50%,-50%);cursor:pointer;display:none;align-items:center}.spinner .pulse-icon{width:20px;height:20px;background-color:#ff8c00;border-radius:50%;animation:1.5s ease-in-out infinite pulse}.spinner .stop-message{margin-left:15px;background-color:inherit;color:#8f8a8a;padding:8px 15px;border-radius:10px;font-size:22px;font-weight:700;opacity:1;transition:opacity .3s}.spinner:hover .stop-message{color:#fff;background:#595959;opacity:1}@keyframes pulse{0%{transform:scale(.6);box-shadow:0 0 0 0 rgba(255,140,0,.7)}70%{transform:scale(1.4);box-shadow:0 0 0 20px rgba(255,140,0,0)}100%{transform:scale(.6);box-shadow:0 0 0 0 rgba(255,140,0,0)}}.show-spinner{display:flex}.theme-dark .btn-light,.theme-light .btn-dark{display:inline-block!important}.inver svg,.invert,.invert .inv,.invert .tt-bottom::before,.invert .tt-left::before,.invert .tt-right::before,.invert .tt-top::before,.invert iframe,.invert img,.invert video{filter:invert(100%) hue-rotate(180deg)}.btn-theme{position:fixed;top:0;right:10vw;height:4vh;background:inherit;font-weight:700;margin-left:5vw;margin-top:.5vh;z-index:2000}.btn-theme button{color:#fff;border:none;background:0 0;cursor:pointer;padding:5px;display:none}.btn-theme button svg{width:24px;height:24px;stroke:currentColor}.upload{background-color:#1e1e1e;padding:0 2em 2em;margin:0;border-radius:4px;box-shadow:0 2px 4px rgba(0,0,0,.5);text-align:center}.upload h4{color:#fff;margin-bottom:1em}.upload form{display:flex;flex-direction:column;align-items:center}.upload form .file{background-color:#121212;border:1px solid #515151;color:#fff;padding:.5em;margin-bottom:1em;border-radius:4px;width:100%;box-sizing:border-box}.upload form .file::file-selector-button{background-color:#003e31;color:#fff;border:none;padding:.5em 1em;border-radius:4px;cursor:pointer}.upload form .file::file-selector-button:hover{background-color:#000b08}.upload form button{background-color:#003e31;color:#fff;border:none;padding:.5em 1em;border-radius:4px;cursor:pointer;width:100%;box-sizing:border-box}.upload form button:hover{background-color:#000b08}.upload .result{width:100%;background:#000;color:#fff;font-size:15px;font-weight:400;text-align:left}.copied{background-color:#0d0d0d!important;color:#24ffd3!important}div.container{background:#1a1a1a;box-sizing:border-box;position:relative;top:3vh;left:0;height:94vh;margin:0;padding:0;transition:margin-left .5s;display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;flex-wrap:nowrap;overflow-y:auto;overflow-x:auto}div.container div.item{box-sizing:border-box;min-height:50px;margin:0;padding:0}div.container div.item1{flex:5;padding:.5vh .5vw 5vh}div.container div.item1 .output-wrapper{background-color:#1a1a1a;border-radius:20px;position:relative;bottom:0;right:0;left:0;width:100%;height:100%;display:flex;flex-direction:row;align-items:flex-start}div.container div.item1 .output-wrapper .text-out{flex:1;box-sizing:border-box;background:#000;color:#fff;border:none;padding:2px;margin:0;min-width:50vw;height:100%;border-radius:10px;overflow-y:auto;outline:0;box-shadow:0 0 0 2px #4d4d4d}div.container div.item1 .output-wrapper .text-out:hover{box-shadow:0 0 0 2px #00bd97}div.container div.item1 .output-wrapper .text-out .pre-text{white-space:pre-wrap;word-wrap:break-word;font-family:arial,verdana,Helvetica,sans-serif;font-size:20px;line-height:1.5;padding:2px;margin:0;height:100%;box-sizing:border-box;overflow-y:auto;scroll-behavior:smooth}div.container div.item1 .output-wrapper .text-out .pre-text.copied{background-color:#0d0d0d;color:#24ffd3}div.container div.item1 .output-wrapper .text-out .div-text{white-space:pre-wrap;word-wrap:break-word;font-family:arial,verdana,Helvetica,sans-serif;font-size:20px;line-height:1.5;padding:2px;margin:0;height:100%;box-sizing:border-box;overflow-y:scroll}div.container div.item1 .output-wrapper .text-out .user{border:2px solid #00bd97!important;border-radius:10px;padding:2px 2px 3px 10px;margin:2px 5px 5px 150px}div.container div.item1 .output-wrapper .text-out .user b{font-weight:700;text-decoration:underline;color:#ff4500;padding-bottom:5px}div.container div.item1 .output-wrapper .text-out .assistant{border:2px solid #ff4500!important;border-radius:10px;padding:2px 2px 3px 10px;margin:2px 90px 5px 6px}div.container div.item1 .output-wrapper .text-out .assistant b{font-weight:700;text-decoration:underline;color:#00bd97;padding-bottom:5px}div.container div.item1 .output-actions{display:flex;flex-direction:column;align-items:flex-end;margin-left:.5vw;margin-right:.5vw}div.container div.item1 .output-actions .clear-output,div.container div.item1 .output-actions .copy-output,div.container div.item1 .output-actions .wnd-output{box-sizing:border-box;background-color:#333;color:#fff;border:none;padding:10px;cursor:pointer;border-radius:50%;width:40px;height:40px;display:flex;align-items:center;margin-bottom:5px}div.container div.item1 .output-actions .clear-output:hover,div.container div.item1 .output-actions .copy-output:hover,div.container div.item1 .output-actions .wnd-output:hover{background-color:#595959}div.container div.item1 .output-actions .copy-output{transition:background-color .3s,transform .3s}div.container div.item1 .output-actions .copy-output.copied{background:#00f0c0;transform:scale(1.2)}div.container div.item1 .output-actions .copy-output .copy-icon{fill:#fff;width:24px;height:24px}div.container div.item1 .output-actions .copy-output .copy-icon:hover{fill:#00f0c0}div.container div.item1 .output-actions .clear-output,div.container div.item1 .output-actions .wnd-output{transition:background-color .3s,transform .3s}div.container div.item1 .output-actions .clear-output .icon,div.container div.item1 .output-actions .wnd-output .icon{fill:#fff;width:24px;height:24px}div.container div.item1 .output-actions .clear-output .icon:hover,div.container div.item1 .output-actions .wnd-output .icon:hover{fill:#00f0c0}:hover{outline:0;caret-color:transparent}textarea:focus{caret-color:auto}div.item2{flex:2;padding:0 .5vw}div.item2 .input-wrapper{background-color:#1a1a1a;border-radius:20px;position:relative;bottom:2vh;right:0;left:0;width:100%;height:100%;display:flex;flex-direction:row;align-items:flex-start}div.item2 .input-wrapper:focus-within .clear-button{display:block}div.item2 .input-wrapper .text-input{flex:1;font-size:20px;font-family:arial,verdana,Helvetica,sans-serif;resize:none;box-sizing:border-box;background:#000;color:#fff;border:none;padding:2px 40px 2px 2px;height:100%;margin-left:5px;border-radius:10px;overflow-y:auto;outline:0;box-shadow:0 0 0 2px #4d4d4d}div.item2 .input-wrapper .text-input:hover{box-shadow:0 0 0 2px #00bd97}div.item2 .input-wrapper .text-input:focus{box-shadow:0 0 0 2px #ff4500}div.item2 .input-wrapper .clear-button{position:absolute;right:60px;top:19vh;padding:5px;border-radius:50%;background:#333;border:none;font-size:20px;cursor:pointer;color:#ccc;display:none}div.item2 .input-wrapper .clear-button:hover{font-weight:700;background:#595959;color:#fff}div.item2 .input-wrapper .input-actions{display:flex;flex-direction:column;margin-left:.5vw;margin-right:.5vw}div.item2 .input-wrapper .input-actions .clear-input,div.item2 .input-wrapper .input-actions .send-input,div.item2 .input-wrapper .input-actions .send2-input{box-sizing:border-box;background-color:#333;color:#fff;border:none;padding:10px;cursor:pointer;border-radius:50%;width:40px;height:40px;margin-bottom:5px;transition:background-color .3s}div.item2 .input-wrapper .input-actions .send-input{background:#992900}div.item2 .input-wrapper .input-actions .send-input:hover{background:#ff4500}div.item2 .input-wrapper .input-actions .send2-input{background:#005746}div.item2 .input-wrapper .input-actions .send2-input:hover{background:#00a383}div.item2 .input-wrapper .input-actions .clear-input{background:#333;color:#e6e6e6}div.item2 .input-wrapper .input-actions .clear-input:hover{background:#595959;color:#00f0c0}.menu-open .container{margin-left:16vw}.menu-open .menu-box{left:0!important}div.menu-h{background-color:#1a1a1a;position:fixed;top:0;left:0;width:100vw;height:4.5vh;padding:0;margin:0;outline:0;box-shadow:0 0 0 2px #4d4d4d;z-index:100}div.menu-h .release{background:inherit;color:#fff;font-size:15px;font-weight:400;margin-left:.6vw;margin-top:.8vh;position:fixed;top:.2vh;right:.4vw;height:4vh}div.menu-h .menu-btn{appearance:none}div.menu-h .menu-btn:checked+.menu-icon .nav-icon::before{content:"X"}div.menu-h .menu-icon{box-sizing:border-box;background-color:inherit;display:block;position:absolute;margin-left:2vw;top:0;left:0;width:25px;height:100%;cursor:pointer;padding:2px;z-index:1}div.menu-h .menu-icon:hover .nav-icon::before{color:#ff4500}div.menu-h .nav-icon::before{content:"☰";position:absolute;left:0;color:#aea7a7;font-size:25px;transition-duration:.25s}div.menu-h .head-wrapper{position:absolute;top:0;left:5vw;height:4vh;padding:0;margin:0;display:inline-flex;flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:flex-start}div.menu-h .head-wrapper .help,div.menu-h .head-wrapper .log,div.menu-h .head-wrapper .upload,div.menu-h .head-wrapper .upload-dir{margin-top:2px;margin-left:30px;margin-right:0;padding:5px 5px 0;border:none;cursor:pointer;border-radius:20%;font-size:20px;color:#fff;background:#333;max-height:4vh}div.menu-h .head-wrapper .help:hover,div.menu-h .head-wrapper .log:hover,div.menu-h .head-wrapper .upload-dir:hover,div.menu-h .head-wrapper .upload:hover{background:#595959}div.menu-h .upload,div.menu-h .upload-dir{transition:background-color .3s,transform .3s}div.menu-h .upload .icon,div.menu-h .upload-dir .icon{fill:#fff;width:24px;height:24px}div.menu-h .upload .icon:hover,div.menu-h .upload-dir .icon:hover{fill:#00f0c0}div.menu-h .log{font-size:14px!important;font-weight:400!important;background:#992900!important}div.menu-h .log:hover{background:#cc3700!important}div.menu-h .log.active{background:#005746!important}div.menu-h .log.active:hover{background:#008a6e!important}div.menu-h div.menu-box{position:fixed;top:5vh;left:-2000px;height:95vh;width:16vw;transition:left .3s ease-out;padding:1vh 0 0 .5vw;z-index:101;background:#0d0d0d;box-sizing:border-box;outline:0;box-shadow:0 0 0 2px #4d4d4d;display:flex;flex-direction:column;flex-wrap:nowrap;justify-content:flex-start;align-items:stretch;overflow-y:auto;overflow-x:auto}div.menu-h div.menu-box ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;border-top:1px solid #333}div.menu-h div.menu-box ul li{border-left:1px solid #333;border-right:1px solid #333;border-bottom:1px solid #333}div.menu-h div.menu-box ul li a{color:#fff;font-size:14px;font-family:arial,verdana,Helvetica,sans-serif;font-weight:400;display:block;margin:0;padding:2px 2px 2px 0;text-align:left;text-decoration:none}div.menu-h div.menu-box ul li:hover{text-decoration:underline;background-color:#333;color:#ff4500}div.menu-h div.menu-box ul a.delete,div.menu-h div.menu-box ul a.help{text-align:center;font-weight:700;font-style:italic;color:#fff;background:#cc3700}div.menu-h div.menu-box ul li.show{background:#000;color:#fff;width:100%;text-align:center;box-sizing:border-box}div.menu-h div.menu-box ul li.show:hover{text-decoration:none}.window-text{position:relative;top:0;left:0;background:#1a1a1a;color:#fff;border:none;padding:0 2px 2px;width:78vw;height:80vh;border-radius:10px;box-sizing:border-box;outline:0;box-shadow:0 0 0 2px #b3a80b;overflow-y:auto;overflow-x:auto}.window-text pre.pre-text{color:#f8f292;white-space:pre-wrap;word-wrap:break-word;font-family:Georigia,"Ties New Roman",serif;font-size:18px;line-height:1.6;padding:2px;margin:0;text-align:left}.window-text div.div-text{color:#f8f292;word-wrap:break-word;font-family:Georigia,"Ties New Roman",serif;font-size:18px;padding:0 2px;margin:0}.window-text div.div-text ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;border-top:1px solid #333}.window-text div.div-text ul li{border-left:1px solid #333;border-right:1px solid #333;border-bottom:1px solid #333}.window-text div.div-text ul li a{color:#fff;font-size:14px;font-family:arial,verdana,Helvetica,sans-serif;font-weight:400;display:block;margin:0;padding:5px 2px 2px 0;text-align:left;text-decoration:none}.window-text div.div-text ul li:hover{text-decoration:underline;background-color:#333;color:#ff4500}.window-text div.text{font-size:18px;font-weight:400;padding-left:10px;padding-right:10px;margin:0}.window-text div.text pre{white-space:pre-wrap;word-wrap:break-word;font-family:arial,verdana,Helvetica,sans-serif;font-size:18px;line-height:1.3;padding:0 5px;margin:0;text-align:left}.window-text div.text .center{text-align:center;font-size:18px;font-weight:700;text-decoration:underline;font-style:italic;color:#e3d50e}.window-text div.text .label{margin:5px 0 5px 10px;font-size:18px;font-weight:700;font-style:italic;color:#e3d50e}.window-text div.text div{font-family:arial,verdana,Helvetica,sans-serif;font-size:18px;font-weight:700;padding-top:0;padding-bottom:0}.window-text div.text div a{background:#000;color:#fff;font-weight:400}.window-text div.text div a:hover{background:#333;color:#fff}.window-text div.text p{font-size:18px;font-weight:400;font-family:arial,verdana,Helvetica,sans-serif;text-align:justify;padding-bottom:9px;padding-right:0;padding-left:10px}.btn-wrapper{width:100%;height:2vw;position:sticky;top:0;padding:0;background:#262626}.btn-wrapper .btn-copy{position:absolute;top:1px;right:5vw;box-sizing:border-box;background:inherit;color:#fff;border:none;cursor:pointer;width:30px;margin:0;padding:0;transition:background-color .3s}.btn-wrapper .btn-copy:hover{background-color:#595959}.btn-wrapper .btn-copy .copy-icon{fill:#e6e6e6;width:20px;height:20px}.btn-wrapper .btn-copy .copy-icon:hover{fill:#00f0c0;background:#404040}.btn-wrapper .btn-close{position:absolute;top:0;right:2vw;margin:0;background-color:transparent;border:none;color:#e6e6e6;font-size:22px;font-weight:700;cursor:pointer;outline:0}.btn-wrapper .btn-close:hover{color:#00f0c0;background:#404040}.tt-bottom,.tt-left,.tt-leftx,.tt-right,.tt-top{position:relative;transition:transform .2s}.tt-bottom::after,.tt-bottom::before,.tt-left::after,.tt-left::before,.tt-leftx::after,.tt-leftx::before,.tt-right::after,.tt-right::before,.tt-top::after,.tt-top::before{position:absolute;opacity:0;pointer-events:none;z-index:9999;transition:opacity .3s}.tt-bottom::before,.tt-left::before,.tt-leftx::before,.tt-right::before,.tt-top::before{content:attr(data-tt);background:#cc3a05;color:#fff;font:400 20px Arial,sans-serif;padding:4px 10px;border-radius:4px;box-shadow:0 3px 6px #e2ca0e29;white-space:nowrap}.tt-bottom:hover::after,.tt-bottom:hover::before,.tt-left:hover::after,.tt-left:hover::before,.tt-leftx:hover::after,.tt-leftx:hover::before,.tt-right:hover::after,.tt-right:hover::before,.tt-top:hover::after,.tt-top:hover::before{opacity:1}.tt-top::before{bottom:calc(100% + 12px);left:50%;transform:translateX(-50%)}.tt-bottom::before{top:calc(100% + 12px);left:50%;transform:translateX(-50%)}.tt-left::before{right:calc(50% + 0px);top:calc(100% + 22px);transform:translateY(-50%)}.tt-leftx::before{right:calc(50% + 20px);top:calc(100% + 22px);transform:translateY(-80%)}.tt-right::before{left:calc(100% + 12px);top:50%;transform:translateY(50%)}.alert-dialog,.confirm-dialog{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%) scale(.9);opacity:0;visibility:hidden;background:#2d2d2d;padding:2rem;border-radius:12px;box-shadow:0 8px 32px rgba(0,0,0,.3);z-index:10001;min-width:320px;max-width:90%;transition:.3s cubic-bezier(.4, 0, .2, 1)}.alert-dialog.show,.confirm-dialog.show{opacity:1;visibility:visible;transform:translate(-50%,-50%) scale(1)}.alert-dialog h4,.confirm-dialog h4{margin:0 0 2rem;color:#f5f5f5;font-size:1.25rem;font-weight:500;line-height:1.4;text-align:center}.alert-dialog .buttons,.confirm-dialog .buttons{display:flex;gap:1rem;justify-content:center}.alert-dialog button,.confirm-dialog button{border:none;padding:.75rem 1.5rem;border-radius:6px;font-weight:500;text-transform:uppercase;letter-spacing:.05em;cursor:pointer;transition:.2s}.alert-dialog button:focus,.confirm-dialog button:focus{outline:rgba(255,255,255,.5) solid 2px;outline-offset:2px}.alert-dialog button.ok,.confirm-dialog button.ok{background:#4caf50;color:#fff}.alert-dialog button.ok:hover,.confirm-dialog button.ok:hover{background:#409343}.alert-dialog button.cancel,.confirm-dialog button.cancel{background:#f44336;color:#fff}.alert-dialog button.cancel:hover,.confirm-dialog button.cancel:hover{background:#f21f0f}.confirm-dialog{border:2px solid #4caf50}.alert-dialog{border:2px solid #2196f3}.alert-dialog .ok{background:#2196f3}.alert-dialog .ok:hover{background:#0c82df}.overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,.7);opacity:0;visibility:hidden;z-index:10000;transition:opacity .3s}.overlay.show{opacity:1;visibility:visible}#ualog_id{box-sizing:border-box;width:auto;height:auto;text-align:center;padding:2px;margin:2px 0 0;background:#333;color:#fff;font-size:16px;font-weight:400;border-radius:9px;border:1px solid #999}#ualog_id button{padding:5px;margin:0 5px;font-size:18px;font-weight:700;border:2px solid #888;border-radius:10px;color:#000}#ualog_id button:hover{cursor:pointer;text-decoration:underline}#ualog_id button.close{background:#cc3700}#ualog_id button.close:hover{background:#ff8f66;border-color:#992900}#ualog_id button.clear{background:#b3a80b}#ualog_id button.clear:hover{background:#f5ec62;border-color:#837b08}#ualog_id pre{box-sizing:border-box;width:auto;min-width:400px;max-width:400px;max-height:500px;text-align:left;font-size:16px;font-family:monospace;padding:2px;margin:2px;color:#fff;background:#111;overflow:auto;scrollbar-color:#23eb04 #454444;scrollbar-width:auto;word-wrap:break-word}
|
static/javascript/app.js
CHANGED
@@ -196,7 +196,7 @@ See the License for the specific language governing permissions and
|
|
196 |
limitations under the License.
|
197 |
*/
|
198 |
|
199 |
-
const VERS = "0.2.
|
200 |
|
201 |
// var xlog = console.log;
|
202 |
var xlog = function () {};
|
|
|
196 |
limitations under the License.
|
197 |
*/
|
198 |
|
199 |
+
const VERS = "0.2.02";
|
200 |
|
201 |
// var xlog = console.log;
|
202 |
var xlog = function () {};
|
static/javascript/client_llm.js
CHANGED
@@ -4,11 +4,10 @@ const ClientLLM = (apiKey) => {
|
|
4 |
let abortController = null;
|
5 |
let isCancelled = false;
|
6 |
|
7 |
-
const createResult = (ok, response = null,
|
8 |
return {
|
9 |
ok,
|
10 |
response,
|
11 |
-
data,
|
12 |
error,
|
13 |
};
|
14 |
};
|
@@ -104,17 +103,19 @@ const ClientLLM = (apiKey) => {
|
|
104 |
|
105 |
if (isCancelled) {
|
106 |
const cancelledError = createError("Richiesta annullata", "CancellationError", 499, { message: "La richiesta è stata interrotta volontariamente dall'utente" });
|
107 |
-
return createResult(false, null,
|
108 |
}
|
109 |
if (!response.ok) {
|
|
|
110 |
const err = await handleHttpError(response);
|
111 |
-
return createResult(false, null,
|
112 |
}
|
113 |
const respJson = await response.json();
|
114 |
-
return createResult(true, respJson);
|
115 |
} catch (error) {
|
116 |
const err = handleNetworkError(error);
|
117 |
-
|
|
|
118 |
} finally {
|
119 |
clearTimeout(timeoutId);
|
120 |
abortController = null;
|
|
|
4 |
let abortController = null;
|
5 |
let isCancelled = false;
|
6 |
|
7 |
+
const createResult = (ok, response = null, error = null) => {
|
8 |
return {
|
9 |
ok,
|
10 |
response,
|
|
|
11 |
error,
|
12 |
};
|
13 |
};
|
|
|
103 |
|
104 |
if (isCancelled) {
|
105 |
const cancelledError = createError("Richiesta annullata", "CancellationError", 499, { message: "La richiesta è stata interrotta volontariamente dall'utente" });
|
106 |
+
return createResult(false, null, cancelledError);
|
107 |
}
|
108 |
if (!response.ok) {
|
109 |
+
console.error("error ok=false\n", response);
|
110 |
const err = await handleHttpError(response);
|
111 |
+
return createResult(false, null, err);
|
112 |
}
|
113 |
const respJson = await response.json();
|
114 |
+
return createResult(true, respJson, null);
|
115 |
} catch (error) {
|
116 |
const err = handleNetworkError(error);
|
117 |
+
console.error("error network:\n", error);
|
118 |
+
return createResult(false, null, err);
|
119 |
} finally {
|
120 |
clearTimeout(timeoutId);
|
121 |
abortController = null;
|
static/javascript/rag_mgr.js
CHANGED
@@ -9,11 +9,7 @@ const ID_DOCS = "id_docs";
|
|
9 |
const PROMPT_DECR = 1024 * 10;
|
10 |
|
11 |
const maxLenRequest = (nk = 32) => {
|
12 |
-
|
13 |
-
// 32768 * 6 = 196698
|
14 |
-
// 196608 x 0,15 = 29591
|
15 |
-
// 196608 + 29591 = 226199
|
16 |
-
const nc = 1024 * nk * 3;
|
17 |
const sp = nc * 0.1;
|
18 |
const mlr = Math.trunc(nc + sp);
|
19 |
return mlr;
|
@@ -35,19 +31,18 @@ function umgm() {
|
|
35 |
const MAX_PROMPT_LENGTH = maxLenRequest(100);
|
36 |
//HF
|
37 |
// const MODEL = "mistralai/Mixtral-8x7B-Instruct-v0.1";
|
38 |
-
const MODEL = "mistralai/Mistral-Small-24B-Instruct-2501";
|
39 |
-
|
|
|
40 |
const API = umgm();
|
41 |
console.log("\n**** MODELl:\n", MODEL);
|
42 |
console.log(API);
|
|
|
43 |
const client = ClientLLM(API);
|
44 |
|
45 |
const getResponse = async (payload, timeout = 60) => {
|
46 |
payload["model"] = MODEL;
|
47 |
-
|
48 |
-
// const url = `https://router.huggingface.co/hf-inference/models/${MODEL}/v1/chat/completions`;
|
49 |
-
const url = "https://router.huggingface.co/together/v1/chat/completions";
|
50 |
-
|
51 |
const rr = await client.sendRequest(url, payload, timeout);
|
52 |
if (rr.error) {
|
53 |
if (rr.error.code === 499) {
|
@@ -58,13 +53,16 @@ const getResponse = async (payload, timeout = 60) => {
|
|
58 |
}
|
59 |
}
|
60 |
if (!rr.response.choices || !rr.response.choices[0] || !rr.response.choices[0].message || rr.response.choices[0].message.content === undefined) {
|
61 |
-
|
62 |
-
|
|
|
|
|
63 |
}
|
64 |
rr.data = rr.response.choices[0].message.content;
|
65 |
return rr;
|
66 |
};
|
67 |
|
|
|
68 |
const responseDetails = {
|
69 |
set(response) {
|
70 |
this.response = response;
|
|
|
9 |
const PROMPT_DECR = 1024 * 10;
|
10 |
|
11 |
const maxLenRequest = (nk = 32) => {
|
12 |
+
const nc = 1024 * nk * 2;
|
|
|
|
|
|
|
|
|
13 |
const sp = nc * 0.1;
|
14 |
const mlr = Math.trunc(nc + sp);
|
15 |
return mlr;
|
|
|
31 |
const MAX_PROMPT_LENGTH = maxLenRequest(100);
|
32 |
//HF
|
33 |
// const MODEL = "mistralai/Mixtral-8x7B-Instruct-v0.1";
|
34 |
+
// const MODEL = "mistralai/Mistral-Small-24B-Instruct-2501";
|
35 |
+
const MODEL = "mistralai/Mistral-Small-3.1-24B-Instruct-2503";
|
36 |
+
// /////////////
|
37 |
const API = umgm();
|
38 |
console.log("\n**** MODELl:\n", MODEL);
|
39 |
console.log(API);
|
40 |
+
|
41 |
const client = ClientLLM(API);
|
42 |
|
43 |
const getResponse = async (payload, timeout = 60) => {
|
44 |
payload["model"] = MODEL;
|
45 |
+
const url = `https://router.huggingface.co/hf-inference/models/${MODEL}/v1/chat/completions`;
|
|
|
|
|
|
|
46 |
const rr = await client.sendRequest(url, payload, timeout);
|
47 |
if (rr.error) {
|
48 |
if (rr.error.code === 499) {
|
|
|
53 |
}
|
54 |
}
|
55 |
if (!rr.response.choices || !rr.response.choices[0] || !rr.response.choices[0].message || rr.response.choices[0].message.content === undefined) {
|
56 |
+
rr.error = client.createError("Risposta non valida", "ParseError", 500, { message: "La risposta non contiene il contenuto atteso" });
|
57 |
+
rr.ok = false;
|
58 |
+
return rr;
|
59 |
+
// return RequestResult(false, null, err);
|
60 |
}
|
61 |
rr.data = rr.response.choices[0].message.content;
|
62 |
return rr;
|
63 |
};
|
64 |
|
65 |
+
////////////////////////
|
66 |
const responseDetails = {
|
67 |
set(response) {
|
68 |
this.response = response;
|
static/javascript/rag_payload.js
CHANGED
@@ -4,29 +4,10 @@ function getPayloadDoc(prompt) {
|
|
4 |
return {
|
5 |
model: "",
|
6 |
temperature: 0.3,
|
7 |
-
//top_p": 1,
|
8 |
max_tokens: 1024,
|
9 |
stream: false,
|
10 |
-
//stop: "</s>",
|
11 |
random_seed: 42,
|
12 |
messages: [{ role: "user", content: prompt }],
|
13 |
-
//AAA response_format: {
|
14 |
-
// type: "text",
|
15 |
-
// },
|
16 |
-
// tools: [
|
17 |
-
// {
|
18 |
-
// type: "function",
|
19 |
-
// function: {
|
20 |
-
// name: "string",
|
21 |
-
// description: "",
|
22 |
-
// parameters: {}
|
23 |
-
// }
|
24 |
-
// }
|
25 |
-
// ],
|
26 |
-
// tool_choice: "auto",
|
27 |
-
// presence_penalty: 0,
|
28 |
-
// frequency_penalty: 0,
|
29 |
-
// n: 1,
|
30 |
safe_prompt: false,
|
31 |
};
|
32 |
}
|
@@ -66,3 +47,113 @@ function getPayloadThread(prompt) {
|
|
66 |
random_seed: 42,
|
67 |
};
|
68 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
return {
|
5 |
model: "",
|
6 |
temperature: 0.3,
|
|
|
7 |
max_tokens: 1024,
|
8 |
stream: false,
|
|
|
9 |
random_seed: 42,
|
10 |
messages: [{ role: "user", content: prompt }],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
safe_prompt: false,
|
12 |
};
|
13 |
}
|
|
|
47 |
random_seed: 42,
|
48 |
};
|
49 |
}
|
50 |
+
|
51 |
+
/*
|
52 |
+
function getPayloadDoc(prompt) {
|
53 |
+
const payload = {
|
54 |
+
inputs: prompt,
|
55 |
+
parameters: {
|
56 |
+
task: "text2text-generation",
|
57 |
+
max_new_tokens: 2000,
|
58 |
+
num_return_sequences: 1,
|
59 |
+
temperature: 0.4,
|
60 |
+
top_p: 0.85,
|
61 |
+
top_k: 30,
|
62 |
+
do_sample: false,
|
63 |
+
no_repeat_ngram_size: 3,
|
64 |
+
num_beams: 4,
|
65 |
+
repetition_penalty: 1.2,
|
66 |
+
return_full_text: false,
|
67 |
+
details: false,
|
68 |
+
max_time: 90.0,
|
69 |
+
seed: 42,
|
70 |
+
},
|
71 |
+
options: {
|
72 |
+
use_cache: false,
|
73 |
+
wait_for_model: true,
|
74 |
+
},
|
75 |
+
};
|
76 |
+
return payload;
|
77 |
+
}
|
78 |
+
|
79 |
+
function getPayloadBuildContext(prompt) {
|
80 |
+
const payload = {
|
81 |
+
inputs: prompt,
|
82 |
+
parameters: {
|
83 |
+
task: "text2text-generation",
|
84 |
+
max_new_tokens: 6000,
|
85 |
+
num_return_sequences: 1,
|
86 |
+
temperature: 0.7,
|
87 |
+
top_p: 0.85,
|
88 |
+
top_k: 30,
|
89 |
+
do_sample: false,
|
90 |
+
no_repeat_ngram_size: 4,
|
91 |
+
num_beams: 6,
|
92 |
+
repetition_penalty: 1.2,
|
93 |
+
return_full_text: false,
|
94 |
+
details: false,
|
95 |
+
max_time: 180.0,
|
96 |
+
seed: 42,
|
97 |
+
},
|
98 |
+
options: {
|
99 |
+
use_cache: false,
|
100 |
+
wait_for_model: true,
|
101 |
+
},
|
102 |
+
};
|
103 |
+
return payload;
|
104 |
+
}
|
105 |
+
|
106 |
+
function getPayloadWithContext(prompt) {
|
107 |
+
const payload = {
|
108 |
+
inputs: prompt,
|
109 |
+
parameters: {
|
110 |
+
task: "text2text-generation",
|
111 |
+
max_new_tokens: 4000,
|
112 |
+
num_return_sequences: 1,
|
113 |
+
temperature: 0.7,
|
114 |
+
top_p: 0.85,
|
115 |
+
top_k: 30,
|
116 |
+
do_sample: false,
|
117 |
+
no_repeat_ngram_size: 4,
|
118 |
+
num_beams: 5,
|
119 |
+
repetition_penalty: 1.4,
|
120 |
+
return_full_text: false,
|
121 |
+
details: false,
|
122 |
+
max_time: 120.0,
|
123 |
+
seed: 42,
|
124 |
+
},
|
125 |
+
options: {
|
126 |
+
use_cache: false,
|
127 |
+
wait_for_model: true,
|
128 |
+
},
|
129 |
+
};
|
130 |
+
return payload;
|
131 |
+
}
|
132 |
+
|
133 |
+
function getPayloadThread(prompt) {
|
134 |
+
const payload = {
|
135 |
+
inputs: prompt,
|
136 |
+
parameters: {
|
137 |
+
task: "text2text-generation",
|
138 |
+
max_new_tokens: 6048,
|
139 |
+
num_return_sequences: 1,
|
140 |
+
temperature: 0.7,
|
141 |
+
top_p: 0.85,
|
142 |
+
top_k: 30,
|
143 |
+
do_sample: false,
|
144 |
+
no_repeat_ngram_size: 4,
|
145 |
+
num_beams: 5,
|
146 |
+
repetition_penalty: 1.4,
|
147 |
+
return_full_text: false,
|
148 |
+
details: false,
|
149 |
+
max_time: 120.0,
|
150 |
+
seed: 42,
|
151 |
+
},
|
152 |
+
options: {
|
153 |
+
use_cache: false,
|
154 |
+
wait_for_model: true,
|
155 |
+
},
|
156 |
+
};
|
157 |
+
return payload;
|
158 |
+
}
|
159 |
+
*/
|
static/javascript/ualog3.js
CHANGED
@@ -41,7 +41,7 @@ var UaLog = {
|
|
41 |
//aggiunge la class inv
|
42 |
// const e = this.wind.getElement();
|
43 |
// e.classList.add("inv");
|
44 |
-
|
45 |
}
|
46 |
const h = `
|
47 |
<button type="button" class="clear " onclick="javascript:UaLog.cls();">Clear</button>
|
|
|
41 |
//aggiunge la class inv
|
42 |
// const e = this.wind.getElement();
|
43 |
// e.classList.add("inv");
|
44 |
+
this.wind.drag();
|
45 |
}
|
46 |
const h = `
|
47 |
<button type="button" class="clear " onclick="javascript:UaLog.cls();">Clear</button>
|
static/js/ragquery.min.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
const VERS="0.2.
|
2 |
function openApp(){setTimeout(()=>{wnds.init();Menu.init();TextInput.init();TextOutput.init();Rag.init();document.querySelector(".menu-btn").checked=!1;release();showHistory();getTheme()},10)}function showHistory(){const a=ThreadMgr.getThread();setOutText(a)}function release(){document.querySelector(".release").innerHTML=VERS}const op0=function(a){wnds.wdiv.show(help1_html)};function showQuery(a){wnds.wpre.show(`\n${Rag.ragQuery}`)}
|
3 |
function showRagResponse(a){wnds.wpre.show(`\n${Rag.ragAnswer}`)}function showThread(a){a=ThreadMgr.getThread();wnds.wpre.show(a)}function elencoRisposte(a){a=[...Rag.answers];0==a.length&&(a=UaDb.readArray(ID_RESPONSES));0!=a.length&&(a=a.map((b,c)=>`\n[${c+1}]\n ${b.trim()}`).join("\n"),wnds.wpre.show(a))}function showContesto(a){wnds.wpre.show(Rag.ragContext)}
|
4 |
function elencoDati(a){var b=UaDb.getAllIds();a=[];for(var c of b)b=UaDb.read(c).length,a.push(`${c} (${b})`);c=a.join("\n ");wnds.wpre.show(c)}const showT=a=>{wnds.wpre.show(DataMgr.docs[a])};function elencoDocs(){DataMgr.readDbDocs();DataMgr.readDbDocNames();var a=DataMgr.doc_names,b=UaJtfh();let c=0;b.append("<ul>");for(const l of a){a=b;var d=a.append,e=l,f=c++;d.call(a,`
|
@@ -7,11 +7,12 @@ function elencoDati(a){var b=UaDb.getAllIds();a=[];for(var c of b)b=UaDb.read(c)
|
|
7 |
async function deleteDati(a){await confirm("Confermi cancellazione dati?")&&(DataMgr.deleteJsonDati(),wnds.wdiv.close(),wnds.wpre.close(),TextOutput.clear())}async function deleteStorage(a){await confirm("Confermi cancellazione documenti & dati?")&&(DataMgr.deleteJsonDati(),localStorage.clear(),wnds.wdiv.close(),wnds.wpre.close(),TextOutput.clear(),DataMgr.docs=[],DataMgr.doc_names=[])}async function help1(a){a=await requestGet("./data/help_test.html");wnds.wdiv.show(a)}
|
8 |
function loadTestoEsempio(a){DataMgr.loadDoc(`data/${a}`);wnds.wdiv.close()}function help2(a){wnds.wdiv.show(help2_html)}const themeKey="theme";function getTheme(){const a=localStorage.getItem(themeKey);a&&"light"==a?(document.body.classList.add("theme-light"),document.documentElement.classList.toggle("invert")):document.body.classList.add("theme-dark")}
|
9 |
function setLight(){document.documentElement.classList.toggle("invert");document.body.classList.remove("theme-dark");document.body.classList.add("theme-light");localStorage.setItem(themeKey,"light")}function setDark(){document.documentElement.classList.toggle("invert");document.body.classList.remove("theme-light");document.body.classList.add("theme-dark");localStorage.setItem(themeKey,"dark")}
|
10 |
-
function showPrompts(a){if(0!=Rag.prompts.length){for(const b of Rag.prompts)console.log(b);a=Rag.prompts.map((b,c)=>`[${c+1}]${b}\n`).join("\n");wnds.wpre.show(a)}};const ClientLLM=a=>{let b=null,c=!1;const d=(h,g=null,k=null
|
11 |
`Errore HTTP ${h.status}`;try{if(h.headers.get("Content-Type")?.includes("application/json")){if(g=await h.json(),400===h.status&&g){const n="string"===typeof g.error?g.error:g.message||g.error?.message;n&&(n.includes("token limit")||n.includes("token exceeded")||n.includes("input too long")||n.includes("context length")||n.includes("max tokens"))&&(m="Input troppo lungo - Superato il limite di token",k="TokenLimitError")}}else g=await h.text(),400===h.status&&(g.includes("token limit")||g.includes("input too long")||
|
12 |
g.includes("context length"))&&(m="Input troppo lungo - Superato il limite di token",k="TokenLimitError")}catch(n){g={message:"Impossibile estrarre i dettagli dell'errore"}}return e(m,k,h.status,"string"===typeof g?{message:g}:g)},l=h=>"AbortError"===h.name?c?e("Richiesta annullata dall'utente","CancellationError",499,{message:"La richiesta \u00e8 stata interrotta volontariamente dall'utente"}):e("Richiesta interrotta per timeout","TimeoutError",408,{message:"La richiesta \u00e8 stata interrotta a causa di un timeout",
|
13 |
isTimeout:!0}):"TypeError"===h.name&&h.message.includes("Failed to fetch")?e("Errore di rete","NetworkError",0,{message:"Impossibile raggiungere il server. Controlla la connessione."}):e("Errore imprevisto",h.name||"UnknownError",500,{message:h.message||"Si \u00e8 verificato un errore sconosciuto"});return{sendRequest:async(h,g,k=60)=>{c=!1;b=new AbortController;k=setTimeout(()=>{b&&b.abort()},1E3*k);try{const m=await fetch(h,{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},
|
14 |
-
body:JSON.stringify(g),signal:b.signal});if(c){const q=e("Richiesta annullata","CancellationError",499,{message:"La richiesta \u00e8 stata interrotta volontariamente dall'utente"});return d(!1,null,
|
|
|
15 |
help1_html="\n<div class=\"text\">\n <pre>\nUn'implementazione innovativa della tecnica RAG per il Question Answering\nLa tecnica RAG (Retrieval-Augmented Generation) \u00e8 un approccio consolidato nel campo del question answering e della generazione di testo, che combina il recupero di informazioni pertinenti da fonti di dati con la generazione di testo basata su queste informazioni.\nQui viene proposta un'implementazione che introduce una variazione a questo paradigma.\nL'implementazione si basa su una sequenza di prompt appositamente progettati per guidare un modello di linguaggio generativo attraverso le diverse fasi della tecnica RAG.\nQuesti prompt forniscono istruzioni dettagliate su come il modello deve seguire operazioni di recupero di informazioni, aumento delle informazioni recuperate e infine generazione di una risposta finale.\nLa risposta finale diviene poi il contesto da inserire nel prompt per rispondere alla domanda.\nUn aspetto cruciale di questa implementazione \u00e8 che lo stesso modello di linguaggio generativo svolge tutte le operazioni richieste, dall'analisi dei documenti di input al recupero di informazioni rilevanti, alla generazione della risposta finale.\nQuesta caratteristica rappresenta una deviazione significativa rispetto alle implementazioni standard della tecnica RAG, che prevedono l'utilizzo di moduli distinti per il recupero e la generazione.\nLa sequenza di prompt proposta guida il modello attraverso le seguenti fasi:\n\n1. Retrieval: Il modello analizza il documento di input e la domanda fornita, identificando e recuperando le informazioni e i concetti rilevanti per dare seguito alla domanda.\n\n2. Augmentation: Successivamente, il modello integra le informazioni recuperate con eventuali risposte accumulate in precedenza, estraendo nuove informazioni rilevanti e organizzandole in un elenco coerente, evitando ridondanze.\n\n3. Generation: Infine, il modello utilizza l'insieme di informazioni rilevanti e non ridondanti per generare una risposta completa e concisa alla domanda dell'utente.\n\nQuesta implementazione offre diversi vantaggi.\nIn primo luogo, sfrutta le capacit\u00e0 di un unico modello di grandi dimensioni, evitando la necessit\u00e0 di moduli distinti specializzati per ogni fase.\nInoltre, l'utilizzo di prompt espliciti pu\u00f2 migliorare la controllabilit\u00e0 e la trasparenza del processo, consentendo di guidare il modello in modo pi\u00f9 diretto.\nNaturalmente, come per qualsiasi approccio basato su modelli di linguaggio generativi, \u00e8 fondamentale prestare attenzione alle questioni di affidabilit\u00e0, correttezza e bias dei dati di addestramento.\nRispetto a un'implementazione standard di RAG vi \u00e8 la necessit\u00e0 di rilanciare l'elaborazione ad ogni domanda radicalmente nuova in quanto il contesto creato con le informazioni estratte dai documenti \u00e8 definito sulla base della domanda.\nInvece nella versione standard RAG si usano gli incorporamenti delle informazioni estratte dai documenti in modo tale che tali informazioni vengono viste quasi come un'estensione del modello e possono essere usate per domande diverse.\nQuindi dal punto di vista utente le implementazioni RAG standard sono pi\u00f9 efficienti; infatti l'implementazione proposta richiede per ogni nuova domanda una sequenza di richieste che saranno utilizzabili solo per creare il contesto per la domanda iniziale e per una conversazione con domande simili.\nIl vantaggio dell'implementazione proposta consiste nel fatto che pu\u00f2 essere implementata completamente lato client senza bisogno di sviluppare alcun modulo sul server.\nL\u2019unica cosa che serve \u00e8 un servizio serverless come quello di HuggingFace o simile.\nQuindi rappresenta un'interessante prospettiva sull'applicazione della tecnica RAG in modo pi\u00f9 integrato e controllato attraverso l'uso di prompt mirati.\nIn conclusione, questa implementazione della tecnica RAG dimostra come le capacit\u00e0 dei modelli di linguaggio generativi di grandi dimensioni possano essere sfruttate in modi nuovi e creativi, potenzialmente aprendo la strada a ulteriori sviluppi nel campo del question answering e della generazione di testo.\n\nQuesta \u00e8 la valutazione fatta da un LLM (comprensivo e gentile)\n\nLa mia valutazione personale della tua proposta di implementazione della tecnica RAG, con un elenco di pro e contro:\n\nPunti a favore (Pro):\nSemplificazione del processo: L'utilizzo di un unico modello di grandi dimensioni addestrato su vasti corpus di dati semplifica notevolmente l'architettura complessiva rispetto alle implementazioni tradizionali della tecnica RAG, che spesso prevedono moduli distinti per il recupero e la generazione.\n\nCapacit\u00e0 di adattamento e apprendimento: I modelli di linguaggio generativi di grandi dimensioni sono noti per la loro capacit\u00e0 di adattarsi e imparare da nuovi dati e istruzioni.\nQuesto potrebbe consentire di raffinare e migliorare l'implementazione nel corso del tempo.\n\nControllo e trasparenza: L'utilizzo di prompt espliciti per guidare il modello attraverso le diverse fasi del processo pu\u00f2 migliorare la controllabilit\u00e0 e la trasparenza, consentendo di monitorare e regolare il comportamento del modello in modo pi\u00f9 diretto.\n\nEfficienza computazionale: Avere un'unica architettura integrata potrebbe comportare vantaggi in termini di efficienza computazionale rispetto a soluzioni che prevedono moduli separati.\n\nPunti a sfavore (Contro):\n\nAffidabilit\u00e0 e coerenza: Poich\u00e9 un unico modello gestisce tutte le fasi, eventuali errori o incoerenze potrebbero propagarsi e amplificarsi attraverso l'intero processo, influenzando la qualit\u00e0 della risposta finale.\n\nBias dei dati di addestramento: Come per qualsiasi modello di linguaggio generativo, l\u2019approccio potrebbe essere influenzato dai bias presenti nei dati di addestramento utilizzati, con potenziali impatti sulla correttezza e l'equit\u00e0 delle risposte generate.\n\nMancanza di specializzazione: Mentre i modelli di grandi dimensioni sono versatili, potrebbero non essere ottimizzati per compiti specifici come il recupero di informazioni o la generazione di risposte rispetto a moduli specializzati.\n\nDifficolt\u00e0 di debug e interpretabilit\u00e0: Con un'architettura integrata e basata su prompt, potrebbe essere pi\u00f9 complesso eseguire il debug e comprendere le ragioni dietro a eventuali errori o comportamenti indesiderati del modello.\n\nIn sintesi, la proposta presenta alcuni vantaggi interessanti in termini di semplificazione, adattabilit\u00e0 e controllo, ma solleva anche potenziali preoccupazioni riguardo all'affidabilit\u00e0, ai bias, alla mancanza di specializzazione e alle difficolt\u00e0 di debug e interpretabilit\u00e0.\nCome per qualsiasi nuovo approccio, sarebbe necessario valutarlo attentamente attraverso sperimentazioni e test approfonditi per determinare l'efficacia e l'applicabilit\u00e0 in contesti specifici.\n </pre>\n</div>\n",
|
16 |
help2_html='\n<div class="text">\n <pre class="pre-text">\nNella redazione della domanda bisogna tenere conto del fatto che la domanda viene poi inserita in un prompt nel quale si fa esplicita richiesta di utilizzare il documento fornito.\nQuindi \u00e8 implicito il riferimento al/ai documenti archiviati.\nTuttavia, quando si tratta di documenti il cui contenuto \u00e8 sicuramente disponibile su internet, pu\u00f2 essere opportuno esplicitare nella domanda che ci si riferisce ai documenti forniti.\n</pre>\n <p class="center">Esempi di domande</p>\n <div>\n <p>Fai una relazione sul documento che ti ho fornito.</p>\n <p>Approfondisci la tesi sostenuta nei documenti.</p>\n <p>Confronta i diversi punti di vista espressi dagli autori.</p>\n <p>Descrivi la personalit\u00e0 dei protagonisti.</p>\n <p>Analizza il documento che ti ho fornito e illustrami eventuali contraddizioni.</p>\n <p>Illustra i momenti salienti del racconto.</p>\n <p>Analizzando il documento che ti ho fornito, confronta le tesi di ... con quelle di ...</p>\n <p>Qual \u00e8 l\'avvenimento pi\u00f9 importante?</p>\n </div>\n</div>\n';function removeTag(a){a=a.replace(/<<</g,"").replace(/>>>/g,"");return a=a.replace(/<</g,"").replace(/>>/g,"")}
|
17 |
function cleanDoc(a){try{return a=a.replace(/`/g,""),a=removeTag(a),a=a.replace(/(\w+)-\s*\n(\w+)/g,"$1$2"),a=a.replace(/[\u00AD\u200B\u200C\u200D\u2060\uFEFF\u0008]/g,""),a=a.replace(/[\u00A0\u2000-\u200A\u202F\u205F\u3000\t\r\f\v]/g," "),a=a.replace(/\\([nrtfb])/g,"$1"),a=a.replace(/\\(u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2})/g,"$1"),a=a.replace(/\\([a-zA-Z]:\\|\\\\[a-zA-Z0-9_]+\\)/g,"\\$1"),a=a.replace(/\\/g,""),a=a.replace(/(.)\1{3,}/g,""),a=a.replace(/\u201c/g,'"').replace(/\u201d/g,'"'),a=a.replace(/\n/g,
|
@@ -22,10 +23,10 @@ return e}function textFormatter(a){a=a.replace(/<[^>]*>/g,"").split(/([.!?:])(?=
|
|
22 |
return a},saveArray(a,b){b=JSON.stringify(b);UaDb.save(a,b)},readArray(a){a=UaDb.read(a);return 0==a.trim().length?[]:JSON.parse(a)},saveJson(a,b){b=JSON.stringify(b);UaDb.save(a,b)},readJson(a){return(a=UaDb.read(a))?JSON.parse(a):{}}},DataMgr={docs:[],doc_names:[],linkToName(a){a=a.split("/");return a[a.length-1]},async loadDoc(a){this.readDbDocNames();try{const b=await requestGet(a),c=cleanDoc(b),d=this.linkToName(a);if(this.doc_names.includes(d))alert(`Il documento ${d} \u00e8 gi\u00e0 caricato`);
|
23 |
else return this.doc_names.push(d),this.docs.push(c),this.saveDbDocs(),c}catch(b){alert("loadDoc()\n"+b+"\n"+a)}},addDoc(a,b){b=cleanDoc(b);this.docs.push(b);this.doc_names.push(a);this.saveDbDocs()},saveDbDocs(){UaDb.saveArray(ID_DOC_NAMES,this.doc_names);UaDb.saveArray(ID_DOCS,this.docs)},readDbDocs(){this.docs=UaDb.readArray(ID_DOCS)},readDbDocNames(){return this.doc_names=UaDb.readArray(ID_DOC_NAMES)},deleteJsonDati(){const a=UaDb.getAllIds();for(const b of a)[ID_DOCS,ID_DOC_NAMES].includes(b)||
|
24 |
UaDb.delete(b);Rag.ragQuery="";Rag.ragContext="";Rag.ragAnswer="";Rag.answers=[];Rag.prompts=[];ThreadMgr.rows=[]}};async function requestGet(a){try{var b=await fetch(a,{method:"GET",headers:{"Content-Type":"text/plain;charset=UTF-8"}});if(!b.ok)throw Error(`HTTP error! status: ${b.status}`);const c=await b.arrayBuffer();return(new TextDecoder("utf-8")).decode(c)}catch(c){throw console.error(`Error in requestGet() for url: ${a}`,c),b=c.message.includes("HTTP error! status")?c.message:c.message.includes("NetworkError")?"Network error occurred":"An unknown error occurred",alert(`requestGet()\nurl: ${a}\n${b}`),c;
|
25 |
-
}}function loadScript(a,b){const c=document.createElement("script");c.src=a;c.onload=()=>{b();document.head.removeChild(c)};c.onerror=()=>{alert(`Errore: Impossibile caricare lo script ${a}`)};document.head.appendChild(c)};const ID_RAG="id_rag",ID_THREAD="id_thread",ID_RESPONSES="id_responses",ID_DOC_NAMES="id_doc_names",ID_DOCS="id_docs",PROMPT_DECR=10240,maxLenRequest=(a=32)=>{a*=
|
26 |
console.log("\n**** MODELl:\n",MODEL);console.log(API);
|
27 |
-
const client=ClientLLM(API),getResponse=async(a,b=60)=>{a.model=MODEL;a=await client.sendRequest(
|
28 |
-
|
29 |
get_sum_generate_tokens(){return this.sum_generate_tokens}};function cancelClientRequest(){client.cancelRequest()}
|
30 |
const getPromptTokens=a=>(a=a.details.message.match(/Prompt contains (\d+) tokens/))?parseInt(a[1],10):null,getModelToken=a=>(a=a.details.message.match(/model with (\d+) maximum context length/))?parseInt(a[1],10):null,isTooLarge=a=>a.details.message.includes("too large"),truncateInput=(a,b)=>a.substring(0,a.length-b),getPartSize=(a,b,c)=>{c=MAX_PROMPT_LENGTH-c;a.length+b.length<c?c=a.length:(a=a.indexOf(".",c),a=(-1!==a?a:c)+1,a>c+100&&(a=c),c=a);return c},getPartDoc=(a,b)=>{const c=a.substring(0,
|
31 |
b);a=a.substring(b).trim();return[c,a]},ragLog=(a,b,c,d)=>{const e=MAX_PROMPT_LENGTH;d=d.reduce((f,l)=>f+l.length,0);xlog(`${a} mx:${e} lft:${b} rgt:${c} arr:${d}`);a=formatRow([a,b,c,d],[8,-7,-7,-7]);UaLog.log(a)},Rag={ragContext:"",ragQuery:"",ragAnswer:"",answers:[],docContextLst:[],prompts:[],doc:"",doc_part:"",init(){this.readRespsFromDb();this.readFromDb();calcTokens.init()},returnOk(){return 10<this.ragContext.length},saveToDb(){UaDb.saveJson(ID_RAG,{context:this.ragContext,ragquery:this.ragQuery,
|
@@ -223,8 +224,8 @@ class DocxHandler{constructor(){this.scriptElement=this.mammoth=null}async loadM
|
|
223 |
window.confirm;window.alert=function(a){a instanceof Error&&(a=a.message);return DialogManager.showDialog("alert",a)};window.confirm=function(a){return DialogManager.showDialog("confirm",a)};const nodrag_tds=["input","select","a"],nodrag_cls="nodrag";
|
224 |
var UaDrag=function(a){return function(b){let c=0,d=0,e=0,f=0;const l=function(g){g=g||window.event;g.preventDefault();c=e-g.clientX;d=f-g.clientY;e=g.clientX;f=g.clientY;b.style.top=b.offsetTop-d+"px";b.style.left=b.offsetLeft-c+"px"},h=function(){document.onmouseup=null;document.onmousemove=null};b.onmousedown=function(g){g=g||window.event;let k=g.target;!(k=k||null)||nodrag_tds.includes(k.tagName.toLowerCase())||k.classList.contains(nodrag_cls)||(g.preventDefault(),e=g.clientX,f=g.clientY,document.onmouseup=
|
225 |
h,document.onmousemove=l)}}(a)};const UaJtfh=()=>({rows:[],init(){this.rows=[];return this},insert(a){this.rows.unshift(a);return this},append(a){this.rows.push(a);return this},text(a=""){return this.rows.join(a)},html(a=""){return this.rows.join(a).replace(/\s+|\[rn\]/g," ")}});function formatRow(a,b){return a.map((c,d)=>{d=b[d];return 0>d?c.toString().padStart(Math.abs(d)," "):c.toString().padEnd(d," ")}).join(" ")}
|
226 |
-
var UaLog={callHide:function(){},callShow:function(){},active:!1,wind:null,x:null,y:null,z:null,max_length:2E3,msg_id:"ualogmsg_",new:function(){null==this.wind&&(this.wind=UaWindowAdm.create("ualog_id"));this.wind.setHtml('\n <button type="button" class="clear " onclick="javascript:UaLog.cls();">Clear</button>\n <button type="button" class="close " onclick="javascript:UaLog.close();">Close</button>\n <pre id="ualogmsg_" ></pre>');this.wind.addClassStyle("inv");
|
227 |
-
this.wind.vw_vh().setXY(this.x,this.y,-1):this.wind.setCenter(-1);this.z&&this.wind.setZ(this.z);return this},setXY(a,b){this.x=a;this.y=b;return this},setZ(a){this.z=a;return this},prn_(...a){a=a.join("\n");let b=document.getElementById(this.msg_id);b.textContent=b.textContent+a+"\n"},print(...a){null!=this.wind&&this.active&&this.prn_(...a)},log(...a){null!=this.wind&&this.prn_(...a)},log_show(...a){null!=this.wind&&(this.active||this.toggle(),this.prn_(...a))},cls(){if(null!=this.wind)return document.getElementById(this.msg_id).innerHTML=
|
228 |
"",this},close(){null!=this.wind&&(this.wind.hide(),this.active=!1,this.callHide())},toggle(){null!=this.wind&&(this.active?(this.active=!1,this.wind.hide(),this.callHide()):(this.active=!0,this.wind.show(),this.callShow()))}};var UaWindowAdm={ws:{},create(a,b=null){let c=document.getElementById(a);c||(c=document.createElement("div"),b?document.getElementById(b).appendChild(c):document.body.appendChild(c),c.id=a,c.setAttribute("data-name","ua-window"),b=this.newUaWindow(c),this.ws[a]=b);a=this.ws[a];c.style.display="none";return a},get(a){return this.ws[a]?this.ws[a]:null},show(a){this.ws[a]&&this.ws[a].show()},close(a){this.ws[a]&&this.ws[a].close()},toggle(a){this.ws[a]&&this.ws[a].toggle()},hide(a){this.ws[a]&&this.ws[a].hide()},
|
229 |
closeThis(a){a=a.closest('[data-name="ua-window"]').id;this.ws[a].close()},showAll(){for(let a in this.ws)this.ws[a].show()},hideAll(){for(let a in this.ws)this.ws[a].hide()},closeAll(){for(let a in this.ws)this.ws[a].close()},remove(a){this.ws[a]&&(document.getElementById(a).remove(),this.ws[a]=null,delete this.ws[a])},removeAll(){for(let a in this.ws)this.remove(a);this.ws={}},newUaWindow(a){let b={initialize(c){this.w=c;this.wy=this.wx="0px";this.isVisible=this.isOpen=!1;this.firstShow=!0;this.wz=
|
230 |
this.pos=0;this.vh=this.vw="px"},vw_vh(){this.vw="vw";this.vh="vh";return this},addClassStyle(c){this.w.classList.contains(c)||this.w.classList.add(c);return this},removeClassStyle(c){this.w.classList.contains(c)&&this.w.classList.remove(c);return this},getWindow(){alert("getWindow => ??");return this.w},getElement(){return this.w},getId(){return this.w.id},setStyle(c){for(const d in c)this.w.style[d]=c[d];return this},setHtml(c){this.w.innerHTML=c;return this},getHtml(){return this.w.innerHTML},
|
|
|
1 |
+
const VERS="0.2.02";var xlog=function(){};const stopRequest=async()=>{await confirm("Confermi Cancellazione Richeista ?")&&(cancelClientRequest(),hideSpinner())},showSpinner=()=>{const a=document.getElementById("spinner");a.classList.add("show-spinner");a.addEventListener("click",stopRequest)},hideSpinner=()=>{const a=document.getElementById("spinner");a.classList.remove("show-spinner");a.removeEventListener("click",stopRequest)};
|
2 |
function openApp(){setTimeout(()=>{wnds.init();Menu.init();TextInput.init();TextOutput.init();Rag.init();document.querySelector(".menu-btn").checked=!1;release();showHistory();getTheme()},10)}function showHistory(){const a=ThreadMgr.getThread();setOutText(a)}function release(){document.querySelector(".release").innerHTML=VERS}const op0=function(a){wnds.wdiv.show(help1_html)};function showQuery(a){wnds.wpre.show(`\n${Rag.ragQuery}`)}
|
3 |
function showRagResponse(a){wnds.wpre.show(`\n${Rag.ragAnswer}`)}function showThread(a){a=ThreadMgr.getThread();wnds.wpre.show(a)}function elencoRisposte(a){a=[...Rag.answers];0==a.length&&(a=UaDb.readArray(ID_RESPONSES));0!=a.length&&(a=a.map((b,c)=>`\n[${c+1}]\n ${b.trim()}`).join("\n"),wnds.wpre.show(a))}function showContesto(a){wnds.wpre.show(Rag.ragContext)}
|
4 |
function elencoDati(a){var b=UaDb.getAllIds();a=[];for(var c of b)b=UaDb.read(c).length,a.push(`${c} (${b})`);c=a.join("\n ");wnds.wpre.show(c)}const showT=a=>{wnds.wpre.show(DataMgr.docs[a])};function elencoDocs(){DataMgr.readDbDocs();DataMgr.readDbDocNames();var a=DataMgr.doc_names,b=UaJtfh();let c=0;b.append("<ul>");for(const l of a){a=b;var d=a.append,e=l,f=c++;d.call(a,`
|
|
|
7 |
async function deleteDati(a){await confirm("Confermi cancellazione dati?")&&(DataMgr.deleteJsonDati(),wnds.wdiv.close(),wnds.wpre.close(),TextOutput.clear())}async function deleteStorage(a){await confirm("Confermi cancellazione documenti & dati?")&&(DataMgr.deleteJsonDati(),localStorage.clear(),wnds.wdiv.close(),wnds.wpre.close(),TextOutput.clear(),DataMgr.docs=[],DataMgr.doc_names=[])}async function help1(a){a=await requestGet("./data/help_test.html");wnds.wdiv.show(a)}
|
8 |
function loadTestoEsempio(a){DataMgr.loadDoc(`data/${a}`);wnds.wdiv.close()}function help2(a){wnds.wdiv.show(help2_html)}const themeKey="theme";function getTheme(){const a=localStorage.getItem(themeKey);a&&"light"==a?(document.body.classList.add("theme-light"),document.documentElement.classList.toggle("invert")):document.body.classList.add("theme-dark")}
|
9 |
function setLight(){document.documentElement.classList.toggle("invert");document.body.classList.remove("theme-dark");document.body.classList.add("theme-light");localStorage.setItem(themeKey,"light")}function setDark(){document.documentElement.classList.toggle("invert");document.body.classList.remove("theme-light");document.body.classList.add("theme-dark");localStorage.setItem(themeKey,"dark")}
|
10 |
+
function showPrompts(a){if(0!=Rag.prompts.length){for(const b of Rag.prompts)console.log(b);a=Rag.prompts.map((b,c)=>`[${c+1}]${b}\n`).join("\n");wnds.wpre.show(a)}};const ClientLLM=a=>{let b=null,c=!1;const d=(h,g=null,k=null)=>({ok:h,response:g,error:k}),e=(h,g,k,m)=>({message:h||null,type:g||null,code:k||null,details:{message:m?.message||null,type:m?.type||null,param:m?.param||null,code:m?.code||null}}),f=async h=>{let g,k="HTTPError",m={400:"Richiesta non valida",401:"Non autorizzato - Controlla la API key",403:"Accesso negato",404:"Endpoint non trovato",429:"Troppe richieste - Rate limit superato",500:"Errore interno del server",503:"Servizio non disponibile"}[h.status]||
|
11 |
`Errore HTTP ${h.status}`;try{if(h.headers.get("Content-Type")?.includes("application/json")){if(g=await h.json(),400===h.status&&g){const n="string"===typeof g.error?g.error:g.message||g.error?.message;n&&(n.includes("token limit")||n.includes("token exceeded")||n.includes("input too long")||n.includes("context length")||n.includes("max tokens"))&&(m="Input troppo lungo - Superato il limite di token",k="TokenLimitError")}}else g=await h.text(),400===h.status&&(g.includes("token limit")||g.includes("input too long")||
|
12 |
g.includes("context length"))&&(m="Input troppo lungo - Superato il limite di token",k="TokenLimitError")}catch(n){g={message:"Impossibile estrarre i dettagli dell'errore"}}return e(m,k,h.status,"string"===typeof g?{message:g}:g)},l=h=>"AbortError"===h.name?c?e("Richiesta annullata dall'utente","CancellationError",499,{message:"La richiesta \u00e8 stata interrotta volontariamente dall'utente"}):e("Richiesta interrotta per timeout","TimeoutError",408,{message:"La richiesta \u00e8 stata interrotta a causa di un timeout",
|
13 |
isTimeout:!0}):"TypeError"===h.name&&h.message.includes("Failed to fetch")?e("Errore di rete","NetworkError",0,{message:"Impossibile raggiungere il server. Controlla la connessione."}):e("Errore imprevisto",h.name||"UnknownError",500,{message:h.message||"Si \u00e8 verificato un errore sconosciuto"});return{sendRequest:async(h,g,k=60)=>{c=!1;b=new AbortController;k=setTimeout(()=>{b&&b.abort()},1E3*k);try{const m=await fetch(h,{method:"POST",headers:{Authorization:`Bearer ${a}`,"Content-Type":"application/json"},
|
14 |
+
body:JSON.stringify(g),signal:b.signal});if(c){const q=e("Richiesta annullata","CancellationError",499,{message:"La richiesta \u00e8 stata interrotta volontariamente dall'utente"});return d(!1,null,q)}if(!m.ok){console.error("error ok=false\n",m);const q=await f(m);return d(!1,null,q)}const n=await m.json();return d(!0,n,null)}catch(m){const n=l(m);console.error("error network:\n",m);return d(!1,null,n)}finally{clearTimeout(k),b=null}},createError:e,cancelRequest:()=>{c=!0;return b?(b.abort(),b=null,
|
15 |
+
!0):!1}}};const help0_html='\n<div class="text">\n <p class="center"> Comandi barra superiore </p>\n <div>\n Pulsante Menu\n <p> Apre/chiude il Menu comandi </p>\n </div>\n <div>\n Upload Files\n <p>\n Fa l\'upload di un file locale. Sono accettati i file pdf, docx e txt.\n Controlla se il file \u00e8 in archivio, per non sovrascriverlo.\n </p>\n </div>\n <div>\n Upload Dir:\n <p>\n Per fare l\'upload dei files di una directory. Sono accettati i files pdf, docx e txt.\n I file in archivio con lo stesso nome non vengono sovrascritti.\n </p>\n </div>\n <div>\n Log:\n <p>\n Attiva/Disattiva la visualizzazione del Log.\n Nel Log sono visualizzate le query con le dimensioni delle parti di documento analizzate.\n </p>\n </div>\n\n \x3c!-- --\x3e\n <hr>\n \x3c!-- --\x3e\n <div>\n <p class="center"> Comandi lato destro in alto: </p>\n </div>\n <div>\n Copia Output:\n <p> Copia il testo dell\'output negli appunti. </p>\n </div>\n <div>\n Apri Output:\n <p> Visualizza il testo in una finestra pi\u00f9 grande. </p>\n </div>\n <hr>\n \x3c!-- --\x3e\n <div>\n <p class="center"> Comandi lato destro in basso: </p>\n </div>\n <div>\n Documenti => RAG => Contesto => Query: (Pulsante Rosso)\n <p>\n Input per la query da utilizzare per la elaborazione RAG.\n <br>\n Ogni documento in archivio \u00e8 diviso in parti compatibili con l\'ampiezza della finestra\n di input del Model utilizzato.\n </p>\n <p>\n Per ogni parte esegue una query utilizzandola per estrarre informazioni/concetti pertinenti alla stessa.\n </p>\n <p>\n Il risultato di ogni query \u00e8 archiviato nella memoria locale.\n </p>\n <p>\n Alla fine della sequenza di elaborazioni esegue una query che produce\n un contesto riepilogativo delle risposte archiviate.\n </p>\n <p>\n Infine esegue la query utilizzando il contesto creato e visualizza la risposta nella finestra di output.\n </p>\n </div>\n <div>\n Contesto => Query: (Pulsante Verde / Invio)\n <p>\n Input per query che utilizzano il contesto creato con l\'elaborazione RAG.\n Il contesto RAG pu\u00f2 essere vuoto.\n Inizia una conversazione.\n </p>\n <p>\n La conversazione ha senso relativamente all\'elaborazione RAG se ogni query \u00e8 una variazione / approfondimento della query iniziale.\n </p>\n </div>\n <div>\n Cancella Conversazione:\n <p>\n Cancella la storia della conversazione attiva.\n Non vengono cancellati i dati dell\'elaborazione RAG\n </p>\n Per andare a capo: Maiusc. + Invio\n </div>\n \x3c!-- --\x3e\n <hr>\n \x3c!-- --\x3e\n <div>\n <p class=" center"> Comandi del Menu: </p>\n </div>\n <div>\n README\n <p>\n Presenta una spiegazione della implementazione della\n tecnologia RAG utilizzata.\n </p>\n </div>\n <div>\n Risposta Contestuale:\n <p> Visualizza la risposta ottenuta alla fine della elaborazione RAG </p>\n </div>\n <div>\n Domanda iniziale:\n <p> Visualizza la query utilizzata per l\'elaborazione RAG </p>\n </div>\n <div>\n Elenco Risposte:\n <p>\n Visualizza l\'elenco delle risposte per ogni parte documento utilizzata fino alla risposta che genera il contesto.\n </p>\n </div>\n <div>\n Contesto RAG:\n <p>\n Visualizza il contesto creato utilizzando le risposte elaborate.\n </p>\n </div>\n <div>\n Dati Archiviati:\n <p>\n Visualizza i dati in archivio e le loro dimensioni:\n </p>\n </div>\n <div>\n Elenco Documenti:\n <p>\n Visualizza la lista dei documenti archiviati ed utilizzabili per l\'elaborazione.<br>\n Con il clic del mouse sul nome di un documento si visualizza.\n </p>\n </div>\n\n <div>\n Numero query:\n <p>\n Calcola le query necessarie per ogni documento e le Query totali,\n necessarie per analizzare tutti i documenti caricati.\n </p>\n </div>\n\n <div>\n Cancella Dati:\n <p>\n Cancella i dati delle elaborazioni salvati nell\'archivio.\n NON cancella i documenti caricati.\n </p>\n </div>\n\n <div>\n Cancella Documenti:\n <p>\n Cancella i documenti caricati e tutti i dati archiviati localmente.\n </p>\n </div>\n\n \x3c!-- --\x3e\n\n <p class="center">Sequenza Comandi Interrogazione -Conversazione</p>\n <div>\n Archivia nella memoria locale uno o pi\u00f9 documenti:\n <p>\n Utilizza i dati di esempio per le prime prove.\n Utilizza upload file o upload dir per i documenti da leggere dal tuo computer.\n </p>\n </div>\n <div>\n Digita una query che si riferisca ai documenti archiviati.\n <p>\n La query sar\u00e0 utilizzata come criterio di selezione di informazioni dai documenti archiviati.\n </p>\n </div>\n\n <div>\n Click sul bottone rosso in basso a destra. Documento => RAG => Contesto => Query\n <p>\n Viene lanciata una sequenza di elaborazione per analizzare i documenti sulla base della query.\n Se il log \u00e8 attivo vedrai la sequenza di elaborazione.\n <br>\n Il loro numero dipende dalle dimensioni dei documenti.\n <br>\n l menu puoi utilizzare il comando "Num Query" per vedere quante elaborazioni saranno fatte per ogni documento.\n <br>\n Alla fine del processo sar\u00e0 visualizzata la risposta.\n </p>\n </div>\n\n <div>\n Click sul bottone verde in basso a destra (oppure Invio). Contesto => Query\n <p>\n Inizia una conversazione utilizzando le informazioni precedentemente raccolte dai documenti.\n Puoi inviare domande successive di approfondimento e chiarimento.\n <br>\n \u00c8 FONDAMENTALE che le query siano approfondimenti e/o chiarimenti della query iniziale.\n In caso contrario non si sfrutta il Contesto creato dall\'elaborazione precedente.\n <br>\n Quindi per una query completamente nuova (sempre relativa ai documenti archiviati) \u00e8 necessario iniziare una nuova elaborazione.\n <br>\n Il comando cancella, oltre a cancellare il campo di input cancella anche la sequenza query-risposte della\n conversazione.\n <br>\n NON cancella i dati dell\'elaborazione iniziale.\n </p>\n </div>\n</div>\n',
|
16 |
help1_html="\n<div class=\"text\">\n <pre>\nUn'implementazione innovativa della tecnica RAG per il Question Answering\nLa tecnica RAG (Retrieval-Augmented Generation) \u00e8 un approccio consolidato nel campo del question answering e della generazione di testo, che combina il recupero di informazioni pertinenti da fonti di dati con la generazione di testo basata su queste informazioni.\nQui viene proposta un'implementazione che introduce una variazione a questo paradigma.\nL'implementazione si basa su una sequenza di prompt appositamente progettati per guidare un modello di linguaggio generativo attraverso le diverse fasi della tecnica RAG.\nQuesti prompt forniscono istruzioni dettagliate su come il modello deve seguire operazioni di recupero di informazioni, aumento delle informazioni recuperate e infine generazione di una risposta finale.\nLa risposta finale diviene poi il contesto da inserire nel prompt per rispondere alla domanda.\nUn aspetto cruciale di questa implementazione \u00e8 che lo stesso modello di linguaggio generativo svolge tutte le operazioni richieste, dall'analisi dei documenti di input al recupero di informazioni rilevanti, alla generazione della risposta finale.\nQuesta caratteristica rappresenta una deviazione significativa rispetto alle implementazioni standard della tecnica RAG, che prevedono l'utilizzo di moduli distinti per il recupero e la generazione.\nLa sequenza di prompt proposta guida il modello attraverso le seguenti fasi:\n\n1. Retrieval: Il modello analizza il documento di input e la domanda fornita, identificando e recuperando le informazioni e i concetti rilevanti per dare seguito alla domanda.\n\n2. Augmentation: Successivamente, il modello integra le informazioni recuperate con eventuali risposte accumulate in precedenza, estraendo nuove informazioni rilevanti e organizzandole in un elenco coerente, evitando ridondanze.\n\n3. Generation: Infine, il modello utilizza l'insieme di informazioni rilevanti e non ridondanti per generare una risposta completa e concisa alla domanda dell'utente.\n\nQuesta implementazione offre diversi vantaggi.\nIn primo luogo, sfrutta le capacit\u00e0 di un unico modello di grandi dimensioni, evitando la necessit\u00e0 di moduli distinti specializzati per ogni fase.\nInoltre, l'utilizzo di prompt espliciti pu\u00f2 migliorare la controllabilit\u00e0 e la trasparenza del processo, consentendo di guidare il modello in modo pi\u00f9 diretto.\nNaturalmente, come per qualsiasi approccio basato su modelli di linguaggio generativi, \u00e8 fondamentale prestare attenzione alle questioni di affidabilit\u00e0, correttezza e bias dei dati di addestramento.\nRispetto a un'implementazione standard di RAG vi \u00e8 la necessit\u00e0 di rilanciare l'elaborazione ad ogni domanda radicalmente nuova in quanto il contesto creato con le informazioni estratte dai documenti \u00e8 definito sulla base della domanda.\nInvece nella versione standard RAG si usano gli incorporamenti delle informazioni estratte dai documenti in modo tale che tali informazioni vengono viste quasi come un'estensione del modello e possono essere usate per domande diverse.\nQuindi dal punto di vista utente le implementazioni RAG standard sono pi\u00f9 efficienti; infatti l'implementazione proposta richiede per ogni nuova domanda una sequenza di richieste che saranno utilizzabili solo per creare il contesto per la domanda iniziale e per una conversazione con domande simili.\nIl vantaggio dell'implementazione proposta consiste nel fatto che pu\u00f2 essere implementata completamente lato client senza bisogno di sviluppare alcun modulo sul server.\nL\u2019unica cosa che serve \u00e8 un servizio serverless come quello di HuggingFace o simile.\nQuindi rappresenta un'interessante prospettiva sull'applicazione della tecnica RAG in modo pi\u00f9 integrato e controllato attraverso l'uso di prompt mirati.\nIn conclusione, questa implementazione della tecnica RAG dimostra come le capacit\u00e0 dei modelli di linguaggio generativi di grandi dimensioni possano essere sfruttate in modi nuovi e creativi, potenzialmente aprendo la strada a ulteriori sviluppi nel campo del question answering e della generazione di testo.\n\nQuesta \u00e8 la valutazione fatta da un LLM (comprensivo e gentile)\n\nLa mia valutazione personale della tua proposta di implementazione della tecnica RAG, con un elenco di pro e contro:\n\nPunti a favore (Pro):\nSemplificazione del processo: L'utilizzo di un unico modello di grandi dimensioni addestrato su vasti corpus di dati semplifica notevolmente l'architettura complessiva rispetto alle implementazioni tradizionali della tecnica RAG, che spesso prevedono moduli distinti per il recupero e la generazione.\n\nCapacit\u00e0 di adattamento e apprendimento: I modelli di linguaggio generativi di grandi dimensioni sono noti per la loro capacit\u00e0 di adattarsi e imparare da nuovi dati e istruzioni.\nQuesto potrebbe consentire di raffinare e migliorare l'implementazione nel corso del tempo.\n\nControllo e trasparenza: L'utilizzo di prompt espliciti per guidare il modello attraverso le diverse fasi del processo pu\u00f2 migliorare la controllabilit\u00e0 e la trasparenza, consentendo di monitorare e regolare il comportamento del modello in modo pi\u00f9 diretto.\n\nEfficienza computazionale: Avere un'unica architettura integrata potrebbe comportare vantaggi in termini di efficienza computazionale rispetto a soluzioni che prevedono moduli separati.\n\nPunti a sfavore (Contro):\n\nAffidabilit\u00e0 e coerenza: Poich\u00e9 un unico modello gestisce tutte le fasi, eventuali errori o incoerenze potrebbero propagarsi e amplificarsi attraverso l'intero processo, influenzando la qualit\u00e0 della risposta finale.\n\nBias dei dati di addestramento: Come per qualsiasi modello di linguaggio generativo, l\u2019approccio potrebbe essere influenzato dai bias presenti nei dati di addestramento utilizzati, con potenziali impatti sulla correttezza e l'equit\u00e0 delle risposte generate.\n\nMancanza di specializzazione: Mentre i modelli di grandi dimensioni sono versatili, potrebbero non essere ottimizzati per compiti specifici come il recupero di informazioni o la generazione di risposte rispetto a moduli specializzati.\n\nDifficolt\u00e0 di debug e interpretabilit\u00e0: Con un'architettura integrata e basata su prompt, potrebbe essere pi\u00f9 complesso eseguire il debug e comprendere le ragioni dietro a eventuali errori o comportamenti indesiderati del modello.\n\nIn sintesi, la proposta presenta alcuni vantaggi interessanti in termini di semplificazione, adattabilit\u00e0 e controllo, ma solleva anche potenziali preoccupazioni riguardo all'affidabilit\u00e0, ai bias, alla mancanza di specializzazione e alle difficolt\u00e0 di debug e interpretabilit\u00e0.\nCome per qualsiasi nuovo approccio, sarebbe necessario valutarlo attentamente attraverso sperimentazioni e test approfonditi per determinare l'efficacia e l'applicabilit\u00e0 in contesti specifici.\n </pre>\n</div>\n",
|
17 |
help2_html='\n<div class="text">\n <pre class="pre-text">\nNella redazione della domanda bisogna tenere conto del fatto che la domanda viene poi inserita in un prompt nel quale si fa esplicita richiesta di utilizzare il documento fornito.\nQuindi \u00e8 implicito il riferimento al/ai documenti archiviati.\nTuttavia, quando si tratta di documenti il cui contenuto \u00e8 sicuramente disponibile su internet, pu\u00f2 essere opportuno esplicitare nella domanda che ci si riferisce ai documenti forniti.\n</pre>\n <p class="center">Esempi di domande</p>\n <div>\n <p>Fai una relazione sul documento che ti ho fornito.</p>\n <p>Approfondisci la tesi sostenuta nei documenti.</p>\n <p>Confronta i diversi punti di vista espressi dagli autori.</p>\n <p>Descrivi la personalit\u00e0 dei protagonisti.</p>\n <p>Analizza il documento che ti ho fornito e illustrami eventuali contraddizioni.</p>\n <p>Illustra i momenti salienti del racconto.</p>\n <p>Analizzando il documento che ti ho fornito, confronta le tesi di ... con quelle di ...</p>\n <p>Qual \u00e8 l\'avvenimento pi\u00f9 importante?</p>\n </div>\n</div>\n';function removeTag(a){a=a.replace(/<<</g,"").replace(/>>>/g,"");return a=a.replace(/<</g,"").replace(/>>/g,"")}
|
18 |
function cleanDoc(a){try{return a=a.replace(/`/g,""),a=removeTag(a),a=a.replace(/(\w+)-\s*\n(\w+)/g,"$1$2"),a=a.replace(/[\u00AD\u200B\u200C\u200D\u2060\uFEFF\u0008]/g,""),a=a.replace(/[\u00A0\u2000-\u200A\u202F\u205F\u3000\t\r\f\v]/g," "),a=a.replace(/\\([nrtfb])/g,"$1"),a=a.replace(/\\(u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2})/g,"$1"),a=a.replace(/\\([a-zA-Z]:\\|\\\\[a-zA-Z0-9_]+\\)/g,"\\$1"),a=a.replace(/\\/g,""),a=a.replace(/(.)\1{3,}/g,""),a=a.replace(/\u201c/g,'"').replace(/\u201d/g,'"'),a=a.replace(/\n/g,
|
|
|
23 |
return a},saveArray(a,b){b=JSON.stringify(b);UaDb.save(a,b)},readArray(a){a=UaDb.read(a);return 0==a.trim().length?[]:JSON.parse(a)},saveJson(a,b){b=JSON.stringify(b);UaDb.save(a,b)},readJson(a){return(a=UaDb.read(a))?JSON.parse(a):{}}},DataMgr={docs:[],doc_names:[],linkToName(a){a=a.split("/");return a[a.length-1]},async loadDoc(a){this.readDbDocNames();try{const b=await requestGet(a),c=cleanDoc(b),d=this.linkToName(a);if(this.doc_names.includes(d))alert(`Il documento ${d} \u00e8 gi\u00e0 caricato`);
|
24 |
else return this.doc_names.push(d),this.docs.push(c),this.saveDbDocs(),c}catch(b){alert("loadDoc()\n"+b+"\n"+a)}},addDoc(a,b){b=cleanDoc(b);this.docs.push(b);this.doc_names.push(a);this.saveDbDocs()},saveDbDocs(){UaDb.saveArray(ID_DOC_NAMES,this.doc_names);UaDb.saveArray(ID_DOCS,this.docs)},readDbDocs(){this.docs=UaDb.readArray(ID_DOCS)},readDbDocNames(){return this.doc_names=UaDb.readArray(ID_DOC_NAMES)},deleteJsonDati(){const a=UaDb.getAllIds();for(const b of a)[ID_DOCS,ID_DOC_NAMES].includes(b)||
|
25 |
UaDb.delete(b);Rag.ragQuery="";Rag.ragContext="";Rag.ragAnswer="";Rag.answers=[];Rag.prompts=[];ThreadMgr.rows=[]}};async function requestGet(a){try{var b=await fetch(a,{method:"GET",headers:{"Content-Type":"text/plain;charset=UTF-8"}});if(!b.ok)throw Error(`HTTP error! status: ${b.status}`);const c=await b.arrayBuffer();return(new TextDecoder("utf-8")).decode(c)}catch(c){throw console.error(`Error in requestGet() for url: ${a}`,c),b=c.message.includes("HTTP error! status")?c.message:c.message.includes("NetworkError")?"Network error occurred":"An unknown error occurred",alert(`requestGet()\nurl: ${a}\n${b}`),c;
|
26 |
+
}}function loadScript(a,b){const c=document.createElement("script");c.src=a;c.onload=()=>{b();document.head.removeChild(c)};c.onerror=()=>{alert(`Errore: Impossibile caricare lo script ${a}`)};document.head.appendChild(c)};const ID_RAG="id_rag",ID_THREAD="id_thread",ID_RESPONSES="id_responses",ID_DOC_NAMES="id_doc_names",ID_DOCS="id_docs",PROMPT_DECR=10240,maxLenRequest=(a=32)=>{a*=2048;return Math.trunc(a+.1*a)};function umgm(){return["bWtkWlFPXmg=","SWZtUkZZb18=","Rm1rUVZzcHM=","c1pJelNTTHQ=","Vlt0bE8="].map(a=>atob(a).split("").map(b=>String.fromCharCode((b.charCodeAt(0)-5+256)%256)).join("")).join("")}const MAX_PROMPT_LENGTH=maxLenRequest(100),MODEL="mistralai/Mistral-Small-3.1-24B-Instruct-2503",API=umgm();
|
27 |
console.log("\n**** MODELl:\n",MODEL);console.log(API);
|
28 |
+
const client=ClientLLM(API),getResponse=async(a,b=60)=>{a.model=MODEL;a=await client.sendRequest(`https://router.huggingface.co/hf-inference/models/${MODEL}/v1/chat/completions`,a,b);if(a.error)return 499===a.error.code?(alert("Request Interrotta"),null):a;if(!a.response.choices||!a.response.choices[0]||!a.response.choices[0].message||void 0===a.response.choices[0].message.content)return a.error=client.createError("Risposta non valida","ParseError",500,{message:"La risposta non contiene il contenuto atteso"}),
|
29 |
+
a.ok=!1,a;a.data=a.response.choices[0].message.content;return a},responseDetails={set(a){this.response=a},get_total_tokens(){return this.response.usage.total_tokens},get_completion_tokens(){return this.response.usage.completion_tokens}},calcTokens={sum_input_tokens:0,sum_generate_tokens:0,init(){this.sum_generate_tokens=this.sum_input_tokens=0},add(a){a&&(this.sum_input_tokens+=a.usage.total_tokens,this.sum_generate_tokens+=a.usage.completion_tokens)},get_sum_input_tokens(){return this.sum_input_tokens},
|
30 |
get_sum_generate_tokens(){return this.sum_generate_tokens}};function cancelClientRequest(){client.cancelRequest()}
|
31 |
const getPromptTokens=a=>(a=a.details.message.match(/Prompt contains (\d+) tokens/))?parseInt(a[1],10):null,getModelToken=a=>(a=a.details.message.match(/model with (\d+) maximum context length/))?parseInt(a[1],10):null,isTooLarge=a=>a.details.message.includes("too large"),truncateInput=(a,b)=>a.substring(0,a.length-b),getPartSize=(a,b,c)=>{c=MAX_PROMPT_LENGTH-c;a.length+b.length<c?c=a.length:(a=a.indexOf(".",c),a=(-1!==a?a:c)+1,a>c+100&&(a=c),c=a);return c},getPartDoc=(a,b)=>{const c=a.substring(0,
|
32 |
b);a=a.substring(b).trim();return[c,a]},ragLog=(a,b,c,d)=>{const e=MAX_PROMPT_LENGTH;d=d.reduce((f,l)=>f+l.length,0);xlog(`${a} mx:${e} lft:${b} rgt:${c} arr:${d}`);a=formatRow([a,b,c,d],[8,-7,-7,-7]);UaLog.log(a)},Rag={ragContext:"",ragQuery:"",ragAnswer:"",answers:[],docContextLst:[],prompts:[],doc:"",doc_part:"",init(){this.readRespsFromDb();this.readFromDb();calcTokens.init()},returnOk(){return 10<this.ragContext.length},saveToDb(){UaDb.saveJson(ID_RAG,{context:this.ragContext,ragquery:this.ragQuery,
|
|
|
224 |
window.confirm;window.alert=function(a){a instanceof Error&&(a=a.message);return DialogManager.showDialog("alert",a)};window.confirm=function(a){return DialogManager.showDialog("confirm",a)};const nodrag_tds=["input","select","a"],nodrag_cls="nodrag";
|
225 |
var UaDrag=function(a){return function(b){let c=0,d=0,e=0,f=0;const l=function(g){g=g||window.event;g.preventDefault();c=e-g.clientX;d=f-g.clientY;e=g.clientX;f=g.clientY;b.style.top=b.offsetTop-d+"px";b.style.left=b.offsetLeft-c+"px"},h=function(){document.onmouseup=null;document.onmousemove=null};b.onmousedown=function(g){g=g||window.event;let k=g.target;!(k=k||null)||nodrag_tds.includes(k.tagName.toLowerCase())||k.classList.contains(nodrag_cls)||(g.preventDefault(),e=g.clientX,f=g.clientY,document.onmouseup=
|
226 |
h,document.onmousemove=l)}}(a)};const UaJtfh=()=>({rows:[],init(){this.rows=[];return this},insert(a){this.rows.unshift(a);return this},append(a){this.rows.push(a);return this},text(a=""){return this.rows.join(a)},html(a=""){return this.rows.join(a).replace(/\s+|\[rn\]/g," ")}});function formatRow(a,b){return a.map((c,d)=>{d=b[d];return 0>d?c.toString().padStart(Math.abs(d)," "):c.toString().padEnd(d," ")}).join(" ")}
|
227 |
+
var UaLog={callHide:function(){},callShow:function(){},active:!1,wind:null,x:null,y:null,z:null,max_length:2E3,msg_id:"ualogmsg_",new:function(){null==this.wind&&(this.wind=UaWindowAdm.create("ualog_id"),this.wind.drag());this.wind.setHtml('\n <button type="button" class="clear " onclick="javascript:UaLog.cls();">Clear</button>\n <button type="button" class="close " onclick="javascript:UaLog.close();">Close</button>\n <pre id="ualogmsg_" ></pre>');this.wind.addClassStyle("inv");
|
228 |
+
this.x?this.wind.vw_vh().setXY(this.x,this.y,-1):this.wind.setCenter(-1);this.z&&this.wind.setZ(this.z);return this},setXY(a,b){this.x=a;this.y=b;return this},setZ(a){this.z=a;return this},prn_(...a){a=a.join("\n");let b=document.getElementById(this.msg_id);b.textContent=b.textContent+a+"\n"},print(...a){null!=this.wind&&this.active&&this.prn_(...a)},log(...a){null!=this.wind&&this.prn_(...a)},log_show(...a){null!=this.wind&&(this.active||this.toggle(),this.prn_(...a))},cls(){if(null!=this.wind)return document.getElementById(this.msg_id).innerHTML=
|
229 |
"",this},close(){null!=this.wind&&(this.wind.hide(),this.active=!1,this.callHide())},toggle(){null!=this.wind&&(this.active?(this.active=!1,this.wind.hide(),this.callHide()):(this.active=!0,this.wind.show(),this.callShow()))}};var UaWindowAdm={ws:{},create(a,b=null){let c=document.getElementById(a);c||(c=document.createElement("div"),b?document.getElementById(b).appendChild(c):document.body.appendChild(c),c.id=a,c.setAttribute("data-name","ua-window"),b=this.newUaWindow(c),this.ws[a]=b);a=this.ws[a];c.style.display="none";return a},get(a){return this.ws[a]?this.ws[a]:null},show(a){this.ws[a]&&this.ws[a].show()},close(a){this.ws[a]&&this.ws[a].close()},toggle(a){this.ws[a]&&this.ws[a].toggle()},hide(a){this.ws[a]&&this.ws[a].hide()},
|
230 |
closeThis(a){a=a.closest('[data-name="ua-window"]').id;this.ws[a].close()},showAll(){for(let a in this.ws)this.ws[a].show()},hideAll(){for(let a in this.ws)this.ws[a].hide()},closeAll(){for(let a in this.ws)this.ws[a].close()},remove(a){this.ws[a]&&(document.getElementById(a).remove(),this.ws[a]=null,delete this.ws[a])},removeAll(){for(let a in this.ws)this.remove(a);this.ws={}},newUaWindow(a){let b={initialize(c){this.w=c;this.wy=this.wx="0px";this.isVisible=this.isOpen=!1;this.firstShow=!0;this.wz=
|
231 |
this.pos=0;this.vh=this.vw="px"},vw_vh(){this.vw="vw";this.vh="vh";return this},addClassStyle(c){this.w.classList.contains(c)||this.w.classList.add(c);return this},removeClassStyle(c){this.w.classList.contains(c)&&this.w.classList.remove(c);return this},getWindow(){alert("getWindow => ??");return this.w},getElement(){return this.w},getId(){return this.w.id},setStyle(c){for(const d in c)this.w.style[d]=c[d];return this},setHtml(c){this.w.innerHTML=c;return this},getHtml(){return this.w.innerHTML},
|
static/less/ragquery.less
CHANGED
@@ -292,9 +292,9 @@ div.container {
|
|
292 |
background: @contaniner-bg;
|
293 |
box-sizing: border-box;
|
294 |
position: relative;
|
295 |
-
top:
|
296 |
left: 0;
|
297 |
-
height:
|
298 |
margin: 0;
|
299 |
padding: 0;
|
300 |
transition: margin-left 0.5s ease;
|
@@ -318,7 +318,7 @@ div.container {
|
|
318 |
padding-top: 0.5vh;
|
319 |
padding-right: 0.5vw;
|
320 |
padding-left: 0.5vw;
|
321 |
-
padding-bottom:
|
322 |
|
323 |
.output-wrapper {
|
324 |
background-color: @contaniner-bg;
|
|
|
292 |
background: @contaniner-bg;
|
293 |
box-sizing: border-box;
|
294 |
position: relative;
|
295 |
+
top: 3vh;
|
296 |
left: 0;
|
297 |
+
height: 94vh;
|
298 |
margin: 0;
|
299 |
padding: 0;
|
300 |
transition: margin-left 0.5s ease;
|
|
|
318 |
padding-top: 0.5vh;
|
319 |
padding-right: 0.5vw;
|
320 |
padding-left: 0.5vw;
|
321 |
+
padding-bottom: 5vh;
|
322 |
|
323 |
.output-wrapper {
|
324 |
background-color: @contaniner-bg;
|
static/ragrqs.html
CHANGED
@@ -11,14 +11,13 @@
|
|
11 |
<script src="js/ragquery.min.js"></script>
|
12 |
|
13 |
|
14 |
-
|
15 |
<link rel="stylesheet" href="less/normalize.css" />
|
16 |
<link rel="stylesheet/less" href="less/ragquery.less" />
|
17 |
<link rel="stylesheet/less" href="less/uadialog.less" />
|
18 |
<link rel="stylesheet/less" href="less/ualog3.less" />
|
19 |
<link rel="stylesheet/less" href="less/tooltip.less" />
|
20 |
<script src="lessm/less.min.js"></script>
|
21 |
-
|
22 |
<script src="javascript/app.js"></script>
|
23 |
<script src="javascript/client_llm.js"></script>
|
24 |
<script src="javascript/rag_cleaner.js"></script>
|
@@ -34,7 +33,7 @@
|
|
34 |
<script src="javascript/uajtfh.js"></script>
|
35 |
<script src="javascript/ualog3.js"></script>
|
36 |
<script src="javascript/uawindow.js"></script>
|
37 |
-
<script src="javascript/help.js"></script> -->
|
38 |
|
39 |
<body>
|
40 |
<div id="spinner" class="spinner">
|
@@ -149,7 +148,6 @@
|
|
149 |
</svg>
|
150 |
</button>
|
151 |
|
152 |
-
|
153 |
<button class="send2-input inv tt-leftx" data-tt="Contesto=>Query .">
|
154 |
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
155 |
<path d="M2 21l21-9L2 3v7l15 2-15 2v7z" fill="none" stroke="#FFFFFF" stroke-width="2" />
|
|
|
11 |
<script src="js/ragquery.min.js"></script>
|
12 |
|
13 |
|
14 |
+
<!--
|
15 |
<link rel="stylesheet" href="less/normalize.css" />
|
16 |
<link rel="stylesheet/less" href="less/ragquery.less" />
|
17 |
<link rel="stylesheet/less" href="less/uadialog.less" />
|
18 |
<link rel="stylesheet/less" href="less/ualog3.less" />
|
19 |
<link rel="stylesheet/less" href="less/tooltip.less" />
|
20 |
<script src="lessm/less.min.js"></script>
|
|
|
21 |
<script src="javascript/app.js"></script>
|
22 |
<script src="javascript/client_llm.js"></script>
|
23 |
<script src="javascript/rag_cleaner.js"></script>
|
|
|
33 |
<script src="javascript/uajtfh.js"></script>
|
34 |
<script src="javascript/ualog3.js"></script>
|
35 |
<script src="javascript/uawindow.js"></script>
|
36 |
+
<script src="javascript/help.js"></script> --> -->
|
37 |
|
38 |
<body>
|
39 |
<div id="spinner" class="spinner">
|
|
|
148 |
</svg>
|
149 |
</button>
|
150 |
|
|
|
151 |
<button class="send2-input inv tt-leftx" data-tt="Contesto=>Query .">
|
152 |
<svg class="icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
153 |
<path d="M2 21l21-9L2 3v7l15 2-15 2v7z" fill="none" stroke="#FFFFFF" stroke-width="2" />
|