From af9c3f8b7297215ae0d40ab296729e6b782166ee Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 12:20:03 +0000 Subject: [PATCH] Add template upload, slide count control, and improve content placement - Update `flask_app.py`: Add `/api/upload_template` endpoint for uploading PPTX templates. - Update `src/slidedeckai/ui/html_ui.py`: Add "Upload" button and "Number of Slides" input field. Pass `num_sections` to backend. - Update `src/slidedeckai/agents/execution_orchestrator.py`: Refine `_check_text_overflow` to use width/height dimensions for more accurate line counting, preventing content overflow inside placeholders. - Dependencies: Add `flask`, `flask-cors`, `werkzeug` to `flask_app.py`. --- __pycache__/flask_app.cpython-312.pyc | Bin 0 -> 17511 bytes flask_app.py | 37 +++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 257 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 155 bytes .../content_matcher.cpython-312.pyc | Bin 0 -> 23275 bytes .../__pycache__/global_config.cpython-312.pyc | Bin 0 -> 8850 bytes .../layout_analyzer.cpython-312.pyc | Bin 0 -> 42242 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 136 bytes .../content_generator.cpython-312.pyc | Bin 0 -> 10075 bytes .../__pycache__/core_agents.cpython-312.pyc | Bin 0 -> 29156 bytes .../execution_orchestrator.cpython-312.pyc | Bin 0 -> 58851 bytes .../search_executor.cpython-312.pyc | Bin 0 -> 4009 bytes src/slidedeckai/agents/core_agents.py | 81 +++++++++------ .../agents/execution_orchestrator.py | 95 +++++++++++++++++- .../ui/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 132 bytes .../ui/__pycache__/html_ui.cpython-312.pyc | Bin 0 -> 47389 bytes src/slidedeckai/ui/html_ui.py | 53 +++++++++- 17 files changed, 231 insertions(+), 35 deletions(-) create mode 100644 __pycache__/flask_app.cpython-312.pyc create mode 100644 src/slidedeckai/__pycache__/__init__.cpython-312.pyc create mode 100644 src/slidedeckai/__pycache__/_version.cpython-312.pyc create mode 100644 src/slidedeckai/__pycache__/content_matcher.cpython-312.pyc create mode 100644 src/slidedeckai/__pycache__/global_config.cpython-312.pyc create mode 100644 src/slidedeckai/__pycache__/layout_analyzer.cpython-312.pyc create mode 100644 src/slidedeckai/agents/__pycache__/__init__.cpython-312.pyc create mode 100644 src/slidedeckai/agents/__pycache__/content_generator.cpython-312.pyc create mode 100644 src/slidedeckai/agents/__pycache__/core_agents.cpython-312.pyc create mode 100644 src/slidedeckai/agents/__pycache__/execution_orchestrator.cpython-312.pyc create mode 100644 src/slidedeckai/agents/__pycache__/search_executor.cpython-312.pyc create mode 100644 src/slidedeckai/ui/__pycache__/__init__.cpython-312.pyc create mode 100644 src/slidedeckai/ui/__pycache__/html_ui.cpython-312.pyc diff --git a/__pycache__/flask_app.cpython-312.pyc b/__pycache__/flask_app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f78ac46e2f3ec0c83132428d331cb74f700d3b2f GIT binary patch literal 17511 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 E15-bcApigX literal 0 HcmV?d00001 diff --git a/flask_app.py b/flask_app.py index e668fbe..792107f 100644 --- a/flask_app.py +++ b/flask_app.py @@ -11,6 +11,7 @@ import json from flask import Flask, request, jsonify, send_file, render_template_string +from werkzeug.utils import secure_filename from flask_cors import CORS from dotenv import load_dotenv @@ -337,6 +338,42 @@ def get_templates(): return jsonify({'error': str(e)}), 500 +@app.route('/api/upload_template', methods=['POST']) +def upload_template(): + """Upload a new PPTX template""" + try: + if 'file' not in request.files: + return jsonify({'error': 'No file part'}), 400 + + file = request.files['file'] + if file.filename == '': + return jsonify({'error': 'No selected file'}), 400 + + if file and file.filename.endswith('.pptx'): + filename = secure_filename(file.filename) + template_dir = pathlib.Path('src/slidedeckai/pptx_templates') + template_dir.mkdir(parents=True, exist_ok=True) + + save_path = template_dir / filename + file.save(save_path) + + # Register in GlobalConfig + template_name = filename.replace('.pptx', '').replace('_', ' ').title() + GlobalConfig.PPTX_TEMPLATE_FILES[template_name] = { + 'file': save_path, + 'caption': 'Uploaded Template' + } + + logger.info(f"✅ Template uploaded: {template_name}") + return jsonify({'success': True, 'template': template_name}) + + return jsonify({'error': 'Invalid file type'}), 400 + + except Exception as e: + logger.error(f"Upload failed: {e}", exc_info=True) + return jsonify({'error': str(e)}), 500 + + @app.route('/api/health') def health(): """Health check endpoint""" diff --git a/src/slidedeckai/__pycache__/__init__.cpython-312.pyc b/src/slidedeckai/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d336d9b3561ff0d589cd6a1e20a97f8001edf51 GIT binary patch literal 257 zcmX@j%ge<81inRvnI%B_F^B^LOi;#W5g=naLkdF_LkeRGQx0P;Qxp>;LnX5&OO-WO za871Qs!M8ewt}Olm4b7=ZgNp-Vo9n(Kz?~@Q9yoXUWr0MQEG8&UP)p}W`16=LV0FM z22iaY*GopAxtff(xZ~r?Qj3a#lJW6=n#{M@WHa^HWN5QtgU3ff_)z6!Qa#56p~= Tj31ep7+JotF)%6>u>-{bCZVGNdCl(aw7Z)Y#7w2TAq^6`MXD4Rr!_?^&RNmsS$<0qG%}KQ@ bVgqUb*-{L0#0O?ZM#dX_qK(`|EI=**>-r=? literal 0 HcmV?d00001 diff --git a/src/slidedeckai/__pycache__/content_matcher.cpython-312.pyc b/src/slidedeckai/__pycache__/content_matcher.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f70dd1d29f2a638749aabcacb0530bc4987c52d GIT binary patch literal 23275 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 Py2qj_|A-^Vy5#={IZDH3 literal 0 HcmV?d00001 diff --git a/src/slidedeckai/agents/__pycache__/__init__.cpython-312.pyc b/src/slidedeckai/agents/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7cfb47e9c035ea82c8aeacd0e6dab2bfb3be990 GIT binary patch literal 136 zcmX@j%ge<81inRvnIQTxh(HIQS%4zb87dhx8U0o=6fpsLpFwJVsp}^e6zCThCF>XG zWTvF1q$X!4X6h%Vr{&M4u=4F<|$LkeT-r}&y%}*)KNwq6t1?po2;$jfvBQql- JV-Yiu1pp^G9mxOy literal 0 HcmV?d00001 diff --git a/src/slidedeckai/agents/__pycache__/content_generator.cpython-312.pyc b/src/slidedeckai/agents/__pycache__/content_generator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf225d2f7fbefd6a1b83de3618c04209f51edf19 GIT binary patch literal 10075 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 literal 0 HcmV?d00001 diff --git a/src/slidedeckai/agents/__pycache__/execution_orchestrator.cpython-312.pyc b/src/slidedeckai/agents/__pycache__/execution_orchestrator.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfd3b746176577279003aee02c7279a3a18cbf90 GIT binary patch literal 58851 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

