From 19750fa68403357c83fcb70a92215e59da3147e8 Mon Sep 17 00:00:00 2001 From: BobRandomNumber <189914665+BobRandomNumber@users.noreply.github.com> Date: Tue, 10 Mar 2026 16:33:39 -0400 Subject: [PATCH] V0.2.0 --- BasicOllama.png | Bin 58800 -> 54026 bytes BasicOllama.py | 421 +++++++++++++++++++----------------------- README.md | 52 ++---- __init__.py | 7 +- js/basic_ollama_ui.js | 41 ++++ prompts/LTX2_I2V.txt | 31 ++++ prompts/LTX2_T2V.txt | 40 ++++ pyproject.toml | 4 +- requirements.txt | 1 - web/js/BasicOllama.js | 104 ----------- 10 files changed, 329 insertions(+), 372 deletions(-) create mode 100644 js/basic_ollama_ui.js create mode 100644 prompts/LTX2_I2V.txt create mode 100644 prompts/LTX2_T2V.txt delete mode 100644 requirements.txt delete mode 100644 web/js/BasicOllama.js diff --git a/BasicOllama.png b/BasicOllama.png index 0bb0fb882d11cbcac556e44ef6d31dcd53d13ed2..f5583ff4d16aaed7def464ed8f97ff12df8ef9d4 100644 GIT binary patch literal 54026 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 x^&v#CrA5A>p+O?AzrL+aap_pZb%h3qED0&8 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

