From dcab238d3e78b577cd619fddfe3f2aafdf055627 Mon Sep 17 00:00:00 2001 From: xds Date: Thu, 12 Feb 2026 15:50:43 +0300 Subject: [PATCH] fix --- .../google_adapter.cpython-313.pyc | Bin 7787 -> 8330 bytes .../__pycache__/s3_adapter.cpython-313.pyc | Bin 5532 -> 6690 bytes adapters/s3_adapter.py | 12 ++++++------ .../__pycache__/assets_router.cpython-313.pyc | Bin 13690 -> 14377 bytes .../generation_service.cpython-313.pyc | Bin 26120 -> 26145 bytes 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/adapters/__pycache__/google_adapter.cpython-313.pyc b/adapters/__pycache__/google_adapter.cpython-313.pyc index 817d8b42a73ab22d0e33deb8e08bbecc97b794d4..335fd48ca77a17ec8e9c7178aa28bf20e2b78f6d 100644 GIT binary patch delta 2329 zcmbVOZ){Ul6u+;puYIq3ZD0G^tzEnIb${D!*_Le6!6?%G0bx|6_2JA+nlid&uyxC8 z8v-VRUkpeTwu{c_2Nq(07?*&H$^0NjAUHD;w}7%VCJOP3Au$^p5iwEEeO-ZVCPvSP zbI(2Z+@|eD7zv-#RxvLklwk08+O{612{sVPjR~Dhhs{~v(^}T$A|xbh|1BaEMko(SsH?G2 zgI{K93W-sMyr^5q9jZsMQYb@@KV-ahdJ}5UJW1d|5p6;r)Q85< zp2qi>L*ZIOIG#!?iKOJ~8A_z$iBz&i8XAr#;`^fggR#DN(l6aTdRpp<4GhE;DI`Z; zl6nS)lJV6+Qmi)x%jsmi7Vpzdw6ls6N>qx8@_@>)xzjVoRi|gT{=vTJ-b1N)GQ+3| zGgLgu!WId4=sRqe!8(c-bja>H)qISdcN88o;xT>ID?hlsXLfwB<0Iw#;j@P?`fpZl zy6Fy_>X^5=$99eE8t=GetD3iYZ`*uxHs1yN_qMu44i)(Uy8h8r;>~R7Ez2Thv^aEqnnV4&?k#M%j$-SVW4)4=m3X@VRs0 zB(t0s5zHuJky+ek4d|_KWl_CY5d#mUS~mQJ)lOSi>|d<*s3_;jtZbFVh*+yl*koR| zHELwt3f%0nJq%x9t*oa(kWq=SITr~;C<7u`@CngVZj>#n!4JLDkgxm=^73dyFA@|DgSwD2t z-u^!2naN6fK1G)Ub++V}*f)}}7NSTGQ}T$~gb(INsQ|v6e>R{z2OfX^Q%oYclx;*2 z#;DX3G_9y>>rUOLe*Awx$qeZ)w;+&J;IP98rR9qxfydyXsE^oj;7sigP zqhc=LQF1rr`AY0Soek)^BiPcZ(M*f2Hki$544w7N4DaZyW@gIt#8b@>Pd!cS2E$Gt zJrk(dSxVn1Wx&4Sqjy%L8`bWRo`$cle#`TcKoNSk~)AZ z+)YP*0>_(ZL8E7y$LVDR!=hDSDlgCr2!^S$sr2X7syVxR&jaFGEb}n#@wNp7!^M45 zO_vU+=5*u%@hrAdVTy5%M-~tnr}*qReK0%D#`|aY56#7gv(p8H@4CAUBr@y3+l$T% ogQUh1qR9USB|Tc~FuV>H`O}ho4wn=+n|Em_=Y2%9QUu<=0nYmC3IG5A delta 1766 zcmZ8iZ)_7~7=PcpzP;=9uGjXi^xAG~H^$_;(V29MgTkcSP^6ua)+3ljYaJaHp_uDn z0b{^K4JrYXM~!|%zDPt=GCypIF*?)`X2KSYf998c;ENiQP9Q-(5Z||3!SR0hJ->VY z-P7lNp6i?GzczcWD~g2ZdF%Sg@-xOoPr(s7j1hVlS-2Zlc#B)ltn?Ji2#%8&eC&vm zhY_kc;5Wyh=IEu)>@;MBKsN~nNaHz%hSLbSQ4Co;93x#E6`zp+cEWe0wcF`IN$#F& z6y+TiXWBXZDq3Mv2?m^DB08Yk2nJW{mNnKv?X z#-^X-)URsrgbEkLu4ItLPo@Uk+>Bcq=p!=$V<1Upl7#Y6p4uA6MG1Sp9^)XPM%?~h zZrN1f;bkcbyIk+P9C>GjSdN?@?sy~XdJtl~k>H-x(DruPTBqgA>C`hU?V+iL*C4ce z7mP?DOyH1|Ox^A6>gHLb9krqnqmfQP#ZH<`7+EO?pARh9lt0VEA1*EzHR+x2~xMyyodyd%McAo=^7-8fa!M z!%K!Vr0|#8I)+64TagSYaL1FtEwDjd$IoD8qHH27Qn3XAZG z*L1mdzqf%7eJ%=DrLdzSSt4xJb@2KW>abN0K+>m21xw7)%eeoHK1MH3%yqC%!VzDb zZ}4efKXJ1dcE#i@^MWRSgvgehOR&rIG%l0Y#8j-N3BQgNIO%V7D~&Cvcxa95VbR|l zQZ3bk@^X^1Jo}p(g;<_ks{V3QlRMqHEe-uWX?YsC=<>a@vV3lMR(mMuZdhnu)spgF z73F=F0H11G1Rw2}|86T>q^tfDSUXHz=Y4gH+3B|=OR#*FKd&Vm70q&6S`Swry#7W7 zbnw^|dm$c(u2U@U>S3chE>*l~@1uD53A*KV4sxIwGyhhK*+3+?DuxbW-HQ(4mw_hS zHAr8yAk`PXP%R%VnY^8(Dx0nqT9B9ZqX#Qv<-KM&`DO0oxMW z%^(F&8U?%=zA(-vP5pm!%wA&;F<72x$`+*Rc+nm&jF%6T>>bS14-iU3w=$b(7bgmP zisQuvk$sa2MccNYVm=9244GV&4p=w{W;hwyPPNsmbS>!~$oK8R(Qt|kU{@ATPKN`W zb58EMb;E=|nuAzO amndcbLDe)2#`=7Za5#(qL3LrX@7jL}%4wef diff --git a/adapters/__pycache__/s3_adapter.cpython-313.pyc b/adapters/__pycache__/s3_adapter.cpython-313.pyc index 70a075bc717493bea4ca5b9c66c1178697c4397c..fbe35de50a77f27075483c748def3c9935f3a626 100644 GIT binary patch delta 1065 zcmYjPTWB0r7(Qp`lD*8#?#|3+c4zHodVzLov*xlPwN-026so0BJT5fNLRdF5+ewp& zo{eJiU_^WsQU;;Lf{FDZ;A37&`qT*s#g{0ptxF#&_#*g_7^M$Y@ISj*@Q3sL-}%me zn{(#Yi{F%#eOZnpu-PBJ@P1XUE8pX->knVSnLx#(7kf#p%9CVOD)A&`qFH_xQ<-U{ z2uZU&Rfy4!QL7S>t8gMft&&KzgXkpDX{r&mvzwpbdg5p+UcdUGe{H(yEjx9N^*yj2 z@LU9;{X0Q2MS_d+DaGe2JmFY9U#JMdAF)#tzBm=@W)OZV(d89!1b28PGICH>Ll-1S z?YZ2zO#9)GN2B~l=u2#&OA0~>WTC)}TS@~*(Zn*WE3nQ57vg7EAgyCPsFsBi(Wzut zAwngppy5cjorU@k!G3fs+Q1#}Vi^&uCJaxS*TT#Ys$2{N0-30j0f=rIOxS7GWuwmYy|2gT1=c9iB>*h>s#1_J;sf!6$n)8ghFpNdR94q(Tq#`qxyC3F?gWONXq z#lN>OvqTGwVvpM3o9qd!u2G#GB|0NavpHKCGCVd@dwyIQ=@N9{LwhR%0E7I`0L4=lV43eGES`WzvT)yKKSsPK%dtU{<^#xt13Ks;cst>ne>P)~Rmmyb!|5sC34 zYhj0j?X)4b2}k1N1{a=F##L@x7NFd=DuA+WaO39YQ)wULH#Z+BCpi3i@NfDZ{O;!4 zY6Zg!V`O751;4hP4!+Z-(=E>P7wH-JEczOQ^FgnE8gB(}=^tnIbXm|g$SwkRr~Wr{ ZyM^GszK%(7EpsF}iE;K%#E=@0`yaA0{E`3w delta 187 zcmZ2vGDn;5GcPX}0}yn7?#aBtJ(2GilTjFa`5VF=Vk6@dS$m z1Np%MF}%UNF+dh8P?rf?upme_i?N6=Sg43UokLS}^AyHpZl+|W$%!H&o8tuUFfv+i zwiec4X0(``A{NBxx_P@;C?lHy9|MD?z+_2@c%C9Nph>rwGxJJ{Y$tb0STHW1d`O~# e>4V5*f60Z6-jhE{D)D`60Fg!FK-B>9HZBGL diff --git a/adapters/s3_adapter.py b/adapters/s3_adapter.py index fe992dd..957cbec 100644 --- a/adapters/s3_adapter.py +++ b/adapters/s3_adapter.py @@ -61,12 +61,12 @@ class S3Adapter: try: async with self._get_client() as client: response = await client.get_object(Bucket=self.bucket_name, Key=object_name) - async with response['Body'] as stream: - while True: - chunk = await stream.read(chunk_size) - if not chunk: - break - yield chunk + # aioboto3 Body is an aiohttp StreamReader wrapper + body = response['Body'] + data = await body.read() + # Yield in chunks to avoid holding entire response in StreamingResponse buffer + for i in range(0, len(data), chunk_size): + yield data[i:i + chunk_size] except ClientError as e: print(f"Error streaming from S3: {e}") return diff --git a/api/endpoints/__pycache__/assets_router.cpython-313.pyc b/api/endpoints/__pycache__/assets_router.cpython-313.pyc index 2cd08ea5fc784cf3691e57af68afc52a2eca296f..cdc6a9205b5b5d89c08b135b086c7dbae679445b 100644 GIT binary patch delta 3708 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 G#QZlTT3+b@ delta 3078 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