lL4o9Nvc_3jnDdzaFd%@Oa(S<|Ys`1y=y zGs2afO9z*BEbm{wzC0YhAN}bMKX@@*erd&dIkvNN);ez#olOgQx18HQ$mJ^A){41& z_orAZmC=$`v80vJvJ)K^F05U#)YCp!f(0ARtr2r;Vuj^cLQz+P=xSIktC$;)ltHqi z_=8MiZu+!&Er%;<*wFiH+H7c=kao>hv0!V=QNaE~--M~0RBQ!rrf}PboUt%xCT-2e zWy9u!X!AvFO`;8zzHQsSmP>;mE1b-Xt(YofRwrh`M|aQY69NUaaYe9NAyZKQ$=zL_ zHWc9C%Ije}pr|2MQ~ymP;uSTJID%wQ;G~AS((lIH}ZvPwrMGg(oz*m9esluTwd>l~fMtplC2t z6cLBcrH-X7;i7|4+o4;wLsSmFesXsYiepK0OVXlOWX<=%96*zoeB`VQCWQtewNJzn0* zY&oOjmO1a~X6>?9PyT8fxjVMQeY;tMI6txO=gw-iKd-AkTf_Y#x9Dt+_7^RB^0#Tp zZO?}r&e;t&l2LnKfp*23ak^NyQm8}Xl_CxKiNe5O%%+u}S^qq|+6hTLw~7$~HXQr&JbpV_Osy+;H0U9I`7)$neX zhTNR&vsH$7y*kwA-AWDltC+vWd|#gK-7U`hvUSmH1N_kf^Zh6oNrA zM;Jcf)YvAWq2gvO&rTOa>zf>w~ZcwE+4e z`(Qmd?Kv|DPX#@|50Z0^ob%*d zf)m$YxG;X*m&s5p;av*;3OR&BLz@;7nCp-OmM57`Qp+%&)d6YEp$ikiglr~Z9P#Y) zeqp?8=rJH%<71NermLTaVRT`XtbwJX9)xH5vLvK~p%o0vAl!lp7ch985Xp4F?TOaG z{8YlfS*;}LRU!ujXfmyb@g=za*9hO#s?%p+djFlk`*t`0?*Td&O!Z2NVs7*FfjidR+3YWUA!c*lDJYH>G>Zkz(SmJa!M5qcOrEh_bhR(GM_dP{dtq-j zb5E>k>krbun?5t~%;eLPbBAu_*DdLw(%P`)+e3doG~<6}=;@)k>RWj=i>GFEv6i+U z)PA>i)<7rx+~r%&hNUethFI&4AM}2=cQ*HV_p|PK)2)K0r9qsUX`G{AcH7f1S$oHx zAGL20?OS57ozy#Dv5>du_)w>HWKEO6WC7$XD_}#4{^u9Q3W{Te9`Y9y%?9SW=eLEO zEg#s^tFoq#%^tXA@vhZFYGSPm26{@urs9w8`nX*0w|Z6@_l4~pbesY3+YPnU8U4)Q z?ACu@NoUxej{|n}{cCw0t(`lyZ|rn+6&T)hYTybcbZgw4oNw!=?O^KuM*Ak)YafA! zSmV3~Oc>1#G7hPe_Q@N1_zekv8vMqD-vqxIvF*_INWX%dSULlYyh?rx_S(#ZKkJ6| zMwZXU)+8jJX>m((e18t#`$TdU{*rvy5jjS-dY{x*;)bD7SUJXG?Vyila%gXQpNJ>_ z@U>^@d0)1lXWGYzPP8)dH0%@p3x493(E*s#OQ6UvDN;GqMFO~P8`t!wgmAz)+6_D{rsAWoV`4^m4AWirrBE!t6xid; z;Fl(2`EK&@SOWQ;n7#Cl)hWc0dtVY^XZZV|5rOhU-NnZC73{(oTij4lfFQ8pb-b4O zOhGxWx`84cnfl;i>;$d>+AwKgBpFl15^&~e)Xv$El)pJ-58*4FY(zBM z@JPm6d1l%d3|kdrK1qw`jH$7C9ukvNMbH776+~lXPbibmrju4CM{iOltrhl=dC{9! zafWKaUIj~^cRZ(u_7XSjm187-aS}sA7@`+ALFqv}nBQchbst76`(C33$R!UZZL);g zP?qX=<;%4e3egu?d_J3VR@A0KDlydslZWbKO{onx>`RRy`4jP|-sl&4SiK8>i}iMG zs5di;3zk2pDvBW0J9}Nd>!q5dx|`Iyh}An6c{irUmi(+opr5^=t;N`LDFqm48y~e4 zDQmoHV|>7MCA7Lz?e=37jJ$_0eNKYIl+ywbSLr(AI<&uRc%ZdSI|j72+RBJfSKR% z1jkV<-S7ibtp0kLBFsxy0LjcDN$Kf(l-c*;+%vIsb5Me_#J~dp9|RW&xGafF2vM@` z_}bimTl});jKt(&T$^?ejOAV#f;Af6r%P!Cu}FLcDNK)(2#A}G_-{yBRaYr{Qo@pY z=rsAxkaL!tQgZGihk7lph1S1`-dOjQQ&5(~SCDnEz-N&9rC-uhBZirzT8489_G_fr zk|LH8Rnk&ZqRO!(^(?cLgmkkq6R9P>Ucx+%#FluAYPC$xACogf&OegFhLWaTJR=1G zft8+w(ik&gD_o$cgA~hnVF1^&T!o1s3~bygwSu%B`iZq6X=Bk~ewINT;Uh$ttltC- zQ|H695eQZR0EmHLw)~mLo_bnO&My`i0#EUz=wPUt3 zR@W4*>k{j_miomy5Nsb5>mHizeE!h0hn_pSrqvglFV;K| zt$A3id3esa+61EI;;HZKjx=@5>0UIwVEVI6C|8u%gQ!{x{VyBmtzIZx&I}I>iLT+W zV;H(%QF|r$1d=AlQeVV=Dr`A*2gYFT`%?cen>)feWzn2UF$aCKl2gAFobG(jnllr4 z=GxQOW=N=SGTV^DjFSW3TBCdzSj)(72*qJXq zgqAvsvOuKB))UlWr zcI{oU?8DrccPti&_Rg@S^P{_0fWU!#sWop`jHD*aMjQzj^sZQrQv98wz3rBz4GLA} z?PM-hqL#MNAhvujO&Y%!GlAk2wS988I6?e;glWR`J>3_sI1xU1U--oR;rl^Fe=vOh zp|JPisH6Xuqn}8d=%!EZI)3v+9|ulhg}q`uvCpw>+NOr%1kwA=(jy(1N zgUpcYB7hb+Tqb`>{!V3#;pVuhjAT1t0l=~j2U0JQNDAypxn`kS4pS3FgE%UL=GQ~M zybUyqY*-us)&vN(Qce#@?{^bIj-Pv^hd8;dzxhb1_KYQ^Pb|M#pNy4~9#t}Z5|`d& z{FL52$BpSE-78R6KS_bKQ~Rb2IBT-6Yvo=`{z9Cc>;NbhwMeH6bZ_YS-;7AVNeJ6# zpDbmnFk9L^X9E7DiGF7AAGQxK`bTgD+}L=Et$YD@Tmqn^g)7}0Kp2?NKn~$mDG+J} zA~G;l@W3}&Z~&l>2i8+YaFqjDPE-VRB%m5rD-&Q1^hg=lTS^&}!SUq_v}Xz=0U<1r z^LymH1}Cl`q01%HAoqhyDJ3|tls+=Bkai?t16Zg)gu*fU%4(^Agc7Vt9nPd|WHN6( z)r5g*NeGQqkpbmAMfa1VfMNo%r$Ds^JSJ(J5~NPhZ}O3dx|N7GS^injmJICOARy~M zBRV7F!epS;2Q%_?%j! z<>KY=(3Qx=5%KV7#632BH0G?3Z1>MsF8CtOUDG`&A>S`sIQhNGh;zqu&mE^X>TD35 z4N>Qg73U5Rh+QSm?|5#;s)qjcO=EYHHM-RI}Q_I=LXVYoSuUHp%glzbRi^lA*FMm`>5{qu4468Y?qVwN1S9t=6KGvGX)%1voUu1X8GsOJ~T-K6ezxh|W;P_6aN1L~#l z_K;#U9XriAraGcgQxh5PPWGxxq5R>#jbR+uufU0X?j|vOaw^!;BL3npS@|_`DD0x;(e{PZbS!On zh6%*l@bnWj$R38P5i5VgqdH>wyffG@N8}6SJ&`X=!PT50r)pXo@03RyYESBMTxz*1 zsR}=T`-UHpYnlAT9Nv#P3>Beag8w!=_zLI}N;(B0_b@?<8=n3xazJoM_Js;@31H%U zfRa>csBn|CTjdm_ek0k8y~o*&hNYmMQ!A;*DjaEhWKm`Fo0~NY8UR zX6cO843^F|7>V?GC&_xg#|sRo^Vrejz1^p~6LfHi6bw9tvC9Q7Aa92I2;W9A!U7yc zv4Dj4zvAg6YiA&3rvtsAYwBTiA4(H=34C0fyedubk3!r#RT%NEQbeT0%=P1u z3V4j1YvfFj!%(@`$)})lDRlnh^nqb;DiT3)Bdn5*!l+Q(48b3=1qLrn`BJ}1+6zRk z7c6k%nfp6V_ILK4Id!`GWOrBG)_JV=%+bD-5Pfe?Uw2%0yr(;E7#Y6?RhbM*yq)^` z1M>Y3$|jvzDUpWZHU%)VC9E&l?1-n+g>oZ)@KShzfX#T?{$r<4A3KT*-dJGV1aoe< zUmI5sWDkuEj!ckMf80GN-Tr1~*U_;%4>Ba8J+oLMVXl8cwJ0SAka{YA0|#dU-9AP> zHojNM_eD6kPp^vnw0ZDtD=Q%BK~Kz5$e1{v~LYtwgOQsbWdkNd^hT-Uvbn= zcQM)Cx|M=D$S2vIWH@fF;g-D#2IZp;pXl&G*gW??x&F!})^y)?9QeS%6%q>|w*g2r zDJMvl(e{dkdq0ha$1H_FNMX0kwU6wUxzeYtzz${fwdxh!{IO`=Ua@ZPl4bcqr0xW1 zDO8;bpSnNnIJaUtkGf_$qZYSlaZhVvmi#Xtd+HcG2+J%MGmEFS%v&O6mP~8c()4r- zU$#4%T`p#qPw$UevglUtKkAc619N377Sexklt%3hxSDM>&l}Ba74uqG5#p#69hIwg zPt;y6+RK4G7p6~Vtz~g}717*k=sC>iEjS~&?a|zQV(z|3?*8d?*t3f|YeZ+weEavO zqHSlywlfju+38GB^z*7Bxz&i_X^eWdh@LGAy-67$hd9W_4g$;Ga0M)qS-62w64&Y7E5Cqb9$e*K5Ly% zTQGrWA-|ax$|BCK$SOAvS>=`_#=m;u$Zf~IH7n<-U30i$)(g|=`MPK8q_JNpTGA{v zFI`wJTON)So|`^`>O~zDqN4)FeM-F3-LUv`2aP*(%UZTt-7YDm%oxa){|egIyiN8u z+_C1(Hi{thlvU0czG{uNLM~ox?VT~mmnhVUwz?Ht^O`;#=7Gpe-YzIsM9cSy<@=UO z!VmB(V^_nE1|nlY@#I9L{IQv%F;9Ke(=2+L7b+Kh5l`1lPfEzEWs4_&SP88X3ayah zMLoNqX`?NIn)Mlf7Joq-iPSSbQahZGD7!OQ8u zA|bkrD^}>+K$kh9U3YOFyVOp)IM225;=DBZa zOKwFTg2Gz!@djNu!+G4N3;PV@Z#Ey_tqZqn>FX{H`FHE!7di8ZcAaRhJh4?LHfqSf z)c{wZO?DlZhIVwYO}P(;!Do4fSzlJ8!a$ZkVlqu0bQ_M4v}*Q)}N_Pt4Um0r`BVpSp_cJ=wn)s!2A{ZvFJIS_GA*ib0hGF%PPX*}_ z4$}w1c7!A3V|DE%A0arxQS$YXbBr9)Ar?-MbCR6X6op|fglwi5bhWFZC3G+fr&vOA z&X9AKocqYRpPcVdKIh2C@XPb$dw`q=$zheF)yX9FRS*XWX{bWnO=X+ZWxw)pJ_iWx zCIq5|;5@pm%Ol!6(;e{A4J+^vgiT7!fUwEy6|=q5`yow~nH$UXNZ|5}HfGBq0PibV z325}fip_U79oKn9^IOFHmeoSwCfmir?W@F8BQSb3zg)5}3E;apYq}4>ccCv@P$w4D z&7WPkKT@zKTF@mHbVUjdKs&=-6LmL;?uPlvS9eEuo)dSTi@48EAN^H9O{Aa>-^;f| z%iF~AwnfX*g-ChN^x+lo29aN3y;xX3e|b?GDclJ_Rfb9lKAtaqcI*{?1)3K!j67ev zFz^!Oqjrfk(B56TKT^{dKK?-X!H2}-4@Zw*5RXIK^h$ViJaYW%ZO5Z`lw=aP{P*65 znIo(DrE|5f1XuD~W6rXulPqG-U-|a0f1G<&w{Z@ePJAf$jm#pCj21Pp`w(uX_#bS`uB6H(5 z2cXi-TxJcLcz^4_Qu#LMgk+OCSlWRJ{ku&)+qv)6_EdAP6(2Ig|8}*xXRGe*W*zxk zHRRvQ{M*fkTXa9sR35I^{iI4m{(1x4b!kFnU^(xyimMM-YIQ^r+<{_df1t z%1zugjj;jqN*SRf`wvW?Tnd)c$iKLOnr>&xo5~Gk01O7UIFdB~RyYOAUb~aI$}J%qb5KC* z!s&bDbGHD!4*Pnas$-~t6m)q7O@Otxy-JB$p~7`SX^!E2^0(x#)Sjd;+|6yMb*KD2 zxpL6w085yqKPOl=4pl%iBa~z*xl?*gQCA7M`;#b`d-#xCPV#qHVb~?ZP&UZ1u&Gw0 z#>B(d2l2HSAawC(v-2RTc`})+>{H!)0E!3C$T5=29=tt;u~rf)QBCVeVF9bxs8-JT z=EImLF;vf*Jh_*!7fZ~+ zLR=Ok31}*)FJlg7r{tu}0(mxIC7a0_jKJ@q+$1AVG8u=v zE9tJJYq(|za*~8SZeRa9;NQJLF@KMo*T`Y$B*XU}rq|=-JU|ZC zPOA2=8jku9qQuQ~S$6}JutubwNwV5lwVAeZ+#rydKgQ&W>u{$LZmFIaW!BNi2p-)u z6%d}J-1LL~kr7qRp!?Y83$V47!dN5FLoz5Yb3VTpdU?S$+!Iv#_ zk1w2&?q>!wjwEqQL~98Yp0WzQJpR=9w2qMo=!)xULy{Z-iw2*A8Ml^BG=~3dsRnA9 z#B5h>_L;7)m}fhl&Lr=_uh1nEWT0TK5{+_YF;yuL8WJ2P@Z0ul4r<;EEVsQ8TIo0) zDLx~1oL=-k7x>nexoh)*7eWzl>+O=Q;f~YO$HK*D{>JT@F|C%Af9uqI{x=_dx1?p} zU@X5Fx0v7m&7w$t!|E1TL&8ngkOf|KmwZb%cWC}Tv3zU9vn}Fo!?jMWg=CKDma_?L zP|p^yL5oW7+BkQ~>=O}J<8*J#>Y5$6Wi44>z-npvT>rv-V#V$yi&)XSJQyiGIdd3A zEley&U(YY$oQFGhTgv)9@TR<-HwJcP!xN=* z_eJvSXY{DxTt>uQH>3Zm8JA|gSn@(iv~=f6=}z#oN~)iK{JF`R=-+aHE;fA->m*QbIe!&?UI*DqQ1@*U*~L3tg7k7$G`RXoG#YX8f`ix zHXVvK^@>fs%l+X?S63!O;i)G+U2=AJF!P6Zr6~1j{z=IYF)>R%Rph+w73u70h$Pn zDg7{Zx{VL7Npe2Gl~a#HH?}5#UU29PK={)b!VldhrfH?l%Ojp0_REbAyDT_?xTbys zNkW~Im(Gy&^whYLpV?u^{B$^AZuY3%S)RN+nCawb)VO@Vp5$CWpZ`Gu3CxD1bEcYQ3fvd0NGF5*lH^?}7d?b>`*W4NbJh56YSQT_ z`vBTc(zz;xD16o1f`WU{Z@u-ON;0O=4!|s`oXF!mIbSBBlGU?rZAJ z&HEa2Xe$4=(vy|wMe5Bzz~8fE^$Z+OJ)eo2mnGEJCii&?m-3p-rA#2FSqwS-bWF|7 z3^^vW7*oGXGOqk4Uz>@AqR^9>pYz@BqK z>E>oIzH#(}4Tw$N|6;@j6)N?`TDM1Adm-Am+%L916n>Z&Tm5sLFCKc~(4QRzV)*L-iEABPu-{k7xf3v=`1wYH4 z(%$s6w>8`0f4jXS9X~%cl=c>yep;DD{;lR-t?nI-hFpUIA@8J{d-Kij*mdO3(~v)( z`3udxl^O4NwG>{VA%7(c_nD7+b?>xP9xc}W%&CF@XT=7%>sY`UqHq-iS!Pnoq)@Q;-1U5N(ppn&zbG;kqdRo8++j*)MVCf{iq+zyYNg8Iu zql)>c<^xU8G=kn_2n<-5MonWB%;0o2rizSffxw=wYW0rg&M-9vPfAu+P7SS2^Z!%Z zwMVseocVk800{vC^yDoJ7zDQb492ky1{(~1fMY}ah!X`Q46+3{SHg}JXtQbeEN;DP zT<6rvCfks0yQ`cgTk=O+(rr)OvrU4Vc8_F{peWA9-9FCdkDeok^fZ0^vA=Jwt{y}r zIca+j%>6VockbM|b7#K!zWIKixQlNxH;IA=^+SToPhJDALB+Vvgc~=ktrA>jGG9`4 z=FC|oM}oV-ok(Q3;>e^3CiQNTFHK@0fcHwGaKJ5I#%r~3;U}$kGS^uzRe|w|pSDf~ zDR>bXl-E#u#rxJ&zPC}j1NK7}NwtA1sQgT8ip=enX{BLL>~tMF>)n*RhZkRrcu4p1 z6r`nNeU_dsYy|GdHYxTDRKzQfq;>9Rs$VJWA2YUo#^znN1e|dlN?v|eE3`W3}2U$}}&f(HHco`H{YNr{>C~@VHSOH+= z0bIV%*3v)=`CiH@qR9V}CEJ0+-Oy}(hpwtZ4S;1EBRW9A_b6aWtu-Q+h?gSHQ*eQT2@1YI z0rgrZOicCduY=zNF)D-H9+faKlle4ID@S+#?erzQ}J7l98R;UN4)$mVM!(zPj z5&*V~i=uf{t)#9ep@Fk%#bry<{A+>kx2htGwGn%0{#=U2C~E)~f$)NrZ0y96LtJk( z;sJb>A7_dM0KDJIvBLN_4Cf+7Tn6}(&#nu)F?i#VU_a?7F8V0b7{DpiR}B^WNLik4L7kjlKM zDj^FjQ`~?G04p`HzRK5Lab0qK`7Crlx>El>*h@{zFRK7Uy=2}IGVhq*ccb&=-i2df zbN{sbit3W;avsuB$R+bexU*O?Zw;BZ&e<0(E)F__L&M?0kx-{AY(6uM>??p);>E`K?AI#s99>zBH`S%pRrLgKV@72H#0sv61V^uykKo}P``aqbuV58SrQdT z%$5~uimJGE(3Z%i&B=LOLfo4JJet#16Iho;n5 zYTI@lsOMg*w(W1>77EKi|Fos%K&|}sH8Rkz*YHHw%89P8IjEKYET2c1#%_}!9$lYX zepT^TV7GUFEW5qoZ^3R$%upK0iUv=#;sB#5XRI+s13JJObD3N%tio(3m`m|$3cP5afnN#sr)fYPl&FQnWTF`#e#jAcDZiJHsA zer9~rv;;}8*sCl-Xdi2)UXr>5(SD-PKXVx=41DtL(i?-ag+>~70PZ6pY6mEIA0-)W@O+uS0%c^~dpoaR(7LOoyJH zzYRZ_ZjqnEnM#+8n?lA-b9M7;U)m5hw!^|4ZU>9%Lq+vVMcYF~+f#Tzpym-+9$D#| zt6^rMyB9|Kx}523fcxeaENN=sHDdNyV0i8{ELJZ3=&_d{Ti6!t>kqfyA3SbfI_?M^ z2UwgtI5r+Wer{3oNMet~sm0ufBG{#5To*E~TQcqn8FxhrOmTyDBI-f~b&-M!+QGul z?wBilt~Fe?1r;#0paQ1+>3w8-pOGQ`RVixpX6gD%2d4MT7$d+B9{AFuNt2zbkbd1& zp4sB80~yxaX81dX(&@I#oe`r6r+r|f%*EHwKY1QLS}Zk7mS#BP6Rp1I?ZIOYFP?Fe zNza*cp`J&=7GWkY#b8`CA!p3wlX)?j5=Q7r`|=cP^4q2g|HVMfqG>~ zy4#X{vyw;1x_319g3IY0fsq})Pfs*&WXLr<;*I}I+Y6GAk^U39v*^#`Yzg`+q>J!r z1xmP=G&bVllzkDV3wu9;WlL7uPC04DX&1<(sEIH4(kRFdviV+lzyk=7QX$2JobhSJ zzoa1LU(CJ;>s*qxV#>#rP7P_~AzjTD@k!&q)n2MQJK)VgO?f1iWGW{mO+KkgO9NXF ze=?afZwfSIjCiI8*Wey`UKk6-%S?C%apwCFMP4c3p$c~q%`Y%9=T2&U*kyw2bDeSO zat)-j@RGsyB2;`r3l!kGLU=y`ZWf!Q5_)Q$qc*VWeeKfZ0|Xp$_B&*8od$O4qh8Bt zmzP8mspvYE3AoUO^I>7g;R3|z=nz)X4rb8Dk+yfj>ubq1kYu+h7 z`Kl**sWHFGU+2LQ7b>`m+>7!H{PTPd_VcpQR~D7oHb(hD54~xNg{_gJ>YX&3J$g=P z@$Fh=bj&bm*mkW?#dnf3;)u9!qc$lZWJ* z{hMxS%4YNC3U66p30fYa7aJ~b3YRoN!)Yq@4_>`E-4)T6_>bSx){@6X%~egXV#oY} z`CSY0g|1-#@r9OP*~!I%2ap?(HCUgUiZRcXt_|oyrR(Mtp^~lB+DKVlpgL5xeoh}M zy@z~`mX!NPgSM7XMN7D(by`b~eoqB@L*+Zd#XG0-?`Vqs_W_3`QeFYEiNQFX^LC+m zy6snblb^rV>A&yle!!U+O8gID<89!PkbWb6<{JIAp9GQ`1IMIF)9 z?NUEnfw(;1y4BumLI8-3==L~s`c-D0RglF2J1%T83xD|4?8?68(!cqK&dx z8);8Htn^p#5jrGB4DuNYTMa9y>0;5@?+X&x~(xYms4U-3ZXp(1Rg*Z$+ zfjqvgpV*x;$djL=ZuK>k_Bi)zmE{gxJ?M#>3)n+?i04B3jwO9pNZ&QBzN69mvu|lC z$&DHKz_(1re(S8`sSROML$IJBQfTn=Uoo$U{Y84FJD>eh@uQ`WR64*6h~0P|ZE+p* ziOmt<{B32s@D2|we*+nSH2WRgXFto#W^@F{IabIOVXZdLKU z(lM3i!bV^y4&%SYSTRiLua3lK%c8XYnp7$4lCr2IU`Zw$XQ@hNiZTlmk8&!TxdQuvBn`s0$J9J+P-7~b2DgEh1{s|}7}2WnuL;Wqtx)?3??9W$ zVH>{4c)g|bRNff>1e_gQeq)uIVOw14J4yNK6K^L`mTs(I#d9(E8kGLNR66M2Nc4)l zLsLfYR_PsN0-S~#*tlYI=O>JWSCm(>9C8=ukUeNgj)|E@#7`QJuE{Q=w~S@6jji&j ztSRLM&cV(MDAh1!{G5?N=HQ&NiPY@tX&>-9M%F`vD=xZHTvA!cC$7hG!Q~yX3}6-> z8wOO)!Gni@e(HAHEJudC6T+Cs@)*3}x|~=aAorA2C3<;a&@F6tFqgqf|X>8W_d0`oj&Tj=fwDg1*G;=6- zuf{5Rd1E#+#6dV&JdcEetCd;+MbzoUpBP;iOGIwwZYd6@V#n&oi22*Xw37#Z*a zDs&ty-4MM150bD{h2Zx^R3GM@BjYXyDxDp#zWAiDiWOYvutFOjaC)LLJO>bS2L#7R zR5^@$pA!}74CaU}I@jX<@F>Fgwtu7weUnv)bz$)_f)x7@#b%##IUyhdzAP*)N8wpb zLmM813D!S^|DakagdqT>zDT*VpoGWrQTR`a=SPKSDUv@M<#3 z7=APmS;gNYgKyg^tl}Vji+1T-{D^;Q&v!8z9gcp<>&c z#TzemLsqEA&da02$2_p zFh$!OuI!AIRYl6zAb(NLbQacyd52`MK~w9YK{i$d8wNtTgAqe%Kr?qbRKN2F-XHm1 z_ARUpx84`3zb}+~Bqpint?Cmz^CBiXJ=qx2ZCujb14P#)U0X=kwxsI{>AF%xuA4)~ z%@OQ;Evt-_RzR?-@8%&{Wp1SN;X3X5&Z|2CE84oGYY6EYmUNp#y3I?v=8&#Ath*Pk zre&(UlH0}Q&z3w@G7HEhD|}QJaYplWXT)6bZ0=LJU(3I$nBiwO#bjB9Rn(>fPp_TX z19Vk$sejY8^VcV@PG0*QJfG-H{t0Xlc)NU!pO2K5%_{zRd!)L?zxS=OD%cTLRHGGu zl3KYrRJnO>3s9LVcPv%5hALZcWQ8jUf3srEOxBF&E1FmpS6mmX;q)cbhd%t^^Ahk7 z{9l(}%Z3&^ui{T10OpI}h_doZ-YzJP=#AIAuXg*#0?x30%MAaPPJg?+>e-V|oec2b z&VD|7j{jCpxO~gi&O7>IY@{%h#?-iww#k~S-scpBRp>2-s@oM+->41nU$1|9^eOp= zw@YiVgVsd7=&K?lsvrD;Ql#`EOS76thN7skJPoj-}R9 z2{#+n2a4r4w>BQo%YRx~dqAmrU6BL&^?V-juj`cv(qnO1h!ITu^yUxP<* zrvf3A)CjYkDuht=B7`y%A(j9Lwax;B@S%ke{)Z7leTNWe`Us1iB?wEMWeCfi6$mSx z7KFfiM_BEwaq-{er(~IzU|9XvPV$UJiL+`)IqO^pI| z`Z{sTCJ&?}R2Kj``c^*B;^IMbyIU-y|=0tMyrZ2?gM45~IO(IoY zGdm_yP21*67qX@wl&Y!Gm7Sf{OLzy*~kgHq|ARzqU)@I zI*Hy2S)NF%xIFEQ215t(tGEiwtVyC9*9Tl8jh#Z;8B7zDCx=^86Rd5Ler(?n+Oo8LWJ#@D(%~_#Wz{qTr`GsqIKy$x99fAob+0%-h#7qek&nT}6@7GAoa9IL+<*-ocj+ zGBWspeVL+S^@n(6Nx-?x(K+^ztesbu28O@we%>7eRDiM+ipyjCjrn#Cq z&r8-A2l9sE#?ghE1Cmh@f2CNDJI9y$d29Ox$BU4KGMHT@v*Jk3I0L;u6#GI+{@4HiE)g$Q4=R3 z+jqspw8(w^5;ZWiEXKw5%52J1XU={w$BgqcM)o!K26G#Hoju zSxoGt{2pZ|e*;(3nKch1sCkHpjqwBV66nlIU<8#wM66T3BVGcXgGcUc2cq*Lc@k}^H8aKq`bl%#$Oy^j;tOeCXx4>!M$xe|CKxn|vNb}BRIwKF)!}p?@ z)+!Bwy>q(fyJH;4`F?haG;WMhN~B}Ics_b;nSRF(^J=9ra8HcGY3}GUonl6vvT+Vk zINdoolK7wer zdwh5pYb@bc^hvM5LsieXZn;5l`u23Lh zh(P;7qFR=MSxoTS$RLuTp~hobewM@>N{G%K#G;&|ZkxDkH=m07IR&I25=a~;lvALi zfWB0Lv<=Zx=IYyty&(fGo9O$&J}@=_M;lnO8a|REzEc8_FyQr(!$>*E=fy#^27ce6 z#;B#z*{DEjjO0iWRqYhVz82vw67a`)P9gx8#`AX-*}P)8faA4qbNO#`ns>Rn5LfpO zSN<+%d6(Pp4!8bYZr3|p^}Af_uQ}U06w~|;xATs=WZJZ(E(xhi{LNu?&Er|W&vNVd L=Jz=Y*}eZCW+GhC literal 0 HcmV?d00001 diff --git a/src/slidedeckai/agents/__pycache__/search_executor.cpython-312.pyc b/src/slidedeckai/agents/__pycache__/search_executor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4eca321e13f31edf7ae7b43ed5b36063b65eaf32 GIT binary patch literal 4009 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 literal 0 HcmV?d00001 diff --git a/src/slidedeckai/agents/core_agents.py b/src/slidedeckai/agents/core_agents.py index 55e1b50..73082ed 100644 --- a/src/slidedeckai/agents/core_agents.py +++ b/src/slidedeckai/agents/core_agents.py @@ -8,6 +8,7 @@ """ import logging import json +import re from typing import List, Dict, Optional, Set from pydantic import BaseModel, Field from openai import OpenAI @@ -585,8 +586,9 @@ def _assign_content_dynamically(self, specs: List, content_phs: List, largest = sorted_phs[0] primary_type = self._determine_content_type(enforced, largest) - search_query = self._llm_generate_search_query( - query, purpose, primary_type, "primary" + # CHANGED: Generate multiple queries (3-5) + search_queries = self._llm_generate_search_queries( + query, purpose, primary_type, "primary", count=4 ) specs.append(PlaceholderContentSpec( @@ -594,7 +596,7 @@ def _assign_content_dynamically(self, specs: List, content_phs: List, placeholder_type=largest['type'], content_type=primary_type, content_description=f"{purpose} - primary", - search_queries=[search_query], + search_queries=search_queries, position_group=largest.get('position_group', ''), role="content", dimensions={ @@ -607,21 +609,28 @@ def _assign_content_dynamically(self, specs: List, content_phs: List, for i, ph in enumerate(sorted_phs[1:], 1): area = ph.get('area', 0) + # IMPROVED: More variety in supporting content (Gap 2) if area < 1: ct = 'kpi' - elif area < 3: - ct = 'bullets' + elif area < 4: + # Alternate between bullets and kpi for small/medium boxes + # This ensures multi-column layouts get mixed content + if i % 2 == 0: + ct = 'kpi' + else: + ct = 'bullets' else: ct = 'bullets' - sq = self._llm_generate_search_query(query, purpose, ct, f"supporting_{i}") + # CHANGED: Generate multiple queries (2-3) + sqs = self._llm_generate_search_queries(query, purpose, ct, f"supporting_{i}", count=3) specs.append(PlaceholderContentSpec( placeholder_idx=ph['idx'], placeholder_type=ph['type'], content_type=ct, content_description=f"{purpose} - supporting", - search_queries=[sq], + search_queries=sqs, position_group=ph.get('position_group', ''), role="content", dimensions={ @@ -649,42 +658,56 @@ def _determine_content_type(self, enforced: str, ph: Dict) -> str: return 'bullets' - def _llm_generate_search_query(self, main_query: str, purpose: str, - content_type: str, role: str) -> SearchQuery: - """Existing - unchanged""" - prompt = f"""Generate a specific search query: + def _llm_generate_search_queries(self, main_query: str, purpose: str, + content_type: str, role: str, count: int = 1) -> List[SearchQuery]: + """FIX #5: Generate multiple search queries""" + prompt = f"""Generate {count} specific search queries: Main topic: {main_query} Slide purpose: {purpose} Content type: {content_type} Role: {role} -Create a search query that will find relevant data for this specific need. - -Return ONLY the search query text, nothing else.""" +Create {count} distinct search queries that will find relevant data for this specific need. +Return ONLY valid JSON array of strings: +["query 1", "query 2"]""" try: response = self.client.chat.completions.create( model=self.model, messages=[ - {"role": "system", "content": "Generate search queries."}, + {"role": "system", "content": "Generate search queries. Return JSON array."}, {"role": "user", "content": prompt} ], - temperature=0.5, - max_tokens=50 + temperature=0.7, + max_tokens=250 ) - query_text = response.choices[0].message.content.strip().strip('"\'') + text = response.choices[0].message.content.strip() + # Extract JSON list if embedded + m = re.search(r"\[.*\]", text, re.DOTALL) + if m: + text = m.group(0) - return SearchQuery( - query=query_text, - purpose=f"{purpose} - {role}", - expected_source_type='research' - ) + queries = json.loads(text) + + if not isinstance(queries, list): + queries = [str(queries)] - except: - return SearchQuery( - query=f"{main_query} {content_type}", - purpose=purpose, - expected_source_type='research' - ) \ No newline at end of file + return [ + SearchQuery( + query=q, + purpose=f"{purpose} - {role}", + expected_source_type='research' + ) for q in queries[:count] + ] + + except Exception as e: + logger.warning(f"Search query generation failed: {e}") + return [ + SearchQuery( + query=f"{main_query} {content_type} {i+1}", + purpose=purpose, + expected_source_type='research' + ) for i in range(count) + ] \ No newline at end of file diff --git a/src/slidedeckai/agents/execution_orchestrator.py b/src/slidedeckai/agents/execution_orchestrator.py index b7da58d..cfa6696 100644 --- a/src/slidedeckai/agents/execution_orchestrator.py +++ b/src/slidedeckai/agents/execution_orchestrator.py @@ -367,12 +367,27 @@ def _generate_slide_smart(self, section, search_results: Dict, 'section_purpose': getattr(section, 'section_purpose', ''), 'bullet_points': [] } + + # FIX #1: Enrich slide_json with content types for matcher + enforced = getattr(section, 'enforced_content_type', 'bullets') + if 'chart' in enforced: + slide_json['chart'] = True + elif 'table' in enforced: + slide_json['table'] = True + # Populate bullets from placeholder_specs descriptions when available for spec in getattr(section, 'placeholder_specs', []) or []: try: desc = getattr(spec, 'content_description', None) or getattr(spec, 'content_type', None) if desc: slide_json['bullet_points'].append(str(desc)) + + # Enrich specific items if spec has content_type info + ctype = getattr(spec, 'content_type', '') + if 'chart' in ctype: + slide_json['chart'] = True + elif 'table' in ctype: + slide_json['table'] = True except Exception: continue @@ -395,6 +410,29 @@ def _generate_slide_smart(self, section, search_results: Dict, except Exception: pass + # FIX: Override placeholder roles from Plan specs (connects core_agents decisions to execution) + if getattr(section, 'placeholder_specs', None): + for spec in section.placeholder_specs: + try: + pid = getattr(spec, 'placeholder_idx', None) + ctype = getattr(spec, 'content_type', None) + + if pid is not None and ctype: + # Normalize role + new_role = None + if 'kpi' in ctype: new_role = 'kpi' + elif 'chart' in ctype: new_role = 'chart' + elif 'table' in ctype: new_role = 'table' + elif 'bullets' in ctype: new_role = 'content' + + if new_role and pid in placeholder_map: + current_role = placeholder_map[pid].get('role') + if current_role != new_role: + placeholder_map[pid]['role'] = new_role + logger.info(f" → Role override from Plan for ph {pid}: {current_role} -> {new_role}") + except Exception: + pass + # PREPARE content for placeholders in parallel (only text/chart/table data generation) prepared_content = self._prepare_section_content(section, placeholder_map, search_results) @@ -622,7 +660,12 @@ def _fill_subtitle(self, placeholder, ph_id: int, section, search_results: Dict) base_pt = 18 run.font.size = Pt(base_pt * 0.8) except Exception: - run.font.size = Pt(14) # fallback + # FIX #5: Soft fallback based on template + try: + base = self.template_properties.get('default_fonts', {}).get('size', Pt(18)).pt + run.font.size = Pt(base * 0.8) + except: + run.font.size = Pt(14) except Exception as e: logger.debug(f"Font application failed: {e}") @@ -1046,6 +1089,16 @@ def _fill_content(self, placeholder, ph_id: int, ph_info: Dict, max_bullets=max_bullets ) + # FIX #4: Text overflow validation + if self._check_text_overflow(bullets, ph_info['area'], ph_info.get('width', 0), ph_info.get('height', 0)): + logger.warning(f" ⚠️ Overflow detected, regenerating shorter bullets...") + bullets = self.content_generator.generate_bullets( + section.section_title, + section.section_purpose, + relevant_facts, + max_bullets=max(3, max_bullets - 2) # Reduce count + ) + text_frame = placeholder.text_frame text_frame.clear() @@ -1078,6 +1131,46 @@ def _fill_content(self, placeholder, ph_id: int, ph_info: Dict, 'status': 'filled' } + def _check_text_overflow(self, bullets: List[str], area: float, + width_inches: float = 0, height_inches: float = 0) -> bool: + """FIX #4: Validate if text fits in placeholder using precise metrics""" + # If dimensions not provided, fall back to area heuristic + if width_inches <= 0 or height_inches <= 0: + total_chars = sum(len(b) for b in bullets) + capacity = area * 50 + if total_chars > capacity: + logger.info(f" Overflow check (area): {total_chars} > {capacity:.0f}") + return True + return False + + # Precise calculation + # Assumptions for Calibri 18pt (typical body text) + font_points = 18 + # Avg char width approx 0.5 * font_size for variable width font + char_width_inch = (font_points * 0.5) / 72.0 + line_height_inch = (font_points * 1.2) / 72.0 + + available_lines = int(height_inches / line_height_inch) + chars_per_line = int(width_inches / char_width_inch) + + if chars_per_line <= 0: + chars_per_line = 1 + + used_lines = 0 + for b in bullets: + # Bullet char + indentation + b_len = len(b) + 4 + lines = (b_len / chars_per_line) + 1 # Simplified wrapping + used_lines += lines + # Paragraph spacing + used_lines += 0.2 # extra space between bullets + + if used_lines > available_lines: + logger.info(f" Overflow check (dim): {used_lines:.1f} lines > {available_lines} available") + return True + + return False + def _calculate_max_bullets(self, area: float) -> int: """Existing logic - unchanged""" if area < 3: diff --git a/src/slidedeckai/ui/__pycache__/__init__.cpython-312.pyc b/src/slidedeckai/ui/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09958104ea50ed172b8b28da9cd1d18a36492359 GIT binary patch literal 132 zcmX@j%ge<81inRvnIQTxh(HIQS%4zb87dhx8U0o=6fpsLpFwJVDeET|6zCThCF>XG zWTvF1q$X!4X6lz_>c_`t=4F<|$LkeT-r}&y%}*)KNwq6t1?pi0;$jfvBQql-V-Yiu F1ptvB93cPz literal 0 HcmV?d00001 diff --git a/src/slidedeckai/ui/__pycache__/html_ui.cpython-312.pyc b/src/slidedeckai/ui/__pycache__/html_ui.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8617a8a4cb23b537fc897987b1db719ed20d231b GIT binary patch literal 47389 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 literal 0 HcmV?d00001 diff --git a/src/slidedeckai/ui/html_ui.py b/src/slidedeckai/ui/html_ui.py index bdf0756..cc6486d 100644 --- a/src/slidedeckai/ui/html_ui.py +++ b/src/slidedeckai/ui/html_ui.py @@ -232,9 +232,22 @@

