From dd17cdce884b322f840c70b35f4c62523d95e29c Mon Sep 17 00:00:00 2001 From: CahidArda Date: Fri, 10 Jan 2025 10:18:51 +0300 Subject: [PATCH 01/16] feat: add internal agents api --- bun.lockb | Bin 427780 -> 434456 bytes examples/nextjs/app/path/route.ts | 82 +++++++++++++++++++++---- examples/nextjs/package.json | 6 +- package.json | 9 ++- src/agents/adapters.ts | 72 ++++++++++++++++++++++ src/agents/agent.ts | 98 ++++++++++++++++++++++++++++++ src/agents/index.ts | 2 + tsup.config.ts | 1 + 8 files changed, 254 insertions(+), 16 deletions(-) create mode 100644 src/agents/adapters.ts create mode 100644 src/agents/agent.ts create mode 100644 src/agents/index.ts diff --git a/bun.lockb b/bun.lockb index 69095210b7e30193c525fbe2bee3781fbcb461ef..286e7082b2c7879eddaafeff0f9dba5c192466e4 100755 GIT binary patch delta 87930 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 delta 83362 zcmeFaeVkR(!}ovAnNH2_L8gpq=wYN3l2MtdsZ-JOqd}=5oN8*Or)i!th3}NUsSvVd z)er_zo|9AvgD8X$HAx0h5ke~T^?QHz+GmXK<#J!wecku{&#&`x=CeNUwf5TUd9S_C z#^RTg{&{oKt!K5pzwf|TT83KWy}Ra%T~~}>^U9T%E^jh;U%Ry}o|zrE=sfGwgsKhaX3L zU2(J(np4nj{G{B`fmQJ~-MR2O;^U{}=2PS|d_OK{%Gh>AQv>@rtKxV0I$ZT zLW(gdXL3$qU>C(#f|EEx6qan@-s6cz0i@bx8@`poYng7PO;`;|uXh*0(_*z^P{5fvWt` z30|=S%_&3@z7DF>6y@i%o4_fi7EPHxCU7GFsuMnhsvXp= zQ5y6-@=?08P!;&TCV>Fwo|%Ym5-17GJQT7ei?#4s_!dfll6GdVlLLWM(FG?30?pAg z@tkAkSiCa+_aXNh@hZS`Qx+B`D4r# zaG+Y?ElNXc&m80XQ=1iHMRh%`ZplD2fl<7LSwQaDeIr)t5g23b%N)-s4d72#|h1pqCa>h+B z37p`A=BRq0D+g+FdlQQTzHAc+&{;D-L{*=~ZEXf`;x*K|obJ~@XG+f0XhFfta250@ zTCyOVSC zi1;Ud$p;UkI)U*MUWaPBPx0eN`0>4be@?_bCBAjZ*;Gu+;MaX^kFn?$7UpE-Psu7S zq~iklSaW z&V}oU*ut7sOe0aEiNkG|>=q~B+Rys-u3_$ZwIf~b!m3zDQDs*&Woph;E|>>=|D~V& z315F1WgB+z*;H)ccwojqzpZieNYBs7` zwTRl-yKd({-?175WpjH-Xe=T7x%nc}CL!SNLPqM6MBnjsBQmH#&~)Cf5d zRe=_gP|dlF^2@(K-BjPzzD~|6%+4KK5QvT$lQp%lAn?#Q_u)FtN*ZL_r6h>z@Gnr6 z@5k}B-2ce2r#ph42+t}Q6P*+toAnJ|<=%#>zF(4Fz5-S8o}Flm@wV?{+l^Q7s^^3P za$-OS*81QvU+ZHDe)&Pm@yRgEW5t-P+U z)6pb+6x9MT097}4L{+V3zB*_k{-n_Q5AH2)|7(jQ^o`) z6y#3nL`BYqH!C6Hm+Nd3eug&2x2Gme(9!Hx+MU}maH8-3b(M{8u)wCDgjd0Sxyka6 z;VR%fR0aG3t}ZzK7VEd*b!~dV*MwVXe;sfo0rl;)aXFKieF1MDN)fqY=5Vnn_>Bxy zqhA-=n(X&=JF2<#4yuti(6uM*fT|(~I8I&H)aPTfrcKJ78VHQd$}5Ua3Ira#iTR`^ zDq_Qx!%akCes0ltCiJ33w!~bdyhU_$G>7DYz#zENZ@I&E%?7kCo{O4yJ-f&FU4@FL zF17_IMb)A+Q4Q9dCAOvRyovTt0GwEAYZyXRqZ@Cs8J&2ijh}H`q^65M4{bq*L>A3MO-ZG8L~b9E;XPm)_?W=zhENx*FAVt%tTizkk41U;sV^U(%C+ zL*SkVZPN@vHE8Deek`hKm5Qo>%}_Pv_!TzeKB(eP_kBZD>3&;obr;$c-+<#(z=Mz2 z^R?r=RIp@bCM8!>eg3Fz@~)5B0z8dsv_6Qc#%~d?j5D7I1X`n=QJwf?R3|v}xV`iJ z2vtp=K--`%aGZ{R{wbSoIqG%sDsgt%Hv!Z{MW{|N9Mw8-r(pa>sIXAaIZGCp>Q}axto|jQG01k6*Li9{)I6;*fxc z1y>bJ;!f!WdxEhASqwSm>7;3rz%?AGS#lYw1!pi?A5B43;8=kg;Z?9YXkGMo4wqh) zoiir8-PFl&(&HHv_#%?eh;MF0qy^n)e2am~)PMW9@ zmK7_a=WZ47f%Ze@e_PVMkkZt z(n`CiU5M%gkNPLjo+6*c;fl{}0Sa>Rr;$&fFt;$u?xnEF=a%33i94ZD>yq}n?L=i` zm@}5gS0~~%Q46y2bEk2|3=+8*#Jz7Ypb%b8M~Lp{#>#;&y~ zs8*O3z7E-MPndvL1!DJDad;KDC{NQd5a8Naq~0HsQ&`B|-p!3`mpu5bJ=Nq%lcp=l zf$wY?HN!{e76&G@-{yja6B8UYQb2A#$@MC%o!WaFZ!MQOUPin0%)B;(Cby* z8nK>FjZT?9IZ9Sv`56~Yxhh&PS-m)QQqlOFDKGO_U87^-l$^q=a`PwByNuScfr2qb z-oA82oXwBz;^e8h`Gxs4f?k1R4=r-=-UY2_%9ui3QDYf*Bjd(oJe`NE1@O$8Hlu;4 zx?s$toFWa1=_$G!3j|`%y>h2gT|Ti3q^_81kxjLN-uzA>UyX%iRP()lC}=mdvz?%~ zV{TvDo}d+~3G?p{(yAVy)vy^iBAr^UCaU?+v#vevDEaBc-=Zq;XQ)m*pq@>iifYBH z)3A*lWUiFtg@sd#nP%C!xf7$KCuP;7Aym$>MN=m+f%3I}jV6A7L)%jYlcELLH0T$2 z(lwm9iNHx5Fs^`Gt2Sfu$F%Ek4rljgrToY>lNeorZ)RnwmX{H*4T_H-4Em= zjXeP>hb!Nlf@pqzlqbY{{POWYDJwd;I8ZOywssIz!qFYIf&>DGTG$hf$`8iX@2R8c0wIGk?@DsWP1E-_Uq8hzpa|_$CQ=ZD| zm^*qxAW$=6kB=i>W9z3#u(|ha31g>icRN-m^MlA_E+!ZEa0eteE9u_Dc4_PZ)nEM< zS^cNT&-`p2I^T{t7gd8yLv;b2=<`o|+45X~*BWzuZ+rS_zETPbMjM?>0*#^AZ-L`z zfp+`=mysxd;x&7=3TcR3+38=>CMg493`KVUO4!*YZwV|(1`uUtOPz4*n z&lm*MqQ9V8-yT3UnHLSRH7Lxs4@T<2b?Gl91I@CRD40&%AT@no>prtjaMN5?Fq%d^ZBf^2c3A?wpHEM4Y<8K%gt(k4C?}`;U*7E4LucflLkdX(?f11@^Z*6MQ*R*Rt$=Sk8*MA=Z@-|9_k%-GY3bU zqOi>_;70qThE|5%iouc4{;-=gBoaEUrkgn=;*6>p2=pQMpqJ$Snr;Pg-_&%IhDJgI zYq^<2BhK7f0Un1cN%C`P!CGzwtWG>XX?U#i^|W}*xn2p&2Be18$GfE$M8Zda5qH#( z^iZnfCS^pNi46G&scO1qLsOjhTqLASDZs*}u?P5Fi0C}$pp>x8Rql4}Ih;&DT8ULS?`;<~s^GtxtS zj&qZSN1W*_%sq&vU;|T~mvOd3mCSEaY+%PE8i)mR*qQe1cP+A+O<&XOXZ@DbMp=4YzVgYIp&z zm)mq;y0e9lat$}!{^{XG zgf4JL4NiA<6YA(?86BMJG+`mp2`CgU&X%fjMp`^Zy~gMus#Rm_Y>Q;!)CSa=Hh2=J9`y!gXkTMD>B>kbxrv*3 zWh6Y3JB0pj(^2W6HBH{r8yDj zIYX7mjTH>oh22|UICKDRzvDd0X%~>fe zD<*V_7yAyOVP5D|YI~7Fp{u&OnKL5J69C)#TK>PoX)W~nKHR4pP3(@kINg~^NbSV3 z!Ug1coWCGkkQ(~6n_F>pB;0^pdbvBVP7er=^hH%{8&+k@rV<+D#Xe8S z9ucC&Z7zKX*>pD(vgs;3HtL$LHO{A;-l0T|l*AaH?_IsF+G8USH$06dA)RA+I#EG;<1&72zvpEHy?d2{Q!p>9RrNaz`4 zZX|SYsGBq|;&ic zug0mlz0)|Wa4b1AZ{=^em!%adiIR^ze=1-i~lRAq@k2mH6>u zT~?fS>`8Qj`fl=Yc9Fx}q?;qoKZe_x#RA27-omK?S@T%RYF|>d{xf_o#xVwTR@R-n zaJ@XIOW~)NxTUv5oK_?3`0=J=X#5B_>DEYS`3N`j)<}3eaXnN_r^!fr60Y~0u{<8*$qeyAHs2g8Jg~- zTxwf{n*+)_{!%y7jf9q5>Xy0@=S||ytjggKPWc5**)Xm;msPE=^C>LO7M3aD+=A;; zb=)SLUtq2t&ZtCZ^Nq4R#WXo5%KP@=QO}c{}#N}@09T8{bohE%5u z&X$WY9exdWf!8AKqE-FLO+``E&0G=*JsWjPmqfzjM{5aM`f1mA0v)|llxZJ@I}c}v zVaqYGs_1eV#d*y}1Eth1NubeyI_&_vIoJ7Z4QV`n8!xiI+0r-t^A zb2IObILYH<713PFz%lt|rm7~Pj@fR~JrSog+mZL zn{;o)sXrmMThaw;5>9>UZSX@6OmHjijfB3M;3kztoV1CyZSB5&22Ral7m8PLwjtCk zfl09@)6nXHV{^&SDkY@7DwCdW{|u)^B4ElouzQ^BCfy%#Mo+d~#;q9{t-z_-7(;;mhdD%X4G%A(_p38BSxH<{X?F+Lh~O zE{ixVr`i?>nX-#$D;y(GZN=2>kZ12La16l*^4!b^BhG%Hnv;QFK$85bhG5wF=SO;aP-6xJ@5P4{s;L{T88i|Ip=Ap%Oxj3PSHxg_@UWb294juE7$w z^zrUBu!FoLwPwab7gdGsA;g`^Bk9ghgw#%~sH`97%))usn5l$RU%Tgi9M{8^oGJJl zt{0AxmBYs4y4bj2l!X6*8|yZ`Cp|P|wp+0>5OXr&{54KX6VGWVSM%!`Snkf1RGmwuSK|+5VwHj{Wc+b=ALw?#f=n?Vuwt$GxGtbDtQZK_(@!b_Xr_)Qy{>` zg~1tRnw`0T#}uB^+IKsyUzOX78-b%4UP+6;*)AeAy>)jst}{{g2Kjm1#a=>Xa`G)U zjz=X-#9_E0#M#k*zns^{&2Eh?N@c7U*WxtyNktC3aH=#XW_OUV(Dnv5c3jkZbOc=R~(NCIA7HD7ZUH@a5YZVwq>bz zdw_pC#9vmzy>J(M0+N&tiox$*egN3C3Ym(Us5k7N=ok z&l!KW?LKdHcY5J2C(f4j3*3dCE4v~s{+^hL4owZu!;Ns4UckyjNQJhC^t#th2{s?k zrNv`ZI$NJzxIb#wzAV;Tb z>beK@_>o7r;lzi$HT<)#@dPy0ZJjsZCRDlh%kA#S#?8THR%JYUMYX~>pX0pa>>PWz zdfa2U;Z=FYJyP9`#Etgi*qz2>Y+1{0Ne%t$5jXQ~uDOrernUp{I-F*xbwA=Xte8qP z-Gz_E=BxHmuj8s#7$@;@+bQ0)(iw?UiM-AX&wPT{S-ipZ6CqoB@(W-7BxUoS)xJb1 z-wU0yQjMWxagMjidJm_$V&hI-Yn#<`p}A|_qz@y`KA;vHuMpwx>tfffIfTyfxQ6c< zoGQ$rRO(lpy4Pmg>DgGnYNI;GcXl7X6=!qje$(mlTx`)H&+s+4!EV#u>7h-}xk+LGRv)SdT&P1H%o9+Bpap&1$&_*?1u!XYox(80H zu}wJ_r}neO--WG*B=j&&mm%AvKj3;*xn8f?)7tC%44mTZ z+VdvvJRG+g7o>*ky-un1JCf6%km^l-6!kt_8jguV7ghL<7RpI=8f>(=GuTa^Rb6?BPOnq=FgM9)#52r@57vL9gwgohrfAiz)V~KO# za4U94!Z~j+n%tecd4frZ$4Z3a-i(EY+R)yvHLB28gm@T7vXr-IH7_*1DpXz-ayG|e zGpa&Myin79U29aKwr|IhHPxP{O-nO~33Ov@uIO zPa0<@AvK7%bq+V&!c6jRF(wk~1h3~^(H_NV;Bf6{f%rzLaCQwm{k^K$$8f*gcWmhg zr8>9a)J^;@L)@#rqnkFT#lLTR$=m3JFTt^?=BK(x2wlJ-_9?)xxb8T%ApEe>Q1B8PvJ)5XR)e_L!au#kr4 zZgVSsh&ZnURTg_8NZ4+Z;FyEMaOwsEDKb_I8Zo?~?leO2L>{uBwF zwZpAI@^-jM2P2_1JKW5J5$Es@yK!Z%<)nt%f9zHeH|AqE>F0>E{$qZ?BA1XUi{s{h zr(61SBs6@dTY=oZ(@i=Q3BAA5%|se~;+7ub!N4c6Jt~ikLQQtLNrxlOoL#Y5q$~I< zxPIhm*R(pHR$p-j;xrs63(o0~JWSx^_u$mHEFLuH4&2!|Ta=ccS1mI%*`=Sm6~9KD#lQh1 zVZFMWhaor}z}TCg8gB3f7YldPEnRC6=%|H0Tu7*^yYrKDr^oI;iRv6awy9O*qxavFUV8vvE_Db-hQ((jS*ZNNe9(xd62 ze|_ba0_N}G+U}0ZNe}NJbe=nEMtZ2}-bI>&^eKJjhL4I}IXG%fN3!p(>`B`*BCwy&^LeLAowmS+IY<_=TjZ=4dE*$-aosV~K zT29C|ng(B;{U$SxV=vtw+ca~35WWM)YBeO?`It~Ia$z~9+uDC?GHa0f$#3nI*!J7k zIC~~tmz#cPlES1J`kie+`tL(F8#wi?_kbZ({++2HP52im51{x>tmF5F_cJ4*qVG*9 z8h-G5ucdO*ojrtfq}_g=dcfvtSFg#qAzmFdVxGgP9QHzz_JfVH&R+CI)*Oh zg7zIwYY&rFPs)Cd?Lc)a9DgXb*_RuQyG$v)+v^u_msh!y56AYgN_h=#bXD9ZxId2T za-{lki*XlMrThk`*=o;l-Y-=*Xykc2ZbVhwH@H8J>+!1{6ZTj5#W>Z-dl>J0h|@yH zA~7g6?(E+J=A`<;ZqD@IZ1aO@;^%xvmon;);?nIQ!&9AZ|FRb(nrm=sI1k4!FzgxD z5Yp_XTPCDBU*WV);nt_c{~lW#^z+VaoJOqeqt|`MHDO*_4PH$i;C0G4LTO$i4hi2a zr|BKq6ELL>7>2__rUG^5hl1YI70S(~b~{cD#;|8iZy#s#AdY=d0ZxN~a=Y9_;xrU- zJh%D=#|8XpUNzul<<8!DlMkncOK?22;x4$HkOql&i4Of*!(=9M_D*4&3mwGsmhm{1 znV$|WOpC{i#IVw?PIVgdN^=KXg09=)iMRn?wyO#C@ea|O4Zq@4C_9$h)e3qI%FjUk zQbVI^nbJm_a*0p5^wP}RaUJdPRIy&XEhGh?IDK(`7tp1*;52L4NV0goxhH{0-!_Lv8IIVGUZsm_@@pWurY5A8tqs9uG z?k8)fD$EJW^27a$=N>8Q*M(|d( zmz}p;x(lZj#@^@e!(HGVuVLKfIGfV3??>U38$H5MdER&24shOIa4H3@`YSI|*#g?d zb0JRSnuNU1QI0!DZ_PPB64H2L=gT}Wyn1c7C0`LzL)+nfT7q?U435WnO=hCaSX^-G zd}bNX`j6l`dUw(78qjg>sGGXR6X;0-d+;+j^)aOa)QJo5EJDhHY0vW_jEcf2XZPSVGZkl2lWI;)pWZW zr<1TCu-SU4g~@EssT(KTNod1HVLv}gl%Feb=*jt9dywz(&8~H zq`e2L@DqBQqR??|O;Rd_xTtMxC1c48ZE0&tp`o)*Hx<(BPd7uD*9q z(X^e(?85mjZCBODRB91Um9lHe4xAnFx*)bXE9gCfJ6VG{d^^s*yzl`bZ_;=TcwBp1 zMut3Z91U-8GP`owdKNm`ENv1@cY5(}CG_VM_P%8SPFD>3L&y%?#fmfh>q4pF_9?+Y zs#)5TS04x|S-?cQFfpITs$#wkobx9;=+AcXpY0b|Rmwm1tPZg@RnFmQvS#Obobpc* zPR)+h(>X)_Z14E9{p8QKb*DcaI|Zvoj#cK*_Lo1~9_Rik@%7kVe;oV9pY3s}e~P{E zPd0pqtZ7Pf)*!@-(!AN)EX`D$&+r?aW|Dd_99~JY6WK1~2Ytu1W}k9e=hy(&J~|Jl zDR1|+_v18|y$5!6_cfdrGH-f1^&@u1+us%Y;;Jr5&eb?Ov^C>b8rME=EsES$X@ z%)zO~4NYCsXF|Kdbsb9otrMKIRgE)IlAkT1z^SsH=)1^E@{=R^7t-$?pecpxBjfY>{r_QhH zJ$m+goK_QWljZd2#ni>wCE-4tPG+|kdvX57j_pOu-a+rh5L@Xxa6A%Z1^+}Ln;)&; zx{qCpd9=Zpx)?W%INPQxaP4u7f$^!%Hk@6Hb$L6!Z_xW)&88fM^D5xI;Qt=Z_KY?F z1NsHMM?E&>Ex7Zm&hQ>iyEq#+mVetsYk~Ke#d#d(my;3rbCpv$BLiY_a@SWmZdjbR zaes`9J_Cc^y{FxmKa2ZgtT}^h_cJdz!%&>P*y{1`-8ehe%E)sYPTj>ef?dIJgM)#w zINRa*IIW-!RrklXYsVoeD$fWI&6+dt=1*HkZ&!%i}~s- zWqg(He!luhmHh+0F7x$4G|cxAzDoZXUwu$J?jFbJz$bit64j@=Dt;wjWw6TE)u=vF z#Xlp%M=HNYhEH|X@$2|%!n~-KP+$XJeWWMw-7dpNssnb&@R2Ixk7f8s)gqtE@TsnG z_%Hb?{a3#3LG`Ip^?krRb`3qD^L#JMM=Jk=44>*M{*yiOyaN)^TPfIyr%nn@jH8}LV~9h-CS z^Z!uoEdSp*p@#37eu4i=wN!I8^*;Z(+VlSx68^6;`rnNA+Mi?p^Ai4%u`0ur-}_Wo z^*GmS?^9jXrI*1KHOkk^{d7`|n3AX;G1`y#KcOnnSU*3hPBh;4|E48>icp$tKcQ3^ zP4NAHMQfA3kn|cG)BWTAUg`h8Pw?k>^q zMqL?f6om$U#Ku&~4*LGDG=cbY{OGC#NyrTp5h_{&*|G@%{l) z9gyIAseA+9S69t4{dbo2k?I8AUc*=UrhdFs`84yrRL3WWc!;WmtpJKU&DXXve5$L^ z89tXP1N{e|17^W&t}Fxs?fqz}f+_sbdC&2+gRdPG$>;C1JMjgiI}x4lr~e!E&i}Uw zRgfF}0^I29O};Mh^=4EbsnXx#d#U`bzAp6jHecP4J%7Lj@K0couf|WXSdfoY`-QvF z`sib*hW=B2e09|cSNXiUs>9a66}65(nyW8q_o9q8pgQn1lz##n^~YEB*qgqWD!AGA zQU%}feRWlS@A_P-;CuWLf8XcBVgYFbB6g#S`-(q0@jl;wgX+Njiu6_S-~0T4&!siZ zg6sW_*>8UIQ9oK5&tYL5>#L$_`Ch8_sOx*FPFv5{<9sd^ukU-Q8n_{3nJ z=dV;zP5GmYn)%usRYomQ{t2}9wJoX<&>mI#vr!fN98@2vjyu=qX>klKCF~4Pny&n* zgZ7p2RT=d6eRb7M!i8`he~}+ARdBfPtE=)E;qxl>Zc+RQW#sKq|4qd+{R5?H`YTY? zWDKh7MJ}pzQ+;0O`yx~ysp6-hT2|+xI=E~A3=5ezfgUo3I<6W*7&RG1?YEF8PwMwUzM-{UVDk=s4{Mi z>cnTFD)3pTK2rI!Q61O8SN*>mRPa<(AE`V)V%trF0?IJrC#bGM=lNW!1JC!pR5k18 z^ZvdLKvj@Is0w@$s!w%QJ{QBiOXM&=!GA}U!Epb$>Z+QLgeyK1Rg%m7bk$V_yt0NK zBiev>K-5ntRe~|7G8*f1Y0xaVfs6cIHv}7dca;H9H{6Bd@)$kT7qPn>JQA^$7SL{D%Nwo+~ z!Mptf%6xsmkFTye!7`u!ohsdfq|@T|l%L;f|G1czD4@0D1wTTnzI(~{f2TS@xu5O_ltFI9ye^nI0%{de$x!<$jJ22U$Fne%TTdzEV= zsvT>Ee>$o7PEr3BD<-bDJqkGZb=viDSb*=2kA8*9S@HzJno#160@j-Rf z2p$Ai#)JKMsWKXhs%J0q{Vbjlt3Kn2R<_xGvcFT!gj~|; zwtKptUaDeT?d!EZudd4fA3m2V{mh#BmrZQoKd9>SPyc}bj>ehE)XQ9RTQFY#JJRPjgs_$oaUpi8%-;`pjG^?hGmL#AGVf1zvWM^{(ne*#=lC-FzwB>U;As~V~$ zTsrYHA>U%~ldQ5@#0A-ZoC;Tf_y#B{+`bd>gM_)UkYREKH1&yHk zR979}1FrM+LNzo8)uP9g(O~}osr(RMhoU+#!;i17N_Qb#yU-jz{=co>1^R!I!T;`w z{o_hhV%1~E5KC0;-U zxWfWZb%ML`D$u>C;>&!0zwaMF^{K8(|DYfL5UM1P^G7FKCF83K@{H%{e;fF->V#`Z zpoGu*2TH}C^YwXO*Q2WG>!?1}RfFwKxC-#DA1~D){ZL*jh62j?BR_#uHQA0TgPlIF zuHuz`{BA$Ky6Oa9`~2_JTd|ZtHT~Al@CQ@{`q9rossbJKeRWm3pZ)m5zJk1;C;j4B9 z@_Ok&pa12{2mbm0@+|~qG{Vcqs+#gr-%Ay*w+{4?s$iG%6~BV7K2rHB`Ra2eU*$7~ zuXxE={^(O(6_MpptIBvhU-4|8OXYKXo#1n+2ImytS68L~x0er&`!hK9_JM7-V{aeO z4jQM&-ah!-w;Js7ahfI;pZ|{Pigc!b++XRjw-1iJeV{S*_b(SP{{B9}pW`*&s=sxh z6UaA5m!OLOFTHgTOQ-RF?CpbNZyy|c`+$jX?CpbNZy(sV5VUhT_V$4{C62v)aO~}a zV{adLZy{)Rb?of}J7)`3jY_6T%(0gz#4y#QGJ3}CmwMJDA%K)*GBMK1z| znM#4f0=-`XTw)f!#GmDB0S5&}nx5r=5$gcU$^n;}0|N2S0*1W|7-h;{2CNkbzXG_z zWV`~%eh#o&AZmiI0vbOL$a)np#;g?BD3G`TkY%D90LAM88wAFigx3IVUH}xm2FNkx z0^0;yy$+aY@?Hnbdl9fzV6sWx2uOPgFlQqm*K85kBhYCRAkWO&1Xx@S*ey_CQr-ac zdl|6k4M35p6gVu<`%S=AX5pKF<*xt^3QRXW-vW$y6|n3rz}4n}K>P;4u+4yLP1$C^ zT7mG}fD)7OHX!>oz-ob6Cio7Z@#}!BcL1}^N`Z|6iSGjDnCQEJ;*Ed}0&`8m7C@U# zfTAsc`KDZ8n?S4g05_Vv_W<+W0BjXlV3OYlq`e84^FH7fvqfN!K&KA?3(c$#0E^!O z>=tlM%2q(X&45K)0gFtfz+r*j9|DY7_#t5V+kk@tOH9v?03+T3Ec*y>r#T=H|1MzI zHo#I-whgdWAiN!LkIC2$$ld~2El_5H6@bR?0kSFp_nVah8wC<~0G65P4nXnyfDHl< znS_r4Z9V`LeGFJ($_2IwwAu-H#N_P^UJ`uNY?3@?l0QKnH`66gm@SegP1{|_N;6CH zl-Vv>Wl}yxo;LF(t4*ck8PmBESz{JT)|$PNb*ATM$g^gNm;w6gs+f|CP%W# zluO<)P4*yfnmox{W|L&IN#2XRZKg}!Fnzs9pEoPSFJ+oc%zDfBS`M}JVY&DgV z4^8K9kdMql$u_fBvfcFDk5rf?k{#xN^MfH~zS^gzJOkp2)b?@50Qn9~oUKLyNn(t`n0ftthL((>JY zrsWTr`FGP5%fACG0)&nP%x6E7WW@K7-iIK+2Fz`TAn^wv2Stts%z1|)YekkFhWs8d zKS1~olJq}9@q?yJ5;8|5aVFyzq=s1`37g=rNKG?RQp>DFOq+w`l=vG3a!m9$z&3#m z0(DHnQNX;P0Yygv^-Q@y+95)%{spLS^8N+bBd}E|>tQKfxf;9ofzXP&r0!}k40gKv%Xp36- zw*1dS@Z0bk2hiT+Ie3JMr zt-!M50Nu?2f$Vs|u=;?WrmQ}ou>%Mn4>;ds91qwiuv(zE2_^uFYXhf0uq}7a!j--V4J`Ofr%!e8DL%`Kv6TmWK%AX))>&LIUv{MH3#ew*eZ}`l3M^4 zHv!CP0VptA1o|ZbIwb>&%&cUMwWjB(fVBe4P6d>h0|MF20K-}VW|^{9fX2-M;nslJCZjcAqrhr`IVN~o=#t>| zW~5}USt*%koHodO6P4Ux)=6$O32l*^OpauMDVN-Anw*Z@V)7)nnoW|0Cix8HHZxt~ znk|ysP1`e(MP`=d4zpciOiDXsv6(MfVk#x2rt?|Ioo1orF0)s%)bwnR+-;Uf?lA`> z_nQ7^BW0#ca-TUOx!+`@AP<-ol4T}%4)UNGDS61Olq@$+2V{kbN**@rB#)Scj>w}X zNAj2{M@-sTG*l}sZcmuJPJlfETLo5{+gECKZqv0cJW_mQwhJup3g~t|V7r-rK43&Qz(40OPa#&=+V924MsSsJ-7t(DAXZr8C0V2K)_=efH-qRV57jO3jtxX z;zB_2AV9r~0JY4>ivVo~1J(;T#<>`M& zaKIjcYlj08%qD@w7XaE_0%&NaUjpct0oW;!Xxfed92QtG0?^287g&BFpxa156ElA# zV8lg${Q@VM&Y6JtivdeB0Zq+bfwcmIF9kF=OD+Xu4+9((NH+a112i5Ec6L(XCg(~( zS|(t#Kzq|93fLoXZ4{7VHVG`g6wq!opo5t{8qn`Dz)pcqrtKKOVSxo>0I6oX!17Um zZeszR&HS-|5tjq@3#6OQS%CN}0N38hX0ltzyj-g7rO47Ol5{tFl_dL0z~FI!o@U87 zK;tOjsKEKA|9HSgfyc%JdYdBx#iIeEvH^X~iflleF@SnGfc|D=4q%(WdVzt)nE;qK z7BG1NV6a&ykd_5#IuS6`VX*@OnV@EWkm5GShP|pz(EpWpe@dn*#zH1%}N7 zEHh>E0L8Nb;rW1vOvZdbn|}gU3#>4~8vxq`vTgu8Vpa;wn*&I^5%8Fa-Uvv$9eR)N(f`DVajfjKt=)|f2<%jW|+-2zx= zX59i9aRXqtz;h<$RzUoXfJL_g)|*O!wF12t0$wx=7Xq?x0vr@5H$86yG+qE$b{pUo zb3kCDz%UoE!IZgx;+p~C+X1hejN1WiZUL+o*kpo>0NVtz76INgD+T7=3P`*Iu-QcK z0HiGhY!G{g0mz|{c~4~dJ&;bzAV)&xx@C|N_d<4y{2DUnJP3&|gDiRwax`Q<6ImY9knH;)2O;bxdM>Acjqe96TMmdb2Lv_>3|j#Ro3a&v;s*fXhXJ)r#>0R%%K)nd z920zm*<0I;l+-aRC3TJSC{oWvCC8a{lKLj$G30oYBS|pjk_M*9<48l3Cpp1vk|dhs zCpgLB6`W+w6P%=x*&?v~VL+!R0Zq)TCrOxOwo6VjDJzka&3s8yQz>a?IzNRpHwz^# z%w9>d>A4Cy#VnDuGzTQ7n*L8CtxOqWil0zjS96lnOvY-}^-0xLpsfi$1K1{z^$g$) zvr=H*N%!8danm`Hw)JT zveyC*3iLERUjQ^-2Uzw3;CypHV57jW7XiIZ*^7YUX93}t0DVoyOMo`d0agq2H^Fki zHi4{iz(BK7VBYh9#FqhsP4s0z+IqkSfuSbh6~G>WqE`SJrd(k03xHOy0xmLnuLAnL z2-qqx%p`9B92S_f0dR@gBCz}=K&RILBh9SW03*r)y9F*aDX#;u4Tb3kCDz_6`=Ii_qYp!i)t_(Q;4 zlkp*-%@)9Ff%zu*5n!7@)<=LF%}RlJ?*S6G0T!6(HbC0@fDHn-n1t<3>fhdV7I`XCS@le zej8xXPQX%ADX>#p8}Sd zvQGiUI{@KIz(XdZ642&jz-oaNCiod(n?TlQfJe+qfq6RtiJt==GttihX`cW#2s~jD zz5whIDEb1h(v%A<-UVp28?egc?FRJw6tGobwMqUGa9Ci@mw+{9i@@?qK&P(&>&&dL z03$vF>=t;=r0fC2e-2o*2e95$3al0Ay%+GJS-2OF{RQBlK)LC;572lwVA(#vE9QW} zMuA~p12&kluK~qh0>a+_UN;%v0NQ*7SS_&01os2B31saDylGYn%-aJ<{1&j;M85^3 z?FDQQc*i7s2iPM}^c`S}DHmA0576p+!22fedsg!g%qGcJlY9XA&`g(nWVT4QnYKS5 z+s!OVh1o9IVN!lXJ~s0uJ58nJ6Vv%8WS3be`PA%{RGOX#k-*P^?O363IIfCprQOUPvo#Z={@C$q4@8isbUqbwP z5ocbO{t#!9eno$bGx^e=;>;V;gK_4R-_W1q%na$FIP;$LaGW{)D0(E$Tqpe{&QwT$ zjWg%`OS^?5G}@wnX}1t(J`-6h())Mq7UIlpziYSf3*;aq7+lmdjt>7dRBzF;IQ9yQ z4q!K8&9ERoY|4Uw;@<$_5TKUH2m#t01*{fuOfU|xO&}`{P{*tknD;M0Vhun&6RiPA z`yH@BpuR~61NI0Mg#ihs9I$9{9KBr=-_YdMBtgF*V5>l)Nv;JrEHI}Qppn@kusj6l z6c1=(X2kH>;u0mAhFrIXPA`&^Bh28eLy=C ztq(}64cH*i-Xt6k*dtJMJRrrC3;chzy$6_0*Wb54bLN~8eK5x0VDvuB45N?UOAsVM z^xk`q8J!>@!VF<-I?stLU1@;(2N;psueJOLW3e$(eQ@3#9cLmYI;ma<)B3~LaKXB zLZ+Zsd==90+8)y=XHcSKslVdwpS)BgVLxU_BI2I{EqS;8MTfTS*(0DKzdlHl6wnka zpj6oisAn#{#10>?DN3*DlPxIJH$0C*-;g1wg)O|4Eohr>Q~`zkZ(KP_vkUO z565w05*y?U3ifzzR!H1lGpLS-OoU1!XP9fu6S2pElw z$lnUe>M2vltj!R#TiJ9{mx0s`c$IXU%27ef6W8Pqx*ME%BrlNQl|>2ddvuNL*5Cda z#sg$wO6_Vz7`=ygPw;x!glRqOGEs!x`giQ#9`h(NUY2Dg;&VqYw5O6@!z!>8{W|vV z-D6P4fG_%)>&1f_crp(#aZy1VJx6;a-i`{|;_>v%W!9DmYVK<>ftQx3+^k5=wvwdw z)FfiGODM5Tvmn3cKmS+$hA5f7wO=}AoWr^tu$@=#Dib@T(m}EmNwt@ly-LuqK+lYC z4N2WEM^i6%&?`=9$9gQu`WmDm;*io1*e)n#V2VLq2Uzdrn0Z)r(!i6t?kT%SnqoTb zN=fwEjb%{RUPCC#fK`0THl?yQ+}x}mRKj=ay3<64+o|e0Kw1IaZvI=-1>}%=-VnRs z$Ns~+pltu^8_|lFKcVJz{hr;Lx-<^z;p@ytI#XFSo4SH0Q15z4SjaaZ(psXV!l`LR znHG)oXk<#B_->P+&4Ip5$ph_@jFoo5^QuG?yr>D~0 zIVdsi&7eYozDj&tFLmPdCPAwMGxq9aHOPRgxzHyjew-2D=kqwlR2wU->`l){igB8c zX=SJIztMR5<~I%A3d(2q5oOhKOWCV;A1l~}1p>{D;z89@59rvhf5(2j^rxWGkDlF6 zpRLR^R*q7*Jvy;;;*+*PVS&CdK1OBLiq+$N!z(Idw3isA!q=pd%I;vNpcuQ&{o9B< zh3lIAor21GKB}9TqH~bhpQ1oPWsaBr#+a?8z4halaGFj>2$NaTfB^Se{f45j{+6Pn zYaP7Pn+x^#vExsn>Fr7STjt1glz*ioTkgnoka@Ku(+i26IOG3)k>yH9sNV^tbbbu5 z%8}7&15!D%)s9Sw`@_ylfZlAZ0QFwzl1eFmpCFT!N((6O$ksVBy?L&ICF4--2FEjF zYQSrb;zmcN7kxH!WbW&d8Ds-qcVv2XvLaTgyy3|7`eeyyvH{&4*=9$U0h#;$qD0B` z3$akh3HtloQPle+@>mjHa_-3VD)@gCGJji;DQx|&?6D);=IH5d98VnCmyRqmvbPoSs-3-7uLm2N0Cni1Wa-icR4b>EpnP8+wI7di~f#mk0Z;D><8d7;4A)9;&Omq zdZoYPj$Q|rXwqgtfSt~tHyK75k_Jk4Enq6$ckZ4k7w2Y9Yh+-`D}`N0k|QwxL8f$-hIZ6LPRz%SUK#An23ED|9p8i(uaA}m)Sz$Y z!F-BPbyp5vb!0wDNDZkxG;(BqWQwE$G(o1n?8sz|gQkuwx1(1PSu;nL7nw3r37Wg_ zeANrXC9DjE9L4;OtO_!{9$9UofFrAleIa(W2@R<7TMb%ZSDPs0$f{#+hh2Y#9a#T)lvP+b4@5lmQ>e89U04`fG}l~zeq<`8~bHYbro}Db+9vOTYq}9xx%Xp^FUP? z<;dz`*GX|zSF|IG*GtU$BUClSIKl?l2RX75j*O*PKzC&NE9uCTi_=bN#X7P^$j%^B zb(L~tjj`+Pu=>-R)RjQJ?Ch%h&fhW!mC+_}%~34pC^kiQ*O8TX^qL{Nk4*I+=g3~i z9z^4jtP(P{nKvLr4T`_lo$%ho9`4BA@Y4SkadXJw2=z*I$yz``N7mAjwM3@(X6mn% z6X09eSCJSsyw;9hE9~wIjN3YTt&!<%>D4jSCR7S-h(BPKQ^#_Yuq~(ItSwHN5f&PX#vi{2deOneV z)DaHg`frfuVUBDd_6MN9;f`z&_DG6QeC?tJ~)OtBFM!0oP^B!xIh9IPe4WVj-xmV`y)`!Cp)sy*!31<<#Gx#)#n({yKR*tz2#oAv9KMP z5oXX8in{PQo}Y=lph!q9T!o;oGI-MH~Xr38^&wB zxdODtTm@QJu7OWrA?V%cT0&~cm>SYRS_px3kRCEXC}e~%$OL+|`!P5UC*UNUg41vY z&cZph+2668hYN5Kv<}t#;=h8g;T!lC^no9(M`NKBl!h`;4zwn%02QGURDo(x9cn;L zs10?XF4Tki&_LhXc@;||Xbf7jHi4#~wW`*pT8q93&7lRfgjUcR+Cn>M4;`Q*bb`*% z1-e2v(Au>J^n_l}8~Q+Bebb>IWTTd{Lk@_5oRAyxKwiiP`9Tw>Cdxvf#gP_1TIUo4 ztz)!qi3Y7pG_REeEi+1imJww@)00*OnpUDK@LwG0gH#Vei{eM1g|HUBPeBba5Io@Z zm^3xLVetvbN5dEx3*%rsOn`}?b?-Yc8K%Hgco*ISt$(M(`!EAOfSE8049o_7w5>bz zgkI1a`a(Zot!!Se>&+YAkc&pp7+!-W&=fdv9MBwEz}KYz8~7H!gT1g1euVw-6C8kp z@C$@PX2=2=Aq+BsUIKdxPJD7UB95Kq)8zCE+LuIR;sc2^!vQ!5dtoyq!sqY>Y=N!tCCmZ?AHrM>w)0>ZFNc+|8WxhM#hi!pW{qEsRd*GgQ0oj` z;2W-+VZIKRu>T3KVs8YEp*qxnns5ZSU*R`63di6SoQ5-S4$gxH#M3^sYIdt>6qVjTzLVFFBq1d^=zLX(@OWlh(bq_hsuwBHdrK^tfb?Lez6Ed{hj z)LQga(1J#b-%3y!sz6n!4!RLa>!E2U!x9X7$K7K12=2gL*bBGdHf)72VJGZ@PhdT) zhQTldxzK5;@k0` zK0Bg2sDiMMs?c{>^i7tXumrqBRu(e~{>D8th~k4V$OPfg61TTt18Lg`pMbvEw-(mJ z2Iz{rR?)9P2(arCAE0d(ZL4UlFVDxCnp1CHNCA!!bAkM<5FkXN51YFID|FW{}oxT497mpeX1T?Hv3Lx(&Mw zSAg3u>u&2h<_)+Bx8M%wj_WVD2M^#OJcg$bOdQGJ6-WuGAPuBT%YVAv3WYETH#r-4 zGsWk@svD`opqr=Vgs}p2gVY7OL2u{>gJ3Xpf?^N_DJigBRPk>%!dWA5Ej8=SOQDoBls9*fbI;(!5*rvCZ$;mN@4$u zl3EAJv8MpGqvEZ-&0Q$$feWDRKy5K@~`5`&vrAYI^HH!HpoPslO7S6%% zZ~^`zvitA=^Z|&55CerF62kP=2;CBfgKh)ULvly~sUZzqq%{73OTd>&0*=9PH~}X? z-vapy?!nKn8ODKL64M9zLVp+n9bghAGX-?__ijA@y$9oA208lxW`TjZpndHkP!wXw zaUsYL#YmXGVUrhAANBAbS0-mQpaHxJji3c=Cl@CYcZb$fgcH<^AJ{Y0){I!lhNQm3u3s5s2OHxUYbt{|>yH-gaP^AXI zd5qs-C=gKqiIO-#@epJHL0I<~Z(+6sg(bb_@Fu)YBedq%`dlahTEo?Xnot9(Lp7)f zWk5R-QJ~$4NGJ@2paA5De2^2eg6_F9gYLm~-<=UcAq3LGEAaGb{L`nYu%v<1kP=cr za*$ltGSfi@NDsP!SAf~T57{9HL_jXc1GynD6ojHs1e93Wi-F`KT8*F-#6k%u3EEpJ z4`o4nD-|FPs(^A>87e_lr~|b@iB>78bW|cuLAh@PuYz*j0JK_u4b-Bwf{s`5z5((m zr52!ilIJ1N7F1k=;Y}C>tw961Tc4_5`ELWRTPy6YyW9qVO05I51BKg0^)C-<6e=DB zmc2cuin}-TgdWfxIzngY1YMvjbOQz44|+i#kiWjrAKHN8P$CqmGLn?Icw0d&QaMU; zU`XWp44i_Kpa8ytJ+K>g!VXvk9|J*I3r1}i41=f7{k@HBgd<;sxezAG(*zg|qaXps z!FU)0W1Z`FG2a6f-4u8SCP55L2Dwj#=`aoE!c6!OX25KCAJncSm+S+Gm&L#=SOD@U zPjeh|KIT052$sNNSnAl9VXlM~upFvFb=VGH!Zz3nTi^@$91>wOdwV0+R4zaMh4J2N$Vx8 zowVDboe%ARXeT5LG6vH0v`3O2!y{TR)AXl zY2{Y~;-D^Q1*nx^9gtkB!FV~!;aQ<%wV@W&1SwaCDo_ooLS?7~lF42AGUYB)a>*2l zt`%kjs1HhHBN(Il*O)k(ivpOMTSq}B=m_nhEwqMK@CG!4=IA!XOosV7=9{2){T60R zXbvqvjZ|)JpdEC85zqxX!*JDqZ!F!QEA)aM&>b`)^~6+9P(X@s7z~1e&<6%UU+540 z9J|b+Fa!pJO6qO!6UInPRe1u`@-Ud_afKeVEQUo;6BdBxNNxUTynSES@GYLEV@`wj zU@EBereLZBCu8=9e()-CJrC&#dS0UECL@vQ8A>DQfW0$jd?)_v$i*T8XoI~q=wZwn zuHVAc!~MIKO0~@EQiG)KOcb_;!;=wAA|g? zP-9TTQX~pgLPfUDxmF~Kzzv)(^Kayf&|3`h_X#K*H(^T1v+fE*ZpxVA`U2FZ;?<~* zfNrd{bNB@NWB3PD$Cp6$djSr^SFi_m!FJdNJ3%@!cYx%sUFL4*+SNJ8_0RBw`u}%W zl!&iE%HKGq?2>&C@}O&Z+7Ca1{Op6hAU9o0?+_dS>HGw)-(Rqwg5#hJ+lit6k8z=Z zkHT;8D=4s&Z~~+#yCRW!22O(ladlk#*=OX^m;c}494Ji5#Cfn1ruzQ_E`l6Xd~y(f zf&zAP@Bq7V_cz>!>)__{3iiuz4X%RxsMzm;GItAZ!VOS{+{DD+<>C(9cK8cZo*y}; z0#QUth&<`~DM(K;T`S=p+KwX9c7_kU5C{RFu%)l6m0fYl9ecdxG00I$kEz!02Bxj+ z6d(`DFtw#Ek4mrteg%}XU`#g>B|^IHwQEYIL?|qob{y1yIvlk5qKMK$8gL^_jXf2( zkv$ucblkw*M851=iF#K5U%To*0}-egg|-j0Z?0~rO?wG661NMwZrU%AdnwE)C=S{K zcjYqO>uAmYx`>66pgqnK4z34{0}4ob3amOMTMlysrWWs7Ke*$5W$cxpq9c>sb*qJ} zCa8y1#~h7Yd^Idpp$5pVz*}Ix30f#L2Hh?+#cTqv!Rycr-T9- zTj&6~?g+uSE3r!SYCBKYNR$pjW~QSPskJBUlP<$kO>3R>5k}?d%%NO^^tm!CL2f z1Lk^I2cLqjH#(-|o7Jr({M-?4!QATDC2s%+U^46m&FAl9wuJX!Kl}(kz_;)fdLf!2fyYZvU)DWDx#6ySD{@)E~`TAw1D0^fjiz6J%ZNaX%(gx@3k z4)%c(w-9B91k2EW0tpv0)9 z{EVrD9D&22Fl4U6&k9gilFm^$4hriOrq+ydJBeLmM*IoKQNlCWE!sWfL*y$qV)9d7N(c$80y}z)!GDH9npX8huY`!rf0*@ge9)Su!JD3u zW`WF*4^+y^OllIU+-K){D&eP6F=pdJxz>nK)tu?-^~Fn1P7jr_S9k-vO2IAIl=!QHOiiRRrkYMAOmzkg$vRD;hlaXAR(n=^zpY`x zDta#59#jk^bq+mcEC3n?6uBaH+n@q3h)nIY5T-grB&K?|s$V%(!sSnqs>GyQ5VJn0 z6GkJCe>PA}-wIeBii0B1lSoBs$#Iuw`6+?ijl4W|RbM&GSWtq?VwQmxBt(OvjRzCvxx>M)APs$tdu zC88E)O=yo!Jxq<{`JgfOM$j;*n|+7;Iv1K_+hMi^DYn6E4XxlUXbCMGdne59pkmAn z-LQ9sF3=0KKIw@mWLMbcU{`Nw{3))~JXJyQxDEtWl*(8w=-JjY0J*Z^Hd}X)(zROM zNZegNgRs91BVZ^DhhZ=nhJa+4@s>p`PJulFMX0`_3VsizC9oLAz#{k%MuFTU8x2$8 zU6=y7K=OBB0*r@oFcvZp_9V=SFd3%mbcd8D5~0dPflP;K;0E+Q_SujV&$BQM%!ChM z21qs^7Q!6IT!1+b=7QYRAl8A~?AK!d1Xioa%aPNMF_nOiFxBjLz$)x3KoRSi%W~|? zK=PFiYcSR9Rbq3{Q!7-Nhf~}zX z-ifJ5c3^IU?eHZmLbe$8U{}#9cj}As!xU>RUcSZc8<3mi&zfYs;=dl`un$F*#@htC z7rO#;*YMSmDS)4lAA|!C9B7se@Me$y9s4;r3uoXooPv{Z0*=EmI10bPuW$qo!!Mw4 zHxk!1>^I>$+<>{r?qbftyn{KLG|b0-TW;6|ZI_daW@TE7+@8e^}Z^a`d1{Zyb5 zd;$-UKZ3uZ2-o*9SL3e5jTSc2la7W?$^XIL47p1DAt(&t>OE2;R$vO~*%gx4OU{r5 zU^k{a98{{(rI%%}EXrY@PI949l}t=O*cHT}WVS zT+$%9kC`2_|F)*9*Lu?4@&vXj5g8p>T#Gl;XQVegHj)CSuoF(@%$z<&g*3$3s(55n z8C0s^k_wm1!LR4ZT42xzmWv#i)6Djf-e`X-G}0^ddfl70sXBU`r4b#;qOwnrNfqx6 z_rHyX;x8Ljw@H>!r`Mnn6-oG1c#x?i4Gnv#(THp1+4jqgS57+`u^LLufOu~`&;B4Y zZH70a`8D2~&95%1wLKCFJs7tt;62yHQVw_VwhXJW<8;M4)8*U(In;3C~p@3G1QZz zzBA1qD{Fq*K~)h&Rg~nW%WI-XQ=He(2ti}W7k`!Vm94!R4XP@VqHqH8|Bi+#y7a7~ zALQJVp5%@!9%)7CXn0NroBc!?t3zsP0IxUtrT$yDzdvimW|fnU$|#KQr;bRI$#Zy! zClIk}B;eCmjDHNtKAqe&979Q7PHsXrc?+AFW4t;2r}2{#Z^f3!?Yuay-P;6+FXgsR zN^@uo_2f@wBF5q^Q)*LoEWx~=+Vs-3TOo_adef)KO`@_8%ol0QHb?nplG(|Bi4s+z zR?2vKcG(@TC>oUk(NqXA{l-yB18DI|NP}X#mt_87PbeBC?1aRpGdt1n)J$)(Zztke z=}nsPT-%KxqmMkM%wSrM$0-6y1`H=Bx4EO`hMw z%&-Xr;?%n5Mwt0d*QuyhwSvsyc00NHce|6VGrUs5N{*G_<>99IL^L!ds+WBCXNfff z*PptIMk$qe$$%x9O^1okgiT3poaim&nU}?!n&^%2w8%P(ZXeqrs~yGujI}C%bhq0j z0*H#V68Z8b`0tQmb@R{&rKk_#WFsNd6Zh=tnk#CeC$My66#rQ0WHs|Nz^ut?p1ezg z-9O2jzRdqTx@2T@VL6%5>1f4`O^cSk5E8hLD8kK8?|8F$iug?*`l08!uszlMX2iSR zLjM02yxI4Tw~6N)zgdt-2o!yJLh`@79G;8IESXGGbH_lZ{kaJ;Hz#|usGp>oLYOb_ zC+)MFO48`h_@!RCqsZK2<(h`qu}a?>|)h=lnQ%%4ihq!Z2gwQ6q@R-7rQS)Q$#?*kE!ba()_a<1wDb$v}eYJ zfIKrXT;-!p1>A)%&ckNvi`n~OU!_+p$EhAKfrHs#!?Dqcph_A zp^rs_o|&+(K-RO@>P%e~s!kU}1OfB%n271#PO7N&f1>$4^{a8YX`8E0A5Lp~56zf} z5hEg6mGI{?A+f%UKF0i*eCEh>%DH?#lj42qtUk*LjT@I6wIAMaa)FUn0<4+|&2JA+ zAKx3&;k7j1q_*nJ8V_>hH&foH=!)bw%ii}EN-+>k%`l<)&9V0hdv^hoW(MwVbKlDY zeGPQuLR$9dF*b0X6;hO%(2)YBC7S+=Xs}t4uqxG&Cr_&$*4U%jmC?(dGs8Wz3z}6k zh%2IyJ?xe(WKQ8T_9oYwbr-C9|4LZKLz=luzcy0#@`QzciH{M2OoO^XCldjpKXOr8#LmNbFImz!<&0{FG#z{=L!4f>h%QPMptG0!U5mPvzf{%LyuJ4np z+A%`YRN$ikNJ{aU-i$f0P9kJAqvnD0j@P)qun$@#?S^J6g~z5XYM1oY4$YgMEWfjw zQyTcqf{Svtrgzk)9@pD1z=eTVB|IRV899^MQmIs6h2iAgGpUH#C%Jo_w&<)`6nJ8! zT_kUQ6WjQ5od=o()M5!JIjCsPKKXHNffA|hWdtJt3#a0yf&7+1L&NOQTc7=Qyy7;y zvBgA2mk3yli;~x-cKejMCN)(7#MpD8?KjL@BH(0{**uG>E;p5{0^YwaSGf&m_=yBzK@0< zjnAH5y`3V<4|$U`);canqPISsdYf;m{Ok9J7;{~IFQTE@Xkx#)`A<%)ojOS)sD$m3 zZP=@U7e*XTNOIwK!sTa^vN$xftZZ^>$KnZhM`cOUXj#JaK_hk;8jQdRrEd;@HBHEb zgGm}6Ixe5)^}bd7(zpysE}xe$+vWFHG#HZ;O6C8gbo4(5Y9wjg$0ZjolizzhFEMwz z%SkSoOPW+4lCtuQ+YCJkZ++jldbK)lA4<|_Q_@sI!&9MxY5t)%!4n;4PRK{KIJ=pD zm#m?wajEBSFYB>rYfbk?oC%pjdU`n;;SV21HU1&CW0J;bT-0_JWG%ks=ReywPjWGF zrj`7zLPJAD>P*%CT(EY~w@Dg1oltiNT(6n$Pfw*JmtW${8vOb%IvU5vbgB_G>)5U& zjfZjOj6zRc(GGoejjnI?tC)XYl16S^)G`k)4$1aafj?hOaw%KUM9#%;1IKTVHcOr! znf?U>jhpWdxP;=jUD%`KX>)|$OL7@f(Tu>a{~a_kpfSqZQ2)g?`Nm{grfag+CAcU|*6(KqV7B zj~;TRrs;&~-&M;V&epEDGokUE4XnqbbbA#Y74SnXvq>7iqoE-x=Kc1=cFkYJdiDqs z^}`#r%%Xh0j3(23ZfhPQ)EMPicJqf$T|O`D2`ouJW()}M);102lc6lN?Lrw9b$CE% z;Tdmu|BWgV7Yz^V;^Qx+Pkv)|l1t6nW`X>+MMIVG>*%lz$$u{5P0|>Gi>AqGH&^Vd zF=$`zB$sKm%~kyRS2>|~o;vX7Dbu^q8Qm=Iscj+_pm7`x6=;j~ue{N*>)0Mlpd?)b z%eC63$pVV&ac#br$lX?%I(A`re(lRU(WA+wt2q;w9o{Ei4#3FB5PyNQGeGucUxKN1a1 z*eM5fjz4_*2^FJzyC`Oi^3BW%rL;~n(?gog(M*SCgJXjp_Uf~}kixRE7SO$!StN~@ z=fy3iElm?C1;15psTBB2ip7(>nHjK*rJ9|HXwQ#tnvmt(X(k0^7pGH2)y~}1b)|M@3O-G)H56|Bb|!8OMfL{4==OhB-tRgNO#j-Rq+lF%H=Az6?zJ6^ zTduCMlR8gCThmhI?7BN85&IdBGBxZBzk8%i{OUe$sNGwOvViT5%O9&Ryw+>uhwL)2 zy0-@8vaQW2g|)ns`TG;^9M4CcO_AIz06*z$)~=-vKksb!{&~&ci@Z|k(==p3ohiCh zz#hkC|F_X`-yW}0)ppT{w7;`?gkS$LG}OyGo!T>L{|prM}H zcYW)_I|CzHSQ;@}#szkQ`g?EcGLO|Q;qRTxwdV;k8Y40KisfJmWm0u>S!c} ze|_S>fhXs2(e_PLnScjfO@sB`=!P#Gm95$0`ILkNw(n+F&zA0XSL=~#>%euj4*X!n zXN}}XgUo^T-cGTLdfJ-1(wFI4WiKXgkNBk0jz*sGR*J0URq0-) z#|8?$0U9aDO_!3bmlZ2=Z6+GJKcML@>S-3C;o0BIY}vp(cDk3j&UI{g?*23g4m+MB zWMBKDL#^~gsbkOTZCC!iUb9ArrdXESN{3YmGwYc08;R|O`L|-TtEZ4}a32N%vn$pY zo-9fZ6Z)9#_>7%}T#N0wH#4l>bK*nYS*md`IHd1uH=ALV3ZIK9+9ajpLJqR`HK{%& z)^TX4UnQ&9EZ9_JFi-uEvmy;*5fjA||-N}iaH^{E0x-;Wyr`y?W ziWQjE;XcMil~C*BUTc5L5uD5lgnJyGzuCJhIZE@03?;?1=|T2m(-IbZj#8<}Xx-Fr z8Dt_pr;NUKG-g%H@}zc|O=>9&xa@KT9B^FDUYI}T`tH*2T2WgiaD0$iwA~vTp>X~{ zOC4~?EhY=IHz=59 zOoPo$G(33*oAudz;r=Kz)o1;GC#2l8W6dZuogK@HgH7BQB)dKu)~@HG9^YsFyNCL& zIux^eOI$+mdpWqsm)%aCcejA3xE_N|!-J$_1R83LDPG;1@WY~$u}ViI4JRgG>R_{z z&^-$Wn?+B(VcwDf8wQ)=!;$P6Y|?BY-Xr)`NA9=rr;G2DsqoN>*J@Ii9havi`ZlPw z`f`YqW*Xa*!KNjC{b57wWoPinWTxcWe%Cd2lC1z9iwrT-(D2k6VpeVOcJjOLj_vYb zM1r^CXEm)9T7|lNh$*s_us$a&rQ`asE*>|*7+%YlQ1KT&mv_T{GjH6L^aA2KA zcTR*PY23vnBYt=PUF7d|-(6dh_ixnQF|+XEaJUE)OSH&OP$y z4+kdstuxd-Qp(z*5l-m-tPdt%h)H`SNn_|xQ+yk_oH5iK_!7-^XsUZ2-q>Z@_PKw? zu~4SvP=x_|hnkUS#$G}rI~uimeN^p9ckjt0jo@Ln%jR86HpZsE@Ntq$o?)heLa&NO z1b%aR(=IyQWW%{6jrPN4q2RHN|DxxF6#MeHUY!VB$_V4{K98B5Y;DN2x zWy3w^Mw^?#zR=*3Z2dhPZ5n<>L4=Mm*X6tT7`sfjl?nXzP{*U%BV@3U=DI;9E}1Wj zDZj(pD#duzbUWsZ0>K&uW{jCt(Ps|`i*Q!ot$D6T^+LN6HT*e4&e}1?ulT+kW6ta% zzI|w_r(Wqce0=hJqq=3V@Ha*gHt8k8#=cqh2_KR;RG!2P_|JLP(G2i?OEAE_^uYbIZkJ zPcv*CTcx1qt!`=Bn)N(MMG@l^1*H-b;AVK=7&Brw5!l%ZGi!Ex{V(%lZ=r_!U$%u+ z(uq9Ois9k}Q*RF;yGe8tX4i*R%XXx8jsH)9mv|=d;{PV!4b*Kfb~%Kb(O-GHcp6SI zSE*Eg^C@=YEV^^W@sBe_b+wAus;UlCOvKkzW*;=vZWe#sZ`jsl*)%|EZQH zFb!^>Vs0wlgJ@(xWA&Z;ONt-9@tu`2YaTm~OBgN#wx-+BbnnS0xX_r@ydF+5ao-Sn z`l7gHoFRO3@qjmDGAp%@-ZQ7Zl0#lI(zqtnfkpNJ;-BEoCa%}9j)f2P~@k+DkHw~?<+h$Poew{yZaKYWk6lSEIp z8MA)CSIi81;4i$g{e^o2moBx+*(yyZ5>MS3rU9D&dL%UE)y(<9Tf$RsraABfz3-WV zPyw6Ry*!nkIn#{aOWwbpWw!4lgoCrp^}U#`vMYB&{8w*=F@2=J(3p4j5xA@8_%}EA zkq=i`YPQMu<1)X=dHWPE(|j}zxU>G z3*0sRT|cxtfIru;sP+F$AC^?CZb>>Z#(L)1v-`>ZLw2q!80SUPxvL4oMdRLu$A7$j zC(mwmB4_F7rq*qMZkVnaHrIsyMDE;cN8b$li6XG8(9?IWSx;;5kK-JUI#tRmtzR2n zA(ftmJMo*jX3+%-^!X}XIoCuVU};-!p4|wVcMr@H9X+~DQXXHMXA%zJ(~aNl0Nv-C z{rL2Zo^N)Z!F~RGa&zNTxnghRbP0SI8o+$x01x}vKqC+%8S2%x(xvBo?cs8-ODJIv^E$h@vO`F5y zy6957zV_wJTq)Z(J!_FxZkRNXR9&g$2Mwm-gdcL9xHs>s53(nf%Wzz@3hMv$ z=sz~DtE0MhI-6N)(kNeUe%ySx9p05Y`S-s(4p-AoZ@B;FM|S-d^^a>c`@Nm+`jYgz zn(3FBBIL~D<}mv*yM^~XU-`_=xtmiZrLxpAQ|TC~bZeo(vRNwZ4$I7=!&KwT6XjNy zlTH6PqR2u)d{w%3gY1D9t=j{;5Z$J+aG5E8^#3l9hNnoR6Q!GWx1658cGO&FH^J_; zlU2{@6(;*{r2Nqedk?s6*{3xt{Ceug|IBiRm8OR@3$3)P@QZGR(k29qR(El#(2c{1 zy2eWLYqe>0oSe8l!!@_B zF>8?f_pPxDaZ~%wCxf#O7)a4LBZ;#t@ch2UJUmV%x<1Q)V%nTz+;4N@1s!hLCuThb z7`y2cdvFMQFgi3xr8K&KcRJk5yP{M0{+D++XErf)PCgU0GoHq-TWkGbJYiSx=y!65 zUY?s&$-m;FJB`Ct+TR>De6E%tPW9hkYxbWcx&C$bmdg6Fd3Izu@LQ)OjWW38#P4ef z`8!p-c0u>|j^F0%jQvSXyL{<&`Pc{6%(0jJixTW&)-uFxsvOK!|#g#voApgsU z3b!A-1Do5ZT)7*f8-p_j`{w+^_MR7e9inrUY#;3;Tm5KR%>>62Ig ze6%x3V+Ag{Q7$%d#jbfDRnTsoQ^4Ccnp61oI1SEifTqwnYTq6HU+6gbQ?r&P`ZA@L z$rZA*mU}*Uw?v#yV9x*UE#ZH#i4&S6y+V<}UoU;U^$Uf%DJIeD3^Z&%NOudubW&slVCuV0Ql>=l|&c#q9jgbo1NAXX4B@!}QVh z^D75e@9bt1a*0B<)11-AKEQ*`rqUmXf)h=o4xU6L+LKV~d3E`yqepEO_Q-Ub`Glt~^e{{!8vSW-x;M zTiau$sAl^hPN6(mx7z(;Snm!bo0GM%zh9|YEq+&s8VWnoQM#Q=xQtKxez2@|A>+2$ zH$AD|uihlx*x#7@3t67|L5AZ};hR?qy!OhspC!3;+h*z!jQ_Z^*%y}KV!Z+rYwaR4 zI+#bHIT8IAjTvLirpxU9ul>?Ayh4{v{L)?xUwt|&%iWLT$`F?B1_{gh_!C7|eR_wj zL;IJ~ibxwnxHx`w?m`9PudvI$QQ5O4at-t@Wd^*XowI%2}})M?jg zTD88jldFmtCy@C+3or(c{#Y@hW^6C23DxoDw;=1*$a$+j0XWfn;y4md&z$`i*6GQC#)jxk(U=d<6+B7eJuUY<~o|OFF0N1MErs? zWIO=ZRwAKqzeDKT3fpZrTduRYcP7teZ}eFmIBikW2aQf&v~`Ta%HBVR zO~_vqh;wq%V|TZVrvG1@9QpBxo$i3q+gE&7qu)2A${EgoJ!01UMb3UlL;F#yCodj9 zI`#byXgF(zTSv?pG-7?f+KKWEOTGD>Tp?Q4Iy*-pxah$|uRYD{-Cvn+C@y+JN`G}~ zMd#dV-6L^?HG*351RXWAxQ?A&&<=BZzJu`pZJ|HJm(La z1g>Mh$A_L7-K$-8MU@}Ru_SfF`o#&W`>{K}O@7?@y(E`T$IX6)<%Hp1ecY~^E~|-4y?T29MMdhF|Uc z#YRkZ2v>e^AFB19%dC zW!BlwWv9*x4+*@DOD0_0&kq*xb`7bS{Na$0z~rax$>fE5*{t-~jko6@&3DHXe}mH| z%|A5ImpuEUb4Cp|RsLa~YjxU8lV&$3j@F(1Z~rlP!8)3bvxamZ&qWP8ZB9w`<-aR& zjz*dSkG$RdjnCReTJ6Z556|xiSBNaZG%&a!mTYm>eD{d5JaWnue@tRppEDyLd!w^t z{@w0*Bc|_ao@{5td{1CXB6QV(q=a2Cm(kRS zpaV^@c`w*W@?DSb`PYe5oIJ87bbP$z#55hb*ag!Azy23LT#X^A3$5pe;jxnmUFo^8 zCS=pe22amhp_f*A=HsG_zZEj{?7?$YcjKb-Yc$!_7tHmi6xJa$w5K>Xq5RQ-F*h!R z27Znt3lcNU;|rVF&==;Zd2nVIUs*CW^CMq$?2DhL#PF0obd23zTOGX_*N@>H=58A^Ke!Na0=19?PyZnRxZ_v^iP zBkFwaE>@8IHX_zt3VJ$UGA9Ck(VhX9Oo+!99{YT8u}UQoJUfkk;j+>S>(f6?E03?9 zr|4y~hA=!Su9$B;zJ%C?SL`vW#oA+0+)2S zT+MRv&=+s+--3&_MrgP1Ha6Sv>yL6YG99g$Yu=hLC12AUe(k4&;r=RUQa!}hZpG^a9n+7Pyrn+s$(~!ZzPM;Wi1_Me&~H)I8zs5C^Ow0UzaOKa0b+ETJ1b6}JG3Q9V+Ss( z(9>lb#5TEAwRe)sslQD5)HI4mXlMc}*5qWFgU73IxY&(1+db0@bEenO|qf z>qno_Xo*X9{ASI%ZOq~V13pjkJM5m>j^9!S4Q*vqFA|V%(b1!Ak~Hpd2c)uIKIvM= zd~FM8E85w~%kU_`q)x*Dk_asM)A&BM9_6N?nrXPC1 zeA#Vl6=>baH+&pmTBr48D)kmB8ixJ5X0EUELFgW-sIwOj=#7iIQO^lu0?yajGz*s! zc5#oy^Cx)DHWL*spne{^;LR0R%HNb{)^jZPR-ke=tuHFuZ>U(aSgXmsb2r@gL1^H1 zB&vyvs1yq!3I8}Mdo!2L`uA^mq=^oE8esB<`l4b}1_WATP=_g-n{_?0fRirn0{Z#i4p}bN$i}9|lu%!IkOJ8i z>C5EF9cXqUh^-iCfA0A2*bAp;uls$b<)yR+v_`muQp!KJelxa2!n`!Ns0TBUbqq9V zGU9gx8X3{}%iNf_;a&}G+G^!oQtx;Sw5oM--d=N?tnY9I7u{Eri;n_LOZ@tGpb>`O z7Filh-n`~~1xv#kCJzUiX=u2Ig8Y}!w1(WVKR-yBrqX6KNku89*M9=dsf@n;9{W`E zeviFT*U1y?F&8uWE;*~rPEL!i=Sk}^<7wHRoF4OT0b+25LH!Ujik~uPX8f$+G3B%P z>b-0fr&#RyCDeSL#ka_F^NMMn)tB(^diHi!U#x;HtCgr3g)pe={5nkQMX ziH`6!iGAU3o~)lEzWhL1-C(mVf`VxtY}f4hla0RZdM#TkGNA<}nfSA?xrv7E=J?rE zxc?=w(4M|eX5w<9$>!A?Imry>6s})%ijpOST42xQW+xi4LwFT}?!=bXzcK1$sgNcE@B&#+!V+~Z0C}jmR$R<6P8B0Q)jy_t-t2-pH_9yMvDhLPHv`2 zBbawAs1<+Iq4nEK>h*pN4b4r&mMMk#im+n!feBS<4$rw(jjmtsW2MLH5qa^e716YN zA1~UHEl4Si)+s`IlYQ9NUknY!pF8qG<4PSoEVP+WBTFz-^K+{)mKA<`4O-}E0D0jC3H_Fr7=)O8im7afxtNFERwu+x{_s>!D`bE5bL~m8 zm7>aeGsHB=OJ#LOBNefvOq1)~=9OR5U_>0!80@%Y&3XJm{p@dO0CSctV?xY4{Cc{F zn9X?^#lPpJADSiy<^1vODHn2FLsQL-Fq~iZ8h<{z-1!WqbUsSvS_X5bsxRD(mC*im zOn7WmMmrskey!uF-emtoD-3J#@^TmaUe8A!URWM1Y@-9RhS?>Zt6`?QkGFeTh5oxK zP%zAt&#yWOGtKgos48KJ@8tJ+0-qbh!p+VCzRmgt$dH0^9g!(w zwiTtEKlYoOGJni$@ZY0hAg~_nSzg^i)%VH|! z|H#5f)dQvcV|Fu58ppHSv-I9_HOiUcA9JfRQVFs$X}&5((i0=h-;PN15Dq93x5;J>R8L8E$DJk!b964(^(V z#eG@)^$}_>=193NC6e{Mr@JPdtzeF`U5H*nK2TnO^BL)~!u)$b+iEU&vlx%?e4V9P`#%M&^;4sH2Mq4Cm-%NwV^v zKPzVd)#@O?IZ*i0AKaD<2r6P1!!L^}UaoxhQA;acYe+lJZ@@URuhm4Po@z0lCzNJ1 zTNTR+HS1QhJ=PcDX?)h4K`HhI!6^Bwg8#}I5p_@74I1f5!r!>4dSW)`oVnif@juo> zLF<0k4!BT?;G%Y|bKS0#uTTp2v6&mO78K7X;CUtgfJi$5O~Wj zPH9?LE4CjrEPa3Z-s#&@7XMj8|F^A|q&v0QlY zvw$#O{NTsZ2zb$hAIpUYKUeYVf8m24OXHo2CZa5%zwq~#FMRN0`Q=x|apmy) z!Y4nL#tWbPSS~#InSx*c3xC~fX@rzEI~DqWZke;#i;kt`yjI$t1P`w|_Wi_mjrdg@ z9n^Z^(9+T-O?kE>0)DnT_XOYj1&)_Hew@asr5nx8c_j3rnO#dGI?xLq0XfT1=kbz1 zJ)vtT^&R`Cde8Mgt|xR&!i3Hv4ZYyN`APpJe{5qr9bbK#aZph8$2yhm^iqBST0G7- z$9=_(|K%Ha)&tXUZFOg<$N=Zucm$K$QqHr~^%Z?yPeM7fxgtxZ{~Vhr9ILxbDrdZv ze4GBi>=k-~Dwu{f=yIVIO!>-GlT$+Tg{gxwma&Ia!35^M`tTH=c$wXKywf-*>Gv|VK}BgLv1_v z`}Uk$e17j54J~@y!^E4rwwY3k`igNhmi7t#cF=^$`U$3syb_sR8a&6)MgDZ>0Oeb$NH6sq$~?Wp~xh=}zu@bY@s(q?oW zUlsFR9ba)zPmg(6$Co|VFS+dhA+a zcMa)K`}oG)W(#_r2zJmN^Wk&XW$XE}M;~F=Ej|8P=FL8Kgp(@K@-*!8md~hFq;heu7v$4-_N;mc0GYM0I zy@|b>`BK(O*Sk;0UIRMz=-9L4fPO=Zwe8c@3|-(WV?KY)_haHG3w)!zW=135TZy%o z`p)D}&-tdJ19}(j*1vbJqW#-<>DaSvV!^$>JlRZ8Q(uXhm4aU}-7fi3B(}cf>z2=) tZ@|v5d5c#NJgV<2W*T<&B}+VzCin(#AM5B#ZM+SAc@nqh4{kp6{{U13*VzC7 diff --git a/examples/nextjs/app/path/route.ts b/examples/nextjs/app/path/route.ts index 355b420..50bacdd 100644 --- a/examples/nextjs/app/path/route.ts +++ b/examples/nextjs/app/path/route.ts @@ -1,19 +1,75 @@ import { serve } from '@upstash/workflow/nextjs' +import * as Agents from '@upstash/workflow/agents' +import * as mathjs from 'mathjs' +import { tool } from 'ai' +import { z } from 'zod' const someWork = (input: string) => { return `processed '${JSON.stringify(input)}'` } -export const { POST } = serve(async (context) => { - const input = context.requestPayload - const result1 = await context.run('step1', async () => { - const output = someWork(input) - console.log('step 1 input', input, 'output', output) - return output - }) - - await context.run('step2', async () => { - const output = someWork(result1) - console.log('step 2 input', result1, 'output', output) - }) -}) \ No newline at end of file +export const { POST } = serve<{ prompt: string }>( + async (context) => { + const prompt = await context.run('get prompt', () => { + return context.requestPayload.prompt + }) + + const openai = Agents.createWorkflowOpenAI(context) + const model = openai('gpt-3.5-turbo') + + const manager = new Agents.ManagerAgent({ + model, + maxSteps: 3, + agents: [ + new Agents.Agent({ + tools: {}, + maxSteps: 2, + background: + 'you are a content creator. make the information provided to you more understandable to the general public', + name: 'writer', + }), + new Agents.Agent({ + tools: { + calculate: Agents.workflowTool({ + context, + params: { + description: + 'A tool for evaluating mathematical expressions. ' + + 'Example expressions: ' + + "'1.2 * (2 + 4.5)', '12.7 cm to inch', 'sin(45 deg) ^ 2'.", + parameters: z.object({ expression: z.string() }), + // @ts-expect-error can't resolve execute + execute: async ({ expression }) => mathjs.evaluate(expression), + }, + }), + }, + maxSteps: 2, + background: 'you are a mathematician', + name: 'mathematician', + }), + ], + }) + + const response = await manager.call({ model, prompt }) + // const result2 = await manager.call({ model, prompt2 }) + + // const agent = new Agents.Agent({ + // tools: {}, + // maxSteps: 2, + // background: "you are a content creator. make the information provided to you more understandable to the general public", + // name: "writer" + // }) + + // agent.call({model, prompt}) + + await context.run('return response', () => { + const text = response.text + console.log('text:', text) + return text + }) + }, + { + retries: 0, + verbose: true, + }, +) diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index a28c521..2bfa410 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -11,13 +11,15 @@ "dependencies": { "@ai-sdk/openai": "^1.0.8", "@upstash/qstash": "^2.7.12", - "@upstash/workflow": "latest", + "@upstash/workflow": "file:../../dist", "ai": "^4.0.16", "clsx": "^2.1.1", + "mathjs": "^14.0.1", "next": "14.2.4", "react": "^18.3.1", "react-dom": "^18.3.1", - "tailwind-merge": "^2.5.2" + "tailwind-merge": "^2.5.2", + "zod": "^3.24.1" }, "devDependencies": { "@types/node": "^20.16.5", diff --git a/package.json b/package.json index 8b59440..b20b540 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,10 @@ "./express": { "import": "./express.mjs", "require": "./express.js" + }, + "./agents": { + "import": "./agents.mjs", + "require": "./agents.js" } }, "scripts": { @@ -101,7 +105,10 @@ "typescript-eslint": "^8.18.0" }, "dependencies": { - "@upstash/qstash": "^2.7.20" + "@ai-sdk/openai": "^1.0.15", + "@upstash/qstash": "^2.7.20", + "ai": "^4.0.30", + "zod": "^3.24.1" }, "directories": { "example": "examples" diff --git a/src/agents/adapters.ts b/src/agents/adapters.ts new file mode 100644 index 0000000..e059a7a --- /dev/null +++ b/src/agents/adapters.ts @@ -0,0 +1,72 @@ +/** + * this file contains adapters which convert tools and models + * to workflow tools and models. + */ +import { createOpenAI } from "@ai-sdk/openai"; +import { HTTPMethods } from "@upstash/qstash"; +import { WorkflowContext } from "../context"; +import { tool } from "ai"; + +export const createWorkflowOpenAI = (context: WorkflowContext) => { + return createOpenAI({ + compatibility: "strict", + fetch: async (input, init) => { + try { + // Prepare headers from init.headers + const headers = init?.headers + ? Object.fromEntries(new Headers(init.headers).entries()) + : {}; + + // Prepare body from init.body + const body = init?.body ? JSON.parse(init.body as string) : undefined; + + // Make network call + const responseInfo = await context.call("call OpenAI", { + url: input.toString(), + method: init?.method as HTTPMethods, + headers, + body, + }); + + // Construct headers for the response + const responseHeaders = new Headers( + Object.entries(responseInfo.header).reduce( + (acc, [key, values]) => { + acc[key] = values.join(", "); + return acc; + }, + {} as Record + ) + ); + + // Return the constructed response + return new Response(JSON.stringify(responseInfo.body), { + status: responseInfo.status, + headers: responseHeaders, + }); + } catch (error) { + if (error instanceof Error && error.name === "WorkflowAbort") { + throw error; + } else { + console.error("Error in fetch implementation:", error); + throw error; // Rethrow error for further handling + } + } + }, + }); +}; + +export const workflowTool = ({ + context, + params, +}: { + context: WorkflowContext; + params: Parameters[0]; +}) => { + const { execute, ...rest } = params; + return tool({ + // @ts-expect-error can't resolve execute + execute: (params: unknown) => context.run("run tool", () => execute(params)), + ...rest, + }); +}; diff --git a/src/agents/agent.ts b/src/agents/agent.ts new file mode 100644 index 0000000..d261f33 --- /dev/null +++ b/src/agents/agent.ts @@ -0,0 +1,98 @@ +import { CoreTool, generateText, tool, ToolExecutionError } from "ai"; +import { z } from "zod"; + +type GenerateTextParams = Parameters[0]; +export type Model = GenerateTextParams["model"]; +export type AgentParameters = { + maxSteps: number; + background: string; + tools: Record; + name: string; +}; + +export class Agent { + public readonly name: AgentParameters["name"]; + public readonly tools: Required; + public readonly maxSteps: AgentParameters["maxSteps"]; + public readonly background: AgentParameters["background"]; + + constructor({ tools, maxSteps, background, name }: AgentParameters) { + this.name = name; + this.tools = tools ?? {}; + this.maxSteps = maxSteps; + this.background = background; + } + + public async call({ prompt, model }: { prompt: string; model: Model }) { + try { + return await generateText({ + model, + tools: this.tools, + maxSteps: this.maxSteps, + system: this.background, + prompt, + }); + } catch (error) { + if (error instanceof ToolExecutionError) { + if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") { + throw error.cause; + } else if ( + error.cause instanceof ToolExecutionError && + error.cause.cause instanceof Error && + error.cause.cause.name === "WorkflowAbort" + ) { + throw error.cause.cause; + } else { + throw error; + } + } else { + throw error; + } + } + } + + public asTool({ model }: { model: Model }): CoreTool { + const toolDescriptions = Object.values(this.tools) + // @ts-expect-error description exists but can't be resolved + .map((tool) => tool.description) + .join("\n"); + return tool({ + parameters: z.object({ prompt: z.string() }), + execute: async ({ prompt }) => { + return await this.call({ prompt, model }); + }, + description: + `An AI Agent with the following background: ${this.background}` + + `Has access to the following tools: ${toolDescriptions}`, + }); + } +} + +type ManagerAgentParameters = { + agents: Agent[]; + model: Model; +} & Pick, "name" | "background"> & + Pick; + +const MANAGER_AGENT_PROMPT = `You are an AI agent who orchestrates other AI Agents. +These other agents have tools available to them. +Given a prompt, utilize these agents to address requests.`; + +export class ManagerAgent extends Agent { + public agents: ManagerAgentParameters["agents"]; + constructor({ + maxSteps, + background = MANAGER_AGENT_PROMPT, + agents, + model, + name = "manager llm", + }: ManagerAgentParameters) { + super({ + background, + maxSteps, + tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool({ model })])), + name, + }); + this.agents = agents; + } +} diff --git a/src/agents/index.ts b/src/agents/index.ts new file mode 100644 index 0000000..642cae8 --- /dev/null +++ b/src/agents/index.ts @@ -0,0 +1,2 @@ +export { workflowTool, createWorkflowOpenAI } from "./adapters"; +export { Agent, ManagerAgent } from "./agent"; diff --git a/tsup.config.ts b/tsup.config.ts index 3e5637b..84e8bdb 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -11,6 +11,7 @@ export default defineConfig({ cloudflare: "./platforms/cloudflare.ts", astro: "./platforms/astro.ts", express: "./platforms/express.ts", + agents: "./src/agents/index.ts", }, format: ["cjs", "esm"], clean: true, From a920a384749cf3ad29cf52fe42f193928356e4fd Mon Sep 17 00:00:00 2001 From: CahidArda Date: Fri, 10 Jan 2025 11:48:56 +0300 Subject: [PATCH 02/16] feat: add agents namespace to context --- examples/nextjs/app/sleep/route.ts | 72 +++++++++++++++++++++--------- src/agents/adapters.ts | 37 ++++++++++----- src/agents/agent.ts | 24 +++++++--- src/agents/index.ts | 65 ++++++++++++++++++++++++++- src/context/context.ts | 7 +++ 5 files changed, 165 insertions(+), 40 deletions(-) diff --git a/examples/nextjs/app/sleep/route.ts b/examples/nextjs/app/sleep/route.ts index 5890e74..c16543c 100644 --- a/examples/nextjs/app/sleep/route.ts +++ b/examples/nextjs/app/sleep/route.ts @@ -1,29 +1,57 @@ import { serve } from '@upstash/workflow/nextjs' +import * as mathjs from 'mathjs' +import { z } from 'zod' +import { tool } from 'ai' -const someWork = (input: string) => { - return `processed '${JSON.stringify(input)}'` -} +export const { POST } = serve<{ prompt: string }>( + async (context) => { + const prompt = await context.run('get prompt', () => { + return context.requestPayload.prompt + }) -export const { POST } = serve(async (context) => { - const input = context.requestPayload - const result1 = await context.run('step1', async () => { - const output = someWork(input) - console.log('step 1 input', input, 'output', output) - return output - }) + const openai = context.agents.getOpenai() + const model = openai('gpt-3.5-turbo') - await context.sleepUntil('sleep1', Date.now() / 1000 + 3) + const writerAgent = context.agents.agent({ + model, + tools: {}, + maxSteps: 2, + background: + 'you are a content creator. make the information provided to you more understandable to the general public', + name: 'writer', + }) - const result2 = await context.run('step2', async () => { - const output = someWork(result1) - console.log('step 2 input', result1, 'output', output) - return output - }) + const mathAgent = context.agents.agent({ + model, + tools: { + calculate: tool({ + description: + 'A tool for evaluating mathematical expressions. ' + + 'Example expressions: ' + + "'1.2 * (2 + 4.5)', '12.7 cm to inch', 'sin(45 deg) ^ 2'.", + parameters: z.object({ expression: z.string() }), + execute: async ({ expression }) => mathjs.evaluate(expression), + }), + }, + maxSteps: 2, + background: 'you are a mathematician', + name: 'mathematician', + }) - await context.sleep('sleep2', 2) + const response = await context.agents.task({ + agents: [writerAgent, mathAgent], + prompt, + maxSteps: 3, + model, + }) - await context.run('step3', async () => { - const output = someWork(result2) - console.log('step 3 input', result2, 'output', output) - }) -}) + await context.run('return response', () => { + console.log('response:', response) + return response + }) + }, + { + retries: 0, + verbose: true, + }, +) diff --git a/src/agents/adapters.ts b/src/agents/adapters.ts index e059a7a..127d9e7 100644 --- a/src/agents/adapters.ts +++ b/src/agents/adapters.ts @@ -6,6 +6,11 @@ import { createOpenAI } from "@ai-sdk/openai"; import { HTTPMethods } from "@upstash/qstash"; import { WorkflowContext } from "../context"; import { tool } from "ai"; +import { AgentParameters } from "./agent"; + +export type ToolParams = Parameters[0]; + +export const AGENT_NAME_HEADER = "upstash-agent-name"; export const createWorkflowOpenAI = (context: WorkflowContext) => { return createOpenAI({ @@ -20,8 +25,12 @@ export const createWorkflowOpenAI = (context: WorkflowContext) => { // Prepare body from init.body const body = init?.body ? JSON.parse(init.body as string) : undefined; + // create step name + const agentName = headers[AGENT_NAME_HEADER] as string | undefined; + const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent"; + // Make network call - const responseInfo = await context.call("call OpenAI", { + const responseInfo = await context.call(stepName, { url: input.toString(), method: init?.method as HTTPMethods, headers, @@ -56,17 +65,25 @@ export const createWorkflowOpenAI = (context: WorkflowContext) => { }); }; -export const workflowTool = ({ +export const wrapTools = ({ context, - params, + tools, }: { context: WorkflowContext; - params: Parameters[0]; + tools: AgentParameters["tools"]; }) => { - const { execute, ...rest } = params; - return tool({ - // @ts-expect-error can't resolve execute - execute: (params: unknown) => context.run("run tool", () => execute(params)), - ...rest, - }); + return Object.fromEntries( + Object.entries(tools).map((toolInfo) => { + const [toolName, tool] = toolInfo; + const execute = tool.execute; + if (execute) { + const wrappedExecute = (...params: Parameters) => { + return context.run(`Run tool ${toolName}`, () => execute(...params)); + }; + tool.execute = wrappedExecute; + } + + return [toolName, tool]; + }) + ); }; diff --git a/src/agents/agent.ts b/src/agents/agent.ts index d261f33..48e4e8a 100644 --- a/src/agents/agent.ts +++ b/src/agents/agent.ts @@ -1,5 +1,6 @@ import { CoreTool, generateText, tool, ToolExecutionError } from "ai"; import { z } from "zod"; +import { AGENT_NAME_HEADER } from "./adapters"; type GenerateTextParams = Parameters[0]; export type Model = GenerateTextParams["model"]; @@ -8,6 +9,7 @@ export type AgentParameters = { background: string; tools: Record; name: string; + model: Model; }; export class Agent { @@ -15,22 +17,27 @@ export class Agent { public readonly tools: Required; public readonly maxSteps: AgentParameters["maxSteps"]; public readonly background: AgentParameters["background"]; + public readonly model: AgentParameters["model"]; - constructor({ tools, maxSteps, background, name }: AgentParameters) { + constructor({ tools, maxSteps, background, name, model }: AgentParameters) { this.name = name; this.tools = tools ?? {}; this.maxSteps = maxSteps; this.background = background; + this.model = model; } - public async call({ prompt, model }: { prompt: string; model: Model }) { + public async call({ prompt }: { prompt: string }) { try { return await generateText({ - model, + model: this.model, tools: this.tools, maxSteps: this.maxSteps, system: this.background, prompt, + headers: { + [AGENT_NAME_HEADER]: this.name, + }, }); } catch (error) { if (error instanceof ToolExecutionError) { @@ -51,7 +58,7 @@ export class Agent { } } - public asTool({ model }: { model: Model }): CoreTool { + public asTool(): CoreTool { const toolDescriptions = Object.values(this.tools) // @ts-expect-error description exists but can't be resolved .map((tool) => tool.description) @@ -59,7 +66,7 @@ export class Agent { return tool({ parameters: z.object({ prompt: z.string() }), execute: async ({ prompt }) => { - return await this.call({ prompt, model }); + return await this.call({ prompt }); }, description: `An AI Agent with the following background: ${this.background}` + @@ -76,7 +83,9 @@ type ManagerAgentParameters = { const MANAGER_AGENT_PROMPT = `You are an AI agent who orchestrates other AI Agents. These other agents have tools available to them. -Given a prompt, utilize these agents to address requests.`; +Given a prompt, utilize these agents to address requests. +Don't always call all the agents provided to you at the same time. You can call one and use it's response to call another. +`; export class ManagerAgent extends Agent { public agents: ManagerAgentParameters["agents"]; @@ -90,8 +99,9 @@ export class ManagerAgent extends Agent { super({ background, maxSteps, - tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool({ model })])), + tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])), name, + model, }); this.agents = agents; } diff --git a/src/agents/index.ts b/src/agents/index.ts index 642cae8..4885ee2 100644 --- a/src/agents/index.ts +++ b/src/agents/index.ts @@ -1,2 +1,65 @@ -export { workflowTool, createWorkflowOpenAI } from "./adapters"; +import { WorkflowContext } from "../context"; +import { createWorkflowOpenAI, wrapTools } from "./adapters"; +import { Agent, AgentParameters, ManagerAgent, Model } from "./agent"; + +export { createWorkflowOpenAI } from "./adapters"; export { Agent, ManagerAgent } from "./agent"; + +type TaskParams = { + prompt: string; +}; +type SingleAgentTaskParams = TaskParams & { + agent: Agent; +}; +type MultiAgentTaskParams = TaskParams & { + agents: Agent[]; + maxSteps: number; + model: Model; + background?: string; +}; + +export class WorkflowAgents { + private context: WorkflowContext; + constructor({ context }: { context: WorkflowContext }) { + this.context = context; + } + + public agent(params: AgentParameters) { + // wrap tools of agent with context.run + const wrappedTools = wrapTools({ context: this.context, tools: params.tools }); + + return new Agent({ + ...params, + tools: wrappedTools, + }); + } + + public async task(params: SingleAgentTaskParams): Promise; + public async task(params: MultiAgentTaskParams): Promise; + public async task(params: SingleAgentTaskParams | MultiAgentTaskParams): Promise { + const { prompt, ...otherParams } = params; + if ("agent" in otherParams) { + const agent = otherParams.agent; + const result = await agent.call({ + prompt, + }); + return result.text; + } else { + const { agents, maxSteps, model, background } = otherParams; + const managerAgent = new ManagerAgent({ + model, + maxSteps, + agents, + name: "manager llm", + background, + }); + + const result = await managerAgent.call({ prompt }); + return result.text; + } + } + + public getOpenai() { + return createWorkflowOpenAI(this.context); + } +} diff --git a/src/context/context.ts b/src/context/context.ts index 31b8349..418d2e9 100644 --- a/src/context/context.ts +++ b/src/context/context.ts @@ -23,6 +23,7 @@ import { DEFAULT_RETRIES } from "../constants"; import { WorkflowAbort } from "../error"; import type { Duration } from "../types"; import { WorkflowApi } from "./api"; +import { WorkflowAgents } from "../agents"; /** * Upstash Workflow context @@ -467,4 +468,10 @@ export class WorkflowContext { context: this, }); } + + public get agents() { + return new WorkflowAgents({ + context: this, + }); + } } From c4595aec9cebb69bf25a5d4d7a6bf65cb8c0a5dd Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 13 Jan 2025 12:08:52 +0300 Subject: [PATCH 03/16] feat: add support for langchain tools --- bun.lockb | Bin 434456 -> 449076 bytes package.json | 1 + src/agents/adapters.ts | 28 ++++++++++++++++++++++------ src/agents/agent.ts | 16 ++++------------ src/agents/index.ts | 5 +++-- src/agents/types.ts | 17 +++++++++++++++++ src/workflow-parser.ts | 2 ++ src/workflow-requests.test.ts | 4 ++-- 8 files changed, 51 insertions(+), 22 deletions(-) create mode 100644 src/agents/types.ts diff --git a/bun.lockb b/bun.lockb index 286e7082b2c7879eddaafeff0f9dba5c192466e4..24665ff6c6dd93aee5164dcd7f6bc3af239c6181 100755 GIT binary patch delta 93870 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%0AEvz$<0tS&f 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⁡$a``hXe36Oeg=zFh=k89*v_mWQSbP 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 delta 85507 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%0AKSrOs$_mgdt3P%YJPqu>!Y{T zll+bl?-6(OR1ccCr%8(40YBNSeebBS0*?AN=RGyH0I`SO(+{?6BbMa)Db)%0SdK@Ho8`UlDffcJHuRo~E=XA!&zOZx#D|oX<57H< z=am8R-j*bHa&#jRozpUc|I*H`PA7IK7y zC4YaZ2)`{#{vHlRQq;T|GO3WGxUKp_b*vEeopeK|_2{XENoBG(*!Wpmn5=2ECFXAr zRjtC5{MCngyZvyc*Up6ZWA(>ah=_IbU^Pp^N_L5;h2{TPoh(ewPg1suhYloVgNfgR_H8!mD(LMwdKNCg$e?@xwCrt@X9&sv#L(k{ml_)WI< zLgZIztDmYt`2FH8R!G)uf9tE!ciXpq_kHHxO_D~`bI&a5V^K#Ym)lq}hdF{>-eRd4 z=BQyC{8WvLa0I203Dfb9Mg5A<#S2Tia*md2a52a4F3p}>RD0Sgs92dFIwrJ|?2abT2iluw2hceXt+0s9+pWc?Fk{=g; zJYOkUE3E$03f+=is=u|UHR8D=Dsn_zsQ#ZNPF*a|8q`d}Xj}qtX}td4=oTK^dBoRr zS%&BLlDI>t$X)R)S#}JYm#5d3B$ZpJ1ebPX3UhgB=H_n@e|K8yd>R(9IHe1}b) zL_O><8Zx{)_e@z^eX{pH(U3k~m=_T7C1hN>d^gN;qx#0FxPLC)y1l< zAAcJ@yYbTdrJsmjo;6?<=k22EhBJg!L_?Mns`>Zb0;7&i_O|9jBDGo9Ma?CQunvaC z(agoOygC<@LrY;1nSpxaBJJ(1OYo$M-G}t^wuYCXm(nVRxTr_?wSDiRQkJC+O?FYG z#hmS;V#PFzU`JVpZ&rGlmW^&t`c}+1roIaeD@1=xM!MazvPs=8ST%}pc$rT@8+|au z#pr+e)WZlzHnS5>H(PYDwBW1d7+Tk{!jwhk?2+3mEPe03nB|Z34~CWB>}pVX(tFLW zrj}=N>Fcm+15n$sn;UkzG@A!^wBd!G^yLq(G#71H<51#*5yskR%6`17RXgu{b;2#* z^je$GqRBc#CfOCPDzX9^KcgYb;^QqEhlM80az{hbL#IFGsuIu$yMsmsG@h%+qt?Bs zEN8m1aAiyR9+&jEe4n%H%=&BF-p9rG8INZQbwd2+Pa&@#W$)ly>-)_sZ~M& zE)uH8uql^(uTMo6#U$#Tel`q)<^69Vd*((ofj* zlf3q}9w}6#%8onc>Pa=O;;8+pnrZ32>QWWX(gvnbud2`hen_DTRHXX6J6dI|MsJFKs*Y82Bz#(wwyo|6(}vui zsxv$XrBt4^2tWDNiaZ>bA(is0L3sL_Afu{P!!g`uI% zEf;CiS%>$`G-RVzpj4&#*j%J}Vx=YUe551Tb~%+wQ#iF&;WH!;ptiTRXev+2l9#MY%AxrqQYAqUa_I0E-Wr6uYVoT-` zRpUo==iT`-Jn2YWmg~+Br}iEr9kNYiMRdbmMMe?Z*YhGju|~u8*j>$tBDPu{>IBze zO+55b^zyY%3u>;scUP-C+B(m4;v!3@R39hKY1!+V6&FSeNqG+s<*Y+k!#q@29mb1S zBuX^>ZP%OEdGtu`9Z5f>0Zb$enb;@1STuKARu}F+Q9txl-ff~kN9~+x#2*-Rvu;FN z8;fx!=AcmW#E;q5F6MCre#G`+F?XoH{u|#_>C^+#Vg5MWIgtTeMwauVa(xJIIx3Zx za&5j};H8?&>jO4>sjl)fa^u;f0Qy{!`QCahN9QROu{i%=d8CCr$oR;k!8_1)PRXEa zoX=b&*e%s~Ik=-0NNyHqP*3X8O*dyy;q@rh188cq*4cL#i+!_6G+CBP+5Lfw%o?fP zvyW?1uAYo~MydXlL5;<)^D!Ed`a@l_xu5!N^CmP%p6*xeuE(rZlvg2TL8DK$T?d!J4&AbidR4KC}gH@KfD=D@h6_nt50zl zX4sdS{BBel8hgHEp1sDUIHmMm7FD2u6cTTwkty}*^8(99+ULDyO2wP}Ey$u;HXu=} zvm{P#z=@AJ3~If9Lqo@L`7O`TZ^Y$}GjU`iEMFTTDM){RwXiXTQII#^NP+G+e5T#C z4u$2H|FWAyqlCZmY)Y=G`l~ceNLhU}r7_l+GV;=K>+c89G}fQZ{Z)i$_@g0d-=42z zc-HV5^3iOxzA>=KpDstz_~;!l^|s)j7FXL7db(WYP#T4J`Sd9!b%Nt9=H zjaFj>uL?vveE(H%s2Mf<_4Ixls0Kw-D_^8n(tRVE1NBnuWMt6EcCk?N+|9GyHkJ)E z`hq!BWHU%>WE=~>>`jMxKnsXK=0Y>tmM zx%9f~fBfKsj05W=Xc^XqlrFhc6dJbvxm4%o_~eZOv&F}vJbE01LJQvL7*T>f(F`P# z^3SHV4C-TZhr_uQmrS^vE!8nJMfVr7_u_~6vamRrM+LMXRPMFZ$NXA}mf+_mgduGu z@a&j9^A--`)`?cuRFZLjMt%!_wgsmiq%gcCDV&{GPmkmFl(4STR;MxYL@6xGt9rCV zGktz_p`|0T*u6Nt%sajwlwdEb4If5%^Z!Dx}`Eb~Ja(T1a0K^(ds;wjpm@3mW?|_Yz&bGSsL>SgekvT1KHM z!`D>LgmOiit*%6U$s6IM^?me?A)!vagnIksosc30GA|QL_YDm9-cb8BlX&mV7 zZ12dI!%Ui^s8!q2dET2gew%+q_L~Hw&77l(sx%!4W@b^9s{_@T>@6WJ`^nxC(p$Nm|AnlkF_POk(geaHk8PeeY2yIxwua`CwX(W|-{gN8tZ8sd$g?A%Cwogs(@6G~ zkmkZIq2}T@*;_)IMhrJxWPZFjtbOI+sTcMnrEGU)wGzM1WN!&+ez_%dRYFhpmXM~A z>@6Y9gFo$#CNEg?c z#Yoky^e^}7%-BvVqvOfUyQ_@8Qu}@Rg~Ov-*BPvJO6`?S9^vXkCr5kdY;N|*I_x{g zq&yc(U1Wo-4Gy$DUROXH;qD)d{& zN$1o?dh+&f$k4~7(tA1QHfCym%Nr2G4P)b-L;rCK$gSlkF*JVTG*J0>anv!N(sm^) z#f{qNC=@l5MX&m+`7T^t+#BgX$ZcT}7^hS<85R}sBPL_&F0 zpc}QCtAf4+xp{QZrEq=Yt()~cim$D+~P(75t^sedYWA2|#}Lpy5JQ=taMa*(nDHQCg*3EkYU zM|kkil6rG zTDc}IP&aNlUdKhA{b_mpW0!!yCY5n9_VXXBsz(Ime1Jz;=KcHiUFoZ->^-UEFYh0E zep-0`QB}o?Mr3t;1fLOg>hC5erpl{cnDC?p^Kz)2XxLWwQh$r)*RyQYeb{xv@+3VC zul{`c-YMR~Cey#x8}Jyo9;d)aUUW zYn$$>`}3`nL~S%0CoWWL!jQ}N+tvQ9gdA-cjiq2swNf@dX44&9Q(fgcY&<^XAmxuT zrJH6v9xnGJ3?K7xkzuxsTZ^l=E;#ZextL)XrZc{lUKGdnU7vU3=t>!O62gO>yKVVR$tN?E;bmr@S7C@nQL<`4SYzZ2JRodLoYWi zs5*;Y7!R~aLpwBP{kwfpbrx4P9&q`q*U(O$ZL3|3I;57P=Q5Vl!lV5iSvAXj)AC7@ ze}E%vNO_LUWKxgL={J1+pgOPWJ=N0|)$4reG#4YUeCd86j~Xz*;aB}m9(|EA|Bp?c z>wa^_edJowKJnt#8O~Xwz1>*ZN-KJ}BBfXNE;rw1iRH;N{m_N80n^Z3~@xOxqhy$%6+vXZDPPi$2Tsi+H~vErB&Cq?Rq5kO?2>D z!LuVAWmJuQ+~{?VbTmj@xX&>mzn8o8E19?*z}ofm@>5c``=qcfVV!=t zleGcl8jkHBGud`4Om}TyRiAF!#45dgO&1$4FBeFuZdz(da>n$X)7c8A_qVgMPT$qa zDl^@@5f})+TUiySubcy9)f{Hkm|ob%8nRt$2AdzhKw?sUQHgGHeqKpYeojtm(e#St iY@eooYGhTJ-nxR#Y`RzztJU;79juGD?_R-HX$Sxf!=3g3 diff --git a/package.json b/package.json index b20b540..1493ca3 100644 --- a/package.json +++ b/package.json @@ -108,6 +108,7 @@ "@ai-sdk/openai": "^1.0.15", "@upstash/qstash": "^2.7.20", "ai": "^4.0.30", + "langchain": "^0.3.11", "zod": "^3.24.1" }, "directories": { diff --git a/src/agents/adapters.ts b/src/agents/adapters.ts index 127d9e7..f574079 100644 --- a/src/agents/adapters.ts +++ b/src/agents/adapters.ts @@ -6,7 +6,7 @@ import { createOpenAI } from "@ai-sdk/openai"; import { HTTPMethods } from "@upstash/qstash"; import { WorkflowContext } from "../context"; import { tool } from "ai"; -import { AgentParameters } from "./agent"; +import { AISDKTool, LangchainTool } from "./types"; export type ToolParams = Parameters[0]; @@ -70,20 +70,36 @@ export const wrapTools = ({ tools, }: { context: WorkflowContext; - tools: AgentParameters["tools"]; -}) => { + tools: Record; +}): Record => { return Object.fromEntries( Object.entries(tools).map((toolInfo) => { const [toolName, tool] = toolInfo; - const execute = tool.execute; + const aiSDKTool: AISDKTool = convertToAISDKTool(tool); + + const execute = aiSDKTool.execute; if (execute) { const wrappedExecute = (...params: Parameters) => { return context.run(`Run tool ${toolName}`, () => execute(...params)); }; - tool.execute = wrappedExecute; + aiSDKTool.execute = wrappedExecute; } - return [toolName, tool]; + return [toolName, aiSDKTool]; }) ); }; + +const convertToAISDKTool = (tool: AISDKTool | LangchainTool): AISDKTool => { + const isLangchainTool = "invoke" in tool; + return isLangchainTool ? convertLangchainTool(tool as LangchainTool) : (tool as AISDKTool); +}; + +export const convertLangchainTool = (langchainTool: LangchainTool): AISDKTool => { + return tool({ + description: langchainTool.description, + parameters: langchainTool.schema, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + execute: async (param: any) => langchainTool.invoke(param), + }); +}; diff --git a/src/agents/agent.ts b/src/agents/agent.ts index 48e4e8a..9ee0981 100644 --- a/src/agents/agent.ts +++ b/src/agents/agent.ts @@ -1,20 +1,12 @@ -import { CoreTool, generateText, tool, ToolExecutionError } from "ai"; import { z } from "zod"; import { AGENT_NAME_HEADER } from "./adapters"; -type GenerateTextParams = Parameters[0]; -export type Model = GenerateTextParams["model"]; -export type AgentParameters = { - maxSteps: number; - background: string; - tools: Record; - name: string; - model: Model; -}; +import { generateText, tool, ToolExecutionError } from "ai"; +import { AgentParameters, AISDKTool, Model } from "./types"; export class Agent { public readonly name: AgentParameters["name"]; - public readonly tools: Required; + public readonly tools: AgentParameters["tools"]; public readonly maxSteps: AgentParameters["maxSteps"]; public readonly background: AgentParameters["background"]; public readonly model: AgentParameters["model"]; @@ -58,7 +50,7 @@ export class Agent { } } - public asTool(): CoreTool { + public asTool(): AISDKTool { const toolDescriptions = Object.values(this.tools) // @ts-expect-error description exists but can't be resolved .map((tool) => tool.description) diff --git a/src/agents/index.ts b/src/agents/index.ts index 4885ee2..0565f90 100644 --- a/src/agents/index.ts +++ b/src/agents/index.ts @@ -1,6 +1,7 @@ import { WorkflowContext } from "../context"; import { createWorkflowOpenAI, wrapTools } from "./adapters"; -import { Agent, AgentParameters, ManagerAgent, Model } from "./agent"; +import { Agent, ManagerAgent } from "./agent"; +import { AgentParameters, AISDKTool, LangchainTool, Model } from "./types"; export { createWorkflowOpenAI } from "./adapters"; export { Agent, ManagerAgent } from "./agent"; @@ -24,7 +25,7 @@ export class WorkflowAgents { this.context = context; } - public agent(params: AgentParameters) { + public agent(params: AgentParameters) { // wrap tools of agent with context.run const wrappedTools = wrapTools({ context: this.context, tools: params.tools }); diff --git a/src/agents/types.ts b/src/agents/types.ts new file mode 100644 index 0000000..1bd0ccd --- /dev/null +++ b/src/agents/types.ts @@ -0,0 +1,17 @@ +import type { CoreTool, generateText } from "ai"; +import type { Tool } from "langchain/tools"; + +export type AISDKTool = CoreTool; +export type LangchainTool = Tool; + +type GenerateTextParams = Parameters[0]; + +export type Model = GenerateTextParams["model"]; + +export type AgentParameters = { + maxSteps: number; + background: string; + tools: Record; + name: string; + model: Model; +}; diff --git a/src/workflow-parser.ts b/src/workflow-parser.ts index 52a1e11..5831640 100644 --- a/src/workflow-parser.ts +++ b/src/workflow-parser.ts @@ -160,6 +160,8 @@ const checkIfLastOneIsDuplicate = async ( `Upstash Workflow: The step '${step.stepName}' with id '${step.stepId}'` + " has run twice during workflow execution. Rest of the workflow will continue running as usual."; await debug?.log("WARN", "RESPONSE_DEFAULT", message); + console.log(steps); + console.warn(message); return true; } diff --git a/src/workflow-requests.test.ts b/src/workflow-requests.test.ts index bcee9a0..cbfdd99 100644 --- a/src/workflow-requests.test.ts +++ b/src/workflow-requests.test.ts @@ -780,7 +780,7 @@ describe("Workflow Requests", () => { const debug = new WorkflowLogger({ logLevel: "INFO", logOutput: "console" }); const spy = spyOn(debug, "log"); - await triggerFirstInvocation(context, 3, false, debug); + await triggerFirstInvocation({ workflowContext: context, useJSONContent: false, debug }); expect(spy).toHaveBeenCalledTimes(1); await workflowClient.cancel({ ids: [workflowRunId] }); @@ -881,7 +881,7 @@ describe("Workflow Requests", () => { expect(deleteResult).toEqual({ deleted: true }); const deleteResultSecond = await triggerWorkflowDelete(noRetryContext, debug); - expect(deleteResultSecond).toEqual({ deleted: false }); + expect(deleteResultSecond).toEqual({ deleted: true }); }, { timeout: 10000, From 0e1fc167211891d8fa0729914b66853a8d854e24 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Tue, 14 Jan 2025 13:35:52 +0300 Subject: [PATCH 04/16] fix: add agents.Task and add safePrompt --- src/agents/index.ts | 51 ++++++++++++--------------------------------- src/agents/task.ts | 48 ++++++++++++++++++++++++++++++++++++++++++ src/agents/types.ts | 14 +++++++++++++ 3 files changed, 75 insertions(+), 38 deletions(-) create mode 100644 src/agents/task.ts diff --git a/src/agents/index.ts b/src/agents/index.ts index 0565f90..1ceb19a 100644 --- a/src/agents/index.ts +++ b/src/agents/index.ts @@ -1,24 +1,18 @@ import { WorkflowContext } from "../context"; import { createWorkflowOpenAI, wrapTools } from "./adapters"; -import { Agent, ManagerAgent } from "./agent"; -import { AgentParameters, AISDKTool, LangchainTool, Model } from "./types"; +import { Agent } from "./agent"; +import { Task } from "./task"; +import { + AgentParameters, + AISDKTool, + LangchainTool, + MultiAgentTaskParams, + SingleAgentTaskParams, +} from "./types"; export { createWorkflowOpenAI } from "./adapters"; export { Agent, ManagerAgent } from "./agent"; -type TaskParams = { - prompt: string; -}; -type SingleAgentTaskParams = TaskParams & { - agent: Agent; -}; -type MultiAgentTaskParams = TaskParams & { - agents: Agent[]; - maxSteps: number; - model: Model; - background?: string; -}; - export class WorkflowAgents { private context: WorkflowContext; constructor({ context }: { context: WorkflowContext }) { @@ -35,29 +29,10 @@ export class WorkflowAgents { }); } - public async task(params: SingleAgentTaskParams): Promise; - public async task(params: MultiAgentTaskParams): Promise; - public async task(params: SingleAgentTaskParams | MultiAgentTaskParams): Promise { - const { prompt, ...otherParams } = params; - if ("agent" in otherParams) { - const agent = otherParams.agent; - const result = await agent.call({ - prompt, - }); - return result.text; - } else { - const { agents, maxSteps, model, background } = otherParams; - const managerAgent = new ManagerAgent({ - model, - maxSteps, - agents, - name: "manager llm", - background, - }); - - const result = await managerAgent.call({ prompt }); - return result.text; - } + public task(taskParameters: SingleAgentTaskParams): Task; + public task(taskParameters: MultiAgentTaskParams): Task; + public task(taskParameters: SingleAgentTaskParams | MultiAgentTaskParams): Task { + return new Task({ context: this.context, taskParameters }); } public getOpenai() { diff --git a/src/agents/task.ts b/src/agents/task.ts new file mode 100644 index 0000000..f56abab --- /dev/null +++ b/src/agents/task.ts @@ -0,0 +1,48 @@ +import { WorkflowContext } from "../context"; +import { ManagerAgent } from "./agent"; +import { MultiAgentTaskParams, SingleAgentTaskParams } from "./types"; + +export class Task { + private readonly context: WorkflowContext; + private readonly taskParameters: SingleAgentTaskParams | MultiAgentTaskParams; + + constructor({ + context, + taskParameters, + }: { + context: WorkflowContext; + taskParameters: SingleAgentTaskParams | MultiAgentTaskParams; + }) { + this.context = context; + this.taskParameters = taskParameters; + } + + public async run(): Promise<{ text: string }> { + const { prompt, ...otherParams } = this.taskParameters; + + // during context.call execution, prompt may become undefined if it's derived from + // context.requestPayload. generateText will throw in this case. Put a context.run + // to guard against this. + const safePrompt = await this.context.run("Get Prompt", () => prompt); + + if ("agent" in otherParams) { + const agent = otherParams.agent; + const result = await agent.call({ + prompt: safePrompt, + }); + return { text: result.text }; + } else { + const { agents, maxSteps, model, background } = otherParams; + const managerAgent = new ManagerAgent({ + model, + maxSteps, + agents, + name: "Manager LLM", + background, + }); + + const result = await managerAgent.call({ prompt: safePrompt }); + return { text: result.text }; + } + } +} diff --git a/src/agents/types.ts b/src/agents/types.ts index 1bd0ccd..bb5943f 100644 --- a/src/agents/types.ts +++ b/src/agents/types.ts @@ -1,5 +1,6 @@ import type { CoreTool, generateText } from "ai"; import type { Tool } from "langchain/tools"; +import { Agent } from "./agent"; export type AISDKTool = CoreTool; export type LangchainTool = Tool; @@ -15,3 +16,16 @@ export type AgentParameters name: string; model: Model; }; + +type TaskParams = { + prompt: string; +}; +export type SingleAgentTaskParams = TaskParams & { + agent: Agent; +}; +export type MultiAgentTaskParams = TaskParams & { + agents: Agent[]; + maxSteps: number; + model: Model; + background?: string; +}; From d933232dd705453e6b0723da46d7e1e19a4684ab Mon Sep 17 00:00:00 2001 From: CahidArda Date: Tue, 14 Jan 2025 13:43:11 +0300 Subject: [PATCH 05/16] fix: simplify model creation --- src/agents/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/agents/index.ts b/src/agents/index.ts index 1ceb19a..f6652ca 100644 --- a/src/agents/index.ts +++ b/src/agents/index.ts @@ -35,7 +35,8 @@ export class WorkflowAgents { return new Task({ context: this.context, taskParameters }); } - public getOpenai() { - return createWorkflowOpenAI(this.context); + public openai(...params: Parameters>) { + const openai = createWorkflowOpenAI(this.context); + return openai(...params); } } From 3185eb21c904e561a4bf2e02fcd74de8ba91a43c Mon Sep 17 00:00:00 2001 From: CahidArda Date: Thu, 16 Jan 2025 15:22:02 +0300 Subject: [PATCH 06/16] fix: rm langchain dependency --- bun.lockb | Bin 449076 -> 434456 bytes package.json | 1 - src/agents/adapters.ts | 3 +-- src/agents/types.ts | 8 ++++++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/bun.lockb b/bun.lockb index 24665ff6c6dd93aee5164dcd7f6bc3af239c6181..286e7082b2c7879eddaafeff0f9dba5c192466e4 100755 GIT binary patch delta 85507 zcmeFaeVkR};`hJzp0;L3r4rNVY0wi!52~4(+7vOR^rWXrWmmgqYMQBeP;oL7r(;5r zb#m1t3_1!Si9(o2g%F~KFp>&M5rz1@KkHh1jPv#LJNNzl-uEBBSNmnp=lZ;_hjl%z zYh7#Y)j3Z+b>^ZCiFaJk=HwS^ZpnVW|L42jy69^E@bKb`pGp07-br`=eEun^$G@o2 z{GpQjPV(u~Yr(K)MXOS4xW@je=kpa`mpk4yku1w@_WOMG#nIa604g^pl9QW7(RJ`DuZ7Y@3G@#7d?%w<0Ca#i@U_tV>3MDq z@}iM(1%y^p?Ni`&Yx;a4^kTdYJU%+DFp}-_JxiLp_$%UV{zX#k8Hb>D}9v|xIHK>XoAB|2;&dT@s@hbKxbrc_0$NEjE%3Fu>U-8$(leBmf z+5*kWPo9{aJJ#2QgORSN_<17uuQ+RBPHrAGTjlu)SvljA3#a;~(o2eudO9^ZJ9k{9 zfLdf{P01?oMd>xgm+?mp_yMm9OvsKD6hz1SCP!yps|MZQz^1#CbgFnXzpx-HyC~lm z&7W2n&70|4dYa7`&7YbVr6NTnBu{ZdL)*g0xZJ!P3d)D8MHexQYWWyES?QUvg%gRN zlCQ%t1K|8uoWp47fG?vO$f=Qn%w%dcJu_=urn9g{gQ8#~+gF*9{A8*<@uvivb1Pgq z8YkMCMJBl|@h!viU-1I|=*We6S;><)>eRxVnd5TDM|*Nu&81GL@+YB67l$@Qf1rQF zTQ_mFs4BtdL@47$R9}7g9)HxQh2&CKOv+E58JUvpi{wq58p+F#X2I1J_cpV7C#r&z zo7=9@NJp~seVZvq>7GJWk=98*AH7<<1mDP44f6f&i47v zK^vePqxeabPAdNLEL-ru&%(YW*4Ttv+J^K;<;Uhl#zpC=S3Q18D|)_&h|vU;U`jM^ zVzk5Wv+x*mRy{DNwe5lZo_`px7IkW42X{gwzhD}@mKQC|&zdmPmmi&SZ8Xp4>p(@- zkRPZhyOm*SW3ZqH=pWKE6a=cmKvZ=#pfGuNUjIQK%!d!meHaovud;?-04;k7O; zL{;wZ>1qF;W$517o)xhSv9n?wEl>sSM^)g9DRz!Lh@OdWm1_BXye8QJuSdsqvB!BD ztq)&;s^SGjc^x?vW0#wq&4T0mqMMy;8$7)iWf+TRp$uE`D6}~mMl~6mdFu1@vot%I zU-9%`p3X%z2eLgKfHuY#b@T!Wo*wUNTe2JF6fb@a)mbnhKYDF6ryxIey1hxu8o*z^ z)b_|LUP~wCvJ9|PMf1lNW@V4}{o``m;(S!;$Dle5`&nL8+{FWDqnZn+qDuJdWj5oN zs4~2VD*h$UuRt{fj>n5p<;(WsGf;K)Wu9+`Dt{AH>Eh9b^g;3Wz3c%#MwQ?-&#&#} z+#hOL^fV2t1D@934jBt{K|xkDFDE*qKqEJ8pzVM)p7us{mbF9Gai^o|$X^Foz86)! zx1!=tp-Oijs&?Ljsv5;8Q*&@}t08vMPR-3P7?+>#+l1HLDI~$kXcnqTKDID_Z0<~- z@9m-15AgV~Vb&MqXJ?J2!j}(lN^4yZ_-45CTCL7SD~H?WjgRIRAbdcN;2 zxMq568I8`M;T-+-t8MqCp*s4rXg%~{^i=e2RNZyEr?XMFwy0{EAI%xBZp*U%%;I(g zR8TaUJRvJDzo3QZldo|~Pi|T((X+pdbT*tE?)u9}Tdh$xdvRgT)U2sdpKqY&FY}Vu z^)!Qn=>%Un-syTu)1n7Ss)LoH!c(%QM3cvl^-arHoqWFAC)irnpJ)dofT~ry;c8Ve zUaeW1X_sEEnz_@N?f2ouSE4F^V(wJ8l?%Ld738Nk2NxFsG%NE_b;s4HX2Z1 zp}I3j{pFix+x9l}bV{@!Gk1KxFEVaibZSAqujUjdv3AoUZ4R_NL{MeFG}qQ|Fuo4{ zW4sPGVyc~7(fo0d?8x|NU%cv_ifZy*Mtb?KsM04gB~*Rk z)9r%#J*olOgKA@who0iQ)K|Qhgf58Y=Vo6U_2qLWXo1W^b-NE}1$Z<;Rv@BXxZ2NNo+MHB*s7kvE)n1{qr;SjRa-8c(W30;|gH`1%6=b}2`H^gf^CPs7eXXcFaP0G*B=|n?r zfH$Sl#pwjph3!yv;VfFx2p!7~B)M}(-+0gWMHPRIW7EGuMO3kLy!g5Qv=w|GuL^cR zH3XvYkd@7H;d6JLRFSJ-78ij0KE$g zVr$9;$6Y+fMzXT0k8c88UHR4BwyQru)j}>%?zL&%QriswYcP_3%yi z+8)|Z1$6GUyN~`?%NpNjTe6b~b!odYo8Y?XSq0;$*voiTV9Ncrz#*twxXR<@57@4K z231eojh>0_f6$iyo~O^F%J~@RHtbxv^iSq5!-$&{|%nAV;8#u++%B6obbHu@`d%XZo7-P{bQp(Vcg^?k%?L3xP_dWmpesUiZ8a>gp;$Qg?Y4pYBJ9#3ZuTVH*JUg z6IDC^{UM0^&?75aweyc{&|@3-*hbxM#F=8T4Y%Ei|9)!_yCaD0{9`-**v>w-qmOOe zV;lC^Ek^7PB6dd*+wsS4MciADhO{7dixIn3V8{R3=}iOS51cPgzo2LACb8~?c04=n zv=cCPPx!4yC{$-$O#9=jKEU*rob@^n4COqV!LFV$bZ0Keh9=6RPqDd}#HIO1HeC;&;4=e~>}-D?@eS zobj1GVdmp?;yi^{!Q(lAD$seiO@E!I!{8eC{A;7x1zZrn_}m`oeN^YgYp5C!&CiQW zC2cf+N^&&ks%w4EdI@@>jY+WS3%h2$fT}_XaH+NmdC?iZ*Z0~AJbhYr!4%%wEE8L{4BHv&}*}DW@OPJj~%j0=~7e+%59!Ld)Vfmg;xV&w@$fuRk(0k9=Ux!E`5bL=(wzc zf|)+&n?|*Y>VIz!H6=THrjm?0V(X|gdu;9u-z0V_;z81>ia&p6(`V&(?l_hQn6Lg| z=YpQ@L`b*bN9+HND*X&pO^iJ^%=Y|Pls+jc9zj537n`NrP-Trvo{+Pb18J5g{AA;I z;MKOcU+iV%i=XZFXEWLqz5;EA&PAJ}nP?K)$BRGDi?4_3^6>-Zp6ToBE8ayw*OhWq zlj|Wg5nYU`^I{w2D4j`-i*NJ$-Pu}%s)e!D?CL{K*E5?Aiq(5uX71#y@sYgB8h*E! zcRigR^t)rH`x;j3sgazSQzC4J22;HHp)hB9B!7y=YHD`j#H^eP;+==jY+BSXWV5li zn=&;wui#_6jvjk(z8!C~k1LqLIK;BAsOfjFo-=vsnGb*UWLwTNsJe4pc2=PVcxL-l z%?w}cc~kDxsO!CpTahnzwd+*dHh(DvYhdT0I(e^0but{R<9APjC3Woq7NF|3e}8~g z;61mBJ^Z|hbn5Orv>v*$p3Rqq4{1M8GvpG%jv`UR7encZXg!$PK-OT$2 z;FYcudL}v{pWE7kyvWi-zt4HFN#DS}#?Ij;S0;{bW_#vARLAXtsy?HeI~h$|77a+U z#a!9kM%O#bR_hm%sXgQJ#wB0afx~+zUNg8lK09~3TaU?S+u~!zUVe`4k1nXvjiy{_ z?D* zM%>#vpKl`lr-7_!Z4a#eQ~nigYy6`z$eAveYgcZ2o9;ZyQ~aqYBU@BFzJqPbNK{Qfev+-wK2!(ZhN`}?E8?dY+H~vT zD)&UTazG8R{Q*Qk+bG+)Djl-bv|X`omTV|6g}f_SzbI znm9f(BUxw3i{0&HclX2$T~8z$jkAO9#vByjQU%wj+o@%b^!l9Re9e_b6a#c#;NWiHW5)Sl=a}tM!LpR3xd>0evcar*~ z1UAGur9;EP_BDLIK2DQx(Sy!Y4YS(ot zMu&p~nVuIrOViUr3kc=8S&0tCG2c7m=mMH~$*E4om~gNN75tr(wYRgR5As9b~Whzd2e6D*8r%s4> zM?fc~YF3VK|jyhh{#`4wPzLfz$B1r$*Iu zl18S4nl$$L(r^?@gNNgK#7YP)#tm`fG(*2>>{Lt+2Rb!z60^ghT&@H*C1nPlXyTM+ zhXda?(U}u$)6|{Bz0*P^gfwJy8J+YwP6JP4BdPIR@@%Cvi3Z^`ddv_S@`&ebuY845 zKQKc`*}1tLS#O%+Qi!Xg5ehui+^NV32R{M!cA8|T1-d6W8M)!W%}GvaZaDaMlFv6t zJrd}CmXkO&9K7``mJ(;w$h6?3vzg#-=o><#-O!M8czK0Tw;BX46AB$9q-y$2WnF)2 zd<$EZkP{h_63W8a$)ajL?#0odYZ&yFu`{M}Fujb^N@U05PFzPE4dQfo+e=x~?XkpG zcCrNBrccBvA8|~pGMw_!Edx?Q+i_tWDMzOS8n8Pp2nVCBd5_B(m75lNn$Sf=Gs}mh z1dre@HlvdL-TZBw(!y}ymNrgBVK}(H4FlvX9hMgGo$F*=5e{}_KVm!R7D5BuZmA$- zd!zYzwmx=s`^R}s#`JLDyz`w>BznG6F+Ci*pHoX!W+bWBN9Q{kGs2-$lI_s5wlH@l zCp#50!hyZXPU6gPD3xo0og>W0U=HqlU1UP*38{T{nW)*;rlQZ7(cN)2PLt<)oTdwh zWX`R}^>Oo+Wv2wrXy+te&jqa=BP(c>a4Uuc~jvv+abh&#z0&qfTN z9M{|rQsXh2S~Z-q!j#Z6xS=>2$WYhrWb0&?-z#w50ch?VoC@IpxN^_2xZ{rFRHi#A zLRZkQm*RZx3OOIAP766@(^EoQJ$I55VHG}^Q_34Py08~cUC6RBEG4ib#mSf*4un&k z(%IqQ9drb{fYE8e3PMZ^E`iOvI2kvFLsPm`uh?c>Ukagl6I0_U+zwF^*Mp%rhJc}s zj7#-*bxLmv2Wxd_L+&iSDJ_^^75a$KM3-Gc#iMR$IiZLf3NgLMxS`Cd(59+TOS)l{ z8+%h#=+mlDcUH2IZtS9}(07DJxU4T#wV`EIpv8o?ixatEhluPoA-yR z*q&EZl|sm-dz+9g?=*(hva1Q%@|F{_HT{MV6NK8Q_KT$}CS=pSQN>Q9hurc)!wE4P z=>(k!x8roOaW=C$zWTdkIr;TUCvibInA~4kwb8kO5Cg+Zjf`R`#VIQVacyWgz)8F_ z9K3EIr?Rtacv|3vflevl7~m?W$(?DzeuK2wDf9rL;cn<>LN>PlVE5udY#AXNdyJ6H z(f=y9NyIK8G(dSnUlFpWw-%y7L+ts+*|$B_Kg20r7!JM%>*<~|rw?@!?+OQo40ST@ z3Wx3rXa!=dX(*ptvMIFESlByBcAAL7)J?y*7* zGVF$(?Bh~GJ#d<`ZegK99Lpb$e8Gosm#TT8uRI=b$~L9OkF*19m;b>db-f791L_!c zok%n#uyLf5ad$ZM@zwUsVddda=Z~^I$Z|=qOu{ik)hkSlr*O=A9hhy*FE~y!Irje- zk9I1ShC_2k+sWacYJp9oos4_Jf%q{_={@0Kmoap)Thp0@v@Eje;;Q-#PPMY9=fSEt zEy`W4@rK2e4d5bzQ%bv8TUF)ChNXn|cDNrRn4Q}sqq*) zZWI|@swijFkhIV)LTW$b$)4}b@lM8r;lTLuPU(Z;;JWdoGNUf^cZ(-vTU%C^5^Nu3 z)O8UEjEg#@%fg|@0V;$E!;C!;butEr1Lsa~N(YBSkqJH@*MC;SvPCJOQryMv;h5XO zmJ@aEs5j;jvg4_0Y@g^PKExearjzkdIJ7B~#U+*}R6ENy#O}O%;Ci}o%v6V@+Snb(aYA}=gC|$5-^{}KxIVUK zl)2N3V@mW%3AM_O9icKOB^2?Ty%sOQ*|ArxxBc#zJoTp7BhZ)hL_glKdNdrG4fLh} z8CKy~iHcLSSqT0!hu1NjCNFo3C!pGJrD2{7&b94zcR7K@xlZZIaNx^ar(z|W`KjK1 z$h``^fz#l!ZZ1#tPjgBi3kNQr=2Scu4lSByyVq{aD{$%^9lhQDXNT`%Z{*(rgW@|}t&!l4a7jT-wa3JMk2ej^F<`x2b$7IgP8 zYpddPCLG4u^;YA1b)k<(KkiA#7V!m~JukE!_g`BzKY0Rj(X~$EYHsv_SGgIeOQ`;I zpYIwRoxmVCxIwO?N`V?PoW!TXp?))LkFu!EP6;|V?%aE)1>T+ER6G?9oHNr&ToVr6 zIg{ZaD@zD-;wVmahZSl74U zKL~NN-Zw4uf?_F${XFyadt3+CspT#IW_!%tEe5Z_x#fiJBBWFd7iZ<>zd5CA!+~dR za4Ob@gYOo*d#hn-!LGA;p00a<;8H^Dt%h~0L4d6lXw;3d(DQ`YP{A7Aj@2VLt6=Pn!}pRiG`*Ry3%FORfR(T&_#9W`ffGcfHIU- zg$@w9Oc_EwZ;qYiN#&{Wo?$uQgnR*~CfiN*FF0>batih-u@?y@)^zq6IB&_iCMEa= zZoISW(X_zbbDh!`!@&i&cp%u~R^1;e>ZV(rjF-4M0BDhA^tjB&-DU^I-NJ>s;5rh= zc6@kBa0>1kXX%S+!L5Wc+(KH-b1KTi!HM(Soxn?J!50YeD2dQdgm}b3sQ>M5cRrdH ze2CD+${5;9NHh9mr!qYy)NFoiE^0nRaeaw%FF3(fI35$dm=-uV-^q9-9O`^W)pRLL z31;Hl1_fUwG*pEL8!vFjio@g(%CJST(rm`rg-Vn8SKL72+~*CU{&)I({c&8LS<0_- zcrxKm+Rq53yW6vrf6@$6*p2XfTu;}jtZle1IQorotF_Rci|#Y3&?KDV7{y^J!3S{6 z6i$Le3c>AIXWvz|Hc`{pabw*)Dm~fQ7E>OjkHKkFYPt)fgHuORI_LfCxIs93_cm;i zog?A%?8E@m8-dCp1Nlv)GBIyWXQROer|;%@VTqjCM+{p3nQ>U7(nV_qujdOs9vgD!Nl zaF@CVRp*uC(v;66we_d^A96C@4~H&X?(ab0ot@$S2iRy|^5g0@{5o32TNQ{ypL zyV+F#PjHi}T<^#1Hi-)qLx<6T*rP3dysAoMJC6H3+r%fT$8Ew5RX!6LLeH;?6{*AJ z;$|U*NqI;)n09<7F|i_W#g{0h0%GHIJ?5M zeaemrqi`7&z^OWR^h($8uaVq5TuwuEo{lv`<;}p^$|;6U2KNw2&-|LEp`?85qFI(g}7nQ#yUzVSK=nPaq6}Up0iWiPW0Pw zI^9^&-b{_hsDtdIsus`N^OZG#CR~TpQfr?;ZN^=QW0_jXUUt3BXWdeqE(7Fa-}N<4 z=Z=jFzhJxBb%C-MoQmDyV2u~u3ppp@2!%*&H#PU-I^d`qi`O=s+Dq0iQ{!KP2fWUnfZtw9tSxU1aB_#zx=w!tYyayB>>UxY)?Z?Fpl z*M_HAS6;R!93xIAjK%e|b-+D{)0DHb;bUA!Ig^ymOnJq27Zqd#@^S6ll&Zu7xC`7; zbmzY96(@0jIMiUHw>2?k9mtMTt!cx!l;C0<&o@}zcM(zrI3(v{vsYt}0JQtfz-cvT z==Q=A+{HLM*#n#GCC*kg9jC6e_Z|yzzc=G8oT}=c`+?s!If-BMtYNdg>I1V<{hOUq z*her;7Fx&;QVCm}!~@|_{+3umU13(>bR4%60tdD@6(ni$HqnBka~f?M#0?b}y*TyaQKNYUnduXHwb=d%_zw&R%1(aOy2?HO8a_AHlJ&x`v$- zA+^}O(+*v{HP$y8oEe_uZi`Lf6F8O5gq)EQ{1!(E+{B#!rk$F097f}mD&Ds4BFnDpdD9ou+PGszOVu zLX}maR@)f^H{Il_(BoC1@2Wy6?|bP&*Ar6zxf|%$ zl%38Qg6oLmio%@O>^VEXfAJjS&Lf<5JM381a3Z;!!k)8Z^&C!P#Sb_KQ{yo@fc;^v z_fEU0*arfOahjg|5P4Nfa0kx4Aq$*d;UpdphXz(uKZkDhoLwt7;&h_83vS?)51qtc z!-0Yios3_@p+`QnXPbLB8~jkt-AtVPkzFDvfvIsTPOE{vQQ3ymw6R;`y1S}ZbByQc z6&9$+aXM4nJ_>xdYhkHB9K7&jO=4|%W)V^}-A>|ioCd)z{=rXTaa=Qky>Z>$Jns>T z*gPztgFiJH0e?79`l%_E?)uaz9TX0nUFlQ|3Wvs5+6^l`I6Wn>q|zkDk>;&RlYxfX ze8x{xZspj`1#&(!6^h;PnMtgH`gWTP=|#Iusr07ZrUDJUxjVK^<>66a&gUj02tD+9 z>`Y4HO3`+YT`ufon2yt^+EeuzTn8L=;x2DLuCx32wb>V@;v`DS{K8&28IUol@t8>@ zw)>!Ad+ivrqVl8Fg1x4qCKDOtYN5Ay>u7Fd* ztdzj8uS`WP%ANmJ>m5f+NI{?udTDcK=i=%bjyvfJ-7*HCq)t+yy zS7=|etCl}4FzJA)5IS-|TlS^X(}I_OLjlgx5?%!P#+26P;JYE3@-%~ov8@lne7Go4x9?M%h^ucmG03sjavO^>tdIz2XTsXXLs;0 zuBUruc06k5IcM{-)Od{Mnl1cMFUl7FHBJY%#kD?GedQX9Q#I_`vIzHkDR1M_iL;xt zq@Qd)P9%Q88;R4J5yCxPF+=m-$ zMm6$xtMMy&oKa78izhHTmLOE)x7eOthZ&9=syLIRTLs*ps+9b%3V63hqzn$nU1gS1 za6BPRcGf&jk{Y~)twwN?>`0Brbazc;WJ=&}zsYFKeA)xmxk8eXl(<#_zjJ1v?xC!J z-+P535>1Vd^Sh@hTQ}Yi+J)l>nW1T+vw3M-r?$J52o1*B&Q#r(;MCDvBG||s#Hm(x z{kkw{on6vPaD8kk%#3$%zvrvPo0`^XUwPF@rnDI=XL(IifrgIo!e|$AQuQ_bq#N&d zdy7j-I>*N;r`-^Jg3~0xmGLl;{1sE+*ns8Z$YIH?wU2l7DbYV9P0{^c-3ptZiw$HgKU{xQ^}twf~xl>*~4) zy}lY}M?@QnpK-csoMa;UZKsZnbB8@N57(DC_YNUYqpm4!Nk2ba*HoavLv{Tu%)GG> zOg>d1U1_rjDF@^GUTWY}zw=@L?x8(E9X@Cx_5Ez->)CPkTRRS`fwu1;!xlXS++sX?BJkb4q5=qBuK*id&4+pwUX&Rf*Fb zkS*n`1e=m2JU1mUG{ICP(=WF})pvHAvl*uuXxrf9ZTU_(-X)^62{`w;twDxC@A) zs?5XN)x-{oy*S*9vnQcS`an(%3pQ#>Eu1Fny2UGC3*lGv*-cGGN2dFeO-(5p+Dojm z+uv$3dEZ_$#6IAC3a8QGYC_TR%^63h2|osB6Vi-xmz2O0%}ruwO49yy1ajPA}WVX@ZeB64Ai z*!e?uhNj_E6BZ8cV^`tq!m9IbFHT2dQDCQaeoIr@mE-@tWo*cFsoH?!H>JX~K%kY$ zNF%;otLpX3#(66NziRypXOE_{^@}Q}qqS^p=P$kc5Sy^prlK38cy1e$*qu^y+Ss#~ z)rMCt*5SOfihlB+Yinc|zl(4hZ_Y8!^Xa&b?(@V)2&i>O7T^GyXBn!vxM&}qP2VsG~l&c43-Eg?HIG;Zf4+Zwp{Q=zMI zI%nCif1MIqfU_xew2e58p54EnenIR~pt#F$zt8IHE-)EAslkg-yQZ=F1-iF270^Iw zTa$PRdbq90KtmU_i}i@cI2)%uCM&>$yuXT5dwr&|1DC~v*miD5G;41sk9#tNuESNG znW42fEqFGrMhCxd7_P2UnV0JCU`l&&%uPT$(yG1xLfbMjunJy|Q>|IExhgKeX}{dq zJ?nfOHG}jD#>Iqe3F^h`aH=P>pOM(m(Ue}!#j7R%=wqx|+R~pEdV*kY64+arV>s

