From 713b2350d2eab510630b8a04a019d80efd8fa678 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Fri, 24 Apr 2026 14:21:38 +0800 Subject: [PATCH 1/2] stage --- astrbot/dashboard/routes/chat.py | 79 +-- astrbot/dashboard/routes/live_chat.py | 76 ++- .../mdi-subset/materialdesignicons-subset.css | 66 ++- .../materialdesignicons-webfont-subset.woff | Bin 17056 -> 18472 bytes .../materialdesignicons-webfont-subset.woff2 | Bin 13672 -> 14880 bytes dashboard/src/components/chat/Chat.vue | 116 +++- .../components/chat/ProviderConfigDialog.vue | 375 ++----------- .../provider/ProviderChatCompletionPanel.vue | 432 +++++++++++++++ .../provider/ProviderModelsPanel.vue | 496 +++++++++++------- .../provider/ProviderSourcesPanel.vue | 294 +++++------ .../components/shared/ProviderSelector.vue | 6 +- .../src/i18n/locales/en-US/features/chat.json | 2 +- .../i18n/locales/en-US/features/provider.json | 1 + .../i18n/locales/ru-RU/features/provider.json | 1 + .../src/i18n/locales/zh-CN/features/chat.json | 2 +- .../i18n/locales/zh-CN/features/provider.json | 1 + dashboard/src/layouts/full/FullLayout.vue | 20 +- dashboard/src/views/ProviderPage.vue | 428 ++++++++------- 18 files changed, 1422 insertions(+), 973 deletions(-) create mode 100644 dashboard/src/components/provider/ProviderChatCompletionPanel.vue diff --git a/astrbot/dashboard/routes/chat.py b/astrbot/dashboard/routes/chat.py index d4174ffb58..986570ac34 100644 --- a/astrbot/dashboard/routes/chat.py +++ b/astrbot/dashboard/routes/chat.py @@ -766,6 +766,44 @@ async def stream(): message_accumulator = BotMessageAccumulator() agent_stats = {} refs = {} + + async def flush_pending_bot_message(): + nonlocal message_accumulator, agent_stats, refs + if not (message_accumulator.has_content() or refs or agent_stats): + return None + + message_parts_to_save = message_accumulator.build_message_parts( + include_pending_tool_calls=True + ) + plain_text = collect_plain_text_from_message_parts( + message_parts_to_save + ) + + try: + extracted_refs = self._extract_web_search_refs( + plain_text, + message_parts_to_save, + ) + except Exception as e: + logger.exception( + f"Failed to extract web search refs: {e}", + exc_info=True, + ) + extracted_refs = refs + + saved_record = await self._save_bot_message( + webchat_conv_id, + message_parts_to_save, + agent_stats, + extracted_refs, + llm_checkpoint_id, + platform_history_id, + ) + message_accumulator = BotMessageAccumulator() + agent_stats = {} + refs = {} + return saved_record + try: # Emit session_id first so clients can bind the stream immediately. session_info = { @@ -885,35 +923,7 @@ async def stream(): should_save = True if should_save: - message_parts_to_save = ( - message_accumulator.build_message_parts( - include_pending_tool_calls=True - ) - ) - plain_text = collect_plain_text_from_message_parts( - message_parts_to_save - ) - - # 提取 web_search_tavily 引用 - try: - refs = self._extract_web_search_refs( - plain_text, - message_parts_to_save, - ) - except Exception as e: - logger.exception( - f"Failed to extract web search refs: {e}", - exc_info=True, - ) - - saved_record = await self._save_bot_message( - webchat_conv_id, - message_parts_to_save, - agent_stats, - refs, - llm_checkpoint_id, - platform_history_id, - ) + saved_record = await flush_pending_bot_message() # 发送保存的消息信息给前端 if saved_record and not client_disconnected: saved_info = { @@ -930,15 +940,18 @@ async def stream(): yield f"data: {json.dumps(saved_info, ensure_ascii=False)}\n\n" except Exception: pass - message_accumulator = BotMessageAccumulator() - agent_stats = {} - refs = {} - if msg_type == "end": break except BaseException as e: logger.exception(f"WebChat stream unexpected error: {e}", exc_info=True) finally: + try: + await flush_pending_bot_message() + except Exception as e: + logger.exception( + f"Failed to persist pending webchat message: {e}", + exc_info=True, + ) webchat_queue_mgr.remove_back_queue(message_id) # 将消息放入会话特定的队列 diff --git a/astrbot/dashboard/routes/live_chat.py b/astrbot/dashboard/routes/live_chat.py index 8f4dc26fab..8fe113fcbe 100644 --- a/astrbot/dashboard/routes/live_chat.py +++ b/astrbot/dashboard/routes/live_chat.py @@ -453,6 +453,7 @@ async def _handle_chat_message( llm_checkpoint_id = str(uuid.uuid4()) try: + pending_bot_message_flusher = None chat_queue = webchat_queue_mgr.get_or_create_queue(session_id) await chat_queue.put( ( @@ -499,9 +500,47 @@ async def _handle_chat_message( agent_stats = {} refs = {} + async def flush_pending_bot_message(): + nonlocal message_accumulator, agent_stats, refs + if not (message_accumulator.has_content() or refs or agent_stats): + return None + + message_parts_to_save = message_accumulator.build_message_parts( + include_pending_tool_calls=True + ) + plain_text = collect_plain_text_from_message_parts( + message_parts_to_save + ) + try: + extracted_refs = self._extract_web_search_refs( + plain_text, + message_parts_to_save, + ) + except Exception as e: + logger.exception( + f"[Live Chat] Failed to extract web search refs: {e}", + exc_info=True, + ) + extracted_refs = refs + + saved_record = await self._save_bot_message( + session_id, + message_parts_to_save, + agent_stats, + extracted_refs, + llm_checkpoint_id, + ) + message_accumulator = BotMessageAccumulator() + agent_stats = {} + refs = {} + return saved_record + + pending_bot_message_flusher = flush_pending_bot_message + while True: if session.should_interrupt: session.should_interrupt = False + await flush_pending_bot_message() break try: @@ -574,30 +613,7 @@ async def _handle_chat_message( should_save = True if should_save: - message_parts_to_save = message_accumulator.build_message_parts( - include_pending_tool_calls=True - ) - plain_text = collect_plain_text_from_message_parts( - message_parts_to_save - ) - try: - refs = self._extract_web_search_refs( - plain_text, - message_parts_to_save, - ) - except Exception as e: - logger.exception( - f"[Live Chat] Failed to extract web search refs: {e}", - exc_info=True, - ) - - saved_record = await self._save_bot_message( - session_id, - message_parts_to_save, - agent_stats, - refs, - llm_checkpoint_id, - ) + saved_record = await flush_pending_bot_message() if saved_record: await self._send_chat_payload( session, @@ -614,10 +630,6 @@ async def _handle_chat_message( }, ) - message_accumulator = BotMessageAccumulator() - agent_stats = {} - refs = {} - if msg_type == "end": break @@ -633,6 +645,14 @@ async def _handle_chat_message( }, ) finally: + try: + if pending_bot_message_flusher is not None: + await pending_bot_message_flusher() + except Exception as e: + logger.exception( + f"[Live Chat] Failed to persist pending chat message: {e}", + exc_info=True, + ) session.is_processing = False webchat_queue_mgr.remove_back_queue(message_id) diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css index 54785df237..3e1ffbc326 100644 --- a/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css +++ b/dashboard/src/assets/mdi-subset/materialdesignicons-subset.css @@ -1,4 +1,4 @@ -/* Auto-generated MDI subset – 247 icons */ +/* Auto-generated MDI subset – 261 icons */ /* Do not edit manually. Run: pnpm run subset-icons */ @font-face { @@ -236,6 +236,10 @@ content: "\F0167"; } +.mdi-code-braces::before { + content: "\F0169"; +} + .mdi-code-json::before { content: "\F0626"; } @@ -324,6 +328,10 @@ content: "\F1634"; } +.mdi-database-search-outline::before { + content: "\F1636"; +} + .mdi-delete::before { content: "\F01B4"; } @@ -396,6 +404,10 @@ content: "\F022E"; } +.mdi-file-delimited-outline::before { + content: "\F0EA5"; +} + .mdi-file-document::before { content: "\F0219"; } @@ -416,6 +428,10 @@ content: "\F021C"; } +.mdi-file-music-outline::before { + content: "\F0E2A"; +} + .mdi-file-outline::before { content: "\F0224"; } @@ -436,6 +452,10 @@ content: "\F0A4D"; } +.mdi-file-video-outline::before { + content: "\F0E2C"; +} + .mdi-file-word-box::before { content: "\F022D"; } @@ -536,6 +556,10 @@ content: "\F0EFE"; } +.mdi-image-outline::before { + content: "\F0976"; +} + .mdi-import::before { content: "\F02FA"; } @@ -564,10 +588,38 @@ content: "\F0315"; } +.mdi-language-css3::before { + content: "\F031C"; +} + +.mdi-language-html5::before { + content: "\F031D"; +} + +.mdi-language-java::before { + content: "\F0B37"; +} + +.mdi-language-javascript::before { + content: "\F031E"; +} + .mdi-language-markdown::before { content: "\F0354"; } +.mdi-language-markdown-outline::before { + content: "\F0F5B"; +} + +.mdi-language-python::before { + content: "\F0320"; +} + +.mdi-language-typescript::before { + content: "\F06E6"; +} + .mdi-layers-outline::before { content: "\F09FE"; } @@ -688,6 +740,10 @@ content: "\F03D6"; } +.mdi-package-variant-closed::before { + content: "\F03D7"; +} + .mdi-page-first::before { content: "\F0600"; } @@ -812,10 +868,6 @@ content: "\F167A"; } -.mdi-send::before { - content: "\F048A"; -} - .mdi-server::before { content: "\F048B"; } @@ -1004,6 +1056,10 @@ content: "\F05B7"; } +.mdi-wrench-outline::before { + content: "\F0BE0"; +} + .mdi-zip-box::before { content: "\F05C4"; } diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff index b5c8cefd742e995fb7fe64ae885990485ef498fa..02f37fd732bbb7f5da8588865c561e8ed9a4b03b 100644 GIT binary patch delta 18210 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 Zc${6#F$;q*5QgDbje?6~=S-6>LUMt)Clvqy delta 16764 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 diff --git a/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 b/dashboard/src/assets/mdi-subset/materialdesignicons-webfont-subset.woff2 index 74e05e5454a73db2344343ba6af925ac2be8c515..a26ce1678cffaba6c0622046d495ffb501f88b70 100644 GIT binary patch literal 14880 zcmV+*I^V^2Pew8T0RR9106HK53jhEB0E6HF06EP70RR9100000000000000000000 z0000SCiEX0LI)rlfNT@)Fl-zEf;FEzic-wV zQAjfvr{e7YmYj|uE#UfFOt2AXsRYsL?MSO#r!jpo-{5W>;>`<9PC_FpQHfXo#!9B6GUr=PfB^s;1GC4n zK@~1w<%wM23DK=sp@hDh0whGjCO|S1dP3K1NC;J$yGs!d;{!B_ z?G!}RyIp(ED-Ez#Hr}^h6aFQ5dPTer@qEvC?RoFScFl6lOf^?^f4l2`O=H;2Acz~H z;|4EB!t8k2y7KdFzVHQ|7z~?|I_l&A&FeYWlXJ7OK0KSs zL>DAVlC_#Y-h$;|5B!OK)2Ni06lIz!^RLdTm5xaPuP>FG)9ZJqy>g1?Qd4}sK78qa zz68Q}kT5fVlbj{lH;ZvNK=wVr-h?;jDt8xT?Dcu@28Ve*`$A0BhUkl-nzz*zb*!%L zj(?KLw0&S89wVAB@#ZquoCC2;NWE)Kn=LfcfVG4KP!V#U|6M~@v!F&hvCP`?kra_5 zdt}35j_=2CTHC4Q_i1Mluf{p#;DGg8hye6dR+-ZAJqMD1ZRTLS0MG$AodAS_Sd|Ni zj=F;`_@aL^^FYBxMV+zlbecfhuOgPRb#ZBL%U{J57hMIZ=+Wx|QGH;YH&Mc2GzEdg zy`UheTu_lzUD|DRD7YZ$RB%PotB?oDz=9i+kp*`oAq72>w8DTSqwqkIQ+OhIS9l@$ zR7fOW&d5uOnpdrxeCnyMkXBkNqOA^!>8r0&jEqVfYM3&7`6{>mP$*9dbD;t$mKQ3L zVr8KcDb^M$lj2OF3MsA>s*>Vbp&BV}4X7?g+)?A9dOn4Vs#eEDXmQDdeivl%g(ne^*t_PPNUhaG11g)daN>Z(fDU03B#f2#Jk ze~y~38VUnu5fZ8+AyF^MbPbf0X3JNAQltoDrkR?Vn6#);r4@zJW{$Z(xE-Q&5Jr)z z_Xo=B4}~$L8hD1Wq-wq<-i-6eBNNy~^Oh!!uM8RdHVZzmyACJ};w2n&zAkzgFi#03%-2UB3-s6DLL-f|h&OMG z1q-%Bs8CCV3%ATHvn;pHIxFn3!%7Dow90wst#->TYdrAKT6T8pHx33^q)0tBJY0FY z3Y&QHv_)~nZBUYo;={*oW@dY=v(8?J9J0>|C+zpkGY2*cii5~J z?gI{KqKU)2c`G1PD64ScjyUhUqk9p~a17~I+ zb|}sv-8}}JS5G|`Oftzu>#cXm7F%3)&_P$+amQ89J$G%Bp}3B8&mLg&&U;b&ABvmO z_bS|y-luR|`e}tbGBg=*S92}hTOTMqlwoS&kqpxdk7amOJdq)#cq)%^1D^5Y=eeDB zdSSQSUOMNTSMIszwN$C>`wxm}dCnLRH`whR8x|D_DOck zaVgF?BW?dfkuF(wK!)Ll%VcJjwK-5^Oa3WxlsA7su1=laxZxX){RN75%6GMRul&u0 z4=ONwz{hR8%$I!~3SU+5QSnWM;tStZC{X-RVd;RM^z?qom+v5m#U z{#tFde~vls|DJ&&Ko%v=2!Ski=KU-{D9Dm%fDVoRbAi*%^*_Y})FOb24X9Z_{krx1 z^K{kxr9-SzzAIFF?NI~Z5&jLUtO_pZxMgSr6nPfkB>=AV7qDdoiS!U4 zLiqvSgH!nsQ^)9Ur$pybnOOZ$R}QunV$^I5n^_rq-901F_J7qD2OZ| zM%Xb!HEdW>Y*m_CrI|(+i^Hd4I>;>|n8OV}a?!>)CwR)p(AWTD!_8z8mFp#yz{l3G z0wo?Yqd?G7t1ena8mUW63aI3HbtMfTNU1oHL`l-npoAv;bVdnfc$jq6Iet6+*J>;Mf^ktrqR^QZKn^8_=(= zxIY1I*)wZ&_y~L$P{d~8G-ojmSELKZhveWK(8S{eZd4khM97aVUa5h|QrWBVGtcq@lQL(*1Te65=| zEM7Zj;3Y|la0nX0J>BGaeMK*QI>heo?{mYT!6PT)mtD;(VNg8!J-Ru7{Ugt?ZOE3c z#*p{1a6Z(gntv|&o1ceZtDxF05?Y^upZ=p$;cF))=`Tn%ZQfn?7n!a~ImX^=pSBe^ zjtsca;DoGIM+Nnbbke3~gN;$xPM;VR81p?e&*(F$%~+NkIUjR{BS2ykY!yyh(|Mvo zL#@$euIp$+!Lo5+SFcmbRGy6V-mwgXF<4a{0bunKZ=F-szR_fN);zzPmZz!K>h&R& z>08KnYwqE9b%6 z!9eS8xWb{ zPvAmNZW$C_2TJ-~2TycL7xTty5C9IwC5qfIWQ7^k``TT#sn5{nTrYK}%4%+-G@$%c zj0EdxRN&_**3YRd&GRKf)?V*~| zPC76_ab@)|waVrxMB{Un9Qg<)2G=U+at-^|fRj>3Ov;c%4(nFao=`=u*0lzf6+FZ* zc>LHb+f0q5QRlehR2Q%Von+lZCTd|uK1p03;_0nyjMsLnaxM$AUZLc=*?FbJP0V7Y z0ciV|rU=gnIh{2&!)QvW8VduZrD&qgEDB@*pw8QEP-2KWGFu@~teTfomNuY4V6h@9r{9To*q6{4>NTVUH06 zJx_!}ze%XskGf2J+>zx7fg`1~(7U78JcT`kzwk`RjifEI&TK%>?s6U15Tu_TDsXrg z6f;T?3QD}zX_UHX*kNIVRlun<+#0Jobu$ZE0CFeM?8&7sb3CN@W{}mVC7vsT$#ous z=!L~vb&+-4p54{!&P)5%uDkt$J>MF55T!$3M`V8nu(XnSaChQ)m5@;kk4 zuQhUy(VC_ZJNFWK*6>e8ayVX8&mzHfz2KLKHfH$5idJ~tda zkAyfJ94hR@Fmecl^f$p%Ig4~lk)yJi+@y)>uU6vXqf|E$$QYt}q^V4q6mDo16@GJx zghPsQqfFX@7}%PaM+_OGiVILsLXl0ggx|JzPuFUVtO>?y`NFCnWSV6e#r2_IBCGlG=li5~Nazzs#9T#UU6 zq)#g!0Q4>G8fb0F|7bgM!@5w+5|2Ku3S`PV;QkH$%Cxs?r?zYi?^Rc z$ULGkeP*1ywhxw9ySQzqiwhjLwXf`XnA20w2m?$dV@es64Y-`T#~|xcub^ZMTD-qC zs(`t;pw?0U4u_EM95K2tAhXIxaKGn5d>-IQKMXX~`fSg(UgW6mEwN=m$q-#Ob8IBpF{jO;m7P@HVy)`o?ORJkbI72E_<%%fUm0+-9Uz?p|?;)|UQKwdu>LP$$1BS(*bP<6{sY>=v(`86!(xNr$ zCy6YhP`93gyeun1Z>_@ea>r^WOnek)FSa+N+tz7g2z(P1s=Kdpk-bw|Y+-sP1MK4F zdS_}<)zXQIqTO{=WIL<_SIF4n;rhLfc;k`C*wFdIGLEgX+PGy?U76K4Qo2seMu`7xeX{{-tMr z_3Y)RpJl*)3zGy{34aBYn=}{_AgSqBVvsP^nDpMf0U_+{4`LR~1|yebcKs0juHWT< zOMmy#0LM+_$00<0TieJ>dv_G3&kt6h+&t_}->4G-_5nvQF`9uB3lL2I#CF$e~aTS71qsJ<t%QvO#kY*HPc9?#2czoj}jZbm5WUwSBo@I z3qSd3^QW;U{-CPJ-Q1c|F@8drUub`Jjpt54U{F$Qk`Y`1y(GoZEo01lr@KnlYczrKp&M- zj<>Cd#egKtI^9Gr2zUe&HmH>FL{~+hCR&WDL5)Jt@D0X=)TE3(cP2OSCi{CSIt5?q zCI>$P9D=*Jkpn2vITSwF15J&uJd!`X`U(IZ z1i~BNaRIiXmqw7~oex<|<|)0#XW_}yFZj#X$S6-!%3II=g@lQ&{~Z4MXZx!?*oQ~! z#zz~*M;hvooEsvHoC!GR(MM90b3V!F@Y!S4I?nA0!s9S1p4bWXh{e$U^XlQE$;Wn5 z8~Xd_)KgvUq^IoB<%O$$*G#H)$l`SGS@@E{FJ8-bO!GM((X=F#hzyqPNb9MwSDb(ZxDl7RN><^_J| zkJ4`4>@n5GZBaTNgWW`uBqezMa3YX6i@gE?2h6n&UY-&lB=E5?t+0>&_z@7fXU&8W zk0go?Q8q+*6V!DrS5ZU4)bu75h6Tb3x1uyY(7sh|$f~VuSI~M39$2iB7t7Z0!GQ8i z0dGDPG)8_bDHpjfBa?nTlE|og6h^@Ezq(4D(c~HQk3u)PeTX{&_8-5h&xjHD1smIT`fM2Fa(9ko8?w8Z zV#KvV3nAL_dwyHr6Q;Rb>lc~JUOhR3GTXtt?p6!bas(V1#8>hTHRGVOGF{o=a0XEl zuoTMZ=r!>utD)f6U3-lBKCX_x6k#6t#zfhmN88dNw03rZ#(yX+BAEJVFa=C}SYT5L zfFkF+`WPv_S&cQSU_IT-`mKbSoKs{&q>#j3I=q{0#x*f-OewFLpVT`?)Et1Pq7|~o zuBr1-t*@b9QGSXR>;`Ugf?Tj5JV<4^(l4+(>qHCnvS-7M-Z7;s=$z>`M{qo-pM1TR z;Vph@k(DVC716D(aYR|9vLY-6O3PLSOY_0aS$ReJ0_GmEsw!>n6U02a>`9Gr4{hCa zL|v}5GiR-;mHgc%_15E=r5fk2b8huwA=~_k`6CX05PP|Kn2}oL$VBS}9b{te7ou5S zVVGe9vLXygv0;13>$xyeUZ#%|t?c9S-0fVa-dXlDs`_5tQ?i_tyvLMsT>Fj>EZFgRPyPh3Q z%ZE2zB{=GatDBr{nl+#^9X*z+^p_ArR-5*qqM}W8P6`C z{X^yE-dr>IP%V4j=t_X&mISBbXV>6ci;8S2B_uWrDEq=rE}Wn z__HyOFmn7Z_Xj=dON_+XkdVcXC5@Rq(j!BlK#IT7(X|!dAvSExcw?C@Ny>ot(B1DF!4RTXFnd8BWs{k1>s{hW zxmY62Ng}1KSA~|Rs1VcWV)8{4#*&ON!X&YfL_C=nEiQF>{q>wU-j#4mfkN4y|=tzFcYf%n&{^3}P|j$@k@^A&IPq`YROV_RZ#p|R%~`XVET z`v^P*6;9WGh#Xgv`wiuIa>v`z!i0t&K}M_``w2jjmj16?bph-OLkZUCDPc`{^vcx8 z<|I#IQfV=n77H)!En|(RMvW+FvRtJ)<}kt3kzn0jMi;KdVnl8?dR_5xuOJQ#Yv&ZN zZOt#o*5m81-`2;In8q*C`LWR$CJPx=fK4Zi(T8j#;>(We8@5KuXg$!V2j|q&y|ybG zb$I8lEL^}=91x_nX-{1vpXyL!8;(wnoeCg(6S%I12Dj%g_zamcyVgmP0rm+ja9 zQNYBa%p6UEg^>GfLz&E!{AkLP#a59bXFi$6cLQ80T}7(A_TUw%11sEN?J!xPs;MfQ z=&cY*QWV`}H$m&*uJN68cLv4)-U8f&%KNh$S0Zkv#LOrn;Vf77{`4 znMS<1wmA7>d$R{gXlbv6e47U^!u$?szKA_wb(ynZ617<~w6vAuu52F5Dmt=7TgrNa zIk<(AE9Zd%=fhZ)Fu+BWVThK8qlf4Ml=Re|?|Ce=o{lHO(apEsG@pP>FlYbnGC}9A zNFzz{l92yC`2bYA0z9@RD7{FvB0^r=vGl0O-#$dwTQ1yWE*1PW*69{jbFqi}>Q z)68~t%hnvra5ru4YRvaJ+#I;NmEQ-84iIK!v({v#^L=vQn-5RpFNr#IeLjOeNA+v` zFFnxil~C@|sTT}Pmu;8f+x1@q913( zlf3vWTMU%o(S~SU=w@kB58rpXkv0{3^YZoAA$|2lNnSI+8{yrG^U=M=A9E806@~g5 zPM~%G9&HLX3G-AfUWA~$cgGGIu#uxdHHWYN{BMsL$oqH0$9Nak+Nan@Q2jAmq=e1b zRxfhHjtjcTNEsl+VcZ1cvb-v*&qqmO24T+oV-kQ`?3TOxFagqGy2JeY-`JX7`JOoINHj2>p?0)E1y z%twEB>7;fFcWmWfO4K7@f`@@b6M9q;9Yau!(SCQ==vY_J#5nC=UU{%@X>qwCb}QbO zSzog1jfFSn#kKiq_j>uW3X_->&)%O!J)>+}7S*Gdnal zJU2AEUt4cDeSRI?xPJOg5zb<9#`x$*A3dgA#`Sbk z4h+!2$^SWVh}b4ZuBzBJEBGe&c0s-{n~az~t>nq~XrKoH!8(}Nv_ zl1mCA=$QK8UN|7)ss@1WbLQLTGj!m2g&Yb3fT?Z@VS^II7+kssA}2aaQ&g$7oWYp# z@)_VjMpJM~4L?G!u!=$l~*7P}k-#?vV<7F+;( zh@jR(bKal_20(@^iu6J+$wL2lU?C9+95|t3KVT-eEa)&ci{<(*AQUIyXv+lw5vPZnWJPO+*_w!;)l_5~cT@ z{auk;lO?3YVU$Xw;Mo~N{I=n&vXo(0!W>`P`_0UYcX?*zh!-d+9E>6*+!r#Hxsz(; zKJC8g3apjY($jEm2N!X2UESR{?C#!rKfON)_+9S?BP0Ivm;KA)$46SO9gnzz(|ljz zGeN6&Td|MBP}s+q^|LA<0f0kB9GVI+hyjVY8hsl-xlwKaNHR1-+U=47H=pL~*7#vg zQ!vwoXleu^bnzl^kOKjkNd{Hu@gPjPu+li*jdQFWD?bPaqew))+kp~-h~pe{or}R` zxSWs?QS3&oJr}!0p9V}0funouj_^3+Af!XrHwK`|o?D(NEPH;`ptWHMDVf(DqOLF< zgP`|9Ls@QbXb9=$DKWS;(E9)%KG$@sAf>r55?dY`e&~UGbK&M!RIg@(CG8>$n^OvZ znt%AZyf~zL*@K29Rw%vJ(D=4xhTEOfovyt3lrkw^B#KW`K6O)>-koy-PHTVxPgPf{ z7fWHJ%C&Qxy?@zosKTt6D#`c`givf$iCmKB7|!7)Cp;ldx&gqzd&fhboP4Qyg9!Q{ z2gM%QNpkjeD3(av>1P@t2Z1W)QoB?#PZxdBl%*vOYOUIXg!WVGVkOPcBm+)~^4HyW z$k!RIyYcCozJ@+Fnvh*xC1?sU*h#Q*P)kB2ci-;AzPgbKE$!<8OSF~PlM-!BiEZpj z?M$6t5l0<0dW}XSun|mrVCYg|yJfl6 z{|xKLdt-X>eqgG_j?-vUQ^>D!gd;)@Lpfh%G!<8NNCzaGWG6DD8dpHjw{BgX z)}_^eQzd4t#hPZ6112Bq6pa8#!j@Z$Ao_~2T1eY?ZZJUP5Jz%Qz?K4<9T*3R?zNyy zcNa%d2ve0Gb)2?zhm46^Q^^1*TtGK+Qxqti3#i;8=VayiKIqf(a>*p9_VdsEF{2g@LJGpcH8&F!YXI=7hqOLQoqx35 z9AiE{cXsN{{Oq0@NAwXbysYs^^vWZbhrs>~R?!)@@)fp1`;x^zh`mJyT9~X`*$E8nn z_X?D_gajElQ?0CjpnL!TXh`!~v;xmO;yJ!XVl7XZa0dig!PQPQPGgwaU0>gHrlH~X z?M(+5#}lwX&p^qLKCh)YSC5!$Ns<+slJ{NrKB%l*bk9|KRwEn{*2u8R{7qe5oAN8a z|Je&Dx~0$urEVTB@VbQngqv8BjZUBD?iA-2%(29TrNhT$bz(y!6L9{b0tQ}4%;6XZ&7=(jG z(ds6oaA*g2B^>g=o5mGXeadh{IS2OS_lE@t3c40P_Ze?#h$cSgkCYve>OQC)Ip5D- zbXZvSeSV84-u?VAZzAr=`6jz;S@Outw=iloB-r?Hrnd(sB&9l5*#K<1+V~Ci#Ndj~?NKE!1h9Yviq`>b z#fK_-ZkTn3xNYOvM7p71Ca{(D+2T3Y(l+Q3ZuVa)o-?l?Z~z35qd6}UJD8Y463$nM zXn`m;9Dqfqh^mLX6L-Bjm{n@MszbUDUuqU4s79zhvbD8JX0;+x!p)~yabR9+)})&o z(=7zgc1zR{a+ie`w&dnE8&cZeTLC#p4W6plr;qye|3>rsn`RK1 zo5E?Do1ptLHYkWfP$POc5{71tXr~Bg$((Rpy!&<04$h3y&(I8nkc6QO0BdyqlDbZFKEG~<*^oA? z4XpD;oJ#s+jeGSc$#Xc`;b0&GtXb5GlPg!sT3XFPOP9VlsJ&cRd0Bhv*0o^!vgopk zljmKFll0pg8|90?daf(idJLb1&zRn7v9un?nkKFDV32;>JL65`%O-icYjM>R#`AI4epFhzq{?o!eIms;iHygI zljw#{lEne-4jkRlPy1i|nKx1Ehk45Y3CZF^M;e_P(g>|uQ)qCbLY=XF0}081XYt@8 zjE(&_uKr4MjBU=Gz}z`$F-*W;A6IuWOE<=V<@Et1^eS zh=w49L+Jj}vCr~R&zeOJzr$`axwfH>0AjmXw9TH<|;m*5Oxwmmvnp zet-2)>!nYAYYya%WnQp5o=b8jIb11Uh#EuNHz14JKdD=-FtwJIw1%p^V=AskI81yH z)=((u7LaXg6NtCNI%+MryyPfoAojl`1yS3TiCVb@o26_Bd&^4I*l8r-#*#X5(axV! zUib^ocl#-t=fO@Z+xtxg5GdS=+F!(bDd{`IUt4=06y=NB#Ser*ZG9=HN)`!BsWaPwx~8y)7GU-mY{ zeExqgJlu4x?cob~rG22@ipQr`Mn8_Nnhh^*Jh*S>?8m>q7T$8^2CdJ0+ob$X8PB11R3Cf#11vcz7}H3-rCcmeZp!wy$USP~v?P*t-I( zeW1=&{1g<4As0Kg~t2*+8xBNuez_)ifi!gq8bpl8~0k#xO)a7zWj06GCu(_D=QOi z3AU;V+v|BHns=RZv{mVDwdFe~ya_r;JJX_lgIzOM#o*ut(sr-?4`sToS+~ZaRPIU* z=Lg2bwQf*3ZJyXS7S(j_Jkw-e6-UOEx#X`2^BsPv_I|r7YWY|Ik7~FcSa|twfSz+N zIO_Wr0QICD2O1<#?wriv7iGOU!v>5YwGx4u+{EmGbdwRRf5F@Ac9-0>aN!&f&^A;n zF2Ep&e3L#1AwyF*mV*&Wi?IYV3+9|{eO+Bwc%*PdNHRLt$K|O?Dv(0qJK>Q$zNhE$ zXK_&2*7IXpj1=Z?Eq8SmB6t)Sg!e`UT3R-9C+nrXAfIx3FAM28jXgb{sh-7}vZfl! z0R8N(mfq9d*9CM>K-1pX(V+HHM20(wxr9mlN`Sl{az+ppzJNp)0lD|)=BV9DjPITD zkBr>CGJbafZWRDk*}}i_yBsk{{`)J3TmJNw{cTShFKtTp20mHKG5X zyd9`W5c1t*IFMrsN)YW3y;G+&1%0J9{}dDblR5RvX(na;$LE?uLQ8}5rZr!Dx4zME!C-zI zop(HjNKz%`CFN4_^*F8+<*fRtC|HmdA}D&iDo3Qm38OH=m?Db3@Z&;3NSYwH@TW%> zVf8}b5ObIe>d5o27KiG$m+vq~nL*cmyLTH5GC$;)*h zg0%{Wh&TkU6<#{x=L%ftIkIJoz54$BDm%DyF1&W;6ZX>w0#g|F#>I=a-{KUkAddU* zJK^yI+gH8!`PTbm+sXy!zKW6BK7V{jh-b(h_$#CMh%jc)^54tA_|te$NbW0GI}p~WBAo+-*<$A;1)n2%p(Ng^7jqyXu&M_*06_fiyy&t;_D!&@&KDg1gP0ft^qF7qs-pcAq8vb^}$_IMCbM1JbFaqO&HA`;4IpST>dr zn*U`tmAqc~dWq?}^K6m5L`h_}MJt`o`&DLMP9ak+XJ($jN&G}6h$3+!se}NlCPhvO zZ}drg@RsYfe463PCLe} z1%I&xMHx**M@d-_I+4I!9PPl<0zoH6!AZEv1SZ9{jKW!SBUqPFoLe~ zt^4Yuj{q`_=*dAih&aSiw3~AeYbPghZS$ptOT;8imy-~F=&r8zKl3b!{_U2z#ncWL_qlP{jz7A zh}yzPK?>hgnwr+3ZCIr+pWh7zlN>tXh9#r^(WM)Z6LFuUkRn#H{elJubbu61eE6ny zQ#kSJMr^pBmAgw%8LyJfMNnZ>ElOh<*&sw7@miMl{q>gdI+lfr#nW1N>46%bvS;tR0r4Gh2A0ruS%gBDSm6xQj5)hFi)sm`A>W?ELmDwc! zyqIU~fB}gUrArg3hD6M|jkxr}KPpCZJi}>+DUnctSr8egaaYlXF4} zjEb5*P127hlfTTgM6N+bkdB0k?!%9Z5z1DrW$IsQcgB}$jbsrd&y^o#kq=djJeVpx z;*b3rg!8r#b*LqjW4HFAeTgK>GR8$BAOeVJ?B^5iw#~*Onw~=8G31rJKCKd4Qeq;2 zX7A!|@r#@O^v0oxIX(Z2k4@C&4XL90M1KhLlEZ&bXdeY32SNBP%CCt~ zyfPCe-D?@JMozIH#vx(pzb&8z7lkbe8|qFvCy3Tj(ed>Rlhztm0ZhJoamZyKqo2)C z_-LA^Mz0D`6h>}ifq{{byloK;B#6TZiGBg{r_$T~vN9rh?fUqz-nYX_uLeH*Ik}bJ z|KDM?623L6*qZ;S{I9}t-jXZKyZZ#jLjW80=9>@e9o#Z__go zA`Ln)Vp;u4zi#lPwV%f6fBt^WAjw_UGP^5}F>DG`Ng}m>|3l-4;?H5$2KKBN75q9y zi~PJFX=%+LbGwEf7TD$!;unUQ`0le7#Q}l|#O%Py3R5C55Td?_?nvttRaS~R(>mxP zyOW^ilkk|mVI;=f1T z&075dInc9p>+jyB?@MWniSu&Y5FG2wBEWQLk~$Kk9MU}rbSpOOfQ^u~zo$c~^%9W9 zIRM?VAQ)M?@yT`n_3JnMpWL{z(kLij3Rzh0drIN}REg#Z)Gm-gI7sg{X<71fVX$nU z?3_|hlgmG7iz&T2{$ZllWPD&WrKcs=?kfJ zZ3r<5x&%ch2Tz^^#2kYxtp(7+t}TnLE{k28mmL-( zTKYGiH~Cha8M!<@DDBaZ;iu5-*6PUN+%ieJ8FRexdvNqm5krq_9}nqiC6Pmqj+CJT zy8F6&(&)B+^_CNIXvW2bZSyAdwXC@KyMe(46}r9`d6TJ1 zDC@r#^qNK5BPCP1#5SS`o}Y<+j#iV=YXdwWI1rW<-tfei)AC$2l$J#BuAm??C+Tw> zE2+#x5$$J!f&tY|usxzAhzLT{@@m%iZ55=L@w{b{Wmt$gMX)uZMi7b`nI*Q5wuVhJ zV|qL1ohVgeUSe({0hTR;sYXx2=9;OJZ7pxLSke`>h32^QbW7?D1Qq{|LpOM{0wO8h z_s0ZeA;Wh*ZMFmnr1zzQIF`dIJ_`Ib-n=1VS2Lum%YIw5h(C}j?QCE!yH3GpEdX$K z)|PLVLp8a!dRARUlaQNyZaZSzkaG$m@KnW8})e{#55Z(LE_w z<=xM?O9*KpVKx(n6o1#JqnkIWgiI+=s6ry3xZl1oddjN48#Of+-ilY?7I_A1DtTKr z!-IrU)2BH*xp86rn{aLNJhlgOQB2#9nPidSxLFIMZA^{XfVYDy-bo{=ZjJJ2 z%!1S^PRbN-OMP3Q-kO8euvyN+L7l@`{teY+{Yz{2V`VAmd#=u7bFLF8v5%0jY3q}0 zLfB@<1TGf8=AdW{SD3TSU-_Sx`l4Z9k6k9k( zZ$937sV&q6y8nr_IVJ4{4u_OM|Hn8kVooF{@R~Q*PJe3ipfc?c#|n-;1kvHc&Ez`9 zg>%X;(qaqOf#T39wy^;Pi*74@C{c)+(G>gOgzx-Vl1Sxs%qfv#vr%dXH~d43c{Fy* znK+twqc4|^=6~>udlIGF!1sdZ@l+Q@=`&dc}h^P62C&Y`f z^@g@FmY|MzKu}V~9K=me&jTV5gX@G}rMeV|=?21XkK}jA(g(+&pg8A@*Q^t_2R9Tp zaIq~LQEIrqH-SI~mE-@4K@z6VRZOi`Y}Dz|Z*@MME4`@*ojZc+y5CMw@SvP zDJ~RNS#s6WLoZ{Qc?;*Cv_Kt^j~MJLSU2N^Y@npZTBw6!a9Q=#R#*SK)z?IU#$FV( SQd%}EE}J!|sCVoF0000B4Uk~~ literal 13672 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
@@ -34,6 +35,25 @@
+ + mdi-creation + {{ tm("actions.providerConfig") }} + + - - - {{ - tm("actions.providerConfig") - }} - - +
+ +
+ - (), { +const props = withDefaults(defineProps<{ chatboxMode?: boolean; active?: boolean }>(), { chatboxMode: false, + active: true, }); const route = useRoute(); @@ -574,8 +588,10 @@ const { cleanupMediaCache, } = useMediaHandling(); +type WorkspaceView = "chat" | "providers"; + const sidebarCollapsed = ref(false); -const providerDialog = ref(false); +const activeWorkspace = ref("chat"); const projectDialogOpen = ref(false); const editingProject = ref(null); const sessionTitleDialogOpen = ref(false); @@ -630,6 +646,9 @@ const chatSidebarDrawer = computed({ const isSidebarCollapsed = computed(() => lgAndUp.value ? sidebarCollapsed.value : !customizer.chatSidebarOpen, ); +const isProviderWorkspace = computed( + () => activeWorkspace.value === "providers", +); const activeReasoningParts = computed(() => { if (!activeReasoningTarget.value) return []; const blocks = buildMessageBlocks( @@ -734,7 +753,9 @@ onMounted(async () => { try { await Promise.all([getSessions(), getProjects()]); const routeSessionId = getRouteSessionId(); - if (routeSessionId) { + if (routeSessionId === "models") { + activeWorkspace.value = "providers"; + } else if (routeSessionId) { await selectSession(routeSessionId, false); } } finally { @@ -750,10 +771,16 @@ watch( () => route.params.conversationId, async () => { const routeSessionId = getRouteSessionId(); + if (routeSessionId === "models") { + activeWorkspace.value = "providers"; + return; + } if (routeSessionId && routeSessionId !== currSessionId.value) { + showChatWorkspace(); selectedProjectId.value = null; await selectSession(routeSessionId, false); } else if (!routeSessionId && currSessionId.value) { + showChatWorkspace(); currSessionId.value = ""; } }, @@ -780,11 +807,36 @@ function closeMobileSidebar() { } } +function closeSecondaryPanels() { + threadSelection.visible = false; + threadPanelOpen.value = false; + activeThread.value = null; + reasoningPanelOpen.value = false; + activeReasoningTarget.value = null; + refsSidebarOpen.value = false; + selectedRefs.value = null; +} + +function showChatWorkspace() { + activeWorkspace.value = "chat"; +} + +async function openProviderWorkspace() { + closeSecondaryPanels(); + activeWorkspace.value = "providers"; + const targetPath = `${basePath()}/models`; + if (route.path !== targetPath) { + await router.push(targetPath); + } + closeMobileSidebar(); +} + function sessionTitle(session: Session) { return session.display_name?.trim() || tm("conversation.newConversation"); } async function startNewChat() { + showChatWorkspace(); selectedProjectId.value = null; replyTarget.value = null; newChat(); @@ -802,6 +854,7 @@ function openEditProjectDialog(project: Project) { } async function selectProject(projectId: string) { + showChatWorkspace(); selectedProjectId.value = projectId; currSessionId.value = ""; replyTarget.value = null; @@ -910,6 +963,7 @@ async function saveProject(formData: ProjectFormData, projectId?: string) { } async function selectSession(sessionId: string, pushRoute = true) { + showChatWorkspace(); selectedProjectId.value = null; currSessionId.value = sessionId; replyTarget.value = null; @@ -1375,6 +1429,10 @@ function toggleTheme() { font-weight: 500; } +.sidebar-provider-btn { + margin-bottom: 8px; +} + .new-chat-btn:not(.icon-only), .settings-btn:not(.icon-only) { padding-inline: 12px; @@ -1400,6 +1458,11 @@ function toggleTheme() { background: var(--chat-session-active-bg); } +.sidebar-workspace-btn--active { + background: var(--chat-session-active-bg); + color: rgb(var(--v-theme-on-surface)); +} + .chevron-collapsed { transform: rotate(180deg); } @@ -1512,6 +1575,17 @@ function toggleTheme() { justify-content: center; } +.provider-workspace-shell { + flex: 1; + min-height: 0; + overflow: hidden; +} + +.provider-workspace-page { + height: 100%; + min-height: 0; +} + .messages-panel { flex: 1; min-height: 0; diff --git a/dashboard/src/components/chat/ProviderConfigDialog.vue b/dashboard/src/components/chat/ProviderConfigDialog.vue index 359bcecdbd..90c3c7c2cd 100644 --- a/dashboard/src/components/chat/ProviderConfigDialog.vue +++ b/dashboard/src/components/chat/ProviderConfigDialog.vue @@ -1,138 +1,22 @@ diff --git a/dashboard/src/components/provider/ProviderChatCompletionPanel.vue b/dashboard/src/components/provider/ProviderChatCompletionPanel.vue new file mode 100644 index 0000000000..ebb60b90ec --- /dev/null +++ b/dashboard/src/components/provider/ProviderChatCompletionPanel.vue @@ -0,0 +1,432 @@ + + + + + diff --git a/dashboard/src/components/provider/ProviderModelsPanel.vue b/dashboard/src/components/provider/ProviderModelsPanel.vue index a9e6239906..f7bf9aa72b 100644 --- a/dashboard/src/components/provider/ProviderModelsPanel.vue +++ b/dashboard/src/components/provider/ProviderModelsPanel.vue @@ -1,37 +1,40 @@