- +
+ + + +
+
+ +
+ +
@@ -360,6 +373,33 @@ status.className = 'status show ' + type; } + async function uploadTemplate(input) { + const file = input.files[0]; + if (!file) return; + + const formData = new FormData(); + formData.append('file', file); + + showStatus('📤 Uploading template...', 'loading'); + + try { + const response = await fetch('/api/upload_template', { + method: 'POST', + body: formData + }); + + const result = await response.json(); + + if (!response.ok) throw new Error(result.error); + + showStatus(`✅ Template "${result.template}" uploaded!`, 'success'); + loadTemplates(); // Refresh list + + } catch (error) { + showStatus('❌ Upload failed: ' + error.message, 'error'); + } + } + async function generatePlan() { const query = document.getElementById('query').value.trim(); if (!query) { @@ -368,6 +408,8 @@ } const template = document.getElementById('template').value; + const numSlides = document.getElementById('num_slides').value; + const numSections = numSlides ? parseInt(numSlides) : null; document.getElementById('spinner').classList.add('show'); document.getElementById('planReview').classList.remove('show'); @@ -375,7 +417,7 @@ try { console.log('🚀 Sending request to /api/plan'); - console.log('📤 Request data:', { query, search_mode: selectedMode, template }); + console.log('📤 Request data:', { query, search_mode: selectedMode, template, num_sections: numSections }); const response = await fetch('/api/plan', { method: 'POST', @@ -383,7 +425,8 @@ body: JSON.stringify({ query, search_mode: selectedMode, - template: template + template: template, + num_sections: numSections }) });