@v#AJ+GK1&|T`IqDHrm&JuAWxd@9&>O=5U zZqDLy#FNX(^}E2&0ezG&WDahg*l}@)m7}s3J^i8P@j?6>l*P*dH&j&U&_DL|RmA!( z)cW9#D?mIxUU|rzV!2cyBUW5%6(qzUGzaT_y}zi=^4HvhkPiQ2T4{4UWo9NsfNNZw z>gVS_cb|FP{uA$Ty^5&QUH_UA1aH8Vaw#AvNJ;tZ$|XwZ^oU8g^b3Wa^kupvySx`%{Rdi?AUh zLp13_dy4)d?9Ph4oexn767pAf?e@+)LoZiW7sC`n#gWK2TWge_uvchA_kO;UcZ3zV zSj2-lhcN_T!F*Jh*y-o;glt(iEgsH92?k&1L0v^OPk2Mbqk@eQtqH%_xc%PF_FJj3 z2&~XLapIBST~=0BYsB{h(xY3r;dk%KFSiJ+%f9R5!+05|DvtD7wf*~(fmQ+QK_b?X zV=Vd{1v>#RA%q|hAANI%3NQ=n;jeFX_4?CIW$8ot=@E>$)nLhG(*idIuY}a_4y;3u(XkpaLEHVpH_N*`3TZn!Ld7JzAThphAnQHr2%mX_E zcpmIBvF8;07edHb%~~`u6cdA|8{!l(i=_SHKDy6WZyNz-gE|yJ&z#7C0Dpd}*Wf&T zC<`{o+K7)s$KnJ-T^L)OA-U8!fAb>3|7k~Ts18^i6m0NGW3b3+>;xDBf?%TX!UXz# z8({lE;EsldUc($GI2`+>AKaE7{6SCmJ$xp9I?@oT{d4Dd<8%(KxJtkT?m5iZLzIe? zC=UQt4H-$`hw(1xP!=z0YHTD2Cx~DSq*$5U>B9+O7G*JG2QW%hp}(2UgS0*n@hK@X zLkge5zg%Hg>zh7pn%cdc5FiClfxk`r{*{_ggVZ3v4ZxOmo7o#S9s8S;(DX6o&624= z-(RQxckFj7#_x%A`Ur6ZE>>bQHud@Ze+Gd;Baqv(YU5_3bqq3mg2=}qL-Zg>;=hJW zUBon@jd%^<7sb)yxfj+?i#KwbvU+00z)4r0Ny#}mPJY5QG*n~@(tPopVE2c{0iP-4 zBoT5@)(ZA)zp}V+b~y5U;5=Zopx|uVp6}EinE7`u2|afZn83&|Ha1plo!)}8m_X1( zv6a#+Q1hLE97+>;&FJ>v~b3dI+rz$esXRLfL$QLbhrQ} zR{qp#d(@CcUtCkMR@@PmXw z-M*wsl8ex3G$A;2|7SE9Gb|u-K)IkBtNdl;vMESxR4m|G5&d4L1ms5{;Z%X!MWdyNppHO`KwxM&MJ54iL4}R5#Gomr>cbdf1q5_5l=}sW#-@V}2G+l*N{A2?pu$)U?nx^jz{-lY4I>`H>sX+7P5?;V-?%Qj z|CRi-Sh80D0Dz$)X=6&}^jZ9fP}&{c>jJV8CwYqE$wtKD;Z&rUB}2p0K#C}m2=-qk zrE4mQ;V+HiRNa~q3Hk;?Oq_@Y{>i?Dm6U7*~7)K3KPzZ`T$yk(O!Epb z1WXLVIjyWD(7XEjS}egkrWqdB)nlFSct3`Eqyz$ZeDo<@y8Q<{FU*YMYOj%%*m!Ip zN2oPoR|B#E4E9f1pKmu7u#fNim*HqdmhjG`u*iIu?a`|ajrew*o3|4EmXw@^*n&oH zhh%6q{9v0}HmQqS8B(%n_Nyje+bIkBQqZ5tgxw0)1O*0K!#)lt-}7ht8K7*PU>z+fO-8}(oLW6$3R%IMJFiQ*Zla{zCA3~xx3_oTCm5_>A-NH7XP*mEVq|2O<1z-Jn&2+1y@1mJs`_iD ztnlFYv4Y}YQLeWABms8w5&$<%rGXbV})O?y&k&O}gjkh>W zMl;|JiSzn(tE|BK_v(uBawG=r7~ccXFn^rG%JM!{%@rfSvq(+=2Icsog#{+)s>!{J zSSzeRNiP=wEIaR+1)zEzI)O|+!jOl)uWjs_<>zr-~}(Dbi{4FOCAdR;>4*lTKRLq4@MvhI#R5ls|;Hz^y%W z4RWZKrOY4;cBA*?g!Lc=SzAp0svm=!o$E%;TIm$I*)GkLuU)qLXkh?`F>J}$B#Rfq z4uFR3^xH$159EhVZ2BQ)L0}+GVJFmw1{O(}_f=w9jE_!1M)vWT1s4>PnU7E_aP`Gd zji5A#aS6dUB!J9xJ{-E&T@=BIftKY zgC+$X1agdv*A)HS4lhtVZY7p1;cR#sfnfOO<*g42K&ZejvW)NAbv3HY22e?LwVtdylHXAy&jUPxW(TVdTWu*|(~94U?nj!-ieXJ_#tu>F@{zl4k+gv%!>7`;{BGRD*38hV7#~@r09Ffgvf0Omz$szGcCKzGI zzeN^NKVm5m0Z5*}37nK<-$a#9mOmg4yx@EVdfsQ+%_Sfj)57RU!po9&8iyGUE{a=N z)9hg+tGY|fy;s5R5+VlY$nMVKprZhr1sv+)vBV#VAR;Zamk!=8w4&@fu zKAP&IT>x87q}2NLr^eZM@jE+b z3PzMHV;nhp6wkg=`8UW+DMbJq$5SZ!{NVomC8&xq3oiG) z&Em!|d@dxm5-d*Q)SHK?KRNUW?dQCa@6sOkxqyV>U>x$ij|^P2eZ~*?jo?8klb1F1wQz{_=_woMFYKPUCw>R-fRVYl~xzjQDh+oCZ7PIy7#ZTxbk1# z$~Vd8P+=HZcKHM;>MI~X#WR0&fnTNBgtwL42ERF8cQu3J8gGu+2F zV5K4Iv=d8I1zRT^Pn;hV8u9=A<*T_k))Ls4HshJ@3-w~1Zx-PlfR3ELVAKv1XnaEI z`vJ;dl+yO`-8-`v?7atIb9g4*#L>0>d12?4f}h9s*cK7kip2nJ#@jF7jZ92}@K#Z> z^joTFg&#m|gWE-95YBxX_yjFLP{meU6ws06qpN$jg#>Rn?11x?D_R-b!;WQB7$F=m<^R%gwi2us&|6OGc{Er#`%efi44Xn7tPp_ z-Y#dvS>VD)&P}y43DQqhv75hg=ZGd7vsK4Wq_<-3?tCv6p68)EkkpV9T8(xj`GbvQ z;~i*Jf`#j6;V>keeV*1Mh*H8?S0R4W^1^5iJ~^%&r(LP%*Y0k|Lq?Dv0a5eyt@bM{ z*&tvD%e}~_EAQlB-#D?h^6l?s`~cogDJx{Hm-X%tIXGP=e!) zM@BAOwpFNS!wEb=*ok$AJ3Bfg7B1A5U1^Bp`w3Ex(!r79{m%y_ij$NEp}di9U5}#S z?{EJx6o1hb6#R5A8QypAM$B#i;-gc|bz5C`LAL>hA;ccv_7iKD@GwtOxpKPXbRqhT zRG0VSQa@`~2*P1(95;asg9R!T$vBs#P-tQ$ELyav7#cyUIHyqTud5!plKu?8HgY`p zOt7*Xw2bf`QLAlc7X3ba@eafwfXGx21JbfKLcCWYKKrXzn?}n|>_1_Lb`%U|J0?lJ z>2Dcg7zf{HoAsI1Mm!iE#dmUdGW}1A`_0yCV3R9V2J5mppT~lyQ)p|~rEQ8xDAe(ZOk0!xtF`Hrf=+I@wS%B^;;M5oC z^yAz(RelZCE)wdv^E(w!{a%Ik@t8 zatq!WNuBq3;9a~hX`ayek>Y2*ZlHG^a-zmIKlDq|Ag1i$+qGd zafm<)2D!)(2%6&~EhWVQKEW5;mA1I&=Lh1SH)mU&1?g^T8s&EHznb@qgC0m50B_U` z+oi3|2B{B?frZGe%yM}P+VZxEu+UJxfugXmu=g%dkbA(LZN1m;t!f17^M6!W=Vi`9kxL&7Pf8-x2s3!sD7pYL%jEW$5laeaqUlluiSis|j*!t;;r zc#KTsK_qxdf(k+UGJn_k)gbdRB#6h^IKHVJaxl0G=By7k+~IzB`hq5_D&g-y6pEFY*j=P-C#?%aTUvYg8T z)mSFWwUmLz+&U|kQS@pknxs~&Fl@YOF8J#Y0Q#7$GAF)$oR?jP+BTA^0RtM)xeb2% zrh#4J0h2BC?if`_$zlmo8v5KFf^K^+0#QSWOu%j{s-K{kPY1z_XtuS5 zT=)A^Cw{};Bp$Lq=un;IN%Rh&Zb;^c+Hk|?gAO-GZ=i0AX@hLdA}*GUoo_ z2i1{xs)s3-1w96)kB&pE_`Ul92e;>=P(=pdtnx6gA5s8#2yWm!-XM<|L2w;NphqU} z28;)!MgogTg)Yz$(g4Do2~pgJ@j*@Mew^J3F-&h7^q_bmF!XmNbnBcbO~&C)Tu7cr zUS7oxW_?%ea*+O@Q-ob;Ten#Jg=z6(-n>Foi0x0^Fd+{5VI20 z#^S#NKG1CoyPS`Mr4`~^6O;PjuHI1mr=U?G&QyG1k?1njn9ewn*KYO*3`l%DBZMmw57~7RS{0pIzR#;Zk*@rGK?#Z>KZo!3Wj#re7hJKZGZT8_FHHAyWCi z8^U7JrkHnYO!gOLEMW&a`uJx`omW+R2Z$(WWbh=O(Tj-QJQCJ+J%YjO!aWK*K*dCE z;})6UlMVU5Z^~3FA8lzaxS+;kerf(R_GuU9v%kM|<+ju#(aZ0g>{H!Rlp0)O*DJkq zanVz9A5V3e6zaNu(6!-b<%e5cy+2OW_vfw5@2~mt=A*z)*Pd>hd;A{0hh}UnzNx;| zO=te+0A=rp-=99qFfmKSPk6n`4Li2ifAw=%f74OWz!b-6!AO#~=pMq0h_ zBW-&L*;4`ql>ZI}ZR}T1TI$`ZjS-8${_aNM@$gz$byrzeoVVDCYdXNLl`bR0jRYb3 zi#iJv^_8z^;dkZb^%`GXw|QkNF{6FmbdMsiBH5u3V8h?GX;Wa%56g$Lw-~$(KuVU1 zLQXxOYEr znnB8hf*)ct=wR@`who`dr?{7NFJ1ISaWMlL*`j$Yd2g8YeIYyrSFmXlE4&}cAL#da zHRsPM#>)l<1t};hE~ql+PDjcr}&_YR#Xc zwp=jcfc%W?ss#&BETHR!odG-<@+r1VMPnL7ojEhZ>1Q$;H|e<-mi=TXqC~_xX!{js zV`JmEK1NVnJg9j9UtOFu>q#pd(=Bj8uwmesCm$Rsuzc#i_}6{mwJEH4n8czFng~_- zG(YvVBAjbubkChTxA`wqriil%rZL*MO1i$&w78Hww((0GY7qaSu?Lb)RwuNm)0mm; zD6v%Xtl!Q%8~-A)Xj3tz^wCDU*?W)m_yBe!V-|{en%$0WW}XM#ZE2s%c69(|@MV!? z3IYoV=H;#!hkRm=#-Ih@VrBTluoqig+O3VB=ax3|GFbdgZvX4#gOb}LIVZ=~Dobg0 z59FV@KeBr4Nnvf!%dIHxsdr_cMmeQPtH zDy>(sIUYNC>{KTy{h(~XR*p41CBCl_)r*M^%&%7t-mdD#(|PGw(#%{tY&f!(|%^%n=uZNcChIP-@yG=QKx9o)M-euwvDj}VFgg!AW#M@46uIknjy6`T4f`Y zn}6Em|1bmofa3h}foiBl@l1ESn4BCvib7~?Z}G(*T*HDGar@n8J$!X1MPs$ zMS5|lFV>{sym{)2c+IZ!>jU5b!*>4sdFhPxlN!6BYX|RtahjCHzbT%krxUFfVBYIb>RaJjZ9eC(I z>R`u%dg~un95SLrctkNTkxO~dXUqft0X)*LtaXmKfVp|j$lzh%M}RQ-cYo+}Q9@}_ z7JQhqNV}D?CauZ>Z-(J9;<5kma5@HgT#_NrA|#WGC}ELQ-!w4>l9(Wf)0o1WO&Bm! z`h)fEZOkdK3mJ7e~nz2d71#2gHp^3S$RZnAW%C_ZCA(M+RrCvO=BLb z_ncgF|AfY!J9ki+!g-ZEeXoGCfvX0h1XyGu8Jh!PkE7t9;(d;9X>>VUbADri;lD8T zl7ZR?lmU`~m>A&qad?XxH~_6|i`tmr5cy&{qDgVpHbwA}1|0wywa`FO$GueX(_-G^ zPIfgnJCCWPvzJKAu$1DJ0Oe~(;P82ZYLjHI=>?dmZWE@$8hXHGWj_qGVx+b3;0&u| zL1+jWIBFA({Mq7A^;wevNCDoI7PPy9f`SYN;jOsdbMvoGhZKS2K@`{vn}F8m3M7Gw zQdSBMCMV>a(U0QpV2PF^>{G|i=^{8-t1Y>T>u7xEOQ&}#ii*=18Gp?6{FB(?VWf?+ z|GC>1s%RQM(9riD4 zes|vpOX(Af3#GoEBLCn7Sd)C8$hP9o`)=B%G;}QDu2o!bSDWd-sYGc#W20$O;cN7U zdzJ}cfDd#BQk?28E-vLZ%jY>hfuiy3i+M+oIfh=QR#GxSM|BUR6{t{YM()zmJ!uCw z@F?us*4-H=Co%TJO&PO6iX(gwy$y^wTC%;(pH7eq5ja&BLT+(3V}MpeQCki>QMGWZn*{q+zL z(fm@PJh6Mu&2PDJX7w^&r)lSBolwy^)8tSI={X`W+M;{0-XiSLf5@Q87XBXmMCt4K z!G?2zmx#uBaiFJFdMaa9K_cc^Q1r1JGE_fgk;wf7R;kYYZ8 zs$A;p)&7qtSC?%^cjaGV8I^wLltkLW#p{qAM}iG(8n%xpRgAXFPTPZ^;0XRgni9*vcWd3 zNeYVtl}$M@L1&i5srsqScPUtIawKk26%QiHX-on{+&RCqsgH3ji~hD{Zd9#8!(z9y zR1`_1K-6(^lX)BQ!OWQ8lv;O&vXnZL;;)j;V{E7$!-7f>$W4Y-%HE-rE$cwkaD`;<6(UYw-4i zv7SwWMntm0rEU$ucCDmAAuJ1Rd(Pq*KJ)uorPrvo10bBMA_S382}?zYse{Nk*;tL%;a>dL0mm~fLBLCU1h&&E!#c-iU% zXoiISdV19n0RuJ$iz3EKCVwv7*QG0JBa~*j+-LMp--*UN?%bX_XQIAhR==0d&M+n&Scu-T*uVg;6uTRdj8qf^k>&GrrgS>d~_Y* zS}704Y^(8CW7)KVSud9EEHO4+k!;|&?{z@hjog3$Dj)|damd!o zcehEDJEIWa`nTOzSiL&%%9Sg-^gdIIl=uOICfY6;(xl6lmiWx4r)P4hAun#8d+EyX zx6{QPY;8%518o6F3I>CNiz`Ei`d-^u(ykyG7JwYOL)fA%_wCa%voASWXnyYedGxb# zq5S&l80!amhLR}oSAh}%0kR^TVQTP13iVZh2f+R_haW!djY2qNb)(a>6D2{Ii$xX$ z2-eE4yvN1n;N&drb17>dDsCToaDsl@_7d<6Tys1x_yW(i^Uidcg_F1|uTC}%Y3-_I zx(T-yjTDrUvf0vaq>EdeX*`{oUdkGP`j>o>ietN{#kZp5hYSv4)QGJeYwAY#ubAp| z6OSfSBYsAwsJUptLg!|ee>9VyN?Bfi)^(*Dk$6<)uZKRu`0s3%MYkM66ymS@<1cCP z3NMt94xW<3sDZu&zB5$<{Y4)J2bUA5p{y(m^g(9>10GFSM*S#6=3HoK2?oAm=l3cS z_bQ6Zm!htC`=u8hU}IH|HK7Sq&Pp#{z1oCw50{p~fCABRtw^o)mX*tw`(TJjGM^7d zWa56{{=wbLhPEgq%VcUoSPW1KGSXo^;_m`I$GK2zJ!_dVV@LP!FBKG|r2t|oRNjZf zlyn1w4NENNAZ-9O+VIHaN^+yCiEzKuOYNFV6qBL##cn{rW+=BJSPiV{&LgTX-chKX=@6xZE`NrOln z?yxgE6}H&RilmETk17r{D^iQ}!&m_zUF{nR$Ip`D-NivTtB&!3fG#c+w~>37|*N+p+C)eul@5BVH5i!)nQ+GDYCm zD6;_U78e1tUQl^Zwkky>pwDsXeJ|npG!X$@keN`%Ey}>y2Tw|Ielvxq?^+?P!q_oI z3=vG5yvu18mvX?4KW8pg*eXJ}yg3{qXaKCq&j1{-L3>oJI{96dh2b@l5htOlYVq>- zwW6QG&?*zT=Hyx^07(fJFhy6D|G*+`AtO73fq|wo+{lqGQC#Ruv>RtAEEf}%}4;x2Fg=D|VfHP*Ny-#1!4X9{Lr94ZiN9{)R687&Icisv)aiTss|M9W| zv_F)E(-~daUV^k@y!?u;Wn);PbaOzDGFra>#ApjGKyXXp6kt(2XE|nkp<%d54 zjwAt&k@+NSTOnzq)R+TSVUQLLS`&oLN!6-|agmNm>&@KiRqS2zt0LSonC%&H?&kU5G~(*(}$1j3++CP2fa} zaT9}R8$}CFZ(QSYJS&N;!Re3-TH-N_ii*OEE=5l`0};0W8Q zOBAN2(Z=IkXz*Xx*7BGXW<2uvc??bf#9dfJuS>Z)Y0Y>Gf7O$`-b@%v3v)L1LDcRv zMH^TOjr+z%ABYqKOdp>&6rI=Pfb#_s8)lqcWo2b;-=S{=2uxw?kapuZ!a)a63Yw9z ze%GQ|L1hx}Yyd>5cDIv zuhU@PRbNBIblh6z-Fva}%2npqXoCRMQA|0c@EZ>vOci8YiHHDNea814**$^UQ))jc zJ5ArU4?%&)4D$+ZE0F9mI2eG6(H-F4Okz*`BZ^RNzce}k!2OZ2=De87l6O6hYpE@O z-h`x9)}oXv51xejWxyEmSaFb=Kw1E}kJTrK<@JE)fIG&wy7fJ(A4J1I`be7X1hwl} z<>}@DQV1e#V>a9uot>S*>#3iEZS4B`6I;jUM;$55ke+rF4<<>?Dtd|>TbWTp;dH^` zbwmo!d|Ad@jE2RyV46(~AKPAzCBnkO7op)oEJr)~GV+Q6|A#VxBwxr%4DPuLT_W_K zpS&kMuW#@aLXiR4=_c&MsAZOcV8xVbi@Vx4YVZJ|6eP6Q$)fE2dqFINio-O^TF`^1 z=F+3rOx*z8>8{cx!uF{Sl>HB8P0ginsm$(zg0Z#`S|Cs({+?I8c;11TYSX{Z(1L!C z&H}KQ(k;K-!$t>O8OV4Q=F+!j)vE35{F4){f4)ug3c&V=TfF2@{dgbhXUJP9>HOoPgp;;L!t86m8Yxn@Kw8zPeh3TgoTmN-jm?WfRLg0fTK zrvgY((sAsJZxF;1P?-R}!lg(RDHYZb>{&d{x8S8|cyy1DxkgW;9_DZ0HG-LrDwbOK zp>@uV+G%9Oa(U~jj-Tzf)`+G5k>rcj`=yKupIcR`*Zhgu8TFjX+9Kr}Z&yY3pLI*a zhkpF!3^K3->U#pvM^=0PIc~?zD8|Nc7UjzJbt%^bz7dQ7vJ-pH`;3K&$H%gyBVV+i z&AnvTnwT#LoEUAvU5BSA*>NCIu{r&NoSm~XFB_K_C^mnTylCX<*l2;SmkjVy&rw1v zW0uwXLiaVWvC!xwJpE%HkAsh0$mE^LMB>Z&b`!jTa{>7Spx4F4cl9qa_xFa=qI`X6 zmGqp_eLW7O^))oa{0z!KB9k&^1w`>&fJ1JESQs0iZ0qRP)~>&BE?gRVD;#E8KTmG$ zxs5rIx~WFd)BT&;Ka6**6*!Z_ii-DI+(hp|hL87nrMG{556UFJ_xXbT_p(2g0*6)Z z2!4Az7eO0@=tD9-mF8Ua_#RR?$X-QBSdYiQ>9`e|+g)7j|LnmKN60n#To4sw>976I zXb*X$b8&LE!4BVM->G$Mtq2W_HuoIfL27N_B>&(bQU|`N0Q*7BfupVx%*+tbu{NZY zmkeO4M)0p`rPGptlb{b=CwcdT;vS^+Va~Y7_Y3Ed zTFovrR|^y(RM~;3aM~;;hb<_{gUpmy_(Nad`-4zmbP@PWfe#~EO%56fb8u3gfeeL; z>5Q4m(@S0T3c}0U`DO-y_`%nuX67Xv4%qQ(@6OBJvyA3TL0Q3_5kA)nYlRFds7?kE zip~h{@wa-I4C=c0i*p+y|7_zLRrxNZ$F=&;*ovD9T`Q0!0Q%hRVr2&-(RoxV`xom9 z8ku4&-aGDPVD_VV*94XMLilG1tt);KTe{H`^_g-p*bxrBa8S&+<(ehSAA%7Rk7f8j@Lr}@s8uP&v$rO%`1xY__HEmcIKT9(z!7EO1z>QUAcG*B z%8FLPr1!7_oBFu!KrV9dQj)|Xm$e|&h230EVRItuW)Ph!caSGRl$@Z^6H5lLr z5=VfG!crlT_$MJj0y_l=8a!+snDEB^Gs@oT4nn+fCYxqgSd$bJrk@ssZM4knocz4u>lsT&Eq|Krh!{bm5dHKI?lld zLh{cXlU=4rf$1-r^ui|@NBn?E`Nv}b{tPS*wiYCfs(k!j={}nQTn}>{gL`}JQ9nX! zAYH)b6Kwm~e}5E}6_EcqKX(F3+=2(sTT*Q0wf#|l`Un0{HA)W2KYh)A4?R7Q zk?`;#54g6oPs5UNy(uG(qDU@YX|C`=~%-|0+81AM4+S7t0Yj|tbfY`Hebe_D?g>VhkXHTOyLUI$FF>o& zhBB`odn)00|W#4;XTRF|v{n3gdL33*=UKW4cc( zR2o!ap(vzW6kI!`rwpDdbi+KUieatkXE@Xjy3dXpmy$-0j$)EvD2)Wu2UigMnajic z`tIGkH!I7_%OiXoQW(x)EZwjyYcS3M2a-;P@3UM!6uXGe(}Ya-Zr10iMwUiZQS3&_ z^*fH`87W^hP)hy&^^1(pv9YoKRSk>fhqsI!+=ubh<3};}nc=)EW@IQRN zg7jv9i$EOp?5>7XAPWL}18~OYzs|KHX8zo!_H!Mb8m2iS86qr;I7H{1K5A#4c|;_c z!d!+XTdT$I>D~fVQ8F-U)BM=8_AYzf+kE&ooUYz7{mYN@ribnaSfODtE8#xmuQyAa z6JL%By*%*!?sLMDC=3Pt8R4>S116{-(O=(X}a54&{_#x}}($^0Hg3~bfby?aGz2qy^{W#5aZfs%f;HfspyOECzh z)M-bvZz#25YhH8`id&w?%oix}3aPVg1;GJX3z+qRV4=YB*N}jyPUe0Gv+WSPjzDO1 z_PC;YH@}vitZ2~h-_oax<6bgv0$M6ER0@iSP`i`-VV0yaWAFQt*g9(aVEYB3Y`=Q9 zVYYW-ZjG&C8#4eGanv*0%%&17&s@Z2kCJ?B;!jlm(q)+&4>R#$=b(sNfMaXD|BRoO zKfU$4jiM03Z=W~?169mUz&_%{GlV9SXT>~^tSefxZc+#jo*}BU(c^R#C~-<7gjAI> z01_ME;HB?^s(bz6!__w}Mu!ZpSX~0^Q(9g=4W3Z!az4*ITLO0O0thD=Eew4RHL#G+ z0X_t6^Znz~gZKG8=cSm!X%BM`2X;TO8(1D_h>w<-bP_2fLT19fquN`rKprf7{&~|Nh zFW*cojsJu!qmc(}j!P_^yRGerfDehKYWn1?=gDA481w_c9lWRpbq8J*U!O_kGG*#F zNQ9l3q-B?%S6Br9RiN$t|Ad|2_6$>`UuDwy{|C?+#Wv8yUy1z_=aWTzZW}KF$Aa({ ze4Z(F*{h8o(g>dKcDaIB798HV%nSx%MOz%#CRJQIu!S`qnn>(4SOEZb)xixV_U)KL zrc-g?P?*TGeWx4xHo=Q|x+FgH{pk=>Hsk1AL0oS-uhi!IAc~0tts%z-(jM}F5Fm*# zT3eiXH0}iswM{Da^Wfg%YoIY0dXJ}5uiG_ zM=N4`+(4v~b`^II0~bST+vQB(kR$L0z;CepSpUkqRq&^~ckA3Trk8<$0hYfI(^H0~ zXAR-H$G2cmLRIF(mWZoGzYwuC`CoW6?5Q9Y6xXbge{MRB7ET5K%zz6>kwy!*D|;)X zTrk$t9wMs6$;CxM1;DAX71Z`7nPxKH*ea6#9sq!Eeb42oFo3F?K%1ch0bo*lw_y_) z7pTLMpJiZ~qmxzWDc<1-84`FA$u({m=~-VtvfA`w9uD?tqQ^nWyQUTH2jBEgm<-F~3RYz~M!SS7k?nK#@<#gV4k) zLEZR|>Sb1Ke&*}WhHs0LjhD3F&j1$?b*}2tmj3TQ=Xl8?GX*b2v#xERLXpG_xnj~~R%KPuy-7WZUcuWyKBpAvKb+ejUq_*pplI7 z*p88*e-?NBM9#r0yQa4|*2~bBw3PTw0g)@N`aBD8sJ^~#Wk&((bxu^0CKjGMWPv58 z1ExrSN%cNZc`RAWhxZYQe(bp?mv<8ydKwRQWwK2C4+8++CnC4RxgAk0D7JP4H|lH6LzNlE1+sLwu=W0%7?^4hP|H14)oDzJXA{P z|K?j?%fiJWRob%1sR1}qoD9SpL7GvF0W<4UNAZ{!_*d83ma0xBHFpFL6$~;?T!xz%RnChdbu{V6%-_@bZ_EqO92hWGkKL~&ZZZ0AKNdKk)hGx7^SI!WS2vaG}7v| z3;tJgR~}Av+V>ApmdZKD7L~Dt#6dzdNJ6$$nv8UmEzu(T651Sfl+r{F5fUS$%>4-udecGtO_l@9+1seGOsoCoUe~;ZHt< zpy;jwp}F%W8A=b;CaY^uETT5$Yp?1`B)*c>4^n(?Krs+)TuQ+^&rf1|L&HIUSCCUg zs_A$LH(Y7n>>i*}f+~Y!z*mJ4Y=ipbF4vFUhY9qpot+w2-7Qg#4^2e&gcDmjt{7oi zHgA@}IS}0JBavI6ECs}dRj?I9?$OZ|G~zkom6X7~#*Be<;w8i)RD@heC(cmGo6&v4 zQN01h>meQ{r;nZfysA6(0LXzNcMB}ATb%)I?<4wR&jUy%Hm(r|HX3;<16quwHu(HBb`lc^ZXiVCR}7e&QHX1vo{ zloM}ah_@g2u#-M>vBY7=%O@fxvY%o<0;B2A*qi5&hgnWDupSN%`}>4c#>K~@f7~w~ zs1hMn3IPyujPVXAH`x?<@4fQoWBFLwAaP)$46A~oEfzi>G;^zFTfGmtGcMQ(>;@u? zNi17LYJg%V7A+!yyTOpoj8;(eI~%JlejScsbXuC^eso{LnPbfWJAn3sjDZ09tH{r9 z_pJ>b4#~6W(Xs*)1#uXLBPx;n4Wo4c-cQz?d6Aj|mWzztMb`rurXuVbNi~4G1~-?C z`)pn;!M`4wKav{;np7(K4iV@eQV~xDaWIB;t%OND@yrhxWX_5mUkt@63ZBnE|oJv6ej z&_0&^+GgBt?#yTa`R1^zW6`fh_AQAAAOoRs3s!I0k~;o0uj8G^{@g}oDeQ?PBoW=+ z(7LISbv=PDh%Uf$OhViyB1xcRwVrE$UM6mlPe7$W^t~cy9WcunR;;a~^IPU+K8?2; zVKHX3(1vdJXTY_f57g4nnTA}U7iSOHPz)mep@9eTisLTx&rH~SNwa|~z)BAJ69Jy@ zNGFgx1(5a%MdP!OY9VrM{>GABFNet>ibL2`?2WUeMgA(RUR>82*hZJQK= zQbju?2hb<5$2TW`?GGqcd<$7nOv5Ysos699KHYY`Mo!(!*f0hk-ub(}w^xIt$AW70 zFhV0eLcLSfZ85(}3o>qcV4uVp=d+r+rPH^JuRhH7&Le}>k0LtTexg&ne6Vt5Uys5G z!GW@|t=P&UvA=Ije}`~80SZ#CbrfClPtA!+Uj5Z9zl7@H;1N4GTO9mFO_axJi*fZ= zxhub_p?I%$HNAuqJ(;=E)`_xw5<9MGT7oO|2azT}fHBWUVgTO4nlyigz!p4A)OM^v z5T$hEw4D1`kMl5{$Bpb*d3o0N-OJkgXhM9}=$v)ccZMg_3uLq`SH55A86ICJK3e7O z?Y+2X#~ZDw-HoqgUqd-;dlqwCLO#f98$Od0-WOjJv9|)KrR#6X3*Gwg+6iNcKrvXb z8=SO}+`2~yYD?nBp7~v&1|vEdLy~Qgb#{*iRyB%Uh`Q~{3s|!8A6L)&=~&{3)x*It z$mTWg7ag70i5X1)6F$opni->ahs;|;YLnVgZMQ|~rhET4usApI=CcoQYW0K*C-|}+ zZ&-z=8f1=0MOQpQ)Um}82U5sDr_3kLPJQ>Q$y7#W>Pa9>4X;kC9JjQzl=3{KPY;_j z%+|YQDZ5^^$5?8xOp<@Ef{^Co#nk8#s0r~%zNwyh5JG#+7Zu9LXlvQQP4+##!AP9-TJeRUer32y;n5YC;`FdF^e;jK-(tZ?(xPs7?0b7g0-uOV-DZOKc0%Bh z591zTiixj(Ua7vmezT#_iBVhSvNeV1NHy2eYxbp^vp0<~uesfFFB|m8X&Ez?YAFjg zSOCxfz{L!eE$jD!&}5ZeCo|}hS|?_A$tyZz{v3@2Oo0+bg3JT;>#k6-7s{rquvMiX zX75jIc|D|b76wYeIc6AS7BiR`R(qoPXUP8C{4U$)CU`NDiKf$`Q7iIL6_?D9%}42j zEgY{&!JUo$j~y@nj^L8`@Wz}i^AZ?oe+7FtltgQ}lnBJvMdR56uIK;jNKnhuuC92P zQ3?1tutNLybM}VlccA{ElIP_)m2xZ2hSO%9{y3y%`Ru? zg-vzDZq2b6yq56$7v zk4$%!Lw~SfxDfYXi~Ei{{0FsD7XR@ijfhy;I^4y-cty-H>zH7g+^xhs7OV{x*$^lA z-^w0xJHsA(!W_6dGzmEQ9NjY{I2a*Vm7Y5OuYaU5tSff}->_8i(V(t1Dma**)(!*Q zuaR}oK3!bhUs*GMQM04=ytq5T!P9WA|LwHqHEkTXvw%Oafst69ukB`UFck&dBD`w^ zumcARgn?AnbWRd2Y3tCJuOvIA-V?hO4VW(`1YiuF*fhIPK=}Y54q9mJWQPE1y8iZR zH)5=bmI2H;a~WtMJ^Z!+d^w&HILeUeLhvNq6S6lH?Pfu7zO7TP4Zt*3diMRgUM-Y; zM}FTaITj1hiUEv|hM~=<%4^Gd$-HZ9G3bENsGY=Kg&mqp#%kcufhLj!w1U$7+3my? z^7dZuwo~X^QHFuZl>z??C1tuKq{1BR~)A(Ue{cIv;>GT~-4DQG>K2X{LAr-0P zVMfDRK|t+r<6o6DsxSvU8sRqRWaL0dhdvLMCV}H5W)72vk6m1rKIU}e3w^MxrZ?hk z`Imv!K=m*vQ*L<82{f%8Ys>t&m4|Oo#c54PhEkSXnNlOA87_I8<%RL$&6rL`2w3dV zxGc2zU-pwK4f;3YKEy5pK|@dZ0PcPb!foPl)*w}UAB3Kfhy3NLqiUpmBl1I;hq57v zLtYD0lVfl%_&iIiDshA&k>Jrntm|+|hYpEfhm=Mhr3sX4s7?qT1$`A9gSnAzq8>`f zg{=|Xg#rpP2fv~2d+Z9w|Av{OgM~E*umg!ZVkDg-B{FbHlK%oE!#xUBEh13NQKOD1 zkW<8khpPh_-m-e#AKt%bp%g|;sSur0)>l9dYF$I0jHE5e(4ATt2(eG+$73(|IBbC`E87P#MNq zdN7ZVi~f+bEoxK}DM)0V7OF@1Ld77<1IApR*kOR1cjXJcrA!ibF49yIS-+6ZUeM-n zzPkp<Tm4ntn0-3}uX`yz z(tED8N3pRFc<-_WbB`9)^ar``c`EZwF16{V{g_(SP$#&TUNTl)MY-G2_$c`^P+3L3Xzh-!8D zM_{ZD?Tn|o^P%QJS>?Z{BDOv_BQP+qCVZCY9%})TIFD2g=!ju2v+G=2+vP>9K~5S( zK@H17+u@RjbXqCn77u3bZ-#ggA#}Vj$g{0XXOpEegIAG^i{pp(<&tj1D&qM4@kyX8 zz7IcH@?VH?$#Y}$&yX78nZ)iD=D^Ezwb6i}kTj@qagF;J&92&z?BgjvUliQ}U>J!3 zurfs6Q)Sit=FP}F3@3PEVxlWJq`sDnjL{QQ`r@@Y+C$J=mV5#_hZPgJttp0EX>yJq z@0i7dNe%04K}lhtEi^W(f!a5^@JXA&>fGubCuE9Xd#FPdqZ$umLB$!@0%F3v@0Bl2 zw*g^OJhl#W8%j296O)t8&CS_j2ZD;3Aj#0!cWG2D;xtseiRU!nmKJn3Xj>Bjb6gzB zj!g5{M-qN$f(~#)ngv2!onUE1X~7M-gWSP_Zd*-@m!tcjY@Qio#)r%qUvp7!q|-Uv z>8?_f5FsW>G|rIcfMG;w317_l+^1aR$t7CSA4R+gOpmCcfWRYCu&A=-U<;;3~E zg(v$yZNr1qkbeieFEsnmcbdvmT}62buF4!{j)TG^iN;m5(M_?#ZN!`VWat< ze$}zRJ62CDKLQl=+Z59D=QyY_q&ZmKeRy~3c`bG-T{RLY|NXUo%1@wb^ZNh$sa*R} zp90Xj2HmqL^qEar21FkbhKb@tE^2Nb7*IETvNv@9G?v@EwYS19w7a?ms0zs=J5=wx zl>&{Gsd)-wXEFgP0H6Gvc*74mCmQghVVKWQGFkKrql+>B3JgbV<)q)EN$duwwYU&H zA|7G}rS#k9cRhMSEz9Sdxp3oW9fVFFYEb6n1QMYufiW%B)|NL>%`)PQe6AXN3AxKD z4(BMqtt@;Y$VO~^64y5t#hYuz2o;D&mJlkAA-C<5%3f3~q}e>X~@>RpVh!ybe;oVK9_ zDbbJ`D5+>hA-kn#3V!R?qov$?UI;aTq*FvxROvyOQ97IQ@I%P)Re4~9!E1rhtCAaD zTh{ie93a#96t2{!Tz%#)m7q~7;gq37}Ua%R@ z$c9|J?{Kq7#z1&w)2*#7 z`l4yK|CpYriL9<-v4AQ4=*j@6v2rt>**T_uf0mySyOlqxTAM>e5$< zT=>Z3IXW)|VZ)-$_V)JRM4#^7nkcp2?P#XAOS|o+8@{{Ma@*Ag^s9NxTZv24ZNZ>v z%-Qz#bh<=R(!|V6+mh*j8QA@&&*bk`*uP!&{_YR_e_Epd-LWcCUCREVW6&?wY+A;rbB;)fPaO zX!AgQ0|PdeT-ku)GzM>+W+HPV|3mP5)B8tjDLCHYDg4M)d+}O4hoG`KJ~JK;*^!S~ z=IAkdrg8-`iG_!_P2d+sTTfg1I+5~daIA1XkKU!%Vr`k?)O()#5^2JMCy21{G%@m@ zE1o^RelZK>IAN1{gz|kDf6(*6o5h-nDBF5cP?`MI@cB>zfLMo~u-d~$y7Vsem&e;- zOQF$f8h}N^{j8Is(ZiNK_`p*KS|3oRR)xF^>m@OJCKNH+B*7@sCe-Y7y(eu7x>O4= z`O>*O7u4oY6On|;m8T}tBWrgY zpdw#z3Lw zb)E@+JAUW;?X%B5*V+FZF5k;n)|_LGImQ$Bb3gZ3PgIrV2=Qs~Q79Clg1odk3Wddo zLSc5};lgi-7o{J-Ul7)7xE00;hk+E)I)0}4gvi2R2! zYQpG>Le0o1NK4#t)n7R9@VwJkEp}MD`BstjjjoA&TOv0$CPssjycH2CWgru!O%T(h z-&=fl&jbw}chO`~vxZ*O_;kAvV{PwcHg9na zFEWK&S-jH=EVSC#;_4j}37mM{=)}=50@r@h{3$~{MC4M5Cp9#2co?+n+UUm7;PoxV znrg9_BZnaL_@_A7kB}7kF=xP{WkPm_$k)L$8GnU8K$gew|4coZsloI!K1{3w$ zQPAmbX>oCJTj#rP6u1Erg);p?^RFBGkolDj!83noSK=8DrC4k29$qd=CG1^JIy+Wt zTMDo8;RW(4ePgw%K3gQg#zg%kcrZWXA(6hkuT%a*Q~m@?oJaY6Bl!HozM*_hBRd9V zLrx(ni)Xb6g#G2b@dQ)a`Sf;@&gRP`8*kPT5~I|9|D={r?zCsaw$L%GnC&>Ng$y@g zP4&Q1#{yZLkP1Dg3dJ+y|LZwSSeEvUU|zDWJAFx5vQqCxY5@-(F0}|LH$Evk$G2gF zUP8#qh2sn}EK%w+htnU*mdb-=Cupqk_^EqU^DS13>mujN(B^f7D%XYI*6h7`Xeb4X z*n6rNPkHz|e;Ur1a^EF1`><_2hR{M85%I2xZDU<9tZ&wXNvX9es= zdIm0u4LESQ=+OnF@(e?=Kz_33-`)-ElpxQT$e z3iF`s5phv3`-iC*4{2M#+6nb8=Jd21p?r>tw-19V5&Qa3jO-s`N0lMmbPi>CGRJ#O zBvTpjHrGsMD7#)-`@Fb#f}vkB4g2XC7io@rLv)1~U_NLTn8{b+mE`6Tmyg>#1;@X` z;Uo^A=@xzU-Q~w1_upSxvz|%zPUd1EF+5p10^!><;s@de_?_nlNDvcMmAWrg85MwY zs?e!X^Y&YT`_&%#H}Bc1ihi=)K77AyJRkgFZC*Y~V^8G){4esWT$k0=o>reL%RSNd zXd&w3VKy|FugMwi7SC<3ED{$^r?8;W-jCLrJ`YqpVCSo;A??XjY7PBHD!O5Q+5EMr zl_2svMw^{76&w!=niH4cT?h*>7=Oie__2M8|7eevVu1sNl8$3q?RMbW80y%ceiBnS z5k<@G_0thmH|Sux8h>;^XfiB@bv7Oc{?zV_jg2pq7omKYm3KJ#_U)upyL6AFRZW@31=`{OWy_C_W)~BXg+t~a*2R#OT@y}#W_KfB{9Z^UH-iq?f z?o|HKfJwdAT$j3M)yz~f!ID;OK}EawDFUL&sM^D{v26WC7UE}Tk6tlwY~0^I>K8lc zv+-D8N<4)sbKH5ZLPGTo9?;g)y;L#9>E!gvafaq_L&ayK{A{kly$IO8orJ9-_O~xe zkLIStnn$BHcZ)~#4L|J$^$qNG>FaVJMYd;g+ek0;Iim8cZ+@`Vp z)1;Op=sI7zU(0cCJ0QsF?63}prl-pnm%=5N`F&PKWQ?miRqxxq5j&V5KI`mG{}oN8 zX*{z0;{ljOf%bcQH|<+AzdGIyWmK~eb3~U8?d|B7S1})|Z4=iC$*7zYc9e0+OOdX4 z*&QqB+POD-wCW&SIeGuR_k$a6eSW!xGYaYFm1@6#E#$%Z$$H?*D+N}SgmA=eEmyC> zhYZmf^5vY}6i-%-Tc>tR-?qZj_ZBiAofy|{%4hOR#;_%bHDQe6Y;e8zmZ(0bdFaUU z{w#Z3T>J`HQ$*E(cb9Qk!NJs`Zz=PBOsn@~(HIQ#HE}`7XXqkVZ<5{788ixyqh1z1Z$k}i}l-HmvEBt{nZ8hs-2E_ z-z|ak=&1C1g*CqUF?}wvWxPj5eqGFRd%aGwu&dpx8m&AYqn4h<^USC^_WWw5q@q3} z880aja6G1@S-DElhRI83zwV7i`-JR!Lg26uE?Z=@u~|QS@9K_Q$D*bx z|K;CkH_IB46u8`JS=qwO%8L7n)1cwq*H zh%p{fTa&^mx%19`XQ$OebTd2Pih!c>?UzZj4`YDCGEuOT&rxInCt22uc^OBK;UaO0dO{&Pr z?dKkj%`V%jDm~RHwl4gVL;nZsysl6E$@7ymOi&uQq%oJ2TY|-`>xKs%W^h)z1z-AC z;~){*d%dPHM3@5yuHcTdpqamZ#ssT)KCR_(`(7EzgKj~R2tZVZ)(a&mqc3pPL z?N>eJg#V07t*u{YG4(_Xrd9TH>xz!96{=iW0;5k5aXD*1w~vWL^)LpV^ii4hll(`h zdbA#P6fHERe#_9D{%b%OV-rNE_Pe5rRUuzMy~f4)=Zt`jb)>obnN3^!8G0e0IS*itfvU zmtSA=!Ut21KwR_Yp0*E@V4`yI*0Zdym3yjduEHy>!d9Q=(9FZF?>UK^nRTr~Do1QT zec)VPVjf-$F0yiRb73T#tK^3_zJ;z>5-t8|Eik0{%4Lf*&p8nw9$DV9zChG{z0nc5 zvLQm#A@o{@sJ4!dSLF4C*mGT1a@l8Q)n~O5Ki)V0l71P@^$yVd10 zDQO`q6vBO;x{HaX{?j^#{ zQ|LD4p62N{+CKOHr1*+!C;ge`E|~CLDyJtyi`MIdFSEW%t>XRQlRJjayM;(7uMZ%Y z_VLl)&Q|f_MuKqVQkkM&c$BkO;I_mnWE=1K6dE^ko1A`_knMi29jb2OT+xBD-X5e` zwtNCLm>Y-=(M2q%btH62%NX(_e?=^7`7rP;@wCOgso zi=28jf$ci{2v9PFPZvZy+vqGBC}9E&VVjZ{yi8Sh)&^EOAWm2~NshYlvk zsa!WUv{t+FqPX2AAA0)y+M3ytO&u;RI>XJR9lCm%pwFc#$LzO#OqKNo!y^Z1HcX8ITkWG)0(y^ZYRlQY;W90(g_ z-aOrd;KyFe?=d>WT+5H+K` zgvQFT&8X6;w;@aQ2&_w-_9@>mpzy#dnr&|ZRO)ptMWV#VbV;#ja*%RuRbByO+{$J# zxCCOu)3F;@Ro~Cw|1-dpq+B`OJ)_7rpyP`~zXi7 zU`Z~LLBcd|@l%NvS^X=tGDs~)&?MS>;UYSxh9Y?@kr}CDXvC!@0vT|fc%n`4NDQTi zN;s>7{@y;Pm?)Xr(Je(R@mpv@dh8|{Qkr43ut|$wvb{xPu7NEX)5UY=Z%IOifq8qW zrtjuOG@i&GZagoGD=dEtwucnVhSGr*ud_PIQlxl2m-Tw6{?<#6)cns0mg?)>?wt)K zc@SK#^5H}DpK7E&Wuh^}#^Ww$dSG?~lfj8YZH(lC^m$yn?^}hJ&B#uGmsemHxt~D& zQ+er)?7e{Rbu8lIftN4~3(n(rk?f7jM@Sb8UK={ltDAGgM1{9}&$#F)K)2=~L4ra> zN2lBur^+)X`X{CK+}pI1uA12;<73C}Ei${MZ6{Dg3Innyo zeWDkJR@V#W(*FrRa@Xbke`W&5q{$)@&Wh=mmJPC^_!D4it#oMTF6ALFm#a^XjUg-G zFY}?D{2*sZoe1ZanuAs_mdM*r0m}cJp1DihjODA(7#A*#e16P%lpNDH-3TSKyGMmy zW@xbeHc@f*grs2qM;uOBw1rjjs+y=en^S zeW@ajXX_q(9xwEo+yx#xZfObM*2PUB|Ec`iVT$$%YIrJ)H#C zs!(HB>-$_UTO}X=BkS)cN;v?paPNa%XejsQcF=jmv{NICh(4Zgpui|?og%azMk~1& ztBjdq(nhrglnuP*`;2w6aW+rG!f=EcY;31iX@~#Bijogd6XG_tG;f;Skvo3gNDQ|C z2169Bb<`Lu*XWRndQpcBgB`9BF0=&-9*o0&sLvB7D-x0HYe=ZXywz+;9?0c*<>br#mk@HuUE>) z;X@g6ub3npPx&AScIp&=W|9I%2fWrqf39DIe&;bp4b7@0!Itn|TD`A9e(1zkO*8QO zBs`IB(E6Vj&+Pg9rYre%zBz!#_?P9N>Fj>H$~7Yhx+5GU6Q1b!Gpgk&f|?m z=CWPS3Tp5rup}cR<91y!l$Mdn&PAb!La?;*bS0FOA}Vs^1}yo$#obWUTj=l0)lxGs zh?;7RO8fXxU2i0lt#iINTVtTqCdoa9!SvdjXD?m^rAUP|7!_`NvZh<;=<0@l{CF+t zVE?qUcRd<;*WGwuzlihVB#l%9XI^KUY35QIw?;O9Pm#jHy@4X3qznoVKQlc&eO^>l zAI5KLZmu^eni%z1ZccO=&Cbg>Z|~qxXgeV}Ju`FR#*LD8Q^|@?MJDYH{x}4NMT4Gb zWKXlaCSKd04doOSow%8(9AZfP>MIV4n-iP*<<6c_WRXJ$5nk>p}_&uREzdVn!lYxhQZ7H4TlPUv?YlyT3QwU*Bd$iFx2X~)Ybjd-{Bak7KaPSTXV%u^3w_tz>~0?pL%O9eLF?H2RtoUp{~C zUsfjIWS3+Mx0f4Rb5nyIyc-Ry%1}GX{nZ~B3U4<9;SCi`I@(7l&;#=7y&A#Sxnf8cy2uJ5soiAhF9na-ClUsQE;ayf~zJCtPtTrL_d3>2b# zJ4N@-WU3@-+F&|z6AWk>cm)Lq<0c)%!e+B7#RWDsNhhhjkBg&;ef4Up=?S?vR&b

