@blueking/ai-ui-sdk 0.0.7-beta.2 → 0.0.7-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/css/iconcool.js +10 -0
- package/dist/css/main.css +1 -0
- package/dist/css/style.css +43 -0
- package/dist/main.es.js +5 -2
- package/dist/main.es.js.map +1 -1
- package/dist/main.umd.js +1 -1
- package/dist/main.umd.js.map +1 -1
- package/package.json +15 -4
@@ -0,0 +1,10 @@
|
|
1
|
+
!(function () {
|
2
|
+
var svgCode = '<svg xmlns="http://www.w3.org/2000/svg" data-name="ai-ui-sdk" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0;visibility:hidden"><symbol id="ai-ui-sdk-angle-up" viewBox="0 0 32 32"><path fill="#63656e" d="M16 11.5l7 7-1.5 1.5-5.5-5.5-5.5 5.5L9 18.5l7-7z"/></symbol><symbol id="ai-ui-sdk-links" viewBox="0 0 1024 1024"><path d="M263.04 760.96a148.48 148.48 0 01-1.92-224l92.48-92.48-45.12-45.76L216 491.2a212.8 212.8 0 001.92 314.88A212.8 212.8 0 00532.8 808l92.48-92.48L579.84 672l-92.48 92.48a148.48 148.48 0 01-224.32-3.52zM491.2 216l-92.48 92.48 45.44 45.12 92.48-92.48a148.48 148.48 0 01224 1.92 148.48 148.48 0 011.92 224L672 579.84l45.12 45.44 92.48-92.48a212.8 212.8 0 00-1.92-314.88A212.8 212.8 0 00491.2 216z"/><path d="M398.786 579.888l181.019-181.02 45.255 45.255-181.02 181.02-45.254-45.255z"/></symbol><symbol id="ai-ui-sdk-zhishiku" viewBox="0 0 1024 1024"><path d="M320.986 203.315H191.622c-17.248 0-31.622 14.503-31.622 31.905v639.542c0 17.403 14.374 31.905 31.622 31.905h129.364c17.249 0 31.623-14.502 31.623-31.905V235.22c0-17.402-14.374-31.905-31.623-31.905zm-35.934 130.52h-57.495c-15.811 0-28.748-13.053-28.748-29.005 0-15.952 12.937-29.004 28.748-29.004h57.495c15.811 0 28.747 13.052 28.747 29.004 0 15.952-12.936 29.004-28.747 29.004zM578.277 96H448.913c-17.249 0-31.622 14.502-31.622 31.905v746.857c0 17.403 14.373 31.905 31.622 31.905h129.364c17.248 0 31.622-14.502 31.622-31.905V127.905C611.337 110.502 596.963 96 578.277 96zM543.78 227.969h-57.495c-15.811 0-28.748-13.052-28.748-29.004 0-15.952 12.937-29.004 28.748-29.004h57.495c15.811 0 28.747 13.052 28.747 29.004 0 15.952-12.936 29.004-28.747 29.004zm383.78 613.438l-120.74-627.94c-4.312-15.952-17.249-26.104-33.06-26.104h-5.75l-126.488 24.654c-17.249 2.9-28.748 20.303-25.873 37.705l122.177 629.39c2.875 15.953 15.811 26.104 31.622 26.104h5.75l126.489-24.653c17.248-4.35 28.748-21.753 25.873-39.156zM762.26 312.081l-57.495 11.602h-5.75c-12.936 0-25.872-10.152-28.747-23.204-2.875-15.952 7.187-31.904 22.998-34.805l57.495-11.601c15.811-2.9 31.623 7.25 34.497 23.203 2.875 15.952-7.187 31.905-22.998 34.805z"/></symbol><symbol id="ai-ui-sdk-sikao" viewBox="0 0 1024 1024"><path d="M528 96c61.856 0 112 50.144 112 112 0 .376-.002.751-.006 1.126C774.73 260.666 870.4 391.16 870.4 544c0 22.55-2.082 44.612-6.066 66.007C883.94 630.144 896 657.663 896 688c0 61.856-50.144 112-112 112a112.7 112.7 0 01-19.49-1.69C699.754 862.65 610.519 902.4 512 902.4s-187.753-39.75-252.539-104.088A112.33 112.33 0 01240 800c-61.856 0-112-50.144-112-112 0-30.337 12.061-57.856 31.65-78.025A361.172 361.172 0 01153.6 544c0-164.845 111.29-303.696 262.836-345.518C421.232 141.079 469.35 96 528 96zm-91.48 176.633l-4.469 1.278C315.47 308.366 230.4 416.249 230.4 544c0 10.923.622 21.7 1.832 32.3l1.623-.134L240 576c61.856 0 112 50.144 112 112 0 26.132-8.95 50.173-23.95 69.226C377.36 799.817 441.67 825.6 512 825.6c70.33 0 134.639-25.783 183.99-68.412C680.95 738.173 672 714.132 672 688c0-61.856 50.144-112 112-112 2.607 0 5.194.09 7.757.264A280.989 280.989 0 00793.6 544c0-119.973-75.025-222.422-180.718-262.99C592.35 304.904 561.938 320 528 320c-37.782 0-71.195-18.708-91.48-47.367z"/></symbol><symbol id="ai-ui-sdk-wenzhang" viewBox="0 0 1024 1024"><path fill="#3D4265" d="M708.923 157.538h275.692c21.752 0 39.385 17.634 39.385 39.385v748.308c0 43.503-35.266 78.769-78.77 78.769H708.924V157.538z"/><path fill="#3A84FF" d="M0 984.615A39.385 39.385 0 0039.385 1024H945.23c-43.503 0-78.77-35.266-78.77-78.77V39.386C866.462 17.633 848.829 0 827.078 0H39.385C17.633 0 0 17.633 0 39.385v945.23z"/><path fill="#FFF" d="M196.923 288.82c-21.751 0-39.385 17.634-39.385 39.385 0 21.752 17.634 39.385 39.385 39.385h157.539c21.751 0 39.384-17.633 39.384-39.385 0-21.751-17.633-39.384-39.384-39.384H196.923zm0 236.308c-21.751 0-39.385 17.633-39.385 39.385 0 21.751 17.634 39.384 39.385 39.384h472.615c21.752 0 39.385-17.633 39.385-39.384 0-21.752-17.633-39.385-39.385-39.385H196.923zm0 236.308c-21.751 0-39.385 17.633-39.385 39.385 0 21.751 17.634 39.384 39.385 39.384h236.308c21.751 0 39.384-17.633 39.384-39.384 0-21.752-17.633-39.385-39.384-39.385H196.923z"/></g></symbol><symbol id="ai-ui-sdk-yanjing-kejian" viewBox="0 0 1024 1024"><path fill-rule="evenodd" d="M512 192c247.4 0 448 143.3 448 320S759.4 832 512 832 64 688.7 64 512s200.6-320 448-320zm0 64c-54.2 0-106.6 7.5-155.9 22.4-46.6 14.1-88.3 34.1-123.7 59.4C165.1 385.9 128 447.8 128 512c0 64.2 37.1 126.1 104.4 174.2 35.4 25.3 77.1 45.3 123.7 59.4C405.4 760.5 457.8 768 512 768s106.6-7.5 155.9-22.4c46.6-14.1 88.3-34.1 123.7-59.4C858.9 638.1 896 576.2 896 512c0-64.2-37.1-126.1-104.4-174.2-35.4-25.3-77.1-45.3-123.7-59.4C618.6 263.5 566.2 256 512 256zm0 96c88.4 0 160 71.6 160 160s-71.6 160-160 160-160-71.6-160-160 71.6-160 160-160zm0 64c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96z"/></symbol></svg>'
|
3
|
+
if (document.body) {
|
4
|
+
document.body.insertAdjacentHTML('afterbegin', svgCode)
|
5
|
+
} else {
|
6
|
+
document.addEventListener('DOMContentLoaded', function() {
|
7
|
+
document.body.insertAdjacentHTML('afterbegin', svgCode)
|
8
|
+
})
|
9
|
+
}
|
10
|
+
})()
|
@@ -0,0 +1 @@
|
|
1
|
+
@font-face{font-family:ai-ui-sdk;src:url("data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%20%3e%3csvg%3e%3cmetadata%3e%20Created%20by%20font-carrier%20%3c/metadata%3e%3cdefs%3e%3cfont%20id='iconfont'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20%3e%3cfont-face%20font-family='iconfont'%20font-weight='400'%20font-stretch='normal'%20units-per-em='1024'%20ascent='812'%20descent='-212'%20/%3e%3cmissing-glyph%20/%3e%3cglyph%20glyph-name='x'%20unicode='&%23x78;'%20horiz-adv-x='100'%20d='M20%2020%20L50%2020%20L50%20-20%20Z'%20/%3e%3cglyph%20glyph-name='uniE103'%20unicode='&%23xE103;'%20d='M512%20444L736%20220%20688%20172%20512%20348%20336%20172%20288%20220%20512%20444Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE105'%20unicode='&%23xE105;'%20d='M263.04%2051.04A148.48%20148.48%200%200%200%20261.12%20275.04L353.6%20367.52%20308.48%20413.28%20216%20320.8A212.8%20212.8%200%200%201%20217.92%205.92%20212.8%20212.8%200%200%201%20532.8%204L625.28%2096.48%20579.84%20140%20487.36%2047.52A148.48%20148.48%200%200%200%20263.04%2051.04ZM491.2%20596L398.72%20503.52%20444.16%20458.4%20536.64%20550.88A148.48%20148.48%200%200%200%20760.64%20548.96%20148.48%20148.48%200%200%200%20762.56%20324.96L672%20232.16%20717.12%20186.72%20809.6%20279.2A212.8%20212.8%200%200%201%20807.68%20594.08%20212.8%20212.8%200%200%201%20491.2%20596ZM398.7857%20232.1123L579.805%20413.1316%20625.0598%20367.8768%20444.0405%20186.8574%20398.7857%20232.1123Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE104'%20unicode='&%23xE104;'%20d='M320.9863%20608.6846L191.6223%20608.6846C174.3738%20608.6846%20160%20594.1825%20160%20576.78L160-62.7621C160-80.1646%20174.3738-94.6667%20191.6223-94.6667L320.9863-94.6667C338.2348-94.6667%20352.6086-80.1646%20352.6086-62.7621L352.6086%20576.78C352.6086%20594.1825%20338.2348%20608.6846%20320.9863%20608.6846ZM285.0519%20478.1658L227.5568%20478.1658C211.7456%20478.1658%20198.8092%20491.2176%20198.8092%20507.1699%20198.8092%20523.1222%20211.7456%20536.1741%20227.5568%20536.1741L285.0519%20536.1741C300.863%20536.1741%20313.7994%20523.1222%20313.7994%20507.1699%20313.7994%20491.2177%20300.863%20478.1658%20285.0519%20478.1658ZM578.2769%20716L448.9129%20716C431.6644%20716%20417.2906%20701.4979%20417.2906%20684.0954L417.2906-62.7621C417.2906-80.1646%20431.6644-94.6667%20448.9129-94.6667L578.2769-94.6667C595.5255-94.6667%20609.8993-80.1646%20609.8993-62.7621L609.8993%20684.0954C611.3366%20701.4979%20596.9629%20716%20578.2769%20716ZM543.7799%20584.031L486.2848%20584.031C470.4736%20584.031%20457.5372%20597.0829%20457.5372%20613.0352%20457.5372%20628.9875%20470.4736%20642.0394%20486.2848%20642.0394L543.7799%20642.0394C559.591%20642.0394%20572.5274%20628.9875%20572.5274%20613.0352%20572.5274%20597.0829%20559.591%20584.031%20543.7799%20584.031ZM927.5598-29.4073L806.82%20598.5331C802.5079%20614.4854%20789.5715%20624.6369%20773.7603%20624.6369L768.0108%20624.6369%20641.5216%20599.9833C624.273%20597.0829%20612.774%20579.6804%20615.6488%20562.2779L737.8259-67.1127C740.7006-83.065%20753.637-93.2165%20769.4482-93.2165L775.1977-93.2165%20901.6869-68.5629C918.9355-64.2123%20930.4345-46.8098%20927.5598-29.4073L927.5598-29.4073ZM762.2613%20499.9189L704.7662%20488.3172%20699.0167%20488.3172C686.0803%20488.3172%20673.1439%20498.4687%20670.2691%20511.5206%20667.3944%20527.4729%20677.456%20543.4252%20693.2672%20546.3256L750.7623%20557.9273C766.5734%20560.8277%20782.3846%20550.6762%20785.2593%20534.7239%20788.1341%20518.7716%20778.0725%20502.8193%20762.2613%20499.9189L762.2613%20499.9189Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE102'%20unicode='&%23xE102;'%20d='M528%20716C589.8559%20716%20640%20665.8559%20640%20604%20640%20603.6241%20639.9981%20603.2487%20639.9945%20602.8737%20774.7291%20551.3341%20870.4%20420.8396%20870.4%20268%20870.4%20245.4507%20868.3176%20223.3878%20864.3345%20201.9931%20883.9388%20181.8561%20896%20154.3366%20896%20124%20896%2062.1441%20845.8559%2012%20784%2012%20777.3525%2012%20770.8402%2012.5791%20764.5109%2013.6897%20699.7526-50.6495%20610.5184-90.4%20512-90.4%20413.4816-90.4%20324.2474-50.6495%20259.4612%2013.6877%20253.1598%2012.5791%20246.6475%2012%20240%2012%20178.1441%2012%20128%2062.1441%20128%20124%20128%20154.3366%20140.0612%20181.8561%20159.6499%20202.0249%20155.6824%20223.3878%20153.6%20245.4507%20153.6%20268%20153.6%20432.8448%20264.8905%20571.6963%20416.4355%20613.5184%20421.2316%20670.9212%20469.3514%20716%20528%20716ZM436.5201%20539.3665L432.0511%20538.0893C315.4696%20503.6336%20230.4%20395.7514%20230.4%20268%20230.4%20257.0771%20231.0219%20246.2994%20232.2322%20235.7004L233.8549%20235.8343%20240%20236C301.8559%20236%20352%20185.8559%20352%20124%20352%2097.8684%20343.0507%2073.8271%20328.0498%2054.7737%20377.3611%2012.1827%20441.6696-13.6%20512-13.6%20582.3304-13.6%20646.6389%2012.1827%20695.9893%2054.812%20680.9493%2073.8271%20672%2097.8684%20672%20124%20672%20185.8559%20722.1441%20236%20784%20236%20786.6073%20236%20789.1938%20235.9109%20791.7567%20235.7356%20792.9781%20246.2994%20793.6%20257.0771%20793.6%20268%20793.6%20387.9728%20718.5746%20490.4224%20612.8817%20530.9909%20592.3503%20507.0949%20561.938%20492%20528%20492%20490.2178%20492%20456.8051%20510.7083%20436.5201%20539.3665Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE101'%20unicode='&%23xE101;'%20d='M708.9231%20654.4615L984.6154%20654.4615C1006.3669%20654.4615%201024%20636.8284%201024%20615.0769L1024-133.2308C1024-176.7338%20988.7338-212%20945.2308-212L708.9231-212%20708.9231%20654.4615%20708.9231%20654.4615ZM0-172.6154C0-183.0608%204.1494-193.0785%2011.5355-200.4645%2018.9215-207.8506%2028.9392-212%2039.3846-212L945.2308-212C901.7277-212%20866.4615-176.7338%20866.4615-133.2308L866.4615%20772.6154C866.4615%20794.3669%20848.8284%20812%20827.0769%20812L39.3846%20812C17.6331%20812%200%20794.3669%200%20772.6154L0-172.6154ZM196.9231%20523.1795C175.1716%20523.1795%20157.5385%20505.5464%20157.5385%20483.7949%20157.5385%20462.0433%20175.1716%20444.4103%20196.9231%20444.4103L354.4615%20444.4103C376.2131%20444.4103%20393.8462%20462.0433%20393.8462%20483.7949%20393.8462%20505.5464%20376.2131%20523.1795%20354.4615%20523.1795L196.9231%20523.1795ZM196.9231%20286.8718C175.1716%20286.8718%20157.5385%20269.2387%20157.5385%20247.4872%20157.5385%20225.7357%20175.1716%20208.1026%20196.9231%20208.1026L669.5385%20208.1026C691.29%20208.1026%20708.9231%20225.7357%20708.9231%20247.4872%20708.9231%20269.2387%20691.29%20286.8718%20669.5385%20286.8718L196.9231%20286.8718ZM196.9231%2050.5641C175.1716%2050.5641%20157.5385%2032.931%20157.5385%2011.1795%20157.5385-10.572%20175.1716-28.2051%20196.9231-28.2051L433.2308-28.2051C454.9823-28.2051%20472.6154-10.572%20472.6154%2011.1795%20472.6154%2032.931%20454.9823%2050.5641%20433.2308%2050.5641L196.9231%2050.5641%20196.9231%2050.5641Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE106'%20unicode='&%23xE106;'%20d='M512%20620C759.4%20620%20960%20476.7%20960%20300%20960%20123.3%20759.4-20%20512-20%20264.6-20%2064%20123.3%2064%20300%2064%20476.7%20264.6%20620%20512%20620ZM512%20556C457.8%20556%20405.4%20548.5%20356.1%20533.6%20309.5%20519.5%20267.8%20499.5%20232.4%20474.2%20165.1%20426.1%20128%20364.2%20128%20300%20128%20235.8%20165.1%20173.9%20232.4%20125.8%20267.8%20100.5%20309.5%2080.5%20356.1%2066.4%20405.4%2051.5%20457.8%2044%20512%2044%20566.2%2044%20618.6%2051.5%20667.9%2066.4%20714.5%2080.5%20756.2%20100.5%20791.6%20125.8%20858.9%20173.9%20896%20235.8%20896%20300%20896%20364.2%20858.9%20426.1%20791.6%20474.2%20756.2%20499.5%20714.5%20519.5%20667.9%20533.6%20618.6%20548.5%20566.2%20556%20512%20556ZM512%20460C600.4%20460%20672%20388.4%20672%20300%20672%20211.6%20600.4%20140%20512%20140%20423.6%20140%20352%20211.6%20352%20300%20352%20388.4%20423.6%20460%20512%20460ZM512%20396C459.1%20396%20416%20352.9%20416%20300%20416%20247.1%20459.1%20204%20512%20204%20564.9%20204%20608%20247.1%20608%20300%20608%20352.9%20564.9%20396%20512%20396Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3c/font%3e%3c/defs%3e%3c/svg%3e") format("svg"),url(data:font/ttf;base64,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) format("truetype"),url(data:font/woff;base64,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) format("woff"),url(data:application/vnd.ms-fontobject;base64,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) format("embedded-opentype");font-weight:400;font-style:normal}.ai-ui-sdk-icon{font-family:ai-ui-sdk!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ai-ui-sdk-angle-up:before{content:""}.ai-ui-sdk-links:before{content:""}.ai-ui-sdk-zhishiku:before{content:""}.ai-ui-sdk-sikao:before{content:""}.ai-ui-sdk-wenzhang:before{content:""}.ai-ui-sdk-yanjing-kejian:before{content:""}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
@font-face {
|
2
|
+
font-family: "ai-ui-sdk";
|
3
|
+
src: url("fonts/iconcool.svg#iconcool") format("svg"),
|
4
|
+
url("fonts/iconcool.ttf") format("truetype"),
|
5
|
+
url("fonts/iconcool.woff") format("woff"),
|
6
|
+
url("fonts/iconcool.eot?#iefix") format("embedded-opentype");
|
7
|
+
font-weight: normal;
|
8
|
+
font-style: normal;
|
9
|
+
}
|
10
|
+
|
11
|
+
.ai-ui-sdk-icon {
|
12
|
+
/* use !important to prevent issues with browser extensions that change fonts */
|
13
|
+
font-family: 'ai-ui-sdk' !important;
|
14
|
+
speak: none;
|
15
|
+
font-style: normal;
|
16
|
+
font-weight: normal;
|
17
|
+
font-variant: normal;
|
18
|
+
text-transform: none;
|
19
|
+
line-height: 1;
|
20
|
+
text-align: center;
|
21
|
+
/* Better Font Rendering =========== */
|
22
|
+
-webkit-font-smoothing: antialiased;
|
23
|
+
-moz-osx-font-smoothing: grayscale;
|
24
|
+
}
|
25
|
+
|
26
|
+
.ai-ui-sdk-angle-up:before {
|
27
|
+
content: "\e103";
|
28
|
+
}
|
29
|
+
.ai-ui-sdk-links:before {
|
30
|
+
content: "\e105";
|
31
|
+
}
|
32
|
+
.ai-ui-sdk-zhishiku:before {
|
33
|
+
content: "\e104";
|
34
|
+
}
|
35
|
+
.ai-ui-sdk-sikao:before {
|
36
|
+
content: "\e102";
|
37
|
+
}
|
38
|
+
.ai-ui-sdk-wenzhang:before {
|
39
|
+
content: "\e101";
|
40
|
+
}
|
41
|
+
.ai-ui-sdk-yanjing-kejian:before {
|
42
|
+
content: "\e106";
|
43
|
+
}
|
package/dist/main.es.js
CHANGED
@@ -1067,8 +1067,11 @@ ${filterContent}`
|
|
1067
1067
|
};
|
1068
1068
|
};
|
1069
1069
|
const useStyle = () => {
|
1070
|
-
|
1071
|
-
|
1070
|
+
if (typeof document !== "undefined") {
|
1071
|
+
const script = document.createElement("script");
|
1072
|
+
script.src = new URL("data:text/javascript;base64,IShmdW5jdGlvbiAoKSB7CiAgICB2YXIgc3ZnQ29kZSA9ICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZGF0YS1uYW1lPSJhaS11aS1zZGsiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MDtoZWlnaHQ6MDt2aXNpYmlsaXR5OmhpZGRlbiI+PHN5bWJvbCBpZD0iYWktdWktc2RrLWFuZ2xlLXVwIiB2aWV3Qm94PSIwIDAgMzIgMzIiPjxwYXRoIGZpbGw9IiM2MzY1NmUiIGQ9Ik0xNiAxMS41bDcgNy0xLjUgMS41LTUuNS01LjUtNS41IDUuNUw5IDE4LjVsNy03eiIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9ImFpLXVpLXNkay1saW5rcyIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+PHBhdGggZD0iTTI2My4wNCA3NjAuOTZhMTQ4LjQ4IDE0OC40OCAwIDAxLTEuOTItMjI0bDkyLjQ4LTkyLjQ4LTQ1LjEyLTQ1Ljc2TDIxNiA0OTEuMmEyMTIuOCAyMTIuOCAwIDAwMS45MiAzMTQuODhBMjEyLjggMjEyLjggMCAwMDUzMi44IDgwOGw5Mi40OC05Mi40OEw1NzkuODQgNjcybC05Mi40OCA5Mi40OGExNDguNDggMTQ4LjQ4IDAgMDEtMjI0LjMyLTMuNTJ6TTQ5MS4yIDIxNmwtOTIuNDggOTIuNDggNDUuNDQgNDUuMTIgOTIuNDgtOTIuNDhhMTQ4LjQ4IDE0OC40OCAwIDAxMjI0IDEuOTIgMTQ4LjQ4IDE0OC40OCAwIDAxMS45MiAyMjRMNjcyIDU3OS44NGw0NS4xMiA0NS40NCA5Mi40OC05Mi40OGEyMTIuOCAyMTIuOCAwIDAwLTEuOTItMzE0Ljg4QTIxMi44IDIxMi44IDAgMDA0OTEuMiAyMTZ6Ii8+PHBhdGggZD0iTTM5OC43ODYgNTc5Ljg4OGwxODEuMDE5LTE4MS4wMiA0NS4yNTUgNDUuMjU1LTE4MS4wMiAxODEuMDItNDUuMjU0LTQ1LjI1NXoiLz48L3N5bWJvbD48c3ltYm9sIGlkPSJhaS11aS1zZGstemhpc2hpa3UiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGQ9Ik0zMjAuOTg2IDIwMy4zMTVIMTkxLjYyMmMtMTcuMjQ4IDAtMzEuNjIyIDE0LjUwMy0zMS42MjIgMzEuOTA1djYzOS41NDJjMCAxNy40MDMgMTQuMzc0IDMxLjkwNSAzMS42MjIgMzEuOTA1aDEyOS4zNjRjMTcuMjQ5IDAgMzEuNjIzLTE0LjUwMiAzMS42MjMtMzEuOTA1VjIzNS4yMmMwLTE3LjQwMi0xNC4zNzQtMzEuOTA1LTMxLjYyMy0zMS45MDV6bS0zNS45MzQgMTMwLjUyaC01Ny40OTVjLTE1LjgxMSAwLTI4Ljc0OC0xMy4wNTMtMjguNzQ4LTI5LjAwNSAwLTE1Ljk1MiAxMi45MzctMjkuMDA0IDI4Ljc0OC0yOS4wMDRoNTcuNDk1YzE1LjgxMSAwIDI4Ljc0NyAxMy4wNTIgMjguNzQ3IDI5LjAwNCAwIDE1Ljk1Mi0xMi45MzYgMjkuMDA0LTI4Ljc0NyAyOS4wMDR6TTU3OC4yNzcgOTZINDQ4LjkxM2MtMTcuMjQ5IDAtMzEuNjIyIDE0LjUwMi0zMS42MjIgMzEuOTA1djc0Ni44NTdjMCAxNy40MDMgMTQuMzczIDMxLjkwNSAzMS42MjIgMzEuOTA1aDEyOS4zNjRjMTcuMjQ4IDAgMzEuNjIyLTE0LjUwMiAzMS42MjItMzEuOTA1VjEyNy45MDVDNjExLjMzNyAxMTAuNTAyIDU5Ni45NjMgOTYgNTc4LjI3NyA5NnpNNTQzLjc4IDIyNy45NjloLTU3LjQ5NWMtMTUuODExIDAtMjguNzQ4LTEzLjA1Mi0yOC43NDgtMjkuMDA0IDAtMTUuOTUyIDEyLjkzNy0yOS4wMDQgMjguNzQ4LTI5LjAwNGg1Ny40OTVjMTUuODExIDAgMjguNzQ3IDEzLjA1MiAyOC43NDcgMjkuMDA0IDAgMTUuOTUyLTEyLjkzNiAyOS4wMDQtMjguNzQ3IDI5LjAwNHptMzgzLjc4IDYxMy40MzhsLTEyMC43NC02MjcuOTRjLTQuMzEyLTE1Ljk1Mi0xNy4yNDktMjYuMTA0LTMzLjA2LTI2LjEwNGgtNS43NWwtMTI2LjQ4OCAyNC42NTRjLTE3LjI0OSAyLjktMjguNzQ4IDIwLjMwMy0yNS44NzMgMzcuNzA1bDEyMi4xNzcgNjI5LjM5YzIuODc1IDE1Ljk1MyAxNS44MTEgMjYuMTA0IDMxLjYyMiAyNi4xMDRoNS43NWwxMjYuNDg5LTI0LjY1M2MxNy4yNDgtNC4zNSAyOC43NDgtMjEuNzUzIDI1Ljg3My0zOS4xNTZ6TTc2Mi4yNiAzMTIuMDgxbC01Ny40OTUgMTEuNjAyaC01Ljc1Yy0xMi45MzYgMC0yNS44NzItMTAuMTUyLTI4Ljc0Ny0yMy4yMDQtMi44NzUtMTUuOTUyIDcuMTg3LTMxLjkwNCAyMi45OTgtMzQuODA1bDU3LjQ5NS0xMS42MDFjMTUuODExLTIuOSAzMS42MjMgNy4yNSAzNC40OTcgMjMuMjAzIDIuODc1IDE1Ljk1Mi03LjE4NyAzMS45MDUtMjIuOTk4IDM0LjgwNXoiLz48L3N5bWJvbD48c3ltYm9sIGlkPSJhaS11aS1zZGstc2lrYW8iIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGQ9Ik01MjggOTZjNjEuODU2IDAgMTEyIDUwLjE0NCAxMTIgMTEyIDAgLjM3Ni0uMDAyLjc1MS0uMDA2IDEuMTI2Qzc3NC43MyAyNjAuNjY2IDg3MC40IDM5MS4xNiA4NzAuNCA1NDRjMCAyMi41NS0yLjA4MiA0NC42MTItNi4wNjYgNjYuMDA3Qzg4My45NCA2MzAuMTQ0IDg5NiA2NTcuNjYzIDg5NiA2ODhjMCA2MS44NTYtNTAuMTQ0IDExMi0xMTIgMTEyYTExMi43IDExMi43IDAgMDEtMTkuNDktMS42OUM2OTkuNzU0IDg2Mi42NSA2MTAuNTE5IDkwMi40IDUxMiA5MDIuNHMtMTg3Ljc1My0zOS43NS0yNTIuNTM5LTEwNC4wODhBMTEyLjMzIDExMi4zMyAwIDAxMjQwIDgwMGMtNjEuODU2IDAtMTEyLTUwLjE0NC0xMTItMTEyIDAtMzAuMzM3IDEyLjA2MS01Ny44NTYgMzEuNjUtNzguMDI1QTM2MS4xNzIgMzYxLjE3MiAwIDAxMTUzLjYgNTQ0YzAtMTY0Ljg0NSAxMTEuMjktMzAzLjY5NiAyNjIuODM2LTM0NS41MThDNDIxLjIzMiAxNDEuMDc5IDQ2OS4zNSA5NiA1MjggOTZ6bS05MS40OCAxNzYuNjMzbC00LjQ2OSAxLjI3OEMzMTUuNDcgMzA4LjM2NiAyMzAuNCA0MTYuMjQ5IDIzMC40IDU0NGMwIDEwLjkyMy42MjIgMjEuNyAxLjgzMiAzMi4zbDEuNjIzLS4xMzRMMjQwIDU3NmM2MS44NTYgMCAxMTIgNTAuMTQ0IDExMiAxMTIgMCAyNi4xMzItOC45NSA1MC4xNzMtMjMuOTUgNjkuMjI2QzM3Ny4zNiA3OTkuODE3IDQ0MS42NyA4MjUuNiA1MTIgODI1LjZjNzAuMzMgMCAxMzQuNjM5LTI1Ljc4MyAxODMuOTktNjguNDEyQzY4MC45NSA3MzguMTczIDY3MiA3MTQuMTMyIDY3MiA2ODhjMC02MS44NTYgNTAuMTQ0LTExMiAxMTItMTEyIDIuNjA3IDAgNS4xOTQuMDkgNy43NTcuMjY0QTI4MC45ODkgMjgwLjk4OSAwIDAwNzkzLjYgNTQ0YzAtMTE5Ljk3My03NS4wMjUtMjIyLjQyMi0xODAuNzE4LTI2Mi45OUM1OTIuMzUgMzA0LjkwNCA1NjEuOTM4IDMyMCA1MjggMzIwYy0zNy43ODIgMC03MS4xOTUtMTguNzA4LTkxLjQ4LTQ3LjM2N3oiLz48L3N5bWJvbD48c3ltYm9sIGlkPSJhaS11aS1zZGstd2VuemhhbmciIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGZpbGw9IiMzRDQyNjUiIGQ9Ik03MDguOTIzIDE1Ny41MzhoMjc1LjY5MmMyMS43NTIgMCAzOS4zODUgMTcuNjM0IDM5LjM4NSAzOS4zODV2NzQ4LjMwOGMwIDQzLjUwMy0zNS4yNjYgNzguNzY5LTc4Ljc3IDc4Ljc2OUg3MDguOTI0VjE1Ny41Mzh6Ii8+PHBhdGggZmlsbD0iIzNBODRGRiIgZD0iTTAgOTg0LjYxNUEzOS4zODUgMzkuMzg1IDAgMDAzOS4zODUgMTAyNEg5NDUuMjNjLTQzLjUwMyAwLTc4Ljc3LTM1LjI2Ni03OC43Ny03OC43N1YzOS4zODZDODY2LjQ2MiAxNy42MzMgODQ4LjgyOSAwIDgyNy4wNzggMEgzOS4zODVDMTcuNjMzIDAgMCAxNy42MzMgMCAzOS4zODV2OTQ1LjIzeiIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0xOTYuOTIzIDI4OC44MmMtMjEuNzUxIDAtMzkuMzg1IDE3LjYzNC0zOS4zODUgMzkuMzg1IDAgMjEuNzUyIDE3LjYzNCAzOS4zODUgMzkuMzg1IDM5LjM4NWgxNTcuNTM5YzIxLjc1MSAwIDM5LjM4NC0xNy42MzMgMzkuMzg0LTM5LjM4NSAwLTIxLjc1MS0xNy42MzMtMzkuMzg0LTM5LjM4NC0zOS4zODRIMTk2LjkyM3ptMCAyMzYuMzA4Yy0yMS43NTEgMC0zOS4zODUgMTcuNjMzLTM5LjM4NSAzOS4zODUgMCAyMS43NTEgMTcuNjM0IDM5LjM4NCAzOS4zODUgMzkuMzg0aDQ3Mi42MTVjMjEuNzUyIDAgMzkuMzg1LTE3LjYzMyAzOS4zODUtMzkuMzg0IDAtMjEuNzUyLTE3LjYzMy0zOS4zODUtMzkuMzg1LTM5LjM4NUgxOTYuOTIzem0wIDIzNi4zMDhjLTIxLjc1MSAwLTM5LjM4NSAxNy42MzMtMzkuMzg1IDM5LjM4NSAwIDIxLjc1MSAxNy42MzQgMzkuMzg0IDM5LjM4NSAzOS4zODRoMjM2LjMwOGMyMS43NTEgMCAzOS4zODQtMTcuNjMzIDM5LjM4NC0zOS4zODQgMC0yMS43NTItMTcuNjMzLTM5LjM4NS0zOS4zODQtMzkuMzg1SDE5Ni45MjN6Ii8+PC9nPjwvc3ltYm9sPjxzeW1ib2wgaWQ9ImFpLXVpLXNkay15YW5qaW5nLWtlamlhbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNTEyIDE5MmMyNDcuNCAwIDQ0OCAxNDMuMyA0NDggMzIwUzc1OS40IDgzMiA1MTIgODMyIDY0IDY4OC43IDY0IDUxMnMyMDAuNi0zMjAgNDQ4LTMyMHptMCA2NGMtNTQuMiAwLTEwNi42IDcuNS0xNTUuOSAyMi40LTQ2LjYgMTQuMS04OC4zIDM0LjEtMTIzLjcgNTkuNEMxNjUuMSAzODUuOSAxMjggNDQ3LjggMTI4IDUxMmMwIDY0LjIgMzcuMSAxMjYuMSAxMDQuNCAxNzQuMiAzNS40IDI1LjMgNzcuMSA0NS4zIDEyMy43IDU5LjRDNDA1LjQgNzYwLjUgNDU3LjggNzY4IDUxMiA3NjhzMTA2LjYtNy41IDE1NS45LTIyLjRjNDYuNi0xNC4xIDg4LjMtMzQuMSAxMjMuNy01OS40Qzg1OC45IDYzOC4xIDg5NiA1NzYuMiA4OTYgNTEyYzAtNjQuMi0zNy4xLTEyNi4xLTEwNC40LTE3NC4yLTM1LjQtMjUuMy03Ny4xLTQ1LjMtMTIzLjctNTkuNEM2MTguNiAyNjMuNSA1NjYuMiAyNTYgNTEyIDI1NnptMCA5NmM4OC40IDAgMTYwIDcxLjYgMTYwIDE2MHMtNzEuNiAxNjAtMTYwIDE2MC0xNjAtNzEuNi0xNjAtMTYwIDcxLjYtMTYwIDE2MC0xNjB6bTAgNjRjLTUyLjkgMC05NiA0My4xLTk2IDk2czQzLjEgOTYgOTYgOTYgOTYtNDMuMSA5Ni05Ni00My4xLTk2LTk2LTk2eiIvPjwvc3ltYm9sPjwvc3ZnPicKICAgIGlmIChkb2N1bWVudC5ib2R5KSB7CiAgICAgICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCBzdmdDb2RlKQogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgc3ZnQ29kZSkKICAgICAgICB9KQogICAgfQp9KSgp", import.meta.url).href;
|
1073
|
+
document.head.appendChild(script);
|
1074
|
+
}
|
1072
1075
|
useReferenceDoc();
|
1073
1076
|
useThink();
|
1074
1077
|
};
|
package/dist/main.es.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"main.es.js","sources":["../src/types/enum.ts","../src/common/type-transform.ts","../src/common/util.ts","../src/hooks/use-click-proxy.ts","../src/hooks/use-reference-doc.ts","../src/hooks/use-think.ts","../src/common/chart-helper.ts","../src/hooks/use-chat.ts","../src/hooks/use-summary.ts","../src/hooks/use-style.ts"],"sourcesContent":["// 传给 ai 的类型\nexport enum SessionPromptRole {\n System = 'system',\n Assistant = 'assistant',\n User = 'user',\n Guide = 'guide',\n Pause = 'pause',\n UserImage = 'user-image',\n Hidden = 'hidden',\n HiddenUser = 'hidden-user',\n HiddenAssistant = 'hidden-assistant',\n HiddenSystem = 'hidden-system',\n HiddenGuide = 'hidden-guide',\n TemplateUser = 'template-user',\n TemplateAssistant = 'template-assistant',\n TemplateSystem = 'template-system',\n TemplateGuide = 'template-guide',\n TemplateHidden = 'template-hidden',\n}\n\nexport enum SessionContentStatus {\n Fail = 'fail',\n Loading = 'loading',\n Success = 'success',\n}\n\nexport enum SessionContentRole {\n Ai = 'ai',\n User = 'user',\n Time = 'time',\n System = 'system',\n Role = 'role',\n Hidden = 'hidden',\n Guide = 'guide',\n Pause = 'pause',\n TokenExpired = 'token-expired',\n UserImage = 'user-image',\n HiddenUser = 'hidden-user',\n HiddenAi = 'hidden-ai',\n HiddenRole = 'hidden-role',\n HiddenGuide = 'hidden-guide',\n TemplateUser = 'template-user',\n TemplateAi = 'template-ai',\n TemplateRole = 'template-role',\n TemplateGuide = 'template-guide',\n TemplateHidden = 'template-hidden',\n ImageNotSupported = 'image-not-supported'\n}\n\nexport enum HttpErrorCode {\n TokenExpired = '80003',\n ImageNotSupported = '82003',\n UnAuthorizedPreviewFile = '80401',\n TagRepeat = '1513405',\n Aborted = 20,\n UnLogin = 401,\n IamNoPermission = 'IAM_NO_PERMISSION'\n}\n","import {\n SessionContentRole,\n SessionPromptRole,\n} from '../types/enum';\nimport type {\n ISessionContent,\n ISessionPrompt,\n} from '../types/type';\n\n/**\n * 将 sessionContent 转换为 sessionPrompt\n * @param sessionContent sessionContent\n * @returns sessionPrompt\n */\nexport const transferSessionContent2SessionPrompt = (sessionContent: ISessionContent): ISessionPrompt => {\n const sessionRoleMap = {\n [SessionContentRole.Ai]: SessionPromptRole.Assistant,\n [SessionContentRole.User]: SessionPromptRole.User,\n [SessionContentRole.System]: SessionPromptRole.System,\n [SessionContentRole.Hidden]: SessionPromptRole.Hidden,\n [SessionContentRole.Guide]: SessionPromptRole.Guide,\n [SessionContentRole.Time]: SessionPromptRole.System,\n [SessionContentRole.Role]: SessionPromptRole.System,\n [SessionContentRole.HiddenAi]: SessionPromptRole.HiddenAssistant,\n [SessionContentRole.HiddenGuide]: SessionPromptRole.HiddenGuide,\n [SessionContentRole.HiddenRole]: SessionPromptRole.HiddenSystem,\n [SessionContentRole.HiddenUser]: SessionPromptRole.HiddenUser,\n [SessionContentRole.TemplateAi]: SessionPromptRole.TemplateAssistant,\n [SessionContentRole.TemplateGuide]: SessionPromptRole.TemplateGuide,\n [SessionContentRole.TemplateRole]: SessionPromptRole.TemplateSystem,\n [SessionContentRole.TemplateUser]: SessionPromptRole.TemplateUser,\n [SessionContentRole.TemplateHidden]: SessionPromptRole.TemplateHidden,\n [SessionContentRole.Pause]: SessionPromptRole.Pause,\n [SessionContentRole.TokenExpired]: SessionPromptRole.Pause,\n [SessionContentRole.ImageNotSupported]: SessionPromptRole.Pause,\n [SessionContentRole.UserImage]: SessionPromptRole.UserImage,\n };\n return {\n content: sessionContent.content,\n role: sessionRoleMap[sessionContent.role],\n };\n};\n","import {\n Message,\n} from 'bkui-vue';\n\n/**\n * 判断是否是 JSON 字符串\n * @param str 字符串\n * @returns 是否是 JSON 字符串\n */\nexport const isJSON = (str: string) => {\n try {\n JSON.parse(str);\n return true;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * 响应时间格式化\n * @param val 待格式化时间,xxms\n * @returns 格式化后的时间,xx小时xx分钟xx秒\n */\nexport function durationFormatter(val: number) {\n const hours = Math.floor(val / 3600000);\n const minutes = Math.floor((val % 3600000) / 60000);\n const seconds = Math.floor((val % 60000) / 1000);\n const milliseconds = val % 1000;\n\n const parts: string[] = [];\n if (hours > 0) {\n parts.push(`${hours}h`);\n }\n if (minutes > 0) {\n parts.push(`${minutes}min`);\n }\n if (seconds > 0) {\n parts.push(`${seconds}s`);\n }\n if (milliseconds > 0) {\n parts.push(`${milliseconds.toFixed(2)}ms`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * 前端下载文件\n * @param {*} source 文件内容\n * @param {*} filename 文件名\n */\nexport function handleDownLoad(source: string, filename = 'ai.txt') {\n const downloadEl = document.createElement('a');\n const blob = new Blob([source]);\n downloadEl.download = filename;\n downloadEl.href = URL.createObjectURL(blob);\n downloadEl.style.display = 'none';\n document.body.appendChild(downloadEl);\n downloadEl.click();\n document.body.removeChild(downloadEl);\n}\n\nexport const handleCopy = (text: string) => {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n Message({\n theme: 'success',\n message: '复制成功',\n });\n document.body.removeChild(textarea);\n};\n\n/**\n * 处理提示词模板,替换模板中的变量\n * @param prompt 提示词模板\n * @param selectedText 选中的文本\n * @returns 处理后的提示词\n */\nexport const processPromptTemplate = (prompt: string, selectedText: string) => {\n return prompt.replace(/\\{\\{\\s*SELECTED_TEXT\\s*\\}\\}/g, selectedText || '');\n};","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport {\n handleCopy,\n handleDownLoad,\n} from '../common/util';\n\ntype FullScreenWrap = HTMLElement & {\n _originalParent: Node;\n _originalNextSibling: Node;\n};\n\n// 全局点击代理事件\nexport const useClickProxy = () => {\n const clickProxy = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // 聊天窗里面的引用资料和思考内容\n if (target?.classList.contains('bkaidev-angle-up')) {\n const parent = target?.parentElement;\n if (parent?.classList.contains('closed')) {\n parent?.classList.remove('closed');\n } else {\n parent?.classList.add('closed');\n }\n }\n if (target?.classList.contains('click-close')) {\n if (target?.classList.contains('closed')) {\n target?.classList.remove('closed');\n } else {\n target?.classList.add('closed');\n }\n }\n // 会话里面代码块的全屏\n if (target?.classList.contains('click-full-screen')) {\n // 获取全屏的父元素\n const fullScreenWrap = target?.parentElement?.parentElement?.parentElement as FullScreenWrap;\n // 添加 class\n fullScreenWrap?.classList.add('full-screen');\n // 元素移动到body\n if (!fullScreenWrap._originalParent) {\n fullScreenWrap._originalParent = fullScreenWrap.parentNode as Node;\n fullScreenWrap._originalNextSibling = fullScreenWrap.nextSibling as Node;\n }\n document.body.appendChild(fullScreenWrap);\n }\n // 会话里面代码块的取消全屏\n if (target?.classList.contains('click-un-full-screen')) {\n // 获取全屏的父元素\n const fullScreenWrap = target?.parentElement?.parentElement?.parentElement as FullScreenWrap;\n // 移除 class\n fullScreenWrap?.classList.remove('full-screen');\n // 移回原位\n if (fullScreenWrap._originalNextSibling) {\n fullScreenWrap._originalParent.insertBefore(fullScreenWrap, fullScreenWrap._originalNextSibling);\n } else {\n fullScreenWrap._originalParent.appendChild(fullScreenWrap);\n }\n }\n // 复制\n if (target?.classList.contains('click-copy')) {\n const text = target?.getAttribute('data-clipboard-text');\n if (text) {\n handleCopy(decodeURIComponent(text));\n }\n }\n // 下载\n if (target?.classList.contains('click-download')) {\n const text = target?.getAttribute('data-clipboard-text');\n const fileName = target?.getAttribute('data-file-name');\n if (text && fileName) {\n handleDownLoad(decodeURIComponent(text), fileName);\n }\n }\n };\n\n const addClickProxy = () => {\n window.addEventListener('click', clickProxy);\n };\n\n const removeClickProxy = () => {\n window.removeEventListener('click', clickProxy);\n };\n\n onBeforeMount(() => {\n addClickProxy();\n });\n\n onBeforeUnmount(() => {\n removeClickProxy();\n });\n};\n","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport type {\n Document,\n} from '../types/type';\n\n/**\n * 获取引用资料的 HTML 内容\n * @param documents\n * @returns\n */\nexport const getHtmlContentFromDocuments = (documents: Document[]) => {\n let htmlContent = `<section class=\"knowledge-head click-close\">\n <svg\n class=\"ai-ui-sdk-wenzhang\"\n >\n <use href=\"#ai-ui-sdk-wenzhang\"></use>\n </svg>\n 找到 ${documents.length} 篇资料参考\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-angle-up\"></i>\n </section>\n <ul class=\"knowledge-body\">`;\n documents.forEach((document) => {\n const { path, file_path: filePath, display_name: displayName, preview_path: previewPath } = document.metadata;\n const title = displayName || filePath.split('/').pop();\n htmlContent += `<li\n class=\"knowledge-item\"\n >\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-zhishiku\"></i>\n <a href=\"${previewPath}\" title=\"${title} (${previewPath})\" target=\"_blank\" class=\"knowledge-link g-flex-truncate\">\n ${title}\n </a>\n <a href=\"${path}\" title=\"预览原文\" target=\"_blank\" class=\"knowledge-link hover-show\">\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-yanjing-kejian\"></i>\n </a>\n </li>`;\n });\n htmlContent += '</ul>';\n return htmlContent;\n};\n\n/**\n * 移除引用资料的 HTML 内容\n * @param content\n * @returns\n */\nexport const removeReferenceDoc = (content: string) => {\n return content\n .replace(/<section class=\"knowledge-head click-close\">[\\s\\S]*?<\\/section>/, '')\n .replace(/<ul class=\"knowledge-body\">[\\s\\S]*?<\\/ul>/, '')\n .replace(/<section class=\"knowledge-tips\">[\\s\\S]*?<\\/section>/, '');\n};\n\nexport const useReferenceDoc = () => {\n let styleEle: HTMLStyleElement | null = null;\n\n const addReferenceDocStyle = () => {\n // 旧版知识样式\n const oldStyle = `.knowledge-tips {\n position: relative;\n padding: 6px 8px;\n margin-bottom: 14px;\n line-height: 22px;\n background: #f5f7fa;\n border-radius: 4px;\n\n &.closed {\n .bkaidev-angle-up {\n transform: rotate(180deg);\n }\n\n .knowledge-summary {\n margin-bottom: 0;\n }\n\n .knowledge-link {\n display: none;\n }\n }\n\n .bkaidev-angle-up {\n position: absolute;\n top: 4px;\n right: 0px;\n font-size: 22px;\n color: #979ba5;\n cursor: pointer;\n }\n\n .bkaidev-help-document {\n margin-right: 4px;\n font-size: 19px;\n color: #3a84ff;\n }\n\n .knowledge-summary {\n display: block;\n margin-bottom: 4px;\n color: #313238;\n }\n\n .knowledge-link {\n display: block;\n color: #3a84ff;\n text-decoration: none;\n cursor: pointer;\n\n .bkaidev-cc-jump-link {\n font-size: 14px;\n }\n\n &:last-child {\n margin-bottom: 2px;\n }\n }\n }`;\n // 新版知识样式\n const newStyle = `.knowledge-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n\n .ai-ui-sdk-wenzhang {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .knowledge-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .knowledge-body {\n background: #F5F7FA;\n padding: 16px 0 !important;\n .knowledge-item {\n padding-left: 10px;\n display: flex;\n align-items: center;\n line-height: 28px;\n .hover-show {\n display: none;\n }\n a {\n margin-right: 10px;\n &:has(i) {\n padding: 0 10px;\n margin-right: 0;\n text-decoration: none !important;\n }\n }\n .ai-ui-sdk-zhishiku {\n color: #D66F6B;\n font-size: 14px;\n margin-right: 6px;\n }\n &:hover {\n background: #EAEBF0;\n .hover-show {\n display: inline;\n }\n }\n }\n }`;\n styleEle = document.createElement('style');\n styleEle.textContent = oldStyle + newStyle;\n document.head.appendChild(styleEle);\n };\n\n const removeReferenceDocStyle = () => {\n if (styleEle) {\n styleEle.remove();\n styleEle = null;\n }\n };\n\n onBeforeMount(() => {\n addReferenceDocStyle();\n });\n\n onBeforeUnmount(() => {\n removeReferenceDocStyle();\n });\n};\n","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport {\n durationFormatter,\n} from '../common/util';\n\n/**\n * 获取思考的 HTML 内容\n * @param chatContent 聊天内容\n * @param content 思考内容\n * @param elapsedTime 思考时间\n * @returns 完整的 chatContent\n */\nexport const getHtmlContentFromThink = (chatContent: string, content: string, cover?: boolean, elapsedTime?: number) => {\n let htmlContent = (chatContent === '内容正在生成中...' || cover) ? '' : chatContent;\n // 思考开始\n if (!htmlContent.includes('<section class=\"think-head click-close\">')) {\n htmlContent += `<section class=\"think-head click-close\">\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-sikao\"></i>思考中...<i class=\"ai-ui-sdk-icon ai-ui-sdk-angle-up\"></i>\n </section>\n <section class=\"think-body\">\n ${content}\n</section>`;\n } else {\n // 补充思考内容\n const thinkBodyMatch = htmlContent.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>/);\n if (thinkBodyMatch) {\n // 原有思考内容\n const thinkContent = thinkBodyMatch[1];\n // 在最后的换行符前面添加新的思考内容\n const newThinkContent = thinkContent.replace(/\\n$/g, `${content}\\n`);\n htmlContent = htmlContent.replace(\n thinkContent,\n newThinkContent,\n );\n }\n }\n // 思考结束\n if (elapsedTime) {\n htmlContent = htmlContent.replace('思考中...', `已完成思考 (耗时:${durationFormatter(elapsedTime)})`);\n }\n return htmlContent;\n};\n\n/**\n * 移除思考的 HTML 内容\n * @param content\n * @returns\n */\nexport const removeThink = (content: string) => {\n // 移除思考头部\n const afterRemoveThinkHead = content.replace(/<section class=\"think-head click-close\">[\\s\\S]*<\\/section>/, '');\n // 移除思考内容\n let afterRemoveThinkBody = afterRemoveThinkHead.replace(/<section class=\"think-body\">[\\s\\S]*<\\/section>/, '');\n // 如果内容只有思考,那就给ai传递思考内容\n if (afterRemoveThinkBody.trim() === '') {\n const thinkBodyMatch = content.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>/);\n if (thinkBodyMatch) {\n [, afterRemoveThinkBody] = thinkBodyMatch;\n }\n }\n return afterRemoveThinkBody;\n};\n\n/**\n * 判断是否是思考中\n * @param content\n * @returns\n */\nexport const isThinking = (content: string) => {\n // 是否开始思考\n const isStartThinking = content === '正在思考...';\n // 判断是否空思考\n const thinkBodyMatch = content.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>$/);\n const isEmptyThinking = thinkBodyMatch && thinkBodyMatch[1].trim() === '';\n\n return isStartThinking || isEmptyThinking;\n};\n\n// 思考\nexport const useThink = () => {\n let styleEle: HTMLStyleElement | null = null;\n\n const addThinkStyle = () => {\n const style = `.think-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n .ai-ui-sdk-sikao {\n font-size: 14px;\n color: #979ba5;\n margin-right: 4px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .think-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .think-body {\n background: #F5F7FA;\n color: #979BA5;\n padding: 16px;\n margin-bottom: 16px;\n &~ .knowledge-head {\n margin-bottom: 8px;\n }\n }`;\n styleEle = document.createElement('style');\n styleEle.textContent = style;\n document.head.appendChild(styleEle);\n };\n\n const removeThinkStyle = () => {\n if (styleEle) {\n styleEle.remove();\n styleEle = null;\n }\n };\n\n onBeforeMount(() => {\n addThinkStyle();\n });\n\n onBeforeUnmount(() => {\n removeThinkStyle();\n });\n};\n","import {\n isJSON,\n} from './util';\n\nimport type {\n Document,\n} from '../types/type';\n\ntype HandleStart = (sessionCode: string) => any;\ntype HandleText = (sessionCode: string, message: string, cover?: boolean) => void;\ntype HandleReferenceDoc = (sessionCode: string, documents: Document[], cover?: boolean) => void;\ntype HandleThink = (sessionCode: string, content: string, cover?: boolean, elapsed_time?: number) => void;\ntype HandleEnd = (sessionCode: string, message?: string) => void;\ntype HandleError = (sessionCode: string, message: string, code: string) => any;\n\nexport class ChatHelper {\n handleStart: HandleStart;\n handleText: HandleText;\n handleReferenceDoc?: HandleReferenceDoc;\n handleThink?: HandleThink;\n handleEnd: HandleEnd;\n handleError: HandleError;\n controllerMap: Record<string, AbortController>;\n\n constructor({\n handleStart,\n handleText,\n handleReferenceDoc,\n handleThink,\n handleEnd,\n handleError,\n }: {\n handleStart: HandleStart;\n handleText: HandleText;\n handleReferenceDoc?: HandleReferenceDoc;\n handleThink?: HandleThink;\n handleEnd: HandleEnd;\n handleError: HandleError;\n }) {\n this.handleStart = handleStart;\n this.handleText = handleText;\n this.handleReferenceDoc = handleReferenceDoc;\n this.handleThink = handleThink;\n this.handleEnd = handleEnd;\n this.handleError = handleError;\n this.controllerMap = {};\n }\n\n async stream({\n sessionCode,\n url,\n headers,\n data,\n }: {\n sessionCode: string;\n url: string;\n headers?: Record<string, string>;\n data?: Record<string, any>;\n }) {\n // 开始\n await this.handleStart?.(sessionCode);\n // 记录 controller\n const controller = new AbortController();\n this.controllerMap[sessionCode] = controller;\n // 发送请求\n fetch(url, {\n method: 'post',\n signal: controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n mode: 'cors',\n credentials: 'include',\n body: JSON.stringify(data),\n })\n .then(async (response: any) => {\n const reader = response.body\n .pipeThrough(new window.TextDecoderStream())\n .getReader();\n\n // 临时存储数据\n let temp = '';\n\n while (true) {\n try {\n const { value, done } = await reader.read();\n\n // 接口异常处理\n if (!response.ok) {\n this.handleError(sessionCode, value || response.statusText, response.status);\n break;\n }\n // 接口完成\n if (done) {\n this.handleEnd(sessionCode);\n break;\n }\n\n const values = (temp + value.toString()).split('\\n');\n values.forEach((value) => {\n const item = value.replace('data:', '').trim();\n if (isJSON(item)) {\n const {\n event,\n content,\n cover,\n documents,\n result,\n code,\n elapsed_time,\n message,\n } = JSON.parse(item);\n // 业务错误处理\n if (result === false || response.status !== 200) {\n this.handleError(sessionCode, message || '模型调用失败', code);\n return;\n }\n\n switch (event) {\n case 'text':\n this.handleText(sessionCode, content, cover);\n break;\n case 'reference_doc':\n this.handleReferenceDoc?.(sessionCode, documents, cover);\n break;\n case 'think':\n this.handleThink?.(sessionCode, content, cover, elapsed_time);\n break;\n case 'done':\n this.handleEnd(sessionCode, cover ? content : '');\n break;\n case 'error':\n this.handleError(sessionCode, message || '模型调用失败', code);\n break;\n }\n temp = '';\n } else if (item) {\n temp = item;\n }\n });\n } catch (error: any) {\n if (error?.code !== 20) {\n this.handleError(sessionCode, `模型调用失败:${error.message}`, error.code);\n }\n break;\n }\n }\n });\n }\n\n stop(sessionCode: string) {\n this.controllerMap[sessionCode]?.abort?.();\n return this.handleEnd(sessionCode);\n }\n}\n","import {\n ref,\n computed,\n} from 'vue';\nimport type {\n Document,\n ISessionContent,\n ISession,\n ISessionPrompt,\n ChatCallbacks,\n BasicChatContent,\n ShortcutChatContent,\n} from '../types/type.ts';\nimport { processPromptTemplate } from '../common/util';\nimport {\n HttpErrorCode,\n SessionContentRole,\n SessionContentStatus,\n} from '../types/enum';\nimport {\n getHtmlContentFromDocuments,\n removeReferenceDoc,\n} from '../hooks/use-reference-doc';\nimport {\n getHtmlContentFromThink,\n isThinking,\n removeThink,\n} from '../hooks/use-think';\nimport {\n ChatHelper,\n} from '../common/chart-helper';\nimport {\n transferSessionContent2SessionPrompt,\n} from '../common/type-transform';\n\ntype SessionContentsMap = {\n [key: string]: ISessionContent[]\n};\n\ntype SessionLoadingMap = {\n [key: string]: boolean\n};\n\n// ai 聊天\nexport const useChat = <T extends ISession = ISession>({\n handleStart,\n handleText,\n handleReferenceDoc,\n handleThink,\n handleEnd,\n handleError,\n requestOptions,\n}: ChatCallbacks = {}) => {\n const startMessage = '内容正在生成中...';\n // 聊天上下文\n const currentSession = ref<T>();\n const sessionLoadingMap = ref<SessionLoadingMap>({});\n const sessionContents = ref<ISessionContent[]>([]);\n const sessionContentsMap: SessionContentsMap = {};\n\n // 通过计算得到的会话列表\n const calculatedSessionContents = computed<ISessionContent[]>(() => {\n const calculatedSessionContents: ISessionContent[] = [];\n for (let index = sessionContents.value.length - 1; index >= 0; index--) {\n const sessionContent = sessionContents.value[index];\n // 向下找到下一个ai回复\n let nextAiSessionContentIndex = index + 1;\n let nextAiSessionContent = sessionContents.value[nextAiSessionContentIndex];\n while (nextAiSessionContent && ![\n SessionContentRole.Ai,\n SessionContentRole.TokenExpired,\n SessionContentRole.ImageNotSupported,\n SessionContentRole.Pause,\n SessionContentRole.Guide,\n ].includes(nextAiSessionContent.role)\n ) {\n nextAiSessionContentIndex += 1;\n nextAiSessionContent = sessionContents.value[nextAiSessionContentIndex];\n }\n\n // 系统消息,退出\n if (sessionContent.role === SessionContentRole.System) {\n break;\n }\n\n // 倒叙添加当前聊天上下文 排除异常答复、异常问题 & 系统消息和时间消息\n if (sessionContent.status !== SessionContentStatus.Fail\n && !(nextAiSessionContent?.status === SessionContentStatus.Fail\n && [SessionContentRole.User, SessionContentRole.UserImage].includes(sessionContent.role)\n )\n && ![SessionContentRole.Time, SessionContentRole.System].includes(sessionContent.role)\n ) {\n calculatedSessionContents.unshift(sessionContent);\n }\n }\n\n return calculatedSessionContents;\n });\n\n // 当前会话是否正在加载\n const currentSessionLoading = computed(() => {\n const sessionCode = currentSession.value?.sessionCode;\n return sessionCode ? sessionLoadingMap.value[sessionCode] : false;\n });\n\n // 计算当前的 prompt\n const prompts = computed<ISessionPrompt[]>(() => {\n const rolePrompts: ISessionPrompt[] = [];\n const userPrompts: ISessionPrompt[] = [];\n const prompts: ISessionPrompt[] = [];\n\n // build rolePrompts\n const latestMatchIndex = sessionContents.value.findLastIndex(sessionContent => (\n sessionContent.role === SessionContentRole.System && ['已启用角色', '已启用模型'].some(key => sessionContent.content.includes(key))\n ));\n let index = 0;\n currentSession.value?.roleInfo?.content?.forEach((roleContent) => {\n const sessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n let nextSessionContent = sessionContents.value[latestMatchIndex + 2 + index];\n if (sessionContent?.content === roleContent.content && sessionContent.role !== SessionContentRole.System) {\n rolePrompts.push(transferSessionContent2SessionPrompt(sessionContent));\n index += 1;\n if (sessionContent?.role === SessionContentRole.Pause) {\n while (nextSessionContent && nextSessionContent.role === SessionContentRole.System) {\n index += 1;\n nextSessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n }\n while (nextSessionContent\n && [SessionContentRole.User, SessionContentRole.UserImage].includes(nextSessionContent.role)\n ) {\n rolePrompts.push(transferSessionContent2SessionPrompt(nextSessionContent));\n index += 1;\n nextSessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n }\n }\n }\n });\n\n // build userPrompts\n userPrompts.push(...calculatedSessionContents.value.map(transferSessionContent2SessionPrompt));\n\n const isSameContent = (startIndex: number) => {\n let isSame = true;\n for (let index = startIndex; index < rolePrompts.length; index++) {\n const rolePrompt = rolePrompts[index];\n if (rolePrompt.content !== userPrompts[index - startIndex]?.content) {\n isSame = false;\n }\n }\n\n return isSame;\n };\n\n // 排除在一个系统消息里面,重复的情况\n for (let index = 0; index < rolePrompts.length; index++) {\n const rolePrompt = rolePrompts[index];\n if (isSameContent(index)) {\n break;\n } else {\n prompts.push(rolePrompt);\n }\n }\n\n prompts.push(...userPrompts);\n\n // 删除引用资料\n prompts.forEach(prompt => {\n prompt.content = removeThink(prompt.content);\n prompt.content = removeReferenceDoc(prompt.content);\n });\n\n return prompts;\n });\n\n const chatHelper = new ChatHelper({\n handleStart: handleStartChat,\n handleText: handleTextChat,\n handleReferenceDoc: handleReferenceDocChat,\n handleThink: handleThinkChat,\n handleEnd: handleEndChat,\n handleError: handleErrorChat,\n });\n\n // 设置 currentSession\n function setCurrentSession(session?: T) {\n currentSession.value = session;\n // 空session,不处理\n if (!session?.sessionCode) return;\n\n if (!sessionContentsMap[session.sessionCode]) {\n sessionContentsMap[session.sessionCode] = [];\n }\n sessionContents.value = sessionContentsMap[session.sessionCode];\n }\n\n // 设置 sessionContents\n function setSessionContents(data: ISessionContent[]) {\n if (!currentSession.value) return;\n sessionContentsMap[currentSession.value.sessionCode] = data;\n sessionContents.value = data;\n }\n\n\n // 获取 SessionContent 通过 id\n function getSessionContentById(id: number, sessionCode: string) {\n const sessionContents = getSessionContentsBySessionCode(sessionCode);\n return sessionContents.find(item => item.id === id);\n }\n\n // 获取执行中的 SessionContent(最后一个)\n function getLastSessionContentBySessionCode(sessionCode: string) {\n if (currentSession.value?.sessionCode === sessionCode) {\n return sessionContents.value.at(-1) as ISessionContent;\n }\n return sessionContentsMap[sessionCode]?.at(-1) as ISessionContent;\n }\n\n // 获取 SessionContents\n function getSessionContentsBySessionCode(sessionCode: string) {\n if (currentSession.value?.sessionCode === sessionCode) {\n return sessionContents.value;\n }\n return sessionContentsMap[sessionCode];\n }\n\n // 新增 sessionContent\n function plusSessionContent(sessionCode: string, sessionContent: ISessionContent) {\n const sessionContents = getSessionContentsBySessionCode(sessionCode);\n sessionContents.push(sessionContent);\n }\n\n // 更新 chatContent\n function updateSessionContent(sessionContent: ISessionContent) {\n const currentSessionContents = currentSession.value?.sessionCode === sessionContent.sessionCode\n ? sessionContents.value\n : sessionContentsMap[sessionContent.sessionCode];\n\n const currentSessionContent = currentSessionContents.find(item => +(item.id || 0) === +(sessionContent.id || 0));\n if (currentSessionContent) {\n Object.assign(currentSessionContent, sessionContent);\n }\n }\n\n // 获取待删除的会话id,并从会话列表中删除\n function getDeleteSessionContents(sessionCode: string, sessionContentIds: number[], relatedDelete: boolean) {\n const currentSessionContents = currentSession.value?.sessionCode === sessionCode\n ? sessionContents.value\n : sessionContentsMap[sessionCode];\n const deleteSessionContentIds: number[] = [];\n\n sessionContentIds.forEach((sessionContentId) => {\n const index = currentSessionContents.findIndex(sessionContent => sessionContent.id === sessionContentId);\n if (index > -1) {\n const preSessionContent = currentSessionContents[index - 1];\n const nextSessionContent = currentSessionContents[index + 1];\n const nextNextSessionContent = currentSessionContents[index + 2];\n // 删除当前会话\n currentSessionContents.splice(index, 1);\n deleteSessionContentIds.push(sessionContentId);\n // 如果前一个是 hidden 也需要删除\n if ([SessionContentRole.Hidden].includes(preSessionContent?.role)) {\n const hiddenIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === preSessionContent.id);\n currentSessionContents.splice(hiddenIndex, 1);\n deleteSessionContentIds.push(preSessionContent.id as number);\n }\n // 如果下一个是ai回复,也需要删掉\n if (nextSessionContent?.role === SessionContentRole.Ai\n || (relatedDelete && [\n SessionContentRole.Ai,\n SessionContentRole.Guide,\n SessionContentRole.TokenExpired,\n SessionContentRole.ImageNotSupported,\n SessionContentRole.Pause,\n ].includes(nextSessionContent?.role))\n ) {\n const nextIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === nextSessionContent.id);\n currentSessionContents.splice(nextIndex, 1);\n deleteSessionContentIds.push(nextSessionContent.id as number);\n }\n // 如果下下个是 guide,需要删除\n if ([SessionContentRole.Guide].includes(nextNextSessionContent?.role) && relatedDelete) {\n const nextNextIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === nextNextSessionContent.id);\n currentSessionContents.splice(nextNextIndex, 1);\n deleteSessionContentIds.push(nextNextSessionContent.id as number);\n }\n }\n });\n\n return deleteSessionContentIds;\n }\n\n // 删除聊天内容\n function deleteSessionContent(sessionCode: string, contentId: number) {\n const deleteSessionContentIds = getDeleteSessionContents(sessionCode, [contentId], true);\n return deleteSessionContentIds;\n }\n\n // 批量删除\n function deleteSessionContents(sessionCode: string, contentIds: number[]) {\n const deleteSessionContentIds = getDeleteSessionContents(sessionCode, contentIds, false);\n return deleteSessionContentIds;\n }\n\n // 聊天开始\n function handleStartChat(sessionCode: string) {\n sessionLoadingMap.value[sessionCode] = true;\n const sessionContent: ISessionContent = {\n sessionCode,\n role: SessionContentRole.Ai,\n status: SessionContentStatus.Loading,\n content: startMessage,\n };\n // 画布新增\n plusSessionContent(sessionCode, sessionContent);\n // 调用cb\n return handleStart?.(sessionCode, sessionContent);\n }\n\n // 引用资料\n function handleReferenceDocChat(sessionCode: string, documents: Document[], cover?: boolean) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n const content = getHtmlContentFromDocuments(documents);\n sessionContent.content = cover ? content : sessionContent.content + content;\n return handleReferenceDoc?.(sessionCode, sessionContent);\n }\n\n // 思考\n function handleThinkChat(sessionCode: string, content: string, cover?: boolean, elapsedTime?: number) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n // 获取思考的html\n sessionContent.content = getHtmlContentFromThink(sessionContent.content, content, cover, elapsedTime);\n // 调用cb\n return handleThink?.(sessionCode, sessionContent);\n }\n\n // 文本\n function handleTextChat(sessionCode: string, message: string, cover?: boolean) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n if (sessionContent.content === startMessage) {\n sessionContent.content = message;\n } else if (sessionContent.status === SessionContentStatus.Loading) {\n sessionContent.content = cover\n ? message\n : sessionContent.content + message;\n } else {\n return;\n }\n // 调用cb\n return handleText?.(sessionCode, sessionContent);\n }\n\n // 聊天结束\n function handleEndChat(sessionCode: string, message?: string) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n // 防止 error 的情况下异步触发 end 更新了数据\n if (sessionContent.status === SessionContentStatus.Loading) {\n sessionLoadingMap.value[sessionCode] = false;\n // end 的时候,如果 message 有值,则更新 content\n if (message) {\n sessionContent.content = message;\n }\n // 更新状态\n sessionContent.status = SessionContentStatus.Success;\n // 调用cb\n return handleEnd?.(sessionCode, sessionContent);\n }\n // 内容正在生成中或者正在思考中\n if (sessionContent.content === startMessage || isThinking(sessionContent.content)) {\n handleErrorChat(sessionCode, '聊天内容已中断');\n }\n }\n\n // 聊天异常\n function handleErrorChat(sessionCode: string, message: string, code?: string) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n sessionContent.status = SessionContentStatus.Fail;\n sessionContent.content = message;\n sessionLoadingMap.value[sessionCode] = false;\n // token 超了,提示 token 不足\n if (code === HttpErrorCode.TokenExpired) {\n sessionContent.content = '抱歉,您的剩余 Token 不足,无法返回回答内容,请先清空当前会话(上下文仍会作为历史记录保留))';\n sessionContent.role = SessionContentRole.TokenExpired;\n }\n if (code === HttpErrorCode.ImageNotSupported) {\n sessionContent.content = '抱歉,当前模型不支持图片内容解析';\n sessionContent.role = SessionContentRole.ImageNotSupported;\n }\n // 调用cb\n return handleError?.(sessionCode, sessionContent, code);\n }\n\n // 重新生成对话 仅支持重新生成 ai 的回复\n function reGenerateChat(chatIndex: number) {\n const chat = sessionContents.value[chatIndex];\n if (chat.role !== SessionContentRole.Ai) {\n return;\n }\n\n const message = sessionContents.value[chatIndex - 1].content;\n const cite = sessionContents.value[chatIndex - 1].cite;\n sessionContents.value.splice(chatIndex - 1, 2);\n sendChat({message, cite});\n }\n\n // 聊天\n function chat({\n sessionCode,\n data,\n url,\n headers,\n }: {\n sessionCode: string;\n data?: Record<string, any>;\n url: string;\n headers?: Record<string, string>;\n }) {\n // 发送请求\n chatHelper.stream({\n sessionCode,\n url: url,\n data,\n headers: headers || requestOptions?.headers,\n });\n }\n\n // 重新发送聊天, 需要将当前聊天内容以及下方的所有内容删除\n function reSendChat(index: number, {message, cite}: {message: string, cite?: string}, callback?: () => void) {\n const chat = sessionContents.value[index];\n if (chat.role !== SessionContentRole.User) {\n return;\n }\n\n sessionContents.value.splice(index, sessionContents.value.length - index);\n sendChat({message, cite}, callback);\n }\n\n // 发送聊天\n function sendChat(content: BasicChatContent | ShortcutChatContent, callback?: () => void) {\n if (!currentSession.value?.sessionCode || !requestOptions?.url || currentSessionLoading.value) {\n return;\n }\n\n const {message, cite, shortcut} = content;\n\n let input = '';\n\n if (shortcut) {\n input = processPromptTemplate(shortcut.prompt, cite);\n } else {\n input = cite ? `${message}: \"${cite}\"` : message;\n }\n\n\n sessionContents.value.push({\n sessionCode: currentSession.value?.sessionCode,\n content: message,\n role: SessionContentRole.User,\n status: SessionContentStatus.Success,\n cite,\n });\n\n // 发送请求\n chatHelper.stream({\n sessionCode: currentSession.value?.sessionCode,\n url: requestOptions.url,\n headers: requestOptions?.headers,\n data: {\n inputs: {\n chat_history: prompts.value.slice(0, prompts.value.length - 1),\n input,\n },\n }\n });\n\n callback?.();\n }\n\n /**\n * 删除聊天内容\n * @param index 要删除的聊天内容索引\n * @description \n * - 如果删除的是用户消息,则同时删除该消息及其对应的AI回复(共2条)\n * - 如果删除的是其他类型消息(如AI回复),则只删除该条消息\n */\n function deleteChat(index: number) {\n const chat = sessionContents.value[index];\n if (chat.role === SessionContentRole.User) {\n sessionContents.value.splice(index, 2);\n return;\n }\n\n sessionContents.value.splice(index-1, 2);\n }\n\n // 停止聊天\n function stopChat(sessionCode: string) {\n chatHelper.stop(sessionCode);\n }\n\n return {\n currentSession,\n sessionContents,\n sessionContentsMap,\n sessionLoadingMap,\n prompts,\n currentSessionLoading,\n chat,\n sendChat,\n stopChat,\n plusSessionContent,\n updateSessionContent,\n getSessionContentById,\n getLastSessionContentBySessionCode,\n getSessionContentsBySessionCode,\n setCurrentSession,\n setSessionContents,\n deleteSessionContent,\n deleteSessionContents,\n handleStartChat,\n handleErrorChat,\n reGenerateChat,\n reSendChat,\n deleteChat,\n };\n};","import type {\n SummaryCallbacks,\n} from '../types/type.ts';\nimport {\n SessionPromptRole,\n} from '../types/enum';\nimport {\n removeReferenceDoc,\n} from '../hooks/use-reference-doc';\nimport {\n removeThink,\n} from '../hooks/use-think';\nimport {\n ChatHelper,\n} from '../common/chart-helper';\n\n// ai 总结\nexport const useSummary = ({\n handleStart,\n handleEnd,\n handleError,\n}: SummaryCallbacks = {}) => {\n let summaryText = '';\n\n const handleStartChat = () => {\n summaryText = '';\n return handleStart?.();\n };\n\n const handleTextChat = (sessionCode: string, message: string, cover?: boolean) => {\n if (cover || summaryText === '正在思考...') {\n summaryText = message;\n } else {\n summaryText += message;\n }\n };\n\n const handleEndChat = () => {\n if (summaryText === '无话可说') {\n summaryText = '';\n }\n return handleEnd?.(summaryText);\n };\n\n const handleErrorChat = (sessionCode: string, message: string, code?: string) => {\n return handleError?.(message, code);\n };\n\n const chatHelper = new ChatHelper({\n handleStart: handleStartChat,\n handleText: handleTextChat,\n handleEnd: handleEndChat,\n handleError: handleErrorChat,\n });\n\n const summary = ({\n content,\n url,\n headers,\n model,\n }: {\n content: string;\n url: string;\n headers?: Record<string, string>;\n model?: string;\n }) => {\n const filterContent = removeThink(removeReferenceDoc(content));\n const prompts = [\n {\n role: SessionPromptRole.User,\n content: `你是一个总结大师,请帮助我对下面这段话进行总结。要求总结精炼,不超过 15 个字!且末尾没有标点符号!请注意:如果你无法总结,请回复“无话可说”!\\n文字如下:\\n${filterContent}`,\n },\n ];\n \n chatHelper.stream({\n sessionCode: 'summary',\n url,\n data: {\n prompts,\n model,\n },\n headers,\n });\n };\n\n return {\n summary,\n };\n}","import {\n useReferenceDoc,\n} from \"./use-reference-doc\";\nimport {\n useThink,\n} from \"./use-think\";\n\n// ai 样式。注意:全局引入一次即可\nexport const useStyle = () => {\n // 引入样式\n require('../css/style.css');\n require('../css/iconcool.js');\n // 引用资料\n useReferenceDoc();\n // 思考\n useThink();\n};\n"],"names":["SessionPromptRole","SessionContentStatus","SessionContentRole","HttpErrorCode","document","value","_a","calculatedSessionContents","prompts","index","sessionContents","chat"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACY,IAAA,sCAAAA,uBAAL;AACLA,qBAAA,QAAS,IAAA;AACTA,qBAAA,WAAY,IAAA;AACZA,qBAAA,MAAO,IAAA;AACPA,qBAAA,OAAQ,IAAA;AACRA,qBAAA,OAAQ,IAAA;AACRA,qBAAA,WAAY,IAAA;AACZA,qBAAA,QAAS,IAAA;AACTA,qBAAA,YAAa,IAAA;AACbA,qBAAA,iBAAkB,IAAA;AAClBA,qBAAA,cAAe,IAAA;AACfA,qBAAA,aAAc,IAAA;AACdA,qBAAA,cAAe,IAAA;AACfA,qBAAA,mBAAoB,IAAA;AACpBA,qBAAA,gBAAiB,IAAA;AACjBA,qBAAA,eAAgB,IAAA;AAChBA,qBAAA,gBAAiB,IAAA;AAhBPA,SAAAA;AAAA,GAAA,qBAAA,CAAA,CAAA;AAmBA,IAAA,yCAAAC,0BAAL;AACLA,wBAAA,MAAO,IAAA;AACPA,wBAAA,SAAU,IAAA;AACVA,wBAAA,SAAU,IAAA;AAHAA,SAAAA;AAAA,GAAA,wBAAA,CAAA,CAAA;AAMA,IAAA,uCAAAC,wBAAL;AACLA,sBAAA,IAAK,IAAA;AACLA,sBAAA,MAAO,IAAA;AACPA,sBAAA,MAAO,IAAA;AACPA,sBAAA,QAAS,IAAA;AACTA,sBAAA,MAAO,IAAA;AACPA,sBAAA,QAAS,IAAA;AACTA,sBAAA,OAAQ,IAAA;AACRA,sBAAA,OAAQ,IAAA;AACRA,sBAAA,cAAe,IAAA;AACfA,sBAAA,WAAY,IAAA;AACZA,sBAAA,YAAa,IAAA;AACbA,sBAAA,UAAW,IAAA;AACXA,sBAAA,YAAa,IAAA;AACbA,sBAAA,aAAc,IAAA;AACdA,sBAAA,cAAe,IAAA;AACfA,sBAAA,YAAa,IAAA;AACbA,sBAAA,cAAe,IAAA;AACfA,sBAAA,eAAgB,IAAA;AAChBA,sBAAA,gBAAiB,IAAA;AACjBA,sBAAA,mBAAoB,IAAA;AApBVA,SAAAA;AAAA,GAAA,sBAAA,CAAA,CAAA;AAuBA,IAAA,kCAAAC,mBAAL;AACLA,iBAAA,cAAe,IAAA;AACfA,iBAAA,mBAAoB,IAAA;AACpBA,iBAAA,yBAA0B,IAAA;AAC1BA,iBAAA,WAAY,IAAA;AACZA,iBAAAA,eAAA,aAAU,EAAV,IAAA;AACAA,iBAAAA,eAAA,aAAU,GAAV,IAAA;AACAA,iBAAA,iBAAkB,IAAA;AAPRA,SAAAA;AAAA,GAAA,iBAAA,CAAA,CAAA;ACnCC,MAAA,uCAAuC,CAAC,mBAAoD;AACvG,QAAM,iBAAiB;AAAA,IACrB,CAAC,mBAAmB,EAAE,GAAG,kBAAkB;AAAA,IAC3C,CAAC,mBAAmB,IAAI,GAAG,kBAAkB;AAAA,IAC7C,CAAC,mBAAmB,MAAM,GAAG,kBAAkB;AAAA,IAC/C,CAAC,mBAAmB,MAAM,GAAG,kBAAkB;AAAA,IAC/C,CAAC,mBAAmB,KAAK,GAAG,kBAAkB;AAAA,IAC9C,CAAC,mBAAmB,IAAI,GAAG,kBAAkB;AAAA,IAC7C,CAAC,mBAAmB,IAAI,GAAG,kBAAkB;AAAA,IAC7C,CAAC,mBAAmB,QAAQ,GAAG,kBAAkB;AAAA,IACjD,CAAC,mBAAmB,WAAW,GAAG,kBAAkB;AAAA,IACpD,CAAC,mBAAmB,UAAU,GAAG,kBAAkB;AAAA,IACnD,CAAC,mBAAmB,UAAU,GAAG,kBAAkB;AAAA,IACnD,CAAC,mBAAmB,UAAU,GAAG,kBAAkB;AAAA,IACnD,CAAC,mBAAmB,aAAa,GAAG,kBAAkB;AAAA,IACtD,CAAC,mBAAmB,YAAY,GAAG,kBAAkB;AAAA,IACrD,CAAC,mBAAmB,YAAY,GAAG,kBAAkB;AAAA,IACrD,CAAC,mBAAmB,cAAc,GAAG,kBAAkB;AAAA,IACvD,CAAC,mBAAmB,KAAK,GAAG,kBAAkB;AAAA,IAC9C,CAAC,mBAAmB,YAAY,GAAG,kBAAkB;AAAA,IACrD,CAAC,mBAAmB,iBAAiB,GAAG,kBAAkB;AAAA,IAC1D,CAAC,mBAAmB,SAAS,GAAG,kBAAkB;AAAA,EACpD;AACO,SAAA;AAAA,IACL,SAAS,eAAe;AAAA,IACxB,MAAM,eAAe,eAAe,IAAI;AAAA,EAC1C;AACF;AChCa,MAAA,SAAS,CAAC,QAAgB;AACjC,MAAA;AACF,SAAK,MAAM,GAAG;AACP,WAAA;AAAA,WACA,GAAG;AACH,WAAA;AAAA,EAAA;AAEX;AAOO,SAAS,kBAAkB,KAAa;AAC7C,QAAM,QAAQ,KAAK,MAAM,MAAM,IAAO;AACtC,QAAM,UAAU,KAAK,MAAO,MAAM,OAAW,GAAK;AAClD,QAAM,UAAU,KAAK,MAAO,MAAM,MAAS,GAAI;AAC/C,QAAM,eAAe,MAAM;AAE3B,QAAM,QAAkB,CAAC;AACzB,MAAI,QAAQ,GAAG;AACP,UAAA,KAAK,GAAG,KAAK,GAAG;AAAA,EAAA;AAExB,MAAI,UAAU,GAAG;AACT,UAAA,KAAK,GAAG,OAAO,KAAK;AAAA,EAAA;AAE5B,MAAI,UAAU,GAAG;AACT,UAAA,KAAK,GAAG,OAAO,GAAG;AAAA,EAAA;AAE1B,MAAI,eAAe,GAAG;AACpB,UAAM,KAAK,GAAG,aAAa,QAAQ,CAAC,CAAC,IAAI;AAAA,EAAA;AAGpC,SAAA,MAAM,KAAK,GAAG;AACvB;AAOgB,SAAA,eAAe,QAAgB,WAAW,UAAU;AAC5D,QAAA,aAAa,SAAS,cAAc,GAAG;AAC7C,QAAM,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC;AAC9B,aAAW,WAAW;AACX,aAAA,OAAO,IAAI,gBAAgB,IAAI;AAC1C,aAAW,MAAM,UAAU;AAClB,WAAA,KAAK,YAAY,UAAU;AACpC,aAAW,MAAM;AACR,WAAA,KAAK,YAAY,UAAU;AACtC;AAEa,MAAA,aAAa,CAAC,SAAiB;AACpC,QAAA,WAAW,SAAS,cAAc,UAAU;AAClD,WAAS,QAAQ;AACR,WAAA,KAAK,YAAY,QAAQ;AAClC,WAAS,OAAO;AAChB,WAAS,YAAY,MAAM;AACnB,UAAA;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,EAAA,CACV;AACQ,WAAA,KAAK,YAAY,QAAQ;AACpC;AAQa,MAAA,wBAAwB,CAAC,QAAgB,iBAAyB;AAC7E,SAAO,OAAO,QAAQ,gCAAgC,gBAAgB,EAAE;AAC1E;ACnEO,MAAM,gBAAgB,MAAM;AAC3B,QAAA,aAAa,CAAC,MAAkB;;AACpC,UAAM,SAAS,EAAE;AAEjB,QAAI,iCAAQ,UAAU,SAAS,qBAAqB;AAClD,YAAM,SAAS,iCAAQ;AACvB,UAAI,iCAAQ,UAAU,SAAS,WAAW;AAChC,yCAAA,UAAU,OAAO;AAAA,MAAQ,OAC5B;AACG,yCAAA,UAAU,IAAI;AAAA,MAAQ;AAAA,IAChC;AAEF,QAAI,iCAAQ,UAAU,SAAS,gBAAgB;AAC7C,UAAI,iCAAQ,UAAU,SAAS,WAAW;AAChC,yCAAA,UAAU,OAAO;AAAA,MAAQ,OAC5B;AACG,yCAAA,UAAU,IAAI;AAAA,MAAQ;AAAA,IAChC;AAGF,QAAI,iCAAQ,UAAU,SAAS,sBAAsB;AAE7C,YAAA,kBAAiB,4CAAQ,kBAAR,mBAAuB,kBAAvB,mBAAsC;AAE7C,uDAAA,UAAU,IAAI;AAE1B,UAAA,CAAC,eAAe,iBAAiB;AACnC,uBAAe,kBAAkB,eAAe;AAChD,uBAAe,uBAAuB,eAAe;AAAA,MAAA;AAE9C,eAAA,KAAK,YAAY,cAAc;AAAA,IAAA;AAG1C,QAAI,iCAAQ,UAAU,SAAS,yBAAyB;AAEhD,YAAA,kBAAiB,4CAAQ,kBAAR,mBAAuB,kBAAvB,mBAAsC;AAE7C,uDAAA,UAAU,OAAO;AAEjC,UAAI,eAAe,sBAAsB;AACvC,uBAAe,gBAAgB,aAAa,gBAAgB,eAAe,oBAAoB;AAAA,MAAA,OAC1F;AACU,uBAAA,gBAAgB,YAAY,cAAc;AAAA,MAAA;AAAA,IAC3D;AAGF,QAAI,iCAAQ,UAAU,SAAS,eAAe;AACtC,YAAA,OAAO,iCAAQ,aAAa;AAClC,UAAI,MAAM;AACG,mBAAA,mBAAmB,IAAI,CAAC;AAAA,MAAA;AAAA,IACrC;AAGF,QAAI,iCAAQ,UAAU,SAAS,mBAAmB;AAC1C,YAAA,OAAO,iCAAQ,aAAa;AAC5B,YAAA,WAAW,iCAAQ,aAAa;AACtC,UAAI,QAAQ,UAAU;AACL,uBAAA,mBAAmB,IAAI,GAAG,QAAQ;AAAA,MAAA;AAAA,IACnD;AAAA,EAEJ;AAEA,QAAM,gBAAgB,MAAM;AACnB,WAAA,iBAAiB,SAAS,UAAU;AAAA,EAC7C;AAEA,QAAM,mBAAmB,MAAM;AACtB,WAAA,oBAAoB,SAAS,UAAU;AAAA,EAChD;AAEA,gBAAc,MAAM;AACJ,kBAAA;AAAA,EAAA,CACf;AAED,kBAAgB,MAAM;AACH,qBAAA;AAAA,EAAA,CAClB;AACH;AC/Ea,MAAA,8BAA8B,CAAC,cAA0B;AACpE,MAAI,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMX,UAAU,MAAM;AAAA;AAAA;AAAA;AAIb,YAAA,QAAQ,CAACC,cAAa;AACxB,UAAA,EAAE,MAAM,WAAW,UAAU,cAAc,aAAa,cAAc,gBAAgBA,UAAS;AACrG,UAAM,QAAQ,eAAe,SAAS,MAAM,GAAG,EAAE,IAAI;AACtC,mBAAA;AAAA;AAAA;AAAA;AAAA,iBAIF,WAAW,YAAY,KAAK,KAAK,WAAW;AAAA,UACnD,KAAK;AAAA;AAAA,iBAEE,IAAI;AAAA;AAAA;AAAA;AAAA,EAAA,CAIlB;AACc,iBAAA;AACR,SAAA;AACT;AAOa,MAAA,qBAAqB,CAAC,YAAoB;AAC9C,SAAA,QACJ,QAAQ,mEAAmE,EAAE,EAC7E,QAAQ,6CAA6C,EAAE,EACvD,QAAQ,uDAAuD,EAAE;AACtE;AAEO,MAAM,kBAAkB,MAAM;AACnC,MAAI,WAAoC;AAExC,QAAM,uBAAuB,MAAM;AAEjC,UAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2DjB,UAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyEN,eAAA,SAAS,cAAc,OAAO;AACzC,aAAS,cAAc,WAAW;AACzB,aAAA,KAAK,YAAY,QAAQ;AAAA,EACpC;AAEA,QAAM,0BAA0B,MAAM;AACpC,QAAI,UAAU;AACZ,eAAS,OAAO;AACL,iBAAA;AAAA,IAAA;AAAA,EAEf;AAEA,gBAAc,MAAM;AACG,yBAAA;AAAA,EAAA,CACtB;AAED,kBAAgB,MAAM;AACI,4BAAA;AAAA,EAAA,CACzB;AACH;ACpMO,MAAM,0BAA0B,CAAC,aAAqB,SAAiB,OAAiB,gBAAyB;AACtH,MAAI,cAAe,gBAAgB,gBAAgB,QAAS,KAAK;AAEjE,MAAI,CAAC,YAAY,SAAS,0CAA0C,GAAG;AACtD,mBAAA;AAAA;AAAA;AAAA;AAAA,QAIX,OAAO;AAAA;AAAA,EAAA,OAEN;AAEC,UAAA,iBAAiB,YAAY,MAAM,mDAAmD;AAC5F,QAAI,gBAAgB;AAEZ,YAAA,eAAe,eAAe,CAAC;AAErC,YAAM,kBAAkB,aAAa,QAAQ,QAAQ,GAAG,OAAO;AAAA,CAAI;AACnE,oBAAc,YAAY;AAAA,QACxB;AAAA,QACA;AAAA,MACF;AAAA,IAAA;AAAA,EACF;AAGF,MAAI,aAAa;AACf,kBAAc,YAAY,QAAQ,UAAU,aAAa,kBAAkB,WAAW,CAAC,GAAG;AAAA,EAAA;AAErF,SAAA;AACT;AAOa,MAAA,cAAc,CAAC,YAAoB;AAE9C,QAAM,uBAAuB,QAAQ,QAAQ,8DAA8D,EAAE;AAE7G,MAAI,uBAAuB,qBAAqB,QAAQ,kDAAkD,EAAE;AAExG,MAAA,qBAAqB,KAAK,MAAM,IAAI;AAChC,UAAA,iBAAiB,QAAQ,MAAM,mDAAmD;AACxF,QAAI,gBAAgB;AACjB,OAAE,EAAA,oBAAoB,IAAI;AAAA,IAAA;AAAA,EAC7B;AAEK,SAAA;AACT;AAOa,MAAA,aAAa,CAAC,YAAoB;AAE7C,QAAM,kBAAkB,YAAY;AAE9B,QAAA,iBAAiB,QAAQ,MAAM,oDAAoD;AACzF,QAAM,kBAAkB,kBAAkB,eAAe,CAAC,EAAE,WAAW;AAEvE,SAAO,mBAAmB;AAC5B;AAGO,MAAM,WAAW,MAAM;AAC5B,MAAI,WAAoC;AAExC,QAAM,gBAAgB,MAAM;AAC1B,UAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDH,eAAA,SAAS,cAAc,OAAO;AACzC,aAAS,cAAc;AACd,aAAA,KAAK,YAAY,QAAQ;AAAA,EACpC;AAEA,QAAM,mBAAmB,MAAM;AAC7B,QAAI,UAAU;AACZ,eAAS,OAAO;AACL,iBAAA;AAAA,IAAA;AAAA,EAEf;AAEA,gBAAc,MAAM;AACJ,kBAAA;AAAA,EAAA,CACf;AAED,kBAAgB,MAAM;AACH,qBAAA;AAAA,EAAA,CAClB;AACH;AC5IO,MAAM,WAAW;AAAA,EAStB,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAQC;AAtBH;AACA;AACA;AACA;AACA;AACA;AACA;AAiBE,SAAK,cAAc;AACnB,SAAK,aAAa;AAClB,SAAK,qBAAqB;AAC1B,SAAK,cAAc;AACnB,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,SAAK,gBAAgB,CAAC;AAAA,EAAA;AAAA,EAGlB,OAAO,IAUV;AAAA,+CAVU;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,GAMC;;AAEK,aAAA,UAAK,gBAAL,8BAAmB;AAEnB,YAAA,aAAa,IAAI,gBAAgB;AAClC,WAAA,cAAc,WAAW,IAAI;AAElC,YAAM,KAAK;AAAA,QACT,QAAQ;AAAA,QACR,QAAQ,WAAW;AAAA,QACnB,SAAS;AAAA,UACP,gBAAgB;AAAA,WACb;AAAA,QAEL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM,KAAK,UAAU,IAAI;AAAA,MAAA,CAC1B,EACA,KAAK,CAAO,aAAkB;AACvB,cAAA,SAAS,SAAS,KACrB,YAAY,IAAI,OAAO,mBAAmB,EAC1C,UAAU;AAGb,YAAI,OAAO;AAEX,eAAO,MAAM;AACP,cAAA;AACF,kBAAM,EAAE,OAAO,KAAS,IAAA,MAAM,OAAO,KAAK;AAGtC,gBAAA,CAAC,SAAS,IAAI;AAChB,mBAAK,YAAY,aAAa,SAAS,SAAS,YAAY,SAAS,MAAM;AAC3E;AAAA,YAAA;AAGF,gBAAI,MAAM;AACR,mBAAK,UAAU,WAAW;AAC1B;AAAA,YAAA;AAGF,kBAAM,UAAU,OAAO,MAAM,SAAS,GAAG,MAAM,IAAI;AAC5C,mBAAA,QAAQ,CAACC,WAAU;;AACxB,oBAAM,OAAOA,OAAM,QAAQ,SAAS,EAAE,EAAE,KAAK;AACzC,kBAAA,OAAO,IAAI,GAAG;AACV,sBAAA;AAAA,kBACJ;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA,IACE,KAAK,MAAM,IAAI;AAEnB,oBAAI,WAAW,SAAS,SAAS,WAAW,KAAK;AAC/C,uBAAK,YAAY,aAAa,WAAW,UAAU,IAAI;AACvD;AAAA,gBAAA;AAGF,wBAAQ,OAAO;AAAA,kBACb,KAAK;AACE,yBAAA,WAAW,aAAa,SAAS,KAAK;AAC3C;AAAA,kBACF,KAAK;AACE,qBAAAC,MAAA,KAAA,uBAAA,gBAAAA,IAAA,WAAqB,aAAa,WAAW;AAClD;AAAA,kBACF,KAAK;AACH,+BAAK,gBAAL,8BAAmB,aAAa,SAAS,OAAO;AAChD;AAAA,kBACF,KAAK;AACH,yBAAK,UAAU,aAAa,QAAQ,UAAU,EAAE;AAChD;AAAA,kBACF,KAAK;AACH,yBAAK,YAAY,aAAa,WAAW,UAAU,IAAI;AACvD;AAAA,gBAAA;AAEG,uBAAA;AAAA,yBACE,MAAM;AACR,uBAAA;AAAA,cAAA;AAAA,YACT,CACD;AAAA,mBACM,OAAY;AACf,iBAAA,+BAAO,UAAS,IAAI;AACtB,mBAAK,YAAY,aAAa,UAAU,MAAM,OAAO,IAAI,MAAM,IAAI;AAAA,YAAA;AAErE;AAAA,UAAA;AAAA,QACF;AAAA,MACF,EACD;AAAA,IAAA;AAAA;AAAA,EAGH,KAAK,aAAqB;;AACnB,qBAAA,cAAc,WAAW,MAAzB,mBAA4B,UAA5B;AACE,WAAA,KAAK,UAAU,WAAW;AAAA,EAAA;AAErC;AC/GO,MAAM,UAAU,CAAgC;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,IAAmB,OAAO;AACxB,QAAM,eAAe;AAErB,QAAM,iBAAiB,IAAO;AACxB,QAAA,oBAAoB,IAAuB,EAAE;AAC7C,QAAA,kBAAkB,IAAuB,EAAE;AACjD,QAAM,qBAAyC,CAAC;AAG1C,QAAA,4BAA4B,SAA4B,MAAM;AAClE,UAAMC,6BAA+C,CAAC;AACtD,aAAS,QAAQ,gBAAgB,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS;AAChE,YAAA,iBAAiB,gBAAgB,MAAM,KAAK;AAElD,UAAI,4BAA4B,QAAQ;AACpC,UAAA,uBAAuB,gBAAgB,MAAM,yBAAyB;AAC1E,aAAO,wBAAwB,CAAC;AAAA,QAC9B,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,MAAA,EACnB,SAAS,qBAAqB,IAAI,GAClC;AAC6B,qCAAA;AACN,+BAAA,gBAAgB,MAAM,yBAAyB;AAAA,MAAA;AAIpE,UAAA,eAAe,SAAS,mBAAmB,QAAQ;AACrD;AAAA,MAAA;AAIF,UAAI,eAAe,WAAW,qBAAqB,QAC9C,GAAE,6DAAsB,YAAW,qBAAqB,QACtD,CAAC,mBAAmB,MAAM,mBAAmB,SAAS,EAAE,SAAS,eAAe,IAAI,MAEtF,CAAC,CAAC,mBAAmB,MAAM,mBAAmB,MAAM,EAAE,SAAS,eAAe,IAAI,GACrF;AACAA,mCAA0B,QAAQ,cAAc;AAAA,MAAA;AAAA,IAClD;AAGKA,WAAAA;AAAAA,EAAA,CACR;AAGK,QAAA,wBAAwB,SAAS,MAAM;;AACrC,UAAA,eAAc,oBAAe,UAAf,mBAAsB;AAC1C,WAAO,cAAc,kBAAkB,MAAM,WAAW,IAAI;AAAA,EAAA,CAC7D;AAGK,QAAA,UAAU,SAA2B,MAAM;;AAC/C,UAAM,cAAgC,CAAC;AACvC,UAAM,cAAgC,CAAC;AACvC,UAAMC,WAA4B,CAAC;AAG7B,UAAA,mBAAmB,gBAAgB,MAAM,cAAc,oBAC3D,eAAe,SAAS,mBAAmB,UAAU,CAAC,SAAS,OAAO,EAAE,KAAK,CAAO,QAAA,eAAe,QAAQ,SAAS,GAAG,CAAC,CACzH;AACD,QAAI,QAAQ;AACZ,qCAAe,UAAf,mBAAsB,aAAtB,mBAAgC,YAAhC,mBAAyC,QAAQ,CAAC,gBAAgB;AAChE,YAAM,iBAAiB,gBAAgB,MAAM,mBAAmB,IAAI,KAAK;AACzE,UAAI,qBAAqB,gBAAgB,MAAM,mBAAmB,IAAI,KAAK;AAC3E,WAAI,iDAAgB,aAAY,YAAY,WAAW,eAAe,SAAS,mBAAmB,QAAQ;AAC5F,oBAAA,KAAK,qCAAqC,cAAc,CAAC;AAC5D,iBAAA;AACL,aAAA,iDAAgB,UAAS,mBAAmB,OAAO;AACrD,iBAAO,sBAAsB,mBAAmB,SAAS,mBAAmB,QAAQ;AACzE,qBAAA;AACT,iCAAqB,gBAAgB,MAAM,mBAAmB,IAAI,KAAK;AAAA,UAAA;AAElE,iBAAA,sBACF,CAAC,mBAAmB,MAAM,mBAAmB,SAAS,EAAE,SAAS,mBAAmB,IAAI,GAC3F;AACY,wBAAA,KAAK,qCAAqC,kBAAkB,CAAC;AAChE,qBAAA;AACT,iCAAqB,gBAAgB,MAAM,mBAAmB,IAAI,KAAK;AAAA,UAAA;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAIF,gBAAY,KAAK,GAAG,0BAA0B,MAAM,IAAI,oCAAoC,CAAC;AAEvF,UAAA,gBAAgB,CAAC,eAAuB;;AAC5C,UAAI,SAAS;AACb,eAASC,SAAQ,YAAYA,SAAQ,YAAY,QAAQA,UAAS;AAC1D,cAAA,aAAa,YAAYA,MAAK;AACpC,YAAI,WAAW,cAAYH,MAAA,YAAYG,SAAQ,UAAU,MAA9B,gBAAAH,IAAiC,UAAS;AAC1D,mBAAA;AAAA,QAAA;AAAA,MACX;AAGK,aAAA;AAAA,IACT;AAGA,aAASG,SAAQ,GAAGA,SAAQ,YAAY,QAAQA,UAAS;AACjD,YAAA,aAAa,YAAYA,MAAK;AAChC,UAAA,cAAcA,MAAK,GAAG;AACxB;AAAA,MAAA,OACK;AACLD,iBAAQ,KAAK,UAAU;AAAA,MAAA;AAAA,IACzB;AAGFA,aAAQ,KAAK,GAAG,WAAW;AAG3BA,aAAQ,QAAQ,CAAU,WAAA;AACjB,aAAA,UAAU,YAAY,OAAO,OAAO;AACpC,aAAA,UAAU,mBAAmB,OAAO,OAAO;AAAA,IAAA,CACnD;AAEMA,WAAAA;AAAAA,EAAA,CACR;AAEK,QAAA,aAAa,IAAI,WAAW;AAAA,IAChC,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,aAAa;AAAA,EAAA,CACd;AAGD,WAAS,kBAAkB,SAAa;AACtC,mBAAe,QAAQ;AAEnB,QAAA,EAAC,mCAAS,aAAa;AAE3B,QAAI,CAAC,mBAAmB,QAAQ,WAAW,GAAG;AACzB,yBAAA,QAAQ,WAAW,IAAI,CAAC;AAAA,IAAA;AAE7B,oBAAA,QAAQ,mBAAmB,QAAQ,WAAW;AAAA,EAAA;AAIhE,WAAS,mBAAmB,MAAyB;AAC/C,QAAA,CAAC,eAAe,MAAO;AACR,uBAAA,eAAe,MAAM,WAAW,IAAI;AACvD,oBAAgB,QAAQ;AAAA,EAAA;AAKjB,WAAA,sBAAsB,IAAY,aAAqB;AACxDE,UAAAA,mBAAkB,gCAAgC,WAAW;AACnE,WAAOA,iBAAgB,KAAK,CAAQ,SAAA,KAAK,OAAO,EAAE;AAAA,EAAA;AAIpD,WAAS,mCAAmC,aAAqB;;AAC3D,UAAA,oBAAe,UAAf,mBAAsB,iBAAgB,aAAa;AAC9C,aAAA,gBAAgB,MAAM,GAAG,EAAE;AAAA,IAAA;AAEpC,YAAO,wBAAmB,WAAW,MAA9B,mBAAiC,GAAG;AAAA,EAAE;AAI/C,WAAS,gCAAgC,aAAqB;;AACxD,UAAA,oBAAe,UAAf,mBAAsB,iBAAgB,aAAa;AACrD,aAAO,gBAAgB;AAAA,IAAA;AAEzB,WAAO,mBAAmB,WAAW;AAAA,EAAA;AAI9B,WAAA,mBAAmB,aAAqB,gBAAiC;AAC1EA,UAAAA,mBAAkB,gCAAgC,WAAW;AACnEA,qBAAgB,KAAK,cAAc;AAAA,EAAA;AAIrC,WAAS,qBAAqB,gBAAiC;;AACvD,UAAA,2BAAyB,oBAAe,UAAf,mBAAsB,iBAAgB,eAAe,cAChF,gBAAgB,QAChB,mBAAmB,eAAe,WAAW;AAE3C,UAAA,wBAAwB,uBAAuB,KAAK,CAAQ,SAAA,EAAE,KAAK,MAAM,OAAO,EAAE,eAAe,MAAM,EAAE;AAC/G,QAAI,uBAAuB;AAClB,aAAA,OAAO,uBAAuB,cAAc;AAAA,IAAA;AAAA,EACrD;AAIO,WAAA,yBAAyB,aAAqB,mBAA6B,eAAwB;;AACpG,UAAA,2BAAyB,oBAAe,UAAf,mBAAsB,iBAAgB,cACjE,gBAAgB,QAChB,mBAAmB,WAAW;AAClC,UAAM,0BAAoC,CAAC;AAEzB,sBAAA,QAAQ,CAAC,qBAAqB;AAC9C,YAAM,QAAQ,uBAAuB,UAAU,CAAkB,mBAAA,eAAe,OAAO,gBAAgB;AACvG,UAAI,QAAQ,IAAI;AACR,cAAA,oBAAoB,uBAAuB,QAAQ,CAAC;AACpD,cAAA,qBAAqB,uBAAuB,QAAQ,CAAC;AACrD,cAAA,yBAAyB,uBAAuB,QAAQ,CAAC;AAExC,+BAAA,OAAO,OAAO,CAAC;AACtC,gCAAwB,KAAK,gBAAgB;AAE7C,YAAI,CAAC,mBAAmB,MAAM,EAAE,SAAS,uDAAmB,IAAI,GAAG;AACjE,gBAAM,cAAc,uBACjB,UAAU,oBAAkB,eAAe,OAAO,kBAAkB,EAAE;AAClD,iCAAA,OAAO,aAAa,CAAC;AACpB,kCAAA,KAAK,kBAAkB,EAAY;AAAA,QAAA;AAG7D,aAAI,yDAAoB,UAAS,mBAAmB,MAC9C,iBAAiB;AAAA,UACnB,mBAAmB;AAAA,UACnB,mBAAmB;AAAA,UACnB,mBAAmB;AAAA,UACnB,mBAAmB;AAAA,UACnB,mBAAmB;AAAA,QAAA,EACnB,SAAS,yDAAoB,IAAI,GACnC;AACA,gBAAM,YAAY,uBACf,UAAU,oBAAkB,eAAe,OAAO,mBAAmB,EAAE;AACnD,iCAAA,OAAO,WAAW,CAAC;AAClB,kCAAA,KAAK,mBAAmB,EAAY;AAAA,QAAA;AAG1D,YAAA,CAAC,mBAAmB,KAAK,EAAE,SAAS,iEAAwB,IAAI,KAAK,eAAe;AACtF,gBAAM,gBAAgB,uBACnB,UAAU,oBAAkB,eAAe,OAAO,uBAAuB,EAAE;AACvD,iCAAA,OAAO,eAAe,CAAC;AACtB,kCAAA,KAAK,uBAAuB,EAAY;AAAA,QAAA;AAAA,MAClE;AAAA,IACF,CACD;AAEM,WAAA;AAAA,EAAA;AAIA,WAAA,qBAAqB,aAAqB,WAAmB;AACpE,UAAM,0BAA0B,yBAAyB,aAAa,CAAC,SAAS,GAAG,IAAI;AAChF,WAAA;AAAA,EAAA;AAIA,WAAA,sBAAsB,aAAqB,YAAsB;AACxE,UAAM,0BAA0B,yBAAyB,aAAa,YAAY,KAAK;AAChF,WAAA;AAAA,EAAA;AAIT,WAAS,gBAAgB,aAAqB;AAC1B,sBAAA,MAAM,WAAW,IAAI;AACvC,UAAM,iBAAkC;AAAA,MACtC;AAAA,MACA,MAAM,mBAAmB;AAAA,MACzB,QAAQ,qBAAqB;AAAA,MAC7B,SAAS;AAAA,IACX;AAEA,uBAAmB,aAAa,cAAc;AAEvC,WAAA,2CAAc,aAAa;AAAA,EAAc;AAIzC,WAAA,uBAAuB,aAAqB,WAAuB,OAAiB;AACrF,UAAA,iBAAiB,mCAAmC,WAAW;AAC/D,UAAA,UAAU,4BAA4B,SAAS;AACrD,mBAAe,UAAU,QAAQ,UAAU,eAAe,UAAU;AAC7D,WAAA,yDAAqB,aAAa;AAAA,EAAc;AAIzD,WAAS,gBAAgB,aAAqB,SAAiB,OAAiB,aAAsB;AAC9F,UAAA,iBAAiB,mCAAmC,WAAW;AAErE,mBAAe,UAAU,wBAAwB,eAAe,SAAS,SAAS,OAAO,WAAW;AAE7F,WAAA,2CAAc,aAAa;AAAA,EAAc;AAIzC,WAAA,eAAe,aAAqB,SAAiB,OAAiB;AACvE,UAAA,iBAAiB,mCAAmC,WAAW;AACjE,QAAA,eAAe,YAAY,cAAc;AAC3C,qBAAe,UAAU;AAAA,IAChB,WAAA,eAAe,WAAW,qBAAqB,SAAS;AACjE,qBAAe,UAAU,QACrB,UACA,eAAe,UAAU;AAAA,IAAA,OACxB;AACL;AAAA,IAAA;AAGK,WAAA,yCAAa,aAAa;AAAA,EAAc;AAIxC,WAAA,cAAc,aAAqB,SAAkB;AACtD,UAAA,iBAAiB,mCAAmC,WAAW;AAEjE,QAAA,eAAe,WAAW,qBAAqB,SAAS;AACxC,wBAAA,MAAM,WAAW,IAAI;AAEvC,UAAI,SAAS;AACX,uBAAe,UAAU;AAAA,MAAA;AAG3B,qBAAe,SAAS,qBAAqB;AAEtC,aAAA,uCAAY,aAAa;AAAA,IAAc;AAGhD,QAAI,eAAe,YAAY,gBAAgB,WAAW,eAAe,OAAO,GAAG;AACjF,sBAAgB,aAAa,SAAS;AAAA,IAAA;AAAA,EACxC;AAIO,WAAA,gBAAgB,aAAqB,SAAiB,MAAe;AACtE,UAAA,iBAAiB,mCAAmC,WAAW;AACrE,mBAAe,SAAS,qBAAqB;AAC7C,mBAAe,UAAU;AACP,sBAAA,MAAM,WAAW,IAAI;AAEnC,QAAA,SAAS,cAAc,cAAc;AACvC,qBAAe,UAAU;AACzB,qBAAe,OAAO,mBAAmB;AAAA,IAAA;AAEvC,QAAA,SAAS,cAAc,mBAAmB;AAC5C,qBAAe,UAAU;AACzB,qBAAe,OAAO,mBAAmB;AAAA,IAAA;AAGpC,WAAA,2CAAc,aAAa,gBAAgB;AAAA,EAAI;AAIxD,WAAS,eAAe,WAAmB;AACnCC,UAAAA,QAAO,gBAAgB,MAAM,SAAS;AACxCA,QAAAA,MAAK,SAAS,mBAAmB,IAAI;AACvC;AAAA,IAAA;AAGF,UAAM,UAAU,gBAAgB,MAAM,YAAY,CAAC,EAAE;AACrD,UAAM,OAAO,gBAAgB,MAAM,YAAY,CAAC,EAAE;AAClD,oBAAgB,MAAM,OAAO,YAAY,GAAG,CAAC;AACpC,aAAA,EAAC,SAAS,MAAK;AAAA,EAAA;AAI1B,WAAS,KAAK;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAMC;AAED,eAAW,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,YAAW,iDAAgB;AAAA,IAAA,CACrC;AAAA,EAAA;AAIH,WAAS,WAAW,OAAe,EAAC,SAAS,KAAA,GAAyC,UAAuB;AACrGA,UAAAA,QAAO,gBAAgB,MAAM,KAAK;AACpCA,QAAAA,MAAK,SAAS,mBAAmB,MAAM;AACzC;AAAA,IAAA;AAGF,oBAAgB,MAAM,OAAO,OAAO,gBAAgB,MAAM,SAAS,KAAK;AACxE,aAAS,EAAC,SAAS,KAAI,GAAG,QAAQ;AAAA,EAAA;AAI3B,WAAA,SAAS,SAAiD,UAAuB;;AACpF,QAAA,GAAC,oBAAe,UAAf,mBAAsB,gBAAe,EAAC,iDAAgB,QAAO,sBAAsB,OAAO;AAC7F;AAAA,IAAA;AAGF,UAAM,EAAC,SAAS,MAAM,SAAY,IAAA;AAElC,QAAI,QAAQ;AAEZ,QAAI,UAAU;AACJ,cAAA,sBAAsB,SAAS,QAAQ,IAAI;AAAA,IAAA,OAC9C;AACL,cAAQ,OAAO,GAAG,OAAO,MAAM,IAAI,MAAM;AAAA,IAAA;AAI3C,oBAAgB,MAAM,KAAK;AAAA,MACzB,cAAa,oBAAe,UAAf,mBAAsB;AAAA,MACnC,SAAS;AAAA,MACT,MAAM,mBAAmB;AAAA,MACzB,QAAQ,qBAAqB;AAAA,MAC7B;AAAA,IAAA,CACD;AAGD,eAAW,OAAO;AAAA,MAChB,cAAa,oBAAe,UAAf,mBAAsB;AAAA,MACnC,KAAK,eAAe;AAAA,MACpB,SAAS,iDAAgB;AAAA,MACzB,MAAM;AAAA,QACJ,QAAQ;AAAA,UACN,cAAc,QAAQ,MAAM,MAAM,GAAG,QAAQ,MAAM,SAAS,CAAC;AAAA,UAC7D;AAAA,QAAA;AAAA,MACF;AAAA,IACF,CACD;AAEU;AAAA,EAAA;AAUb,WAAS,WAAW,OAAe;AAC3BA,UAAAA,QAAO,gBAAgB,MAAM,KAAK;AACpCA,QAAAA,MAAK,SAAS,mBAAmB,MAAM;AACzB,sBAAA,MAAM,OAAO,OAAO,CAAC;AACrC;AAAA,IAAA;AAGF,oBAAgB,MAAM,OAAO,QAAM,GAAG,CAAC;AAAA,EAAA;AAIzC,WAAS,SAAS,aAAqB;AACrC,eAAW,KAAK,WAAW;AAAA,EAAA;AAGtB,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AC9fO,MAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,IAAsB,OAAO;AAC3B,MAAI,cAAc;AAElB,QAAM,kBAAkB,MAAM;AACd,kBAAA;AACd,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,CAAC,aAAqB,SAAiB,UAAoB;AAC5E,QAAA,SAAS,gBAAgB,WAAW;AACxB,oBAAA;AAAA,IAAA,OACT;AACU,qBAAA;AAAA,IAAA;AAAA,EAEnB;AAEA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,gBAAgB,QAAQ;AACZ,oBAAA;AAAA,IAAA;AAEhB,WAAO,uCAAY;AAAA,EACrB;AAEA,QAAM,kBAAkB,CAAC,aAAqB,SAAiB,SAAkB;AACxE,WAAA,2CAAc,SAAS;AAAA,EAChC;AAEM,QAAA,aAAa,IAAI,WAAW;AAAA,IAChC,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,EAAA,CACd;AAED,QAAM,UAAU,CAAC;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,MAMI;AACJ,UAAM,gBAAgB,YAAY,mBAAmB,OAAO,CAAC;AAC7D,UAAM,UAAU;AAAA,MACd;AAAA,QACE,MAAM,kBAAkB;AAAA,QACxB,SAAS;AAAA;AAAA,EAAqF,aAAa;AAAA,MAAA;AAAA,IAE/G;AAEA,eAAW,OAAO;AAAA,MAChB,aAAa;AAAA,MACb;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAEO,SAAA;AAAA,IACL;AAAA,EACF;AACF;AChFO,MAAM,WAAW,MAAM;AAE5B,UAAQ,kBAAkB;AAC1B,UAAQ,oBAAoB;AAEZ,kBAAA;AAEP,WAAA;AACX;"}
|
1
|
+
{"version":3,"file":"main.es.js","sources":["../src/types/enum.ts","../src/common/type-transform.ts","../src/common/util.ts","../src/hooks/use-click-proxy.ts","../src/hooks/use-reference-doc.ts","../src/hooks/use-think.ts","../src/common/chart-helper.ts","../src/hooks/use-chat.ts","../src/hooks/use-summary.ts","../src/hooks/use-style.ts"],"sourcesContent":["// 传给 ai 的类型\nexport enum SessionPromptRole {\n System = 'system',\n Assistant = 'assistant',\n User = 'user',\n Guide = 'guide',\n Pause = 'pause',\n UserImage = 'user-image',\n Hidden = 'hidden',\n HiddenUser = 'hidden-user',\n HiddenAssistant = 'hidden-assistant',\n HiddenSystem = 'hidden-system',\n HiddenGuide = 'hidden-guide',\n TemplateUser = 'template-user',\n TemplateAssistant = 'template-assistant',\n TemplateSystem = 'template-system',\n TemplateGuide = 'template-guide',\n TemplateHidden = 'template-hidden',\n}\n\nexport enum SessionContentStatus {\n Fail = 'fail',\n Loading = 'loading',\n Success = 'success',\n}\n\nexport enum SessionContentRole {\n Ai = 'ai',\n User = 'user',\n Time = 'time',\n System = 'system',\n Role = 'role',\n Hidden = 'hidden',\n Guide = 'guide',\n Pause = 'pause',\n TokenExpired = 'token-expired',\n UserImage = 'user-image',\n HiddenUser = 'hidden-user',\n HiddenAi = 'hidden-ai',\n HiddenRole = 'hidden-role',\n HiddenGuide = 'hidden-guide',\n TemplateUser = 'template-user',\n TemplateAi = 'template-ai',\n TemplateRole = 'template-role',\n TemplateGuide = 'template-guide',\n TemplateHidden = 'template-hidden',\n ImageNotSupported = 'image-not-supported'\n}\n\nexport enum HttpErrorCode {\n TokenExpired = '80003',\n ImageNotSupported = '82003',\n UnAuthorizedPreviewFile = '80401',\n TagRepeat = '1513405',\n Aborted = 20,\n UnLogin = 401,\n IamNoPermission = 'IAM_NO_PERMISSION'\n}\n","import {\n SessionContentRole,\n SessionPromptRole,\n} from '../types/enum';\nimport type {\n ISessionContent,\n ISessionPrompt,\n} from '../types/type';\n\n/**\n * 将 sessionContent 转换为 sessionPrompt\n * @param sessionContent sessionContent\n * @returns sessionPrompt\n */\nexport const transferSessionContent2SessionPrompt = (sessionContent: ISessionContent): ISessionPrompt => {\n const sessionRoleMap = {\n [SessionContentRole.Ai]: SessionPromptRole.Assistant,\n [SessionContentRole.User]: SessionPromptRole.User,\n [SessionContentRole.System]: SessionPromptRole.System,\n [SessionContentRole.Hidden]: SessionPromptRole.Hidden,\n [SessionContentRole.Guide]: SessionPromptRole.Guide,\n [SessionContentRole.Time]: SessionPromptRole.System,\n [SessionContentRole.Role]: SessionPromptRole.System,\n [SessionContentRole.HiddenAi]: SessionPromptRole.HiddenAssistant,\n [SessionContentRole.HiddenGuide]: SessionPromptRole.HiddenGuide,\n [SessionContentRole.HiddenRole]: SessionPromptRole.HiddenSystem,\n [SessionContentRole.HiddenUser]: SessionPromptRole.HiddenUser,\n [SessionContentRole.TemplateAi]: SessionPromptRole.TemplateAssistant,\n [SessionContentRole.TemplateGuide]: SessionPromptRole.TemplateGuide,\n [SessionContentRole.TemplateRole]: SessionPromptRole.TemplateSystem,\n [SessionContentRole.TemplateUser]: SessionPromptRole.TemplateUser,\n [SessionContentRole.TemplateHidden]: SessionPromptRole.TemplateHidden,\n [SessionContentRole.Pause]: SessionPromptRole.Pause,\n [SessionContentRole.TokenExpired]: SessionPromptRole.Pause,\n [SessionContentRole.ImageNotSupported]: SessionPromptRole.Pause,\n [SessionContentRole.UserImage]: SessionPromptRole.UserImage,\n };\n return {\n content: sessionContent.content,\n role: sessionRoleMap[sessionContent.role],\n };\n};\n","import {\n Message,\n} from 'bkui-vue';\n\n/**\n * 判断是否是 JSON 字符串\n * @param str 字符串\n * @returns 是否是 JSON 字符串\n */\nexport const isJSON = (str: string) => {\n try {\n JSON.parse(str);\n return true;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * 响应时间格式化\n * @param val 待格式化时间,xxms\n * @returns 格式化后的时间,xx小时xx分钟xx秒\n */\nexport function durationFormatter(val: number) {\n const hours = Math.floor(val / 3600000);\n const minutes = Math.floor((val % 3600000) / 60000);\n const seconds = Math.floor((val % 60000) / 1000);\n const milliseconds = val % 1000;\n\n const parts: string[] = [];\n if (hours > 0) {\n parts.push(`${hours}h`);\n }\n if (minutes > 0) {\n parts.push(`${minutes}min`);\n }\n if (seconds > 0) {\n parts.push(`${seconds}s`);\n }\n if (milliseconds > 0) {\n parts.push(`${milliseconds.toFixed(2)}ms`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * 前端下载文件\n * @param {*} source 文件内容\n * @param {*} filename 文件名\n */\nexport function handleDownLoad(source: string, filename = 'ai.txt') {\n const downloadEl = document.createElement('a');\n const blob = new Blob([source]);\n downloadEl.download = filename;\n downloadEl.href = URL.createObjectURL(blob);\n downloadEl.style.display = 'none';\n document.body.appendChild(downloadEl);\n downloadEl.click();\n document.body.removeChild(downloadEl);\n}\n\nexport const handleCopy = (text: string) => {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n Message({\n theme: 'success',\n message: '复制成功',\n });\n document.body.removeChild(textarea);\n};\n\n/**\n * 处理提示词模板,替换模板中的变量\n * @param prompt 提示词模板\n * @param selectedText 选中的文本\n * @returns 处理后的提示词\n */\nexport const processPromptTemplate = (prompt: string, selectedText: string) => {\n return prompt.replace(/\\{\\{\\s*SELECTED_TEXT\\s*\\}\\}/g, selectedText || '');\n};","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport {\n handleCopy,\n handleDownLoad,\n} from '../common/util';\n\ntype FullScreenWrap = HTMLElement & {\n _originalParent: Node;\n _originalNextSibling: Node;\n};\n\n// 全局点击代理事件\nexport const useClickProxy = () => {\n const clickProxy = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // 聊天窗里面的引用资料和思考内容\n if (target?.classList.contains('bkaidev-angle-up')) {\n const parent = target?.parentElement;\n if (parent?.classList.contains('closed')) {\n parent?.classList.remove('closed');\n } else {\n parent?.classList.add('closed');\n }\n }\n if (target?.classList.contains('click-close')) {\n if (target?.classList.contains('closed')) {\n target?.classList.remove('closed');\n } else {\n target?.classList.add('closed');\n }\n }\n // 会话里面代码块的全屏\n if (target?.classList.contains('click-full-screen')) {\n // 获取全屏的父元素\n const fullScreenWrap = target?.parentElement?.parentElement?.parentElement as FullScreenWrap;\n // 添加 class\n fullScreenWrap?.classList.add('full-screen');\n // 元素移动到body\n if (!fullScreenWrap._originalParent) {\n fullScreenWrap._originalParent = fullScreenWrap.parentNode as Node;\n fullScreenWrap._originalNextSibling = fullScreenWrap.nextSibling as Node;\n }\n document.body.appendChild(fullScreenWrap);\n }\n // 会话里面代码块的取消全屏\n if (target?.classList.contains('click-un-full-screen')) {\n // 获取全屏的父元素\n const fullScreenWrap = target?.parentElement?.parentElement?.parentElement as FullScreenWrap;\n // 移除 class\n fullScreenWrap?.classList.remove('full-screen');\n // 移回原位\n if (fullScreenWrap._originalNextSibling) {\n fullScreenWrap._originalParent.insertBefore(fullScreenWrap, fullScreenWrap._originalNextSibling);\n } else {\n fullScreenWrap._originalParent.appendChild(fullScreenWrap);\n }\n }\n // 复制\n if (target?.classList.contains('click-copy')) {\n const text = target?.getAttribute('data-clipboard-text');\n if (text) {\n handleCopy(decodeURIComponent(text));\n }\n }\n // 下载\n if (target?.classList.contains('click-download')) {\n const text = target?.getAttribute('data-clipboard-text');\n const fileName = target?.getAttribute('data-file-name');\n if (text && fileName) {\n handleDownLoad(decodeURIComponent(text), fileName);\n }\n }\n };\n\n const addClickProxy = () => {\n window.addEventListener('click', clickProxy);\n };\n\n const removeClickProxy = () => {\n window.removeEventListener('click', clickProxy);\n };\n\n onBeforeMount(() => {\n addClickProxy();\n });\n\n onBeforeUnmount(() => {\n removeClickProxy();\n });\n};\n","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport type {\n Document,\n} from '../types/type';\n\n/**\n * 获取引用资料的 HTML 内容\n * @param documents\n * @returns\n */\nexport const getHtmlContentFromDocuments = (documents: Document[]) => {\n let htmlContent = `<section class=\"knowledge-head click-close\">\n <svg\n class=\"ai-ui-sdk-wenzhang\"\n >\n <use href=\"#ai-ui-sdk-wenzhang\"></use>\n </svg>\n 找到 ${documents.length} 篇资料参考\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-angle-up\"></i>\n </section>\n <ul class=\"knowledge-body\">`;\n documents.forEach((document) => {\n const { path, file_path: filePath, display_name: displayName, preview_path: previewPath } = document.metadata;\n const title = displayName || filePath.split('/').pop();\n htmlContent += `<li\n class=\"knowledge-item\"\n >\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-zhishiku\"></i>\n <a href=\"${previewPath}\" title=\"${title} (${previewPath})\" target=\"_blank\" class=\"knowledge-link g-flex-truncate\">\n ${title}\n </a>\n <a href=\"${path}\" title=\"预览原文\" target=\"_blank\" class=\"knowledge-link hover-show\">\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-yanjing-kejian\"></i>\n </a>\n </li>`;\n });\n htmlContent += '</ul>';\n return htmlContent;\n};\n\n/**\n * 移除引用资料的 HTML 内容\n * @param content\n * @returns\n */\nexport const removeReferenceDoc = (content: string) => {\n return content\n .replace(/<section class=\"knowledge-head click-close\">[\\s\\S]*?<\\/section>/, '')\n .replace(/<ul class=\"knowledge-body\">[\\s\\S]*?<\\/ul>/, '')\n .replace(/<section class=\"knowledge-tips\">[\\s\\S]*?<\\/section>/, '');\n};\n\nexport const useReferenceDoc = () => {\n let styleEle: HTMLStyleElement | null = null;\n\n const addReferenceDocStyle = () => {\n // 旧版知识样式\n const oldStyle = `.knowledge-tips {\n position: relative;\n padding: 6px 8px;\n margin-bottom: 14px;\n line-height: 22px;\n background: #f5f7fa;\n border-radius: 4px;\n\n &.closed {\n .bkaidev-angle-up {\n transform: rotate(180deg);\n }\n\n .knowledge-summary {\n margin-bottom: 0;\n }\n\n .knowledge-link {\n display: none;\n }\n }\n\n .bkaidev-angle-up {\n position: absolute;\n top: 4px;\n right: 0px;\n font-size: 22px;\n color: #979ba5;\n cursor: pointer;\n }\n\n .bkaidev-help-document {\n margin-right: 4px;\n font-size: 19px;\n color: #3a84ff;\n }\n\n .knowledge-summary {\n display: block;\n margin-bottom: 4px;\n color: #313238;\n }\n\n .knowledge-link {\n display: block;\n color: #3a84ff;\n text-decoration: none;\n cursor: pointer;\n\n .bkaidev-cc-jump-link {\n font-size: 14px;\n }\n\n &:last-child {\n margin-bottom: 2px;\n }\n }\n }`;\n // 新版知识样式\n const newStyle = `.knowledge-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n\n .ai-ui-sdk-wenzhang {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .knowledge-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .knowledge-body {\n background: #F5F7FA;\n padding: 16px 0 !important;\n .knowledge-item {\n padding-left: 10px;\n display: flex;\n align-items: center;\n line-height: 28px;\n .hover-show {\n display: none;\n }\n a {\n margin-right: 10px;\n &:has(i) {\n padding: 0 10px;\n margin-right: 0;\n text-decoration: none !important;\n }\n }\n .ai-ui-sdk-zhishiku {\n color: #D66F6B;\n font-size: 14px;\n margin-right: 6px;\n }\n &:hover {\n background: #EAEBF0;\n .hover-show {\n display: inline;\n }\n }\n }\n }`;\n styleEle = document.createElement('style');\n styleEle.textContent = oldStyle + newStyle;\n document.head.appendChild(styleEle);\n };\n\n const removeReferenceDocStyle = () => {\n if (styleEle) {\n styleEle.remove();\n styleEle = null;\n }\n };\n\n onBeforeMount(() => {\n addReferenceDocStyle();\n });\n\n onBeforeUnmount(() => {\n removeReferenceDocStyle();\n });\n};\n","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport {\n durationFormatter,\n} from '../common/util';\n\n/**\n * 获取思考的 HTML 内容\n * @param chatContent 聊天内容\n * @param content 思考内容\n * @param elapsedTime 思考时间\n * @returns 完整的 chatContent\n */\nexport const getHtmlContentFromThink = (chatContent: string, content: string, cover?: boolean, elapsedTime?: number) => {\n let htmlContent = (chatContent === '内容正在生成中...' || cover) ? '' : chatContent;\n // 思考开始\n if (!htmlContent.includes('<section class=\"think-head click-close\">')) {\n htmlContent += `<section class=\"think-head click-close\">\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-sikao\"></i>思考中...<i class=\"ai-ui-sdk-icon ai-ui-sdk-angle-up\"></i>\n </section>\n <section class=\"think-body\">\n ${content}\n</section>`;\n } else {\n // 补充思考内容\n const thinkBodyMatch = htmlContent.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>/);\n if (thinkBodyMatch) {\n // 原有思考内容\n const thinkContent = thinkBodyMatch[1];\n // 在最后的换行符前面添加新的思考内容\n const newThinkContent = thinkContent.replace(/\\n$/g, `${content}\\n`);\n htmlContent = htmlContent.replace(\n thinkContent,\n newThinkContent,\n );\n }\n }\n // 思考结束\n if (elapsedTime) {\n htmlContent = htmlContent.replace('思考中...', `已完成思考 (耗时:${durationFormatter(elapsedTime)})`);\n }\n return htmlContent;\n};\n\n/**\n * 移除思考的 HTML 内容\n * @param content\n * @returns\n */\nexport const removeThink = (content: string) => {\n // 移除思考头部\n const afterRemoveThinkHead = content.replace(/<section class=\"think-head click-close\">[\\s\\S]*<\\/section>/, '');\n // 移除思考内容\n let afterRemoveThinkBody = afterRemoveThinkHead.replace(/<section class=\"think-body\">[\\s\\S]*<\\/section>/, '');\n // 如果内容只有思考,那就给ai传递思考内容\n if (afterRemoveThinkBody.trim() === '') {\n const thinkBodyMatch = content.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>/);\n if (thinkBodyMatch) {\n [, afterRemoveThinkBody] = thinkBodyMatch;\n }\n }\n return afterRemoveThinkBody;\n};\n\n/**\n * 判断是否是思考中\n * @param content\n * @returns\n */\nexport const isThinking = (content: string) => {\n // 是否开始思考\n const isStartThinking = content === '正在思考...';\n // 判断是否空思考\n const thinkBodyMatch = content.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>$/);\n const isEmptyThinking = thinkBodyMatch && thinkBodyMatch[1].trim() === '';\n\n return isStartThinking || isEmptyThinking;\n};\n\n// 思考\nexport const useThink = () => {\n let styleEle: HTMLStyleElement | null = null;\n\n const addThinkStyle = () => {\n const style = `.think-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n .ai-ui-sdk-sikao {\n font-size: 14px;\n color: #979ba5;\n margin-right: 4px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .think-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .think-body {\n background: #F5F7FA;\n color: #979BA5;\n padding: 16px;\n margin-bottom: 16px;\n &~ .knowledge-head {\n margin-bottom: 8px;\n }\n }`;\n styleEle = document.createElement('style');\n styleEle.textContent = style;\n document.head.appendChild(styleEle);\n };\n\n const removeThinkStyle = () => {\n if (styleEle) {\n styleEle.remove();\n styleEle = null;\n }\n };\n\n onBeforeMount(() => {\n addThinkStyle();\n });\n\n onBeforeUnmount(() => {\n removeThinkStyle();\n });\n};\n","import {\n isJSON,\n} from './util';\n\nimport type {\n Document,\n} from '../types/type';\n\ntype HandleStart = (sessionCode: string) => any;\ntype HandleText = (sessionCode: string, message: string, cover?: boolean) => void;\ntype HandleReferenceDoc = (sessionCode: string, documents: Document[], cover?: boolean) => void;\ntype HandleThink = (sessionCode: string, content: string, cover?: boolean, elapsed_time?: number) => void;\ntype HandleEnd = (sessionCode: string, message?: string) => void;\ntype HandleError = (sessionCode: string, message: string, code: string) => any;\n\nexport class ChatHelper {\n handleStart: HandleStart;\n handleText: HandleText;\n handleReferenceDoc?: HandleReferenceDoc;\n handleThink?: HandleThink;\n handleEnd: HandleEnd;\n handleError: HandleError;\n controllerMap: Record<string, AbortController>;\n\n constructor({\n handleStart,\n handleText,\n handleReferenceDoc,\n handleThink,\n handleEnd,\n handleError,\n }: {\n handleStart: HandleStart;\n handleText: HandleText;\n handleReferenceDoc?: HandleReferenceDoc;\n handleThink?: HandleThink;\n handleEnd: HandleEnd;\n handleError: HandleError;\n }) {\n this.handleStart = handleStart;\n this.handleText = handleText;\n this.handleReferenceDoc = handleReferenceDoc;\n this.handleThink = handleThink;\n this.handleEnd = handleEnd;\n this.handleError = handleError;\n this.controllerMap = {};\n }\n\n async stream({\n sessionCode,\n url,\n headers,\n data,\n }: {\n sessionCode: string;\n url: string;\n headers?: Record<string, string>;\n data?: Record<string, any>;\n }) {\n // 开始\n await this.handleStart?.(sessionCode);\n // 记录 controller\n const controller = new AbortController();\n this.controllerMap[sessionCode] = controller;\n // 发送请求\n fetch(url, {\n method: 'post',\n signal: controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n mode: 'cors',\n credentials: 'include',\n body: JSON.stringify(data),\n })\n .then(async (response: any) => {\n const reader = response.body\n .pipeThrough(new window.TextDecoderStream())\n .getReader();\n\n // 临时存储数据\n let temp = '';\n\n while (true) {\n try {\n const { value, done } = await reader.read();\n\n // 接口异常处理\n if (!response.ok) {\n this.handleError(sessionCode, value || response.statusText, response.status);\n break;\n }\n // 接口完成\n if (done) {\n this.handleEnd(sessionCode);\n break;\n }\n\n const values = (temp + value.toString()).split('\\n');\n values.forEach((value) => {\n const item = value.replace('data:', '').trim();\n if (isJSON(item)) {\n const {\n event,\n content,\n cover,\n documents,\n result,\n code,\n elapsed_time,\n message,\n } = JSON.parse(item);\n // 业务错误处理\n if (result === false || response.status !== 200) {\n this.handleError(sessionCode, message || '模型调用失败', code);\n return;\n }\n\n switch (event) {\n case 'text':\n this.handleText(sessionCode, content, cover);\n break;\n case 'reference_doc':\n this.handleReferenceDoc?.(sessionCode, documents, cover);\n break;\n case 'think':\n this.handleThink?.(sessionCode, content, cover, elapsed_time);\n break;\n case 'done':\n this.handleEnd(sessionCode, cover ? content : '');\n break;\n case 'error':\n this.handleError(sessionCode, message || '模型调用失败', code);\n break;\n }\n temp = '';\n } else if (item) {\n temp = item;\n }\n });\n } catch (error: any) {\n if (error?.code !== 20) {\n this.handleError(sessionCode, `模型调用失败:${error.message}`, error.code);\n }\n break;\n }\n }\n });\n }\n\n stop(sessionCode: string) {\n this.controllerMap[sessionCode]?.abort?.();\n return this.handleEnd(sessionCode);\n }\n}\n","import {\n ref,\n computed,\n} from 'vue';\nimport type {\n Document,\n ISessionContent,\n ISession,\n ISessionPrompt,\n ChatCallbacks,\n BasicChatContent,\n ShortcutChatContent,\n} from '../types/type.ts';\nimport { processPromptTemplate } from '../common/util';\nimport {\n HttpErrorCode,\n SessionContentRole,\n SessionContentStatus,\n} from '../types/enum';\nimport {\n getHtmlContentFromDocuments,\n removeReferenceDoc,\n} from '../hooks/use-reference-doc';\nimport {\n getHtmlContentFromThink,\n isThinking,\n removeThink,\n} from '../hooks/use-think';\nimport {\n ChatHelper,\n} from '../common/chart-helper';\nimport {\n transferSessionContent2SessionPrompt,\n} from '../common/type-transform';\n\ntype SessionContentsMap = {\n [key: string]: ISessionContent[]\n};\n\ntype SessionLoadingMap = {\n [key: string]: boolean\n};\n\n// ai 聊天\nexport const useChat = <T extends ISession = ISession>({\n handleStart,\n handleText,\n handleReferenceDoc,\n handleThink,\n handleEnd,\n handleError,\n requestOptions,\n}: ChatCallbacks = {}) => {\n const startMessage = '内容正在生成中...';\n // 聊天上下文\n const currentSession = ref<T>();\n const sessionLoadingMap = ref<SessionLoadingMap>({});\n const sessionContents = ref<ISessionContent[]>([]);\n const sessionContentsMap: SessionContentsMap = {};\n\n // 通过计算得到的会话列表\n const calculatedSessionContents = computed<ISessionContent[]>(() => {\n const calculatedSessionContents: ISessionContent[] = [];\n for (let index = sessionContents.value.length - 1; index >= 0; index--) {\n const sessionContent = sessionContents.value[index];\n // 向下找到下一个ai回复\n let nextAiSessionContentIndex = index + 1;\n let nextAiSessionContent = sessionContents.value[nextAiSessionContentIndex];\n while (nextAiSessionContent && ![\n SessionContentRole.Ai,\n SessionContentRole.TokenExpired,\n SessionContentRole.ImageNotSupported,\n SessionContentRole.Pause,\n SessionContentRole.Guide,\n ].includes(nextAiSessionContent.role)\n ) {\n nextAiSessionContentIndex += 1;\n nextAiSessionContent = sessionContents.value[nextAiSessionContentIndex];\n }\n\n // 系统消息,退出\n if (sessionContent.role === SessionContentRole.System) {\n break;\n }\n\n // 倒叙添加当前聊天上下文 排除异常答复、异常问题 & 系统消息和时间消息\n if (sessionContent.status !== SessionContentStatus.Fail\n && !(nextAiSessionContent?.status === SessionContentStatus.Fail\n && [SessionContentRole.User, SessionContentRole.UserImage].includes(sessionContent.role)\n )\n && ![SessionContentRole.Time, SessionContentRole.System].includes(sessionContent.role)\n ) {\n calculatedSessionContents.unshift(sessionContent);\n }\n }\n\n return calculatedSessionContents;\n });\n\n // 当前会话是否正在加载\n const currentSessionLoading = computed(() => {\n const sessionCode = currentSession.value?.sessionCode;\n return sessionCode ? sessionLoadingMap.value[sessionCode] : false;\n });\n\n // 计算当前的 prompt\n const prompts = computed<ISessionPrompt[]>(() => {\n const rolePrompts: ISessionPrompt[] = [];\n const userPrompts: ISessionPrompt[] = [];\n const prompts: ISessionPrompt[] = [];\n\n // build rolePrompts\n const latestMatchIndex = sessionContents.value.findLastIndex(sessionContent => (\n sessionContent.role === SessionContentRole.System && ['已启用角色', '已启用模型'].some(key => sessionContent.content.includes(key))\n ));\n let index = 0;\n currentSession.value?.roleInfo?.content?.forEach((roleContent) => {\n const sessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n let nextSessionContent = sessionContents.value[latestMatchIndex + 2 + index];\n if (sessionContent?.content === roleContent.content && sessionContent.role !== SessionContentRole.System) {\n rolePrompts.push(transferSessionContent2SessionPrompt(sessionContent));\n index += 1;\n if (sessionContent?.role === SessionContentRole.Pause) {\n while (nextSessionContent && nextSessionContent.role === SessionContentRole.System) {\n index += 1;\n nextSessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n }\n while (nextSessionContent\n && [SessionContentRole.User, SessionContentRole.UserImage].includes(nextSessionContent.role)\n ) {\n rolePrompts.push(transferSessionContent2SessionPrompt(nextSessionContent));\n index += 1;\n nextSessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n }\n }\n }\n });\n\n // build userPrompts\n userPrompts.push(...calculatedSessionContents.value.map(transferSessionContent2SessionPrompt));\n\n const isSameContent = (startIndex: number) => {\n let isSame = true;\n for (let index = startIndex; index < rolePrompts.length; index++) {\n const rolePrompt = rolePrompts[index];\n if (rolePrompt.content !== userPrompts[index - startIndex]?.content) {\n isSame = false;\n }\n }\n\n return isSame;\n };\n\n // 排除在一个系统消息里面,重复的情况\n for (let index = 0; index < rolePrompts.length; index++) {\n const rolePrompt = rolePrompts[index];\n if (isSameContent(index)) {\n break;\n } else {\n prompts.push(rolePrompt);\n }\n }\n\n prompts.push(...userPrompts);\n\n // 删除引用资料\n prompts.forEach(prompt => {\n prompt.content = removeThink(prompt.content);\n prompt.content = removeReferenceDoc(prompt.content);\n });\n\n return prompts;\n });\n\n const chatHelper = new ChatHelper({\n handleStart: handleStartChat,\n handleText: handleTextChat,\n handleReferenceDoc: handleReferenceDocChat,\n handleThink: handleThinkChat,\n handleEnd: handleEndChat,\n handleError: handleErrorChat,\n });\n\n // 设置 currentSession\n function setCurrentSession(session?: T) {\n currentSession.value = session;\n // 空session,不处理\n if (!session?.sessionCode) return;\n\n if (!sessionContentsMap[session.sessionCode]) {\n sessionContentsMap[session.sessionCode] = [];\n }\n sessionContents.value = sessionContentsMap[session.sessionCode];\n }\n\n // 设置 sessionContents\n function setSessionContents(data: ISessionContent[]) {\n if (!currentSession.value) return;\n sessionContentsMap[currentSession.value.sessionCode] = data;\n sessionContents.value = data;\n }\n\n\n // 获取 SessionContent 通过 id\n function getSessionContentById(id: number, sessionCode: string) {\n const sessionContents = getSessionContentsBySessionCode(sessionCode);\n return sessionContents.find(item => item.id === id);\n }\n\n // 获取执行中的 SessionContent(最后一个)\n function getLastSessionContentBySessionCode(sessionCode: string) {\n if (currentSession.value?.sessionCode === sessionCode) {\n return sessionContents.value.at(-1) as ISessionContent;\n }\n return sessionContentsMap[sessionCode]?.at(-1) as ISessionContent;\n }\n\n // 获取 SessionContents\n function getSessionContentsBySessionCode(sessionCode: string) {\n if (currentSession.value?.sessionCode === sessionCode) {\n return sessionContents.value;\n }\n return sessionContentsMap[sessionCode];\n }\n\n // 新增 sessionContent\n function plusSessionContent(sessionCode: string, sessionContent: ISessionContent) {\n const sessionContents = getSessionContentsBySessionCode(sessionCode);\n sessionContents.push(sessionContent);\n }\n\n // 更新 chatContent\n function updateSessionContent(sessionContent: ISessionContent) {\n const currentSessionContents = currentSession.value?.sessionCode === sessionContent.sessionCode\n ? sessionContents.value\n : sessionContentsMap[sessionContent.sessionCode];\n\n const currentSessionContent = currentSessionContents.find(item => +(item.id || 0) === +(sessionContent.id || 0));\n if (currentSessionContent) {\n Object.assign(currentSessionContent, sessionContent);\n }\n }\n\n // 获取待删除的会话id,并从会话列表中删除\n function getDeleteSessionContents(sessionCode: string, sessionContentIds: number[], relatedDelete: boolean) {\n const currentSessionContents = currentSession.value?.sessionCode === sessionCode\n ? sessionContents.value\n : sessionContentsMap[sessionCode];\n const deleteSessionContentIds: number[] = [];\n\n sessionContentIds.forEach((sessionContentId) => {\n const index = currentSessionContents.findIndex(sessionContent => sessionContent.id === sessionContentId);\n if (index > -1) {\n const preSessionContent = currentSessionContents[index - 1];\n const nextSessionContent = currentSessionContents[index + 1];\n const nextNextSessionContent = currentSessionContents[index + 2];\n // 删除当前会话\n currentSessionContents.splice(index, 1);\n deleteSessionContentIds.push(sessionContentId);\n // 如果前一个是 hidden 也需要删除\n if ([SessionContentRole.Hidden].includes(preSessionContent?.role)) {\n const hiddenIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === preSessionContent.id);\n currentSessionContents.splice(hiddenIndex, 1);\n deleteSessionContentIds.push(preSessionContent.id as number);\n }\n // 如果下一个是ai回复,也需要删掉\n if (nextSessionContent?.role === SessionContentRole.Ai\n || (relatedDelete && [\n SessionContentRole.Ai,\n SessionContentRole.Guide,\n SessionContentRole.TokenExpired,\n SessionContentRole.ImageNotSupported,\n SessionContentRole.Pause,\n ].includes(nextSessionContent?.role))\n ) {\n const nextIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === nextSessionContent.id);\n currentSessionContents.splice(nextIndex, 1);\n deleteSessionContentIds.push(nextSessionContent.id as number);\n }\n // 如果下下个是 guide,需要删除\n if ([SessionContentRole.Guide].includes(nextNextSessionContent?.role) && relatedDelete) {\n const nextNextIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === nextNextSessionContent.id);\n currentSessionContents.splice(nextNextIndex, 1);\n deleteSessionContentIds.push(nextNextSessionContent.id as number);\n }\n }\n });\n\n return deleteSessionContentIds;\n }\n\n // 删除聊天内容\n function deleteSessionContent(sessionCode: string, contentId: number) {\n const deleteSessionContentIds = getDeleteSessionContents(sessionCode, [contentId], true);\n return deleteSessionContentIds;\n }\n\n // 批量删除\n function deleteSessionContents(sessionCode: string, contentIds: number[]) {\n const deleteSessionContentIds = getDeleteSessionContents(sessionCode, contentIds, false);\n return deleteSessionContentIds;\n }\n\n // 聊天开始\n function handleStartChat(sessionCode: string) {\n sessionLoadingMap.value[sessionCode] = true;\n const sessionContent: ISessionContent = {\n sessionCode,\n role: SessionContentRole.Ai,\n status: SessionContentStatus.Loading,\n content: startMessage,\n };\n // 画布新增\n plusSessionContent(sessionCode, sessionContent);\n // 调用cb\n return handleStart?.(sessionCode, sessionContent);\n }\n\n // 引用资料\n function handleReferenceDocChat(sessionCode: string, documents: Document[], cover?: boolean) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n const content = getHtmlContentFromDocuments(documents);\n sessionContent.content = cover ? content : sessionContent.content + content;\n return handleReferenceDoc?.(sessionCode, sessionContent);\n }\n\n // 思考\n function handleThinkChat(sessionCode: string, content: string, cover?: boolean, elapsedTime?: number) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n // 获取思考的html\n sessionContent.content = getHtmlContentFromThink(sessionContent.content, content, cover, elapsedTime);\n // 调用cb\n return handleThink?.(sessionCode, sessionContent);\n }\n\n // 文本\n function handleTextChat(sessionCode: string, message: string, cover?: boolean) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n if (sessionContent.content === startMessage) {\n sessionContent.content = message;\n } else if (sessionContent.status === SessionContentStatus.Loading) {\n sessionContent.content = cover\n ? message\n : sessionContent.content + message;\n } else {\n return;\n }\n // 调用cb\n return handleText?.(sessionCode, sessionContent);\n }\n\n // 聊天结束\n function handleEndChat(sessionCode: string, message?: string) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n // 防止 error 的情况下异步触发 end 更新了数据\n if (sessionContent.status === SessionContentStatus.Loading) {\n sessionLoadingMap.value[sessionCode] = false;\n // end 的时候,如果 message 有值,则更新 content\n if (message) {\n sessionContent.content = message;\n }\n // 更新状态\n sessionContent.status = SessionContentStatus.Success;\n // 调用cb\n return handleEnd?.(sessionCode, sessionContent);\n }\n // 内容正在生成中或者正在思考中\n if (sessionContent.content === startMessage || isThinking(sessionContent.content)) {\n handleErrorChat(sessionCode, '聊天内容已中断');\n }\n }\n\n // 聊天异常\n function handleErrorChat(sessionCode: string, message: string, code?: string) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n sessionContent.status = SessionContentStatus.Fail;\n sessionContent.content = message;\n sessionLoadingMap.value[sessionCode] = false;\n // token 超了,提示 token 不足\n if (code === HttpErrorCode.TokenExpired) {\n sessionContent.content = '抱歉,您的剩余 Token 不足,无法返回回答内容,请先清空当前会话(上下文仍会作为历史记录保留))';\n sessionContent.role = SessionContentRole.TokenExpired;\n }\n if (code === HttpErrorCode.ImageNotSupported) {\n sessionContent.content = '抱歉,当前模型不支持图片内容解析';\n sessionContent.role = SessionContentRole.ImageNotSupported;\n }\n // 调用cb\n return handleError?.(sessionCode, sessionContent, code);\n }\n\n // 重新生成对话 仅支持重新生成 ai 的回复\n function reGenerateChat(chatIndex: number) {\n const chat = sessionContents.value[chatIndex];\n if (chat.role !== SessionContentRole.Ai) {\n return;\n }\n\n const message = sessionContents.value[chatIndex - 1].content;\n const cite = sessionContents.value[chatIndex - 1].cite;\n sessionContents.value.splice(chatIndex - 1, 2);\n sendChat({message, cite});\n }\n\n // 聊天\n function chat({\n sessionCode,\n data,\n url,\n headers,\n }: {\n sessionCode: string;\n data?: Record<string, any>;\n url: string;\n headers?: Record<string, string>;\n }) {\n // 发送请求\n chatHelper.stream({\n sessionCode,\n url: url,\n data,\n headers: headers || requestOptions?.headers,\n });\n }\n\n // 重新发送聊天, 需要将当前聊天内容以及下方的所有内容删除\n function reSendChat(index: number, {message, cite}: {message: string, cite?: string}, callback?: () => void) {\n const chat = sessionContents.value[index];\n if (chat.role !== SessionContentRole.User) {\n return;\n }\n\n sessionContents.value.splice(index, sessionContents.value.length - index);\n sendChat({message, cite}, callback);\n }\n\n // 发送聊天\n function sendChat(content: BasicChatContent | ShortcutChatContent, callback?: () => void) {\n if (!currentSession.value?.sessionCode || !requestOptions?.url || currentSessionLoading.value) {\n return;\n }\n\n const {message, cite, shortcut} = content;\n\n let input = '';\n\n if (shortcut) {\n input = processPromptTemplate(shortcut.prompt, cite);\n } else {\n input = cite ? `${message}: \"${cite}\"` : message;\n }\n\n\n sessionContents.value.push({\n sessionCode: currentSession.value?.sessionCode,\n content: message,\n role: SessionContentRole.User,\n status: SessionContentStatus.Success,\n cite,\n });\n\n // 发送请求\n chatHelper.stream({\n sessionCode: currentSession.value?.sessionCode,\n url: requestOptions.url,\n headers: requestOptions?.headers,\n data: {\n inputs: {\n chat_history: prompts.value.slice(0, prompts.value.length - 1),\n input,\n },\n }\n });\n\n callback?.();\n }\n\n /**\n * 删除聊天内容\n * @param index 要删除的聊天内容索引\n * @description \n * - 如果删除的是用户消息,则同时删除该消息及其对应的AI回复(共2条)\n * - 如果删除的是其他类型消息(如AI回复),则只删除该条消息\n */\n function deleteChat(index: number) {\n const chat = sessionContents.value[index];\n if (chat.role === SessionContentRole.User) {\n sessionContents.value.splice(index, 2);\n return;\n }\n\n sessionContents.value.splice(index-1, 2);\n }\n\n // 停止聊天\n function stopChat(sessionCode: string) {\n chatHelper.stop(sessionCode);\n }\n\n return {\n currentSession,\n sessionContents,\n sessionContentsMap,\n sessionLoadingMap,\n prompts,\n currentSessionLoading,\n chat,\n sendChat,\n stopChat,\n plusSessionContent,\n updateSessionContent,\n getSessionContentById,\n getLastSessionContentBySessionCode,\n getSessionContentsBySessionCode,\n setCurrentSession,\n setSessionContents,\n deleteSessionContent,\n deleteSessionContents,\n handleStartChat,\n handleErrorChat,\n reGenerateChat,\n reSendChat,\n deleteChat,\n };\n};","import type {\n SummaryCallbacks,\n} from '../types/type.ts';\nimport {\n SessionPromptRole,\n} from '../types/enum';\nimport {\n removeReferenceDoc,\n} from '../hooks/use-reference-doc';\nimport {\n removeThink,\n} from '../hooks/use-think';\nimport {\n ChatHelper,\n} from '../common/chart-helper';\n\n// ai 总结\nexport const useSummary = ({\n handleStart,\n handleEnd,\n handleError,\n}: SummaryCallbacks = {}) => {\n let summaryText = '';\n\n const handleStartChat = () => {\n summaryText = '';\n return handleStart?.();\n };\n\n const handleTextChat = (sessionCode: string, message: string, cover?: boolean) => {\n if (cover || summaryText === '正在思考...') {\n summaryText = message;\n } else {\n summaryText += message;\n }\n };\n\n const handleEndChat = () => {\n if (summaryText === '无话可说') {\n summaryText = '';\n }\n return handleEnd?.(summaryText);\n };\n\n const handleErrorChat = (sessionCode: string, message: string, code?: string) => {\n return handleError?.(message, code);\n };\n\n const chatHelper = new ChatHelper({\n handleStart: handleStartChat,\n handleText: handleTextChat,\n handleEnd: handleEndChat,\n handleError: handleErrorChat,\n });\n\n const summary = ({\n content,\n url,\n headers,\n model,\n }: {\n content: string;\n url: string;\n headers?: Record<string, string>;\n model?: string;\n }) => {\n const filterContent = removeThink(removeReferenceDoc(content));\n const prompts = [\n {\n role: SessionPromptRole.User,\n content: `你是一个总结大师,请帮助我对下面这段话进行总结。要求总结精炼,不超过 15 个字!且末尾没有标点符号!请注意:如果你无法总结,请回复“无话可说”!\\n文字如下:\\n${filterContent}`,\n },\n ];\n \n chatHelper.stream({\n sessionCode: 'summary',\n url,\n data: {\n prompts,\n model,\n },\n headers,\n });\n };\n\n return {\n summary,\n };\n}","import {\n useReferenceDoc,\n} from \"./use-reference-doc\";\nimport {\n useThink,\n} from \"./use-think\";\nimport '../css/style.css';\n\n// ai 样式。注意:全局引入一次即可\nexport const useStyle = () => {\n // 图标库需要动态导入以确保能在浏览器环境下执行\n if (typeof document !== 'undefined') {\n // 动态导入JS文件\n const script = document.createElement('script');\n script.src = new URL('../css/iconcool.js', import.meta.url).href;\n document.head.appendChild(script);\n }\n \n // 引用资料\n useReferenceDoc();\n // 思考\n useThink();\n};\n"],"names":["SessionPromptRole","SessionContentStatus","SessionContentRole","HttpErrorCode","document","value","_a","calculatedSessionContents","prompts","index","sessionContents","chat"],"mappings":"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"}
|
package/dist/main.umd.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("vue"),require("bkui-vue")):"function"==typeof define&&define.amd?define(["exports","vue","bkui-vue"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self)["ai-ui-sdk"]={},e.Vue,e["bkui-vue"])}(this,(function(e,n,t){"use strict";var o=Object.defineProperty,s=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,l=Object.prototype.propertyIsEnumerable,a=(e,n,t)=>n in e?o(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,d=(e,n)=>{for(var t in n||(n={}))i.call(n,t)&&a(e,t,n[t]);if(s)for(var t of s(n))l.call(n,t)&&a(e,t,n[t]);return e},r=(e,n,t)=>a(e,"symbol"!=typeof n?n+"":n,t),c=(e,n,t)=>new Promise(((o,s)=>{var i=e=>{try{a(t.next(e))}catch(n){s(n)}},l=e=>{try{a(t.throw(e))}catch(n){s(n)}},a=e=>e.done?o(e.value):Promise.resolve(e.value).then(i,l);a((t=t.apply(e,n)).next())})),u=(e=>(e.System="system",e.Assistant="assistant",e.User="user",e.Guide="guide",e.Pause="pause",e.UserImage="user-image",e.Hidden="hidden",e.HiddenUser="hidden-user",e.HiddenAssistant="hidden-assistant",e.HiddenSystem="hidden-system",e.HiddenGuide="hidden-guide",e.TemplateUser="template-user",e.TemplateAssistant="template-assistant",e.TemplateSystem="template-system",e.TemplateGuide="template-guide",e.TemplateHidden="template-hidden",e))(u||{}),p=(e=>(e.Fail="fail",e.Loading="loading",e.Success="success",e))(p||{}),h=(e=>(e.Ai="ai",e.User="user",e.Time="time",e.System="system",e.Role="role",e.Hidden="hidden",e.Guide="guide",e.Pause="pause",e.TokenExpired="token-expired",e.UserImage="user-image",e.HiddenUser="hidden-user",e.HiddenAi="hidden-ai",e.HiddenRole="hidden-role",e.HiddenGuide="hidden-guide",e.TemplateUser="template-user",e.TemplateAi="template-ai",e.TemplateRole="template-role",e.TemplateGuide="template-guide",e.TemplateHidden="template-hidden",e.ImageNotSupported="image-not-supported",e))(h||{}),m=(e=>(e.TokenExpired="80003",e.ImageNotSupported="82003",e.UnAuthorizedPreviewFile="80401",e.TagRepeat="1513405",e[e.Aborted=20]="Aborted",e[e.UnLogin=401]="UnLogin",e.IamNoPermission="IAM_NO_PERMISSION",e))(m||{});const g=e=>{const n={[h.Ai]:u.Assistant,[h.User]:u.User,[h.System]:u.System,[h.Hidden]:u.Hidden,[h.Guide]:u.Guide,[h.Time]:u.System,[h.Role]:u.System,[h.HiddenAi]:u.HiddenAssistant,[h.HiddenGuide]:u.HiddenGuide,[h.HiddenRole]:u.HiddenSystem,[h.HiddenUser]:u.HiddenUser,[h.TemplateAi]:u.TemplateAssistant,[h.TemplateGuide]:u.TemplateGuide,[h.TemplateRole]:u.TemplateSystem,[h.TemplateUser]:u.TemplateUser,[h.TemplateHidden]:u.TemplateHidden,[h.Pause]:u.Pause,[h.TokenExpired]:u.Pause,[h.ImageNotSupported]:u.Pause,[h.UserImage]:u.UserImage};return{content:e.content,role:n[e.role]}},v=e=>{try{return JSON.parse(e),!0}catch(n){return!1}};const f=e=>e.replace(/<section class="knowledge-head click-close">[\s\S]*?<\/section>/,"").replace(/<ul class="knowledge-body">[\s\S]*?<\/ul>/,"").replace(/<section class="knowledge-tips">[\s\S]*?<\/section>/,""),k=()=>{let e=null;n.onBeforeMount((()=>{e=document.createElement("style"),e.textContent=".knowledge-tips {\n position: relative;\n padding: 6px 8px;\n margin-bottom: 14px;\n line-height: 22px;\n background: #f5f7fa;\n border-radius: 4px;\n\n &.closed {\n .bkaidev-angle-up {\n transform: rotate(180deg);\n }\n\n .knowledge-summary {\n margin-bottom: 0;\n }\n\n .knowledge-link {\n display: none;\n }\n }\n\n .bkaidev-angle-up {\n position: absolute;\n top: 4px;\n right: 0px;\n font-size: 22px;\n color: #979ba5;\n cursor: pointer;\n }\n\n .bkaidev-help-document {\n margin-right: 4px;\n font-size: 19px;\n color: #3a84ff;\n }\n\n .knowledge-summary {\n display: block;\n margin-bottom: 4px;\n color: #313238;\n }\n\n .knowledge-link {\n display: block;\n color: #3a84ff;\n text-decoration: none;\n cursor: pointer;\n\n .bkaidev-cc-jump-link {\n font-size: 14px;\n }\n\n &:last-child {\n margin-bottom: 2px;\n }\n }\n }.knowledge-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n\n .ai-ui-sdk-wenzhang {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .knowledge-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .knowledge-body {\n background: #F5F7FA;\n padding: 16px 0 !important;\n .knowledge-item {\n padding-left: 10px;\n display: flex;\n align-items: center;\n line-height: 28px;\n .hover-show {\n display: none;\n }\n a {\n margin-right: 10px;\n &:has(i) {\n padding: 0 10px;\n margin-right: 0;\n text-decoration: none !important;\n }\n }\n .ai-ui-sdk-zhishiku {\n color: #D66F6B;\n font-size: 14px;\n margin-right: 6px;\n }\n &:hover {\n background: #EAEBF0;\n .hover-show {\n display: inline;\n }\n }\n }\n }",document.head.appendChild(e)})),n.onBeforeUnmount((()=>{e&&(e.remove(),e=null)}))},b=(e,n,t,o)=>{let s="内容正在生成中..."===e||t?"":e;if(s.includes('<section class="think-head click-close">')){const e=s.match(/<section class="think-body">([\s\S]*?)<\/section>/);if(e){const t=e[1],o=t.replace(/\n$/g,`${n}\n`);s=s.replace(t,o)}}else s+=`<section class="think-head click-close">\n <i class="ai-ui-sdk-icon ai-ui-sdk-sikao"></i>思考中...<i class="ai-ui-sdk-icon ai-ui-sdk-angle-up"></i>\n </section>\n <section class="think-body">\n ${n}\n</section>`;return o&&(s=s.replace("思考中...",`已完成思考 (耗时:${function(e){const n=Math.floor(e/36e5),t=Math.floor(e%36e5/6e4),o=Math.floor(e%6e4/1e3),s=e%1e3,i=[];return n>0&&i.push(`${n}h`),t>0&&i.push(`${t}min`),o>0&&i.push(`${o}s`),s>0&&i.push(`${s.toFixed(2)}ms`),i.join(" ")}(o)})`)),s},x=e=>{let n=e.replace(/<section class="think-head click-close">[\s\S]*<\/section>/,"").replace(/<section class="think-body">[\s\S]*<\/section>/,"");if(""===n.trim()){const t=e.match(/<section class="think-body">([\s\S]*?)<\/section>/);t&&([,n]=t)}return n},y=()=>{let e=null;n.onBeforeMount((()=>{e=document.createElement("style"),e.textContent=".think-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n .ai-ui-sdk-sikao {\n font-size: 14px;\n color: #979ba5;\n margin-right: 4px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .think-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .think-body {\n background: #F5F7FA;\n color: #979BA5;\n padding: 16px;\n margin-bottom: 16px;\n &~ .knowledge-head {\n margin-bottom: 8px;\n }\n }",document.head.appendChild(e)})),n.onBeforeUnmount((()=>{e&&(e.remove(),e=null)}))};class S{constructor({handleStart:e,handleText:n,handleReferenceDoc:t,handleThink:o,handleEnd:s,handleError:i}){r(this,"handleStart"),r(this,"handleText"),r(this,"handleReferenceDoc"),r(this,"handleThink"),r(this,"handleEnd"),r(this,"handleError"),r(this,"controllerMap"),this.handleStart=e,this.handleText=n,this.handleReferenceDoc=t,this.handleThink=o,this.handleEnd=s,this.handleError=i,this.controllerMap={}}stream(e){return c(this,arguments,(function*({sessionCode:e,url:n,headers:t,data:o}){var s;yield null==(s=this.handleStart)?void 0:s.call(this,e);const i=new AbortController;this.controllerMap[e]=i,fetch(n,{method:"post",signal:i.signal,headers:d({"Content-Type":"application/json"},t),mode:"cors",credentials:"include",body:JSON.stringify(o)}).then((n=>c(this,null,(function*(){const t=n.body.pipeThrough(new window.TextDecoderStream).getReader();let o="";for(;;)try{const{value:s,done:i}=yield t.read();if(!n.ok){this.handleError(e,s||n.statusText,n.status);break}if(i){this.handleEnd(e);break}(o+s.toString()).split("\n").forEach((t=>{var s,i;const l=t.replace("data:","").trim();if(v(l)){const{event:t,content:a,cover:d,documents:r,result:c,code:u,elapsed_time:p,message:h}=JSON.parse(l);if(!1===c||200!==n.status)return void this.handleError(e,h||"模型调用失败",u);switch(t){case"text":this.handleText(e,a,d);break;case"reference_doc":null==(s=this.handleReferenceDoc)||s.call(this,e,r,d);break;case"think":null==(i=this.handleThink)||i.call(this,e,a,d,p);break;case"done":this.handleEnd(e,d?a:"");break;case"error":this.handleError(e,h||"模型调用失败",u)}o=""}else l&&(o=l)}))}catch(s){20!==(null==s?void 0:s.code)&&this.handleError(e,`模型调用失败:${s.message}`,s.code);break}}))))}))}stop(e){var n,t;return null==(t=null==(n=this.controllerMap[e])?void 0:n.abort)||t.call(n),this.handleEnd(e)}}e.HttpErrorCode=m,e.SessionContentRole=h,e.SessionContentStatus=p,e.SessionPromptRole=u,e.transferSessionContent2SessionPrompt=g,e.useChat=({handleStart:e,handleText:t,handleReferenceDoc:o,handleThink:s,handleEnd:i,handleError:l,requestOptions:a}={})=>{const d="内容正在生成中...",r=n.ref(),c=n.ref({}),u=n.ref([]),v={},k=n.computed((()=>{const e=[];for(let n=u.value.length-1;n>=0;n--){const t=u.value[n];let o=n+1,s=u.value[o];for(;s&&![h.Ai,h.TokenExpired,h.ImageNotSupported,h.Pause,h.Guide].includes(s.role);)o+=1,s=u.value[o];if(t.role===h.System)break;t.status===p.Fail||(null==s?void 0:s.status)===p.Fail&&[h.User,h.UserImage].includes(t.role)||[h.Time,h.System].includes(t.role)||e.unshift(t)}return e})),y=n.computed((()=>{var e;const n=null==(e=r.value)?void 0:e.sessionCode;return!!n&&c.value[n]})),C=n.computed((()=>{var e,n,t;const o=[],s=[],i=[],l=u.value.findLastIndex((e=>e.role===h.System&&["已启用角色","已启用模型"].some((n=>e.content.includes(n)))));let a=0;null==(t=null==(n=null==(e=r.value)?void 0:e.roleInfo)?void 0:n.content)||t.forEach((e=>{const n=u.value[l+1+a];let t=u.value[l+2+a];if((null==n?void 0:n.content)===e.content&&n.role!==h.System&&(o.push(g(n)),a+=1,(null==n?void 0:n.role)===h.Pause)){for(;t&&t.role===h.System;)a+=1,t=u.value[l+1+a];for(;t&&[h.User,h.UserImage].includes(t.role);)o.push(g(t)),a+=1,t=u.value[l+1+a]}})),s.push(...k.value.map(g));const d=e=>{var n;let t=!0;for(let i=e;i<o.length;i++){o[i].content!==(null==(n=s[i-e])?void 0:n.content)&&(t=!1)}return t};for(let r=0;r<o.length;r++){const e=o[r];if(d(r))break;i.push(e)}return i.push(...s),i.forEach((e=>{e.content=x(e.content),e.content=f(e.content)})),i})),E=new S({handleStart:L,handleText:function(e,n,o){const s=T(e);if(s.content===d)s.content=n;else{if(s.status!==p.Loading)return;s.content=o?n:s.content+n}return null==t?void 0:t(e,s)},handleReferenceDoc:function(e,n,t){const s=T(e),i=(e=>{let n=`<section class="knowledge-head click-close">\n <svg\n class="ai-ui-sdk-wenzhang"\n >\n <use href="#ai-ui-sdk-wenzhang"></use>\n </svg>\n 找到 ${e.length} 篇资料参考\n <i class="ai-ui-sdk-icon ai-ui-sdk-angle-up"></i>\n </section>\n <ul class="knowledge-body">`;return e.forEach((e=>{const{path:t,file_path:o,display_name:s,preview_path:i}=e.metadata,l=s||o.split("/").pop();n+=`<li\n class="knowledge-item"\n >\n <i class="ai-ui-sdk-icon ai-ui-sdk-zhishiku"></i>\n <a href="${i}" title="${l} (${i})" target="_blank" class="knowledge-link g-flex-truncate">\n ${l}\n </a>\n <a href="${t}" title="预览原文" target="_blank" class="knowledge-link hover-show">\n <i class="ai-ui-sdk-icon ai-ui-sdk-yanjing-kejian"></i>\n </a>\n </li>`})),n+="</ul>",n})(n);return s.content=t?i:s.content+i,null==o?void 0:o(e,s)},handleThink:function(e,n,t,o){const i=T(e);return i.content=b(i.content,n,t,o),null==s?void 0:s(e,i)},handleEnd:function(e,n){const t=T(e);if(t.status===p.Loading)return c.value[e]=!1,n&&(t.content=n),t.status=p.Success,null==i?void 0:i(e,t);(t.content===d||(e=>{const n="正在思考..."===e,t=e.match(/<section class="think-body">([\s\S]*?)<\/section>$/),o=t&&""===t[1].trim();return n||o})(t.content))&&I(e,"聊天内容已中断")},handleError:I});function T(e){var n,t;return(null==(n=r.value)?void 0:n.sessionCode)===e?u.value.at(-1):null==(t=v[e])?void 0:t.at(-1)}function w(e){var n;return(null==(n=r.value)?void 0:n.sessionCode)===e?u.value:v[e]}function U(e,n){w(e).push(n)}function A(e,n,t){var o;const s=(null==(o=r.value)?void 0:o.sessionCode)===e?u.value:v[e],i=[];return n.forEach((e=>{const n=s.findIndex((n=>n.id===e));if(n>-1){const o=s[n-1],l=s[n+1],a=s[n+2];if(s.splice(n,1),i.push(e),[h.Hidden].includes(null==o?void 0:o.role)){const e=s.findIndex((e=>e.id===o.id));s.splice(e,1),i.push(o.id)}if((null==l?void 0:l.role)===h.Ai||t&&[h.Ai,h.Guide,h.TokenExpired,h.ImageNotSupported,h.Pause].includes(null==l?void 0:l.role)){const e=s.findIndex((e=>e.id===l.id));s.splice(e,1),i.push(l.id)}if([h.Guide].includes(null==a?void 0:a.role)&&t){const e=s.findIndex((e=>e.id===a.id));s.splice(e,1),i.push(a.id)}}})),i}function L(n){c.value[n]=!0;const t={sessionCode:n,role:h.Ai,status:p.Loading,content:d};return U(n,t),null==e?void 0:e(n,t)}function I(e,n,t){const o=T(e);return o.status=p.Fail,o.content=n,c.value[e]=!1,t===m.TokenExpired&&(o.content="抱歉,您的剩余 Token 不足,无法返回回答内容,请先清空当前会话(上下文仍会作为历史记录保留))",o.role=h.TokenExpired),t===m.ImageNotSupported&&(o.content="抱歉,当前模型不支持图片内容解析",o.role=h.ImageNotSupported),null==l?void 0:l(e,o,t)}function H(e,n){var t,o,s;if(!(null==(t=r.value)?void 0:t.sessionCode)||!(null==a?void 0:a.url)||y.value)return;const{message:i,cite:l,shortcut:d}=e;let c="";var m,g;d?(m=d.prompt,g=l,c=m.replace(/\{\{\s*SELECTED_TEXT\s*\}\}/g,g||"")):c=l?`${i}: "${l}"`:i,u.value.push({sessionCode:null==(o=r.value)?void 0:o.sessionCode,content:i,role:h.User,status:p.Success,cite:l}),E.stream({sessionCode:null==(s=r.value)?void 0:s.sessionCode,url:a.url,headers:null==a?void 0:a.headers,data:{inputs:{chat_history:C.value.slice(0,C.value.length-1),input:c}}}),null==n||n()}return{currentSession:r,sessionContents:u,sessionContentsMap:v,sessionLoadingMap:c,prompts:C,currentSessionLoading:y,chat:function({sessionCode:e,data:n,url:t,headers:o}){E.stream({sessionCode:e,url:t,data:n,headers:o||(null==a?void 0:a.headers)})},sendChat:H,stopChat:function(e){E.stop(e)},plusSessionContent:U,updateSessionContent:function(e){var n;const t=((null==(n=r.value)?void 0:n.sessionCode)===e.sessionCode?u.value:v[e.sessionCode]).find((n=>+(n.id||0)==+(e.id||0)));t&&Object.assign(t,e)},getSessionContentById:function(e,n){return w(n).find((n=>n.id===e))},getLastSessionContentBySessionCode:T,getSessionContentsBySessionCode:w,setCurrentSession:function(e){r.value=e,(null==e?void 0:e.sessionCode)&&(v[e.sessionCode]||(v[e.sessionCode]=[]),u.value=v[e.sessionCode])},setSessionContents:function(e){r.value&&(v[r.value.sessionCode]=e,u.value=e)},deleteSessionContent:function(e,n){return A(e,[n],!0)},deleteSessionContents:function(e,n){return A(e,n,!1)},handleStartChat:L,handleErrorChat:I,reGenerateChat:function(e){if(u.value[e].role!==h.Ai)return;const n=u.value[e-1].content,t=u.value[e-1].cite;u.value.splice(e-1,2),H({message:n,cite:t})},reSendChat:function(e,{message:n,cite:t},o){u.value[e].role===h.User&&(u.value.splice(e,u.value.length-e),H({message:n,cite:t},o))},deleteChat:function(e){u.value[e].role!==h.User?u.value.splice(e-1,2):u.value.splice(e,2)}}},e.useClickProxy=()=>{const e=e=>{var n,o,s,i;const l=e.target;if(null==l?void 0:l.classList.contains("bkaidev-angle-up")){const e=null==l?void 0:l.parentElement;(null==e?void 0:e.classList.contains("closed"))?null==e||e.classList.remove("closed"):null==e||e.classList.add("closed")}if((null==l?void 0:l.classList.contains("click-close"))&&((null==l?void 0:l.classList.contains("closed"))?null==l||l.classList.remove("closed"):null==l||l.classList.add("closed")),null==l?void 0:l.classList.contains("click-full-screen")){const e=null==(o=null==(n=null==l?void 0:l.parentElement)?void 0:n.parentElement)?void 0:o.parentElement;null==e||e.classList.add("full-screen"),e._originalParent||(e._originalParent=e.parentNode,e._originalNextSibling=e.nextSibling),document.body.appendChild(e)}if(null==l?void 0:l.classList.contains("click-un-full-screen")){const e=null==(i=null==(s=null==l?void 0:l.parentElement)?void 0:s.parentElement)?void 0:i.parentElement;null==e||e.classList.remove("full-screen"),e._originalNextSibling?e._originalParent.insertBefore(e,e._originalNextSibling):e._originalParent.appendChild(e)}if(null==l?void 0:l.classList.contains("click-copy")){const e=null==l?void 0:l.getAttribute("data-clipboard-text");e&&(e=>{const n=document.createElement("textarea");n.value=e,document.body.appendChild(n),n.select(),document.execCommand("copy"),t.Message({theme:"success",message:"复制成功"}),document.body.removeChild(n)})(decodeURIComponent(e))}if(null==l?void 0:l.classList.contains("click-download")){const e=null==l?void 0:l.getAttribute("data-clipboard-text"),n=null==l?void 0:l.getAttribute("data-file-name");e&&n&&function(e,n="ai.txt"){const t=document.createElement("a"),o=new Blob([e]);t.download=n,t.href=URL.createObjectURL(o),t.style.display="none",document.body.appendChild(t),t.click(),document.body.removeChild(t)}(decodeURIComponent(e),n)}};n.onBeforeMount((()=>{window.addEventListener("click",e)})),n.onBeforeUnmount((()=>{window.removeEventListener("click",e)}))},e.useStyle=()=>{require("../css/style.css"),require("../css/iconcool.js"),k(),y()},e.useSummary=({handleStart:e,handleEnd:n,handleError:t}={})=>{let o="";const s=new S({handleStart:()=>(o="",null==e?void 0:e()),handleText:(e,n,t)=>{t||"正在思考..."===o?o=n:o+=n},handleEnd:()=>("无话可说"===o&&(o=""),null==n?void 0:n(o)),handleError:(e,n,o)=>null==t?void 0:t(n,o)});return{summary:({content:e,url:n,headers:t,model:o})=>{const i=x(f(e)),l=[{role:u.User,content:`你是一个总结大师,请帮助我对下面这段话进行总结。要求总结精炼,不超过 15 个字!且末尾没有标点符号!请注意:如果你无法总结,请回复“无话可说”!\n文字如下:\n${i}`}];s.stream({sessionCode:"summary",url:n,data:{prompts:l,model:o},headers:t})}}},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})}));
|
1
|
+
!function(A,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("vue"),require("bkui-vue")):"function"==typeof define&&define.amd?define(["exports","vue","bkui-vue"],e):e((A="undefined"!=typeof globalThis?globalThis:A||self)["ai-ui-sdk"]={},A.Vue,A["bkui-vue"])}(this,(function(A,e,n){"use strict";var t=Object.defineProperty,i=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable,a=(A,e,n)=>e in A?t(A,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):A[e]=n,l=(A,e)=>{for(var n in e||(e={}))o.call(e,n)&&a(A,n,e[n]);if(i)for(var n of i(e))s.call(e,n)&&a(A,n,e[n]);return A},M=(A,e,n)=>a(A,"symbol"!=typeof e?e+"":e,n),u=(A,e,n)=>new Promise(((t,i)=>{var o=A=>{try{a(n.next(A))}catch(e){i(e)}},s=A=>{try{a(n.throw(A))}catch(e){i(e)}},a=A=>A.done?t(A.value):Promise.resolve(A.value).then(o,s);a((n=n.apply(A,e)).next())})),c=document.createElement("style");c.textContent="@font-face{font-family:ai-ui-sdk;src:url(\"data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%20%3e%3csvg%3e%3cmetadata%3e%20Created%20by%20font-carrier%20%3c/metadata%3e%3cdefs%3e%3cfont%20id='iconfont'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20%3e%3cfont-face%20font-family='iconfont'%20font-weight='400'%20font-stretch='normal'%20units-per-em='1024'%20ascent='812'%20descent='-212'%20/%3e%3cmissing-glyph%20/%3e%3cglyph%20glyph-name='x'%20unicode='&%23x78;'%20horiz-adv-x='100'%20d='M20%2020%20L50%2020%20L50%20-20%20Z'%20/%3e%3cglyph%20glyph-name='uniE103'%20unicode='&%23xE103;'%20d='M512%20444L736%20220%20688%20172%20512%20348%20336%20172%20288%20220%20512%20444Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE105'%20unicode='&%23xE105;'%20d='M263.04%2051.04A148.48%20148.48%200%200%200%20261.12%20275.04L353.6%20367.52%20308.48%20413.28%20216%20320.8A212.8%20212.8%200%200%201%20217.92%205.92%20212.8%20212.8%200%200%201%20532.8%204L625.28%2096.48%20579.84%20140%20487.36%2047.52A148.48%20148.48%200%200%200%20263.04%2051.04ZM491.2%20596L398.72%20503.52%20444.16%20458.4%20536.64%20550.88A148.48%20148.48%200%200%200%20760.64%20548.96%20148.48%20148.48%200%200%200%20762.56%20324.96L672%20232.16%20717.12%20186.72%20809.6%20279.2A212.8%20212.8%200%200%201%20807.68%20594.08%20212.8%20212.8%200%200%201%20491.2%20596ZM398.7857%20232.1123L579.805%20413.1316%20625.0598%20367.8768%20444.0405%20186.8574%20398.7857%20232.1123Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE104'%20unicode='&%23xE104;'%20d='M320.9863%20608.6846L191.6223%20608.6846C174.3738%20608.6846%20160%20594.1825%20160%20576.78L160-62.7621C160-80.1646%20174.3738-94.6667%20191.6223-94.6667L320.9863-94.6667C338.2348-94.6667%20352.6086-80.1646%20352.6086-62.7621L352.6086%20576.78C352.6086%20594.1825%20338.2348%20608.6846%20320.9863%20608.6846ZM285.0519%20478.1658L227.5568%20478.1658C211.7456%20478.1658%20198.8092%20491.2176%20198.8092%20507.1699%20198.8092%20523.1222%20211.7456%20536.1741%20227.5568%20536.1741L285.0519%20536.1741C300.863%20536.1741%20313.7994%20523.1222%20313.7994%20507.1699%20313.7994%20491.2177%20300.863%20478.1658%20285.0519%20478.1658ZM578.2769%20716L448.9129%20716C431.6644%20716%20417.2906%20701.4979%20417.2906%20684.0954L417.2906-62.7621C417.2906-80.1646%20431.6644-94.6667%20448.9129-94.6667L578.2769-94.6667C595.5255-94.6667%20609.8993-80.1646%20609.8993-62.7621L609.8993%20684.0954C611.3366%20701.4979%20596.9629%20716%20578.2769%20716ZM543.7799%20584.031L486.2848%20584.031C470.4736%20584.031%20457.5372%20597.0829%20457.5372%20613.0352%20457.5372%20628.9875%20470.4736%20642.0394%20486.2848%20642.0394L543.7799%20642.0394C559.591%20642.0394%20572.5274%20628.9875%20572.5274%20613.0352%20572.5274%20597.0829%20559.591%20584.031%20543.7799%20584.031ZM927.5598-29.4073L806.82%20598.5331C802.5079%20614.4854%20789.5715%20624.6369%20773.7603%20624.6369L768.0108%20624.6369%20641.5216%20599.9833C624.273%20597.0829%20612.774%20579.6804%20615.6488%20562.2779L737.8259-67.1127C740.7006-83.065%20753.637-93.2165%20769.4482-93.2165L775.1977-93.2165%20901.6869-68.5629C918.9355-64.2123%20930.4345-46.8098%20927.5598-29.4073L927.5598-29.4073ZM762.2613%20499.9189L704.7662%20488.3172%20699.0167%20488.3172C686.0803%20488.3172%20673.1439%20498.4687%20670.2691%20511.5206%20667.3944%20527.4729%20677.456%20543.4252%20693.2672%20546.3256L750.7623%20557.9273C766.5734%20560.8277%20782.3846%20550.6762%20785.2593%20534.7239%20788.1341%20518.7716%20778.0725%20502.8193%20762.2613%20499.9189L762.2613%20499.9189Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE102'%20unicode='&%23xE102;'%20d='M528%20716C589.8559%20716%20640%20665.8559%20640%20604%20640%20603.6241%20639.9981%20603.2487%20639.9945%20602.8737%20774.7291%20551.3341%20870.4%20420.8396%20870.4%20268%20870.4%20245.4507%20868.3176%20223.3878%20864.3345%20201.9931%20883.9388%20181.8561%20896%20154.3366%20896%20124%20896%2062.1441%20845.8559%2012%20784%2012%20777.3525%2012%20770.8402%2012.5791%20764.5109%2013.6897%20699.7526-50.6495%20610.5184-90.4%20512-90.4%20413.4816-90.4%20324.2474-50.6495%20259.4612%2013.6877%20253.1598%2012.5791%20246.6475%2012%20240%2012%20178.1441%2012%20128%2062.1441%20128%20124%20128%20154.3366%20140.0612%20181.8561%20159.6499%20202.0249%20155.6824%20223.3878%20153.6%20245.4507%20153.6%20268%20153.6%20432.8448%20264.8905%20571.6963%20416.4355%20613.5184%20421.2316%20670.9212%20469.3514%20716%20528%20716ZM436.5201%20539.3665L432.0511%20538.0893C315.4696%20503.6336%20230.4%20395.7514%20230.4%20268%20230.4%20257.0771%20231.0219%20246.2994%20232.2322%20235.7004L233.8549%20235.8343%20240%20236C301.8559%20236%20352%20185.8559%20352%20124%20352%2097.8684%20343.0507%2073.8271%20328.0498%2054.7737%20377.3611%2012.1827%20441.6696-13.6%20512-13.6%20582.3304-13.6%20646.6389%2012.1827%20695.9893%2054.812%20680.9493%2073.8271%20672%2097.8684%20672%20124%20672%20185.8559%20722.1441%20236%20784%20236%20786.6073%20236%20789.1938%20235.9109%20791.7567%20235.7356%20792.9781%20246.2994%20793.6%20257.0771%20793.6%20268%20793.6%20387.9728%20718.5746%20490.4224%20612.8817%20530.9909%20592.3503%20507.0949%20561.938%20492%20528%20492%20490.2178%20492%20456.8051%20510.7083%20436.5201%20539.3665Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE101'%20unicode='&%23xE101;'%20d='M708.9231%20654.4615L984.6154%20654.4615C1006.3669%20654.4615%201024%20636.8284%201024%20615.0769L1024-133.2308C1024-176.7338%20988.7338-212%20945.2308-212L708.9231-212%20708.9231%20654.4615%20708.9231%20654.4615ZM0-172.6154C0-183.0608%204.1494-193.0785%2011.5355-200.4645%2018.9215-207.8506%2028.9392-212%2039.3846-212L945.2308-212C901.7277-212%20866.4615-176.7338%20866.4615-133.2308L866.4615%20772.6154C866.4615%20794.3669%20848.8284%20812%20827.0769%20812L39.3846%20812C17.6331%20812%200%20794.3669%200%20772.6154L0-172.6154ZM196.9231%20523.1795C175.1716%20523.1795%20157.5385%20505.5464%20157.5385%20483.7949%20157.5385%20462.0433%20175.1716%20444.4103%20196.9231%20444.4103L354.4615%20444.4103C376.2131%20444.4103%20393.8462%20462.0433%20393.8462%20483.7949%20393.8462%20505.5464%20376.2131%20523.1795%20354.4615%20523.1795L196.9231%20523.1795ZM196.9231%20286.8718C175.1716%20286.8718%20157.5385%20269.2387%20157.5385%20247.4872%20157.5385%20225.7357%20175.1716%20208.1026%20196.9231%20208.1026L669.5385%20208.1026C691.29%20208.1026%20708.9231%20225.7357%20708.9231%20247.4872%20708.9231%20269.2387%20691.29%20286.8718%20669.5385%20286.8718L196.9231%20286.8718ZM196.9231%2050.5641C175.1716%2050.5641%20157.5385%2032.931%20157.5385%2011.1795%20157.5385-10.572%20175.1716-28.2051%20196.9231-28.2051L433.2308-28.2051C454.9823-28.2051%20472.6154-10.572%20472.6154%2011.1795%20472.6154%2032.931%20454.9823%2050.5641%20433.2308%2050.5641L196.9231%2050.5641%20196.9231%2050.5641Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3cglyph%20glyph-name='uniE106'%20unicode='&%23xE106;'%20d='M512%20620C759.4%20620%20960%20476.7%20960%20300%20960%20123.3%20759.4-20%20512-20%20264.6-20%2064%20123.3%2064%20300%2064%20476.7%20264.6%20620%20512%20620ZM512%20556C457.8%20556%20405.4%20548.5%20356.1%20533.6%20309.5%20519.5%20267.8%20499.5%20232.4%20474.2%20165.1%20426.1%20128%20364.2%20128%20300%20128%20235.8%20165.1%20173.9%20232.4%20125.8%20267.8%20100.5%20309.5%2080.5%20356.1%2066.4%20405.4%2051.5%20457.8%2044%20512%2044%20566.2%2044%20618.6%2051.5%20667.9%2066.4%20714.5%2080.5%20756.2%20100.5%20791.6%20125.8%20858.9%20173.9%20896%20235.8%20896%20300%20896%20364.2%20858.9%20426.1%20791.6%20474.2%20756.2%20499.5%20714.5%20519.5%20667.9%20533.6%20618.6%20548.5%20566.2%20556%20512%20556ZM512%20460C600.4%20460%20672%20388.4%20672%20300%20672%20211.6%20600.4%20140%20512%20140%20423.6%20140%20352%20211.6%20352%20300%20352%20388.4%20423.6%20460%20512%20460ZM512%20396C459.1%20396%20416%20352.9%20416%20300%20416%20247.1%20459.1%20204%20512%20204%20564.9%20204%20608%20247.1%20608%20300%20608%20352.9%20564.9%20396%20512%20396Z'%20horiz-adv-x='1024'%20vert-adv-y='1024'%20/%3e%3c/font%3e%3c/defs%3e%3c/svg%3e\") format(\"svg\"),url(data:font/ttf;base64,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) format(\"truetype\"),url(data:font/woff;base64,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) format(\"woff\"),url(data:application/vnd.ms-fontobject;base64,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) format(\"embedded-opentype\");font-weight:400;font-style:normal}.ai-ui-sdk-icon{font-family:ai-ui-sdk!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ai-ui-sdk-angle-up:before{content:\"\"}.ai-ui-sdk-links:before{content:\"\"}.ai-ui-sdk-zhishiku:before{content:\"\"}.ai-ui-sdk-sikao:before{content:\"\"}.ai-ui-sdk-wenzhang:before{content:\"\"}.ai-ui-sdk-yanjing-kejian:before{content:\"\"}\n/*$vite$:1*/",document.head.appendChild(c);var d="undefined"!=typeof document?document.currentScript:null,g=(A=>(A.System="system",A.Assistant="assistant",A.User="user",A.Guide="guide",A.Pause="pause",A.UserImage="user-image",A.Hidden="hidden",A.HiddenUser="hidden-user",A.HiddenAssistant="hidden-assistant",A.HiddenSystem="hidden-system",A.HiddenGuide="hidden-guide",A.TemplateUser="template-user",A.TemplateAssistant="template-assistant",A.TemplateSystem="template-system",A.TemplateGuide="template-guide",A.TemplateHidden="template-hidden",A))(g||{}),r=(A=>(A.Fail="fail",A.Loading="loading",A.Success="success",A))(r||{}),I=(A=>(A.Ai="ai",A.User="user",A.Time="time",A.System="system",A.Role="role",A.Hidden="hidden",A.Guide="guide",A.Pause="pause",A.TokenExpired="token-expired",A.UserImage="user-image",A.HiddenUser="hidden-user",A.HiddenAi="hidden-ai",A.HiddenRole="hidden-role",A.HiddenGuide="hidden-guide",A.TemplateUser="template-user",A.TemplateAi="template-ai",A.TemplateRole="template-role",A.TemplateGuide="template-guide",A.TemplateHidden="template-hidden",A.ImageNotSupported="image-not-supported",A))(I||{}),E=(A=>(A.TokenExpired="80003",A.ImageNotSupported="82003",A.UnAuthorizedPreviewFile="80401",A.TagRepeat="1513405",A[A.Aborted=20]="Aborted",A[A.UnLogin=401]="UnLogin",A.IamNoPermission="IAM_NO_PERMISSION",A))(E||{});const B=A=>{const e={[I.Ai]:g.Assistant,[I.User]:g.User,[I.System]:g.System,[I.Hidden]:g.Hidden,[I.Guide]:g.Guide,[I.Time]:g.System,[I.Role]:g.System,[I.HiddenAi]:g.HiddenAssistant,[I.HiddenGuide]:g.HiddenGuide,[I.HiddenRole]:g.HiddenSystem,[I.HiddenUser]:g.HiddenUser,[I.TemplateAi]:g.TemplateAssistant,[I.TemplateGuide]:g.TemplateGuide,[I.TemplateRole]:g.TemplateSystem,[I.TemplateUser]:g.TemplateUser,[I.TemplateHidden]:g.TemplateHidden,[I.Pause]:g.Pause,[I.TokenExpired]:g.Pause,[I.ImageNotSupported]:g.Pause,[I.UserImage]:g.UserImage};return{content:A.content,role:e[A.role]}},N=A=>{try{return JSON.parse(A),!0}catch(e){return!1}};const D=A=>A.replace(/<section class="knowledge-head click-close">[\s\S]*?<\/section>/,"").replace(/<ul class="knowledge-body">[\s\S]*?<\/ul>/,"").replace(/<section class="knowledge-tips">[\s\S]*?<\/section>/,""),h=()=>{let A=null;e.onBeforeMount((()=>{A=document.createElement("style"),A.textContent=".knowledge-tips {\n position: relative;\n padding: 6px 8px;\n margin-bottom: 14px;\n line-height: 22px;\n background: #f5f7fa;\n border-radius: 4px;\n\n &.closed {\n .bkaidev-angle-up {\n transform: rotate(180deg);\n }\n\n .knowledge-summary {\n margin-bottom: 0;\n }\n\n .knowledge-link {\n display: none;\n }\n }\n\n .bkaidev-angle-up {\n position: absolute;\n top: 4px;\n right: 0px;\n font-size: 22px;\n color: #979ba5;\n cursor: pointer;\n }\n\n .bkaidev-help-document {\n margin-right: 4px;\n font-size: 19px;\n color: #3a84ff;\n }\n\n .knowledge-summary {\n display: block;\n margin-bottom: 4px;\n color: #313238;\n }\n\n .knowledge-link {\n display: block;\n color: #3a84ff;\n text-decoration: none;\n cursor: pointer;\n\n .bkaidev-cc-jump-link {\n font-size: 14px;\n }\n\n &:last-child {\n margin-bottom: 2px;\n }\n }\n }.knowledge-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n\n .ai-ui-sdk-wenzhang {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .knowledge-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .knowledge-body {\n background: #F5F7FA;\n padding: 16px 0 !important;\n .knowledge-item {\n padding-left: 10px;\n display: flex;\n align-items: center;\n line-height: 28px;\n .hover-show {\n display: none;\n }\n a {\n margin-right: 10px;\n &:has(i) {\n padding: 0 10px;\n margin-right: 0;\n text-decoration: none !important;\n }\n }\n .ai-ui-sdk-zhishiku {\n color: #D66F6B;\n font-size: 14px;\n margin-right: 6px;\n }\n &:hover {\n background: #EAEBF0;\n .hover-show {\n display: inline;\n }\n }\n }\n }",document.head.appendChild(A)})),e.onBeforeUnmount((()=>{A&&(A.remove(),A=null)}))},Q=(A,e,n,t)=>{let i="内容正在生成中..."===A||n?"":A;if(i.includes('<section class="think-head click-close">')){const A=i.match(/<section class="think-body">([\s\S]*?)<\/section>/);if(A){const n=A[1],t=n.replace(/\n$/g,`${e}\n`);i=i.replace(n,t)}}else i+=`<section class="think-head click-close">\n <i class="ai-ui-sdk-icon ai-ui-sdk-sikao"></i>思考中...<i class="ai-ui-sdk-icon ai-ui-sdk-angle-up"></i>\n </section>\n <section class="think-body">\n ${e}\n</section>`;return t&&(i=i.replace("思考中...",`已完成思考 (耗时:${function(A){const e=Math.floor(A/36e5),n=Math.floor(A%36e5/6e4),t=Math.floor(A%6e4/1e3),i=A%1e3,o=[];return e>0&&o.push(`${e}h`),n>0&&o.push(`${n}min`),t>0&&o.push(`${t}s`),i>0&&o.push(`${i.toFixed(2)}ms`),o.join(" ")}(t)})`)),i},j=A=>{let e=A.replace(/<section class="think-head click-close">[\s\S]*<\/section>/,"").replace(/<section class="think-body">[\s\S]*<\/section>/,"");if(""===e.trim()){const n=A.match(/<section class="think-body">([\s\S]*?)<\/section>/);n&&([,e]=n)}return e},T=()=>{let A=null;e.onBeforeMount((()=>{A=document.createElement("style"),A.textContent=".think-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n .ai-ui-sdk-sikao {\n font-size: 14px;\n color: #979ba5;\n margin-right: 4px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .think-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .think-body {\n background: #F5F7FA;\n color: #979BA5;\n padding: 16px;\n margin-bottom: 16px;\n &~ .knowledge-head {\n margin-bottom: 8px;\n }\n }",document.head.appendChild(A)})),e.onBeforeUnmount((()=>{A&&(A.remove(),A=null)}))};class C{constructor({handleStart:A,handleText:e,handleReferenceDoc:n,handleThink:t,handleEnd:i,handleError:o}){M(this,"handleStart"),M(this,"handleText"),M(this,"handleReferenceDoc"),M(this,"handleThink"),M(this,"handleEnd"),M(this,"handleError"),M(this,"controllerMap"),this.handleStart=A,this.handleText=e,this.handleReferenceDoc=n,this.handleThink=t,this.handleEnd=i,this.handleError=o,this.controllerMap={}}stream(A){return u(this,arguments,(function*({sessionCode:A,url:e,headers:n,data:t}){var i;yield null==(i=this.handleStart)?void 0:i.call(this,A);const o=new AbortController;this.controllerMap[A]=o,fetch(e,{method:"post",signal:o.signal,headers:l({"Content-Type":"application/json"},n),mode:"cors",credentials:"include",body:JSON.stringify(t)}).then((e=>u(this,null,(function*(){const n=e.body.pipeThrough(new window.TextDecoderStream).getReader();let t="";for(;;)try{const{value:i,done:o}=yield n.read();if(!e.ok){this.handleError(A,i||e.statusText,e.status);break}if(o){this.handleEnd(A);break}(t+i.toString()).split("\n").forEach((n=>{var i,o;const s=n.replace("data:","").trim();if(N(s)){const{event:n,content:a,cover:l,documents:M,result:u,code:c,elapsed_time:d,message:g}=JSON.parse(s);if(!1===u||200!==e.status)return void this.handleError(A,g||"模型调用失败",c);switch(n){case"text":this.handleText(A,a,l);break;case"reference_doc":null==(i=this.handleReferenceDoc)||i.call(this,A,M,l);break;case"think":null==(o=this.handleThink)||o.call(this,A,a,l,d);break;case"done":this.handleEnd(A,l?a:"");break;case"error":this.handleError(A,g||"模型调用失败",c)}t=""}else s&&(t=s)}))}catch(i){20!==(null==i?void 0:i.code)&&this.handleError(A,`模型调用失败:${i.message}`,i.code);break}}))))}))}stop(A){var e,n;return null==(n=null==(e=this.controllerMap[A])?void 0:e.abort)||n.call(e),this.handleEnd(A)}}A.HttpErrorCode=E,A.SessionContentRole=I,A.SessionContentStatus=r,A.SessionPromptRole=g,A.transferSessionContent2SessionPrompt=B,A.useChat=({handleStart:A,handleText:n,handleReferenceDoc:t,handleThink:i,handleEnd:o,handleError:s,requestOptions:a}={})=>{const l="内容正在生成中...",M=e.ref(),u=e.ref({}),c=e.ref([]),d={},g=e.computed((()=>{const A=[];for(let e=c.value.length-1;e>=0;e--){const n=c.value[e];let t=e+1,i=c.value[t];for(;i&&![I.Ai,I.TokenExpired,I.ImageNotSupported,I.Pause,I.Guide].includes(i.role);)t+=1,i=c.value[t];if(n.role===I.System)break;n.status===r.Fail||(null==i?void 0:i.status)===r.Fail&&[I.User,I.UserImage].includes(n.role)||[I.Time,I.System].includes(n.role)||A.unshift(n)}return A})),N=e.computed((()=>{var A;const e=null==(A=M.value)?void 0:A.sessionCode;return!!e&&u.value[e]})),h=e.computed((()=>{var A,e,n;const t=[],i=[],o=[],s=c.value.findLastIndex((A=>A.role===I.System&&["已启用角色","已启用模型"].some((e=>A.content.includes(e)))));let a=0;null==(n=null==(e=null==(A=M.value)?void 0:A.roleInfo)?void 0:e.content)||n.forEach((A=>{const e=c.value[s+1+a];let n=c.value[s+2+a];if((null==e?void 0:e.content)===A.content&&e.role!==I.System&&(t.push(B(e)),a+=1,(null==e?void 0:e.role)===I.Pause)){for(;n&&n.role===I.System;)a+=1,n=c.value[s+1+a];for(;n&&[I.User,I.UserImage].includes(n.role);)t.push(B(n)),a+=1,n=c.value[s+1+a]}})),i.push(...g.value.map(B));const l=A=>{var e;let n=!0;for(let o=A;o<t.length;o++){t[o].content!==(null==(e=i[o-A])?void 0:e.content)&&(n=!1)}return n};for(let M=0;M<t.length;M++){const A=t[M];if(l(M))break;o.push(A)}return o.push(...i),o.forEach((A=>{A.content=j(A.content),A.content=D(A.content)})),o})),T=new C({handleStart:z,handleText:function(A,e,t){const i=y(A);if(i.content===l)i.content=e;else{if(i.status!==r.Loading)return;i.content=t?e:i.content+e}return null==n?void 0:n(A,i)},handleReferenceDoc:function(A,e,n){const i=y(A),o=(A=>{let e=`<section class="knowledge-head click-close">\n <svg\n class="ai-ui-sdk-wenzhang"\n >\n <use href="#ai-ui-sdk-wenzhang"></use>\n </svg>\n 找到 ${A.length} 篇资料参考\n <i class="ai-ui-sdk-icon ai-ui-sdk-angle-up"></i>\n </section>\n <ul class="knowledge-body">`;return A.forEach((A=>{const{path:n,file_path:t,display_name:i,preview_path:o}=A.metadata,s=i||t.split("/").pop();e+=`<li\n class="knowledge-item"\n >\n <i class="ai-ui-sdk-icon ai-ui-sdk-zhishiku"></i>\n <a href="${o}" title="${s} (${o})" target="_blank" class="knowledge-link g-flex-truncate">\n ${s}\n </a>\n <a href="${n}" title="预览原文" target="_blank" class="knowledge-link hover-show">\n <i class="ai-ui-sdk-icon ai-ui-sdk-yanjing-kejian"></i>\n </a>\n </li>`})),e+="</ul>",e})(e);return i.content=n?o:i.content+o,null==t?void 0:t(A,i)},handleThink:function(A,e,n,t){const o=y(A);return o.content=Q(o.content,e,n,t),null==i?void 0:i(A,o)},handleEnd:function(A,e){const n=y(A);if(n.status===r.Loading)return u.value[A]=!1,e&&(n.content=e),n.status=r.Success,null==o?void 0:o(A,n);(n.content===l||(A=>{const e="正在思考..."===A,n=A.match(/<section class="think-body">([\s\S]*?)<\/section>$/),t=n&&""===n[1].trim();return e||t})(n.content))&&w(A,"聊天内容已中断")},handleError:w});function y(A){var e,n;return(null==(e=M.value)?void 0:e.sessionCode)===A?c.value.at(-1):null==(n=d[A])?void 0:n.at(-1)}function p(A){var e;return(null==(e=M.value)?void 0:e.sessionCode)===A?c.value:d[A]}function L(A,e){p(A).push(e)}function m(A,e,n){var t;const i=(null==(t=M.value)?void 0:t.sessionCode)===A?c.value:d[A],o=[];return e.forEach((A=>{const e=i.findIndex((e=>e.id===A));if(e>-1){const t=i[e-1],s=i[e+1],a=i[e+2];if(i.splice(e,1),o.push(A),[I.Hidden].includes(null==t?void 0:t.role)){const A=i.findIndex((A=>A.id===t.id));i.splice(A,1),o.push(t.id)}if((null==s?void 0:s.role)===I.Ai||n&&[I.Ai,I.Guide,I.TokenExpired,I.ImageNotSupported,I.Pause].includes(null==s?void 0:s.role)){const A=i.findIndex((A=>A.id===s.id));i.splice(A,1),o.push(s.id)}if([I.Guide].includes(null==a?void 0:a.role)&&n){const A=i.findIndex((A=>A.id===a.id));i.splice(A,1),o.push(a.id)}}})),o}function z(e){u.value[e]=!0;const n={sessionCode:e,role:I.Ai,status:r.Loading,content:l};return L(e,n),null==A?void 0:A(e,n)}function w(A,e,n){const t=y(A);return t.status=r.Fail,t.content=e,u.value[A]=!1,n===E.TokenExpired&&(t.content="抱歉,您的剩余 Token 不足,无法返回回答内容,请先清空当前会话(上下文仍会作为历史记录保留))",t.role=I.TokenExpired),n===E.ImageNotSupported&&(t.content="抱歉,当前模型不支持图片内容解析",t.role=I.ImageNotSupported),null==s?void 0:s(A,t,n)}function k(A,e){var n,t,i;if(!(null==(n=M.value)?void 0:n.sessionCode)||!(null==a?void 0:a.url)||N.value)return;const{message:o,cite:s,shortcut:l}=A;let u="";var d,g;l?(d=l.prompt,g=s,u=d.replace(/\{\{\s*SELECTED_TEXT\s*\}\}/g,g||"")):u=s?`${o}: "${s}"`:o,c.value.push({sessionCode:null==(t=M.value)?void 0:t.sessionCode,content:o,role:I.User,status:r.Success,cite:s}),T.stream({sessionCode:null==(i=M.value)?void 0:i.sessionCode,url:a.url,headers:null==a?void 0:a.headers,data:{inputs:{chat_history:h.value.slice(0,h.value.length-1),input:u}}}),null==e||e()}return{currentSession:M,sessionContents:c,sessionContentsMap:d,sessionLoadingMap:u,prompts:h,currentSessionLoading:N,chat:function({sessionCode:A,data:e,url:n,headers:t}){T.stream({sessionCode:A,url:n,data:e,headers:t||(null==a?void 0:a.headers)})},sendChat:k,stopChat:function(A){T.stop(A)},plusSessionContent:L,updateSessionContent:function(A){var e;const n=((null==(e=M.value)?void 0:e.sessionCode)===A.sessionCode?c.value:d[A.sessionCode]).find((e=>+(e.id||0)==+(A.id||0)));n&&Object.assign(n,A)},getSessionContentById:function(A,e){return p(e).find((e=>e.id===A))},getLastSessionContentBySessionCode:y,getSessionContentsBySessionCode:p,setCurrentSession:function(A){M.value=A,(null==A?void 0:A.sessionCode)&&(d[A.sessionCode]||(d[A.sessionCode]=[]),c.value=d[A.sessionCode])},setSessionContents:function(A){M.value&&(d[M.value.sessionCode]=A,c.value=A)},deleteSessionContent:function(A,e){return m(A,[e],!0)},deleteSessionContents:function(A,e){return m(A,e,!1)},handleStartChat:z,handleErrorChat:w,reGenerateChat:function(A){if(c.value[A].role!==I.Ai)return;const e=c.value[A-1].content,n=c.value[A-1].cite;c.value.splice(A-1,2),k({message:e,cite:n})},reSendChat:function(A,{message:e,cite:n},t){c.value[A].role===I.User&&(c.value.splice(A,c.value.length-A),k({message:e,cite:n},t))},deleteChat:function(A){c.value[A].role!==I.User?c.value.splice(A-1,2):c.value.splice(A,2)}}},A.useClickProxy=()=>{const A=A=>{var e,t,i,o;const s=A.target;if(null==s?void 0:s.classList.contains("bkaidev-angle-up")){const A=null==s?void 0:s.parentElement;(null==A?void 0:A.classList.contains("closed"))?null==A||A.classList.remove("closed"):null==A||A.classList.add("closed")}if((null==s?void 0:s.classList.contains("click-close"))&&((null==s?void 0:s.classList.contains("closed"))?null==s||s.classList.remove("closed"):null==s||s.classList.add("closed")),null==s?void 0:s.classList.contains("click-full-screen")){const A=null==(t=null==(e=null==s?void 0:s.parentElement)?void 0:e.parentElement)?void 0:t.parentElement;null==A||A.classList.add("full-screen"),A._originalParent||(A._originalParent=A.parentNode,A._originalNextSibling=A.nextSibling),document.body.appendChild(A)}if(null==s?void 0:s.classList.contains("click-un-full-screen")){const A=null==(o=null==(i=null==s?void 0:s.parentElement)?void 0:i.parentElement)?void 0:o.parentElement;null==A||A.classList.remove("full-screen"),A._originalNextSibling?A._originalParent.insertBefore(A,A._originalNextSibling):A._originalParent.appendChild(A)}if(null==s?void 0:s.classList.contains("click-copy")){const A=null==s?void 0:s.getAttribute("data-clipboard-text");A&&(A=>{const e=document.createElement("textarea");e.value=A,document.body.appendChild(e),e.select(),document.execCommand("copy"),n.Message({theme:"success",message:"复制成功"}),document.body.removeChild(e)})(decodeURIComponent(A))}if(null==s?void 0:s.classList.contains("click-download")){const A=null==s?void 0:s.getAttribute("data-clipboard-text"),e=null==s?void 0:s.getAttribute("data-file-name");A&&e&&function(A,e="ai.txt"){const n=document.createElement("a"),t=new Blob([A]);n.download=e,n.href=URL.createObjectURL(t),n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n)}(decodeURIComponent(A),e)}};e.onBeforeMount((()=>{window.addEventListener("click",A)})),e.onBeforeUnmount((()=>{window.removeEventListener("click",A)}))},A.useStyle=()=>{if("undefined"!=typeof document){const A=document.createElement("script");A.src=new URL("data:text/javascript;base64,IShmdW5jdGlvbiAoKSB7CiAgICB2YXIgc3ZnQ29kZSA9ICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZGF0YS1uYW1lPSJhaS11aS1zZGsiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MDtoZWlnaHQ6MDt2aXNpYmlsaXR5OmhpZGRlbiI+PHN5bWJvbCBpZD0iYWktdWktc2RrLWFuZ2xlLXVwIiB2aWV3Qm94PSIwIDAgMzIgMzIiPjxwYXRoIGZpbGw9IiM2MzY1NmUiIGQ9Ik0xNiAxMS41bDcgNy0xLjUgMS41LTUuNS01LjUtNS41IDUuNUw5IDE4LjVsNy03eiIvPjwvc3ltYm9sPjxzeW1ib2wgaWQ9ImFpLXVpLXNkay1saW5rcyIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+PHBhdGggZD0iTTI2My4wNCA3NjAuOTZhMTQ4LjQ4IDE0OC40OCAwIDAxLTEuOTItMjI0bDkyLjQ4LTkyLjQ4LTQ1LjEyLTQ1Ljc2TDIxNiA0OTEuMmEyMTIuOCAyMTIuOCAwIDAwMS45MiAzMTQuODhBMjEyLjggMjEyLjggMCAwMDUzMi44IDgwOGw5Mi40OC05Mi40OEw1NzkuODQgNjcybC05Mi40OCA5Mi40OGExNDguNDggMTQ4LjQ4IDAgMDEtMjI0LjMyLTMuNTJ6TTQ5MS4yIDIxNmwtOTIuNDggOTIuNDggNDUuNDQgNDUuMTIgOTIuNDgtOTIuNDhhMTQ4LjQ4IDE0OC40OCAwIDAxMjI0IDEuOTIgMTQ4LjQ4IDE0OC40OCAwIDAxMS45MiAyMjRMNjcyIDU3OS44NGw0NS4xMiA0NS40NCA5Mi40OC05Mi40OGEyMTIuOCAyMTIuOCAwIDAwLTEuOTItMzE0Ljg4QTIxMi44IDIxMi44IDAgMDA0OTEuMiAyMTZ6Ii8+PHBhdGggZD0iTTM5OC43ODYgNTc5Ljg4OGwxODEuMDE5LTE4MS4wMiA0NS4yNTUgNDUuMjU1LTE4MS4wMiAxODEuMDItNDUuMjU0LTQ1LjI1NXoiLz48L3N5bWJvbD48c3ltYm9sIGlkPSJhaS11aS1zZGstemhpc2hpa3UiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGQ9Ik0zMjAuOTg2IDIwMy4zMTVIMTkxLjYyMmMtMTcuMjQ4IDAtMzEuNjIyIDE0LjUwMy0zMS42MjIgMzEuOTA1djYzOS41NDJjMCAxNy40MDMgMTQuMzc0IDMxLjkwNSAzMS42MjIgMzEuOTA1aDEyOS4zNjRjMTcuMjQ5IDAgMzEuNjIzLTE0LjUwMiAzMS42MjMtMzEuOTA1VjIzNS4yMmMwLTE3LjQwMi0xNC4zNzQtMzEuOTA1LTMxLjYyMy0zMS45MDV6bS0zNS45MzQgMTMwLjUyaC01Ny40OTVjLTE1LjgxMSAwLTI4Ljc0OC0xMy4wNTMtMjguNzQ4LTI5LjAwNSAwLTE1Ljk1MiAxMi45MzctMjkuMDA0IDI4Ljc0OC0yOS4wMDRoNTcuNDk1YzE1LjgxMSAwIDI4Ljc0NyAxMy4wNTIgMjguNzQ3IDI5LjAwNCAwIDE1Ljk1Mi0xMi45MzYgMjkuMDA0LTI4Ljc0NyAyOS4wMDR6TTU3OC4yNzcgOTZINDQ4LjkxM2MtMTcuMjQ5IDAtMzEuNjIyIDE0LjUwMi0zMS42MjIgMzEuOTA1djc0Ni44NTdjMCAxNy40MDMgMTQuMzczIDMxLjkwNSAzMS42MjIgMzEuOTA1aDEyOS4zNjRjMTcuMjQ4IDAgMzEuNjIyLTE0LjUwMiAzMS42MjItMzEuOTA1VjEyNy45MDVDNjExLjMzNyAxMTAuNTAyIDU5Ni45NjMgOTYgNTc4LjI3NyA5NnpNNTQzLjc4IDIyNy45NjloLTU3LjQ5NWMtMTUuODExIDAtMjguNzQ4LTEzLjA1Mi0yOC43NDgtMjkuMDA0IDAtMTUuOTUyIDEyLjkzNy0yOS4wMDQgMjguNzQ4LTI5LjAwNGg1Ny40OTVjMTUuODExIDAgMjguNzQ3IDEzLjA1MiAyOC43NDcgMjkuMDA0IDAgMTUuOTUyLTEyLjkzNiAyOS4wMDQtMjguNzQ3IDI5LjAwNHptMzgzLjc4IDYxMy40MzhsLTEyMC43NC02MjcuOTRjLTQuMzEyLTE1Ljk1Mi0xNy4yNDktMjYuMTA0LTMzLjA2LTI2LjEwNGgtNS43NWwtMTI2LjQ4OCAyNC42NTRjLTE3LjI0OSAyLjktMjguNzQ4IDIwLjMwMy0yNS44NzMgMzcuNzA1bDEyMi4xNzcgNjI5LjM5YzIuODc1IDE1Ljk1MyAxNS44MTEgMjYuMTA0IDMxLjYyMiAyNi4xMDRoNS43NWwxMjYuNDg5LTI0LjY1M2MxNy4yNDgtNC4zNSAyOC43NDgtMjEuNzUzIDI1Ljg3My0zOS4xNTZ6TTc2Mi4yNiAzMTIuMDgxbC01Ny40OTUgMTEuNjAyaC01Ljc1Yy0xMi45MzYgMC0yNS44NzItMTAuMTUyLTI4Ljc0Ny0yMy4yMDQtMi44NzUtMTUuOTUyIDcuMTg3LTMxLjkwNCAyMi45OTgtMzQuODA1bDU3LjQ5NS0xMS42MDFjMTUuODExLTIuOSAzMS42MjMgNy4yNSAzNC40OTcgMjMuMjAzIDIuODc1IDE1Ljk1Mi03LjE4NyAzMS45MDUtMjIuOTk4IDM0LjgwNXoiLz48L3N5bWJvbD48c3ltYm9sIGlkPSJhaS11aS1zZGstc2lrYW8iIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGQ9Ik01MjggOTZjNjEuODU2IDAgMTEyIDUwLjE0NCAxMTIgMTEyIDAgLjM3Ni0uMDAyLjc1MS0uMDA2IDEuMTI2Qzc3NC43MyAyNjAuNjY2IDg3MC40IDM5MS4xNiA4NzAuNCA1NDRjMCAyMi41NS0yLjA4MiA0NC42MTItNi4wNjYgNjYuMDA3Qzg4My45NCA2MzAuMTQ0IDg5NiA2NTcuNjYzIDg5NiA2ODhjMCA2MS44NTYtNTAuMTQ0IDExMi0xMTIgMTEyYTExMi43IDExMi43IDAgMDEtMTkuNDktMS42OUM2OTkuNzU0IDg2Mi42NSA2MTAuNTE5IDkwMi40IDUxMiA5MDIuNHMtMTg3Ljc1My0zOS43NS0yNTIuNTM5LTEwNC4wODhBMTEyLjMzIDExMi4zMyAwIDAxMjQwIDgwMGMtNjEuODU2IDAtMTEyLTUwLjE0NC0xMTItMTEyIDAtMzAuMzM3IDEyLjA2MS01Ny44NTYgMzEuNjUtNzguMDI1QTM2MS4xNzIgMzYxLjE3MiAwIDAxMTUzLjYgNTQ0YzAtMTY0Ljg0NSAxMTEuMjktMzAzLjY5NiAyNjIuODM2LTM0NS41MThDNDIxLjIzMiAxNDEuMDc5IDQ2OS4zNSA5NiA1MjggOTZ6bS05MS40OCAxNzYuNjMzbC00LjQ2OSAxLjI3OEMzMTUuNDcgMzA4LjM2NiAyMzAuNCA0MTYuMjQ5IDIzMC40IDU0NGMwIDEwLjkyMy42MjIgMjEuNyAxLjgzMiAzMi4zbDEuNjIzLS4xMzRMMjQwIDU3NmM2MS44NTYgMCAxMTIgNTAuMTQ0IDExMiAxMTIgMCAyNi4xMzItOC45NSA1MC4xNzMtMjMuOTUgNjkuMjI2QzM3Ny4zNiA3OTkuODE3IDQ0MS42NyA4MjUuNiA1MTIgODI1LjZjNzAuMzMgMCAxMzQuNjM5LTI1Ljc4MyAxODMuOTktNjguNDEyQzY4MC45NSA3MzguMTczIDY3MiA3MTQuMTMyIDY3MiA2ODhjMC02MS44NTYgNTAuMTQ0LTExMiAxMTItMTEyIDIuNjA3IDAgNS4xOTQuMDkgNy43NTcuMjY0QTI4MC45ODkgMjgwLjk4OSAwIDAwNzkzLjYgNTQ0YzAtMTE5Ljk3My03NS4wMjUtMjIyLjQyMi0xODAuNzE4LTI2Mi45OUM1OTIuMzUgMzA0LjkwNCA1NjEuOTM4IDMyMCA1MjggMzIwYy0zNy43ODIgMC03MS4xOTUtMTguNzA4LTkxLjQ4LTQ3LjM2N3oiLz48L3N5bWJvbD48c3ltYm9sIGlkPSJhaS11aS1zZGstd2VuemhhbmciIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGZpbGw9IiMzRDQyNjUiIGQ9Ik03MDguOTIzIDE1Ny41MzhoMjc1LjY5MmMyMS43NTIgMCAzOS4zODUgMTcuNjM0IDM5LjM4NSAzOS4zODV2NzQ4LjMwOGMwIDQzLjUwMy0zNS4yNjYgNzguNzY5LTc4Ljc3IDc4Ljc2OUg3MDguOTI0VjE1Ny41Mzh6Ii8+PHBhdGggZmlsbD0iIzNBODRGRiIgZD0iTTAgOTg0LjYxNUEzOS4zODUgMzkuMzg1IDAgMDAzOS4zODUgMTAyNEg5NDUuMjNjLTQzLjUwMyAwLTc4Ljc3LTM1LjI2Ni03OC43Ny03OC43N1YzOS4zODZDODY2LjQ2MiAxNy42MzMgODQ4LjgyOSAwIDgyNy4wNzggMEgzOS4zODVDMTcuNjMzIDAgMCAxNy42MzMgMCAzOS4zODV2OTQ1LjIzeiIvPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0xOTYuOTIzIDI4OC44MmMtMjEuNzUxIDAtMzkuMzg1IDE3LjYzNC0zOS4zODUgMzkuMzg1IDAgMjEuNzUyIDE3LjYzNCAzOS4zODUgMzkuMzg1IDM5LjM4NWgxNTcuNTM5YzIxLjc1MSAwIDM5LjM4NC0xNy42MzMgMzkuMzg0LTM5LjM4NSAwLTIxLjc1MS0xNy42MzMtMzkuMzg0LTM5LjM4NC0zOS4zODRIMTk2LjkyM3ptMCAyMzYuMzA4Yy0yMS43NTEgMC0zOS4zODUgMTcuNjMzLTM5LjM4NSAzOS4zODUgMCAyMS43NTEgMTcuNjM0IDM5LjM4NCAzOS4zODUgMzkuMzg0aDQ3Mi42MTVjMjEuNzUyIDAgMzkuMzg1LTE3LjYzMyAzOS4zODUtMzkuMzg0IDAtMjEuNzUyLTE3LjYzMy0zOS4zODUtMzkuMzg1LTM5LjM4NUgxOTYuOTIzem0wIDIzNi4zMDhjLTIxLjc1MSAwLTM5LjM4NSAxNy42MzMtMzkuMzg1IDM5LjM4NSAwIDIxLjc1MSAxNy42MzQgMzkuMzg0IDM5LjM4NSAzOS4zODRoMjM2LjMwOGMyMS43NTEgMCAzOS4zODQtMTcuNjMzIDM5LjM4NC0zOS4zODQgMC0yMS43NTItMTcuNjMzLTM5LjM4NS0zOS4zODQtMzkuMzg1SDE5Ni45MjN6Ii8+PC9nPjwvc3ltYm9sPjxzeW1ib2wgaWQ9ImFpLXVpLXNkay15YW5qaW5nLWtlamlhbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNNTEyIDE5MmMyNDcuNCAwIDQ0OCAxNDMuMyA0NDggMzIwUzc1OS40IDgzMiA1MTIgODMyIDY0IDY4OC43IDY0IDUxMnMyMDAuNi0zMjAgNDQ4LTMyMHptMCA2NGMtNTQuMiAwLTEwNi42IDcuNS0xNTUuOSAyMi40LTQ2LjYgMTQuMS04OC4zIDM0LjEtMTIzLjcgNTkuNEMxNjUuMSAzODUuOSAxMjggNDQ3LjggMTI4IDUxMmMwIDY0LjIgMzcuMSAxMjYuMSAxMDQuNCAxNzQuMiAzNS40IDI1LjMgNzcuMSA0NS4zIDEyMy43IDU5LjRDNDA1LjQgNzYwLjUgNDU3LjggNzY4IDUxMiA3NjhzMTA2LjYtNy41IDE1NS45LTIyLjRjNDYuNi0xNC4xIDg4LjMtMzQuMSAxMjMuNy01OS40Qzg1OC45IDYzOC4xIDg5NiA1NzYuMiA4OTYgNTEyYzAtNjQuMi0zNy4xLTEyNi4xLTEwNC40LTE3NC4yLTM1LjQtMjUuMy03Ny4xLTQ1LjMtMTIzLjctNTkuNEM2MTguNiAyNjMuNSA1NjYuMiAyNTYgNTEyIDI1NnptMCA5NmM4OC40IDAgMTYwIDcxLjYgMTYwIDE2MHMtNzEuNiAxNjAtMTYwIDE2MC0xNjAtNzEuNi0xNjAtMTYwIDcxLjYtMTYwIDE2MC0xNjB6bTAgNjRjLTUyLjkgMC05NiA0My4xLTk2IDk2czQzLjEgOTYgOTYgOTYgOTYtNDMuMSA5Ni05Ni00My4xLTk2LTk2LTk2eiIvPjwvc3ltYm9sPjwvc3ZnPicKICAgIGlmIChkb2N1bWVudC5ib2R5KSB7CiAgICAgICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2FmdGVyYmVnaW4nLCBzdmdDb2RlKQogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdhZnRlcmJlZ2luJywgc3ZnQ29kZSkKICAgICAgICB9KQogICAgfQp9KSgp","undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:d&&"SCRIPT"===d.tagName.toUpperCase()&&d.src||new URL("main.umd.js",document.baseURI).href).href,document.head.appendChild(A)}h(),T()},A.useSummary=({handleStart:A,handleEnd:e,handleError:n}={})=>{let t="";const i=new C({handleStart:()=>(t="",null==A?void 0:A()),handleText:(A,e,n)=>{n||"正在思考..."===t?t=e:t+=e},handleEnd:()=>("无话可说"===t&&(t=""),null==e?void 0:e(t)),handleError:(A,e,t)=>null==n?void 0:n(e,t)});return{summary:({content:A,url:e,headers:n,model:t})=>{const o=j(D(A)),s=[{role:g.User,content:`你是一个总结大师,请帮助我对下面这段话进行总结。要求总结精炼,不超过 15 个字!且末尾没有标点符号!请注意:如果你无法总结,请回复“无话可说”!\n文字如下:\n${o}`}];i.stream({sessionCode:"summary",url:e,data:{prompts:s,model:t},headers:n})}}},Object.defineProperty(A,Symbol.toStringTag,{value:"Module"})}));
|
2
2
|
//# sourceMappingURL=main.umd.js.map
|
package/dist/main.umd.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"main.umd.js","sources":["../src/types/enum.ts","../src/common/type-transform.ts","../src/common/util.ts","../src/hooks/use-reference-doc.ts","../src/hooks/use-think.ts","../src/common/chart-helper.ts","../src/hooks/use-chat.ts","../src/hooks/use-click-proxy.ts","../src/hooks/use-style.ts","../src/hooks/use-summary.ts"],"sourcesContent":["// 传给 ai 的类型\nexport enum SessionPromptRole {\n System = 'system',\n Assistant = 'assistant',\n User = 'user',\n Guide = 'guide',\n Pause = 'pause',\n UserImage = 'user-image',\n Hidden = 'hidden',\n HiddenUser = 'hidden-user',\n HiddenAssistant = 'hidden-assistant',\n HiddenSystem = 'hidden-system',\n HiddenGuide = 'hidden-guide',\n TemplateUser = 'template-user',\n TemplateAssistant = 'template-assistant',\n TemplateSystem = 'template-system',\n TemplateGuide = 'template-guide',\n TemplateHidden = 'template-hidden',\n}\n\nexport enum SessionContentStatus {\n Fail = 'fail',\n Loading = 'loading',\n Success = 'success',\n}\n\nexport enum SessionContentRole {\n Ai = 'ai',\n User = 'user',\n Time = 'time',\n System = 'system',\n Role = 'role',\n Hidden = 'hidden',\n Guide = 'guide',\n Pause = 'pause',\n TokenExpired = 'token-expired',\n UserImage = 'user-image',\n HiddenUser = 'hidden-user',\n HiddenAi = 'hidden-ai',\n HiddenRole = 'hidden-role',\n HiddenGuide = 'hidden-guide',\n TemplateUser = 'template-user',\n TemplateAi = 'template-ai',\n TemplateRole = 'template-role',\n TemplateGuide = 'template-guide',\n TemplateHidden = 'template-hidden',\n ImageNotSupported = 'image-not-supported'\n}\n\nexport enum HttpErrorCode {\n TokenExpired = '80003',\n ImageNotSupported = '82003',\n UnAuthorizedPreviewFile = '80401',\n TagRepeat = '1513405',\n Aborted = 20,\n UnLogin = 401,\n IamNoPermission = 'IAM_NO_PERMISSION'\n}\n","import {\n SessionContentRole,\n SessionPromptRole,\n} from '../types/enum';\nimport type {\n ISessionContent,\n ISessionPrompt,\n} from '../types/type';\n\n/**\n * 将 sessionContent 转换为 sessionPrompt\n * @param sessionContent sessionContent\n * @returns sessionPrompt\n */\nexport const transferSessionContent2SessionPrompt = (sessionContent: ISessionContent): ISessionPrompt => {\n const sessionRoleMap = {\n [SessionContentRole.Ai]: SessionPromptRole.Assistant,\n [SessionContentRole.User]: SessionPromptRole.User,\n [SessionContentRole.System]: SessionPromptRole.System,\n [SessionContentRole.Hidden]: SessionPromptRole.Hidden,\n [SessionContentRole.Guide]: SessionPromptRole.Guide,\n [SessionContentRole.Time]: SessionPromptRole.System,\n [SessionContentRole.Role]: SessionPromptRole.System,\n [SessionContentRole.HiddenAi]: SessionPromptRole.HiddenAssistant,\n [SessionContentRole.HiddenGuide]: SessionPromptRole.HiddenGuide,\n [SessionContentRole.HiddenRole]: SessionPromptRole.HiddenSystem,\n [SessionContentRole.HiddenUser]: SessionPromptRole.HiddenUser,\n [SessionContentRole.TemplateAi]: SessionPromptRole.TemplateAssistant,\n [SessionContentRole.TemplateGuide]: SessionPromptRole.TemplateGuide,\n [SessionContentRole.TemplateRole]: SessionPromptRole.TemplateSystem,\n [SessionContentRole.TemplateUser]: SessionPromptRole.TemplateUser,\n [SessionContentRole.TemplateHidden]: SessionPromptRole.TemplateHidden,\n [SessionContentRole.Pause]: SessionPromptRole.Pause,\n [SessionContentRole.TokenExpired]: SessionPromptRole.Pause,\n [SessionContentRole.ImageNotSupported]: SessionPromptRole.Pause,\n [SessionContentRole.UserImage]: SessionPromptRole.UserImage,\n };\n return {\n content: sessionContent.content,\n role: sessionRoleMap[sessionContent.role],\n };\n};\n","import {\n Message,\n} from 'bkui-vue';\n\n/**\n * 判断是否是 JSON 字符串\n * @param str 字符串\n * @returns 是否是 JSON 字符串\n */\nexport const isJSON = (str: string) => {\n try {\n JSON.parse(str);\n return true;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * 响应时间格式化\n * @param val 待格式化时间,xxms\n * @returns 格式化后的时间,xx小时xx分钟xx秒\n */\nexport function durationFormatter(val: number) {\n const hours = Math.floor(val / 3600000);\n const minutes = Math.floor((val % 3600000) / 60000);\n const seconds = Math.floor((val % 60000) / 1000);\n const milliseconds = val % 1000;\n\n const parts: string[] = [];\n if (hours > 0) {\n parts.push(`${hours}h`);\n }\n if (minutes > 0) {\n parts.push(`${minutes}min`);\n }\n if (seconds > 0) {\n parts.push(`${seconds}s`);\n }\n if (milliseconds > 0) {\n parts.push(`${milliseconds.toFixed(2)}ms`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * 前端下载文件\n * @param {*} source 文件内容\n * @param {*} filename 文件名\n */\nexport function handleDownLoad(source: string, filename = 'ai.txt') {\n const downloadEl = document.createElement('a');\n const blob = new Blob([source]);\n downloadEl.download = filename;\n downloadEl.href = URL.createObjectURL(blob);\n downloadEl.style.display = 'none';\n document.body.appendChild(downloadEl);\n downloadEl.click();\n document.body.removeChild(downloadEl);\n}\n\nexport const handleCopy = (text: string) => {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n Message({\n theme: 'success',\n message: '复制成功',\n });\n document.body.removeChild(textarea);\n};\n\n/**\n * 处理提示词模板,替换模板中的变量\n * @param prompt 提示词模板\n * @param selectedText 选中的文本\n * @returns 处理后的提示词\n */\nexport const processPromptTemplate = (prompt: string, selectedText: string) => {\n return prompt.replace(/\\{\\{\\s*SELECTED_TEXT\\s*\\}\\}/g, selectedText || '');\n};","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport type {\n Document,\n} from '../types/type';\n\n/**\n * 获取引用资料的 HTML 内容\n * @param documents\n * @returns\n */\nexport const getHtmlContentFromDocuments = (documents: Document[]) => {\n let htmlContent = `<section class=\"knowledge-head click-close\">\n <svg\n class=\"ai-ui-sdk-wenzhang\"\n >\n <use href=\"#ai-ui-sdk-wenzhang\"></use>\n </svg>\n 找到 ${documents.length} 篇资料参考\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-angle-up\"></i>\n </section>\n <ul class=\"knowledge-body\">`;\n documents.forEach((document) => {\n const { path, file_path: filePath, display_name: displayName, preview_path: previewPath } = document.metadata;\n const title = displayName || filePath.split('/').pop();\n htmlContent += `<li\n class=\"knowledge-item\"\n >\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-zhishiku\"></i>\n <a href=\"${previewPath}\" title=\"${title} (${previewPath})\" target=\"_blank\" class=\"knowledge-link g-flex-truncate\">\n ${title}\n </a>\n <a href=\"${path}\" title=\"预览原文\" target=\"_blank\" class=\"knowledge-link hover-show\">\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-yanjing-kejian\"></i>\n </a>\n </li>`;\n });\n htmlContent += '</ul>';\n return htmlContent;\n};\n\n/**\n * 移除引用资料的 HTML 内容\n * @param content\n * @returns\n */\nexport const removeReferenceDoc = (content: string) => {\n return content\n .replace(/<section class=\"knowledge-head click-close\">[\\s\\S]*?<\\/section>/, '')\n .replace(/<ul class=\"knowledge-body\">[\\s\\S]*?<\\/ul>/, '')\n .replace(/<section class=\"knowledge-tips\">[\\s\\S]*?<\\/section>/, '');\n};\n\nexport const useReferenceDoc = () => {\n let styleEle: HTMLStyleElement | null = null;\n\n const addReferenceDocStyle = () => {\n // 旧版知识样式\n const oldStyle = `.knowledge-tips {\n position: relative;\n padding: 6px 8px;\n margin-bottom: 14px;\n line-height: 22px;\n background: #f5f7fa;\n border-radius: 4px;\n\n &.closed {\n .bkaidev-angle-up {\n transform: rotate(180deg);\n }\n\n .knowledge-summary {\n margin-bottom: 0;\n }\n\n .knowledge-link {\n display: none;\n }\n }\n\n .bkaidev-angle-up {\n position: absolute;\n top: 4px;\n right: 0px;\n font-size: 22px;\n color: #979ba5;\n cursor: pointer;\n }\n\n .bkaidev-help-document {\n margin-right: 4px;\n font-size: 19px;\n color: #3a84ff;\n }\n\n .knowledge-summary {\n display: block;\n margin-bottom: 4px;\n color: #313238;\n }\n\n .knowledge-link {\n display: block;\n color: #3a84ff;\n text-decoration: none;\n cursor: pointer;\n\n .bkaidev-cc-jump-link {\n font-size: 14px;\n }\n\n &:last-child {\n margin-bottom: 2px;\n }\n }\n }`;\n // 新版知识样式\n const newStyle = `.knowledge-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n\n .ai-ui-sdk-wenzhang {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .knowledge-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .knowledge-body {\n background: #F5F7FA;\n padding: 16px 0 !important;\n .knowledge-item {\n padding-left: 10px;\n display: flex;\n align-items: center;\n line-height: 28px;\n .hover-show {\n display: none;\n }\n a {\n margin-right: 10px;\n &:has(i) {\n padding: 0 10px;\n margin-right: 0;\n text-decoration: none !important;\n }\n }\n .ai-ui-sdk-zhishiku {\n color: #D66F6B;\n font-size: 14px;\n margin-right: 6px;\n }\n &:hover {\n background: #EAEBF0;\n .hover-show {\n display: inline;\n }\n }\n }\n }`;\n styleEle = document.createElement('style');\n styleEle.textContent = oldStyle + newStyle;\n document.head.appendChild(styleEle);\n };\n\n const removeReferenceDocStyle = () => {\n if (styleEle) {\n styleEle.remove();\n styleEle = null;\n }\n };\n\n onBeforeMount(() => {\n addReferenceDocStyle();\n });\n\n onBeforeUnmount(() => {\n removeReferenceDocStyle();\n });\n};\n","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport {\n durationFormatter,\n} from '../common/util';\n\n/**\n * 获取思考的 HTML 内容\n * @param chatContent 聊天内容\n * @param content 思考内容\n * @param elapsedTime 思考时间\n * @returns 完整的 chatContent\n */\nexport const getHtmlContentFromThink = (chatContent: string, content: string, cover?: boolean, elapsedTime?: number) => {\n let htmlContent = (chatContent === '内容正在生成中...' || cover) ? '' : chatContent;\n // 思考开始\n if (!htmlContent.includes('<section class=\"think-head click-close\">')) {\n htmlContent += `<section class=\"think-head click-close\">\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-sikao\"></i>思考中...<i class=\"ai-ui-sdk-icon ai-ui-sdk-angle-up\"></i>\n </section>\n <section class=\"think-body\">\n ${content}\n</section>`;\n } else {\n // 补充思考内容\n const thinkBodyMatch = htmlContent.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>/);\n if (thinkBodyMatch) {\n // 原有思考内容\n const thinkContent = thinkBodyMatch[1];\n // 在最后的换行符前面添加新的思考内容\n const newThinkContent = thinkContent.replace(/\\n$/g, `${content}\\n`);\n htmlContent = htmlContent.replace(\n thinkContent,\n newThinkContent,\n );\n }\n }\n // 思考结束\n if (elapsedTime) {\n htmlContent = htmlContent.replace('思考中...', `已完成思考 (耗时:${durationFormatter(elapsedTime)})`);\n }\n return htmlContent;\n};\n\n/**\n * 移除思考的 HTML 内容\n * @param content\n * @returns\n */\nexport const removeThink = (content: string) => {\n // 移除思考头部\n const afterRemoveThinkHead = content.replace(/<section class=\"think-head click-close\">[\\s\\S]*<\\/section>/, '');\n // 移除思考内容\n let afterRemoveThinkBody = afterRemoveThinkHead.replace(/<section class=\"think-body\">[\\s\\S]*<\\/section>/, '');\n // 如果内容只有思考,那就给ai传递思考内容\n if (afterRemoveThinkBody.trim() === '') {\n const thinkBodyMatch = content.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>/);\n if (thinkBodyMatch) {\n [, afterRemoveThinkBody] = thinkBodyMatch;\n }\n }\n return afterRemoveThinkBody;\n};\n\n/**\n * 判断是否是思考中\n * @param content\n * @returns\n */\nexport const isThinking = (content: string) => {\n // 是否开始思考\n const isStartThinking = content === '正在思考...';\n // 判断是否空思考\n const thinkBodyMatch = content.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>$/);\n const isEmptyThinking = thinkBodyMatch && thinkBodyMatch[1].trim() === '';\n\n return isStartThinking || isEmptyThinking;\n};\n\n// 思考\nexport const useThink = () => {\n let styleEle: HTMLStyleElement | null = null;\n\n const addThinkStyle = () => {\n const style = `.think-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n .ai-ui-sdk-sikao {\n font-size: 14px;\n color: #979ba5;\n margin-right: 4px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .think-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .think-body {\n background: #F5F7FA;\n color: #979BA5;\n padding: 16px;\n margin-bottom: 16px;\n &~ .knowledge-head {\n margin-bottom: 8px;\n }\n }`;\n styleEle = document.createElement('style');\n styleEle.textContent = style;\n document.head.appendChild(styleEle);\n };\n\n const removeThinkStyle = () => {\n if (styleEle) {\n styleEle.remove();\n styleEle = null;\n }\n };\n\n onBeforeMount(() => {\n addThinkStyle();\n });\n\n onBeforeUnmount(() => {\n removeThinkStyle();\n });\n};\n","import {\n isJSON,\n} from './util';\n\nimport type {\n Document,\n} from '../types/type';\n\ntype HandleStart = (sessionCode: string) => any;\ntype HandleText = (sessionCode: string, message: string, cover?: boolean) => void;\ntype HandleReferenceDoc = (sessionCode: string, documents: Document[], cover?: boolean) => void;\ntype HandleThink = (sessionCode: string, content: string, cover?: boolean, elapsed_time?: number) => void;\ntype HandleEnd = (sessionCode: string, message?: string) => void;\ntype HandleError = (sessionCode: string, message: string, code: string) => any;\n\nexport class ChatHelper {\n handleStart: HandleStart;\n handleText: HandleText;\n handleReferenceDoc?: HandleReferenceDoc;\n handleThink?: HandleThink;\n handleEnd: HandleEnd;\n handleError: HandleError;\n controllerMap: Record<string, AbortController>;\n\n constructor({\n handleStart,\n handleText,\n handleReferenceDoc,\n handleThink,\n handleEnd,\n handleError,\n }: {\n handleStart: HandleStart;\n handleText: HandleText;\n handleReferenceDoc?: HandleReferenceDoc;\n handleThink?: HandleThink;\n handleEnd: HandleEnd;\n handleError: HandleError;\n }) {\n this.handleStart = handleStart;\n this.handleText = handleText;\n this.handleReferenceDoc = handleReferenceDoc;\n this.handleThink = handleThink;\n this.handleEnd = handleEnd;\n this.handleError = handleError;\n this.controllerMap = {};\n }\n\n async stream({\n sessionCode,\n url,\n headers,\n data,\n }: {\n sessionCode: string;\n url: string;\n headers?: Record<string, string>;\n data?: Record<string, any>;\n }) {\n // 开始\n await this.handleStart?.(sessionCode);\n // 记录 controller\n const controller = new AbortController();\n this.controllerMap[sessionCode] = controller;\n // 发送请求\n fetch(url, {\n method: 'post',\n signal: controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n mode: 'cors',\n credentials: 'include',\n body: JSON.stringify(data),\n })\n .then(async (response: any) => {\n const reader = response.body\n .pipeThrough(new window.TextDecoderStream())\n .getReader();\n\n // 临时存储数据\n let temp = '';\n\n while (true) {\n try {\n const { value, done } = await reader.read();\n\n // 接口异常处理\n if (!response.ok) {\n this.handleError(sessionCode, value || response.statusText, response.status);\n break;\n }\n // 接口完成\n if (done) {\n this.handleEnd(sessionCode);\n break;\n }\n\n const values = (temp + value.toString()).split('\\n');\n values.forEach((value) => {\n const item = value.replace('data:', '').trim();\n if (isJSON(item)) {\n const {\n event,\n content,\n cover,\n documents,\n result,\n code,\n elapsed_time,\n message,\n } = JSON.parse(item);\n // 业务错误处理\n if (result === false || response.status !== 200) {\n this.handleError(sessionCode, message || '模型调用失败', code);\n return;\n }\n\n switch (event) {\n case 'text':\n this.handleText(sessionCode, content, cover);\n break;\n case 'reference_doc':\n this.handleReferenceDoc?.(sessionCode, documents, cover);\n break;\n case 'think':\n this.handleThink?.(sessionCode, content, cover, elapsed_time);\n break;\n case 'done':\n this.handleEnd(sessionCode, cover ? content : '');\n break;\n case 'error':\n this.handleError(sessionCode, message || '模型调用失败', code);\n break;\n }\n temp = '';\n } else if (item) {\n temp = item;\n }\n });\n } catch (error: any) {\n if (error?.code !== 20) {\n this.handleError(sessionCode, `模型调用失败:${error.message}`, error.code);\n }\n break;\n }\n }\n });\n }\n\n stop(sessionCode: string) {\n this.controllerMap[sessionCode]?.abort?.();\n return this.handleEnd(sessionCode);\n }\n}\n","import {\n ref,\n computed,\n} from 'vue';\nimport type {\n Document,\n ISessionContent,\n ISession,\n ISessionPrompt,\n ChatCallbacks,\n BasicChatContent,\n ShortcutChatContent,\n} from '../types/type.ts';\nimport { processPromptTemplate } from '../common/util';\nimport {\n HttpErrorCode,\n SessionContentRole,\n SessionContentStatus,\n} from '../types/enum';\nimport {\n getHtmlContentFromDocuments,\n removeReferenceDoc,\n} from '../hooks/use-reference-doc';\nimport {\n getHtmlContentFromThink,\n isThinking,\n removeThink,\n} from '../hooks/use-think';\nimport {\n ChatHelper,\n} from '../common/chart-helper';\nimport {\n transferSessionContent2SessionPrompt,\n} from '../common/type-transform';\n\ntype SessionContentsMap = {\n [key: string]: ISessionContent[]\n};\n\ntype SessionLoadingMap = {\n [key: string]: boolean\n};\n\n// ai 聊天\nexport const useChat = <T extends ISession = ISession>({\n handleStart,\n handleText,\n handleReferenceDoc,\n handleThink,\n handleEnd,\n handleError,\n requestOptions,\n}: ChatCallbacks = {}) => {\n const startMessage = '内容正在生成中...';\n // 聊天上下文\n const currentSession = ref<T>();\n const sessionLoadingMap = ref<SessionLoadingMap>({});\n const sessionContents = ref<ISessionContent[]>([]);\n const sessionContentsMap: SessionContentsMap = {};\n\n // 通过计算得到的会话列表\n const calculatedSessionContents = computed<ISessionContent[]>(() => {\n const calculatedSessionContents: ISessionContent[] = [];\n for (let index = sessionContents.value.length - 1; index >= 0; index--) {\n const sessionContent = sessionContents.value[index];\n // 向下找到下一个ai回复\n let nextAiSessionContentIndex = index + 1;\n let nextAiSessionContent = sessionContents.value[nextAiSessionContentIndex];\n while (nextAiSessionContent && ![\n SessionContentRole.Ai,\n SessionContentRole.TokenExpired,\n SessionContentRole.ImageNotSupported,\n SessionContentRole.Pause,\n SessionContentRole.Guide,\n ].includes(nextAiSessionContent.role)\n ) {\n nextAiSessionContentIndex += 1;\n nextAiSessionContent = sessionContents.value[nextAiSessionContentIndex];\n }\n\n // 系统消息,退出\n if (sessionContent.role === SessionContentRole.System) {\n break;\n }\n\n // 倒叙添加当前聊天上下文 排除异常答复、异常问题 & 系统消息和时间消息\n if (sessionContent.status !== SessionContentStatus.Fail\n && !(nextAiSessionContent?.status === SessionContentStatus.Fail\n && [SessionContentRole.User, SessionContentRole.UserImage].includes(sessionContent.role)\n )\n && ![SessionContentRole.Time, SessionContentRole.System].includes(sessionContent.role)\n ) {\n calculatedSessionContents.unshift(sessionContent);\n }\n }\n\n return calculatedSessionContents;\n });\n\n // 当前会话是否正在加载\n const currentSessionLoading = computed(() => {\n const sessionCode = currentSession.value?.sessionCode;\n return sessionCode ? sessionLoadingMap.value[sessionCode] : false;\n });\n\n // 计算当前的 prompt\n const prompts = computed<ISessionPrompt[]>(() => {\n const rolePrompts: ISessionPrompt[] = [];\n const userPrompts: ISessionPrompt[] = [];\n const prompts: ISessionPrompt[] = [];\n\n // build rolePrompts\n const latestMatchIndex = sessionContents.value.findLastIndex(sessionContent => (\n sessionContent.role === SessionContentRole.System && ['已启用角色', '已启用模型'].some(key => sessionContent.content.includes(key))\n ));\n let index = 0;\n currentSession.value?.roleInfo?.content?.forEach((roleContent) => {\n const sessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n let nextSessionContent = sessionContents.value[latestMatchIndex + 2 + index];\n if (sessionContent?.content === roleContent.content && sessionContent.role !== SessionContentRole.System) {\n rolePrompts.push(transferSessionContent2SessionPrompt(sessionContent));\n index += 1;\n if (sessionContent?.role === SessionContentRole.Pause) {\n while (nextSessionContent && nextSessionContent.role === SessionContentRole.System) {\n index += 1;\n nextSessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n }\n while (nextSessionContent\n && [SessionContentRole.User, SessionContentRole.UserImage].includes(nextSessionContent.role)\n ) {\n rolePrompts.push(transferSessionContent2SessionPrompt(nextSessionContent));\n index += 1;\n nextSessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n }\n }\n }\n });\n\n // build userPrompts\n userPrompts.push(...calculatedSessionContents.value.map(transferSessionContent2SessionPrompt));\n\n const isSameContent = (startIndex: number) => {\n let isSame = true;\n for (let index = startIndex; index < rolePrompts.length; index++) {\n const rolePrompt = rolePrompts[index];\n if (rolePrompt.content !== userPrompts[index - startIndex]?.content) {\n isSame = false;\n }\n }\n\n return isSame;\n };\n\n // 排除在一个系统消息里面,重复的情况\n for (let index = 0; index < rolePrompts.length; index++) {\n const rolePrompt = rolePrompts[index];\n if (isSameContent(index)) {\n break;\n } else {\n prompts.push(rolePrompt);\n }\n }\n\n prompts.push(...userPrompts);\n\n // 删除引用资料\n prompts.forEach(prompt => {\n prompt.content = removeThink(prompt.content);\n prompt.content = removeReferenceDoc(prompt.content);\n });\n\n return prompts;\n });\n\n const chatHelper = new ChatHelper({\n handleStart: handleStartChat,\n handleText: handleTextChat,\n handleReferenceDoc: handleReferenceDocChat,\n handleThink: handleThinkChat,\n handleEnd: handleEndChat,\n handleError: handleErrorChat,\n });\n\n // 设置 currentSession\n function setCurrentSession(session?: T) {\n currentSession.value = session;\n // 空session,不处理\n if (!session?.sessionCode) return;\n\n if (!sessionContentsMap[session.sessionCode]) {\n sessionContentsMap[session.sessionCode] = [];\n }\n sessionContents.value = sessionContentsMap[session.sessionCode];\n }\n\n // 设置 sessionContents\n function setSessionContents(data: ISessionContent[]) {\n if (!currentSession.value) return;\n sessionContentsMap[currentSession.value.sessionCode] = data;\n sessionContents.value = data;\n }\n\n\n // 获取 SessionContent 通过 id\n function getSessionContentById(id: number, sessionCode: string) {\n const sessionContents = getSessionContentsBySessionCode(sessionCode);\n return sessionContents.find(item => item.id === id);\n }\n\n // 获取执行中的 SessionContent(最后一个)\n function getLastSessionContentBySessionCode(sessionCode: string) {\n if (currentSession.value?.sessionCode === sessionCode) {\n return sessionContents.value.at(-1) as ISessionContent;\n }\n return sessionContentsMap[sessionCode]?.at(-1) as ISessionContent;\n }\n\n // 获取 SessionContents\n function getSessionContentsBySessionCode(sessionCode: string) {\n if (currentSession.value?.sessionCode === sessionCode) {\n return sessionContents.value;\n }\n return sessionContentsMap[sessionCode];\n }\n\n // 新增 sessionContent\n function plusSessionContent(sessionCode: string, sessionContent: ISessionContent) {\n const sessionContents = getSessionContentsBySessionCode(sessionCode);\n sessionContents.push(sessionContent);\n }\n\n // 更新 chatContent\n function updateSessionContent(sessionContent: ISessionContent) {\n const currentSessionContents = currentSession.value?.sessionCode === sessionContent.sessionCode\n ? sessionContents.value\n : sessionContentsMap[sessionContent.sessionCode];\n\n const currentSessionContent = currentSessionContents.find(item => +(item.id || 0) === +(sessionContent.id || 0));\n if (currentSessionContent) {\n Object.assign(currentSessionContent, sessionContent);\n }\n }\n\n // 获取待删除的会话id,并从会话列表中删除\n function getDeleteSessionContents(sessionCode: string, sessionContentIds: number[], relatedDelete: boolean) {\n const currentSessionContents = currentSession.value?.sessionCode === sessionCode\n ? sessionContents.value\n : sessionContentsMap[sessionCode];\n const deleteSessionContentIds: number[] = [];\n\n sessionContentIds.forEach((sessionContentId) => {\n const index = currentSessionContents.findIndex(sessionContent => sessionContent.id === sessionContentId);\n if (index > -1) {\n const preSessionContent = currentSessionContents[index - 1];\n const nextSessionContent = currentSessionContents[index + 1];\n const nextNextSessionContent = currentSessionContents[index + 2];\n // 删除当前会话\n currentSessionContents.splice(index, 1);\n deleteSessionContentIds.push(sessionContentId);\n // 如果前一个是 hidden 也需要删除\n if ([SessionContentRole.Hidden].includes(preSessionContent?.role)) {\n const hiddenIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === preSessionContent.id);\n currentSessionContents.splice(hiddenIndex, 1);\n deleteSessionContentIds.push(preSessionContent.id as number);\n }\n // 如果下一个是ai回复,也需要删掉\n if (nextSessionContent?.role === SessionContentRole.Ai\n || (relatedDelete && [\n SessionContentRole.Ai,\n SessionContentRole.Guide,\n SessionContentRole.TokenExpired,\n SessionContentRole.ImageNotSupported,\n SessionContentRole.Pause,\n ].includes(nextSessionContent?.role))\n ) {\n const nextIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === nextSessionContent.id);\n currentSessionContents.splice(nextIndex, 1);\n deleteSessionContentIds.push(nextSessionContent.id as number);\n }\n // 如果下下个是 guide,需要删除\n if ([SessionContentRole.Guide].includes(nextNextSessionContent?.role) && relatedDelete) {\n const nextNextIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === nextNextSessionContent.id);\n currentSessionContents.splice(nextNextIndex, 1);\n deleteSessionContentIds.push(nextNextSessionContent.id as number);\n }\n }\n });\n\n return deleteSessionContentIds;\n }\n\n // 删除聊天内容\n function deleteSessionContent(sessionCode: string, contentId: number) {\n const deleteSessionContentIds = getDeleteSessionContents(sessionCode, [contentId], true);\n return deleteSessionContentIds;\n }\n\n // 批量删除\n function deleteSessionContents(sessionCode: string, contentIds: number[]) {\n const deleteSessionContentIds = getDeleteSessionContents(sessionCode, contentIds, false);\n return deleteSessionContentIds;\n }\n\n // 聊天开始\n function handleStartChat(sessionCode: string) {\n sessionLoadingMap.value[sessionCode] = true;\n const sessionContent: ISessionContent = {\n sessionCode,\n role: SessionContentRole.Ai,\n status: SessionContentStatus.Loading,\n content: startMessage,\n };\n // 画布新增\n plusSessionContent(sessionCode, sessionContent);\n // 调用cb\n return handleStart?.(sessionCode, sessionContent);\n }\n\n // 引用资料\n function handleReferenceDocChat(sessionCode: string, documents: Document[], cover?: boolean) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n const content = getHtmlContentFromDocuments(documents);\n sessionContent.content = cover ? content : sessionContent.content + content;\n return handleReferenceDoc?.(sessionCode, sessionContent);\n }\n\n // 思考\n function handleThinkChat(sessionCode: string, content: string, cover?: boolean, elapsedTime?: number) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n // 获取思考的html\n sessionContent.content = getHtmlContentFromThink(sessionContent.content, content, cover, elapsedTime);\n // 调用cb\n return handleThink?.(sessionCode, sessionContent);\n }\n\n // 文本\n function handleTextChat(sessionCode: string, message: string, cover?: boolean) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n if (sessionContent.content === startMessage) {\n sessionContent.content = message;\n } else if (sessionContent.status === SessionContentStatus.Loading) {\n sessionContent.content = cover\n ? message\n : sessionContent.content + message;\n } else {\n return;\n }\n // 调用cb\n return handleText?.(sessionCode, sessionContent);\n }\n\n // 聊天结束\n function handleEndChat(sessionCode: string, message?: string) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n // 防止 error 的情况下异步触发 end 更新了数据\n if (sessionContent.status === SessionContentStatus.Loading) {\n sessionLoadingMap.value[sessionCode] = false;\n // end 的时候,如果 message 有值,则更新 content\n if (message) {\n sessionContent.content = message;\n }\n // 更新状态\n sessionContent.status = SessionContentStatus.Success;\n // 调用cb\n return handleEnd?.(sessionCode, sessionContent);\n }\n // 内容正在生成中或者正在思考中\n if (sessionContent.content === startMessage || isThinking(sessionContent.content)) {\n handleErrorChat(sessionCode, '聊天内容已中断');\n }\n }\n\n // 聊天异常\n function handleErrorChat(sessionCode: string, message: string, code?: string) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n sessionContent.status = SessionContentStatus.Fail;\n sessionContent.content = message;\n sessionLoadingMap.value[sessionCode] = false;\n // token 超了,提示 token 不足\n if (code === HttpErrorCode.TokenExpired) {\n sessionContent.content = '抱歉,您的剩余 Token 不足,无法返回回答内容,请先清空当前会话(上下文仍会作为历史记录保留))';\n sessionContent.role = SessionContentRole.TokenExpired;\n }\n if (code === HttpErrorCode.ImageNotSupported) {\n sessionContent.content = '抱歉,当前模型不支持图片内容解析';\n sessionContent.role = SessionContentRole.ImageNotSupported;\n }\n // 调用cb\n return handleError?.(sessionCode, sessionContent, code);\n }\n\n // 重新生成对话 仅支持重新生成 ai 的回复\n function reGenerateChat(chatIndex: number) {\n const chat = sessionContents.value[chatIndex];\n if (chat.role !== SessionContentRole.Ai) {\n return;\n }\n\n const message = sessionContents.value[chatIndex - 1].content;\n const cite = sessionContents.value[chatIndex - 1].cite;\n sessionContents.value.splice(chatIndex - 1, 2);\n sendChat({message, cite});\n }\n\n // 聊天\n function chat({\n sessionCode,\n data,\n url,\n headers,\n }: {\n sessionCode: string;\n data?: Record<string, any>;\n url: string;\n headers?: Record<string, string>;\n }) {\n // 发送请求\n chatHelper.stream({\n sessionCode,\n url: url,\n data,\n headers: headers || requestOptions?.headers,\n });\n }\n\n // 重新发送聊天, 需要将当前聊天内容以及下方的所有内容删除\n function reSendChat(index: number, {message, cite}: {message: string, cite?: string}, callback?: () => void) {\n const chat = sessionContents.value[index];\n if (chat.role !== SessionContentRole.User) {\n return;\n }\n\n sessionContents.value.splice(index, sessionContents.value.length - index);\n sendChat({message, cite}, callback);\n }\n\n // 发送聊天\n function sendChat(content: BasicChatContent | ShortcutChatContent, callback?: () => void) {\n if (!currentSession.value?.sessionCode || !requestOptions?.url || currentSessionLoading.value) {\n return;\n }\n\n const {message, cite, shortcut} = content;\n\n let input = '';\n\n if (shortcut) {\n input = processPromptTemplate(shortcut.prompt, cite);\n } else {\n input = cite ? `${message}: \"${cite}\"` : message;\n }\n\n\n sessionContents.value.push({\n sessionCode: currentSession.value?.sessionCode,\n content: message,\n role: SessionContentRole.User,\n status: SessionContentStatus.Success,\n cite,\n });\n\n // 发送请求\n chatHelper.stream({\n sessionCode: currentSession.value?.sessionCode,\n url: requestOptions.url,\n headers: requestOptions?.headers,\n data: {\n inputs: {\n chat_history: prompts.value.slice(0, prompts.value.length - 1),\n input,\n },\n }\n });\n\n callback?.();\n }\n\n /**\n * 删除聊天内容\n * @param index 要删除的聊天内容索引\n * @description \n * - 如果删除的是用户消息,则同时删除该消息及其对应的AI回复(共2条)\n * - 如果删除的是其他类型消息(如AI回复),则只删除该条消息\n */\n function deleteChat(index: number) {\n const chat = sessionContents.value[index];\n if (chat.role === SessionContentRole.User) {\n sessionContents.value.splice(index, 2);\n return;\n }\n\n sessionContents.value.splice(index-1, 2);\n }\n\n // 停止聊天\n function stopChat(sessionCode: string) {\n chatHelper.stop(sessionCode);\n }\n\n return {\n currentSession,\n sessionContents,\n sessionContentsMap,\n sessionLoadingMap,\n prompts,\n currentSessionLoading,\n chat,\n sendChat,\n stopChat,\n plusSessionContent,\n updateSessionContent,\n getSessionContentById,\n getLastSessionContentBySessionCode,\n getSessionContentsBySessionCode,\n setCurrentSession,\n setSessionContents,\n deleteSessionContent,\n deleteSessionContents,\n handleStartChat,\n handleErrorChat,\n reGenerateChat,\n reSendChat,\n deleteChat,\n };\n};","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport {\n handleCopy,\n handleDownLoad,\n} from '../common/util';\n\ntype FullScreenWrap = HTMLElement & {\n _originalParent: Node;\n _originalNextSibling: Node;\n};\n\n// 全局点击代理事件\nexport const useClickProxy = () => {\n const clickProxy = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // 聊天窗里面的引用资料和思考内容\n if (target?.classList.contains('bkaidev-angle-up')) {\n const parent = target?.parentElement;\n if (parent?.classList.contains('closed')) {\n parent?.classList.remove('closed');\n } else {\n parent?.classList.add('closed');\n }\n }\n if (target?.classList.contains('click-close')) {\n if (target?.classList.contains('closed')) {\n target?.classList.remove('closed');\n } else {\n target?.classList.add('closed');\n }\n }\n // 会话里面代码块的全屏\n if (target?.classList.contains('click-full-screen')) {\n // 获取全屏的父元素\n const fullScreenWrap = target?.parentElement?.parentElement?.parentElement as FullScreenWrap;\n // 添加 class\n fullScreenWrap?.classList.add('full-screen');\n // 元素移动到body\n if (!fullScreenWrap._originalParent) {\n fullScreenWrap._originalParent = fullScreenWrap.parentNode as Node;\n fullScreenWrap._originalNextSibling = fullScreenWrap.nextSibling as Node;\n }\n document.body.appendChild(fullScreenWrap);\n }\n // 会话里面代码块的取消全屏\n if (target?.classList.contains('click-un-full-screen')) {\n // 获取全屏的父元素\n const fullScreenWrap = target?.parentElement?.parentElement?.parentElement as FullScreenWrap;\n // 移除 class\n fullScreenWrap?.classList.remove('full-screen');\n // 移回原位\n if (fullScreenWrap._originalNextSibling) {\n fullScreenWrap._originalParent.insertBefore(fullScreenWrap, fullScreenWrap._originalNextSibling);\n } else {\n fullScreenWrap._originalParent.appendChild(fullScreenWrap);\n }\n }\n // 复制\n if (target?.classList.contains('click-copy')) {\n const text = target?.getAttribute('data-clipboard-text');\n if (text) {\n handleCopy(decodeURIComponent(text));\n }\n }\n // 下载\n if (target?.classList.contains('click-download')) {\n const text = target?.getAttribute('data-clipboard-text');\n const fileName = target?.getAttribute('data-file-name');\n if (text && fileName) {\n handleDownLoad(decodeURIComponent(text), fileName);\n }\n }\n };\n\n const addClickProxy = () => {\n window.addEventListener('click', clickProxy);\n };\n\n const removeClickProxy = () => {\n window.removeEventListener('click', clickProxy);\n };\n\n onBeforeMount(() => {\n addClickProxy();\n });\n\n onBeforeUnmount(() => {\n removeClickProxy();\n });\n};\n","import {\n useReferenceDoc,\n} from \"./use-reference-doc\";\nimport {\n useThink,\n} from \"./use-think\";\n\n// ai 样式。注意:全局引入一次即可\nexport const useStyle = () => {\n // 引入样式\n require('../css/style.css');\n require('../css/iconcool.js');\n // 引用资料\n useReferenceDoc();\n // 思考\n useThink();\n};\n","import type {\n SummaryCallbacks,\n} from '../types/type.ts';\nimport {\n SessionPromptRole,\n} from '../types/enum';\nimport {\n removeReferenceDoc,\n} from '../hooks/use-reference-doc';\nimport {\n removeThink,\n} from '../hooks/use-think';\nimport {\n ChatHelper,\n} from '../common/chart-helper';\n\n// ai 总结\nexport const useSummary = ({\n handleStart,\n handleEnd,\n handleError,\n}: SummaryCallbacks = {}) => {\n let summaryText = '';\n\n const handleStartChat = () => {\n summaryText = '';\n return handleStart?.();\n };\n\n const handleTextChat = (sessionCode: string, message: string, cover?: boolean) => {\n if (cover || summaryText === '正在思考...') {\n summaryText = message;\n } else {\n summaryText += message;\n }\n };\n\n const handleEndChat = () => {\n if (summaryText === '无话可说') {\n summaryText = '';\n }\n return handleEnd?.(summaryText);\n };\n\n const handleErrorChat = (sessionCode: string, message: string, code?: string) => {\n return handleError?.(message, code);\n };\n\n const chatHelper = new ChatHelper({\n handleStart: handleStartChat,\n handleText: handleTextChat,\n handleEnd: handleEndChat,\n handleError: handleErrorChat,\n });\n\n const summary = ({\n content,\n url,\n headers,\n model,\n }: {\n content: string;\n url: string;\n headers?: Record<string, string>;\n model?: string;\n }) => {\n const filterContent = removeThink(removeReferenceDoc(content));\n const prompts = [\n {\n role: SessionPromptRole.User,\n content: `你是一个总结大师,请帮助我对下面这段话进行总结。要求总结精炼,不超过 15 个字!且末尾没有标点符号!请注意:如果你无法总结,请回复“无话可说”!\\n文字如下:\\n${filterContent}`,\n },\n ];\n \n chatHelper.stream({\n sessionCode: 'summary',\n url,\n data: {\n prompts,\n model,\n },\n headers,\n });\n };\n\n return {\n summary,\n };\n}"],"names":["SessionPromptRole","SessionContentStatus","SessionContentRole","HttpErrorCode","transferSessionContent2SessionPrompt","sessionContent","sessionRoleMap","Ai","Assistant","User","System","Hidden","Guide","Time","Role","HiddenAi","HiddenAssistant","HiddenGuide","HiddenRole","HiddenSystem","HiddenUser","TemplateAi","TemplateAssistant","TemplateGuide","TemplateRole","TemplateSystem","TemplateUser","TemplateHidden","Pause","TokenExpired","ImageNotSupported","UserImage","content","role","isJSON","str","JSON","parse","e","removeReferenceDoc","replace","useReferenceDoc","styleEle","onBeforeMount","document","createElement","textContent","oldStyle","head","appendChild","onBeforeUnmount","remove","getHtmlContentFromThink","chatContent","cover","elapsedTime","htmlContent","includes","thinkBodyMatch","match","thinkContent","newThinkContent","val","hours","Math","floor","minutes","seconds","milliseconds","parts","push","toFixed","join","durationFormatter","removeThink","afterRemoveThinkBody","trim","useThink","ChatHelper","constructor","handleStart","handleText","handleReferenceDoc","handleThink","handleEnd","handleError","__publicField","this","controllerMap","stream","_0","__async","arguments","sessionCode","url","headers","data","_a","call","controller","AbortController","fetch","method","signal","__spreadValues","mode","credentials","body","stringify","then","response","reader","pipeThrough","window","TextDecoderStream","getReader","temp","value","done","read","ok","statusText","status","toString","split","forEach","item","event","documents","result","code","elapsed_time","message","_b","error","stop","abort","requestOptions","startMessage","currentSession","ref","sessionLoadingMap","sessionContents","sessionContentsMap","calculatedSessionContents","computed","index","length","nextAiSessionContentIndex","nextAiSessionContent","Fail","unshift","currentSessionLoading","prompts","rolePrompts","userPrompts","latestMatchIndex","findLastIndex","some","key","_c","roleInfo","roleContent","nextSessionContent","map","isSameContent","startIndex","isSame","rolePrompt","prompts2","prompt","chatHelper","handleStartChat","getLastSessionContentBySessionCode","Loading","path","file_path","filePath","display_name","displayName","preview_path","previewPath","metadata","title","pop","getHtmlContentFromDocuments","Success","isStartThinking","isEmptyThinking","isThinking","handleErrorChat","at","getSessionContentsBySessionCode","plusSessionContent","getDeleteSessionContents","sessionContentIds","relatedDelete","currentSessionContents","deleteSessionContentIds","sessionContentId","findIndex","id","preSessionContent","nextNextSessionContent","splice","hiddenIndex","nextIndex","nextNextIndex","sendChat","callback","cite","shortcut","input","selectedText","inputs","chat_history","slice","chat","stopChat","updateSessionContent","currentSessionContent","find","Object","assign","getSessionContentById","setCurrentSession","session","setSessionContents","deleteSessionContent","contentId","deleteSessionContents","contentIds","reGenerateChat","chatIndex","reSendChat","deleteChat","clickProxy","target","classList","contains","parent","parentElement","add","fullScreenWrap","_originalParent","parentNode","_originalNextSibling","nextSibling","_d","insertBefore","text","getAttribute","textarea","select","execCommand","Message","theme","removeChild","handleCopy","decodeURIComponent","fileName","source","filename","downloadEl","blob","Blob","download","href","URL","createObjectURL","style","display","click","handleDownLoad","addEventListener","removeEventListener","require","summaryText","summary","model","filterContent"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"main.umd.js","sources":["../src/types/enum.ts","../src/common/type-transform.ts","../src/common/util.ts","../src/hooks/use-reference-doc.ts","../src/hooks/use-think.ts","../src/common/chart-helper.ts","../src/hooks/use-chat.ts","../src/hooks/use-click-proxy.ts","../src/hooks/use-style.ts","../src/hooks/use-summary.ts"],"sourcesContent":["// 传给 ai 的类型\nexport enum SessionPromptRole {\n System = 'system',\n Assistant = 'assistant',\n User = 'user',\n Guide = 'guide',\n Pause = 'pause',\n UserImage = 'user-image',\n Hidden = 'hidden',\n HiddenUser = 'hidden-user',\n HiddenAssistant = 'hidden-assistant',\n HiddenSystem = 'hidden-system',\n HiddenGuide = 'hidden-guide',\n TemplateUser = 'template-user',\n TemplateAssistant = 'template-assistant',\n TemplateSystem = 'template-system',\n TemplateGuide = 'template-guide',\n TemplateHidden = 'template-hidden',\n}\n\nexport enum SessionContentStatus {\n Fail = 'fail',\n Loading = 'loading',\n Success = 'success',\n}\n\nexport enum SessionContentRole {\n Ai = 'ai',\n User = 'user',\n Time = 'time',\n System = 'system',\n Role = 'role',\n Hidden = 'hidden',\n Guide = 'guide',\n Pause = 'pause',\n TokenExpired = 'token-expired',\n UserImage = 'user-image',\n HiddenUser = 'hidden-user',\n HiddenAi = 'hidden-ai',\n HiddenRole = 'hidden-role',\n HiddenGuide = 'hidden-guide',\n TemplateUser = 'template-user',\n TemplateAi = 'template-ai',\n TemplateRole = 'template-role',\n TemplateGuide = 'template-guide',\n TemplateHidden = 'template-hidden',\n ImageNotSupported = 'image-not-supported'\n}\n\nexport enum HttpErrorCode {\n TokenExpired = '80003',\n ImageNotSupported = '82003',\n UnAuthorizedPreviewFile = '80401',\n TagRepeat = '1513405',\n Aborted = 20,\n UnLogin = 401,\n IamNoPermission = 'IAM_NO_PERMISSION'\n}\n","import {\n SessionContentRole,\n SessionPromptRole,\n} from '../types/enum';\nimport type {\n ISessionContent,\n ISessionPrompt,\n} from '../types/type';\n\n/**\n * 将 sessionContent 转换为 sessionPrompt\n * @param sessionContent sessionContent\n * @returns sessionPrompt\n */\nexport const transferSessionContent2SessionPrompt = (sessionContent: ISessionContent): ISessionPrompt => {\n const sessionRoleMap = {\n [SessionContentRole.Ai]: SessionPromptRole.Assistant,\n [SessionContentRole.User]: SessionPromptRole.User,\n [SessionContentRole.System]: SessionPromptRole.System,\n [SessionContentRole.Hidden]: SessionPromptRole.Hidden,\n [SessionContentRole.Guide]: SessionPromptRole.Guide,\n [SessionContentRole.Time]: SessionPromptRole.System,\n [SessionContentRole.Role]: SessionPromptRole.System,\n [SessionContentRole.HiddenAi]: SessionPromptRole.HiddenAssistant,\n [SessionContentRole.HiddenGuide]: SessionPromptRole.HiddenGuide,\n [SessionContentRole.HiddenRole]: SessionPromptRole.HiddenSystem,\n [SessionContentRole.HiddenUser]: SessionPromptRole.HiddenUser,\n [SessionContentRole.TemplateAi]: SessionPromptRole.TemplateAssistant,\n [SessionContentRole.TemplateGuide]: SessionPromptRole.TemplateGuide,\n [SessionContentRole.TemplateRole]: SessionPromptRole.TemplateSystem,\n [SessionContentRole.TemplateUser]: SessionPromptRole.TemplateUser,\n [SessionContentRole.TemplateHidden]: SessionPromptRole.TemplateHidden,\n [SessionContentRole.Pause]: SessionPromptRole.Pause,\n [SessionContentRole.TokenExpired]: SessionPromptRole.Pause,\n [SessionContentRole.ImageNotSupported]: SessionPromptRole.Pause,\n [SessionContentRole.UserImage]: SessionPromptRole.UserImage,\n };\n return {\n content: sessionContent.content,\n role: sessionRoleMap[sessionContent.role],\n };\n};\n","import {\n Message,\n} from 'bkui-vue';\n\n/**\n * 判断是否是 JSON 字符串\n * @param str 字符串\n * @returns 是否是 JSON 字符串\n */\nexport const isJSON = (str: string) => {\n try {\n JSON.parse(str);\n return true;\n } catch (e) {\n return false;\n }\n};\n\n/**\n * 响应时间格式化\n * @param val 待格式化时间,xxms\n * @returns 格式化后的时间,xx小时xx分钟xx秒\n */\nexport function durationFormatter(val: number) {\n const hours = Math.floor(val / 3600000);\n const minutes = Math.floor((val % 3600000) / 60000);\n const seconds = Math.floor((val % 60000) / 1000);\n const milliseconds = val % 1000;\n\n const parts: string[] = [];\n if (hours > 0) {\n parts.push(`${hours}h`);\n }\n if (minutes > 0) {\n parts.push(`${minutes}min`);\n }\n if (seconds > 0) {\n parts.push(`${seconds}s`);\n }\n if (milliseconds > 0) {\n parts.push(`${milliseconds.toFixed(2)}ms`);\n }\n\n return parts.join(' ');\n}\n\n/**\n * 前端下载文件\n * @param {*} source 文件内容\n * @param {*} filename 文件名\n */\nexport function handleDownLoad(source: string, filename = 'ai.txt') {\n const downloadEl = document.createElement('a');\n const blob = new Blob([source]);\n downloadEl.download = filename;\n downloadEl.href = URL.createObjectURL(blob);\n downloadEl.style.display = 'none';\n document.body.appendChild(downloadEl);\n downloadEl.click();\n document.body.removeChild(downloadEl);\n}\n\nexport const handleCopy = (text: string) => {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n document.body.appendChild(textarea);\n textarea.select();\n document.execCommand('copy');\n Message({\n theme: 'success',\n message: '复制成功',\n });\n document.body.removeChild(textarea);\n};\n\n/**\n * 处理提示词模板,替换模板中的变量\n * @param prompt 提示词模板\n * @param selectedText 选中的文本\n * @returns 处理后的提示词\n */\nexport const processPromptTemplate = (prompt: string, selectedText: string) => {\n return prompt.replace(/\\{\\{\\s*SELECTED_TEXT\\s*\\}\\}/g, selectedText || '');\n};","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport type {\n Document,\n} from '../types/type';\n\n/**\n * 获取引用资料的 HTML 内容\n * @param documents\n * @returns\n */\nexport const getHtmlContentFromDocuments = (documents: Document[]) => {\n let htmlContent = `<section class=\"knowledge-head click-close\">\n <svg\n class=\"ai-ui-sdk-wenzhang\"\n >\n <use href=\"#ai-ui-sdk-wenzhang\"></use>\n </svg>\n 找到 ${documents.length} 篇资料参考\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-angle-up\"></i>\n </section>\n <ul class=\"knowledge-body\">`;\n documents.forEach((document) => {\n const { path, file_path: filePath, display_name: displayName, preview_path: previewPath } = document.metadata;\n const title = displayName || filePath.split('/').pop();\n htmlContent += `<li\n class=\"knowledge-item\"\n >\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-zhishiku\"></i>\n <a href=\"${previewPath}\" title=\"${title} (${previewPath})\" target=\"_blank\" class=\"knowledge-link g-flex-truncate\">\n ${title}\n </a>\n <a href=\"${path}\" title=\"预览原文\" target=\"_blank\" class=\"knowledge-link hover-show\">\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-yanjing-kejian\"></i>\n </a>\n </li>`;\n });\n htmlContent += '</ul>';\n return htmlContent;\n};\n\n/**\n * 移除引用资料的 HTML 内容\n * @param content\n * @returns\n */\nexport const removeReferenceDoc = (content: string) => {\n return content\n .replace(/<section class=\"knowledge-head click-close\">[\\s\\S]*?<\\/section>/, '')\n .replace(/<ul class=\"knowledge-body\">[\\s\\S]*?<\\/ul>/, '')\n .replace(/<section class=\"knowledge-tips\">[\\s\\S]*?<\\/section>/, '');\n};\n\nexport const useReferenceDoc = () => {\n let styleEle: HTMLStyleElement | null = null;\n\n const addReferenceDocStyle = () => {\n // 旧版知识样式\n const oldStyle = `.knowledge-tips {\n position: relative;\n padding: 6px 8px;\n margin-bottom: 14px;\n line-height: 22px;\n background: #f5f7fa;\n border-radius: 4px;\n\n &.closed {\n .bkaidev-angle-up {\n transform: rotate(180deg);\n }\n\n .knowledge-summary {\n margin-bottom: 0;\n }\n\n .knowledge-link {\n display: none;\n }\n }\n\n .bkaidev-angle-up {\n position: absolute;\n top: 4px;\n right: 0px;\n font-size: 22px;\n color: #979ba5;\n cursor: pointer;\n }\n\n .bkaidev-help-document {\n margin-right: 4px;\n font-size: 19px;\n color: #3a84ff;\n }\n\n .knowledge-summary {\n display: block;\n margin-bottom: 4px;\n color: #313238;\n }\n\n .knowledge-link {\n display: block;\n color: #3a84ff;\n text-decoration: none;\n cursor: pointer;\n\n .bkaidev-cc-jump-link {\n font-size: 14px;\n }\n\n &:last-child {\n margin-bottom: 2px;\n }\n }\n }`;\n // 新版知识样式\n const newStyle = `.knowledge-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n\n .ai-ui-sdk-wenzhang {\n width: 14px;\n height: 14px;\n margin-right: 6px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .knowledge-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .knowledge-body {\n background: #F5F7FA;\n padding: 16px 0 !important;\n .knowledge-item {\n padding-left: 10px;\n display: flex;\n align-items: center;\n line-height: 28px;\n .hover-show {\n display: none;\n }\n a {\n margin-right: 10px;\n &:has(i) {\n padding: 0 10px;\n margin-right: 0;\n text-decoration: none !important;\n }\n }\n .ai-ui-sdk-zhishiku {\n color: #D66F6B;\n font-size: 14px;\n margin-right: 6px;\n }\n &:hover {\n background: #EAEBF0;\n .hover-show {\n display: inline;\n }\n }\n }\n }`;\n styleEle = document.createElement('style');\n styleEle.textContent = oldStyle + newStyle;\n document.head.appendChild(styleEle);\n };\n\n const removeReferenceDocStyle = () => {\n if (styleEle) {\n styleEle.remove();\n styleEle = null;\n }\n };\n\n onBeforeMount(() => {\n addReferenceDocStyle();\n });\n\n onBeforeUnmount(() => {\n removeReferenceDocStyle();\n });\n};\n","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport {\n durationFormatter,\n} from '../common/util';\n\n/**\n * 获取思考的 HTML 内容\n * @param chatContent 聊天内容\n * @param content 思考内容\n * @param elapsedTime 思考时间\n * @returns 完整的 chatContent\n */\nexport const getHtmlContentFromThink = (chatContent: string, content: string, cover?: boolean, elapsedTime?: number) => {\n let htmlContent = (chatContent === '内容正在生成中...' || cover) ? '' : chatContent;\n // 思考开始\n if (!htmlContent.includes('<section class=\"think-head click-close\">')) {\n htmlContent += `<section class=\"think-head click-close\">\n <i class=\"ai-ui-sdk-icon ai-ui-sdk-sikao\"></i>思考中...<i class=\"ai-ui-sdk-icon ai-ui-sdk-angle-up\"></i>\n </section>\n <section class=\"think-body\">\n ${content}\n</section>`;\n } else {\n // 补充思考内容\n const thinkBodyMatch = htmlContent.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>/);\n if (thinkBodyMatch) {\n // 原有思考内容\n const thinkContent = thinkBodyMatch[1];\n // 在最后的换行符前面添加新的思考内容\n const newThinkContent = thinkContent.replace(/\\n$/g, `${content}\\n`);\n htmlContent = htmlContent.replace(\n thinkContent,\n newThinkContent,\n );\n }\n }\n // 思考结束\n if (elapsedTime) {\n htmlContent = htmlContent.replace('思考中...', `已完成思考 (耗时:${durationFormatter(elapsedTime)})`);\n }\n return htmlContent;\n};\n\n/**\n * 移除思考的 HTML 内容\n * @param content\n * @returns\n */\nexport const removeThink = (content: string) => {\n // 移除思考头部\n const afterRemoveThinkHead = content.replace(/<section class=\"think-head click-close\">[\\s\\S]*<\\/section>/, '');\n // 移除思考内容\n let afterRemoveThinkBody = afterRemoveThinkHead.replace(/<section class=\"think-body\">[\\s\\S]*<\\/section>/, '');\n // 如果内容只有思考,那就给ai传递思考内容\n if (afterRemoveThinkBody.trim() === '') {\n const thinkBodyMatch = content.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>/);\n if (thinkBodyMatch) {\n [, afterRemoveThinkBody] = thinkBodyMatch;\n }\n }\n return afterRemoveThinkBody;\n};\n\n/**\n * 判断是否是思考中\n * @param content\n * @returns\n */\nexport const isThinking = (content: string) => {\n // 是否开始思考\n const isStartThinking = content === '正在思考...';\n // 判断是否空思考\n const thinkBodyMatch = content.match(/<section class=\"think-body\">([\\s\\S]*?)<\\/section>$/);\n const isEmptyThinking = thinkBodyMatch && thinkBodyMatch[1].trim() === '';\n\n return isStartThinking || isEmptyThinking;\n};\n\n// 思考\nexport const useThink = () => {\n let styleEle: HTMLStyleElement | null = null;\n\n const addThinkStyle = () => {\n const style = `.think-head {\n display: flex;\n align-items: center;\n padding: 0 8px 0 6px;\n margin-bottom: 8px;\n line-height: 28px;\n background: #F0F1F5;\n border-radius: 4px;\n font-size: 12px;\n color: #313238;\n cursor: pointer;\n width: fit-content;\n .ai-ui-sdk-sikao {\n font-size: 14px;\n color: #979ba5;\n margin-right: 4px;\n }\n\n .ai-ui-sdk-angle-up {\n font-size: 22px;\n color: #4D4F56;\n margin-left: 4px;\n }\n\n &.closed {\n margin-bottom: 16px;\n\n .ai-ui-sdk-angle-up {\n transform: rotate(180deg);\n }\n\n &~ .think-body {\n display: none;\n }\n }\n\n &:hover {\n background: #EAEBF0;\n }\n }\n .think-body {\n background: #F5F7FA;\n color: #979BA5;\n padding: 16px;\n margin-bottom: 16px;\n &~ .knowledge-head {\n margin-bottom: 8px;\n }\n }`;\n styleEle = document.createElement('style');\n styleEle.textContent = style;\n document.head.appendChild(styleEle);\n };\n\n const removeThinkStyle = () => {\n if (styleEle) {\n styleEle.remove();\n styleEle = null;\n }\n };\n\n onBeforeMount(() => {\n addThinkStyle();\n });\n\n onBeforeUnmount(() => {\n removeThinkStyle();\n });\n};\n","import {\n isJSON,\n} from './util';\n\nimport type {\n Document,\n} from '../types/type';\n\ntype HandleStart = (sessionCode: string) => any;\ntype HandleText = (sessionCode: string, message: string, cover?: boolean) => void;\ntype HandleReferenceDoc = (sessionCode: string, documents: Document[], cover?: boolean) => void;\ntype HandleThink = (sessionCode: string, content: string, cover?: boolean, elapsed_time?: number) => void;\ntype HandleEnd = (sessionCode: string, message?: string) => void;\ntype HandleError = (sessionCode: string, message: string, code: string) => any;\n\nexport class ChatHelper {\n handleStart: HandleStart;\n handleText: HandleText;\n handleReferenceDoc?: HandleReferenceDoc;\n handleThink?: HandleThink;\n handleEnd: HandleEnd;\n handleError: HandleError;\n controllerMap: Record<string, AbortController>;\n\n constructor({\n handleStart,\n handleText,\n handleReferenceDoc,\n handleThink,\n handleEnd,\n handleError,\n }: {\n handleStart: HandleStart;\n handleText: HandleText;\n handleReferenceDoc?: HandleReferenceDoc;\n handleThink?: HandleThink;\n handleEnd: HandleEnd;\n handleError: HandleError;\n }) {\n this.handleStart = handleStart;\n this.handleText = handleText;\n this.handleReferenceDoc = handleReferenceDoc;\n this.handleThink = handleThink;\n this.handleEnd = handleEnd;\n this.handleError = handleError;\n this.controllerMap = {};\n }\n\n async stream({\n sessionCode,\n url,\n headers,\n data,\n }: {\n sessionCode: string;\n url: string;\n headers?: Record<string, string>;\n data?: Record<string, any>;\n }) {\n // 开始\n await this.handleStart?.(sessionCode);\n // 记录 controller\n const controller = new AbortController();\n this.controllerMap[sessionCode] = controller;\n // 发送请求\n fetch(url, {\n method: 'post',\n signal: controller.signal,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n mode: 'cors',\n credentials: 'include',\n body: JSON.stringify(data),\n })\n .then(async (response: any) => {\n const reader = response.body\n .pipeThrough(new window.TextDecoderStream())\n .getReader();\n\n // 临时存储数据\n let temp = '';\n\n while (true) {\n try {\n const { value, done } = await reader.read();\n\n // 接口异常处理\n if (!response.ok) {\n this.handleError(sessionCode, value || response.statusText, response.status);\n break;\n }\n // 接口完成\n if (done) {\n this.handleEnd(sessionCode);\n break;\n }\n\n const values = (temp + value.toString()).split('\\n');\n values.forEach((value) => {\n const item = value.replace('data:', '').trim();\n if (isJSON(item)) {\n const {\n event,\n content,\n cover,\n documents,\n result,\n code,\n elapsed_time,\n message,\n } = JSON.parse(item);\n // 业务错误处理\n if (result === false || response.status !== 200) {\n this.handleError(sessionCode, message || '模型调用失败', code);\n return;\n }\n\n switch (event) {\n case 'text':\n this.handleText(sessionCode, content, cover);\n break;\n case 'reference_doc':\n this.handleReferenceDoc?.(sessionCode, documents, cover);\n break;\n case 'think':\n this.handleThink?.(sessionCode, content, cover, elapsed_time);\n break;\n case 'done':\n this.handleEnd(sessionCode, cover ? content : '');\n break;\n case 'error':\n this.handleError(sessionCode, message || '模型调用失败', code);\n break;\n }\n temp = '';\n } else if (item) {\n temp = item;\n }\n });\n } catch (error: any) {\n if (error?.code !== 20) {\n this.handleError(sessionCode, `模型调用失败:${error.message}`, error.code);\n }\n break;\n }\n }\n });\n }\n\n stop(sessionCode: string) {\n this.controllerMap[sessionCode]?.abort?.();\n return this.handleEnd(sessionCode);\n }\n}\n","import {\n ref,\n computed,\n} from 'vue';\nimport type {\n Document,\n ISessionContent,\n ISession,\n ISessionPrompt,\n ChatCallbacks,\n BasicChatContent,\n ShortcutChatContent,\n} from '../types/type.ts';\nimport { processPromptTemplate } from '../common/util';\nimport {\n HttpErrorCode,\n SessionContentRole,\n SessionContentStatus,\n} from '../types/enum';\nimport {\n getHtmlContentFromDocuments,\n removeReferenceDoc,\n} from '../hooks/use-reference-doc';\nimport {\n getHtmlContentFromThink,\n isThinking,\n removeThink,\n} from '../hooks/use-think';\nimport {\n ChatHelper,\n} from '../common/chart-helper';\nimport {\n transferSessionContent2SessionPrompt,\n} from '../common/type-transform';\n\ntype SessionContentsMap = {\n [key: string]: ISessionContent[]\n};\n\ntype SessionLoadingMap = {\n [key: string]: boolean\n};\n\n// ai 聊天\nexport const useChat = <T extends ISession = ISession>({\n handleStart,\n handleText,\n handleReferenceDoc,\n handleThink,\n handleEnd,\n handleError,\n requestOptions,\n}: ChatCallbacks = {}) => {\n const startMessage = '内容正在生成中...';\n // 聊天上下文\n const currentSession = ref<T>();\n const sessionLoadingMap = ref<SessionLoadingMap>({});\n const sessionContents = ref<ISessionContent[]>([]);\n const sessionContentsMap: SessionContentsMap = {};\n\n // 通过计算得到的会话列表\n const calculatedSessionContents = computed<ISessionContent[]>(() => {\n const calculatedSessionContents: ISessionContent[] = [];\n for (let index = sessionContents.value.length - 1; index >= 0; index--) {\n const sessionContent = sessionContents.value[index];\n // 向下找到下一个ai回复\n let nextAiSessionContentIndex = index + 1;\n let nextAiSessionContent = sessionContents.value[nextAiSessionContentIndex];\n while (nextAiSessionContent && ![\n SessionContentRole.Ai,\n SessionContentRole.TokenExpired,\n SessionContentRole.ImageNotSupported,\n SessionContentRole.Pause,\n SessionContentRole.Guide,\n ].includes(nextAiSessionContent.role)\n ) {\n nextAiSessionContentIndex += 1;\n nextAiSessionContent = sessionContents.value[nextAiSessionContentIndex];\n }\n\n // 系统消息,退出\n if (sessionContent.role === SessionContentRole.System) {\n break;\n }\n\n // 倒叙添加当前聊天上下文 排除异常答复、异常问题 & 系统消息和时间消息\n if (sessionContent.status !== SessionContentStatus.Fail\n && !(nextAiSessionContent?.status === SessionContentStatus.Fail\n && [SessionContentRole.User, SessionContentRole.UserImage].includes(sessionContent.role)\n )\n && ![SessionContentRole.Time, SessionContentRole.System].includes(sessionContent.role)\n ) {\n calculatedSessionContents.unshift(sessionContent);\n }\n }\n\n return calculatedSessionContents;\n });\n\n // 当前会话是否正在加载\n const currentSessionLoading = computed(() => {\n const sessionCode = currentSession.value?.sessionCode;\n return sessionCode ? sessionLoadingMap.value[sessionCode] : false;\n });\n\n // 计算当前的 prompt\n const prompts = computed<ISessionPrompt[]>(() => {\n const rolePrompts: ISessionPrompt[] = [];\n const userPrompts: ISessionPrompt[] = [];\n const prompts: ISessionPrompt[] = [];\n\n // build rolePrompts\n const latestMatchIndex = sessionContents.value.findLastIndex(sessionContent => (\n sessionContent.role === SessionContentRole.System && ['已启用角色', '已启用模型'].some(key => sessionContent.content.includes(key))\n ));\n let index = 0;\n currentSession.value?.roleInfo?.content?.forEach((roleContent) => {\n const sessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n let nextSessionContent = sessionContents.value[latestMatchIndex + 2 + index];\n if (sessionContent?.content === roleContent.content && sessionContent.role !== SessionContentRole.System) {\n rolePrompts.push(transferSessionContent2SessionPrompt(sessionContent));\n index += 1;\n if (sessionContent?.role === SessionContentRole.Pause) {\n while (nextSessionContent && nextSessionContent.role === SessionContentRole.System) {\n index += 1;\n nextSessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n }\n while (nextSessionContent\n && [SessionContentRole.User, SessionContentRole.UserImage].includes(nextSessionContent.role)\n ) {\n rolePrompts.push(transferSessionContent2SessionPrompt(nextSessionContent));\n index += 1;\n nextSessionContent = sessionContents.value[latestMatchIndex + 1 + index];\n }\n }\n }\n });\n\n // build userPrompts\n userPrompts.push(...calculatedSessionContents.value.map(transferSessionContent2SessionPrompt));\n\n const isSameContent = (startIndex: number) => {\n let isSame = true;\n for (let index = startIndex; index < rolePrompts.length; index++) {\n const rolePrompt = rolePrompts[index];\n if (rolePrompt.content !== userPrompts[index - startIndex]?.content) {\n isSame = false;\n }\n }\n\n return isSame;\n };\n\n // 排除在一个系统消息里面,重复的情况\n for (let index = 0; index < rolePrompts.length; index++) {\n const rolePrompt = rolePrompts[index];\n if (isSameContent(index)) {\n break;\n } else {\n prompts.push(rolePrompt);\n }\n }\n\n prompts.push(...userPrompts);\n\n // 删除引用资料\n prompts.forEach(prompt => {\n prompt.content = removeThink(prompt.content);\n prompt.content = removeReferenceDoc(prompt.content);\n });\n\n return prompts;\n });\n\n const chatHelper = new ChatHelper({\n handleStart: handleStartChat,\n handleText: handleTextChat,\n handleReferenceDoc: handleReferenceDocChat,\n handleThink: handleThinkChat,\n handleEnd: handleEndChat,\n handleError: handleErrorChat,\n });\n\n // 设置 currentSession\n function setCurrentSession(session?: T) {\n currentSession.value = session;\n // 空session,不处理\n if (!session?.sessionCode) return;\n\n if (!sessionContentsMap[session.sessionCode]) {\n sessionContentsMap[session.sessionCode] = [];\n }\n sessionContents.value = sessionContentsMap[session.sessionCode];\n }\n\n // 设置 sessionContents\n function setSessionContents(data: ISessionContent[]) {\n if (!currentSession.value) return;\n sessionContentsMap[currentSession.value.sessionCode] = data;\n sessionContents.value = data;\n }\n\n\n // 获取 SessionContent 通过 id\n function getSessionContentById(id: number, sessionCode: string) {\n const sessionContents = getSessionContentsBySessionCode(sessionCode);\n return sessionContents.find(item => item.id === id);\n }\n\n // 获取执行中的 SessionContent(最后一个)\n function getLastSessionContentBySessionCode(sessionCode: string) {\n if (currentSession.value?.sessionCode === sessionCode) {\n return sessionContents.value.at(-1) as ISessionContent;\n }\n return sessionContentsMap[sessionCode]?.at(-1) as ISessionContent;\n }\n\n // 获取 SessionContents\n function getSessionContentsBySessionCode(sessionCode: string) {\n if (currentSession.value?.sessionCode === sessionCode) {\n return sessionContents.value;\n }\n return sessionContentsMap[sessionCode];\n }\n\n // 新增 sessionContent\n function plusSessionContent(sessionCode: string, sessionContent: ISessionContent) {\n const sessionContents = getSessionContentsBySessionCode(sessionCode);\n sessionContents.push(sessionContent);\n }\n\n // 更新 chatContent\n function updateSessionContent(sessionContent: ISessionContent) {\n const currentSessionContents = currentSession.value?.sessionCode === sessionContent.sessionCode\n ? sessionContents.value\n : sessionContentsMap[sessionContent.sessionCode];\n\n const currentSessionContent = currentSessionContents.find(item => +(item.id || 0) === +(sessionContent.id || 0));\n if (currentSessionContent) {\n Object.assign(currentSessionContent, sessionContent);\n }\n }\n\n // 获取待删除的会话id,并从会话列表中删除\n function getDeleteSessionContents(sessionCode: string, sessionContentIds: number[], relatedDelete: boolean) {\n const currentSessionContents = currentSession.value?.sessionCode === sessionCode\n ? sessionContents.value\n : sessionContentsMap[sessionCode];\n const deleteSessionContentIds: number[] = [];\n\n sessionContentIds.forEach((sessionContentId) => {\n const index = currentSessionContents.findIndex(sessionContent => sessionContent.id === sessionContentId);\n if (index > -1) {\n const preSessionContent = currentSessionContents[index - 1];\n const nextSessionContent = currentSessionContents[index + 1];\n const nextNextSessionContent = currentSessionContents[index + 2];\n // 删除当前会话\n currentSessionContents.splice(index, 1);\n deleteSessionContentIds.push(sessionContentId);\n // 如果前一个是 hidden 也需要删除\n if ([SessionContentRole.Hidden].includes(preSessionContent?.role)) {\n const hiddenIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === preSessionContent.id);\n currentSessionContents.splice(hiddenIndex, 1);\n deleteSessionContentIds.push(preSessionContent.id as number);\n }\n // 如果下一个是ai回复,也需要删掉\n if (nextSessionContent?.role === SessionContentRole.Ai\n || (relatedDelete && [\n SessionContentRole.Ai,\n SessionContentRole.Guide,\n SessionContentRole.TokenExpired,\n SessionContentRole.ImageNotSupported,\n SessionContentRole.Pause,\n ].includes(nextSessionContent?.role))\n ) {\n const nextIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === nextSessionContent.id);\n currentSessionContents.splice(nextIndex, 1);\n deleteSessionContentIds.push(nextSessionContent.id as number);\n }\n // 如果下下个是 guide,需要删除\n if ([SessionContentRole.Guide].includes(nextNextSessionContent?.role) && relatedDelete) {\n const nextNextIndex = currentSessionContents\n .findIndex(sessionContent => sessionContent.id === nextNextSessionContent.id);\n currentSessionContents.splice(nextNextIndex, 1);\n deleteSessionContentIds.push(nextNextSessionContent.id as number);\n }\n }\n });\n\n return deleteSessionContentIds;\n }\n\n // 删除聊天内容\n function deleteSessionContent(sessionCode: string, contentId: number) {\n const deleteSessionContentIds = getDeleteSessionContents(sessionCode, [contentId], true);\n return deleteSessionContentIds;\n }\n\n // 批量删除\n function deleteSessionContents(sessionCode: string, contentIds: number[]) {\n const deleteSessionContentIds = getDeleteSessionContents(sessionCode, contentIds, false);\n return deleteSessionContentIds;\n }\n\n // 聊天开始\n function handleStartChat(sessionCode: string) {\n sessionLoadingMap.value[sessionCode] = true;\n const sessionContent: ISessionContent = {\n sessionCode,\n role: SessionContentRole.Ai,\n status: SessionContentStatus.Loading,\n content: startMessage,\n };\n // 画布新增\n plusSessionContent(sessionCode, sessionContent);\n // 调用cb\n return handleStart?.(sessionCode, sessionContent);\n }\n\n // 引用资料\n function handleReferenceDocChat(sessionCode: string, documents: Document[], cover?: boolean) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n const content = getHtmlContentFromDocuments(documents);\n sessionContent.content = cover ? content : sessionContent.content + content;\n return handleReferenceDoc?.(sessionCode, sessionContent);\n }\n\n // 思考\n function handleThinkChat(sessionCode: string, content: string, cover?: boolean, elapsedTime?: number) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n // 获取思考的html\n sessionContent.content = getHtmlContentFromThink(sessionContent.content, content, cover, elapsedTime);\n // 调用cb\n return handleThink?.(sessionCode, sessionContent);\n }\n\n // 文本\n function handleTextChat(sessionCode: string, message: string, cover?: boolean) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n if (sessionContent.content === startMessage) {\n sessionContent.content = message;\n } else if (sessionContent.status === SessionContentStatus.Loading) {\n sessionContent.content = cover\n ? message\n : sessionContent.content + message;\n } else {\n return;\n }\n // 调用cb\n return handleText?.(sessionCode, sessionContent);\n }\n\n // 聊天结束\n function handleEndChat(sessionCode: string, message?: string) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n // 防止 error 的情况下异步触发 end 更新了数据\n if (sessionContent.status === SessionContentStatus.Loading) {\n sessionLoadingMap.value[sessionCode] = false;\n // end 的时候,如果 message 有值,则更新 content\n if (message) {\n sessionContent.content = message;\n }\n // 更新状态\n sessionContent.status = SessionContentStatus.Success;\n // 调用cb\n return handleEnd?.(sessionCode, sessionContent);\n }\n // 内容正在生成中或者正在思考中\n if (sessionContent.content === startMessage || isThinking(sessionContent.content)) {\n handleErrorChat(sessionCode, '聊天内容已中断');\n }\n }\n\n // 聊天异常\n function handleErrorChat(sessionCode: string, message: string, code?: string) {\n const sessionContent = getLastSessionContentBySessionCode(sessionCode);\n sessionContent.status = SessionContentStatus.Fail;\n sessionContent.content = message;\n sessionLoadingMap.value[sessionCode] = false;\n // token 超了,提示 token 不足\n if (code === HttpErrorCode.TokenExpired) {\n sessionContent.content = '抱歉,您的剩余 Token 不足,无法返回回答内容,请先清空当前会话(上下文仍会作为历史记录保留))';\n sessionContent.role = SessionContentRole.TokenExpired;\n }\n if (code === HttpErrorCode.ImageNotSupported) {\n sessionContent.content = '抱歉,当前模型不支持图片内容解析';\n sessionContent.role = SessionContentRole.ImageNotSupported;\n }\n // 调用cb\n return handleError?.(sessionCode, sessionContent, code);\n }\n\n // 重新生成对话 仅支持重新生成 ai 的回复\n function reGenerateChat(chatIndex: number) {\n const chat = sessionContents.value[chatIndex];\n if (chat.role !== SessionContentRole.Ai) {\n return;\n }\n\n const message = sessionContents.value[chatIndex - 1].content;\n const cite = sessionContents.value[chatIndex - 1].cite;\n sessionContents.value.splice(chatIndex - 1, 2);\n sendChat({message, cite});\n }\n\n // 聊天\n function chat({\n sessionCode,\n data,\n url,\n headers,\n }: {\n sessionCode: string;\n data?: Record<string, any>;\n url: string;\n headers?: Record<string, string>;\n }) {\n // 发送请求\n chatHelper.stream({\n sessionCode,\n url: url,\n data,\n headers: headers || requestOptions?.headers,\n });\n }\n\n // 重新发送聊天, 需要将当前聊天内容以及下方的所有内容删除\n function reSendChat(index: number, {message, cite}: {message: string, cite?: string}, callback?: () => void) {\n const chat = sessionContents.value[index];\n if (chat.role !== SessionContentRole.User) {\n return;\n }\n\n sessionContents.value.splice(index, sessionContents.value.length - index);\n sendChat({message, cite}, callback);\n }\n\n // 发送聊天\n function sendChat(content: BasicChatContent | ShortcutChatContent, callback?: () => void) {\n if (!currentSession.value?.sessionCode || !requestOptions?.url || currentSessionLoading.value) {\n return;\n }\n\n const {message, cite, shortcut} = content;\n\n let input = '';\n\n if (shortcut) {\n input = processPromptTemplate(shortcut.prompt, cite);\n } else {\n input = cite ? `${message}: \"${cite}\"` : message;\n }\n\n\n sessionContents.value.push({\n sessionCode: currentSession.value?.sessionCode,\n content: message,\n role: SessionContentRole.User,\n status: SessionContentStatus.Success,\n cite,\n });\n\n // 发送请求\n chatHelper.stream({\n sessionCode: currentSession.value?.sessionCode,\n url: requestOptions.url,\n headers: requestOptions?.headers,\n data: {\n inputs: {\n chat_history: prompts.value.slice(0, prompts.value.length - 1),\n input,\n },\n }\n });\n\n callback?.();\n }\n\n /**\n * 删除聊天内容\n * @param index 要删除的聊天内容索引\n * @description \n * - 如果删除的是用户消息,则同时删除该消息及其对应的AI回复(共2条)\n * - 如果删除的是其他类型消息(如AI回复),则只删除该条消息\n */\n function deleteChat(index: number) {\n const chat = sessionContents.value[index];\n if (chat.role === SessionContentRole.User) {\n sessionContents.value.splice(index, 2);\n return;\n }\n\n sessionContents.value.splice(index-1, 2);\n }\n\n // 停止聊天\n function stopChat(sessionCode: string) {\n chatHelper.stop(sessionCode);\n }\n\n return {\n currentSession,\n sessionContents,\n sessionContentsMap,\n sessionLoadingMap,\n prompts,\n currentSessionLoading,\n chat,\n sendChat,\n stopChat,\n plusSessionContent,\n updateSessionContent,\n getSessionContentById,\n getLastSessionContentBySessionCode,\n getSessionContentsBySessionCode,\n setCurrentSession,\n setSessionContents,\n deleteSessionContent,\n deleteSessionContents,\n handleStartChat,\n handleErrorChat,\n reGenerateChat,\n reSendChat,\n deleteChat,\n };\n};","import {\n onBeforeMount,\n onBeforeUnmount,\n} from 'vue';\n\nimport {\n handleCopy,\n handleDownLoad,\n} from '../common/util';\n\ntype FullScreenWrap = HTMLElement & {\n _originalParent: Node;\n _originalNextSibling: Node;\n};\n\n// 全局点击代理事件\nexport const useClickProxy = () => {\n const clickProxy = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // 聊天窗里面的引用资料和思考内容\n if (target?.classList.contains('bkaidev-angle-up')) {\n const parent = target?.parentElement;\n if (parent?.classList.contains('closed')) {\n parent?.classList.remove('closed');\n } else {\n parent?.classList.add('closed');\n }\n }\n if (target?.classList.contains('click-close')) {\n if (target?.classList.contains('closed')) {\n target?.classList.remove('closed');\n } else {\n target?.classList.add('closed');\n }\n }\n // 会话里面代码块的全屏\n if (target?.classList.contains('click-full-screen')) {\n // 获取全屏的父元素\n const fullScreenWrap = target?.parentElement?.parentElement?.parentElement as FullScreenWrap;\n // 添加 class\n fullScreenWrap?.classList.add('full-screen');\n // 元素移动到body\n if (!fullScreenWrap._originalParent) {\n fullScreenWrap._originalParent = fullScreenWrap.parentNode as Node;\n fullScreenWrap._originalNextSibling = fullScreenWrap.nextSibling as Node;\n }\n document.body.appendChild(fullScreenWrap);\n }\n // 会话里面代码块的取消全屏\n if (target?.classList.contains('click-un-full-screen')) {\n // 获取全屏的父元素\n const fullScreenWrap = target?.parentElement?.parentElement?.parentElement as FullScreenWrap;\n // 移除 class\n fullScreenWrap?.classList.remove('full-screen');\n // 移回原位\n if (fullScreenWrap._originalNextSibling) {\n fullScreenWrap._originalParent.insertBefore(fullScreenWrap, fullScreenWrap._originalNextSibling);\n } else {\n fullScreenWrap._originalParent.appendChild(fullScreenWrap);\n }\n }\n // 复制\n if (target?.classList.contains('click-copy')) {\n const text = target?.getAttribute('data-clipboard-text');\n if (text) {\n handleCopy(decodeURIComponent(text));\n }\n }\n // 下载\n if (target?.classList.contains('click-download')) {\n const text = target?.getAttribute('data-clipboard-text');\n const fileName = target?.getAttribute('data-file-name');\n if (text && fileName) {\n handleDownLoad(decodeURIComponent(text), fileName);\n }\n }\n };\n\n const addClickProxy = () => {\n window.addEventListener('click', clickProxy);\n };\n\n const removeClickProxy = () => {\n window.removeEventListener('click', clickProxy);\n };\n\n onBeforeMount(() => {\n addClickProxy();\n });\n\n onBeforeUnmount(() => {\n removeClickProxy();\n });\n};\n","import {\n useReferenceDoc,\n} from \"./use-reference-doc\";\nimport {\n useThink,\n} from \"./use-think\";\nimport '../css/style.css';\n\n// ai 样式。注意:全局引入一次即可\nexport const useStyle = () => {\n // 图标库需要动态导入以确保能在浏览器环境下执行\n if (typeof document !== 'undefined') {\n // 动态导入JS文件\n const script = document.createElement('script');\n script.src = new URL('../css/iconcool.js', import.meta.url).href;\n document.head.appendChild(script);\n }\n \n // 引用资料\n useReferenceDoc();\n // 思考\n useThink();\n};\n","import type {\n SummaryCallbacks,\n} from '../types/type.ts';\nimport {\n SessionPromptRole,\n} from '../types/enum';\nimport {\n removeReferenceDoc,\n} from '../hooks/use-reference-doc';\nimport {\n removeThink,\n} from '../hooks/use-think';\nimport {\n ChatHelper,\n} from '../common/chart-helper';\n\n// ai 总结\nexport const useSummary = ({\n handleStart,\n handleEnd,\n handleError,\n}: SummaryCallbacks = {}) => {\n let summaryText = '';\n\n const handleStartChat = () => {\n summaryText = '';\n return handleStart?.();\n };\n\n const handleTextChat = (sessionCode: string, message: string, cover?: boolean) => {\n if (cover || summaryText === '正在思考...') {\n summaryText = message;\n } else {\n summaryText += message;\n }\n };\n\n const handleEndChat = () => {\n if (summaryText === '无话可说') {\n summaryText = '';\n }\n return handleEnd?.(summaryText);\n };\n\n const handleErrorChat = (sessionCode: string, message: string, code?: string) => {\n return handleError?.(message, code);\n };\n\n const chatHelper = new ChatHelper({\n handleStart: handleStartChat,\n handleText: handleTextChat,\n handleEnd: handleEndChat,\n handleError: handleErrorChat,\n });\n\n const summary = ({\n content,\n url,\n headers,\n model,\n }: {\n content: string;\n url: string;\n headers?: Record<string, string>;\n model?: string;\n }) => {\n const filterContent = removeThink(removeReferenceDoc(content));\n const prompts = [\n {\n role: SessionPromptRole.User,\n content: `你是一个总结大师,请帮助我对下面这段话进行总结。要求总结精炼,不超过 15 个字!且末尾没有标点符号!请注意:如果你无法总结,请回复“无话可说”!\\n文字如下:\\n${filterContent}`,\n },\n ];\n \n chatHelper.stream({\n sessionCode: 'summary',\n url,\n data: {\n prompts,\n model,\n },\n headers,\n });\n };\n\n return {\n summary,\n };\n}"],"names":["SessionPromptRole","SessionContentStatus","SessionContentRole","HttpErrorCode","transferSessionContent2SessionPrompt","sessionContent","sessionRoleMap","Ai","Assistant","User","System","Hidden","Guide","Time","Role","HiddenAi","HiddenAssistant","HiddenGuide","HiddenRole","HiddenSystem","HiddenUser","TemplateAi","TemplateAssistant","TemplateGuide","TemplateRole","TemplateSystem","TemplateUser","TemplateHidden","Pause","TokenExpired","ImageNotSupported","UserImage","content","role","isJSON","str","JSON","parse","e","removeReferenceDoc","replace","useReferenceDoc","styleEle","onBeforeMount","document","createElement","textContent","oldStyle","head","appendChild","onBeforeUnmount","remove","getHtmlContentFromThink","chatContent","cover","elapsedTime","htmlContent","includes","thinkBodyMatch","match","thinkContent","newThinkContent","val","hours","Math","floor","minutes","seconds","milliseconds","parts","push","toFixed","join","durationFormatter","removeThink","afterRemoveThinkBody","trim","useThink","ChatHelper","constructor","handleStart","handleText","handleReferenceDoc","handleThink","handleEnd","handleError","__publicField","this","controllerMap","stream","_0","__async","arguments","sessionCode","url","headers","data","_a","call","controller","AbortController","fetch","method","signal","__spreadValues","mode","credentials","body","stringify","then","response","reader","pipeThrough","window","TextDecoderStream","getReader","temp","value","done","read","ok","statusText","status","toString","split","forEach","item","event","documents","result","code","elapsed_time","message","_b","error","stop","abort","requestOptions","startMessage","currentSession","ref","sessionLoadingMap","sessionContents","sessionContentsMap","calculatedSessionContents","computed","index","length","nextAiSessionContentIndex","nextAiSessionContent","Fail","unshift","currentSessionLoading","prompts","rolePrompts","userPrompts","latestMatchIndex","findLastIndex","some","key","_c","roleInfo","roleContent","nextSessionContent","map","isSameContent","startIndex","isSame","rolePrompt","prompts2","prompt","chatHelper","handleStartChat","getLastSessionContentBySessionCode","Loading","path","file_path","filePath","display_name","displayName","preview_path","previewPath","metadata","title","pop","getHtmlContentFromDocuments","Success","isStartThinking","isEmptyThinking","isThinking","handleErrorChat","at","getSessionContentsBySessionCode","plusSessionContent","getDeleteSessionContents","sessionContentIds","relatedDelete","currentSessionContents","deleteSessionContentIds","sessionContentId","findIndex","id","preSessionContent","nextNextSessionContent","splice","hiddenIndex","nextIndex","nextNextIndex","sendChat","callback","cite","shortcut","input","selectedText","inputs","chat_history","slice","chat","stopChat","updateSessionContent","currentSessionContent","find","Object","assign","getSessionContentById","setCurrentSession","session","setSessionContents","deleteSessionContent","contentId","deleteSessionContents","contentIds","reGenerateChat","chatIndex","reSendChat","deleteChat","clickProxy","target","classList","contains","parent","parentElement","add","fullScreenWrap","_originalParent","parentNode","_originalNextSibling","nextSibling","_d","insertBefore","text","getAttribute","textarea","select","execCommand","Message","theme","removeChild","handleCopy","decodeURIComponent","fileName","source","filename","downloadEl","blob","Blob","download","href","URL","createObjectURL","style","display","click","handleDownLoad","addEventListener","removeEventListener","script","src","location","require","pathToFileURL","__filename","_documentCurrentScript","tagName","toUpperCase","baseURI","summaryText","summary","model","filterContent"],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,10 +1,19 @@
|
|
1
1
|
{
|
2
2
|
"name": "@blueking/ai-ui-sdk",
|
3
|
-
"version": "0.0.7-beta.
|
3
|
+
"version": "0.0.7-beta.3",
|
4
4
|
"description": "蓝鲸AI UI SDK",
|
5
5
|
"main": "dist/main.umd.js",
|
6
6
|
"module": "dist/main.es.js",
|
7
7
|
"types": "dist/main.d.ts",
|
8
|
+
"exports": {
|
9
|
+
".": {
|
10
|
+
"types": "./dist/main.d.ts",
|
11
|
+
"import": "./dist/main.es.js",
|
12
|
+
"require": "./dist/main.umd.js"
|
13
|
+
},
|
14
|
+
"./css/style.css": "./dist/css/style.css",
|
15
|
+
"./css/iconcool.js": "./dist/css/iconcool.js"
|
16
|
+
},
|
8
17
|
"scripts": {
|
9
18
|
"build": "bk-cli-service-webpack build && tsc --emitDeclarationOnly",
|
10
19
|
"build:vite": "vite build"
|
@@ -23,9 +32,11 @@
|
|
23
32
|
"vue": "^3.0.0"
|
24
33
|
},
|
25
34
|
"devDependencies": {
|
26
|
-
"@vitejs/plugin-vue": "^5.
|
35
|
+
"@vitejs/plugin-vue": "^5.0.0",
|
27
36
|
"typescript": "^5.5.4",
|
28
|
-
"vite": "^
|
29
|
-
"vite-plugin-dts": "^
|
37
|
+
"vite": "^5.0.0",
|
38
|
+
"vite-plugin-dts": "^3.7.0",
|
39
|
+
"terser": "^5.22.0",
|
40
|
+
"vue": "^3.5.13"
|
30
41
|
}
|
31
42
|
}
|