From 4d6d2fcdc823ecd055a282469c0c2914c1f83981 Mon Sep 17 00:00:00 2001 From: Lorenzo Drudi Date: Sat, 27 Apr 2024 12:04:29 +0200 Subject: [PATCH 1/7] docs: update proposal. --- changes_proposal.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/changes_proposal.md b/changes_proposal.md index dd34342..80dbfd4 100644 --- a/changes_proposal.md +++ b/changes_proposal.md @@ -1,4 +1,4 @@ -1. ⌛ model has to be provided in form of enum - important, hard to juggle with all 0xxx versions +1. ✅ model has to be provided in form of enum - important, hard to juggle with all 0xxx versions - Merged Change: - we can just infer it from `response.model` @@ -15,7 +15,7 @@ Motivation: - allows easier integration, user only has to initialize tracker object and call `update_cost(response)`, otherwise each chat completion call would have to be rewritten -4. ✅ log file just acumulates total cost +4. ✅ log file just acumulates total cost - Merged Change: - add breakdown of responses/input token per response/output token per response/cost per response @@ -45,4 +45,6 @@ Change: - change strftime format to `strftime("%Y-%m-%d_%H:%M:%S")`, makes it more readable - we could possibly infer the datetime and do plots with datetime instead of str -6. WIP +6. ⌛ web ui for stats viz + +7. WIP From cfb5d686a1011d8347e7214f29e3c65caa5d0572 Mon Sep 17 00:00:00 2001 From: Lorenzo Drudi Date: Sat, 27 Apr 2024 12:04:44 +0200 Subject: [PATCH 2/7] docs: update readme. --- README.rst | 39 +++++++++++++++++---------------------- images/strftime_agg.png | Bin 47807 -> 0 bytes images/viz_prints.png | Bin 41060 -> 0 bytes 3 files changed, 17 insertions(+), 22 deletions(-) delete mode 100644 images/strftime_agg.png delete mode 100644 images/viz_prints.png diff --git a/README.rst b/README.rst index 8f4e762..070d42a 100644 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ OpenAI Cost Logger ================== -Simple cost logger for OpenAI requests. +Simple **cost logger** for **OpenAI requests**. Track the cost of every request you make to OpenAI and visualize them in a user-friendly way. How to install: @@ -16,13 +16,13 @@ How to install: * .. code-block:: python - from openai_cost_logger.constants import DEFAULT_LOG_PATH, Models, MODELS_COST - from openai_cost_logger.openai_cost_logger_viz import OpenAICostLoggerViz - from openai_cost_logger.openai_cost_logger_utils import OpenAICostLoggerUtils - from openai_cost_logger.openai_cost_logger import OpenAICostLogger + from openai_cost_logger import OpenAICostLogger + from openai_cost_logger import OpenAICostLoggerViz + from openai_cost_logger import OpenAICostLoggerUtils + from openai_cost_logger import DEFAULT_LOG_PATH, MODELS_COST -* See also the homepage on `PyPI `_. -* See the `demo file `_ for a usage example. +* Homepage on `PyPI `_. +* `Demo file `_ with a usage example. Key Features: ------------- @@ -30,22 +30,17 @@ Key Features: * Choose the feature you want to track (prompt_tokens, completion_tokens, completion, prompt, etc.). * Check the cost of your requests filtering by model or strftime aggregation (see the docs). -Endpoint supported: +Models supported: ------------------- -* Chat completion. -* Every response passed to *OpenAICostLogger* should contain the fields "*usage.prompt_tokens*" and "*usage.completion_tokens*". - This is the only strict requirement of the library, the way you call the OpenAI API is totally up to you. If needed, you can - find an easy example in the demo file. +* The response generation is totally up to the user. The library support every model which response contains the fields **usage.prompt_tokens** and **usage.total_tokens** (e.g. chat completions, embeddings, etc.). -Viz examples: -------------- -.. image::images/viz_prints.png - :alt: Viz prints examples. - :align: center - :width: 500px +Note: +----- +* Every cost is specified per **million tokens**. +* If you don't specify the cost, the library will look to the **MODELS_COST** dictionary and get the cost of the model you are using. Be aware that if the model is not in the dictionary, an exception will be raised. -.. image::images/strftime_agg.png - :alt: Strftime aggregation example. +Viz example: +------------- +.. image::https://drive.google.com/file/d/1lbmRJCe5VHqom0bdHzE2xi09lSfsp_Bm/view?usp=sharing + :alt: Viz example (prints + plot) :align: center - :width: 500px - diff --git a/images/strftime_agg.png b/images/strftime_agg.png deleted file mode 100644 index ef238681de148466a0d332c08c1508d441dc61f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47807 zcmbq)V{m3cw{<+p#I|iG6Wg|viEZ0>!kO5%ZQGpKeBw-uC%ALJs$2EGzrR(ds_S&^ zuHL8mRQKM!)&?jmN+Ev7`wj*MhA1N~t_lVQ2?7Iy2!)0D*CP>tNA|CQaut0*OYxBzPI9Ic)+IF)t zXOg!=8_)L-jheoMf;yIX$gddvh)o0t_8)%{rXN72FzNfH=_@PVJ9XG~*!R=yyFid% z-!AapPiS}U*jG&aD6H=Hum8f!012p;o`m$j;B5ap*&psd0U*XnY-Ii~qgzNZ)h9}d z|3tt~>B-)(|HLpdg3Nl_f6o|9N((~!F9@+vm>Y@yCl0ItDua`L%rk;h$ZJtW8U($MeAkJ5pHx}`%s$mnIthBVgUPxKMc&pTx=()x@ zgy^8|)91Zd0Jr_oT*uh5!5tr&4XN5nH5r#kq%6~-s^72o8GKqn%g=G&)@oTyqO`ooN;oi2(n#5=Wnktaq&sg&j8bbYz`ZCe>#j?jD*#*i85sWd5C zKTmd`OWf+SqUtp{>4NNt9v`b4f=kFM8kU)W+);+5x9c{M-D(ThE~gC{H-VXmESyy8 z?pTMqW$CI;7f~6e+;MECnT+2-Ic6<4|x2`jO*LGdxLSt-}$y0Tj!N)^zK-C=(VQES&sipI^kF*gXRE3_HS} z1)MEuu?KEZg!JTJ9q9D_c%>swOGS9eF_FiMaZs?VWP%_LPic*z#K`qc=n3a(UaxC* z0fPXm+s)qR!6WCT!}x+Os+5+iT<$?rZ>K(CvV6%zbI+g_X&?* zXDZ>wtpmdU=C?{L0#v}sF1WFCSD#lh$LT-hx%!+& zZ*R-`1^LPMEcJf4rotx%qdUnI1|FyZ{cz!c2PRKwkPBsr>Y%WGoq23btu~ z8%9;mqjl5SUo3%53`fYLe*B27MTVG#b$4R>6QpG$mJ}Xu2S2XiCE$lRh1q?pgE~|` zJ$lpENQ@Wt6s*jI`58l>zlwls7-IrUuskwCh}~cSZ?36)D4-I2B~AP2$i;S)?M`9e z^NavQ>Ibtw>MSxl5fD1CI5hsexOemn=CMyIBYzNUuWFUt* z*UJMTVRSrXFt;^X=^aq6P;=zxlx?|dce3e4UNxxMWaGhmxcsyFD@@?qr|?dT4tTd{ zCQm&GD&g~%`rUU?>fQ1>g&D=)G1-4+QDYb;t9;FgSSKSM`{yUXvcq=?EirX2-)rbm z!>=xV?doit}jwckH%%vD0&BFY{0x~co&bD$wxyPi)NvWLk4P&Z}p z%T5y%I$Zckda(x zfp=wdJQy^K(x8g2bwZGh{(MIMYS;-g-gjDl#Nt@R>A-##2&8wd26|nm!6Ywz#yv9c zLP_{H(dFH9H zQe|@{lr+}5A?UWVnFL-XS^Wbw!q`vv?XGNm6s6li)5oK+Mm^8=a|@ z;kNqePZiIZdBKRLa(%$$NcvZhQ^oi3QK$?s02)m=~s0U&fymDPE1o12&3%9zV1PQ`EMYqs9o<($SBafg}RKX*4H$gOR81Rb{q z;wl7?CrKV5IO>=v$Qn__rf}ZT%-qb5mVU;PTw3ZLMff}j35m(oT_zXF$B-TcH+V_; zxP)329C}ec;=jEOW0IQVsrk(i@EHDhf!8cG9&!aRlvkOVHbtbgy`WL8RnXS#XLwfr zxHQ3eNLXp`NKH+4;xz6hnqQaEF-By*UUVIN&4xvHJUAjBu<{8kIjouC9qW7Y_Rf8m|QaSm#+(gW%A7$k$H zjSZsR)DI;|$RKK4qP)pB*tFeZr6RKJ+qyG1QnekM>m=|>;hjKQtS?A!{sn^ZH=a)l z7}^07QhM^dF-1L*{V{rGd5W2?x^c{eITPrh?ZH-|qdODC;&+OSXJGl8;#~}RV9fp3 z3Es7LX*RlmkFhpX-Un~Cm1T9G_8lg>QQa8lB(!+PK<2^$!o**a z+ZCskG8o>s>Yf~QsY!2(K=^Axbv9Ltc+(I5zypqXb=@JkF@7%>a~26lLdzER*#p@l zpE)lXXPLz2yS656xS$;L8)9ItsXv6~-)GB@M5ljlqUQhmH1nThwfA;aXRFj&Y)EyO zqF}eIgqMLY450hqL#_igH9&&7@`%Bg3K8E;Z<5CI82d*N^Ej%1`;FyqE8DsI%S|l; z0%#gQ9!qATL0*%)(YN`qUj!4AdXi!uO`r-|ok*g?48i+V2BJW8K{oc~ zlAGJJ5|LSa+EjMG-;UM}LuF?_%mr|dAw;HDSns*BZmoJ^$f`bt?UTGZ9+SUOpo0!I7U)F`gX(XUjZ z!d!xlkFgsMSy(8t6zzhTURzjBS}End{Mc<$n;hGAbo$InyB`?ff_-F#Hsr;+Qp-z} zejh=%)1KH25`VF~-YA>A92wlv_Xj@FsfI4kJH{zA`LRzC#Yyou<-ONnMhP|yGa1Tl zOhI&M*ru>Y_GuK^2u~+NLD^k)TX{P}V4uhl(umB~mHXor!Rz%T7A3aUU zUjre2x(LQXd9q&5LNvbS#j}bo-75-|cchNhQj-;db?DxrKR)Rb0gHYjXLa}u;08LD zv~|iseh9&VQ4&7_QqQ+%Z2@G2TIK+ay^m=GvPBKIyz0@vD)Ze)wURvto2TEX@qOh!2)9x|3@@$V8DIjNl}fXy6z+7EFl=<6b1p)tLTz zrU3z~$^(Xjw#0%@fD0cHvp* zCi81de~&vz!#dhBt&HZa+=}zck1~W($Ri?dx9(sK6&x*3^k!z^N@M@%>`yN?I~|x| z;!^Pm76ezPbH#IGXr9=!|Dd|m@CkVJLC?)K)ox-#`0B3ndTJlSTeHTdJ_sGWG4#W+)^u^Q3s4%rK6=-@DDh^XHjj)yE6gdVta0}nh&(HIn!zD=<+X0C*%nb zmuvT(gkb+b*^2cCq;|&ChAI^Alt*e4?(2fflMQsrSg|Imxj*r)(uVvb2ER1P8#wfN z0O%{!Z>Fmp+}oQ)rFb`e0s+;xO~2f$6A2|@VgFK58Y;NmJk}8Gs0nv`3sX!ut^nlN zZEDKox^kA*bj%p2Al_1`J4nR>PB05X`z-S;BjE~7AYoB*bc1H5wq^R9h41a`YFpwx{ z@_jhGT-caexccCxL{?KV_5f3Xd=qJze5-)mzmpkXju0MOG(Em8KrmjsA!B+d#mtR1 zgUevdweN5L1IUC;3U4GI-s0Gev$RmsBj>VMVSl1InMITT2l#?hCbn<0^{()aHue;Q z?)W%e*{CbWnNWr>9h(T`anOcK|0@($5Cy!roA|VxJ1-s*ch6oI!PqaP|Ct5}P zHFN@Hoc>u%MGZmnxB#S6YqJ$i59E(!$jm% z_(5@*HrNtE;$xtTQPkB1`IBIu$)la(neQhRUqKtdKC&ru5<>?98})%O#5AZoTX^%d zx6#(+EybK(NOlrk-ioD7)@RA@W$-%bD#jxdMcA`&XVJ+HXF+uH_hwKYHo2)mt=89`r~5jKfYc zM~RPYN4H*KJPK@6E}>o4mDDsq!Rw*{dq*L;;gYd?$I7rt-%ldFNOWZa36C4?1;E%x zD6xN@D7@=Y5OfTpEd4tT>qJT*rl}YlK1?L+utjPmkH58ddm&`Zxlk+>M71S{ehtqI z?=(d%QG1wxA1!IIy0+qd)RW76O9CtUpxxLf7{On z44ws=%1$DvJ9Z2gyi%eQK}LAGprTgH(D!qVIalv*!QOZ`BgNs_jrf$I;8fa^0sgHU z-n~d8k%5#1dw*B*isSLMyPR~VDLu%8@7wCk(gJjhy1nkuZv%hiG29N}-RceLDL_#( zSn66!P)4fSw}rq^Kq|jEPunm&&W?`6iP3k0Z$gtLpqv^ChCbx49%keE5GRm7#TJd~ zGzp6n&X&tii!7ix?NPE!x67_IWMq%UT^D$6L$ zWCYg+vc3XJ1-#6{X=>%!&NFn$1-@_O=?G&9jhla&cWuaV>d_C5YQZ zqvC7s*Z2U4{A8Hb|2Or8bH1*hATm?@H)QGk#ZFDjm{0hlg3A@jMuxg|* z$d2UC?w$1y4SjxlV5yMAVPAgsx%@Ls6ahX&>ChjfeOczPa@Z6RwNG!Nt+VX4<>V%E z)?YxAX89z}q~mOCi<|e5SdY~VUjfdYr8N}R%pV!SLmns!R|H(aD1w>P4fp0MCGG#r);6MiAH- zKk2~rmve&L0^9>TL1$00PuDLMz62e1{4qqNm4RBeHay+M=pYfyu4` zRo_$_A~G)iF#noW2FZORC`Lg;h_&hFN7n&|3l>Nlb;I}{UNw^N9s)3GN?q{flHvI- zOxbP#_hx|Bp%qj99YEL?I@}WKkeYw^UHG)qDQa-%pjIr;YRS9#D;>Oj7VsK&`ZG0r zeZq&nZWRx{pGe=MpZ0fW!XFnMLCpE`x7__78oNvlQeO_tXF) zsoY^`Z<5p;AV9z;6OFSvorc_YPRou#RkSc3Q-DmdV87xETf#()=lQ*&^qHvD-x?Sg zNGR#^?#-4ESMQo>>-E<&1xJ7MsTJ+za&@0VlD1&ZG3xb+f8dtAm4eS3UI*EHUzbjA-UrzA&+|@H~;p+E``VX8>?2)~ZE5(dD8JfTNlzSOneZ=?38 z>G*RC*EP3#u-6t*2q{!Y=$U8b1+iV4IF*2C3&a%J=i&Em142!8@CR%LQ)QF z@_?V~hRB<&Dx1-${!5Ad^}461`GlV(I2?Wuw~o!#X{y1{eAn-eA#0~v zf*RR!)`kbvmVLav_>=4!fl_c3|H+`ha-alZN5}_0Vds|A(Mve(48!-?avm#tv~Z12 zIvTb>t}o_Uh`vBKY4$y<83&&DI3Y6I*l{F<=K4!O4Myh=L2J#og6@?lnmp-0+LRbZ z8I-S}g3BtXUyxiEL7pOQ?4|QV_S6spZ)!|fr}6rg(F*eE*|B}Aij}-jAr4u=mE>uM zd1t?U9|5m1-W}=JhN8;V{T&;Q1?3yF zM~nSFZWF(qYK>qAFt?frP9Kwq?z+81i=c+l^VE*X+!($+E!A^n^5Xsdk-yo`!|BcI!V7!ox*-j$ZK{K8|b^g?hooqIATkQ|D5Q(x;I#+m#;U zC$Bm$?xAVf7Ja-(T;7lF34qIwNhvFflF-G)J-pia6@l~6)hT)wLL$$aNx;>)5RcO zUNS#pyxuHmkLS_?CRF?I62%YkP2eLn2hWIZf|Cy*$By`0#*cOh7s@as(iXp5wW_K6)6{L@3 zGzUAPwrd ztDu3AlvaGPF2Zj9`SF1Ta1R6~O*RoKNS>(eAS>c|PSGfCaJRcN<=SSEoiMum%bz7` z3!a~fNX?#07LdJ6#utDqGo-RhBRX6UZ8!IrAT)_DgFs#6-_HDHMx{RN%O9&MS3ZhF zJG1Mv0l*GjgylB23F1n*?Df5wGMe7@%vWwjDUDyZA98=W7$Cmm{*0{sG`L7#%m1qk zIYWaX+aFz`^+(bPwD_!Z8Jo;{A~cD<&O=@oVuyA{FF34m<*;N~|JW4U``Jz8&-QZ~ zR-F1H^Ur?rZ`)v!AvG#;2JvvJIf1Uvpay0&RBRftYFke&3J@wb+xJT>k4ra|`iQ}$ z{SP%)A1fXR6vD!grvg{EcD7G~mev3AZZe5rPR;?Ay!ZN~<1ye|l5n-Rm7yFcq)#jElmS5){#s^unzPTL zg(h5>?&LH+J769*2%1qEXe8e**;FmRq1&_m9X3?kd;FG)$Pqy^^$1qI+~bY>>aMkwO{ne41?O5fItbzq#i>! z#Fp;n%fK}}eBnDr5&2wJfKbo36sftUz#+lh$u`~%HK$7?6Bor|L<@S7F*~r%n)DeG zE2uX{1LRO?|A8X@TXR@b_axl9EXBpEubDqjYT2)M0<8oSXYN3)Gb&b1i=!j&G>WnV z(%y0|_T$p3cHn3FCaOx&6J`)`VxuD}A-YQk8uAwKga{%?y6xg)LtZ;`yK8RI4kiWb z(JEgIK&1_D$ex~+F|{Saw9cjrxIjUf`JjlHalREy5D%U|@;W+EYi_DZ19!R8r=Fco_C!y%KhcnG0?UJ z^$6H7x_M5iywLxAi7TnaE15;Fj&nm=#R>_EWd7OQUKg|8d1_NHl1%+QA2Po=b5uzT zw~HntOO5aB<&G?EmUH1v1T(ES+^oG7CdOB8*|2aECigRUFZ;>Ee0lLR21=4yc}d$U z0#Fc3^lu{#-KerL*E`X|Nu@%68RkDAVl$=f9WP;j)PK)Mz2KfEv#sGY>MHhKO?2Qh z3Uzg`iF6qA`r3eD;~57_m{%FU6$hOkh_vN2TT5Q65nvy{F~Y=mP4M7;?y#MnUf<6r z((15KhhVC`OCzX~wYO_VOQeEFOX#oBgw=9kxA}W=kkSpFQZx-eA{J3>>_Q@3%|aPT zA|X?+`ry9#7yaU)!ZP>(z7tX&`KNe8%S2~ZRE{4VvHTXVY)Hb5$xW)s*N_6UI7hU= z`2Fvv9B=Ptd+ZT)qj_cXN%=G+K*#UwB#c{LHiu58@u4R0QT#k?Q?H_K@^aX43Sb&C zWhMnRAw=72o^maDG=$x0KIe8b`IBir;j=@;_I*zFYO5+qrU=nv?+i}RQYj{LCHWWT z#3AV(>QQzSS>cT3s4m8>fU4EpL*a zW!)>=RisRI7$H4z)oP(_O(a*Fd2lc%|EbY%mt^TRmf5~e;;c~K!<#n zPr34c#4XVGv`e!hbmv9Fi}Tkc_f6Ght3+GKMKnf(SjWnS0ebUs&fv(J4+ zWLyMD%G>jZA$wSA5xiUYfoWR#R#sBGU3*k01R%N8_stsdi3=Kr&#>5Ogpj1biNrr& zCXxrVf&veEf>qpy?6Pr#4#Ph^R#i4OdS}!FuKoUzu~~32(8{*T6C#&{hLA--mggRx>s{+4xJTc##e%H{m?DjY z34~5CLOh<(73bl#2X+3YFv7q*v7(S-Ea4;^(Ocp1@cPnBG6m-O23HL&<+>YzK;vt&v1SI8mlw;{J4$Et0DKT`@9os zw+sFdLQVw#`-Ru4xUupTnivb_XYp1f``v6BlGJJmqTDbbI`zit8NZDus5gFv9UV6d zFB({CqKy(;wk*9AT=mCAH@9NW*74Nw_MU`S8cqRgG6Dy}nY0MSE{(?Jv0Sqp@I54xz|#A! zp*l)|h|5CFj%RcH6skAqUqY6aHf-c$(Nc2q7;?rO8lY)(_ zSfgz9!{H#^3F{c~Mh;=$>84$k{~{QKbe@bn@rZtN4>jdegwJRJ%N-8)`dQhe3<+zz z6J}zpl|yJIDE@5{MULLv?B?h7(N8>4Qo`>F@=(NrXz`_$5rnuJ7#W=?S1A4$GyG{@ z05+gQhze;@|H_JEfvDua&CtrRw7Udo_%F-UnON*vEwU`Quh;XPj6%AFGG&(#JHmy9 zeWaS+kvWNHp1`p)Wb)u02uR&o;lr__N*LS~oD?)|4J+xLNHgJ>Px3dYqfBdy?#r?Kqw^ zzj+p4XC6?7Z`l9+LU%S5R2M6O&me3HExGzl^g4k`JLoPqLb(ubKBNUojy?!itq0XX z(}aGuWM7x!Gvh~2LjW0Kmmyi-S_$M}+Ap6#e$%AoWTYr$Vi;R+#1gUwxQWw{0&^OP z?)9jV@4dmiN9|^! zey~R(bX&TtZWu%^rw&e-hVdwHn@a<+y(LH%l?^!zBOD<$)-WU<3mtXQv;G}FLGaTk5$9LYgQO}><%{xV@6H7%8Q>CECssxedX%0WV6J>vRz$# z*6l*Hy~@c;m+59>VGUHXq3Fcf7LN_RXYo`jQq6;khC=Wf3G@vWe&sURk)|e_cKPG( zFEHNdHT7yc=wtN6Qz2Q7ee%-*h*^>9Pvkhn)zG&X$Ga?;W52xQEfW>{U5xo0u{*=| zC#YG!p4H*qz`RxTp{J{ug_sf)q)J8?NaTz|QgyIn>wV2}z&plHiW2gPK zWs}ykm8*FraU7!;WcerOt{t)I^jAq2v67zT1$dOD5%7Nkl3uvLe7U_}eeUiayHD|_ zL46&7KTyPBOV_TH3Q^HuytJ#xMd={kwv(!!#+ugyQOV$v@WOorq0b$0-woQ;=Y#=b zsEp`S5?qrM^B}({cop*I7Ue$?rnhs%lZt%jxP)xcU{jQq0@)6rQV+%CjM{;BF`2hP zmcmV&cHrD`_NhOPhP>Vh+)SLJ4&{*4F}Q&THY8F0U*i=oN{$D{Y#VhVSPwob?r)ID zSi>MPx0ZHhta0_>*C`bI&B(1*W#u25t2R~g**MqR=f}Y?D16%j_=8mOq`DTAO{1(> zQVgrUSQNUtTj=neTUiM~MfO|Q14*xNJM-#dskS}Ld`SM%(b~h4Q^S|UUvvqL^lr!4 z_qMNDQ^2G3fhbVpdh$Y;G`i@Zk`DVE^1j#7_-JxLYE9pS=D=wdZeSXQ)Zz`_m>j`Y;kG7kFu=ku7AmLVV?Jjjk;dnc8|j2`r}2|p#ivU z#`)gz%#2V9Hst@tF|%{Z@A)@nFzG;j+JNhVjye+(y5e10#KUb+?H-f0j5-(yn79x7 zkhlbvJ4W(z<)^a+%jCQlMahQxlhc-%4Rxp1HWNXyS>UdKY?7ZKw%v>j!(viu>=-RJ z^wbe#j*uOk^{kf@+1s4V*ilUpjT0g|!S&tewhIzOO~itvq;L9`Ua{(zGXsUO)W*vM zouff!7lPUdQ)5b)!fVcHxeT!m1G% zk@Ep^$-6jh2A6JNM0@)$x_Jgz@r7+kP)5L#jUINZ9LckWpXvUhcX_U&AC9Zz&pu13 zc>Z#rH1*Z11uWu#W%QH|Ye8&$aILGP&%LHK#yDu(R4WB~Q<*5bl<9Jt?Z~uNCG&I* z#ZO-|E(Jd1_O9NkBG0JlN|^Bqi?g@N^cHtB{7m>m<6^H7{9`^`n=_ftY>a9{n33eG zH7&T#UC#&xbn7!srR1j-))i|@ji-e12^n~A9zaX=8n?x7{0r#N%xz4E@~$!b$km?s z5Izv*&XwdmSOBmMQHL7uBy=ti@B-caIS`I)DgE-0%{2^r72Z^)e-TLffO&2|Ad1n_ zskzVRjPzwAqPlYw`x?pp!82SeFO2^T%MQ{1qJc%ZN)OQeYc}c&NKUi(rS&AUyQ_tp z%^Ku!SreNAzMb-?C7A3dzp24!1(_Gx02_;8cQm1CFL@=sqH*&@y4RAKk5uofUFl9a z%pvP{U(NUjV%I;g14%^2(LPawwcoThs8=y5*#jTBi2Wb9>KKtb-b|p7IUvvJ#D0mX zeF-E7TLm)LyDPKDvW^=Iw5gW%CCaodEpN;V7N;Qv?Uj)QIb`bA?TM(xk!@g4p1;w1 zvlR~Uqxuedy=#d3>e5y<9Mor5y`3B11{PAVSxE6KPJ&a#hBm-9 zuZGZYo((cc+|J&q41pSS391VYp+xeGFm3+U7jhp8|ICy zC)fAwa0b153c0pXwQRL%%J+q^1ZsZD#0W(A2|+i^i?tQ~%Gr!`7T{Q{DjuyM=lmjB zf(#YS+U-veh*qR_M94he)Oe(F%xf?M!S+p8^=969Vm;w?G+caVZPRCs=}6VR_KPk* zb3ROGTE1}*D5kZ5g&{I*WRBCsI9?{c7YOfW$6RDDJV=axwH~*oI#vi0qaI}^Gm5d; z5b8XY9=9wnV=Y2_ghU5yRTsXRQQrafUzqQPGc$x(M6%W*j=K@BrnTLK)aErep;r`{ z2yKSAR6D#&5k9Vek}XoB9~#BoYU6W>jFej!(6}b3e0CmMUvH_%>gl3=2Bwc968~9T zxLWgZOuiy>cjSKRm{0&Q@%0m57H{%jQgetlSKzQZeOTl9?Eiq}y1J_xiYY z{cX|%q_4~9wf>HeU@{ZY9c91|?I}!e1)q4db31A?&cjt4N5_gSWAw9cG8Ql`b`6U; zB0q7lCoHy5ukJ@AB8j;@f-$2pY4L*p(fVz=FY57oqR!)@vfOr7!7zVre|t`^{1?R`OYGO1j%Vs&6P>Ky7hdL+mo!&YK8f+o zw@wHCV_4E)rI{W!m%YU$VJWv$E_1CsMmy}u1ws--u~_vbXL7o-av+nXazM@M-kPg`z83ac*7)o3wV zP%_R|2owh<#y<&Xn&1TS5*8zDlMubJRVt}tTJ{)F9 zQy{l|KPwISS<;1*w^p`n=nucx?fNhUz+uy?OCx+HtxY|dk8e^YntY+vUdGTBBvz+* z13rdeF(ZO_^(jmz4IOI-?fC+!O(gwON|-ROK}}Zl#+i_UTb~nm4jUz)E#h}=J;_FX zMQaASz}<}ANVPJ!64*9Qp_zw`d672D4t%|erhQ@clJT|!o%1-fLOQoG7dzj1zGc;H zX=SdD_Bj8-;G`R2UF|&yd0Prq);DnDq733Xs++!q`!(s1o~s-T&NWi5Z0<#KGfrV` zd6IiE!gEOl`@HH&db?6<3l@5<9VjVzw{r+-CAaCU$$w!fO9~#(!u4Ervy9!}>auAu zu?;sN2r#vxuGJ({_|E-%vh--YaXTame;J6IZ_7yrmJ;(`Nf@)CI);EagI1Tz^idj~XPJx=Umq+3;gesSN@)aW)f9kWU zmu9LH?k%^64*$+I?co-hue%xX#`GR!kYCRYM2+sd7w$<5WKugAE9?tR5MoYDW^lQz zavPy5E$_4BRhJw!c;#v@jdqpnFmwpve3X3^FM8yNX;R&zD*9Yo(gf_=(PV^`)XoBcWg)m9(MfW_dVwv7D>A4Xo+#y6#6(l)ToOWbii zWYrWQl0dFcIU_R08O}#7ei>#vGPr)fU;Z(xD(29yR*VqwH6*~!Z{j8!JvJ!jU$XTJ zy&njKY6q}>@-v87>?dtX1-l$CSmdn<-z$j9#M7|k)*ytd4+nQ*nt7gcZoFRM=@^}% z7~@F1A|P}(SZ>Bkt`k0*jv(C@8ut+lmB!dC+|f*-`cj!_yagCvi{__esk|y6 zGHQ}$2X!CjFrA(2F;&&b5tY&oZr8L!0??zUA%En|btGwMnOnCJGKvPWCg(>UDEqjP z644gEy$&3l*f-zU7TX%qG$y&HOBD`34f!-;x!TcWmaxXE(D$4ClistY)Fm(SjQ?%x z%}EfX3+|V2-tuZAsQ-VZ02eivMzu9%!zj0r%G_eXbEa(vkU`Kxq2J2!Cz#NK+(ERm zaja0=_|Z?6`{VWo+V~so$vT5010MP8geOCn7CYI_d~k!fZP@m1r!*WU@N@4iDaq#h z)n66gOw{0U9dm#qOa4iU4ULJ^Pc+^RxkB`T=SoSv83x2TMXo!H)s8oo1rR7%>)mCj zU$4Q{fh;&dnUG}@wazru|F}<;hXnd365X<}(tXCLA+n|4KORZZuE^|bj8xLQa(X&4 z)R8rFeb_40sF8ozP4jUmWnRI0G>Ubm5O;q{mpD=;C9_sEEXL$qsYU#flYUhlgv=aS$0dhwIrUL`=K>WM#z|6Vlb(YTgn|dL^qnfwRUuCx4UIk*}+md0UQ;Lt>XAqECCkR!pSz z)3BQY(p^PKgPJ*}``gG$XMzC#=^wSZG`iy{9bFcBwIaODW^dDQO$DL~O2)uE1^0#B zi}OVzO)aZQds^Lkv*grtN{!@;&Myb#?4M4RFZsQwqyld4Aw>FQEgY@ZoA|zuQ!QKw zZ`S{(1t=40FgqmsB1HQ2rXlh6jJouAvzt|;w>`7*);05XY>88T+C={CA(S}$eBaTq zW{j-MZ7Q$zweJ%kFw73;99>hXV31@qeu7AC@G$HALLJooGb6J zo9N!?nB10_%w*lE?8BlGQxj*F5x$Z$bnIE?d_d~K@Xv#nVtJdZLQ>2!F3&zo{rQ8@ zm0hZ1Va%Q5+j*$MY%1$SJe=aTR z-Tk?OJ4gKv7EN2dZ)9;$ET|oxyw$MPHc)eVbhrOhi?*X}72HvYG3sgrP`MM%ThG@wD6@?yQhIGtcGd=1NU@qccpr)zIG;hkclzc zgMDxEbjOJt)e8v*g=6{;Y62^_GbWf$zxTFhl@vBrbN?FA=~pnbWLdu0Z|mms^^vMh z3q=yk9eYOkU0Jm#2bre354q|$hW}{}F-*CpUtf~KRhXsWtJU1xQS>dux!Nytk8qMz z3e&OvCw@0l)*R}y>RxG7BQN&3>m~ceQi)TW4;{L6Lv=;OX#Seyb?r$aesWQ@3pvwF zqa(X#7yJvdW*xe2ESut2Q*n~fQCV-zTR!yt)L2`Jg+Q;qzo2STRDN%{vTB(A^XViO zO~>>Cn;yTWHREQd>`p(PjQ#miphaU`n_)V4@DziS^~=Jc6eEM}zVEY+_4!4dr!@mPk| zqch&6w^=WqSTpN3@`UBayJI7f)CbIwms<^%(6K1VKpDrqQP`G8~DtkNHq$4(A!%~sF-GH}y%ldiZ| z6@5W3tZ2P|`H?{3NM+H9b9_;W5vK-Uu1>c}Ql2n%i;R@-i)i)gOK`s<%=Bx|&jAf# zmQ7LYqb^+gzlC}1^&M|1&KT=Ba6qI!zw61*+WuvjHbNPeDDZJ4f1%L1#M6`izWwR% zi6!JOd|N-0fg}{lic|F~$$#fwS%n!V_}NN#m6i6Fd%G5|a)s~yzk89x;a8ofUghyq z=kI>%UrPJB%VGVi;$p`ns}>CIt~V1EzNkU_b?%E5?EMeF9u=5v4Kr%0I;O06Gg7Oi z%2=@P)5@GklcrjOf{F2&PxRT`8O=_$MtgSe9t&KUX3om6im^7mRB-1v zX*^9Gq0gzDo3@FJ&OEv0>7~~Bi5$b0b#Slg-+fVpLq2 zUIk6I*yj|CYsSSDlqDn_yqVD)85{A6?LfM1_LgQ5g@x%rapjs3!;r9biaI)qIpd7v zX1DKD$5l=FA6#EzKgE?FEH!RtGL~r^vYEr6*{$_u!N5S7?q&vtJ<^fl)X9f*dXhhN zbaYBDAK~Fqp?9E)iBA7Il$>HSr{%AorasV^G|fEFkf;@2{k@vrlOC%-j_4*RS}+>-LIGB21#& z$JzJ2T#l{6_-0pXvmaZJB~@zAOu|8D)_k|ekLSCSEus_Mo;@ocEp`f{&eHe3TbR1) z_HgN5`RZO5+myb-yLFn|6N6TUT5=GM_^=&8Xzy;Oz2|)mSLE z9GEK>Q#KVp__v(2I~SK*L_~yy$6m(2ib7>MJqtQ2vK>S8Vn&O##NG!L$agPLXZK{) z4$EAyw-0-rlXT$-Ppaa;0JB=^u*;G@ak3E6cH=byGvj6f z)%REH2pDMJnIFkEGyL-C=bg!;j_K$3Dg;zkM?APGv?DS$_WWGA(7J7hPOn?H>@YWN zHE+)g?!2ny{(LC1=1*MA`9A5o;{p|V3<@H9q|Q9b9`%po-uEris!y=HLdtnhPmtnL zF;h#YShgNF=P6~kKY9VS=f!7-7S7wLMGj^RnMz1XMy91*>Z^^Z8|95oWt*hkBUkVG z*|KkaIfsX7Z=Cyf`wM|ZXLDuvKjV*TAAPI;G)UVbO1D()^YwLC7H>ou+Y>rM`~82! zY5fO0U+ug@Vx@cgyu&f_=w^_dSdzQbK`c-{KqO+kuda_e*;<#N zQ&8Q~!sA;K`s>%V&6_sqHzpYregE!RBW$j<02ACR?^oVrmJ{RWx1;mduQ3DuA48MH z1J+Rq3Fmpd;O)$EXKp133kz3QR|kLm`0>*qCTATF#LnhY)OoxnhFasg0_^2yCk8xf z43)243vO?3|1~;o+5TlUv#{lv>({TVrJBE6vv%#uXkHdKsaLOF&E&Dpzs-Nj$j!<5 zIAVyb{8j`dv99#=bR`v)(6B%!HKV%NnqX-U{_91XT(=%PdG+em-oZf?W#w1agFiUE zibH&Se3lHjwGOH3=mgyk@xnN`zm8lumZ=LZzDCpIT7jIv@ z_}g1HG&dQ`P*YQ5XlQsrRn?1)bKkx*cpxT0<2QHj-nHznKRD2oqJXGS@SIuk{P~w$ z+}xX)m?DFN+42htw1xxboN}0$n5ru)-~axtJMAC_XNNbJe);m{A>Wcec3HwVe?4N_ zzWtTE`}?V>spDE@LO0s)_xAQ~+PLxk%RN$>@y+-i?%y-kQ}yST2#)&MvuD@*=-WGc zYi7)#rmik3Bt$|(L*vgZb0e78(B zV3}~Axa^t8`I)*LLtMJIzh4Reto!}VJNv;jsUS($HGkE@vK@y%t+bnH&>Nqh9g51% z)^y**%p8-MDdM;=+gext?o{&4&a>2RDRK9vf!d;1+{wBnOy05_uB_skh;?y;nWLp^ zTNE!}_HD84Vm4{XymZXE{{=q!=Ah0P{lYN4kEs2}_wV1srepU8+&USh8dtlFUgWL) zP?oBoZ%hF-=3>H0-mEeAn-&)1V^s=)DJ6KO&5Vpj(|u|}h~h~VJUIB!_!v-0w_bJL^A=08t%c6AkNCwv>4?At3o{rLHg zqwkLmrk>KG_Nv;8yfM#cwwvzs8n4%JGZ<;lx9fiQ@Zt>YP>cZ}%%Rj@=*G#AkdU)- zay6S()hoJQbl*%H>ke`=%zv`^$)iW*Khi8VZ{Hr}?!GZ=s{LtXbaeGSda>|JiMkOP z8JA&FRY$T%)+MK;7=6CKnn}RW6A&UYDry}5xTy1HVUMNZ*Js<*(k&zA$HK%7X2yDa z4(hnTe(}O#=Yu52Bh1V)M_eWbo1;=wg{W2HRFCJ($3jzD>}14e8_KGG{D__%%F(jU z(6IRZy~1VPb|p2n$UlGnU}lhCcV_zm1) zq+?j&sE7z@90<|aq3-T-TwO^+BgQB;P4d*k^{PQVyKiR<*N#S#H-wRaMn1lQV}E zC&iDxq8h^$Sq`_I$eL(0!a=CiuxSp7icLQ&=qpFg@U2^^A5EJhVaZ&_j$JJ)S6elO= znl)>B55`a(L|EM5y^<|^E=Wj7L?k9E0u1@ z$`>wF?&%-;k*2tL^JZc}zY0CdngZ(jYPjPv-xn2~E%865I@#)+gDvW`&UoeR9l@yO za6UOXS+o~Z^11`;2P@p!Wj1Zz%%0KA6IU07r<8XSop`gJRV@0z<&XPBMK#>{t$LMA z>f=w~7Bg-4==mLI#&Ye66Owwqqayxl9>4DQt;?4$AMdfiA__5%Ua>*8(393|3Nw;% z-@Rwg?4~jHh>#F=J}yz6uXH7E4xY+;NUv&W82M*(bUcLDQ5s|YxHvh_+uEifn51W9 zbdKEmHEy?g%a+jl_y1yNXXiY8SP^$vvu@q12IJRNJxZrf--luP$%kocYx7%npTkm( zAMMxE)iuPzVqFw(-u&P~&l>w+Eh86RfjsD7bH;T+-_08~yhDT{xB}M|t*y<06EHL~ zQdCiSU0GRK+VHxrPZ^G%#F=-e9`;5?#a?i7%69kgAZs^0+GX_R(T1#EfMv3aKT>a; zRZviMaLB~^3f%m41`+LB-#Br`=8lq*E+0O8sBUbGg!?#dtEU%6E?Qfw;>vtX<>$|z zj`Q|^k@b?CSos)s`aF{_vonQ%8>;C9feX`<=b7;Lfs@NoK8LaLVKR=+~_y zp{jIdEzj+;oQVl*W+C(A2&<~A68aZ z-!ENMR;GILW)iWjEzMa$64gLN*N8F>ds0hDzU(X^E{^ZFT={2%$ygWR$ zSOq0z<&bC3=#rC?^y^|Zm=0Zg1ZUT2F0{B>*RPZK$nP{ar8y8962i&O9#Z#bl}BN) z$6kfr;h%Z%F-jH|i8x1y(@FM|rUHV3D<%Y9Z0at4$m$eMFE(}D#Kh#Lus?A|Kl2_U znl*-XlIfU^C+b<*;1}!`sFTTtHC+B8wihz22P$E)V>NM3LhXc^w`!LN4#Z;F~O1? z9kT!{F!|Bb*Efn?=CyvuS68(R>li_^mS|7UO`X4g_x47`k!Y}K!-fjpN%C~u>MNHo zhc7I;c8HkuIWg=0i}1M-(b2L99_L`#WT&x)a&P!fzkhiR%zWzD5pg5hCqobp*e0(A`GOT;Bj%4d@+(-Z} z;D@ETZae(D%0V5gl=b(-%0llBZ#WR*V1^ur?7K2+fvDg+a8IWktu0R_aKb(`7>h~< zip6wy>uXrmD9<3Qvg}K|xL@>n*HUv^{Oglv&ph*f;w(K7K6VU;&-&8_YmdTBQ}e^q z4p}T4ryRrpC#2V?cUcOLHxD_f9%;7p_-NJ|i#^C%n4fJ-y%F@9S1Y!F)j6}kbRjUm zph-M$XmaJe!(0Zhn3yI^nt-4uPo7xjtvk{klhWc|+RLt@m-A58 zkm@e#~_AW-xhEQTqvfIG8NSF!4g& z#O0+SaZyooPUslo4~Ioac{dHL|E@XpYf>4W=A%hdXmf^56c)fNds_EO3AN$*t~sH^ zhUlrOTMYvfi68sM?P}`l!$U(uSvrZi0Y?5V3ydTC4ii`-!e5{5m?6TV5ciQ-HM|yZ zc-F|*?F7#wf^A}DjjITfnw%a5girljuzNcj>;n;5K1|U%gX*_uj5lZQgQhdp>cN8t zJ)c&xR_}2Wc@OW@+n^U%(_0f|PyI7(z%L-s6XK;=iCv5gk@4!yneWR<(ko-JvbJ{m zJ-LE!7^jh6uXKl%jZNQ?oN3pIfu=g6nN&95M*wpql zIMjw+rT%IkjlG|8$Miz(GpOBK;h%-OTeCCS%4_9-u8|TB1(B zNzxo1(mg#r@Dp_Vm*E^&68{b8v*P*a)2B}rEiK2E50O)F`J?g6eC_iHsq*kQo4HlO zKYmoHQ@4VU)C7{raw|y>|gplExbm+ly0eCgqN1nr6`q{ zH6j#!L&Hi~oU*27OCQ^vu`x@eut1u94;VGisi`6A_#|B~-a?>=pzlER0Q=s(MhMAv ze+u`G&-BF=|1{sn%`Jlvz}U}?BvR{TJCCB?^Si>ghTkHfCnKa{D^_Zn85o?0)8pde zA{iU8&=Ma3#vQKWhj&}+D(&C9R|;<7L(>3BcaQ)In*InUAPSfbc`cn^$hx*a*Ag2% zU%d*6bLiy$pcX^6lw>VjhYnqUAyB z@Az92V`EQb9j-@O!Xp&JxOVS839d!y)Tw(PjT_#>2#@;9!--j0TGG~1%Q=ff-Y>kn zyE`{&D$SzHka$C61@MF+2%$#5zkB-#TlFp<;@q?66dr-Nyzz-9v%cyG#mJbLn)(DC z0sD!5O&O9?5+4EV-czHhg_RBTIzW?@+?2@rG-9dfadoe@}?p zPFNzs0$PpXg`zSu)q(E7E(b1y17qNjCCFINxc)6ruNDp@k{6E>T}Av7zR|Mtl`0oj zq*AJ?jFDF}dU)6z?pOkc-4nY5T(sqYS};H!Nti38GCJIlB$90~Fo=-%7iJGE3w!iv zRS9}jNa({lv0P*geDfxJb}&N$i3CBJBOL_*MgV;BN&&flE+OB|kr(umQld zl3M-#G_Z9{qrornt<}YaRTeigS=;3qLzyo7x*=1cG0N-cMJc>>G?IU)8 zaVnU^Dcc|scv=JsePpD1j?~zUL18_OoK{}!2KEnN`lFWMWiZ84LZ9ca7a1nQ>C3=f zlOxw)yk3@5H1FD><@5Ce6Jl<3{$|0&fFz-vE)O403ac_vcvSItIQbV~QpjvAJ~6Cb z@f1&CViH3RUZKZcZZWZdtn+XmIUOlaPqdHRs;;dKotd$dz91#_5Z)3tMtn8SCviU@ zyO7CLB$kOq`I@Fn13MU+nA9NLTu*5t2O%UZtoYiYLhS@~OL3JLwGf0-!?Qm%?=b57WNEXUU}PT93eOy$P#EElpK}IrfCw$Gt>H?)0-F>Re`c0QHx+B za;MJ^)(RlE{WQpgvdqrU^E(aT+`tkc(K{-QjPgNmUmws2F#(c;rVo5QNHN)7U0AuIWIU#vzBZUvRIQVcceMkC@$+`-KAQJd7AA= zK4Y>@!Ft5wsJCyAKizU*O+T~w(TJ$1DqyNe*X>7&I!3y`Za1q2oSVsfyb}eY{GI*u z8v$xCm_7HrOv;a&GHuBSM_5I0Gl)3*up$K9T)N~9c)nx(LoiCOfNsOX!^^7O!0rHw z!c!ObjS~XX=g{>hv6+9)uG=p7tohv%^$EE58U#T=Cc^WOfSi1=HAFk5=@pLa-MdRM zHJcMv)~s%q-TznR zD_(bDqj2K1f8n+EH|+R0-9ChQcrjom5O&=kj)nY{o4fml=5D>a^Ez&#p-2Y2OLVi% zfeQGpfTBZ^JDwcpD2K!Ry4jSqpJz$x{Wo8oANx&z&`2@$$AcjOUYQ|-OY`l6r6X<3 z8mp8McA86d5No|+vpSdk>$iD!?L*$zQksz03YfKs;0QW;bsjCpcc$h>?Xr**Rf1wc zYyx;%fot&`{5;QYsf#8>U5~0BHd2wha{QJE3t@$?9jcycb^ezYAi;9e)Lm_+#iGK0 zPgU>VCaV7frNKVJDNr2dE$tl}Eix}PYhnqOr}i(u^qt9nN9@kE9mW(MW>SPq)sOLK zp>}+jtZD0I>W`&(W$g=-+dgmN^4^b7$+vm`X5pok6#ttz{eQojsl(jAUi~aiw_2jE zt4j36cLuSzqi%Y))sY*YJ8>@ z94K$ivj4u?3VH(3!+Ex;mAG+43lu9yYmZv@znPy%$%%-JJc~eGo;BGL1zgX?&MtxI z)A-TE7Z%G~fjR+x%5AhB#cP3fGimzR(_IlXQ>2>xK0JIMDBjW9i16@oaA1Tq(y%BI z07Ozk1dL7Zo&1|8>9$GBP!t}1wapJ+{oYjL5(+4`2@fZ zqHYN2nu%1W?(%owG?fvFGc|{7Taj2!&d`c8xyKLBt#HI5a-p86t^M9Kt@E{5Tq4N9 zbN2QbV4toFE>OMCn48BV9jY!bH*c9FNKJH*D7_mvAh(!g$%UFU}&}GVX=f@F%_P)IInc{m!CS;4RmA+Gc4IEL8Dc zg3w0=Ci+-4<;3Kos^6(`nKNQAaZAC=UP3$S+j;kj4 z!#V?hmR)T&79`Sp)%p8;=}RVnAjs*QNM* zf6dV?@tGnJa_aB1y?eaNfnMTT$VxtDexIB;O5HYGa*yG@MvuwJPW!XQ{!4rDYi zCe%B)4<0;^s6%X!BpJv)krWb}6A%zc|LL+F@Yk|sLVTVt7in9^$e0=&Fn*3ZA2zNh zybMq_XehTo;A;>L9=N!0?b>ysqM`z;T%+LhhhZJFu+qX@*+MkZkbhCBQ$HV$cZn}t zQVf%?!4izuUN%FFB{9bn-ZeObW+`ny=(bPrN}{L&G=&9Unn)q^q5Xt0U^UtB^3gJJ zUYtRLs?Z)_OI1n9ueM=}B|yH5+2&WB5o%_B(mRKP#6=b=;|^ABd^B)D9f%1mtvee6 z8X~13XnDd{gGITHtQC+PEaqLBLZa=%_=B~xsCn4h+KLvr&~1Cq9h>^TE?JLdm7ncC z+B)QREy>8IZSDVWF6zJJn*Up+AOD#rxwtZ8*)kL4tBq+EVSsYKZl+xW(TgGn(3??p z_<3Zi!bVw0VUZmfP-n(Pi{v;wJ|rfN^Dg}1^?JWpd{yVqbHnhn+FtlGr1|H;SdzSl zWD&fX!*{{{ASt)1wR3fKg`=tcaJ?A5WT#g#J5qJ9urP7W_6*tvz8#_y{}AZu8QhSl z$IZ{Lv|+;rR4yuOV=mKd1yH@Hv{c2;Zst;-Pl+y=+P;@kEIkL8?F4SPV8u$Var>$6 zRJ^!hbvTRoEY%4_HH~ZOsS30D^Q+Lph3Zx}GE4n%aX%;tI1ER_CU`@;MZL)ipPza2 z1t2={M24fkO9*9=dZWYB&(EQ>FH18Ht|M8$VmH7DI|qm1M1KP*m%_c2HNhpO5bk~4 zZkb6+a`JK~Lcvn5ymi?1*$FJEN}Og4Nqgax49(2yqAw-#19Rkm{Th&5`eN59q%yZ0 z5mZ!=;^8XE@NlHO_i#OPCE<_0eLLe_qSrccCC_D@TH4K!vobQvu7kG5yQwAVSKR)w zm)wj}$;j5bV4**(a06@e#0#jgS>jl6%XfqO6 znU7g_52Uo#qQq5pG(=oLK>4ul_jA_P)^ERq4gL7hI(LwPc9)*D8z=nb!#HH$yd@Xy zycq%S4V}ksanjNOkNyiMzq=8#8R;to!TV0rpP#T@?o@0Ky8Hz5BeF zt26ils`EYCwH>}Q?(X+3(S_^6AL$EN4ndQ~;En>fKGY)h*3EX=1p@RF?;jG`-8!!e{Vd2ycebb+E{{SK@p-|G0bpWhfshewP+VF0IWu4T zWkJVz1hbtb*T!kZk!n3kQi{m; zNqrG&q7>wvHI*SU0><@xgi%4*C$uL)(hUs}0P(%AR5f1~UV{c{bk^Z7nw?U-++l6t zE0mO!f?Zrz5Jt{41-wi5$0pM%zoQm}TKMqc5NMVt6g5m!F1wRDDj~Exy|h$N5-}F^ zy?gJT04hjWLmA|>LkHy+k3jJQTpE-_3^oLjWBF$%6n$`NQMld>AB|W;N^B?_+zFaO zk&hTPseNM2z`!8kRs=yL`D|;2(deQ!jfW8{3Z)d`KFaLnP)Xjh|6+O2egqfLJIfjb zXxq2quVdf;kMmu0iT?}n-dEvz=B@f*kSa?3k13x&zYC5K!LPplqFjK;C6wkbC@EDR z?fVDlwYC8QCkPW_3#x&X$D1R_Gu zqMWpE|9)8@{hMj(By}ShKeEroklFTO^nuU4!O7Ww&R1k;s3dAvsN#zCB|}aE{>~Ge z)wSe#z*lfn#K=Ke0>H`CSkYc`=KJuT*-EKTj^n*Gc1Xg3B}ptICkdV(%y<8#K1(o$ zF)?yT3Pfu=A0pA~v5bUBLM(8|&%{oI1uPqUi8QOIzP_26xY;7UpUHy{`(L=>04pxw z+E?(r=gz&5eEU#5v^Yqkam;PWU82D^QBLQsK&sf?SXMU&jUj=Mf* zSM@+$#z3lAP$hvF>m4azt%L9N1V;vTNYe`cK}gc)&)0*TI-W-Ja4CTAb|R>l;-~HA z$b(h0peNlr0<|>Yv)Z; zR--yB<|1R)rs7*08aSolK2U{&yag3GXihv^hr9sz@v=xKzUwB!T@h4=+zF^|pg!Rg zm{7!FqO3s1izjB-{w)(KU_Due*kiuVB?puVY= z|?a6+Z}eO&zb3sB8(<}j@P^4aN#rov?E}8 z5QjubF#-mcuBZ6G&OyV-+*dctRJtKE~Q;j=ok(w(mccd`h>154h{}U zq@dl(EKnpZs>JA&CTSn+w&~vjO&b8x|3}helB~B?a>nYHe`>7#G`PaN!B^BU+{I-% zz4Z}tTLstnh23_OOovC;&Ae#+)B)es_X50xPfvBQ&VSaLkI^@iY;_$CuzeZP}R?P-rfI?gW zoVYe|N`HM`WU#y#@I+>geV5&Xk-7of@9`fFVvgDgL zZ&*6Jd^XTtC-(}IXMB#$kR}NafswI*K;&zvx=a{cYwod}m}=-7CyXi5Sx~3CiT)}0 zzwlE9xN#c3$GT5gSPf#2^!6v*mL0A~Kn_c9dDh=wr}4)UV3b(n?N*u{cZ`@7iK8GLCgs1VqVF_#@f0!xlWTPAc1ngag^D{EEYLP zfdEk$r6L3a14IGB>SoV24{@OauVOUhb_2>u5|06@*|F3a85vf;zP(haF{9ml#_-%{ z!o%Yo!PG<}cPGN0hyc8gwDe;XYv9WyQkp;@gKJcEM%hsSxF6s!w(i?P0jf5Tu94yi zC})TnB0&XhH_Lp7k}i>r`5d)C3FJLbIxp>Bbe<y$275a z?OIx4v1&?##|v5}hx1fg{Atr(cebAOux~FQ20BLMc_=Ky@dnONL1E(tU|?=k9HygvW2?T`K!rURJ2+y`vM%Bi-QC^AYGyO% z{uGm{AgU;@c{C!Sq60Q61i=GbjX#FTky%+9&Qp1;I8v51%BrN`j872p1=xtqtgO7! zqyT~9D)Q5}$W~N9oltF?Xm@qcy~i?vQf&=%c-7TP|EQHde7I01HXFTuhY-qlVOUpM z{h_QZCw!dho@ClAY|@;r3>!vBgfhmYEtyj>R39ZCLhT{EldK5g%#}&tEDha5ynxXaer^&GbIuj(w5$Q>f2K(Dy*RON(wI5gq~>t$Eh|(8a}YZfb-GOVrfVNZt>c zD>`~Vsg(mvMSr4&3w3MsiP%_Kk!a|iWK_q4v=efHNR*{PXpwvrYiETTDL3F6QF!_Y z7+DrD+w4Ob7C@qlZa8o(cNzUy52mYP3G7M=b#+~J6zpds>G_h7gb zcofDqRqI@ab(Ur$yicR_Eca_2D*=F2{hbX)y-P3)gup&%5c2tAR z=$xD-Weae4oJjDtRV|)SpBJ9>HbOgyWSotNCi?2)>L6y^4RPYjmm7!==Hlg5MFb)A z3=(3Za71nk9iGBhPugCj>asZs%oFgvmCkUeC2P%tlRknbJ}R;5P-yL!c5gPVLm^7( z{P}mDo}O%FH2U%OW8R(wXQ%vGqU(Km<}?zN4i?@62b52oxC6pfok!JOcQtK)lJ{^X zu(}m&UjL9}qIrC5{uyP|2ih%A(+^nhbz1*0Z;_RGoIo@7HeTbxTNQ(Yrc@Az<>los z+DE3?U7JCulf2tp$l-x5%|vsP4{#>50?P$b`}N>!GJe%-0Tx;hwZt6XY5srtP}s=I zrAwHP-aM@!HXV$77==agKlT2{&=?dgn{cszO(~7czHOw6y@d9$PQ%6@b;BElbuC@c z6(dOXSZaRSMk|7t51c*Q&$xMWPZY$(ts>c>p}IfbFV?!+c-=S7!pT9Ncjb^Ks)_h1 zmML2L&%a_gI&H1vw`wmk0Z;$+i#Mw`%<7c|C~Ij2;#Fr^4$CRtIevU#U;t(#{bn)2 zsC$hMnPrW?CZZ~Hp}Fh=?SwaKmoJawInI8%!nZnck+5w%v`c#dfv6hE0ngUa3VkJj z?U_zqXQ)gP*uK*a%x$CM`;VyS_648YXZfjM#mbd66&1VC?)6GPHi!pvMl z?>u$N_4)H&P(&*HOf{3)lcFKW5Ce34Lh&uD-`}^D1d0>fdZ~)`%{HHxN%d}$K}3E- zF5B7~cX59xh@2eW?g8rzl=hSD#tqY&2iZy%O~^>9Qk$?&XcCJ*`R;|L)AV(T-5ZDv zv$*XY+2LEl0UO3?hi^J?N%5b1xF^-yq^T2+&t`xaiA6$WhE~L#4c~o`cQwD`hI}i{ zLfSU69hg|~fl$HOIS1S_LO+)@QYZ3w7#`*hkC%jz?<*V-fOA~PUzpxrMY5ivJFn;|M2 zGyQtvQQ&i+2LAazrHi&n6z7Axp7+Bh^E*aP_YcA60UVO|!J}RG2_qN6-w8 z@2A|OJ+p`lKg};fSV6o1!8xQB3!y61hc6(>WZU@Cz^5>Pi}pYaEqD*8)yd8g0a`I{ zPBfS%!YCoCig*RJYaQ_X@;(Z$Lhj+ENYda2F1Xlg&EZ+PyA5?_0k`h}UAJMd zqC171Y*^g7E1!M;P6$L71s)Elho~*Hva;Y9m67p4Zl-kU5@#Ntkn19w<#y%d7bmuj zgjNRU8nj31xxTsixljXC#=}8Aj&_yR5$O*Ur`ud^NatjL;6P;R?dhqguYZH05#G?M z*{TjoH*R+J&SeD!+6Rdm_8~p1ih_b0UEVqPDWZ&kdj?W)_S0B2nGbkI;#5$m>dt4> zQrf>oQC|KzU0(U{a6H*pu!Y!s!aT@_jk-HcLZ(M#LL@?=M-Qw8a$vPAyJW~xg78jH z0}lS}Dp}Li6eT|QliqH2AO$t}y+m+b1wx!a1vv8!b7VnpufBfr%RIUqh;Ch3Rkbg0 zz9$fUjQo&r5mBIm^9+rMBy`M7p@P%R!h}}P7l@FK^P_>pLGz1-pPOs4Uhz%p+>C&5uv>OxrAUh|dSH5nZotA}5PmpMC3W!2ICQ zygWG${r%Nwh~X9bh@~Oz9;7f><}{HAe*Goeq8NepPC$;2Xg)IcKAe|0lPfM(*fr{U zj2*ZIaZZ`YfX|%?HPHMsBrhYgebQq876_C)41AEFW5F4jkKw(EebhuMBlA)aIf9xl z;v-=NpjzRzm8aROx-^5f?JT0R>$7J>fQ6o)v!|&r77|t*XD5g=@#<`xy22OkrD-P( zc~VuV98~VL5`o*-JRk}|K=B)EryDAI8SOx61lCv;6Pi`+Vg0>fhyED@MoR-?t> zGR4QRdjdj7N#X@ka;Pyx&H`An&E*{&KS8XJ0?(i$h59a~aCYaiWy=U%?}Tu|dEkH? z>3@JT5;uQF(>=hyY-1b`HQ?I#7-X2{n96P9iAbK};^Ok(E++V0X`xUBg5_iB=cp?OV4 z*ydXECA{BnxhkC;}QIgM^#e(waZg1DlDME**i?>40C163J89&`A$RN*3OTUD0eCOZgyiOx)!Ra9xlO=gR zstbeZeLU2r9ICITT@O39kBiBbrd2XEtyRsLQ3eO4F_yeA#5vD+taEYIi#ZJvSl2vA zx|+9Q9UUFnqTxp=0GnV9b8~NN+IDV603C4GaYmBSn4t6U(4j-ud_pxH$7{am$h_WP z@nkc%lBQmV|?ZaRss7;_LMYq&HrSbKY>z>yQW@CrY$3L2kMQ94I3A- z(6WOh6^!MVk7%wIg{+gvE>W_RhMgj65+g;Fo2&QQM%!fbH1-%J95^Cyo}7ic$+4mf z6@H?j0?c`wKgg30>2!(PSSE5c$4+i7+g58l3L#Md>YCYe7U`D4D>AifeM6DkyrW-t ztBQZKtE7O4h~LFui@U6@Ua8#**Tc)JpjYZw(bm=`5qN};?=8C2kpHpCr_mw>h0!a? z&RS>(sRp(B9hht{Y^I81pY9!`4GC6d^=ZQk3qtarEv1C5$$F;VZvgL{jezO zfvwAaaau$-C_|D?J)&UgvE(pXL?`NpVX-b((PGmJRUDYvIxzR7Q4|11`T{hbq&ZN) zs8$~oI0)H7pG6E&=NYW^S0E@txCc=KRIF6mae(l;f)0Dj| zmtledAbfBXigi1Fts*O%`$c=Yp8ml}s3I%;ZCWCL>@YUK!;4=GYTg{sTPQ$!u5yBS z7{TBq&5!Wyx+FHijnXmNo~rnhofqb1o;zkV$Kq&$xi0!CG+B3jt7Ll)Esc4jzh5gF zbT_g{ui&+s&I?z+e*HQ|q#dYHZ`-zwG=Z9?{#=1j>DZQvGys2YiSS4tl2b&wGIE%< z`>Ibmbr#G}t3qN+Y#aW0`O+omnj%y^5odOZO&*0u(HK*jM zsg^;z%A4Rv)ThI@L`b^^Sr(ipEPEC-#-zkEj&l<6{{2aAmFU#&Cv*Rg$Q7EMogI}- zJ7l+|pVa59Lc)PY0FVvrA4w$)&QL*|nnYYNINM+E6aMdEh=2Z{Fr<2Yo;=I#!l(5) zr?K0F9Yd8@Y`fiY?BjhsoV?yB(wsI67CPO4Po0q!2mC$$OpM3se&y!cS5v4 zyktoouS5D96&5B%l%;SpXf9#v`R;ufF#9|NzaR*t7pIhPuoV}~cXx-A4lOjSNmsV# zKNUE1=sn;vQZnQodt>vEwE?}jlO7OM&=A?9a&kyJDX98>dla(}hMvvZBBBsdG<(F=Og$okW{Kt!_3omyzfsI>H~eqtR{lF&d zScL=uGmv1B^MQSY$^Zl(jwK1QuO?_aa$81cnj{64PkFP$A$W*FiSX2^Q+Dl-_a<2n zsG;#s)6&ntheR@BQCf5DjD`jVz&YjXj{JCw^rdR%3xMG}En4zVc|rGD+*N$j8crxf zfIGsnhad1d{JODc&mQZ%ov4+x_y}E1$(k?tHkI zwIL4ek`Q#tR#neaXUBheC^!Y*Kq^SCLNrUS;v6L4L%_FbQwFMX8F%nLBQFbx{0>4u6a%VYfg5vlkbx3H4BS%5%YSl}Yt!`$m*Jfa zu3R~eWCLja@qo9tHxiIK9Q;k|A0m~f%e&P&1=w_PKL^gg|K(+EbEJn1qFZ;ktW^*5 zK(rz1c4)Vt8Ee3rdn+9vwmScW0*Jbg9|hN~Uw>AZaTchbY3tTh!$s46HI5TS3!@5fFOZz zdyx}jAMn;|{#r`FC^9tCsS1@2f{Y=yWd^&=OUr)VOFZ2~w}Lb#MS+tckVu`UPC~1W z@7ayDv)-Yc8O`(W!WL*r*6j^J`2PKTQ&{>*8e)D2K>ugX^kfE`0HJYN?rJpkL z)_(i;h$uAHKST#mEQ+oObnGgPUZom|&Y&H7F1OCScACs+C2C*fsYFypYG6>-T^n4q zf5z+6^?|75usF|+&^xx+z~U!OAVOEmyp^zpSJQz#bWs4X`Nq$XUo@-96?pp3v?%Sx zjG40E<^TKw$0_%JuE*Dx{j1dvAVotq_UQ_ti$EseWPzebtL9yu_K{Q&jgnGQ*L{Ac z7QoA)E9zR}h$D@uzM}2TpWr+ihf;>W@DJiO?-*cYY zx}X7P^>_eUR@D56;u|fTv9*ir*zil)C-r797$QD^v+QfJAF4qw84;vpL7+oocU{iB zm2Fnbr0dgyjx{Up;XurQd_x_8OWOVFR+8!Opc(h^4{}fHTXURqh&mXy+;cc^`Wa~# zMM6z#Z={w3TePZ@JECEk39=psC+S+D`xn7HK2+9Xzm6?B9X2>Rcq5R3Kv|@j4krGZ zjrd=SuF@JZ7(!Kb@=gM)t0e8rL4O8~Ep#A#u{ z%ePZUe8>7ezyi>Hz$gmFN9az0(!_`k6f<(#E<)&xm``LYL~IDDJF-8be?$9LAGk9w zl5FpG3{wbH0apOxnBD&=6{EC}%c^@bFS5Q1i4Of3AhmDPnnJirutWCWJ4OJ0jZo{o ztD^|9H`anWD!!12O+teQ(5n;Sx9s{83dqbFR4GB*Wt;V*_bUWrlO$0{d~6bGpgERI zdx=za9C6l%AOs-RBa%NMJM_YZAO}SaytR^Ws9=up3b+IrXhD?zo7PARGtR&-*g;Gk z*Sjd1<6tc=fYe7BsTD{JfIN}GgyTEk0{xDSjjeqyKzB+$%;JY2vQo&JfK($;oP>jC zbkuMwI6UY>t*AH;j$Pd)i^j~hwYNAYq~)io^N`C$#GH(b4L(DMK`hOeA;V zqeCF=$-T48N6ayu=u`0z*M=4|#||8)I8?`%(TnWN;~PT=508sefb3Nb%|C3h6<6biEOFANIb_~`J^(ir5WNRvPltJ>sNz%ISm1a6w*TfP`A z&v=BYl<~TIy?$-|sbF0mx;MY3n&3m4ag&C!i-~UW*FRDJDC8UdcT9r+D`-{7UGz>A zJCiGp7Ux#FB7V6BV?iuD4g`+676F$}kQQya2JAy_0ba8OkyO@f#Vlyd>vEkpo_THod@%;ul@D81KzF z@(t#Yy%V&U3^u+QHBJmgbb4z$`nv~eiwZO6*~_4j)y;nZE0fU`7~z0?B*O03ODRaV z9Hl|lw$8Rp5=FrkzFV&rwS2ef1v#~mR#S;`6Kx|QWe&d&lQB1A`Mgf&8yXt^apb&0 zu?R9CEeV7{H}`mig5z1j$r3eWON%C%tb=#UD6*%$ckW6!$AXRsjL7+??851=-NCKxo15kxpZf4oA1f3JcdTY{9zFb8I16QuGe#3h4-T)y-UJe`~( z^3YHN4yWgmL5~M2^!XFoT5C4Cu$%2ST2ybl?H*|u z>Sfk@3aFm1{kZHsg?Q6>AT7jfkWA>~OD(|d;otx(d4vQvJ|;CGunizr9uFXu#9s+i z*8lq%IDXLVKmnC$^{mXy%KJ8vA|M$p> z7B9;^y6n!Q&&!&hxJtN-Zocw)t(2c|O-t+sx6!;n2k$T12Z_iFxceAo`ISHM4*h$J zp{60zlb&Uq&gGXwK0p)`IaB$(*S3CD_E+4wLz!=5PGsC_^`|U$ExW>+|EL~a!YcEF zUx0thc|RwLm{Q8F7`s}|Cgr()n|b5PPoGYJ1d#};h;n+n`uI(NS}ZFFw`w2}2ug0a z!R_a3A4IOAWgd;nA1Y@En42HZb$*jTiMFlnElJzV)u-ZyUtcz@fWs0H5_(g=1?Bfu zfBgc{0ytpTuhY&ahiQ~LGxL)W1z^d`%>juhj0^ZR7sD-4P*i1N~QXunscI@y5 z4+RkxRlcoCI3e%oWlz3#b3_jZ;vp7;m;guv_tJb7v^6cgbDIW|YEh&^alOEewGP8m zv}bWjfPX}Z#soa@U7e>-o+zC=$2aK72`usWH1Gh=4Eqv}l~w$NG$4YsNcej2(tsTv zq6a{LLfzAYAs5(a0;MsPY`BdC5&1N6ul$;?axB5iJ&hmxf4wH@n?CI^YQ6FdnKV}Q;i<3`A+hL!7gK-sAx!cuo^C^LxAO;5Gv-UA=< z%%lr8%_=PWeOdWTSBpbgVDr_KCM@LC@fDP*i|;GKQEjBlJL4zu&3^4v|7uxHtdBG~ zV1x{DoVCWN6bqs-LUw93(SM25MF>@O_tRT4g#sD~qJn}{sHmi*hU5sSK@%Ms(Q5NE z5rHYPSdtYIXs}3gs=3bSD!F;h1LSDPb@5TiK47XqUku!xf%NgC z8=U8bXQ4azVlshpBrdetajrzRig-2Wg-K^Ju?6LapK8LC+=7j61p?sM12H9yRx|fL zthbSxdQI743%mUq3Xg|0!))$p2Dbvzqzo{LXg^qruHAYpKasVdzZpB+a@oA_kz=l~ zkmoA4$B_4tru?ual=!~^w~&-`*fXKZ+D0wTr}@p>Moj-E`5b?ol~4MwrAx?hM|b?9 zizy7)NNHoL1=j{dM|uGD^!C~dQ*JNZt6#Z)5coGTE>0ElO_E-0buq;-8X~npFZG88 zA;_wRD{#7SRtzvugf!|1?RX6f1dRsg40B3tW~Ipf{YC7`)qh|X3}Dlm2TJPd(Wp+M zyvhx23iMrH#3*fhRSVwg zETG3CaMmw-A~}w=NS&3I|1-HU1IwBc!^H6bm-$&PJ$c z0D}Q*>8|X*g&b#+P)ht~mbO6xB}y|0o`Lc3;HI*C8b%)meg9304MWp_ZWi0Cju9R+|fL z+-2qyiZ>-qp^J)Zwo=L?1iFP46j@Cy7#VFrk#YjY08KEc846StG!h3v)VUEIA2n<8`Dfj@`9h4R|m=7U<$$mto5zuurjV3Pu z#!~0O#leO^XRueEx{|`i7}$TuNF7NG@s2oIWUvTnUV*HL$iPsN{j!n=zI)YQq&P^- z9D@Su5Pq=F=>G8el|`Y*{srWV_I|?p?LxCZNat{5J80A((+A)V7`z_(J3HfSRiFqC zQSAntYA|&pod+qhl)1pIsV=~OWdAVK*`3TaYHFfse9?nIs%{QqTJ7Pa_ywb3mj>fU zivNBtg;uka+a%vaHw@@v>>QCIpd4w1Ge9_fR5#Cyuy|PxdM5W|)SOaBr z_gt(ENkYEV>;z#PJDE-$BcUqJ$62NoU%9zFy*i71^&_W=qvi_ZtVAaLXep{y|f zC%sKus%uEkc&iIEJILEHb;(1h=;r)4qN9Nt8RCmT11t#+D)Z#>rIg$m2+c_`5cwC0 z^lPbj7{`3base7i%Qw6OKH-UpYDmXP0D;#aqbz|OF=nkOd4|Gw=kM9vzdk}BN`}gz ztbHCK_jjp3w_Ab7)K1;RhOf*=6EGJAtSDl34d8I#+^@av!4MCeC&NTBy@)fgtYGCK z%A4Q-rx^nxXTUg&3lLI~sZLe=3}HV47c2r$EVr^sMn;|FM70zB^KB0vp^C&ha+bow z&y3s>xxvp$;k%K!(5Ft3wsAU`1r85&l6{afTuw1nHZzN3V;6e{*$e4F*)C{&PDbV_ z8z=BGX%Uvh&YJE8zW1}JUdd&z%G*MC7m}n;6f+hINw|;bsk0v1Jw#iaj_LaXtHG% zcT$IKppsUHs5kc8*NpTV;ouOA!UhEZu?+Akbr@BWjG4kP?8HNdD6$v2+R$+&!c$@_Wn`^d!0Hh8>28>{a&cRsp#=|}Vi-I693Wew8K5$^*t{0#_$9gg9 zGHFXE_73bZ96pgaFA91#K0f0P2@@Fzhm3)=rQs|=Gl?`IhYOh5C$a zJpc*mc}2M4!WRndS5s1%ApJmL5R1bO76_%rX@~4DURih+%4U81p{8fu4UWl6RnKqQ$Q9W}8 zGZ2Z@lJR6PdBPi$kxqy*?9vz!L=qDTH3hhRLULdXTP3*^I!3#n9~(Re`9^Tg58*iM zs&@v^;r0!)$2Xpa)M~W!7?DkpxwhyHB6C#HRX|j8q+}1bN5^uO%fBVr_(Ffz}^L^Cjf*keNf8 z76w@qQSA{P4?^usx4G8Kf0j^UMZbu>_zQ>ustL%3tI15d?WU}85x{sNqR9abh_^VS{!knv zEznD52(=Y1=KF#t>Yz8K{qC4rvp1kg7Wzl)_OjB0%ki$TVd zh2|-oz&g?&>*W>pPvIQ0DNu|Ab3w@7t`GhVW(6fOwAk=B&{?}I%J#?%ARJl_m2w+l ze=<)2Q7`F>8ZQ1FKFkArwo^DW^o`SNn==g+I41ioRcAwEY&$f3>vRFi}gOG8I!kU)nY)&PYV zUfc{eiOHYrh4xD+seX?f+t#cC1-#-ODkDP~o&F%9kfd;PR{_b?U^F!dOwfJ%pll;> z1!0~ai4xHt!8jeYUy`CKVvBppCcXA}2Z6{-~z-elZQ@NY|31JA_2>^oQR*1wAyD*Y}T!e*nGJ7c{oZ>0oQPF96Ippm!^-&TTR^JY1Vw#2~xN z>#ZI{H*6XQ#O`UjJ4%y3Qx{j{od^hl*k{Vd>$V4Gi3bgUd5euF?WefjiC&*zd1rm6$m(1r(b7#>Vwd~K`r+A=&Zl)O0F)WoyHsZX%j877Y`Oa(4B$mSO zx~zoH$_r5wo@@r}1v?;7{sDh>&jTq`;cB>{RTY|6p2uTl*N#mWsij#290!G!TGblv zv83P`pEqtgp;L|_G{c`r$#wdP&=RXcgJb zvCfknJ*NO_dG3H7h)m=>5*q4lCSt?oNbJj*0vn67LXd)}jkLJJYb&0L1rqRqNaXTG zYXXiOAU^4xcWe^aPWgO$PWu`L37RKw;0EDix3!h3?#6D3@isC3R_Bb2qz8O zGLk`C;&%!bTH7*$PDjHg!8)p!FS0zs-^g_VE#oKPx}c|xG3gACD-8y_L@5B^l}J0B z_6%RYix2BvsIUpPN3;&Mx2QkDSf_@wu`Bfg37M}w=vY1C;MtFy3AASC$4la&nX0O* zEljf&O4G<|-N~y5{z@;RPCFChsOl(AyVKI2Ki{8aUI-rO;zJ@-7Fb-vt^+P?9QUHJ zx}erl-Xv#oXc6hVsGaJnELBVl$nKe76zg1rqARD(05ok35LM#HLfbZ4bNx3AxRH#ioUu6{Za-b}+m1x-|Qsku4RiG*4 z;p&o@oXdv_JGNw#ff-BTZPvFgdiG?di;lt;o6Or?XJc*d5{(usxWi}vb9SdVhTk3 zrBl))2L4CW6nrwsl#x4R3^Fg`O#c=&XT*r-c1&vVqe~I0BiW5`a(r>xN7n>|bR!l4 z`=qp_M1^BOPNHH>d7iH`p#ArFkX$dXtX<56)R6M-MvVQ5hGXt`;YUxbr~!;i;!TB8 zDPuT!*9%dTOB8R(0>D+?7*PODSfd%zI?7f=GP1jOeR`~kXsmv?#LjSCZY}e^t6?js z1QUyqQ+syKy~32nbhUt>)CGTuLu0R^uccWD9e!!B!~fG z#b-U&no^AoOfT*gJKMyB1Ys5a1-Own-gV;jXtf>cADy>Q8S4;7MMZUf%p$@n$?o+S z6OuBkC12eBycafAZXu4V#{spNyRW)`=)6Y0SW2rEBIE!?w+8V*Qo2S-utG{7%62Ie z;5w<4m4oF_N@Z0nYeVURsZhFB5~E`CLevYFqbPqh3m6rc78=X3W1(7?w`2nYq6#nt zR^xGd6Al%5=|R=uuQjDx!k-)HKkDuD7Q;`4rQ4*gntkQA|7$bTMsK;WE^q#-{`cY{ zJMJ5u{npf(+3pn~?PA^c7ackK>oAAjWuDC~-UugfEU zN!qZXP@Dla6$DcxB@xrd%wQTuh%P&O4=brgrQRx4kL(FEGu4#L4|d0b*VkgPFb-7k z!59x&pfV(b8$bkQ%K@L(v0t4$b;?RboIkI@aM`n$mZsi_ZZfH_1H<$I{3zj%h>Cdv zell+0Pp2K&I_XPq= zgA8HT*TZA)+yQ%Fy_E53?JB=WJe`t)KhCl6PafXBy#?Y{c!KJWI)vlPY<8bVEsOxy zL|=HvGq8Q^N*+|M$e;oVwD<1cFTZ?saBr{dsilP8kth+^NqT8cFk z#X3r&o4r;zSxU>wsLgj0G09uz#wh=+qmCDw4cO(*%%0hbW{P#Hs0e>M`CQz#b!eiO z42v1G%EoDB+c+->E0P&H0Dgzfp6v&6#N5eu+c>iF`=l^33aGym?>;YYL{M&&Y5M(x zfqUiMfc<1%FXPrfobEg8DSpVztoyFe40Z(~L^H|4O$45x2UVfq;fShx6S}PS2|BiL z!jfUZzuBxZ)f&du3y_U4&e?Hmb9vn;W&@{9TieV~2zAxgE->LNj7Yxy;jDD70HD+} zH{LjJZ~XXR_~nrk@ya;dBmNuD&bnS^{$T#}bzLndQ$c!;^@y$S3&V^VT;bVnx2YCm`5`kT=MT0#vj3K7<0sftNntq=f4kZqK}qa|8QklS(&a0 zg5J}s#;@eF!#j?K7{gqh?>p}F#R z8y>>iy!`UZyox$>dF;hEi1>&q2r&%YpLAe&x5I~y0dFMwlB<2-#S81}vteW8UWFnR zMv|ZGm~R+O2QxDIaa8Z(lp)HT69?RodoT2cPxfG2jF_x77?OaCon9JCBXIik-@Itp2OoNg7sXqWiPfo&i$;^NnNZ(d$^Who9tq@N zMb3rXmILFv?)39U>erjMzquweC@!c?hwLCf=?5-{W>i)0$a>Z|{Nk%$TiXiXe)#k% zztBG~`D^?1`oCezo*H-luOI2P4OR27FOJNw*rH3KTE6KX=U}yAA`x~17P_^TwTX8P^ zQUKh-y1P57ID_J{IaDd8$4T61Gx_Yfb5d}XS6lKEoPh@8aW4Di(j}`t35=mB{NbAm zPR^lhx0+{Qex_TAu>Fsi*B&pn!d^_9duP!eA_Y^;+=D|~ziHEVF!bnK#B6A^4j))7 znG#kx4&BF)M_W5vrNA4{xt; ztFG1bNgA#C88gwcJ9jk1%S0U4O8F8N0jLF>mWw5f3C8%H+GH|@T`f5h{w_PMouebQ zAHl6iBqncEbF{jRN?_lkss0h%1_9dFrFHw8_O?qY%rw-_W`kW|^qI>)R`h+0kFb-; zx-Zv`c1`5Bw+l>p-$8@8rfLWdWK;}v)8}1wgY%l|cm~gz4X#O}-8#n4x&PC&fB?;ls*Q7gXwwuHShL8~ z*D5tAKG+VzIUsOmfConYv60|3C#2Xr9*(~+wR!5Ae6cg$fD1v z7?=j9bSssN|J&w+i>;v5U6B7`b|EEMy<9qxn0Ol6JNcn?i)PXh!p-v%Uy#iR&!YQ^ zxVeq`7UJ{f#T5bz-h8|`(;q) znCdG|X{Wwx?~yvv(KLSI?tUdRv@)+)KVcAv9)QWhhh_xQcup!tSrwolcVsuG66@WF zwfywlk-fGPC-rOYB7HW$^8dUkwfECIRAcO(S^+s7f9mh^fBnd^^_gScN}30pVy-Pu hvI@S9|MH>rEsy5xdpOwcSL=wE&xrRt_YDvJ@;?O>Hh=&C diff --git a/images/viz_prints.png b/images/viz_prints.png deleted file mode 100644 index 76153a73b3407c360f9d08f6622b5e5a3f2e4abc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41060 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 KMagrcfd2vp58hh< From 0bfbad1dadd5a5dcc9aacac78807669537300be1 Mon Sep 17 00:00:00 2001 From: Lorenzo Drudi Date: Sat, 27 Apr 2024 12:05:16 +0200 Subject: [PATCH 3/7] feat: extend models supported. --- openai_cost_logger/constants.py | 17 +-- openai_cost_logger/openai_cost_logger.py | 110 ++++++++++-------- .../openai_cost_logger_utils.py | 3 +- openai_cost_logger/openai_cost_logger_viz.py | 10 +- 4 files changed, 77 insertions(+), 63 deletions(-) diff --git a/openai_cost_logger/constants.py b/openai_cost_logger/constants.py index 6a72e32..c624b77 100644 --- a/openai_cost_logger/constants.py +++ b/openai_cost_logger/constants.py @@ -1,17 +1,8 @@ -from enum import Enum - """Default value for the cost-logs directory.""" DEFAULT_LOG_PATH = "cost-logs" + -"""Enum containing the tested models.""" -class Models(Enum): - TURBO_3_5 = "gpt-3.5-turbo" - TURBO_3_5_INSTRUCT = "gpt-3.5-turbo-instruct" - AZURE_3_5_TURBO = "gpt-35-turbo-0125" - AZURE_4_TURBO = "gpt-4-0125-Preview" - AZURE_4 = "gpt-4-0613" - -"""The costs of the models above (per million tokens).""" +"""The costs of the models above (per million tokens). Dictionary used in case the user does not provide the costs.""" MODELS_COST = { "gpt-3.5-turbo": { "input": 0.5, @@ -33,4 +24,8 @@ class Models(Enum): "input": 30, "output": 60 }, + "text-embedding-ada-002": { + "input": 0.1, + "output": 0.0 + } } \ No newline at end of file diff --git a/openai_cost_logger/openai_cost_logger.py b/openai_cost_logger/openai_cost_logger.py index 5bd64f0..8633f21 100644 --- a/openai_cost_logger/openai_cost_logger.py +++ b/openai_cost_logger/openai_cost_logger.py @@ -1,29 +1,21 @@ -import csv import json +import warnings from typing import Dict from pathlib import Path from time import strftime -from openai.types.chat.chat_completion import ChatCompletion +from openai._models import BaseModel # all the api responses extend BaseModel + +from openai_cost_logger.constants import DEFAULT_LOG_PATH, MODELS_COST -from openai_cost_logger.constants import DEFAULT_LOG_PATH """Every cost is per million tokens.""" COST_UNIT = 1_000_000 -"""Header of the cost log file.""" -FILE_HEADER = [ - "experiment_name", - "model", - "cost" -] """OpenAI cost logger.""" class OpenAICostLogger: def __init__( self, - model: str, - input_cost: float, - output_cost: float, experiment_name: str, cost_upperbound: float = float('inf'), log_folder: str = DEFAULT_LOG_PATH, @@ -32,21 +24,14 @@ def __init__( """Initialize the cost logger. Args: - client (enum.ClientType): The client to use. - model (str): The model to use. - cost_upperbound (float): The upperbound of the cost after which an exception is raised. - input_cost (float): The cost per million tokens for the input. - output_cost (float): The cost per million tokens for the output. experiment_name (str): The name of the experiment. + cost_upperbound (float): The upperbound of the cost after which an exception is raised. log_folder (str): The folder where to save the cost logs. - client_args (Dict, optional): The parameters to pass to the client. Defaults to {}. + log_level (str): The level of logging. # TODO: implement logging levels. """ self.cost = 0 self.n_responses = 0 - self.model = model - self.input_cost = input_cost self.log_folder = log_folder - self.output_cost = output_cost self.experiment_name = experiment_name self.cost_upperbound = cost_upperbound self.log_level = log_level @@ -58,16 +43,28 @@ def __init__( self.__build_log_file() - def update_cost(self, response: ChatCompletion) -> None: - """Extract the number of input and output tokens from a chat completion response - and update the cost. Saves experiment costs to file, overwriting it. + def update_cost(self, response: BaseModel, input_cost: float = None, output_cost: float = None) -> None: + """Extract the cost from the response and update the cost tracker. + Then write the cost to the json file for temporary storage. + Be aware that: + - the cost is calculated per million tokens. + - if input_cost and output_cost are not provided, the cost tracker will search for the values in the default dictionary. + In case the values are not found, the cost tracker will raise an exception. + Args: - response: ChatCompletion object from the model. + response (BaseModel): BaseModel object from the model. + input_cost (float, optional): The cost per million tokens for the input. Defaults to None. + output_cost (float, optional): The cost per million tokens for the output. Defaults to None. """ - self.cost += self.__get_answer_cost(response) + if (input_cost is None or output_cost is None) and response.model not in MODELS_COST: + raise Exception(f"Model {response.model} not found in the cost dictionary. Please provide the input and output cost.") + + input_cost = MODELS_COST[response.model]["input"] if input_cost is None else input_cost + output_cost = MODELS_COST[response.model]["output"] if output_cost is None else output_cost + self.cost += self.__get_answer_cost(response=response, input_cost=input_cost, output_cost=output_cost) self.n_responses += 1 - self.__write_cost_to_json(response) + self.__write_cost_to_json(response=response, input_cost=input_cost, output_cost=output_cost) self.__validate_cost() @@ -80,16 +77,24 @@ def get_current_cost(self) -> float: return self.cost - def __get_answer_cost(self, answer: Dict) -> float: - """Calculate the cost of the answer based on the input and output tokens. + def __get_answer_cost(self, response: BaseModel, input_cost: float, output_cost: float) -> float: + """Calculate the cost of the response based on the input and output tokens. Args: - answer (dict): The response from the model. + response (BaseModel): The response from the model. + input_cost (float): The cost per million tokens for the input. + output_cost (float): The cost per million tokens for the output. Returns: - float: The cost of the answer. + float: The cost of the answer. + Raises: + RuntimeWarning: If the output cost is 0 and there are completion tokens. """ - return (self.input_cost * answer.usage.prompt_tokens) / COST_UNIT + \ - (self.output_cost * answer.usage.completion_tokens) / COST_UNIT + completion_tokens = response.usage.total_tokens - response.usage.prompt_tokens + + if completion_tokens != 0 and output_cost == 0: + warnings.warn(f"Output cost: {output_cost}. Found {completion_tokens} completion tokens.", RuntimeWarning) + + return (input_cost * response.usage.prompt_tokens) / COST_UNIT + (output_cost * completion_tokens) / COST_UNIT def __validate_cost(self): @@ -98,21 +103,27 @@ def __validate_cost(self): Raises: Exception: If the cost exceeds the upperbound. """ - if self.cost > self.cost_upperbound: + if self.cost > self.cost_upperbound: raise Exception(f"Cost exceeded upperbound: {self.cost} > {self.cost_upperbound}") - def __write_cost_to_json(self, response: ChatCompletion) -> None: - """Write the cost to a json file. + def __write_cost_to_json(self, response: BaseModel, input_cost: float, output_cost: float) -> None: + """Write the cost to the json file. Args: - response (ChatCompletion): The response from the model. + response (BaseModel): The response from the model. + input_cost (float): The cost per million tokens for the input. + output_cost (float): The cost per million tokens for the output. """ with open(self.filepath, 'r') as file: data = json.load(file) data["total_cost"] = self.cost data["total_responses"] = self.n_responses - data["breakdown"].append(self.__build_log_breadown_entry(response)) + data["breakdown"].append(self.__build_log_breadown_entry( + response=response, + input_cost=input_cost, + output_cost=output_cost + )) with open(self.filepath, 'w') as file: json.dump(data, file, indent=4) @@ -127,7 +138,6 @@ def __build_log_file(self) -> None: log_file_template = { "experiment_name": self.experiment_name, "creation_datetime": strftime("%Y-%m-%d %H:%M:%S"), - "model": self.model, "total_cost": self.cost, "total_responses": 0, "breakdown": [] @@ -136,20 +146,28 @@ def __build_log_file(self) -> None: json.dump(log_file_template, file, indent=4) - def __build_log_breadown_entry(self, response: ChatCompletion) -> Dict: + def __build_log_breadown_entry(self, response: BaseModel, input_cost: float, output_cost: float) -> Dict: """Build a json log entry for the breakdown of the cost. + + Be aware that: + - The content of the response is supported only for the completion models. Args: - response (ChatCompletion): The response from the model. - + response (BaseModel): The response from the model. + input_cost (float): The cost per million tokens for the input. + output_cost (float): The cost per million tokens for the output. Returns: Dict: The json log entry. """ + output_tokens = response.usage.total_tokens - response.usage.prompt_tokens + content = response.choices[0].message.content if hasattr(response, "choices") else "content-not-supported-for-this-model" return { - "cost": self.__get_answer_cost(response), + "model": response.model, + "cost": self.__get_answer_cost(response=response, input_cost=input_cost, output_cost=output_cost), + "input_cost_per_million": input_cost, + "output_cost_per_million": output_cost, "input_tokens": response.usage.prompt_tokens, - "output_tokens": response.usage.completion_tokens, - "content": response.choices[0].message.content, - "inferred_model": response.model, + "output_tokens": output_tokens, + "content": content, "datetime": strftime("%Y-%m-%d %H:%M:%S"), } \ No newline at end of file diff --git a/openai_cost_logger/openai_cost_logger_utils.py b/openai_cost_logger/openai_cost_logger_utils.py index 362a8fc..c3e7a5d 100644 --- a/openai_cost_logger/openai_cost_logger_utils.py +++ b/openai_cost_logger/openai_cost_logger_utils.py @@ -1,10 +1,11 @@ from pathlib import Path + """OpenAI cost logger utilities functions.""" class OpenAICostLoggerUtils: @staticmethod - def get_api_key(path: str) -> str: + def read_api_key(path: str) -> str: """Return the key contained in the file. Args: diff --git a/openai_cost_logger/openai_cost_logger_viz.py b/openai_cost_logger/openai_cost_logger_viz.py index bfc3e24..dcf689e 100644 --- a/openai_cost_logger/openai_cost_logger_viz.py +++ b/openai_cost_logger/openai_cost_logger_viz.py @@ -1,13 +1,14 @@ import os import json -from datetime import datetime from typing import Dict from pathlib import Path +from datetime import datetime import matplotlib.pyplot as plt from collections import defaultdict from openai_cost_logger.constants import DEFAULT_LOG_PATH + """Cost logger visualizer.""" class OpenAICostLoggerViz: @@ -57,9 +58,8 @@ def get_total_cost_by_model(path: str = DEFAULT_LOG_PATH) -> Dict[str, float]: if filename.endswith(".json"): with open(Path(path, filename), mode='r') as file: data = json.load(file) - if data["model"] not in cost_by_model: - cost_by_model[data["model"]] = 0 - cost_by_model[data["model"]] += data["total_cost"] + for entry in data["breakdown"]: + cost_by_model[entry["model"]] += entry["cost"] return cost_by_model @@ -70,7 +70,7 @@ def print_total_cost_by_model(path: str = DEFAULT_LOG_PATH) -> None: log_folder (str, optional): Cost logs directory. Defaults to DEFAULT_LOG_PATH. This method reads all the files in the specified directory. """ - cost_by_model = OpenAICostLoggerViz.get_total_cost_by_model(path) + cost_by_model = OpenAICostLoggerViz.get_total_cost_by_model(path=path) for model, cost in cost_by_model.items(): print(f"{model}: {round(cost, 6)} (USD)") From f2139b048e368a12241bef482e6f3496a8d4c692 Mon Sep 17 00:00:00 2001 From: Lorenzo Drudi Date: Sat, 27 Apr 2024 12:05:44 +0200 Subject: [PATCH 4/7] feat: improve library import. --- openai_cost_logger/__init__.py | 4 ++++ setup.py | 9 ++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/openai_cost_logger/__init__.py b/openai_cost_logger/__init__.py index 7a69ef6..e511bd8 100644 --- a/openai_cost_logger/__init__.py +++ b/openai_cost_logger/__init__.py @@ -1 +1,5 @@ +from .openai_cost_logger import OpenAICostLogger +from .constants import MODELS_COST, DEFAULT_LOG_PATH +from .openai_cost_logger_viz import OpenAICostLoggerViz +from .openai_cost_logger_utils import OpenAICostLoggerUtils print('imported openai_cost_logger') \ No newline at end of file diff --git a/setup.py b/setup.py index 5e0ede3..797e609 100644 --- a/setup.py +++ b/setup.py @@ -1,15 +1,10 @@ from setuptools import setup, find_packages -import os # Read the README file (reStructuredText format) with open('README.rst') as f: long_description = f.read() -# Get the version number from the environment -# version_number = os.getenv('VERSION_NUMBER') -# version_number = version_number.strip("v") - -version_number = '0.2.1' +version_number = '0.3.0' setup( name='openai-cost-logger', @@ -20,7 +15,7 @@ url='https://github.com/drudilorenzo/openai-cost-tracker', long_description=long_description, long_description_content_type='text/x-rst', - keywords=['openai', 'cost', 'logger', 'tracker'], + keywords=['openai', 'cost', 'logger', 'tracker', 'viz', 'llms'], license='MIT', packages=find_packages(include=['openai_cost_logger', 'openai_cost_logger.*']), requires=['openai', 'pandas', 'matplotlib'], From aaffad8c536f21bc83f736a23eec8bf3a2963997 Mon Sep 17 00:00:00 2001 From: Lorenzo Drudi Date: Sat, 27 Apr 2024 12:05:53 +0200 Subject: [PATCH 5/7] docs: update demo. --- demo.ipynb | 257 +++++++++++++++++++++++++++-------------------------- 1 file changed, 133 insertions(+), 124 deletions(-) diff --git a/demo.ipynb b/demo.ipynb index 09af674..0d330ee 100644 --- a/demo.ipynb +++ b/demo.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 28, + "execution_count": 76, "metadata": {}, "outputs": [ { @@ -28,97 +28,96 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Defaulting to user installation because normal site-packages is not writeable\n", "Requirement already satisfied: openai==1.13.3 in /home/drudao/.local/lib/python3.10/site-packages (from -r requirements.txt (line 1)) (1.13.3)\n", "Requirement already satisfied: matplotlib==3.6.3 in /home/drudao/.local/lib/python3.10/site-packages (from -r requirements.txt (line 2)) (3.6.3)\n", "Requirement already satisfied: pytest==7.4.2 in /home/drudao/.local/lib/python3.10/site-packages (from -r requirements.txt (line 3)) (7.4.2)\n", - "Requirement already satisfied: tqdm>4 in /home/drudao/.local/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (4.66.2)\n", - "Requirement already satisfied: distro<2,>=1.7.0 in /usr/lib/python3/dist-packages (from openai==1.13.3->-r requirements.txt (line 1)) (1.7.0)\n", - "Requirement already satisfied: pydantic<3,>=1.9.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (2.6.4)\n", - "Requirement already satisfied: httpx<1,>=0.23.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (0.27.0)\n", "Requirement already satisfied: anyio<5,>=3.5.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (4.3.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (0.27.0)\n", + "Requirement already satisfied: pydantic<3,>=1.9.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (2.6.4)\n", "Requirement already satisfied: sniffio in /home/drudao/.local/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (1.3.1)\n", + "Requirement already satisfied: tqdm>4 in /home/drudao/.local/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (4.66.2)\n", "Requirement already satisfied: typing-extensions<5,>=4.7 in /home/drudao/.local/lib/python3.10/site-packages (from openai==1.13.3->-r requirements.txt (line 1)) (4.10.0)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (4.42.1)\n", - "Requirement already satisfied: cycler>=0.10 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (0.11.0)\n", - "Requirement already satisfied: packaging>=20.0 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (23.1)\n", - "Requirement already satisfied: python-dateutil>=2.7 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (2.8.2)\n", "Requirement already satisfied: contourpy>=1.0.1 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (1.1.1)\n", + "Requirement already satisfied: cycler>=0.10 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (0.11.0)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (4.42.1)\n", "Requirement already satisfied: kiwisolver>=1.0.1 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (1.4.5)\n", - "Requirement already satisfied: pillow>=6.2.0 in /usr/lib/python3/dist-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (9.0.1)\n", "Requirement already satisfied: numpy>=1.19 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (1.26.4)\n", - "Requirement already satisfied: pyparsing>=2.2.1 in /usr/lib/python3/dist-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (2.4.7)\n", + "Requirement already satisfied: packaging>=20.0 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (23.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (10.2.0)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib==3.6.3->-r requirements.txt (line 2)) (2.8.2)\n", "Requirement already satisfied: iniconfig in /home/drudao/.local/lib/python3.10/site-packages (from pytest==7.4.2->-r requirements.txt (line 3)) (2.0.0)\n", "Requirement already satisfied: pluggy<2.0,>=0.12 in /home/drudao/.local/lib/python3.10/site-packages (from pytest==7.4.2->-r requirements.txt (line 3)) (1.3.0)\n", "Requirement already satisfied: exceptiongroup>=1.0.0rc8 in /home/drudao/.local/lib/python3.10/site-packages (from pytest==7.4.2->-r requirements.txt (line 3)) (1.1.3)\n", "Requirement already satisfied: tomli>=1.0.0 in /home/drudao/.local/lib/python3.10/site-packages (from pytest==7.4.2->-r requirements.txt (line 3)) (2.0.1)\n", - "Requirement already satisfied: idna>=2.8 in /usr/lib/python3/dist-packages (from anyio<5,>=3.5.0->openai==1.13.3->-r requirements.txt (line 1)) (3.3)\n", - "Requirement already satisfied: certifi in /usr/lib/python3/dist-packages (from httpx<1,>=0.23.0->openai==1.13.3->-r requirements.txt (line 1)) (2020.6.20)\n", + "Requirement already satisfied: idna>=2.8 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from anyio<5,>=3.5.0->openai==1.13.3->-r requirements.txt (line 1)) (3.6)\n", + "Requirement already satisfied: certifi in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai==1.13.3->-r requirements.txt (line 1)) (2024.2.2)\n", "Requirement already satisfied: httpcore==1.* in /home/drudao/.local/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai==1.13.3->-r requirements.txt (line 1)) (1.0.4)\n", "Requirement already satisfied: h11<0.15,>=0.13 in /home/drudao/.local/lib/python3.10/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai==1.13.3->-r requirements.txt (line 1)) (0.14.0)\n", "Requirement already satisfied: annotated-types>=0.4.0 in /home/drudao/.local/lib/python3.10/site-packages (from pydantic<3,>=1.9.0->openai==1.13.3->-r requirements.txt (line 1)) (0.6.0)\n", "Requirement already satisfied: pydantic-core==2.16.3 in /home/drudao/.local/lib/python3.10/site-packages (from pydantic<3,>=1.9.0->openai==1.13.3->-r requirements.txt (line 1)) (2.16.3)\n", - "Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.7->matplotlib==3.6.3->-r requirements.txt (line 2)) (1.16.0)\n" + "Requirement already satisfied: six>=1.5 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib==3.6.3->-r requirements.txt (line 2)) (1.16.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ - "!pip install -r requirements.txt" + "%pip install -r requirements.txt" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Defaulting to user installation because normal site-packages is not writeable\n", - "Requirement already satisfied: openai_cost_logger in /home/drudao/.local/lib/python3.10/site-packages (0.0.2)\n", - "Requirement already satisfied: openai in /home/drudao/.local/lib/python3.10/site-packages (from openai_cost_logger) (1.13.3)\n", - "Requirement already satisfied: pandas in /home/drudao/.local/lib/python3.10/site-packages (from openai_cost_logger) (2.1.1)\n", - "Requirement already satisfied: matplotlib in /home/drudao/.local/lib/python3.10/site-packages (from openai_cost_logger) (3.6.3)\n", - "Requirement already satisfied: numpy>=1.19 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai_cost_logger) (1.26.4)\n", - "Requirement already satisfied: contourpy>=1.0.1 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai_cost_logger) (1.1.1)\n", - "Requirement already satisfied: cycler>=0.10 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai_cost_logger) (0.11.0)\n", - "Requirement already satisfied: pillow>=6.2.0 in /usr/lib/python3/dist-packages (from matplotlib->openai_cost_logger) (9.0.1)\n", - "Requirement already satisfied: fonttools>=4.22.0 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai_cost_logger) (4.42.1)\n", - "Requirement already satisfied: pyparsing>=2.2.1 in /usr/lib/python3/dist-packages (from matplotlib->openai_cost_logger) (2.4.7)\n", - "Requirement already satisfied: python-dateutil>=2.7 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai_cost_logger) (2.8.2)\n", - "Requirement already satisfied: packaging>=20.0 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai_cost_logger) (23.1)\n", - "Requirement already satisfied: kiwisolver>=1.0.1 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai_cost_logger) (1.4.5)\n", - "Requirement already satisfied: sniffio in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai_cost_logger) (1.3.1)\n", - "Requirement already satisfied: typing-extensions<5,>=4.7 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai_cost_logger) (4.10.0)\n", - "Requirement already satisfied: tqdm>4 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai_cost_logger) (4.66.2)\n", - "Requirement already satisfied: distro<2,>=1.7.0 in /usr/lib/python3/dist-packages (from openai->openai_cost_logger) (1.7.0)\n", - "Requirement already satisfied: pydantic<3,>=1.9.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai_cost_logger) (2.6.4)\n", - "Requirement already satisfied: httpx<1,>=0.23.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai_cost_logger) (0.27.0)\n", - "Requirement already satisfied: anyio<5,>=3.5.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai_cost_logger) (4.3.0)\n", - "Requirement already satisfied: pytz>=2020.1 in /usr/lib/python3/dist-packages (from pandas->openai_cost_logger) (2022.1)\n", - "Requirement already satisfied: tzdata>=2022.1 in /home/drudao/.local/lib/python3.10/site-packages (from pandas->openai_cost_logger) (2023.3)\n", - "Requirement already satisfied: idna>=2.8 in /usr/lib/python3/dist-packages (from anyio<5,>=3.5.0->openai->openai_cost_logger) (3.3)\n", - "Requirement already satisfied: exceptiongroup>=1.0.2 in /home/drudao/.local/lib/python3.10/site-packages (from anyio<5,>=3.5.0->openai->openai_cost_logger) (1.1.3)\n", - "Requirement already satisfied: httpcore==1.* in /home/drudao/.local/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai->openai_cost_logger) (1.0.4)\n", - "Requirement already satisfied: certifi in /usr/lib/python3/dist-packages (from httpx<1,>=0.23.0->openai->openai_cost_logger) (2020.6.20)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in /home/drudao/.local/lib/python3.10/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai->openai_cost_logger) (0.14.0)\n", - "Requirement already satisfied: annotated-types>=0.4.0 in /home/drudao/.local/lib/python3.10/site-packages (from pydantic<3,>=1.9.0->openai->openai_cost_logger) (0.6.0)\n", - "Requirement already satisfied: pydantic-core==2.16.3 in /home/drudao/.local/lib/python3.10/site-packages (from pydantic<3,>=1.9.0->openai->openai_cost_logger) (2.16.3)\n", - "Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.7->matplotlib->openai_cost_logger) (1.16.0)\n", + "Requirement already satisfied: openai-cost-logger in /home/drudao/.local/lib/python3.10/site-packages (0.0.2)\n", + "Requirement already satisfied: matplotlib in /home/drudao/.local/lib/python3.10/site-packages (from openai-cost-logger) (3.6.3)\n", + "Requirement already satisfied: openai in /home/drudao/.local/lib/python3.10/site-packages (from openai-cost-logger) (1.13.3)\n", + "Requirement already satisfied: pandas in /home/drudao/.local/lib/python3.10/site-packages (from openai-cost-logger) (2.1.1)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai-cost-logger) (1.1.1)\n", + "Requirement already satisfied: cycler>=0.10 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai-cost-logger) (0.11.0)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai-cost-logger) (4.42.1)\n", + "Requirement already satisfied: kiwisolver>=1.0.1 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai-cost-logger) (1.4.5)\n", + "Requirement already satisfied: numpy>=1.19 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai-cost-logger) (1.26.4)\n", + "Requirement already satisfied: packaging>=20.0 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai-cost-logger) (23.1)\n", + "Requirement already satisfied: pillow>=6.2.0 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from matplotlib->openai-cost-logger) (10.2.0)\n", + "Requirement already satisfied: pyparsing>=2.2.1 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from matplotlib->openai-cost-logger) (3.1.1)\n", + "Requirement already satisfied: python-dateutil>=2.7 in /home/drudao/.local/lib/python3.10/site-packages (from matplotlib->openai-cost-logger) (2.8.2)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai-cost-logger) (4.3.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from openai->openai-cost-logger) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai-cost-logger) (0.27.0)\n", + "Requirement already satisfied: pydantic<3,>=1.9.0 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai-cost-logger) (2.6.4)\n", + "Requirement already satisfied: sniffio in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai-cost-logger) (1.3.1)\n", + "Requirement already satisfied: tqdm>4 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai-cost-logger) (4.66.2)\n", + "Requirement already satisfied: typing-extensions<5,>=4.7 in /home/drudao/.local/lib/python3.10/site-packages (from openai->openai-cost-logger) (4.10.0)\n", + "Requirement already satisfied: pytz>=2020.1 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from pandas->openai-cost-logger) (2024.1)\n", + "Requirement already satisfied: tzdata>=2022.1 in /home/drudao/.local/lib/python3.10/site-packages (from pandas->openai-cost-logger) (2023.3)\n", + "Requirement already satisfied: idna>=2.8 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from anyio<5,>=3.5.0->openai->openai-cost-logger) (3.6)\n", + "Requirement already satisfied: exceptiongroup>=1.0.2 in /home/drudao/.local/lib/python3.10/site-packages (from anyio<5,>=3.5.0->openai->openai-cost-logger) (1.1.3)\n", + "Requirement already satisfied: certifi in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai->openai-cost-logger) (2024.2.2)\n", + "Requirement already satisfied: httpcore==1.* in /home/drudao/.local/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai->openai-cost-logger) (1.0.4)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /home/drudao/.local/lib/python3.10/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai->openai-cost-logger) (0.14.0)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /home/drudao/.local/lib/python3.10/site-packages (from pydantic<3,>=1.9.0->openai->openai-cost-logger) (0.6.0)\n", + "Requirement already satisfied: pydantic-core==2.16.3 in /home/drudao/.local/lib/python3.10/site-packages (from pydantic<3,>=1.9.0->openai->openai-cost-logger) (2.16.3)\n", + "Requirement already satisfied: six>=1.5 in /home/drudao/anaconda3/envs/modern_nlp/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib->openai-cost-logger) (1.16.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ - "pip install openai_cost_logger" + "%pip install openai-cost-logger" ] }, { @@ -130,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 64, "metadata": {}, "outputs": [], "source": [ @@ -145,14 +144,22 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 67, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "imported openai_cost_logger\n" + ] + } + ], "source": [ - "from openai_cost_logger.constants import DEFAULT_LOG_PATH, Models, MODELS_COST\n", - "from openai_cost_logger.openai_cost_logger_viz import OpenAICostLoggerViz\n", - "from openai_cost_logger.openai_cost_logger_utils import OpenAICostLoggerUtils\n", - "from openai_cost_logger.openai_cost_logger import OpenAICostLogger" + "from openai_cost_logger import OpenAICostLogger\n", + "from openai_cost_logger import OpenAICostLoggerViz\n", + "from openai_cost_logger import OpenAICostLoggerUtils\n", + "from openai_cost_logger import DEFAULT_LOG_PATH, MODELS_COST" ] }, { @@ -164,18 +171,15 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "# Export the proper environment variables based on the client you are using.\n", "\n", "# OpenAI API Key\n", - "os.environ[\"OPENAI_ORGANIZATION\"] = OpenAICostLoggerUtils.get_api_key(path='openai_organization.txt')\n", - "os.environ[\"OPENAI_API_KEY\"] = OpenAICostLoggerUtils.get_api_key(path='openai_api_key.txt')\n", - "\n", - "# Azure OpenAI API Key\n", - "os.environ[\"AZURE_OPENAI_KEY\"] = OpenAICostLoggerUtils.get_api_key('azure_openai_key.txt')" + "os.environ[\"OPENAI_API_KEY\"] = OpenAICostLoggerUtils.read_api_key(path='openai_api_key.txt')\n", + "os.environ[\"OPENAI_ORGANIZATION\"] = OpenAICostLoggerUtils.read_api_key(path='openai_organization.txt')" ] }, { @@ -187,92 +191,90 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 69, "metadata": {}, "outputs": [], "source": [ + "# The following demo is based on the standard OpenAI API client but it is easily adaptable for every client and model\n", + "# since the response generation is totally decoupled from the logging process (and is totally up to the user).\n", + "client = openai.OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"))\n", "experiment_name = \"Demo\"\n", - "messages = [\n", - " {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n", - " {\"role\": \"user\", \"content\": \"Who won the euro 2020?\"},\n", - "]\n", "cost_upperbound = 2\n", "log_folder = DEFAULT_LOG_PATH" ] }, { - "cell_type": "code", - "execution_count": 35, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "# Azure OpenAI usage\n", - "model = Models.AZURE_3_5_TURBO\n", - "client_args = {\n", - " \"azure_endpoint\": \"https://your_key.openai.azure.com/\",\n", - " \"api_key\": os.getenv(\"AZURE_OPENAI_KEY\"),\n", - " \"api_version\": \"your_api_version\",\n", - "}\n", - "input_cost = MODELS_COST[model.value][\"input\"]\n", - "output_cost = MODELS_COST[model.value][\"output\"]" + "### 5. Demo" ] }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 70, "metadata": {}, "outputs": [], "source": [ - "# OpenAI usage\n", - "client = openai.OpenAI(api_key=os.getenv(\"OPENAI_API_KEY\"))\n", - "model = Models.TURBO_3_5\n", - "client_args = {}\n", - "input_cost = MODELS_COST[model.value][\"input\"]\n", - "output_cost = MODELS_COST[model.value][\"output\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 5. Demo" + "# Instantiate the OpenAICostLogger\n", + "cost_logger = OpenAICostLogger(\n", + " experiment_name = experiment_name,\n", + " log_folder = log_folder,\n", + " cost_upperbound = cost_upperbound\n", + ")" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 71, "metadata": {}, + "outputs": [], "source": [ - "**NOTE:**\n", + "# CHAT COMPLETION EXAMPLE\n", + "model = \"gpt-3.5-turbo\"\n", + "input_cost = MODELS_COST[model][\"input\"]\n", + "output_cost = MODELS_COST[model][\"output\"]\n", + "messages = [\n", + " {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n", + " {\"role\": \"user\", \"content\": \"Who won the euro 2020?\"},\n", + "]\n", + "\n", + "# Get the model response\n", + "response = client.chat.completions.create(model=model, messages=messages, max_tokens=1, temperature=0)\n", "\n", - "The logger is independent of the OpenAI api call. Indeed, It only require the endpoint answer as input and the user is fully responsible of the model call. Despite that, in the cells below you can find a full working demo." + "# In case `input_cost` or `output_cost` are not passed, the object will look for the model in the `MODELS_COST` dictionary.\n", + "# If the model is not found, it will raise an exception.\n", + "# The costs should be per million tokens.\n", + "cost_logger.update_cost(response=response, input_cost=input_cost, output_cost=output_cost)" ] }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 72, "metadata": {}, "outputs": [], "source": [ - "# Create the OpenAICostLogger object\n", - "cost_logger = OpenAICostLogger(\n", - " experiment_name = experiment_name,\n", - " model = model.value,\n", - " input_cost = input_cost,\n", - " output_cost = output_cost,\n", - " log_folder = log_folder,\n", - " cost_upperbound = cost_upperbound\n", - ")" + "# EMBEDDINGS CREATION EXAMPLE\n", + "model = \"text-embedding-ada-002\"\n", + "input_cost = MODELS_COST[model][\"input\"]\n", + "output_cost = MODELS_COST[model][\"output\"]\n", + "messages = [\"Once upon a time\", \"There was a frog\"]\n", + "\n", + "# In case `input_cost` or `output_cost` are not passed, the object will look for the model in the `MODELS_COST` dictionary.\n", + "# If the model is not found, it will raise an exception.\n", + "# The costs should be per million tokens.\n", + "response = client.embeddings.create(model=model, input=[\"Once upon a time\", \"There was a frog\"])\n", + "cost_logger.update_cost(response=response, input_cost=input_cost, output_cost=output_cost)" ] }, { - "cell_type": "code", - "execution_count": 38, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "# Run the chat completion endpoint\n", - "response = client.chat.completions.create(model=model.value, messages=messages, max_tokens=1, temperature=0)\n", - "cost_logger.update_cost(response)" + "**NOTE**:\\\n", + "The above examples show the usage using `chat completion` and `embedding`. However, all the API endpoints are supported.\\\n", + "The only strict requirements is that the model response contains the fields `usage.total_tokens` and `usage.prompt_tokens`.\\\n", + "Be also aware that the `content` of the response is logged only for the `chat completion`." ] }, { @@ -284,49 +286,49 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Total cost: 0.000986 (USD)\n" + "Total cost: 3e-05 (USD)\n" ] } ], "source": [ "# Print the total cost\n", - "OpenAICostLoggerViz.print_total_cost(path=DEFAULT_LOG_PATH)" + "OpenAICostLoggerViz.print_total_cost(path=log_folder)" ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 77, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "gpt-3.5-turbo: 0.000887 (USD)\n", - "gpt-35-turbo-0125: 9.9e-05 (USD)\n" + "gpt-3.5-turbo-0125: 2.8e-05 (USD)\n", + "text-embedding-ada-002: 2e-06 (USD)\n" ] } ], "source": [ "# Cost by model\n", - "OpenAICostLoggerViz.print_total_cost_by_model(path=DEFAULT_LOG_PATH)" + "OpenAICostLoggerViz.print_total_cost_by_model(path=log_folder)" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 75, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlEAAAHHCAYAAACfqw0dAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8bUlEQVR4nO3de1hVZd7/8Q8HOXgANJWDoqB5zJJRE9HKShIVC8qe0KEwNbUDZZn5U/OQnWisHPNQjFOpmY6FU1Zq9BimlTKomOUBzRTNpsADAooKyr5/f/i4Z3aiwgrdgO/Xde2Li3t9172+a7eKT2vfLFyMMUYAAACoEFdnNwAAAFAdEaIAAAAsIEQBAABYQIgCAACwgBAFAABgASEKAADAAkIUAACABYQoAAAACwhRAAAAFhCiAOAi5s+fLxcXF23atMkpx7/11lt16623OuXYAC6OEAXAqfbs2aORI0eqRYsW8vLyko+Pj3r06KE33nhDJ0+erPTjnThxQs8995zWrFlT6XMDuLq4O7sBAFevFStW6H/+53/k6emphIQEdejQQSUlJfr222/1zDPPaPv27Zo7d26lHvPEiROaOnWqJHGHB8AfQogC4BTZ2dkaOHCgmjdvrtWrVyswMNC+7bHHHtNPP/2kFStWOLFDALg4Ps4D4BTTpk3T8ePH9c477zgEqHOuvfZajRo1yv79mTNn9MILL6hly5by9PRUSEiIJkyYoOLiYof9Nm3apKioKDVs2FDe3t4KDQ3V0KFDJUn79u1To0aNJElTp06Vi4uLXFxc9Nxzz12y3xMnTmjkyJG65ppr5OPjo4SEBB09etS+ffDgwWrYsKFOnz593r69e/dWmzZtLnmMuXPnqmXLlvL29lbXrl31zTffnFdTUlKiyZMnq3PnzvL19VWdOnV0880366uvvrLXGGMUEhKimJiY8/Y/deqUfH19NXLkyEv2A+DiCFEAnOKzzz5TixYt1L1793LVP/TQQ5o8ebI6deqkv/71r+rZs6eSkpI0cOBAe83BgwfVu3dv7du3T+PGjdOsWbMUHx+vf/3rX5KkRo0a6a233pIk3X333Vq4cKEWLlyoe+6555LHT0xMVFZWlp577jklJCRo0aJFio2NlTFGkvTAAw/oyJEj+uKLLxz2y8nJ0erVq3X//fdfdP533nlHI0eOVEBAgKZNm6YePXrorrvu0oEDBxzqCgsL9fbbb+vWW2/VX/7yFz333HM6dOiQoqKitGXLFkmSi4uL7r//fn3++efKy8tz2P+zzz5TYWHhJfsBUA4GAK6wgoICI8nExMSUq37Lli1GknnooYccxseMGWMkmdWrVxtjjPn444+NJLNx48YLznXo0CEjyUyZMqVcx543b56RZDp37mxKSkrs49OmTTOSzCeffGKMMaa0tNQ0bdrUxMXFOew/ffp04+LiYvbu3XvBY5SUlJjGjRubsLAwU1xcbB+fO3eukWR69uxpHztz5oxDjTHGHD161Pj7+5uhQ4fax3bt2mUkmbfeesuh9q677jIhISHGZrOV6/wBXBh3ogBccYWFhZKkevXqlat+5cqVkqTRo0c7jD/99NOSZF875efnJ0lavnx5mR+r/REjRoxQrVq17N8/8sgjcnd3t/fm6uqq+Ph4ffrppzp27Ji9btGiRerevbtCQ0MvOPemTZt08OBBPfzww/Lw8LCPP/jgg/L19XWodXNzs9fYbDbl5eXpzJkz6tKlizZv3myva926tcLDw7Vo0SL7WF5enj7//HPFx8fLxcXF4jsB4BxCFIArzsfHR5IcwsbF7N+/X66urrr22msdxgMCAuTn56f9+/dLknr27KkBAwZo6tSpatiwoWJiYjRv3rzz1k1Z0apVK4fv69atq8DAQO3bt88+lpCQoJMnT+rjjz+WJO3atUuZmZl64IEHLnl+ZR2jVq1aatGixXn1CxYs0A033CAvLy9dc801atSokVasWKGCggKHuoSEBK1bt84+f0pKik6fPn3JfgCUDyEKwBXn4+OjoKAgbdu2rUL7XeruiYuLi5YuXar09HQlJibq3//+t4YOHarOnTvr+PHjf6Tlcmnfvr06d+6s999/X5L0/vvvy8PDQ/fdd1+lHeP999/Xgw8+qJYtW+qdd95RamqqVq1apdtvv102m82hduDAgapVq5b9btT777+vLl26lGuRO4BLI0QBcIr+/ftrz549Sk9Pv2Rt8+bNZbPZtHv3bofx3Nxc5efnq3nz5g7j3bp100svvaRNmzZp0aJF2r59u5YsWSLp0kHsQn5/7OPHj+u3335TSEiIw3hCQoJWr16t3377TYsXL1Z0dLTq169/yfMr6xinT59Wdna2w9jSpUvVokULffTRR3rggQcUFRWlyMhInTp16rx5GzRooOjoaC1atEj79+/XunXruAsFVCJCFACnGDt2rOrUqaOHHnpIubm5523fs2eP3njjDUlSv379JEkzZsxwqJk+fbokKTo6WpJ09OhR+2/LnRMWFiZJ9o/0ateuLUnKz8+vUL9z5851WGf11ltv6cyZM+rbt69D3aBBg+Ti4qJRo0Zp79695fotuC5duqhRo0ZKTk5WSUmJfXz+/Pnn9enm5iZJDueZkZFxwTD6wAMPaMeOHXrmmWfk5ubm8NuMAP4YHrYJwClatmypxYsXKy4uTu3atXN4Yvn69euVkpKiBx98UJLUsWNHDR48WHPnzlV+fr569uypDRs2aMGCBYqNjdVtt90m6exaoTfffFN33323WrZsqWPHjunvf/+7fHx87EHM29tb7du31wcffKDWrVurQYMG6tChgzp06HDRfktKStSrVy/dd9992rVrl958803ddNNNuuuuuxzqGjVqpD59+iglJUV+fn72gHcxtWrV0osvvqiRI0fq9ttvV1xcnLKzszVv3rzz1kT1799fH330ke6++25FR0crOztbycnJat++fZkfWUZHR+uaa65RSkqK+vbtq8aNG1+yHwDl5OxfDwRwdfvxxx/N8OHDTUhIiPHw8DD16tUzPXr0MLNmzTKnTp2y150+fdpMnTrVhIaGmlq1apng4GAzfvx4h5rNmzebQYMGmWbNmhlPT0/TuHFj079/f7Np0yaHY65fv9507tzZeHh4XPJxB+cecbB27VozYsQIU79+fVO3bl0THx9vjhw5UuY+H374oZFkRowYUaH34s033zShoaHG09PTdOnSxXz99demZ8+eDo84sNls5uWXXzbNmzc3np6e5k9/+pNZvny5GTx4sGnevHmZ8z766KNGklm8eHGF+gFwcS7G/O7eNwDgD/nkk08UGxurr7/+WjfffLOz29FTTz2ld955Rzk5OfaPMwH8cYQoAKhk/fv3V1ZWln766SenP4/p1KlTCg4OVv/+/TVv3jyn9gLUNKyJAoBKsmTJEv3www9asWKF3njjDacGqIMHD+rLL7/U0qVLdeTIEYe/QwigcnAnCgAqiYuLi+rWrau4uDglJyfL3d15/5+6Zs0a3XbbbWrcuLEmTZqkxMREp/UC1FSEKAAAAAt4ThQAAIAFhCgAAAALWFh+GdlsNv3666+qV6+e039DBwAAlI8xRseOHVNQUJBc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6oknnrgcPQIAAFQ5Fb4TlZqaqi+//FLt2rWzj7Vv315z5sxR7969K7U5AACAqqrCd6JsNptq1ap13nitWrXsz48CAACo6Socom6//XaNGjVKv/76q33s3//+t5566in16tWrUpsDAACoqiocombPnq3CwkKFhISoZcuWatmypUJDQ1VYWKhZs2Zdjh4BAACqnAqviQoODtbmzZv15ZdfaufOnZKkdu3aKTIystKbAwAAqKosPSfKxcVFd9xxh+64447K7gcAAKBaKPfHeatXr1b79u1VWFh43raCggJdd911+uabbyq1OQAAgKqq3CFqxowZGj58uHx8fM7b5uvrq5EjR2r69OmV2hwAAEBVVe4Q9f3336tPnz4X3N67d29lZmZaamLOnDkKCQmRl5eXwsPDtWHDhovWp6SkqG3btvLy8tL111+vlStXOmw3xmjy5MkKDAyUt7e3IiMjtXv3boeavLw8xcfHy8fHR35+fho2bJiOHz9e5vF++ukn1atXz/6EdgAAgHKHqNzc3DKfD3WOu7u7Dh06VOEGPvjgA40ePVpTpkzR5s2b1bFjR0VFRengwYNl1q9fv16DBg3SsGHD9N133yk2NlaxsbHatm2bvWbatGmaOXOmkpOTlZGRoTp16igqKkqnTp2y18THx2v79u1atWqVli9frq+//lojRow473inT5/WoEGDdPPNN1f43AAAQM1V7hDVpEkTh6Dyez/88IMCAwMr3MD06dM1fPhwDRkyRO3bt1dycrJq166td999t8z6N954Q3369NEzzzyjdu3a6YUXXlCnTp00e/ZsSWfvQs2YMUMTJ05UTEyMbrjhBr333nv69ddftWzZMklSVlaWUlNT9fbbbys8PFw33XSTZs2apSVLljg8/0qSJk6cqLZt2+q+++6r8LkBAICaq9whql+/fpo0aZLD3ZxzTp48qSlTpqh///4VOnhJSYkyMzMdHo/g6uqqyMhIpaenl7lPenr6eY9TiIqKstdnZ2crJyfHocbX11fh4eH2mvT0dPn5+alLly72msjISLm6uiojI8M+tnr1aqWkpGjOnDnlOp/i4mIVFhY6vAAAQM1U7kccTJw4UR999JFat26txMREtWnTRpK0c+dOzZkzR6WlpXr22WcrdPDDhw+rtLRU/v7+DuP+/v72Z1D9Xk5OTpn1OTk59u3nxi5W07hx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33130Xn37t1rateubUaPHm127NhhZs2aZdzc3Exqaqq95qWXXjLXXHONWb58ucnOzjYpKSmmbt265o033rhk36g6qtI1vmTJEuPh4WHeffdds337djN8+HDj5+dncnNz7TV/+9vfzNq1a012drbJzMw0d955pwkODjZnzpypUC933XWXCQ8PN6tWrTLZ2dlm/fr15ttvv62MtxROdjVe02+++aapV6+eWbJkidmzZ4/5xz/+YerWrWs+/fTTynpbrwhCVA138OBBI8msXbvWGHP2Sey1atUyKSkp9pqsrCwjyaSnp19wnkcffdTcdttt543HxcWZiRMnmilTplwyRNlsNhMQEGBeffVV+1h+fr7x9PQ0//jHPxxqV65cadq2bWu2b99erhA1duxYc911153XW1RUlP376OhoM3ToUIeae+65x8THx190blRtzrzGu3btah577DH796WlpSYoKMgkJSVd8Djff/+9kWR++umncvfy+eefG19fX3PkyJEL7oOa42q4piMiIsyYMWMcakaPHm169OhxwTmqIj7Oq+EKCgokSQ0aNJAkZWZm6vTp04qMjLTXtG3bVs2aNVN6evpF5zk3xznz5s3T3r17NWXKlHL1kp2drZycHIdj+/r6Kjw83OHYubm5Gj58uBYuXKjatWuXa+709HSHeSUpKirKYd7u3bsrLS1NP/74o6Szt5y//fZb9e3bt1zHQNXkrGu8pKREmZmZDsdxdXVVZGTkBY9TVFSkefPmKTQ0VMHBweXu5dNPP1WXLl00bdo0NWnSRK1bt9aYMWN08uTJC86B6utquKaLi4vl5eXlUOPt7a0NGzbo9OnTF5ynqnHqHyDG5WWz2fTkk0+qR48e6tChgyQpJydHHh4e5/1hZH9/f+Xk5JQ5z/r16/XBBx9oxYoV9rHdu3dr3Lhx+uabb+TuXr7L6Nz8/v7+Fzy2MUYPPvigHn74YXXp0kX79u0r99xlzVtYWKiTJ0/K29tb48aNU2Fhodq2bSs3NzeVlpbqpZdeUnx8fLmOgarHmdf44cOHVVpaWuZ199/rQyTpzTff1NixY1VUVKQ2bdpo1apV8vDwKHcve/fu1bfffisvLy99/PHHOnz4sB599FEdOXJE8+bNu/AbhGrnarmmo6Ki9Pbbbys2NladOnVSZmam3n77bZ0+fVqHDx9WYGDghd+kKoQ7UTXYY489pm3btmnJkiWW59i2bZtiYmI0ZcoU9e7dW9LZBdp//vOfNXXqVLVu3brM/RYtWqS6devaX9988025jjdr1iwdO3ZM48ePv2DNf8/78MMPl/tcPvzwQy1atEiLFy/W5s2btWDBAr322mtasGBBuedA1eLMa7wi4uPj9d1332nt2rVq3bq17rvvPp06dapcvUhnf7C6uLho0aJF6tq1q/r166fp06drwYIF3I2qYa6Wa3rSpEnq27evunXrplq1aikmJkaDBw+WdPbuV7Xh7M8TcXk89thjpmnTpmbv3r0O42lpaUaSOXr0qMN4s2bNzPTp0x3Gtm/fbho3bmwmTJjgMH706FEjybi5udlfLi4u9rG0tDRTWFhodu/ebX+dOHHC7Nmzp8z1Tbfccot54oknjDHGxMTEGFdXV4e5z82bkJBgjDEO855b7HjzzTebUaNGOcz77rvvGh8fH/v3TZs2NbNnz3aoeeGFF0ybNm0u/YaiynH2NV5cXGzc3NzMxx9/7LBvQkKCueuuuy7Yd3Fxsaldu7ZZvHhxuXo5N2fLli0dxnbs2GEkmR9//PGCx0L1cjVd0+eUlJSYAwcOmDNnztgXm5eWll6wvqohRNUwNpvNPPbYYyYoKKjM/7ieW6C4dOlS+9jOnTvPW6C4bds207hxY/PMM8+cN0dpaanZunWrw+uRRx4xbdq0MVu3bnX4jZLf9xYQEGBee+01+1hBQYHDwvL9+/c7zPvFF18YSWbp0qXmwIEDFzzvsWPHmg4dOjiMDRo0yGFheYMGDcybb77pUPPyyy+bVq1aXXBeVD1V6Rrv2rWrSUxMdNivSZMmF12Ee+rUKePt7W3mzZtXrl6MOfvbUN7e3ubYsWP2sWXLlhlXV1dz4sSJCx4L1cPVeE2X5ZZbbjGDBg0qd31VQIiqYR555BHj6+tr1qxZY3777Tf767//Q/vwww+bZs2amdWrV5tNmzaZiIgIExERYd++detW06hRI3P//fc7zHHw4MELHrc8v51nzNlHHPj5+ZlPPvnE/PDDDyYmJuaCjzgwxpjs7OwKPeLgmWeeMVlZWWbOnDnnPeJg8ODBpkmTJvZHHHz00UemYcOGZuzYsZfsG1VHVbrGlyxZYjw9Pc38+fPNjh07zIgRI4yfn5/JyckxxhizZ88e8/LLL5tNmzaZ/fv3m3Xr1pk777zTNGjQwH4XtTy9HDt2zDRt2tTce++9Zvv27Wbt2rWmVatW5qGHHqqMtxROdjVe07t27TILFy40P/74o8nIyDBxcXGmQYMGJjs7uxLe0SuHEFXDSCrz9d//h3Dy5Enz6KOPmvr165vatWubu+++2/z222/27VOmTClzjubNm1/wuOUNUTabzUyaNMn4+/sbT09P06tXL7Nr164L1pc3RBljzFdffWXCwsKMh4eHadGihcM5G2NMYWGhGTVqlGnWrJnx8vIyLVq0MM8++6wpLi6+5NyoOqraNT5r1izTrFkz4+HhYbp27Wr+9a9/2bf9+9//Nn379jWNGzc2tWrVMk2bNjV//vOfzc6dOyvcS1ZWlomMjDTe3t6madOmZvTo0dyFqiGuxmt6x44dJiwszHh7exsfHx8TExPjMEd14WIMj2sGAACoqGq0BB4AAKDqIEQBAABYQIgCAACwgBAFAABgASEKAADAAkIUAACABYQoAAAACwhRAAAAFhCiAEDSgw8+KBcXF7m4uKhWrVry9/fXHXfcoXfffVc2m83Z7QGogghRAPB/+vTpo99++0379u3T559/rttuu02jRo1S//79debMGWe3B6CKIUQBwP/x9PRUQECAmjRpok6dOmnChAn65JNP9Pnnn2v+/PmSpOnTp+v6669XnTp1FBwcrEcffVTHjx+XJBUVFcnHx0dLly51mHfZsmWqU6eOjh07dqVPCcBlRIgCgIu4/fbb1bFjR3300UeSJFdXV82cOVPbt2/XggULtHr1ao0dO1aSVKdOHQ0cOFDz5s1zmGPevHm69957Va9evSveP4DLhz9ADAA6uyYqPz9fy5YtO2/bwIED9cMPP2jHjh3nbVu6dKkefvhhHT58WJK0YcMGde/eXQcOHFBgYKAOHjyoJk2a6Msvv1TPnj0v92kAuIK4EwUAl2CMkYuLiyTpyy+/VK9evdSkSRPVq1dPDzzwgI4cOaITJ05Ikrp27arrrrtOCxYskCS9//77at68uW655Ran9Q/g8iBEAcAlZGVlKTQ0VPv27VP//v11ww036J///KcyMzM1Z84cSVJJSYm9/qGHHrKvoZo3b56GDBliD2EAag5CFABcxOrVq7V161YNGDBAmZmZstlsev3119WtWze1bt1av/7663n73H///dq/f79mzpypHTt2aPDgwU7oHMDl5u7sBgCgqiguLlZOTo5KS0uVm5ur1NRUJSUlqX///kpISNC2bdt0+vRpzZo1S3feeafWrVun5OTk8+apX7++7rnnHj3zzDPq3bu3mjZt6oSzAXC5cScKAP5PamqqAgMDFRISoj59+uirr77SzJkz9cknn8jNzU0dO3bU9OnT9Ze//EUdOnTQokWLlJSUVOZcw4YNU0lJiYYOHXqFzwLAlcJv5wHAZbBw4UI99dRT+vXXX+Xh4eHsdgBcBnycBwCV6MSJE/rtt9/0yiuvaOTIkQQooAbj4zwAqETTpk1T27ZtFRAQoPHjxzu7HQCXER/nAQAAWMCdKAAAAAsIUQAAABYQogAAACwgRAEAAFhAiAIAALCAEAUAAGABIQoAAMACQhQAAIAFhCgAAAAL/j+tm/sa9GvIcgAAAABJRU5ErkJggg==", + "image/png": "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", "text/plain": [ "
" ] @@ -337,8 +339,15 @@ ], "source": [ "# Visualize the cost by day\n", - "OpenAICostLoggerViz.plot_cost_by_day(path=DEFAULT_LOG_PATH)" + "OpenAICostLoggerViz.plot_cost_by_day(path=log_folder)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -357,7 +366,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.13" } }, "nbformat": 4, From 1f23136c748de5a06246904d9e7225377a9f77cd Mon Sep 17 00:00:00 2001 From: Lorenzo Drudi Date: Sat, 27 Apr 2024 12:07:52 +0200 Subject: [PATCH 6/7] docs: improve docs. --- README.rst | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index 070d42a..6f9701d 100644 --- a/README.rst +++ b/README.rst @@ -5,8 +5,10 @@ OpenAI Cost Logger ================== -Simple **cost logger** for **OpenAI requests**. -Track the cost of every request you make to OpenAI and visualize them in a user-friendly way. +* Simple **cost logger** for **OpenAI requests**. +* Track the cost of every request you make to OpenAI and visualize them in a user-friendly way. +* Homepage on `PyPI `_. +* `Demo file `_ with a usage example. How to install: --------------- @@ -21,9 +23,6 @@ How to install: from openai_cost_logger import OpenAICostLoggerUtils from openai_cost_logger import DEFAULT_LOG_PATH, MODELS_COST -* Homepage on `PyPI `_. -* `Demo file `_ with a usage example. - Key Features: ------------- * Track the cost of every request you make and save them in a JSON file. @@ -41,6 +40,6 @@ Note: Viz example: ------------- -.. image::https://drive.google.com/file/d/1lbmRJCe5VHqom0bdHzE2xi09lSfsp_Bm/view?usp=sharing +.. image:: https://drive.google.com/file/d/1lbmRJCe5VHqom0bdHzE2xi09lSfsp_Bm/view?usp=sharing :alt: Viz example (prints + plot) :align: center From b37436e297b1da761d57dd3ad2f63621fd44e2ab Mon Sep 17 00:00:00 2001 From: Lorenzo Drudi Date: Sat, 27 Apr 2024 12:10:10 +0200 Subject: [PATCH 7/7] docs: update example image. --- README.rst | 2 +- images/example.png | Bin 0 -> 88892 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 images/example.png diff --git a/README.rst b/README.rst index 6f9701d..08d7307 100644 --- a/README.rst +++ b/README.rst @@ -40,6 +40,6 @@ Note: Viz example: ------------- -.. image:: https://drive.google.com/file/d/1lbmRJCe5VHqom0bdHzE2xi09lSfsp_Bm/view?usp=sharing +.. image:: images/example.png :alt: Viz example (prints + plot) :align: center diff --git a/images/example.png b/images/example.png new file mode 100644 index 0000000000000000000000000000000000000000..d1d7a38d07257966a309b804b455812034e196a2 GIT binary patch literal 88892 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 z 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