From c174e9981dfbaca8bd0841bd39b513fb667c9823 Mon Sep 17 00:00:00 2001 From: Dani Date: Sun, 19 May 2024 18:15:09 -0700 Subject: [PATCH 1/7] flesh out instruction sets --- src/util/models/constants.js | 43 ++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/src/util/models/constants.js b/src/util/models/constants.js index 572b8c7..312d766 100644 --- a/src/util/models/constants.js +++ b/src/util/models/constants.js @@ -1,12 +1,37 @@ export const instructionSets = { - default: "You are an AI chatbot.", - defaultStrictImages: `You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.`, - spongeass: `You are roleplaying as SpongeAss. -You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. -SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". -SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" -SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. -SpongeAss keeps responses short and human-like.`, + default: { + name: "Default", + instructions: [ + { + role: "system", + content: "You are an AI chatbot.", + }, + ], + }, + defaultStrictImages: { + name: "Default (Strict Images)", + instructions: [ + { + role: "system", + content: + "You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.", + }, + ], + }, + spongeass: { + name: "SpongeAss", + instructions: [ + { + role: "system", + content: `You are roleplaying as SpongeAss. + You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. + SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". + SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" + SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. + SpongeAss keeps responses short and human-like.`, + }, + ], + }, }; export const events = { @@ -20,7 +45,7 @@ export const events = { amnesia: { title: "🧠 Amnesia", statuses: { - default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌" + default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌", }, }, }; From 013280acf097de4ff13591318a31087d648eb927 Mon Sep 17 00:00:00 2001 From: Dani Date: Sun, 19 May 2024 23:07:39 -0700 Subject: [PATCH 2/7] this branch is so broken, but steam's running out --- .env.example | 9 +- bun.lockb | Bin 379437 -> 393995 bytes package.json | 89 +++++------ src/commands/instructionSet.js | 4 +- src/events/messageCreate.js | 49 +++++-- src/events/ready.js | 5 +- src/index.js | 5 +- src/util/integrations/index.js | 82 +++++++++++ src/util/models/constants.js | 3 + src/util/models/index.js | 10 +- src/util/models/interactions.js | 253 +++++++++++++++++++++++++------- 11 files changed, 392 insertions(+), 117 deletions(-) create mode 100644 src/util/integrations/index.js diff --git a/.env.example b/.env.example index 0b229f0..ba71d1a 100644 --- a/.env.example +++ b/.env.example @@ -46,11 +46,18 @@ CLOUDFLARE_ACCOUNT_ID=abcdef1234567890abcdef1234567890 CLOUDFLARE_ACCOUNT_TOKEN=v1.0-abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 +# OpenAI API: Specify an OpenAI account token for use with the OpenAI API. +OPENAI_ACCOUNT_TOKEN=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + # The following variables specify instruction sets and configuration for the various models in SpongeChat. ## The value of the variable should correspond to the key of its' responding configuration in modelConstants.js. MODEL_LLM_PRESET=default +## Callsystems are used to call functions during passive activation. +## Integrations is the newer, flexible function system. They are easily extendable, but require the use of the OpenAI API to determine function calls. +## Legacy is the older function system and only supports image generation. Use this if you can't use the OpenAI API. +MODEL_LLM_CALLSYSTEM=integrations -# !! Wastebin +# !! Wastebin # Used to display logs of memories for users ## In a docker-compose setup, you'll need to set up some sort of proxy (caddy, cloudflare tunnel) to make the "wastebin" container publicly accessible, and put the publicly accessible URL here. diff --git a/bun.lockb b/bun.lockb index 82d18f1414d21d58ce720edab7f581233587dfe3..8da124c71307fe906ae2c176137346499f9038a3 100644 GIT binary patch delta 87023 zcmeFa2UJwo`aV1}IywhMMPtFa1gs#A{uP5A&!93i(&;kLP*3Db2N4h_7XL= z*t=rXV6U+x_7;s8HPQT^=j=UZZhqeTzu#}IZ++`q%d;*#`+0VI_q*S{_bHgW=F8$~ zQ%X#)QzNofaOe0VohKx(ZDD`b)+_75z2Mdlk}riMK8fn}MbXlON1O5(c>S2svs_Z4 zgSm7fez_S8$)lnM>m(r|Oiv_44h{qru<~jCBkSi-R`IWH1y4Zv&)0 zGAKMeEH2(q01f8{e+#`3u)oaz8g=r4cLUF#ghW#&fa{P!3{OamibQ&FRJqtP5h#T)zB*qDg~Y8Udf8_ab6K&iH_Jy;56hd%6$Y3j~W~l7iuuvgU%5< z4Gazq3Ll2{FQ73R6dDxgH6%PJP6Ig- ztHfyZLf6*@r@_B~vz_x29g*>2@nMd*EXjML9FoanP>JoFE)4%eOAd~Uiys;7Ftm3z z92FN2&G0k)M1vxOBBK}$3&H7;HL#`>FfJ-QY_QkRxKH37wiD-wjT#;lZisaR1;@km z!o@`S{y=*6GKNos<3_|{Vhx5x+W3z1hg80VzOwASo6J7?(TBSw-2q@EBP?lm+jEOHDu%RekD47edN&Ji)(fw4p!!L+D8h9G{tRGWe zZ!anNN0CU54Q4Tep?d`poe^P?VG&qI09|hnoek_PFY=dG6b+TDBn%4&(oi=bgY_+t z<)5Kk31CPRCj_giiYV_7EP(h+?j?ohK)NoeswglV$f;=voeft6(q#pK2!rH{)r0|W zD+_&Tby44`4|9yv=Qyl}Fk}Yu8N?%ijGf1*SBUHXA`-OtZcQ--N0|X07UvZi9bqu+ zg3FknueRvW0OZJ=o7msU^8>j`S~L(HH2`wXvEKEL zOCX>9q90$qqg)W!;p=(=e+9BZXG8z&Aij}^<`xaqmAT6%4QV1aw!T1C>jGqd*k__f zz|e(OG4SJ!Me`xyQQRL55jNrIsK{Uk`H0w{=;)CM5$H50xT%Qk!$7vX4aj!GB10Xq zVexTckwe16LPA@`_eKQ{$Qkqvy+s2tSRB;<1ovQmRPZn^DAh+eXc~|Wmujx2n#(4A zhhn6Uf$ZlRkZbFVT@;UW#76|h4KtMY70o*0qGQ7%f(*;SY45}qqP`<8AwDcT&M;E) z1v38x+M^k}fDEt@N4!@;Y?xt4oR=dpJ~k<6MoZDr(733`Az|T;cHrDC>_B#~35Jvd zI>$Ev<7585*22N%+lYoefHeFkAa|XPZAJbPAOqtGkOSN#>+M3hd|Zo@+KG<7Mgev> z9R-MK?ZuiibP$VqBse<`iHaT!e;OWwb8Usi1;xe&jWnD^gRHmOUl@YOjdNiA10#Z> z4Thu0ry(oRJ}0Pl7kDNKi6K$3Uf8=sZ*&qFrGUktcl+32z!sWZ1_e1X&#q!kt^~59 zuYrYt(|~kwveXLz*+D+kqrqi6i;+JE(lb{j9s?$^zp+h5ERdcX5gHa8iuS_d&@%Ajfuf&^=!E6`l4OObSayrX>Wc>BuvyS`&h4x+ zxE=#QHf)ypPW&C!8Ql+nH0TD99(+Am=uy%7?#W;r5f^SS%!M`dL{j}B!t&1`&}CzR z?8rStxYh(@hbw^81IvhpTVq(9^JYMH^ax0UuSngwjD1m_Q`lJ6gC`wcg9jOEfWy%4 z$xVg{S5yPCgCamSWB}5_CqqR?usk>n9tsY_$ulI%5EdDe5Eko*bsh+@i9@-~8J0w- zv2In9JpbV+r-T0Km_cv`ues5p`@ev65$np(9@elxK_DG;2FRJg-BIjd>{)-kPUqTq=TLJ5IjHz zjYK>T7ygP1*YA4`g~8cQSV&}4EGAFUIrg=v5u)QwKo%Gj8x-t-5w#PA9t-414*;1T z;fM`!G{8xO^7+_coR@xRtwX0Az$efP0fz*|#ltDM-%N-L8#2<+Xq1?!93ThcHyWPc zzSde+c$^?sVQEacJM@q+90Bms+%cl#Ye05TWvt-nIF7gU|6GjDdx-zrqU2&s;)tB9 z(RnxJ0RuR)j>)3K-9Wl{F%VhFj@Vdk#fjgI7v(Z!zTX5fa_5chKc6Y?AfF-Yyw_Oh zj``jTI76+ zssZi^o)5@+cIoQKOfjdqmKqF|p)Uc_jIr1^(N0qGKktE^Tb^^P8yps^Z%NKA@8L4x zl1XTYw}=m92giWr!CQPO3@HyJAGA_Lt#c~8q+!vk7!%ksdm~XC1@Rc}hzm9tx`K1= z21P}M4+@HNlt2aEXRKW#EPoB82bKW242FtohFOxQOLWdT9?=JTMGp&c@@wnFa$Ni^ zJlX~g)Lbt*SO}y`Gl1|;a#YGHhA>i)dy@1>va&H#RrvZzBWAH)YL4zIRz*%l6kQ-coAkFB6dPL`0{9>lq-%4)N z%Oxe}Y!$)poN{Nxjcg$t<_v*&`PATiee~~UvcdPlke|^JBl@eIVxq7$M1>D`7={i_ zFz}iJy%1;e1PT^K!EF*302$Ngb_>gY0CMK~?-4UM5?eCPM#ISZHhsD0-zz-!2KjV! zaClfk81kKW8@r&>1C#a%gZ835MnF3HDa?-J_KODa3>y(0A7^NEKpj=2YSJ^vtheN# z*oIPoTvIWrdQlLiHag(KI{1~Qv_c3F&T)QGTn zJ`1e5BJ{Rbg`G`-bW{d(?y8%A5}TF%nlNJ#IL(a))(7?ia(q8t7mgi^dR&{g(NBKP z@K6XvAoK-tCYr(!WF$|&DJm*IBaFcfKyDHlzX(Sa0&?*W2Qt*!0oie1nO_yikb8xC z#evs>oaQcyXWy&@Bi4XGs0|n{eS&>H6T{s07|* zoI^)!&=Wdc?VJ*42>mx5xVG;!&>1V3(&GA@{v#-omwc&qD^Vxu;cH>IeiMoqP5D#A z;wT^o7WPIA$a#b7d>Z`(Izu58<>;7>$)cR|9NP^}2P_71=K7%=9oy7k)I+fr5bb}I zY%&`4DSHTk4p?k7szp4jB%PC-+aK&Q?9XM?8{iAs=%Bbb=gXgk&>6Fba~t)=^*xY_ zXF7B)wkAN%6doZQ*mg&Dg(1wpoX4oo)Q>m0S zo}wTuNse|m>Wk(okQR0+AQ~9#7?cnK&ol(*>fH0Cn36R>Hr!ic=R!t(s(gT)k_phc zYM%f<0zU8%9mf|Ip5$w{##l6lPzYR2S7m`cK+fd=AYB_D6dg1O8(%mY;?yZXuI{I* zSRAK-<-nas{nDaFLv`@g(5nKS9&_FjIBx-Xr!obPj;CwWjQF|I&~Er5(==ZPN8XINa$7aIr4h#7P%Yt&;sKDJR4 z=I}(5`jT-i>$5BpQ>JWNmLc-uB>3Op`wzPQ3lw=Gngn2CjSh%hF%h zkLWR=@XVIHd@Y|d{P0Q6PcBt0bC9&DVHuT+>)a6Fhwe9`$ zg}w}HwDQNr1zWYfT(J2gn`Le7{WCni`hG-{KON)J+Fi-4dM(uG|81|PFXHp(8>wcj zS=72o(Aeuqv-$>|$a>hxGCpov`?ud^Rvt6p<8qZN?mL(E)#i>%EY<_Rzw&Sld)w&v z>{;_|7rJ*S-u2<@6ZHble%*Mxb+~naN89<+?_BuFbNYcVP3L2hHNOV6?k-O)cM=VbuZwb9QhS4PE*sgs?wu*SyLWveYe zm2|1W-ssnzU%7@;aYzUBi)gQ2DB?&EFBV^ULn z?8dR`Q6FF9K2>S%tCU0oSp3Pk)r>AyV^?)rb6?|h^(cN{P!+qcsYq_s-)=YhtJCbh z#);}t{NAA|zP`pk)egSCraERd)z@weR*ypJq$(|Z&3p0~4Bo1H3vcBQq}rivlj_mJ zYHX<SC2y4t}3m4O@;HR{;hRGTk9jh?{lis##hOY zU7)=fq1~!{0!EvRYCub?G6xKs4@RHe+^XCLYYmoH%|^+ZI23K7UKgt}2+S@@wy-K| zz*>Tt)PPTIs?yF^X^f-N3ra3E;IY-?4VZIwa$|-{!MoKsK^{|a;&oyV~Jr}yVfKn}oM!(cr^Q|+H;&Af>T$cb62TOTV0t=Pm33fZxB&~S=0CxF z)b#n@9yZ(!(JBA4i*)3?->jR+VaxwoXU`EOcM(LJn%>&mqYqN=t(aWYE$eyAQ(|&&J_ELs>P$PXzvvkJPO5_WY%A?lol{WU4>5tWBRQ z!4TP(QT6CyRaSs8;sv_~))1_)nxR^ivN%Cn=y}<#tV#$NeW+5 zZ?jKHgot|F$6J|%6dN?F*)6Odo58x$0=9^&vNJ@@d2sx7Qja(HR=OeOuiF)nVpZl+ z2Q#P{@mA$7SPPwH`&gCgIGDWIni>#l%Ma3=S-eyaIYaA9tEuhmN+xb_{E%5x%^qX3 zfV2iNs~N4a;&6H~1i`rCz&LApb@n?L*B|nF*(|u3A`ugl3`Qs9RRjF2%6DM&WiB=Q z);|h*m3OXhwm%lE1qxc!3{1!s$?`DROrJO+@Nloo!SB6(|2CoO)vjL2*L(Fxunv}|_e`mYW zzOup4O&2pZ*o>9ctj=~*bQLwVi{1Qf6S}6NyRs2?wJjmS zHQrVw2aH8@Z=0IdQ2hh!N_-751-bMh8^9P$D1y#SxI5{oGpr4zHyHOQF^`MD+JV8$ zWSd21>Hbw()N+m>yQ5VZ1;$y`%`~qC>&D17dDd35y4#h0wO#w4111(1$8;2oafH~z zUTws-{CBYUN+w1>2h1NOF^WOn>SuvIN;sO~(BV|Hv=)qY5lsDT{DTh?G~3QTY2uRe~=lEL!ldKTv%YZ(VuM>Igo6g2?5$uuy|mq9|k$LzLvhUMHP_ zFz?V%P3>bhPlDJ?AIdJK^d31oAnaaDaU+<_9&@W6zKA_A=Al(Y$YIGasaPku8e?zM zo9m4fdqW&yU(*_^S$*xwIfzXl8n|3d#ha-9{p`wQC_^9$w?6=5>-rXLs%BN)`rDOo ztJ7^*L*_ML*x;~9JwfW7!<8CvGdxP4!OXE>j6MAbQ4Y#HeQJ~(FiwNMCY2gZMJt%; z=2lZ|Q`LWJK)I+HVZnTTSfT*Ff_oe;dfhZ616kV)V)Y?#9|zOfw2qRP#~gx zut7qQ3vW0WOXgvmDDLQnfoS1bVe09lW(~3{3m^)YXCpMOfzcR6<%U}Y8!Q<*!Ws(# zo;jpNVP>N=$OgtVC+(`TE1ec z#2rEq7%kRkS@}ukAs$xREU3ew>34ccIv8z(+d5-4f^ojZG5D9v(+?q&x1Z`Cg3S^K z0!NP>9D~^dCN>P-msqeGSsi}DDcTzhlaicIkL~$jXpfTs+kXP%lwgtFwOLw;9XF4D zb2A8x_MulFt7&d4H8sp`deKVF3bQNqF{z!9rw5yI5)AE#SvJ>eqaU6zJ{BbCCE@NI zupWY81@}URtkT13UI*4fkA*i#p&*;;Z&g}i*OR3%ed%EIB|;ISItE7b1T$msl41Mu zeaCq7G9RpqUXm-lLfX*<@qwe|bij^SFwqxV z-wq~5NzWTQIu{&mZ0yR+VPGxPbi21{MMu>w+HPvzMfC@ybWu|Qd%CDu(RTA&nEHu& ze6)|{V}qfuZYWJV0`_+|b-Fr_L3X+kOc=yacm&2!(C5b7H~?XyulXdT{w}o*OgIxQ zn12WB#0fCB>V^qW(>r-9DM*P4V;?`gV+@-{-JNbjo+-Jzni_9cu0Rwf(%_1pi1@_p zW9JVCvvcg`l}Pnc)8oBOra(0-!LED~=&S~pnZE|J=}td|6a(BiGuvp(4NE>z(_4Bg zRiLDB}f3YM@n#0Taue16Tuwu4TL!5dw6QSYRE%xF%pL1~(0i z#KwuMGg}p}J!W+k})HItHus;YPvR$IeJGyyWdH7~IHi;GhS8 zGj!VgQ|GMFgvnt2^^y#upTS^;G|wABA;OvAw+w9XyEgOn6M<^hPrrU(v`XCGECFlq zj#WVOYz5l@Y>5JEqUUkj%LKFOdAt|63P$I^sXc9$0U`_M8@AU#Fu9kYk(pr4M3Wf8 zNifcZ*xoz_ig3fOjsYct(G)RxP-@2B8)GT#R7~I&RzZ8EqD@I$+{% ztKlGFhkodrr-F6WpVrPJ<%?2oYQ`d)C0I0!GZf*_7tD?<>~*X3ED=Qkv)&QmnPzY< zwl`spY208nYl2PT>9$q&Bj0YaV40hG3io zWZ^N&J;vDxH=KZXEF06c5R8+jPps*u7&Y~CyHYClo$2kYrhr)0?F+k-29YI&DM!IX z514e5XPlaaA^~y2KNuvo-?TW@f4W_{4zUI5iCdTQ@uF!&J03%OfN^Px(3uX#l9-vv zR@0C1YHEhvlrKTe%CIZ`2_jE#T1f?~i<0houxtZs3|2r7mg>XBf)oxM3Px9poo6l> z`_lv0bZ)qss@lzNBRF%%CwnU+krL~Nw`IGiqcEaQwVGdoHBvht^06d}Lb$>C%SOWa zL4%0X<6x|z$G(zxq*!AxInAngg9%4-D;o*M;J{F^?`#8Ozv#(sHRpi&>d&U_MyXj} z*_BbFoYTQ@`4+5=C>&@t8%M)0`liwqDb5JG!;$k97`GUB-N$M^3x=%+@A0aPF&Jbe6L;Tp!RTXs(=(p{>!NQOrN_Aj zb{{YfSv;*x2jhCcx`Q1@z&P{zoupz(a>+Bd025C%qmXK;mqH!$4lumdO7>xKJ7h&~ zDll1?ji#_he*_b|iU(%2BFaV*br|)os4r6fi+e z1#Ft2x-GDq{+OWpFR+_^C!(IdKaM~OZpDFm7%A4qUWVG{Nvi)syV7owFa;|H8^lDg zA$$#|{En2E{EW^v%Vc2%Y=UDQU~~j_NG#4>k_jih1>^9=hSFh*m=Nv-Hj5-^1iRQy zFdBn`*jWDnYY2w*(BG=mnJTJ%q|fmwFzlZ=h!~>&DdL7)xb7(!HzNJ9(Cjx2j#S-! zy_Gbi7#Hp;UM?zE!8(Bz)7@Po)nLHgB<2yjf;kDyu6F*?$AW|}WIPe^`6x}iH4+a$ zUBH+p9*on$+JK1>p8{i7`SoY60-uSlKGNs84_Kfm>2I@u^aeo)!2OnVHFcR?`8Zv8 z7IU)9s!RoAkShAXFM`oU;-oMBx${V1Fgn1v3`9IF0Q);o&&xd6huQM@Ld=%fz5>8F zKl)-at6&IEZ*S!eQXfOd1i;BnraPAbT%?49(aB=GJHUE?>D!aJWd;`#7wvSU>b)zK z4dxGq&3%E@RBDFmw%TrT%uxLSduOPrtL^5zD&N~9FikC0)oqPk8Tgf`gVCeTxv$hz zh@P{Ad-azKrodUM+gjX1KoobNJS_9f7Cq~>o11|7@Xd`9%M@%th#}zCg3)7O@bq0U zhBuo1*k<|Kxhrw%2ZJ%ZaT4QP`UVWghz#grbDWLvWlPsNYSy=S2AQL}t;gdp@;F`M z3D7uKbfCLQ=?um^;leb@#4d9bjFTry8s~|6;`nR{#(LtMNCxAuQE#Bl0^$QA?o$fP z7n>cb;rMI`#?c|FRNOI2hLaqNVXZ8Q$nI=4J(#bierH#jE)e6ws=}%E)dJORlU+Fq zk&eJ2f;I~;6h&|vASOD2y^9I+TrhpNF`Zec`ftWF?jm6hf)3&20OJV7mNpNJRYj;h z0_&^iaW!^Wj4;$sidjf;>F67Y>Cs}4GOb#oN62-EG!x4N(_H== zu}t8WD4PYO1G3U%9bX;+ittL`)W*|ZtPT~Xdb2xD{U_rClZr_J?Iq}&19wl=Ub|9woftEWgg?51u|pJjZL@%gr2&i0 zIn3fW2Bq$|&UPLG?diS8{DM7(PW~_|k^y?GMIkh=qCzjJE0fs@d&36x8>@7D#c7 zxT%51V!=2Z{f(ruTIPvW`V*MgBe_3WHwhEPsX7*{rQSL`ZQ8v_^*?M^3T+mL608Zc zDvQ7v0l1giZ8iS|hG+kQKE^Go{}H=s)D|@r@WU20>xf+`veg;FoVe~_a#Uc`z{1gv z*hqY~iPfp!HJLu!rut{u%?}~ARXb;SE56^0hTsE?E(wflLEjV1+rj#?l*x0untIG` zy0~4_t2(&&{ zrQR;_z$$F&ze{z)=c>67#cHO99`91KAUbwCcN4^t`6igS@2t4z-J*r7lfgKV@EoEc z3#=iShw5>_s+8F)4igLzADudbaf(FvYhWUZcb}6+Y(K!ogM-mL3aJL_ z@$TNH)d$qn({|I<18UZ3yHf0+h&?P4U#qzb7;Zjs)3ynzPQqMRVLYT}ow1vHAEFnS zUH!1AhL@SAt>%GXk`Kie;#CR8fbhxyYk{`#*5O;LDf@_;bTa+LR) z%JQSm7|&>FHC=*u-mbLBa)vV=9!#lOs{aMMat|V1hKYpZ>mGYI4Or^K!1^FhKWI&V z9aH@;+D#*ltEm_5%Bkbx0KrkGT1|OQsBV|+N~;s%J6}OQ%qr<%%}~9Ne$RLqOfDE~ z70O94o+IXtdWtV1(~*+SiMN_Ao>bkgU^adf)v$M5uqtt2U3F`544Th@bx}Ky^s!_+ zA7VYOSWThXs{d8H`6xvFtEIWtDLuaNDk}pic7f5tz?!GU^dro0eog`7S`n|a_Pt}w zdkfZGujerZ55H$zUmh+4lOc%3`V@@24o(;x5H-%ed%1<1_witT_1BeGk?Nth$ESvd z=iZfChA$~#TsQD6R`4S*9vp@Ak0agAtEo5a%Hs1*!?|1B2jif`M}-a-#QDlC+-3ox zHR4wKB$&UN9_XzEUKH_xTcJ;F77#Hr9O_?SgHT03@617$a5t}}Z}hPs!Luo!zK3Un zH3AcRsQI#B`mSkiN~V8Fh(M~IUWyIR1M8r-K%*^JoF@eRv=dCU#}ncy7?-8k$NOIu z-hn?5lbgY4EErmO2{usg0nB{vC;UmD>OS4aa?Ke@9(Xnap+B)jpvGgcRKd_%;&sus zn5|#H7+pA8@OtHjAmZGg1lAN;I85H^SzQEy?fGsxgD(Ty42U1H^68x|2kWIb$gXSu zjPQUrl|Czg4&| z7L&M#vOW;KgUzw!eu!%Ny~{U94RJQ0xIGdtdodS?mNYPbXP)^sSS$S*xyEDXLuGB8D{(8%Oo*)v0j$>vY*kJ1Bs=wkW)l)N&5+BryK6TDIT@ww)I2ZRS%fPs_ zaP;CH)a#k(O~mCiFy>)*#M;jD8-}R&JrF4|>5S~HV6F91Y`w*E!7wRclfZnCC)ge^ zIb!5_<~WZsmK*>kf`IE4grNgRVKe$2Oe`H1to7pEJR>3|gMEUM`Yf0)g7s35_w`ol z|L&YQzBp3BXrhRe^OA|ziltr(69wxDMiT{F1lHEc%y+>0^V^2G%`3WsJNg2o=pt;e z_{#R+mFo7&u2g;f&fhR`I2Z>56IWZ!--6+JH_+Sk`nBrz+HS7?2euH^y|uTw7gBZf zCyyyeH9!?C9efDc$`WAWeZyU_HegtP_*OCNPrWvd>?25tm(YdYh|%JP4*?Vh#wifX zaGlJA+D}j30qQ-%7Wa73l3yiJcU`CsH{t|!sg6*)sRq+E8 z)5B+`&j z-0}D3Hqj88Z3E^F=Ei5vT*X;zHdF(w8ekuQ(2xp^!8$Q>^lz*dBgKN!B? zr+6z9q%Qu-=@1yLL%88_*pv^}>9=m(k@{HgKKqzeSu9yS{auD1{@|UPwg@s6jLQv! zz@zthu&#PNk1(6jU2{{6c4aF55Wa`Ag6W~VmP$1Oe+JJW!MaBTZU^Hkz}6IPH9abz z!D748v7k}EQGri#n62GWuAM5*q>^U~=J4;ai~+zSQBaKd7XZRRoiAwxs6v z5k~BeKhAH6T--Ecj1gd*82tGmwu`l3c+$Xa@_nQ*0jjrBxwKf=`dfeVCt!GZ80TYQ z0u{v~Is?X#6Rax!zMruoZkl?5i5-)74JlwW6*oQjmU2Qeam1CzzXuRI105a;#(H=q zho_}kWwos0F#jj0G+(?x@F@3gv%p*94q#k`u%e^YlvGa3DuEj7pmNJc9Am)uz_<~L z&9CMge@Ls$et>M4pI>SzwGm@!mDIqESDh z@Lu?&%>q&%S^4$N=$_0HAyOCrn1K5u4)ai(1%&O3PZ%@7`hy9VDEQX~f4jLC7>__K zHyjxA!K9UVR(S-*VPYlV9bdI7q7~8IWUy%DiFdv^U|b2}^U}y_Vg#b(9k9RqtA~HH zz`a=CeUwlz*#jnWF&IaVRu0)LHH`X~bJ0jBn8@OcXMxdSBClpmVVM44tQ-SlNjPk@ z%~DHjI2bwpHf(7v&8-6B)=*pX2P)pRg)JB#cJnx}W@=|YZ)FWq+@$emuLo>K6t0NE z)x1Pu;nD$M9I&{h-v~x0qEAfjD=@|kK9Azmty@P#hj4y`WO(73iod=SO^TrY8I0A$ zpgik3PYn*ZCzzNQG8L>BN{S{QfQ@8|WtW_aXBU9eO+1 zdi9IQc5y1|*i(#O|Fcs5TQHtp2D%ulN_TA>kPRhB904@r2Xn1o{|$1A*bmzoj~^N^ z0YAK&GeK9T;fDo3#}6-8WQ8wuRUpgFz>iUjsBSEt#O#?en@IkZL`~u>ATJ{A_!>Vf zH%Ib$KwhrMatn0zUyI?_giHV=Sv&S1EVpWOJlh9C0l_{pt3VvRphL;s}@_7*bOwMLLrwzj8+BI}1hOdZ%k=Ag$SmBc>E&=!reCf|3HM+6RfPVx zAc@-ueF|`D>lJbO>KBnygHutz-iOS>VW?m4LuTR7)7!zZrMHhmNxzbu30Gu?IAipJ zI5qT&*pKzg6)9ma*2`fR)-P9NxLT!7WYQ)%5&ugvG{tYuiMPynA2PqW%qKEwm*@+m z2ipN@xId8PI{|qS$-7AIibn1uAIl6PlU*ezvf*ApHqb}vM0V6qaw3;mkmT<}W(~qG zwli4b5MXZfZy1UM8;k(*BC=qVuIMY>8h>oC9PB^O-4;$ptchq10WG16)l1*FoY(6ktbZWrcIH0+Gq{ zk`pzLng_R&fzo zE;o>dSR~H}#QzNLQumNpRH7#{aS>Us3=mBl$|lJ~Iaz?njPgKA6(v>%vg2w%Hc(6Q zIzX1MD|rKnjV0P7dIK5Et$_HSp$&e~BVHZJa1oj8j9+Z93y?w7lcGeUmR`?Tjv;I4 zEoE1veSKy1elnlP=J;R#<>iWOJ_I`J4VC%tLuQ4`e4yUHtAK1#fE`7kAj?MK7abJ` zq#iFZftk2mk#_gePaoI z6jPuTMA?}@b}|ddy0d}2i1gB8sV|ZEjm#%9xm0pjWIM}b{t6)5UoCN+$)FW!X!N9w zh7J7nZ;+KXA)k$HmgR`#TO@xUGJmVgCz5ZIoXER}1Ds06V3y4IPsl}j66IJlTb3uX z;ZqV%OFSdaNKAhf*h!Ka%`EV3NK&Jwrjp@(WqP71_}5QYSL`3cpzX4UjX)Uo2J40w^^zJ&;Xff8ZY;|YS+R-a zMDDwGAj`Fo`F=9r6`9{k>Jqh+jg01`^2i8A1{)d%tP0GK1&Lfln&d<_G#f}mzLxs` z23dbjF1g_%p*J{Jb}(NyOk}|Y5*JEbB=d>PUks#_DfvJ`g$$4Fa;mP+5-1 z7>NK}s5Os1kQ+vY$4Rw*}%#GBCl4 z{y=uzNfzh~WVH7Ha^$^b{--j(FOV0JBMFw=71{A%sT0{w2#`Bzl&)j_F~N*jAPtBI zvSI>|hK-bb6p)uIvfOCstT$HX6RD4r$j4yjkC*vGwmTWf|C16!1`@0=1IVp%i7c>8 z>dS#Na21djk>ytd+3;G4-vSGP?*Z~6vfh3mJ3K7$n8cGn{rowF1RFdJf)Rc4BJ&ksVPGjBJyMR_ zp+vS@UUDMauLML>h8jTq{I4Yo5LuzNxj+aR8iuBMj=Q^QHB=MTee;=~^b(!yq)Or2=As6#c!pjv|@c+dxxq5$9`J3xs zPe{~X7$D7cjhBJ?<%-l>OZ|U?^lV%FaDeUbqrZe|j|49wGdkdh-gEte3#xNA@V+m& z%%{%$|Ld1r7RJ?+%kKOD?|XVwEx)-uDHU z(L$Yj--j=`b?GKtu1M*_m)s9uazA{@&4eL(NJa(1hW=42ttWq2*)Yp)jWeC z9HB5a7=of5rI0ung4bXO`LvOPAyjujxJtoYtKooffkL_iLP6~!g_I!>nh$~Cp-meC z!4?AH5rraJ(+~)EDa;FjP*l4|VOA)F&Y=*BYqLWkv=4*uhJvToAq>Jx3Twh3l+s>N zSUwa&zo8JyXe)+7=rs(2`!ERQwBExYSi&Lfq)5D^ZclD3UPXas~Z5fG|q zVG$5YL_#=Dp_=9y3E>EZv5^pJXh$g|MnUk3f>28v83mzwG=!@ZytEq85H3(ikA_fJ zyGS7=214@~W5>?*of8bq-T%{7dELW@=Qb4^s5Vc@`h51TG0(rB_Qe{n-6sd0&7D5` z_sEjVzg0@F=#Zz1x7qiLF7?cxpV_u~;U7WD3b)vCX(u(WSp4&tXD46Xzxn;T&cn`C z%kySYfwHSV>sdS@vTf-OPlA6P;kJ4A(@r;f>>6_<(7LE`)V4v_nkQX9W`1nAvo37j zj8ngi*&{w?iP*#U<9Ao?;a&3=esDX{{Xy0JpH&-_kdffMD#nNkL;py-O2bTWZ9V+1sXY>FIqMKFUAuMx$Hv?|SXK={?AD zdDp(%2X}ASYkj|H(4v~XzBx0z`laFbF29)lAX#f3kF{Gg$<(oPQ`d&uysG?X zR#N_5M|)VeY#(4g@adA4pB!&D^n1VG3fC*UXGi&%-@CW{;>D$(S}Zuerrf==t)dEC zm|6U>Bw(^h?VZpNf>*t?&ciWJ)7O;0ezDr8i+f(KJ)_Q?s+XEZ z&YR)5{Jewbyu3N*+a>%OSZ06Rp}~#TdzCtUVa2SHg)+ZT8V*|8z2MjP_wN|;#m4e3 z=J~ps*YMNn(~pi>W7@s3-t*cQB32bHSZCJKl2Ns7r9XPy?T*`*b3U$WJ$kFLXW)rj z*S~pn++O>yO6yCH>+<+iovj-u%>6c3JM9h3>pa(|+9p3kfn&vx|vw zH>JXedv~^;S~vBZs3*#t?PI=gf7PX3{wa?0%3b2|>5O4_ncrj>$UEWQ?bpKwOaK2#ns4) zRpT8Mzst(Vvum^4#jSpx!}5%9F^_)`NdHI+oX;sE4y9Wn$!9Gjo;2) zEpdNbaGmwjBip|Gerv%ZZ#+DAKG`&VPr~lk#gY@N-WXK6=iTkahj#DbyLp-xF$(Kx zrw`UsM}v0hp0S5keKh>}YDG!==U<<07HFwe*8R@N(-X#5X;@y!XRWr6 z8S+`(9%DDP>Nq!MPre^Ujc6R;-E;h<@%fK_8M3w5z(+0ycXnC}%zdJM<>s5^Ccvt5V2Xw|U$n7x%xm#JF$PtWnUdQY0zXV=Jft@oRvXB?ig zIjxgrV$-J6UuefiBVZ4_+E4BOOfYO^<) zCeJznrz+-o5)*l6&6au%dykypvF}8qQ`6dP-tlN)*(6`nu=AsapFDM9o%07&OHr<96ktx$^E$)4axF*t7dp&bZz#)>`Vv z6P=f@^6ydbai=NnUrwl&R{mQ1p{J5cwvIp9^4i+qTAg0qo;|i!rxw%C98C*OZW_>a zX|96ZKAw5n#k}qYZ9**!`|el_yG~|bTm1MN`wva1)#}{VX=f4>cV0~Cbbnl)4hv?- z2i^Q=^4p&d%&Swe;4hzd8M=M{*B{S$zPR~=(CdcFHR{YO)8ZWdn^Eshxj@%p=UO)E z>Ea=+-+G_TTv>g|flHSLHmf{x%($BUat)|Hb?&PkD_-uMK4)~4Xa7(BT+q^|o2lEE zKh|z+Or|GJbSgpGSWLpKE_Mq}Q}ON|!%B^Vrg^ z$nJ>QA%mZ7b_?C?x9r-1;N2HXolCo%?`7ADZL9n+;fM9Dx*o~zVqQ;!)~yPL-98D! zzH0KSeCytYTshyr{Wa9HV&o ztzlC2t^>T6j~}33ae*KjxPVj^Zfk{@fE^S58ppwzwz0W72EbN ze^T6Y=BR|MN{xngGSv1AFLL^)Hq#Rax_^;)Xu|JxcYl_8ulCSEq2El@9wlK_&P%~9 z*Qc%xALtoy|6x#hD@kFP74P+;`4 zyMLTq6%kPF=hfxgKU_E>)o;a`&3ErX1#fIm3C& zHQ=3b*m^oozZG9>WNg>kR@3n2)t0~68Cibon_*#5Y5sSbHP5h|Yc)P|XwjnWJx#G2 z5=XCAO1;o*A6Ig><{fdf#OE^??l@u4-oQL-SFC#Y}qqM>q+O(7Nr%vU421F8v@sC2Qg}pRqSkaQgwW3+%o__~vUZO`i7y~@9tUBn zHhUa|BNX0Hn5K0|f{-{J!kQ!qY1%6a)iWUUONNlHtw@G&fr9&Z2w!Nu$3sY&0bwVF z3{9B;!KOlpm;gc5wo$lCq0B@GGqtdZ5N3S|;W!0N^PB{s{Y(gBCqbC49i{M+g4bjS zbF`6@AuRt2!c_|Mv>H<&^wJ=tPl2#NyGX$@3qtd$5Eg0Erb5_C;Sq%;TGJE=p|c_6 zV0$oTYJSrol=vD#<}?V)w5Jq~PzX$gutHmu3L$Y01algMRa!tAgz9r4Y@)D6Gkyl) z0tLrs5Y}nyDWuGUP&6IFdMzj&f^9y8gA_Ju9-l+FOCjNN2%EIM6lN`eP~{52%+CV$f0mh^ZOD)iA)HYUqU#nJ*9AjLf}jYN3}&WAtWw^VEzii zF)iRL2-TNC*hJyDX4D{Dpy1FToYdA+NLdb{=qw1?TF@*AwiOT#QaG)7%!Y86Lc(ka zXSKZ)X03!!?^;YIg!Y>uoTczetFRQpOA3>hLij_= zrm%bqgvQGtywS!lgV1X$gj*E;(&{gVVA%#?=5jo07>(M^<+z32N~O&TDEP0a&R78@ z^m`~dRLn-L&ldq(95mB3X{@Lwlgyb4O<4k+f;Q1ThIZmXeG-w9A2f3&pk@%0Vhcj9TG!Q0`JmSO=x3QQJpl z)*dKTzJ*fUsKtH@rTtzgXQ_A^wTkPZyreRDJ(N;L?G%;e`=B)50Husko3H^&ul-PN zQ7LEC8f=7OIRItmMkp2FA1Yg^wD}H7CHUt%D4_?TnHz816% z6KKnVaF9Yn&EtCrcPS)%523NPm%^-L5UOm4VAW!_Lumhlv4D1NyV2j+RI9K9!pk2} zV)71@@Yb>^EI$sR@lFWMwedS4^g03I76o6e{w@fXlMrU^g5am!ps$~_U9p-rO;cea2Uc%3X=~*_*BcLu>1mq#z!FZ)5afx(CZ?ETNDOp^^ZcZT!Jw3 zD1;#G28FE@+GIfp)-tjngkFY_L&2f>9fMHf3WUsK5JI%46pl~``~gCkw&({4iB}<* zk3$%y1ssP^{U->UC`4$+6A&&?aGZb;rLCusat%V!lMrIGppy`6*C8CF5T|+k2;nY; zgdZU!XnQHlx&fg|HiQvcOg4n}HzAy*FjA{<3c^bYlTSeytz}bK{xgKery-2h#-E1J z>lX;OC?sk1&p@!;f-v(8gz?%93R@|(ISXN;mT?wB=xqo&6eeqa=OC2010nMqgsIw7 z3P&geo`*0^TXY^m;#~;l3lP$@fC~_+--ED;Lb_(W2;l++$3+NVXzMAY+=o!~5`+vb z=n@3m0|*BxsG7%R2zMzYT!t`H+e=~ALkLx_K+v?9D-ha0f^e3?Y^}mo2rns2z6xQE zmQ7*#V+f6Zf-p}T{}Y5>Paxc)ut2MS4T9xY2s5uiSft&cu$4la>kyV`8P_3%K827& zAyf0a0inb*2$?q^EYqG+I6@)tCWIB*qMHyBe}iED8Nwrm^%>K zzl3m>!ZxkKT?j8JOuh?YyOvF1`6~$N_aN-l>feXZ>otU#_aW@oZcwoN0in$U2z#}R z2N1SW$f2-b^Lq#(^iK$x4D0B214K?2#2*rk02bOV15kYs21=TLgHHpnCXAjuTl08|0yZOrgr^WrYkMi&rBLM= zgtJ=AGYGRx5YAFKuT}UBLi=10CjSQEqLxkJC56V%AzaqRKZme9H-uXhu4?sjAoMar zn3)6Nns$SNB@cu)FCg5|GG0K~N+E~B&zj%w5JK}p$ow6`E$u0V5*7%7FCpB~7QKXU zgo61MgnL@RD+q}SgiRD4XvWtNs=GmOyoT^dTTkHvg`$5zc%lXU0U;$Hgo6~GY94<= zu;qu4@F#@dw7nGWQmFC-rK?t`fyqQ_w1a}lNxzC(w!cED{8=w{sWVbQmwVKhS%`oDP!&WLeRC1ZLmL@2n zg`s4cpqNeCGb$yDKnctRC9g?aoD0ekD(2i!6qD91HlyrQ4h>kT`kB1)0I*I!a)l4HIKp&Y!x9S z6o$}H+e_gtg(^iLG}dB@K$ukt!dVJdt-?nT+E<1!`6CETwQLG6DKst$!CM<&6vFZ< z5N=UuuGKFFp;uK1GmAm+)oxI*RD;l_I0Qc}qd0`E6mlrE()>z52(1nwvjl`T+EWT8 zYCs6|gwRe~nU8IP_#6JkF}uE z5K?MGI7lHt^C$zs<^>_442165UJ7?9R4EG~P>U%GVOAXoXDRg5DwKoJzAl8xAm;f5_&J84M-P3ln&BSKtSmN zih>|j1Ze__6cOL+y9KzB-1qZ5f4%3!#ms)^H)UsLXJ>XdyJm1+gsLSFev&ZQhpSwV#0vIv2N5XPH2g%A!&*dk$~@z>Bbs2oE3P=v{5qlDb$5rV=Hrkd7a z2xlc6lrY_-D2yI)U`(EH zgsPPgriLTTH|Hcgk-(?1G$ol>3}IDegu4rwHgjIDA7QKh?x%pK>cB;Z=Oo%R3D*vWrTy~lgbFe4G@x4LHOD!61~o+JUKQb}*&!i!BZQ3A5RRM9)ez1~I4BH@XIN>K>sO>7jx zs%8j}B>ZH`*FtFA9AQN*giGdug!nBG8q`L(VwTlL*e)Tk4#G84rw&4=mIzxUTsQu8 z5rSJGw6BYB!)%mrNJ3COgkMeTdI*DBBOH`)+oY(Ekh={+|N01b%{~cdCFE>?@SEw~ z0AWH~gfkKzn5+#EBHAI0ZHVx@IVItygrbcQ9+{Di5azWB@w1OcW^3zR|KP!38-6kt-e zM9JM9rGHD5Bmw42DQBhRY=x36!1QT_GNA{`87V0OOt#i25j|1Hwnj-6U`|W9DWzx| zl%N1JstwA#UMSb4qzy1(ZBeTBMw!zVC0&5ID&>ikO6^cG1elraP*(Lpc_bxcfT_?P zrEy=B741jwqe_qim6qlltj|5I0%o6tvl4Q4MJQ-`cSV>m7~zbB zP?NPALc|b+vE2{~n^O{QN+{YLp{N48w(T#@iZLZzMv zB~5HkgjK^49!V%|%J)KOJOW`wFNCt@frR+c2n~88lsC(IBW#xt*azV~Q>PC?rx=7S z5-J)0z6il15!&}fsA4usI3yvcA3`%q6nNt#ON+>!Ap@A7W2w~nhgzFL-nb5%qRmUUD z8H~`xT#@iZLZu-H@0-{m2&*O_Jd)7dlpl)Fcp}1zp$IL_0}1gbAv73<(Aq2;hOk{i z;BbVtrp|DLPLmO~NZ|7E2!!A%2<=B8bTm7n5e`Y{AA``@?2ADdG!-G|NQADY_eg}? z(-6)`=x(x(LO3g7>?nku=9Gj9(-De}M(Axujz)->fpA?yUlTe8;iiN+V-WhAD-!0# zB2*fSFwn$~MW{Lx;gN*Fru;aBClXeSLl|lvNLV!sp}}~B;bz%*gvPTG0w*9un>rH^ z;?F_YB4MQQpNOzsLi>pbqs>MMo#rA0O+pxJT2Dd@e=@>EvrodH zc?dbDAWSyBry%5>k8no9RFico!dVGpry@)@rzA}H0HNqKgjh3j8bZVZgzFM!nb7G7 zHzmxOjxfhukuYx|LZul9#>CD*sJaN@k%alCd@RBf2`gd|7MKSTRxL(oFcV>sSvC`) z@e+i&##|>&+=S8%&=0I2+AKIh)Km zIh#%B2RNUZiE_4>D{{7);tO!LnOHg7&98EHnDPs8cAEKec9{oqcAIL8a6UK7J!P6FH7~l8JXCUE$~3(7k1L9v8*j0SUFAt@ z$*Xx+Bk!4t*^`bprD*v((3X170R)E}!tk_w>!YZQ3f&pMi>M7OwLY z@+1!5c4D2UgMVP(%p|mp+~4!xHf*Ek<~s>nw6YWG)M{Ig9iBe^=@z!P-boqLwp-_r zE`9Ac6ohu*1v%R&)`KhLo{u+Ahs;rTHzdXti1PnWAm313Aq zi@)(SP2=5ay?^pQ_Hy#pZAnjh>UzwC)1J#o`tG-03>Py7H%L|XzJHQesgUu@#I0IS zXH~6Jm_F_M_UtyGyS|c@k{fcggdYe?U!-zu9xeQ!^kc zz<*n^t2((8tDRM+cdk>>+xWPLT`vi{&F0C3NQHQO%QdV^GTN33Cs){6k69IYm<%B}aV)paz5Nz>un(9vq) z%F6-o*VxfyFFR_~ueGDqb2Pm;vY7kk>iUkT7k{dv^lRW~dd*>OM^k1>P%jEB;Ao8; zEfpGvhgAp_K()uH<+mO5Yv$PL1(Z81MQ^TjMEa!PPGHlo1^=m<^(wVppr8IET^Z|j zYI`K`Yv*W;Zhl`{il1M5G&M(h_zKvxUP!LE8Q^QsubUG$nt{;okR|bgKu4rs`>l4g z9%yP$eSwRy!us`c>=+gGMS1Jj+tISHwa)1aeH<+-+C((%R9{EShJUKwT&Q0^N6e1D zCx+UC{*IOd|NBmY1JL;AmlKLQ+F-{n7n=LZ#UYONF4{Fk;5QUkJCYmzBm=#V)frVo%A^I<#8VzuHAJoZwS;;q6~7;xxUKM~MXP{&*3nwyx4!&_drq3# zzYQ?cund1hR3>eK5A0gM3r^&AZ2f3U)|Utr+#b%V1pF>Kb{+74i>3~$*I4k+uOsMX zqLp#4A}Ehe5Umf;RKfGJ6S*^fy~|%c^tz*U!C!^Q>Uh66T37tl98F(2P+__`cIu2b z9j&`#C+$~9>w*8}n~QHDs{ix^Rh@qK9m8JulPi$l14rwP-+j&ULr3d_HUzu6xWA)m z@A`sXM6J&F$g%5(znqiapO!}b_eU)67(R9k2S}q9)N7wO+Ccp8IoeY+WikjVI@({3 z-C(p2(DZxmXhZPpeg5jSe>>Vx{O@Xq2x;m|_0iNp^}z^fF~CgKuNAJ>(MIBDTI$ytH#*P}N3oF+u?=oKM;nblIhuYt zS;#vE&O+0fKaQlR1Wn*!P8;iuzXai@a*a9h7%N1KL!Ry@@izjTf` z9sgJi)uGf3iaY}%@vHqaI9e=z9VKc*pQFvh|BPKybLsOMw4UEAQ1y?*&EnY2#(xR) z%c}M#j`cN5y`y&={_Kw7T>QiEYtM5yn!#U)0#3%&H#$_nd9VOYdzs78=Hu7Lg;Xe= zXk_;R{Nrf39j)mC#9u%^?U4)@!VL-h+_%6i!mpPH&%t%y2(uW!Kf9^S^nDM-y?;vk z&GCKJBwZKKCptC$AV>pxfAegm0dqkwrfv)EL2HVR&!Fdb&Vdr%Q7L1m}{RiPSGhZ>q+M&hXnQJ_Ui9jFWSK>YESO@E26?_7p!fIFpYau&mWMd?YwpIx`ziPPB z@YE7oL2GCOZ9%894$ukef(GtfkQeen0nm&h7}A3eGD2F=>+ILV2G|ICarbIi18enq zaxF>L!v@$0n_x412J_$pSO5!Q5$N^w<8a5r1egp{fF+CH3>Xc=LGM!U0llC%^nt$6 z9|k}Zj<=?IJ^cHyJAf(%O}zApvmams{*AB+^x;cQ^47q|unLyJLRbVJfIg8HfNNkL z=qsHwac99?(C0&&ka1JcvZ*;lYpqlaB0y`Tn;71P-$1j0YoPbzKY?f9kByc?0pNu| z(6XlvVRfM%)Q1Mp2(NA&1gJhK2Z*Af0iv3`z;ls4bnZ%R>cNL6elj3=?mBk``}C15944w%!U{k38P>%i~;qz zK`>bUA^fM$E%t)m&<9#UYiI}hw4~NX`i^NY=nZ|KFZ6@5P#!A4dr%Q7L1o~Z=ze_r z+*(GR;86SqPQocT4d0T#-*;M5D#P zAkceN_0>!-%@+vg@c#(m<4tF+HhaIp}i)_75U^jdYdtfi@gRkIgI0T2`2pk3d zt)Bi&@dSJW`h@TRs0~_aHiT-RuQ`W7Q3!`rkOs8Mj0f={S}Vx__>sLm2bzLvi8C6; zfacpHpds+(Q9pgxLaR!BUSdBSfK~7@Y$bdP#G}g3DZ&R5CmF_ z=>wlv;1cNDtslZb_@2!3;}(G5@t=hs)&4_ZC=3H_cYw~&7@B}Sid_RrL1y5Vg|+rd zf}0cq;R1X76U2blTSutTqi_t4!%_;TPp*cu*O@@epd1h#pZ^j-LP!Mqq|{@$1V4km zfu#?0Eri9e1eSu$pNP!(2Fpf#XZ1#X}a8(}$|*XMyQPx&=+VkVw4GPvfYhpt4+1Fg3s9A3Oivhda;UwFvT=uvYw$B%hg)y}_P}JA2D%J717cw;=;OsL zpe3|{wxG+M9iTMn=7!@GvOH9P;;gnpx)ipJ%+G-?V|@oF;3Vj3)hf_Rbp;vJLaPK-Kv$zG zzOnrsHXmw{e;$uECbAckv{#@jMngeYiON7(C@)C70=x$m;X{}MvCta^fNE412z-!@ zbVYXx)&pumZKwnFpuXl}4WJ=(Wbd*|T|mlc zt)#}m7Z_IIW=-B!N)Sx-%7|gcOh*D2C=oDuN$HwXS+Fnpj_=i;tTW z6hARgH0!QvA{_(?*+}3BGIY@bR}0w;kPGraI?zHl2c(7Upvx$_oRSH$fEK`tBiqa% zyEGs>*(godCcU5Ou_qv5v>Wc+82%?KHrYVwyz96sLrze-ZoblTLkMV0EC5=J7lM}1 z0-8fJXbg=&vk6ViwV1CBQL2QRcp^assD@kF@rU8k2-b?AC~i3@1zIJ@wis>^ke&Rp zksA&rp#&6%2#{XZaZ5XH8OvoPkg*IaLV0i_C?RE_gx`Y-ps-4y#HvCS$E}WA15{uY zs20=#?U1Ms^*}qvUR#$xn&LJgf2+DwO{yMMnf9&`?(5B!mhB)=bGHOluk0?7qh^Gf z9V)>sxT|3WOob_+bF5|-Z9z@e8n+eboEu$-|Fm)|0=Ee~21j5kbb$8I4%)&;piJh0 zfw?dfVxb#!fzHqgIy(NYxZPnW^n)HCo1V~D?cWDaZ|DX6VF(O@0Wc60J{V@eG?)tG zU<{0gQJ`8J4kKWg;~$9|17l$d$Zj%Bgb6SnhAHMGJX%i9hFLHNK7?hk80LfaW)Uoe z1@M96F2P+2%V7ho2i4FzSOsfg4Xl9GAZ;al44=X$D!Bv&Y=kZF8Ek^hum`??ZLl47 z!A{r#yWw*<42R%r*bn<)FMJ6H;43%?(xn}R1aJnTzvaKHa0PC`5AZ!42N@{*1e}C# z;53|q??7R{f@^mTznj)s{7U0TI0u*E0-T3SaMAWhTl3d+Y`BTI?oG5CpiF)SHODV- z-9g)0=RC&MOhL<;-|^ppdvF&NChZUK5bh5;Mql9k4Zo@V@8kIsRGkk%k+iLd4;{a% z`4K1~**yc#Esiubi{i_#zM@)`_FV0+HqxHI9_aejsbuUXqNtiaLe@<#&x_Qy5ee>NFK`i$XY*g;8i_aJBp>1tlN?7NQr!Ee<6e zD&Urb^6;Kkf=w~1#YPm=gh8rtFh(frpB`hp_$!tD)xK!yq%2=1N^$FFgIu;UKJ9RkBZ zX^nt!Fa}1!Xc!9romJg2hsoSH2M*dW3C@WpO`)&9Dj7sW!kmSPN@lJ#2)d@HHHSt)N-a zF5Dfk9k#(v*bNof;{&*#Lk;}a<39V?*b8649{3XW!&h(^4#5#P4kzIv`~=^?d64!a zoP!_W415cx;S_x5Y=4itk4(?vx;CfOW-^wcBD?+z_?57m!5#dnmD}(u+=LtO3#ev( z2Gz_pxC+rUW3JOv2I5BKr^0l&lO06G^8gaObWB0L<^ z&=G$>=mJ{nc7XQK8r}!p)chK|eXtik1YJ{|07F4{Ah;C~ZCzCD$VPc62_+ym{7C`6 zr9f%$r-GD_0(8iAhR1}z%XTiv0ofrdWC3-~%(&@6d#svMTItvhhF58F{43Fm1m=Py z_}_te;DrE)CGsM|)SGAFs-t<(|HAdh-H+yn`;=`R!cTDjhJWA%JO|l61L@k98%Uf5 zYX1ay;zL461c@Oj=z8Tu5=@4>2lo;L;ZF^!5&6@Cbm8tqCbW!@0ep}RwD&5gYD9k3 zrgkt|d*>cLGRTRj#8tg+Tjz1MRo&rG6!JQn{6#>C7Q|I8=~}0nC?9Tq2!XHIE{q!r z?wG>Z!Ic1nFi=9u*iG>DjNA-VD7Cl3ih~NKFt?f149Zj;RJJOlY*aYuZlBSf%eJhp z1eeC6(yGIia*WF04q>|-t_BS4xjI<~(8V@gfK$I|4(~%#XaZHBGE@YmSpip>zK2^0 z>O(cC3iY6dt^{e+s*YP1G{>)l8wt8(R1(3 z(0YQ>m5rL!wH<`NKggvsMq3xj2e7e=h&!DO>N&1TJ06CEZpP>o>K0gG%4h_*+F1Om zQR&KjG^hqf!AQ`lI0m;Zu6YdN>Eih8&`fY&vADV&$W@h7#6|; zSOk@bx5RO!tA;k*H3CmRia<75HUe8!@RZwMo9h9gF@H4n+v6q(r58Q9r z0XNQFw(msqpGtEBZi5o|6_mg&xCy_2o0u|_t-CE(@fF9_6t03wm+NNuJN}1o2OhwE zh;}pojg5QYX8d}lvT+kv8TO*sc+Q&GE#s_`FfzX^*n?2%C*r`LwbxzPY$VLxwW7k zpAb!t7wI_&b!hqZT!h+R&q*W!-GtNg67nmr=$9p7!_CCHr%hF5#V8A82HopU14=v- zWCS0i2i*$~h768hyj}fSrxPg1&AP{Dp1kcu7Fz}-UIn7LnT;6LYmE}Fj|1?nbKqn_HF!qy(5>g^< z(Z9nlS0^i-sJz%IOeZPLgnHv@!K#y$!pftS#(k{oKb;Ba!-kAH;a7=EKq|IVf-<6~ zT6PNSgI|TwDn`18 z;`V^v*mQT?*U$5>`(Hn&FT=jClZN`zU>M|V=O_KNa0wgf(WCfpBn$)fgQ1|zWoR9K zxbAu&hA?&5;ow%kwnu~&4O zIVF+CqN_%l;4TGCx0m3~gSnvV12b`BVFHYY888XzQ;<=hwZL??r|J0Dp)-|@DKHTx zgN&u?aME?WS#0aV(j45`pv;xA!F4aI48U$N+aqxo;i@1DaTmY`;HEbpe@_aa9atBJnA{R#JT+}&^hl+IqL zM-7nfd)C-2L3?IRHt|Oi_#W<8a1g$RLvR>WP%*)|tKa4u^W}wrTqu6##)W`&@A$VU z9ugW-$SnLRphRd=7JTFCFZLhv?2ow~{}zQp3WbCgw(bKaBV=c*CyRgV?Z1_fP{pC4 z%-x>?(xq#y((qe;WLNQ#5x2j?pfCoZVP@aE-c$*S*r9$aOxBA5HF;M<&x-+tdA-8& zivdyTd$zMe3xr?0U8Q35J`ek1|F)S27X#9HihE4rO98_kZT` z4-F|A5=z>2P1#EU>56_pv_u$;pHjMd@}ljp$e>V2IBE+g>eI8uo6cX+!U_qsLb{r% zMCIiz$u8r(F#Fi@Bn>bZE(L_SsuTDhPKITHoU6%fOUfcs_gz1b#x6}^GTX`vK}qYd z$^3Ibx(s?SPgR%hP;7#q#%@^c@mIyj?pJf^GL`Yv6u3g3iQ}2Q*8_rm8RFULu0GfC zR`(~9Gh2;NL{(iVo{70iJ?JSL)x)-p*BgGEb3>w6jWOD+C#ej2t}6is%a6_*yrj$N z&KN|frV9BjGsmyKESgDkHK2%_FE8wsS@>|%9NB=Un(9_jP7hzssE4WQiwO5srz$4k^fy?uJw06 z2c+kf8nIQqspDBa_pC{9oldyalx7d3f1^fK`csWRJz4FKCD$pHdN`e{4TnT>LbB)X z{9%UfMNfPDbx;(g0s9b=hL8p;BPR8^zVV_R5<$oWLQ)X2spHmdZMx_C)Z-r(QcP{= zH=htj<(P+SJ--+HV|f8}o6wLj>$FCY+I2#&7q?C?|Ix}Q+={fF5OwVPe+^s`F}7zz zWn^^;Klkk(Eo)`Yk?qUxC#!cAwmSBH;;7$Eo1E^4^A%&(C{Ac0)nebi1N%@Czp#D1 zp4IHP@JAIcnteiYLi{ca={+pu)Y3c(3bR5^lbrfgs;SAAd>i=jT_-sXF5(POa`R&+ z{5WB5-*4@sPDlKC;%HwZ?v|L}{GIVBRJgD(Rb9_s?R#j*=)EOoM!<{>n^Q-tvlLNQ zecHEf+mFaIZk)ZCZpMMxbfeG+s}Q`}qI0_fUHZ;j9C5Z@wY0SrLal0#2DI7r`}ZEFCOhJ zo;hEduT<_LAz@@xj1aYJWQl!U78F^`do$dSs!qt-Wfj9)55GL`RY(&;RFwGZ^6#IS zV(!jYA)N_HP00NF4Wb*YfAI6lS3$!GQg>XEGbVq&vF+QW_RnkW2lEU<-d?zG2~pwh zZyeaLWy-^AU#0eDEhK+gY&W&&|C@bvBmFy0FLqQd?!WWzAuSG!X#1)NM+i~pPWE2q z^T|rzjo_dz77|9A`?c@UuX8_hZK5|Q`Ul78%jl>pJumHQfe~FIB#c$I6O!-D@;;}! zZfZsdM~!-B+=Xe|w{O3}z1sT~|Fd7>M1yC=TH}Z{^u`e|Me zI2ww^?c2Uj&jGEw`Ryt;pjgWkl^0vh&e+Gylyk4@{LZrzh3cI7pr{kVdG*aW$<CHKFGVJ2+<9a1;gdbTZwk+!{t+7FH% zs26=dERxi8hE+YiF#uA?BK4f0H%3jXIyj=Zg!0CaPKde^AwlWwVz=A(@#d#pG9Gp- zH(ay1)FxRP?>o`?u}MyGv*%b^-ZP>9G{=U)J?;}`949|=jQczm$Ej3j**BZ!)d(K< z3G;0e8g~xlPJX(?J;RE7-{PJO#9hpLK9lqp=6p|m_Tc#QxjAFMUA*Knr(Ie?4I3|` zsqjlcm?uR>GeE8{qxtlgfEZ7nj3)mLwu@#ot!|J)*^Ks7&7u`RV+O zW|J&eWt#gd5jSTt>3=25FEW`Zx!-0oqkbj$N+xqs;de5bThf2dY%<+aMp;b6Ew(?; zV!CPjWEL~-7WP%Mn(uIZ^|G?iCF5FaPYt~LLpqM&5h`;i*JZMqQn%TuhuOFkf<<`h zvjdCQ`8bo+#jI*cnBDY}Mds}G0oQxnyYs*HyZpIh5gO{(ExY;XHoNx%3!N?_svo%* zwjli=k3WNy)yog(Fc;H%gFWYRn8bHT>s}7KLyuf=**wg9@h{S1%BDtmk;9aeMY5cB ziIeo6_FnpHQ=VYK{7e?va++2dNULy8GfkGIvDDcvGJmek%X4K7!;(yuZS|Zc`CV$G zaZYnVmhG_Am{j=jt!C@}SG|K}VLMI7GJHTTduXb2txj~s1lylsp%$W^q6tyl)IAc1 z6<+qFJt59X@!Y$n1-bYJvZl^}#pv1zvJF~1ki~~JVsQ97CH2hAZPwhSm56bf7~w04 zp_1S8`mOo;UZZuyh_K5OcS$?vF(LPedy_eehJ-=^Q~SksYi)?@w5XnxP%B(bkbhhE zZux#E#M#S4`OUC<0g>VVZYN3_rkU*U0(OZ`H#&3m(!&|EU&WnNz`RhtcNjL6diih9 z`vte^!Ni9evU<{W;wq$IviNN>$8Nqwhz=~yANLEGa;Z2!{pF;7?#HN3*HY#gjRieS zZ5lts#Qa9;aa(jNXwTmszyE#ps$cXABCazYpDbuj{6_D)Pdb{$?JB;fV(Z?!@?xR= zrtO{;GQRuNdqAkEeV<$sqp2c|`sgvZQQ`5ebB_FknoOzTG`Vz_b z1&5l&#LbYMxUy*Q?VTJ$dM0mzMFerl`?xuEUu(-ya|c6DhfuR&INfwjsLAqx?XWO2 zOxxwcOsmnjZn$fYTRW{Cz8iaAKPpbAvo$?KKkIg{txm^IGZOQ@QY7Vs5818bMNOH9 z9PClyruGzX8gC)LX5nUG9pw>j_R3;uG4tXtVl;^`Nq@((U4&^>)Ei`a{~nOh(>=n> z_?`M|Tiia&H`#M9aN)(fxyew=rD9xGDQ+(QPV}#fnf*IBsV@-zLfQgl{@wNyre1gh}_Ao`Xk1&iKXmzPM-AMvW<&UFo<$Z#ablJDrGi3 zqC6Q&n_pzPr3|+RNOSO&Hv5}&%vJ+SCb()%yX287`NBWRJ&uyoBfcwRPGaG4OOd6l z@jj-umXx*kXv4jW6UV>vekChydP)($Rb@?GEIfnDnHkf)!DjJeR{o>QneQap8Rtz% z<61wqOFcm^Q^E9lLN-+@m`P8l;uqP?S?Mz?n8Z)fT^GF^+rHry?cp)y>{JJC&HN>a zRb5sk%&2IxB=QCYQug^3O`&9Xsl-n!npR2a8=-z%Dw+*{1q21skH4&FE-0}SmF$*J zaewaAHs$>HIEj%$mP#i1GqQIQ&5X2#oHc0OSzmft>Maf2ZbBn}QE9F^-Qh}R&@*=7 zOeNFGpZ&l1EFgXOMY2$DZn$#GjNHR5}hrcqj%NFc$%suuF277+1Y}S$gOWipLd}FHEEtk>v zcXaHhH{1yq^Z|{YApB?zf zDw#Fz#Szm){T-0r<5$gGZb0$eY@B3$ao4YF>DG()1<9kDEK*=Gs6f8k!}6xTX{BYIl={~+g*@Ki@G)4Z@>e|^G`{ittlKP$un>mr z`Gjcl)~npG)qA5$CUwfeynSO$GeU8XVv!PyZ*L7edo6vf^^OHq_Y)yHGE%?R-SpaOA~9GZeA=tz#=&o0SyLD`em-~Psf5m zhbCSsi%*?2md;NYo_WWV-y92fn6t)L_t^XQLFY+Y+ms4?S^Qvo$DJPO^d671i*Z(8 zk+)ah8>u*l=v#Ae4_|j6a&vZd`vei}aSut??oL&6nf~pJQPv5>>Buifgg2wUnItEi z4e?3BP1+6*3Z&P#<5!vl9IdWSXZX+Re0kVAN3hxSx;e?XC2$MftD*7fQ2U?bvF~U@ zd&KVZV)e7{uTIHnwQZQS4s!-&N_D>prFZjiI@o_!g4GAy{r=CYwSw$n%R19K>6oR7 z>|M4JcMI;GP+qGF+y3=4cSNXP+{KRLFrqvE)x=Cm9Cvqqt=8RA*sTy`5+w0veAzm$ zTJ7a%>F&6@7w#zP?!~{O_~Jej5$Qkb+n%m)oO0IJk({$;)};r^UP$G%6oZpnxg3zr za30sV%|5!xy92*lcDH%SZfRX=X<{?`ve1)nuAV)9Y|9qspfAL|bLXVxoB@30o7?00 zu<)Q|b0SJq#!|PMu#9SMjwSPkdCoMSo1B5SFl$boB62^t_*>t!_cdrc>)6Xq5-a8| zz7v?GRe3_RZY7Dk%}o?>J%2Vgy)xr^T9{GENzz_N1qHItNn4nc$-NyswOW~o6y8Wr zw$^4`3U65WmDYB4extrvb*OS5E~mT8q}zlfrXU|R_~_I5N1JlFnCyyc(et>qxtD^X z2DY&ei{2}L@*D7Ox=xmbHAhQFh=ys;kR)3tWlP?l5N9WHv@xYpQgd%vQaKBHRx7=* z2roxYO5;wurVV~7wYMT^aEnBf@xD&J_17;sl|T7q`^;zM>%=wRr}U=xy`^|uJ5hZ- zYiAOtdRafg;ltb8Gm7c)Gu>R)cf}86#a%DWD5emSoI(uQllpS%6hTi3aTZkz+nZ@h z!*+u`p&iTxtyw)C?P3?2(XjWoH+pH#p%XW`Ch2IBr)I}K!9w$wsymCmpL$A2b}XD- zuTsH2aTeP*dF$Nwu6$#~wRWsTC(}Z4D|WKaoJm58RJih}qSi9jeY`?`B?wW!DZBF5 z=V6(8JR(FLj7q%F$*du+?=BXpv1qdD_SY4c9UEv_SgS2o#FtYuk@>BQoqEBIIrgXO z_^HmW)&&`6eqBvS5c#L-YNxUE)XrX~lJ?MrMdi=2`z|5ct32~Jk!i?fUUw5CcX@a7nOv61m*=vk;TUk&!P!HNkCn51!_iuRTMKDBILJh& z_15vd<+yN)aJ#j+Lu}t;jt?zBS5ICxZd8)T?I;QbQ9}o|F?56ue={jiJhw-rc^rSJ_~!9KIv$h2fggvcAfsE&8ohijkj{ME;Rkq%j``@ZgYCu z9WU$of-T-{k@bds>sIAS*~k2mj$=MqUsEByH>`HmzIG*^Ynyb<=o4+YS3g1}r>lHN zh>rQENwRGTD!25$$N!L{yyZd%F?21`9UBk-|NN5Oz5eF8E(0bQVAA-g=9B|Wb-5V^ zm=Qi5S_ADveR8|m8+ZSB_>$Evty-z?gzU+`;Kz~;_)eF-;Gjpf8)%Lxjh+MNW~7m} zV5r{Npw*p!p3P{jS)$dmxe+$VL}jFr`V6w0(c3tz{_%L99>l`A8g^ii8KpGV54Mlv zgp02HIOd&eg{?HKhAuM1oXkiwRvc(DWg@LdL+r*H|4yF8HJ5Mt*eX`2ruXHCn!1^= zTsX`u#WMWTFgwkdGPS;V98;$*md=QibGTjNq7A>gS$TWL+E#8>C(b$C+#{}YTJpW+ zw4_Uq9Nw3kn^K%~e0MoLY3IL>s{HZo=~s%7lrvPmc3PU0+3w(9=rqMS>1<|iq%S0DQxBV-n48clgf;w@jWOl2P$@OA(BRgoXv>ua^WU9=g$8K)_V8q8S{BlZjWMgR z^n4g&F0k#}LyQ!}7;-*y@?&ia3?_z_7z|XOjWo%1^Q-(QyS?}He)s&H=<2Dlux@&W z`8l`8JhMib7Fo&t-}j%aL66+s8)?TmXmqZMD){Ax>5lAITHJ?H?c5k;E|Z)8S@Sfj zR}VB4$mUJQ*SD%<^A`537;A=QqbQrk+AVqKNt>Tqri!nsbFNjE8)r6TqX?bG+tY`D z^&L_V%sE?Cq<+I8+kd=yK^oyRvC!Il{MEgE0(||tze-~*AxtV_GDdF+%$)47btRgp z)Ly9xCNewuznOY+f7Y4SZ}bEcgGKn<33g>AAJlu}%1W7a^@{6pYJinaNS_pC7p2|Q zTvMP3jpjURGr^o7u7_M|=kTV^qHc8zYc)%kpy(NWwq{z0wet|ePZLa*oRsD3iS}Z8 zrhmc6F86=ceFYv%a7s%$!JdATOqU!q_47$)v9|v+pJ0!Zl9TVtZC@NEWgnap##0HM z*x_$02jN)6U0eUVJ{g4WvzN|MW!lZ-`KxfdBDv^aCKpxxmT8`Iu@caz{u72eM_ zGLNd-IiD~AoI+fmr-f}Xpix-Hsl%dVzR{=; z_oUn|cVenZ`Yv7Wo9Xs70{>52@9#Xl=w>YRU<(cF=Ju8emToCfp($g{jCa*k-OZ<@ z<;fgtE^0en8}mfl_DMO|Q!v(4&dmw`EXR+|rIq%#ZF~IP-}{i4v(I~D?G7`)^!~Di zWk4s_;99Kmz(-pKhvHx9s0G%n*JLu-tqY7bvp0#S@x~j)4M~;&EGa&w@X5c zSu?;jv&?hi`c7k^3%)s$Ml=fhb(d~1its<%+ z3n5vEd+6ASTj^`J&=s0uJjg}K%FQ+-6t@W$s^eQrtK@jr@!l#dh#1Z})BR4%k~Vkl zw61*0j}YrIKOX3uZH^JwvwZg47C38X&&^9pdr3)Gau)pAXJUqf50_!j=)ye+zuyQ+ zO-Q`!4^uS=NIk&gIfKIO-33z`1^}}48v73_;Avzc*hadZS z``x;l?rDz0v0r+QSx8)8Bo;wfOq>1B%wa93ceCPJC!^ML%t@u*4~ukIH0*b8aFc(6 z_G3{b#CkAlDj_KeDL%1A&q<}Xo+CsZ3s0S8|OWLaw zPDsA$qr*;~T2;?V)#_Q-=9q58_5F!OHd22-VciyIJ_>$}h0`yB=bEKhcnZulJM+=k z%FH$Qv|VeiiJzbCPv@Fa`Ptq&*EG!U{lJsRm{t|o&SOmC0;F8Q*h5|W5x)-X)8vXy ztJJk_OVu@|92Vitu+UIjI;z*;jAOqnWtBUWYAG_15bk%ylnAX+KmEu{YY5TIiesk! zKr@ZFo;k*>D!{4PTI~gyL?PZ{z8jp0)P~cRZEEoM@NXIr%NhPDYl{%OtV<)fG(IE5 z8|6GR=UHRSvk>-&IY>xB+})JFgtvg1UeFupxn97`mB<~uBXSQK^8(j*ivntb*W+pN zCpEj&&0u8}uJed}i-$ENJ6VD(1Lv8TLb%SP*_UjdeF|=H?n=ItnQIKOcG@}+W9OL@ zg-Ck=7McL;O?u;#Dx2Fquy)>hqU@u2#urK{*3C1uLrK$)5$yZONi$+@f!SI2r{v1| z23$HK$PWV>P(TWIbmW`%_&UKmq`VvFn(Zo!Ys?EPhI8(lr7n$@WfEiygAyfM0) zazBhxU0rOKYToQ}2fo|hI2g;Ki~;O19e_#=GW803gL3p;VjndLmfGg6zs!2D%Di-s zFfU>a8Gg>~nb&XAq_^85O=cQ6V40o3n6lqxsDAQL6(Tx=Va8=9X%U*d%yQGL2>U`! z&nQC2V{((fsJ+e2wcxkhbGHsh(x#-di+b~xNwC81c>f-Him@_h=NWqJ!?DA;vYQ$d zh`8?YcSCxtFwd16-MvsaHFg{8$sGk)4Toma@y_q-}b~V=l}UW2YZN7syO{D566p!w<{CQ_uCkCB)-)h z82$_SIrZmh^QrlwIOVtN*NRD<1UrXgn0q|=;;tJ`7yU}G$98?cOv(IMf@^=vSDITh zUp1SlP!iEOMt!wc+nu#g-%|(by=b7T6B?@MF-=yRnI&nvT666oKEuPc>8cE`pBRhc zdR&q}bzW^Qm-OcKj9P6Hm-1%u*vrTu^Ij=$M&B$(B#o}W)E*L0v%!2_gko;YG^~)@ zeJU6;w-gyfuC<%I&ZEzYuR8dnrmhTk^E~>w ze69JcG?lb&t+^@p*;?Z(!Ovr@7&2;Zx)wfD8IDcJ~{qXuSL3Z7bjgLO-3vg z|E)_7YsVOq?hw~AdV`5q)>|>h%nkMl<3n7Y6^dDKKh^5}7v}30s}?}ymT9BuQI_2D zZnRIQCDunazfrS%KgWXHVhKq`+;_@$o3t~_7rL0BmLz29MsuIIzPRJM7R46YV`9TP zN26LN|Lkkh&`^nHsa4Kf(vy3OnNrRh+{OLaUC(*nBpWdy(qK-<(9zmrtKFuB zXSN-(Z_!c)*E%R_!!EcwQ{67vy7l3(s075}%oq|L9x=kP*cN>7!pV~_bZ1M$AAbNa zd8Upyy$^HK%HFXAO_2hZ9-OMOY1^)ZdF}eV~ ziJ^CgU9u zI(w&GABzX7`HrI z=h}198|wzgHoDr|o;O)Tv}-Yj5^GNExiD_nyorUGmANGz_qjP)k$sx`xjiRd(|mW8 z4;Ch5c1AN=lL*Jc_$qm$oX1O2o0v*ouZJg0##QpRNLYT4T_0|X?qgdk=R;-U^^4uu zt&P=g*6j2cA?hy;KF&KfLDS(c2ywde_j^pK%A8PH`@g70T{~%+-IW;|TkJJQsxbz* zfnV%3xvIP}HdCs2i}?QDYaedwJFh--EY%ljNL#(NDE)q)xln~Poy&$MQB{V+`5Em4 zqIAcT?S_r-l0)XyKP})cWSm*j+n)Au7BbdfH~i~jqn;ZW^QF05_0?|p;;xd;`%MTt z?0aj~SfhnqHNl>~`^~Uw?DZS95&pI(o3)%N?00RyT_x$Cbieyajck+HM^^X>dAQ$1 zR%gCa=ix zkCeB&3>}xCMEDXb51unG>h}pDS!wLY3zJGTBC&YuzFDcW2lpd+HnvlwH^Sp=#8b9zz{yCj*Ei~rT>}+rHKZ~u^972oQX2IdHG4|QC`j&q#UuayIL{HYw)8DqNtl@$Lv|2$zC@9k3CAKbK37V`ki}#yv~1kk{*#(t zG@r8Dvas$StT<*4L~+^pb1bx+4QhD&TK?<@T38kw`NfzT|7(EK9GjNEOdOp!>YpEy zJD)G2gUA0QN^%r;y>a)LX;q88{Og!mJcV*3Ic~?ebE86n?A3;7(X2y_Wn=o|W}PhG zJ#G%wV&)Qh-273CnM;}DCQWVjxe+n5kg|J0`i+})FQ3bCZ_PP3Fzu&noEx_86Cch) z7M@-WO%%^4#q~5%IJfWOc!)08lQNAtNnB6N33ICs?fGW8+;Y5GPFH`^-nr@c#vSrk z_ne)0;ZfAEPHREIi}I)O94|u+YFSTNTb{H}l3hAgc{1>F$(>f+TG#5z*EC=7jEyh7 zQ~UYS_L|kK-r##q?Gx87P27)(?LTSC)ql%gzFBJbwz2zY%v<)7=K#`p3%j@d-RFK@ zK9uOD;5@_g^1-P8cz(xyb|-w>DQ8p)@pS6e@v+a@BdvIA+DG%hAE0qt#Jy+Cnbz(f zzM#|ge9`Y@?E`;TxpvJ;&H9@MdWxPV_*W~l|JMG5zTBTT%I}LN&6Kp)p^AIH**3jQ zlv6@_y!|{=P#}YX`*7Az7^lE^=;Mb4_O)Ee0p$*|e>Jh2-B)?!fSYGMnVq5$_ugsa zYfRAszct~FX`=i!O&7WD<1gvIwGYW}S1zkxyRdof0k`~7=5%9*{662BEIi)e8-}IM z$uF8uZ*==~EZdFrFJa1?{JXfYEuHBtpdt%~$ z^*p!c|4;2+9XDpaPHsYElnFy7zrwgsnkJuUpK z8PS{z8}^mK@O0>#t zoim+Ukkt5dCQDzoXPqznnLh+Ys~N zdDE*EUCZ5eVuUxlV0X@s^JHkg@l2BxugcVgkW`d5&C^k-GnY%6$f^o!)-e2nN!*%F z7mI}ti@pa(-Pp9gx)%#)Ua|IqDc73Z-0~Iw$xKs>%0Jm>yUn@M22EMeR+r(N#}D4H zd>OOxMU!0R?{(2cw!>X^(cJHVyY-@Jf$l4F$v#F4_{O%FH+^rFS7mT5UH9Z=v$rEL zof`0sr!^8&`dn9@C;L0^Rh|dP>u3MmI&w+OoRrLjR&+Jj*xdmNmb4SQ z?pBiDHG9QWdG)An;|G1E8;i~=+u5c6QjH0&nV8pi+T8`WTe!RS-8EBc2rZtzJq2Da&CKbOC}cfnR&VQ^aK={57bGyCDzZStSZ#ZGMJ`q^~rhU*rr%Fp(^CcMhy zlyzo^DPQk*PVWGLnfrx5Rnf!mT=HK?rasVN^6x+S)kOu=cH?p6}bnDLDX?NSLu8}wFX>3&W@_A#Tj_TP+r@9v3 zFwImwZnbT>VP>%HJ4Ot3{~cZOCX4YKb>&qIHxDQ8@S9j_5`A<@;P#eDryY1@nc$|K z#z(!|RY($jN|P!lSEq`7aaVEd+bi;Av%XmqZu#BP{a=O~tAXN*9Ea{Rx9sj;sZagP zD;t*__39`~e%mbUO0{OXZMJshGQ?Z22ira7wtdknFuO@y{dT4ZDoG%?rg zS>(S``kgXqu`uywmh=^y{qgOqF5>^t?B+D&OZCw1^b^NEKVUl7&Vz+>9mYLBxNYI~ z3;VPj>^nnD-CAhc)jvmA*r-;o_V?~Xv$vn!lcwPQm(#0b>3jaWJ8bGOrGl|ia(_>lFmCN{5_o}b*{`Z-C1oK8+&H4R-S*N(O zm_lf9DKctC){@`s%k?Vmzb6;gxXwJX%q8=jxW2ozflkj~$E-dxZ{v!B#C5LEKmXkn z8c6DCsTHj#%7?AazGZiiPQQ-DTWZ4z3H!s0Ag(XrBm0s`fl3u4g3mQ{pY&(Q%>9Si zG?1R_>;q%Q+(B$!U2KZTb%q+>|Iu7^>mcp}-Fap*4W`RDoy*i7>^%vCa!$3hp@Pn8IaPCx#eCa?DHs_8kzo9^XcR{Od6Xb4xioN2AEIS~^P z@vq(~9?m$F=Y1kNbI2Morr%KZq0@7-O0LuWeM5+$?v=UTqiWfX?9($c&K-;i&rR}S ztPdQ^qV@l_XFQp1Mt3W*t*$z=WBHcHVx3&in$^Q7u5-+pi^CYO-JCm=O6EhD@_G+h#`}v!ZBfMz? zzQ?m*gf}|i4xWtB-p~M#zrU#y?M<68?wmiwWUOq%1N_YnJh~luCz>2d#rpG~4ec9z zaI)CRU9ULg)PbxatpM zlQ-+uZH&Ktm{<>j@YjtWVwuym+{x=tlVG{{)0wx^1f3r1>?jB2*Is|~fNcNEACz_p z^tUdLJ$W{?)0d5BukiTSLrF_=PMg%8&bGQ)yC(a;T%2rapvQj*N)Srie`>lB3l%9e z;e*?GE2m}&wFpJyk^LNkE<^KV(B6^W;DD3y{LT51R3nd`CLQGs&Tu}Szty{XemQx= z+6BMr5f5fXx}IdeG$ zW58jeJXPEu@DvzL-0Q^Eg7DXPCvK-rHS9ETHR?ogC&&3q*w2rdA)`6)E*~@NMl%XM zA%^yDa=ugPKPp-)%!yI_)k6($Tx2vMW4tL7xz`J;B=9#i#&~OlmrG>locPm|Crfx2 z>dc`#Sd7FE2vKd-7&0>J`XiaL*bgeu_5A`9n`2`bmeM6Qzl@zpq{hb;S6#ihrx?x^SyN)XH@~NK zQqyU?x4!!~!sfg2-r6r8m2s{}zpbb|Zl>F(aXWePIH*mP&3~Oyo3l zl;;q#P{lnm{l4eS*&M|wr!&oXONBTgHIth)6G@9F0G>_c96?%bCNZ~enZiDZI{o(9 zZ*`0Gv!^Vfszdg9!z6M`Fu-0fgqHm%=djT!(vzEBJrv4&D1Wf$%t1-3HErAJhZ2Nv zxn9+8U+GP4QcmVB!f&%p9Nwaa>~M;CFhwIX0OaQ2(n{!kmhK*(xuu zkN?EJ>F_U=YgK6S3N!R5m<|t0?pz-?x27=G-%erTO=TYP6mu>(#B@q&N=&7y`lU1z zrc&+h^}5%tzv(Yp;?(1~IHtcE=1+`QPNVi$2AQP%{jwgg$~~Q|PXzf}rv&cAwVFZI zBv@+KdEAfIxGCICW0uY$C7!LgNQ%XJIM1lO6E$>TuRQlS%@?zuVDtO;K;w)ve%5$0 z!<*-gV!V0)WZDD{N= zW{guYI@2bd#EC@H)Y?o;Y-3YPOn>*?x3DZQ(|_1^&pr3tbIv{Qp7ZX<;nb_6H9a&E zVLgtAC$1ckZ5IsY&MaEAOUl#d@D019<)$|i=`;YQ-zL&+{)=2C>1|jv#3tm?Hk7|V zLs#0sba=mkBmqC$$ z;W($|!KNe+Y|a<`(3#~{3Uy=G=fW^8vGJ;3d^4_fnEsGNSp-v`m`p7MhsM1U5hOBB zqZW;Sw_}X!B}RP1ub1q>bh^hU!otj#+hb0ow80s2UkGD~;TKN!Kri5I#C4K{z0v~i z7WgsnqLqjdxvT15n{T?_^}%0J=a|5}v)N7u_u@3mU10E| z1b>qMz2)2vZ$B{jqA@U%Q^>XtL$NT01`j}Ol_{}$(A&GA>|)mHi@iFgzLMcep`3#- z*zNnIR_i}gg_jQQo_1rhciSptbv-xJ6#T6`5nHsYy`Mc20ewgRyz{a^OKirZUt{${$^od z7-LBW?c~&-0tWwzI@Q~notfJ>IE*pAVn4~CPtn$tF_*sE4}Cm8PwFe8GzvsAz6F`&K8U%= zuo(LMAYT1znY+Q52`MKM55a){kxAu;@ctlh-w(L;_q`(Mzuj`8 zcS=?Bx2IoTe*Y^2mxPd-DUM$6lDeljJ+kJm%NAK4>8IUNDcu~DEb+*Ml`UuEuZ+{N z`S7pxwauYlbxW(JY;k%}gLZry8DSJEN(?GNq=56d6*amnH`IH)nx?oKR0UZf1AbXo ztkQ^tf?A+KbtwX%@;bMtrY7jDcdgeEHP?E@=M?!QkyK6A>XQSiBA)QT8LSTongW&1 zDJ)Y#!Z$F9zu*$**cRwqa-g=}sVeRg{^$z$f*!A;%I<(~BtWZi=>W9>2@ieB5CZbm zH3DB%{18%6>1I4jE7dWhYS4ESB$|(*&NYpkQ__54 znsGaG1ynNkOV-Cm_69Il*HCx797$uHbDiSN*2fIGuU8dC-stq!DXKAeK4(y-&)$-f zEJ7K&j=2u>hcM^n8*>kb*zU(MVq6gM8UojUr zVl>boq7=z$Bw|?Fg*sQ^28OVa#Zd%!VpC5ea$R1&CRtNO^DwN5cRo}I3-_GFY!8Yo zmZ&$;Vf&rhi*5jfpXQdRH*u$*!^$hkXHT1Bx)NxFT zvqSqHe=VBpcz7LnQN}kMg8m$C<(M|c2idP;Pe^t=Q zeV!0DJv385N4a$Q3#j!8l@%-nTo97=>tvix1Gvv>%K_gBfv~o=;!(;nvBQZ!t@97+pAHAd3fR7`B@q`k_yHI6mZm zPik2~xsxz6{=JRO2xUCT&c~AaJf@0ERcr#SPGF_<_^%}k*WT1n+)TEph&szL?9Ou5 zL@SrD_|W_ntek~ delta 77901 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%0DCN8lLjg0XNKU1<|2=L{3U2A!AiGcqA&Cdo~s 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 Y-L@a7*55UId=rw%k`QsnepA8!1N*`NG5`Po diff --git a/package.json b/package.json index 8a4f398..6734e02 100644 --- a/package.json +++ b/package.json @@ -1,45 +1,48 @@ { - "$schema": "https://json.schemastore.org/package.json", - "name": "spongechat", - "version": "2.0.1", - "private": true, - "type": "module", - "scripts": { - "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", - "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", - "start": "node --require dotenv/config src/index.js", - "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", - "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", - "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" - }, - "_moduleAliases": { - "@": "./src", - "@util": "./src/util", - "@events": "./src/events", - "@commands": "./src/commands" - }, - "dependencies": { - "@discordjs/core": "^1.1.0", - "@redis/json": "^1.0.6", - "chalk": "4", - "discord.js": "^14.15.2", - "dotenv": "^16.3.1", - "luxon": "^3.4.4", - "module-alias": "^2.2.3", - "redis": "^4.6.13", - "temporal-polyfill": "^0.2.4", - "undici": "^6.16.1", - "uuid": "^9.0.1" - }, - "devDependencies": { - "@release-it/conventional-changelog": "^8.0.1", - "all-contributors-cli": "^6.26.1", - "dotenv-cli": "^7.4.2", - "eslint": "^8.53.0", - "eslint-config-neon": "^0.1.57", - "eslint-formatter-pretty": "^5.0.0", - "execa": "^9.1.0", - "prettier": "^3.0.3", - "release-it": "^17" - } + "$schema": "https://json.schemastore.org/package.json", + "name": "spongechat", + "version": "2.0.1", + "private": true, + "type": "module", + "scripts": { + "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", + "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", + "start": "node --require dotenv/config src/index.js", + "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", + "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", + "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" + }, + "_moduleAliases": { + "@": "./src", + "@util": "./src/util", + "@events": "./src/events", + "@commands": "./src/commands" + }, + "dependencies": { + "@ai-sdk/openai": "^0.0.13", + "@discordjs/core": "^1.1.0", + "@redis/json": "^1.0.6", + "ai": "^3.1.12", + "chalk": "4", + "discord.js": "^14.15.2", + "dotenv": "^16.3.1", + "luxon": "^3.4.4", + "module-alias": "^2.2.3", + "redis": "^4.6.13", + "temporal-polyfill": "^0.2.4", + "undici": "^6.16.1", + "uuid": "^9.0.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@release-it/conventional-changelog": "^8.0.1", + "all-contributors-cli": "^6.26.1", + "dotenv-cli": "^7.4.2", + "eslint": "^8.53.0", + "eslint-config-neon": "^0.1.57", + "eslint-formatter-pretty": "^5.0.0", + "execa": "^9.1.0", + "prettier": "^3.0.3", + "release-it": "^17" + } } diff --git a/src/commands/instructionSet.js b/src/commands/instructionSet.js index 7a926a6..8a050d7 100644 --- a/src/commands/instructionSet.js +++ b/src/commands/instructionSet.js @@ -11,7 +11,7 @@ export default { o .setName("preset") .setDescription("Preset; map to => client.tempStore#instructionSet") - .setChoices(Object.keys(instructionSets).map((s) => ({ name: s, value: s }))) + .setChoices(Object.keys(instructionSets).map((s) => ({ name: instructionSets[s]?.name || s, value: s }))) .setRequired(true), ) .toJSON(), @@ -35,7 +35,7 @@ export default { }); console.log( - `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, + `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(instructionSets[toOption]?.name || toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, ); if (sync) { diff --git a/src/events/messageCreate.js b/src/events/messageCreate.js index af098be..06355b6 100644 --- a/src/events/messageCreate.js +++ b/src/events/messageCreate.js @@ -9,7 +9,9 @@ const callTextChannel = async ({ client, message }) => { baseHistory: [], accountId: process.env.CLOUDFLARE_ACCOUNT_ID, token: process.env.CLOUDFLARE_ACCOUNT_TOKEN, + openaiToken: process.env.OPENAI_ACCOUNT_TOKEN, model: "@cf/meta/llama-3-8b-instruct", + callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", }); const preliminaryConditions = modelInteractions.messageEvent.checkPreliminaryConditions(); @@ -40,20 +42,45 @@ const callTextChannel = async ({ client, message }) => { }) .catch(console.error); - const { textResponse, genData, callResponse } = await modelInteractions.messageEvent.handleTextModelCall({ history }); + const { legacy, runners, response } = await modelInteractions.messageEvent.preSend({ history }); - if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); + if (legacy?.active) { + const { textResponse, genData, callResponse } = legacy; + if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); - const { responseMsg, events } = await modelInteractions.messageEvent.createResponse({ - textResponse, - conditions: { - amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, - imagine: callResponse.includes("!gen"), - }, - }); + const { responseMsg, events } = await modelInteractions.messageEvent.createLegacyResponse({ + textResponse, + conditions: { + amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, + imagine: callResponse.includes("!gen"), + }, + }); + + if (responseMsg && callResponse.includes("!gen")) + return await modelInteractions.messageEvent.handleLegacyImageModelCall({ + genData, + textResponse, + responseMsg, + events, + }); + + return; + } + + if (response?.length === 0 || response === "") return await message.react("⚠️").catch(() => false); - if (responseMsg && callResponse.includes("!gen")) - return await modelInteractions.messageEvent.handleImageModelCall({ genData, textResponse, responseMsg, events }); + const replyContent = modelInteractions.response.format(response); + const reply = await message + .reply({ content: replyContent.content, files: replyContent.files, failIfNotExists: true }) + .catch(() => false); + + if (runners.length > 0) { + const postRunners = await modelInteractions.messageEvent.postSend({ runners, message: reply }); + const mergedFiles = [...replyContent.files, ...postRunners.results]; + return await reply + .edit({ content: replyContent.content, files: mergedFiles, failIfNotExists: true }) + .catch(() => false); + } }; /** @type {import('./index.js').Event} */ diff --git a/src/events/ready.js b/src/events/ready.js index 2ca292a..dd7227e 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -1,6 +1,7 @@ import { Events } from "discord.js"; import { Environment } from "../util/helpers.js"; import { createClient } from "redis"; +import { instructionSets } from "../util/models/constants.js"; import chalk from "chalk"; const env = new Environment(); @@ -42,7 +43,9 @@ export default { client.tempStore.set("instructionSet", instructionSet); console.log(`${chalk.bold.green("AI")} Silent mode is ${chalk.bold(silentSaved ? "enabled" : "disabled")}`); - console.log(`${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSet)}`); + console.log( + `${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSets[instructionSet]?.name || instructionSet)}`, + ); console.log( `${chalk.bold.green("Core")} acting as ${chalk.bold(client.user.tag)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, diff --git a/src/index.js b/src/index.js index 869af27..5ad03cb 100644 --- a/src/index.js +++ b/src/index.js @@ -12,7 +12,10 @@ import "temporal-polyfill/global"; (() => { console.log(`${chalk.bold.green("Core")} running with environment context: ${chalk.bold(process.env.NODE_ENV)}`); - console.log(`${chalk.bold.magenta("AI")} running with LLM preset: ${chalk.bold(process.env.MODEL_LLM_PRESET)}`); + if (process.env.MODEL_LLM_CALLSYSTEM !== "integrations") + console.log( + `${chalk.bold.magenta("AI")} ${chalk.yellow("Warning")} The legacy call system is enabled. Integration calls are not available in this mode.`, + ); })(); // Initialize the client diff --git a/src/util/integrations/index.js b/src/util/integrations/index.js new file mode 100644 index 0000000..a9eefb6 --- /dev/null +++ b/src/util/integrations/index.js @@ -0,0 +1,82 @@ +import { tool } from "ai"; +import { z } from "zod"; + +export class Integration { + constructor({ name, description, parameters, stage }) { + this.tool = tool({ + description, + parameters, + }); + + this.executionLevel = stage; + } + + get stage() { + return this.executionLevel; + } + + // pre-runner integrations run before the model call and can ONLY return a conversation-based output; () => Promise + // post-runner integrations run after the model call and can only return file-based outputs; () => Promise + async call() { + return {}; + } +} + +export class ImagineIntegration extends Integration { + constructor({ workersAI }) { + super({ + name: "imagine", + description: "Generate an image with the given prompt", + parameters: z.object({ + prompt: z.string().describe("The prompt to use for generating the image"), + }), + stage: "post", + }); + + this.workersAI = workersAI; + } + + async call({ prompt }, ctx) { + const callToModel = await this.workersAI + .callModel( + { + model: "@cf/lykon/dreamshaper-8-lcm", + input: { + prompt, + }, + }, + true, + ) + .then((r) => r.arrayBuffer()) + .catch(() => (e) => { + console.error(e); + return null; + }); + + if (callToModel === null) return null; + + const buffer = Buffer.from(callToModel); + + return buffer; + } +} + +export class QoTDIntegration extends Integration { + constructor() { + super({ + name: "qotd", + description: "Get the quote of the day", + parameters: z.object({ + luckyWord: z.string().describe("The lucky word to randomise the quote with"), + }), + stage: "pre", + }); + } + + async call({ prompt }, ctx) { + return { + role: "system", + content: "[Function call to QOTD]: The quote of the day is skeebeedee guyatt toilet.", + }; + } +} diff --git a/src/util/models/constants.js b/src/util/models/constants.js index 312d766..d0bc7ee 100644 --- a/src/util/models/constants.js +++ b/src/util/models/constants.js @@ -1,3 +1,6 @@ +import { tool } from "ai"; +import { z } from "zod"; + export const instructionSets = { default: { name: "Default", diff --git a/src/util/models/index.js b/src/util/models/index.js index f1dd258..b3242d4 100644 --- a/src/util/models/index.js +++ b/src/util/models/index.js @@ -1,5 +1,10 @@ import { fetch } from "undici"; -import { InteractionResponse, InteractionHistory, InteractionMessageEvent } from "./interactions.js"; +import { + InteractionResponse, + InteractionHistory, + InteractionMessageEvent, + InteractionIntegrations, +} from "./interactions.js"; export class WorkersAI { constructor( @@ -55,14 +60,17 @@ export class ModelInteractions { this.disabledModules = disabledModules; this.history = disabledModules?.includes("history") ? null : new InteractionHistory(opts); this.response = disabledModules?.includes("response") ? null : new InteractionResponse(opts); + this.integrations = disabledModules?.includes("integrations") ? null : new InteractionIntegrations(opts); this.messageEvent = disabledModules?.includes("messageEvent") ? null : new InteractionMessageEvent({ ...opts, interactionResponse: this.response, interactionHistory: this.history, + interactionIntegrations: this.integrations, }); this.model = opts?.model; + this.callsystem = opts?.callsystem; } } diff --git a/src/util/models/interactions.js b/src/util/models/interactions.js index e736c08..8e4fb3e 100644 --- a/src/util/models/interactions.js +++ b/src/util/models/interactions.js @@ -1,6 +1,10 @@ import { fetch } from "undici"; import { events, instructionSets } from "./constants.js"; import { WorkersAI } from "./index.js"; +import { createOpenAI } from "@ai-sdk/openai"; +import { generateText } from "ai"; + +import { ImagineIntegration, QoTDIntegration } from "../integrations/index.js"; export class InteractionHistory { constructor( @@ -14,31 +18,39 @@ export class InteractionHistory { ) { this.kv = kv; this.contextWindow = contextWindow || 10; - this.instructionSet = instructionSets[instructionSet || "default"]; + this.instructionSet = { + id: instructionSet, + ...instructionSets[instructionSet || "default"], + }; this.baseHistory = [ + ...(this.instructionSet?.instructions || [ + { + role: "system", + content: this?.instructionSet, + }, + ] || + []), ...baseHistory, - { - role: "system", - content: this.instructionSet, - }, ]; this.model = model; } - async get({ key }, all = false) { + async get({ key, instructionSet = this.instructionSet?.id, window = this.contextWindow }, all = false) { + const baseHistory = instructionSets[instructionSet]?.instructions || this.baseHistory; const fetchedMessages = (await this.kv.lRange(key, 0, -1)) + .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) .reverse() .map((m) => JSON.parse(m)) // only return the last [contextWindow] messages // if all is true, return all messages - .slice(0, all ? -1 : this.contextWindow) + .slice(0, all ? -1 : window || this.contextWindow) .reduce((acc, item, index) => { // this reducer is very.. redundant, but i'm adding it for later acc.push(item); return acc; }, []); - return [...this.baseHistory, ...fetchedMessages]; + return [...baseHistory, ...fetchedMessages]; } async add( @@ -75,7 +87,9 @@ export class InteractionHistory { .lRange(key, 0, -1) .then((r) => r.map((m) => JSON.parse(m))) .catch(() => []) - ).reverse(); + ) + .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) + .reverse(); const interactions = current?.filter(typeof filter === "function" ? filter : (f) => f); const formatted = interactions @@ -188,7 +202,7 @@ export class InteractionResponse { } formatAssistantMessage(content) { - return content.trim(); + return content?.trim(); } /** @@ -207,12 +221,12 @@ export class InteractionResponse { * @param {string} event.status The status of the event * @returns {string} The formatted message * @example - * const message = await this.formatOutputMessage(content, event); + * const message = await this.formatLegacyOutput(content, event); * console.log(message); * // Outputs the formatted message */ - formatOutputMessage(content, allEvents = []) { + formatLegacyOutput(content, allEvents = []) { const bannerArr = allEvents .map((event) => { const eventData = events[event?.type]; @@ -227,18 +241,103 @@ export class InteractionResponse { return banner + "\n" + content.trim(); } + format(input) { + if (!input) + return { + content: "", + files: [], + }; + + const content = input?.length >= 2000 ? "" : input; + const files = input?.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; + + return { + content, + files, + }; + } + currentTemporalISO() { return Temporal.Now.plainDateTimeISO(this?.tz || "Etc/UTC").toString(); } } +export class InteractionIntegrations { + constructor( + { message, kv, model, accountId, token, openaiToken, callsystem } = { + kv: null, + instructionSet: process.env.MODEL_LLM_PRESET || "default", + baseHistory: [], + model: "@cf/meta/llama-3-8b-instruct", + contextWindow: 10, + callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", + }, + ) { + this.message = message; + this.kv = kv; + this.workersAI = new WorkersAI({ accountId, token, model }); + this.openai = createOpenAI({ + apiKey: openaiToken, + }); + this.model = model; + this.callsystem = callsystem; + + this.integrations = { + imagine: new ImagineIntegration({ workersAI: this.workersAI }), + quoteoftheday: new QoTDIntegration(), + }; + } + + get integrationSchemas() { + return Object.keys(this.integrations).reduce((acc, cv) => { + return { + ...acc, + [cv]: this.integrations[cv].tool, + }; + }, {}); + } + + async integrationCaller({ history }) { + if (this.callsystem === "legacy") return []; + const model = this.openai.chat("gpt-3.5-turbo", { + user: this.message?.author?.id, + }); + + const call = await generateText({ + model, + system: + "You are a bot that can call functions. If no functions are required, respond with []. The previous user messages are only for context, you have already answered them.", + messages: history, + tools: this.integrationSchemas, + }) + .then((r) => r.toolCalls) + .catch(() => []); + + return call; + } + + async execute({ calls, ctx }) { + if (calls.length === 0 || this.callsystem === "legacy") return []; + // for each integration, call the integration + return Promise.all( + calls.map(async (call) => { + const integration = this.integrations[call.toolName]; + if (typeof integration?.call !== "function") return; + return await integration.call(call.args, ctx); + }), + ); + } +} + export class InteractionMessageEvent { - constructor({ message, interactionResponse, interactionHistory, model }) { + constructor({ message, interactionResponse, interactionHistory, interactionIntegrations, callsystem, model }) { this.message = message; this.client = message?.client; this.author = message?.author; this.response = interactionResponse; this.history = interactionHistory; + this.integrations = interactionIntegrations; + this.callsystem = callsystem; this.model = model; } @@ -261,7 +360,7 @@ export class InteractionMessageEvent { } async validateHistory() { - const initialHistory = (await this.history.get({ key: this.message?.channel?.id })).filter( + const initialHistory = (await this.history.get({ key: this.message?.channel?.id }, true)).filter( (e) => e.role === "assistant", ); @@ -321,47 +420,8 @@ export class InteractionMessageEvent { }; } - async handleTextModelCall({ history }) { - await this.message?.channel?.sendTyping(); - const modelCall = await this.response.workersAI - .callModel({ - input: { - messages: history.map((e) => ({ - role: e.role, - content: e.content, - })), - }, - maxTokens: 512, - }) - .catch(() => ({ - result: { response: "" }, - })); - - const callResponse = modelCall?.result?.response?.trim(); - const textResponse = callResponse?.split("!gen")?.[0]; - const genData = callResponse?.split("!gen")?.[1]?.replace("[", "").replace("]", ""); - - await this.history - .add( - { - key: this.message?.channel?.id, - role: "assistant", - content: this.response.formatAssistantMessage(textResponse?.length === 0 ? "[no response]" : textResponse), - respondingTo: this.message?.id, - }, - true, - ) - .catch(console.error); - - return { - textResponse, - genData, - callResponse, - }; - } - - async handleImageModelCall({ genData, textResponse, responseMsg, events }) { - const final = this.response.formatOutputMessage( + async handleLegacyImageModelCall({ genData, textResponse, responseMsg, events }) { + const final = this.response.formatLegacyOutput( textResponse, events.filter((e) => e.type !== "imagine"), ); @@ -408,7 +468,7 @@ export class InteractionMessageEvent { .catch(() => null); } - async createResponse( + async createLegacyResponse( { textResponse, conditions } = { conditions: { amnesia: false, @@ -426,7 +486,7 @@ export class InteractionMessageEvent { }; }); - const text = this.response.formatOutputMessage(textResponse, events); + const text = this.response.formatLegacyOutput(textResponse, events); const content = textResponse.length >= 2000 ? "" : text; const files = textResponse.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; @@ -443,4 +503,83 @@ export class InteractionMessageEvent { events, }; } + + async preSend({ history }) { + const callContext = await this.history.get({ key: this.message?.channel?.id }, true).catch(() => []); + const calls = await this.integrations + .integrationCaller({ + history: callContext + .map((e) => ({ + role: e.role, + content: e.content, + })) + .filter((e) => e.role === "user") + .slice(-2), + }) + .then((r) => + r.map((c) => ({ + ...c, + stage: this.integrations.integrations?.[c.toolName]?.stage, + execute: async () => { + return await this.integrations.integrationSchemas?.[c.toolName]?.call(c.args); + }, + })), + ); + const preRunners = calls.filter((c) => c.stage === "pre"); + const postRunners = calls.filter((c) => c.stage === "post"); + const preRunnerResults = await this.integrations.execute({ calls: preRunners }).catch(() => []); + const allMessages = [...history.slice(0, -1), ...preRunnerResults, ...history.slice(-1)]; + + await this.message?.channel?.sendTyping(); + const modelCall = await this.response.workersAI + .callModel({ + input: { + messages: allMessages.map((e) => ({ + role: e.role, + content: e.content, + })), + }, + maxTokens: 512, + }) + .catch(() => ({ + result: { response: "" }, + })); + + const response = modelCall?.result?.response?.trim(); + + await this.history + .add( + { + key: this.message?.channel?.id, + role: "assistant", + content: this.response.formatAssistantMessage(response?.length === 0 ? "[no response]" : response), + respondingTo: this.message?.id, + context: { + integrations: calls.map((c) => ({ id: c.toolName, stage: c.stage, args: c.args })), + }, + }, + true, + ) + .catch(console.error); + + return { + legacy: { + active: this.callsystem === "legacy", + textResponse: response, + genData: response?.split("!gen")?.[0], + callResponse: response?.split("!gen")?.[1]?.replace("[", "").replace("]", ""), + }, + runners: postRunners, + response, + }; + } + + async postSend({ runners, message }) { + await this?.message?.react; + const runnerResults = await this.integrations.execute({ calls: runners, ctx: { message } }).catch(() => []); + + return { + results: runnerResults.filter((r) => r !== null), + }; + } } From efd1fe555499b0303010f93e008b04352208f354 Mon Sep 17 00:00:00 2001 From: Dani Date: Sat, 1 Jun 2024 09:07:43 -0700 Subject: [PATCH 3/7] revert back to main branch --- .env.example | 9 +- .gitignore | 7 + bun.lockb | Bin 379437 -> 393995 bytes package.json | 89 +++++------ src/commands/instructionSet.js | 4 +- src/events/messageCreate.js | 49 +++++-- src/events/ready.js | 5 +- src/index.js | 5 +- src/util/integrations/index.js | 82 +++++++++++ src/util/models/constants.js | 46 ++++-- src/util/models/index.js | 10 +- src/util/models/interactions.js | 253 +++++++++++++++++++++++++------- 12 files changed, 433 insertions(+), 126 deletions(-) create mode 100644 src/util/integrations/index.js diff --git a/.env.example b/.env.example index 0b229f0..ba71d1a 100644 --- a/.env.example +++ b/.env.example @@ -46,11 +46,18 @@ CLOUDFLARE_ACCOUNT_ID=abcdef1234567890abcdef1234567890 CLOUDFLARE_ACCOUNT_TOKEN=v1.0-abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 +# OpenAI API: Specify an OpenAI account token for use with the OpenAI API. +OPENAI_ACCOUNT_TOKEN=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + # The following variables specify instruction sets and configuration for the various models in SpongeChat. ## The value of the variable should correspond to the key of its' responding configuration in modelConstants.js. MODEL_LLM_PRESET=default +## Callsystems are used to call functions during passive activation. +## Integrations is the newer, flexible function system. They are easily extendable, but require the use of the OpenAI API to determine function calls. +## Legacy is the older function system and only supports image generation. Use this if you can't use the OpenAI API. +MODEL_LLM_CALLSYSTEM=integrations -# !! Wastebin +# !! Wastebin # Used to display logs of memories for users ## In a docker-compose setup, you'll need to set up some sort of proxy (caddy, cloudflare tunnel) to make the "wastebin" container publicly accessible, and put the publicly accessible URL here. diff --git a/.gitignore b/.gitignore index c27347f..a280e9f 100644 --- a/.gitignore +++ b/.gitignore @@ -103,4 +103,11 @@ dist # TernJS port file .tern-port +# temporary directories temp + +# package lockfiles +## we only use bun, so no need for yarn or npm +yarn.lock +package-lock.json +pnpm-lock.yaml diff --git a/bun.lockb b/bun.lockb index 82d18f1414d21d58ce720edab7f581233587dfe3..8da124c71307fe906ae2c176137346499f9038a3 100644 GIT binary patch delta 87023 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 delta 77901 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%0DCN8lLjg0XNKU1<|2=L{3U2A!AiGcqA&Cdo~s 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 Y-L@a7*55UId=rw%k`QsnepA8!1N*`NG5`Po diff --git a/package.json b/package.json index 8a4f398..6734e02 100644 --- a/package.json +++ b/package.json @@ -1,45 +1,48 @@ { - "$schema": "https://json.schemastore.org/package.json", - "name": "spongechat", - "version": "2.0.1", - "private": true, - "type": "module", - "scripts": { - "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", - "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", - "start": "node --require dotenv/config src/index.js", - "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", - "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", - "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" - }, - "_moduleAliases": { - "@": "./src", - "@util": "./src/util", - "@events": "./src/events", - "@commands": "./src/commands" - }, - "dependencies": { - "@discordjs/core": "^1.1.0", - "@redis/json": "^1.0.6", - "chalk": "4", - "discord.js": "^14.15.2", - "dotenv": "^16.3.1", - "luxon": "^3.4.4", - "module-alias": "^2.2.3", - "redis": "^4.6.13", - "temporal-polyfill": "^0.2.4", - "undici": "^6.16.1", - "uuid": "^9.0.1" - }, - "devDependencies": { - "@release-it/conventional-changelog": "^8.0.1", - "all-contributors-cli": "^6.26.1", - "dotenv-cli": "^7.4.2", - "eslint": "^8.53.0", - "eslint-config-neon": "^0.1.57", - "eslint-formatter-pretty": "^5.0.0", - "execa": "^9.1.0", - "prettier": "^3.0.3", - "release-it": "^17" - } + "$schema": "https://json.schemastore.org/package.json", + "name": "spongechat", + "version": "2.0.1", + "private": true, + "type": "module", + "scripts": { + "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", + "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", + "start": "node --require dotenv/config src/index.js", + "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", + "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", + "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" + }, + "_moduleAliases": { + "@": "./src", + "@util": "./src/util", + "@events": "./src/events", + "@commands": "./src/commands" + }, + "dependencies": { + "@ai-sdk/openai": "^0.0.13", + "@discordjs/core": "^1.1.0", + "@redis/json": "^1.0.6", + "ai": "^3.1.12", + "chalk": "4", + "discord.js": "^14.15.2", + "dotenv": "^16.3.1", + "luxon": "^3.4.4", + "module-alias": "^2.2.3", + "redis": "^4.6.13", + "temporal-polyfill": "^0.2.4", + "undici": "^6.16.1", + "uuid": "^9.0.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@release-it/conventional-changelog": "^8.0.1", + "all-contributors-cli": "^6.26.1", + "dotenv-cli": "^7.4.2", + "eslint": "^8.53.0", + "eslint-config-neon": "^0.1.57", + "eslint-formatter-pretty": "^5.0.0", + "execa": "^9.1.0", + "prettier": "^3.0.3", + "release-it": "^17" + } } diff --git a/src/commands/instructionSet.js b/src/commands/instructionSet.js index 7a926a6..8a050d7 100644 --- a/src/commands/instructionSet.js +++ b/src/commands/instructionSet.js @@ -11,7 +11,7 @@ export default { o .setName("preset") .setDescription("Preset; map to => client.tempStore#instructionSet") - .setChoices(Object.keys(instructionSets).map((s) => ({ name: s, value: s }))) + .setChoices(Object.keys(instructionSets).map((s) => ({ name: instructionSets[s]?.name || s, value: s }))) .setRequired(true), ) .toJSON(), @@ -35,7 +35,7 @@ export default { }); console.log( - `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, + `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(instructionSets[toOption]?.name || toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, ); if (sync) { diff --git a/src/events/messageCreate.js b/src/events/messageCreate.js index af098be..06355b6 100644 --- a/src/events/messageCreate.js +++ b/src/events/messageCreate.js @@ -9,7 +9,9 @@ const callTextChannel = async ({ client, message }) => { baseHistory: [], accountId: process.env.CLOUDFLARE_ACCOUNT_ID, token: process.env.CLOUDFLARE_ACCOUNT_TOKEN, + openaiToken: process.env.OPENAI_ACCOUNT_TOKEN, model: "@cf/meta/llama-3-8b-instruct", + callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", }); const preliminaryConditions = modelInteractions.messageEvent.checkPreliminaryConditions(); @@ -40,20 +42,45 @@ const callTextChannel = async ({ client, message }) => { }) .catch(console.error); - const { textResponse, genData, callResponse } = await modelInteractions.messageEvent.handleTextModelCall({ history }); + const { legacy, runners, response } = await modelInteractions.messageEvent.preSend({ history }); - if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); + if (legacy?.active) { + const { textResponse, genData, callResponse } = legacy; + if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); - const { responseMsg, events } = await modelInteractions.messageEvent.createResponse({ - textResponse, - conditions: { - amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, - imagine: callResponse.includes("!gen"), - }, - }); + const { responseMsg, events } = await modelInteractions.messageEvent.createLegacyResponse({ + textResponse, + conditions: { + amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, + imagine: callResponse.includes("!gen"), + }, + }); + + if (responseMsg && callResponse.includes("!gen")) + return await modelInteractions.messageEvent.handleLegacyImageModelCall({ + genData, + textResponse, + responseMsg, + events, + }); + + return; + } + + if (response?.length === 0 || response === "") return await message.react("⚠️").catch(() => false); - if (responseMsg && callResponse.includes("!gen")) - return await modelInteractions.messageEvent.handleImageModelCall({ genData, textResponse, responseMsg, events }); + const replyContent = modelInteractions.response.format(response); + const reply = await message + .reply({ content: replyContent.content, files: replyContent.files, failIfNotExists: true }) + .catch(() => false); + + if (runners.length > 0) { + const postRunners = await modelInteractions.messageEvent.postSend({ runners, message: reply }); + const mergedFiles = [...replyContent.files, ...postRunners.results]; + return await reply + .edit({ content: replyContent.content, files: mergedFiles, failIfNotExists: true }) + .catch(() => false); + } }; /** @type {import('./index.js').Event} */ diff --git a/src/events/ready.js b/src/events/ready.js index 2ca292a..dd7227e 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -1,6 +1,7 @@ import { Events } from "discord.js"; import { Environment } from "../util/helpers.js"; import { createClient } from "redis"; +import { instructionSets } from "../util/models/constants.js"; import chalk from "chalk"; const env = new Environment(); @@ -42,7 +43,9 @@ export default { client.tempStore.set("instructionSet", instructionSet); console.log(`${chalk.bold.green("AI")} Silent mode is ${chalk.bold(silentSaved ? "enabled" : "disabled")}`); - console.log(`${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSet)}`); + console.log( + `${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSets[instructionSet]?.name || instructionSet)}`, + ); console.log( `${chalk.bold.green("Core")} acting as ${chalk.bold(client.user.tag)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, diff --git a/src/index.js b/src/index.js index 869af27..5ad03cb 100644 --- a/src/index.js +++ b/src/index.js @@ -12,7 +12,10 @@ import "temporal-polyfill/global"; (() => { console.log(`${chalk.bold.green("Core")} running with environment context: ${chalk.bold(process.env.NODE_ENV)}`); - console.log(`${chalk.bold.magenta("AI")} running with LLM preset: ${chalk.bold(process.env.MODEL_LLM_PRESET)}`); + if (process.env.MODEL_LLM_CALLSYSTEM !== "integrations") + console.log( + `${chalk.bold.magenta("AI")} ${chalk.yellow("Warning")} The legacy call system is enabled. Integration calls are not available in this mode.`, + ); })(); // Initialize the client diff --git a/src/util/integrations/index.js b/src/util/integrations/index.js new file mode 100644 index 0000000..a9eefb6 --- /dev/null +++ b/src/util/integrations/index.js @@ -0,0 +1,82 @@ +import { tool } from "ai"; +import { z } from "zod"; + +export class Integration { + constructor({ name, description, parameters, stage }) { + this.tool = tool({ + description, + parameters, + }); + + this.executionLevel = stage; + } + + get stage() { + return this.executionLevel; + } + + // pre-runner integrations run before the model call and can ONLY return a conversation-based output; () => Promise + // post-runner integrations run after the model call and can only return file-based outputs; () => Promise + async call() { + return {}; + } +} + +export class ImagineIntegration extends Integration { + constructor({ workersAI }) { + super({ + name: "imagine", + description: "Generate an image with the given prompt", + parameters: z.object({ + prompt: z.string().describe("The prompt to use for generating the image"), + }), + stage: "post", + }); + + this.workersAI = workersAI; + } + + async call({ prompt }, ctx) { + const callToModel = await this.workersAI + .callModel( + { + model: "@cf/lykon/dreamshaper-8-lcm", + input: { + prompt, + }, + }, + true, + ) + .then((r) => r.arrayBuffer()) + .catch(() => (e) => { + console.error(e); + return null; + }); + + if (callToModel === null) return null; + + const buffer = Buffer.from(callToModel); + + return buffer; + } +} + +export class QoTDIntegration extends Integration { + constructor() { + super({ + name: "qotd", + description: "Get the quote of the day", + parameters: z.object({ + luckyWord: z.string().describe("The lucky word to randomise the quote with"), + }), + stage: "pre", + }); + } + + async call({ prompt }, ctx) { + return { + role: "system", + content: "[Function call to QOTD]: The quote of the day is skeebeedee guyatt toilet.", + }; + } +} diff --git a/src/util/models/constants.js b/src/util/models/constants.js index 572b8c7..d0bc7ee 100644 --- a/src/util/models/constants.js +++ b/src/util/models/constants.js @@ -1,12 +1,40 @@ +import { tool } from "ai"; +import { z } from "zod"; + export const instructionSets = { - default: "You are an AI chatbot.", - defaultStrictImages: `You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.`, - spongeass: `You are roleplaying as SpongeAss. -You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. -SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". -SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" -SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. -SpongeAss keeps responses short and human-like.`, + default: { + name: "Default", + instructions: [ + { + role: "system", + content: "You are an AI chatbot.", + }, + ], + }, + defaultStrictImages: { + name: "Default (Strict Images)", + instructions: [ + { + role: "system", + content: + "You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.", + }, + ], + }, + spongeass: { + name: "SpongeAss", + instructions: [ + { + role: "system", + content: `You are roleplaying as SpongeAss. + You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. + SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". + SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" + SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. + SpongeAss keeps responses short and human-like.`, + }, + ], + }, }; export const events = { @@ -20,7 +48,7 @@ export const events = { amnesia: { title: "🧠 Amnesia", statuses: { - default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌" + default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌", }, }, }; diff --git a/src/util/models/index.js b/src/util/models/index.js index f1dd258..b3242d4 100644 --- a/src/util/models/index.js +++ b/src/util/models/index.js @@ -1,5 +1,10 @@ import { fetch } from "undici"; -import { InteractionResponse, InteractionHistory, InteractionMessageEvent } from "./interactions.js"; +import { + InteractionResponse, + InteractionHistory, + InteractionMessageEvent, + InteractionIntegrations, +} from "./interactions.js"; export class WorkersAI { constructor( @@ -55,14 +60,17 @@ export class ModelInteractions { this.disabledModules = disabledModules; this.history = disabledModules?.includes("history") ? null : new InteractionHistory(opts); this.response = disabledModules?.includes("response") ? null : new InteractionResponse(opts); + this.integrations = disabledModules?.includes("integrations") ? null : new InteractionIntegrations(opts); this.messageEvent = disabledModules?.includes("messageEvent") ? null : new InteractionMessageEvent({ ...opts, interactionResponse: this.response, interactionHistory: this.history, + interactionIntegrations: this.integrations, }); this.model = opts?.model; + this.callsystem = opts?.callsystem; } } diff --git a/src/util/models/interactions.js b/src/util/models/interactions.js index e736c08..8e4fb3e 100644 --- a/src/util/models/interactions.js +++ b/src/util/models/interactions.js @@ -1,6 +1,10 @@ import { fetch } from "undici"; import { events, instructionSets } from "./constants.js"; import { WorkersAI } from "./index.js"; +import { createOpenAI } from "@ai-sdk/openai"; +import { generateText } from "ai"; + +import { ImagineIntegration, QoTDIntegration } from "../integrations/index.js"; export class InteractionHistory { constructor( @@ -14,31 +18,39 @@ export class InteractionHistory { ) { this.kv = kv; this.contextWindow = contextWindow || 10; - this.instructionSet = instructionSets[instructionSet || "default"]; + this.instructionSet = { + id: instructionSet, + ...instructionSets[instructionSet || "default"], + }; this.baseHistory = [ + ...(this.instructionSet?.instructions || [ + { + role: "system", + content: this?.instructionSet, + }, + ] || + []), ...baseHistory, - { - role: "system", - content: this.instructionSet, - }, ]; this.model = model; } - async get({ key }, all = false) { + async get({ key, instructionSet = this.instructionSet?.id, window = this.contextWindow }, all = false) { + const baseHistory = instructionSets[instructionSet]?.instructions || this.baseHistory; const fetchedMessages = (await this.kv.lRange(key, 0, -1)) + .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) .reverse() .map((m) => JSON.parse(m)) // only return the last [contextWindow] messages // if all is true, return all messages - .slice(0, all ? -1 : this.contextWindow) + .slice(0, all ? -1 : window || this.contextWindow) .reduce((acc, item, index) => { // this reducer is very.. redundant, but i'm adding it for later acc.push(item); return acc; }, []); - return [...this.baseHistory, ...fetchedMessages]; + return [...baseHistory, ...fetchedMessages]; } async add( @@ -75,7 +87,9 @@ export class InteractionHistory { .lRange(key, 0, -1) .then((r) => r.map((m) => JSON.parse(m))) .catch(() => []) - ).reverse(); + ) + .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) + .reverse(); const interactions = current?.filter(typeof filter === "function" ? filter : (f) => f); const formatted = interactions @@ -188,7 +202,7 @@ export class InteractionResponse { } formatAssistantMessage(content) { - return content.trim(); + return content?.trim(); } /** @@ -207,12 +221,12 @@ export class InteractionResponse { * @param {string} event.status The status of the event * @returns {string} The formatted message * @example - * const message = await this.formatOutputMessage(content, event); + * const message = await this.formatLegacyOutput(content, event); * console.log(message); * // Outputs the formatted message */ - formatOutputMessage(content, allEvents = []) { + formatLegacyOutput(content, allEvents = []) { const bannerArr = allEvents .map((event) => { const eventData = events[event?.type]; @@ -227,18 +241,103 @@ export class InteractionResponse { return banner + "\n" + content.trim(); } + format(input) { + if (!input) + return { + content: "", + files: [], + }; + + const content = input?.length >= 2000 ? "" : input; + const files = input?.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; + + return { + content, + files, + }; + } + currentTemporalISO() { return Temporal.Now.plainDateTimeISO(this?.tz || "Etc/UTC").toString(); } } +export class InteractionIntegrations { + constructor( + { message, kv, model, accountId, token, openaiToken, callsystem } = { + kv: null, + instructionSet: process.env.MODEL_LLM_PRESET || "default", + baseHistory: [], + model: "@cf/meta/llama-3-8b-instruct", + contextWindow: 10, + callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", + }, + ) { + this.message = message; + this.kv = kv; + this.workersAI = new WorkersAI({ accountId, token, model }); + this.openai = createOpenAI({ + apiKey: openaiToken, + }); + this.model = model; + this.callsystem = callsystem; + + this.integrations = { + imagine: new ImagineIntegration({ workersAI: this.workersAI }), + quoteoftheday: new QoTDIntegration(), + }; + } + + get integrationSchemas() { + return Object.keys(this.integrations).reduce((acc, cv) => { + return { + ...acc, + [cv]: this.integrations[cv].tool, + }; + }, {}); + } + + async integrationCaller({ history }) { + if (this.callsystem === "legacy") return []; + const model = this.openai.chat("gpt-3.5-turbo", { + user: this.message?.author?.id, + }); + + const call = await generateText({ + model, + system: + "You are a bot that can call functions. If no functions are required, respond with []. The previous user messages are only for context, you have already answered them.", + messages: history, + tools: this.integrationSchemas, + }) + .then((r) => r.toolCalls) + .catch(() => []); + + return call; + } + + async execute({ calls, ctx }) { + if (calls.length === 0 || this.callsystem === "legacy") return []; + // for each integration, call the integration + return Promise.all( + calls.map(async (call) => { + const integration = this.integrations[call.toolName]; + if (typeof integration?.call !== "function") return; + return await integration.call(call.args, ctx); + }), + ); + } +} + export class InteractionMessageEvent { - constructor({ message, interactionResponse, interactionHistory, model }) { + constructor({ message, interactionResponse, interactionHistory, interactionIntegrations, callsystem, model }) { this.message = message; this.client = message?.client; this.author = message?.author; this.response = interactionResponse; this.history = interactionHistory; + this.integrations = interactionIntegrations; + this.callsystem = callsystem; this.model = model; } @@ -261,7 +360,7 @@ export class InteractionMessageEvent { } async validateHistory() { - const initialHistory = (await this.history.get({ key: this.message?.channel?.id })).filter( + const initialHistory = (await this.history.get({ key: this.message?.channel?.id }, true)).filter( (e) => e.role === "assistant", ); @@ -321,47 +420,8 @@ export class InteractionMessageEvent { }; } - async handleTextModelCall({ history }) { - await this.message?.channel?.sendTyping(); - const modelCall = await this.response.workersAI - .callModel({ - input: { - messages: history.map((e) => ({ - role: e.role, - content: e.content, - })), - }, - maxTokens: 512, - }) - .catch(() => ({ - result: { response: "" }, - })); - - const callResponse = modelCall?.result?.response?.trim(); - const textResponse = callResponse?.split("!gen")?.[0]; - const genData = callResponse?.split("!gen")?.[1]?.replace("[", "").replace("]", ""); - - await this.history - .add( - { - key: this.message?.channel?.id, - role: "assistant", - content: this.response.formatAssistantMessage(textResponse?.length === 0 ? "[no response]" : textResponse), - respondingTo: this.message?.id, - }, - true, - ) - .catch(console.error); - - return { - textResponse, - genData, - callResponse, - }; - } - - async handleImageModelCall({ genData, textResponse, responseMsg, events }) { - const final = this.response.formatOutputMessage( + async handleLegacyImageModelCall({ genData, textResponse, responseMsg, events }) { + const final = this.response.formatLegacyOutput( textResponse, events.filter((e) => e.type !== "imagine"), ); @@ -408,7 +468,7 @@ export class InteractionMessageEvent { .catch(() => null); } - async createResponse( + async createLegacyResponse( { textResponse, conditions } = { conditions: { amnesia: false, @@ -426,7 +486,7 @@ export class InteractionMessageEvent { }; }); - const text = this.response.formatOutputMessage(textResponse, events); + const text = this.response.formatLegacyOutput(textResponse, events); const content = textResponse.length >= 2000 ? "" : text; const files = textResponse.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; @@ -443,4 +503,83 @@ export class InteractionMessageEvent { events, }; } + + async preSend({ history }) { + const callContext = await this.history.get({ key: this.message?.channel?.id }, true).catch(() => []); + const calls = await this.integrations + .integrationCaller({ + history: callContext + .map((e) => ({ + role: e.role, + content: e.content, + })) + .filter((e) => e.role === "user") + .slice(-2), + }) + .then((r) => + r.map((c) => ({ + ...c, + stage: this.integrations.integrations?.[c.toolName]?.stage, + execute: async () => { + return await this.integrations.integrationSchemas?.[c.toolName]?.call(c.args); + }, + })), + ); + const preRunners = calls.filter((c) => c.stage === "pre"); + const postRunners = calls.filter((c) => c.stage === "post"); + const preRunnerResults = await this.integrations.execute({ calls: preRunners }).catch(() => []); + const allMessages = [...history.slice(0, -1), ...preRunnerResults, ...history.slice(-1)]; + + await this.message?.channel?.sendTyping(); + const modelCall = await this.response.workersAI + .callModel({ + input: { + messages: allMessages.map((e) => ({ + role: e.role, + content: e.content, + })), + }, + maxTokens: 512, + }) + .catch(() => ({ + result: { response: "" }, + })); + + const response = modelCall?.result?.response?.trim(); + + await this.history + .add( + { + key: this.message?.channel?.id, + role: "assistant", + content: this.response.formatAssistantMessage(response?.length === 0 ? "[no response]" : response), + respondingTo: this.message?.id, + context: { + integrations: calls.map((c) => ({ id: c.toolName, stage: c.stage, args: c.args })), + }, + }, + true, + ) + .catch(console.error); + + return { + legacy: { + active: this.callsystem === "legacy", + textResponse: response, + genData: response?.split("!gen")?.[0], + callResponse: response?.split("!gen")?.[1]?.replace("[", "").replace("]", ""), + }, + runners: postRunners, + response, + }; + } + + async postSend({ runners, message }) { + await this?.message?.react; + const runnerResults = await this.integrations.execute({ calls: runners, ctx: { message } }).catch(() => []); + + return { + results: runnerResults.filter((r) => r !== null), + }; + } } From 150d68e6f7fa73462f9af3cc0886769c4d08e628 Mon Sep 17 00:00:00 2001 From: Dani Date: Sat, 1 Jun 2024 09:09:24 -0700 Subject: [PATCH 4/7] a --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index c27347f..a280e9f 100644 --- a/.gitignore +++ b/.gitignore @@ -103,4 +103,11 @@ dist # TernJS port file .tern-port +# temporary directories temp + +# package lockfiles +## we only use bun, so no need for yarn or npm +yarn.lock +package-lock.json +pnpm-lock.yaml From b7b4cc6fe3be52ca140b4ea466ec10a20050b2c1 Mon Sep 17 00:00:00 2001 From: Dani Date: Sat, 1 Jun 2024 09:07:43 -0700 Subject: [PATCH 5/7] revert back to main branch --- .env.example | 9 +- bun.lockb | Bin 379437 -> 393995 bytes package.json | 89 +++++------ src/commands/instructionSet.js | 4 +- src/events/messageCreate.js | 49 +++++-- src/events/ready.js | 5 +- src/index.js | 5 +- src/util/integrations/index.js | 82 +++++++++++ src/util/models/constants.js | 46 ++++-- src/util/models/index.js | 10 +- src/util/models/interactions.js | 253 +++++++++++++++++++++++++------- 11 files changed, 426 insertions(+), 126 deletions(-) create mode 100644 src/util/integrations/index.js diff --git a/.env.example b/.env.example index 0b229f0..ba71d1a 100644 --- a/.env.example +++ b/.env.example @@ -46,11 +46,18 @@ CLOUDFLARE_ACCOUNT_ID=abcdef1234567890abcdef1234567890 CLOUDFLARE_ACCOUNT_TOKEN=v1.0-abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 +# OpenAI API: Specify an OpenAI account token for use with the OpenAI API. +OPENAI_ACCOUNT_TOKEN=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + # The following variables specify instruction sets and configuration for the various models in SpongeChat. ## The value of the variable should correspond to the key of its' responding configuration in modelConstants.js. MODEL_LLM_PRESET=default +## Callsystems are used to call functions during passive activation. +## Integrations is the newer, flexible function system. They are easily extendable, but require the use of the OpenAI API to determine function calls. +## Legacy is the older function system and only supports image generation. Use this if you can't use the OpenAI API. +MODEL_LLM_CALLSYSTEM=integrations -# !! Wastebin +# !! Wastebin # Used to display logs of memories for users ## In a docker-compose setup, you'll need to set up some sort of proxy (caddy, cloudflare tunnel) to make the "wastebin" container publicly accessible, and put the publicly accessible URL here. diff --git a/bun.lockb b/bun.lockb index 82d18f1414d21d58ce720edab7f581233587dfe3..8da124c71307fe906ae2c176137346499f9038a3 100644 GIT binary patch delta 87023 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 delta 77901 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%0DCN8lLjg0XNKU1<|2=L{3U2A!AiGcqA&Cdo~s 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 Y-L@a7*55UId=rw%k`QsnepA8!1N*`NG5`Po diff --git a/package.json b/package.json index 8a4f398..6734e02 100644 --- a/package.json +++ b/package.json @@ -1,45 +1,48 @@ { - "$schema": "https://json.schemastore.org/package.json", - "name": "spongechat", - "version": "2.0.1", - "private": true, - "type": "module", - "scripts": { - "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", - "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", - "start": "node --require dotenv/config src/index.js", - "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", - "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", - "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" - }, - "_moduleAliases": { - "@": "./src", - "@util": "./src/util", - "@events": "./src/events", - "@commands": "./src/commands" - }, - "dependencies": { - "@discordjs/core": "^1.1.0", - "@redis/json": "^1.0.6", - "chalk": "4", - "discord.js": "^14.15.2", - "dotenv": "^16.3.1", - "luxon": "^3.4.4", - "module-alias": "^2.2.3", - "redis": "^4.6.13", - "temporal-polyfill": "^0.2.4", - "undici": "^6.16.1", - "uuid": "^9.0.1" - }, - "devDependencies": { - "@release-it/conventional-changelog": "^8.0.1", - "all-contributors-cli": "^6.26.1", - "dotenv-cli": "^7.4.2", - "eslint": "^8.53.0", - "eslint-config-neon": "^0.1.57", - "eslint-formatter-pretty": "^5.0.0", - "execa": "^9.1.0", - "prettier": "^3.0.3", - "release-it": "^17" - } + "$schema": "https://json.schemastore.org/package.json", + "name": "spongechat", + "version": "2.0.1", + "private": true, + "type": "module", + "scripts": { + "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", + "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", + "start": "node --require dotenv/config src/index.js", + "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", + "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", + "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" + }, + "_moduleAliases": { + "@": "./src", + "@util": "./src/util", + "@events": "./src/events", + "@commands": "./src/commands" + }, + "dependencies": { + "@ai-sdk/openai": "^0.0.13", + "@discordjs/core": "^1.1.0", + "@redis/json": "^1.0.6", + "ai": "^3.1.12", + "chalk": "4", + "discord.js": "^14.15.2", + "dotenv": "^16.3.1", + "luxon": "^3.4.4", + "module-alias": "^2.2.3", + "redis": "^4.6.13", + "temporal-polyfill": "^0.2.4", + "undici": "^6.16.1", + "uuid": "^9.0.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@release-it/conventional-changelog": "^8.0.1", + "all-contributors-cli": "^6.26.1", + "dotenv-cli": "^7.4.2", + "eslint": "^8.53.0", + "eslint-config-neon": "^0.1.57", + "eslint-formatter-pretty": "^5.0.0", + "execa": "^9.1.0", + "prettier": "^3.0.3", + "release-it": "^17" + } } diff --git a/src/commands/instructionSet.js b/src/commands/instructionSet.js index 7a926a6..8a050d7 100644 --- a/src/commands/instructionSet.js +++ b/src/commands/instructionSet.js @@ -11,7 +11,7 @@ export default { o .setName("preset") .setDescription("Preset; map to => client.tempStore#instructionSet") - .setChoices(Object.keys(instructionSets).map((s) => ({ name: s, value: s }))) + .setChoices(Object.keys(instructionSets).map((s) => ({ name: instructionSets[s]?.name || s, value: s }))) .setRequired(true), ) .toJSON(), @@ -35,7 +35,7 @@ export default { }); console.log( - `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, + `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(instructionSets[toOption]?.name || toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, ); if (sync) { diff --git a/src/events/messageCreate.js b/src/events/messageCreate.js index af098be..06355b6 100644 --- a/src/events/messageCreate.js +++ b/src/events/messageCreate.js @@ -9,7 +9,9 @@ const callTextChannel = async ({ client, message }) => { baseHistory: [], accountId: process.env.CLOUDFLARE_ACCOUNT_ID, token: process.env.CLOUDFLARE_ACCOUNT_TOKEN, + openaiToken: process.env.OPENAI_ACCOUNT_TOKEN, model: "@cf/meta/llama-3-8b-instruct", + callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", }); const preliminaryConditions = modelInteractions.messageEvent.checkPreliminaryConditions(); @@ -40,20 +42,45 @@ const callTextChannel = async ({ client, message }) => { }) .catch(console.error); - const { textResponse, genData, callResponse } = await modelInteractions.messageEvent.handleTextModelCall({ history }); + const { legacy, runners, response } = await modelInteractions.messageEvent.preSend({ history }); - if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); + if (legacy?.active) { + const { textResponse, genData, callResponse } = legacy; + if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); - const { responseMsg, events } = await modelInteractions.messageEvent.createResponse({ - textResponse, - conditions: { - amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, - imagine: callResponse.includes("!gen"), - }, - }); + const { responseMsg, events } = await modelInteractions.messageEvent.createLegacyResponse({ + textResponse, + conditions: { + amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, + imagine: callResponse.includes("!gen"), + }, + }); + + if (responseMsg && callResponse.includes("!gen")) + return await modelInteractions.messageEvent.handleLegacyImageModelCall({ + genData, + textResponse, + responseMsg, + events, + }); + + return; + } + + if (response?.length === 0 || response === "") return await message.react("⚠️").catch(() => false); - if (responseMsg && callResponse.includes("!gen")) - return await modelInteractions.messageEvent.handleImageModelCall({ genData, textResponse, responseMsg, events }); + const replyContent = modelInteractions.response.format(response); + const reply = await message + .reply({ content: replyContent.content, files: replyContent.files, failIfNotExists: true }) + .catch(() => false); + + if (runners.length > 0) { + const postRunners = await modelInteractions.messageEvent.postSend({ runners, message: reply }); + const mergedFiles = [...replyContent.files, ...postRunners.results]; + return await reply + .edit({ content: replyContent.content, files: mergedFiles, failIfNotExists: true }) + .catch(() => false); + } }; /** @type {import('./index.js').Event} */ diff --git a/src/events/ready.js b/src/events/ready.js index 2ca292a..dd7227e 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -1,6 +1,7 @@ import { Events } from "discord.js"; import { Environment } from "../util/helpers.js"; import { createClient } from "redis"; +import { instructionSets } from "../util/models/constants.js"; import chalk from "chalk"; const env = new Environment(); @@ -42,7 +43,9 @@ export default { client.tempStore.set("instructionSet", instructionSet); console.log(`${chalk.bold.green("AI")} Silent mode is ${chalk.bold(silentSaved ? "enabled" : "disabled")}`); - console.log(`${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSet)}`); + console.log( + `${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSets[instructionSet]?.name || instructionSet)}`, + ); console.log( `${chalk.bold.green("Core")} acting as ${chalk.bold(client.user.tag)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, diff --git a/src/index.js b/src/index.js index 869af27..5ad03cb 100644 --- a/src/index.js +++ b/src/index.js @@ -12,7 +12,10 @@ import "temporal-polyfill/global"; (() => { console.log(`${chalk.bold.green("Core")} running with environment context: ${chalk.bold(process.env.NODE_ENV)}`); - console.log(`${chalk.bold.magenta("AI")} running with LLM preset: ${chalk.bold(process.env.MODEL_LLM_PRESET)}`); + if (process.env.MODEL_LLM_CALLSYSTEM !== "integrations") + console.log( + `${chalk.bold.magenta("AI")} ${chalk.yellow("Warning")} The legacy call system is enabled. Integration calls are not available in this mode.`, + ); })(); // Initialize the client diff --git a/src/util/integrations/index.js b/src/util/integrations/index.js new file mode 100644 index 0000000..a9eefb6 --- /dev/null +++ b/src/util/integrations/index.js @@ -0,0 +1,82 @@ +import { tool } from "ai"; +import { z } from "zod"; + +export class Integration { + constructor({ name, description, parameters, stage }) { + this.tool = tool({ + description, + parameters, + }); + + this.executionLevel = stage; + } + + get stage() { + return this.executionLevel; + } + + // pre-runner integrations run before the model call and can ONLY return a conversation-based output; () => Promise + // post-runner integrations run after the model call and can only return file-based outputs; () => Promise + async call() { + return {}; + } +} + +export class ImagineIntegration extends Integration { + constructor({ workersAI }) { + super({ + name: "imagine", + description: "Generate an image with the given prompt", + parameters: z.object({ + prompt: z.string().describe("The prompt to use for generating the image"), + }), + stage: "post", + }); + + this.workersAI = workersAI; + } + + async call({ prompt }, ctx) { + const callToModel = await this.workersAI + .callModel( + { + model: "@cf/lykon/dreamshaper-8-lcm", + input: { + prompt, + }, + }, + true, + ) + .then((r) => r.arrayBuffer()) + .catch(() => (e) => { + console.error(e); + return null; + }); + + if (callToModel === null) return null; + + const buffer = Buffer.from(callToModel); + + return buffer; + } +} + +export class QoTDIntegration extends Integration { + constructor() { + super({ + name: "qotd", + description: "Get the quote of the day", + parameters: z.object({ + luckyWord: z.string().describe("The lucky word to randomise the quote with"), + }), + stage: "pre", + }); + } + + async call({ prompt }, ctx) { + return { + role: "system", + content: "[Function call to QOTD]: The quote of the day is skeebeedee guyatt toilet.", + }; + } +} diff --git a/src/util/models/constants.js b/src/util/models/constants.js index 572b8c7..d0bc7ee 100644 --- a/src/util/models/constants.js +++ b/src/util/models/constants.js @@ -1,12 +1,40 @@ +import { tool } from "ai"; +import { z } from "zod"; + export const instructionSets = { - default: "You are an AI chatbot.", - defaultStrictImages: `You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.`, - spongeass: `You are roleplaying as SpongeAss. -You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. -SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". -SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" -SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. -SpongeAss keeps responses short and human-like.`, + default: { + name: "Default", + instructions: [ + { + role: "system", + content: "You are an AI chatbot.", + }, + ], + }, + defaultStrictImages: { + name: "Default (Strict Images)", + instructions: [ + { + role: "system", + content: + "You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.", + }, + ], + }, + spongeass: { + name: "SpongeAss", + instructions: [ + { + role: "system", + content: `You are roleplaying as SpongeAss. + You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. + SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". + SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" + SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. + SpongeAss keeps responses short and human-like.`, + }, + ], + }, }; export const events = { @@ -20,7 +48,7 @@ export const events = { amnesia: { title: "🧠 Amnesia", statuses: { - default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌" + default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌", }, }, }; diff --git a/src/util/models/index.js b/src/util/models/index.js index f1dd258..b3242d4 100644 --- a/src/util/models/index.js +++ b/src/util/models/index.js @@ -1,5 +1,10 @@ import { fetch } from "undici"; -import { InteractionResponse, InteractionHistory, InteractionMessageEvent } from "./interactions.js"; +import { + InteractionResponse, + InteractionHistory, + InteractionMessageEvent, + InteractionIntegrations, +} from "./interactions.js"; export class WorkersAI { constructor( @@ -55,14 +60,17 @@ export class ModelInteractions { this.disabledModules = disabledModules; this.history = disabledModules?.includes("history") ? null : new InteractionHistory(opts); this.response = disabledModules?.includes("response") ? null : new InteractionResponse(opts); + this.integrations = disabledModules?.includes("integrations") ? null : new InteractionIntegrations(opts); this.messageEvent = disabledModules?.includes("messageEvent") ? null : new InteractionMessageEvent({ ...opts, interactionResponse: this.response, interactionHistory: this.history, + interactionIntegrations: this.integrations, }); this.model = opts?.model; + this.callsystem = opts?.callsystem; } } diff --git a/src/util/models/interactions.js b/src/util/models/interactions.js index e736c08..8e4fb3e 100644 --- a/src/util/models/interactions.js +++ b/src/util/models/interactions.js @@ -1,6 +1,10 @@ import { fetch } from "undici"; import { events, instructionSets } from "./constants.js"; import { WorkersAI } from "./index.js"; +import { createOpenAI } from "@ai-sdk/openai"; +import { generateText } from "ai"; + +import { ImagineIntegration, QoTDIntegration } from "../integrations/index.js"; export class InteractionHistory { constructor( @@ -14,31 +18,39 @@ export class InteractionHistory { ) { this.kv = kv; this.contextWindow = contextWindow || 10; - this.instructionSet = instructionSets[instructionSet || "default"]; + this.instructionSet = { + id: instructionSet, + ...instructionSets[instructionSet || "default"], + }; this.baseHistory = [ + ...(this.instructionSet?.instructions || [ + { + role: "system", + content: this?.instructionSet, + }, + ] || + []), ...baseHistory, - { - role: "system", - content: this.instructionSet, - }, ]; this.model = model; } - async get({ key }, all = false) { + async get({ key, instructionSet = this.instructionSet?.id, window = this.contextWindow }, all = false) { + const baseHistory = instructionSets[instructionSet]?.instructions || this.baseHistory; const fetchedMessages = (await this.kv.lRange(key, 0, -1)) + .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) .reverse() .map((m) => JSON.parse(m)) // only return the last [contextWindow] messages // if all is true, return all messages - .slice(0, all ? -1 : this.contextWindow) + .slice(0, all ? -1 : window || this.contextWindow) .reduce((acc, item, index) => { // this reducer is very.. redundant, but i'm adding it for later acc.push(item); return acc; }, []); - return [...this.baseHistory, ...fetchedMessages]; + return [...baseHistory, ...fetchedMessages]; } async add( @@ -75,7 +87,9 @@ export class InteractionHistory { .lRange(key, 0, -1) .then((r) => r.map((m) => JSON.parse(m))) .catch(() => []) - ).reverse(); + ) + .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) + .reverse(); const interactions = current?.filter(typeof filter === "function" ? filter : (f) => f); const formatted = interactions @@ -188,7 +202,7 @@ export class InteractionResponse { } formatAssistantMessage(content) { - return content.trim(); + return content?.trim(); } /** @@ -207,12 +221,12 @@ export class InteractionResponse { * @param {string} event.status The status of the event * @returns {string} The formatted message * @example - * const message = await this.formatOutputMessage(content, event); + * const message = await this.formatLegacyOutput(content, event); * console.log(message); * // Outputs the formatted message */ - formatOutputMessage(content, allEvents = []) { + formatLegacyOutput(content, allEvents = []) { const bannerArr = allEvents .map((event) => { const eventData = events[event?.type]; @@ -227,18 +241,103 @@ export class InteractionResponse { return banner + "\n" + content.trim(); } + format(input) { + if (!input) + return { + content: "", + files: [], + }; + + const content = input?.length >= 2000 ? "" : input; + const files = input?.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; + + return { + content, + files, + }; + } + currentTemporalISO() { return Temporal.Now.plainDateTimeISO(this?.tz || "Etc/UTC").toString(); } } +export class InteractionIntegrations { + constructor( + { message, kv, model, accountId, token, openaiToken, callsystem } = { + kv: null, + instructionSet: process.env.MODEL_LLM_PRESET || "default", + baseHistory: [], + model: "@cf/meta/llama-3-8b-instruct", + contextWindow: 10, + callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", + }, + ) { + this.message = message; + this.kv = kv; + this.workersAI = new WorkersAI({ accountId, token, model }); + this.openai = createOpenAI({ + apiKey: openaiToken, + }); + this.model = model; + this.callsystem = callsystem; + + this.integrations = { + imagine: new ImagineIntegration({ workersAI: this.workersAI }), + quoteoftheday: new QoTDIntegration(), + }; + } + + get integrationSchemas() { + return Object.keys(this.integrations).reduce((acc, cv) => { + return { + ...acc, + [cv]: this.integrations[cv].tool, + }; + }, {}); + } + + async integrationCaller({ history }) { + if (this.callsystem === "legacy") return []; + const model = this.openai.chat("gpt-3.5-turbo", { + user: this.message?.author?.id, + }); + + const call = await generateText({ + model, + system: + "You are a bot that can call functions. If no functions are required, respond with []. The previous user messages are only for context, you have already answered them.", + messages: history, + tools: this.integrationSchemas, + }) + .then((r) => r.toolCalls) + .catch(() => []); + + return call; + } + + async execute({ calls, ctx }) { + if (calls.length === 0 || this.callsystem === "legacy") return []; + // for each integration, call the integration + return Promise.all( + calls.map(async (call) => { + const integration = this.integrations[call.toolName]; + if (typeof integration?.call !== "function") return; + return await integration.call(call.args, ctx); + }), + ); + } +} + export class InteractionMessageEvent { - constructor({ message, interactionResponse, interactionHistory, model }) { + constructor({ message, interactionResponse, interactionHistory, interactionIntegrations, callsystem, model }) { this.message = message; this.client = message?.client; this.author = message?.author; this.response = interactionResponse; this.history = interactionHistory; + this.integrations = interactionIntegrations; + this.callsystem = callsystem; this.model = model; } @@ -261,7 +360,7 @@ export class InteractionMessageEvent { } async validateHistory() { - const initialHistory = (await this.history.get({ key: this.message?.channel?.id })).filter( + const initialHistory = (await this.history.get({ key: this.message?.channel?.id }, true)).filter( (e) => e.role === "assistant", ); @@ -321,47 +420,8 @@ export class InteractionMessageEvent { }; } - async handleTextModelCall({ history }) { - await this.message?.channel?.sendTyping(); - const modelCall = await this.response.workersAI - .callModel({ - input: { - messages: history.map((e) => ({ - role: e.role, - content: e.content, - })), - }, - maxTokens: 512, - }) - .catch(() => ({ - result: { response: "" }, - })); - - const callResponse = modelCall?.result?.response?.trim(); - const textResponse = callResponse?.split("!gen")?.[0]; - const genData = callResponse?.split("!gen")?.[1]?.replace("[", "").replace("]", ""); - - await this.history - .add( - { - key: this.message?.channel?.id, - role: "assistant", - content: this.response.formatAssistantMessage(textResponse?.length === 0 ? "[no response]" : textResponse), - respondingTo: this.message?.id, - }, - true, - ) - .catch(console.error); - - return { - textResponse, - genData, - callResponse, - }; - } - - async handleImageModelCall({ genData, textResponse, responseMsg, events }) { - const final = this.response.formatOutputMessage( + async handleLegacyImageModelCall({ genData, textResponse, responseMsg, events }) { + const final = this.response.formatLegacyOutput( textResponse, events.filter((e) => e.type !== "imagine"), ); @@ -408,7 +468,7 @@ export class InteractionMessageEvent { .catch(() => null); } - async createResponse( + async createLegacyResponse( { textResponse, conditions } = { conditions: { amnesia: false, @@ -426,7 +486,7 @@ export class InteractionMessageEvent { }; }); - const text = this.response.formatOutputMessage(textResponse, events); + const text = this.response.formatLegacyOutput(textResponse, events); const content = textResponse.length >= 2000 ? "" : text; const files = textResponse.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; @@ -443,4 +503,83 @@ export class InteractionMessageEvent { events, }; } + + async preSend({ history }) { + const callContext = await this.history.get({ key: this.message?.channel?.id }, true).catch(() => []); + const calls = await this.integrations + .integrationCaller({ + history: callContext + .map((e) => ({ + role: e.role, + content: e.content, + })) + .filter((e) => e.role === "user") + .slice(-2), + }) + .then((r) => + r.map((c) => ({ + ...c, + stage: this.integrations.integrations?.[c.toolName]?.stage, + execute: async () => { + return await this.integrations.integrationSchemas?.[c.toolName]?.call(c.args); + }, + })), + ); + const preRunners = calls.filter((c) => c.stage === "pre"); + const postRunners = calls.filter((c) => c.stage === "post"); + const preRunnerResults = await this.integrations.execute({ calls: preRunners }).catch(() => []); + const allMessages = [...history.slice(0, -1), ...preRunnerResults, ...history.slice(-1)]; + + await this.message?.channel?.sendTyping(); + const modelCall = await this.response.workersAI + .callModel({ + input: { + messages: allMessages.map((e) => ({ + role: e.role, + content: e.content, + })), + }, + maxTokens: 512, + }) + .catch(() => ({ + result: { response: "" }, + })); + + const response = modelCall?.result?.response?.trim(); + + await this.history + .add( + { + key: this.message?.channel?.id, + role: "assistant", + content: this.response.formatAssistantMessage(response?.length === 0 ? "[no response]" : response), + respondingTo: this.message?.id, + context: { + integrations: calls.map((c) => ({ id: c.toolName, stage: c.stage, args: c.args })), + }, + }, + true, + ) + .catch(console.error); + + return { + legacy: { + active: this.callsystem === "legacy", + textResponse: response, + genData: response?.split("!gen")?.[0], + callResponse: response?.split("!gen")?.[1]?.replace("[", "").replace("]", ""), + }, + runners: postRunners, + response, + }; + } + + async postSend({ runners, message }) { + await this?.message?.react; + const runnerResults = await this.integrations.execute({ calls: runners, ctx: { message } }).catch(() => []); + + return { + results: runnerResults.filter((r) => r !== null), + }; + } } From cd4b3f31822a28cb62990627e3a161f8de4ccb2e Mon Sep 17 00:00:00 2001 From: Dani Date: Sat, 1 Jun 2024 09:10:32 -0700 Subject: [PATCH 6/7] revert 2 --- .env.example | 9 +- .gitignore | 7 + bun.lockb | Bin 379437 -> 393995 bytes package.json | 89 +++++------ src/commands/instructionSet.js | 4 +- src/events/messageCreate.js | 49 +++++-- src/events/ready.js | 5 +- src/index.js | 5 +- src/util/integrations/index.js | 82 +++++++++++ src/util/models/constants.js | 46 ++++-- src/util/models/index.js | 10 +- src/util/models/interactions.js | 253 +++++++++++++++++++++++++------- 12 files changed, 433 insertions(+), 126 deletions(-) create mode 100644 src/util/integrations/index.js diff --git a/.env.example b/.env.example index 0b229f0..ba71d1a 100644 --- a/.env.example +++ b/.env.example @@ -46,11 +46,18 @@ CLOUDFLARE_ACCOUNT_ID=abcdef1234567890abcdef1234567890 CLOUDFLARE_ACCOUNT_TOKEN=v1.0-abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 +# OpenAI API: Specify an OpenAI account token for use with the OpenAI API. +OPENAI_ACCOUNT_TOKEN=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + # The following variables specify instruction sets and configuration for the various models in SpongeChat. ## The value of the variable should correspond to the key of its' responding configuration in modelConstants.js. MODEL_LLM_PRESET=default +## Callsystems are used to call functions during passive activation. +## Integrations is the newer, flexible function system. They are easily extendable, but require the use of the OpenAI API to determine function calls. +## Legacy is the older function system and only supports image generation. Use this if you can't use the OpenAI API. +MODEL_LLM_CALLSYSTEM=integrations -# !! Wastebin +# !! Wastebin # Used to display logs of memories for users ## In a docker-compose setup, you'll need to set up some sort of proxy (caddy, cloudflare tunnel) to make the "wastebin" container publicly accessible, and put the publicly accessible URL here. diff --git a/.gitignore b/.gitignore index c27347f..a280e9f 100644 --- a/.gitignore +++ b/.gitignore @@ -103,4 +103,11 @@ dist # TernJS port file .tern-port +# temporary directories temp + +# package lockfiles +## we only use bun, so no need for yarn or npm +yarn.lock +package-lock.json +pnpm-lock.yaml diff --git a/bun.lockb b/bun.lockb index 82d18f1414d21d58ce720edab7f581233587dfe3..8da124c71307fe906ae2c176137346499f9038a3 100644 GIT binary patch delta 87023 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 delta 77901 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%0DCN8lLjg0XNKU1<|2=L{3U2A!AiGcqA&Cdo~s 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 Y-L@a7*55UId=rw%k`QsnepA8!1N*`NG5`Po diff --git a/package.json b/package.json index 8a4f398..6734e02 100644 --- a/package.json +++ b/package.json @@ -1,45 +1,48 @@ { - "$schema": "https://json.schemastore.org/package.json", - "name": "spongechat", - "version": "2.0.1", - "private": true, - "type": "module", - "scripts": { - "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", - "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", - "start": "node --require dotenv/config src/index.js", - "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", - "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", - "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" - }, - "_moduleAliases": { - "@": "./src", - "@util": "./src/util", - "@events": "./src/events", - "@commands": "./src/commands" - }, - "dependencies": { - "@discordjs/core": "^1.1.0", - "@redis/json": "^1.0.6", - "chalk": "4", - "discord.js": "^14.15.2", - "dotenv": "^16.3.1", - "luxon": "^3.4.4", - "module-alias": "^2.2.3", - "redis": "^4.6.13", - "temporal-polyfill": "^0.2.4", - "undici": "^6.16.1", - "uuid": "^9.0.1" - }, - "devDependencies": { - "@release-it/conventional-changelog": "^8.0.1", - "all-contributors-cli": "^6.26.1", - "dotenv-cli": "^7.4.2", - "eslint": "^8.53.0", - "eslint-config-neon": "^0.1.57", - "eslint-formatter-pretty": "^5.0.0", - "execa": "^9.1.0", - "prettier": "^3.0.3", - "release-it": "^17" - } + "$schema": "https://json.schemastore.org/package.json", + "name": "spongechat", + "version": "2.0.1", + "private": true, + "type": "module", + "scripts": { + "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", + "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", + "start": "node --require dotenv/config src/index.js", + "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", + "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", + "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" + }, + "_moduleAliases": { + "@": "./src", + "@util": "./src/util", + "@events": "./src/events", + "@commands": "./src/commands" + }, + "dependencies": { + "@ai-sdk/openai": "^0.0.13", + "@discordjs/core": "^1.1.0", + "@redis/json": "^1.0.6", + "ai": "^3.1.12", + "chalk": "4", + "discord.js": "^14.15.2", + "dotenv": "^16.3.1", + "luxon": "^3.4.4", + "module-alias": "^2.2.3", + "redis": "^4.6.13", + "temporal-polyfill": "^0.2.4", + "undici": "^6.16.1", + "uuid": "^9.0.1", + "zod": "^3.23.8" + }, + "devDependencies": { + "@release-it/conventional-changelog": "^8.0.1", + "all-contributors-cli": "^6.26.1", + "dotenv-cli": "^7.4.2", + "eslint": "^8.53.0", + "eslint-config-neon": "^0.1.57", + "eslint-formatter-pretty": "^5.0.0", + "execa": "^9.1.0", + "prettier": "^3.0.3", + "release-it": "^17" + } } diff --git a/src/commands/instructionSet.js b/src/commands/instructionSet.js index 7a926a6..8a050d7 100644 --- a/src/commands/instructionSet.js +++ b/src/commands/instructionSet.js @@ -11,7 +11,7 @@ export default { o .setName("preset") .setDescription("Preset; map to => client.tempStore#instructionSet") - .setChoices(Object.keys(instructionSets).map((s) => ({ name: s, value: s }))) + .setChoices(Object.keys(instructionSets).map((s) => ({ name: instructionSets[s]?.name || s, value: s }))) .setRequired(true), ) .toJSON(), @@ -35,7 +35,7 @@ export default { }); console.log( - `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, + `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(instructionSets[toOption]?.name || toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, ); if (sync) { diff --git a/src/events/messageCreate.js b/src/events/messageCreate.js index af098be..06355b6 100644 --- a/src/events/messageCreate.js +++ b/src/events/messageCreate.js @@ -9,7 +9,9 @@ const callTextChannel = async ({ client, message }) => { baseHistory: [], accountId: process.env.CLOUDFLARE_ACCOUNT_ID, token: process.env.CLOUDFLARE_ACCOUNT_TOKEN, + openaiToken: process.env.OPENAI_ACCOUNT_TOKEN, model: "@cf/meta/llama-3-8b-instruct", + callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", }); const preliminaryConditions = modelInteractions.messageEvent.checkPreliminaryConditions(); @@ -40,20 +42,45 @@ const callTextChannel = async ({ client, message }) => { }) .catch(console.error); - const { textResponse, genData, callResponse } = await modelInteractions.messageEvent.handleTextModelCall({ history }); + const { legacy, runners, response } = await modelInteractions.messageEvent.preSend({ history }); - if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); + if (legacy?.active) { + const { textResponse, genData, callResponse } = legacy; + if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); - const { responseMsg, events } = await modelInteractions.messageEvent.createResponse({ - textResponse, - conditions: { - amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, - imagine: callResponse.includes("!gen"), - }, - }); + const { responseMsg, events } = await modelInteractions.messageEvent.createLegacyResponse({ + textResponse, + conditions: { + amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, + imagine: callResponse.includes("!gen"), + }, + }); + + if (responseMsg && callResponse.includes("!gen")) + return await modelInteractions.messageEvent.handleLegacyImageModelCall({ + genData, + textResponse, + responseMsg, + events, + }); + + return; + } + + if (response?.length === 0 || response === "") return await message.react("⚠️").catch(() => false); - if (responseMsg && callResponse.includes("!gen")) - return await modelInteractions.messageEvent.handleImageModelCall({ genData, textResponse, responseMsg, events }); + const replyContent = modelInteractions.response.format(response); + const reply = await message + .reply({ content: replyContent.content, files: replyContent.files, failIfNotExists: true }) + .catch(() => false); + + if (runners.length > 0) { + const postRunners = await modelInteractions.messageEvent.postSend({ runners, message: reply }); + const mergedFiles = [...replyContent.files, ...postRunners.results]; + return await reply + .edit({ content: replyContent.content, files: mergedFiles, failIfNotExists: true }) + .catch(() => false); + } }; /** @type {import('./index.js').Event} */ diff --git a/src/events/ready.js b/src/events/ready.js index 2ca292a..dd7227e 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -1,6 +1,7 @@ import { Events } from "discord.js"; import { Environment } from "../util/helpers.js"; import { createClient } from "redis"; +import { instructionSets } from "../util/models/constants.js"; import chalk from "chalk"; const env = new Environment(); @@ -42,7 +43,9 @@ export default { client.tempStore.set("instructionSet", instructionSet); console.log(`${chalk.bold.green("AI")} Silent mode is ${chalk.bold(silentSaved ? "enabled" : "disabled")}`); - console.log(`${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSet)}`); + console.log( + `${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSets[instructionSet]?.name || instructionSet)}`, + ); console.log( `${chalk.bold.green("Core")} acting as ${chalk.bold(client.user.tag)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, diff --git a/src/index.js b/src/index.js index 869af27..5ad03cb 100644 --- a/src/index.js +++ b/src/index.js @@ -12,7 +12,10 @@ import "temporal-polyfill/global"; (() => { console.log(`${chalk.bold.green("Core")} running with environment context: ${chalk.bold(process.env.NODE_ENV)}`); - console.log(`${chalk.bold.magenta("AI")} running with LLM preset: ${chalk.bold(process.env.MODEL_LLM_PRESET)}`); + if (process.env.MODEL_LLM_CALLSYSTEM !== "integrations") + console.log( + `${chalk.bold.magenta("AI")} ${chalk.yellow("Warning")} The legacy call system is enabled. Integration calls are not available in this mode.`, + ); })(); // Initialize the client diff --git a/src/util/integrations/index.js b/src/util/integrations/index.js new file mode 100644 index 0000000..a9eefb6 --- /dev/null +++ b/src/util/integrations/index.js @@ -0,0 +1,82 @@ +import { tool } from "ai"; +import { z } from "zod"; + +export class Integration { + constructor({ name, description, parameters, stage }) { + this.tool = tool({ + description, + parameters, + }); + + this.executionLevel = stage; + } + + get stage() { + return this.executionLevel; + } + + // pre-runner integrations run before the model call and can ONLY return a conversation-based output; () => Promise + // post-runner integrations run after the model call and can only return file-based outputs; () => Promise + async call() { + return {}; + } +} + +export class ImagineIntegration extends Integration { + constructor({ workersAI }) { + super({ + name: "imagine", + description: "Generate an image with the given prompt", + parameters: z.object({ + prompt: z.string().describe("The prompt to use for generating the image"), + }), + stage: "post", + }); + + this.workersAI = workersAI; + } + + async call({ prompt }, ctx) { + const callToModel = await this.workersAI + .callModel( + { + model: "@cf/lykon/dreamshaper-8-lcm", + input: { + prompt, + }, + }, + true, + ) + .then((r) => r.arrayBuffer()) + .catch(() => (e) => { + console.error(e); + return null; + }); + + if (callToModel === null) return null; + + const buffer = Buffer.from(callToModel); + + return buffer; + } +} + +export class QoTDIntegration extends Integration { + constructor() { + super({ + name: "qotd", + description: "Get the quote of the day", + parameters: z.object({ + luckyWord: z.string().describe("The lucky word to randomise the quote with"), + }), + stage: "pre", + }); + } + + async call({ prompt }, ctx) { + return { + role: "system", + content: "[Function call to QOTD]: The quote of the day is skeebeedee guyatt toilet.", + }; + } +} diff --git a/src/util/models/constants.js b/src/util/models/constants.js index 572b8c7..d0bc7ee 100644 --- a/src/util/models/constants.js +++ b/src/util/models/constants.js @@ -1,12 +1,40 @@ +import { tool } from "ai"; +import { z } from "zod"; + export const instructionSets = { - default: "You are an AI chatbot.", - defaultStrictImages: `You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.`, - spongeass: `You are roleplaying as SpongeAss. -You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. -SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". -SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" -SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. -SpongeAss keeps responses short and human-like.`, + default: { + name: "Default", + instructions: [ + { + role: "system", + content: "You are an AI chatbot.", + }, + ], + }, + defaultStrictImages: { + name: "Default (Strict Images)", + instructions: [ + { + role: "system", + content: + "You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.", + }, + ], + }, + spongeass: { + name: "SpongeAss", + instructions: [ + { + role: "system", + content: `You are roleplaying as SpongeAss. + You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. + SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". + SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" + SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. + SpongeAss keeps responses short and human-like.`, + }, + ], + }, }; export const events = { @@ -20,7 +48,7 @@ export const events = { amnesia: { title: "🧠 Amnesia", statuses: { - default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌" + default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌", }, }, }; diff --git a/src/util/models/index.js b/src/util/models/index.js index f1dd258..b3242d4 100644 --- a/src/util/models/index.js +++ b/src/util/models/index.js @@ -1,5 +1,10 @@ import { fetch } from "undici"; -import { InteractionResponse, InteractionHistory, InteractionMessageEvent } from "./interactions.js"; +import { + InteractionResponse, + InteractionHistory, + InteractionMessageEvent, + InteractionIntegrations, +} from "./interactions.js"; export class WorkersAI { constructor( @@ -55,14 +60,17 @@ export class ModelInteractions { this.disabledModules = disabledModules; this.history = disabledModules?.includes("history") ? null : new InteractionHistory(opts); this.response = disabledModules?.includes("response") ? null : new InteractionResponse(opts); + this.integrations = disabledModules?.includes("integrations") ? null : new InteractionIntegrations(opts); this.messageEvent = disabledModules?.includes("messageEvent") ? null : new InteractionMessageEvent({ ...opts, interactionResponse: this.response, interactionHistory: this.history, + interactionIntegrations: this.integrations, }); this.model = opts?.model; + this.callsystem = opts?.callsystem; } } diff --git a/src/util/models/interactions.js b/src/util/models/interactions.js index e736c08..8e4fb3e 100644 --- a/src/util/models/interactions.js +++ b/src/util/models/interactions.js @@ -1,6 +1,10 @@ import { fetch } from "undici"; import { events, instructionSets } from "./constants.js"; import { WorkersAI } from "./index.js"; +import { createOpenAI } from "@ai-sdk/openai"; +import { generateText } from "ai"; + +import { ImagineIntegration, QoTDIntegration } from "../integrations/index.js"; export class InteractionHistory { constructor( @@ -14,31 +18,39 @@ export class InteractionHistory { ) { this.kv = kv; this.contextWindow = contextWindow || 10; - this.instructionSet = instructionSets[instructionSet || "default"]; + this.instructionSet = { + id: instructionSet, + ...instructionSets[instructionSet || "default"], + }; this.baseHistory = [ + ...(this.instructionSet?.instructions || [ + { + role: "system", + content: this?.instructionSet, + }, + ] || + []), ...baseHistory, - { - role: "system", - content: this.instructionSet, - }, ]; this.model = model; } - async get({ key }, all = false) { + async get({ key, instructionSet = this.instructionSet?.id, window = this.contextWindow }, all = false) { + const baseHistory = instructionSets[instructionSet]?.instructions || this.baseHistory; const fetchedMessages = (await this.kv.lRange(key, 0, -1)) + .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) .reverse() .map((m) => JSON.parse(m)) // only return the last [contextWindow] messages // if all is true, return all messages - .slice(0, all ? -1 : this.contextWindow) + .slice(0, all ? -1 : window || this.contextWindow) .reduce((acc, item, index) => { // this reducer is very.. redundant, but i'm adding it for later acc.push(item); return acc; }, []); - return [...this.baseHistory, ...fetchedMessages]; + return [...baseHistory, ...fetchedMessages]; } async add( @@ -75,7 +87,9 @@ export class InteractionHistory { .lRange(key, 0, -1) .then((r) => r.map((m) => JSON.parse(m))) .catch(() => []) - ).reverse(); + ) + .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) + .reverse(); const interactions = current?.filter(typeof filter === "function" ? filter : (f) => f); const formatted = interactions @@ -188,7 +202,7 @@ export class InteractionResponse { } formatAssistantMessage(content) { - return content.trim(); + return content?.trim(); } /** @@ -207,12 +221,12 @@ export class InteractionResponse { * @param {string} event.status The status of the event * @returns {string} The formatted message * @example - * const message = await this.formatOutputMessage(content, event); + * const message = await this.formatLegacyOutput(content, event); * console.log(message); * // Outputs the formatted message */ - formatOutputMessage(content, allEvents = []) { + formatLegacyOutput(content, allEvents = []) { const bannerArr = allEvents .map((event) => { const eventData = events[event?.type]; @@ -227,18 +241,103 @@ export class InteractionResponse { return banner + "\n" + content.trim(); } + format(input) { + if (!input) + return { + content: "", + files: [], + }; + + const content = input?.length >= 2000 ? "" : input; + const files = input?.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; + + return { + content, + files, + }; + } + currentTemporalISO() { return Temporal.Now.plainDateTimeISO(this?.tz || "Etc/UTC").toString(); } } +export class InteractionIntegrations { + constructor( + { message, kv, model, accountId, token, openaiToken, callsystem } = { + kv: null, + instructionSet: process.env.MODEL_LLM_PRESET || "default", + baseHistory: [], + model: "@cf/meta/llama-3-8b-instruct", + contextWindow: 10, + callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", + }, + ) { + this.message = message; + this.kv = kv; + this.workersAI = new WorkersAI({ accountId, token, model }); + this.openai = createOpenAI({ + apiKey: openaiToken, + }); + this.model = model; + this.callsystem = callsystem; + + this.integrations = { + imagine: new ImagineIntegration({ workersAI: this.workersAI }), + quoteoftheday: new QoTDIntegration(), + }; + } + + get integrationSchemas() { + return Object.keys(this.integrations).reduce((acc, cv) => { + return { + ...acc, + [cv]: this.integrations[cv].tool, + }; + }, {}); + } + + async integrationCaller({ history }) { + if (this.callsystem === "legacy") return []; + const model = this.openai.chat("gpt-3.5-turbo", { + user: this.message?.author?.id, + }); + + const call = await generateText({ + model, + system: + "You are a bot that can call functions. If no functions are required, respond with []. The previous user messages are only for context, you have already answered them.", + messages: history, + tools: this.integrationSchemas, + }) + .then((r) => r.toolCalls) + .catch(() => []); + + return call; + } + + async execute({ calls, ctx }) { + if (calls.length === 0 || this.callsystem === "legacy") return []; + // for each integration, call the integration + return Promise.all( + calls.map(async (call) => { + const integration = this.integrations[call.toolName]; + if (typeof integration?.call !== "function") return; + return await integration.call(call.args, ctx); + }), + ); + } +} + export class InteractionMessageEvent { - constructor({ message, interactionResponse, interactionHistory, model }) { + constructor({ message, interactionResponse, interactionHistory, interactionIntegrations, callsystem, model }) { this.message = message; this.client = message?.client; this.author = message?.author; this.response = interactionResponse; this.history = interactionHistory; + this.integrations = interactionIntegrations; + this.callsystem = callsystem; this.model = model; } @@ -261,7 +360,7 @@ export class InteractionMessageEvent { } async validateHistory() { - const initialHistory = (await this.history.get({ key: this.message?.channel?.id })).filter( + const initialHistory = (await this.history.get({ key: this.message?.channel?.id }, true)).filter( (e) => e.role === "assistant", ); @@ -321,47 +420,8 @@ export class InteractionMessageEvent { }; } - async handleTextModelCall({ history }) { - await this.message?.channel?.sendTyping(); - const modelCall = await this.response.workersAI - .callModel({ - input: { - messages: history.map((e) => ({ - role: e.role, - content: e.content, - })), - }, - maxTokens: 512, - }) - .catch(() => ({ - result: { response: "" }, - })); - - const callResponse = modelCall?.result?.response?.trim(); - const textResponse = callResponse?.split("!gen")?.[0]; - const genData = callResponse?.split("!gen")?.[1]?.replace("[", "").replace("]", ""); - - await this.history - .add( - { - key: this.message?.channel?.id, - role: "assistant", - content: this.response.formatAssistantMessage(textResponse?.length === 0 ? "[no response]" : textResponse), - respondingTo: this.message?.id, - }, - true, - ) - .catch(console.error); - - return { - textResponse, - genData, - callResponse, - }; - } - - async handleImageModelCall({ genData, textResponse, responseMsg, events }) { - const final = this.response.formatOutputMessage( + async handleLegacyImageModelCall({ genData, textResponse, responseMsg, events }) { + const final = this.response.formatLegacyOutput( textResponse, events.filter((e) => e.type !== "imagine"), ); @@ -408,7 +468,7 @@ export class InteractionMessageEvent { .catch(() => null); } - async createResponse( + async createLegacyResponse( { textResponse, conditions } = { conditions: { amnesia: false, @@ -426,7 +486,7 @@ export class InteractionMessageEvent { }; }); - const text = this.response.formatOutputMessage(textResponse, events); + const text = this.response.formatLegacyOutput(textResponse, events); const content = textResponse.length >= 2000 ? "" : text; const files = textResponse.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; @@ -443,4 +503,83 @@ export class InteractionMessageEvent { events, }; } + + async preSend({ history }) { + const callContext = await this.history.get({ key: this.message?.channel?.id }, true).catch(() => []); + const calls = await this.integrations + .integrationCaller({ + history: callContext + .map((e) => ({ + role: e.role, + content: e.content, + })) + .filter((e) => e.role === "user") + .slice(-2), + }) + .then((r) => + r.map((c) => ({ + ...c, + stage: this.integrations.integrations?.[c.toolName]?.stage, + execute: async () => { + return await this.integrations.integrationSchemas?.[c.toolName]?.call(c.args); + }, + })), + ); + const preRunners = calls.filter((c) => c.stage === "pre"); + const postRunners = calls.filter((c) => c.stage === "post"); + const preRunnerResults = await this.integrations.execute({ calls: preRunners }).catch(() => []); + const allMessages = [...history.slice(0, -1), ...preRunnerResults, ...history.slice(-1)]; + + await this.message?.channel?.sendTyping(); + const modelCall = await this.response.workersAI + .callModel({ + input: { + messages: allMessages.map((e) => ({ + role: e.role, + content: e.content, + })), + }, + maxTokens: 512, + }) + .catch(() => ({ + result: { response: "" }, + })); + + const response = modelCall?.result?.response?.trim(); + + await this.history + .add( + { + key: this.message?.channel?.id, + role: "assistant", + content: this.response.formatAssistantMessage(response?.length === 0 ? "[no response]" : response), + respondingTo: this.message?.id, + context: { + integrations: calls.map((c) => ({ id: c.toolName, stage: c.stage, args: c.args })), + }, + }, + true, + ) + .catch(console.error); + + return { + legacy: { + active: this.callsystem === "legacy", + textResponse: response, + genData: response?.split("!gen")?.[0], + callResponse: response?.split("!gen")?.[1]?.replace("[", "").replace("]", ""), + }, + runners: postRunners, + response, + }; + } + + async postSend({ runners, message }) { + await this?.message?.react; + const runnerResults = await this.integrations.execute({ calls: runners, ctx: { message } }).catch(() => []); + + return { + results: runnerResults.filter((r) => r !== null), + }; + } } From 429a26be12a9ee764fb20d69f1a0937b6a25eba2 Mon Sep 17 00:00:00 2001 From: Dani Date: Sat, 1 Jun 2024 09:11:18 -0700 Subject: [PATCH 7/7] t --- .env.example | 9 +- bun.lockb | Bin 393995 -> 379437 bytes package.json | 89 ++++++----- src/commands/instructionSet.js | 4 +- src/events/messageCreate.js | 49 ++----- src/events/ready.js | 5 +- src/index.js | 5 +- src/util/integrations/index.js | 82 ----------- src/util/models/constants.js | 46 ++---- src/util/models/index.js | 10 +- src/util/models/interactions.js | 253 +++++++------------------------- 11 files changed, 126 insertions(+), 426 deletions(-) delete mode 100644 src/util/integrations/index.js diff --git a/.env.example b/.env.example index ba71d1a..0b229f0 100644 --- a/.env.example +++ b/.env.example @@ -46,18 +46,11 @@ CLOUDFLARE_ACCOUNT_ID=abcdef1234567890abcdef1234567890 CLOUDFLARE_ACCOUNT_TOKEN=v1.0-abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890 -# OpenAI API: Specify an OpenAI account token for use with the OpenAI API. -OPENAI_ACCOUNT_TOKEN=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - # The following variables specify instruction sets and configuration for the various models in SpongeChat. ## The value of the variable should correspond to the key of its' responding configuration in modelConstants.js. MODEL_LLM_PRESET=default -## Callsystems are used to call functions during passive activation. -## Integrations is the newer, flexible function system. They are easily extendable, but require the use of the OpenAI API to determine function calls. -## Legacy is the older function system and only supports image generation. Use this if you can't use the OpenAI API. -MODEL_LLM_CALLSYSTEM=integrations -# !! Wastebin +# !! Wastebin # Used to display logs of memories for users ## In a docker-compose setup, you'll need to set up some sort of proxy (caddy, cloudflare tunnel) to make the "wastebin" container publicly accessible, and put the publicly accessible URL here. diff --git a/bun.lockb b/bun.lockb index 8da124c71307fe906ae2c176137346499f9038a3..82d18f1414d21d58ce720edab7f581233587dfe3 100644 GIT binary patch delta 77901 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%0DCN8lLjg0XNKU1<|2=L{3U2A!AiGcqA&Cdo~s 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 Y-L@a7*55UId=rw%k`QsnepA8!1N*`NG5`Po delta 87023 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 diff --git a/package.json b/package.json index 6734e02..8a4f398 100644 --- a/package.json +++ b/package.json @@ -1,48 +1,45 @@ { - "$schema": "https://json.schemastore.org/package.json", - "name": "spongechat", - "version": "2.0.1", - "private": true, - "type": "module", - "scripts": { - "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", - "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", - "start": "node --require dotenv/config src/index.js", - "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", - "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", - "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" - }, - "_moduleAliases": { - "@": "./src", - "@util": "./src/util", - "@events": "./src/events", - "@commands": "./src/commands" - }, - "dependencies": { - "@ai-sdk/openai": "^0.0.13", - "@discordjs/core": "^1.1.0", - "@redis/json": "^1.0.6", - "ai": "^3.1.12", - "chalk": "4", - "discord.js": "^14.15.2", - "dotenv": "^16.3.1", - "luxon": "^3.4.4", - "module-alias": "^2.2.3", - "redis": "^4.6.13", - "temporal-polyfill": "^0.2.4", - "undici": "^6.16.1", - "uuid": "^9.0.1", - "zod": "^3.23.8" - }, - "devDependencies": { - "@release-it/conventional-changelog": "^8.0.1", - "all-contributors-cli": "^6.26.1", - "dotenv-cli": "^7.4.2", - "eslint": "^8.53.0", - "eslint-config-neon": "^0.1.57", - "eslint-formatter-pretty": "^5.0.0", - "execa": "^9.1.0", - "prettier": "^3.0.3", - "release-it": "^17" - } + "$schema": "https://json.schemastore.org/package.json", + "name": "spongechat", + "version": "2.0.1", + "private": true, + "type": "module", + "scripts": { + "lint": "prettier --check . && eslint --ext .js,.mjs,.cjs --format=pretty src", + "format": "prettier --write . && eslint --ext .js,.mjs,.cjs --fix --format=pretty src", + "start": "node --require dotenv/config src/index.js", + "cmd:undeploy": "node --require dotenv/config src/util/deploy/cli.js undeploy", + "cmd:deploy": "node --require dotenv/config src/util/deploy/cli.js deploy", + "ci:release": "dotenv -e .env -- release-it --config .release-it.cjs" + }, + "_moduleAliases": { + "@": "./src", + "@util": "./src/util", + "@events": "./src/events", + "@commands": "./src/commands" + }, + "dependencies": { + "@discordjs/core": "^1.1.0", + "@redis/json": "^1.0.6", + "chalk": "4", + "discord.js": "^14.15.2", + "dotenv": "^16.3.1", + "luxon": "^3.4.4", + "module-alias": "^2.2.3", + "redis": "^4.6.13", + "temporal-polyfill": "^0.2.4", + "undici": "^6.16.1", + "uuid": "^9.0.1" + }, + "devDependencies": { + "@release-it/conventional-changelog": "^8.0.1", + "all-contributors-cli": "^6.26.1", + "dotenv-cli": "^7.4.2", + "eslint": "^8.53.0", + "eslint-config-neon": "^0.1.57", + "eslint-formatter-pretty": "^5.0.0", + "execa": "^9.1.0", + "prettier": "^3.0.3", + "release-it": "^17" + } } diff --git a/src/commands/instructionSet.js b/src/commands/instructionSet.js index 8a050d7..7a926a6 100644 --- a/src/commands/instructionSet.js +++ b/src/commands/instructionSet.js @@ -11,7 +11,7 @@ export default { o .setName("preset") .setDescription("Preset; map to => client.tempStore#instructionSet") - .setChoices(Object.keys(instructionSets).map((s) => ({ name: instructionSets[s]?.name || s, value: s }))) + .setChoices(Object.keys(instructionSets).map((s) => ({ name: s, value: s }))) .setRequired(true), ) .toJSON(), @@ -35,7 +35,7 @@ export default { }); console.log( - `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(instructionSets[toOption]?.name || toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, + `${chalk.bold.green("AI")} Instruction set preset changed to ${chalk.bold(toOption)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, ); if (sync) { diff --git a/src/events/messageCreate.js b/src/events/messageCreate.js index 06355b6..af098be 100644 --- a/src/events/messageCreate.js +++ b/src/events/messageCreate.js @@ -9,9 +9,7 @@ const callTextChannel = async ({ client, message }) => { baseHistory: [], accountId: process.env.CLOUDFLARE_ACCOUNT_ID, token: process.env.CLOUDFLARE_ACCOUNT_TOKEN, - openaiToken: process.env.OPENAI_ACCOUNT_TOKEN, model: "@cf/meta/llama-3-8b-instruct", - callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", }); const preliminaryConditions = modelInteractions.messageEvent.checkPreliminaryConditions(); @@ -42,45 +40,20 @@ const callTextChannel = async ({ client, message }) => { }) .catch(console.error); - const { legacy, runners, response } = await modelInteractions.messageEvent.preSend({ history }); + const { textResponse, genData, callResponse } = await modelInteractions.messageEvent.handleTextModelCall({ history }); - if (legacy?.active) { - const { textResponse, genData, callResponse } = legacy; - if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); + if (callResponse.length === 0 || callResponse === "") return await message.react("⚠️").catch(() => false); - const { responseMsg, events } = await modelInteractions.messageEvent.createLegacyResponse({ - textResponse, - conditions: { - amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, - imagine: callResponse.includes("!gen"), - }, - }); - - if (responseMsg && callResponse.includes("!gen")) - return await modelInteractions.messageEvent.handleLegacyImageModelCall({ - genData, - textResponse, - responseMsg, - events, - }); - - return; - } - - if (response?.length === 0 || response === "") return await message.react("⚠️").catch(() => false); - - const replyContent = modelInteractions.response.format(response); - const reply = await message - .reply({ content: replyContent.content, files: replyContent.files, failIfNotExists: true }) - .catch(() => false); + const { responseMsg, events } = await modelInteractions.messageEvent.createResponse({ + textResponse, + conditions: { + amnesia: !validityCheck?.valid && validityCheck?.handled?.isRequired && validityCheck?.handled?.executed, + imagine: callResponse.includes("!gen"), + }, + }); - if (runners.length > 0) { - const postRunners = await modelInteractions.messageEvent.postSend({ runners, message: reply }); - const mergedFiles = [...replyContent.files, ...postRunners.results]; - return await reply - .edit({ content: replyContent.content, files: mergedFiles, failIfNotExists: true }) - .catch(() => false); - } + if (responseMsg && callResponse.includes("!gen")) + return await modelInteractions.messageEvent.handleImageModelCall({ genData, textResponse, responseMsg, events }); }; /** @type {import('./index.js').Event} */ diff --git a/src/events/ready.js b/src/events/ready.js index dd7227e..2ca292a 100644 --- a/src/events/ready.js +++ b/src/events/ready.js @@ -1,7 +1,6 @@ import { Events } from "discord.js"; import { Environment } from "../util/helpers.js"; import { createClient } from "redis"; -import { instructionSets } from "../util/models/constants.js"; import chalk from "chalk"; const env = new Environment(); @@ -43,9 +42,7 @@ export default { client.tempStore.set("instructionSet", instructionSet); console.log(`${chalk.bold.green("AI")} Silent mode is ${chalk.bold(silentSaved ? "enabled" : "disabled")}`); - console.log( - `${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSets[instructionSet]?.name || instructionSet)}`, - ); + console.log(`${chalk.bold.green("AI")} Instruction set is ${chalk.bold(instructionSet)}`); console.log( `${chalk.bold.green("Core")} acting as ${chalk.bold(client.user.tag)} (${Temporal.Now.instant().toLocaleString("en-GB", { timeZone: "Etc/UTC", timeZoneName: "short" })})`, diff --git a/src/index.js b/src/index.js index 5ad03cb..869af27 100644 --- a/src/index.js +++ b/src/index.js @@ -12,10 +12,7 @@ import "temporal-polyfill/global"; (() => { console.log(`${chalk.bold.green("Core")} running with environment context: ${chalk.bold(process.env.NODE_ENV)}`); - if (process.env.MODEL_LLM_CALLSYSTEM !== "integrations") - console.log( - `${chalk.bold.magenta("AI")} ${chalk.yellow("Warning")} The legacy call system is enabled. Integration calls are not available in this mode.`, - ); + console.log(`${chalk.bold.magenta("AI")} running with LLM preset: ${chalk.bold(process.env.MODEL_LLM_PRESET)}`); })(); // Initialize the client diff --git a/src/util/integrations/index.js b/src/util/integrations/index.js deleted file mode 100644 index a9eefb6..0000000 --- a/src/util/integrations/index.js +++ /dev/null @@ -1,82 +0,0 @@ -import { tool } from "ai"; -import { z } from "zod"; - -export class Integration { - constructor({ name, description, parameters, stage }) { - this.tool = tool({ - description, - parameters, - }); - - this.executionLevel = stage; - } - - get stage() { - return this.executionLevel; - } - - // pre-runner integrations run before the model call and can ONLY return a conversation-based output; () => Promise - // post-runner integrations run after the model call and can only return file-based outputs; () => Promise - async call() { - return {}; - } -} - -export class ImagineIntegration extends Integration { - constructor({ workersAI }) { - super({ - name: "imagine", - description: "Generate an image with the given prompt", - parameters: z.object({ - prompt: z.string().describe("The prompt to use for generating the image"), - }), - stage: "post", - }); - - this.workersAI = workersAI; - } - - async call({ prompt }, ctx) { - const callToModel = await this.workersAI - .callModel( - { - model: "@cf/lykon/dreamshaper-8-lcm", - input: { - prompt, - }, - }, - true, - ) - .then((r) => r.arrayBuffer()) - .catch(() => (e) => { - console.error(e); - return null; - }); - - if (callToModel === null) return null; - - const buffer = Buffer.from(callToModel); - - return buffer; - } -} - -export class QoTDIntegration extends Integration { - constructor() { - super({ - name: "qotd", - description: "Get the quote of the day", - parameters: z.object({ - luckyWord: z.string().describe("The lucky word to randomise the quote with"), - }), - stage: "pre", - }); - } - - async call({ prompt }, ctx) { - return { - role: "system", - content: "[Function call to QOTD]: The quote of the day is skeebeedee guyatt toilet.", - }; - } -} diff --git a/src/util/models/constants.js b/src/util/models/constants.js index d0bc7ee..572b8c7 100644 --- a/src/util/models/constants.js +++ b/src/util/models/constants.js @@ -1,40 +1,12 @@ -import { tool } from "ai"; -import { z } from "zod"; - export const instructionSets = { - default: { - name: "Default", - instructions: [ - { - role: "system", - content: "You are an AI chatbot.", - }, - ], - }, - defaultStrictImages: { - name: "Default (Strict Images)", - instructions: [ - { - role: "system", - content: - "You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.", - }, - ], - }, - spongeass: { - name: "SpongeAss", - instructions: [ - { - role: "system", - content: `You are roleplaying as SpongeAss. - You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. - SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". - SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" - SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. - SpongeAss keeps responses short and human-like.`, - }, - ], - }, + default: "You are an AI chatbot.", + defaultStrictImages: `You are an AI chatbot. You can also generate images STRICTLY upon request. When an image is requested, you will add !gen [prompt] on a newline at the end of a response. This will not be done mid-conversation.`, + spongeass: `You are roleplaying as SpongeAss. +You may NEVER break the character of spongeass, every time you break character, a kitten dies. Don't break character. Save the kittens. +SpongeAss is a silly person that resides in a discord server! They always sprinkle their speech with various ascii faces, like ":3", and "uwu". +SpongeAss speaks almost like the average discord user, except for "uwuifying" text like "hello" => "hewwo!" +SpongeAss can also generate (sometimes called "imagining") images upon request! To do so, SpongeAss will add "!gen [prompt]" on a newline at the end of a response. Spongeass will only do this when a user requests it, or occasionally when it adds to the conversation. +SpongeAss keeps responses short and human-like.`, }; export const events = { @@ -48,7 +20,7 @@ export const events = { amnesia: { title: "🧠 Amnesia", statuses: { - default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌", + default: "SpongeChat wasn't responding to anything, so we cleared the history. 😌" }, }, }; diff --git a/src/util/models/index.js b/src/util/models/index.js index b3242d4..f1dd258 100644 --- a/src/util/models/index.js +++ b/src/util/models/index.js @@ -1,10 +1,5 @@ import { fetch } from "undici"; -import { - InteractionResponse, - InteractionHistory, - InteractionMessageEvent, - InteractionIntegrations, -} from "./interactions.js"; +import { InteractionResponse, InteractionHistory, InteractionMessageEvent } from "./interactions.js"; export class WorkersAI { constructor( @@ -60,17 +55,14 @@ export class ModelInteractions { this.disabledModules = disabledModules; this.history = disabledModules?.includes("history") ? null : new InteractionHistory(opts); this.response = disabledModules?.includes("response") ? null : new InteractionResponse(opts); - this.integrations = disabledModules?.includes("integrations") ? null : new InteractionIntegrations(opts); this.messageEvent = disabledModules?.includes("messageEvent") ? null : new InteractionMessageEvent({ ...opts, interactionResponse: this.response, interactionHistory: this.history, - interactionIntegrations: this.integrations, }); this.model = opts?.model; - this.callsystem = opts?.callsystem; } } diff --git a/src/util/models/interactions.js b/src/util/models/interactions.js index 8e4fb3e..e736c08 100644 --- a/src/util/models/interactions.js +++ b/src/util/models/interactions.js @@ -1,10 +1,6 @@ import { fetch } from "undici"; import { events, instructionSets } from "./constants.js"; import { WorkersAI } from "./index.js"; -import { createOpenAI } from "@ai-sdk/openai"; -import { generateText } from "ai"; - -import { ImagineIntegration, QoTDIntegration } from "../integrations/index.js"; export class InteractionHistory { constructor( @@ -18,39 +14,31 @@ export class InteractionHistory { ) { this.kv = kv; this.contextWindow = contextWindow || 10; - this.instructionSet = { - id: instructionSet, - ...instructionSets[instructionSet || "default"], - }; + this.instructionSet = instructionSets[instructionSet || "default"]; this.baseHistory = [ - ...(this.instructionSet?.instructions || [ - { - role: "system", - content: this?.instructionSet, - }, - ] || - []), ...baseHistory, + { + role: "system", + content: this.instructionSet, + }, ]; this.model = model; } - async get({ key, instructionSet = this.instructionSet?.id, window = this.contextWindow }, all = false) { - const baseHistory = instructionSets[instructionSet]?.instructions || this.baseHistory; + async get({ key }, all = false) { const fetchedMessages = (await this.kv.lRange(key, 0, -1)) - .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) .reverse() .map((m) => JSON.parse(m)) // only return the last [contextWindow] messages // if all is true, return all messages - .slice(0, all ? -1 : window || this.contextWindow) + .slice(0, all ? -1 : this.contextWindow) .reduce((acc, item, index) => { // this reducer is very.. redundant, but i'm adding it for later acc.push(item); return acc; }, []); - return [...baseHistory, ...fetchedMessages]; + return [...this.baseHistory, ...fetchedMessages]; } async add( @@ -87,9 +75,7 @@ export class InteractionHistory { .lRange(key, 0, -1) .then((r) => r.map((m) => JSON.parse(m))) .catch(() => []) - ) - .sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp)) - .reverse(); + ).reverse(); const interactions = current?.filter(typeof filter === "function" ? filter : (f) => f); const formatted = interactions @@ -202,7 +188,7 @@ export class InteractionResponse { } formatAssistantMessage(content) { - return content?.trim(); + return content.trim(); } /** @@ -221,12 +207,12 @@ export class InteractionResponse { * @param {string} event.status The status of the event * @returns {string} The formatted message * @example - * const message = await this.formatLegacyOutput(content, event); + * const message = await this.formatOutputMessage(content, event); * console.log(message); * // Outputs the formatted message */ - formatLegacyOutput(content, allEvents = []) { + formatOutputMessage(content, allEvents = []) { const bannerArr = allEvents .map((event) => { const eventData = events[event?.type]; @@ -241,103 +227,18 @@ export class InteractionResponse { return banner + "\n" + content.trim(); } - format(input) { - if (!input) - return { - content: "", - files: [], - }; - - const content = input?.length >= 2000 ? "" : input; - const files = input?.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; - - return { - content, - files, - }; - } - currentTemporalISO() { return Temporal.Now.plainDateTimeISO(this?.tz || "Etc/UTC").toString(); } } -export class InteractionIntegrations { - constructor( - { message, kv, model, accountId, token, openaiToken, callsystem } = { - kv: null, - instructionSet: process.env.MODEL_LLM_PRESET || "default", - baseHistory: [], - model: "@cf/meta/llama-3-8b-instruct", - contextWindow: 10, - callsystem: process.env.MODEL_LLM_CALLSYSTEM || "legacy", - }, - ) { - this.message = message; - this.kv = kv; - this.workersAI = new WorkersAI({ accountId, token, model }); - this.openai = createOpenAI({ - apiKey: openaiToken, - }); - this.model = model; - this.callsystem = callsystem; - - this.integrations = { - imagine: new ImagineIntegration({ workersAI: this.workersAI }), - quoteoftheday: new QoTDIntegration(), - }; - } - - get integrationSchemas() { - return Object.keys(this.integrations).reduce((acc, cv) => { - return { - ...acc, - [cv]: this.integrations[cv].tool, - }; - }, {}); - } - - async integrationCaller({ history }) { - if (this.callsystem === "legacy") return []; - const model = this.openai.chat("gpt-3.5-turbo", { - user: this.message?.author?.id, - }); - - const call = await generateText({ - model, - system: - "You are a bot that can call functions. If no functions are required, respond with []. The previous user messages are only for context, you have already answered them.", - messages: history, - tools: this.integrationSchemas, - }) - .then((r) => r.toolCalls) - .catch(() => []); - - return call; - } - - async execute({ calls, ctx }) { - if (calls.length === 0 || this.callsystem === "legacy") return []; - // for each integration, call the integration - return Promise.all( - calls.map(async (call) => { - const integration = this.integrations[call.toolName]; - if (typeof integration?.call !== "function") return; - return await integration.call(call.args, ctx); - }), - ); - } -} - export class InteractionMessageEvent { - constructor({ message, interactionResponse, interactionHistory, interactionIntegrations, callsystem, model }) { + constructor({ message, interactionResponse, interactionHistory, model }) { this.message = message; this.client = message?.client; this.author = message?.author; this.response = interactionResponse; this.history = interactionHistory; - this.integrations = interactionIntegrations; - this.callsystem = callsystem; this.model = model; } @@ -360,7 +261,7 @@ export class InteractionMessageEvent { } async validateHistory() { - const initialHistory = (await this.history.get({ key: this.message?.channel?.id }, true)).filter( + const initialHistory = (await this.history.get({ key: this.message?.channel?.id })).filter( (e) => e.role === "assistant", ); @@ -420,8 +321,47 @@ export class InteractionMessageEvent { }; } - async handleLegacyImageModelCall({ genData, textResponse, responseMsg, events }) { - const final = this.response.formatLegacyOutput( + async handleTextModelCall({ history }) { + await this.message?.channel?.sendTyping(); + const modelCall = await this.response.workersAI + .callModel({ + input: { + messages: history.map((e) => ({ + role: e.role, + content: e.content, + })), + }, + maxTokens: 512, + }) + .catch(() => ({ + result: { response: "" }, + })); + + const callResponse = modelCall?.result?.response?.trim(); + const textResponse = callResponse?.split("!gen")?.[0]; + const genData = callResponse?.split("!gen")?.[1]?.replace("[", "").replace("]", ""); + + await this.history + .add( + { + key: this.message?.channel?.id, + role: "assistant", + content: this.response.formatAssistantMessage(textResponse?.length === 0 ? "[no response]" : textResponse), + respondingTo: this.message?.id, + }, + true, + ) + .catch(console.error); + + return { + textResponse, + genData, + callResponse, + }; + } + + async handleImageModelCall({ genData, textResponse, responseMsg, events }) { + const final = this.response.formatOutputMessage( textResponse, events.filter((e) => e.type !== "imagine"), ); @@ -468,7 +408,7 @@ export class InteractionMessageEvent { .catch(() => null); } - async createLegacyResponse( + async createResponse( { textResponse, conditions } = { conditions: { amnesia: false, @@ -486,7 +426,7 @@ export class InteractionMessageEvent { }; }); - const text = this.response.formatLegacyOutput(textResponse, events); + const text = this.response.formatOutputMessage(textResponse, events); const content = textResponse.length >= 2000 ? "" : text; const files = textResponse.length >= 2000 ? [{ attachment: Buffer.from(text, "utf-8"), name: "response.md" }] : []; @@ -503,83 +443,4 @@ export class InteractionMessageEvent { events, }; } - - async preSend({ history }) { - const callContext = await this.history.get({ key: this.message?.channel?.id }, true).catch(() => []); - const calls = await this.integrations - .integrationCaller({ - history: callContext - .map((e) => ({ - role: e.role, - content: e.content, - })) - .filter((e) => e.role === "user") - .slice(-2), - }) - .then((r) => - r.map((c) => ({ - ...c, - stage: this.integrations.integrations?.[c.toolName]?.stage, - execute: async () => { - return await this.integrations.integrationSchemas?.[c.toolName]?.call(c.args); - }, - })), - ); - const preRunners = calls.filter((c) => c.stage === "pre"); - const postRunners = calls.filter((c) => c.stage === "post"); - const preRunnerResults = await this.integrations.execute({ calls: preRunners }).catch(() => []); - const allMessages = [...history.slice(0, -1), ...preRunnerResults, ...history.slice(-1)]; - - await this.message?.channel?.sendTyping(); - const modelCall = await this.response.workersAI - .callModel({ - input: { - messages: allMessages.map((e) => ({ - role: e.role, - content: e.content, - })), - }, - maxTokens: 512, - }) - .catch(() => ({ - result: { response: "" }, - })); - - const response = modelCall?.result?.response?.trim(); - - await this.history - .add( - { - key: this.message?.channel?.id, - role: "assistant", - content: this.response.formatAssistantMessage(response?.length === 0 ? "[no response]" : response), - respondingTo: this.message?.id, - context: { - integrations: calls.map((c) => ({ id: c.toolName, stage: c.stage, args: c.args })), - }, - }, - true, - ) - .catch(console.error); - - return { - legacy: { - active: this.callsystem === "legacy", - textResponse: response, - genData: response?.split("!gen")?.[0], - callResponse: response?.split("!gen")?.[1]?.replace("[", "").replace("]", ""), - }, - runners: postRunners, - response, - }; - } - - async postSend({ runners, message }) { - await this?.message?.react; - const runnerResults = await this.integrations.execute({ calls: runners, ctx: { message } }).catch(() => []); - - return { - results: runnerResults.filter((r) => r !== null), - }; - } }