From 554d192ad1fafdc743427bd9132d49bec6ffe21a Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Tue, 25 Feb 2025 14:14:52 +0800 Subject: [PATCH 01/37] fix package error --- package-lock.json | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/package-lock.json b/package-lock.json index 3d01f4c..17d7fb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.6", "@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", + "@radix-ui/react-switch": "^1.1.3", "@radix-ui/react-tooltip": "^1.1.8", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -1312,6 +1313,34 @@ } } }, + "node_modules/@radix-ui/react-switch": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-switch/-/react-switch-1.1.3.tgz", + "integrity": "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.1", + "@radix-ui/react-compose-refs": "1.1.1", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-primitive": "2.0.2", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-tooltip": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz", @@ -1407,6 +1436,20 @@ } } }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-use-rect": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", From bec7c9069b47530a64ab80e3da224f3083b1f706 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Tue, 25 Feb 2025 14:43:35 +0800 Subject: [PATCH 02/37] fix doubao tags --- src/config/aiCharacters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index f25d5cb..35d5403 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -113,7 +113,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[3].model, avatar: "/img/doubao_new.png", custom_prompt: `你是一个名叫"豆包"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["生活助手", "文字游戏", "学生", "娱乐", "抖音"] + tags: ["聊天", "文字游戏", "学生", "娱乐", "抖音"] }, { id: 'ai6', From 35364209fc56395772e64f31845e82a894246e18 Mon Sep 17 00:00:00 2001 From: hobby Date: Wed, 26 Feb 2025 09:16:33 +0800 Subject: [PATCH 03/37] fix chat ui --- src/components/ChatUI.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 0cab0ec..6d0ed04 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -381,9 +381,9 @@ const ChatUI = () => { <>
-
+
{/* Header */} -
+
{/* 左侧群组信息 */}
@@ -552,7 +552,7 @@ const ChatUI = () => {
{/* Input Area */} -
+
{messages.length > 0 && ( From 5d6525e255b4f6ab58f7864eaa8f57ea7cb59be9 Mon Sep 17 00:00:00 2001 From: hobby Date: Wed, 26 Feb 2025 09:20:22 +0800 Subject: [PATCH 04/37] fix chat ui monile --- src/components/ChatUI.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 6d0ed04..51757a2 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -380,8 +380,8 @@ const ChatUI = () => { return ( <> -
-
+
+
{/* Header */}
From f283dedcbca99c7895fb7d0cf4ac5b7a2b5b6760 Mon Sep 17 00:00:00 2001 From: hobby Date: Wed, 26 Feb 2025 09:23:52 +0800 Subject: [PATCH 05/37] fix chat ui for mobile --- src/components/ChatUI.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 51757a2..5da1ee8 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -380,8 +380,8 @@ const ChatUI = () => { return ( <> -
-
+
+
{/* Header */}
@@ -552,8 +552,8 @@ const ChatUI = () => {
{/* Input Area */} -
-
+
+
{messages.length > 0 && ( From be84be0f186b45cf414d989e5829c5a006d9bf0d Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Wed, 26 Feb 2025 19:58:57 +0800 Subject: [PATCH 06/37] =?UTF-8?q?add=20=E6=99=BA=E6=99=AE=E5=A4=A7?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/img/glm.gif | Bin 0 -> 36251 bytes src/config/aiCharacters.ts | 14 ++++++++++++++ src/config/groups.ts | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 public/img/glm.gif diff --git a/public/img/glm.gif b/public/img/glm.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ac09afafd536c7dcdbadc9b87207ec912d35c8e GIT binary patch literal 36251 zcmY(qbyQUE`u;yNFfjDc4MVr2G&po9NDBx^Hwc0V2uL$@cXxNELkg&LN)4SNAp*YD z{qy|JIiK}Cd;hc7v({c~ueI0py080s?ng~SRZ_}I7o-dN0RsK}1yqj#r`N##SK#Iz zxcmY9y*5sO`CZ`C8j#%yZ0rN5Dxka<=$ZuHWCO$V!2AX`330Pm*(yJ#Sz9-uV> zB#d;!lyfcrVXX#yxa0|;G!#SpLv0+_V`PD6l07Z7_6(5eAkdH{zO zfY1QgH323SfLj|dLIDVKfYTh1cmr_%ebEZwumU*k0Ea9_5i0Ffa(NT+yD+IAbS)r`um0J0MA=MG76yd1UO#<2oHe48&JytTIK)_4`6%` zu&)Am!T?S`fHM$ac@6k>0ti2VEexQ43y{AB2;KmFYe3Z^5H$)Q0s)?AfIb{xivuLG z0sLryA_AB@2Iyk}wlsh;9>`k+wCe$zE}(4<*ti6`cL3okfIJPLO9gPV0Qx+DEDwlS z09?ia(o%r18enJ#B!_?xUjbMfK>Y{+fj}$(fwqc)zLJ8DipT>YEbzaU?y;dz5Ddis z_xbNn(glHVfnc1_u<(e;sBi*eDn>R0S5h(qBNZ_L2$h|ao0p9RW=!N4DB~-wtm021 z0b}JiHsukq@dTCgc6ImkRGL@j}v9`ti8@M_5!CJoc*T(D&gL zR3Z#VNes%-^vqlA{O{EUfpIFY}nAY{_F#yO73U zCR%}vuPx$^_`%+y2rBc3_!I6=qSg@~qK&U1U{lCqW21yr(d)OIX9~W{r2aF@?ABUv z-$q8TsZQ8Z6rNl;{i42yAH|-c#9)30VlAVVjn#=Z^G<<4)9XbdU&!?inT#0o=5zCN z<!A$`_Fc<#m_? zoZhB85TycDA9n2}M2axpTqaKHYRa#>;As(NxMW#JzftUO6RLa};;@~)VJL?Nq0khX zXl1(O?eRCLEOou^GV?IB6sPmn=!%2R7zb5F>c>7uSia|`a!K;>c65Ax@#t|eBosf~ zsn|_Cytv{_7g?;4Ks>}z+Cw7+E6cH9wd1wLFQKgE<4&5WFH6DXXOk`BgBrE}r1RkQ zQ{8Q;{!|E-_b@%*RBV|Ge|k}6It^yF7eWhhMy zejC6)hyDPkkY&pFX(=RZH_8Fa0%OfcCfCwlf4ER$XA5WtGJo-|o zHJq0O_d5G|<@f~|0U5ftgJ1|pjpH)~w=`}4bgy~4i>4NpM-7NA{w|kvj@P88bcuGq zs_{z~C!dkfbTeb8?6zv_$%aWstHc)JvFX!|;9fsCl#Y5}agzUSwPXr|(8knY;%&B= zB|J-j9Dh$_z-32d@Jz~IyK`abD3{POe`5z3C zqd1qA*k`AO_EKEPe?(6W;{O)`p8iYpH~>1wn%*3Ro?nh0E z|NA+8m%i88(?_jvsC(!0skVUg1~&b(!vMj~wM)B@(13s-cjK_=@Yu+Bwb&%i6utzF zn9StVoZNKPtitTvoP27tqRQgZ1ly|m>eNVXR6|=yM~V+oU3*_=UQ}y;<3Q)jp${W9 zdcEUbh-tQ2hUwsmCX3IZ|AGz~0oL|5DKS1HVsS#ZBJ%~q#x~B?_4jK6B8DO|ohls~ z5;E8Vy}C{Tgz!xH@}s>Kaxe;;bWfie*F*_LgJ+bqUt7{dj4Kku&{eTpYD290g`5kt z3l`>-yMaiFD1;F)mZ_}4(N+q8`3S{$T{#*_fkUprZQk=e9~pXNO|}hXu?b6g5*Y6& zH3Ruzt>P?zMhO-_WGArXrH2%0@)64u=&3t@Ho~ehc^4rErMAXxea&@Ke+v?7=r6=k zi=)dj4sUpz$r1ER^m%mJ4KdRIIU#vORD_H~M?`jkeYHNNiEr1eNaS?({HnB6)$n{s zy}7=)8^jm^@5K{UG791Ae@_vWVWQ=BEF8#i8?^dqAlJEVv6(!U6MtV;i7_bKDH z51E)vlzKw|)Mq_1B3*u(=As zLOE=Eo7@oGF&0ZX;;MbX)a-Y0Ym7BPK_^Q}T`+bT>A(qutMM=JMZyDwj{MwYtSPh?(6 zUaa%z>){m#dK!%GaB*B#R-_9v8P0gizXI#1nn%)x+K!P@amZ*X>+U`a5}7blrZNyB z!kLLflP8ftgKe{3#z9FXx0K;2nh?ZcC9Levu`0Nz#+Ij~6w+!}6Wjd7nbD*V-zB>w zp(ayUAXtc{4*Vo4y`ijO-jbG05>)b-g7C5H>j86#YdffFH>Cg3e8$T3KAIP6|oSvI(Ov(rf$M5;Q46i+_WlR3^Lp8=0tR&;X)#6v~i_QeDtgTd!2e;*$maeBQZZM@xu9w#*4uQdfoFk ze`U6O=^qjh7UcFIDl{y{BElpX6&)KJZ)MPyj>ZMCB(!B1KYytxXCd zDiVeTkL8t21PRfmF$hYqbHGxSa5BJlj`RBu00OI8dL(2G+C013I6<&jprhdbNTG#B ziw1S@C$2>wxDZolG)W$xUfW^P?u_j6hgd#iJAksw+hj?NsV`6ed-}*9TwVv!LiLosmm8I%E(TR+Cn0t z0@J5FbDxNq66Z=~W(kQRmfAC#RqkM{?ast+%<1iAYM!+WIx5xvXlcBB^w~v@|KfLS z$Z#+@C5eMx@k2CzuaXWT{-fCU<@xs>3q-jt{G#Y$Hj<|S!>%EEFLNFN;g^#{0;~Gd z0z&V{@4p9%XB$h83Ns-iqLUbWzBgNLy-CuFT7!_(cT)Ktn%qt!hmNCw!4P^MZn{7Q z9U2`h8vm}RX0V_l%U7V3E40@i4`WNZGxjFEn5)t8=*T}sG}|7Fvow1K6A?(Ym$k4i zmJlLU9NTysj)~wzRIp_la(^9$1N#M4o{7~M%ZSQ=tFCHh{jN?ggSqANAag8yw%489 zGiWR6Ip$2ba+mk3xl+rD@RG0$HzoHUQT0WqX1iz6SX=r_YS5%4C~9i@f6%3a+9z0@ zaOdTAHHT=;wZAe_OT_zmp!dom=R`WTw1CiP&zi&ubolldw{nfemvj(N#w5Awd*eFim3-3L+9Sc zE`0c)uWpHxzwLR_&|qBM5~rM!$dVOTpV4-s z_vKApV(j_6U%V;8PC~bKyYk8!n3-*910H=#{OS`F5EiP)6zpUX9vf`XyR#&h!j!9`Z`g^Uxwn-D zLC(N7HTB80|M`RQmXD0|RQN<2oAe}qjXP7930dS)krE>joB#p^U4OsAB_$@p?B(g4 z6q7Iz3L%?{2E(A#d-S>q8L2h^EZz}LQal=a&5a@5hU>SZ!kCoN>SVhh0;1oR7k8w4 z^vN7H*2=4w#gEA-RVUY-Ji}-KFBQ#phM$6<=`c#X1-59_>8MJb!iM{0D+C2Lml<$K-7BQxbg1H_%;ZSCl4D45Yq9IqLk}}IQ_0J1xjH~))m*bRTe3D z;>2%}T~~IWD)lQXBwL5Ibfrj%lW_XtE{f?hjC?GA`C^FQCfDRM{_<-lwMy3~5x~cO z^0oXMKHCYVL~&zy$YTXGxO2FQAK>3OwzdO4c{h5f0QFqGrMHg!8l@1pbI*aH`HBwP zbfq@lS@0@l;Ru1^$=?Bk0T8FG5F85WTLxG4WAdV4Y)(WzSW)**QFgv_MQI#khk>dOuH7iR;K9w&Rw~C_ zmZ<{{Kf2h3zvr4YPEY*JcJ`#x=z+U?f*&Hto{YoFjvgjOi0k)5nI#(Kb6EMe4aj~{ z%z7SuR7RVn&ZWmFc`}Ke#1tM}l%`j6q%*?U2KG`LQ>aSJ(xl^!)+3Z!&TnD=uu$7& z0e5jma4$O7*ifja1VzP2^H%#qs3u`#BiJt*QXe$)=`!^31cyzE4Ar$i>cRg?+5>x5 z6B&PwvTqrUbpDB5rS#imPkxU(j41IuV*yk%qdiI1IFKQRhQP2t)jYuhWq+&HXu_Dk zQ+r5=?q6jh3~Ts@_(T1$xqGI2gBJJMh9ylZ1*n(osjR2lKTrdXF=uDfmI>}}60J{IFKF%kZsn3mw>l$aPg^c{X_M<*?jC#OWf@?Rxu>+Z#e^$C>Ezpf_@N zZ4vJSB)g*De?spRi2V`RqkLSzy)XPYL5e+`e!!2Fy+}Ns@O?l-anZ>9f8ziTHjItOJYMCkS$`rql(b}U;?w$kYS>C3w=|vHDgUZx>%t22 zM6h-HuCH^d()}hlI53RKG9)U5Fw9O{8kHCoYxpK9ojEfrJ4MeeqaeG8JXg7}yr{A? zGQXlOC)cdDxxTzwrL{GX?{AIo@=ojPuLwX74h{Q^O{Qx-o_bO_%QVko|8Y4OVa-Ug zvANF1@OW-vKecxSMb1b?L_tOhySjuEgNdjJH#AX3$EY(_ihtoiAq;D8V_u>mZ`dj5 z&we%<0S*bH5v8JllWd`)5Ko_>ybzR z>tR?$*@f<5auypuzPW#jqEgbLYkZqWveS_N4+M;X#vlZzv}}fF7i4uj>EVoVqz@}P znaInw|TaqNjMWm zI#4Q3=<@4gzsxRE0ZN7JoVENJQHkI;_)U$*S;RwWAcvv8Ic7($5rtS(>RbSe3YbP6 z?itR}g~4Y)iSGoE1*urRy36)u8l8=dm3;pD?sG%FRmOHGskMO|S@ zLQa*sfS5E7UlL^xU-{(F1z#=~(F{8EZC_@Z|78CUUZN%oaX#ulJj=j#270`D!MZcS z#jTpqUOG+gzKtAItH=R&Zrt6u*sOCCvGd5;nS87y;+DkmbdrT<6w1EDM6|2rO++Uf)jR$Lpv!j5h?hvc!Iy z?#~At_fXE-FE<(A{%I8wMaka?lw=k7a6GNr`~b^*%QZqk**$9uXBmior-PP(f00rsxJp5ESpYV^>=@JQ)cBFXsV+{clr`1zGjUp_At&#o@4ecA}k zz-;e)+1NTfIvyQ6`+EMZYNu^w7V+FxK4B8j|0ve3ml zs8~ua);=^S1wVk4&nj!hDhvuG(yNi3upAB}rWVEy5L2+|#iwFWra_{Erwbqb)hQw* zGz`RJo{)4;%-TUJMF7gze0`z=Q=@O&OA5(hBS#GL=Atbf7F!(yA8_ZiW6g(q0EY2y zXwiD}wr7d%ph1EMW(2Y57%lta^NnE#k|sO!@;788t zjF`+{3qT!np-e4OzL1DX0y=b=WV5wKzT7v9{hXYl;%O@>^_lvW!LUx&6u$SC(Zi9; zK2f|!J$?^8G#g4^h$qPAT|=Fs24>FQK#CKWg^^GDx-J!3BCCm;K&7fD*US21O|Aw% zRP6=p)Y7rfR~;;gHbKh@?pId(!O%Xby=RUNuhHuvIGlH@w&gdS%dg1(K#_(-3sF{) z`&~tdx2lY|)+pA=WyZ)mzp-LNCMueg7kCB{U!s4MAJO8md9PS&$yEG611Nnck|~m? zNhAxZYM){2%;1ev7HLHkwHx->yt*v-5leS@46i>`p{f5dx4j~xq|Tx*a>zp|9ub1Z zJk2z@xA&VC##V6}B&P7BHvNSJ%<~TGVR$fU0n&IDbvIuv7Vwy>c zJ-QX@1Ah9=4A90J(KRr4{t|{9ZdWV%YzLy69x!lw)J-FWj>ngI%*hG<7A30v95X$DiRWA}HLgqt<(u~YLODzeKl!qDlGFYA zW5|T7V58k|d<_xf^k;Pfi`*Ka&BT-bH(NoXEi>J&hss^sTAM;PU%cOX=X)i5TNko} zXFa)JFEZ2rw%=)3n`)A~TNS)l*m-`*Mp~3vSlyBBoua9>pO6L>G*o8n0H%KT?6<}$ z&Z$tc3-Y@4L%&I@Z?%x#u-x)stzfc4I8|MAZ8UCV%|34W%4Kr(8Y(iojDkU{7 zJ&l$nJBcYTzo3vNqog!Fr>L?@xF(*ktf4Hvx}~9A%eVlzdw*(HtBN35ld+xhCefyL;A@>wbHn$wvWO z>q2FGOmftK{jH48o>&FJI|+!_(}ob{f#4+LT3>n)4!4P%gYM$9S1>y?$U=Y7C(H({ z3L7R`==L(#a&uZ*QP@1gEr48owPp(Zrdx!>rGK@;;?MDiYnzZY;V1!$lY?S4;h=p8 zjwMpOfP@Rq!As*7C>&GcPpiA~0PJsaG-X7?@Mz*hBWQ3@3UR*&$cJR)mK}@n30pbd zFRcjX1Sy{mgrT`SPZ`oC#c$ll7;;OQYVS|Gm!vE{Q{?SfQO#+H_<6xzC^9EWS@img z2?a6X6h&}BB(YUB2`b?ZR805~pMhA2(a)*8bcoUcdj6S0A*SGqpOS&NfDl%7=>T43 z8ry|EIaUaM4I36rY#ggzj>6@%y6M3er%>gI3nbRmDmHfWm})d%It}M)jjjZ@rL9(r z-t)S4<Uq2wSA*pZUI5`@d& z9LLxd_n`PBW1-fPKZ$Z=WT-GRtR7B1|b8g{kR<$31f{D5m{1JocfgUbUBF z$uT`j^N)^1M3Whl%&xrXAQeq7VMjd~u^l_(N$*()GK86&}R>VOYGj z|KsOe^-@mKLQOvpi#ii*+-dGdUK;q>*#FZ+axI|g*Pw5Ztis@AJ9s_w4^!|{%K^~s z;n+Z4CY0qir=2xe0o5LVxA%|hFK*nofX33kjC0U>BdU6!@tcIeu)sv)^G9e^3@h;K z`x^89uP9ki&(q*bR)}0i`6FyzA^Llpr9B8Fg#1@y$PEE(MrgdV(#gY>A#OQTzH1O3 zL}b8TmxsNZu2{au6>Q6O{ZwaLY#Rm_+5 z4Q|+G#P;#duK3~T$;H{#8PVd@<>~d=r`x;xpX(GyCx_pdk*`X*%|05;U=-*dI**vH z%xn)wQ!+a*RH4Z5A`#76RZWA6VX55A23f(|6oj#GmdFyCl%;SYVmJ(8SycJ75Emh) zGZDgp%AmL5HPo!J|BQ!E1-jE{=beF3K=Rg`^l;`-8dey@MSZw_5`CGed9S$RQXM{k z3eq~cbj9lMUF|6cfg3a%Ei>^GR@*ou`cP{>_D^r2n88qHD}3}7@^O2A=}`ZDd^JI6}!@zP)EWPHdV|Ja7^rC^`Vd; z?)UkX#P|mTw;$PyW`_N=Z_aP|zx z9mLjZ<-9N0V|44$(*CU(F?o(7TMRT(D8$)-1H&4%bN7tWZ#3F*H@a@mco2w^lR_&P z7piDr5fVOu?%0blMcXEDlo=Xg>1gtlM@?Nq4^XB*i^A~DnA8`uX`?kbo<1A6h2)rW zn$WS3?}cL`J!4Gl^5M4GoLH_@#tLjonlx2;iht5T4!%s)T)vW?w{}^thz~GH?-#4~ zi8?69kuRRmHK9`z6@Ney<#HyJNSvs2YXYf?oYNtBK0Rref_P+%zbBFR_Pvw zn8`PYWBj0SOxkh0cX!ikuYflTdWk;nhe>MkX5RQT=S(~DK-2w${M*2ur8>%@FW`~K z13%C6-V}gwwW;NNF0zPp#82&bUgE73Vv)#MztMZqe?dxPoJS)?sMzH5I9Huu&IFsUzy)vcyKgMzWZ^Os+9~Xv85lTs( zK$8@Pk4j6=$jsuR4;7{>$bU#%QY=)SU0GE{LtR%?+St@o-P%f6TiDRt(<{<8kk&gm z)cbxkuX}uWvTUrie&XY7>F1i6rMaPnjOpc-%`cIgJ1dwEOdChL;-_cD`^<;OCtttc zoTXx}u7CVG`+RZv9q&xd!(7-5+#3?y)`*aM(MhIQi!M?C;esiQeJ`vPm7+uunx94y zieM~meJYwHgpHaW^J%d)(%N>26lQR;u-c+qoh2HIQ*Ym@j|-7WtucdRRF$(31f1gr z3*4Y`<4p0Diz|l(7RBK?G#I02NQ5A^HP0mjW5+Q7??dzXItDvh@mEebnlSYUsP=x$ zjc4ZxcDp7nH&t+&z+-&rP4^paV@J59Z{xW)!F|2Pm@9{O27_@^5d<|A8k{5s8Jlh7 zKumoh^MMz7>M<@daoIk$WDc^{(xGBm z*a#NRQ@!C^pKf=fivO^ZumG(Mdo zL)4iUBINIQkR4-OZ7*9pC~m1q?%(~1=w-)irBu32pMwJXoK{X*hVW->n(F=>4vz@A z7tsW=1HR0K4rI*=uy!pp8S?8+}-*7T9$bUi$eTC4X! zrA-fSY^uBDo3YY3i+G31O9QE`-ZTc8aA`^fpIE~a4|+z(s&yrXvPi_xCAB-oy>@VI z)%&x~X;lI^t_jXtgNjiy3ckF_m=pf4pg(w_P&phAx1KwW9)10V0ebhocVu|ap@;sH zT6Q97D@Me{su^MLXCUi{Ci;|G1EBTpAY-_hNQUsTdZ0$l4XSz-UT-GJ9jE8!r`T5u zNsC-p=%ys_6&#WSkz#-N$O%55CVLv^;ILawcsR)2=n~9IN7Xz$eGwXW@@bpsLye{& zg2=X7+m?ow?7`#s6Ks0#Uu7K{cIGBieqU>?D0M_xZV{e8@sDPd>GM-ML*4pJY*l3$ zB-V9Naz8w8()&`sJl{1{)|M5<{ej_vgG)9p5D&PG?A(7t_8$B3-yV4+TBv`@3M=Z) zm66Z9K1~q3cmqmJ)$Z}GE^Phj_@PIQ{|vpWqr8^9W%n{ZUEQZh4+Qv zdiQ2?2(xG3R~?w&zLuTLQ)}Sc`9^RU+t8MYZmcFXQu*r|*DUt=N71dLYmB+AxJ#}S zT6e7mRn^ut6244Z1g#*may0$kt(h8oo2{sE+OY(8^=2G=j7pCi^u%@ukxDRly1`Dv_SJ zXio1Tg|V&<3HJ-;oL4rqgGXrgJ+?&uwq3@pkWxAPS4kL2P$s_9xKfIH(7uiZg3+m0 zy~HCWz@U`lbEt-VL9jf&G6KyhwKAa@ss}0^35Nt7hN*tJOjTbo;dSt2uJ4{pERDx1-a^^Y0h(r!{*wKem4VS-Jmi zxQj-G5x)Bc_kT>KgAgWw;i!8TjbmEEVaZbKsN*pZ7D5R>N#~MvEJ)h9eRt(J1e7d< zt25%Mx2>qhYJ5_Y1gdxnVSlmkNxims3Xcf?*RN{ikxogv5tCi8|g@1e3da8i=u?ONl^~-!3?u(vJx}t~J#Y!m#9$lgqEqQEM zs`>s8U7}ul4O;}1hF;=o+~YqJl4^gxcoswuAY|HQolKSU6vik0#^}(URD&92d}j|4 zYR&aY-<5vCc<}g9;ZtDZ`e-*oH?ff6t=BWEqA2|r>fj>C15JC5g8M!9-Fzz+% z)9%o;SJ+hQ@L-KG0G zIk8kgbus+8^Xk5@_x=(^usjE{SXeq~5$jcwT@`(<+Z3z>MRRe_&Plk=nG#dgUvyOR zbX~_fM1{Lqxd@+*);e|2P253Ejt-4Xs)C{yNJPp^%4}uLVyfX`uXr7BQ#FtW?(v%3 zb0#%E{jkUytm%|-b2nkLVQ-d%*q;brWn@&#?>B`-DOCB{HW}L1)^{`?d;nv;Fx3f> zNcd?x$UC)j!L1HsHx3WORt58StT{htco6O`QT<{<^+Mm0_?JO-loWjXu>FQpmZ&&l zNQOLrHpSnx`FI*iM>Mf>g4{RY+nnK>FUmP^ZOS4jKhvhMY6f;@3!klYY#6^BY=sb`@tuvbzt%e*)p*eMt-f?&A-}XDUoXhOIvRSXL5( zW1^6I(CbJ?N^D1+NY;=cvfLFVR%HnGsK1r4WYj1H6B>>+Q*vL09$_Nmj5*e$oNO^3 zgc8Tbo9$T{VAMN7LofMFMskR+$A>v-F!2HGW+3fK24b?gC^J$U=D4C7BY`)jHv9*pmLKHNTF>jsU# zx{7oCvR)xsdjEO$Mlb(#uaNSK2@Ee-G=DPAf#vu(_svjh?yt0Pkm?PV_n*`>Fl7Yz zx?5Y2-J61EP(@+?jn0{z7_CAUj>?;H-30t0PwMn2(cIv$6!8$a4$Kkp-<=W0|D`(P zzp0L5lnfP#i~d&_kRnMVE|!&g_JtKW>=#Gb@AIDn9OBz4T4MoToPe;LqY3DckR-!g{KIdb?X4iN3PJ0jN zCXX+>De){&VC_VFc*7xdtxCW*jO-X>~UeM7mwb-*%Xz3xEGCTkw9R`tR@Bd zC=w1$!X$posBa%-+K z zKmU^KjG$${6g_{|uU5U|`3kmXs=Fb`UW4!rr82S?6#8EO<*q8DdnY=*h) z^<26jm$hS~R~qexQHMf*7dGP&R?^~BY5zYzKEJQrZ7NoH9?)ljtSUhK-n#h+y<=j% zvfHQgpV&}V@WfWeY`v3#aa+9!2*lL{xw(Nb9ORN{j3_tx$f zQYih³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 L;ihFafdBwIXvW2g literal 0 HcmV?d00001 diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index 35d5403..27e40a3 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -25,6 +25,11 @@ export const modelConfigs = [ apiKey: "HUNYUAN_API_KEY", baseURL: "https://api.hunyuan.cloud.tencent.com/v1" }, + { + model: "glm-4-plus", + apiKey: "GLM_API_KEY", + baseURL: "https://open.bigmodel.cn/api/paas/v4/" + } ] as const; export type ModelType = typeof modelConfigs[number]["model"]; @@ -132,6 +137,15 @@ export function generateAICharacters(groupName: string): AICharacter[] { avatar: "/img/ds.svg", custom_prompt: `你是一个名叫"DeepSeek"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, tags: ["深度推理", "编程", "文字游戏", "数学", "信息总结"] + }, + { + id: 'ai8', + name: "智普", + personality: "glm", + model: modelConfigs[5].model, + avatar: "/img/glm.gif", + custom_prompt: `你是一个名叫"智普"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, + tags: ["新闻报道","分析数据","文字游戏","信息总结"] } ]; } diff --git a/src/config/groups.ts b/src/config/groups.ts index 2643ddf..b9c0d89 100644 --- a/src/config/groups.ts +++ b/src/config/groups.ts @@ -17,6 +17,6 @@ export const groups: Group[] = [ id: 'group2', name: '硅碳生命体交流群', description: '硅碳生命体交流群', - members: ['ai4', 'ai5', 'ai6', 'ai7'] + members: ['ai4', 'ai5', 'ai6', 'ai7', 'ai8'] } ]; From 8d0d2b64bdf189bc6529336bf83fd6e029faa76d Mon Sep 17 00:00:00 2001 From: hobby Date: Thu, 27 Feb 2025 08:12:47 +0800 Subject: [PATCH 07/37] add header --- package-lock.json | 25 ++++++++++++------- package.json | 1 + src/App.tsx | 7 +++--- src/components/Header.tsx | 49 ++++++++++++++++++++++++++++++++++++++ src/components/Layout.tsx | 26 +++++++------------- src/config/aiCharacters.ts | 4 ++-- 6 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 src/components/Header.tsx diff --git a/package-lock.json b/package-lock.json index 35d7320..cd3f9e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "openai": "^4.83.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-github-btn": "^1.4.0", "react-markdown": "^9.0.3", "rehype-katex": "^7.0.1", "remark-gfm": "^4.0.1", @@ -1315,11 +1316,7 @@ }, "node_modules/@radix-ui/react-switch": { "version": "1.1.3", -<<<<<<< HEAD "resolved": "https://registry.npmmirror.com/@radix-ui/react-switch/-/react-switch-1.1.3.tgz", -======= - "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.3.tgz", ->>>>>>> develop "integrity": "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==", "dependencies": { "@radix-ui/primitive": "1.1.1", @@ -1442,11 +1439,7 @@ }, "node_modules/@radix-ui/react-use-previous": { "version": "1.1.0", -<<<<<<< HEAD "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", -======= - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", ->>>>>>> develop "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", "peerDependencies": { "@types/react": "*", @@ -3037,6 +3030,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/github-buttons": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.29.1.tgz", + "integrity": "sha512-TV3YgAKda5hPz75n7QXmGCsSzgVya1vvmBieebg3EB5ScmashTZ0FldViG1aU2d4V5rcAGrtQ7k5uAaCo0A4PA==" + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -5200,6 +5198,17 @@ "react": "^18.3.1" } }, + "node_modules/react-github-btn": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-github-btn/-/react-github-btn-1.4.0.tgz", + "integrity": "sha512-lV4FYClAfjWnBfv0iNlJUGhamDgIq6TayD0kPZED6VzHWdpcHmPfsYOZ/CFwLfPv4Zp+F4m8QKTj0oy2HjiGXg==", + "dependencies": { + "github-buttons": "^2.22.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, "node_modules/react-markdown": { "version": "9.0.3", "resolved": "https://registry.npmmirror.com/react-markdown/-/react-markdown-9.0.3.tgz", diff --git a/package.json b/package.json index ca30053..e363d59 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "openai": "^4.83.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-github-btn": "^1.4.0", "react-markdown": "^9.0.3", "rehype-katex": "^7.0.1", "remark-gfm": "^4.0.1", diff --git a/src/App.tsx b/src/App.tsx index bdae7c3..7154bbe 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,11 +1,12 @@ import ChatUI from './components/ChatUI' import './App.css' +import Layout from './components/Layout' function App() { return ( -
- -
+ + + ) } diff --git a/src/components/Header.tsx b/src/components/Header.tsx new file mode 100644 index 0000000..5862387 --- /dev/null +++ b/src/components/Header.tsx @@ -0,0 +1,49 @@ +import React, { useEffect } from 'react'; +import GitHubButton from 'react-github-btn'; + +const Header: React.FC = () => { + useEffect(() => { + const fetchGitHubStars = async () => { + try { + const response = await fetch('https://api.github.com/repos/maojindao55/botgroup.chat'); + const data = await response.json(); + const starsElement = document.getElementById('github-stars'); + if (starsElement) { + starsElement.textContent = data.stargazers_count.toLocaleString(); + } + } catch (error) { + console.error('Failed to fetch GitHub stars:', error); + } + }; + + fetchGitHubStars(); + }, []); + + return ( +
+
+ {/* Logo */} + + + {/* GitHub Star Button */} +
+ + Star + +
+
+
+ ); +}; + +export default Header; \ No newline at end of file diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index d153d13..e714782 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,23 +1,15 @@ -interface LayoutProps { - children: React.ReactNode -} +import React from 'react'; +import Header from './Header'; -function Layout({ children }: LayoutProps) { +const Layout: React.FC<{ children: React.ReactNode }> = ({ children }) => { return ( -
-
- {/* 这里可以放导航栏 */} -
- -
+
+
+
{children}
- -
- {/* 这里可以放页脚信息 */} -
- ) -} + ); +}; -export default Layout \ No newline at end of file +export default Layout; \ No newline at end of file diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index 27e40a3..72fdecd 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -140,11 +140,11 @@ export function generateAICharacters(groupName: string): AICharacter[] { }, { id: 'ai8', - name: "智普", + name: "智谱", personality: "glm", model: modelConfigs[5].model, avatar: "/img/glm.gif", - custom_prompt: `你是一个名叫"智普"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, + custom_prompt: `你是一个名叫"智谱"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, tags: ["新闻报道","分析数据","文字游戏","信息总结"] } ]; From 5f1c2d003c1a21c16fd674b80709c589eee980e5 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 27 Feb 2025 10:12:10 +0800 Subject: [PATCH 08/37] add log --- package-lock.json | 6 ++++++ package.json | 1 + public/img/logo.svg | 1 + src/components/Header.tsx | 29 +++++++++-------------------- 4 files changed, 17 insertions(+), 20 deletions(-) create mode 100644 public/img/logo.svg diff --git a/package-lock.json b/package-lock.json index cd3f9e8..d741afc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "chat-ui", "version": "1.0.0", "dependencies": { + "@fontsource/audiowide": "^5.1.1", "@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-dropdown-menu": "^2.1.6", @@ -731,6 +732,11 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" }, + "node_modules/@fontsource/audiowide": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/@fontsource/audiowide/-/audiowide-5.1.1.tgz", + "integrity": "sha512-Jb2X0h1TQ+TIfjquviRMxVLMrilq4G8OaUdBNjURDospyrEa3kk5xOYNALAUzjnJHRPtTFHhzOmykV7xlGHEKA==" + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", diff --git a/package.json b/package.json index e363d59..6f58ab7 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "preview": "vite preview" }, "dependencies": { + "@fontsource/audiowide": "^5.1.1", "@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-dropdown-menu": "^2.1.6", diff --git a/public/img/logo.svg b/public/img/logo.svg new file mode 100644 index 0000000..58d5acc --- /dev/null +++ b/public/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 5862387..03def0d 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -1,31 +1,20 @@ import React, { useEffect } from 'react'; import GitHubButton from 'react-github-btn'; +import '@fontsource/audiowide'; + + const Header: React.FC = () => { - useEffect(() => { - const fetchGitHubStars = async () => { - try { - const response = await fetch('https://api.github.com/repos/maojindao55/botgroup.chat'); - const data = await response.json(); - const starsElement = document.getElementById('github-stars'); - if (starsElement) { - starsElement.textContent = data.stargazers_count.toLocaleString(); - } - } catch (error) { - console.error('Failed to fetch GitHub stars:', error); - } - }; - - fetchGitHubStars(); - }, []); - return (
-
+
{/* Logo */} From d318275fc1dd08874f5d5267df8531f2ed3137af Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 27 Feb 2025 10:20:32 +0800 Subject: [PATCH 09/37] fix bg color --- src/components/ChatUI.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 5da1ee8..1ac8692 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -380,7 +380,7 @@ const ChatUI = () => { return ( <> -
+
{/* Header */}
@@ -416,7 +416,7 @@ const ChatUI = () => {
)}
-
+

{group.name}

From c68476d3f325391653b9a984a77b88465db621fd Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 27 Feb 2025 10:22:42 +0800 Subject: [PATCH 10/37] fix bg color --- src/components/ChatUI.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 1ac8692..a427fa7 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -416,7 +416,7 @@ const ChatUI = () => {
)}
-
+

{group.name}

From 3e51fc519472bcbd01f6d9bd4c4d0270c3ae2cca Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 27 Feb 2025 19:22:25 +0800 Subject: [PATCH 11/37] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Header.tsx | 2 +- src/config/aiCharacters.ts | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/components/Header.tsx b/src/components/Header.tsx index 03def0d..7b17179 100644 --- a/src/components/Header.tsx +++ b/src/components/Header.tsx @@ -22,7 +22,7 @@ const Header: React.FC = () => {
Date: Thu, 27 Feb 2025 19:33:28 +0800 Subject: [PATCH 12/37] fix prompt --- functions/api/chat.ts | 2 +- src/config/aiCharacters.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/functions/api/chat.ts b/functions/api/chat.ts index b4dc331..323ec4a 100644 --- a/functions/api/chat.ts +++ b/functions/api/chat.ts @@ -25,7 +25,7 @@ export async function onRequestPost({ env, request }) { // 根据性格设置不同的系统提示语 let systemPrompt = ""; - systemPrompt = custom_prompt + "\n 注意重要:1、你在群里叫" + aiName + ",你的输出内容不要加" + aiName + ":这种多余前缀;2、如果用户提出玩游戏,比如成语接龙等,严格按照游戏规则,不要说一大堆,要简短精炼" + systemPrompt = custom_prompt + "\n 注意重要:1、你在群里叫" + aiName + "认准自己的身份,你的输出内容不要加" + aiName + ":这种多余前缀;2、如果用户提出玩游戏,比如成语接龙等,严格按照游戏规则,不要说一大堆,要简短精炼; 3、不要重复别人的话!" // 构建完整的消息历史 const baseMessages = [ diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index 1c4b64b..74b0184 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -114,7 +114,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[2].model, avatar: "/img/yuanbao.png", custom_prompt: `你是一个名叫"元宝"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["微信生态", "新闻报道", "文字游戏", "生活助手", "娱乐", "信息总结"] + tags: ["微信", "聊天", "新闻报道", "文字游戏", "生活助手", "娱乐", "信息总结"] }, { id: 'ai5', @@ -132,7 +132,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[0].model, avatar: "/img/qwen.jpg", custom_prompt: `你是一个名叫"千问"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["广告文案","分析数据","文字游戏","信息总结", "阿里"] + tags: ["广告文案","分析数据","文字游戏","信息总结", "聊天"] }, { id: 'ai7', @@ -141,7 +141,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[4].model, avatar: "/img/ds.svg", custom_prompt: `你是一个名叫"DeepSeek"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["深度推理", "编程", "文字游戏", "数学", "信息总结"] + tags: ["深度推理", "编程", "文字游戏", "数学", "信息总结", "聊天"] }, { id: 'ai8', @@ -150,7 +150,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[5].model, avatar: "/img/glm.gif", custom_prompt: `你是一个名叫"智谱"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["新闻报道","分析数据","文字游戏","信息总结"] + tags: ["新闻报道","分析数据","文字游戏","信息总结", "聊天"] } ]; } From fcf0a0037024837a79d23a8d9d6931cf6052f673 Mon Sep 17 00:00:00 2001 From: hobby Date: Thu, 27 Feb 2025 21:11:52 +0800 Subject: [PATCH 13/37] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/index.html b/index.html index 124ec75..d020cee 100644 --- a/index.html +++ b/index.html @@ -5,6 +5,15 @@ AI机器人群聊 +
From 8f29f9a2931a74b7a3857b05bcd58a0f01f62138 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Sat, 1 Mar 2025 00:34:17 +0800 Subject: [PATCH 14/37] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E7=BE=A4?= =?UTF-8?q?=E8=81=8A&UI=E6=94=B9=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions/api/chat.ts | 2 +- package-lock.json | 31 +- package.json | 1 + src/components/ChatUI.tsx | 438 +++++++++--------- src/components/Layout.tsx | 9 +- src/components/Sidebar.tsx | 166 +++++++ src/components/ui/separator.tsx | 29 ++ src/components/ui/sidebar.tsx | 761 ++++++++++++++++++++++++++++++++ src/components/ui/skeleton.tsx | 15 + src/config/aiCharacters.ts | 4 +- src/config/groups.ts | 15 +- src/hooks/use-mobile.tsx | 19 + src/index.css | 36 +- tailwind.config.js | 10 + 14 files changed, 1311 insertions(+), 225 deletions(-) create mode 100644 src/components/Sidebar.tsx create mode 100644 src/components/ui/separator.tsx create mode 100644 src/components/ui/sidebar.tsx create mode 100644 src/components/ui/skeleton.tsx create mode 100644 src/hooks/use-mobile.tsx diff --git a/functions/api/chat.ts b/functions/api/chat.ts index 323ec4a..076fd47 100644 --- a/functions/api/chat.ts +++ b/functions/api/chat.ts @@ -25,7 +25,7 @@ export async function onRequestPost({ env, request }) { // 根据性格设置不同的系统提示语 let systemPrompt = ""; - systemPrompt = custom_prompt + "\n 注意重要:1、你在群里叫" + aiName + "认准自己的身份,你的输出内容不要加" + aiName + ":这种多余前缀;2、如果用户提出玩游戏,比如成语接龙等,严格按照游戏规则,不要说一大堆,要简短精炼; 3、不要重复别人的话!" + systemPrompt = custom_prompt + "\n 注意重要:1、你在群里叫" + aiName + "认准自己的身份; 2、你的输出内容不要加" + aiName + ":这种多余前缀;3、如果用户提出玩游戏,比如成语接龙等,严格按照游戏规则,不要说一大堆,要简短精炼; 4、不要重复别人的话!" // 构建完整的消息历史 const baseMessages = [ diff --git a/package-lock.json b/package-lock.json index d741afc..a791fab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-dropdown-menu": "^2.1.6", "@radix-ui/react-scroll-area": "^1.2.3", + "@radix-ui/react-separator": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-switch": "^1.1.3", "@radix-ui/react-tooltip": "^1.1.8", @@ -1303,9 +1304,31 @@ } } }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-separator/-/react-separator-1.1.2.tgz", + "integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-slot": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.1.2.tgz", "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==", "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" @@ -1350,7 +1373,7 @@ }, "node_modules/@radix-ui/react-tooltip": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz", "integrity": "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==", "dependencies": { "@radix-ui/primitive": "1.1.1", @@ -2411,7 +2434,7 @@ }, "node_modules/class-variance-authority": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "resolved": "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz", "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", "dependencies": { "clsx": "^2.1.1" @@ -3743,7 +3766,7 @@ }, "node_modules/lucide-react": { "version": "0.263.1", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.263.1.tgz", + "resolved": "https://registry.npmmirror.com/lucide-react/-/lucide-react-0.263.1.tgz", "integrity": "sha512-keqxAx97PlaEN89PXZ6ki1N8nRjGWtDa4021GFYLNj0RgruM5odbpl8GHTExj0hhPq3sF6Up0gnxt6TSHu+ovw==", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0" diff --git a/package.json b/package.json index 6f58ab7..67f5c97 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-dropdown-menu": "^2.1.6", "@radix-ui/react-scroll-area": "^1.2.3", + "@radix-ui/react-separator": "^1.1.2", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-switch": "^1.1.3", "@radix-ui/react-tooltip": "^1.1.8", diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index a427fa7..56dea00 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -1,5 +1,5 @@ import React, { useState, useRef, useEffect } from 'react'; -import { Send, Menu, MoreHorizontal, UserPlus, UserMinus, Users2, Users, MoreVertical, Share2, Mic, MicOff, Settings2 } from 'lucide-react'; +import { Send, Share2, Settings2, ChevronLeft } from 'lucide-react'; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; @@ -25,9 +25,9 @@ import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm' import remarkMath from 'remark-math' import rehypeKatex from 'rehype-katex' -import html2canvas from 'html2canvas'; import { SharePoster } from '@/components/SharePoster'; import { MembersManagement } from '@/components/MembersManagement'; +import Sidebar from './Sidebar'; // 使用本地头像数据,避免外部依赖 const getAvatarData = (name: string) => { @@ -146,9 +146,15 @@ const KaTeXStyle = () => ( ); const ChatUI = () => { - const [group, setGroup] = useState(groups[1]); - const [isGroupDiscussionMode, setIsGroupDiscussionMode] = useState(false); - const groupAiCharacters = generateAICharacters(group.name).filter(character => group.members.includes(character.id)); + // 使用当前选中的群组在 groups 数组中的索引 + const [selectedGroupIndex, setSelectedGroupIndex] = useState(0); // 默认选中第1个群组 + const [group, setGroup] = useState(groups[selectedGroupIndex]); + const [isGroupDiscussionMode, setIsGroupDiscussionMode] = useState(group.isGroupDiscussionMode); + const groupAiCharacters = generateAICharacters(group.name) + .filter(character => group.members.includes(character.id)) + .sort((a, b) => { + return group.members.indexOf(a.id) - group.members.indexOf(b.id); + }); const [users, setUsers] = useState([ { id: 1, name: "我" }, ...groupAiCharacters @@ -258,7 +264,7 @@ const ChatUI = () => { history: messageHistory, index: i, aiName: selectedGroupAiCharacters[i].name, - custom_prompt: selectedGroupAiCharacters[i].custom_prompt + custom_prompt: selectedGroupAiCharacters[i].custom_prompt + "\n" + group.description }), }); @@ -377,220 +383,240 @@ const ChatUI = () => { setShowPoster(true); }; + const [sidebarOpen, setSidebarOpen] = useState(false); + + // 切换侧边栏状态的函数 + const toggleSidebar = () => { + setSidebarOpen(!sidebarOpen); + }; + + // 处理群组选择 + const handleSelectGroup = (index: number) => { + setSelectedGroupIndex(index); + const newGroup = groups[index]; + setGroup(newGroup); + + // 重新生成当前群组的 AI 角色,并按照 members 数组的顺序排序 + const newGroupAiCharacters = generateAICharacters(newGroup.name) + .filter(character => newGroup.members.includes(character.id)) + .sort((a, b) => { + return newGroup.members.indexOf(a.id) - newGroup.members.indexOf(b.id); + }); + + // 更新用户列表 + setUsers([ + { id: 1, name: "我" }, + ...newGroupAiCharacters + ]); + setIsGroupDiscussionMode(newGroup.isGroupDiscussionMode); + + // 重置消息 + setMessages([]); + + // 可选:关闭侧边栏(在移动设备上) + if (window.innerWidth < 768) { + setSidebarOpen(false); + } + }; + return ( <>
-
- {/* Header */} -
-
- {/* 左侧群组信息 */} -
-
-
- {users.length === 1 ? ( - - ) : users.length === 2 ? ( -
- {users.slice(0, 2).map((user, index) => ( - - ))} -
- ) : users.length === 3 ? ( -
-
- {users.slice(0, 2).map((user, index) => ( - - ))} -
-
- -
-
- ) : ( -
- {users.slice(0, 4).map((user, index) => ( - - ))} +
+ {/* 传递 selectedGroupIndex 和 onSelectGroup 回调给 Sidebar */} + + + {/* 聊天主界面 */} +
+ {/* Header */} +
+
+ {/* 左侧群组信息 */} +
+
+ +
+ +

{group.name}({users.length})

+
+ + {/* 右侧头像组和按钮 */} +
+
+ {users.slice(0, 4).map((user) => { + const avatarData = getAvatarData(user.name); + return ( + + + + + {'avatar' in user && user.avatar ? ( + + ) : ( + + {avatarData.text} + + )} + + + +

{user.name}

+
+
+
+ ); + })} + {users.length > 4 && ( +
+ +{users.length - 4}
)}
-
-
-
-

{group.name}

-

{users.length} 名成员

+
- - {/* 右侧头像组和按钮 */} -
-
- {users.slice(0, 4).map((user) => { - const avatarData = getAvatarData(user.name); - return ( - - - - - {'avatar' in user && user.avatar ? ( - - ) : ( - - {avatarData.text} - - )} - - - -

{user.name}

-
-
-
- ); - })} - {users.length > 4 && ( -
- +{users.length - 4} +
+ + {/* Main Chat Area */} +
+ +
+ {messages.map((message) => ( +
+ {message.sender.name !== "我" && ( + + {'avatar' in message.sender && message.sender.avatar ? ( + + ) : ( + + {message.sender.name[0]} + + )} + + )} +
+
{message.sender.name}
+
+ + {message.content} + + {message.isAI && isTyping && currentMessageRef.current === message.id && ( + + )} +
+
+ {message.sender.name === "我" && ( + + {'avatar' in message.sender && message.sender.avatar ? ( + + ) : ( + + {message.sender.name[0]} + + )} + + )}
- )} + ))} +
+ {/* 添加一个二维码 */} +
+ QR Code +

扫码体验AI群聊

+
-
+ + {/* Input Area */} +
+
+ {messages.length > 0 && ( + + + + + + +

分享聊天记录

+
+
+
+ )} + setInputMessage(e.target.value)} + onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()} + /> +
-
- - {/* Main Chat Area */} -
- -
- {messages.map((message) => ( -
- {message.sender.name !== "我" && ( - - {'avatar' in message.sender && message.sender.avatar ? ( - - ) : ( - - {message.sender.name[0]} - - )} - - )} -
-
{message.sender.name}
-
- - {message.content} - - {message.isAI && isTyping && currentMessageRef.current === message.id && ( - - )} -
-
- {message.sender.name === "我" && ( - - {'avatar' in message.sender && message.sender.avatar ? ( - - ) : ( - - {message.sender.name[0]} - - )} - - )} -
- ))} -
- {/* 添加一个二维码 */} -
- QR Code -

扫码体验AI群聊

-
-
- -
- - {/* Input Area */} -
-
- {messages.length > 0 && ( - - - - - - -

分享聊天记录

-
-
-
- )} - setInputMessage(e.target.value)} - onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()} - /> - -
diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index e714782..c417600 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -4,10 +4,11 @@ import Header from './Header'; const Layout: React.FC<{ children: React.ReactNode }> = ({ children }) => { return (
-
-
- {children} -
+
+
+ {children} +
+
); }; diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx new file mode 100644 index 0000000..b960def --- /dev/null +++ b/src/components/Sidebar.tsx @@ -0,0 +1,166 @@ +import React from 'react'; +import { Button } from "@/components/ui/button"; +import { MessageSquareIcon, PlusCircleIcon, MenuIcon, PanelLeftCloseIcon } from "lucide-react"; +import { cn } from "@/lib/utils"; +import GitHubButton from 'react-github-btn'; +import '@fontsource/audiowide'; +import { groups } from "@/config/groups"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; + +// 根据群组ID生成固定的随机颜色 +const getRandomColor = (index: number) => { + const colors = ['blue', 'green', 'yellow', 'purple', 'pink', 'indigo', 'red', 'orange', 'teal']; + //增加hash + const hashCode = index.toString().split('').reduce((acc, char) => { + return char.charCodeAt(0) + ((acc << 5) - acc); + }, 0); + return colors[hashCode % colors.length]; +}; + +interface SidebarProps { + isOpen: boolean; + toggleSidebar: () => void; + selectedGroupIndex?: number; + onSelectGroup?: (index: number) => void; +} + +const Sidebar = ({ isOpen, toggleSidebar, selectedGroupIndex = 0, onSelectGroup }: SidebarProps) => { + + return ( + <> + {/* 侧边栏 - 在移动设备上可以隐藏,在桌面上始终显示 */} +
+
+
+
+ + 群列表 + + +
+
+ + + + {/* GitHub Star Button - 只在侧边栏打开时显示,放在底部 */} +
+ {/* 标题移至底部 */} + + + {isOpen && ( +
+ + Star + +
+ )} +
+
+
+ + {/* 移动设备上的遮罩层,点击时关闭侧边栏 */} + {isOpen && ( +
+ )} + + ); +}; + +export default Sidebar; \ No newline at end of file diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx new file mode 100644 index 0000000..6d7f122 --- /dev/null +++ b/src/components/ui/separator.tsx @@ -0,0 +1,29 @@ +import * as React from "react" +import * as SeparatorPrimitive from "@radix-ui/react-separator" + +import { cn } from "@/lib/utils" + +const Separator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref + ) => ( + + ) +) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/src/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx new file mode 100644 index 0000000..dcf03e0 --- /dev/null +++ b/src/components/ui/sidebar.tsx @@ -0,0 +1,761 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { VariantProps, cva } from "class-variance-authority" +import { PanelLeft } from "lucide-react" + +import { useIsMobile } from "@/hooks/use-mobile" +import { cn } from "@/lib/utils" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Separator } from "@/components/ui/separator" +import { Sheet, SheetContent } from "@/components/ui/sheet" +import { Skeleton } from "@/components/ui/skeleton" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip" + +const SIDEBAR_COOKIE_NAME = "sidebar_state" +const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 +const SIDEBAR_WIDTH = "16rem" +const SIDEBAR_WIDTH_MOBILE = "18rem" +const SIDEBAR_WIDTH_ICON = "3rem" +const SIDEBAR_KEYBOARD_SHORTCUT = "b" + +type SidebarContext = { + state: "expanded" | "collapsed" + open: boolean + setOpen: (open: boolean) => void + openMobile: boolean + setOpenMobile: (open: boolean) => void + isMobile: boolean + toggleSidebar: () => void +} + +const SidebarContext = React.createContext(null) + +function useSidebar() { + const context = React.useContext(SidebarContext) + if (!context) { + throw new Error("useSidebar must be used within a SidebarProvider.") + } + + return context +} + +const SidebarProvider = React.forwardRef< + HTMLDivElement, + React.ComponentProps<"div"> & { + defaultOpen?: boolean + open?: boolean + onOpenChange?: (open: boolean) => void + } +>( + ( + { + defaultOpen = true, + open: openProp, + onOpenChange: setOpenProp, + className, + style, + children, + ...props + }, + ref + ) => { + const isMobile = useIsMobile() + const [openMobile, setOpenMobile] = React.useState(false) + + // This is the internal state of the sidebar. + // We use openProp and setOpenProp for control from outside the component. + const [_open, _setOpen] = React.useState(defaultOpen) + const open = openProp ?? _open + const setOpen = React.useCallback( + (value: boolean | ((value: boolean) => boolean)) => { + const openState = typeof value === "function" ? value(open) : value + if (setOpenProp) { + setOpenProp(openState) + } else { + _setOpen(openState) + } + + // This sets the cookie to keep the sidebar state. + document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}` + }, + [setOpenProp, open] + ) + + // Helper to toggle the sidebar. + const toggleSidebar = React.useCallback(() => { + return isMobile + ? setOpenMobile((open) => !open) + : setOpen((open) => !open) + }, [isMobile, setOpen, setOpenMobile]) + + // Adds a keyboard shortcut to toggle the sidebar. + React.useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if ( + event.key === SIDEBAR_KEYBOARD_SHORTCUT && + (event.metaKey || event.ctrlKey) + ) { + event.preventDefault() + toggleSidebar() + } + } + + window.addEventListener("keydown", handleKeyDown) + return () => window.removeEventListener("keydown", handleKeyDown) + }, [toggleSidebar]) + + // We add a state so that we can do data-state="expanded" or "collapsed". + // This makes it easier to style the sidebar with Tailwind classes. + const state = open ? "expanded" : "collapsed" + + const contextValue = React.useMemo( + () => ({ + state, + open, + setOpen, + isMobile, + openMobile, + setOpenMobile, + toggleSidebar, + }), + [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar] + ) + + return ( + + +
+ {children} +
+
+
+ ) + } +) +SidebarProvider.displayName = "SidebarProvider" + +const Sidebar = React.forwardRef< + HTMLDivElement, + React.ComponentProps<"div"> & { + side?: "left" | "right" + variant?: "sidebar" | "floating" | "inset" + collapsible?: "offcanvas" | "icon" | "none" + } +>( + ( + { + side = "left", + variant = "sidebar", + collapsible = "offcanvas", + className, + children, + ...props + }, + ref + ) => { + const { isMobile, state, openMobile, setOpenMobile } = useSidebar() + + if (collapsible === "none") { + return ( +
+ {children} +
+ ) + } + + if (isMobile) { + return ( + + +
{children}
+
+
+ ) + } + + return ( +
+ {/* This is what handles the sidebar gap on desktop */} +
+ +
+ ) + } +) +Sidebar.displayName = "Sidebar" + +const SidebarTrigger = React.forwardRef< + React.ElementRef, + React.ComponentProps +>(({ className, onClick, ...props }, ref) => { + const { toggleSidebar } = useSidebar() + + return ( + + ) +}) +SidebarTrigger.displayName = "SidebarTrigger" + +const SidebarRail = React.forwardRef< + HTMLButtonElement, + React.ComponentProps<"button"> +>(({ className, ...props }, ref) => { + const { toggleSidebar } = useSidebar() + + return ( + + + e.preventDefault()}> +
+ 公众号二维码 +
+
+ + +
+
+
+
+
+ ); +}; + +const AdBanner: React.FC = ({ show, closeAd }) => { + if (!show) return null; + + return ( +
+
+ 广
告 +
+
+
+
+ +
+
+ + + + + e.preventDefault()}> +
+ 公众号二维码 + +
+
+
+ + +
+
+
+
+ ); +}; + +export { AdSection, AdBanner }; \ No newline at end of file diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index b451b0b..ce202c7 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -4,6 +4,7 @@ import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Avatar, AvatarImage, AvatarFallback } from "@/components/ui/avatar"; + import { Tooltip, TooltipContent, @@ -21,7 +22,7 @@ import rehypeKatex from 'rehype-katex' import { SharePoster } from '@/components/SharePoster'; import { MembersManagement } from '@/components/MembersManagement'; import Sidebar from './Sidebar'; - +import { AdBanner } from './AdSection'; // 使用本地头像数据,避免外部依赖 const getAvatarData = (name: string) => { const colors = ['#1abc9c', '#3498db', '#9b59b6', '#f1c40f', '#e67e22']; @@ -157,6 +158,7 @@ const ChatUI = () => { const [messages, setMessages] = useState([ ]); + const [showAd, setShowAd] = useState(true); const [inputMessage, setInputMessage] = useState(""); const [isLoading, setIsLoading] = useState(false); const [pendingContent, setPendingContent] = useState(""); @@ -444,9 +446,14 @@ const ChatUI = () => {

{group.name}({users.length})

+ {/* 右侧头像组和按钮 */}
+ {/* 广告位 手机端不展示*/} +
+ setShowAd(false)} /> +
{users.slice(0, 4).map((user) => { const avatarData = getAvatarData(user.name); diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index b960def..a879de7 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -5,6 +5,7 @@ import { cn } from "@/lib/utils"; import GitHubButton from 'react-github-btn'; import '@fontsource/audiowide'; import { groups } from "@/config/groups"; +import { AdSection } from './AdSection'; import { Tooltip, TooltipContent, @@ -118,8 +119,11 @@ const Sidebar = ({ isOpen, toggleSidebar, selectedGroupIndex = 0, onSelectGroup
+ {/* 广告位 */} + + {/* GitHub Star Button - 只在侧边栏打开时显示,放在底部 */} -
+
{/* 标题移至底部 */}
diff --git a/src/components/ui/popover.tsx b/src/components/ui/popover.tsx new file mode 100644 index 0000000..8577b8a --- /dev/null +++ b/src/components/ui/popover.tsx @@ -0,0 +1,29 @@ +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent } \ No newline at end of file From d9551e3d6cd5359ab5d0eb6937111f372709d5ea Mon Sep 17 00:00:00 2001 From: hobby Date: Thu, 6 Mar 2025 08:39:43 +0800 Subject: [PATCH 21/37] add mobile ad --- src/components/AdSection.tsx | 211 ++++++++++++++++++++++++++--------- src/components/ChatUI.tsx | 14 ++- 2 files changed, 172 insertions(+), 53 deletions(-) diff --git a/src/components/AdSection.tsx b/src/components/AdSection.tsx index d276b12..a1de203 100644 --- a/src/components/AdSection.tsx +++ b/src/components/AdSection.tsx @@ -17,6 +17,19 @@ interface AdBannerProps { } const AdSection: React.FC = ({ isOpen}) => { + const [isMobile, setIsMobile] = useState(false); + + React.useEffect(() => { + const checkDevice = () => { + setIsMobile(window.innerWidth <= 768); + }; + + checkDevice(); + window.addEventListener('resize', checkDevice); + + return () => window.removeEventListener('resize', checkDevice); + }, []); + return (
= ({ isOpen}) => {
万能的助手, 懂你的伙伴
驱动
- - - - - e.preventDefault()}> -
- 公众号二维码 -
-
-
- + ) : + ( + + + + + e.preventDefault()}> +
+ 公众号二维码 +
+
+
) + + } + + + + + {isMobile ? ( + + ) : ( + + )}
@@ -88,33 +133,38 @@ const AdBanner: React.FC = ({ show, closeAd }) => {
-
- - - - - e.preventDefault()}> -
- 公众号二维码 +
+
+ + + + + e.preventDefault()}> +
+ 公众号二维码 -
-
-
- +
+ + + +
@@ -125,4 +175,63 @@ const AdBanner: React.FC = ({ show, closeAd }) => { ); }; -export { AdSection, AdBanner }; \ No newline at end of file +const AdBannerMobile: React.FC = ({ show, closeAd }) => { + const [isMobile, setIsMobile] = useState(false); + + React.useEffect(() => { + const checkDevice = () => { + setIsMobile(window.innerWidth <= 768); + }; + + checkDevice(); + window.addEventListener('resize', checkDevice); + + return () => window.removeEventListener('resize', checkDevice); + }, []); + + if (!show) return null; + + return ( +
+
+ 广
告 +
+
+
+
+ +
+
+
+ + +
+ +
+
+
+
+ ); +}; + +export { AdSection, AdBanner, AdBannerMobile }; \ No newline at end of file diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index ce202c7..f0b42d6 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -22,7 +22,7 @@ import rehypeKatex from 'rehype-katex' import { SharePoster } from '@/components/SharePoster'; import { MembersManagement } from '@/components/MembersManagement'; import Sidebar from './Sidebar'; -import { AdBanner } from './AdSection'; +import { AdBanner, AdBannerMobile } from './AdSection'; // 使用本地头像数据,避免外部依赖 const getAvatarData = (name: string) => { const colors = ['#1abc9c', '#3498db', '#9b59b6', '#f1c40f', '#e67e22']; @@ -194,6 +194,12 @@ const ChatUI = () => { ); }; + useEffect(() => { + if (messages.length > 0) { + setShowAd(false); + } + }, [messages]); + const handleSendMessage = async () => { //判断是否Loding if (isLoading) return; @@ -493,7 +499,11 @@ const ChatUI = () => { {/* Main Chat Area */}
- + + +
+ setShowAd(false)} /> +
{messages.map((message) => (
Date: Thu, 6 Mar 2025 10:36:06 +0800 Subject: [PATCH 22/37] =?UTF-8?q?=E6=91=98=E9=99=A4deepseek?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/groups.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config/groups.ts b/src/config/groups.ts index 3d6060a..6717b31 100644 --- a/src/config/groups.ts +++ b/src/config/groups.ts @@ -12,7 +12,7 @@ export const groups: Group[] = [ id: 'group1', name: '🔥硅碳生命体交流群', description: '', - members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10'], + members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai9', 'ai10'], isGroupDiscussionMode: false }, { @@ -20,14 +20,14 @@ export const groups: Group[] = [ name: '🎯AI成语接龙游戏群', description: '可以适当打招呼问候自我介绍,但是本群主线是成语接龙游戏,请严格按照文字成语接龙规则,不能过度闲聊,一旦游戏开始不要过度解释,只允许回复1条成语', isGroupDiscussionMode: true, - members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10'], + members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai9', 'ai10'], }, { id: 'group3', name: '💕AI树洞倾诉群', description: '做一个一个温暖贴心的倾听者。当用户分享烦恼或秘密时,请表现出理解和同理心,提供情感支持而非简单建议。避免评判,保持尊重,适当提问以帮助用户更好地表达自己。记住,你的角色是提供安全的倾诉空间,而不是解决所有问题。', isGroupDiscussionMode: true, - members: [ 'ai8','ai5', 'ai6', 'ai7', 'ai9', 'ai10'], + members: [ 'ai8','ai5', 'ai6', 'ai9', 'ai10'], }, // { // id: 'group3', From 42cbd2dea1105baf4477770973b484a06b756fd5 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 6 Mar 2025 13:16:09 +0800 Subject: [PATCH 23/37] fix ad selection & catch some error --- src/components/AdSection.tsx | 6 +++--- src/components/ChatUI.tsx | 27 +++++++++++++++++++++++---- src/config/aiCharacters.ts | 2 +- src/config/groups.ts | 2 +- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/components/AdSection.tsx b/src/components/AdSection.tsx index a1de203..a36ce32 100644 --- a/src/components/AdSection.tsx +++ b/src/components/AdSection.tsx @@ -156,12 +156,12 @@ const AdBanner: React.FC = ({ show, closeAd }) => {
diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index f0b42d6..348c50f 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -283,10 +283,24 @@ const ChatUI = () => { let buffer = ''; let completeResponse = ''; // 用于跟踪完整的响应 - + // 添加超时控制 + const timeout = 5000; // 5秒超时 while (true) { - const { done, value } = await reader.read(); - + //console.log("读取中") + const startTime = Date.now(); + const { done, value } = await Promise.race([ + reader.read(), + new Promise((_, reject) => + setTimeout(() => reject(new Error('响应超时')), timeout - (Date.now() - startTime)) + ) + ]); + + if (Date.now() - startTime > timeout) { + reader.cancel(); + + throw new Error('响应超时'); + } + if (done) { //如果completeResponse为空, if (completeResponse.trim() === "") { @@ -353,9 +367,14 @@ const ChatUI = () => { } catch (error) { console.error("发送消息失败:", error); + messageHistory.push({ + role: 'user', + content: aiMessage.sender.name + "(发生错误: " + error.message + ")下一位回答。", + name: aiMessage.sender.name + }); setMessages(prev => prev.map(msg => msg.id === aiMessage.id - ? { ...msg, content: "错误: " + error.message, isError: true } + ? { ...msg, content: "(发生错误: " + error.message + ")下一位回答。", isError: true } : msg )); } diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index 4ada390..ea049d8 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -38,7 +38,7 @@ export const modelConfigs = [ { model: "deepseek-chat", apiKey: "DEEPSEEK_API_KEY", - baseURL: "https://api.deepseek.com" + baseURL: "https://api.deepseek.com/v1" }, { model: "moonshot-v1-8k", diff --git a/src/config/groups.ts b/src/config/groups.ts index 6717b31..2faf9f0 100644 --- a/src/config/groups.ts +++ b/src/config/groups.ts @@ -12,7 +12,7 @@ export const groups: Group[] = [ id: 'group1', name: '🔥硅碳生命体交流群', description: '', - members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai9', 'ai10'], + members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10'], isGroupDiscussionMode: false }, { From 4662a45166d956fe58acc6002772c98fb9fe5d7a Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 6 Mar 2025 13:22:10 +0800 Subject: [PATCH 24/37] fix ad selection & catch some error --- src/components/ChatUI.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 348c50f..d900908 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -369,12 +369,12 @@ const ChatUI = () => { console.error("发送消息失败:", error); messageHistory.push({ role: 'user', - content: aiMessage.sender.name + "(发生错误: " + error.message + ")下一位回答。", + content: aiMessage.sender.name + "我遇到错误: " + error.message + ",下一位回答。", name: aiMessage.sender.name }); setMessages(prev => prev.map(msg => msg.id === aiMessage.id - ? { ...msg, content: "(发生错误: " + error.message + ")下一位回答。", isError: true } + ? { ...msg, content: "我遇到错误: " + error.message + ",下一位回答。", isError: true } : msg )); } From 54c4e34e62473962dbd933413e45026c653eef1d Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 6 Mar 2025 13:26:05 +0800 Subject: [PATCH 25/37] deepseek comeback --- src/config/groups.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/groups.ts b/src/config/groups.ts index 2faf9f0..51e502e 100644 --- a/src/config/groups.ts +++ b/src/config/groups.ts @@ -20,7 +20,7 @@ export const groups: Group[] = [ name: '🎯AI成语接龙游戏群', description: '可以适当打招呼问候自我介绍,但是本群主线是成语接龙游戏,请严格按照文字成语接龙规则,不能过度闲聊,一旦游戏开始不要过度解释,只允许回复1条成语', isGroupDiscussionMode: true, - members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai9', 'ai10'], + members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10'], }, { id: 'group3', From 4b967c362fa6d7c5200c3acd9546a4191c1536a3 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 6 Mar 2025 13:31:11 +0800 Subject: [PATCH 26/37] reading timeout 8s --- src/components/ChatUI.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index d900908..5d39781 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -284,7 +284,7 @@ const ChatUI = () => { let buffer = ''; let completeResponse = ''; // 用于跟踪完整的响应 // 添加超时控制 - const timeout = 5000; // 5秒超时 + const timeout = 8000; // 5秒超时 while (true) { //console.log("读取中") const startTime = Date.now(); From d1d5019c2da2f7e5b6c9564b8d9cd73022e4f554 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 6 Mar 2025 14:54:24 +0800 Subject: [PATCH 27/37] fix timout --- src/components/ChatUI.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 5d39781..7c936a5 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -284,7 +284,7 @@ const ChatUI = () => { let buffer = ''; let completeResponse = ''; // 用于跟踪完整的响应 // 添加超时控制 - const timeout = 8000; // 5秒超时 + const timeout = 10000; // 10秒超时 while (true) { //console.log("读取中") const startTime = Date.now(); From 0aad3e9d7765d6a5f1b60aac0785072b8cf4079d Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Thu, 6 Mar 2025 15:07:54 +0800 Subject: [PATCH 28/37] fix prompt --- functions/api/chat.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/functions/api/chat.ts b/functions/api/chat.ts index 9f74a27..8c2cf25 100644 --- a/functions/api/chat.ts +++ b/functions/api/chat.ts @@ -25,7 +25,7 @@ export async function onRequestPost({ env, request }) { // 根据性格设置不同的系统提示语 let systemPrompt = ""; - systemPrompt = custom_prompt + "\n 注意重要:1、你在群里叫" + aiName + "认准自己的身份; 2、你的输出内容不要加" + aiName + ":这种多余前缀;3、如果用户提出玩游戏,比如成语接龙等,严格按照游戏规则,不要说一大堆,要简短精炼; 4、不要重复别人的话!" + systemPrompt = custom_prompt + "\n 注意重要:1、你在群里叫" + aiName + "认准自己的身份; 2、你的输出内容不要加" + aiName + ":这种多余前缀;3、如果用户提出玩游戏,比如成语接龙等,严格按照游戏规则,不要说一大堆,要简短精炼; 4、保持群聊风格字数严格控制在50字以内,越简短越好(新闻总结类除外)" // 构建完整的消息历史 const baseMessages = [ From d01fe807cbde70b96c6afea4a7039098a1d0fe26 Mon Sep 17 00:00:00 2001 From: hobby Date: Thu, 6 Mar 2025 23:10:23 +0800 Subject: [PATCH 29/37] =?UTF-8?q?deepseek=E6=A8=A1=E5=9E=8B=E6=8D=A2?= =?UTF-8?q?=E6=88=90=E7=81=AB=E5=B1=B1=E5=BC=95=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatUI.tsx | 4 ++-- src/config/aiCharacters.ts | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 7c936a5..b3deb9b 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -369,12 +369,12 @@ const ChatUI = () => { console.error("发送消息失败:", error); messageHistory.push({ role: 'user', - content: aiMessage.sender.name + "我遇到错误: " + error.message + ",下一位回答。", + content: aiMessage.sender.name + "我有点废物(错误:" + error.message + "),你们接着聊,不用管我。", name: aiMessage.sender.name }); setMessages(prev => prev.map(msg => msg.id === aiMessage.id - ? { ...msg, content: "我遇到错误: " + error.message + ",下一位回答。", isError: true } + ? { ...msg, content: "我有点废物(错误:" + error.message + "),你们接着聊,不用管我。", isError: true } : msg )); } diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index ea049d8..194bb16 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -21,8 +21,8 @@ export const modelConfigs = [ baseURL: "https://ark.cn-beijing.volces.com/api/v3" }, { - model: "ep-20250227191640-4qkq6",//deepseek-r火山引擎接入点(改成自己的) - apiKey: "ARK_API_KEY", + model: "ep-20250306223646-szzkw",//deepseekv火山引擎接入点(改成自己的) + apiKey: "ARK_API_KEY1", baseURL: "https://ark.cn-beijing.volces.com/api/v3" }, { @@ -152,8 +152,8 @@ export function generateAICharacters(groupName: string): AICharacter[] { { id: 'ai7', name: "DeepSeek", - personality: "deepseek-r1", - model: modelConfigs[7].model, + personality: "deepseek-V3", + model: modelConfigs[4].model, avatar: "/img/ds.svg", custom_prompt: `你是一个名叫"DeepSeek"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, tags: ["深度推理", "编程", "文字游戏", "数学", "信息总结", "聊天"] From 5c91f750749eb4a7339f35e654a2f990dce5ba75 Mon Sep 17 00:00:00 2001 From: hobby Date: Thu, 6 Mar 2025 23:48:05 +0800 Subject: [PATCH 30/37] =?UTF-8?q?=E4=BF=AE=E6=94=B91=E7=BE=A4=E7=9A=84?= =?UTF-8?q?=E7=BE=A4=E8=A7=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatUI.tsx | 1 + src/config/groups.ts | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index b3deb9b..6d68413 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -150,6 +150,7 @@ const ChatUI = () => { return group.members.indexOf(a.id) - group.members.indexOf(b.id); }); const allNames = groupAiCharacters.map(character => character.name); + allNames.push('user'); const [users, setUsers] = useState([ { id: 1, name: "我" }, ...groupAiCharacters diff --git a/src/config/groups.ts b/src/config/groups.ts index 51e502e..6b8a9e1 100644 --- a/src/config/groups.ts +++ b/src/config/groups.ts @@ -11,21 +11,21 @@ export const groups: Group[] = [ { id: 'group1', name: '🔥硅碳生命体交流群', - description: '', + description: '群消息关注度权重:“user”的最新消息>其他成员最新消息>“user”的历史消息>其他成员历史消息>', members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10'], isGroupDiscussionMode: false }, { id: 'group2', name: '🎯AI成语接龙游戏群', - description: '可以适当打招呼问候自我介绍,但是本群主线是成语接龙游戏,请严格按照文字成语接龙规则,不能过度闲聊,一旦游戏开始不要过度解释,只允许回复1条成语', + description: '可以适当打招呼问候自我介绍 #注意:本群主线是成语接龙游戏,请严格按照文字成语接龙规则,不能过度闲聊,一旦游戏开始不要过度解释,只允许回复1条成语', isGroupDiscussionMode: true, members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10'], }, { id: 'group3', name: '💕AI树洞倾诉群', - description: '做一个一个温暖贴心的倾听者。当用户分享烦恼或秘密时,请表现出理解和同理心,提供情感支持而非简单建议。避免评判,保持尊重,适当提问以帮助用户更好地表达自己。记住,你的角色是提供安全的倾诉空间,而不是解决所有问题。', + description: '做一个温暖贴心的倾听者。当用户分享烦恼或秘密时,请表现出理解和同理心,提供情感支持而非简单建议。避免评判,保持尊重,适当提问以帮助用户更好地表达自己。记住,你的角色是提供安全的倾诉空间,而不是解决所有问题。', isGroupDiscussionMode: true, members: [ 'ai8','ai5', 'ai6', 'ai9', 'ai10'], }, From ba8f36502232ff20b61b3e5448ec0f513e6b18c1 Mon Sep 17 00:00:00 2001 From: hobby Date: Fri, 7 Mar 2025 00:13:30 +0800 Subject: [PATCH 31/37] fix time out issue --- src/components/ChatUI.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 6d68413..82fc0cd 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -289,7 +289,7 @@ const ChatUI = () => { while (true) { //console.log("读取中") const startTime = Date.now(); - const { done, value } = await Promise.race([ + let { done, value } = await Promise.race([ reader.read(), new Promise((_, reject) => setTimeout(() => reject(new Error('响应超时')), timeout - (Date.now() - startTime)) @@ -298,8 +298,11 @@ const ChatUI = () => { if (Date.now() - startTime > timeout) { reader.cancel(); - - throw new Error('响应超时'); + console.log("读取超时") + if (completeResponse.trim() === "") { + throw new Error('响应超时'); + } + done = true; } if (done) { From 95e0cfbc99b25561859fac44706ee42735b29edc Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Fri, 7 Mar 2025 11:25:01 +0800 Subject: [PATCH 32/37] add change deepseek model --- src/config/aiCharacters.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index 194bb16..f1713e0 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -6,9 +6,9 @@ export const modelConfigs = [ baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1" }, { - model: "deepseek-v3", - apiKey: "DASHSCOPE_API_KEY", - baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1" + model: "deepseek-v3-241226", + apiKey: "ARK_API_KEY", + baseURL: "https://ark.cn-beijing.volces.com/api/v3" }, { model: "hunyuan-standard", @@ -153,7 +153,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { id: 'ai7', name: "DeepSeek", personality: "deepseek-V3", - model: modelConfigs[4].model, + model: modelConfigs[1].model, avatar: "/img/ds.svg", custom_prompt: `你是一个名叫"DeepSeek"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, tags: ["深度推理", "编程", "文字游戏", "数学", "信息总结", "聊天"] From ea754258942f397efb7c9a78050160193c4a7b33 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Fri, 7 Mar 2025 18:01:58 +0800 Subject: [PATCH 33/37] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=85=83=E5=AE=9D?= =?UTF-8?q?=E6=A8=A1=E5=9E=8Bkey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ChatUI.tsx | 6 +++--- src/config/aiCharacters.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/ChatUI.tsx b/src/components/ChatUI.tsx index 82fc0cd..bc7bb82 100644 --- a/src/components/ChatUI.tsx +++ b/src/components/ChatUI.tsx @@ -308,7 +308,7 @@ const ChatUI = () => { if (done) { //如果completeResponse为空, if (completeResponse.trim() === "") { - completeResponse = "这个问题难倒我了,下一位。"; + completeResponse = "对不起,我还不够智能,服务又断开了。"; setMessages(prev => { const newMessages = [...prev]; const aiMessageIndex = newMessages.findIndex(msg => msg.id === aiMessage.id); @@ -373,12 +373,12 @@ const ChatUI = () => { console.error("发送消息失败:", error); messageHistory.push({ role: 'user', - content: aiMessage.sender.name + "我有点废物(错误:" + error.message + "),你们接着聊,不用管我。", + content: aiMessage.sender.name + "对不起,我还不够智能,服务又断开了(错误:" + error.message + ")。", name: aiMessage.sender.name }); setMessages(prev => prev.map(msg => msg.id === aiMessage.id - ? { ...msg, content: "我有点废物(错误:" + error.message + "),你们接着聊,不用管我。", isError: true } + ? { ...msg, content: "对不起,我还不够智能,服务又断开了(错误:" + error.message + ")。", isError: true } : msg )); } diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index f1713e0..58daab6 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -11,8 +11,8 @@ export const modelConfigs = [ baseURL: "https://ark.cn-beijing.volces.com/api/v3" }, { - model: "hunyuan-standard", - apiKey: "HUNYUAN_API_KEY", + model: "hunyuan-turbos-latest", + apiKey: "HUNYUAN_API_KEY1", baseURL: "https://api.hunyuan.cloud.tencent.com/v1" }, { From 1c922c07dfd322cf645af51bbdd31eadcc01d4cd Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Fri, 7 Mar 2025 18:07:44 +0800 Subject: [PATCH 34/37] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=85=83=E5=AE=9D?= =?UTF-8?q?=E6=A8=A1=E5=9E=8Bkey=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/aiCharacters.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index 58daab6..f1713e0 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -11,8 +11,8 @@ export const modelConfigs = [ baseURL: "https://ark.cn-beijing.volces.com/api/v3" }, { - model: "hunyuan-turbos-latest", - apiKey: "HUNYUAN_API_KEY1", + model: "hunyuan-standard", + apiKey: "HUNYUAN_API_KEY", baseURL: "https://api.hunyuan.cloud.tencent.com/v1" }, { From c5077c6fca6cef691d7ce8a8dd6d59e5443efda6 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Fri, 7 Mar 2025 18:37:46 +0800 Subject: [PATCH 35/37] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=85=83=E5=AE=9D?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/groups.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/groups.ts b/src/config/groups.ts index 6b8a9e1..7003707 100644 --- a/src/config/groups.ts +++ b/src/config/groups.ts @@ -12,7 +12,7 @@ export const groups: Group[] = [ id: 'group1', name: '🔥硅碳生命体交流群', description: '群消息关注度权重:“user”的最新消息>其他成员最新消息>“user”的历史消息>其他成员历史消息>', - members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10'], + members: [ 'ai8', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10', 'ai4'], isGroupDiscussionMode: false }, { @@ -20,7 +20,7 @@ export const groups: Group[] = [ name: '🎯AI成语接龙游戏群', description: '可以适当打招呼问候自我介绍 #注意:本群主线是成语接龙游戏,请严格按照文字成语接龙规则,不能过度闲聊,一旦游戏开始不要过度解释,只允许回复1条成语', isGroupDiscussionMode: true, - members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10'], + members: [ 'ai8', 'ai5', 'ai6', 'ai7', 'ai9', 'ai10', 'ai4'], }, { id: 'group3', From 2b57ef4e3eb8a7b16ee734c75080f67f7e873354 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Mon, 10 Mar 2025 15:42:43 +0800 Subject: [PATCH 36/37] =?UTF-8?q?=E5=85=83=E5=AE=9D=E6=96=B0=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E4=B8=8A=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/aiCharacters.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index f1713e0..58daab6 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -11,8 +11,8 @@ export const modelConfigs = [ baseURL: "https://ark.cn-beijing.volces.com/api/v3" }, { - model: "hunyuan-standard", - apiKey: "HUNYUAN_API_KEY", + model: "hunyuan-turbos-latest", + apiKey: "HUNYUAN_API_KEY1", baseURL: "https://api.hunyuan.cloud.tencent.com/v1" }, { From da972a88ab9ec569d0e509363d749cad19eda491 Mon Sep 17 00:00:00 2001 From: maojindao55 Date: Wed, 12 Mar 2025 18:14:38 +0800 Subject: [PATCH 37/37] fix some issue --- src/config/aiCharacters.ts | 16 ++++++++-------- src/config/groups.ts | 9 +-------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/config/aiCharacters.ts b/src/config/aiCharacters.ts index 58daab6..faa58e9 100644 --- a/src/config/aiCharacters.ts +++ b/src/config/aiCharacters.ts @@ -129,7 +129,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[2].model, avatar: "/img/yuanbao.png", custom_prompt: `你是一个名叫"元宝"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["微信", "聊天", "新闻报道", "文字游戏", "生活助手", "娱乐", "信息总结"] + tags: ["微信", "聊天", "新闻报道", "文字游戏","命令", "娱乐", "信息总结"] }, { id: 'ai5', @@ -138,7 +138,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[3].model, avatar: "/img/doubao_new.png", custom_prompt: `你是一个名叫"豆包"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["聊天", "文字游戏", "学生", "娱乐", "抖音"] + tags: ["聊天", "文字游戏", "学生", "娱乐", "命令"] }, { id: 'ai6', @@ -147,7 +147,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[0].model, avatar: "/img/qwen.jpg", custom_prompt: `你是一个名叫"千问"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["广告文案","分析数据","文字游戏","信息总结", "聊天"] + tags: ["广告文案","分析数据","文字游戏","信息总结", "聊天", "命令"] }, { id: 'ai7', @@ -156,7 +156,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[1].model, avatar: "/img/ds.svg", custom_prompt: `你是一个名叫"DeepSeek"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["深度推理", "编程", "文字游戏", "数学", "信息总结", "聊天"] + tags: ["深度推理", "编程", "文字游戏", "数学", "信息总结", "聊天", "命令"] }, { id: 'ai8', @@ -165,7 +165,7 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[5].model, avatar: "/img/glm.gif", custom_prompt: `你是一个名叫"智谱"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["深度推理","数学","信息总结", "分析数据","文字游戏", "聊天"] + tags: ["深度推理","数学","信息总结", "分析数据","文字游戏", "聊天", "命令"] }, { id: 'ai9', @@ -174,16 +174,16 @@ export function generateAICharacters(groupName: string): AICharacter[] { model: modelConfigs[8].model, avatar: "/img/kimi.jpg", custom_prompt: `你是一个名叫"Kimi"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["深度推理","数学","信息总结", "分析数据","文字游戏", "聊天"] + tags: ["深度推理","数学","信息总结", "分析数据","文字游戏", "聊天", "命令"] }, { id: 'ai10', - name: "文心一言", + name: "文小言", personality: "baidu", model: modelConfigs[9].model, avatar: "/img/baidu.svg", custom_prompt: `你是一个名叫"文心一言"的硅基生命体,你当前在一个叫"${groupName}" 的聊天群里`, - tags: ["深度推理","数学","信息总结", "分析数据","文字游戏", "聊天"] + tags: ["深度推理","数学","信息总结", "分析数据","文字游戏", "聊天", "命令"] } ]; } diff --git a/src/config/groups.ts b/src/config/groups.ts index 7003707..f50cf3a 100644 --- a/src/config/groups.ts +++ b/src/config/groups.ts @@ -28,12 +28,5 @@ export const groups: Group[] = [ description: '做一个温暖贴心的倾听者。当用户分享烦恼或秘密时,请表现出理解和同理心,提供情感支持而非简单建议。避免评判,保持尊重,适当提问以帮助用户更好地表达自己。记住,你的角色是提供安全的倾诉空间,而不是解决所有问题。', isGroupDiscussionMode: true, members: [ 'ai8','ai5', 'ai6', 'ai9', 'ai10'], - }, - // { - // id: 'group3', - // name: 'AI加字成句游戏群', - // description: '本群主线是玩加字成句的游戏,请严格按照加字成句游戏规则:每次值只允许加一个字,如果无法加字了,就主动认输,重新开始。', - // isGroupDiscussionMode: true, - // members: [ 'ai8', 'ai4', 'ai5', 'ai6', 'ai7'], - // } + } ];