From 6bdc38aa5acba5983ce4c97e89e7fadc8411fb66 Mon Sep 17 00:00:00 2001 From: Sakurasan <1173092237@qq.com> Date: Thu, 25 May 2023 20:03:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96stream=20#8=20(#9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yaml | 3 -- README.md | 6 +++- doc/azure.md | 4 +++ doc/azure_key&endpoint.png | Bin 0 -> 43413 bytes pkg/azureopenai/azureopenai.go | 58 +++++++++++++++++++++++++++++++++ router/router.go | 11 ++++--- store/keydb.go | 15 +++++---- 7 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 doc/azure.md create mode 100644 doc/azure_key&endpoint.png create mode 100644 pkg/azureopenai/azureopenai.go diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3a4c1b2..e3fcd60 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -7,9 +7,6 @@ on: - dev tags: - 'v*' - pull_request: - branches: [ "main" ] - #项目任务,任务之间可以并行调度 jobs: diff --git a/README.md b/README.md index 119e075..ed13f83 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ # opencatd-open + GitHub Workflow Status +opencatd-open is an open-source, team-shared service for ChatGPT API that can be safely shared with others for API usage. + +--- OpenCat for Team的开源实现 -基本实现了opencatd的全部功能 +~~基本~~实现了opencatd的全部功能 ## 快速上手 ``` diff --git a/doc/azure.md b/doc/azure.md new file mode 100644 index 0000000..c190ddb --- /dev/null +++ b/doc/azure.md @@ -0,0 +1,4 @@ +# Azure OpenAI + +需要获取 api-key和endpoint +![](./azure_key%26endpoint.png) diff --git a/doc/azure_key&endpoint.png b/doc/azure_key&endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6362a4f938c67f2b21404fb194646fe5bfb04b GIT binary patch literal 43413 zcmeFX1y@|#wk?bW3r>I#+$F)?-QC^Y-Q8V+ySuwf@Zj$5?oc?q+V{M(cg{VpeZSyq zZ53^{Dpu8;W6e26?|t+zS!oe?*l(~PARzE!qJr`uAmFngAfWirkid7E6Yy6-K+qe_ z1O#No1O)J9?QM+BER8@wRD%*#p=1?h;{g<^iJnw1y3iz+LnmZ0?puLem+VbTk-pL{2x{h0*#dpkgN z*@S)~=l%{Ye1{^NR@9>PL_EPj_mcn&yzM<%^}Q&I6ws z8{gdFsw{HUcAh1&nO^`z(van|iG7KM*{1-m-#&*?2z8tLFE1%)Co)&f4zB?QVAz27 zo}YY8#y&=O&QE)$>Ff6|f!~hbGZ$@LE(v~q)NO*quh+`GI}f&dJUq60XUk@GvlC@H zFCLud+gzy(daH1Aio3W}UFnuBN9`qTYoRGAJh$yQoBlu>&KfkbgHazWz zAkFr5chF*jD0)9H{_N&_Z~+A4v`P#4mVPP#+|IHMbw4V5Rurd%mb!jO37LIk1|Li@e~b zkmp+nN8kav5Rm~CwD1Q#u&UtMJSE~&U@&bbsqXy~6r|*62HJFxA zmmzOk(5#@+0S?=QEht^EEIlq;e6HA8!75wu5WKPkDM%gAFoE>^h8;&qsU{8PDg=pEf0JpjC&ligXr+%0rzVnld_K zcVuz@!WFXdOP99dt6e1IAj+;^Sg)b(gnpHN8?8Z#+ZcKh>}XWtz&CxZn%t$nCH^xs zOEPD;cHi~E=`9GmGFFKU7HZt&kak~-KCb@p-KOgXSG^9%4FtSUnE{OL>RpfP$!omQ zl9I;~#gd9ruoC%_@RF0#3x#o6FM=uLerWeVuRv3N>fE#`DOce~QDT&!&=o-p{V#OM zssbGno?>f+)A7V&q{KEe1oAMYVT{7=B2oG11q->(`O-Pm1zloqvF?eGB1D4uBD;L? zk_!B@;OrCg^9ExFTfp_fSwuQU-b5lq+C`E?;zZ6$LX#4Zq88~EaTY-q!4y@G zWsI?pagV8uEv62ou&6DmHK=*2)~TJS4ytw4-PC-mfvi2KXRhzk6{riVRjVJUORT@I ztE^+FDX;aYHK}K*k+J`Ut&h!&9fqxhEr5-cp_w6^v7KSUc4=Q_PiJT5@X0=N=VVWP zr|58D4`GXYV11x-tnYVzAL^Jwze9{kRC2QO7p=OyhWb2e=@*QQ<b_9}8 zgCL6l-iJ;nwC6QU)R*fBiuRMM6O&9$_LJ$_@YOm z{i1W?W1{q8X%e_emPwvuB>4M;i8S*x_gdmLsm!T}b^3MMbtH8$ z`=R#1_91)fdkgym`(Asa``MIJ-&M)6m5$^di%JSal{>0h3W#&|suaua1XKBz#h+4c zywDQDt40VCofB!w!pr2!;L9%OiRb+1s!FKJK9|3g=*VWzZp~gzu~ySn4(A_Nxk)>y zN2rVnl*?Nvr|Yb0yu<y@=i{-}J!Q!94=> z1CoP1gS~?rgDr$%g~No`2gwZ>c0G5=NHa*aNtsA3io}bcq%KpD$1KOg$BoAa#)c29 z&})K9h5QC?JN-Qb9+)-2Bv41eMlqCom64U3E2kHf7f2RtEDbH=ET658tq_;AYu_x3 zEs{-GjA-=ntTuOf&ub=g2lZy+;0!B%a;Z?vFXRB^s zz5tBQ(wAsDc&tBsvC=haG=@M=z;U6h+w#|N)~j1CT~*x`-7Q_yT$9|Z+>YHcuhp*? z0NneXd->ZAGbTMMeGdhfdD+1_ew%UKNj|wB=DymzcE8+n>~w{;jAM;tou*=Rhql^~ zEJHm+Ey%S@Wsf>(t7=+mrfsjUBCn32=R;?aEesiM3Ps87eGDbOfRoUD3r7!=j>!s} zj-&`%4tEOe#1z58_{Q>u20a_CJ61QvmJT`fC~+yiKRqFh(Lwfb>&cLOnW6O%=_9v6 z;Fdy|B3a?Ol&|yyJBi!#=Bk(|T4ZI0byj}nU?ytDfFOp1TK3dt3kO7=Nq<*h% z!q{sPFyS3bl&O$X?=W_{6tGJ_6cPRL`+gi}LSgJXj~_R(yFQ`L_m3N~m3SDkL)ag% zY0}pjBi#4LcYd?rK{r8YCRZkTlad&z7>yZdtR6dO(zQO= z;!I2`tW|sSy^Yh25-JZ`IITrKmHTb|_qR@xPHgu%+-=@Z!7ou^koCb?=_4%Fnkv!>ER{?zEHcfk&5=!MO@M~dMy8FV4z2ZxRqdIcrJsvomy)Ni(}`1!(>NQQ z?n9Ronv;H6rR~x#c$@WIENd1E9^I2Qm)70VK8s#aFX!N8;FX98c#MdY2+Z&la7^#{ zS2DXbJGQd|g&|Z#ltfnfC;6EM>IN>j$2=zUM1g!al~P3(n5w6BgF{PJ5@BPYo>nEJ2^w zJ~KtsMVw0nOAw7#joyCW{=Qm{X=ApT)P?Hia@q-a$z>{Td~&*ZjzJvauJf*VC;lik z=`-KmKa8DRO<&fi&`9nk_c{JJd34g_aE7W^xRbimSaqqtob(BNeMG+C13V_e;*-Mz z?muk_Fo6h~fEkDPImBUQs7irRy3KS z>x`WY&yA2;!7-6Zkv=K(Y3Fo{^|tF+x|jxu)?PD3y-f>MsXO-p(FW3!89J?Ft<)DD z?LO1zPkwq2)G_Rn_SL%^Fx*{T3*P4MV4wxQlYZ6y&;Azt(ILSh%fa7;YJ|>Wb%dQo zl!S_h9tYF-NwFum?YS$7-sa^ri`QMaOe>FwuKHuu!H4+!4*p}( zI9*=jP9t3>%jbNfYEA6r;8yDcYBL7!%S%2e770frcxOW71U5Tpr~f{A>!L_MXg>sr zg}WcDNc`0JSG*rs&L}G35BW1Brby?a?{gH4ho+ZPRCKiTCkz7&i?tml@rGm$4Gwa4 z99Np#Z#~sSv6M?B4Mcgw-^i6oxmykci1QON8fqiUE3!2MJv(~&1|SM~ja1Mal;D}n zoVekIr78|oDw|gr*mv6y@7V8czA0j%V;X%MN_$LaPsdFEt^s{%)F7ztU6%JXkhlEQmS8D40VeRAFMkcCVG(zCjz#V2t0=Vy)J-8RA%w^;%4Ry(eQYRscZp zTv`^Q6m437S(l{)@bnZg{f z8nVj4&g}%_w7Ma7M$zr@vf+9uzj@%b2l58K!B8<$GV%_1T zzct)H`(%<`gfxk%4c(>aZNz=fqQKOCr|!D3FE!YkIPhMWx?ia@qtWA{eyO!6zaYXr z;zhai*kV@ibozbN`FUdDVMzxd0;Y}+3Gn|iB{h7iluKTM8LapD5xXPGR)CYYj3`}p zqy)DC%^e{=)MyB>8@=0EG6!=Oc-gNugYQH%F0?|}rui%x>^KNlgna;(1iPT#gbqN6 zMwpPUqP~#MTJ4DPYHtLoxp{H!3{GS7B2l_#(+thin*-b zYU)PyDWjKYfS$z1$Zel0QF`8yiNT5eUMxy{oR>L5LXtQF*O_3Wz?26MmNaS2U+1QWj46jZP}^Xc3gZpuQ&i}hif@F zuV0^R_(;_l_Ita?xS-)2;e7D0bCq((cw&8=dEvery=H+1Nw`HpB}Q%drirtIIfDF5 zT!HUt1Hrt5z(ycXZO?R~-=G2KFxIz}Z>MgjaeWU18patm87Ga?AYm+(#WNRYPs#LN zbNSQDY~r{IlUpR8VYVK&o@SpB=ahpxizEAi0?#h4%l9(j&TO8)lc7jx!6Y++OQKgC zF%d06r}8W3LzjFF<$LdMlI@edQB)OT^VuqCt>n_t3ZLa1SBArda?;j=e5%RSJ!_NZ zN#`;bG$)^n+V<6@?`tmGUH!b5x>G!0edR=N1}wOXl5;$r3{N|sTuHbT-q;NYJX)V{ z?%fX{N0ot3Q|9HvTjfd2R0xE60(8q37sNsZq-+2b=?AE9KZq|HG6)A6$ms#-(Xtu{ zrq*T@o*+IPoF5IVcqum2FIYi;LwpZ%P|ARnTnf_=`AxH)EL%v=Pu|cz{53?5NbjMj zq00R~;$TaC9g7tWseUh#vnQZaesRKOiXO~&nzB2ByrUF`*bONi{GmruJH14WjW+Sg z1r2dK^9o*(xJ;Nj`kihQFQBs<+G7&6&8xM{j#TN`T3?=D8z$A|i(nl-v~FuH<1+IUL*h-)CHbG|zI zEh3>2e{SVBO9=Nta+fK+P||Z@MXd_SCO}F^TgUtv-QwpOL@aNeh;ImUgD3t*6>uY* zD1Rm$#Vlfydued>_4An67_l;v#2{cR#kQw~o0I3A);nt?p)3ktx&)sdCFbW;LEoG& zdmR9z{fc;j?qnl0J`L3@BL&NlNN z!Ik8d@{Q097OX9dC5$vQ)8}kdHlj3|r0-enhXsPQdnBd8$1n6WMlAc7Xo_f^3HFH` ziW}uHWq4EM(-}Y@eZ5dQyUI*UJ4W}7kuQ}p)h*3LRddB-$bQCr9MWvmkj%LHeCzD% zal)bJy3vx87f*cpAgIoRXN>fu%f>6WbeEgA*ZU^eegK&NsDN5>gd)ZQYP@Zk)oksIYsPrCQMPu@!+X21wU&-9&!l+0PXfh- zpC!UYP3py=3yVjCzCTYwDI!xdYTCC(R+LtA*+v~auRpgymZnEU&5wgtqFCXrtg<7z zq(9JZW}a4F%6y~6F~s?X+2q5@l6Dn(dVM80p|C2JdpH%btm4Jc=-_s{_i2>`uph3p z-ORFKQ3dbAdUgFKJVJWEuw1RVinh7bb@*1t!!QN9odd=R!9(8k5H!KxIVF;U*yK06 zW$cR96JeY8_yU6BHz!DnpZ*hz{F5SF8F&=GMxMmf=vSsOm@z_SJP**2fuP;2-SO*n zMe#2ZrzpXp6a7Z=^h`ufTu~(B>{bMsr0XbNm;qEoKd(U*(CgVg8_+5|F_J;(_el&1to|C!AG zu?PC4-#iT`-oR+M5f*Oj( zfd)b4kIJU5D6irx>-)C>rbDM!_ZJ}EW5mGJGTD)nxG=q;3-eaF!DdP4CN z@)e3k*SuBlEQlPaW3w8miWy5uflva+&>)~8W*`v25h(EW4fp~90m}jV_dDRTIpF^u zgW~`7ArUhYG6)DSh?pRsqATcG<|j|ZMU=tr7CwIbmiBfGa%Ihkd$i;o`3Bxvbc#>m z4O8e=cH{_D)?4#4!D${QMiKsLsn$%mlH#1WyN@>zxlvoe$lN-JYpz49dtO zyhNZV`2Tf8i>}4uzpX{RDxD{a=^wPv6GtP$*(vu>Zd72z9ZF<*M0C*V~*@ zm@LqxGueZF{o?Hu-yMvi^Lc+=)ciRs>I)G^?w4#K}a z9cE7#WpEsZA>gd+9*n0Odu?xT$Ff1DU!6BUuhnpA?ySmWvWFE)B0RC4GQiDe zzr8&4g`tv-tx#*V1u|D^><-718K2wJyWcIcI-i*~I7`6WBNjavvmd0}4DwZ>#=kwE zR;$(-hSh3h&CZO{Zk^1RvwEMUTss}ynXPqtsPLq7W*>hiC;v?wl}&s#fszyJ-L4b$ zI?bQ**Si0{@=#rgvdm~`Xe3i;`8*2h4Tt@m&sTajH}NbMDyG3SI2Wq*5%D;G<@kY5 zRr~lfST2jpc-UdsDgw+&trjYcq0NDRIjJ%;1iT`EdH2A#pPW4)cd{Xqp;m1e7dF#L(ZDgftq z0!94t*U5SlWLdIb72|gWmdkaf3k@*h$<**VIy#P~n-dKhcqXGs@afDp(?br2V+)I; zX-w%mmmz&2h`XaSA$q%mJdOpwfKk8hfxhyYHc0OD3E0Rj@ou9u?98MrtL-~wB#eX=FDOaIt z7pi-p?z57Mpa$L(5?3S{88VS=9tuX^H1h$UM9I}>gxE9zOBp{TokVvK;;n4hq=XHlnZ!!^i+5Lg5(QF-cp7jH;KdHkz zzFNdpX0_TNywYGsXFG*Y6_?Iz5q-?#SzR@+R{0TN=RFXfNUL$ajE?&ARc{|L$}0(B zfpYR`Je>sz9lfZ1u|m6&bC!m1JNbuNB%|33zCbXXy5!}0yGYoKMN961CzE*rz|=V;y2W@ht8=PFPQY@b19N{Qu@8Em3ImJV@~e82c^KFy z*qsPIaDwe4$QLab599%@cIVkVO^CK03+t~2S7TTc`?tZcelGF^>pR2fw*bIkvOq|V z^}74X%6_fctgt4l&&JXCLcpW&e_k)W6$Y<_Uc!$U5l>2-yM#abbIHQz|Rct@|}xjz~m* zVJv%EEJ!^fteDwoBw?x50jkb$JbY?OcJFs8IEV8^zW@m(ymF;E6Qk)8lEGl~yi^Px zkMNVd5uHyDSiY`RrC=5GvN&EB(jE$b7J~^jj&rA~+r)qbw+Po^TBC)ofkgmKB3Zl2 zB(7^t@7xRE)TAW?0WF)&q6rpDrdnWDf#R|`B_Mzc7K1wP14-{n8jFmJ2MLr*|Iro# zQi#+s{y^~rlge$Sa8gPLtUzJ=7|2-d%cOco+nrB?tGnM}fsbuo?=qO%JC0YLgjR@T z#lFGodZ@kxJFC|)Y zEFi?;>a!bA{>$d(`{^?`dSV^JwSKFAvf=UQ{o%E~SYQh~H-^eJVsZy)Z`pmAv&6~z zv-)&kg27N035hn_Y~ofb~;?Xea1)-Jud}->kP*5yj4J0Nk=O8UX@pO57wJZBE52osSZYBI;l1rq9kA4aJt=6 zR^KY@Dd*0@V=?zO?{@P=$Z+#@k?&~p_YCB@d*^SI-;H**wzr>7ojID#9<$Xor4WNi zl&?T~(S2=oIAl)G;_`5=cVN42bD@#eyV7W~6#f7Ok7ai<-xuo+0!~Kt%dFGs{9=|v zA!saNP&@ida71um;8s@~ZWM$lejIP}O{q>eVOdJnH0!Oz;SctMfUO!6^^#3Yx&9s3 zNxo0{jm6k*@{?FPWJEK>^+GC6K8g0keOe?*48=9g7h6?%;8a;WdiQa-C3wK1B?g3Mx%mhjU4wmOd^nZVKzR#=e-fuX>~T z?%6Vf>B^pgqnuh_HaEP|i;q^6ew$<}{YhH-Jts`5^=cDNG%j0S=de<_^1Mf)(PcgK zdI%!kPQ!>ZmGi>|&ReU;gY_GQO3eMOzoCU{t(C`UT8EtquI z1epE^JZ4A)HL9@Y_Ye^jiY230;Cy&|)}0S0a0(=nxz%~FMDZz5S$%lE<~IqwKiG_H zkD4FLF$TEZ@EzN9o|UB*FFQtKhfpLpK$|IWxE;bIeeC9^yDN)U0&yztp{E)4b`|HM z+B#0;Vx5ZhrTf$R-BN`(@93$VEo<~zWTfOUKx%KYLK|&HS9kw+wn)+94&6VnCH7Z3 zQ7pdx3Vy-BcPq*Qk;t!p=c~=9b*k`6U+=$=z!`Phd0OohTsG9;up81Myx(JVedScW z)T_#mvxt%n8z5e7Ofj5Gl3W*xK%duJ)0)pZd4~UHYGXg=5qqP4x>z|so=l^|CywTB z#hNUPJnZpsKG6LkoKz+LlQ2k5QX;g`@B^3281DJ*7#!v)>BlycqJKkt*`V_THrr1w z5rq0Z)9$hK;?B`JL`}&NM=Dvp{WxB$`Lg-Ju{{I?n%?^RU#wk5N_yvUM`P1H$mJ^4 z{6=VT+GUCqoroTN!S|0M=lRUG;k$9z!eC)pzR)Y1>W87X4pnklTP-UJBo#g!#}VvL zn$vB9;y870`1o)G4D3W!_8blJRwzOuhZEHO%xuuEW*tw}d2s7z==g1*yKmK;?zPPmS3yfXZpQg)d5VC`>t~0WkJ(EeMXM zTuh|WVBQ;!7g-EUVw2xoe)vg4sZ<7`p`k%#DxHf6!+O;2y+Ej??mb_Ke0Wn*3#w$-Xn2L^Ta;Bz(9T8^$q9oYq7^ z#G&{}APUeP%T$}jtQG5j`y&3(%b-Q2V*k29pweJR$He$}uXFaih}TUKb4Mn$Zl@7s zK53nV=77K@D2)hpSD7H}Q5&<4(2G5C+75X4KoXfwO**ebT5ySg2c)J+={z8@P9T_QvhgOF4Zb{q><#` zH(6;o?a*DbA}TQ@6priacyX!Yt*or@IpJ5YFnDPv{w}NR?K7ZQqvEeO5K!z zDu5W=l^u;4<0 z@VCV=i{4_FMu93tgqA1rFN>Z6<4LjC`m^7R7B&v~eAf8K-#<;|I#MpFYxF#bv3j#V zf}qut1q4*0AppiA)=($%7BVCr8&t(3%TjUG6hj}>s>xU@_&XvBV!iDlnoG@AF z+1OO;5Kgo^orXu_u;&R3MH~Cz$1;tU*{df>F4WhCy^2=@`9S#z3GPMhi3f@uwZ3{> z3rsaE8s!lQv7olOn#2-2a1+z}!L)Za)S&U5o|pzm9pdJDgR(qA1nuUaOq6PBzqWK- z;j4aLkFh5cp+*!Lts`xtS%Y%GmJ~l zV(Oo|=nJty?T68g(>3VCV!akhB9ZjfB>EeZcyf=pX-tDAFT_lK0l>w&iE_L9 z(Nyl$-Cd+JPmx7fahvk_3cH&s-v0PQ+hJi)12HN?%G{B5n`0{V3kha>p{0r?kjls< zT3Uu9Fn!$3Cb=I0tX8MG1fYQY50-7t+iE$#)A3k-?Uo)<&&keiI``xq^xd?W^NvF12;J z?S44PuW~}?LE6itP|sE^VFN>6v3x<{G!}_C3J>c;Z45MV>0(6}(~a~w6KfJH8eR^n zdaNsIrz^8y1@h5*B^7Z=VsZ3h%1Kk`cT$GjVS(Dor~l|Qzg{G_=I2Zk$h2zpKOx|9 zmVC-}HQWpoVILv6H|z2L>}?(pn`Czr0-{ih86TTeJ7dDGypoZT5sBGZ zC=*yw8k$;-c1*hS-!XL0^m}FVbFx$*P+^sS9lIX05zr9B| zv!0NwV{SMa!LNQa6-VjUG+KRJpiMWQW?dB*`~(q%8Ps5_zCa137)^Wk@s=cH$+fUC z^^#xAG*a+VD7e5#5?9~4nr}#ov3`)tKcsb5`E!Kr2GN|bNW#RK5A(jxkT7SJf~F}j zqgqM-C0$GVx$$K)5MwH-YLfZSEQ$f~qg_zvuKP~3WBPy6tE&!-s9BkDS^r#iGPtck zkg|_DXCbu+lk~Y;lbnxdT)+P5eAdC2GRTI8O7{H-LdyE)z@Ug6CqFMH+^YSp3wQXf1Iw|s_s7iHpY33g{ho?5?GW7)DEtYA>+g3HW7S=f`L5xd<{A~mN z{MlwU&Io8HR5Wzg))MHpZUcsOTtvh_z*ZHZU0Q$q)V2`wCuOeGGp2gqUkR~>7;J!8 z{aaT7P5>o^w*w$acGYRi_E$hd6Mv;IF;JzpGf-YSXiAw2zI+NvhfjW6(Dz7mS*7Xk zn6%uIkS6xj0Ekp8Z(Qb=Wi|9*E5*^npkg@4CE2(qPx(yh*G- zuS);E^Pd5}GuW5e+FL!EKcf3@6eCE)ONRpw^9LLHw~{3K$8Enj1o2bLh9y1PA%J?* z&B6TNU%r6{_Bwv|_EhCsOdPuhBWWEA^ToyHGTW~P{op^U_Yp+OI0rjw)1Q3x|BiVp zAdXU_(GWTQjQ0Qi1$=hk`i~@+`2S0T;03Ei$w~SDZ~KqH)S}cxH6~~NB|Kk6qb@bO z&^VuO1j*%hh2KjLMdC&&S85Q6L}RIzm}}NzP`#+3i`ksu%{3LX;SD+rJ#MZO%Qn~sWiYf5(r zHd-uB-#TBeeA3a`G&O*SH&RqJE|N^OJzb!>d+R`Cce(J7F`t`SS5{Vj+)s9U1gfJ~ z>n`znCMG79K4ttoQa)@=O-+N>21EES#QAAamGIw~%&{9&4}p*U5+BsZ$49YT{Zj-6 z4PUpn7oEd`<=I*-I2Ln-%EsZ36193#AX>|ZxF`NS848@E{!^V1xn@D=wV8M#B|Mpk z$lb~O?2<8S&6filT$E}Hf9@@@Sl*8Q2Iz&0^|qa@o&eLO z8e~eZM*>KAY+dAC5xn_dh_l7OUI^A-vPywuDhkhJMv$Hk!T?YK-`?5DJH&*j+4ek{ zGb>Roje9Rt;S?)cXt6V>&}g1$5W_>n;s)E^)_Zh*bv4i#Q7nz6wo-R>cR#VftTOnj zdyHW!fX4%T02?@9Ja2dT@0Y5*^`{G^QHVShk@Mv$xmK&rrmIz%=nE0(RDzl8PSb@J zDsNC79uFNgGUq@Kf<1AO)C;a!y|L0um5ssp3e$9Nhrx>)eqNgX^ZHZsFAjpgdqsX9 zal9Sk24Q5b7eE!;^2z3L&*x*7zYW-97_4Z+^LeG~`p|3h=3dSxCl&MaezE#QY&PZl z{)Y5^hH1DqrdCgDH{;?i37iP6(THLur)c0^Zudtp^s#!QMZRDdiu+g~465C&u^~#H zUSIHO6Hx2bO}dd+s?x+%DpOQ?p(HzXR?``b81|~tMs2mRe~!eY9h=Ye1U9r>4`D)G zt2COa1r>GLouxh>*BT7vMw@Gt_t!!nAB&sPC}yKf-$=eiy1gzTV$vJVO(rRwH#RBD z(d&tS{f{P%=#~>qzsF=l^GF_t$%JJh!9y2%o!jmH>;_&df!LgaWMV3Ewc|cz;yssm z%7a1TkqJ-=hyMIozz3~}f*Gi+zD3l!767S5$+OCl+s^nzGEX=9bRwnlj6r{S$IIk8 zu*F0kURKd|JX0(X5DcGq$d-w6oXhU1xgZu#8l}zQlEqmfn+sMXof^sG{h<}%aQv0S z`A2`d^k2*5f!35C9_aeYh=hpC=_^=tce;tU+H5n#*|;w7BPbo~`R+;627bBLfDBuS z{Grq1f!6qL5gGwu!C+5yrChlj_erEJ?dPhnBiZKP)$XqWel)}mNzq@dPDY(^(Ib8z zLlwE@EwNdx{{ksd?BVEVzPc&~rRGrMHuup+XUMWuI8>|q zeT?I3-atg87vUUG$F9-|7N*c6A|==XYW(z!r<3o0~Ftqwl9T z`#is1pSsJ=x(Dt%#WU5v!NmS*m*J(ikCDGGh{_yiRW~) ze?tQHFZh7XmPS+Q@+Oxb+I5PbZDBqq8`OrOlI8$UvuS>B-@q#_&%)^uYS%v~8Hf*l zNkI2YNSY{Y$5ClC%@8DCm?Ju(He#rwL^vHyfnw4dD|V-N`vaQ_`m;q+sx7vDE3-@J zKGL7oTL@k(r4i*hmA$MsVJ)!QoOngrzh3T-lIM!Ar=*2mo-S6WGpFK=a{tcu zc^7NOQ5YU%Z-{v%QCpeF;L2ZRF#Mgvx&Cxl8<-Ul5&`T$TzMlQ#n_k56wXhk0NCrB zESY|qCNmVvoZ4FVDf~#`!2{A${*$>9^!wMDim++?UnR9?!9HRIS9KI#UIE2 zI^3_4%s#8V;gpygYpFG;QP|gwwO0wwK%kd?HvMxQ#7HV&*C?|^7*AUPh*LZ9A7(O_ z&-bUYB5oxNWw9qhpD}t@UvlL{u?|Gp%ApYPPIPpQY#ipxl`G!2kOLm1U{r~R+(LlCR0uTD)$V(P8YrMYO=TCZ2L;d0@(Re@#wqVAFUoDc5!0TiXQr_X48QVZ{Ve~ zv9j`NLo&FQz#qO6|6O~41HWYC(Bzb)ex5FF?yuaQ5Y`)QVNF)*r;)2bkw)b0`TnjE zi`g>pg3EmiSXj+{^5X&TqDL-XB<{d$RMc19OlkK++mgb8giu|u$+c3*Q37yTHeZ&? zB?5e=vGOFG42?i%fWQKsYVh5$Q;8cI8aH)gDamb1!i@i0MCVUw=?PnV=NW~GY>p5V z5{Yj`xAFhG#|liP`ow>o!`#_M^La+n3uHb{y8Hf zd8CMOTnRVyOVjxxclU6IH?8(Y1tFTz!1l5r9Ton6o}~ZD4m2dXg&m`l4%=Oh6$7C1 zhiZ}|l45zZ5~N{Xg02!;Cbi$o&XfSyY>MY5K3WTdY35|Wv;TP&x40zY-wAsM;gGuuCBFD-PK_Q;SkQSk;i;m(%&?Y-k zg_#Ark*&FmBm$?iK?_={B}4EQOyJ=5&*WW)V18c)+<53IN{GfZ9Iwz-N=!CTkl_9U z%m2+$iDAL`HU*XA>+WbHVqS7a%TANpcGiUHa7+}jMgJqS|FzC5ZsZcK2NZxd3~jp+ ziwKtGX$Dq(x=~bej&Vvert*I@O#ekdiH*Tx0{Y|}CP=K=BqLK~SZY(8tu7pHd({VN?-P40j8)TT z7y$PHPowyYU!lPvdB2sY}igV z1fKtY9XcRlGZfQ{u@E<9A>Tqj^qTtuTxk0LYoQ)sJC)jb;znU6&qLsdcibl}oQgpC zV`v`?Ti~yl+ob;*_>5tDkwFHucm#zfa?d4q`+RUmV{=1raB!?2oSj9+#_FD}*F*IX z5RhxNG0qf9R1dv7UEyDBc874f-4Octfx*y!NUg;eGU@E6{uqy;DQ>BvkfpMVK7DO| z%COnVy5phz2ags*RJ*Nlu`ilwvWtTr|_fCn}@3uwAxJ+r?(WREJU6%3^0CJaTSwHeB5)X=|7NOhf3a>`yeot%Oy2#jrP5G_uBJ z6fx~SOVW+|XiS=g-THXRBrSD@dCYvY{A0Gb+CZ(j@wSy2v6%jA2ZCI>GhYVX`tZdU zjcY$k1qB6d4@RAerZZD%YQ|v>ZFV_*1|T4aX0kWdN^utO`T6}$V5^rCg!=TU=k!9$ za3W49BnS)g|6`HES2p4QP_=3i-SHD8)77s0Wy3=nnUqW@F9qzzLv4EF%Z(K_7C@={ zOcBAlF=|%!Z%zpdAsh)hoJ8nJF?<+Q(H}q>?-S(d_|H)nMS<9%EP{Ho`&@j%JuOK( zKN-lwiAR=_VhmPCd@U1&DE7Zku~>xfT(q?+ZIJhHyop1zj4TKYb&-{SRp0)Nq$(7T zpl)=PYg(D2{{}6_|HGpPEPo|ThjGhDFt^g85>pU{%raGd_a`jS5=uxt%V~s9_hz=P zEi43=D%JN7n?Aek!|^(87kd;6c0fzfZp%>2o9**hswvH`?;%uAPY{jQuHf{3~nwHS^;4aLzLKEdG2wa8+IA;w$kG3uN05nSCR%?c&0U+x{^}RJU+? z%Be7^-D&$U5z(e2qhwD2G>&0&+D=)vMyAs1JtJvP?iM$8@E1jl}>xn(Ee~dRN{A^lA!aWX@jwg{EORxY-+)t=8t6CH;RSc5*Oz0ro1V z0v*U7eEkhdu1K1f-k-m}=>A%P9PTv1?;U|rmL9o&V+0$%81u^(Fb^b|{HS}WUHaJS z5%7GwSNUC0cOG83Sp&*eXCkuQ8-!fOIiymp>6f36I_Py9W%u6Jcp6I}0BO0=pw?_O z`4b%Ii4Yt{A))p5++#&9a5@o&mBAoUhqKKJow&97yro&#YGwK@vnjkGqOuigz zYd<6$;p%lv0KtW$&u|<`ql>!W?Tpc=EYSF*s-bqO-q<~n9rHs+2-Y>#6=<_OTW`mB zd$|vC?GcH@4&rdRIAYq5f!L99k;M!da4+W}o~uw3z|(O53=KzX(Nq`xA3h&{|bqUznnam-RMMdUn=_U>qj9# zQ6dF^hsAP|tXZuJ6dY|G`+K_I`J>Vr^Va>Lue#m{1sX}PJ$L%WR(3Tj)#v|`)poSF zT`oAI%cjo2Dfc|*ej_h6S#gj`W#kNa4@qZlU+)g7HrV>rdRLw~0j*W=KnGCJ&k-W6 z++Ha4hHO@3HPrK;-+Z=rgs8SED=Ot0M3Hybw);eW&CV+5aPtNgj^cp_M)dRtbnP_n z2P*)LVtGXP$XF3umlarK0ZTdh=2YH4Yyc+`x>ZM~)%RyrSiN5Zy~Xjh!`N8=KUpItb+1I@_FdSQdba+&Tf2 zQfTu^bNNR#=L{fq`;zV}^1?(?6<%@E&Hl*o+f3cVBhVmy1$0DC5d_?49Z03K7y$YE zqw;wGI-QyT%ofn6$qNuDmPnVb&K3fSWA0r(PevFS3?@~$^g!WmCEg19vWZcqV-qML z5A_N~IP%jYH+)8?o(Y=-+C(b>7B>AxjoBV$utGXzDADlm`mq~_>)k#)aL@WR(&|Z+ zN|gJVRXG3$jA&;V4-by~SZ2o}$>XZ*Nn7j324!u_Z!pBpVE>1$tAMI<+q#M%A_@}H zNQ1PXq@+klcb9~8cY`2ZA}J-^-QC^Y-Q8XPKKH%rG$+AElJbtsf*2Iw{GN$?*l~!$_Rvfv{hXTK)rc8s+}kBfvgRl<5*1NYbI* zX>qPCMp(#|$wK3MhWABxFrHF2Tl%W#>}N@b&&KVZZY-oH`JX=m;t=ZNN^hf)%&7ie zlB>CwQpUCBL5V-+TlM++hY%XVq|P+5HHBlP)t2n~bc)~MxhO+;KuEKiWT)WABI4DM zK^ek&PNRuV`Bwc_f4qTWJ(RHPtcqId1Jy284ZzxK;FB5L98+7(5T3fSBsGOA2>fX( zjOctzs!*Ygcm%6ISLBfpA)Bxw*(%sLwW2zjqZFh!RLk#vc_L$LE$6f+>241w&EleV zQ#?F8$FqAeeL`AB@^zwfbyTztd5E|ihW0Ek2WN#xY69&LU9~9F?!zMgsrjqzpga+W%X_FzARO}J3`ZqFrNmzzRE2HAyO3bXtS+Z zcy~L{*9TXRyMHoZgT{V1VJ~FaFtAhcmTM$)cQWUFCWTme=vm_b^W9jWOt^%zqQj6C zC=Mcx+N}hhZ$610o1-<-8MGgCI(Z+5>kdfRLSb3zM?`wUl7 z?v>Wmuzv{UziR(Z#Hv{ldcyFl5qq@gGaH41g*G3z;n_yq41ASmGyocuSIuhP#~O#by(!IL#5@$Nr4s$ zIybdN^HX#R4{D{djYCB|nY=)wP5EZazBu-QYF_wQxayBSi}qCi2E+gQqR4TsVQ20R zf;XfwEVENkYm|b=lT-NJ+}ek|Oi)Ora7$5vJ2cvTMcbI+lG5Q+paXmO(2cKQYiTKq zy*eXIXKZxz+T^JuJga->Ahqhe$D0GbE=9@H&X7;zmr+GJVPn;gF49m1tI>oN%0`!>a%PtSQh*jgz?v}e)4cNLbem-AO)99NRn@|r@B2^ z0}m7`FSk$vG1;+l6wCMmaafMa`Ga0903Fc4Dk`linHcu&v8#&7VT3Z6B@ZR!9L3$xp6J7!kqUzSnyrk0lPED!GEkoa(bKp^^6 zjTJ8ndR7OD(6cU@4FDRK^7@gsiUYKv4hm8OS>$O~|zggf$1E?V0m^VL>&Q<1x-|g>zk*!<; zDRWYrY=!S_*1;Z6z>`U!jSdoo@^RzJQ>`&u@1J7^llIOq${;|u*J$=$kgqU*32@H< zoj$@hpBFzq!+0akxeEZ;gDcPH@(GvlFDbM><{PYudU$;!di`3U4Ce7;tgFOV#1@}C zbEZm(fS>|0b*rhg%D37=duK9BxG8>b`VBxNB&hDy*pIck;8_x*LEYZorpuN*MWa>y z>U?vlv6?+GUZDxgXeggo-KQX4^hE?TIs9;&pMYqmF;j-Jz;S{el}57J`Ol*tOD(`?%m-xH!3cIe%nsI1c)`Vx7t6!cpB*8>2*oB;Pap>mZfRj02d5}PUe)}ZgLcDH7p`2Y{Qy$T$E_6QzvmNa*Jx+SB< zi?v2F0=K(xSKAoQy&)y|bujWK5}7O>uXU*3AS zhJ~1z81+{Y6dRe9j#o_9{-VNP2SdLQIM!mD^`*xN4|}NbO{I z7qD$&IBh!dR-T|?h?_~|wdjsM^P{i}Q;zTI^8#!ILaWW;){z!>l`>Hy92R@wGLe`! z+;{%EL#44CXAajGg@Gh=PRs2`Cl(3VtCf0PlYiHVGTgEE3=utgERnjA$s)Xayi(h*GqdU?r~qX@ zM`H$)OOZOoC^)6ct>q|{4aBAC4W({cSIC!UE0|rMo7LzX9`#)xGaW^>x2G%M0lEZeI}>zDJ2Roe^^!lmAQRC`=;kElOiMk>_5N2oQ#Sn? zinkA}fzC3lrPdqrMN%}*CXr29za7AHQPihUzHqp^tnbF_HHZa&Ly}b z(7I%QEQ>5D3Coqk9m4rHzug$>0BuMp@Z$4U3)%Nj!Us%b2BF={zc|8lW!KK28qKz4 z-+cW*lz*e~f`caH86LX1&)bpU;1>exDM3L&Xql3Dr9hk!OwS0k<1Mf+Ib4Ivn26t- zfFbTNZB^lUD7nSpV=5x155i)(VZ{re!V(b4xZ8U(o`a3+eY59+P**^w#6pV=Y8O}Bkn+1wAP*wlvG<$S(&Kb@HKc}9Bu`5 zYc>b_aIFu~Mn-8=9h=GcAN`Fjj0hh#HeoL16q|Yyg#ez3B zwU7KKwZ>yz?f6_V|!OR@Kk-qsw(>qOeBM zBUprWYW!49j?47N%Oq%$S*6HB4_l27#JilgizyN?f%xq2=MP>ie!!pAm^A$ke-=M4 zA&#+o`Hhm>=n?D+QXp!->;T7ei^a=|FFpFy;{1UaZU7+L&?_XH=$Pmz_t=&RXD!r_ ze5$iuZX!K1k%_@*ST2fDY`vrS43AFI%T9=p5NWZtwzlz&?Vfib$o zbpGc@xUw|Q$MPt@=LlDiYupMlt5ulu`dm9-D$kZ0%_KGsnj{SA#D9)>N)i^lpT{30 zyO7?iUyXMrkM-#QG$A-{06uH3EO&Q*w5$cJvlU%q13>BSK^*9Nfb8+9(1Ft*pv*d0z} zRg>SfCPXtD(ZA|y5aYagLKc<{C^{d2W_&PTf+!YA9yzKa&2;Rhkj%c}>$ibc!KM|L zyB0tYIZ-TBbGSUl+h2)j!Y5ciTD#L{Tsz&FV#N%x%_r$l$eAoL6aN;|m8Izw_@a;H z-;ZP5?6Tu;F9676n!h0hGx|!s&oX~#$OTj~b0 ztEJH;aSuuxOI=&7nho@gHm$wmtcfN5Agha?-{4of7{B1s?7*wpCLePBnmme>B!T^* zNe6`I-)U47!`@{-NRAotaS>gQIQ}GmR<_i(MK#@_@&lWFG^A!qeNiU&c7R{s#hPKJ zShEd5fX_sVj(Y3|RqdFx_1tl%0S!sfVTRLyq;Zy2)@bHCIfEwi%cJoF&0tAI)S)l( zwtrA__ZT2iJSBzg6_CqWnP}phD*G2W|1}aY8CVQtnJBNR+K$J zhkJ;Qj=n7c*NVktobAQT%D0;o{=%@YD9%%_wGYq|DY$Pn@~r4(20Mq7sNuQ}SG&^M z;$;@Edt;|sD?qe0Z%CzCMbS*eQ!|*z<)|iIMKc(E1>^w(Gn1HK2+akmJJ~(pPDY;?zYTc=Mw&%P3MmqcY*C;k*+`2^0Ylib7#T1#Y(8oZ0gmQ7HP1;Ph;# z)?UeQ=t~s3or7x2z?iAY@ekFLN7BsYPd3s=frfp#D`GC&?rc{j__FLiZTi1mSTheu zH})!5G0fS}meDI?{Z>}VPhPS~5>hr3cV8tGk;rS;6>TfrLI{UK zIf^A%Z@&ohLxj>gyKE{vr7Ba5XtYu}`XjnKerU9#CpsxSY%`vQGYF@&g*SrnPcD9@ zlX#&SwH|K>gtJvB%z+qNk76WhL_xN7g1WnPfNKlH;S*^0+rb1fdmXTq{0Er=e^&=V zCsPP@3~C2c${80;sabYoHFO;!EirGO3nC$j_#T{gC2rb-N?p(Qw8X{+n#&3c+Dgr#MhawnM0CFI=D&zX$H)UF^xk?i&@YEP;c4`uW=z}vow)ylIM{AMf2}2dwZwpqcg7td zLt9GT#{4Eckclu=v*K0N{dfNF>-n4)zqu0O(Miust$G6{dJ0>G#Fe6RI{z3;flm== zhJFR>m9!co^!n%QC-}`VCu#dswFsQG`>4r(!Ad4*$fUPXkPBOw-mHw~J2J0yv~6D9 zxNTSe%QP|H4d%~_`2X5|{sKnMqFlXKv1=3LEvKip>3oxITAS@Lzc+TQhBelbr}n%# z{KKw60KWjaJh$0$n0@##`zrTwy`WQVCx`xSlxX&y;JNbee)IPWGs0k!Z|u3`2{XT3 zm152$q=ehxsQ(`;7h=9YNf2aB)k`0IG{Fs=rG!GKRjvmaK_HCcC57yz_}mp}%FUMd z34nXX1|uL}dw4)=?!~b`L4f1l7)$}l*q;3~&m9&5T>xn;`UO0yK=1`1I#A_YQ1of( zIXkknSc$ml`&cNi)%C17qMRk)NgVv%>gHqd@ipwXd#hRU#yqv%n z+rxG9_I?t>?(i76x(L3QYXgMV zA7-j-j<1i_`W8TgQOVA6G}p}DQv5|Zo;>x!WQ&E`>^5(&1G$RHOzaX5^&jMK)&W3e zdpC0Ju;7WkAyL=Xh9OHsCqa}He>iKUX!oEH9 zXtwIN(w+A|MXYZRJtpk>nOYF!OTM_AFE|LWPm~%> z@kSFa0b`<mkjKvdTo$nf$$;*?yG2bXIlzYJ(A>;F2m(6u~gyM zubp_#>D682{_cQp0HubfwsZm9dGdAkRNvCon6C%|bu2O?BjY}3kG#JV?Jos!F5KQ+ zoon=SWh+#P!kaD;_8|f#4@OCcEeG&1TB3u%CP4ZdlF~Il?{@P94$iI${hsCv@>5JG z!sL~+#&pJ9>&MTg%*nW6fXj%&SV)VI@cW4h-MnL|yEI5z?2Mo_v3`y;$YXuA7-E7^ zSTV6!rN6sgHpFk2+T+=>k*sos&<>ad{+a;#%xo$C4DmWD09dBw)+jDOQ`ZM-u(23* zb&vV(Djd)i%k+JK+=sxZ($Z7!vdB1g^2=H(8HC^e#16veog#zO9)E4B_i#oDxMK3C zr-$}RXtZ>=QzE{>uZk%p1$10!l7CDnebzq-Ef6Uh9|Q0s4yQ9{Vl2zXX#;k`#(|uu zXcrLy;jba^0Wf45Ie0I>GPRsDq!UYLvWxT1XcX0AwVV6)8phv=^Y*ytV0_SR zyCU_^-H=!X!qpawd%PHU_p+SO53|9w|H-rQ4L?5)vF}9Rs8gkFyq@UMHKk2>M8sI` z%{~G&b1+LUHq(loEXlX+klaCvXa$G~A?T1RT`mr_1%8k|Z}xNCUY7`^ltT-^a`6ZD z)fzjMC-%Z;#wv6?-yFMYx4aNvWuh+CqmVRe&z0EL^FPB21ag++@pKc=tgXiNq>Dp< z_j~sWy#C}3k?2%ODTWH(Awli_G&ziO?#5fICi-@K#vrNxkUC*hR8%y-$f1U67SM(H z=K8MGM>ZMk5sMx96$-W7yuA2}^RjFYkXe(fJ|}smtJQIUg5AqvjV&pl2>3h!3UR>B z>@4DU2$D8is`B2$(-Z4T7!kND8QOPh{_ncRcO&Kl!hgl;K}oDE#lyfauH6y*lYtKzl4!PM9$N46eg&Od2k9-_=V|A+w-a?HCdm=cLo+U! z^}~(zLV63$S|j{|FJ0$skq_JbKybaT{8v zqZk?bpOgx7Ni_1F8|eiW8_ib3RfJ(Ml>|k<`xc#*Wn5TT%DCfeO$FC^xF%OHT`;ba zS5@h3>4Qx29oS+hSKA_m)Hn><{E*qSasUdYL@u}Xnvve#-h%9Anm=zqvoN>;lj2yE zc$v*n-)##m!W|j7oq!Zxx!ja{&utc1l2OQJCg;hO8Y=jGo((r%1tk2}Dwi#B211(2 zq*h0(Jrao@;cyq(0VxNhS?1v^IYdw=M6x@S)~a@e(;`PHD0&(FPaJ^%^ofRqLc%+= z>xU*LCf6rpYG``wPFSg(QtYEnEHm&*I4Dw@V27>6VMT4?_vcCx#M|_r1@>4YO*Pfk z#cks)B$(Op4yi=aGt?9CM*3-Dv5kA!jO+b|L)Jq}4*EGjz_GLzuk)eM4e;+Dgp|D3 z$yI*wo%-|QMB$f~aXQUl5(~7XUrZ|Q{~8?p=R!ZZLoV*&cdfc`)*;%ra&R4i!^5=L z`rC70T4BE2?!y;=wN6cwx_xmBQez3C5sa~D{fjU6fLWUL?&R|uws15^ zFLAH^fxPBQBvnsgt3b-T@(6L=UZ24Yt{KuWrQjQ4#+fwuR*v`wwYLaTjPK}BR zg;{s%vFGscL!T$WkaY;N$;i+!Spj|#hsAvUV2NK4BaKc-72@3&YuG({+A@c-%nBH2 zLl&A2D6}P^v;WTwomk|rB-02*aFt3jtt7lDDpWy*G(woKx#=(>zL$J4vY+wi-ajh? z`K`T8o`c#ys}O;C5oGV0xZ&t(`Z3Z!HeH}%34PFV>~Ps~Q2OT^-@XTR;vKGoYSg_- z=szghJUa;&-A$acS+&uh@qQNw-qWQmPVUbSv=sxB%(^r+9Fyoj-?NTL{c29-=U>0( zHb%C;11u5y^9i1!QKh3t(c95yx*Q|hHen0esPFAXxHv-Zp8;7IM7V_xmGA-7688)D2Mp4n;zf0 zem9#R;L58mYW8!%ozx&O1rLu(x%>e@edq(9BEYo*K#R(E1Nbw3UJq{2O>aH}yV(m2 z3~wNGUF=WbF|{=RFhIzg5B&7}@2tNXGtpdL1N8bwd+d8eU~Lkh-4#Iqa+ZWwWNezL zMbkEmg_RO0gst~xjkbflz2CgLI=`HcLB4=_iq=?~qjV5^>0X~TdFynQ?=&U*G5rn( zuz_19U|v$nd;pZ~VlJ1F6Xv*k_YvP1jJTIteUczsJOP-r((nQ?W`XgJ;`P-Yi4&OR zskMzz%9-BHvMs)XUjhXx?)Ik4O|0H3T!9dryI1i zK+5|RAv7Yj+G`B9W1%EdH0~OsEi}Njp0E)A#ihkuW?S7BfbEwP zR)*bnae28Ik3x2Q0U+u9t38+cPj-#Zt(W&d111cL#oA3`G%*`nF6oC#?X1y(=0XoY zrrUBj!B8rn3X3nA$B|}cDj`evm!GN|2qnt;MR7nDxC`gf)qVZ=*?OMIhYuM55DOeg zs%r%-*zRWIGvk>zhUca=cM7M>XS*Xq+pR4Ql%$E%!>gZjXQyHqjTC3LLDvUVH5y0Z zIjK$Jz@f@=yC13NCu0LJX%SEQBI1wz{xQ45>4(+sr~pk`)pFN(9lqVLI7X|?S7n-4 z2s0*{ngKv7M99o6?@;mHYTGr8!k>+XG+}1(JL3tfP;{h+t=}g#u(=WJcrwm3{BGbt zx^ROgs5hL2`}*Avf)G825(=ksi>+Z-R#rY#499ygrE6U-Foxv>%hTdwd(6f4mClPndLY;nNtZ7mEd0WN7#6AV9p zxthSVbbYi09!Q9r9M>**3^$qzD04eQw(WyD_#zLxG~uYh zZXy~BjY6ZT(qCV4Ccn&F9Ikm)3yZXF&*5QyFrMtaUyHb%1A0XuCr>UYmiEJ+pwcKm z;mpV$M<68_1B#zEpQW|{8`ITpy;zU#cT`HOyw$VSRw$r3;2t6sp)*?~cA{DXwtTG$ zFH>MjgtOLce+v1G4Lv0H=g9=m%z zlkn-kZAq6P0_VROuLquzW0tM;L}yjcytL#qvsuXq?_LBG3Le1mN(vD3e(by9@vEKT zp8y8N4ZBf+y&lwHv))5;1H$Koy)`F%l5|6v@#9|H_an|5pV8v$ff=Vvkp6DViNUBu=bJ=v+8rIFx96x}u zd~Uc_lVRW95oAk~nlvF6By{dP6lwVr<0r<~i(4Z{o^!zNbx}fZsGZ#yMleA^%mdQW(nLRogR&Zzk-98chy<%E znl}ExxUs2`dY2&FS_vlVRwA#*MrGg{yD-3*s=|bap zfki~Fl@nkAIHpxkj11SDZjWH=NDsaPfa_H*&;t780>wOz6^q|mNUYMPfY1dc58qxo zFla(J0Tk&sTIt%fH7(yJ?n|>?=s?M4rs{u;;lJa5l#*-6rCu+T7uQXKNi3At5Qz8w zaR%&^Ojrlfj~f3+u(x$JRS&WYH}4+Y&H%dkC#J!4%dz#xpAJ$;TKLFQ8Xkm(OQLdD z5{K^Y(tJ*W#r7X}eU4VWX47g>VbjAHY&3Utw>P`SBIdHII=vTX;k+hvGSn9OpnW`I z5A_$8{K_;Hd!h0j&rRIS=ht#{FnF z3YLl23}~0Iu>n(#bD)&WtVopmDc4d?<~5Z^8h%8Tvp!Cjr7YUI z=BvFsL`FTrR_;+LsWyQv1bCR&!H&?thc)N6Ol45Rcq6&e0h6<4F|V#a!(z==OeQSY zKnQK`875)n7f#!KF14=6L(1B(*HEx;NS6w)Us}zAtt#a&dIc`fRM)-s- ztk+<7eO~ZW${HJIdx!3*EGkv~aHr%ns4uUyA2 zJvVF;*{(f(-5^&11es7!P?m*pK=wc&Z#5BWe!8t7{F9lk({8Qj1_k%M_1EHa>0D`~ zSXOISud4S5>3U{bs)}&+oEOJZj|U}|<+;IA`PWCA!4X$#Pd-WBTC-~On4}ZiA#6Ct z+Jlv!WrOwok{_^DOI0e=bu7gY<{wtVz-qbf4FkW*Q^^xfEB7klb3(8OV8Pn`R7?$! z)!XQG`atpoBsQd&*qDK2Jt=>{nS+S+fd|z=+crz;h5;2#`^*3Nd=S7?P(J!mvkTY* zgw$@w=~%tY&L)&!n_g|kFP+8H?$sTY&C*4iBTF2gxGI!d4IGO`A%rltCT%BSd6+UujH+tkW$LIzAAoFI{T z?;gzaLL^=1N?RikqQ&?~G8;kbJeU z9#TLz$YIG%TE%vmmg|6sYEGV(r!rPUCa9h5>!V-yEak0+u3{I9ie?q}kr96o&d5wv z+wCz5WT$bh_m*8D@k37lRq|?8X1$%SD692Jr%d~s3Zv{Yr`dk^lA&c4bH{uJmY zgxgHrpipgZV2FcHrE4VF*k)~SOu}sh{t2o5$tUMmbFHI2(W-gsikAMamsbu8`%>)X zZ+|kdbzOFl@%dRcLg`iT^~O}ZvF%qEFsCC&#A6@M87`d8R(Km5W7yCLQ<$07rwHua zK-vocjYcA1lbl~hyV*zE^*gO>$}9t)?y(~fG~hy#d4IYcZ{4vRAdvqZ*!5ea_%1x8 zR(q`<%Y?B7kj4Aj)zNr4r|{jZEKgd^4xIXakRejYWoS$~bw}b^byPCji)PzALJo|3H>2l)Fr;SD4p^NgrKk1+Q@14gL0yA__ zqyFJ^E3cJJr#GZ!Q5-wkyPh4~S`3y$r5b9rTE|OvAWy}hGf!^09prc3fcWl|duON? zI$~4Lqzcm9UzY!gy2Td)XbqMPAHHcg`9r}h?q(WkYilD3biuvV?nK?PtN8xs!inV? zHvBxW)57|%RsNs16Nc(Y)Sk2~Q~o2irAg*@cD{i%($Le>b3ARcH_HoV%_GmmQbers z?A;oUv(VN~KoDw?fT9@FBjcl&NzILQVWr6|)$fcV@ChnKx?foerjHL!wy64=Ub9m5 zCJ##g@lb18gAL?z2A)ulBl4{_CY z)QTA{QFPBOR3zk2Dev;$+~YBD z)#A8~WPk_u*|JLpf}h9x3Chh^d}mLWBI(KjqZgc`keIp%Z+8d{1CQ!aRrMG6g-jyY zI68_3m|?E|19ZO7b3na1nAH_Q+f-R%Fpw&OjVgBq3j>Q?brAbcOw5x!)#~~AyzZ8M zW^u1L!j{EJzf`!+@N--|SUV|DZ9#xl4d8j*1LShRMUyXB)E%hC1og@zL`1~v(<`c( z4?AmXUdk2b3-fM|D#Iq))>tW|v(vw>BEMEBOs-usoG8+a)sGD~o&{VA-y@c5$D3e| z8hBq+>P+_&X2f}fdr8y>O?Oy;;a57E0U%$z6rL*(kPct}(Pj=+D%|$9Nd!{Kp_Dt{ zRMu{Q#voC2N0Bu++!si|KUA8#ob3n<=SX2cs=H7u`^f2dF1~kn&=#-0^OHe$E|+>V zSLKo3g7d&2kTpPOxwI>l7`iFc-Q|W)(BC9_PJ{3I-*B%^cl8hJjXvv)WD$;;OK-J2ba&2G&8kpJ!-B- z`p=Hj@oK${Se2ynBzR1i5VK=rV&?Z;rYvKEp3bI-`ucapu^O=kzGC-1SZdvzzd53f zQ){w(0h0LdfDfs8pp^RKhQA#aTw6E5cc{{p{Ub8IRc_GqT1 z$4p>hVR6`OU$ja08-zkkwZoUOC|tvL=WL|W3CMSicgrmg5=Ci9xvhYPtiW#Qi-2Eg zv9-xerOX}~Enw@r1$DkrP$t2pRH=MsJm>t%GTM3(>i4pR+yM1Av4k9a9MCYY)t?B! zAM1e1;u}2LFS8`i^YbLta`Ow{+3DhqDrOsSVA?Ia)1)*z$0W0HMrY$p^+Z)Ae7V0v z?up^6CjGd$@gkid4!%}}u`D$_H@AnngXKt`2$=rBY^}bNVljS@M_2TeikXgJ4$+M#gHGoG{CSecnKgARE!;=a$vGCNv%1X_?8V6*-FDD}s3ar2sJRI9z=(P^3;?rdX2-%I>mKmEQRpxvCjS{WpNihk^Ja}qH-n``tQ;86^dP70rXKcK(k zO~9Kg@#{wZvkmd#hShI**sJFnZ30<`zz2uUZjcxV2r=31Pe1DFM%M1y%msd&u|JXi zS~O_S4nV=ogllqT6%{&zQL6JxUJ>upMyBpZf4}cP)yEeoANW-FCexv_0*+XJ+3?d< zY$lT>&po3dl0q%}M+)?H4>hX{+apg}D&_iOE+~_`PNPj$oA~ig8kHH)z!^zq7;okc zaNn)!pGS){NpX17b4yhADG-Ds`R)W3)eWW7(BnP1i=qnv}^Rm8f80FBi(HH2JaqJoPd9 zJU3ed%t>B#M&$h}vXjeH#)Ryt6@aJ-Yzl@FtgTDOGrwxXRVGo!#l^LUy(Rnbf#+m= zBQ4Y6a)~VHJDq0hy0s4Op9`Gt;TA?&vnG$YuHtgn{1dXOcecruDzM)?n~0=nPyzk; z^1D?=#I+VnEN*Z|0~*s_n@e|bL>apM>2<#)Q_oL^rd8_bfy@(!&6vSiT!~EC98W-> z#Lhz71I4_lg+&vPa?t55LWe!Ch7QbNDUeIoD^4zn{<9C;Cxr5On%dM9PnhTRh+@T> zzvctxfh?L1+f%rfCSB*jG@+zN`V|%V=mK1$iM&E!blrO_JjkGwS_B%e?-`4WSwf9ijP~~$L)NcOy*+1taZv8Sh} zj~VT3tgRVwb*QEhpVa>>G5F39y;AH)RQjlX0XCT|D8Vv&bP&fYzPfCOxuD|GCI-BNXCOJGj&PM}ZXu4OHLX|u$@ z{tDN{Mfv#DGbc7yb#E?@6N|yvkd^VU(Y>C_kHWx!($6aQ@3jKrHW>ljz>Fn}RVhjQ zmL~%9*Bd(Vnm3nL!03Vi;F|Do-X?RkIqoa*WMX^)KN%$IoF5In?Tfx5n=CQOQ;IPd z$@IB6S|tL$YxY%^h~UHv6gGBtk*l`iU=}G-$HR>@I-@V_{{#pZ1u`fdeK`y{C}2XW zT#IQSc!9&&c0+iM(wi^c7}=^NPlv!+A3zs1AZb-r3+h?fTxA%_EN?VT%q=#XU1iIi z$>%k7=TIZ;Swyip)TiJpvh2>(_<@`Ota`Xh43!dq3^7%c^KM%T@OhN?(9;!@@i-j4 zu}0WM{0BeO0t=HN*88QkWY7a(VsWH!^ocxp8>a9}kLSZjwXNTi_{G6_CnF zfC;JKautLg{l)DxGRcN`dU_hkVT85X7w-jJB$wQ2R1Ws))}%*wzCV%CO!In<7YHU6 zA8w^n zt)9;%s?57?sqUqK3^|Y&HgC2smQe+)p=K$zO8r0QriOeA1IQ_uR}X$_NnWV{Zzx}` z{;>ASnpm;a@EfiD*{Dig3XJ_>@~3pk5{g%xcG-$~Rln+s$O|FZa+Qukwf6Q2$OP2F zlVy7k;N~?c21jDEfI?hTYg^T3D4j7xhXS288@6IUzaU25vk=4=k7FS-M4lh^YR zpB61IP;hNjWP)>He4HrYq9hs{8{cT{s~_JU3dQ}B&9M#ZeRu^ zo+gUxkHgZ)?0>(-0bcSAmK2xy7wM=1yHH?y`8A*<0Kq)P@6?ikME2tFN!aE_YM=QaK|zigjsc3b$iVL#dTyrEpjr<;ygLgiZl~X&GB> zC^u10;-+9=(5on1YybQ+nzeGP;QsVw1&&zZjT7fGnsd!KY{^@z#`iRF>(Qwme+ zyK&sxRI#8!7T{6WV|PWndV4{ZDty7xX)Sv%A^-J~>kw6-Q2p{SNveJ49PRp*T5I4G z#gNf{N(7BLP_$3W&CqJwV|8RY@LHAmX9%cQ8BNKyJ1Fy3nhF*sqUb+;MIPc0cz3n? z2M0c<{ZpCm*HeVhMW%pHxX0!Q`+@8L;rVru*uu)rH=GHJ=B>%p9}t-KpE4WrQdP-~ zI10<)pk&~jY2USlr!%ry*t&vx6Sx?L{L^ymyTpB2nFT6qwqq+ew>k|n&g=qvSB+}YUGFKg5wTs z#4xKi3Vr~scnb(#)3aT6K+M1bJ_Uhycwz=enc%Bq0hm#P zv22DB;HIbH_p_6)6YM*X3J`3+29q>v!CJh7P&Y$CoQwP4n}Df0L+Vc9{yKKYK$+ zJh;Cb!le~fHpZAl)DzWnW|?l&h?MgO?&8Uxe(;H*OC<{+`Go`Hjv0xikh)9y#1Xl` z2z5q_RpI>_J1H@pqnoq2&p;R?Axb?oAsoxf3)_w?Yy&oOqv7*SR;x`y&;X|1Xva;6 zkI>H~@gtV(eUNfm{svBod|Ci-VayWai5j-UiV9KCS<{#vHk%pF6k>97a~JHj=iHC%Hz>ggwP5TqpHntRmnAZ- z0b=JpHh*y!3o5pw&cgXkj_ta(yDQ<8Dbo@`sP*MDgoX>V{dsO_;P2mHLot(wi;Fw( zi~A9q%-vZ>8=mI5H`420t@L?-CggHcf!i@m2lOpTP z3xnP^c$4wANH4qC@&=N>YsaQ;%MS4O-FoY9CUoMnWX+VECLsr?0!B#_PFU>J>$s+=<;&ONXD)tgg#O<#Bdf_oT>K`sqzc9SN3j{DN_%@&4uza#k49R2V2{E zwGt|_Vgc(NK#NP@>-ot#A9mD^u~s%~k8Q7*iTSoa$HB&Lh|})yV+rzE8+DzM?cL28 zb!mz21hR4Fdt1O`v_z)UOe!g1=nSX!1IHT^X}0>?9`!h`4-}=TMzE6clZ{WXo2Y;( z*EpCvx9x=de?8pdV?eplr@sR`Yhu#?vHm48n+3d}H^Yin|*gY@MTp!sYN^e&f)9#GHe0cUKSPkZ1 zCCy)97iWz0>%_bcbZT-Z`%R!ySqZVo4sgViFz)LB`6e6-?d!)f4onAtn z+!*=f)ac17le|}1RBaIRXAvQ*m%xUt&E+I^lf$N~xI9{jI$FVkvVYhf3mL)wfwW8e-(o$}BaVn1l+g(g zA|!?jaKYgp2};g@&=`x~0*qF><2ey2Wpg2Wp@eh~0r18^@qfke6fo8Xmm;+7DL&Dc z0{blxP~b4ar5T&K5jW#21l(gQlBrYhF9$vK+z=pZrpxxFDK>BGm%bPl6hN$MnYKF` zIp18vtYI=7|E1K>v$ZYlX?9fTa_6jE>4*v3?HTh{>Hq06{?pSXzk#G$8ojr_WKL^; zt|-qtYjsJz;E;1%a3QBfSi~SU_}N`XHIbK6eb9OouA+j}))hBXW%V`h`r?SkIr*JK zSq2uNibQp-G4qh~uaS!=%nakP}Sn?bLRF9Qz@9UcKQjCYuh``qY5=9ch- zU8JSv0wlKn8SO8kZHBWS6@)$C8fz<6AT#UE_RM!2&qAk=bDni48+9-L2f5-R<$&@PH&2|X6SJN<{NJ&*?gImbZG z0AI~T6){zG2E9p_gYZgL-sQSoW`KIR%9J%YHN19K1*o(#vg}`u@B*M)VA=FO?uYnAJ+le<3ibq+ zItzfc{oTm^TuJTad1%fv8DK`L1?jI`GEDrI8M$@yk9w;}{lnN81Kgz4u`|#qq27Nb z8$dO}W}@yUjifC>hI}6dRv2yx$+r?0+0QN3QVARSXC;RjB;>R6TTtzwK7b+gvj8BhQ2z%*17EL({x77R?b+sv`yy%AK^@qiK#huZOLhvt_pYCOam8XF{i zch~VMS(}@rXC;xuN3ab`Ydjoz4>`=C2Tu|YMlDCmtN&R@2Aq9tBzzxT^u#%bro_S~ zG*wE!^w6Br7ZAcER@yf>?mqTenHWhk$b**t~7$y#mJyNG*E?ORA5+1deVKr4?Z`#|m zYQX0+0(R>@rhOKdL|i(QcAs=gOqa|{XkXkBpc|CV%Mx_`R_`1`3Mq_-HHDj@tcV`% z(!?iv@Y_9u=R}5=I9i{jQc$p{>S(B$&;jT$qQDYuRhsc!<4~X$7)>Z2Ie?8MAcL!q z?}}x@03(Z##xcxG6#AH`gFxbYQ&6D~6jnpdUKD7w$8HFzJ)Bhm{Vu$h3^<$Ej<*`iBDAozHGxM+-Ykz?! zh!%y$n3ve=T)2;KQWj5Fjgb{@)=GM3@fmPyi(9gh1S9aU{n`x$&cnYL^ZXao=(OOw z0@XfnkHu#vT3Qy)ckfUGdzg?sO5g1HRD)h#niW8xY1dJmyR7#i&9!$cWN|*tv+0Yv zUU@N}fPcm}MWMSu%j?Up9+=Fp_P(2)&uQ`y$tmq9=`o2xQG0<&5TL=n;c3+r!u17Z z9VsXLP#hhdNE42gJa>LLaqJ3k34M}`r)9fphWD9(|4cCI0_xaRsFD1x>b;(if{B%e z4G_ao?920#CS1C4Qu-v?wl@0djiG0Em4nu=uxVfDA7d^~^5B}c$+}Ky0xw`X5?6ei{tLuB82G4f$~e8YGe@LUR{SZ~?UhtNTV8J~m?vf934uO!Ym z?(D5Jk+*?v#O976egs{=)_Px1QVu=)x z4#(}LD^y%OLEa`6^LndCeian3ge1G^QB_l84t7ISyOChgsEsW3jn(fEL@9+!dlIjZ ziVD8WxzFR3r^Uu7;&6((Q6GC_WwOS$#=sn9#z+#t_hkq~FpWsuskM8(qsDuNkXPVp zn8X5R8iKc$i;K>DD%v~bhM2mQvU1sqs_jZN_eROu=S}R4!f|G(&*e@cjhj2pnS}Y@ z2o{b70K_9YADLRKH(AJcMMArHPZLaT^Z*#@Zo{dp$M&hU~?=VQ=0+vOAtRAU>j44P1@a7?IF`s{+LUC7np0(kJUlTLLW= zvG(i1Sr5Cqu%?Dz$C|>!7Qk>z(O^EY3=N7eQ&ifPp4bTXkUZA4Hy4uB13WnQ%c_&O zKS5?1O$crJbQi~q9YoUPJfFK)Ow27T6i${Ft#(M$rX+xm5d6(KIFyWR#ed7(=iFON z`r&LF&{2CYmASrZQU8p!)R8F4J;Ohb7c6c9!w`?lrm^Z6TY1+JK1{2=?*O-Q$cW@= zUKJ_;0etgs}O(!KE;YAi<*didExDnGSx3~@Z#y_E# z0eYpQ5S44q4z?s*?)%w8N>{sEbCaL%`BhH2CmH&msLU# zd}7lfklLiWSs>wjI#wfKc^@>mdG$=VGLfO%BbS8FCIspfD`fWc?bu43?-Ql0L`>Rb z#fNrsI!IYbK2phLKzbw&^;|K!jB1uf2Sn(eaIQ=-LmQc1ezs<0T{$Z=T7Y>3mk6uv z;u#*}b9nY!5sQcn0G9_ue>6}=BYNULQg#EZc&SUMV-g~^L9PBEo9D$r<-ozsF(8w77VfNJQEa5Xgx zR0E+3XeANw@bEI+R&}eA@lcQdRVPjgBVJrpX)~@UT)!n}jW=oB!JE03m@vWVwQJ(;(YKcr|r+>KP31Bn+SQrFMW z0`1+e=zNDUgKutlSl4Hb*6VL1U-8bclf~-hYrV4DIgndl~r$F*i4tFa6Z- zGd+R3Bx($dH+laCv!z>`tV+pf-v__hW{Q;RqK2P0@0)ABZFP_O2y56m&e4|bH(%&9 zgDgtRhs;anTo#4SxX73v%Og5&{JylOSSuG)9(>*AmFPfzGMh=gD~y#%^W@;z>3dO!LKIw( zL!3-1F8bJJ9hH-|cAKT@x$^`3)#fBoIJ_E>EZ1x^gXEtqcn8O?E-YUpm0>Xx`y6(oj1;RYKx+{g^|To!scL$-?`HsG(GaRkjog|4+VOvZu1;b zEkF6m7EYN5HXQi!%8*Zf1_~-9q^3;_k-J=(G|z*V>Q{!(5W6_&u$*fh^N~0y(%~F& z!1oTzZ09YSW0c{#E-N$yp!|gbs%eg-==3QWl8R1UubrZhY@j$fho8(X)5)2Wjb30s z%w~4fi*pRUgYcajGv4*45;9iA!Gl#?2+=~RWAOSbH$kIB4k`gKs)5Dy1QhOho%@Nw z=l#=VWEB}JCkoqFF8C%)@LRn2#9v$pAB0|#(n5Fl>ds&PJ7#Hq>e7rzALyn8f`h^* zL?gKKs`2n28H6()oEt3+s-nwcF82lS2tz+r%{m>O@028wI7(1bd~+ z-I|w(r2YQ^VpC2hJ0@dS^#!>ni83kCrL0?kd_DA`yqP%SMx4`E3|@N_Ds$A&sC^4C z#FXap=1@gNLQz`!U;$pITJUGJzH{Wd>!QS{1e$-)YG-GsSf~WuvNES%wN&8Vn)z%R zq~O01=>AwlpjsqE=!l^dp!e!Y2VVy9a{q0rgN*nCu zIZ?pex-tt;fi5-u8Zpb5t7(w z@LA9dlCDQbM?W;=a&r*gS{_$_c--x_F@)!l}>Bo-e^u~(qYP9=n_#T(*&9ktx7f+Hm zmV#!QANBe~zCDh8w+@sKF-6Ati%u?Ohd#Z({GuFW!YdQH550py(39n&)$UdsD$|$s z93@eZ?SBD8t7o+lk_R)Z>ghYsY!Tlq*BxI!zi4mkBKb}FAlAb2xH{PA z&jVxFQ@|EI0^u^aIG$JU$0NHr+A~gu>NKC7=JGvY%sfwK&(XHc(ZKnYJR*w;-O6YL z%VJ@Bem}qp0CVy-&!DE`8$6CKbHO#{&SJ>W2nak`dF++vzaN2GS{5EX_~eiGv7en=5K9~;j2-mC@u^lA_dZ~_ z^Y}6IxGMLXlz8hahy*&u=v|C zIDRQ%%%@|S4_x-`^RRkwdS+&=-}U6~TYuwH7#H~R77HO(e=lUjdZ~|^!UpYU%4^ z2D6Q2BXd7~pbA>O&DU;K{QK#P*PUw5{)BTM=a6(tl>bZ%xA;=&HF)gOyDx;* zz>jbBuMY+c1Kp5q6|_|ApKo>A00O)G=;RK?KacUxVp>kUW>+tpzoy%cZ!5m)17Ofr ZAIbA?kF;^gc2R&o9hiXz`i9+;{{ZWAsF?r& literal 0 HcmV?d00001 diff --git a/pkg/azureopenai/azureopenai.go b/pkg/azureopenai/azureopenai.go new file mode 100644 index 0000000..f61d017 --- /dev/null +++ b/pkg/azureopenai/azureopenai.go @@ -0,0 +1,58 @@ +/* +https://learn.microsoft.com/zh-cn/azure/cognitive-services/openai/chatgpt-quickstart + +curl $AZURE_OPENAI_ENDPOINT/openai/deployments/gpt-35-turbo/chat/completions?api-version=2023-03-15-preview \ + -H "Content-Type: application/json" \ + -H "api-key: $AZURE_OPENAI_KEY" \ + -d '{ + "model": "gpt-3.5-turbo", + "messages": [{"role": "user", "content": "你好"}] + }' + +*/ + +package azureopenai + +import ( + "encoding/json" + "net/http" +) + +var ( + ENDPOINT string + API_KEY string + DEPLOYMENT_NAME string +) + +type ModelsList struct { + Data []struct { + ScaleSettings struct { + ScaleType string `json:"scale_type"` + } `json:"scale_settings"` + Model string `json:"model"` + Owner string `json:"owner"` + ID string `json:"id"` + Status string `json:"status"` + CreatedAt int `json:"created_at"` + UpdatedAt int `json:"updated_at"` + Object string `json:"object"` + } `json:"data"` + Object string `json:"object"` +} + +func Models(endpoint, apikey string) (*ModelsList, error) { + var modelsl ModelsList + req, _ := http.NewRequest(http.MethodGet, endpoint+"/openai/deployments?api-version=2022-12-01", nil) + req.Header.Set("api-key", apikey) + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + err = json.NewDecoder(resp.Body).Decode(&modelsl) + if err != nil { + return nil, err + } + return &modelsl, nil + +} diff --git a/router/router.go b/router/router.go index 2fc507b..43643a5 100644 --- a/router/router.go +++ b/router/router.go @@ -413,7 +413,7 @@ func HandleProy(c *gin.Context) { if resp.StatusCode == 200 && localuser { if isStream { - contentCh := fetchResponseContent(writer, reader) + contentCh := fetchResponseContent(c, reader) var buffer bytes.Buffer for content := range contentCh { buffer.WriteString(content) @@ -536,15 +536,18 @@ func HandleUsage(c *gin.Context) { c.JSON(200, usage) } -func fetchResponseContent(w *bufio.Writer, responseBody *bufio.Reader) <-chan string { +func fetchResponseContent(ctx *gin.Context, responseBody *bufio.Reader) <-chan string { contentCh := make(chan string) go func() { defer close(contentCh) for { line, err := responseBody.ReadString('\n') if err == nil { - w.WriteString(line) - w.Flush() + lines := strings.Split(line, "") + for _, word := range lines { + ctx.Writer.WriteString(word) + ctx.Writer.Flush() + } if line == "\n" { continue } diff --git a/store/keydb.go b/store/keydb.go index 3d623fe..05f6d9c 100644 --- a/store/keydb.go +++ b/store/keydb.go @@ -3,12 +3,15 @@ package store import "time" type Key struct { - ID uint `gorm:"primarykey" json:"id,omitempty"` - Key string `gorm:"unique;not null" json:"key,omitempty"` - Name string `gorm:"unique;not null" json:"name,omitempty"` - UserId string `json:"-,omitempty"` - CreatedAt time.Time `json:"createdAt,omitempty"` - UpdatedAt time.Time `json:"updatedAt,omitempty"` + ID uint `gorm:"primarykey" json:"id,omitempty"` + Key string `gorm:"unique;not null" json:"key,omitempty"` + Name string `gorm:"unique;not null" json:"name,omitempty"` + UserId string `json:"-,omitempty"` + KeyType string + EndPoint string + DeploymentName string + CreatedAt time.Time `json:"createdAt,omitempty"` + UpdatedAt time.Time `json:"updatedAt,omitempty"` } func GetKeyrByName(name string) (*Key, error) {