From 35771a9a600afb708588ef0c88d899683098bbae Mon Sep 17 00:00:00 2001 From: yueye <2177397685@qq.com> Date: Wed, 7 Jan 2026 15:29:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/app.cpython-312.pyc | Bin 0 -> 32524 bytes app.py | 87 +++++++++++++++++++------------- 2 files changed, 53 insertions(+), 34 deletions(-) create mode 100644 __pycache__/app.cpython-312.pyc diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b73177ccc9e9182bd0202956a5f7f954f248d437 GIT binary patch literal 32524 zcmd6PXE`C0Vj%TfQ&(!Uw)F#u#Ie!GO8Lkpv|{5$?7vTRzgVI2@9goPsz( zPC_sQ2000XNeDQTnZ$t{c#ruqGrK$8mNIIzJKuU{kukg9elbaAnI-$}ey_UKYS~C6 zGy7*9(_P1_SFc{ZdRMjcE45mQ!OvplZu7al81_%7!v9413*Y=?35FfVaLj<=B3x_{ z8N}>cVvw+JsX+>FiAB~GVTcf6VvLA**FRK*Mo2A@U2=oGOJPuSDGf@tO=gMeQW;cT zYJ-}sM_8h}Vhk}|8iR(dM_OXL;tX+jmF1TBF0Db!wks?NU5SQ7wk){UIVCk@;;BGagD{pa?G=%UKyxC`tXc%kY%ffpx=0Cv?3vGM}FM3zRmHjZg`5xho z7sDxE$e&+?Ei{cCtA#Oq$xs1jwvtHd!1)&8-O(nL`4WG&c&ZH5L`6p@-z&WF612}@R^W^Ik#AtoQgdNRV9k0$A9`PndLCC8dP{hEzh_;wJY2UFsHkOm*%*#$d@0e0 z*Iiilu7sQ2u!>j}hQ5G~h82XCmH#cDtwRWB# z!W*yW*9P`XjQ-=L6UHTV91$S-l3`648kXY?{8+Y{E^YFlf4IO9rn(*d##;_IW-%f16*YbQLYhlEw0LhoglF;oPJSrX# z-uOD6M!XqG>b*{Uw+LTvxSzNmU(cRvF}|T&4z-Q`+9v4VY)p zUnI8jGj@D%cP~#OoLi~EKp4Vs?IC_7yQkxPO?cz?@w50f{$-($FY$BvAwJ>Tg*Uzp zBxC!VqR>=ytP>#l5}xVjhNwIJPZ+hsKWZoN@cs)A1f(#J$ip9G`{KUei|Q@}Xbw{x zz9aPPg3r|*i|_hA7?!*D<6^%>DZzC*N=qxb|uzx z4V{J_mWC-FR(Ruw@SSa9ehdr!n1Li73&a8;=q7sbr;(*&`Q3xB<;tfeJeCli4H>`} zO3t6bpCvkxbY6HaAnjq|n@}7kI+t^DanF68zk`Dg>D?Y!=w0m;_{Ep-=lRu=NZ*Fe zdb|*3NAHObxN1KwnVT;OgD0%@bjZkOS*oUadWAQBn5W!-IzsF)eqy7Tt}N2-5t6 zXw@7)eui*>&-z*ziF)vEOd&M|!uTPg0skmiU$7_so-#2=OT$TXh`Gs=Kb%f37r{|w zc!hW+^hjesL$I`l@~g*%T_a4yK8OcI{&*k~;sMb?5$FGbU$0>OdJ)l#e|$<}c$IjX zlo3x8ui}@H-yVAYj+J+F7-Tz;VHbMwDgyBL6TIS*cp49SG3UB=C566d3@LIv|^@Ymc{{=rQ z(g0y_hmcFqGb`cjoesBZ{4a^qoW{9ZbA-Ar1Zeg&@znS!zV}ILlwyjz{CS76``s|> z2<1C-`4u^t!LB5f@2s3hQ;0pr|7sr0l(1ub34F|ZM_r-h>#yhG4dr3|94N0OGJnX8 z3I4xO_UFPE{CP6`h+TCkU*;G1FY#Xm`7&o%$WRjWH$0628xjiN-{OBaCkk-R*Yo(V zVTKXj7VO1HG2w)~UcBKh$e?&36wfH09#)1F#E@Q2F`1mX+e z%)&67=@jT6TrS1TnBhFT)=-lAB@fH$y0?MSAH%M80{lDpZ=S`_KJ(H+bn>2~;a#Hh zhjRwxHe3cf1Rse`)`MWPDF&Dj<_U4aiFd)5@|+e!{|}Cy2qTdWv@G~j#)OQbj6Bca zEQ)Z(zcWH4b%D4*oagd%gQKDJF;LJ!1mXw$eqc97#U)m;`=GI`J_pG&2)OwY{tt8U0(XBqCvu*5N5|57PfNr?O!4@IH{65#?>9v}RS&~$ zrQxFCl3|Rv7|@lI0yJO3|B*PO!XR4_8{|Ub4`oQo3yT?Bz zKIqU2tKv&Myy0h|`$4|Dcv#^bddEW9C?3BE{3uwLmS|ujWaEYF0h#&;H0n5U{(Cfj zs$b)OY`9EZCXDP&x@b@pg!8h1lNcvHM)AR5dRQCQDXfMs;Q<|DxDsZCp+@~r%R#7! zk9e*dJ^}uyi8F+gcpKuZamYaU0{8Bp5}&~CKEbbEcoRW!4lXi$j*AUfS=eU;7{0`x z4zP4LLH7t*foV39&V(5D2C_hg&snJs-JeM*Ic%N)dB2jLAd(88HAAlj<5Y0gm=P7;bxxu!aJl-cLe_iQ2=<^Tn6zu{_Uxt`xKT( z_tZ0k{}T56Y!v3^OAZl32yb3)3)|Fcq!&0weQ)7zlMGI zIq{bObyS#zFTn{YAe`tjtE~4 zhVK6pG7`6e)}O;!eH$_!e>^1#gD;dG3TQ7f1Hb&|j5CY6MP}@*=ugjv_|HkGY{I`2 zKgaLj-(C0*Uf+Wq1zTf;TLSLKA%X9)LT6I~-?H+sU}MGPzk(eWTmSj{r8lf({im?2 zEKCTk^usBdiwop0G#7sG3g>gnA@1%ALrth`!!D#dfJ^9`4RJ@PY{P%er8rcs#38~l z0V>SwD}`O*OR)M^`Lgg1ob_K4zqF#SsF6-J2>pBsW(|0>-{ zIh}_U-Y}C4Xk%mhx%sNQd}86QGKA+2cp~6mWH7Fv`|Snnn&hn34=HiRzvXFSIqKzW z!kg#O-8WP7DINSfDdM9dw0!J^K9c*+|DHA`^yn}e^Rz%GUkW`QcHtxsA-s8+HvF3S zHTesc10gIAtVv1y8lJpt%)6Heb7G>{F@h|rh+lKE2>UJNXXb2K7!2y~hXS0eEf*l+ z=H}O-ydt1K+KlmjQ78!fGLOYT5fqv1Kba8%zxWbC0XFz+3y0`}hPR;ss~ke#0dy=+ zslWwjjf0y13_vaZv=lIE=VJT;_gzywUBVkb#IJ>ofoa2}!9`34V$%>B9_CM&>+Q{# z?*rmoj98k7k?@x?;0M?4!W@Z%zJ1t!$u4Z4C>N`QTb_OJz0)qpYlFT@82pg$2^zHy zMkNfsDvToT1B~!jG4L(uS%H4O#GgLHR(4z&KduGlLEks+!|s|lZZMsncOFHtgRg|` zxgNIX!7x3V!MDTq91YtOz{ajyin!&79(l$ThL2?V_Gtaurp-HyTeodl)4Z{1dy&|yUQO&V^%0v)-7u8&s<`T^ zp6*t28+6BPBdmmpY-#5KqWK0thzNo7_KQFK zI?!Y5^CpUp1!`GuDiSaqb)>h zU!AVHcfZcsV=?2p+-m*O3Vn6ZET)#uHnPXojhD9cSbE4hU2bb_>(W*e2l50*x3!lb zTG~tZ*!JwP5J9Bx2{F2&wW_s7nBc#&I(}KYiaFG9?m>U0)!HwaK^8{!@a zMB&m3oM|2f$Khd0*NZ8fzLNVoLtGq(42S-cv3^SYgl zo0=aq>bEuH!~rr9hQnr>tc1}fb8?b4X?&z$hdPepvwVmbA3CSz+@r-5=2RW998VT}1gl zm~@Z1yL>gVxBRP5Ut;Y&s}`!tyM#))skgVR_kcH^!)PN(&~ARrByxb!pITX;g2w=M zU7P69=F!?bkG7E37E(p^;~g$-^FPEVc;a*E_*_qX0Ucj3su-(s#n=49T;S2vv28AG z?Yvg1sBXO3rCoDNA&ZI_SoN(6lSO)@T3V|0NYiO)x<^__OAANizm%4K10-NxX;%+U z^nu`v($Wq)PO#$Sjq*#Raj%K&m$QgA0GPbjWVP-C#cPWOWH(;Ep-a-)GlLG@ z%xABH+c-5dMD?0Z4^-n)XKIVIGb6_){zcDj1=zHTwzPDc@ z^I%AkjI4tf3EyyFRY2w|X_Kv$m(rXzNA3D?t{CNj;C;EA2LQ5qCsoH~$NM z$R=p-SD3rt)RhA+66I0(I^gP8a$N{{zYI6^nd|3E^xQ;RCl=Rb!QO&f)=#EQbbL7Cbnf01?+Ozs$uY5Pu*6;)p7eveMy=LOznI z&)5na6GX+&+Si^1Nkk#d%%>NpkB!|#4!sRY>hz_fsL3ysY!G$xnNP2Oa?*En2t@Y! z_`vjq5fC9om$@5`AUZ#aF4KOl$Q=zNk+yhv{QlIaZsvt|d>2n%|M)N$M{(^xI;NZc z=!)-%bNcl$e>++(SM)hvx^ZsI76%Q!A3qJD*z^a-d`CuZj(m3W_(gAYH?faXZAK)K z;MhcgUTY!Rdn_Qb+_4mJ>6*HFI?Q~ya>*Mbj3!V|k%T3gTLNeq(i)86c_0W84<-gK zyMn0s>_wl$4!+LJIRxTO5U?WerWdR!h#9LLe9wI_{lVysr$2@hcyr*m@90N9`|~$X zz6R&erVHTYu-$y?<(ntYm*~)XKYMZd^vLvu&w?p#?E%fsGLT~wXknlZsok#LJ{wXD z(?^fad_Few`HAb}?{F|68Pfx&X9k`DXAX`~Sy|al900wVAd=bfzzJjzy%Ft%xvjmA zV}k}-et+sY|7LL*!6?VuzzYC(tVFbYX33^tlb!ej-{-~gDNF64}$Wg*4s`{*Z}xNsEI>F$VhtgwRaoq6E{-`J3E z6$FJ-^8l^p zexgp-(zBN!g|J{AOmB}BqUoM)fCJ~|9)PC4K2u9O-=jNNkwhABu2>=+>=OAz6oPOqm>5txrG6y_uf1Lw|{pLo1@PkQ1QcmuH2OG9< zg!q*p3LseP#1U})$^}2=EX_!6SY_!~p+je3g=l%4`S(Xbr~xU|7r&OVj%J=kB@Q$d+PeC`tx$JPr<#{7Ge;K%N5RrWd9=3FN zAVqrP$|s=fxxo6yYiFkI4&TMW=}X5TLm1&F<^URm97nH4&>Ec9L9?;$4{$)m2T;h9 zCHJ90D3tNayNEs$(oQzSG&JYT#WCNf$3XpYzLn2D=6m^h-_f5;kGzG#d*m*IZ3k*@ zzII~f(j`z$oX7L(vpP7GH?G)&iRL{sB>OMUeEKQ3l>P)rWcHFoJJD?g%g06aSAw9I2a$*job#qL2RN| zH?3;k-n?bAamTK$P20)s&>ZB*vF;oDpush?MnUfY_IBA=ES`INKsE8 ze$jX2%*->Ne)Y*2r4m%(%)oQVld=zSW2Rp|>pOZJISN-`3&*&`x2~tP6|#gr$8i{S zb3e?=$xy&s3swrj5e277gEWQ>nNcphLkV)UwMRf+reA-7(k+0`gZb-qtu^&Nic z#*q(w&;JZn!PcKTj5N^Co}Iqz05g8`gu`e55V~%>F^=4+V`I}VU4-`QmqDt2M6z^p z5(_D7&NucQefs+N%bXyw_5-vHXqbziaZRkf_lnJMR@ozN^lPMm@d^U7mB3PF&%EJ8 z%H;a^W$=#!&einb3*dnH)iJM4=fniar^tnW->ihk2Dsxq4*#cyM?n9vf1$<31wvxU z|IL~P{&q`*zCUcM*ly+}5Y4rq>oJ}U|zX0SgFV3Royj>TTpU&SZZ{>^^Z>Ia;a&il_UrE?zq zcPp|!Pse78UQ=d@Z0I8+9qb0TNYI+Bse#DC$cruKfN^}+RUxC#aqlKdNU=b^E0;l% z;WW>D_#B*lU5x<5;)gBw59g)}pnwH$0VLdmwLsj_4p<;gD*zZ`A{VT-pjpwmgT%zM zx|=Vc$lR~cUcSJ`JZwN6Fa^;ZAHm^lHCqTP#7}I>LNGe$02W1XN*0NmSHW}MO7^3= znya_4H!7SF@ZDeEy-l-0u32>6ZYh60lM2MQVr z`F%qXlQ(i_cV~CczV3c`5jcE+qrt1>=x4k6Xl-=(VEYi*BJ^N67s2JPpyO$1^PfMz*+xbZcn~lxEDBxWCKK6- z1HDE4ak&3F4{pxTjTV@gel@cH<=}R3FyI}K>!n^%L4N9NE^+NB>)Kl28 zZT*tc(o*ty=->kT=RTM@^jdI+3UpXxi;2zuk$Vvs%Ay2I17yS4X}uz2zXWz3VzRdo zoE0AInev|mBoCz~i@8k*iu{K`ms?v~yQ~1t85oLt-V)dEAsfJI@fo?fm&4p~EOL7z zjc~u)Vl;Xc);kho>Vd2j z0T|HLEQvx-5@}#>MsRysASK(y-2;;-wNE1LOje@@(s*8(tn7>q>!cR{ZLc6*Nvd3|09 zyuFI1{VfE02E9^{XxtmwZn8q^fb<8F)?SctuLM>_zRix`Q&UZJw}4Loato5RCU|B_CRurP5OJIpl0;PnBHiA!GD*;;(WQ}jSY0!b-+y%cd5o=L>Et7m0b#X9_!5i4yaB4MJdNY@(HxUXtOo= zLmqTP$LSr=>Mfn;pRQIhcv@yFNmRj&(<4Z>xJV9EV5X-jGVVh9%Hx3 z1c^-`6<(Yi@)wW1T=8{Yu7HK?#Uv+QC>zmd>oszXf*`Q|El4isxCZZiEF4ikI5@P( zdV19yUm$4&fCtbCKt7%k1u?8`^lH#IQ)oXpd~oF%=Z6W#3y|s)8$vz}*qGlJLi)7#p)yRPgsezyuq714XWZF8IZ)*TF5Gm54;5TVjbw`i&eD zCH+07_A?i@nES95|&aM_=$?1P+66J_8W;cqk_;g3k@uHz3 zD!pt>?22175OW*w)y>K=O(p}ss#JKw4R@S)AR2H<)s9B)8l9HpUCSzUWt9&!a+lt2 zX*!T1jT?^hq!iKcD=A{~7I^Zi>AY%BUOk;x@5x(7=dE+)trv!5e;pAiDw~bNq)JDe zCpMdgUr9ETzEA*3L0GlJRi3nkH2g{yG7Exwa~X+txY3hdLc_15gefQyM&>aRwPTwn zA)kg{Nj{^?5&AM1NtC0CyZWakxlE=`=u2ZHal<*D)M6TbCB;mBfzX$OsEH5T%SaN2 zw|O#3Y50|tGKHnW$o%<~772YoX{s~FlT$^*ucV484dQAs>_vq91;Zi3Ev!u}%4MYL zfyNh_4>j9++|o=SN10%cJDPSljY_B-U+q@tZ()mMHB*{6k48spbRJD9ttqw3K#M3KTI6?l?L>7-JstihGE z!oCg&$t`#0oGTeAVN^McHjjw|>Bwagi@uGD$W>DEERc}2Y)@(#omxhfuc1@d+GCi+ zQcvO{I&qOJaj`uLP?T3+GM_h(D_v!)sI|K%%XT}6tAoFsw(kNes0u;`_wkz#r?0wu$XgQ*l`!yQM>=Ow0l*y1==gQdKaqX-r%O z6QAuYA1kGER#Mq|Dz=f)WC4ZoN_!*_n77a__Q;cId9qus1NK!czI5RHf$>yV`D$vN zakAX#r$^~dTu2dplV)>;4+H63p zis#qmN-Um?Djsbg&;PvW)h&`-^C;{sziI^(e;PdQ%Tis)#BT2 zBG|rJiwM)Edg4pz_|k!mOnmb3r9(@H4WlWp_(cO7VS8i=OnjCnKA(=ycUqtkXpmz` zDaSj8Iy{NRbYd|hPh&LcOmrfn268i)xcpf)mbCC2EHWu#V9Tr)i^;O@@kD3R(V0}% zipe!Cl=*RY^ud9(*CL~*5|X%6<4Gu`6G}Y^wRA%5c#RxxvW@@{^v)wqk-Dux;^x)xxo|tSpCfk|oido6l_q zOa&cN;f|@Ihz`4i$;@`{JZU-n_*KbO+h3^OPouW&wo93W)Zyyk1x`6tv~)DlQ?!&W zS~{NVDr)c)HPJ;)uA;S6;W{e5*)C^F7YmfZ`s3{4qsqfdDt?h$UOgp^hEuct(E4XL zqRr9TtB%$lt_3D}<=YtH8=yiuzHoHQWc;$jrmLi9?F01M2Rv&Zrq@19J^I+>+Q%lc zseSul&s7lvt7oGzxr&NeI2pN+(UtQve<{yk6ly9qXHt>F=qiJnr*u_(%`MNEOOIUX ziAbYwcEt8_(HPHEB|;^V3z6{E_(rcI_&%BYkgPf8h`QszpjaA_;AB`;>; z;+fbgknLEdT?Se-G0U;-_^zQ{j4F#sOhUg1pcViUm3AcvzapMv%Ag9kph$p<>adDR zD0a&iPN|da+m1eT_#v2SJi)DAaSPKb)`^&m;^A#)9y#&IXalwOAWX)dkd!ozz1XcV?G;3zJvrY&^GVWYbs~wYeQmY>#M-_*)FiUn{0m*@011 zNi+4p0q9-{2O7Gw;5=_(vK9`LXAYh?NR{ZREjH+VO4Nu>{W`G$0qGtB9O+Xr$#(MS zfx`!=l!aHdU&gGt7N1Qos9~}T&&Q8$^OP>9OP6~}H_)XUTtyqH!cA1xX2-fIT^W;I z!4%X_7TiazypLJ7-m`2gy=*IW-wxNZoxdq)88cD444z$&(z_o0a@U?w(WS`qk?$!c z3tE_>rMIFYR*DjNyXVnX(b}r9T3TBV5|EJPXgt1tXg!r(HMWAPT6MMZ>TYWF4k~M> zTYEpFO^4ofL+g&MpVDUf0khV)wQFw|A=b{8VXA0PR2m(X=7}nrj4EPONuUZg9Ns`B z*Sl5AuN9WeU6H5sKDzWiSLt?F;f}AdNOdl)$#ckuihYXWOcqH+(B;F%Qq9sXG@|2Ha!SqGA&6S-r@q+K&k?S>kh4> z)WvQoRQ>oVO}|_E_*86~Bkp+WQ0nk~PSNlhS8VQ~^#iNzd2nEXO|oV&lafCicP9Nr zI<;UK)%-Y!UXyqo61~)Bu{|32129t@@KYitArB6lameW0J^t7idTQtW)FV&06P~my z5#UoI(8sb^pl0KtjZ|!&Tbj?rWrMvcA1Zg2jqAUNrM7K%$L$!{0Lpe?GZU2n8maDZ zouktgl{2vVcj`FDGM75*Yb-_%SV#8Z2X0}}ikNG14b z-STnML@u@FepllIbi)I*?m-GPJ}*qeMNYlbG_uOMcvOt|t}2<>vs~o%U{Y7K>RAKE^ z6}970%Cv`iw1wJ+yHg4K1}3dwxav&(iTXK!6L}P9PhO3>*6wyS8tJx9;B6P2Zpw1- zHdg{8iyFYXcZpV`SG%Z541MjQ4afmNFBr2?{0P^#8`WCHR`lu<+tAA@-iuzicpuub z^!;M{#wk^*N0m*3=1I}Ec_pd!ErF07TW_njjBeiqaml^|D-gt1!(wKw{CIPu7$m6-C#1g?#(;;_F zn*&1otwP2c0~Mywc;p$A@{HjQx4dYIx0iz|My}-zL$zDJc#1m}C)3}^v`5cMs}&_o ziq4Z#GMQ2WBC>oFWx%PF5?2cGHI}5#cF4e68BQEp?%X&TUjZKQXzO`3rOjvZibe}Y zHaj*23Sfa!3vXf4gi_cYP#{q!qMQU(vYcAjK;^A)C$D6ZbD&vyQt8||x_q>JJZ^l` z_=+#Gsoah3?eDa|+W|t&6qgLg+*SatS%h#_g(ap9*9<-4G*2d!Gum9I zZFCo1u!Pnwacp6<1s-h$t*sc#`ckW(0{;R5cDNEMri9Oa>u7DAN2{l`da&Y5PQj>r zq#VR&l_(M9Cm{(AH?R7SZJaHKbG(FBChYf|TT(ruuj>;&9RRnqZg|w#7qggx&(vn@wq!u#i3z&@jSp^nb^DQW& zIABX`3MWNW%5t}+0raWhdK9=K3j$u#94RPs%gY%#avh=$M+t_on${xuVC1Rj45UuV zQ>iqFB0Uu=>57$}imi0TR%)BsE$@Jxj!xm7i$yMVHSD?~gGo;HBp1@jg`VUFI=SI% zIF}g?X+Z3UacA{t#7Mofj7qO`YpR5f)z0J-o86j)0mdCu-HL?4w)x3>=I?I5IE*j)wS* z>IC>`soSY0IxAF9P=qj$4Y-t_DuWW&rD1f39d&jHPTAGx3RVNLkk{ zI*38bUFwEgm`oAPB<48w9JdTvAOwdI8SBJMQYwr{ing!4Edc;nW@f?p+;{V7u=oXI z+w76I7Xz8IwU{#c7PdsTN)$vf+C&HflS)S)aV0LZM_o(EbtUA3R|t+ES{7_Ar7d#H zL2%L`Y)b&!qfk`ao0yCoXZ4APMmJCyOOWGNV&5_qlL|iA<3}DxM?Gn%fr`sfk z7mRFjuAnrFn8bW0F@1O^8aKR&(iZ<)q*N0PK~gM)qYG%w0yvI4MjroCvuHLR=9oF0AzwuAvLpcnUYtg&SRko4>{))Qfo+C_WQHvt_R=W0JC+1$0s| zmAG)Ua?~&$L6@$eN>);EkW(|6RGl-~sRV@q6lvptqJ%t;wwTrykJf&vt)5i_LU5zg zGJpYsJG|DVUUv&qD{3Jx@inGW*E;0C%gBbC^sx?i&V!U;k1L}E4t0FmFzLxEr?bjE zS<7kojbF}W=X$a$>Fi2R_6jwT>94d{R?%D+LI@ErC_s(qXC?`%|u{ENAv)RBmwm z`K4;{HMPc(RcpUD=B%T@84KTD@Du+H8-ET2-u-oheeN=BOjerfYiGYVKzvmEBh z#PuVKoKLxOmyBoAxyzt>b;%g05RC zOdiV=2Vyg~yntC4WUmV$KP6c2Y$hj9sAVy74IB#jVfmo)>j=Q}%FYv3=L%QWqOr$Z zS+z`YnE+cb7f)zQijLnO;HVYDE;}TzXombZJ$uCa^LPJ$GxiZ#JyB_&cyBnO7 z%!Q+Mu8bP{W>7;JMX(68n$#jDEgu3yCZ+IOb!0}geG{xno#s&$OsWb-)oxV{D5#7~ zSYviRrOKR2De$B$olIHkN?GbWbK!Pc7I+ZGX_S{b73h!_*^YsDqr$DJWb#X$+s-}s=7Vn;C`}HiF-P=NMyV%b^<>6sIH=%NFzLCokyvJv=o?I$ z83(F3cBRPCghYqlZL~h&+Z4+R))Kbkl}zs^>|!;VCwI&HEjz>5A1?jjoEFblUw8 z53GR@ZdQRtbAFH#{Gi17eh`q6i^$5Egw>|jGARX2W)+Ae?tr`Mlnn&UB5y5&_NJf?-f7`MD+O7NJNILKMXbD3{XY#|+6$UyEc zR(D$=Qy?uj-;Jqo$tr@PT%B8*9dKi4O@mvyBFKp?p|vF*?b1o@QkQnwz^30tB{T9E z&}xxKB5BQ@-^g2FJqbBqV{%2VeKiw{oS(FzG^cdr{t?yiljpaOX~$aMPxn-=nyg&q zs%)Yv)=ac~k@t&zzbO48i^|wV;bwPi$1RkI_?`>|2tAwscxC;F)`^c+k90U6rn0Ks z+C?boP<>a1KmJM!X=I1w8OeU@1oKT zZp}jiRFfNIix29C*EpBb>7{N>*{oCs`ZP1|Ovj0i^XLx^GiyDW^>k)EwS0>!bE{+R zwWLh{QcudANpuxbsJ}_xjgC%0X0K_B8ExwDQW^rS>;iC`Gbvrg`=YT0osDm5EtFfKnXG~19|6m4N6RL znXEgvrI1`=GgNnOH?!F#?pox|?SnFupW!k&0ETifsPdHP&h119^x5ReceC}FHUp+s zCwMhlm{Of^=XM=LjBFhGA79sCx>ce-LUIYwCxJ*8GR2KY*Bx2scygp=H2bYq=Yv#2 znOjx<_o{S;_l78Kp`#i8tQ5?tOIz$wEu2&>{BAZ9hTplJ%7-L(Zm$-B%g#FXcWxJe zn|=#}2aqj7J{fW^@7!);T`10VM?K)_uzu2=+ZyE0Ab;n(*>KF0?eS4zh7v*||zIBo8mrG;yt@+YlDOWE>)nBhzfO@F~ zvHCVlOfAt@pz36yM&A}Ko~&J)g{t19#^w69a@lXS3Hr9;=-(E{v9Ef43Tpkw1pQJ3 z^}FayeOrCx?@E+xtwxXO+ZB<&uVJgcg^Bw1T*-7)vcA1Sa%0IVoxXj!>|g5v$gIR> z(<=4mLhP1GFV&k9WnXI+q3So%#$@#VL%K?D&W-p(pN^@F|Dn+5>pPPr z|F0}j-x($QPiX?G{b#Ozp}w<9GO;qIQNrBPWbWO15sy)=Tu=1(6ev=E>QHmfCuKj|iJ+jY!n@s3jAv`H}k8ipYu95((OX ziPmxvSFiBb7s>Rk%M}x?wQ|JAi8d@!-xejCXp59^b)|@_NBQf~uqg%5pX;wLfPPdj z@YjoFXqP77pT2FWVxq0ukGEc?Z;yzYXcuwyb_LYqp&sq8Cqi8pInkaA?^1YIz`G9K z%Vm0Vq+-IXgm=7T!W<{!-T-gbL3^4S?b3v~P^Rx#2K}YLkd7M3L`MzR(9s~%cgiCt zV9)fO35tnMjT~*yU#w5mcSlGjy0Hj-cQiK99l>=#Cs&VF=)04kKNZ^Zq9(et lxSi`RfO;j=OZ@d}s5dAkdPFjPk5V$xqY!a#HPjO$|36e2JqZ8+ literal 0 HcmV?d00001 diff --git a/app.py b/app.py index 852fff3..553ef42 100644 --- a/app.py +++ b/app.py @@ -4,6 +4,7 @@ Multi-Agent Decision Workshop - 主应用 """ import streamlit as st import os +import base64 from dotenv import load_dotenv # 加载环境变量 @@ -197,6 +198,23 @@ with st.sidebar: on_change=save_current_config ) + # 页面背景图片(全局) + bg_file = st.file_uploader("页面背景图片(可选)", type=['png', 'jpg', 'jpeg', 'gif'], key='page_bg_uploader') + if bg_file: + # 保存到 assets 并在 session_state 中保存 data url 用于注入样式 + saved_path = st.session_state.storage.save_asset(bg_file) + st.session_state.bg_image_path = saved_path + try: + buf = bg_file.getbuffer() + except Exception: + buf = bg_file.read() + # detect mime + ext = (bg_file.name.split('.')[-1].lower() if hasattr(bg_file, 'name') and bg_file.name else 'png') + mime = 'image/png' if ext == 'png' else ('image/gif' if ext == 'gif' else 'image/jpeg') + data_url = f"data:{mime};base64,{base64.b64encode(buf).decode()}" + st.session_state.bg_image_data_url = data_url + st.success("页面背景已上传并保存") + st.divider() # 模式选择 @@ -275,9 +293,23 @@ with st.sidebar: del st.session_state.custom_agents[agent_id] st.rerun() +# 注入全局页面背景样式(如果已上传) +if st.session_state.get("bg_image_data_url"): + st.markdown( + f"""""", + unsafe_allow_html=True + ) + # ==================== 主界面逻辑 ==================== -if mode == "Deep Research": +if st.session_state.mode == "Deep Research": st.title("🧪 Multi-Model Council V4") st.markdown("*多模型智囊团:自定义 N 个专家进行多轮对话讨论,最后由最后一位专家决策*") @@ -312,7 +344,6 @@ if mode == "Deep Research": }) research_context = st.text_area("补充背景 (可选)", placeholder="任何额外的背景信息...", height=80) - research_image = st.file_uploader("上传背景图片(可选)", type=['png', 'jpg', 'jpeg', 'gif'], key='research_bg') start_research_btn = st.button("🚀 开始多模型协作", type="primary", disabled=not research_topic) @@ -320,16 +351,14 @@ if mode == "Deep Research": st.session_state.research_started = True st.session_state.research_output = "" st.session_state.research_steps_output = [] - # 如果上传了背景图片,保存到 assets - research_bg_path = None - if research_image: - research_bg_path = st.session_state.storage.save_asset(research_image) - if research_bg_path: - st.success("背景图片已上传并保存") - try: - st.image(research_image, caption="已上传背景图片预览", use_column_width=True) - except Exception: - pass + # 使用全局页面背景(若已上传) + research_bg_path = st.session_state.get("bg_image_path") + if st.session_state.get("bg_image_data_url"): + try: + st.markdown("**页面背景预览**") + st.image(st.session_state.get("bg_image_data_url"), use_column_width=True) + except Exception: + pass manager = ResearchManager( api_key=api_key, @@ -418,7 +447,7 @@ if mode == "Deep Research": st.divider() -elif mode == "Debate Workshop": +elif st.session_state.mode == "Debate Workshop": # ==================== 原始 Debate UI 逻辑 ==================== st.title("🎭 多 Agent 决策工作坊") st.markdown("*让多个 AI 角色从不同视角辩论,帮助你做出更全面的决策*") @@ -451,7 +480,7 @@ elif mode == "Debate Workshop": placeholder="提供更多上下文信息,如:\n- 当前状况\n- 已有的资源和限制\n- 相关数据和事实", height=100 ) - context_image = st.file_uploader("上传背景图片(可选)", type=['png', 'jpg', 'jpeg', 'gif'], key='debate_bg') + # 页面背景请使用侧边栏的“页面背景图片”上传控件进行设置(全局) context = context if 'context' in dir() else "" with col2: @@ -570,20 +599,14 @@ elif mode == "Debate Workshop": model=ag_model ) - # 如果在界面上传了背景图片,自动保存到 assets - debate_bg_path = None - try: - if 'context_image' in locals() and context_image: - debate_bg_path = st.session_state.storage.save_asset(context_image) - if debate_bg_path: - st.success("背景图片已上传并保存") - try: - st.image(context_image, caption="已上传背景图片预览", use_column_width=True) - except Exception: - pass - except Exception: - # ignore upload errors but continue - debate_bg_path = None + # 使用全局页面背景(若已上传) + debate_bg_path = st.session_state.get("bg_image_path") + if st.session_state.get("bg_image_data_url"): + try: + st.markdown("**页面背景预览**") + st.image(st.session_state.get("bg_image_data_url"), use_column_width=True) + except Exception: + pass debate_manager = DebateManager(llm_client) @@ -628,11 +651,7 @@ elif mode == "Debate Workshop": "round": current_round }) st.divider() - - elif event["type"] == "debate_end": - st.session_state.debate_finished = True - st.success("✅ 辩论结束!正在生成决策报告...") - + # 生成报告 if st.session_state.debate_finished: report_generator = ReportGenerator(llm_client) @@ -661,7 +680,7 @@ elif mode == "Debate Workshop": "rounds": max_rounds, "agents": selected_agents, "language": output_language, - **({"background_image": debate_bg_path} if debate_bg_path else {}) + **({"background_image": st.session_state.get("bg_image_path")} if st.session_state.get("bg_image_path") else {}) } ) st.toast("✅ 记录已保存到历史档案")