l%ht}P1vUV~@>SqCa+eopx43mLveV9<5&dv>=9b-)5-P!Iez+@na04#cY4SH- zc_lPZZE-69mKuMtEr9(Ln}r*2y4-R3yelQ}%*7^S5S5GTVOzlx!3E>;9;N~soCmc# z;g<>70(C=oT2H@kBxN*k_r4F~{^nMKMLE>r61$*r{bJHzkJHlQ{=OJmjjK9=Lwj+* zpB_n<`rW5B4cuSmZp201e46-&aB6e|6S;)hn$yef^WCJuw{Wam1!Y!TaoT#gTdvTfxUsermV`QeY)ZSo7=lyputc%H zn2#H*LRH6L;0ory`wtHKDCCx>e!3H<#h8jPsb0bjiRB43?CbZn#jz3Oa&ak6^=JBV zk^392UscL2IJW`r=!W~n#wCeI7*FGRnO#FT4G3LQl_z|q-NxBId>g0fOg;EHfwRD? zqvqe(Dn}iI56d~bio3;E;Rs#PbwKQ(YVMObe(YxF)^cF=$yJE6S9%rv9M0|n^c1+( zpsLA56)wf;DsJ}#*Wt$F?0)iNoEA-YG6z}>Hi;2`*P;ZU`|rc}Yc+%>@%8gPi*Fp? z7JT*jE3H9%8@@rl42}EwGgY|^kNZK3d?yj)BI$mlIv^wFR)F)@Rpy8Lk*WaB5%(ii zdgiP9`7>2~55B4xo#=j~XYnFDqhT2pJMm#?^-0F1hc&e zsk-d%o|h_qj_0L1z|DNcOZe&|m7goaN2+pe<10RouRhfk-qLrw<*usWJNPQY0*_1m zX6ZQp8AUY+8V^@jC12$6|3r0|QZIdVRXIyMF4ej4py$ydw_eLUAXPyRd0wglmV3Us zim%|S4tdmzudXWRF^@}6;rlG#ntaRosv@uHL8=nI!B-!t3f}7Jo1VUf2Km0nSLxs9 ztB+LaKaiROJ3Rr1gH>J;AR={Kl8 z($n|`l-EWIS)$ff%Jul&(sVc<%w)>Ilz}ywPAF2GA zp0BRr++?~RsmeJURRvn2ifZNe&aGBn1h*6Jr@ATw8+snPzfz@R6YN%$ zEvx&fQj;{%-=IiI*afMFzzPyeXa$MwYh{2x%;3ICG?Yt9bwD*R`vE7cS)eoAZ* zeh0Rt|JOWw2lw;eIiQNj(I3;~R(~_MN2g*na&u6Pa0#jubM@zcNHxoE^~#g#IJdk1 zy4wc$>w+p(+WB4vX~5LJ&3}eze49W1_di9oNVSAmjpKb@>i%3SW~= zIS+W*rKs7F7!`L{*{A zUi@FF@}+p`Qi=!&q?w!AE`1t?RlyEGoG&Xbe*TqqWVY`eBRR+Q0043&{ORJHsb4Q z{=G*)r_D|;L3LHe3XfM;jp4^|MSaR2?Q-^_D(7od`3|7`=R2rBo@xjWdtR#f=lk9R zQU!nTe05cUKYCoM;4%J)|K#!NS|5H2M^jWCR0po-`39)+ofgOV>qEdzaE2F=fa)Vv zS2aadP;)On$@6D>{v1>vX*_zq=cUSbf#;>_p$k2KVI0R-O*#UkoxBLCd}mZ$-4#_A z_weHXN|oeN{wRMhPcK7NP9K#2eEmEfpdFW5I22WeVW?_60@X*VjH5h0235LiQ2z6c z|YgexOO91QqRI~3WUM)V3D*vyZ zkK^bnCxj|pJyaEHsC!V&uEri{j;eqbiuF{-XzlT2PdlJW(pi5zRk|*C?K>_*Rc=32 z2Of;7!b4Dfr0x(8BcO~Ko{mCQ^Ul%b>KXd z3Ksch640l*D#LYNhU>lf{}omKzj^tps~V~vS9~#ALyOSgy@b_OHT;LirOI%#=cS6D z>+xGWE>*f)J^yE_sQF&J)ZK(E@PJeW-0Au1sssMhi(iPUC5uq;QZIdV6~Ei#)m7y$ z^|;hsgcUf0h^M@W|BKp_!~Qo9Y`QP|SS>MVT4OTWp}*SvhyRUP)a z$Nx+f|Ayv~7PcK;K_7YTrr{xjC~)=eh#bR0nR1mp1XZ zRK6*yA!vzGmhW6IUaAV5@A>MginjImziW|z3U22msIGP3VYr6ia#RKN@zP)6rLV54 zP=7CefEO=S#Rj2TSVwr=(;^qB0vTSyt5Nw;o{si1R9D51@wikyG7&usor~vgS zo2Td~j=wT`#} zPj$d&yo7(HO1IWaC)I(T^So3Idc*U7rS3ZRR|zQRKPu?o)2Tvlc@_9GZA|=EK}Jjo zzagP^zwQ;%Q}H;inDM5`_5Nn&?tA?4?#{a|tQT=tp}L@E@JHi)wamY%=EZoAS65B! zJh*x>-;0;3oI+H?JJa*mqiRR-Neq@|@XY{ys;eq{i^r?0_&m4{bh{V-SE}+Cl1{h$ z_j>82s#ux+uN4${z>BD^I>3V-mnz-AJpX5^7C!97|HoQH2DNCVm+{Zko!MUe)2J%; zjOYJ5s&b0fdId=pe8Ka7rK)hbmrkmlc^OrKub>*+Ena+e)$;tlmwpGzTq^Q?N*+p0K2javOV9tAD(YJ=UaB$w5miNhLRF#PJgq^bjuTWO?KNz`st#0B5oXsc zf3x1QwcK=nRH1qvm#Vz_s8A!1S69E8cLPrq@4kT(PIYQR8cmlZFRfH%oaOmHQ^lX{ z#aCBd?Av-=N;7?(JYQYamXw<6O0)h3?~!a5(y838sIv6nkMdtG^KYvBz2QpV$BUQB zU*TzAk4we-p=#$qPluo?XIM?W;BN!}MU`L#3H6bxpbSq(qUylWs46-h)u*~D{{*-W zJPD0A2a4F0sh9$+v=CLY>8L){Rq-?6+J(;d;{ONKy(;`q7N~mvWqE4I9bQB4tm!Ru z{{$#vq1UqNs-=CY7k`fzUtP6=E{98>^wO%Za^*h4WI(z)E)n(;x*yYlfC%rssq&X z_T?r#=^QbCGl1Iv-s+OE%@s5 z2i5$q4%EUneAR^)@YUzfR0X$nW38$OI(c5I1E%s-y1#m-!ae`eybOQ#G6hlY%N8oI z2VYg}GQRpq&*q!OR~68^6#7WjgVXq`0)O!?g?oHAffD|2zf?h9eg4W$~p0x1)ZP{I`Nu? zT`f+$X7Q)5YuFX>#A_BOUbFDtwK(yb1&iiiy@%mOyYFe}I`f~rUZEUHcj7gR6R%nD zu;s*S7AIb_IPsdriPtQA)nBjBH9}rn_7ksJoOsRR#A_BOUbFZ=_}WEJtvCO@_d8C! zW^v**3*U*?EKa;;@xS#Ng_fVcdObr=q5tgl3gr_&@tVb-y>6jjxlX)h@n^4N=vmE) z*DOxFW^v**ixaO|=yeNzO+WFPh425TuUYVh!TjCkP0*(mOHa%Vd ztQA=H0-&xrB#^lhFyuu*JyZ4~AmK4U@FhS4Gw>zAW`Q*V4UNAXFynDRv>b4TStZc= z2|&XQfJP>=0kA`0qrjP_-phcJRe-{m0ZmM~KSO*Bc4!F<^d>yb^V2wa0<9`D%<5@uT z4M2)nCD8ggK*OzoE+(=SutQ*@K$@xdCZObbK;fH!?xtKIbv>ZPTY!tqw6_5J1hxzG zFiCF%7QFzN^ETiTvrQoVML?%*fL>7Ht6}e+U?7W_}1re+{rpAZprt1UM=%?<2rO(|#3T`Rjm%s{mPM zr&0`m1JHdJV6vIJ3lP5*a6n*+>GCmPt-#Wc0l8+sK<1nNI_Anx{C)h>%;HY~32%|& z_$Q>uH@!avY!+DgDWK3C6PWQfU{obwx>->PXuS9R zDZ2r)%sPS8cL7a42NapC&jI@cwhGKPjrIT*y$6`J2XK?wB9Oivko*N;j+yxd;HbbZ zftyX6y@2KK1Lo}o%r!d&hJOI)z7KG#nY#}VzXPy!C19SZ6j&?JYd>JVS+F0Fxf5_i zV1eoJB_N>!uDYE?E=e8 z(jmZ6fjNf&51DNO%PRq$4g*%0*@pqcKLhL$c*L~-4iLW^u<$#;N>eGYR-o7SfXB^( z?*W;g1C9u+GChs}67~R=9RaL1hXghY4EX`D#+3a4nDGT5_#@yMGw?@1>%D+A0_%+b zC}4*`^eEstvr3?3AE4nezli=1_c5`P3yzd za7`d^MPR4T1mYk&M51w!4}IoIk&^Eq4QoJl`OMfF@DTIn+z zq@Vdr;z{UkpUIPc?lZ4R_xQ|NHPJ78<~r$KpLs{R&u7k!NB8^8jnXfDrb7Ca&vXc( zU;E50(gQy8ne-c<=~@dt=reapzoiSLhkT~z$>?F9DV6fSd3{*Q|EzVNQ&9fbsqdHm zKrcvtq!((VM}6jD=`s4C4*HXi|Ltz{XL>;Ti_g@miyo)_(qC!6^f%gnYGA0}XR=NW z4D@HoI8fs;-9 z(*W@`01Hn8)Ham>7Q!wKk-BDqO#5bPYhAUq86eqI3al0A z)f~{)END*I?aY2jd($Hc>0lO1E;NTE9Zm1EkWQvd(%Br7q?mzcQ&8&$6tw1S3hH9~ z=KyvHM9%@FnNdn+2Ag4;W$&3Cw5$7?KPa zX3CNQt(yXZ7XU_>ffoRF2&@qpY5Z*gCCvcQwt!J)l|X89K*M%`F(%Ruuuov4K*ZE* z4_K50C~OZHXUYZA&jPgQ0En7t9RNoKwhK%&Nf!c^pADFEAt1|a6BvFDpi@V{WHY-X zAif1)kH8euz7t@rz`{;|TvI8K*%HvJGhmuo&>4`>3UEXq-}FcUY!+CS0w^?x1ZK1b z3`qq{H)W}S)@=a6E`XV4U>Cp+fi(ix8-G_o$+>`NSHLW@N+9(-K*KaZk%^=M_6ckh zm~HBH11vfpP}mJ{lPMQSPX@H;4wz%6bq5?3*e-ChNeTm&UjUdB2Fx|v1ctW-bh-#| ztC@WfAif=7kH9?B{$jvdfrS?X=9@}^%=Um@Jpc>Lf*yc`4uB&9j_J`8uvuVPPryQR zNMOc=fFYLvj48VW(7Gcacqw498F(otQmI)XSz`RXkh{$Y$x^dQa*qjJhTLl+lKad$ zNtvm4IdZ?rl00C_B@dcL>BurOP4X|ZMe>kI>WwTnGbJm`Hp#=LO&{bDGh6bg*(q6R z+FwEC)}~Rpg;!9y$4#X`W;Z~uzJOI`L0>>Zcfb*W)uu;3z-EDE{QzssA%PiTz>q5e z&zQ0+0j)0r1p5QlnSuQQI|SAUJZJm^03{a#q5}Zy%_@P^9)N}e0WX@!K)^nMjRNJS z-XOrDo`AwZfR|0VK>8(s7J~sB&9uRQqXOFnHkqWWXyaxxQ?kWule}iy3_)Huvn6ks zoszAl{ZQmhGgtDKsg%5Jx(q|MnFUDT9l!Z<7#FB_{if$|^gX{Rm2UT&!_xQtrq2lU z1HZXny2EdNlJ4}IK^bU;-#je+&~E}GwFS6>YDPzD3*a|Tilp|1G`t$}iQkO98nRDh zqe!LS)E@;|)DKcP3bNa8Hi)EO328AJvd3@oMnjH@Y!}(li!$N~h-v@FdIf$ah{ zP0}R5@(jS7Nq~^qCNO*?pwnc)$!7LsK>XE!Jp#2&`)t5kfrZ(Cx~5Vfa}=Q06hJ+* zU*C}2(@ppDrkFnj`_)3t!}%hr>43EY3#S9xno5DpOhB(0 zfc9p=3_wB_;E2G5rpHXcW`Sih0iDbtfffPDfR1$vlzHvksp019saTw=-v(sKbViU7UL zv?9P!f$aj9o1|jE@~MD1#em*so51jCfKIakSD4we0r7c&Jp%nq`x^mk1s2{2=x-_o zGV=kwZUPK63vL1=6abD03^qOf4%jTP?C*df=8(XQLcowYfMKR=4xsh5fZ#s>Bh0{m z0Coth5g2LwHv>wh1EMzrMwwLtsWSi#O8{d`qy(@}V5309)SC-fG!sxb7ckD03#4BM zXmJZ5YNp)+I4ZDRV4_L76|nqzz?@qFS!SES@V@~%-3FL!X5R*gp9R<>FvYZ=2Ushx za2_DnR0?F?0O)l)V47KQJ0PJ5a6};A^q3FWEU;`opwJu=m{ANEatC0#DZ2yEdNv@q z05H=GTmaZHn#gc{QkmN4YdkJDpnPibUCRuC--i@$> zkSsC&rBt)(R|q z0Pwh}6v+H1px1+dRc671fP{sBBLb^Uk7YFJDYICz#vGD7ZF>I;dB&7U)|z9Ib!Om0 z$g^gJMCjy!KhNYtJxXPVFQu|`9;LFcn{5K|_W(Mr1Z*|4R|3`w>=Ag& zw0{hcc`sn$V}Na@QXt_zK(EIE@0taV12zjB0R*-OOwT8{w#_JmEPDd-LBJdqX?;Ir z$STOrfVqDaWQR!bNyvu*Gw4Z3$perzBD(@6uo{y3ASAjP@=3rvDY8$b;Zu;xfEoJ~ zWYIFnMv>k0${I-ezaWKcAbSF4gUC^l7EeR=229@5kmV0Swu|f!n6sXN3||hJ^9#yvX1zdIGRfAkNf#36Q=DQ1}ucXvzhS3bZH()HKt|0n48R zY!?Wbqz!=Ks{wO108TdB1md3pbb1+3+su9$uvTD?KwZ=R6+q@1z`|Dm^-QHe!qb3W z8vzZ>f{lR90!IWInjWtLW;_E}_A1~Eb4Z}|TELJ^fJUZl6O%a69Fv@B25v?gn-!8K z#=iw=YDP$!nN^bJCiEJTWFnHY%sR>0rrztwIVMZe!jvQC=<^(;#Ty)?m6`SiVEKB$ zc7Zk~X)9p(3xGLW>E!d`Osz+`2akUdvJ1i{qRpEmSt~H_O+Z_-Qy}vtK=-!*?akb` z014%Q0|FPCE^h-i3oLyb(8=rHaFH4D9$=rqdVwA$v>mYMRlt<(fJ@9ef%Hv)Chr4!nXLEe zm&;7Kx{lk_%QBz;WM4&(|mQ_|OLlk_ufb|P1r*^>Tdr(}R>Ux5rXa}ks9 z1_wD%!9fO_E*}Cm3oQMRJ{=NgzI>8Cov{_tZ#7RkhQ*oE)sWV2LXJb&H0)QV9RmG6 zqLh(l@kfA?x0FI)l8m4M;z0k#TEHjO?5#BT@8`V26|Y!O&1kh~j^ zYi8~SWWEpBB{0pj`5ch&0bt(efPAx4V6#B?J%B88sUfYv(!OTPfj zH2Vd12=v@{Wu&?NGm`tf(0G1sF+-nXA>=PLB z9iYsVeFs>y7ZCg&@PHZkJs^D_V2!{s<39p8DiA#ac*v|0SiT?7@CU#O6Zru!{7b+_ zfk#Ze9|7@S0SbQvtTg2UYXw>y1w3x19R*~54cIQQ$|M~FBpd+DIR;p5wh3$&==2j{ zjhX!uV8%CqJp#{|_CEt!9|SD?8L-Y&3hWT*^$XxRv)~s%$+v(b0_#nW! z86U^>^cTpoc*rMl=CH^SWt_P`1X*+(608N;9cKpBisR>uIPRP;!kxl#He2v#1_A!$8pPg7%%W-)$Ev;ej#XQ2MOCd@wYRFhe(%pS#8;!g z|L>odw{xD)`JBDa^W5iAW5j&zqOObi#zmF%!hGwZCSj^kt}c{=7dd)QIi#0zNP%Qg zdL$ny2a((nNds>R&#LBmQ+U%-B5-6t;G*heKu|Rmf=wcDC~HOpuSC!;BZ3ra9Rhx3 znko}UD%DC1H?>ua)GD11MjF*gjI?Tx815=_W(*J2T?|ikSd4Tkn=gi!>MurmbxI6x zl{X7U1~o*CjOx4?nN+Y7!$*x4BeS|DhOa7-6(ft9D27wr6(g%E=ZE2^riZfvQdbf~wwbsy~8F`CWee zF{+9^?Es#*S@D$z|8nOk+t}s6wmq*sQCU(_Z?Lb;WOTDl2&}z zQ!PVW?8>v0i?_pCK!ThX?9x;hjw(--NOib@sUin!v@lm*otIg4; zlEso*0&l7*WQ*<5u2-*4?RxC4t-WA2L4LN?wOzkn7?zY#MmB!cQkNK6$>osij{#Nk zNLn*q=5-~!Eh?c+OsAmEyn#e~HjY(6kuK|t26iPD+@A0X6Un5wb?(`&XB*5C=%zAc zK89W|WFC^L3VJz2*CNZA`IHMc3d3B=YGtDpL;nE;D6$2btYvMNl(rH*6Fb*-*=GB! zj8e%{vdehcM+VVdA-Zmzdv@z8uXrgiAu+t3%NsXGf0ai!waZ)J(9@QKlMBvz`QsSdlF6C{Goqrf9d!{)SXh#mL7mdQM zq7`=9#J}|7*n_FHj~XtboVHJ=uKhZZw2V)U91m0x-@1f4s{dnD`an&sbEjUSWjXuY z2)3IZ?7cXyrL=irh}J>}>doOvR~M%(y*<&rn~Tlr_${T?lIByFx4u+fF@b zd>(#yR@MP7SyVtDQ%wTPq6g;L7vak6R=rI07&3HiueCu-qda&f1@f*HC*Pkcq*~T< zSt^N3{XRcA!YNe&t11-cQc#3$W~6@>P#^lciF?bnLDq z#XDq}OOZs<&F7{N+EkQ^8|G5d=2<6k+c1|Ur`%o@m+bK}mE{hKz^*@oD zuZPxO{*-hr{fffT{^Zrsa*d(ATvCLaxR919rLB5TMd~!bs8)o@VCv7(WxyVhHSeblfK#IR@3`bVH(W<1jpvQwIS=;T$fWVS zHDr0Q?=}3sGi3RY?K5QZ{&EQ~KWOi7!u)9H6~KO69JTVtgOox+_)UcTSq)hbc6kZ5 zG$@-PD};S6$e+9vUHle?68M!iVK-#K*h?DWISg3{vcq_g`gcX9yN?zzRl{CJ zvdLdrLndQKdQu?O6=BF~VE2|(@mJ1}MPiRXz<*MQGV-QDsjmu#tQPj^$fO!7 z8Zs7fmRW|Zk|B#iHW8WpRW@XGusfu__^V>b>SA|AMs>wosv5$22<3gg@>k7})yM8- z$f_fgj5dJuhAh(1YlzI(kjdNnMeiHPicIRiwjpbTJ+C3FgDjKuzs3l|49^{n0Gl8S zH)Nd*&rOk4GGyNxvS?(r4OtgM)(lx)L)Og*uQ{@lv?FPF=G*&QVE@5<=XVc7u_eOM z*ehf9G-R!?|7_H8FGJQE84FZP73giq+F+OO#Yj8pW60WKH@~LV7nuap4&>#LQq}SD z$pC2=?cqm+QilT!SqJR3k;$LzKSZx1{A1*9kRj`Y?6@HtY{)tzlRB1ah%;p0V*k<5 zlM#{d;w>=<<-N-Cmw-@G*acz@*-*nX>vt_cDav7njD3N{eAV`F!*47y=_M^O&ELa! z$6gqB`TNfB%PNfT%2EGqu}Jrm+_5>Zu!Pk9q#DF3>$m_zHpY}4B0?r@{(Pt2J>47gRozr zw4@s3dk3^L?VFSGt48@#hTk~sGm%L(OfzKh6o6%e_~384Axyw74M~bpK8PTh8Uivb zO9{<1WJ9s%L?$_(WypqMm$y_)F6EmDQk}yg9f_6<%`s#nu-|Z{LrCi98J_PEv*i%CqkoDwSqPhq7;Q>4Z`RJ0YE1N?LXbG)B)|G9c zJ#>Ih@GZnZ7w8JH&>ea}Pv`}*^y~xuY!;Qfvps8k0vAJIC=7!UFcL<=Xcza?cLMvzuG6c1ScF-O=fRp&Lfh<)6L6)bo9L)u}ArIt*{5BQW z&7Lvs5?a(USPm=H;J)@6@jJ2Zf{8E*Cc_k%3e#XZ$l_DJ)Ylz)Ku_oey`c~Eg?`W< z`AIkpXW$o_>mfJ_$3T|yC*W5&38z6;@=OEq78&=)!9xUt zFb9JN8Sn&|x@B7K2ePJ!fiCbK-4E~)Wcy?V2e?8CNCl}uJ|VUn_P}1)2Qy$6`~n1o zVFZjMer<@CnNa2gnK@{hD!2>)&epGD(dFgsN z5>OtlV3)Vb_hVe2h*=j|J*W?|l}hQ#!9^-8vR(3obRgR#*%o<22FM7RRJz{w^zr^! z10WD`LIEfUK@bcf5DG;>HbNz#G{^=h0?I*os05XvI>@G{4#-C5IL+h)`~c%%0!)Ev zFv~$({RzuhXaL_pD1{@RW4Z(FsJ-^k0Xjlw_!eTI3p7EeDMZ5+%IgyR0p}?US>DSc zxD=Fuav=NDjF1U@AhUed$rno&kn40_eE*MN_*u&`p0ZI~0}tJ(4fdtZ>BTvx=cFtPy@~Clc5Iy>7Mj6Ms&yCahCQ$s_Q8Is{{vWl zfrD@e4#N>R3R^+8a4X<0Rn(QD>;}!TU#1w(fo$D^Av@g0?GD_7G+fKEksVxNCbFMk z39NuxP*{$5BPr6F;0<VWq0)CNQ*-vW{ko|J>~P!TFYF-QRpa0Nf`hX9a|(7c12 zungooRE-F{DsJ-Om<*5!e4rzd$?@@0ct*zkY23GEt~!e2O4tRh3E%{EbrG(^PS_38 z;1r&Ihl2zpyXy9^lIz(p4N4#{1;wEl944aUa1Q>0^Y9ZifQIl5G_t0q4zV-=9)Id) z_m6LbwJo%R_RtYJL1*|DVjz(CY1aeMM79;~Ea&mV7H!Gzl2XU7n7cxQK!Z8)5fgH%q zgjvuJ`ojPi2!miS#DO%w1Q-HCVVGfN7vF z@)+m}9Uw2{12ZB2TfP6kYWFeel$SwGfKz6jUv-JVITTrpMgBy54 zDxfu6Bn6Be7Vb92Yj+$)k#t%}pM}hP@?DM{&+hc3jg<-QXa9YAv39y-Fe&>3PtiZ>R-qv-Sm zsit6<0J5By(voVFDjNrV;Rg^ssZOb0@!t2MI6)hJu7U21ddt5Pzd3ci)2=W^g=HPAfVHq3q$!D9WGfAG4d!at40zQ1 ztT)U}m>XdSY=f<^-LUV(+ylE|7c>Rwq-WuGshTrbeuL9+3QoeWZ~~6QF*piG;4mD5 zgYXL+fc>x!&co*=DfWMmJ%hjDDLjG4@CY8l1LD_C1MXqog*$K?Zoy5s0e``DxCU3@ z3S5Ri;U&BQsbyIsc!KOQWw$B2PC0o<333|Y3J$P?3)n#Q8)8pW^YdiCmyqBCcpG*x zS=6Z^_AK$4uu2n@{f#eV1|N{UPAv!nIampT4p0h8 zLVJ)^n5@RCgB-lb&M*R6LM4zrcL>P-NT$n*Pyys{MyAk$R_e6?mi!>|s2qdj0htrU zg9IjlNZ^uy>Lk=mkev9KiIGjcL|z;|k5nR&y}tM<3KECt6@k)FN{&LzNFZe+;!qF7Q5?RM zHA5B+O+j>JP23Par(#B6 z=D?f+1E4?jh2GE;dO!?x7CX9~F#R!Q1>OauVRwgE=nCCHnxnY&fVE>3K`;=; z!!U@0!7vmOKuT#2o`+y&z?6U_!f`MLM#FFz1tZ`)7-`tW`~k+o_aG%T5kd)LlGOi? zTucU8jI9T(mUWnGK^A;+h*}Am9Ja1lj0kevr}VKzwV$;qvhpq%0khhfkG z`4G%F7zhJkDzg4^eAOBTanTR6FAT=MkpQ}5kA-fqo9nKaT~xub9AKu!8Vyb16i%{R zltZT4;DUGAF3YxAjxc`3{RA9?4KN+nfTVRb=1N!r%V8NTg(a{U7QsST0P|rU%(b#g zn}cOG`~%=IAII0{E#2OI{;s+8*?%x!QGL~j@T z0(;?S*a^}g4#0lc4x2#yYyoLmiPEArW7!JgNg|P!B9Ta-B9qAW8P^htL|_IkUBHZ7 zrd64t%VwbbZJdh4N!5yR)-{K}U_zLd8Irsy9 zhtqHp&VcBM`5TDbw2OJxxYl%}uiS*&a2YOvG}ZGU$`=e%>>~RUL|?AO&vm#4;^!({ z0dbRS(YpmVKy>~B({Cn9>M7UpkN8h=Y^L}jb_w_a+=qK0fjxo8AbMh#NW^>we}jZ! z>X`O_K9h^S_~j7jnUixV7qH1K8_AK88jBoMxq=*8336y95qcP=1R@bhLd1_;dl`Bn zlWWOo24oUZZcHD@1acsj9?Wp1Y8~+iBvMfj2l1HEu;;{-)^7&p$8}Z^eP3{b_>%-n zz*#_YmKn@QBoU%(UYn-KBy;f+m{`n6a$pYxi6}c{12e(^?EYXz_IX62V+L*}@@v{ZFVo| zDl#C+k(t@OWN@-^ZT1)$Y@~?Ak90+e#O#8mTY2=wy*g$^r~u`_kjHBlQ&7optcF4!UNmXA@S zSW+aZOAUi@90Ums=AZsWXY4FcH< zs&xbH0r8*jZY1cfxNd<&*bEzC1DHXJ&L*z6!FG^s?hefTa1ai_PUCtH=5E*p`#`Su z8m7p9kwah+9x{YSFpnB`k+*=WFbhtD%;yU*yTDwy41dA}_yf+sagdd!tZbyNrLD-S z^EYIDp&3Y6r{JUvGQVPx08fA@izo45E>V9%e%8?W9a93ANW}f~2+t!s2bVw+cM-0D z+>%KPFR*7JQU72*13&CHwNm*R?V4!5z2_k{D?ze_={OZoy5E zFvQ%6pB*5LR&?&deUPvoVal3O+#X_=F(dwg;V8l<*u|6ZH#`R^iBzOsZZf5W6d*+@ zxq6A|z|4wY{%N_BL|Ku^qZ&R4D_~~Alt;rQ$FfC!i~TQP$H4&@7P+w~3wODfT>$cc z^jS%DLHIzR?;#rA!5heo{57WJ=oO}{ghgM9_$}8ygpm;>A@ZDvxi=U88PQ3JEQJg8 zZ^z;Sl3E+4){g zp%-^Z3!ZWZKLg0=SSC!#wcJjXYq96To)dCFAY_MZ5CHPXfgfZAC&&{3@+3fJ$PaQ$ zHZO#Ml(J+d8wr)%2Vq}C_-UjV3vwa3R;PZnSBd{9IwBU4lwx7{ycDw|ms0+`BnzSQ zUj-?7GxJ25Yj#OjQ5ep35zG)cE5m*$mN7m%ArlbY~N%#=#l8FRN$%tfFDnibbN=uInM=%IMUyvK#Qex6ZdqQWB z+;)OeASEfo#{lSvT}r_$RDb-{*FOgNkUIt_bDQ#KWdc4^Nom^DF zQF>2VOz9Y9tl!?H83lKB)B?eHRwh{WJYRC} z0XYPf!_QSx|FsdwP3xM5*&eeUv<30h2D2W>RNVrzIW&W&&;;a=pfP3xm_lUrF&ly; zq7mjdFc6(+Oc}+)p*8ka(DGaU8;Yk6m@>ci!0Zm97>n5rx`I5F5d)$x_C7EWq!@!? z0QUaS58^=9CxbBsu}j!81$)Q8KwFxpRM2?L5g-*MWh^b|^VTyQnPkIkwo0`3<`it>jMnqWEEY)fO&);C2?oP2``OWL)p?ro$x^r8K4x z*+uLUn7MwJ)sg63L4FOcf-jN0!F&y`;3d3(=kO0agTLV^Jb}mX2p+-%xG(j856fM+ z1GnK8+=Lq-5z3G>}mctHk`oJkv~h+Urd2?TkLOFT`*tum2iHLf#b%JW?!cVf!pUGkWh9|V9u z$Ox1TQ=S`=O-n&cd6ptprD`NF zNmzc6<#|3aaW7!VgD_=$Ere-~u@$h(!)hVmEf1y@#S#kgNPq+;l!Ovc9OR+MFc5ip zC=F#no^~^H9FDylM1T~l=t}n!Q%baWUo8CftM1TDx6(~R!kYCi9-jDgmc5HjO;}{l z=o%Un%&mU4W0~E@R@AC?FSq-I)gV`CSuAWWe)5~?{d^N_*5IJRLB$EA5iXv%M22_F zu+ZahBi*GKE*-7v!BV?VmH~#}QL!KHonCO^w9Q&LC@iQj8sDjPbL|;a=rVgo+jOgn zTxJhY^+OzIhAB$YSp zXo1?7+x={&o4Z|wFSm!-0_>^>rn4H^Pfch~-u9hSd_=c~gjP5xRMKQ**w)CZE{Km~ z4&}bWp6^rgnyj$<+9F(4AB1k-P^NhahBq**Jx(ckq@ZVTeP`(ykF#f8V{KM>>PwQ{ zqg|^uy~y!|+vhH4p0Izir*$d1jHU_YQ>s@hh^R(NRbVA0ZYG(8v|LG2hY_F;dMRoR z>>Hc+QF)uScu+9^m^o6Z)#77gDs^ZjNj#HE)%w})lj9~n-0?BkO>40UJ$E!%vD)VG zluU*Og-9l6x~ameNbg28ywSXzEwh(f8F!mj48bK(IfP3ZTr#_UlOs!>K9e;Uaj=|m zQ*od zsjE>aih?w%@aDE1XC9}#Vkm^szEi6wo9#X-auIms-WFp={TsR&&MNky@R>3_D0jISHwu zZ`D)&Pd6M+O4$QkB;Q?Mmv~jPbKNXj9AQBrjO(dYSCZtk;_QJ&2G4cd2aNAJP4lZY z9nUl>b}g|qOrs*!k@y{J?Y_>Is7sUB?S6Y%l?`pB5`w7&+HI#ayw#6v^+ZFONWZPm zi#bYGTY(0Z6htW)0XaLNL1`xxpIUHowtZeCH_m9ShK8+;yBbH7wyo~!*ftV*kop%N zhkqF4p2_xmKk0H>$y-Wzs!QugWV>|Ab3Hy{)2Uh4?fF%M_4aJec2p<@kWgqz`0iUH zS`Q{E_>vNS;iV?6w@2FMr&m|S+fUx=&3c0I$)JKZ=p|ou13h9{28LcjD4S6Y5;=Nn zlg#$ct{m)3=|yC?GOgq;UKFZlmKgSBQXv~DjyE)RNkgqdd*^39vdI526{{eNW|B1fJxrtOP@>OA*@R^N(r3L+SAuz+d zWq*~`@>fK{&XZLQ-(=rt>*S|OZYBhywlnso0jI}D?Nz7xKKvtdQG65$3RZ55?0(Kk z{(3rAWNS44&4`aVaFg~;XmkA44rwa|1N6$jpC%x4>Y==~U3_aAMgzCy$;LajlH!vV z+$fR0oISf5o@ftnUdyhBu)lHPmu_P>kJsYRTHC$sYIh=i`0MTQKSmC%|9b~WQeF^4 zR&qEoao@g9*@H(VjW6i~Rbd*FEhJDyZ%GjtVF zTkHY0^?_>c4t)M^2tKwWfokW^Ng+A3kkqa%_N;2sR(g754&`2-dZYAD?7_d0$1lRm z_i2QSr#_{2Zm;e?@tf=2Us5{82xp`~Ro!Oy$`M{hm$so-NaJg~>ycyD<%fAtm!3w$ zG5gJ3Mg>nazHd8u-Hr=~WkeDUy8r8(Q@4{MMiSrc)K{upYC=gz2GwS}J*%^JF1?Z( zw0!XK%>-UvCcbDUEO~ROS$K1%$*m8`_C_J~kGn2EfJRY0=H|K8$?bHkx_OizMHaT4 zIf3q;@Lh_$vuiF`zXZ)-ntut_hW|>NB#nW@QZ%oM*+HVdD0X#v2XmEChW{~-d{HZI zX8jt$Ig_17v^E%`wTyq&>!%Pl=T~WV(yR98S0@9h*Aw~GrJa-_{o}<>dx-bL{Q59; z0ll#E%~(BQ;eeQdS^E>Iu~(nBU4q~(PvltHLC7LtTOjd#p{Dq-H8cui}FyVaz1by2I+AK?6=0;TathGu%2$%SkY`ZHdN3nqg)yubBFQ z9%l@{NMi~s=U&oNACKZUDlTTnrF9!*ZY@T7(C`aZQG4zAax5loG7|5`lyp4VKR9;Q zAIE-^SfnTmTl$2k*@P7}jQmS%OZ$K5R%C9La&~Rhmm$}K*HhaYj_${jE zAp{rk^XkpOj(ZzTUSzXoLBimkP`-#7yPr^7aZP_qXxn(--q{{=9X4wu5~hcQZkUpy z2ERSXF`%1gV?t#;BWWLti9wV90%V{}et4hqv# z=ut$4lRF7Za_RIS42iXgb=JkoFXyo0(_*E}O^qpNNKHLx+oZvtrFU0EqXflInU@Ju zy9py~Jd0&1munx6ug(*iR$ozsNZVS7OBP&Sr)&4^htT8G@f*xCHMp>4S25*&0Kd6e zf=j8ltkx!V_R$TbhNP8|>#z9@wX`Xrq7Ts4mz7Wx2*b9ygjz1wMN_NGn9d_5^>Mvy ziaPCkj5^%bZe{q?R-Av8R0Vz^*YDAgbZz&}=+$ie^r1-_KBZJkG{QnlF&m?CHe~z9 zAO7ZxJ)gpeGF&{ap9(JU?&!NDmzYv&wfG&4hRjG=2h_IS9Q1oalEz|OWJT%P>vY?g z6VGf(F8fQVcapN}hQ_UOIa5BbP;q~fhNZMBe2~!nOS2&)j14*M%?jTckv>Ty+;FKg z7P@G?*?Ez90X7R$^efdr2B|a0$faRrBd_p|g&BOmf*MmacNo8w(U7jT*Yc=JuDiB~B#kDxc;V7%Yw4w-u3c^=xx`dfG5B>R7@^N!7T5Vv z%ABW@G=8kC=1S%t8_9Pe2DysAmQWjW6FSC$zgBxDkR=0JMMu{pa7LBl) zXh;})Zcbd9K2w#KNg6G1krFxdBEf&q!UjJkx%8}}cH-AIvWhx)gs#)Qwn}ppvr3eT zIEp+fN;Toy*(pjNK#NRjGhok8b6M_2BatDlcNCxT!$(4tx`Yqs801p7vm2E>Yunex z&u$HtMN3GqWp0%6JVrV`H2vO=Qq9Hh z2Q*|8IpN9DW0m_H3ry0;SV#98d45^{Ds^q2#aph@(Rw6Z z_AiJld-+@)_EfT*V!-u?R=d%#`9>?hvzR%fRm3^W!qHQI$0!x8TK+}=l?gz`^@i6T zg|4a`G(|u6V9>VIiB{34(P)N-%$}W_7HabIZ+7+v!TPGu(kWU^KqIWTp)qq%0msdK zFRzJ4u(sPAf{Qeh;k8qCEj?^{6U{}Y1k1Q+by@t*LPO@)zTuDC?T(ocBpNcSbNGvk zCoVI08ZsFCS)tseKkK|%CfmcJK}=K@BX?#onT3$J z@;AHP>U`H!uh@-CuMhAjw)!6mO?EuYWnU>QBcm$hcY7_{tY|g#cWSL*OSSoT)>uYW zm~j{doEUZ1?q{_%X{%!Y_;=}3wmT7fuWGB8?d!DJH)V*J`^09Q*H+#8!(Q@Bk5Mz) z=@ngwmm)Vm+Dg*Q+{(ymS%{0&VC%+9hOE6co_%Ct>PJejOQ$aF3bt)+*>_;!)Azsd z)fP&ys8+b++N*Ii2IqzLdP(H0nQiX=vX|0pZB+C8S9|5WM8co8SC>T7)gCE{1a zHj-wccPzgc6-CuLztW_Ngj!N`QNu6UXV~mrRluKQJZ)FKi8c7v-T#yHa6te_&Rb9nz5PoI&sPlYdiKPcFgc=n=`z&d=w7^!oM7 zKRZ^a+*R$sud^N+?)dG#w#DzetpQE(TO_CmQCnJdRZm3Y>zleBT~&_D_K?mMyXm{- zedlWjr*rS|s~(2*5Az+Y-KPEO5jQGQ;lf<))Jmo0 zrf5*HB9_Qlwfi!Shqt(1AYNm$n4v^65qVno5sXYNzCH9_9g}8z?=@9V9?^o+=7<)l zRrD2md#C)4OEmX*m3rPHa?(*WIIxzYAJ|J>zCr;{Lqn$AxAmH5K7V=4Wi&XLlMJrL zMOO74i?&!?sK7(Uc5SX#MI5ORkA*cDrV|UWNvV zxrvK}nxbsXm~8<&+Zv(b@=xEX*J(Ik_o^#|HSMpry#<~7^zQ$mX;wW1Iq>g)w)h`wo7MBs&$UmYUR1{AR2N`LhP~W5;>tdb}Io}P^ z>$k>~@M`IHcOI(+ru9?DVAcENmdjyD%YP_7;?j1%*hOd*w?j-u!^3lrG!P zdV^JLq{Anyg`pAo;%V1QPha=a64={r~rx=rZA z(U75XZ+xw5-L7nJo)r4T!D=lUVRO)szWvA3=xr{`b}@NV?^@`qaFM!;m>Y9A^Q)NW zxG--?i`X$(eZa5n*kCo`HL+YmlcG*=t9>-#$lO1}v@mE@MJx{otH?XtwE2jJtcpig z3$L-@pHc78pv2_7Nx#41S_EslIOVM9@Nwpd(>r&M^}pU4Q=-fpEn=;~6^~OV2reuV z4Ov8{IaK^qKoi#uHfvF1u5F8pENflkQmCSYfZAhM((rLzd-5BsmsWZlihQ@@UkkODU^#ADZOi8?PSV*BNAJ)aYxi zUgy~*&m@iV@hadRp?`yh?8ajkhi@4=@cx`6jTl^HycqbP^^-Kimd#Ic85*y;ir;By zWI|)v_Llb+3~k>hNn;Hzl7DBG*WceP;&C>~?>e3RHpxi~Xeu4_Wk7f@v{Rz9m=C^;I+A*hRlIFw&wHpoFx&$@$ zbJLLjhfgDHn-SN4q{c|^r}P*3PW5@feEs!P`X}G%9cY_l-a`A~CF``-qTO5K{QfdI z3oAWJZ{jJuTX+w=TYe21G6%EHe8G4t9r;DqsYAWp76)oB+EJ_CJ-t=LL%ZEsc(h*J zFC)i44!#lC5j9$GQO*ymj#e!n5=Cn?WQ=Tn{z*`+xxS;5G~#ga!(~Sa>%r6Q&c9A_ z@t_A5b@=iT343$5GpI>NHHHP-wb3f}sXe1#Vap?2q=Qzu9#bjbo=0ca<= zJ~sVWETg@s5phPpB9_o``e9Yh1B>hB&eGYg7mlSOz#&_B%t zW~zJ5%D90&QjC#QN!o{diUC~wPnd}lt{H{YPC0~ z9!A)z;VZ&01O9fp8cP_?A=CAu&cCe9%@@5FEJ#YK5sPy=8Zvz~tA8tO;lZPK&@e_3 zGb|#YKq77JXR7GeB>uC4k}6SqU$cu}GgEoJLFvjY)$$Dy-=C!~I+~@cxg+Pq&2szN zXuzg-LsQbPmA84l>L>M%5Nun2QW@V8ohiRROSS#{y3TC1{_|_29KyaH^NiVg>$3kf zZEucp!{wfbk*1BaRjqf#WrSgx&S7)(ns#O%5WM#7!~w|`jue8^Iagm}{MobL?lpPC zWjK-LAMLO3T;=!vv$kNg*iThu7IWcwYVP}F+J@@~>eZ-E+xPQS=?_FVXP({-Q{Qh< zZ(x};91)q(t(&J}(J))lf7I{3d1~heR@V*Y>usdTx7HjXA$;`rQw!)aU!{>QVkXh- zG9wnKCLc-atOaTu?#{#o`Z$)^V@mThoyQbPO3j`Hs--kiqtf+8YL@bjg(|@V$1@An z4m;-Eg(}MBGxN`Da%v>8n$)IRJa$WnO-xU zdauuHHL_u3?>_=G1JIM=<8)i0*J?rMi00GA@2-**wW(QPrP|^`qRqq?U#SA5=<2Lg zo@p`7BJH?RbwwT)x01(d=-n@V*WRc**7jDyltJ39 zWaq%#mDB4RWUZ;2sWi(y)c4eWCnG&n!(dE9SM4<*?VQ^%Zcf>gDn!)H*sN zDN7mG=0ol@u!w1`S_yXod2H->{Io9SvFr*@BgE_(kjBt$d{hK zB6oVM*SFG@derw{+^E!0n>8QX4EZy=l3|9OLsOQvMek3YKVbiLx!q|Dez$Out(x8S#aPGK-mh09-DuHfm<>0muIZR*AGjscXLoNA(g?#PD>+Hldz_{(b^yg%>@nrlK<@BVw7o#Da)6KR0s@iwo?M^Dey<1e2Xq-huYQa4ruKAiP z&37be812byU&=2X4Zxfrl5=z}+N!taR8yXNm6~2dPSA|j{1tCs4en8Lahaoo(co3A zmm}1fe!IRKDN~^Dfd%ike-@`%ie~@dAoEEjMq{(>etqF1k8^>aDWK20(OwHRn)xC^l z;rUMGmx(T4eV6XzLEOnT%}%`;t~Ey*5k>n|7c=(HG9^nwg8Pq5nF-J{_q9i7iFf#5 zHMbqvHlBV`^?e*(ZbkR#J&&DktPhUHCYJ{Qi&-w=Ci{XklPc9uH~buH5p(qadym?Q zc38^2di%*bv3l1wbARlcq)}?Hew33j{jJD6qpHgBxA7Q~5tH-l8l)j2vtx!Wa-X`C znY=gHr!T=De4Oh0&!X@WS}WDIlV1Ckr!T2CHNW!QFqyyji)t>KcYon4epFM*gKDK* zbGQ8$Uq_^E>_O$7#S!T|eMn!&{@8Gdwdx`(qez_e2sXFogMAaTIEvX87E?!156gE{ zA1HoVJ7L1bk&jYpNz*z|aa=qpyw+(CNAIXmNe-5cu65?9igc2M=wm9u>Bwixc3iD= zI!c;F&-p^Ac{-xmxwq}iivF$RDk>|5KKX=R97{$&Y?rH59$6yFevrNMJX}%{=h7?B zZa>}fBp4TYI*G)$^HQ_LZ?cb)a1_ih!;A+e{^wB+&E-R7^#H%lWFLpnGm#Y$8WL^duSTTK2)Q*T&|?X;@4T2 zQk5>0HdDpBvsd>yn3Q%Nf7vY>XAF&)mh(TJow$`}?96;GtE~REF<~fg9F4vRKsmlR0_SxsuE4f~BP9=0E z?qr^s<2+Iu)_SRy*~t6abNZ>ONj1fk`!aD`diOk3{Pz$Z^Q2SA0Mg;2niWWan2({-)$Yl4iA%~a2idQ1N%y(1 z!NTR!k2YyT!g$nFI#g|3WWBrM`*|aWrhVB~bI~%_?2?MXud_QEsnM_vNV|DVc28ON z8jl?gx}@fc#@CDA$hLZr!{O^}MnKa3yD$FJ(kFN3j#}wxGfB70Dtk^xh|`b0FH!BR z+i9Qe!*3JNFrIyUd0EBgBqJlQ=p#esH6#5`)f?3;X`mjDix+-tFDUJO$$8p4$z|RZ zwNw0VL?Zx={8h$HcGd`cO6bP<)7L|dx~M#JOU+)@Q}&`-$))9wm*QTWIfX=ARS~(+ zIBjUmc$~0rc8~4c|7lKcFfLS7x0&tE76<&(qo)7nxy7 zkJ0Z-S=#U1|8PS0OO&8IWKJJV_DN6bjt9e2tH`{>zwL%f$V)9an6BLjtLmbztIzqn z%0f_X!%-8)%|&%AFKg5zL@7P#@VysT{vJE;3~I72W@&ZyhH~bk2=rWLatXe5Lq#F@ z+Il2RQm2OJb0j!--qK6F;@N%EZ|w4sdpfMvByK%0AKSrOs$_mgdt3P%YJPqu>!Y{T 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 delta 93870 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%0AEvz$<0tS&f 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⁡$a``hXe36Oeg=zFh=k89*v_mWQSbP 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 diff --git a/package.json b/package.json index 1493ca3..b20b540 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,6 @@ "@ai-sdk/openai": "^1.0.15", "@upstash/qstash": "^2.7.20", "ai": "^4.0.30", - "langchain": "^0.3.11", "zod": "^3.24.1" }, "directories": { diff --git a/src/agents/adapters.ts b/src/agents/adapters.ts index f574079..e7b9a0a 100644 --- a/src/agents/adapters.ts +++ b/src/agents/adapters.ts @@ -99,7 +99,6 @@ export const convertLangchainTool = (langchainTool: LangchainTool): AISDKTool => return tool({ description: langchainTool.description, parameters: langchainTool.schema, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - execute: async (param: any) => langchainTool.invoke(param), + execute: async (...param: unknown[]) => langchainTool.invoke(...param), }); }; diff --git a/src/agents/types.ts b/src/agents/types.ts index bb5943f..137c06a 100644 --- a/src/agents/types.ts +++ b/src/agents/types.ts @@ -1,9 +1,13 @@ import type { CoreTool, generateText } from "ai"; -import type { Tool } from "langchain/tools"; import { Agent } from "./agent"; export type AISDKTool = CoreTool; -export type LangchainTool = Tool; +export type LangchainTool = { + description: string; + schema: AISDKTool["parameters"]; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + invoke: (...params: any[]) => any; +}; type GenerateTextParams = Parameters[0]; From 1463bb2d1f68631bd353f7acfee4d4347e21bc96 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Thu, 16 Jan 2025 17:27:19 +0300 Subject: [PATCH 07/16] fix: rm console.logs --- src/workflow-parser.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/workflow-parser.ts b/src/workflow-parser.ts index 5831640..16486a5 100644 --- a/src/workflow-parser.ts +++ b/src/workflow-parser.ts @@ -160,7 +160,6 @@ const checkIfLastOneIsDuplicate = async ( `Upstash Workflow: The step '${step.stepName}' with id '${step.stepId}'` + " has run twice during workflow execution. Rest of the workflow will continue running as usual."; await debug?.log("WARN", "RESPONSE_DEFAULT", message); - console.log(steps); console.warn(message); return true; From dfdd65d499b149811110264d01f7e8f099deba92 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Thu, 16 Jan 2025 17:42:56 +0300 Subject: [PATCH 08/16] fix: tests --- src/client/index.test.ts | 23 ++++++++++------------ src/workflow-requests.test.ts | 15 +++------------ src/workflow-requests.ts | 36 +++++++++++------------------------ 3 files changed, 24 insertions(+), 50 deletions(-) diff --git a/src/client/index.test.ts b/src/client/index.test.ts index 13e0a14..f4782bb 100644 --- a/src/client/index.test.ts +++ b/src/client/index.test.ts @@ -107,8 +107,8 @@ describe("workflow client", () => { }); expect(cancel).toEqual({ cancelled: 1 }); - const throws = () => liveClient.cancel({ ids: workflowRunId }); - expect(throws).toThrow(`{"error":"workflowRun ${workflowRunId} not found"}`); + const secondCancel = await liveClient.cancel({ ids: workflowRunId }); + expect(secondCancel).toEqual({ cancelled: 0 }); }, { timeout: 10000, @@ -125,21 +125,18 @@ describe("workflow client", () => { url: "http://requestcatcher.com", }); - const throws = async () => - await liveClient.cancel({ - ids: [workflowRunIdOne, workflowRunIdTwo, "non-existent"], - }); - - // if there is any workflow which doesn't exist, we throw - expect(throws).toThrow(`{"error":"workflowRun non-existent not found"}`); + const firstCancel = await liveClient.cancel({ + ids: [workflowRunIdOne, workflowRunIdTwo, "non-existent"], + }); + expect(firstCancel).toEqual({ cancelled: 2 }); // trying to cancel the workflows one by one gives error, as they were canceled above - const throwsFirst = async () => await liveClient.cancel({ ids: workflowRunIdOne }); - expect(throwsFirst).toThrow(`{"error":"workflowRun ${workflowRunIdOne} not found"}`); + const secondCancel = await liveClient.cancel({ ids: workflowRunIdOne }); + expect(secondCancel).toEqual({ cancelled: 0 }); // trying to cancel the workflows one by one gives error, as they were canceled above - const throwsSecond = async () => await liveClient.cancel({ ids: workflowRunIdTwo }); - expect(throwsSecond).toThrow(`{"error":"workflowRun ${workflowRunIdTwo} not found"}`); + const thirdCancel = await liveClient.cancel({ ids: workflowRunIdTwo }); + expect(thirdCancel).toEqual({ cancelled: 0 }); }, { timeout: 10000, diff --git a/src/workflow-requests.test.ts b/src/workflow-requests.test.ts index cbfdd99..42e24a4 100644 --- a/src/workflow-requests.test.ts +++ b/src/workflow-requests.test.ts @@ -618,22 +618,13 @@ describe("Workflow Requests", () => { const spy = spyOn(debug, "log"); const firstDelete = await triggerWorkflowDelete(context, debug); - expect(firstDelete).toEqual({ deleted: true }); + expect(firstDelete).toEqual(undefined); expect(spy).toHaveBeenCalledTimes(2); expect(spy).toHaveBeenLastCalledWith( "SUBMIT", "SUBMIT_CLEANUP", `workflow run ${workflowRunId} deleted.` ); - - const secondDelete = await triggerWorkflowDelete(context, debug); - expect(secondDelete).toEqual({ deleted: false }); - expect(spy).toHaveBeenCalledTimes(4); - expect(spy).toHaveBeenLastCalledWith("WARN", "SUBMIT_CLEANUP", { - message: `Failed to remove workflow run ${workflowRunId} as it doesn't exist.`, - name: "QstashError", - errorMessage: `{"error":"workflowRun ${workflowRunId} not found"}`, - }); }, { timeout: 10000, @@ -878,10 +869,10 @@ describe("Workflow Requests", () => { }); const deleteResult = await triggerWorkflowDelete(context, debug); - expect(deleteResult).toEqual({ deleted: true }); + expect(deleteResult).toEqual(undefined); const deleteResultSecond = await triggerWorkflowDelete(noRetryContext, debug); - expect(deleteResultSecond).toEqual({ deleted: true }); + expect(deleteResultSecond).toEqual(undefined); }, { timeout: 10000, diff --git a/src/workflow-requests.ts b/src/workflow-requests.ts index 7ac3341..f73b3ca 100644 --- a/src/workflow-requests.ts +++ b/src/workflow-requests.ts @@ -135,34 +135,20 @@ export const triggerWorkflowDelete = async ( workflowContext: WorkflowContext, debug?: WorkflowLogger, cancel = false -): Promise<{ deleted: boolean }> => { +): Promise => { await debug?.log("SUBMIT", "SUBMIT_CLEANUP", { deletedWorkflowRunId: workflowContext.workflowRunId, }); - - try { - await workflowContext.qstashClient.http.request({ - path: ["v2", "workflows", "runs", `${workflowContext.workflowRunId}?cancel=${cancel}`], - method: "DELETE", - parseResponseAsJson: false, - }); - await debug?.log( - "SUBMIT", - "SUBMIT_CLEANUP", - `workflow run ${workflowContext.workflowRunId} deleted.` - ); - return { deleted: true }; - } catch (error) { - if (error instanceof QstashError && error.status === 404) { - await debug?.log("WARN", "SUBMIT_CLEANUP", { - message: `Failed to remove workflow run ${workflowContext.workflowRunId} as it doesn't exist.`, - name: error.name, - errorMessage: error.message, - }); - return { deleted: false }; - } - throw error; - } + await workflowContext.qstashClient.http.request({ + path: ["v2", "workflows", "runs", `${workflowContext.workflowRunId}?cancel=${cancel}`], + method: "DELETE", + parseResponseAsJson: false, + }); + await debug?.log( + "SUBMIT", + "SUBMIT_CLEANUP", + `workflow run ${workflowContext.workflowRunId} deleted.` + ); }; /** From 24d34aca253d6cb0789a43e865377a001787359a Mon Sep 17 00:00:00 2001 From: CahidArda Date: Thu, 16 Jan 2025 18:04:53 +0300 Subject: [PATCH 09/16] fix: remove agents import path --- package.json | 4 ---- tsup.config.ts | 1 - 2 files changed, 5 deletions(-) diff --git a/package.json b/package.json index b20b540..9bc6abb 100644 --- a/package.json +++ b/package.json @@ -52,10 +52,6 @@ "./express": { "import": "./express.mjs", "require": "./express.js" - }, - "./agents": { - "import": "./agents.mjs", - "require": "./agents.js" } }, "scripts": { diff --git a/tsup.config.ts b/tsup.config.ts index 84e8bdb..3e5637b 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -11,7 +11,6 @@ export default defineConfig({ cloudflare: "./platforms/cloudflare.ts", astro: "./platforms/astro.ts", express: "./platforms/express.ts", - agents: "./src/agents/index.ts", }, format: ["cjs", "esm"], clean: true, From 6d022c78082dc797d1f411a02c709f74be98690b Mon Sep 17 00:00:00 2001 From: CahidArda Date: Thu, 16 Jan 2025 19:32:11 +0300 Subject: [PATCH 10/16] fix: add temparature param and improve manager prompt --- src/agents/agent.ts | 15 ++++++++++++--- src/agents/index.ts | 2 +- src/agents/types.ts | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/agents/agent.ts b/src/agents/agent.ts index 9ee0981..f130a26 100644 --- a/src/agents/agent.ts +++ b/src/agents/agent.ts @@ -10,13 +10,15 @@ export class Agent { public readonly maxSteps: AgentParameters["maxSteps"]; public readonly background: AgentParameters["background"]; public readonly model: AgentParameters["model"]; + public readonly temparature: AgentParameters["temparature"]; - constructor({ tools, maxSteps, background, name, model }: AgentParameters) { + constructor({ tools, maxSteps, background, name, model, temparature = 0.1 }: AgentParameters) { this.name = name; this.tools = tools ?? {}; this.maxSteps = maxSteps; this.background = background; this.model = model; + this.temparature = temparature; } public async call({ prompt }: { prompt: string }) { @@ -30,6 +32,7 @@ export class Agent { headers: { [AGENT_NAME_HEADER]: this.name, }, + temperature: this.temparature, }); } catch (error) { if (error instanceof ToolExecutionError) { @@ -73,10 +76,16 @@ type ManagerAgentParameters = { } & Pick, "name" | "background"> & Pick; -const MANAGER_AGENT_PROMPT = `You are an AI agent who orchestrates other AI Agents. +const MANAGER_AGENT_PROMPT = `You are an agent orchestrating other AI Agents. + These other agents have tools available to them. + Given a prompt, utilize these agents to address requests. -Don't always call all the agents provided to you at the same time. You can call one and use it's response to call another. + +Don't always call all the agents provided to you at the same time. You can call one and use it's response to call another. + +Avoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything +you need from that agent. `; export class ManagerAgent extends Agent { diff --git a/src/agents/index.ts b/src/agents/index.ts index f6652ca..c73976a 100644 --- a/src/agents/index.ts +++ b/src/agents/index.ts @@ -11,7 +11,7 @@ import { } from "./types"; export { createWorkflowOpenAI } from "./adapters"; -export { Agent, ManagerAgent } from "./agent"; +export { Agent } from "./agent"; export class WorkflowAgents { private context: WorkflowContext; diff --git a/src/agents/types.ts b/src/agents/types.ts index 137c06a..d48bdbd 100644 --- a/src/agents/types.ts +++ b/src/agents/types.ts @@ -19,6 +19,7 @@ export type AgentParameters tools: Record; name: string; model: Model; + temparature?: number; }; type TaskParams = { From 963e77484399a1e45646eaf9ce7e76d35f0a9926 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Thu, 16 Jan 2025 20:29:45 +0300 Subject: [PATCH 11/16] fix: only return text in agent.call --- src/agents/agent.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/agents/agent.ts b/src/agents/agent.ts index f130a26..bf8cf7c 100644 --- a/src/agents/agent.ts +++ b/src/agents/agent.ts @@ -23,7 +23,7 @@ export class Agent { public async call({ prompt }: { prompt: string }) { try { - return await generateText({ + const result = await generateText({ model: this.model, tools: this.tools, maxSteps: this.maxSteps, @@ -34,6 +34,7 @@ export class Agent { }, temperature: this.temparature, }); + return { text: result.text }; } catch (error) { if (error instanceof ToolExecutionError) { if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") { From cc1e6aba4bce37701a65f507108b926544d8cc6b Mon Sep 17 00:00:00 2001 From: CahidArda Date: Fri, 17 Jan 2025 14:36:58 +0300 Subject: [PATCH 12/16] fix: revert changes in examples --- examples/nextjs/app/path/route.ts | 82 +++++------------------------- examples/nextjs/app/sleep/route.ts | 69 +++++++------------------ examples/nextjs/package.json | 8 ++- 3 files changed, 33 insertions(+), 126 deletions(-) diff --git a/examples/nextjs/app/path/route.ts b/examples/nextjs/app/path/route.ts index 50bacdd..355b420 100644 --- a/examples/nextjs/app/path/route.ts +++ b/examples/nextjs/app/path/route.ts @@ -1,75 +1,19 @@ import { serve } from '@upstash/workflow/nextjs' -import * as Agents from '@upstash/workflow/agents' -import * as mathjs from 'mathjs' -import { tool } from 'ai' -import { z } from 'zod' const someWork = (input: string) => { return `processed '${JSON.stringify(input)}'` } -export const { POST } = serve<{ prompt: string }>( - async (context) => { - const prompt = await context.run('get prompt', () => { - return context.requestPayload.prompt - }) - - const openai = Agents.createWorkflowOpenAI(context) - const model = openai('gpt-3.5-turbo') - - const manager = new Agents.ManagerAgent({ - model, - maxSteps: 3, - agents: [ - new Agents.Agent({ - tools: {}, - maxSteps: 2, - background: - 'you are a content creator. make the information provided to you more understandable to the general public', - name: 'writer', - }), - new Agents.Agent({ - tools: { - calculate: Agents.workflowTool({ - context, - params: { - description: - 'A tool for evaluating mathematical expressions. ' + - 'Example expressions: ' + - "'1.2 * (2 + 4.5)', '12.7 cm to inch', 'sin(45 deg) ^ 2'.", - parameters: z.object({ expression: z.string() }), - // @ts-expect-error can't resolve execute - execute: async ({ expression }) => mathjs.evaluate(expression), - }, - }), - }, - maxSteps: 2, - background: 'you are a mathematician', - name: 'mathematician', - }), - ], - }) - - const response = await manager.call({ model, prompt }) - // const result2 = await manager.call({ model, prompt2 }) - - // const agent = new Agents.Agent({ - // tools: {}, - // maxSteps: 2, - // background: "you are a content creator. make the information provided to you more understandable to the general public", - // name: "writer" - // }) - - // agent.call({model, prompt}) - - await context.run('return response', () => { - const text = response.text - console.log('text:', text) - return text - }) - }, - { - retries: 0, - verbose: true, - }, -) +export const { POST } = serve(async (context) => { + const input = context.requestPayload + const result1 = await context.run('step1', async () => { + const output = someWork(input) + console.log('step 1 input', input, 'output', output) + return output + }) + + await context.run('step2', async () => { + const output = someWork(result1) + console.log('step 2 input', result1, 'output', output) + }) +}) \ No newline at end of file diff --git a/examples/nextjs/app/sleep/route.ts b/examples/nextjs/app/sleep/route.ts index c16543c..450a518 100644 --- a/examples/nextjs/app/sleep/route.ts +++ b/examples/nextjs/app/sleep/route.ts @@ -1,57 +1,22 @@ import { serve } from '@upstash/workflow/nextjs' -import * as mathjs from 'mathjs' -import { z } from 'zod' -import { tool } from 'ai' -export const { POST } = serve<{ prompt: string }>( - async (context) => { - const prompt = await context.run('get prompt', () => { - return context.requestPayload.prompt - }) +const someWork = (input: string) => { + return `processed '${JSON.stringify(input)}'` +} - const openai = context.agents.getOpenai() - const model = openai('gpt-3.5-turbo') +export const { POST } = serve(async (context) => { + const input = context.requestPayload + const result1 = await context.run('step1', async () => { + const output = someWork(input) + console.log('step 1 input', input, 'output', output) + return output + }) - const writerAgent = context.agents.agent({ - model, - tools: {}, - maxSteps: 2, - background: - 'you are a content creator. make the information provided to you more understandable to the general public', - name: 'writer', - }) + await context.sleepUntil('sleep1', Date.now() / 1000 + 3) - const mathAgent = context.agents.agent({ - model, - tools: { - calculate: tool({ - description: - 'A tool for evaluating mathematical expressions. ' + - 'Example expressions: ' + - "'1.2 * (2 + 4.5)', '12.7 cm to inch', 'sin(45 deg) ^ 2'.", - parameters: z.object({ expression: z.string() }), - execute: async ({ expression }) => mathjs.evaluate(expression), - }), - }, - maxSteps: 2, - background: 'you are a mathematician', - name: 'mathematician', - }) - - const response = await context.agents.task({ - agents: [writerAgent, mathAgent], - prompt, - maxSteps: 3, - model, - }) - - await context.run('return response', () => { - console.log('response:', response) - return response - }) - }, - { - retries: 0, - verbose: true, - }, -) + const result2 = await context.run('step2', async () => { + const output = someWork(result1) + console.log('step 2 input', result1, 'output', output) + return output + }) +}) diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index 2bfa410..df7aaf9 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -11,15 +11,13 @@ "dependencies": { "@ai-sdk/openai": "^1.0.8", "@upstash/qstash": "^2.7.12", - "@upstash/workflow": "file:../../dist", + "@upstash/workflow": "latest", "ai": "^4.0.16", "clsx": "^2.1.1", - "mathjs": "^14.0.1", "next": "14.2.4", "react": "^18.3.1", "react-dom": "^18.3.1", - "tailwind-merge": "^2.5.2", - "zod": "^3.24.1" + "tailwind-merge": "^2.5.2" }, "devDependencies": { "@types/node": "^20.16.5", @@ -33,4 +31,4 @@ "tailwindcss": "^3.4.1", "typescript": "^5.6.2" } -} +} \ No newline at end of file From 2738797c06319d9f926c28c654c8750a33aee358 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Fri, 17 Jan 2025 15:03:54 +0300 Subject: [PATCH 13/16] fix: add docstrings --- src/agents/adapters.ts | 36 ++++++++++++++++++++++++++- src/agents/agent.ts | 47 +++++++++++++++++++++++++++++++++-- src/agents/index.ts | 56 ++++++++++++++++++++++++++++++++++++++++++ src/agents/task.ts | 34 +++++++++++++++++++++++++ src/agents/types.ts | 42 +++++++++++++++++++++++++++++++ 5 files changed, 212 insertions(+), 3 deletions(-) diff --git a/src/agents/adapters.ts b/src/agents/adapters.ts index e7b9a0a..13eb87b 100644 --- a/src/agents/adapters.ts +++ b/src/agents/adapters.ts @@ -10,8 +10,21 @@ import { AISDKTool, LangchainTool } from "./types"; export type ToolParams = Parameters[0]; +/** + * header we pass to generateText to designate the agent name + * + * this allows us to access the agent name when naming the context.call step, + * inside fetch implementation + */ export const AGENT_NAME_HEADER = "upstash-agent-name"; +/** + * creates an AI SDK openai client with a custom + * fetch implementation which uses context.call. + * + * @param context workflow context + * @returns ai sdk openai + */ export const createWorkflowOpenAI = (context: WorkflowContext) => { return createOpenAI({ compatibility: "strict", @@ -65,6 +78,15 @@ export const createWorkflowOpenAI = (context: WorkflowContext) => { }); }; +/** + * converts LangChain tools to AI SDK tools and updates + * the execute method of these tools by wrapping it with + * context.run. + * + * @param context workflow context + * @param tools map of AI SDK or LangChain tools and their names + * @returns + */ export const wrapTools = ({ context, tools, @@ -90,12 +112,24 @@ export const wrapTools = ({ ); }; +/** + * Converts tools to AI SDK tool if it already isn't + * + * @param tool LangChain or AI SDK Tool + * @returns AI SDK Tool + */ const convertToAISDKTool = (tool: AISDKTool | LangchainTool): AISDKTool => { const isLangchainTool = "invoke" in tool; return isLangchainTool ? convertLangchainTool(tool as LangchainTool) : (tool as AISDKTool); }; -export const convertLangchainTool = (langchainTool: LangchainTool): AISDKTool => { +/** + * converts a langchain tool to AI SDK tool + * + * @param langchainTool + * @returns AI SDK Tool + */ +const convertLangchainTool = (langchainTool: LangchainTool): AISDKTool => { return tool({ description: langchainTool.description, parameters: langchainTool.schema, diff --git a/src/agents/agent.ts b/src/agents/agent.ts index bf8cf7c..b6a724f 100644 --- a/src/agents/agent.ts +++ b/src/agents/agent.ts @@ -4,6 +4,19 @@ import { AGENT_NAME_HEADER } from "./adapters"; import { generateText, tool, ToolExecutionError } from "ai"; import { AgentParameters, AISDKTool, Model } from "./types"; +/** + * An Agent which utilizes the model and tools available to it + * to achieve a given task + * + * @param name Name of the agent + * @param background Background of the agent + * @param model LLM model to use + * @param tools tools available to the agent + * @param maxSteps number of times the agent can call the LLM at most. If + * the agent abruptly stops execution after calling tools, you may need + * to increase maxSteps + * @param temparature temparature used when calling the LLM + */ export class Agent { public readonly name: AgentParameters["name"]; public readonly tools: AgentParameters["tools"]; @@ -21,6 +34,12 @@ export class Agent { this.temparature = temparature; } + /** + * Trigger the agent by passing a prompt + * + * @param prompt task to assign to the agent + * @returns Response as `{ text: string }` + */ public async call({ prompt }: { prompt: string }) { try { const result = await generateText({ @@ -54,6 +73,11 @@ export class Agent { } } + /** + * Convert the agent to a tool which can be used by other agents. + * + * @returns the agent as a tool + */ public asTool(): AISDKTool { const toolDescriptions = Object.values(this.tools) // @ts-expect-error description exists but can't be resolved @@ -72,7 +96,13 @@ export class Agent { } type ManagerAgentParameters = { + /** + * agents which will coordinate to achieve a given task + */ agents: Agent[]; + /** + * model to use when coordinating the agents + */ model: Model; } & Pick, "name" | "background"> & Pick; @@ -91,11 +121,24 @@ you need from that agent. export class ManagerAgent extends Agent { public agents: ManagerAgentParameters["agents"]; + + /** + * A manager agent which coordinates agents available to it to achieve a + * given task + * + * @param name Name of the agent + * @param background Background of the agent. If not passed, default will be used. + * @param model LLM model to use + * @param agents: List of agents available to the agent + * @param maxSteps number of times the manager agent can call the LLM at most. + * If the agent abruptly stops execution after calling other agents, you may + * need to increase maxSteps + */ constructor({ - maxSteps, - background = MANAGER_AGENT_PROMPT, agents, + background = MANAGER_AGENT_PROMPT, model, + maxSteps, name = "manager llm", }: ManagerAgentParameters) { super({ diff --git a/src/agents/index.ts b/src/agents/index.ts index c73976a..b00abcf 100644 --- a/src/agents/index.ts +++ b/src/agents/index.ts @@ -13,12 +13,43 @@ import { export { createWorkflowOpenAI } from "./adapters"; export { Agent } from "./agent"; +/** + * Workflow Agents API + * + * https://upstash.com/docs/workflow/agents/overview + * + * Allows defining agents which can complete a given task + * using tools available to them. + */ export class WorkflowAgents { private context: WorkflowContext; constructor({ context }: { context: WorkflowContext }) { this.context = context; } + /** + * Defines an agent + * + * ```ts + * const researcherAgent = context.agents.agent({ + * model, + * name: 'academic', + * maxSteps: 2, + * tools: { + * wikiTool: new WikipediaQueryRun({ + * topKResults: 1, + * maxDocContentLength: 500, + * }) + * }, + * background: + * 'You are researcher agent with access to Wikipedia. ' + + * 'Utilize Wikipedia as much as possible for correct information', + * }); + * ``` + * + * @param params agent parameters + * @returns + */ public agent(params: AgentParameters) { // wrap tools of agent with context.run const wrappedTools = wrapTools({ context: this.context, tools: params.tools }); @@ -29,12 +60,37 @@ export class WorkflowAgents { }); } + /** + * Defines a task to be executed by a single agent + * + * ```ts + * const task = context.agents.task({ + * agent: researcherAgent, + * prompt: "Tell me about 5 topics in advanced physics.", + * }); + * ``` + */ public task(taskParameters: SingleAgentTaskParams): Task; + /** + * Defines a task to be executed by multiple collaborating agents + * + * ```ts + * const task = context.agents.task({ + * model, + * maxSteps: 3, + * agents: [researcherAgent, mathAgent], + * prompt: "Tell me about 3 cities in Japan and calculate the sum of their populations", + * }); + * ``` + */ public task(taskParameters: MultiAgentTaskParams): Task; public task(taskParameters: SingleAgentTaskParams | MultiAgentTaskParams): Task { return new Task({ context: this.context, taskParameters }); } + /** + * creates an openai model for agents + */ public openai(...params: Parameters>) { const openai = createWorkflowOpenAI(this.context); return openai(...params); diff --git a/src/agents/task.ts b/src/agents/task.ts index f56abab..143022a 100644 --- a/src/agents/task.ts +++ b/src/agents/task.ts @@ -2,6 +2,35 @@ import { WorkflowContext } from "../context"; import { ManagerAgent } from "./agent"; import { MultiAgentTaskParams, SingleAgentTaskParams } from "./types"; +/** + * An Agent Task + * + * Can be run to make the agent(s) complete it using the tools available to them + * + * Can consist of a single agent or multiple agents. + * + * Single agent: + * + * ```ts + * const task = context.agents.task({ + * agent: researcherAgent, + * prompt: "Tell me about 5 topics in advanced physics.", + * }); + * const { text } = await task.run(); + * ``` + * + * Multi Agent: + * + * ```ts + * const task = context.agents.task({ + * model, + * maxSteps: 3, + * agents: [researcherAgent, mathAgent], + * prompt: "Tell me about 3 cities in Japan and calculate the sum of their populations", + * }); + * const { text } = await task.run(); + * ``` + */ export class Task { private readonly context: WorkflowContext; private readonly taskParameters: SingleAgentTaskParams | MultiAgentTaskParams; @@ -17,6 +46,11 @@ export class Task { this.taskParameters = taskParameters; } + /** + * Run the agents to complete the task + * + * @returns Result of the task as { text: string } + */ public async run(): Promise<{ text: string }> { const { prompt, ...otherParams } = this.taskParameters; diff --git a/src/agents/types.ts b/src/agents/types.ts index d48bdbd..5eac4ae 100644 --- a/src/agents/types.ts +++ b/src/agents/types.ts @@ -14,23 +14,65 @@ type GenerateTextParams = Parameters[0]; export type Model = GenerateTextParams["model"]; export type AgentParameters = { + /** + * number of times the agent can call the LLM at most. If + * the agent abruptly stops execution after calling tools, you may need + * to increase maxSteps + */ maxSteps: number; + /** + * Background of the agent + */ background: string; + /** + * tools available to the agent + */ tools: Record; + /** + * Name of the agent + */ name: string; + /** + * LLM model to use + */ model: Model; + /** + * temparature used when calling the LLM + * + * @default 0.1 + */ temparature?: number; }; type TaskParams = { + /** + * task assigned to the agent + */ prompt: string; }; export type SingleAgentTaskParams = TaskParams & { + /** + * agent to perform the task + */ agent: Agent; }; export type MultiAgentTaskParams = TaskParams & { + /** + * Agents which will collaborate to achieve the task + */ agents: Agent[]; + /** + * number of times the manager agent can call the LLM at most. + * If the agent abruptly stops execution after calling other agents, you may + * need to increase maxSteps + */ maxSteps: number; + /** + * LLM model to use + */ model: Model; + /** + * Background of the agent. If not passed, default will be used. + */ background?: string; }; From bd21daee0659d5da488946ac1e3d53dd92f23450 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Mon, 20 Jan 2025 12:19:10 +0300 Subject: [PATCH 14/16] fix: add agent tests and fix review --- src/agents/adapters.test.ts | 152 +++++++++++++++++++++++ src/agents/adapters.ts | 11 +- src/agents/agent.test.ts | 236 ++++++++++++++++++++++++++++++++++++ src/agents/agent.ts | 28 +---- src/agents/constants.ts | 19 +++ src/agents/task.test.ts | 179 +++++++++++++++++++++++++++ src/agents/types.ts | 12 ++ 7 files changed, 601 insertions(+), 36 deletions(-) create mode 100644 src/agents/adapters.test.ts create mode 100644 src/agents/agent.test.ts create mode 100644 src/agents/constants.ts create mode 100644 src/agents/task.test.ts diff --git a/src/agents/adapters.test.ts b/src/agents/adapters.test.ts new file mode 100644 index 0000000..ea90ed9 --- /dev/null +++ b/src/agents/adapters.test.ts @@ -0,0 +1,152 @@ +import { describe, test, expect } from "bun:test"; +import { WorkflowContext } from "../context"; +import { Client } from "@upstash/qstash"; +import { MOCK_QSTASH_SERVER_URL, mockQStashServer, WORKFLOW_ENDPOINT } from "../test-utils"; +import { getWorkflowRunId, nanoid } from "../utils"; +import { wrapTools } from "./adapters"; +import { tool } from "ai"; +import { z } from "zod"; +import { LangchainTool } from "./types"; + +describe("wrapTools", () => { + const token = getWorkflowRunId(); + const workflowRunId = nanoid(); + const createContext = () => + new WorkflowContext({ + headers: new Headers({}) as Headers, + initialPayload: "mock", + qstashClient: new Client({ baseUrl: MOCK_QSTASH_SERVER_URL, token }), + steps: [], + url: WORKFLOW_ENDPOINT, + workflowRunId, + }); + + const aiSDKToolDescription = "ai sdk tool"; + const langChainToolDescription = "langchain sdk tool"; + const parameters = z.object({ expression: z.string() }); + const execute = async ({ expression }: { expression: string }) => expression; + + const aiSDKTool = tool({ + description: aiSDKToolDescription, + parameters, + execute, + }); + + const langChainTool: LangchainTool = { + description: langChainToolDescription, + schema: parameters, + invoke: execute, + }; + + test("should wrap AI SDK tool with execute", async () => { + const context = createContext(); + const wrappedTools = wrapTools({ context, tools: { aiSDKTool } }); + + expect(Object.entries(wrappedTools).length).toBe(1); + const wrappedTool = wrappedTools["aiSDKTool"]; + // @ts-expect-error description exists but can't resolve the type + expect(wrappedTool.description === aiSDKToolDescription).toBeTrue(); + + await mockQStashServer({ + execute: () => { + const execute = wrappedTool.execute; + if (!execute) { + throw new Error("execute is missing."); + } else { + const throws = () => execute({ expression: "hello" }, { messages: [], toolCallId: "id" }); + expect(throws).toThrowError( + `Aborting workflow after executing step 'Run tool aiSDKTool'` + ); + } + }, + responseFields: { + status: 200, + body: "msgId", + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/batch`, + token, + body: [ + { + body: '{"stepId":1,"stepName":"Run tool aiSDKTool","stepType":"Run","out":"\\"hello\\"","concurrent":1}', + destination: WORKFLOW_ENDPOINT, + headers: { + "content-type": "application/json", + "upstash-failure-callback-retries": "3", + "upstash-feature-set": "LazyFetch,InitialBody", + "upstash-forward-upstash-workflow-sdk-version": "1", + "upstash-method": "POST", + "upstash-retries": "3", + "upstash-workflow-init": "false", + "upstash-workflow-runid": workflowRunId, + "upstash-workflow-url": "https://requestcatcher.com/api", + }, + }, + ], + }, + }); + }); + test("should wrap LangChain tool with execute", async () => { + const context = createContext(); + const wrappedTools = wrapTools({ context, tools: { langChainTool } }); + + expect(Object.entries(wrappedTools).length).toBe(1); + const wrappedTool = wrappedTools["langChainTool"]; + // @ts-expect-error description exists but can't resolve the type + expect(wrappedTool.description === langChainToolDescription).toBeTrue(); + + await mockQStashServer({ + execute: () => { + const execute = wrappedTool.execute; + if (!execute) { + throw new Error("execute is missing."); + } else { + const throws = () => execute({ expression: "hello" }, { messages: [], toolCallId: "id" }); + expect(throws).toThrowError( + `Aborting workflow after executing step 'Run tool langChainTool'` + ); + } + }, + responseFields: { + status: 200, + body: "msgId", + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/batch`, + token, + body: [ + { + body: '{"stepId":1,"stepName":"Run tool langChainTool","stepType":"Run","out":"\\"hello\\"","concurrent":1}', + destination: WORKFLOW_ENDPOINT, + headers: { + "content-type": "application/json", + "upstash-failure-callback-retries": "3", + "upstash-feature-set": "LazyFetch,InitialBody", + "upstash-forward-upstash-workflow-sdk-version": "1", + "upstash-method": "POST", + "upstash-retries": "3", + "upstash-workflow-init": "false", + "upstash-workflow-runid": workflowRunId, + "upstash-workflow-url": "https://requestcatcher.com/api", + }, + }, + ], + }, + }); + }); + test("should wrap multiple tools", async () => { + const context = createContext(); + const wrappedTools = wrapTools({ context, tools: { langChainTool, aiSDKTool } }); + + expect(Object.entries(wrappedTools).length).toBe(2); + const wrappedLangChainTool = wrappedTools["langChainTool"]; + // @ts-expect-error description exists but can't resolve the type + expect(wrappedLangChainTool.description === langChainToolDescription).toBeTrue(); + + const wrappedAiSDKTool = wrappedTools["aiSDKTool"]; + // @ts-expect-error description exists but can't resolve the type + expect(wrappedAiSDKTool.description === aiSDKToolDescription).toBeTrue(); + }); +}); diff --git a/src/agents/adapters.ts b/src/agents/adapters.ts index 13eb87b..38d6540 100644 --- a/src/agents/adapters.ts +++ b/src/agents/adapters.ts @@ -7,16 +7,7 @@ import { HTTPMethods } from "@upstash/qstash"; import { WorkflowContext } from "../context"; import { tool } from "ai"; import { AISDKTool, LangchainTool } from "./types"; - -export type ToolParams = Parameters[0]; - -/** - * header we pass to generateText to designate the agent name - * - * this allows us to access the agent name when naming the context.call step, - * inside fetch implementation - */ -export const AGENT_NAME_HEADER = "upstash-agent-name"; +import { AGENT_NAME_HEADER } from "./constants"; /** * creates an AI SDK openai client with a custom diff --git a/src/agents/agent.test.ts b/src/agents/agent.test.ts new file mode 100644 index 0000000..4ba4d3a --- /dev/null +++ b/src/agents/agent.test.ts @@ -0,0 +1,236 @@ +import { describe, test, expect } from "bun:test"; +import { Agent, ManagerAgent } from "./agent"; +import { WorkflowContext } from "../context"; +import { MOCK_QSTASH_SERVER_URL, mockQStashServer, WORKFLOW_ENDPOINT } from "../test-utils"; +import { Client } from "@upstash/qstash"; +import { getWorkflowRunId, nanoid } from "../utils"; +import { WorkflowAgents } from "."; +import { tool } from "ai"; +import { z } from "zod"; + +describe("agents", () => { + const openaiToken = nanoid(); + process.env["OPENAI_API_KEY"] = openaiToken; + + const token = getWorkflowRunId(); + const workflowRunId = nanoid(); + const context = new WorkflowContext({ + headers: new Headers({}) as Headers, + initialPayload: "mock", + qstashClient: new Client({ baseUrl: MOCK_QSTASH_SERVER_URL, token }), + steps: [], + url: WORKFLOW_ENDPOINT, + workflowRunId, + }); + + const agentsApi = new WorkflowAgents({ context }); + + const background = "an agent"; + const maxSteps = 2; + const name = "my agent"; + const temparature = 0.4; + const model = agentsApi.openai("gpt-3.5-turbo"); + + const agent = new Agent({ + tools: { + tool: tool({ + description: "ai sdk tool", + parameters: z.object({ expression: z.string() }), + execute: async ({ expression }) => expression, + }), + }, + background, + maxSteps, + name, + model, + temparature, + }); + + describe("single agent", () => { + test("should initialize and call agent", async () => { + expect(agent.background).toBe(background); + expect(agent.maxSteps).toBe(maxSteps); + expect(agent.model.modelId).toBe(model.modelId); + expect(agent.model.provider).toBe(model.provider); + expect(agent.name).toBe(name); + expect(agent.temparature).toBe(temparature); + expect(Object.entries(agent.tools).length).toBe(1); + expect(agent.tools["tool"]).toBeDefined(); + + await mockQStashServer({ + execute: () => { + const throws = async () => agent.call({ prompt: "my prompt" }); + expect(throws).toThrowError( + `Aborting workflow after executing step 'Call Agent my agent'` + ); + }, + responseFields: { + status: 200, + body: "msgId", + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/batch`, + token, + body: [ + { + body: '{"model":"gpt-3.5-turbo","temperature":0.4,"messages":[{"role":"system","content":"an agent"},{"role":"user","content":"my prompt"}],"tools":[{"type":"function","function":{"name":"tool","description":"ai sdk tool","parameters":{"type":"object","properties":{"expression":{"type":"string"}},"required":["expression"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}],"tool_choice":"auto"}', + destination: "https://api.openai.com/v1/chat/completions", + headers: { + "content-type": "application/json", + "upstash-callback": "https://requestcatcher.com/api", + "upstash-callback-feature-set": "LazyFetch,InitialBody", + "upstash-callback-forward-upstash-workflow-callback": "true", + "upstash-callback-forward-upstash-workflow-concurrent": "1", + "upstash-callback-forward-upstash-workflow-contenttype": "application/json", + "upstash-callback-forward-upstash-workflow-stepid": "1", + "upstash-callback-forward-upstash-workflow-stepname": "Call Agent my agent", + "upstash-callback-forward-upstash-workflow-steptype": "Call", + "upstash-callback-retries": "3", + "upstash-callback-workflow-calltype": "fromCallback", + "upstash-callback-workflow-init": "false", + "upstash-callback-workflow-runid": workflowRunId, + "upstash-callback-workflow-url": "https://requestcatcher.com/api", + "upstash-failure-callback-retries": "3", + "upstash-feature-set": "WF_NoDelete,InitialBody", + "upstash-forward-authorization": `Bearer ${openaiToken}`, + "upstash-forward-content-type": "application/json", + "upstash-forward-upstash-agent-name": "my agent", + "upstash-method": "POST", + "upstash-retries": "0", + "upstash-workflow-calltype": "toCallback", + "upstash-workflow-init": "false", + "upstash-workflow-runid": workflowRunId, + "upstash-workflow-url": "https://requestcatcher.com/api", + }, + }, + ], + }, + }); + }); + + test("should convert agent to tool", async () => { + const agentTool = agent.asTool(); + + // @ts-expect-error description exists but isn't accessible + expect(agentTool.description).toBe( + "An AI Agent with the following background: an agentHas access to the following tools: ai sdk tool" + ); + + await mockQStashServer({ + execute: () => { + const execute = agentTool.execute; + if (!execute) { + throw new Error("execute is missing."); + } else { + const throws = () => execute({ prompt: "hello" }, { messages: [], toolCallId: "id" }); + expect(throws).toThrowError( + `Aborting workflow after executing step 'Call Agent my agent'` + ); + } + }, + responseFields: { + status: 200, + body: "msgId", + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/batch`, + token, + body: [ + { + body: '{"model":"gpt-3.5-turbo","temperature":0.4,"messages":[{"role":"system","content":"an agent"},{"role":"user","content":"hello"}],"tools":[{"type":"function","function":{"name":"tool","description":"ai sdk tool","parameters":{"type":"object","properties":{"expression":{"type":"string"}},"required":["expression"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}],"tool_choice":"auto"}', + destination: "https://api.openai.com/v1/chat/completions", + headers: { + "content-type": "application/json", + "upstash-callback": "https://requestcatcher.com/api", + "upstash-callback-feature-set": "LazyFetch,InitialBody", + "upstash-callback-forward-upstash-workflow-callback": "true", + "upstash-callback-forward-upstash-workflow-concurrent": "1", + "upstash-callback-forward-upstash-workflow-contenttype": "application/json", + "upstash-callback-forward-upstash-workflow-stepid": "2", + "upstash-callback-forward-upstash-workflow-stepname": "Call Agent my agent", + "upstash-callback-forward-upstash-workflow-steptype": "Call", + "upstash-callback-retries": "3", + "upstash-callback-workflow-calltype": "fromCallback", + "upstash-callback-workflow-init": "false", + "upstash-callback-workflow-runid": workflowRunId, + "upstash-callback-workflow-url": "https://requestcatcher.com/api", + "upstash-failure-callback-retries": "3", + "upstash-feature-set": "WF_NoDelete,InitialBody", + "upstash-forward-authorization": `Bearer ${openaiToken}`, + "upstash-forward-content-type": "application/json", + "upstash-forward-upstash-agent-name": "my agent", + "upstash-method": "POST", + "upstash-retries": "0", + "upstash-workflow-calltype": "toCallback", + "upstash-workflow-init": "false", + "upstash-workflow-runid": workflowRunId, + "upstash-workflow-url": "https://requestcatcher.com/api", + }, + }, + ], + }, + }); + }); + }); + + test("multi agent", async () => { + const managerAgent = new ManagerAgent({ + agents: [agent], + maxSteps: 2, + model, + }); + + await mockQStashServer({ + execute: () => { + const throws = async () => managerAgent.call({ prompt: "my prompt" }); + expect(throws).toThrowError( + `Aborting workflow after executing step 'Call Agent manager llm'` + ); + }, + responseFields: { + status: 200, + body: "msgId", + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/batch`, + token, + body: [ + { + body: '{"model":"gpt-3.5-turbo","temperature":0.1,"messages":[{"role":"system","content":"You are an agent orchestrating other AI Agents.\\n\\nThese other agents have tools available to them.\\n\\nGiven a prompt, utilize these agents to address requests.\\n\\nDon\'t always call all the agents provided to you at the same time. You can call one and use it\'s response to call another.\\n\\nAvoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything\\nyou need from that agent.\\n"},{"role":"user","content":"my prompt"}],"tools":[{"type":"function","function":{"name":"my agent","description":"An AI Agent with the following background: an agentHas access to the following tools: ai sdk tool","parameters":{"type":"object","properties":{"prompt":{"type":"string"}},"required":["prompt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}],"tool_choice":"auto"}', + destination: "https://api.openai.com/v1/chat/completions", + headers: { + "content-type": "application/json", + "upstash-callback": "https://requestcatcher.com/api", + "upstash-callback-feature-set": "LazyFetch,InitialBody", + "upstash-callback-forward-upstash-workflow-callback": "true", + "upstash-callback-forward-upstash-workflow-concurrent": "1", + "upstash-callback-forward-upstash-workflow-contenttype": "application/json", + "upstash-callback-forward-upstash-workflow-stepid": "3", + "upstash-callback-forward-upstash-workflow-stepname": "Call Agent manager llm", + "upstash-callback-forward-upstash-workflow-steptype": "Call", + "upstash-callback-retries": "3", + "upstash-callback-workflow-calltype": "fromCallback", + "upstash-callback-workflow-init": "false", + "upstash-callback-workflow-runid": workflowRunId, + "upstash-callback-workflow-url": "https://requestcatcher.com/api", + "upstash-failure-callback-retries": "3", + "upstash-feature-set": "WF_NoDelete,InitialBody", + "upstash-forward-authorization": `Bearer ${openaiToken}`, + "upstash-forward-content-type": "application/json", + "upstash-forward-upstash-agent-name": "manager llm", + "upstash-method": "POST", + "upstash-retries": "0", + "upstash-workflow-calltype": "toCallback", + "upstash-workflow-init": "false", + "upstash-workflow-runid": workflowRunId, + "upstash-workflow-url": "https://requestcatcher.com/api", + }, + }, + ], + }, + }); + }); +}); diff --git a/src/agents/agent.ts b/src/agents/agent.ts index b6a724f..2336ca8 100644 --- a/src/agents/agent.ts +++ b/src/agents/agent.ts @@ -1,8 +1,8 @@ import { z } from "zod"; -import { AGENT_NAME_HEADER } from "./adapters"; import { generateText, tool, ToolExecutionError } from "ai"; -import { AgentParameters, AISDKTool, Model } from "./types"; +import { AgentParameters, AISDKTool, ManagerAgentParameters } from "./types"; +import { AGENT_NAME_HEADER, MANAGER_AGENT_PROMPT } from "./constants"; /** * An Agent which utilizes the model and tools available to it @@ -95,30 +95,6 @@ export class Agent { } } -type ManagerAgentParameters = { - /** - * agents which will coordinate to achieve a given task - */ - agents: Agent[]; - /** - * model to use when coordinating the agents - */ - model: Model; -} & Pick, "name" | "background"> & - Pick; - -const MANAGER_AGENT_PROMPT = `You are an agent orchestrating other AI Agents. - -These other agents have tools available to them. - -Given a prompt, utilize these agents to address requests. - -Don't always call all the agents provided to you at the same time. You can call one and use it's response to call another. - -Avoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything -you need from that agent. -`; - export class ManagerAgent extends Agent { public agents: ManagerAgentParameters["agents"]; diff --git a/src/agents/constants.ts b/src/agents/constants.ts new file mode 100644 index 0000000..d2c6625 --- /dev/null +++ b/src/agents/constants.ts @@ -0,0 +1,19 @@ +/** + * header we pass to generateText to designate the agent name + * + * this allows us to access the agent name when naming the context.call step, + * inside fetch implementation + */ +export const AGENT_NAME_HEADER = "upstash-agent-name"; + +export const MANAGER_AGENT_PROMPT = `You are an agent orchestrating other AI Agents. + +These other agents have tools available to them. + +Given a prompt, utilize these agents to address requests. + +Don't always call all the agents provided to you at the same time. You can call one and use it's response to call another. + +Avoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything +you need from that agent. +`; diff --git a/src/agents/task.test.ts b/src/agents/task.test.ts new file mode 100644 index 0000000..be9398d --- /dev/null +++ b/src/agents/task.test.ts @@ -0,0 +1,179 @@ +import { describe, test, expect } from "bun:test"; +import { getWorkflowRunId, nanoid } from "../utils"; +import { WorkflowContext } from "../context"; +import { Client } from "@upstash/qstash"; +import { MOCK_QSTASH_SERVER_URL, mockQStashServer, WORKFLOW_ENDPOINT } from "../test-utils"; +import { WorkflowAgents } from "."; +import { tool } from "ai"; +import { z } from "zod"; + +describe("tasks", () => { + const openaiToken = nanoid(); + process.env["OPENAI_API_KEY"] = openaiToken; + + const getAgentsApi = () => { + const token = getWorkflowRunId(); + const workflowRunId = nanoid(); + + const context = new WorkflowContext({ + headers: new Headers({}) as Headers, + initialPayload: "mock", + qstashClient: new Client({ baseUrl: MOCK_QSTASH_SERVER_URL, token }), + steps: [ + { stepId: 0, stepName: "init", concurrent: 1, stepType: "Initial" }, + { stepId: 1, stepName: "Get Prompt", stepType: "Run", out: "hello world!", concurrent: 1 }, + ], + url: WORKFLOW_ENDPOINT, + workflowRunId, + }); + + const agentsApi = new WorkflowAgents({ context }); + + const background = "an agent"; + const maxSteps = 2; + const name = "my agent"; + const temparature = 0.4; + const model = agentsApi.openai("gpt-3.5-turbo"); + + const agent = agentsApi.agent({ + tools: { + tool: tool({ + description: "ai sdk tool", + parameters: z.object({ expression: z.string() }), + execute: async ({ expression }) => expression, + }), + }, + background, + maxSteps, + name, + model, + temparature, + }); + + return { + agent, + token, + workflowRunId, + context, + agentsApi, + }; + }; + + test("single agent", async () => { + const { agentsApi, agent, token, workflowRunId } = getAgentsApi(); + const task = agentsApi.task({ + agent, + prompt: "hello world!", + }); + + await mockQStashServer({ + execute: () => { + const throws = () => task.run(); + expect(throws).toThrowError(`Aborting workflow after executing step 'Call Agent my agent'`); + }, + responseFields: { + status: 200, + body: "msgId", + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/batch`, + token, + body: [ + { + body: '{"model":"gpt-3.5-turbo","temperature":0.4,"messages":[{"role":"system","content":"an agent"},{"role":"user","content":"hello world!"}],"tools":[{"type":"function","function":{"name":"tool","description":"ai sdk tool","parameters":{"type":"object","properties":{"expression":{"type":"string"}},"required":["expression"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}],"tool_choice":"auto"}', + destination: "https://api.openai.com/v1/chat/completions", + headers: { + "content-type": "application/json", + "upstash-callback": "https://requestcatcher.com/api", + "upstash-callback-feature-set": "LazyFetch,InitialBody", + "upstash-callback-forward-upstash-workflow-callback": "true", + "upstash-callback-forward-upstash-workflow-concurrent": "1", + "upstash-callback-forward-upstash-workflow-contenttype": "application/json", + "upstash-callback-forward-upstash-workflow-stepid": "2", + "upstash-callback-forward-upstash-workflow-stepname": "Call Agent my agent", + "upstash-callback-forward-upstash-workflow-steptype": "Call", + "upstash-callback-retries": "3", + "upstash-callback-workflow-calltype": "fromCallback", + "upstash-callback-workflow-init": "false", + "upstash-callback-workflow-runid": workflowRunId, + "upstash-callback-workflow-url": "https://requestcatcher.com/api", + "upstash-failure-callback-retries": "3", + "upstash-feature-set": "WF_NoDelete,InitialBody", + "upstash-forward-authorization": `Bearer ${openaiToken}`, + "upstash-forward-content-type": "application/json", + "upstash-forward-upstash-agent-name": "my agent", + "upstash-method": "POST", + "upstash-retries": "0", + "upstash-workflow-calltype": "toCallback", + "upstash-workflow-init": "false", + "upstash-workflow-runid": workflowRunId, + "upstash-workflow-url": "https://requestcatcher.com/api", + }, + }, + ], + }, + }); + }); + + test("multi agent", async () => { + const { agentsApi, agent, token, workflowRunId } = getAgentsApi(); + const task = agentsApi.task({ + agents: [agent], + model: agentsApi.openai("gpt-3.5-turbo"), + maxSteps: 2, + prompt: "hello world!", + }); + + await mockQStashServer({ + execute: () => { + const throws = () => task.run(); + expect(throws).toThrowError( + `Aborting workflow after executing step 'Call Agent Manager LLM'` + ); + }, + responseFields: { + status: 200, + body: "msgId", + }, + receivesRequest: { + method: "POST", + url: `${MOCK_QSTASH_SERVER_URL}/v2/batch`, + token, + body: [ + { + body: '{"model":"gpt-3.5-turbo","temperature":0.1,"messages":[{"role":"system","content":"You are an agent orchestrating other AI Agents.\\n\\nThese other agents have tools available to them.\\n\\nGiven a prompt, utilize these agents to address requests.\\n\\nDon\'t always call all the agents provided to you at the same time. You can call one and use it\'s response to call another.\\n\\nAvoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything\\nyou need from that agent.\\n"},{"role":"user","content":"hello world!"}],"tools":[{"type":"function","function":{"name":"my agent","description":"An AI Agent with the following background: an agentHas access to the following tools: ai sdk tool","parameters":{"type":"object","properties":{"prompt":{"type":"string"}},"required":["prompt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}}],"tool_choice":"auto"}', + destination: "https://api.openai.com/v1/chat/completions", + headers: { + "content-type": "application/json", + "upstash-callback": "https://requestcatcher.com/api", + "upstash-callback-feature-set": "LazyFetch,InitialBody", + "upstash-callback-forward-upstash-workflow-callback": "true", + "upstash-callback-forward-upstash-workflow-concurrent": "1", + "upstash-callback-forward-upstash-workflow-contenttype": "application/json", + "upstash-callback-forward-upstash-workflow-stepid": "2", + "upstash-callback-forward-upstash-workflow-stepname": "Call Agent Manager LLM", + "upstash-callback-forward-upstash-workflow-steptype": "Call", + "upstash-callback-retries": "3", + "upstash-callback-workflow-calltype": "fromCallback", + "upstash-callback-workflow-init": "false", + "upstash-callback-workflow-runid": workflowRunId, + "upstash-callback-workflow-url": "https://requestcatcher.com/api", + "upstash-failure-callback-retries": "3", + "upstash-feature-set": "WF_NoDelete,InitialBody", + "upstash-forward-authorization": `Bearer ${openaiToken}`, + "upstash-forward-content-type": "application/json", + "upstash-forward-upstash-agent-name": "Manager LLM", + "upstash-method": "POST", + "upstash-retries": "0", + "upstash-workflow-calltype": "toCallback", + "upstash-workflow-init": "false", + "upstash-workflow-runid": workflowRunId, + "upstash-workflow-url": "https://requestcatcher.com/api", + }, + }, + ], + }, + }); + }); +}); diff --git a/src/agents/types.ts b/src/agents/types.ts index 5eac4ae..0459f39 100644 --- a/src/agents/types.ts +++ b/src/agents/types.ts @@ -76,3 +76,15 @@ export type MultiAgentTaskParams = TaskParams & { */ background?: string; }; + +export type ManagerAgentParameters = { + /** + * agents which will coordinate to achieve a given task + */ + agents: Agent[]; + /** + * model to use when coordinating the agents + */ + model: Model; +} & Pick, "name" | "background"> & + Pick; From 458224c53a054bbf482a0a129713c53287591950 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Tue, 21 Jan 2025 14:33:02 +0300 Subject: [PATCH 15/16] fix: rm Get Payload step --- src/agents/agent.ts | 2 +- src/agents/task.ts | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/agents/agent.ts b/src/agents/agent.ts index 2336ca8..9deab67 100644 --- a/src/agents/agent.ts +++ b/src/agents/agent.ts @@ -47,7 +47,7 @@ export class Agent { tools: this.tools, maxSteps: this.maxSteps, system: this.background, - prompt, + prompt: prompt ?? "", headers: { [AGENT_NAME_HEADER]: this.name, }, diff --git a/src/agents/task.ts b/src/agents/task.ts index 143022a..6e91d83 100644 --- a/src/agents/task.ts +++ b/src/agents/task.ts @@ -54,15 +54,10 @@ export class Task { public async run(): Promise<{ text: string }> { const { prompt, ...otherParams } = this.taskParameters; - // during context.call execution, prompt may become undefined if it's derived from - // context.requestPayload. generateText will throw in this case. Put a context.run - // to guard against this. - const safePrompt = await this.context.run("Get Prompt", () => prompt); - if ("agent" in otherParams) { const agent = otherParams.agent; const result = await agent.call({ - prompt: safePrompt, + prompt, }); return { text: result.text }; } else { @@ -75,7 +70,7 @@ export class Task { background, }); - const result = await managerAgent.call({ prompt: safePrompt }); + const result = await managerAgent.call({ prompt }); return { text: result.text }; } } From 82b7a3f49db57032998642a535461c397e04ccc9 Mon Sep 17 00:00:00 2001 From: CahidArda Date: Tue, 21 Jan 2025 20:42:13 +0300 Subject: [PATCH 16/16] fix: check disabledContext in agent.call --- src/agents/agent.test.ts | 91 +++++++++++++++++++++++++-------- src/agents/agent.ts | 49 ++++++++++++------ src/agents/index.ts | 11 ++-- src/agents/task.test.ts | 100 +++++++++++++++++++++---------------- src/agents/task.ts | 17 ++++--- src/serve/authorization.ts | 1 + src/serve/utils.test.ts | 33 ++++++++++++ src/serve/utils.ts | 6 +++ 8 files changed, 218 insertions(+), 90 deletions(-) create mode 100644 src/serve/utils.test.ts create mode 100644 src/serve/utils.ts diff --git a/src/agents/agent.test.ts b/src/agents/agent.test.ts index 4ba4d3a..efd8233 100644 --- a/src/agents/agent.test.ts +++ b/src/agents/agent.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "bun:test"; +import { describe, test, expect, beforeEach } from "bun:test"; import { Agent, ManagerAgent } from "./agent"; import { WorkflowContext } from "../context"; import { MOCK_QSTASH_SERVER_URL, mockQStashServer, WORKFLOW_ENDPOINT } from "../test-utils"; @@ -7,10 +7,13 @@ import { getWorkflowRunId, nanoid } from "../utils"; import { WorkflowAgents } from "."; import { tool } from "ai"; import { z } from "zod"; +import { getAgentsApi } from "./task.test"; describe("agents", () => { const openaiToken = nanoid(); - process.env["OPENAI_API_KEY"] = openaiToken; + beforeEach(() => { + process.env["OPENAI_API_KEY"] = openaiToken; + }); const token = getWorkflowRunId(); const workflowRunId = nanoid(); @@ -31,20 +34,23 @@ describe("agents", () => { const temparature = 0.4; const model = agentsApi.openai("gpt-3.5-turbo"); - const agent = new Agent({ - tools: { - tool: tool({ - description: "ai sdk tool", - parameters: z.object({ expression: z.string() }), - execute: async ({ expression }) => expression, - }), + const agent = new Agent( + { + tools: { + tool: tool({ + description: "ai sdk tool", + parameters: z.object({ expression: z.string() }), + execute: async ({ expression }) => expression, + }), + }, + background, + maxSteps, + name, + model, + temparature, }, - background, - maxSteps, - name, - model, - temparature, - }); + context + ); describe("single agent", () => { test("should initialize and call agent", async () => { @@ -176,11 +182,14 @@ describe("agents", () => { }); test("multi agent", async () => { - const managerAgent = new ManagerAgent({ - agents: [agent], - maxSteps: 2, - model, - }); + const managerAgent = new ManagerAgent( + { + agents: [agent], + maxSteps: 2, + model, + }, + context + ); await mockQStashServer({ execute: () => { @@ -233,4 +242,46 @@ describe("agents", () => { }, }); }); + + describe("disabled context", () => { + const { agent } = getAgentsApi({ disabledContext: true }); + test("should throw abort when empty prompt", async () => { + // @ts-expect-error for testing purposes, prompt is object + const prompt: string = { some: "object" }; + + await mockQStashServer({ + execute: async () => { + const throws = () => agent.call({ prompt }); + expect(throws).toThrow( + "Aborting workflow after executing step 'disabled-qstash-worklfow-run'" + ); + }, + receivesRequest: false, + responseFields: { + body: "", + status: 200, + }, + }); + }); + + test("should throw abort when object prompt", async () => { + // @ts-expect-error for testing purposes, prompt is undefiend + const prompt: string = undefined; + + await mockQStashServer({ + execute: async () => { + const throws = () => agent.call({ prompt }); + expect(throws).toThrow( + "Aborting workflow after executing step 'disabled-qstash-worklfow-run'" + ); + }, + receivesRequest: false, + responseFields: { + body: "", + status: 200, + }, + }); + }); + }); + test("disabled context with empty or object prompt should throw abort", async () => {}); }); diff --git a/src/agents/agent.ts b/src/agents/agent.ts index 9deab67..8c75377 100644 --- a/src/agents/agent.ts +++ b/src/agents/agent.ts @@ -3,6 +3,8 @@ import { z } from "zod"; import { generateText, tool, ToolExecutionError } from "ai"; import { AgentParameters, AISDKTool, ManagerAgentParameters } from "./types"; import { AGENT_NAME_HEADER, MANAGER_AGENT_PROMPT } from "./constants"; +import { WorkflowContext } from "../context"; +import { isDisabledWorkflowContext } from "../serve/utils"; /** * An Agent which utilizes the model and tools available to it @@ -24,14 +26,19 @@ export class Agent { public readonly background: AgentParameters["background"]; public readonly model: AgentParameters["model"]; public readonly temparature: AgentParameters["temparature"]; + private readonly context: WorkflowContext; - constructor({ tools, maxSteps, background, name, model, temparature = 0.1 }: AgentParameters) { + constructor( + { tools, maxSteps, background, name, model, temparature = 0.1 }: AgentParameters, + context: WorkflowContext + ) { this.name = name; this.tools = tools ?? {}; this.maxSteps = maxSteps; this.background = background; this.model = model; this.temparature = temparature; + this.context = context; } /** @@ -42,12 +49,18 @@ export class Agent { */ public async call({ prompt }: { prompt: string }) { try { + if (isDisabledWorkflowContext(this.context)) { + // since the context is a disabled context, assume that the request has authenticated. + // in order to authorize the request, run a mock step to throw WorkflowAbort. + await this.context.sleep("abort", 0); + } + const result = await generateText({ model: this.model, tools: this.tools, maxSteps: this.maxSteps, system: this.background, - prompt: prompt ?? "", + prompt: prompt, headers: { [AGENT_NAME_HEADER]: this.name, }, @@ -110,20 +123,26 @@ export class ManagerAgent extends Agent { * If the agent abruptly stops execution after calling other agents, you may * need to increase maxSteps */ - constructor({ - agents, - background = MANAGER_AGENT_PROMPT, - model, - maxSteps, - name = "manager llm", - }: ManagerAgentParameters) { - super({ - background, - maxSteps, - tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])), - name, + constructor( + { + agents, + background = MANAGER_AGENT_PROMPT, model, - }); + maxSteps, + name = "manager llm", + }: ManagerAgentParameters, + context: WorkflowContext + ) { + super( + { + background, + maxSteps, + tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])), + name, + model, + }, + context + ); this.agents = agents; } } diff --git a/src/agents/index.ts b/src/agents/index.ts index b00abcf..c699dee 100644 --- a/src/agents/index.ts +++ b/src/agents/index.ts @@ -54,10 +54,13 @@ export class WorkflowAgents { // wrap tools of agent with context.run const wrappedTools = wrapTools({ context: this.context, tools: params.tools }); - return new Agent({ - ...params, - tools: wrappedTools, - }); + return new Agent( + { + ...params, + tools: wrappedTools, + }, + this.context + ); } /** diff --git a/src/agents/task.test.ts b/src/agents/task.test.ts index be9398d..6c46153 100644 --- a/src/agents/task.test.ts +++ b/src/agents/task.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "bun:test"; +import { describe, test, expect, beforeEach } from "bun:test"; import { getWorkflowRunId, nanoid } from "../utils"; import { WorkflowContext } from "../context"; import { Client } from "@upstash/qstash"; @@ -6,61 +6,73 @@ import { MOCK_QSTASH_SERVER_URL, mockQStashServer, WORKFLOW_ENDPOINT } from "../ import { WorkflowAgents } from "."; import { tool } from "ai"; import { z } from "zod"; +import { DisabledWorkflowContext } from "../serve/authorization"; -describe("tasks", () => { - const openaiToken = nanoid(); - process.env["OPENAI_API_KEY"] = openaiToken; - - const getAgentsApi = () => { - const token = getWorkflowRunId(); - const workflowRunId = nanoid(); +export const getAgentsApi = ({ disabledContext }: { disabledContext: boolean }) => { + const token = getWorkflowRunId(); + const workflowRunId = nanoid(); - const context = new WorkflowContext({ + let context: WorkflowContext; + if (disabledContext) { + context = new DisabledWorkflowContext({ + headers: new Headers({}) as Headers, + initialPayload: "mock", + qstashClient: new Client({ baseUrl: MOCK_QSTASH_SERVER_URL, token }), + steps: [{ stepId: 0, stepName: "init", concurrent: 1, stepType: "Initial" }], + url: WORKFLOW_ENDPOINT, + workflowRunId, + }); + } else { + context = new WorkflowContext({ headers: new Headers({}) as Headers, initialPayload: "mock", qstashClient: new Client({ baseUrl: MOCK_QSTASH_SERVER_URL, token }), - steps: [ - { stepId: 0, stepName: "init", concurrent: 1, stepType: "Initial" }, - { stepId: 1, stepName: "Get Prompt", stepType: "Run", out: "hello world!", concurrent: 1 }, - ], + steps: [{ stepId: 0, stepName: "init", concurrent: 1, stepType: "Initial" }], url: WORKFLOW_ENDPOINT, workflowRunId, }); + } - const agentsApi = new WorkflowAgents({ context }); + const agentsApi = new WorkflowAgents({ context }); - const background = "an agent"; - const maxSteps = 2; - const name = "my agent"; - const temparature = 0.4; - const model = agentsApi.openai("gpt-3.5-turbo"); + const background = "an agent"; + const maxSteps = 2; + const name = "my agent"; + const temparature = 0.4; + const model = agentsApi.openai("gpt-3.5-turbo"); - const agent = agentsApi.agent({ - tools: { - tool: tool({ - description: "ai sdk tool", - parameters: z.object({ expression: z.string() }), - execute: async ({ expression }) => expression, - }), - }, - background, - maxSteps, - name, - model, - temparature, - }); + const agent = agentsApi.agent({ + tools: { + tool: tool({ + description: "ai sdk tool", + parameters: z.object({ expression: z.string() }), + execute: async ({ expression }) => expression, + }), + }, + background, + maxSteps, + name, + model, + temparature, + }); - return { - agent, - token, - workflowRunId, - context, - agentsApi, - }; + return { + agent, + token, + workflowRunId, + context, + agentsApi, }; +}; + +describe("tasks", () => { + const openaiToken = nanoid(); + beforeEach(() => { + process.env["OPENAI_API_KEY"] = openaiToken; + }); test("single agent", async () => { - const { agentsApi, agent, token, workflowRunId } = getAgentsApi(); + const { agentsApi, agent, token, workflowRunId } = getAgentsApi({ disabledContext: false }); const task = agentsApi.task({ agent, prompt: "hello world!", @@ -90,7 +102,7 @@ describe("tasks", () => { "upstash-callback-forward-upstash-workflow-callback": "true", "upstash-callback-forward-upstash-workflow-concurrent": "1", "upstash-callback-forward-upstash-workflow-contenttype": "application/json", - "upstash-callback-forward-upstash-workflow-stepid": "2", + "upstash-callback-forward-upstash-workflow-stepid": "1", "upstash-callback-forward-upstash-workflow-stepname": "Call Agent my agent", "upstash-callback-forward-upstash-workflow-steptype": "Call", "upstash-callback-retries": "3", @@ -117,7 +129,7 @@ describe("tasks", () => { }); test("multi agent", async () => { - const { agentsApi, agent, token, workflowRunId } = getAgentsApi(); + const { agentsApi, agent, token, workflowRunId } = getAgentsApi({ disabledContext: false }); const task = agentsApi.task({ agents: [agent], model: agentsApi.openai("gpt-3.5-turbo"), @@ -151,7 +163,7 @@ describe("tasks", () => { "upstash-callback-forward-upstash-workflow-callback": "true", "upstash-callback-forward-upstash-workflow-concurrent": "1", "upstash-callback-forward-upstash-workflow-contenttype": "application/json", - "upstash-callback-forward-upstash-workflow-stepid": "2", + "upstash-callback-forward-upstash-workflow-stepid": "1", "upstash-callback-forward-upstash-workflow-stepname": "Call Agent Manager LLM", "upstash-callback-forward-upstash-workflow-steptype": "Call", "upstash-callback-retries": "3", diff --git a/src/agents/task.ts b/src/agents/task.ts index 6e91d83..cc4689f 100644 --- a/src/agents/task.ts +++ b/src/agents/task.ts @@ -62,13 +62,16 @@ export class Task { return { text: result.text }; } else { const { agents, maxSteps, model, background } = otherParams; - const managerAgent = new ManagerAgent({ - model, - maxSteps, - agents, - name: "Manager LLM", - background, - }); + const managerAgent = new ManagerAgent( + { + model, + maxSteps, + agents, + name: "Manager LLM", + background, + }, + this.context + ); const result = await managerAgent.call({ prompt }); return { text: result.text }; diff --git a/src/serve/authorization.ts b/src/serve/authorization.ts index d87ffaf..8e69af7 100644 --- a/src/serve/authorization.ts +++ b/src/serve/authorization.ts @@ -35,6 +35,7 @@ export class DisabledWorkflowContext< TInitialPayload = unknown, > extends WorkflowContext { private static readonly disabledMessage = "disabled-qstash-worklfow-run"; + public readonly disabled = true; /** * overwrite the WorkflowContext.addStep method to always raise WorkflowAbort diff --git a/src/serve/utils.test.ts b/src/serve/utils.test.ts new file mode 100644 index 0000000..41e0543 --- /dev/null +++ b/src/serve/utils.test.ts @@ -0,0 +1,33 @@ +import { describe, test, expect } from "bun:test"; +import { WorkflowContext } from "../context"; +import { Client } from "@upstash/qstash"; +import { isDisabledWorkflowContext } from "./utils"; +import { DisabledWorkflowContext } from "./authorization"; + +describe("isDisabledWorkflowContext", () => { + test("should return false for context", () => { + const context = new WorkflowContext({ + qstashClient: new Client({ token: "mock" }), + headers: new Headers({}) as Headers, + initialPayload: "", + steps: [], + url: "", + workflowRunId: "", + }); + + expect(isDisabledWorkflowContext(context)).toBeFalse(); + }); + + test("should return true for disabled context", () => { + const context = new DisabledWorkflowContext({ + qstashClient: new Client({ token: "mock" }), + headers: new Headers({}) as Headers, + initialPayload: "", + steps: [], + url: "", + workflowRunId: "", + }); + + expect(isDisabledWorkflowContext(context)).toBeTrue(); + }); +}); diff --git a/src/serve/utils.ts b/src/serve/utils.ts new file mode 100644 index 0000000..d9eccd3 --- /dev/null +++ b/src/serve/utils.ts @@ -0,0 +1,6 @@ +import { WorkflowContext } from "../context"; +import { DisabledWorkflowContext } from "./authorization"; + +export const isDisabledWorkflowContext = (context: WorkflowContext | DisabledWorkflowContext) => { + return "disabled" in context; +};