Q6ClKTIV+OgmOKg67!rAD8SV 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 diff --git a/BasicOllama.py b/BasicOllama.py index 7875858..fc7a0aa 100644 --- a/BasicOllama.py +++ b/BasicOllama.py @@ -1,117 +1,33 @@ import os import json -import requests import torch import base64 import io -import sys import numpy as np +import aiohttp from PIL import Image -import ctypes -import platform +from comfy_api.latest import ComfyExtension, io as comfy_io, ui as comfy_ui -def print_colored(color, text=""): - if platform.system() != 'Windows': - if color == "success": - print("✔ SUCCESS Oh🦙 API is listening.") - elif color == "failed": - print("⚠ FAILED Could not connect to Oh🦙.") - elif color == "info": - print(f"ℹ INFO: {text}") - return - - # Define necessary structures - class COORD(ctypes.Structure): - _fields_ = [("X", ctypes.c_short), ("Y", ctypes.c_short)] - - class SMALL_RECT(ctypes.Structure): - _fields_ = [("Left", ctypes.c_short), ("Top", ctypes.c_short), - ("Right", ctypes.c_short), ("Bottom", ctypes.c_short)] - - class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure): - _fields_ = [("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", ctypes.c_ushort), - ("srWindow", SMALL_RECT), - ("dwMaximumWindowSize", COORD)] - - # Constants for colors - FOREGROUND_WHITE = 0x0007 - FOREGROUND_GREEN = 0x000A - FOREGROUND_RED = 0x000C - FOREGROUND_YELLOW = 0x000E - FOREGROUND_BRIGHT_GREEN = 0x0002 | 0x0008 - BACKGROUND_GREEN = 0x0020 - BACKGROUND_RED = 0x0040 - BACKGROUND_BLUE = 0x0010 - BACKGROUND_PURPLE = BACKGROUND_RED | BACKGROUND_BLUE - - # Get handle to stdout - STD_OUTPUT_HANDLE = -11 - handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) - - # Get original console attributes - csbi = CONSOLE_SCREEN_BUFFER_INFO() - if ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, ctypes.byref(csbi)): - reset = csbi.wAttributes - - # Set color - if color == "success": - ctypes.windll.kernel32.SetConsoleTextAttribute(handle, BACKGROUND_GREEN | FOREGROUND_WHITE) - print(" ✔ SUCCESS ", end="") - sys.stdout.flush() - ctypes.windll.kernel32.SetConsoleTextAttribute(handle, FOREGROUND_GREEN | (reset & 0xFFF0)) - print(" Oh🦙 API is listening.") - elif color == "failed": - ctypes.windll.kernel32.SetConsoleTextAttribute(handle, BACKGROUND_RED | FOREGROUND_WHITE) - print(" ⚠ FAILED ", end="") - sys.stdout.flush() - ctypes.windll.kernel32.SetConsoleTextAttribute(handle, FOREGROUND_RED | (reset & 0xFFF0)) - print(" Could not connect to Oh🦙.") - elif color == "info": - ctypes.windll.kernel32.SetConsoleTextAttribute(handle, BACKGROUND_BLUE | FOREGROUND_YELLOW) - sys.stdout.write(f" ℹ INFO: {text} ") - sys.stdout.flush() - ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset) - sys.stdout.write("\n") - sys.stdout.flush() - return # Prevent double reset - elif color == "image_info": - ctypes.windll.kernel32.SetConsoleTextAttribute(handle, BACKGROUND_PURPLE | FOREGROUND_BRIGHT_GREEN) - sys.stdout.write(f" 🖼 IMAGE: {text} ") - sys.stdout.flush() - ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset) - sys.stdout.write("\n") - sys.stdout.flush() - return # Prevent double reset - - # Reset to original color - ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset) - else: - # Fallback to simple print if not in a real console - if color == "success": - print("✔ SUCCESS Oh🦙 API is listening.") - elif color == "failed": - print("⚠ FAILED Could not connect to Oh🦙.") - elif color == "info": - print(f"ℹ INFO: {text}") - elif color == "image_info": - print(f"🖼 IMAGE: {text}") +try: + from server import PromptServer + from aiohttp import web +except ImportError: + PromptServer = None def get_prompt_files(): """Scans the 'prompts' directory for .txt files and returns a dictionary.""" prompt_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'prompts') - if not os.path.exists(prompt_dir): - return {} - prompt_files = {} - for filename in os.listdir(prompt_dir): - if filename.endswith(".txt"): - filepath = os.path.join(prompt_dir, filename) - with open(filepath, 'r', encoding='utf-8') as f: - # Use filename without extension as the key - key = os.path.splitext(filename)[0] - prompt_files[key] = f.read().strip() + if os.path.exists(prompt_dir): + for filename in os.listdir(prompt_dir): + if filename.endswith(".txt"): + filepath = os.path.join(prompt_dir, filename) + try: + with open(filepath, 'r', encoding='utf-8') as f: + key = os.path.splitext(filename)[0] + prompt_files[key] = f.read().strip() + except Exception as e: + print(f"BasicOllama: Error reading prompt file {filename}: {e}") return prompt_files def rgba_to_rgb(image): @@ -121,181 +37,228 @@ def rgba_to_rgb(image): image = Image.alpha_composite(background.convert("RGBA"), image).convert("RGB") return image -def tensor_to_pil_image(tensor): - """Convert tensor to PIL Image with RGBA support""" - tensor = tensor.cpu() - image_np = tensor.squeeze().mul(255).clamp(0, 255).byte().numpy() - - # Handle different channel counts - if len(image_np.shape) == 2: # Grayscale - image_np = np.expand_dims(image_np, axis=-1) - if image_np.shape[-1] == 1: # Single channel +def tensor_to_pil(tensor): + """Convert a [H, W, C] tensor to PIL Image""" + if tensor.dim() == 4: + tensor = tensor[0] + + image_np = tensor.cpu().numpy() + image_np = (image_np * 255).clip(0, 255).astype(np.uint8) + + if image_np.shape[-1] == 1: image_np = np.repeat(image_np, 3, axis=-1) - - channels = image_np.shape[-1] - mode = 'RGBA' if channels == 4 else 'RGB' - + + mode = 'RGBA' if image_np.shape[-1] == 4 else 'RGB' image = Image.fromarray(image_np, mode=mode) return rgba_to_rgb(image) def tensor_to_base64(tensor): """Convert tensor to base64 encoded PNG""" - image = tensor_to_pil_image(tensor) + image = tensor_to_pil(tensor) buffered = io.BytesIO() image.save(buffered, format="PNG") return base64.b64encode(buffered.getvalue()).decode() def get_ollama_url(): - try: - config_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'config.json') - with open(config_path, 'r') as f: - config = json.load(f) - ollama_url = config.get("OLLAMA_URL", "http://localhost:11434") - except FileNotFoundError: - print("Error: config.json not found, using default Ollama URL.") - ollama_url = "http://localhost:11434" - except json.JSONDecodeError: - print("Error: Could not decode config.json, using default Ollama URL.") - ollama_url = "http://localhost:11434" - except Exception as e: - print(f"An unexpected error occurred: {e}, using default Ollama URL.") - ollama_url = "http://localhost:11434" + config_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'config.json') + ollama_url = "http://localhost:11434" + if os.path.exists(config_path): + try: + with open(config_path, 'r') as f: + config = json.load(f) + ollama_url = config.get("OLLAMA_URL", ollama_url) + except Exception as e: + print(f"BasicOllama: Error reading config.json: {e}") return ollama_url -class BasicOllama: - _connection_error_printed = False - _success_message_printed = False - - def __init__(self): - self.ollama_url = get_ollama_url() +async def fetch_ollama_models(): + url = f"{get_ollama_url()}/api/tags" + try: + async with aiohttp.ClientSession() as session: + async with session.get(url, timeout=2) as response: + if response.status == 200: + data = await response.json() + models = data.get('models', []) + return [model['name'] for model in models] + except Exception: + pass + return ["Start Ollama and Refresh"] +class BasicOllama(comfy_io.ComfyNode): @classmethod - def get_ollama_models(cls): - ollama_url = get_ollama_url() - try: - response = requests.get(f"{ollama_url}/api/tags") - response.raise_for_status() - models = response.json().get('models', []) - - if not cls._success_message_printed: - print_colored("success") - cls._success_message_printed = True - - cls._connection_error_printed = False # Reset on success - return [model['name'] for model in models] - except requests.exceptions.RequestException: - cls._success_message_printed = False # Reset on failure - if not cls._connection_error_printed: - print_colored("failed") - cls._connection_error_printed = True - return [] - - @classmethod - def INPUT_TYPES(cls): - # Dynamically get the list of prompt structures from the filenames - prompt_structures = list(get_prompt_files().keys()) + def define_schema(cls) -> comfy_io.Schema: + prompt_templates = get_prompt_files() + prompt_structures = list(prompt_templates.keys()) if not prompt_structures: - prompt_structures = ["None"] # Fallback if no files are found + prompt_structures = ["None"] - return { - "required": { - "prompt": ("STRING", {"default": "", "multiline": True}), - "ollama_model": (cls.get_ollama_models(),), - "keep_alive": ("INT", {"default": 0, "min": 0, "max": 60, "step": 1}), - "saved_sys_prompt": (prompt_structures,), - "use_sys_prompt_below": ("BOOLEAN", {"default": False}), - "system_prompt": ("STRING", {"default": "", "multiline": True}), - }, - "optional": { - } - } + return comfy_io.Schema( + node_id="BasicOllama", + display_name="Basic Ollama", + category="Ollama", + description="Interface with Ollama LLMs, supporting dynamic image inputs.", + is_output_node=False, + inputs=[ + comfy_io.String.Input("prompt", multiline=True, tooltip="The main text prompt for the LLM."), + comfy_io.MultiType.Input( + comfy_io.Combo.Input("ollama_model", + options=["Loading..."], + default="Loading...", + tooltip="Select the Ollama model to use.", + socketless=True, + remote=comfy_io.RemoteOptions( + route="/basic_ollama/models", + refresh_button=True + )), + types=[comfy_io.String] + ), + comfy_io.Int.Input( + "generation_seed", + default=0, + min=0, + max=0xffffffffffffffff, + step=1, + control_after_generate=True, + tooltip="Seed for randomness. Change this to force a new generation." + ), + comfy_io.Boolean.Input("enable_think", default=True, tooltip="Enable reasoning/thinking for supported models."), + comfy_io.Combo.Input( + "saved_sys_prompt", + options=prompt_structures, + default=prompt_structures[0], + tooltip="Select a pre-defined system prompt." + ), + comfy_io.Boolean.Input("use_sys_prompt_below", default=False, tooltip="If True, use the custom system prompt below instead of the saved one."), + comfy_io.String.Input("system_prompt", multiline=True, tooltip="Custom system prompt to guide the LLM's behavior."), + comfy_io.Autogrow.Input("images", + comfy_io.Autogrow.TemplatePrefix(comfy_io.Image.Input("image", optional=True), prefix="image", min=1, max=10), + optional=True, + extra_dict={"autoshrink": True}, + tooltip="Dynamic image inputs for multimodal models.") + ], + outputs=[ + comfy_io.String.Output(id="text", display_name="text", tooltip="The text generated by the LLM."), + comfy_io.String.Output(id="thinking", display_name="thinking", tooltip="The reasoning trace (if available).") + ], + hidden=[comfy_io.Hidden.unique_id] + ) - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("text",) - FUNCTION = "generate_content" - CATEGORY = "Ollama" + @classmethod + def validate_inputs(cls, **kwargs) -> bool | str: + return True - def generate_content(self, prompt, ollama_model, keep_alive, use_sys_prompt_below, saved_sys_prompt, system_prompt, **kwargs): - url = f"{self.ollama_url}/api/generate" + @classmethod + async def execute(cls, prompt, ollama_model, generation_seed, enable_think, use_sys_prompt_below, saved_sys_prompt, system_prompt, images=None, **kwargs) -> comfy_io.NodeOutput: + ollama_url = get_ollama_url() + url = f"{ollama_url}/api/generate" system_prompt_content = "" if use_sys_prompt_below: system_prompt_content = system_prompt - print_colored("info", "Applying User provided system prompt") else: prompt_templates = get_prompt_files() if saved_sys_prompt in prompt_templates: system_prompt_content = prompt_templates[saved_sys_prompt] - print_colored("info", f"Applying {saved_sys_prompt} system prompt") payload = { "model": ollama_model, "prompt": prompt, "stream": False, - "keep_alive": f"{keep_alive}m", + "keep_alive": "0m", + "options": { + "seed": generation_seed + } } + # Handle 'think' parameter logic + payload["think"] = enable_think + if system_prompt_content: payload["system"] = system_prompt_content - all_images = [kwargs[key] for key in sorted(kwargs.keys()) if key.startswith('image')] - provided_images = [img for img in all_images if img is not None] + # Collect all images from the 'images' dict (Autogrow) and any stray images in kwargs + provided_images = [] + + # Check the packed 'images' dictionary + if isinstance(images, dict): + for key in sorted(images.keys()): + img_tensor = images[key] + if isinstance(img_tensor, torch.Tensor): + for i in range(img_tensor.shape[0]): + provided_images.append(img_tensor[i]) + + # Check kwargs for any stray image inputs + for k, v in kwargs.items(): + if k.startswith("image") and isinstance(v, torch.Tensor): + # Avoid duplicates if already in 'images' dict + if not isinstance(images, dict) or k not in images: + for i in range(v.shape[0]): + provided_images.append(v[i]) if provided_images: - print_colored("image_info", f"Processing {len(provided_images)} image(s) for Ollama API") image_data = [tensor_to_base64(img) for img in provided_images] payload["images"] = image_data try: - response = requests.post(url, json=payload) - response.raise_for_status() + # Set a timeout (10 minutes) for model inference + timeout = aiohttp.ClientTimeout(total=600) + async with aiohttp.ClientSession(timeout=timeout) as session: + async with session.post(url, json=payload) as response: + if response.status != 200: + error_text = await response.text() + # Return empty strings on error to match output signature + return comfy_io.NodeOutput(f"Error: {response.status} - {error_text}", "") + + data = await response.json() + text_output = data.get('response', '') + thinking_output = data.get('thinking', '') - textoutput = response.json().get('response', '') + if text_output.strip(): + text_output = cls.clean_text(text_output) - if textoutput.strip(): - clean_text = textoutput.strip() - # Remove triple backticks (```) that might wrap the output, often seen in code blocks from LLMs - if clean_text.startswith("```") and "```" in clean_text[3:]: - first_block_end = clean_text.find("```", 3) - if first_block_end > 3: - # Attempt to remove language identifier if present (e.g., ```json) - language_line_end = clean_text.find("\n", 3) - if language_line_end > 3 and language_line_end < first_block_end: - clean_text = clean_text[language_line_end+1:first_block_end].strip() - else: - clean_text = clean_text[3:first_block_end].strip() + return comfy_io.NodeOutput(text_output, thinking_output) - # Remove surrounding quotes if the entire output is quoted (e.g., "generated text") - if (clean_text.startswith('"') and clean_text.endswith('"')) or (clean_text.startswith("'") and clean_text.endswith("'")): - clean_text = clean_text[1:-1].strip() - - # Remove common prefixes that LLMs might add (e.g., "Prompt:", "Final Prompt:") - prefixes_to_remove = ["Prompt:", "PROMPT:", "Generated Prompt:", "Final Prompt:"] - for prefix in prefixes_to_remove: - if clean_text.startswith(prefix): - clean_text = clean_text[len(prefix):].strip() - break - - textoutput = clean_text - - return (textoutput,) - except requests.exceptions.RequestException as e: - error_message = f"API Error: {e}" - if e.response: - error_message += f"\nStatus Code: {e.response.status_code}" - try: - error_message += f"\nResponse: {e.response.json()}" - except json.JSONDecodeError: - error_message += f"\nResponse: {e.response.text}" - return (error_message,) except Exception as e: - return (f"An unexpected error occurred: {e}",) + return comfy_io.NodeOutput(f"Connection Error: {e}. Ensure Ollama is running at {ollama_url}") -NODE_CLASS_MAPPINGS = { - "BasicOllama": BasicOllama, -} + @staticmethod + def clean_text(text): + clean_text = text.strip() + if clean_text.startswith("```") and "```" in clean_text[3:]: + first_block_end = clean_text.find("```", 3) + if first_block_end > 3: + language_line_end = clean_text.find("\n", 3) + if language_line_end > 3 and language_line_end < first_block_end: + clean_text = clean_text[language_line_end+1:first_block_end].strip() + else: + clean_text = clean_text[3:first_block_end].strip() -NODE_DISPLAY_NAME_MAPPINGS = { - "BasicOllama": "Basic Ollama", -} + if (clean_text.startswith('"') and clean_text.endswith('"')) or (clean_text.startswith("'") and clean_text.endswith("'")): + clean_text = clean_text[1:-1].strip() + prefixes_to_remove = ["Prompt:", "PROMPT:", "Generated Prompt:", "Final Prompt:"] + for prefix in prefixes_to_remove: + if clean_text.startswith(prefix): + clean_text = clean_text[len(prefix):].strip() + break + + return clean_text + +async def get_ollama_models_endpoint(request): + models = await fetch_ollama_models() + return web.json_response(models) + +if PromptServer: + try: + @PromptServer.instance.routes.get("/basic_ollama/models") + async def get_ollama_models_endpoint_handler(request): + return await get_ollama_models_endpoint(request) + except Exception as e: + print(f"BasicOllama: Could not register API route: {e}") + +class BasicOllamaExtension(ComfyExtension): + async def get_node_list(self) -> list[type[comfy_io.ComfyNode]]: + return [BasicOllama] + +async def comfy_entrypoint() -> BasicOllamaExtension: + return BasicOllamaExtension() diff --git a/README.md b/README.md index 7b12d4d..b8eb12e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ComfyUI-BasicOllama -A simplified node that provides access to Ollama. It allows you to send prompts, system prompts, and images to your Ollama instance and receive text-based responses. +A simplified node that provides access to Ollama. It allows you to send prompts and images to your Ollama instance and receive text-based responses with support for reasoning/thinking and system prompts. ## ⚠️ Requirements @@ -8,15 +8,15 @@ A simplified node that provides access to Ollama. It allows you to send prompts, ## 🚀 Features +* **Zero Startup Impact:** This node loads asynchronously and will not slow down your ComfyUI browser loading time. * **Direct Ollama Integration:** Seamlessly connect to your local Ollama instance. * **Automatic Image Detection:** The node automatically detects if an image is connected and sends it to Ollama for multimodal analysis. +* **Reasoning Support:** Toggle "think" mode to capture reasoning traces. * **System Prompt Support:** Utilize the `system` parameter in the Ollama API for more control over model behavior. * **Dynamic Prompt Templates:** Easily load your own system prompts from `.txt` files in the `prompts` directory. * **Dynamic Image Inputs:** Start with one image input, and automatically add more as you connect them. * **Easy Configuration:** Quickly set up your Ollama URL via a `config.json` file. -![](https://github.com/BobRandomNumber/ComfyUI-BasicOllama/blob/main/BasicOllama.png) - ## 📦 Installation 1. **Clone the Repository:** @@ -26,17 +26,7 @@ A simplified node that provides access to Ollama. It allows you to send prompts, git clone https://github.com/BobRandomNumber/ComfyUI-BasicOllama.git ``` -2. **Install Dependencies:** - Navigate to the newly cloned directory and install the required packages: -  -```bash - cd ComfyUI-BasicOllama -``` -```bash - pip install -r requirements.txt -``` - -3. **Restart your ComfyUI instance to load the new custom node.** +2. **Restart your ComfyUI instance to load the new custom node.** ## ✨ Usage @@ -47,18 +37,20 @@ The `BasicOllama` node can be found under the `Ollama` category in the ComfyUI m | Name | Type | Description | | ---------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `prompt` | `STRING` | The main text prompt to send to the Ollama model. | -| `ollama_model` | `COMBO` | A list of available Ollama models on your local instance. | -| `keep_alive` | `INT` | The duration (in minutes) that the Ollama model should remain loaded in memory after the request is complete. | -| `saved_sys_prompt` | `COMBO` | A dropdown list of saved system prompts from the `.txt` files in the `prompts` directory. This is used as the system prompt by default. | -| `use_sys_prompt_below` | `BOOLEAN` | If checked (`True`), the `system_prompt` text box below will be used instead of the dropdown selection. If unchecked (`False`), the `saved_sys_prompt` dropdown is used. | -| `system_prompt` | `STRING` | A multiline text box for a custom, one-off system prompt. This is only active when `use_sys_prompt_below` is checked. | -| `image` | `IMAGE` | An optional image input for multimodal models. The node starts with one image input, and connecting an image to it will create a new input, allowing for any number of images. | +| `ollama_model` | `COMBO` | Asynchronously populated list of available Ollama models. Use the **Refresh** button to update the list from your Ollama instance. | +| `generation_seed` | `INT` | Seed for randomness. Includes control for incrementing or fixing the seed after generation. | +| `enable_think` | `BOOLEAN` | If enabled, requests and captures the reasoning/thinking trace for supported models. | +| `saved_sys_prompt` | `COMBO` | A dropdown list of saved system prompts from the `.txt` files in the `prompts` directory. | +| `use_sys_prompt_below` | `BOOLEAN` | If checked (`True`), the `system_prompt` text box below will be used instead of the dropdown selection. | +| `system_prompt` | `STRING` | A multiline text box for a custom, one-off system prompt. | +| `image` | `IMAGE` | Optional image inputs for multimodal models. Connecting an image automatically creates a new input slot. | ### Outputs -| Name | Type | Description | -| ------ | -------- | ----------------------------------------- | -| `text` | `STRING` | The text-based response from the Ollama model. | +| Name | Type | Description | +| ---------- | -------- | --------------------------------------------------------------------------- | +| `text` | `STRING` | The main text-based response from the Ollama model. | +| `thinking` | `STRING` | The reasoning trace generated by the model (if `enable_think` is active). | ## ✍️ Adding Custom System Prompts @@ -66,16 +58,10 @@ You can easily add your own reusable system prompts to the `saved_sys_prompt` dr 1. Navigate to the `ComfyUI-BasicOllama/prompts` directory. 2. Create a new text file (e.g., `my_prompt.txt`). -3. Write your system prompt inside this file. For example, if you want a system prompt for generating JSON, the content of the file could be: +3. Write your system prompt inside this file. +4. Save the file and refresh your ComfyUI browser window. -  ``` - You are a helpful assistant that only responds with valid, well-formatted JSON. - ``` - -4. Save the file. -5. Refresh your ComfyUI browser window. - -The name of your file (without the `.txt` extension) will now appear as an option in the `saved_sys_prompt` dropdown. In the example above, you would see `my_prompt` in the list. +The name of your file (without the `.txt` extension) will now appear as an option in the `saved_sys_prompt` dropdown. ## ⚙️ Configuration @@ -91,6 +77,6 @@ If your Ollama instance is running on a different URL/port, you can change it by ## 🙏 Attribution -A special thank you to [@al-swaiti](https://github.com/al-swaiti) for creating the original [ComfyUI-OllamaGemini](https://github.com/al-swaiti/ComfyUI-OllamaGemini) whose Ollama node served as the foundation and inspiration for this. +A special thank you to [@al-swaiti](https://github.com/al-swaiti) for creating the original [ComfyUI-OllamaGemini](https://github.com/al-swaiti/ComllamaGemini) whose Ollama node served as the foundation and inspiration for this. This project is licensed under the [MIT License](LICENSE). diff --git a/__init__.py b/__init__.py index 3214059..c58573c 100644 --- a/__init__.py +++ b/__init__.py @@ -1,4 +1,5 @@ -from .BasicOllama import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS +from .BasicOllama import comfy_entrypoint -WEB_DIRECTORY = "./web" -__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY'] +WEB_DIRECTORY = "./js" + +__all__ = ['comfy_entrypoint', 'WEB_DIRECTORY'] \ No newline at end of file diff --git a/js/basic_ollama_ui.js b/js/basic_ollama_ui.js new file mode 100644 index 0000000..91df0ef --- /dev/null +++ b/js/basic_ollama_ui.js @@ -0,0 +1,41 @@ +import { app } from "../../scripts/app.js"; + +app.registerExtension({ + name: "BasicOllama.HideAutoRefresh", + async beforeRegisterNodeDef(nodeType, nodeData, app) { + // Only target your specific node + if (nodeData.name === "BasicOllama") { + const onNodeCreated = nodeType.prototype.onNodeCreated; + + nodeType.prototype.onNodeCreated = function () { + if (onNodeCreated) { + onNodeCreated.apply(this, arguments); + } + + // Intercept ANY widget ComfyUI tries to add to this node + const origAddWidget = this.addWidget; + this.addWidget = function (type, name, value, callback, options) { + // Let the widget be created so ComfyUI's backend doesn't crash + const w = origAddWidget.apply(this, arguments); + + // If the widget is the annoying auto-refresh toggle, hide it instantly + if (name && typeof name === "string" && name.toLowerCase().includes("auto-refresh")) { + w.type = "hidden"; // Tell LiteGraph not to draw it + w.computeSize = () => [0, -4]; // Force its height to 0 pixels + } + return w; + }; + + // Cleanup: just in case it was already added before interception + if (this.widgets) { + for (let w of this.widgets) { + if (w.name && w.name.toLowerCase().includes("auto-refresh")) { + w.type = "hidden"; + w.computeSize = () => [0, -4]; + } + } + } + }; + } + } +}); \ No newline at end of file diff --git a/prompts/LTX2_I2V.txt b/prompts/LTX2_I2V.txt new file mode 100644 index 0000000..2eb743f --- /dev/null +++ b/prompts/LTX2_I2V.txt @@ -0,0 +1,31 @@ +You are a Creative Assistant. Given a user's raw input prompt describing a scene or concept, expand it into a detailed video generation prompt with specific visuals and integrated audio to guide a text-to-video model. +You are a Creative Assistant writing concise, action-focused image-to-video prompts. Given an image (first frame) and user Raw Input Prompt, generate a prompt to guide video generation from that image. + +#### Guidelines: +- Analyze the Image: Identify Subject, Setting, Elements, Style and Mood. +- Follow user Raw Input Prompt: Include all requested motion, actions, camera movements, audio, and details. If in conflict with the image, prioritize user request while maintaining visual consistency (describe transition from image to user's scene). +- Describe only changes from the image: Don't reiterate established visual details. Inaccurate descriptions may cause scene cuts. +- Active language: Use present-progressive verbs ("is walking," "speaking"). If no action specified, describe natural movements. +- Chronological flow: Use temporal connectors ("as," "then," "while"). +- Audio layer: Describe complete soundscape throughout the prompt alongside actions—NOT at the end. Align audio intensity with action tempo. Include natural background audio, ambient sounds, effects, speech or music (when requested). Be specific (e.g., "soft footsteps on tile") not vague (e.g., "ambient sound"). +- Speech (only when requested): Provide exact words in quotes with character's visual/voice characteristics (e.g., "The tall man speaks in a low, gravelly voice"), language if not English and accent if relevant. If general conversation mentioned without text, generate contextual quoted dialogue. (i.e., "The man is talking" input -> the output should include exact spoken words, like: "The man is talking in an excited voice saying: 'You won't believe what I just saw!' His hands gesture expressively as he speaks, eyebrows raised with enthusiasm. The ambient sound of a quiet room underscores his animated speech.") +- Style: Include visual style at beginning: "Style: